Skip to content

Commit b529e56

Browse files
committed
fix(terminal): 修复了终端补全出现的异常问题
1 parent 116a208 commit b529e56

File tree

1 file changed

+41
-34
lines changed

1 file changed

+41
-34
lines changed

modules/terminal/impl/terminal_key_events.cpp

Lines changed: 41 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,10 @@ void Terminal::Impl::onDeleteKey(SessionContext *s)
122122
*/
123123
void 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

Comments
 (0)