From 97a90ac65a3e19fd3963b806b4688ebdb106c006 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Helleu?= Date: Tue, 7 Nov 2023 18:42:48 +0100 Subject: [PATCH] core: add key ctrl+o to send command found and insert next one in input (issue #2040) --- ChangeLog.adoc | 2 +- doc/de/weechat_user.de.adoc | 2 ++ doc/en/weechat_user.en.adoc | 2 ++ doc/fr/weechat_user.fr.adoc | 1 + doc/it/weechat_user.it.adoc | 2 ++ doc/ja/weechat_user.ja.adoc | 2 ++ doc/pl/weechat_user.pl.adoc | 2 ++ doc/sr/weechat_user.sr.adoc | 2 ++ src/core/wee-command.c | 7 ++++- src/gui/curses/gui-curses-key.c | 5 ++++ src/gui/gui-input.c | 48 +++++++++++++++++++++++++++++++++ src/gui/gui-input.h | 1 + 12 files changed, 74 insertions(+), 2 deletions(-) diff --git a/ChangeLog.adoc b/ChangeLog.adoc index 31f8eae1b..8a1c3704c 100644 --- a/ChangeLog.adoc +++ b/ChangeLog.adoc @@ -15,7 +15,7 @@ For a list of important changes that require manual actions, please look at rele New features:: - * core: move key kbd:[Ctrl+r] to kbd:[Ctrl+s], add key kbd:[Ctrl+r] to search in commands history, add option `search_history` in command `/input`, add key context "histsearch", add option weechat.look.buffer_search_history, add buffer variables "text_search_direction", "text_search_history" and "text_search_ptr_history" (issue #2040) + * core: move key kbd:[Ctrl+r] to kbd:[Ctrl+s], add key kbd:[Ctrl+r] to search in commands history, add option `search_history` in command `/input`, add key context "histsearch", add option weechat.look.buffer_search_history, add buffer variables "text_search_direction", "text_search_history" and "text_search_ptr_history", add key kbd:[Ctrl+o] to send command found and insert next one in input (issue #2040) * core: display only version with command `/version`, add options `-o` and `-ol` in command `/upgrade` * core: add number of processes in command `/sys waitpid` * core, alias, trigger: allow wildcard in commands `/bar`, `/item`, `/proxy`, `/alias` and `/trigger` (issue #1956) diff --git a/doc/de/weechat_user.de.adoc b/doc/de/weechat_user.de.adoc index 05c6220d7..39d842c4d 100644 --- a/doc/de/weechat_user.de.adoc +++ b/doc/de/weechat_user.de.adoc @@ -1808,6 +1808,8 @@ search text in commands history). kbd:[Ctrl+j] + kbd:[Ctrl+m] | Stop search and use matching input. | `+/input search_stop_here+` // TRANSLATION MISSING +| kbd:[Ctrl+o] | Execute the command found in history and insert the next one in the command line. | `+/input history_use_get_next+` +// TRANSLATION MISSING | kbd:[Ctrl+q] | Stop search and restore input to its initial value. | `+/input search_stop+` |=== diff --git a/doc/en/weechat_user.en.adoc b/doc/en/weechat_user.en.adoc index a6f4a506c..6a7797b8a 100644 --- a/doc/en/weechat_user.en.adoc +++ b/doc/en/weechat_user.en.adoc @@ -1583,6 +1583,7 @@ They can be changed and new ones can be added with the < raw[history_next]: recall next command in current buffer history"), N_("> raw[history_global_previous]: recall previous command in global history"), N_("> raw[history_global_next]: recall next command in global history"), + N_("> raw[history_use_get_next]: send the current history entry " + "(found with search or recalled with \"up\"key) and insert the " + "next history entry in the command line without sending it"), N_("> raw[grab_key]: grab a key (optional argument: delay for end of grab, " "default is 500 milliseconds)"), N_("> raw[grab_key_command]: grab a key with its associated command (optional " @@ -8554,7 +8559,7 @@ command_init () "move_previous_char || move_next_char || move_previous_word || " "move_next_word || move_previous_line || move_next_line || " "history_previous || history_next || history_global_previous || " - "history_global_next || " + "history_global_next || history_use_get_next || " "grab_key || grab_key_command || " "grab_mouse || grab_mouse_area || " "insert || send", diff --git a/src/gui/curses/gui-curses-key.c b/src/gui/curses/gui-curses-key.c index 397605d49..ae228c439 100644 --- a/src/gui/curses/gui-curses-key.c +++ b/src/gui/curses/gui-curses-key.c @@ -124,6 +124,7 @@ gui_key_default_bindings (int context, int create_option) BIND("down", "/input history_next"); BIND("ctrl-up", "/input history_global_previous"); BIND("ctrl-down", "/input history_global_next"); + BIND("ctrl-o", "/input history_use_get_next"); BIND("shift-up", "/input move_previous_line"); BIND("shift-down", "/input move_next_line"); BIND("meta-a", "/buffer jump smart"); @@ -219,6 +220,10 @@ gui_key_default_bindings (int context, int create_option) BIND("up", "/input search_previous"); BIND("ctrl-s", "/input search_next"); BIND("down", "/input search_next"); + if (context == GUI_KEY_CONTEXT_HISTSEARCH) + { + BIND("ctrl-o", "/input history_use_get_next"); + } } else if (context == GUI_KEY_CONTEXT_CURSOR) { diff --git a/src/gui/gui-input.c b/src/gui/gui-input.c index 0eb3d5986..046404d42 100644 --- a/src/gui/gui-input.c +++ b/src/gui/gui-input.c @@ -1803,6 +1803,54 @@ gui_input_history_global_next (struct t_gui_buffer *buffer) } } +/* + * Sends the current history entry (found with search or recalled with + * "up" key) and inserts the next one in the command line without sending it + * (default key: ctrl-o, in contexts "default" and "histsearch"). + */ + +void +gui_input_history_use_get_next (struct t_gui_buffer *buffer) +{ + struct t_gui_window *window; + struct t_gui_history *ptr_history, **ptr_ptr_history;; + + window = gui_window_search_with_buffer (buffer); + if (!window) + return; + + ptr_history = NULL; + ptr_ptr_history = NULL; + if (window->buffer->text_search == GUI_BUFFER_SEARCH_HISTORY) + { + ptr_history = window->buffer->text_search_ptr_history; + if (!ptr_history) + return; + ptr_ptr_history = (window->buffer->text_search_history == GUI_BUFFER_SEARCH_HISTORY_LOCAL) ? + &(window->buffer->ptr_history) : &gui_history_ptr; + gui_window_search_stop (window, 1); + } + else if (window->buffer->ptr_history) + { + ptr_history = window->buffer->ptr_history; + ptr_ptr_history = &(window->buffer->ptr_history); + } + else if (gui_history_ptr) + { + ptr_history = gui_history_ptr; + ptr_ptr_history = &gui_history_ptr; + } + + gui_input_return (buffer); + + if (ptr_history && ptr_history->prev_history) + { + gui_input_insert_string (buffer, ptr_history->prev_history->text); + if (ptr_ptr_history) + *ptr_ptr_history = ptr_history->prev_history; + } +} + /* * Initializes "grab key mode" (next key will be inserted into input buffer) * (default key: alt-k). diff --git a/src/gui/gui-input.h b/src/gui/gui-input.h index 9fa754122..57ef4a637 100644 --- a/src/gui/gui-input.h +++ b/src/gui/gui-input.h @@ -80,6 +80,7 @@ extern void gui_input_history_local_previous (struct t_gui_buffer *buffer); extern void gui_input_history_local_next (struct t_gui_buffer *buffer); extern void gui_input_history_global_previous (struct t_gui_buffer *buffer); extern void gui_input_history_global_next (struct t_gui_buffer *buffer); +extern void gui_input_history_use_get_next (struct t_gui_buffer *buffer); extern void gui_input_grab_key (struct t_gui_buffer *buffer, int command, const char *delay); extern void gui_input_grab_mouse (struct t_gui_buffer *buffer, int area);