diff --git a/input.cpp b/input.cpp index 6127e23fa..2a9ac010b 100644 --- a/input.cpp +++ b/input.cpp @@ -113,6 +113,7 @@ static const wchar_t * const name_arr[] = L"history-token-search-backward", L"history-token-search-forward", L"self-insert", + L"transpose-chars", L"null", L"eof", L"vi-arg-digit", @@ -197,6 +198,7 @@ static const wchar_t code_arr[] = R_HISTORY_TOKEN_SEARCH_BACKWARD, R_HISTORY_TOKEN_SEARCH_FORWARD, R_SELF_INSERT, + R_TRANSPOSE_CHARS, R_NULL, R_EOF, R_VI_ARG_DIGIT, diff --git a/input.h b/input.h index bc68fbe07..a5df1a8b3 100644 --- a/input.h +++ b/input.h @@ -42,6 +42,7 @@ enum R_HISTORY_TOKEN_SEARCH_BACKWARD, R_HISTORY_TOKEN_SEARCH_FORWARD, R_SELF_INSERT, + R_TRANSPOSE_CHARS, R_VI_ARG_DIGIT, R_VI_DELETE_TO, R_EXECUTE, diff --git a/reader.cpp b/reader.cpp index c3e1e5b0a..2a26b050d 100644 --- a/reader.cpp +++ b/reader.cpp @@ -3542,6 +3542,33 @@ const wchar_t *reader_readline(void) break; } + case R_TRANSPOSE_CHARS: + { + if (data->command_length() < 2) { + break; + } + + /* If the cursor is at the end, transpose the last two characters of the line */ + if (data->buff_pos == data->command_length()) + { + data->buff_pos--; + } + + /* + Drag the character before the cursor forward over the character at the cursor, moving + the cursor forward as well. + */ + if (data->buff_pos > 0) + { + wchar_t tmp = data->command_line[data->buff_pos]; + data->command_line[data->buff_pos] = data->command_line[data->buff_pos-1]; + data->command_line[data->buff_pos-1] = tmp; + data->buff_pos++; + reader_repaint(); + } + break; + } + /* Other, if a normal character, we add it to the command */ default: { diff --git a/share/functions/fish_default_key_bindings.fish b/share/functions/fish_default_key_bindings.fish index 18b7318ee..a01579bab 100644 --- a/share/functions/fish_default_key_bindings.fish +++ b/share/functions/fish_default_key_bindings.fish @@ -67,6 +67,7 @@ function fish_default_key_bindings -d "Default (Emacs-like) key bindings for fis bind \cn history-search-forward bind \cf forward-char bind \cb backward-char + bind \ct transpose-chars bind \e\x7f backward-kill-word bind \eb backward-word bind \ef forward-word