theme = "ashen" [editor] line-number = "relative" undercurl = true default-yank-register = '+' cursorline = true bufferline = "multiple" color-modes = true shell = ['fish', '-c'] text-width = 80 mouse = true continue-comments = true auto-completion = true path-completion = true completion-replace = false completion-trigger-len = 2 scrolloff = 2 jump-label-alphabet = "tnseriplfuwydhcxoaqz" # minimum severity to show end-of-line-diagnostics = "disable" # rulers = [82] [editor.smart-tab] enable = false [editor.whitespace.render] tab = "none" space = "none" newline = "all" [editor.whitespace.characters] newline = "" tab = "" tabpad = " " # tabpad = "·" [editor.cursor-shape] insert = "bar" normal = "block" # select = "underline" [editor.statusline] mode.normal = "NRM" left = [ "mode", "spinner", "version-control", # "spacer", # "separator", # "file-name", "file-base-name", "read-only-indicator", "file-modification-indicator", # "workspace-diagnostics", ] center = ["diagnostics"] right = [ "primary-selection-length", "selections", "register", # "position", "position-percentage", "total-line-numbers", "file-encoding", ] separator = "|" diagnostics = ["warning", "error"] workspace-diagnostics = ["warning", "error"] [editor.lsp] # enable = false display-inlay-hints = true display-messages = true display-progress-messages = true # use C-k manually instead auto-signature-help = false [editor.inline-diagnostics] cursor-line = "disable" other-lines = "disable" [editor.indent-guides] render = true # character = "|" skip-levels = 1 [editor.soft-wrap] enable = true # prevents words from being split # max-wrap = 25 wrap-indicator = "" [keys.insert] C-k = "signature_help" C-c = "completion" S-tab = "move_parent_node_start" # sticky mode! [keys.normal.Z] e = "scroll_up" n = "scroll_down" j = "search_next" J = "search_prev" [keys.normal.space.p] # force inline paste p = ':append-output ~/.config/helix/scripts/paste.py' P = ':insert-output ~/.config/helix/scripts/paste.py' # force linewise paste "]" = [ "ensure_selections_forward", "add_newline_below", "move_line_down", ":insert-output ~/.config/helix/scripts/paste.py", ] "[" = [ "ensure_selections_forward", "flip_selections", "add_newline_above", "move_line_up", ":insert-output ~/.config/helix/scripts/paste.py", ] c = ''' :append-output sh -c clipcat-menu --finder custom --custom-finder-program-path fuzzel --custom-finder-arguments=--dmenu,--placeholder=Clipboard --config <(printf "[log]\nemit_stdout = true\n") | grep -q 'Nothing is selected' && exit 1 || wl-paste''' C = ''' :insert-output sh -c clipcat-menu --finder custom --custom-finder-program-path fuzzel --custom-finder-arguments=--dmenu,--placeholder=Clipboard --config <(printf "[log]\nemit_stdout = true\n") | grep -q 'Nothing is selected' && exit 1 || wl-paste''' [keys.normal] tab = "trim_selections" # swap select_mode and regex keys v = "select_regex" V = "split_selection" s = "select_mode" # reload lsp C-r = ":lsp-restart" # toggle lsp # C-r = '@:toggle lsp.enable:echo %sh{sleep 0.1}:lsp-restart' A-o = '@oOh' C-A-r = ":lsp-stop" # config file stuff # execute current file # A-x = ':sh "%sh{pwd}/%{buffer_name}"' # Treesitter selections # Left <-> Right: Sibling nodes # Up <-> Down: Parent/Child nodes A-S-n = "move_parent_node_end" A-S-e = "move_parent_node_start" A-a = "select_all_siblings" A-m = "select_prev_sibling" A-n = "shrink_selection" A-e = "expand_selection" A-i = "select_next_sibling" "{" = "rotate_selections_backward" "}" = "rotate_selections_forward" "A-{" = "rotate_selection_contents_backward" "A-}" = "rotate_selection_contents_forward" C-f = "jump_forward" C-p = "jump_backward" # a = "append_mode_same_line" C-k = "signature_help" "\\" = ":format" "+" = ":reflow" ret = "goto_word" # master m = "move_char_left" i = "move_char_right" # # axel # m = "move_same_line_char_left" # i = "move_same_line_char_right" n = "move_visual_line_down" e = "move_visual_line_up" N = "move_line_down" E = "move_line_up" h = "insert_mode" H = "insert_at_line_start" L = "move_next_long_word_end" j = ["search_next", "align_view_center"] J = ["search_prev", "align_view_center"] A-j = "join_selections" A-J = "join_selections_space" C-q = ":qa" C-S-q = ":qa!" # C-m = ":bp" M = ":bp" # C-i = ":bn" C-m = "jump_view_left" C-n = "jump_view_down" C-i = "jump_view_right" C-e = "jump_view_up" I = ":bn" X = "extend_line_above" x = "extend_line_below" # A-x = "toggle_line_select" D = "kill_to_line_end" A-d = "kill_to_line_start" # Sub-word Movement w = "move_next_word_start" C-w = "move_next_sub_word_start" b = "move_prev_word_start" C-b = "move_prev_sub_word_start" l = "move_next_word_end" C-l = "move_next_sub_word_end" A-l = "move_prev_sub_word_start" # Navigation C-d = ["page_cursor_half_down", "align_view_center"] C-u = ["page_cursor_half_up", "align_view_center"] # language specific commands [keys.normal.space.l] # open pdf preview for typst p = ':sh ~/dev/utils/helix-pdf/hx-typ-zathura.fish --watch --kill-on-exit %{buffer_name}' # p = ':sh ~/.config/helix/scripts/hx-typ-zathura.fish -k %{buffer_name}' # git stuff [keys.normal.space.g] # blame b = ":sh git -C $(dirname $(realpath %{buffer_name})) blame -L %{cursor_line},%{cursor_line} $(realpath %{buffer_name})" # lazygit g = ":sh footclient -d error lazygit" # URL to current line o = ":sh ~/.config/helix/scripts/get_git_provider_url.fish %{buffer_name} %{cursor_line}" r = ":reset-diff-change" # minimap fun! m = ':sh code-minimap (path resolve %{buffer_name})' [keys.normal."["] x = "extend_line_above" [keys.normal.space.m] m = '@ks*' t = '@:insert-output cat % | markdown-toc --bullets - --no-firsth1 -' [keys.select.space.m] m = '@ks*' t = '@:insert-output cat % | markdown-toc --bullets - --no-firsth1 -' [keys.normal.space] A-r = ":config-reload" A-o = ":config-open" A-w = ":config-open-workspace" y = ':w' Y = ':w!' # create line above and below selection O = '@ks' o = '@xks' t = "move_parent_node_end" T = "move_parent_node_start" # yazi integration space = [ ':sh rm -f /tmp/yazi-path', ':insert-output footclient -d error yazi %{buffer_name} --chooser-file=/tmp/yazi-path', ':open %sh{cat /tmp/yazi-path}', ':redraw', ':set mouse false', ':set mouse true', ] # insert markdown toc :) x = ":bc" X = ':sh %{buffer_name}' # UI settings and stuff [keys.normal.space.u] # Toggle insert cursor shape C = ':toggle cursor-shape.insert bar block' # Toggle Cursor Always Centered z = ':toggle scrolloff 2 99' d = ':toggle statusline.center ["diagnostics"] ["workspace-diagnostics","diagnostics"] []' # # Toggle End of line diagnostics # D = ':toggle end-of-line-diagnostics hint disable' # # Toggle Inline diagnostics # d = ':toggle inline-diagnostics.cursor-line disable hint' # Toggle soft-wrap w = ':toggle soft-wrap.enable' # Soft wrap at specified text width s = ':set soft-wrap.wrap-at-text-width true' S = ':set soft-wrap.wrap-at-text-width false' # Toggle signature help (off by default) k = ":toggle lsp.auto-signature-help" # toggle auto completion (on by default) c = ":toggle auto-completion" # toggle inlay hints (on by default) h = ':toggle lsp.display-inlay-hints' # Toggle git display g = ':toggle gutters.layout ["diagnostics", "spacer", "line-numbers", "spacer", "diff"] ["diagnostics", "spacer", "line-numbers", "spacer", "spacer"]' # Toggle Ruler r = ':toggle rulers [82] []' [keys.select.g] m = "extend_to_line_start" i = "extend_to_line_end" I = "extend_to_line_end_newline" l = "extend_to_file_end" L = "extend_to_last_line" [keys.select.space] t = "extend_parent_node_end" T = "extend_parent_node_start" # yazi integration space = [ ':sh rm -f /tmp/yazi-path', ':insert-output footclient -d error yazi %{buffer_name} --chooser-file=/tmp/yazi-path', ':open %sh{cat /tmp/yazi-path}', ':redraw', ':set mouse false', ':set mouse true', ] # insert markdown toc :) p = ''' :append-output clipcat-menu --finder custom --custom-finder-program-path fuzzel --custom-finder-arguments=--dmenu,--placeholder=Clipboard --config <(printf "[log]\nemit_stdout = true\n") | grep -q 'Nothing is selected' && exit 1 || wl-paste''' P = ''' :insert-output clipcat-menu --finder custom --custom-finder-program-path fuzzel --custom-finder-arguments=--dmenu,--placeholder=Clipboard --config <(printf "[log]\nemit_stdout = true\n") | grep -q 'Nothing is selected' && exit 1 || wl-paste''' x = ":bc" [keys.select] tab = "trim_selections" "{" = "rotate_selections_backward" "}" = "rotate_selections_forward" "A-{" = "rotate_selection_contents_backward" "A-}" = "rotate_selection_contents_forward" # swap select_mode and regex keys v = "select_regex" V = "split_selection" s = "normal_mode" # Treesitter selections # Left <-> Right: Sibling nodes # Up <-> Down: Parent/Child nodes A-S-n = "move_parent_node_end" A-S-e = "move_parent_node_start" A-a = "select_all_siblings" A-m = "select_prev_sibling" A-n = "shrink_selection" A-e = "expand_selection" A-i = "select_next_sibling" X = "extend_line_above" x = "extend_line" ret = "extend_to_word" # master m = "extend_char_left" i = "extend_char_right" # # axel # m = "extend_same_line_char_left" # i = "extend_same_line_char_right" n = "extend_visual_line_down" e = "extend_visual_line_up" j = ["extend_search_next", "align_view_center"] J = ["extend_search_prev", "align_view_center"] C-l = "extend_next_sub_word_end" l = "extend_next_word_end" C-w = "extend_next_sub_word_start" C-b = "extend_prev_sub_word_start" L = "extend_next_long_word_end" A-l = "extend_prev_sub_word_start" [keys.normal.k] m = "match_brackets" k = "match_brackets" s = "surround_add" r = "surround_replace" d = "surround_delete" a = "select_textobject_around" i = "select_textobject_inner" [keys.select.k] m = "match_brackets" k = "match_brackets" s = "surround_add" r = "surround_replace" d = "surround_delete" a = "select_textobject_around" i = "select_textobject_inner" # Window Mode [keys.normal.space.w] m = "jump_view_left" C-m = "jump_view_left" n = "jump_view_down" C-n = "jump_view_down" i = "jump_view_right" C-i = "jump_view_right" e = "jump_view_up" C-e = "jump_view_up" M = "swap_view_left" N = "swap_view_down" E = "swap_view_up" I = "swap_view_right" d = "wclose" V = ":vsplit-new" S = ":hsplit-new" h = "no_op" j = "no_op" k = "no_op" l = "no_op" H = "no_op" J = "no_op" K = "no_op" L = "no_op" [keys.normal.g] z = "goto_window_center" m = "goto_first_nonwhitespace" i = "goto_line_end" I = "goto_line_end_newline" n = "move_line_down" e = "move_line_up" l = "goto_file_end" L = "goto_last_line" [keys.normal.backspace] d = "delete_selection_noyank" c = "change_selection_noyank" [keys.select.backspace] d = "delete_selection_noyank" c = "change_selection_noyank"