1
0
mirror of https://github.com/weechat/weechat.git synced 2026-07-08 02:33:12 +02:00

core: add key alt+backspace, change behavior of key ctrl+w (closes #559)

The key ctrl+w now deletes one word until whitespace.

The new key alt+backspace deletes one word (same behavior as ctrl+w in previous
releases).
This commit is contained in:
Sébastien Helleu
2022-09-18 23:26:49 +02:00
parent d7c0e896b2
commit 01cf98e8fb
45 changed files with 1528 additions and 320 deletions
+6 -1
View File
@@ -3294,6 +3294,8 @@ COMMAND_CALLBACK(input)
gui_input_delete_next_char (buffer);
else if (string_strcasecmp (argv[1], "delete_previous_word") == 0)
gui_input_delete_previous_word (buffer);
else if (string_strcasecmp (argv[1], "delete_previous_word_whitespace") == 0)
gui_input_delete_previous_word_whitespace (buffer);
else if (string_strcasecmp (argv[1], "delete_next_word") == 0)
gui_input_delete_next_word (buffer);
else if (string_strcasecmp (argv[1], "delete_beginning_of_line") == 0)
@@ -7985,6 +7987,8 @@ command_init ()
" delete_previous_char: delete previous char\n"
" delete_next_char: delete next char\n"
" delete_previous_word: delete previous word\n"
" delete_previous_word_whitespace: delete previous word "
"(until whitespace)\n"
" delete_next_word: delete next word\n"
" delete_beginning_of_line: delete from beginning of line until "
"cursor\n"
@@ -8041,7 +8045,8 @@ command_init ()
"search_text || search_switch_case || search_switch_regex || "
"search_switch_where || search_previous || search_next || "
"search_stop_here || search_stop || delete_previous_char || "
"delete_next_char || delete_previous_word || delete_next_word || "
"delete_next_char || delete_previous_word || "
"delete_previous_word_whitespace || delete_next_word || "
"delete_beginning_of_line || delete_end_of_line || delete_line || "
"clipboard_paste || transpose_chars || undo || redo || "
"move_beginning_of_line || move_end_of_line || move_previous_char || "
+14
View File
@@ -1109,6 +1109,20 @@ string_convert_escaped_chars (const char *string)
return output;
}
/*
* Checks if first char of string is a whitespace (space or tab).
*
* Returns:
* 1: first char is whitespace
* 0: first char is not whitespace
*/
int
string_is_whitespace_char (const char *string)
{
return (string && ((string[0] == ' ') || string[0] == '\t')) ? 1 : 0;
}
/*
* Checks if first char of string is a "word char".
*
+1
View File
@@ -71,6 +71,7 @@ extern char *string_remove_quotes (const char *string, const char *quotes);
extern char *string_strip (const char *string, int left, int right,
const char *chars);
extern char *string_convert_escaped_chars (const char *string);
extern int string_is_whitespace_char (const char *string);
extern int string_is_word_char_highlight (const char *string);
extern int string_is_word_char_input (const char *string);
extern char *string_mask_to_regex (const char *mask);
+2 -1
View File
@@ -93,7 +93,8 @@ gui_key_default_bindings (int context)
BIND(/* m-_ */ "meta-_", "/input redo");
BIND(/* <del> */ "meta2-3~", "/input delete_next_char");
BIND(/* ^D */ "ctrl-D", "/input delete_next_char");
BIND(/* ^W */ "ctrl-W", "/input delete_previous_word");
BIND(/* ^W */ "ctrl-W", "/input delete_previous_word_whitespace");
BIND(/* m-<backspace> */ "meta-ctrl-?", "/input delete_previous_word");
BIND(/* ^X */ "ctrl-X", "/input switch_active_buffer");
BIND(/* m-x */ "meta-x", "/input zoom_merged_buffer");
BIND(/* m-d */ "meta-d", "/input delete_next_word");
+68 -16
View File
@@ -95,7 +95,7 @@ gui_input_replace_input (struct t_gui_buffer *buffer, const char *new_input)
int size, length;
char *input_utf8;
input_utf8 = strdup (new_input);
input_utf8 = strdup ((new_input) ? new_input : "");
if (input_utf8)
{
utf8_normalize (input_utf8, '?');
@@ -838,13 +838,44 @@ gui_input_delete_next_char (struct t_gui_buffer *buffer)
}
/*
* Deletes previous word (default key: ctrl-W).
* Delete the range between two positions and copy the content to the
* clipboard.
*/
void
gui_input_delete_range (struct t_gui_buffer *buffer,
char *start,
char *end)
{
int size_deleted, length_deleted;
size_deleted = utf8_next_char (end) - start;
length_deleted = utf8_strnlen (start, size_deleted);
gui_input_clipboard_copy (start, size_deleted);
memmove (start, start + size_deleted, strlen (start + size_deleted));
if (gui_input_optimize_size (
buffer,
buffer->input_buffer_size - size_deleted,
buffer->input_buffer_length - length_deleted))
{
buffer->input_buffer[buffer->input_buffer_size] = '\0';
buffer->input_buffer_pos -= length_deleted;
}
gui_input_text_changed_modifier_and_signal (buffer,
1, /* save undo */
1); /* stop completion */
}
/*
* Deletes previous word (default key: alt-backspace).
*/
void
gui_input_delete_previous_word (struct t_gui_buffer *buffer)
{
int length_deleted, size_deleted;
char *start, *string;
if (buffer->input && (buffer->input_buffer_pos > 0))
@@ -872,24 +903,45 @@ gui_input_delete_previous_word (struct t_gui_buffer *buffer)
else
string = buffer->input_buffer;
size_deleted = utf8_next_char (start) - string;
length_deleted = utf8_strnlen (string, size_deleted);
gui_input_delete_range (buffer, string, start);
}
}
gui_input_clipboard_copy (string, size_deleted);
/*
* Deletes previous word until whitespace (default key: ctrl-W).
*/
memmove (string, string + size_deleted, strlen (string + size_deleted));
void
gui_input_delete_previous_word_whitespace (struct t_gui_buffer *buffer)
{
char *start, *string;
if (gui_input_optimize_size (
buffer,
buffer->input_buffer_size - size_deleted,
buffer->input_buffer_length - length_deleted))
if (buffer->input && (buffer->input_buffer_pos > 0))
{
gui_buffer_undo_snap (buffer);
start = (char *)utf8_add_offset (buffer->input_buffer,
buffer->input_buffer_pos - 1);
string = start;
/* move to the left, skipping whitespace */
while (string && string_is_whitespace_char (string))
{
buffer->input_buffer[buffer->input_buffer_size] = '\0';
buffer->input_buffer_pos -= length_deleted;
string = (char *)utf8_prev_char (buffer->input_buffer, string);
}
gui_input_text_changed_modifier_and_signal (buffer,
1, /* save undo */
1); /* stop completion */
/* move to the left until we reach a char which is not whitespace */
if (string)
{
while (string && !string_is_whitespace_char (string))
{
string = (char *)utf8_prev_char (buffer->input_buffer, string);
}
}
if (string)
string = (char *)utf8_next_char (string);
else
string = buffer->input_buffer;
gui_input_delete_range (buffer, string, start);
}
}
+1
View File
@@ -56,6 +56,7 @@ extern void gui_input_search_stop (struct t_gui_buffer *buffer);
extern void gui_input_delete_previous_char (struct t_gui_buffer *buffer);
extern void gui_input_delete_next_char (struct t_gui_buffer *buffer);
extern void gui_input_delete_previous_word (struct t_gui_buffer *buffer);
extern void gui_input_delete_previous_word_whitespace (struct t_gui_buffer *buffer);
extern void gui_input_delete_next_word (struct t_gui_buffer *buffer);
extern void gui_input_delete_beginning_of_line (struct t_gui_buffer *buffer);
extern void gui_input_delete_end_of_line (struct t_gui_buffer *buffer);