1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-24 18:17:34 +00:00

Shell: Start adding some alt shortcuts

This adds Alt-f to go forward by a word, and Alt-b to go backward
by a word (like ctrl-arrow-left / ctrl-arrow-right already do).

Behind the scenes, alt-key is implemented by sending <esc> followed
by that key, and typing <esc> f/b for moving by a word hence works
too (in all other shells too, not just in Serenity's).

While here, rename some InputState enum values to make the slightly
expanded use of <esc> clearer, and expand a few comments.
This commit is contained in:
Nico Weber 2020-08-06 10:52:18 -04:00 committed by Andreas Kling
parent 471083ca3d
commit 4d9d054386
2 changed files with 26 additions and 17 deletions

View file

@ -562,59 +562,68 @@ void Editor::handle_read_event()
continue; continue;
switch (m_state) { switch (m_state) {
case InputState::ExpectBracket: case InputState::GotEscape:
if (code_point == '[') { switch (code_point) {
m_state = InputState::ExpectFinal; case '[':
m_state = InputState::GotEscapeFollowedByLeftBracket;
continue; continue;
} else { case 'b': // ^[b: alt-b
do_cursor_left(Word);
m_state = InputState::Free; m_state = InputState::Free;
break; continue;
case 'f': // ^[f: alt-f
do_cursor_right(Word);
m_state = InputState::Free;
continue;
default:
m_state = InputState::Free;
continue;
} }
case InputState::ExpectFinal: case InputState::GotEscapeFollowedByLeftBracket:
switch (code_point) { switch (code_point) {
case 'O': // mod_ctrl case 'O': // mod_ctrl
ctrl_held = true; ctrl_held = true;
continue; continue;
case 'A': // up case 'A': // ^[[A: arrow up
do_search_backwards(); do_search_backwards();
m_state = InputState::Free; m_state = InputState::Free;
ctrl_held = false; ctrl_held = false;
continue; continue;
case 'B': // down case 'B': // ^[[B: arrow down
do_search_forwards(); do_search_forwards();
m_state = InputState::Free; m_state = InputState::Free;
ctrl_held = false; ctrl_held = false;
continue; continue;
case 'D': // left case 'D': // ^[[D: arrow left
do_cursor_left(ctrl_held ? Word : Character); do_cursor_left(ctrl_held ? Word : Character);
m_state = InputState::Free; m_state = InputState::Free;
ctrl_held = false; ctrl_held = false;
continue; continue;
case 'C': // right case 'C': // ^[[C: arrow right
do_cursor_right(ctrl_held ? Word : Character); do_cursor_right(ctrl_held ? Word : Character);
m_state = InputState::Free; m_state = InputState::Free;
ctrl_held = false; ctrl_held = false;
continue; continue;
case 'H': case 'H': // ^[[H: home
m_cursor = 0; m_cursor = 0;
m_inline_search_cursor = m_cursor; m_inline_search_cursor = m_cursor;
m_search_offset = 0; m_search_offset = 0;
m_state = InputState::Free; m_state = InputState::Free;
ctrl_held = false; ctrl_held = false;
continue; continue;
case 'F': case 'F': // ^[[F: end
m_cursor = m_buffer.size(); m_cursor = m_buffer.size();
m_state = InputState::Free; m_state = InputState::Free;
m_inline_search_cursor = m_cursor; m_inline_search_cursor = m_cursor;
m_search_offset = 0; m_search_offset = 0;
ctrl_held = false; ctrl_held = false;
continue; continue;
case 'Z': // shift+tab case 'Z': // ^[[Z: shift+tab
reverse_tab = true; reverse_tab = true;
m_state = InputState::Free; m_state = InputState::Free;
ctrl_held = false; ctrl_held = false;
break; break;
case '3': case '3': // ^[[3~: delete
do_delete(); do_delete();
m_search_offset = 0; m_search_offset = 0;
m_state = InputState::ExpectTerminator; m_state = InputState::ExpectTerminator;
@ -632,7 +641,7 @@ void Editor::handle_read_event()
continue; continue;
case InputState::Free: case InputState::Free:
if (code_point == 27) { if (code_point == 27) {
m_state = InputState::ExpectBracket; m_state = InputState::GotEscape;
continue; continue;
} }
break; break;

View file

@ -377,8 +377,8 @@ private:
enum class InputState { enum class InputState {
Free, Free,
ExpectBracket, GotEscape,
ExpectFinal, GotEscapeFollowedByLeftBracket,
ExpectTerminator, ExpectTerminator,
}; };
InputState m_state { InputState::Free }; InputState m_state { InputState::Free };