diff --git a/users/malte/kakoune.nix b/users/malte/kakoune.nix index 54e2bcb..5ae17f2 100644 --- a/users/malte/kakoune.nix +++ b/users/malte/kakoune.nix @@ -5,6 +5,7 @@ ... }: let # Configuration for kakoune plugins + # ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ pluginConfigs = with pkgs.kakounePlugins; [ { # FZF for kakoune @@ -82,6 +83,8 @@ } ]; + # Additional mappings for kakoune + # ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ additionalMappings = [ { # Switch to last buffer @@ -90,23 +93,172 @@ key = ","; effect = ":buffer-previous"; } + { + # Toggle whitespace highlighter + docstring = "Toggle whitespace"; + mode = "user"; + key = "w"; + effect = ":togglewhitespace"; + } ]; + # Additional configuration for kakoune + # ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ additionalConfig = '' add-highlighter global/ number-lines -relative add-highlighter global/ wrap -word -indent add-highlighter global/ regex '\h*(//|#|;|%)\h*(TODO:|FIXME:)([^\n]*)' 2:black,bright-red+Fb 3:default+b + # Highlighter for headers in the nix config + add-highlighter global/ regex '^\h*#\h*([^\n]+)\n\h*#\h*(‾+)$' 1:bright-yellow+bf 2:yellow+bf face global PrimarySelection rgba:ebdbb2a0,rgba:8ec07c40 face global SecondarySelection rgba:ebdbb2a0,rgba:83a59840 + face global MatchingChar rgb:ebdbb2,rgb:3c3836+bf + face global Reference rgb:3c3836 # Do something about tabs.. map global insert ' ' hook global BufSetOption filetype=nix %{ map buffer insert ' ' } + set-option global tabstop 4 + + # Toggle whitespaces! + declare-option -docstring "Whether whitespaces are visible" bool whitespacesshown + define-command -docstring "Toggle whitespace highlighter" togglewhitespace %{ + execute-keys %sh{ + if [ $kak_opt_whitespacesshown = "true" ]; then + printf ':remove-highlighter buffer/whitespace' + printf ':set-option buffer whitespacesshown false' + else + printf ':add-highlighter buffer/whitespace show-whitespaces' + printf ':set-option buffer whitespacesshown true' + fi + } + } ''; + # Configuration for kakoune LSP + # ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ + kakLspConfigGen = pkgs.formats.toml {}; + kakLspConfig = { + language = { + javascript = { + args = ["lsp"]; + command = "${pkgs.flow}/bin/flow"; + filetypes = ["javascript"]; + roots = [".flowconfig"]; + }; + latex = { + command = "${pkgs.texlab}/bin/texlab"; + filetypes = ["latex"]; + roots = [".git" ".hg"]; + settings = { + texlab = { + forwardSearch = { + args = [ + "%p" + "--synctex-forward" + "%l:1:%f" + "--synctex-editor-command" + '' + sh -c ' + echo " + evaluate-commands -client $kak_client %{ + evaluate-commands -try-client %opt{jumpclient} %{ + edit -- %{input} %{line} + } + } + " | kak -p $kak_session + ' + '' + ]; + executable = "${pkgs.zathura}/bin/zathura"; + }; + }; + }; + settings_section = "texlab"; + }; + nix = { + command = "${pkgs.rnix-lsp}/bin/rnix-lsp"; + filetypes = ["nix"]; + roots = ["flake.nix" "shell.nix" ".git" ".hg"]; + }; + python = { + command = "${pkgs.python3.pkgs.python-lsp-server}/bin/pylsp"; + filetypes = ["python"]; + roots = ["requirements.txt" "setup.py" ".git" ".hg"]; + settings.pylsp.pylsp.configurationSources = ["flake8"]; + settings_section = "pylsp"; + }; + rust = { + command = "${pkgs.rust-analyzer}/bin/rust-analyzer"; + filetypes = ["rust"]; + roots = ["Cargo.toml"]; + settings = { + rust-analyzer = { + cargo = {loadOutDirsFromCheck = true;}; + hoverActions = {enable = true;}; + procMacro = {enable = true;}; + }; + }; + settings_section = "rust-analyzer"; + }; + typescript = { + args = ["--stdio" "--tsserver-path=${pkgs.nodePackages.typescript}/lib/node_modules/typescript/lib"]; + command = "${pkgs.nodePackages.typescript-language-server}/bin/typescript-language-server"; + filetypes = ["typescript"]; + roots = ["package.json" "tsconfig.json" ".git" ".hg"]; + }; + vuejs = { + args = ["--stdio"]; + command = "${pkgs.nodePackages.vls}/bin/vls"; + filetypes = ["vuejs"]; + roots = ["package.json" "tsconfig.json" ".git" ".hg"]; + }; + }; + semantic_tokens = let + mkToken = { + token, + face ? null, + modifiers ? [], + }: { + inherit token modifiers; + face = + if face != null + then face + else token; + }; + in [ + (mkToken {token = "comment";}) + (mkToken {token = "function";}) + (mkToken {token = "keyword";}) + (mkToken {token = "operator";}) + (mkToken {token = "string";}) + (mkToken {token = "type";}) + (mkToken {token = "variable";}) + { + face = "module"; + token = "namespace"; + } + { + face = "documentation"; + modifiers = ["documentation"]; + token = "comment"; + } + { + face = "default+d"; + modifiers = ["readonly"]; + token = "variable"; + } + { + face = "default+d"; + modifiers = ["constant"]; + token = "variable"; + } + ]; + }; + selectOr = attr: default: map (conf: conf.${attr} or default) pluginConfigs; selectList = attr: lib.flatten (selectOr attr []); in { @@ -129,149 +281,10 @@ in { plugins = map (conf: conf.pkg) pluginConfigs; }; - home.packages = with pkgs; [ - # For Nix - rnix-lsp - # For Rust - rust-analyzer-nightly - # For Python - python3.pkgs.python-lsp-server - # For TypeScript - nodePackages.typescript - nodePackages.typescript-language-server - # For JavaScript - flow - ]; - - xdg.configFile."kak-lsp/kak-lsp.toml".text = '' - [language.rust] - filetypes = ["rust"] - roots = ["Cargo.toml"] - command = "${pkgs.rust-analyzer-nightly}/bin/rust-analyzer" - settings_section = "rust-analyzer" - - [language.rust.settings.rust-analyzer] - hoverActions.enable = true # kak-lsp doesn't support this at the moment - procMacro.enable = true - cargo.loadOutDirsFromCheck = true - - [language.nix] - filetypes = ["nix"] - roots = ["flake.nix", "shell.nix", ".git", ".hg"] - command = "${pkgs.rnix-lsp}/bin/rnix-lsp" - - [language.python] - filetypes = ["python"] - roots = ["requirements.txt", "setup.py", ".git", ".hg"] - command = "${pkgs.python3.pkgs.python-lsp-server}/bin/pylsp" - settings_section = "pylsp" - - [language.python.settings.pylsp] - pylsp.configurationSources = ["flake8"] - - [language.latex] - filetypes = ["latex"] - roots = [".git", ".hg"] - command = "${pkgs.texlab}/bin/texlab" - settings_section = "texlab" - [language.latex.settings.texlab] - # See https://github.com/latex-lsp/texlab/blob/master/docs/options.md - # - # Preview configuration for zathura with SyncTeX search. - # For other PDF viewers see https://github.com/latex-lsp/texlab/blob/master/docs/previewing.md - forwardSearch.executable = "${pkgs.zathura}/bin/zathura" - forwardSearch.args = [ - "%p", - "--synctex-forward", # Support texlab-forward-search - "%l:1:%f", - "--synctex-editor-command", # use Control+Left-Mouse-Button to jump to source. - """ - sh -c ' - echo " - evaluate-commands -client $kak_client %{ - evaluate-commands -try-client %opt{jumpclient} %{ - edit -- %{input} %{line} - } - } - " | kak -p $kak_session - ' - """, - ] - - [language.typescript] - filetypes = ["typescript"] - roots = ["package.json", "tsconfig.json", ".git", ".hg"] - command = "${pkgs.nodePackages.typescript-language-server}/bin/typescript-language-server" - args = [ - "--stdio", - "--tsserver-path=${pkgs.nodePackages.typescript}/lib/node_modules/typescript/lib" - ] - - [language.javascript] - filetypes = ["javascript"] - roots = [".flowconfig"] - command = "${pkgs.flow}/bin/flow" - args = ["lsp"] - - [language.vuejs] - filetypes = ["vuejs"] - roots = ["package.json", "tsconfig.json", ".git", ".hg"] - command = "${pkgs.nodePackages.vls}/bin/vls" - args = [ - "--stdio" - ] - - # Semantic tokens support - [[semantic_tokens]] - token = "comment" - face = "documentation" - modifiers = ["documentation"] - - [[semantic_tokens]] - token = "comment" - face = "comment" - - [[semantic_tokens]] - token = "function" - face = "function" - - [[semantic_tokens]] - token = "keyword" - face = "keyword" - - [[semantic_tokens]] - token = "namespace" - face = "module" - - [[semantic_tokens]] - token = "operator" - face = "operator" - - [[semantic_tokens]] - token = "string" - face = "string" - - [[semantic_tokens]] - token = "type" - face = "type" - - [[semantic_tokens]] - token = "variable" - face = "default+d" - modifiers = ["readonly"] - - [[semantic_tokens]] - token = "variable" - face = "default+d" - modifiers = ["constant"] - - [[semantic_tokens]] - token = "variable" - face = "variable" - ''; - home.sessionVariables = { EDITOR = "${pkgs.kakoune}/bin/kak"; VISUAL = "${pkgs.kitty}/bin/kitty ${pkgs.kakoune}/bin/kak"; }; + + xdg.configFile."kak-lsp/kak-lsp.toml".source = kakLspConfigGen.generate "kak-lsp.toml" kakLspConfig; }