dotfiles/.config/kak/autoload/lsp.kak

373 lines
13 KiB
Text

# load plugin
eval %sh{kak-lsp}
# eval %sh{kak-lsp-diags}
define-command -params 0..1 -docstring %{
enable lsp-diags. give -dev switch to run dev build.
} diags %{
evaluate-commands %sh{
if [ "$1" = "-dev" ]; then
uv run --project $HOME/dev/kak-lsp-diags/ kak-lsp-diags
else
kak-lsp-diags
fi
}
}
define-command -override -hidden lsp-do-send-async %{
# echo -debug ===BEGIN-LSP
# echo -quoting shell -debug %reg{a}
# echo -debug ===END-LSP
echo -quoting shell -to-file %opt{lsp_fifo} %reg{a}
echo -to-file %opt{lsp_fifo} ' '
# nop %sh{ notify-send "this runs!" }
}
define-command -override -hidden lsp-do-send-sync %{
nop %sh{ notify-send 'this runs' }
unset-option buffer lsp_do_send_maybe_sync
evaluate-commands %sh{
tmp=$(mktemp -q -d -t 'kak-lsp-sync.XXXXXX' 2>/dev/null || mktemp -q -d)
pipe=${tmp}/fifo
if ! mkfifo ${pipe}; then
echo 'fail failed to create fifo'
exit
fi
trap "rm -f ${pipe}; rmdir ${tmp} 2>/dev/null" EXIT INT QUIT
printf >${kak_opt_lsp_fifo} "%s '%s' " \
"${kak_quoted_reg_a}" "${pipe}"
cat ${pipe}
}
}
define-command -override lsp-progress-disable %{
# override to do nothing b/c it's annoying lol
define-command -hidden -override lsp-handle-progress -params 6 nop
}
define-command -override lsp-progress-enable %{
# identical to kak-lsp default
define-command -hidden -override lsp-handle-progress -params 6 %{
set-option global lsp_modeline_progress %sh{
if ! "$6"; then
echo "$kak_opt_lsp_progress_indicator"
fi
}
}
}
# mappings
map global user k ': lsp-hover<ret>' -docstring 'LSP hover'
map global user l ': enter-user-mode lsp<ret>' -docstring 'LSP mode'
map global insert <tab> '<a-;>:try lsp-snippets-select-next-placeholders catch %{ execute-keys -with-hooks <lt>tab> }<ret>' -docstring 'Select next snippet placeholder'
map global object a '<a-semicolon>lsp-object<ret>' -docstring 'LSP any symbol'
map global object <a-a> '<a-semicolon>lsp-object<ret>' -docstring 'LSP any symbol'
map global object f '<a-semicolon>lsp-object Function Method<ret>' -docstring 'LSP function or method'
map global object t '<a-semicolon>lsp-object Class Interface Struct<ret>' -docstring 'LSP class interface or struct'
map global object d '<a-semicolon>lsp-diagnostic-object --include-warnings<ret>' -docstring 'LSP errors and warnings'
map global object D '<a-semicolon>lsp-diagnostic-object<ret>' -docstring 'LSP errors'
# override the code actions icon in the modeline
define-command -hidden -override lsp-show-code-actions -params 1.. %{
set-option buffer lsp_modeline_code_actions ""
}
define-command -hidden -override lsp-hide-code-actions %{
set-option buffer lsp_modeline_code_actions ""
}
# Server Config
set-option global lsp_debug false
# list of filetypes for which LSP will be activated in the window scope
declare-option str-list lsp_filetypes python go rust bash fish c cpp typst markdown yaml json jsonc bash sh typescript javascript latex toml bibtex
declare-option -hidden bool inlay_enabled false
define-command -hidden inlay-on %{
lsp-inlay-hints-enable window
set-option window inlay_enabled true
}
define-command -hidden inlay-off %{
lsp-inlay-hints-disable window
set-option window inlay_enabled false
}
define-command -hidden inlay-toggle %{
evaluate-commands %sh{
if [ "$kak_opt_inlay_enabled" = "true" ]; then
echo "inlay-off"
else
echo "inlay-on"
fi
}
}
declare-option -hidden bool inlay_diagnostics_enabled false
define-command -hidden inlay-diagnostics-on %{
lsp-inlay-diagnostics-enable window
set-option window inlay_diagnostics_enabled true
}
define-command -hidden inlay-diagnostics-off %{
lsp-inlay-diagnostics-disable window
set-option window inlay_diagnostics_enabled false
}
define-command -hidden inlay-diagnostics-toggle %{
evaluate-commands %sh{
if [ "$kak_opt_inlay_diagnostics_enabled" = "true" ]; then
echo "inlay-diagnostics-off"
else
echo "inlay-diagnostics-on"
fi
}
}
declare-option -hidden bool inline_diagnostics_enabled true
define-command -hidden inline-diagnostics-on %{
lsp-inline-diagnostics-enable window
set-option window inline_diagnostics_enabled true
}
define-command -hidden inline-diagnostics-off %{
lsp-inline-diagnostics-disable window
set-option window inline_diagnostics_enabled false
}
define-command inline-diagnostics-toggle %{
evaluate-commands %sh{
if [ "$kak_opt_inline_diagnostics_enabled" = "true" ]; then
echo "inline-diagnostics-off"
else
echo "inline-diagnostics-on"
fi
}
}
define-command -hidden lsp-filetype-hooks-update %{
try %{ remove-hooks global lsp-filetypes }
# convert the str-list into regex of form (a|b|c|...)
hook -group lsp-filetypes global WinSetOption %exp~filetype=%sh{
printf '%s\n' "($kak_opt_lsp_filetypes)" | sed 's/ /|/g'
}~ %{
# commands to execute for lsp window settings
lsp-enable-window
inlay-on
# hooks to disable inline diagnostics while typing
hook -group dynamic-inline-diags window ModeChange (push|pop):.*insert %{
try inline-diagnostics-off
}
hook -group dynamic-inline-diags window ModeChange (push|pop):insert:.* %{
try inline-diagnostics-on
}
# only map to UI mode if that module is available
map -docstring 'toggle inlay hints' window ui h ': inlay-toggle<ret>'
map -docstring 'toggle inlay diagnostics' window ui d ': inlay-diagnostics-toggle<ret>'
map -docstring 'toggle inline diagnostics' window ui e ': inline-diagnostics-toggle<ret>'
trigger-user-hook lsp-enabled
}
}
lsp-filetype-hooks-update
hook global WinSetOption lsp_filetypes=.* lsp-filetype-hooks-update
hook global BufSetOption lsp_filetypes=.* lsp-filetype-hooks-update
hook global GlobalSetOption lsp_filetypes=.* lsp-filetype-hooks-update
remove-hooks global lsp-filetype-python
hook -group lsp-filetype-python global BufSetOption filetype=python %{
set-option buffer lsp_servers %{
[basedpyright-langserver]
root_globs = ["requirements.txt", "setup.py", "pyproject.toml", "pyrightconfig.json", ".git", ".hg"]
args = ["--stdio"]
# command = "uv"
settings_section = "basedpyright"
[basedpyright-langserver.settings.basedpyright.analysis]
typeCheckingMode = "standard"
inlayHints.genericTypes = true
}
}
# hook -group lsp-filetype-bibtex global BufSetOption filetype=bibtex %{
# set-option buffer lsp_servers %{
# # [ltex-ls-plus]
# # root_globs = [".git", ".hg", "main.tex"]
# # [ltex-ls-plus.settings.ltex]
# # # TODO: write a script where the dictionary is a list of words
# # # that's read from a file and then output in TOML format.
# # # This way we can implement adding our own words to this list dynamically
# # # dictionary = { "en-US" = ["builtin", "Fichtinger", "SonarAuth", "sexpenis" ], "en-CA" = ["more", "words"] }
# # dictionary = { "en-US" = [] }
# [texlab]
# root_globs = [".git", ".hg"]
# [texlab.settings.texlab]
# # See https://github.com/latex-lsp/texlab/wiki/Configuration
# #
# # Preview configuration for zathura with SyncTeX search.
# # For other PDF viewers see https://github.com/latex-lsp/texlab/wiki/Previewing
# build.onSave = true
# forwardSearch.executable = "zathura"
# forwardSearch.args = [
# "%p",
# "--synctex-forward", # Support texlab-forward-search
# "%l:1:%f",
# "--synctex-editor-command", # Inverse search: use Control+Left-Mouse-Button to jump to source.
# """
# sh -c '
# echo "
# evaluate-commands -client %%opt{texlab_client} %%{
# evaluate-commands -try-client %%opt{jumpclient} %%{
# edit -- %%{input} %%{line}
# }
# }
# " | kak -p $kak_session
# '
# """,
# ]
# }
# }
remove-hooks global lsp-filetype-latex
hook -group lsp-filetype-latex global BufSetOption filetype=latex %{
set-option buffer lsp_servers %{
[ltex-ls-plus]
root_globs = [".git", ".hg", "main.tex"]
[ltex-ls-plus.settings.ltex]
# TODO: write a script where the dictionary is a list of words
# that's read from a file and then output in TOML format.
# This way we can implement adding our own words to this list dynamically
# dictionary = { "en-US" = ["builtin", "Fichtinger", "SonarAuth", "sexpenis" ], "en-CA" = ["more", "words"] }
dictionary = { "en-US" = [] }
[texlab]
root_globs = [".git", ".hg"]
[texlab.settings.texlab]
# See https://github.com/latex-lsp/texlab/wiki/Configuration
#
# Preview configuration for zathura with SyncTeX search.
# For other PDF viewers see https://github.com/latex-lsp/texlab/wiki/Previewing
build.onSave = true
forwardSearch.executable = "zathura"
forwardSearch.args = [
"%p",
"--synctex-forward", # Support texlab-forward-search
"%l:1:%f",
"--synctex-editor-command", # Inverse search: use Control+Left-Mouse-Button to jump to source.
"""
sh -c '
echo "
evaluate-commands -client %%opt{texlab_client} %%{
evaluate-commands -try-client %%opt{jumpclient} %%{
edit -- %%{input} %%{line}
}
}
" | kak -p $kak_session
'
""",
]
}
require-module ltex-dictionary
ltex-dictionary-load
# define-command -docstring 'Add selection to ltex-ls dictionary' ltex-add %{
# set-option buffer lsp_servers %sh{
# printf %s "$kak_opt_lsp_servers" | kak -f "$(printf '<a-s><a-k>dictionary =<ret>s\\[.*\\]<ret><a-i>]_a, "%s"' "$kak_selection")"
# }
# }
declare-filetype-mode latex
map -docstring 'PDF preview (SyncTeX)' buffer latex p ': texlab-forward-search<ret>'
map -docstring 'add selection to ltex dictionary' buffer latex a ': ltex-dictionary-add<ret>'
map -docstring 'refresh ltex dictionary' buffer latex R ': ltex-dictionary-load<ret>'
map -docstring 'edit ltex dictionary' buffer latex E ': ltex-dictionary-edit<ret>'
map -docstring 'texlab build' buffer latex B ': texlab-build<ret>'
try lsp-progress-disable
}
remove-hooks global lsp-filetype-javascript
hook -group lsp-filetype-javascript global BufSetOption filetype=(?:javascript|typescript) %{
set-option buffer lsp_servers %{
[typescript-language-server]
root_globs = ["package.json", "tsconfig.json", "jsconfig.json", ".git", ".hg"]
args = ["--stdio"]
settings_section = "_"
[typescript-language-server.settings._]
# quotePreference = "double"
# typescript.format.semicolons = "insert"
}
}
# use our custom fish-lsp wrapper because it sets env vars
hook -group lsp-filetype-fish global BufSetOption filetype=fish %{
set-option buffer lsp_servers %{
[fish-lsp]
root_globs = [".git"]
args = ["start"]
command = "/home/fic/.config/kak/scripts/fish-lsp.fish"
}
}
remove-hooks global lsp-filetype-markdown
hook -group lsp-filetype-markdown global BufSetOption filetype=markdown %{
set-option buffer lsp_servers %{
[marksman]
root_globs = [".marksman.toml", ".git"]
args = ["server"]
[harper-ls]
root_globs = ["*"]
args = ["--stdio"]
command = "harper-ls"
settings_section = "_"
[harper-ls.settings._.harper-ls]
diagnosticSeverity = "hint"
[harper-ls.settings._.harper-ls.linters]
LongSentences = false
Dashes = false
UnclosedQuotes = false
WrongQuotes = false
}
}
remove-hooks global lsp-filetype-typst
hook -group lsp-filetype-typst global BufSetOption filetype=typst %{
set-option buffer lsp_servers %{
[tinymist]
root_globs = [".git", ".hg"]
args = ["lsp"]
settings_section = "_"
[tinymist.settings._]
# See https://myriad-dreamin.github.io/tinymist/configurations.html
exportPdf = "never"
# exportPdf = "onDocumentHasTitle"
formatterMode = "typstyle"
previewFeature = "disable"
[harper-ls]
root_globs = ["*"]
args = ["--stdio"]
command = "harper-ls"
[harper-ls.settings.harper-ls.linters]
LongSentences = false
}
set-option -add buffer lsp_servers "formatterPrintWidth = %opt{autowrap_column}"
}
remove-hooks global lsp-filetype-toml
hook -group lsp-filetype-toml global BufSetOption filetype=toml %{
set-option buffer lsp_servers %{
[taplo]
root_globs = [".git", ".hg", "."]
args = ["lsp", "stdio"]
}
}
remove-hooks global lsp-filetype-sh
hook -group lsp-filetype-sh global BufSetOption filetype=sh %{
set-option buffer lsp_servers %{
[bash-language-server]
root_globs = [".git", ".hg"]
args = ["start"]
}
}