{ pkgs, ... }: let colorsToKakoune = colors: with colors; { attribute = magenta; builtin = cyan; comment = comment; documentation = comment; enum = red; function = blue; keyword = magenta; meta = foreground; module = blue; operator = magenta; parameter = yellow; string = green; type = magenta; value = orange; variable = white; block = blue; bullet = comment; header = blue; link = cyan; list = foreground; mono = foreground; title = white; BufferPadding = [ background background ]; Default = [ foreground background ]; PrimarySelection = [ "default" "!${magenta}40" ]; SecondarySelection = [ "default" "!${green}40" ]; PrimaryCursor = [ "default" "!${blue}80" ]; SecondaryCursor = [ "default" "!${green}80" ]; PrimaryCursorEol = [ "default" "!${red}80" ]; SecondaryCursorEol = [ "default" "!${orange}80" ]; LineNumbers = comment; LineNumberCursor = orange; LineNumbersWrapped = [ background background ]; MenuForeground = [ active_tab_foreground active_tab_background ]; MenuBackground = [ inactive_tab_foreground inactive_tab_background ]; MenuInfo = green; Information = [ inactive_tab_foreground inactive_tab_background ]; Error = red; StatusLine = [ active_tab_foreground "${active_tab_background}+b" ]; StatusLineMode = orange; StatusLineInfo = blue; StatusLineValue = foreground; StatusCursor = [ "default" "!${blue}80" ]; Prompt = yellow; MatchingChar = [ "default" comment ]; Whitespace = comment; InfoDefault = "Information"; InfoBlock = "block"; InfoBlockQuote = "quote"; InfoBullet = "bullet"; InfoHeader = "header"; InfoLink = "link"; InfoLinkMono = "header"; InfoMono = "mono"; InfoRule = "comment"; InfoDiagnosticError = "InlayDiagnosticError"; InfoDiagnosticHint = "InlayDiagnosticHint"; InfoDiagnosticInformation = "InlayDiagnosticInfo"; InfoDiagnosticWarning = "InlayDiagnosticWarning"; }; in { home.packages = with pkgs; [ kak-lsp ]; programs.kakoune = { enable = true; extras.colors.enable = true; extras.colors.dark = colorsToKakoune pkgs.lib.colors.tokyonight.dark; extras.colors.light = colorsToKakoune pkgs.lib.colors.tokyonight.light; config = { autoReload = "yes"; hooks = [ # smarttab hooks { name = "BufOpenFile"; option = ".*"; commands = "expandtab"; } { name = "BufNewFile"; option = ".*"; commands = "expandtab"; } { name = "WinSetOption"; option = "filetype=(makefile)"; commands = "noexpandtab"; } { name = "ModuleLoaded"; option = "smarttab"; commands = '' set-option global softtabstop %opt{indentwidth} ''; } # lsp hooks { name = "WinSetOption"; option = "filetype=(none)"; commands = '' lsp-enable-window lsp-auto-hover-enable ''; } # general hooks { name = "WinSetOption"; option = "filetype=(haskell|nix)"; commands = '' set-option window indentwidth 2 ''; } { name = "WinCreate"; option = ".*"; commands = '' kakboard-enable ''; } ]; indentWidth = 4; keyMappings = [ { key = ""; effect = ": fzf-mode"; mode = "normal"; docstring = "Open fzf-mode with ctrl-alt-p"; } { key = ""; effect = ": fzf-modef"; mode = "normal"; docstring = "Open fzf-mode file dialog with ctrl-p"; } { key = ""; effect = ": fzf-modeb"; mode = "normal"; docstring = "Open fzf-mode buffer dialog with ctrl-b"; } { key = "v"; effect = ": vertical-selection-down"; mode = "user"; docstring = "Extend vertical selection down"; } { key = ""; effect = ": vertical-selection-up"; mode = "user"; docstring = "Extend vertical selection up"; } { key = "V"; effect = ": vertical-selection-up-and-down"; mode = "user"; docstring = "Extend vertical selection both up and down"; } ]; numberLines.enable = true; numberLines.highlightCursor = true; numberLines.relative = true; scrollOff.columns = 4; scrollOff.lines = 2; showMatching = true; showWhitespace.enable = true; showWhitespace.space = " "; ui.assistant = "cat"; ui.enableMouse = true; wrapLines.enable = true; wrapLines.indent = true; wrapLines.marker = "⏎"; wrapLines.word = true; }; extraConfig = '' eval %sh{${pkgs.kak-lsp}/bin/kak-lsp --kakoune -s $kak_session} enable-auto-pairs alias global w!! sudo-write ''; plugins = with pkgs.kakounePlugins; [ active-window-kak auto-pairs-kak connect-kak fzf-kak kak-lsp kakboard kakoune-state-save kakoune-vertical-selection pkgs.smarttab-kak pkgs.kakoune-sudo-write # disabled, tabs-kak tries to load before luar for some reason # pkgs.luar # tabs-kak ]; }; programs.fish.functions.set-kak-colors = { body = '' if test "$term_background" = light kak-light else kak-dark end ''; onVariable = "term_background"; }; }