# # Kakoune, one of our main editors. # { pkgs, deprekages, ... }: { programs.kakoune = { enable = true; config = { tabStop = 2; numberLines.enable = true; hooks = [ # Automatically enable the LSP when a supported file is found. { name = "WinSetOption"; option = "filetype=(python|nix|c|cpp|rust|ruby)"; commands = '' lsp-enable-window # Finally, inject our buffer name in front of the modeline, so tabs are named correctly. set global -remove modelinefmt "%val{bufname}" set global modelinefmt "%val{bufname} - %opt{modelinefmt}" ''; } # Additional file types. { name = "BufCreate"; option = ".*\\.typ"; commands = '' set-option buffer filetype typst addhl buffer/ wrap -word ''; } # Spell checking. { name = "ModeChange"; option = "push:[^:]*:next-key\\[user.spell\\]"; commands = '' hook -once -always window NormalIdle .* spell-clear spell en_US ''; } ]; keyMappings = [ # Vertical selections. { mode = "user"; key = "v"; effect = ":vertical-selection-down"; docstring = "select matching lines down"; } { mode = "user"; key = ""; effect = ":vertical-selection-up"; docstring = "select matching lines up"; } { mode = "user"; key = "V"; effect = ":vertical-selection-up-and-down"; docstring = "select matching lines (bidirectional)"; } # Shortcuts. { mode = "user"; key = "a"; effect = ""; docstring = "select around"; } { mode = "user"; key = "i"; effect = ""; docstring = "select inside"; } { mode = "user"; key = "q"; effect = "Q"; docstring = "select inside double quotes"; } { mode = "user"; key = "Q"; effect = "QC"; docstring = "change inside double quotes"; } # Spell-checking. { mode = "user"; key = "s"; effect = ": enter-user-mode -lock spell"; docstring = "enter spelling mode"; } { mode = "spell"; key = "a"; effect = ":spell-add; spell en_US"; docstring = "add word to spell-checker"; } { mode = "spell"; key = "r"; effect = ":_spell-replace"; docstring = "suggest spelling replacements"; } { mode = "spell"; key = "n"; effect = ":spell-next"; docstring = "move to the next word"; } ]; }; extraConfig = '' # Set up our LSP host. eval %sh{kak-lsp --kakoune -s $kak_session} # Use a cat assistant, which puck think is cute. set global ui_options terminal_assistant=cat # Use tree-sitter for coloring. eval %sh{ ${deprekages.kak-tree-sitter}/bin/kak-tree-sitter -dks --init $kak_session } colorscheme solarized-darker # Use wezterm when possible, and tmux otherwise. source ${../../kak/wezterm-tab.kak} set global windowing_modules 'wezterm-tab' 'tmux' # Enable auotmatic hovering. lsp-auto-hover-enable set global lsp_hover_anchor true # Rainbow brackets. require-module rainbow # Editorconfig. hook global BufOpenFile .* editorconfig-load hook global BufNewFile .* editorconfig-load # Set up spellchecking. define-command -hidden -params 0 _spell-replace %{ hook -always -once window ModeChange push:prompt:next-key\[user.spell\] %{ execute-keys } hook -once -always window NormalIdle .* %{ enter-user-mode -lock spell spell en_US } spell-replace } # Misc plugins. source ${../../kak/sudo-write.kak} ''; plugins = with pkgs.kakounePlugins; [ connect-kak kak-ansi kak-prelude kakoune-extra-filetypes kakoune-lsp kakoune-rainbow kakoune-state-save kakoune-vertical-selection deprekages.kak-tree-sitter parinfer-rust ]; }; }