mirror of
https://github.com/fish-shell/fish-shell.git
synced 2024-11-24 04:42:39 +08:00
Switch more autosuggestions to instance methods on reader_data_t
This commit is contained in:
parent
b014c327a2
commit
e477b99a8b
|
@ -301,6 +301,11 @@ class reader_history_search_t {
|
|||
}
|
||||
};
|
||||
|
||||
struct autosuggestion_result_t {
|
||||
wcstring suggestion;
|
||||
wcstring search_string;
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
/// A struct describing the state of the interactive reader. These states can be stacked, in case
|
||||
|
@ -428,7 +433,10 @@ class reader_data_t : public std::enable_shared_from_this<reader_data_t> {
|
|||
|
||||
void mark_repaint_needed() { repaint_needed = true; }
|
||||
|
||||
void autosuggest_completed(autosuggestion_result_t result);
|
||||
void update_autosuggestion();
|
||||
void accept_autosuggestion(bool full, move_word_style_t style = move_word_style_punctuation);
|
||||
void super_highlight_me_plenty(int highlight_pos_adjust = 0, bool no_io = false);
|
||||
};
|
||||
|
||||
/// Sets the command line contents, without clearing the pager.
|
||||
|
@ -471,8 +479,6 @@ static struct termios terminal_mode_on_startup;
|
|||
/// Mode we use to execute programs.
|
||||
static struct termios tty_modes_for_external_cmds;
|
||||
|
||||
static void reader_super_highlight_me_plenty(int highlight_pos_adjust = 0, bool no_io = false);
|
||||
|
||||
/// Tracks a currently pending exit. This may be manipulated from a signal handler.
|
||||
struct {
|
||||
/// Whether we should exit the current reader loop.
|
||||
|
@ -651,7 +657,7 @@ void reader_data_t::kill(editable_line_t *el, size_t begin_idx, size_t length, i
|
|||
el->text.erase(begin_idx, length);
|
||||
command_line_changed(el);
|
||||
|
||||
reader_super_highlight_me_plenty();
|
||||
super_highlight_me_plenty();
|
||||
repaint();
|
||||
}
|
||||
|
||||
|
@ -1121,7 +1127,7 @@ static void remove_backward() {
|
|||
data->command_line_changed(el);
|
||||
data->suppress_autosuggestion = true;
|
||||
|
||||
reader_super_highlight_me_plenty();
|
||||
data->super_highlight_me_plenty();
|
||||
|
||||
reader_repaint_needed();
|
||||
}
|
||||
|
@ -1172,7 +1178,7 @@ bool reader_data_t::insert_string(editable_line_t *el, const wcstring &str,
|
|||
// Syntax highlight. Note we must have that buff_pos > 0 because we just added something
|
||||
// nonzero to its length.
|
||||
assert(el->position > 0);
|
||||
reader_super_highlight_me_plenty(-1);
|
||||
super_highlight_me_plenty(-1);
|
||||
}
|
||||
|
||||
repaint();
|
||||
|
@ -1294,11 +1300,6 @@ static void completion_insert(const wchar_t *val, complete_flags_t flags) {
|
|||
reader_set_buffer_maintaining_pager(data, new_command_line, cursor);
|
||||
}
|
||||
|
||||
struct autosuggestion_result_t {
|
||||
wcstring suggestion;
|
||||
wcstring search_string;
|
||||
};
|
||||
|
||||
// Returns a function that can be invoked (potentially
|
||||
// on a background thread) to determine the autosuggestion
|
||||
static std::function<autosuggestion_result_t(void)> get_autosuggestion_performer(
|
||||
|
@ -1381,27 +1382,28 @@ static bool can_autosuggest() {
|
|||
}
|
||||
|
||||
// Called after an autosuggestion has been computed on a background thread
|
||||
static void autosuggest_completed(autosuggestion_result_t result) {
|
||||
reader_data_t *data = current_data();
|
||||
void reader_data_t::autosuggest_completed(autosuggestion_result_t result) {
|
||||
if (!result.suggestion.empty() && can_autosuggest() &&
|
||||
result.search_string == data->command_line.text &&
|
||||
result.search_string == command_line.text &&
|
||||
string_prefixes_string_case_insensitive(result.search_string, result.suggestion)) {
|
||||
// Autosuggestion is active and the search term has not changed, so we're good to go.
|
||||
data->autosuggestion = std::move(result.suggestion);
|
||||
autosuggestion = std::move(result.suggestion);
|
||||
sanity_check();
|
||||
data->repaint();
|
||||
repaint();
|
||||
}
|
||||
}
|
||||
|
||||
static void update_autosuggestion() {
|
||||
void reader_data_t::update_autosuggestion() {
|
||||
// Updates autosuggestion. We look for an autosuggestion if the command line is non-empty and if
|
||||
// we're not doing a history search.
|
||||
reader_data_t *data = current_data();
|
||||
data->autosuggestion.clear();
|
||||
autosuggestion.clear();
|
||||
if (can_autosuggest()) {
|
||||
const editable_line_t *el = data->active_edit_line();
|
||||
auto performer = get_autosuggestion_performer(el->text, el->position, data->history);
|
||||
iothread_perform(performer, &autosuggest_completed);
|
||||
const editable_line_t *el = active_edit_line();
|
||||
auto performer = get_autosuggestion_performer(el->text, el->position, history);
|
||||
auto shared_this = this->shared_from_this();
|
||||
iothread_perform(performer, [shared_this](autosuggestion_result_t result) {
|
||||
shared_this->autosuggest_completed(std::move(result));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1427,7 +1429,7 @@ void reader_data_t::accept_autosuggestion(bool full, move_word_style_t style) {
|
|||
}
|
||||
update_buff_pos(&command_line, command_line.size());
|
||||
command_line_changed(&command_line);
|
||||
reader_super_highlight_me_plenty();
|
||||
super_highlight_me_plenty();
|
||||
repaint();
|
||||
}
|
||||
}
|
||||
|
@ -1468,7 +1470,7 @@ static void reader_flash() {
|
|||
pollint.tv_nsec = 100 * 1000000;
|
||||
nanosleep(&pollint, NULL);
|
||||
|
||||
reader_super_highlight_me_plenty();
|
||||
data->super_highlight_me_plenty();
|
||||
|
||||
data->repaint();
|
||||
}
|
||||
|
@ -1870,7 +1872,7 @@ static void set_command_line_and_position(reader_data_t *data, editable_line_t *
|
|||
el->text = new_str;
|
||||
data->update_buff_pos(el, pos);
|
||||
data->command_line_changed(el);
|
||||
reader_super_highlight_me_plenty();
|
||||
data->super_highlight_me_plenty();
|
||||
reader_repaint_needed();
|
||||
}
|
||||
|
||||
|
@ -1984,7 +1986,7 @@ static void reader_set_buffer_maintaining_pager(reader_data_t *data, const wcstr
|
|||
|
||||
// Clear history search and pager contents.
|
||||
data->history_search.reset();
|
||||
reader_super_highlight_me_plenty();
|
||||
data->super_highlight_me_plenty();
|
||||
reader_repaint_needed();
|
||||
}
|
||||
|
||||
|
@ -2243,7 +2245,7 @@ static std::function<highlight_result_t(void)> get_highlight_performer(const wcs
|
|||
/// This is added to the current cursor position and may be negative.
|
||||
/// \param no_io if true, do a highlight that does not perform I/O, synchronously. If false, perform
|
||||
/// an asynchronous highlight in the background, which may perform disk I/O.
|
||||
static void reader_super_highlight_me_plenty(int match_highlight_pos_adjust, bool no_io) {
|
||||
void reader_data_t::super_highlight_me_plenty(int match_highlight_pos_adjust, bool no_io) {
|
||||
reader_data_t *data = current_data();
|
||||
const editable_line_t *el = &data->command_line;
|
||||
assert(el != NULL);
|
||||
|
@ -2474,7 +2476,7 @@ maybe_t<wcstring> reader_data_t::readline(int nchars) {
|
|||
|
||||
exec_prompt();
|
||||
|
||||
reader_super_highlight_me_plenty();
|
||||
super_highlight_me_plenty();
|
||||
s_reset(&screen, screen_reset_abandon_line);
|
||||
repaint();
|
||||
|
||||
|
@ -2897,7 +2899,7 @@ maybe_t<wcstring> reader_data_t::readline(int nchars) {
|
|||
// syntax highlighting, but a synchronous variant that performs no I/O, so
|
||||
// as not to block the user.
|
||||
bool skip_io = (command_test_result == 0);
|
||||
reader_super_highlight_me_plenty(0, skip_io);
|
||||
super_highlight_me_plenty(0, skip_io);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3211,7 +3213,7 @@ maybe_t<wcstring> reader_data_t::readline(int nchars) {
|
|||
capitalized_first = capitalized_first || make_uppercase;
|
||||
}
|
||||
command_line_changed(el);
|
||||
reader_super_highlight_me_plenty();
|
||||
super_highlight_me_plenty();
|
||||
reader_repaint_needed();
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user