From 2819343fcafdcfc9db4d9213031a6f790fa76f22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Sun, 20 Sep 2015 00:26:56 +0200 Subject: vis: introduce keyboard actions This adds another level of indirection by defining keyboard actions which will likely eventually be used by a :map command. --- config.def.h | 1434 +++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 1172 insertions(+), 262 deletions(-) (limited to 'config.def.h') diff --git a/config.def.h b/config.def.h index 2211d32..822ad75 100644 --- a/config.def.h +++ b/config.def.h @@ -13,10 +13,10 @@ enum { VIS_MODE_BASIC, VIS_MODE_MOVE, - VIS_MODE_TEXTOBJ, VIS_MODE_OPERATOR, VIS_MODE_OPERATOR_OPTION, VIS_MODE_NORMAL, + VIS_MODE_TEXTOBJ, VIS_MODE_VISUAL, VIS_MODE_VISUAL_LINE, VIS_MODE_READLINE, @@ -65,152 +65,1075 @@ static bool vis_keypress(const char *key) { return true; } +#define ALIAS(name) .alias = name, +#define ACTION(id) .action = &vis_action[VIS_ACTION_##id], + +enum { + VIS_ACTION_EDITOR_SUSPEND, + VIS_ACTION_CURSOR_CHAR_PREV, + VIS_ACTION_CURSOR_CHAR_NEXT, + VIS_ACTION_CURSOR_WORD_START_PREV, + VIS_ACTION_CURSOR_WORD_START_NEXT, + VIS_ACTION_CURSOR_WORD_END_PREV, + VIS_ACTION_CURSOR_WORD_END_NEXT, + VIS_ACTION_CURSOR_LONGWORD_START_PREV, + VIS_ACTION_CURSOR_LONGWORD_START_NEXT, + VIS_ACTION_CURSOR_LONGWORD_END_PREV, + VIS_ACTION_CURSOR_LONGWORD_END_NEXT, + VIS_ACTION_CURSOR_LINE_UP, + VIS_ACTION_CURSOR_LINE_DOWN, + VIS_ACTION_CURSOR_LINE_START, + VIS_ACTION_CURSOR_LINE_FINISH, + VIS_ACTION_CURSOR_LINE_BEGIN, + VIS_ACTION_CURSOR_LINE_END, + VIS_ACTION_CURSOR_SCREEN_LINE_UP, + VIS_ACTION_CURSOR_SCREEN_LINE_DOWN, + VIS_ACTION_CURSOR_SCREEN_LINE_BEGIN, + VIS_ACTION_CURSOR_SCREEN_LINE_MIDDLE, + VIS_ACTION_CURSOR_SCREEN_LINE_END, + VIS_ACTION_CURSOR_BRACKET_MATCH, + VIS_ACTION_CURSOR_PARAGRAPH_PREV, + VIS_ACTION_CURSOR_PARAGRAPH_NEXT, + VIS_ACTION_CURSOR_SENTENCE_PREV, + VIS_ACTION_CURSOR_SENTENCE_NEXT, + VIS_ACTION_CURSOR_FUNCTION_START_PREV, + VIS_ACTION_CURSOR_FUNCTION_END_PREV, + VIS_ACTION_CURSOR_FUNCTION_START_NEXT, + VIS_ACTION_CURSOR_FUNCTION_END_NEXT, + VIS_ACTION_CURSOR_COLUMN, + VIS_ACTION_CURSOR_LINE_FIRST, + VIS_ACTION_CURSOR_LINE_LAST, + VIS_ACTION_CURSOR_WINDOW_LINE_TOP, + VIS_ACTION_CURSOR_WINDOW_LINE_MIDDLE, + VIS_ACTION_CURSOR_WINDOW_LINE_BOTTOM, + VIS_ACTION_CURSOR_SEARCH_FORWARD, + VIS_ACTION_CURSOR_SEARCH_BACKWARD, + VIS_ACTION_CURSOR_SEARCH_WORD_FORWARD, + VIS_ACTION_CURSOR_SEARCH_WORD_BACKWARD, + VIS_ACTION_WINDOW_PAGE_UP, + VIS_ACTION_WINDOW_PAGE_DOWN, + VIS_ACTION_WINDOW_HALFPAGE_UP, + VIS_ACTION_WINDOW_HALFPAGE_DOWN, + VIS_ACTION_MODE_NORMAL, + VIS_ACTION_MODE_VISUAL, + VIS_ACTION_MODE_VISUAL_LINE, + VIS_ACTION_MODE_INSERT, + VIS_ACTION_MODE_REPLACE, + VIS_ACTION_MODE_OPERATOR_PENDING, + VIS_ACTION_DELETE_CHAR_PREV, + VIS_ACTION_DELETE_CHAR_NEXT, + VIS_ACTION_DELETE_LINE_BEGIN, + VIS_ACTION_DELETE_WORD_PREV, + VIS_ACTION_JUMPLIST_PREV, + VIS_ACTION_JUMPLIST_NEXT, + VIS_ACTION_CHANGELIST_PREV, + VIS_ACTION_CHANGELIST_NEXT, + VIS_ACTION_UNDO, + VIS_ACTION_REDO, + VIS_ACTION_EARLIER, + VIS_ACTION_LATER, + VIS_ACTION_MACRO_RECORD, + VIS_ACTION_MACRO_REPLAY, + VIS_ACTION_MARK_SET, + VIS_ACTION_MARK_GOTO, + VIS_ACTION_MARK_GOTO_LINE, + VIS_ACTION_REDRAW, + VIS_ACTION_REPLACE_CHAR, + VIS_ACTION_TOTILL_REPEAT, + VIS_ACTION_TOTILL_REVERSE, + VIS_ACTION_SEARCH_FORWARD, + VIS_ACTION_SEARCH_BACKWARD, + VIS_ACTION_TILL_LEFT, + VIS_ACTION_TILL_RIGHT, + VIS_ACTION_TO_LEFT, + VIS_ACTION_TO_RIGHT, + VIS_ACTION_REGISTER, + VIS_ACTION_OPERATOR_CHANGE, + VIS_ACTION_OPERATOR_DELETE, + VIS_ACTION_OPERATOR_YANK, + VIS_ACTION_OPERATOR_SHIFT_LEFT, + VIS_ACTION_OPERATOR_SHIFT_RIGHT, + VIS_ACTION_OPERATOR_CASE_LOWER, + VIS_ACTION_OPERATOR_CASE_UPPER, + VIS_ACTION_OPERATOR_CASE_SWAP, + VIS_ACTION_COUNT, + VIS_ACTION_INSERT_NEWLINE, + VIS_ACTION_INSERT_TAB, + VIS_ACTION_INSERT_VERBATIM, + VIS_ACTION_INSERT_REGISTER, + VIS_ACTION_WINDOW_NEXT, + VIS_ACTION_WINDOW_PREV, + VIS_ACTION_OPEN_LINE_ABOVE, + VIS_ACTION_OPEN_LINE_BELOW, + VIS_ACTION_JOIN_LINE_BELOW, + VIS_ACTION_JOIN_LINES, + VIS_ACTION_PROMPT_SHOW, + VIS_ACTION_PROMPT_BACKSPACE, + VIS_ACTION_PROMPT_ENTER, + VIS_ACTION_PROMPT_SHOW_VISUAL, + VIS_ACTION_REPEAT, + VIS_ACTION_SELECTION_FLIP, + VIS_ACTION_SELECTION_RESTORE, + VIS_ACTION_WINDOW_REDRAW_TOP, + VIS_ACTION_WINDOW_REDRAW_CENTER, + VIS_ACTION_WINDOW_REDRAW_BOTTOM, + VIS_ACTION_WINDOW_SLIDE_UP, + VIS_ACTION_WINDOW_SLIDE_DOWN, + VIS_ACTION_PUT_AFTER, + VIS_ACTION_PUT_BEFORE, + VIS_ACTION_PUT_AFTER_END, + VIS_ACTION_PUT_BEFORE_END, + VIS_ACTION_CURSOR_SELECT_WORD, + VIS_ACTION_CURSORS_NEW_LINE_ABOVE, + VIS_ACTION_CURSORS_NEW_LINE_BELOW, + VIS_ACTION_CURSORS_NEW_LINES_BEGIN, + VIS_ACTION_CURSORS_NEW_LINES_END, + VIS_ACTION_CURSORS_NEW_MATCH_NEXT, + VIS_ACTION_CURSORS_NEW_MATCH_SKIP, + VIS_ACTION_CURSORS_ALIGN, + VIS_ACTION_CURSORS_REMOVE_ALL, + VIS_ACTION_CURSORS_REMOVE_LAST, + VIS_ACTION_TEXT_OBJECT_WORD_OUTER, + VIS_ACTION_TEXT_OBJECT_WORD_INNER, + VIS_ACTION_TEXT_OBJECT_LONGWORD_OUTER, + VIS_ACTION_TEXT_OBJECT_LONGWORD_INNER, + VIS_ACTION_TEXT_OBJECT_SENTENCE, + VIS_ACTION_TEXT_OBJECT_PARAGRAPH, + VIS_ACTION_TEXT_OBJECT_SQUARE_BRACKET_OUTER, + VIS_ACTION_TEXT_OBJECT_SQUARE_BRACKET_INNER, + VIS_ACTION_TEXT_OBJECT_PARANTHESE_OUTER, + VIS_ACTION_TEXT_OBJECT_PARANTHESE_INNER, + VIS_ACTION_TEXT_OBJECT_ANGLE_BRACKET_OUTER, + VIS_ACTION_TEXT_OBJECT_ANGLE_BRACKET_INNER, + VIS_ACTION_TEXT_OBJECT_CURLY_BRACKET_OUTER, + VIS_ACTION_TEXT_OBJECT_CURLY_BRACKET_INNER, + VIS_ACTION_TEXT_OBJECT_QUOTE_OUTER, + VIS_ACTION_TEXT_OBJECT_QUOTE_INNER, + VIS_ACTION_TEXT_OBJECT_SINGLE_QUOTE_OUTER, + VIS_ACTION_TEXT_OBJECT_SINGLE_QUOTE_INNER, + VIS_ACTION_TEXT_OBJECT_BACKTICK_OUTER, + VIS_ACTION_TEXT_OBJECT_BACKTICK_INNER, + VIS_ACTION_TEXT_OBJECT_ENTIRE_OUTER, + VIS_ACTION_TEXT_OBJECT_ENTIRE_INNER, + VIS_ACTION_TEXT_OBJECT_FUNCTION_OUTER, + VIS_ACTION_TEXT_OBJECT_FUNCTION_INNER, + VIS_ACTION_TEXT_OBJECT_LINE_OUTER, + VIS_ACTION_TEXT_OBJECT_LINE_INNER, + VIS_ACTION_MOTION_CHARWISE, + VIS_ACTION_MOTION_LINEWISE, +}; + +static KeyAction vis_action[] = { + [VIS_ACTION_EDITOR_SUSPEND] = { + "editor-suspend", + "Suspend the editor", + suspend, + }, + [VIS_ACTION_CURSOR_CHAR_PREV] = { + "cursor-char-prev", + "Move cursor left, to the previous character", + movement, { .i = MOVE_CHAR_PREV } + }, + [VIS_ACTION_CURSOR_CHAR_NEXT] = { + "cursor-char-next", + "Move cursor rigth, to the next character", + movement, { .i = MOVE_CHAR_NEXT } + }, + [VIS_ACTION_CURSOR_WORD_START_PREV] = { + "cursor-word-start-prev", + "Move cursor words backwards", + movement, { .i = MOVE_WORD_START_PREV } + }, + [VIS_ACTION_CURSOR_WORD_START_NEXT] = { + "cursor-word-start-next", + "Move cursor words forwards", + movement, { .i = MOVE_WORD_START_NEXT } + }, + [VIS_ACTION_CURSOR_WORD_END_PREV] = { + "cursor-word-end-prev", + "Move cursor bacwards to the end of word", + movement, { .i = MOVE_WORD_END_PREV } + }, + [VIS_ACTION_CURSOR_WORD_END_NEXT] = { + "cursor-word-end-next", + "Move cursor forward to the end of word", + movement, { .i = MOVE_WORD_END_NEXT } + }, + [VIS_ACTION_CURSOR_LONGWORD_START_PREV] = { + "cursor-longword-start-prev", + "Move cursor WORDS backwards", + movement, { .i = MOVE_LONGWORD_START_PREV } + }, + [VIS_ACTION_CURSOR_LONGWORD_START_NEXT] = { + "cursor-longword-start-next", + "Move cursor WORDS forwards", + movement, { .i = MOVE_LONGWORD_START_NEXT } + }, + [VIS_ACTION_CURSOR_LONGWORD_END_PREV] = { + "cursor-longword-end-prev", + "Move cursor bacwards to the end of WORD", + movement, { .i = MOVE_LONGWORD_END_PREV } + }, + [VIS_ACTION_CURSOR_LONGWORD_END_NEXT] = { + "cursor-longword-end-next", + "Move cursor forward to the end of WORD", + movement, { .i = MOVE_LONGWORD_END_NEXT } + }, + [VIS_ACTION_CURSOR_LINE_UP] = { + "cursor-line-up", + "Move cursor line upwards", + movement, { .i = MOVE_LINE_UP } + }, + [VIS_ACTION_CURSOR_LINE_DOWN] = { + "cursor-line-down", + "Move cursor line downwards", + movement, { .i = MOVE_LINE_DOWN } + }, + [VIS_ACTION_CURSOR_LINE_START] = { + "cursor-line-start", + "Move cursor to first non-blank character of the line", + movement, { .i = MOVE_LINE_START } + }, + [VIS_ACTION_CURSOR_LINE_FINISH] = { + "cursor-line-finish", + "Move cursor to last non-blank character of the line", + movement, { .i = MOVE_LINE_FINISH } + }, + [VIS_ACTION_CURSOR_LINE_BEGIN] = { + "cursor-line-begin", + "Move cursor to first character of the line", + movement, { .i = MOVE_LINE_BEGIN } + }, + [VIS_ACTION_CURSOR_LINE_END] = { + "cursor-line-end", + "Move cursor to end of the line", + movement, { .i = MOVE_LINE_LASTCHAR } + }, + [VIS_ACTION_CURSOR_SCREEN_LINE_UP] = { + "cursor-sceenline-up", + "Move cursor screen/display line upwards", + movement, { .i = MOVE_SCREEN_LINE_UP } + }, + [VIS_ACTION_CURSOR_SCREEN_LINE_DOWN] = { + "cursor-screenline-down", + "Move cursor screen/display line downwards", + movement, { .i = MOVE_SCREEN_LINE_DOWN } + }, + [VIS_ACTION_CURSOR_SCREEN_LINE_BEGIN] = { + "cursor-screenline-begin", + "Move cursor to begin of screen/display line", + movement, { .i = MOVE_SCREEN_LINE_BEGIN } + }, + [VIS_ACTION_CURSOR_SCREEN_LINE_MIDDLE] = { + "cursor-screenline-middle", + "Move cursor to middle of screen/display line", + movement, { .i = MOVE_SCREEN_LINE_MIDDLE } + }, + [VIS_ACTION_CURSOR_SCREEN_LINE_END] = { + "cursor-screenline-end", + "Move cursor to end of screen/display line", + movement, { .i = MOVE_SCREEN_LINE_END } + }, + [VIS_ACTION_CURSOR_BRACKET_MATCH] = { + "cursor-match-bracket", + "Match corresponding symbol if cursor is on one of ", + movement, { .i = MOVE_BRACKET_MATCH } + }, + [VIS_ACTION_CURSOR_PARAGRAPH_PREV] = { + "cursor-paragraph-prev", + "Move cursor paragraph backward", + movement, { .i = MOVE_PARAGRAPH_PREV } + }, + [VIS_ACTION_CURSOR_PARAGRAPH_NEXT] = { + "cursor-paragraph-next", + "Move cursor paragraph forward", + movement, { .i = MOVE_PARAGRAPH_NEXT } + }, + [VIS_ACTION_CURSOR_SENTENCE_PREV] = { + "cursor-sentence-prev", + "Move cursor sentence backward", + movement, { .i = MOVE_SENTENCE_PREV } + }, + [VIS_ACTION_CURSOR_SENTENCE_NEXT] = { + "cursor-sentence-next", + "Move cursor sentence forward", + movement, { .i = MOVE_SENTENCE_NEXT } + }, + [VIS_ACTION_CURSOR_FUNCTION_START_PREV] = { + "cursor-function-start-prev", + "Move cursor backwards to start of function", + movement, { .i = MOVE_FUNCTION_START_PREV } + }, + [VIS_ACTION_CURSOR_FUNCTION_START_NEXT] = { + "cursor-function-start-next", + "Move cursor forwards to start of function", + movement, { .i = MOVE_FUNCTION_START_NEXT } + }, + [VIS_ACTION_CURSOR_FUNCTION_END_PREV] = { + "cursor-function-end-prev", + "Move cursor backwards to end of function", + movement, { .i = MOVE_FUNCTION_END_PREV } + }, + [VIS_ACTION_CURSOR_FUNCTION_END_NEXT] = { + "cursor-function-end-next", + "Move cursor forwards to end of function", + movement, { .i = MOVE_FUNCTION_END_NEXT } + }, + [VIS_ACTION_CURSOR_COLUMN] = { + "cursor-column", + "Move cursor to given column of current line", + movement, { .i = MOVE_COLUMN } + }, + [VIS_ACTION_CURSOR_LINE_FIRST] = { + "cursor-line-first", + "Move cursor to given line (defaults to first)", + gotoline, { .i = -1 } + }, + [VIS_ACTION_CURSOR_LINE_LAST] = { + "cursor-line-last", + "Move cursor to given line (defaults to last)", + gotoline, { .i = +1 } + }, + [VIS_ACTION_CURSOR_WINDOW_LINE_TOP] = { + "cursor-window-line-top", + "Move cursor to top line of the window", + movement, { .i = MOVE_WINDOW_LINE_TOP } + }, + [VIS_ACTION_CURSOR_WINDOW_LINE_MIDDLE] = { + "cursor-window-line-middle", + "Move cursor to middle line of the window", + movement, { .i = MOVE_WINDOW_LINE_MIDDLE } + }, + [VIS_ACTION_CURSOR_WINDOW_LINE_BOTTOM] = { + "cursor-window-line-bottom", + "Move cursor to bottom line of the window", + movement, { .i = MOVE_WINDOW_LINE_BOTTOM } + }, + [VIS_ACTION_CURSOR_SEARCH_FORWARD] = { + "cursor-search-forward", + "Move cursor to bottom line of the window", + movement, { .i = MOVE_SEARCH_FORWARD } + }, + [VIS_ACTION_CURSOR_SEARCH_BACKWARD] = { + "cursor-search-backward", + "Move cursor to bottom line of the window", + movement, { .i = MOVE_SEARCH_BACKWARD } + }, + [VIS_ACTION_CURSOR_SEARCH_WORD_FORWARD] = { + "cursor-search-word-forward", + "Move cursor next occurence of the word under cursor", + movement, { .i = MOVE_SEARCH_WORD_FORWARD } + }, + [VIS_ACTION_CURSOR_SEARCH_WORD_BACKWARD] = { + "cursor-search-word-backward", + "Move cursor previous occurence of the word under cursor", + movement, { .i = MOVE_SEARCH_WORD_BACKWARD } + }, + [VIS_ACTION_WINDOW_PAGE_UP] = { + "window-page-up", + "Scroll window pages backwards (upwards)", + wscroll, { .i = -PAGE } + }, + [VIS_ACTION_WINDOW_HALFPAGE_UP] = { + "window-halfpage-up", + "Scroll window half pages backwards (upwards)", + wscroll, { .i = -PAGE_HALF } + }, + [VIS_ACTION_WINDOW_PAGE_DOWN] = { + "window-page-down", + "Scroll window pages forwards (downwards)", + wscroll, { .i = +PAGE } + }, + [VIS_ACTION_WINDOW_HALFPAGE_DOWN] = { + "window-halfpage-down", + "Scroll window half pages forwards (downwards)", + wscroll, { .i = +PAGE_HALF } + }, + [VIS_ACTION_MODE_NORMAL] = { + "vis-mode-normal", + "Enter normal mode", + switchmode, { .i = VIS_MODE_NORMAL } + }, + [VIS_ACTION_MODE_VISUAL] = { + "vis-mode-visual", + "Enter characterwise visual mode", + switchmode, { .i = VIS_MODE_VISUAL } + }, + [VIS_ACTION_MODE_VISUAL_LINE] = { + "vis-mode-visual", + "Enter linewise visual mode", + switchmode, { .i = VIS_MODE_VISUAL_LINE } + }, + [VIS_ACTION_MODE_INSERT] = { + "vis-mode-insert", + "Enter insert mode", + switchmode, { .i = VIS_MODE_INSERT } + }, + [VIS_ACTION_MODE_REPLACE] = { + "vis-mode-replace", + "Enter replace mode", + switchmode, { .i = VIS_MODE_REPLACE } + }, + [VIS_ACTION_MODE_OPERATOR_PENDING] = { + "vis-mode-operator-pending", + "Enter to operator pending mode", + switchmode, { .i = VIS_MODE_OPERATOR } + }, + [VIS_ACTION_DELETE_CHAR_PREV] = { + "delete-char-prev", + "Delete the previous character", + delete, { .i = MOVE_CHAR_PREV } + }, + [VIS_ACTION_DELETE_CHAR_NEXT] = { + "delete-char-next", + "Delete the next character", + delete, { .i = MOVE_CHAR_NEXT } + }, + [VIS_ACTION_DELETE_LINE_BEGIN] = { + "delete-line-begin", + "Delete until the start of the current line", + delete, { .i = MOVE_LINE_BEGIN } + }, + [VIS_ACTION_DELETE_WORD_PREV] = { + "delete-word-prev", + "Delete the previous WORD", + delete, { .i = MOVE_LONGWORD_START_PREV } + }, + [VIS_ACTION_JUMPLIST_PREV] = { + "jumplist-prev", + "Go to older cursor positon in jump list", + jumplist, { .i = -1 } + }, + [VIS_ACTION_JUMPLIST_NEXT] = { + "jumplist-next", + "Go to newer cursor positon in jump list", + jumplist, { .i = +1 } + }, + [VIS_ACTION_CHANGELIST_PREV] = { + "changelist-prev", + "Go to older cursor positon in change list", + changelist, { .i = -1 } + }, + [VIS_ACTION_CHANGELIST_NEXT] = { + "changelist-next", + "Go to newer cursor positon in change list", + changelist, { .i = +1 } + }, + [VIS_ACTION_UNDO] = { + "editor-undo", + "Undo last change", + undo, + }, + [VIS_ACTION_REDO] = { + "editor-redo", + "Redo last change", + redo, + }, + [VIS_ACTION_EARLIER] = { + "editor-earlier", + "Goto older text state", + earlier, + }, + [VIS_ACTION_LATER] = { + "editor-later", + "Goto newer text state", + later, + }, + [VIS_ACTION_MACRO_RECORD] = { + "macro-record", + "Record macro into given regiser", + macro_record, + }, + [VIS_ACTION_MACRO_REPLAY] = { + "macro-replay", + "Replay macro, execute the content of the given regiser", + macro_replay, + }, + [VIS_ACTION_MARK_SET] = { + "mark-set", + "Set given mark at current cursor position", + mark_set, + }, + [VIS_ACTION_MARK_GOTO] = { + "mark-goto", + "Goto the position of the given mark", + mark, + }, + [VIS_ACTION_MARK_GOTO_LINE] = { + "mark-goto-line", + "Goto first non-blank character of the line containing the given mark", + mark_line, + }, + [VIS_ACTION_REDRAW] = { + "editor-redraw", + "Redraw current editor content", + call, { .f = editor_draw } + }, + [VIS_ACTION_REPLACE_CHAR] = { + "replace-char", + "Replace the character under the cursor", + replace, + }, + [VIS_ACTION_TOTILL_REPEAT] = { + "totill-repeat", + "Repeat latest to/till motion", + totill_repeat, + }, + [VIS_ACTION_TOTILL_REVERSE] = { + "totill-reverse", + "Repeat latest to/till motion but in opposite direction", + totill_reverse, + }, + [VIS_ACTION_SEARCH_FORWARD] = { + "search-forward", + "Search forward", + prompt_search, { .s = "/" } + }, + [VIS_ACTION_SEARCH_BACKWARD] = { + "search-backward", + "Search backward", + prompt_search, { .s = "?" } + }, + [VIS_ACTION_TILL_LEFT] = { + "till-left", + "Till after the occurrence of character to the left", + movement_key, { .i = MOVE_LEFT_TILL } + }, + [VIS_ACTION_TILL_RIGHT] = { + "till-right", + "Till before the occurrence of character to the right", + movement_key, { .i = MOVE_RIGHT_TILL } + }, + [VIS_ACTION_TO_LEFT] = { + "to-left", + "To the first occurrence of character to the left", + movement_key, { .i = MOVE_LEFT_TO } + }, + [VIS_ACTION_TO_RIGHT] = { + "to-right", + "To the first occurrence of character to the right", + movement_key, { .i = MOVE_RIGHT_TO } + }, + [VIS_ACTION_REGISTER] = { + "register", + "Use given register for next operator", + reg, + }, + [VIS_ACTION_OPERATOR_CHANGE] = { + "vis-operator-change", + "Change operator", + operator, { .i = OP_CHANGE } + }, + [VIS_ACTION_OPERATOR_DELETE] = { + "vis-operator-delete", + "Delete operator", + operator, { .i = OP_DELETE } + }, + [VIS_ACTION_OPERATOR_YANK] = { + "vis-operator-yank", + "Yank operator", + operator, { .i = OP_YANK } + }, + [VIS_ACTION_OPERATOR_SHIFT_LEFT] = { + "vis-operator-shift-left", + "Shift left operator", + operator, { .i = OP_SHIFT_LEFT } + }, + [VIS_ACTION_OPERATOR_SHIFT_RIGHT] = { + "vis-operator-shift-right", + "Shift right operator", + operator, { .i = OP_SHIFT_RIGHT } + }, + [VIS_ACTION_OPERATOR_CASE_LOWER] = { + "vis-operator-case-lower", + "Lowercase operator", + changecase, { .i = -1 } + }, + [VIS_ACTION_OPERATOR_CASE_UPPER] = { + "vis-operator-case-upper", + "Uppercase operator", + changecase, { .i = +1 } + }, + [VIS_ACTION_OPERATOR_CASE_SWAP] = { + "vis-operator-case-swap", + "Swap case operator", + changecase, { .i = 0 } + }, + [VIS_ACTION_COUNT] = { + "vis-count", + "Count specifier", + count, + }, + [VIS_ACTION_INSERT_NEWLINE] = { + "insert-newline", + "Insert a line break (depending on file type)", + insert_newline, + }, + [VIS_ACTION_INSERT_TAB] = { + "insert-tab", + "Insert a tab (might be converted to spaces)", + insert_tab, + }, + [VIS_ACTION_INSERT_VERBATIM] = { + "insert-verbatim", + "Insert Unicode character based on code point", + insert_verbatim, + }, + [VIS_ACTION_INSERT_REGISTER] = { + "insert-register", + "Insert specified register content", + insert_register, + }, + [VIS_ACTION_WINDOW_NEXT] = { + "window-next", + "Focus next window", + call, { .f = editor_window_next } + }, + [VIS_ACTION_WINDOW_PREV] = { + "window-prev", + "Focus previous window", + call, { .f = editor_window_prev } + }, + [VIS_ACTION_OPEN_LINE_ABOVE] = { + "open-line-above", + "Begin a new line above the cursor", + openline, { .i = MOVE_LINE_PREV } + }, + [VIS_ACTION_OPEN_LINE_BELOW] = { + "open-line-below", + "Begin a new line below the cursor", + openline, { .i = MOVE_LINE_NEXT } + }, + [VIS_ACTION_JOIN_LINE_BELOW] = { + "join-line-below", + "Join line(s)", + join, { .i = MOVE_LINE_NEXT }, + }, + [VIS_ACTION_JOIN_LINES] = { + "join-lines", + "Join selected lines", + operator, { .i = OP_JOIN } + }, + [VIS_ACTION_PROMPT_SHOW] = { + "prompt-show", + "Show editor command line prompt", + prompt_cmd, { .s = "" } + }, + [VIS_ACTION_PROMPT_BACKSPACE] = { + "prompt-backspace", + "Delete previous character in prompt", + prompt_backspace + }, + [VIS_ACTION_PROMPT_ENTER] = { + "prompt-enter", + "Execute current prompt content", + prompt_enter + }, + [VIS_ACTION_PROMPT_SHOW_VISUAL] = { + "prompt-show-visual", + "Show editor command line prompt in visual mode", + prompt_cmd, { .s = "'<,'>" } + }, + [VIS_ACTION_REPEAT] = { + "editor-repeat", + "Repeat latest editor command", + repeat + }, + [VIS_ACTION_SELECTION_FLIP] = { + "selection-flip", + "Flip selection, move cursor to other end", + selection_end, + }, + [VIS_ACTION_SELECTION_RESTORE] = { + "selection-restore", + "Restore last selection", + selection_restore, + }, + [VIS_ACTION_WINDOW_REDRAW_TOP] = { + "window-redraw-top", + "Redraw cursor line at the top of the window", + window, { .w = view_redraw_top } + }, + [VIS_ACTION_WINDOW_REDRAW_CENTER] = { + "window-redraw-center", + "Redraw cursor line at the center of the window", + window, { .w = view_redraw_center } + }, + [VIS_ACTION_WINDOW_REDRAW_BOTTOM] = { + "window-redraw-bottom", + "Redraw cursor line at the bottom of the window", + window, { .w = view_redraw_bottom } + }, + [VIS_ACTION_WINDOW_SLIDE_UP] = { + "window-slide-up", + "Slide window content upwards", + wslide, { .i = -1 } + }, + [VIS_ACTION_WINDOW_SLIDE_DOWN] = { + "window-slide-down", + "Slide window content downwards", + wslide, { .i = +1 } + }, + [VIS_ACTION_PUT_AFTER] = { + "put-after", + "Put text after the cursor", + put, { .i = PUT_AFTER } + }, + [VIS_ACTION_PUT_BEFORE] = { + "put-before", + "Put text before the cursor", + put, { .i = PUT_BEFORE } + }, + [VIS_ACTION_PUT_AFTER_END] = { + "put-after-end", + "Put text after the cursor, place it after new text", + put, { .i = PUT_AFTER_END } + }, + [VIS_ACTION_PUT_BEFORE_END] = { + "put-before-end", + "Put text before the cursor, place it after new text", + put, { .i = PUT_BEFORE_END } + }, + [VIS_ACTION_CURSOR_SELECT_WORD] = { + "cursors-select-word", + "Select word under cursor", + cursors_select, + }, + [VIS_ACTION_CURSORS_NEW_LINE_ABOVE] = { + "cursors-new-lines-above", + "Create a new cursor on the line above", + cursors_new, { .i = -1 } + }, + [VIS_ACTION_CURSORS_NEW_LINE_BELOW] = { + "cursor-new-lines-below", + "Create a new cursor on the line below", + cursors_new, { .i = +1 } + }, + [VIS_ACTION_CURSORS_NEW_LINES_BEGIN] = { + "cursors-new-lines-begin", + "Create a new cursor at the start of every line covered by selection", + cursors_split, { .i = -1 } + }, + [VIS_ACTION_CURSORS_NEW_LINES_END] = { + "cursors-new-lines-end", + "Create a new cursor at the end of every line covered by selection", + cursors_split, { .i = +1 } + }, + [VIS_ACTION_CURSORS_NEW_MATCH_NEXT] = { + "cursors-new-match-next", + "Select the next region matching the current selection", + cursors_select_next + }, + [VIS_ACTION_CURSORS_NEW_MATCH_SKIP] = { + "cursors-new-match-skip", + "Clear current selection, but select next match", + cursors_select_skip, + }, + [VIS_ACTION_CURSORS_ALIGN] = { + "cursors-align", + "Try to align all cursors on the same column", + cursors_align, + }, + [VIS_ACTION_CURSORS_REMOVE_ALL] = { + "cursors-remove-all", + "Remove all but the primary cursor", + cursors_clear, + }, + [VIS_ACTION_CURSORS_REMOVE_LAST] = { + "cursors-remove-last", + "Remove least recently created cursor", + cursors_remove, + }, + [VIS_ACTION_TEXT_OBJECT_WORD_OUTER] = { + "text-object-word-outer", + "A word leading and trailing whitespace included", + textobj, { .i = TEXT_OBJ_OUTER_WORD } + }, + [VIS_ACTION_TEXT_OBJECT_WORD_INNER] = { + "text-object-word-inner", + "A word leading and trailing whitespace excluded", + textobj, { .i = TEXT_OBJ_INNER_WORD } + }, + [VIS_ACTION_TEXT_OBJECT_LONGWORD_OUTER] = { + "text-object-longword-outer", + "A WORD leading and trailing whitespace included", + textobj, { .i = TEXT_OBJ_OUTER_LONGWORD } + }, + [VIS_ACTION_TEXT_OBJECT_LONGWORD_INNER] = { + "text-object-longword-inner", + "A WORD leading and trailing whitespace excluded", + textobj, { .i = TEXT_OBJ_INNER_LONGWORD } + }, + [VIS_ACTION_TEXT_OBJECT_SENTENCE] = { + "text-object-sentence", + "A sentence", + textobj, { .i = TEXT_OBJ_SENTENCE } + }, + [VIS_ACTION_TEXT_OBJECT_PARAGRAPH] = { + "text-object-paragraph", + "A paragraph", + textobj, { .i = TEXT_OBJ_PARAGRAPH } + }, + [VIS_ACTION_TEXT_OBJECT_SQUARE_BRACKET_OUTER] = { + "text-object-square-bracket-outer", + "[] block (outer variant)", + textobj, { .i = TEXT_OBJ_OUTER_SQUARE_BRACKET } + }, + [VIS_ACTION_TEXT_OBJECT_SQUARE_BRACKET_INNER] = { + "text-object-square-bracket-inner", + "[] block (inner variant)", + textobj, { .i = TEXT_OBJ_INNER_SQUARE_BRACKET } + }, + [VIS_ACTION_TEXT_OBJECT_PARANTHESE_OUTER] = { + "text-object-parentheses-outer", + "() block (outer variant)", + textobj, { .i = TEXT_OBJ_OUTER_PARANTHESE } + }, + [VIS_ACTION_TEXT_OBJECT_PARANTHESE_INNER] = { + "text-object-parentheses-inner", + "() block (inner variant)", + textobj, { .i = TEXT_OBJ_INNER_PARANTHESE } + }, + [VIS_ACTION_TEXT_OBJECT_ANGLE_BRACKET_OUTER] = { + "text-object-angle-bracket-outer", + "<> block (outer variant)", + textobj, { .i = TEXT_OBJ_OUTER_ANGLE_BRACKET } + }, + [VIS_ACTION_TEXT_OBJECT_ANGLE_BRACKET_INNER] = { + "text-object-angle-bracket-inner", + "<> block (inner variant)", + textobj, { .i = TEXT_OBJ_INNER_ANGLE_BRACKET } + }, + [VIS_ACTION_TEXT_OBJECT_CURLY_BRACKET_OUTER] = { + "text-object-curly-bracket-outer", + "{} block (outer variant)", + textobj, { .i = TEXT_OBJ_OUTER_CURLY_BRACKET } + }, + [VIS_ACTION_TEXT_OBJECT_CURLY_BRACKET_INNER] = { + "text-object-curly-bracket-inner", + "{} block (inner variant)", + textobj, { .i = TEXT_OBJ_INNER_CURLY_BRACKET } + }, + [VIS_ACTION_TEXT_OBJECT_QUOTE_OUTER] = { + "text-object-quote-outer", + "A quoted string, including the quotation marks", + textobj, { .i = TEXT_OBJ_OUTER_QUOTE } + }, + [VIS_ACTION_TEXT_OBJECT_QUOTE_INNER] = { + "text-object-quote-inner", + "A quoted string, excluding the quotation marks", + textobj, { .i = TEXT_OBJ_INNER_QUOTE } + }, + [VIS_ACTION_TEXT_OBJECT_SINGLE_QUOTE_OUTER] = { + "text-object-single-quote-outer", + "A single quoted string, including the quotation marks", + textobj, { .i = TEXT_OBJ_OUTER_SINGLE_QUOTE } + }, + [VIS_ACTION_TEXT_OBJECT_SINGLE_QUOTE_INNER] = { + "text-object-single-quote-inner", + "A single quoted string, excluding the quotation marks", + textobj, { .i = TEXT_OBJ_INNER_SINGLE_QUOTE } + }, + [VIS_ACTION_TEXT_OBJECT_BACKTICK_OUTER] = { + "text-object-backtick-outer", + "A backtick deliminated string (outer variant)", + textobj, { .i = TEXT_OBJ_OUTER_BACKTICK } + }, + [VIS_ACTION_TEXT_OBJECT_BACKTICK_INNER] = { + "text-object-backtick-inner", + "A backtick deliminated string (inner variant)", + textobj, { .i = TEXT_OBJ_INNER_BACKTICK } + }, + [VIS_ACTION_TEXT_OBJECT_ENTIRE_OUTER] = { + "text-object-entire-outer", + "The whole text content", + textobj, { .i = TEXT_OBJ_OUTER_ENTIRE } + }, + [VIS_ACTION_TEXT_OBJECT_ENTIRE_INNER] = { + "text-object-entire-inner", + "The whole text content, expect for leading and trailing empty lines", + textobj, { .i = TEXT_OBJ_INNER_ENTIRE } + }, + [VIS_ACTION_TEXT_OBJECT_FUNCTION_OUTER] = { + "text-object-function-outer", + "A whole C-like function", + textobj, { .i = TEXT_OBJ_OUTER_FUNCTION } + }, + [VIS_ACTION_TEXT_OBJECT_FUNCTION_INNER] = { + "text-object-function-inner", + "A whole C-like function body", + textobj, { .i = TEXT_OBJ_INNER_FUNCTION } + }, + [VIS_ACTION_TEXT_OBJECT_LINE_OUTER] = { + "text-object-line-outer", + "The whole line", + textobj, { .i = TEXT_OBJ_OUTER_LINE } + }, + [VIS_ACTION_TEXT_OBJECT_LINE_INNER] = { + "text-object-line-inner", + "The whole line, excluding leading and trailing whitespace", + textobj, { .i = TEXT_OBJ_INNER_LINE } + }, + [VIS_ACTION_MOTION_CHARWISE] = { + "motion-charwise", + "Force motion to be charwise", + motiontype, { .i = CHARWISE } + }, + [VIS_ACTION_MOTION_LINEWISE] = { + "motion-linewise", + "Force motion to be linewise", + motiontype, { .i = LINEWISE } + }, +}; + static KeyBinding basic_movement[] = { - { "" , suspend, { NULL } }, - { "" , movement, { .i = MOVE_CHAR_PREV } }, - { "" , movement, { .i = MOVE_LONGWORD_START_PREV } }, - { "" , movement, { .i = MOVE_CHAR_NEXT } }, - { "" , movement, { .i = MOVE_LONGWORD_START_NEXT } }, - { "" , movement, { .i = MOVE_LINE_UP } }, - { "" , movement, { .i = MOVE_LINE_DOWN } }, - { "" , wscroll, { .i = -PAGE } }, - { "" , wscroll, { .i = +PAGE } }, - { "" , movement, { .i = MOVE_LINE_START } }, - { "" , movement, { .i = MOVE_LINE_FINISH } }, - { /* empty last element, array terminator */ }, + { "", ACTION(EDITOR_SUSPEND) }, + { "", ACTION(CURSOR_CHAR_PREV) }, + { "", ACTION(CURSOR_LONGWORD_START_PREV) }, + { "", ACTION(CURSOR_CHAR_NEXT) }, + { "", ACTION(CURSOR_LONGWORD_START_NEXT) }, + { "", ACTION(CURSOR_LINE_UP) }, + { "", ACTION(CURSOR_LINE_DOWN) }, + { "", ACTION(WINDOW_PAGE_UP) }, + { "", ACTION(WINDOW_PAGE_DOWN) }, + { "", ACTION(WINDOW_HALFPAGE_UP) }, + { "", ACTION(WINDOW_HALFPAGE_DOWN) }, + { "", ACTION(CURSOR_LINE_BEGIN) }, + { "", ACTION(CURSOR_LINE_END) }, + { /* empty last element, array terminator */ }, }; static KeyBinding vis_movements[] = { - { "" , movement, { .i = MOVE_CHAR_PREV } }, - { "h" , movement, { .i = MOVE_CHAR_PREV } }, - { " " , movement, { .i = MOVE_CHAR_NEXT } }, - { "l" , movement, { .i = MOVE_CHAR_NEXT } }, - { "k" , movement, { .i = MOVE_LINE_UP } }, - { "C-p" , movement, { .i = MOVE_LINE_UP } }, - { "gk" , movement, { .i = MOVE_SCREEN_LINE_UP } }, - { "g" , movement, { .i = MOVE_SCREEN_LINE_UP } }, - { "j" , movement, { .i = MOVE_LINE_DOWN } }, - { "" , movement, { .i = MOVE_LINE_DOWN } }, - { "" , movement, { .i = MOVE_LINE_DOWN } }, - { "" , movement, { .i = MOVE_LINE_DOWN } }, - { "gj" , movement, { .i = MOVE_SCREEN_LINE_DOWN } }, - { "g" , movement, { .i = MOVE_SCREEN_LINE_DOWN } }, - { "^" , movement, { .i = MOVE_LINE_START } }, - { "g_" , movement, { .i = MOVE_LINE_FINISH } }, - { "$" , movement, { .i = MOVE_LINE_LASTCHAR } }, - { "%" , movement, { .i = MOVE_BRACKET_MATCH } }, - { "b" , movement, { .i = MOVE_WORD_START_PREV } }, - { "B" , movement, { .i = MOVE_LONGWORD_START_PREV } }, - { "w" , movement, { .i = MOVE_WORD_START_NEXT } }, - { "W" , movement, { .i = MOVE_LONGWORD_START_NEXT } }, - { "ge" , movement, { .i = MOVE_WORD_END_PREV } }, - { "gE" , movement, { .i = MOVE_LONGWORD_END_PREV } }, - { "e" , movement, { .i = MOVE_WORD_END_NEXT } }, - { "E" , movement, { .i = MOVE_LONGWORD_END_NEXT } }, - { "{" , movement, { .i = MOVE_PARAGRAPH_PREV } }, - { "}" , movement, { .i = MOVE_PARAGRAPH_NEXT } }, - { "(" , movement, { .i = MOVE_SENTENCE_PREV } }, - { ")" , movement, { .i = MOVE_SENTENCE_NEXT } }, - { "[[" , movement, { .i = MOVE_FUNCTION_START_PREV } }, - { "[]" , movement, { .i = MOVE_FUNCTION_END_PREV } }, - { "][" , movement, { .i = MOVE_FUNCTION_START_NEXT } }, - { "]]" , movement, { .i = MOVE_FUNCTION_END_NEXT } }, - { "gg" , gotoline, { .i = -1 } }, - { "g0" , movement, { .i = MOVE_SCREEN_LINE_BEGIN } }, - { "gm" , movement, { .i = MOVE_SCREEN_LINE_MIDDLE } }, - { "g$" , movement, { .i = MOVE_SCREEN_LINE_END } }, - { "G" , gotoline, { .i = +1 } }, - { "|" , movement, { .i = MOVE_COLUMN } }, - { "n" , movement, { .i = MOVE_SEARCH_FORWARD } }, - { "N" , movement, { .i = MOVE_SEARCH_BACKWARD } }, - { "H" , movement, { .i = MOVE_WINDOW_LINE_TOP } }, - { "M" , movement, { .i = MOVE_WINDOW_LINE_MIDDLE } }, - { "L" , movement, { .i = MOVE_WINDOW_LINE_BOTTOM } }, - { "*" , movement, { .i = MOVE_SEARCH_WORD_FORWARD } }, - { "#" , movement, { .i = MOVE_SEARCH_WORD_BACKWARD} }, - { "f" , movement_key, { .i = MOVE_RIGHT_TO } }, - { "F" , movement_key, { .i = MOVE_LEFT_TO } }, - { "t" , movement_key, { .i = MOVE_RIGHT_TILL } }, - { "T" , movement_key, { .i = MOVE_LEFT_TILL } }, - { ";" , totill_repeat, { NULL } }, - { "," , totill_reverse,{ NULL } }, - { "/" , prompt_search,{ .s = "/" } }, - { "?" , prompt_search,{ .s = "?" } }, - { "`" , mark, { NULL } }, - { "'" , mark_line, { NULL } }, - { /* empty last element, array terminator */ }, + { "h", ACTION(CURSOR_CHAR_PREV) }, + { "", ALIAS("h") }, + { "l", ACTION(CURSOR_CHAR_NEXT) }, + { "", ALIAS("l") }, + { "k", ACTION(CURSOR_LINE_UP) }, + { "C-p", ALIAS("k") }, + { "j", ACTION(CURSOR_LINE_DOWN) }, + { "", ALIAS("j") }, + { "", ALIAS("j") }, + { "", ALIAS("j") }, + { "gk", ACTION(CURSOR_SCREEN_LINE_UP) }, + { "g", ALIAS("gk") }, + { "gj", ACTION(CURSOR_SCREEN_LINE_DOWN) }, + { "g", ALIAS("gj") }, + { "^", ACTION(CURSOR_LINE_START) }, + { "g_", ACTION(CURSOR_LINE_FINISH) }, + { "$", ACTION(CURSOR_LINE_END) }, + { "%", ACTION(CURSOR_BRACKET_MATCH) }, + { "b", ACTION(CURSOR_WORD_START_PREV) }, + { "B", ACTION(CURSOR_LONGWORD_START_PREV) }, + { "w", ACTION(CURSOR_WORD_START_NEXT) }, + { "W", ACTION(CURSOR_LONGWORD_START_NEXT) }, + { "ge", ACTION(CURSOR_WORD_END_PREV) }, + { "gE", ACTION(CURSOR_LONGWORD_END_PREV) }, + { "e", ACTION(CURSOR_WORD_END_NEXT) }, + { "E", ACTION(CURSOR_LONGWORD_END_NEXT) }, + { "{", ACTION(CURSOR_PARAGRAPH_PREV) }, + { "}", ACTION(CURSOR_PARAGRAPH_NEXT) }, + { "(", ACTION(CURSOR_SENTENCE_PREV) }, + { ")", ACTION(CURSOR_SENTENCE_NEXT) }, + { "[[", ACTION(CURSOR_FUNCTION_START_PREV) }, + { "[]", ACTION(CURSOR_FUNCTION_END_PREV) }, + { "][", ACTION(CURSOR_FUNCTION_START_NEXT) }, + { "]]", ACTION(CURSOR_FUNCTION_END_NEXT) }, + { "gg", ACTION(CURSOR_LINE_FIRST) }, + { "g0", ACTION(CURSOR_SCREEN_LINE_BEGIN) }, + { "gm", ACTION(CURSOR_SCREEN_LINE_MIDDLE) }, + { "g$", ACTION(CURSOR_SCREEN_LINE_END) }, + { "G", ACTION(CURSOR_LINE_LAST) }, + { "|", ACTION(CURSOR_COLUMN) }, + { "n", ACTION(CURSOR_SEARCH_FORWARD) }, + { "N", ACTION(CURSOR_SEARCH_BACKWARD) }, + { "H", ACTION(CURSOR_WINDOW_LINE_TOP) }, + { "M", ACTION(CURSOR_WINDOW_LINE_MIDDLE) }, + { "L", ACTION(CURSOR_WINDOW_LINE_BOTTOM) }, + { "*", ACTION(CURSOR_SEARCH_WORD_FORWARD) }, + { "#", ACTION(CURSOR_SEARCH_WORD_BACKWARD) }, + { "f", ACTION(TO_RIGHT) }, + { "F", ACTION(TO_LEFT) }, + { "t", ACTION(TILL_RIGHT) }, + { "T", ACTION(TILL_LEFT) }, + { ";", ACTION(TOTILL_REPEAT) }, + { ",", ACTION(TOTILL_REVERSE) }, + { "/", ACTION(SEARCH_FORWARD) }, + { "?", ACTION(SEARCH_BACKWARD) }, + { "`", ACTION(MARK_GOTO) }, + { "'", ACTION(MARK_GOTO_LINE) }, + { /* empty last element, array terminator */ }, }; static KeyBinding vis_textobjs[] = { - { "aw", textobj, { .i = TEXT_OBJ_OUTER_WORD } }, - { "aW", textobj, { .i = TEXT_OBJ_OUTER_LONGWORD } }, - { "as", textobj, { .i = TEXT_OBJ_SENTENCE } }, - { "ap", textobj, { .i = TEXT_OBJ_PARAGRAPH } }, - { "a[", textobj, { .i = TEXT_OBJ_OUTER_SQUARE_BRACKET } }, - { "a]", textobj, { .i = TEXT_OBJ_OUTER_SQUARE_BRACKET } }, - { "a(", textobj, { .i = TEXT_OBJ_OUTER_PARANTHESE } }, - { "a)", textobj, { .i = TEXT_OBJ_OUTER_PARANTHESE } }, - { "ab", textobj, { .i = TEXT_OBJ_OUTER_PARANTHESE } }, - { "a<", textobj, { .i = TEXT_OBJ_OUTER_ANGLE_BRACKET } }, - { "a>", textobj, { .i = TEXT_OBJ_OUTER_ANGLE_BRACKET } }, - { "a{", textobj, { .i = TEXT_OBJ_OUTER_CURLY_BRACKET } }, - { "a}", textobj, { .i = TEXT_OBJ_OUTER_CURLY_BRACKET } }, - { "aB", textobj, { .i = TEXT_OBJ_OUTER_CURLY_BRACKET } }, - { "a\"", textobj, { .i = TEXT_OBJ_OUTER_QUOTE } }, - { "a\'", textobj, { .i = TEXT_OBJ_OUTER_SINGLE_QUOTE } }, - { "a`", textobj, { .i = TEXT_OBJ_OUTER_BACKTICK } }, - { "ae", textobj, { .i = TEXT_OBJ_OUTER_ENTIRE } }, - { "af", textobj, { .i = TEXT_OBJ_OUTER_FUNCTION } }, - { "al", textobj, { .i = TEXT_OBJ_OUTER_LINE } }, - { "iw", textobj, { .i = TEXT_OBJ_INNER_WORD } }, - { "iW", textobj, { .i = TEXT_OBJ_INNER_LONGWORD } }, - { "is", textobj, { .i = TEXT_OBJ_SENTENCE } }, - { "ip", textobj, { .i = TEXT_OBJ_PARAGRAPH } }, - { "i[", textobj, { .i = TEXT_OBJ_INNER_SQUARE_BRACKET } }, - { "i]", textobj, { .i = TEXT_OBJ_INNER_SQUARE_BRACKET } }, - { "i(", textobj, { .i = TEXT_OBJ_INNER_PARANTHESE } }, - { "i)", textobj, { .i = TEXT_OBJ_INNER_PARANTHESE } }, - { "ib", textobj, { .i = TEXT_OBJ_INNER_PARANTHESE } }, - { "i<", textobj, { .i = TEXT_OBJ_INNER_ANGLE_BRACKET } }, - { "i>", textobj, { .i = TEXT_OBJ_INNER_ANGLE_BRACKET } }, - { "i{", textobj, { .i = TEXT_OBJ_INNER_CURLY_BRACKET } }, - { "i}", textobj, { .i = TEXT_OBJ_INNER_CURLY_BRACKET } }, - { "iB", textobj, { .i = TEXT_OBJ_INNER_CURLY_BRACKET } }, - { "i\"", textobj, { .i = TEXT_OBJ_INNER_QUOTE } }, - { "i\'", textobj, { .i = TEXT_OBJ_INNER_SINGLE_QUOTE } }, - { "i`", textobj, { .i = TEXT_OBJ_INNER_BACKTICK } }, - { "ie", textobj, { .i = TEXT_OBJ_INNER_ENTIRE } }, - { "if", textobj, { .i = TEXT_OBJ_INNER_FUNCTION } }, - { "il", textobj, { .i = TEXT_OBJ_INNER_LINE } }, + { "aw", ACTION(TEXT_OBJECT_WORD_OUTER) }, + { "aW", ACTION(TEXT_OBJECT_LONGWORD_OUTER) }, + { "as", ACTION(TEXT_OBJECT_SENTENCE) }, + { "ap", ACTION(TEXT_OBJECT_PARAGRAPH) }, + { "a[", ACTION(TEXT_OBJECT_SQUARE_BRACKET_OUTER) }, + { "a]", ALIAS("a[") }, + { "a(", ACTION(TEXT_OBJECT_PARANTHESE_OUTER) }, + { "a)", ALIAS("a(") }, + { "ab", ALIAS("a(") }, + { "a<", ACTION(TEXT_OBJECT_ANGLE_BRACKET_OUTER) }, + { "a>", ALIAS("a<") }, + { "a{", ACTION(TEXT_OBJECT_CURLY_BRACKET_OUTER) }, + { "a}", ALIAS("a{") }, + { "aB", ALIAS("a{") }, + { "a\"", ACTION(TEXT_OBJECT_QUOTE_OUTER) }, + { "a\'", ACTION(TEXT_OBJECT_SINGLE_QUOTE_OUTER) }, + { "a`", ACTION(TEXT_OBJECT_BACKTICK_OUTER) }, + { "ae", ACTION(TEXT_OBJECT_ENTIRE_OUTER) }, + { "af", ACTION(TEXT_OBJECT_FUNCTION_OUTER) }, + { "al", ACTION(TEXT_OBJECT_LINE_OUTER) }, + { "iw", ACTION(TEXT_OBJECT_WORD_INNER) }, + { "iW", ACTION(TEXT_OBJECT_LONGWORD_INNER) }, + { "is", ACTION(TEXT_OBJECT_SENTENCE) }, + { "ip", ACTION(TEXT_OBJECT_PARAGRAPH) }, + { "i[", ACTION(TEXT_OBJECT_SQUARE_BRACKET_INNER) }, + { "i]", ALIAS("i[") }, + { "i(", ACTION(TEXT_OBJECT_PARANTHESE_INNER) }, + { "i)", ALIAS("i(") }, + { "ib", ALIAS("ib") }, + { "i<", ACTION(TEXT_OBJECT_ANGLE_BRACKET_INNER) }, + { "i>", ALIAS("i<") }, + { "i{", ACTION(TEXT_OBJECT_CURLY_BRACKET_INNER) }, + { "i}", ALIAS("i{") }, + { "iB", ALIAS("i{") }, + { "i\"", ACTION(TEXT_OBJECT_QUOTE_INNER) }, + { "i\'", ACTION(TEXT_OBJECT_SINGLE_QUOTE_INNER) }, + { "i`", ACTION(TEXT_OBJECT_BACKTICK_INNER) }, + { "ie", ACTION(TEXT_OBJECT_ENTIRE_INNER) }, + { "if", ACTION(TEXT_OBJECT_FUNCTION_INNER) }, + { "il", ACTION(TEXT_OBJECT_LINE_INNER) }, { /* empty last element, array terminator */ }, }; static KeyBinding vis_operators[] = { - { "0" , zero, { NULL } }, - { "1" , count, { .i = 1 } }, - { "2" , count, { .i = 2 } }, - { "3" , count, { .i = 3 } }, - { "4" , count, { .i = 4 } }, - { "5" , count, { .i = 5 } }, - { "6" , count, { .i = 6 } }, - { "7" , count, { .i = 7 } }, - { "8" , count, { .i = 8 } }, - { "9" , count, { .i = 9 } }, - { "d" , operator, { .i = OP_DELETE } }, - { "c" , operator, { .i = OP_CHANGE } }, - { "y" , operator, { .i = OP_YANK } }, - { "p" , put, { .i = PUT_AFTER } }, - { "P" , put, { .i = PUT_BEFORE } }, - { "gp" , put, { .i = PUT_AFTER_END } }, - { "gP" , put, { .i = PUT_BEFORE_END } }, - { ">" , operator, { .i = OP_SHIFT_RIGHT } }, - { "<" , operator, { .i = OP_SHIFT_LEFT } }, - { "gU" , changecase, { .i = +1 } }, - { "~" , changecase, { .i = 0 } }, - { "g~" , changecase, { .i = 0 } }, - { "gu" , changecase, { .i = -1 } }, - { "\"" , reg, { NULL } }, - { /* empty last element, array terminator */ }, + { "0", ACTION(COUNT) }, + { "1", ACTION(COUNT) }, + { "2", ACTION(COUNT) }, + { "3", ACTION(COUNT) }, + { "4", ACTION(COUNT) }, + { "5", ACTION(COUNT) }, + { "6", ACTION(COUNT) }, + { "7", ACTION(COUNT) }, + { "8", ACTION(COUNT) }, + { "9", ACTION(COUNT) }, + { "d", ACTION(OPERATOR_DELETE) }, + { "c", ACTION(OPERATOR_CHANGE) }, + { "y", ACTION(OPERATOR_YANK) }, + { "p", ACTION(PUT_AFTER) }, + { "P", ACTION(PUT_BEFORE) }, + { "gp", ACTION(PUT_AFTER_END) }, + { "gP", ACTION(PUT_BEFORE_END) }, + { ">", ACTION(OPERATOR_SHIFT_RIGHT) }, + { "<", ACTION(OPERATOR_SHIFT_LEFT) }, + { "gU", ACTION(OPERATOR_CASE_UPPER) }, + { "~", ACTION(OPERATOR_CASE_SWAP) }, + { "g~", ACTION(OPERATOR_CASE_SWAP) }, + { "gu", ACTION(OPERATOR_CASE_LOWER) }, + { "\"", ACTION(REGISTER) }, + { /* empty last element, array terminator */ }, }; static void vis_mode_operator_enter(Mode *old) { @@ -228,102 +1151,98 @@ static void vis_mode_operator_input(const char *str, size_t len) { } static KeyBinding vis_operator_options[] = { - { "v" , motiontype, { .i = CHARWISE } }, - { "V" , motiontype, { .i = LINEWISE } }, - { /* empty last element, array terminator */ }, + { "v", ACTION(MOTION_CHARWISE) }, + { "V", ACTION(MOTION_LINEWISE) }, + { /* empty last element, array terminator */ }, }; static KeyBinding vis_mode_normal[] = { - { "", cursors_clear, { } }, - { "", cursors_new, { .i = -1 } }, - { "", cursors_new, { .i = +1 } }, - { "", cursors_align, { } }, - { "", cursors_select, { } }, - { "", cursors_remove, { } }, - { "n", cmd, { .s = "open" } }, - { "c", cmd, { .s = "q" } }, - { "s", cmd, { .s = "split" } }, - { "v", cmd, { .s = "vsplit" } }, - { "j", call, { .f = editor_window_next } }, - { "l", call, { .f = editor_window_next } }, - { "k", call, { .f = editor_window_prev } }, - { "h", call, { .f = editor_window_prev } }, - { "", call, { .f = editor_window_next } }, - { "", call, { .f = editor_window_next } }, - { "", call, { .f = editor_window_prev } }, - { "", call, { .f = editor_window_next } }, - { "", call, { .f = editor_window_prev } }, - { "", call, { .f = editor_window_prev } }, - { "", wscroll, { .i = -PAGE } }, - { "", wscroll, { .i = +PAGE } }, - { "", wscroll, { .i = -PAGE_HALF } }, - { "", wscroll, { .i = +PAGE_HALF } }, - { "", wslide, { .i = -1 } }, - { "", wslide, { .i = +1 } }, - { "", jumplist, { .i = -1 } }, - { "", jumplist, { .i = +1 } }, - { "g;", changelist, { .i = -1 } }, - { "g,", changelist, { .i = +1 } }, - { "a", insertmode, { .i = MOVE_CHAR_NEXT } }, - { "A", insertmode, { .i = MOVE_LINE_END } }, - { "C", change, { .i = MOVE_LINE_END } }, - { "D", delete, { .i = MOVE_LINE_END } }, - { "I", insertmode, { .i = MOVE_LINE_START } }, - { ".", repeat, { NULL } }, - { "o", openline, { .i = MOVE_LINE_NEXT } }, - { "O", openline, { .i = MOVE_LINE_PREV } }, - { "J", join, { .i = MOVE_LINE_NEXT } }, - { "x", delete, { .i = MOVE_CHAR_NEXT } }, - { "r", replace, { NULL } }, - { "i", switchmode, { .i = VIS_MODE_INSERT } }, - { "v", switchmode, { .i = VIS_MODE_VISUAL } }, - { "V", switchmode, { .i = VIS_MODE_VISUAL_LINE } }, - { "R", switchmode, { .i = VIS_MODE_REPLACE } }, - { "S", operator_twice, { .i = OP_CHANGE } }, - { "s", change, { .i = MOVE_CHAR_NEXT } }, - { "Y", operator_twice, { .i = OP_YANK } }, - { "X", delete, { .i = MOVE_CHAR_PREV } }, - { "u", undo, { NULL } }, - { "", redo, { NULL } }, - { "g+", later, { NULL } }, - { "g-", earlier, { NULL } }, - { "", call, { .f = editor_draw } }, - { ":", prompt_cmd, { .s = "" } }, - { "ZZ", cmd, { .s = "wq" } }, - { "ZQ", cmd, { .s = "q!" } }, - { "zt", window, { .w = view_redraw_top } }, - { "zz", window, { .w = view_redraw_center } }, - { "zb", window, { .w = view_redraw_bottom } }, - { "q", macro_record, { NULL } }, - { "@", macro_replay, { NULL } }, - { "gv", selection_restore, { NULL } }, - { "m", mark_set, { NULL } }, + { "", ACTION(CURSORS_REMOVE_ALL) }, + { "", ACTION(CURSORS_NEW_LINE_ABOVE) }, + { "", ACTION(CURSORS_NEW_LINE_BELOW) }, + { "", ACTION(CURSORS_ALIGN) }, + { "", ACTION(CURSOR_SELECT_WORD) }, + { "", ACTION(CURSORS_REMOVE_LAST) }, + { "n", ALIAS(":open") }, + { "c", ALIAS(":q") }, + { "s", ALIAS(":split") }, + { "v", ALIAS(":vsplit") }, + { "j", ACTION(WINDOW_NEXT) }, + { "l", ALIAS("j") }, + { "", ALIAS("j") }, + { "", ALIAS("j") }, + { "", ALIAS("j") }, + { "k", ACTION(WINDOW_PREV) }, + { "h", ALIAS("k") }, + { "", ALIAS("k") }, + { "", ALIAS("k") }, + { "", ALIAS("k") }, + { "", ALIAS("") }, + { "", ALIAS("") }, + { "", ALIAS("") }, + { "", ALIAS("") }, + { "", ACTION(WINDOW_SLIDE_UP) }, + { "", ACTION(WINDOW_SLIDE_DOWN) }, + { "", ACTION(JUMPLIST_PREV) }, + { "", ACTION(JUMPLIST_NEXT) }, + { "g;", ACTION(CHANGELIST_PREV) }, + { "g,", ACTION(CHANGELIST_NEXT) }, + { "a", ALIAS("li") }, + { "A", ALIAS("$a") }, + { "C", ALIAS("c$") }, + { "D", ALIAS("d$") }, + { "I", ALIAS("^i") }, + { ".", ACTION(REPEAT) }, + { "o", ACTION(OPEN_LINE_BELOW) }, + { "O", ACTION(OPEN_LINE_ABOVE) }, + { "J", ACTION(JOIN_LINE_BELOW) }, + { "x", ACTION(DELETE_CHAR_NEXT) }, + { "r", ACTION(REPLACE_CHAR) }, + { "i", ACTION(MODE_INSERT) }, + { "v", ACTION(MODE_VISUAL) }, + { "V", ACTION(MODE_VISUAL_LINE) }, + { "R", ACTION(MODE_REPLACE) }, + { "S", ALIAS("cc") }, + { "s", ALIAS("cl") }, + { "Y", ALIAS("yy") }, + { "X", ALIAS("dh") }, + { "u", ACTION(UNDO) }, + { "", ACTION(REDO) }, + { "g+", ACTION(LATER) }, + { "g-", ACTION(EARLIER) }, + { "", ACTION(REDRAW) }, + { ":", ACTION(PROMPT_SHOW) }, + { "ZZ", ALIAS(":wq") }, + { "ZQ", ALIAS(":q!") }, + { "zt", ACTION(WINDOW_REDRAW_TOP) }, + { "zz", ACTION(WINDOW_REDRAW_CENTER) }, + { "zb", ACTION(WINDOW_REDRAW_BOTTOM) }, + { "q", ACTION(MACRO_RECORD) }, + { "@", ACTION(MACRO_REPLAY) }, + { "gv", ACTION(SELECTION_RESTORE) }, + { "m", ACTION(MARK_SET) }, { /* empty last element, array terminator */ }, }; static KeyBinding vis_mode_visual[] = { - { "", cursors_select_next, { } }, - { "", cursors_select_skip, { } }, - { "", cursors_remove, { } }, - { "I", cursors_split, { .i = -1 } }, - { "A", cursors_split, { .i = +1 } }, - { "", operator, { .i = OP_DELETE } }, - { "", operator, { .i = OP_DELETE } }, - { "", switchmode, { .i = VIS_MODE_NORMAL } }, - { "", switchmode, { .i = VIS_MODE_NORMAL } }, - { "v", switchmode, { .i = VIS_MODE_NORMAL } }, - { "V", switchmode, { .i = VIS_MODE_VISUAL_LINE } }, - { ":", prompt_cmd, { .s = "'<,'>" } }, - { "", operator, { .i = OP_DELETE } }, - { "d", operator, { .i = OP_DELETE } }, - { "x", operator, { .i = OP_DELETE } }, - { "y", operator, { .i = OP_YANK } }, - { "c", operator, { .i = OP_CHANGE } }, - { "r", operator, { .i = OP_CHANGE } }, - { "s", operator, { .i = OP_CHANGE } }, - { "J", operator, { .i = OP_JOIN } }, - { "o", selection_end, { NULL } }, - { /* empty last element, array terminator */ }, + { "", ACTION(CURSORS_NEW_MATCH_NEXT) }, + { "", ACTION(CURSORS_NEW_MATCH_SKIP) }, + { "", ACTION(CURSORS_REMOVE_LAST) }, + { "I", ACTION(CURSORS_NEW_LINES_BEGIN) }, + { "A", ACTION(CURSORS_NEW_LINES_END) }, + { "", ALIAS("d") }, + { "", ALIAS("d") }, + { "", ACTION(MODE_NORMAL) }, + { "", ALIAS("") }, + { "v", ALIAS("") }, + { "V", ACTION(MODE_VISUAL_LINE) }, + { ":", ACTION(PROMPT_SHOW_VISUAL) }, + { "x", ALIAS("d") }, + { "r", ALIAS("c") }, + { "s", ALIAS("c") }, + { "J", ACTION(JOIN_LINES) }, + { "o", ACTION(SELECTION_FLIP) }, + { /* empty last element, array terminator */ }, }; static void vis_mode_visual_enter(Mode *old) { @@ -342,8 +1261,8 @@ static void vis_mode_visual_leave(Mode *new) { } static KeyBinding vis_mode_visual_line[] = { - { "v", switchmode, { .i = VIS_MODE_VISUAL } }, - { "V", switchmode, { .i = VIS_MODE_NORMAL } }, + { "v", ACTION(MODE_VISUAL) }, + { "V", ACTION(MODE_NORMAL) }, { /* empty last element, array terminator */ }, }; @@ -366,26 +1285,20 @@ static void vis_mode_visual_line_leave(Mode *new) { } static KeyBinding vis_mode_readline[] = { - { "", delete, { .i = MOVE_CHAR_PREV } }, - { "", switchmode, { .i = VIS_MODE_NORMAL } }, - { "", switchmode, { .i = VIS_MODE_NORMAL } }, - { "", delete , { .i = MOVE_CHAR_NEXT } }, - { "", delete, { .i = MOVE_LONGWORD_START_PREV } }, - { "", delete, { .i = MOVE_LINE_BEGIN } }, - { /* empty last element, array terminator */ }, + { "", ACTION(DELETE_CHAR_PREV) }, + { "", ACTION(MODE_NORMAL) }, + { "", ALIAS("") }, + { "", ACTION(DELETE_CHAR_NEXT) }, + { "", ACTION(DELETE_WORD_PREV) }, + { "", ACTION(DELETE_LINE_BEGIN) }, + { /* empty last element, array terminator */ }, }; static KeyBinding vis_mode_prompt[] = { - { "", prompt_backspace,{ .s = NULL } }, - { "", prompt_enter, { NULL } }, - { "", prompt_enter, { NULL } }, - { "", prompt_up, { NULL } }, - { "", prompt_down, { NULL } }, - { "", movement, { .i = MOVE_FILE_BEGIN } }, - { "", movement, { .i = MOVE_FILE_BEGIN } }, - { "", movement, { .i = MOVE_FILE_END } }, - { "", movement, { .i = MOVE_FILE_END } }, - { "", NULL, { NULL } }, + { "", ACTION(PROMPT_BACKSPACE) }, + { "", ACTION(PROMPT_ENTER) }, + { "", ALIAS("") }, + { "", }, { /* empty last element, array terminator */ }, }; @@ -404,22 +1317,20 @@ static void vis_mode_prompt_leave(Mode *new) { } static KeyBinding vis_mode_insert[] = { - { "", switchmode, { .i = VIS_MODE_NORMAL } }, - { "", switchmode, { .i = VIS_MODE_NORMAL } }, - { "", switchmode, { .i = VIS_MODE_NORMAL } }, - { "", insert_tab, { NULL } }, - { "", insert_newline, { NULL } }, - { "", insert_newline, { NULL } }, - { "", insert_newline, { NULL } }, - { "", switchmode, { .i = VIS_MODE_OPERATOR } }, - { "", insert_verbatim, { NULL } }, - { "", operator_twice, { .i = OP_SHIFT_LEFT } }, - { "", operator_twice, { .i = OP_SHIFT_RIGHT } }, - { "", wslide, { .i = -1 } }, - { "", wslide, { .i = +1 } }, - { "", insert_tab, { NULL } }, - { "", movement, { .i = MOVE_LINE_END } }, - { "", insert_register, { NULL } }, + { "", ACTION(MODE_NORMAL) }, + { "", ALIAS("") }, + { "", ALIAS("") }, + { "", ACTION(INSERT_NEWLINE) }, + { "", ALIAS("") }, + { "", ALIAS("") }, + { "", ACTION(MODE_OPERATOR_PENDING) }, + { "", ACTION(INSERT_VERBATIM) }, + { "", ALIAS("<", ALIAS(">>i") }, + { "", ACTION(WINDOW_SLIDE_UP) }, + { "", ACTION(WINDOW_SLIDE_DOWN) }, + { "", ACTION(INSERT_TAB) }, + { "", ACTION(INSERT_REGISTER) }, { /* empty last element, array terminator */ }, }; @@ -445,7 +1356,6 @@ static void vis_mode_insert_input(const char *str, size_t len) { } static KeyBinding vis_mode_replace[] = { - { "", switchmode, { .i = VIS_MODE_NORMAL } }, { /* empty last element, array terminator */ }, }; @@ -512,7 +1422,7 @@ static Mode vis_modes[] = { .default_bindings = vis_movements, }, [VIS_MODE_TEXTOBJ] = { - .name = "TEXTOBJ", + .name = "TEXT-OBJECTS", .parent = &vis_modes[VIS_MODE_MOVE], .default_bindings = vis_textobjs, }, -- cgit v1.2.3