diff options
author | AnotherTest <ali.mpfard@gmail.com> | 2020-10-03 17:24:49 +0330 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-10-04 23:12:28 +0200 |
commit | a9cee8ee02123e12f239866809f088016f9d23c1 (patch) | |
tree | bd76d9bb94ecd8602f2d608102fa27457a220bc7 | |
parent | f164b808b5a6ed69f6fd0aea8ee0c88f4d377a24 (diff) | |
download | serenity-a9cee8ee02123e12f239866809f088016f9d23c1.zip |
Shell+LibLine: Record the input offset of completions
This makes the completion entry retain information about how much of the
suggestion was part of the string that caused the match.
-rw-r--r-- | Libraries/LibLine/SuggestionManager.h | 1 | ||||
-rw-r--r-- | Shell/Shell.cpp | 20 |
2 files changed, 16 insertions, 5 deletions
diff --git a/Libraries/LibLine/SuggestionManager.h b/Libraries/LibLine/SuggestionManager.h index dfe20dd3ef..0b804fef08 100644 --- a/Libraries/LibLine/SuggestionManager.h +++ b/Libraries/LibLine/SuggestionManager.h @@ -72,6 +72,7 @@ public: Vector<u32> trailing_trivia; Style style; size_t start_index { 0 }; + size_t input_offset { 0 }; Utf32View text_view; Utf32View trivia_view; diff --git a/Shell/Shell.cpp b/Shell/Shell.cpp index e965645a93..ef2a0b2bf9 100644 --- a/Shell/Shell.cpp +++ b/Shell/Shell.cpp @@ -1185,6 +1185,7 @@ Vector<Line::CompletionSuggestion> Shell::complete_path(const String& base, cons } else { suggestions.append({ escape_token(file), " " }); } + suggestions.last().input_offset = token_length; } } } @@ -1202,8 +1203,9 @@ Vector<Line::CompletionSuggestion> Shell::complete_program_name(const String& na return complete_path("", name, offset); String completion = *match; + auto token_length = escape_token(name).length(); if (m_editor) - m_editor->suggest(escape_token(name).length(), 0); + m_editor->suggest(token_length, 0); // Now that we have a program name starting with our token, we look at // other program names starting with our token and cut off any mismatching @@ -1214,11 +1216,14 @@ Vector<Line::CompletionSuggestion> Shell::complete_program_name(const String& na int index = match - cached_path.data(); for (int i = index - 1; i >= 0 && cached_path[i].starts_with(name); --i) { suggestions.append({ cached_path[i], " " }); + suggestions.last().input_offset = token_length; } for (size_t i = index + 1; i < cached_path.size() && cached_path[i].starts_with(name); ++i) { suggestions.append({ cached_path[i], " " }); + suggestions.last().input_offset = token_length; } suggestions.append({ cached_path[index], " " }); + suggestions.last().input_offset = token_length; return suggestions; } @@ -1250,6 +1255,7 @@ Vector<Line::CompletionSuggestion> Shell::complete_variable(const String& name, if (suggestions.contains_slow(name)) continue; suggestions.append(move(name)); + suggestions.last().input_offset = offset; } } @@ -1271,8 +1277,10 @@ Vector<Line::CompletionSuggestion> Shell::complete_user(const String& name, size while (di.has_next()) { String name = di.next_path(); - if (name.starts_with(pattern)) + if (name.starts_with(pattern)) { suggestions.append(name); + suggestions.last().input_offset = offset; + } } return suggestions; @@ -1309,9 +1317,11 @@ Vector<Line::CompletionSuggestion> Shell::complete_option(const String& program_ builder.append(view); return builder.to_string(); }; -#define __ENUMERATE_SHELL_OPTION(name, d_, descr_) \ - if (StringView { #name }.starts_with(option_pattern)) \ - suggestions.append(maybe_negate(#name)); +#define __ENUMERATE_SHELL_OPTION(name, d_, descr_) \ + if (StringView { #name }.starts_with(option_pattern)) { \ + suggestions.append(maybe_negate(#name)); \ + suggestions.last().input_offset = offset; \ + } ENUMERATE_SHELL_OPTIONS(); #undef __ENUMERATE_SHELL_OPTION |