Merge pull request #53029 from azat/clickhouse-keeper-client-completion-fix

Fix completion for clickhouse-keeper-client
This commit is contained in:
pufit 2023-08-04 17:48:45 -04:00 committed by GitHub
commit e0576a4f59
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 37 additions and 9 deletions

View File

@ -266,8 +266,16 @@ void KeeperClient::runInteractive()
LineReader::Patterns query_extenders = {"\\"};
LineReader::Patterns query_delimiters = {};
char word_break_characters[] = " \t\v\f\a\b\r\n/";
ReplxxLineReader lr(suggest, history_file, false, query_extenders, query_delimiters, {});
ReplxxLineReader lr(
suggest,
history_file,
/* multiline= */ false,
query_extenders,
query_delimiters,
word_break_characters,
/* highlighter_= */ {});
lr.enableBracketedPaste();
while (true)

View File

@ -2313,15 +2313,28 @@ void ClientBase::runInteractive()
LineReader::Patterns query_extenders = {"\\"};
LineReader::Patterns query_delimiters = {";", "\\G", "\\G;"};
char word_break_characters[] = " \t\v\f\a\b\r\n`~!@#$%^&*()-=+[{]}\\|;:'\",<.>/?";
#if USE_REPLXX
replxx::Replxx::highlighter_callback_t highlight_callback{};
if (config().getBool("highlight", true))
highlight_callback = highlight;
ReplxxLineReader lr(*suggest, history_file, config().has("multiline"), query_extenders, query_delimiters, highlight_callback);
ReplxxLineReader lr(
*suggest,
history_file,
config().has("multiline"),
query_extenders,
query_delimiters,
word_break_characters,
highlight_callback);
#else
LineReader lr(history_file, config().has("multiline"), query_extenders, query_delimiters);
LineReader lr(
history_file,
config().has("multiline"),
query_extenders,
query_delimiters,
word_break_characters);
#endif
static const std::initializer_list<std::pair<String, String>> backslash_aliases =

View File

@ -66,7 +66,7 @@ void addNewWords(Words & to, const Words & from, Compare comp)
namespace DB
{
replxx::Replxx::completions_t LineReader::Suggest::getCompletions(const String & prefix, size_t prefix_length)
replxx::Replxx::completions_t LineReader::Suggest::getCompletions(const String & prefix, size_t prefix_length, const char * word_break_characters)
{
std::string_view last_word;
@ -135,7 +135,10 @@ void LineReader::Suggest::addWords(Words && new_words)
}
LineReader::LineReader(const String & history_file_path_, bool multiline_, Patterns extenders_, Patterns delimiters_)
: history_file_path(history_file_path_), multiline(multiline_), extenders(std::move(extenders_)), delimiters(std::move(delimiters_))
: history_file_path(history_file_path_)
, multiline(multiline_)
, extenders(std::move(extenders_))
, delimiters(std::move(delimiters_))
{
/// FIXME: check extender != delimiter
}

View File

@ -21,7 +21,7 @@ public:
using Callback = std::function<Words(const String & prefix, size_t prefix_length)>;
/// Get vector for the matched range of words if any.
replxx::Replxx::completions_t getCompletions(const String & prefix, size_t prefix_length);
replxx::Replxx::completions_t getCompletions(const String & prefix, size_t prefix_length, const char * word_break_characters);
void addWords(Words && new_words);
void setCompletionsCallback(Callback && callback) { custom_completions_callback = callback; }
@ -65,7 +65,6 @@ protected:
};
const String history_file_path;
static constexpr char word_break_characters[] = " \t\v\f\a\b\r\n`~!@#$%^&*()-=+[{]}\\|;:'\",<.>/?";
String input;

View File

@ -287,8 +287,10 @@ ReplxxLineReader::ReplxxLineReader(
bool multiline_,
Patterns extenders_,
Patterns delimiters_,
const char word_break_characters_[],
replxx::Replxx::highlighter_callback_t highlighter_)
: LineReader(history_file_path_, multiline_, std::move(extenders_), std::move(delimiters_)), highlighter(std::move(highlighter_))
, word_break_characters(word_break_characters_)
, editor(getEditor())
{
using namespace std::placeholders;
@ -326,9 +328,9 @@ ReplxxLineReader::ReplxxLineReader(
rx.install_window_change_handler();
auto callback = [&suggest] (const String & context, size_t context_size)
auto callback = [&suggest, this] (const String & context, size_t context_size)
{
return suggest.getCompletions(context, context_size);
return suggest.getCompletions(context, context_size, word_break_characters);
};
rx.set_completion_callback(callback);

View File

@ -15,6 +15,7 @@ public:
bool multiline,
Patterns extenders_,
Patterns delimiters_,
const char word_break_characters_[],
replxx::Replxx::highlighter_callback_t highlighter_);
~ReplxxLineReader() override;
@ -33,6 +34,8 @@ private:
replxx::Replxx rx;
replxx::Replxx::highlighter_callback_t highlighter;
const char * word_break_characters;
// used to call flock() to synchronize multiple clients using same history file
int history_file_fd = -1;
bool bracketed_paste_enabled = false;