config/modules/kak/kakrc.nix

172 lines
4.6 KiB
Nix
Raw Normal View History

2022-05-15 23:32:21 +02:00
# Defines the kakrc.
{
# Feature flags
typescript ? false,
haskell ? false,
python ? false,
rust ? false,
nix ? true,
# Color theme
theme,
# Build tools
pkgs,
lib,
}:
2022-05-16 17:44:49 +02:00
let keybinds = ''
2022-05-23 13:17:26 +02:00
map global insert <a-tab> <esc>:buffer-next<ret>
map global normal <a-tab> :buffer-next<ret>
2022-05-16 17:44:49 +02:00
'';
2022-05-23 13:17:26 +02:00
# Initialization code for IDE mode needed for every supported
# language, and inlay diagnostics.
2022-05-16 17:44:49 +02:00
ide-init = ''
lsp-enable-window
2022-05-15 23:32:21 +02:00
2022-05-23 13:28:54 +02:00
hook window ModeChange .*:.*:insert %{
2022-05-23 13:55:47 +02:00
lsp-inlay-diagnostics-disable window
2022-05-23 13:28:54 +02:00
remove-highlighter window/lsp_diagnostics
}
hook window ModeChange .*:insert:normal %{
lsp-inlay-diagnostics-enable window
}
2022-05-16 17:57:58 +02:00
'';
2022-05-23 13:17:26 +02:00
# Implies `ide-init`. Adds code actions and hover.
2022-05-16 17:57:58 +02:00
ide-core = ''
2022-05-23 13:17:26 +02:00
${ide-init}
2022-05-16 17:57:58 +02:00
2022-05-16 17:44:49 +02:00
map buffer normal <tab> ': lsp-code-actions<ret>'
map buffer normal <ret> ': lsp-hover<ret>'
2022-05-15 23:32:21 +02:00
'';
2022-05-23 13:17:26 +02:00
# Implies `ide-core`, which implies `ide-init`.
ide-full = ''
2022-05-16 17:44:49 +02:00
2022-05-23 13:17:26 +02:00
${ide-core}
hook window -group semtok BufReload .* lsp-semantic-tokens
hook window -group semtok NormalIdle .* lsp-semantic-tokens
hook window -group semtok InsertIdle .* lsp-semantic-tokens
2022-05-16 17:44:49 +02:00
2022-05-23 13:17:26 +02:00
hook -once -always window WinSetOption filetype=.* %{ remove-hooks window semtok }
2022-05-16 17:44:49 +02:00
map global normal <a-down> ': lsp-next-function<ret>'
map global normal <a-up> ': lsp-previous-function<ret>'
map global normal <a-left> ': lsp-previous-location *goto*<ret>'
map global normal <a-right> ': lsp-next-location *goto*<ret>'
2022-05-23 13:17:26 +02:00
''; in
2022-05-16 17:44:49 +02:00
# Nix hacking-related configuration. Nix has a very weak language
# server, and it basically only supports `ide-init` (for completions).
let nix-config = (lib.optionalString nix ''
hook global WinSetOption filetype=nix %{
${ide-init}
}
'');
2022-05-15 23:32:21 +02:00
2022-05-16 17:44:49 +02:00
# Sometimes work requires me to touch the frontend. Ew. `ide-core`
# suffices here.
2022-05-23 13:17:26 +02:00
typescript-config = (lib.optionalString typescript ''
2022-05-16 17:44:49 +02:00
hook global WinSetOption filetype=(javascript|typescript) %{
${ide-core}
}
2022-05-15 23:32:21 +02:00
'');
2022-05-16 17:44:49 +02:00
# Python-related config. Python does not support more features than
# those in `ide-core`.
python-config = (lib.optionalString python ''
2022-05-23 13:17:26 +02:00
hook global WinSetOption filetype=python %{
2022-05-16 17:44:49 +02:00
2022-05-23 13:17:26 +02:00
${ide-core}
2022-05-15 23:32:21 +02:00
2022-05-19 19:58:26 +02:00
face window keyword rgb:${theme.green.bright}
2022-05-16 17:44:49 +02:00
face window meta keyword
2022-05-23 13:17:26 +02:00
}
2022-05-15 23:32:21 +02:00
'');
2022-05-16 17:44:49 +02:00
# Haskell development. Haskell has a language server with
# the features in `ide-full`.
2022-05-15 23:32:21 +02:00
haskell-config = (lib.optionalString haskell ''
2022-05-23 13:17:26 +02:00
hook global WinSetOption filetype=haskell %{
2022-05-15 23:32:21 +02:00
2022-05-23 13:17:26 +02:00
${ide-full}
set-option buffer tabstop 2
2022-05-15 23:32:21 +02:00
2022-05-19 19:58:26 +02:00
face global variable rgb:${theme.purple.normal}
2022-05-16 17:44:49 +02:00
face global attribute keyword
face global operator keyword
2022-05-19 19:58:26 +02:00
face global keyword rgb:${theme.blue.bright}
2022-05-16 17:44:49 +02:00
face global value string
2022-05-19 19:58:26 +02:00
face global meta rgb:${theme.pink.normal}
2022-05-15 23:32:21 +02:00
2022-05-23 13:17:26 +02:00
}
2022-05-15 23:32:21 +02:00
'');
2022-05-16 17:44:49 +02:00
# Rust development. Rust's language servers all support the
# `ide-full` features.
2022-05-15 23:32:21 +02:00
rust-config = (lib.optionalString rust ''
2022-05-23 13:17:26 +02:00
hook global WinSetOption filetype=rust %{
${ide-full}
2022-05-15 23:32:21 +02:00
2022-05-23 13:17:26 +02:00
hook global -group yeet ModuleLoaded rust %{
2022-05-16 17:44:49 +02:00
2022-05-23 13:17:26 +02:00
# Override the Rust highlighting with semantic
# tokens supplied by the LSP client
remove-hooks global rust-highlight
remove-highlighter shared/rust
2022-05-15 23:32:21 +02:00
2022-05-23 13:17:26 +02:00
# Request tokens
lsp-semantic-tokens
2022-05-15 23:32:21 +02:00
2022-05-23 13:17:26 +02:00
# Self-destruct this hook (it should only run once)
remove-hooks global yeet
2022-05-16 17:44:49 +02:00
2022-05-23 13:17:26 +02:00
}
2022-05-16 17:44:49 +02:00
2022-05-23 13:17:26 +02:00
}
2022-05-15 23:32:21 +02:00
'');
in pkgs.writeTextFile (rec {
2022-05-23 13:17:26 +02:00
name = "kakrc.kak";
2022-05-15 23:32:21 +02:00
destination = "/share/kak/autoload/${name}";
2022-05-19 19:58:26 +02:00
text = ''
2022-05-23 13:17:26 +02:00
set global tabstop 4
2022-05-23 13:33:12 +02:00
set global indentwidth 4
2022-05-15 23:32:21 +02:00
2022-05-23 13:28:54 +02:00
eval %sh{ kak-lsp --kakoune -s $kak_session }
2022-05-23 13:17:26 +02:00
add-highlighter global/ number-lines -separator ' ' -hlcursor
2022-05-16 17:44:49 +02:00
2022-05-23 13:17:26 +02:00
face global InlayHint rgb:828282
face global InlayDiagnosticWarning rgb:a39e31+f
face global InlayDiagnosticError rgb:ad494f+f
face global InlayDiagnosticHint rgb:4d965a+f
face global InlayDiagnosticInfo rgb:4d965a+f
2022-05-16 17:44:49 +02:00
2022-05-23 13:17:26 +02:00
${keybinds}
2022-05-19 19:58:26 +02:00
${typescript-config}
${haskell-config}
${python-config}
${rust-config}
${nix-config}
2022-05-23 13:28:54 +02:00
hook global KakBegin .* %{
cursorline
colorscheme colors
}
2022-05-19 19:58:26 +02:00
'';
2022-05-15 23:32:21 +02:00
})