@@ -122,6 +122,10 @@ void Terminal::Impl::onDeleteKey(SessionContext *s)
122122 */
123123void Terminal::Impl::onTabKey (SessionContext *s)
124124{
125+ // ! 不带回显的终端不能支持补全功能
126+ if ((s->options & kEnableEcho ) == 0 )
127+ return ;
128+
125129 // ! 如果当前用户没有任何输入,则不进行补全
126130 if (s->curr_input .empty () || s->cursor_pos == 0 )
127131 return ;
@@ -194,69 +198,72 @@ void Terminal::Impl::onTabKey(SessionContext *s)
194198
195199 vector<string> matched_node_name_vec;
196200 if (auto dir_node = dynamic_cast <DirNode*>(base_node)) {
201+ // ! 先获取目录下的所有结点
197202 vector<NodeInfo> children_info_vec;
198203 dir_node->children (children_info_vec);
199204
200- // ! 遍历dir_node下有所有子结点 ,找出匹配得上的,加入到matched_node_name_vec中
205+ // ! 遍历所有子结点 ,找出匹配得上的,加入到matched_node_name_vec中
201206 for (const auto & child_info : children_info_vec) {
202- if (util::string::IsStartWith (child_info.name , prefix))
203- matched_node_name_vec.push_back (child_info.name );
207+ auto node_name = child_info.name ;
208+ if (util::string::IsStartWith (node_name, prefix)) {
209+ Node* child_node = nodes_.at (child_info.token );
210+ if (child_node && child_node->type () == NodeType::kDir )
211+ node_name.push_back (' /' );
212+ matched_node_name_vec.push_back (node_name);
213+ }
204214 }
205215 }
206216
207217 // ! 如果没有找到匹配项,直接结束
208218 if (matched_node_name_vec.empty ())
209219 return ;
210220
211- string completion; // ! 补全内容
212-
213221 // ! 如果只有一个匹配,直接补全
214222 if (matched_node_name_vec.size () == 1 ) {
215223 const auto &match_node_name = matched_node_name_vec.back ();
216- completion = match_node_name.substr (prefix.length ()); // ! 需要补全的字串
224+ auto completion = match_node_name.substr (prefix.length ()); // ! 需要补全的字串
217225
218226 // ! 如果不需要补全,则结束
219227 if (completion.empty ())
220228 return ;
221229
222- // ! 检查是否为目录,如果是则添加/
223- NodeToken child_token = findNode (dir_path + " /" + match_node_name, s);
224- if (!child_token.isNull ()) {
225- Node* child_node = nodes_.at (child_token);
226- if (child_node && child_node->type () == NodeType::kDir ) {
227- completion.push_back (' /' );
228- }
229- }
230+ s->curr_input .insert (s->cursor_pos , completion);
231+ s->cursor_pos += completion.length ();
232+
233+ s->wp_conn ->send (s->token , completion);
230234
231- } else {
232- // ! 多个匹配,显示所有可能
233235 ostringstream oss;
234- oss << " \r\n " ;
235- for (const auto & match : matched_node_name_vec)
236- oss << match << " \t " ;
237- oss << " \r\n " ;
236+ oss << s->curr_input .substr (s->cursor_pos )
237+ << string ((s->curr_input .size () - s->cursor_pos ), ' \b ' );
238+
239+ auto refresh_str = oss.str ();
240+ if (!refresh_str.empty ())
241+ s->wp_conn ->send (s->token , refresh_str);
242+
243+ } else {
244+ {
245+ // ! 多个匹配,显示所有可能
246+ ostringstream oss;
247+ oss << " \r\n " ;
248+ for (const auto & match : matched_node_name_vec)
249+ oss << match << " " ;
250+ oss << " \r\n " ;
238251
239- if (s->options & kEnableEcho ) {
240252 s->wp_conn ->send (s->token , oss.str ());
241- printPrompt (s);
242- s->wp_conn ->send (s->token , s->curr_input );
243253 }
244254
245- // ! 找出最大共同字串,设置补全内容
246- std::string common_prefix = util::string::ExtractCommonPrefix (matched_node_name_vec);
247- completion = common_prefix.substr (prefix.length ()); // ! 需要补全的字串
248- }
255+ printPrompt (s);
249256
250- // ! 如果需要补全,则进行补全
251- if (!completion. empty ()) {
252- s-> curr_input . insert (s-> cursor_pos , completion );
253- s-> cursor_pos += completion. length ();
257+ {
258+ // ! 找出最大共同字串,补全内容
259+ auto common_prefix = util::string::ExtractCommonPrefix (matched_node_name_vec );
260+ auto completion = common_prefix. substr (prefix. length ()); // ! 需要补全的字串
254261
255- if (s->options & kEnableEcho ) {
256- s->wp_conn -> send (s-> token , completion);
262+ s-> curr_input . insert (s->cursor_pos , completion);
263+ s->cursor_pos += completion. length ( );
257264
258265 ostringstream oss;
259- oss << s->curr_input . substr (s-> cursor_pos )
266+ oss << s->curr_input
260267 << string ((s->curr_input .size () - s->cursor_pos ), ' \b ' );
261268
262269 auto refresh_str = oss.str ();
0 commit comments