theme = "catppuccin_macchiato" [editor] line-number = "relative" cursorline = true color-modes = true [editor.cursor-shape] insert = "bar" normal = "block" select = "underline" [editor.indent-guides] render = true [keys.normal] # Quick iteration on config changes C-o = ":config-open" C-r = ":config-reload" # Some nice Helix stuff C-h = "select_prev_sibling" C-j = "shrink_selection" C-k = "expand_selection" C-l = "select_next_sibling" # Personal preference o = ["open_below", "normal_mode"] O = ["open_above", "normal_mode"] # Muscle memory "{" = ["goto_prev_paragraph", "collapse_selection"] "}" = ["goto_next_paragraph", "collapse_selection"] 0 = "goto_line_start" "$" = "goto_line_end" "^" = "goto_first_nonwhitespace" G = "goto_file_end" "%" = "match_brackets" 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" # 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"] 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] # 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"]