Created
March 11, 2024 03:48
-
-
Save jiahut/bb0813d38a7f0415e84852b4623ea660 to your computer and use it in GitHub Desktop.
配置 helix 作为 vim 的最小实现
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[editor] | |
auto-info = false | |
[keys.normal] | |
# Quick iteration on config changes | |
# C-o = ":config-open" | |
# C-r = ":config-reload" | |
";" = "repeat_last_motion" | |
# "," = "repeat_last_motion_reverse" | |
# Some nice Helix stuff | |
# C-h = "select_prev_sibling" | |
C-l = "align_view_center" | |
# C-k = "expand_selection" | |
# C-l = "select_next_sibling" | |
C-a = "goto_line_start" | |
C-e = "goto_line_end" | |
0 = "goto_line_start" | |
"$" = "goto_line_end" | |
G = "goto_file_end" | |
"^" = "goto_first_nonwhitespace" | |
"%" = "match_brackets" | |
# Personal preference | |
o = ["open_below", "normal_mode"] | |
O = ["open_above", "normal_mode"] | |
# Muscle memory | |
"{" = ["goto_prev_paragraph", "collapse_selection"] | |
"}" = ["goto_next_paragraph", "collapse_selection"] | |
V = ["select_mode", "extend_to_line_bounds"] | |
C = ["extend_to_line_end", "yank_main_selection_to_clipboard", "delete_selection", "insert_mode"] | |
D = ["extend_to_line_end", "yank_main_selection_to_clipboard", "delete_selection"] | |
S = "surround_add" # Would be nice to be able to do something after this but it isn't chainable | |
# Clipboards over registers ye ye | |
x = "delete_selection" | |
p = ["paste_clipboard_after", "collapse_selection"] | |
P = ["paste_clipboard_before", "collapse_selection"] | |
# Would be nice to add ya and yi, but the surround commands can't be chained | |
Y = ["extend_to_line_end", "yank_main_selection_to_clipboard", "collapse_selection"] | |
# Uncanny valley stuff, this makes w and b behave as they do Vim | |
w = ["move_next_word_start", "move_char_right", "collapse_selection"] | |
W = ["move_next_long_word_start", "move_char_right", "collapse_selection"] | |
e = ["move_next_word_end", "collapse_selection"] | |
E = ["move_next_long_word_end", "collapse_selection"] | |
b = ["move_prev_word_start", "collapse_selection"] | |
B = ["move_prev_long_word_start", "collapse_selection"] | |
# If you want to keep the selection-while-moving behaviour of Helix, this two lines will help a lot, | |
# especially if you find having text remain selected while you have switched to insert or append mode | |
# | |
# There is no real difference if you have overridden the commands bound to 'w', 'e' and 'b' like above | |
# But if you really want to get familiar with the Helix way of selecting-while-moving, comment the | |
# bindings for 'w', 'e', and 'b' out and leave the bindings for 'i' and 'a' active below. A world of difference! | |
i = ["insert_mode", "collapse_selection"] | |
a = ["append_mode", "collapse_selection"] | |
# Undoing the 'd' + motion commands restores the selection which is annoying | |
u = ["undo", "collapse_selection"] | |
# Escape the madness! No more fighting with the cursor! Or with multiple cursors! | |
esc = ["collapse_selection", "keep_primary_selection"] | |
# Search for word under cursor | |
"*" = ["move_char_right", "move_prev_word_start", "move_next_word_end", "search_selection", "search_next"] | |
"#" = ["move_char_right", "move_prev_word_start", "move_next_word_end", "search_selection", "search_prev"] | |
# Make j and k behave as they do Vim when soft-wrap is enabled | |
j = "move_line_down" | |
k = "move_line_up" | |
[keys.normal.c] | |
i = {w= ["move_prev_word_start","select_mode", "move_next_word_end", "delete_selection", "insert_mode"]} | |
a = {w= ["move_prev_long_word_start","select_mode", "move_next_long_word_end", "delete_selection", "insert_mode"]} | |
[keys.normal.C-x] | |
C-s = ":write" | |
# Extend and select commands that expect a manual input can't be chained | |
# I've kept d[X] commands here because it's better to at least have the stuff you want to delete | |
# selected so that it's just a keystroke away to delete | |
[keys.normal.d] | |
d = ["extend_to_line_bounds", "yank_main_selection_to_clipboard", "delete_selection"] | |
t = ["extend_till_char"] | |
s = ["surround_delete"] | |
# i = ["select_textobject_inner"] | |
i = {w= ["move_prev_word_start","select_mode", "move_next_word_end", "delete_selection", "normal_mode"]} | |
a = {w= ["move_prev_long_word_start","select_mode", "move_next_long_word_end", "delete_selection", "normal_mode"]} | |
# a = ["select_textobject_around"] | |
j = ["select_mode", "extend_to_line_bounds", "extend_line_below", "yank_main_selection_to_clipboard", "delete_selection", "normal_mode"] | |
down = ["select_mode", "extend_to_line_bounds", "extend_line_below", "yank_main_selection_to_clipboard", "delete_selection", "normal_mode"] | |
k = ["select_mode", "extend_to_line_bounds", "extend_line_above", "yank_main_selection_to_clipboard", "delete_selection", "normal_mode"] | |
up = ["select_mode", "extend_to_line_bounds", "extend_line_above", "yank_main_selection_to_clipboard", "delete_selection", "normal_mode"] | |
G = ["select_mode", "extend_to_line_bounds", "goto_last_line", "extend_to_line_bounds", "yank_main_selection_to_clipboard", "delete_selection", "normal_mode"] | |
w = ["move_next_word_start", "yank_main_selection_to_clipboard", "delete_selection"] | |
W = ["move_next_long_word_start", "yank_main_selection_to_clipboard", "delete_selection"] | |
g = { g = ["select_mode", "extend_to_line_bounds", "goto_file_start", "extend_to_line_bounds", "yank_main_selection_to_clipboard", "delete_selection", "normal_mode"] } | |
[keys.normal.y] | |
y = ["extend_to_line_bounds", "yank_main_selection_to_clipboard", "normal_mode", "collapse_selection"] | |
j = ["select_mode", "extend_to_line_bounds", "extend_line_below", "yank_main_selection_to_clipboard", "collapse_selection", "normal_mode"] | |
down = ["select_mode", "extend_to_line_bounds", "extend_line_below", "yank_main_selection_to_clipboard", "collapse_selection", "normal_mode"] | |
k = ["select_mode", "extend_to_line_bounds", "extend_line_above", "yank_main_selection_to_clipboard", "collapse_selection", "normal_mode"] | |
up = ["select_mode", "extend_to_line_bounds", "extend_line_above", "yank_main_selection_to_clipboard", "collapse_selection", "normal_mode"] | |
G = ["select_mode", "extend_to_line_bounds", "goto_last_line", "extend_to_line_bounds", "yank_main_selection_to_clipboard", "collapse_selection", "normal_mode"] | |
w = ["move_next_word_start", "yank_main_selection_to_clipboard", "collapse_selection", "normal_mode"] | |
W = ["move_next_long_word_start", "yank_main_selection_to_clipboard", "collapse_selection", "normal_mode"] | |
g = { g = ["select_mode", "extend_to_line_bounds", "goto_file_start", "extend_to_line_bounds", "yank_main_selection_to_clipboard", "collapse_selection", "normal_mode"] } | |
[keys.insert] | |
# Escape the madness! No more fighting with the cursor! Or with multiple cursors! | |
esc = ["collapse_selection", "normal_mode"] | |
[keys.select] | |
V = "shrink_selection" | |
v = "expand_selection" | |
# Muscle memory | |
"{" = ["extend_to_line_bounds", "goto_prev_paragraph"] | |
"}" = ["extend_to_line_bounds", "goto_next_paragraph"] | |
0 = "goto_line_start" | |
"$" = "goto_line_end" | |
"^" = "goto_first_nonwhitespace" | |
G = "goto_file_end" | |
D = ["extend_to_line_bounds", "delete_selection", "normal_mode"] | |
C = ["goto_line_start", "extend_to_line_bounds", "change_selection"] | |
"%" = "match_brackets" | |
S = "surround_add" # Basically 99% of what I use vim-surround for | |
u = ["switch_to_lowercase", "collapse_selection", "normal_mode"] | |
U = ["switch_to_uppercase", "collapse_selection", "normal_mode"] | |
# Visual-mode specific muscle memory | |
i = "select_textobject_inner" | |
a = "select_textobject_around" | |
# Some extra binds to allow us to insert/append in select mode because it's nice with multiple cursors | |
tab = ["insert_mode", "collapse_selection"] # tab is read by most terminal editors as "C-i" | |
C-a = ["append_mode", "collapse_selection"] | |
# Make selecting lines in visual mode behave sensibly | |
k = ["extend_line_up", "extend_to_line_bounds"] | |
j = ["extend_line_down", "extend_to_line_bounds"] | |
# Clipboards over registers ye ye | |
d = ["yank_main_selection_to_clipboard", "delete_selection"] | |
x = ["yank_main_selection_to_clipboard", "delete_selection"] | |
y = ["yank_main_selection_to_clipboard", "normal_mode", "flip_selections", "collapse_selection"] | |
Y = ["extend_to_line_bounds", "yank_main_selection_to_clipboard", "goto_line_start", "collapse_selection", "normal_mode"] | |
p = "replace_selections_with_clipboard" # No life without this | |
P = "paste_clipboard_before" | |
# Escape the madness! No more fighting with the cursor! Or with multiple cursors! | |
esc = ["collapse_selection", "keep_primary_selection", "normal_mode"] | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment