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:
@@ -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 || "
|
||||
|
||||
@@ -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".
|
||||
*
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user