/* Configure your desired default key bindings. */ #define ALIAS(name) .alias = name, #define ACTION(id) .action = &vis_action[VIS_ACTION_##id], static const char *keymaps[] = { NULL }; static const KeyBinding bindings_basic[] = { { "", ACTION(EDITOR_SUSPEND) }, { "", ACTION(CURSOR_LINE_DOWN) }, { "", ACTION(CURSOR_LINE_END) }, { "", ACTION(CURSOR_LINE_BEGIN) }, { "", ACTION(CURSOR_CHAR_PREV) }, { "", ACTION(WINDOW_PAGE_DOWN) }, { "", ACTION(WINDOW_PAGE_UP) }, { "", ACTION(CURSOR_CHAR_NEXT) }, { "", ACTION(CURSOR_LONGWORD_START_PREV) }, { "", ACTION(WINDOW_HALFPAGE_DOWN) }, { "", ACTION(WINDOW_HALFPAGE_UP) }, { "", ACTION(CURSOR_LONGWORD_START_NEXT) }, { "", ACTION(CURSOR_LINE_UP) }, { 0 /* empty last element, array terminator */ }, }; static const KeyBinding bindings_motions[] = { { "g|", ACTION(CURSOR_COLUMN) }, { "[{", ACTION(CURSOR_BLOCK_START) }, { "]}", ACTION(CURSOR_BLOCK_END) }, { "[(", ACTION(CURSOR_PARENTHESIS_START) }, { "])", ACTION(CURSOR_PARENTHESIS_END) }, { "$", ACTION(CURSOR_LINE_END) }, { "^", ACTION(CURSOR_LINE_START) }, { "}", ACTION(CURSOR_PARAGRAPH_NEXT) }, { "{", ACTION(CURSOR_PARAGRAPH_PREV) }, { "%", ACTION(CURSOR_PERCENT) }, { "#", ACTION(CURSOR_SEARCH_WORD_BACKWARD) }, { "*", ACTION(CURSOR_SEARCH_WORD_FORWARD) }, { ")", ACTION(CURSOR_SENTENCE_NEXT) }, { "(", ACTION(CURSOR_SENTENCE_PREV) }, { "?", ACTION(PROMPT_SEARCH_BACKWARD) }, { "/", ACTION(PROMPT_SEARCH_FORWARD) }, { ";", ACTION(TOTILL_REPEAT) }, { ",", ACTION(TOTILL_REVERSE) }, { "+", ALIAS("j^") }, { "-", ALIAS("k^") }, { "B", ACTION(CURSOR_LONGWORD_START_PREV) }, { "b", ACTION(CURSOR_WORD_START_PREV) }, { "E", ACTION(CURSOR_LONGWORD_END_NEXT) }, { "e", ACTION(CURSOR_WORD_END_NEXT) }, { "F", ACTION(TO_LINE_LEFT) }, { "f", ACTION(TO_LINE_RIGHT) }, { "go", ACTION(CURSOR_BYTE) }, { "gH", ACTION(CURSOR_BYTE_LEFT) }, { "gL", ACTION(CURSOR_BYTE_RIGHT) }, { "gh", ACTION(CURSOR_CODEPOINT_PREV) }, { "gl", ACTION(CURSOR_CODEPOINT_NEXT) }, { "g0", ACTION(CURSOR_SCREEN_LINE_BEGIN) }, { "g_", ACTION(CURSOR_LINE_FINISH) }, { "G", ACTION(CURSOR_LINE_LAST) }, { "g$", ACTION(CURSOR_SCREEN_LINE_END) }, { "gE", ACTION(CURSOR_LONGWORD_END_PREV) }, { "ge", ACTION(CURSOR_WORD_END_PREV) }, { "gg", ACTION(CURSOR_LINE_FIRST) }, { "gj", ACTION(CURSOR_SCREEN_LINE_DOWN) }, { "gk", ACTION(CURSOR_SCREEN_LINE_UP) }, { "gm", ACTION(CURSOR_SCREEN_LINE_MIDDLE) }, { "h", ACTION(CURSOR_CHAR_PREV) }, { "H", ACTION(CURSOR_WINDOW_LINE_TOP) }, { "j", ACTION(CURSOR_LINE_DOWN) }, { "k", ACTION(CURSOR_LINE_UP) }, { "l", ACTION(CURSOR_CHAR_NEXT) }, { "L", ACTION(CURSOR_WINDOW_LINE_BOTTOM) }, { "M", ACTION(CURSOR_WINDOW_LINE_MIDDLE) }, { "n", ACTION(CURSOR_SEARCH_REPEAT_FORWARD) }, { "N", ACTION(CURSOR_SEARCH_REPEAT_BACKWARD) }, { "T", ACTION(TILL_LINE_LEFT) }, { "t", ACTION(TILL_LINE_RIGHT) }, { "W", ACTION(CURSOR_LONGWORD_START_NEXT) }, { "w", ACTION(CURSOR_WORD_START_NEXT) }, { 0 /* empty last element, array terminator */ }, }; static const KeyBinding bindings_textobjects[] = { { "a<", ACTION(TEXT_OBJECT_ANGLE_BRACKET_OUTER) }, { "a`", ACTION(TEXT_OBJECT_BACKTICK_OUTER) }, { "a{", ACTION(TEXT_OBJECT_CURLY_BRACKET_OUTER) }, { "a(", ACTION(TEXT_OBJECT_PARENTHESIS_OUTER) }, { "a\"", ACTION(TEXT_OBJECT_QUOTE_OUTER) }, { "a\'", ACTION(TEXT_OBJECT_SINGLE_QUOTE_OUTER) }, { "a[", ACTION(TEXT_OBJECT_SQUARE_BRACKET_OUTER) }, { "a>", ALIAS("a<") }, { "a)", ALIAS("a(") }, { "a]", ALIAS("a[") }, { "a}", ALIAS("a{") }, { "ab", ALIAS("a(") }, { "aB", ALIAS("a{") }, { "al", ACTION(TEXT_OBJECT_LINE_OUTER) }, { "ap", ACTION(TEXT_OBJECT_PARAGRAPH_OUTER) }, { "as", ACTION(TEXT_OBJECT_SENTENCE) }, { "a", ACTION(TEXT_OBJECT_INDENTATION) }, { "aW", ACTION(TEXT_OBJECT_LONGWORD_OUTER) }, { "aw", ACTION(TEXT_OBJECT_WORD_OUTER) }, { "gN", ACTION(TEXT_OBJECT_SEARCH_BACKWARD) }, { "gn", ACTION(TEXT_OBJECT_SEARCH_FORWARD) }, { "i<", ACTION(TEXT_OBJECT_ANGLE_BRACKET_INNER) }, { "i`", ACTION(TEXT_OBJECT_BACKTICK_INNER) }, { "i{", ACTION(TEXT_OBJECT_CURLY_BRACKET_INNER) }, { "i(", ACTION(TEXT_OBJECT_PARENTHESIS_INNER) }, { "i\"", ACTION(TEXT_OBJECT_QUOTE_INNER) }, { "i\'", ACTION(TEXT_OBJECT_SINGLE_QUOTE_INNER) }, { "i[", ACTION(TEXT_OBJECT_SQUARE_BRACKET_INNER) }, { "i>", ALIAS("i<") }, { "i)", ALIAS("i(") }, { "i]", ALIAS("i[") }, { "i}", ALIAS("i{") }, { "ib", ALIAS("i(") }, { "iB", ALIAS("i{") }, { "il", ACTION(TEXT_OBJECT_LINE_INNER) }, { "ip", ACTION(TEXT_OBJECT_PARAGRAPH) }, { "is", ACTION(TEXT_OBJECT_SENTENCE) }, { "i", ACTION(TEXT_OBJECT_INDENTATION) }, { "iW", ACTION(TEXT_OBJECT_LONGWORD_INNER) }, { "iw", ACTION(TEXT_OBJECT_WORD_INNER) }, { 0 /* empty last element, array terminator */ }, }; static const KeyBinding bindings_selections[] = { { "m", ACTION(SELECTIONS_SAVE) }, { "M", ACTION(SELECTIONS_RESTORE) }, { "|", ACTION(SELECTIONS_UNION) }, { "&", ACTION(SELECTIONS_INTERSECT) }, { "~", ACTION(SELECTIONS_COMPLEMENT) }, { "\\", ACTION(SELECTIONS_MINUS) }, { "_", ACTION(SELECTIONS_TRIM) }, { "", ACTION(SELECTIONS_ALIGN_INDENT_RIGHT) }, { "", ACTION(SELECTIONS_ALIGN_INDENT_LEFT) }, { "g<", ACTION(JUMPLIST_PREV) }, { "gs", ACTION(JUMPLIST_SAVE) }, { "g>", ACTION(JUMPLIST_NEXT) }, { 0 /* empty last element, array terminator */ }, }; static const KeyBinding bindings_operators[] = { { "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) }, { "=", ALIAS(":|fmt") }, { "<", ACTION(OPERATOR_SHIFT_LEFT) }, { ">", ACTION(OPERATOR_SHIFT_RIGHT) }, { "\"", ACTION(REGISTER) }, { "'", ACTION(MARK) }, { "c", ACTION(OPERATOR_CHANGE) }, { "d", ACTION(OPERATOR_DELETE) }, { "g~", ALIAS(":|tr '[:lower:][:upper:]' '[:upper:][:lower:]'") }, { "gu", ALIAS(":|tr '[:upper:]' '[:lower:]'")}, { "gU", ALIAS(":|tr '[:lower:]' '[:upper:]'")}, { "p", ACTION(PUT_AFTER) }, { "P", ACTION(PUT_BEFORE) }, { "y", ACTION(OPERATOR_YANK) }, { 0 /* empty last element, array terminator */ }, }; static const KeyBinding bindings_normal[] = { { "a", ACTION(APPEND_CHAR_NEXT) }, { "A", ACTION(APPEND_LINE_END) }, { "@", ACTION(MACRO_REPLAY) }, { ":", ACTION(PROMPT_SHOW) }, { ".", ACTION(REPEAT) }, { "C", ALIAS("c$") }, { "", ALIAS("") }, { "", ACTION(SELECTIONS_REMOVE_COLUMN) }, { "", ACTION(SELECTIONS_NEXT) }, { "", ACTION(WINDOW_SLIDE_UP) }, { "", ALIAS("") }, { "", ACTION(SELECTIONS_NEW_LINE_BELOW) }, { "", ACTION(SELECTIONS_NEW_LINE_ABOVE) }, { "", ACTION(SELECTIONS_REMOVE_COLUMN_EXCEPT) }, { "", ALIAS("viw") }, { "", ACTION(SELECTIONS_REMOVE_LAST) }, { "", ACTION(REDO) }, { "", ACTION(SELECTIONS_PREV) }, { "c", ALIAS(":q") }, { "h", ALIAS("k") }, { "j", ACTION(WINDOW_NEXT) }, { "k", ACTION(WINDOW_PREV) }, { "l", ALIAS("j") }, { "n", ALIAS(":open") }, { "s", ALIAS(":split") }, { "v", ALIAS(":vsplit") }, { "", ACTION(WINDOW_SLIDE_DOWN) }, { "D", ALIAS("d$") }, { "", ACTION(MODE_NORMAL_ESCAPE) }, { "", ALIAS(":help") }, { "ga", ACTION(UNICODE_INFO) }, { "g8", ACTION(UTF8_INFO) }, { "g-", ACTION(EARLIER) }, { "g+", ACTION(LATER) }, { "gn", ALIAS("vgn") }, { "gN", ALIAS("vgN") }, { "gv", ALIAS("v'^M") }, { "I", ACTION(INSERT_LINE_START) }, { "i", ACTION(MODE_INSERT) }, { "J", ACTION(JOIN_LINES) }, { "gJ", ACTION(JOIN_LINES_TRIM) }, { "", ACTION(SELECTIONS_NEW_LINE_BELOW_LAST) }, { "", ACTION(SELECTIONS_NEW_LINE_ABOVE_FIRST) }, { "O", ACTION(OPEN_LINE_ABOVE) }, { "o", ACTION(OPEN_LINE_BELOW) }, { "q", ACTION(MACRO_RECORD) }, { "R", ACTION(MODE_REPLACE) }, { "r", ACTION(REPLACE_CHAR) }, { "S", ALIAS("^c$") }, { "s", ALIAS("cl") }, { "", ACTION(SELECTIONS_ALIGN) }, { "u", ACTION(UNDO) }, { "v", ACTION(MODE_VISUAL) }, { "V", ACTION(MODE_VISUAL_LINE) }, { "x", ACTION(DELETE_CHAR_NEXT) }, { "X", ALIAS("dh") }, { "Y", ALIAS("y$") }, { "zb", ACTION(WINDOW_REDRAW_BOTTOM) }, { "ZQ", ALIAS(":q!") }, { "zt", ACTION(WINDOW_REDRAW_TOP) }, { "zz", ACTION(WINDOW_REDRAW_CENTER) }, { "ZZ", ALIAS(":wq") }, { 0 /* empty last element, array terminator */ }, }; static const KeyBinding bindings_visual[] = { { "A", ACTION(SELECTIONS_NEW_LINES_END) }, { "@", ACTION(MACRO_REPLAY) }, { ":", ACTION(PROMPT_SHOW) }, { "-", ACTION(SELECTIONS_ROTATE_LEFT) }, { "+", ACTION(SELECTIONS_ROTATE_RIGHT) }, { "<", ALIAS("gv") }, { ">", ALIAS("gv") }, { "", ACTION(SELECTIONS_NEW_MATCH_ALL) }, { "", ALIAS("") }, { "", ACTION(SELECTIONS_REMOVE_COLUMN) }, { "", ACTION(SELECTIONS_NEXT) }, { "", ALIAS("") }, { "", ALIAS("") }, { "", ALIAS("") }, { "", ACTION(SELECTIONS_REMOVE_COLUMN_EXCEPT) }, { "", ACTION(SELECTIONS_NEW_MATCH_NEXT) }, { "", ACTION(SELECTIONS_REMOVE_LAST) }, { "", ACTION(SELECTIONS_PREV) }, { "", ACTION(SELECTIONS_NEW_MATCH_SKIP) }, { "", ACTION(MODE_VISUAL_ESCAPE) }, { "I", ACTION(SELECTIONS_NEW_LINES_BEGIN) }, { "J", ACTION(JOIN_LINES) }, { "gJ", ACTION(JOIN_LINES_TRIM) }, { "o", ACTION(SELECTION_FLIP) }, { "q", ACTION(MACRO_RECORD) }, { "r", ACTION(REPLACE_CHAR) }, { "s", ALIAS("c") }, { "u", ALIAS("gu") }, { "U", ALIAS("gU") }, { "V", ACTION(MODE_VISUAL_LINE) }, { "v", ALIAS("") }, { "x", ALIAS("d") }, { 0 /* empty last element, array terminator */ }, }; static const KeyBinding bindings_visual_line[] = { { "v", ACTION(MODE_VISUAL) }, { "V", ACTION(MODE_NORMAL) }, { 0 /* empty last element, array terminator */ }, }; static const KeyBinding bindings_readline[] = { { "", ACTION(DELETE_CHAR_PREV) }, { "", ALIAS("") }, { "", ACTION(DELETE_CHAR_NEXT) }, { "", ALIAS("") }, { "", ACTION(DELETE_LINE_BEGIN) }, { "", ACTION(INSERT_VERBATIM) }, { "", ACTION(DELETE_WORD_PREV) }, { "", ACTION(CURSOR_LINE_END) }, { "", ACTION(CURSOR_LINE_START) }, { "", ACTION(DELETE_CHAR_NEXT) }, { "", ACTION(MODE_NORMAL) }, { 0 /* empty last element, array terminator */ }, }; static const KeyBinding bindings_insert[] = { { "", ALIAS("") }, { "", ALIAS("") }, { "", ALIAS("u000a") }, { "", ALIAS("") }, { "", ACTION(INSERT_REGISTER) }, { "", ALIAS("") }, { "", ACTION(WINDOW_SLIDE_UP) }, { "", ACTION(WINDOW_SLIDE_DOWN) }, { "", ACTION(INSERT_NEWLINE) }, { "", ACTION(MODE_NORMAL) }, { "", ACTION(SELECTIONS_ALIGN_INDENT_LEFT) }, { "", ACTION(INSERT_TAB) }, { 0 /* empty last element, array terminator */ }, }; static const KeyBinding bindings_replace[] = { { 0 /* empty last element, array terminator */ }, }; /* For each mode we list a all key bindings, if a key is bound in more than * one array the first definition is used and further ones are ignored. */ static const KeyBinding **default_bindings[] = { [VIS_MODE_OPERATOR_PENDING] = (const KeyBinding*[]){ bindings_operators, bindings_textobjects, bindings_motions, bindings_basic, NULL, }, [VIS_MODE_NORMAL] = (const KeyBinding*[]){ bindings_normal, bindings_selections, bindings_operators, bindings_motions, bindings_basic, NULL, }, [VIS_MODE_VISUAL] = (const KeyBinding*[]){ bindings_visual, bindings_selections, bindings_textobjects, bindings_operators, bindings_motions, bindings_basic, NULL, }, [VIS_MODE_VISUAL_LINE] = (const KeyBinding*[]){ bindings_visual_line, NULL, }, [VIS_MODE_INSERT] = (const KeyBinding*[]){ bindings_insert, bindings_readline, bindings_basic, NULL, }, [VIS_MODE_REPLACE] = (const KeyBinding*[]){ bindings_replace, NULL, }, };