Compare commits

..

No commits in common. "fb1652d82b8014fd4f492f8567602d4b0b6b786d" and "526ed059dbc6604003b85185ffd08b4ccb476f7a" have entirely different histories.

3 changed files with 168 additions and 198 deletions

View file

@ -11,55 +11,16 @@ let
kak-lsp-frontend = { pkgs, lib, ... }: kak-lsp-frontend = { pkgs, lib, ... }:
let let
langserver = name: { langserver = name: {
name = "vscode-${name}-language-server";
value = {
args = [ "--stdio" ];
command = "${pkgs.nodePackages.vscode-langservers-extracted}/bin/vscode-${name}-language-server";
filetypes = [ name ];
roots = [ "package.json" ".git" ];
};
};
tailwind = {
command = "tailwindcss-language-server";
args = [ "--stdio" ]; args = [ "--stdio" ];
filetypes = [ "html" "css" "javascript" "typescript" "templ" ]; command = "${pkgs.nodePackages.vscode-langservers-extracted}/bin/vscode-${name}-language-server";
roots = [ "tailwind.config.{js,cjs,mjs,ts}" "package.json" ".git" ]; filetypes = [ name ];
settings_section = "tailwindCSS"; roots = [ "package.json" ".git" ];
settings.tailwindCSS = {
validate = "warning";
userLanguages.templ = "html";
};
}; };
templModule = { pkgs, lib, ... }: {
programs.kak-lsp.languageServers."vscode-html-language-server".filetypes = [ "templ" ];
programs.kak-lsp.languageServers."tailwindcss-language-server".filetypes = [ "templ" ];
programs.kak-lsp.languageServers.templ = {
command = "templ";
args = [ "lsp" ];
filetypes = [ "templ" ];
roots = [ "go.mod" ".git" ];
};
home.packages = [ pkgs.unstable.templ ];
};
in in
{ {
imports = [ templModule ]; programs.kak-lsp.languages = lib.attrsets.genAttrs [ "html" "css" "json" ] langserver;
programs.kak-lsp.languageServers = (builtins.listToAttrs (map langserver [ "html" "css" "json" ])) // {
tailwindcss-language-server = tailwind;
};
home.packages = with pkgs; [
nodePackages.vscode-langservers-extracted
tailwindcss-language-server
];
}; };
in in
{ {
imports = [ ../modules/programs/my-kakoune ./kaktex.nix kak-lsp-frontend ]; imports = [ ../modules/programs/my-kakoune ./kaktex.nix kak-lsp-frontend ];
@ -93,13 +54,13 @@ in
{ face = "ts_markup_italic"; token = "text"; modifiers = [ "emph" ]; } { face = "ts_markup_italic"; token = "text"; modifiers = [ "emph" ]; }
]; ];
programs.kak-lsp.languageServers.typescript-language-server = { programs.kak-lsp.languages.typescript = {
args = [ "--stdio" ]; args = [ "--stdio" ];
command = "typescript-language-server"; command = "typescript-language-server";
filetypes = [ "typescript" ]; filetypes = [ "typescript" ];
roots = [ "package.json" ]; roots = [ "package.json" ];
}; };
programs.kak-lsp.languageServers.fsautocomplete = { programs.kak-lsp.languages.fsharp = {
args = [ "--adaptive-lsp-server-enabled" "--project-graph-enabled" "--source-text-factory" "RoslynSourceText" ]; args = [ "--adaptive-lsp-server-enabled" "--project-graph-enabled" "--source-text-factory" "RoslynSourceText" ];
command = "fsautocomplete"; command = "fsautocomplete";
filetypes = [ "fsharp" ]; filetypes = [ "fsharp" ];
@ -109,7 +70,7 @@ in
AutomaticWorkspaceInit = true; AutomaticWorkspaceInit = true;
}; };
}; };
programs.kak-lsp.languageServers.metals = { programs.kak-lsp.languages.scala = {
command = "metals"; command = "metals";
filetypes = [ "scala" ]; filetypes = [ "scala" ];
roots = [ "build.sbt" "build.sc" ]; roots = [ "build.sbt" "build.sc" ];
@ -119,14 +80,9 @@ in
showInferredType = true; showInferredType = true;
decorationProvider = true; decorationProvider = true;
inlineDecorationProvider = true; inlineDecorationProvider = true;
# From kakoune-lsp's own options
icons = "unicode";
isHttpEnabled = true;
statusBarProvider = "log-message";
compilerOptions = { overrideDefFormat = "unicode"; };
}; };
}; };
programs.kak-lsp.languageServers.texlab = { programs.kak-lsp.languages.latex = {
command = "texlab"; command = "texlab";
filetypes = [ "latex" ]; filetypes = [ "latex" ];
roots = [ "main.tex" "all.tex" ".git" ]; roots = [ "main.tex" "all.tex" ".git" ];
@ -149,7 +105,7 @@ in
}); });
}; };
}; };
programs.kak-lsp.languageServers.typst-lsp = { programs.kak-lsp.languages.typst = {
command = "typst-lsp"; command = "typst-lsp";
filetypes = [ "typst" ]; filetypes = [ "typst" ];
roots = [ "main.typ" ".git" ]; roots = [ "main.typ" ".git" ];
@ -158,7 +114,7 @@ in
experimentalFormatterMode = "on"; experimentalFormatterMode = "on";
}; };
}; };
programs.kak-lsp.languageServers.marksman = { programs.kak-lsp.languages.markdown = {
command = "marksman"; command = "marksman";
filetypes = [ "markdown" ]; filetypes = [ "markdown" ];
roots = [ ".marksman.toml" ".git" ]; roots = [ ".marksman.toml" ".git" ];
@ -180,115 +136,66 @@ in
conditional = "keyword_conditional"; conditional = "keyword_conditional";
include = "keyword_control_import"; include = "keyword_control_import";
}; };
programs.my-kakoune.tree-sitter.languages = programs.my-kakoune.tree-sitter.languages = {
let scala =
tree-sitter-go = pkgs.fetchFromGitHub { let
owner = "tree-sitter"; src = pkgs.fetchFromGitHub {
repo = "tree-sitter-go"; owner = "tree-sitter";
rev = "v0.20.0"; repo = "tree-sitter-scala";
hash = "sha256-XUSXOTqUySShJ7gebnhObwaFllfIxEYIHN70/wpiJdw="; rev = "70afdd5632d57dd63a960972ab25945e353a52f6";
leaveDotGit = true; hash =
}; if pkgs.stdenv.isDarwin
in then lib.fakeHash
{ else "sha256-Q8KSI8H7+d/sUdSlcNAiOPn2THKk7SFqC3U7rLqSqtE=";
scala =
let
src = pkgs.fetchFromGitHub {
owner = "tree-sitter";
repo = "tree-sitter-scala";
rev = "70afdd5632d57dd63a960972ab25945e353a52f6";
hash =
if pkgs.stdenv.isDarwin
then lib.fakeHash
else "sha256-Q8KSI8H7+d/sUdSlcNAiOPn2THKk7SFqC3U7rLqSqtE=";
leaveDotGit = true;
};
in
{
grammar.src = src;
queries.src = src;
queries.path = "queries/scala";
};
haskell =
let
src = pkgs.fetchFromGitHub {
owner = "tree-sitter";
repo = "tree-sitter-haskell";
rev = "ba0bfb0e5d8e9e31c160d287878c6f26add3ec08";
sha256 =
if pkgs.stdenv.isDarwin
then "sha256-lW3E4gSZV/m2RfofUqeiCu8KDz06YEvXbYKs8smXFi4="
else "sha256-H5Z4vPTZCFxDCWguOB8oVSGPJyQonrD8FWAQZTYPG2U=";
leaveDotGit = true;
};
in
{
grammar.src = src;
grammar.compile.args = [ "-c" "-fpic" "../parser.c" "../scanner.c" "../unicode.h" "-I" ".." ];
queries.src = src;
queries.path = "queries";
};
yaml = {
grammar.src = pkgs.fetchFromGitHub {
owner = "ikatyang";
repo = "tree-sitter-yaml";
rev = "0e36bed171768908f331ff7dff9d956bae016efb";
hash = "sha256-rN/a8dYffDQNuvnhNp/nfu0AzhYrR1ESACQbQWb/n5w=";
leaveDotGit = true; leaveDotGit = true;
}; };
grammar.compile.args = [ "-c" "-fpic" "../scanner.cc" "../parser.c" "-I" ".." ]; in
grammar.link.args = [ "-shared" "-fpic" "scanner.o" "parser.o" ]; {
grammar.link.flags = [ "-O3" "-lstdc++" ]; grammar.src = src;
queries.src = src;
queries.src = pkgs.fetchFromGitHub { queries.path = "queries/scala";
owner = "helix-editor"; };
repo = "helix"; haskell =
rev = "dbd248fdfa680373d94fbc10094a160aafa0f7a7"; let
hash = "sha256-dv/T8ROXmwEdjM71gza1RzF2HoINA7Zl2jmz63kCZyQ="; src = pkgs.fetchFromGitHub {
owner = "tree-sitter";
repo = "tree-sitter-haskell";
rev = "ba0bfb0e5d8e9e31c160d287878c6f26add3ec08";
sha256 =
if pkgs.stdenv.isDarwin
then "sha256-lW3E4gSZV/m2RfofUqeiCu8KDz06YEvXbYKs8smXFi4="
else "sha256-H5Z4vPTZCFxDCWguOB8oVSGPJyQonrD8FWAQZTYPG2U=";
leaveDotGit = true; leaveDotGit = true;
}; };
queries.path = "runtime/queries/yaml"; in
}; {
grammar.src = src;
templ = grammar.compile.args = [ "-c" "-fpic" "../parser.c" "../scanner.c" "../unicode.h" "-I" ".." ];
let queries.src = src;
src = pkgs.fetchFromGitHub {
owner = "vrischmann";
repo = "tree-sitter-templ";
rev = "044ad200092170727650fa6d368df66a8da98f9d";
hash = "sha256-umhemFnz/nLzkJk75wMoMAHT+Zs9MYOqWPoYQwoFu74=";
leaveDotGit = true;
};
in
{
grammar.src = src;
queries.src = pkgs.runCommandLocal "templ-tree-sitter-queries" { } ''
mkdir -p queries
# copy most stuff from tree-sitter-templ
install -m644 ${src}/queries/templ/* queries
# override inherited files
cat ${tree-sitter-go}/queries/highlights.scm ${src}/queries/templ/highlights.scm > queries/highlights.scm
mkdir -p $out/queries
cp -r queries $out/queries/templ
cd $out
${lib.getExe pkgs.git} init
${lib.getExe pkgs.git} config user.email "a@b.com"
${lib.getExe pkgs.git} config user.name "a"
${lib.getExe pkgs.git} add .
${lib.getExe pkgs.git} commit -m "Just making a git commit"
'';
queries.path = "queries/templ";
};
go = {
grammar.src = tree-sitter-go;
grammar.compile.args = [ "-c" "-fpic" "../parser.c" "-I" ".." ];
grammar.link.args = [ "-shared" "-fpic" "parser.o" ];
queries.src = tree-sitter-go;
queries.path = "queries"; queries.path = "queries";
}; };
yaml = {
grammar.src = pkgs.fetchFromGitHub {
owner = "ikatyang";
repo = "tree-sitter-yaml";
rev = "0e36bed171768908f331ff7dff9d956bae016efb";
hash = "sha256-rN/a8dYffDQNuvnhNp/nfu0AzhYrR1ESACQbQWb/n5w=";
leaveDotGit = true;
};
grammar.compile.args = [ "-c" "-fpic" "../scanner.cc" "../parser.c" "-I" ".." ];
grammar.link.args = [ "-shared" "-fpic" "scanner.o" "parser.o" ];
grammar.link.flags = [ "-O3" "-lstdc++" ];
queries.src = pkgs.fetchFromGitHub {
owner = "helix-editor";
repo = "helix";
rev = "dbd248fdfa680373d94fbc10094a160aafa0f7a7";
hash = "sha256-dv/T8ROXmwEdjM71gza1RzF2HoINA7Zl2jmz63kCZyQ=";
leaveDotGit = true;
};
queries.path = "runtime/queries/yaml";
}; };
};
programs.my-kakoune.package = pkgs.kakoune; programs.my-kakoune.package = pkgs.kakoune;
programs.my-kakoune.rc = programs.my-kakoune.rc =

View file

@ -90,7 +90,7 @@ hook global InsertCompletionHide .* %{
try %{ try %{
eval %sh{test -z "$WE_STARTED_KAK" && kak-lsp --kakoune -s $kak_session} eval %sh{test -z "$WE_STARTED_KAK" && kak-lsp --kakoune -s $kak_session}
} }
hook global WinSetOption filetype=(racket|rust|python|go|javascript|typescript|c|cpp|tex|latex|fsharp|ocaml|haskell|nix|scala|typst|html|css|json|markdown|templ) %{ hook global WinSetOption filetype=(racket|rust|python|go|javascript|typescript|c|cpp|tex|latex|fsharp|ocaml|haskell|nix|scala|typst|html|css|json|markdown) %{
lsp-enable-window lsp-enable-window
map window lsp N -docstring "Display the next message request" ": lsp-show-message-request-next<ret>" map window lsp N -docstring "Display the next message request" ": lsp-show-message-request-next<ret>"
map window normal <c-l> ": enter-user-mode lsp<ret>" map window normal <c-l> ": enter-user-mode lsp<ret>"
@ -98,16 +98,9 @@ hook global WinSetOption filetype=(racket|rust|python|go|javascript|typescript|c
map window normal <c-s-h> ": lsp-hover-buffer<ret>" map window normal <c-s-h> ": lsp-hover-buffer<ret>"
# lsp-auto-hover-insert-mode-enable # lsp-auto-hover-insert-mode-enable
set window lsp_hover_anchor true set window lsp_hover_anchor true
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'
} }
hook global WinSetOption filetype=(racket|rust|python|go|javascript|typescript|c|cpp|tex|latex|haskell|nix|fsharp|templ) %{ hook global WinSetOption filetype=(racket|rust|python|go|javascript|typescript|c|cpp|tex|latex|haskell|nix|fsharp) %{
# Format the document if possible # Format the document if possible
hook window BufWritePre .* %{ lsp-formatting-sync } hook window BufWritePre .* %{ lsp-formatting-sync }
} }
@ -213,11 +206,6 @@ hook global BufCreate .*[.]typ %{
add-highlighter buffer/ wrap add-highlighter buffer/ wrap
} }
hook global BufCreate .*[.]templ %{
set-option buffer filetype templ
set-option window comment_line "//"
}
hook global BufOpenFile .* %{ hook global BufOpenFile .* %{
modeline-parse modeline-parse
} }

View file

@ -4,23 +4,52 @@ with lib;
let let
lspConfig = lspConfig =
{ {
language_ids = { languages = {
c = "c_cpp"; bash = {
cpp = "c_cpp"; args = [ "start" ];
javascript = "javascriptreact"; command = "bash-language-server";
typescript = "typescriptreact"; filetypes = [ "sh" ];
protobuf = "proto"; roots = [ ".git" ".hg" ];
sh = "shellscript"; };
}; c_cpp = {
language_servers = {
ccls = {
args = [ "-v=2" "-log-file=/tmp/ccls.log" ]; args = [ "-v=2" "-log-file=/tmp/ccls.log" ];
command = "ccls"; command = "ccls";
filetypes = [ "c" "cpp" ]; filetypes = [ "c" "cpp" ];
roots = [ "compile_commands.json" ".cquery" ".git" ]; roots = [ "compile_commands.json" ".cquery" ".git" ];
}; };
gopls = { crystal = {
command = "scry";
filetypes = [ "crystal" ];
roots = [ "shard.yml" ];
};
css = {
args = [ "--stdio" ];
command = "css-languageserver";
filetypes = [ "css" ];
roots = [ "package.json" ];
};
d = {
command = "dls";
filetypes = [ "d" "di" ];
roots = [ ".git" "dub.sdl" "dub.json" ];
};
dart = {
command = "dart_language_server";
filetypes = [ "dart" ];
roots = [ "pubspec.yaml" ".git" ];
};
elm = {
args = [ "--stdio" ];
command = "elm-language-server";
filetypes = [ "elm" ];
roots = [ "elm.json" ];
};
fsharp = {
command = "FSharpLanguageServer";
filetypes = [ "fsharp" ];
roots = [ ".git" "*.fsx" ];
};
go = {
command = "gopls"; command = "gopls";
filetypes = [ "go" ]; filetypes = [ "go" ];
offset_encoding = "utf-8"; offset_encoding = "utf-8";
@ -28,14 +57,32 @@ let
settings = { gopls = { hoverKind = "SynopsisDocumentation"; semanticTokens = true; }; }; settings = { gopls = { hoverKind = "SynopsisDocumentation"; semanticTokens = true; }; };
settings_section = "gopls"; settings_section = "gopls";
}; };
haskell-language-server = { haskell = {
args = [ "--lsp" ]; args = [ "--lsp" ];
command = "haskell-language-server-wrapper"; command = "haskell-language-server-wrapper";
filetypes = [ "haskell" ]; filetypes = [ "haskell" ];
roots = [ "Setup.hs" "stack.yaml" "*.cabal" "package.yaml" ]; roots = [ "Setup.hs" "stack.yaml" "*.cabal" "package.yaml" ];
settings_section = "haskell"; settings_section = "haskell";
}; };
texlab = { html = {
args = [ "--stdio" ];
command = "html-languageserver";
filetypes = [ "html" ];
roots = [ "package.json" ];
};
javascript = {
args = [ "lsp" ];
command = "flow";
filetypes = [ "javascript" ];
roots = [ ".flowconfig" ];
};
json = {
args = [ "--stdio" ];
command = "json-languageserver";
filetypes = [ "json" ];
roots = [ "package.json" ];
};
latex = {
command = "texlab"; command = "texlab";
filetypes = [ "latex" ]; filetypes = [ "latex" ];
roots = [ ".git" "main.tex" "all.tex" ]; roots = [ ".git" "main.tex" "all.tex" ];
@ -53,7 +100,12 @@ let
}; };
}; };
}; };
nil = { nim = {
command = "nimlsp";
filetypes = [ "nim" ];
roots = [ "*.nimble" ".git" ];
};
nix = {
command = "${pkgs.nil}/bin/nil"; command = "${pkgs.nil}/bin/nil";
filetypes = [ "nix" ]; filetypes = [ "nix" ];
roots = [ "flake.nix" "shell.nix" ".git" ]; roots = [ "flake.nix" "shell.nix" ".git" ];
@ -61,13 +113,43 @@ let
formatting.command = [ "${getExe pkgs.nixpkgs-fmt}" ]; formatting.command = [ "${getExe pkgs.nixpkgs-fmt}" ];
}; };
}; };
pyls = { ocaml = {
args = [ ];
command = "ocamllsp";
filetypes = [ "ocaml" ];
roots = [ "Makefile" "opam" "*.opam" "dune" ".merlin" ".ocamlformat" ];
};
php = {
args = [ "--stdio" ];
command = "intelephense";
filetypes = [ "php" ];
roots = [ ".htaccess" "composer.json" ];
};
python = {
command = "pyls"; command = "pyls";
filetypes = [ "python" ]; filetypes = [ "python" ];
offset_encoding = "utf-8"; offset_encoding = "utf-8";
roots = [ "requirements.txt" "setup.py" ".git" ".hg" ]; roots = [ "requirements.txt" "setup.py" ".git" ".hg" ];
}; };
rust-analyzer = { racket = {
args = [ "-l" "racket-langserver" ];
command = "racket";
filetypes = [ "racket" ];
roots = [ ".git" ];
};
reason = {
args = [ "--stdio" ];
command = "ocaml-language-server";
filetypes = [ "reason" ];
roots = [ "package.json" "Makefile" ".git" ".hg" ];
};
ruby = {
args = [ "stdio" ];
command = "solargraph";
filetypes = [ "ruby" ];
roots = [ "Gemfile" ];
};
rust = {
args = [ ]; args = [ ];
command = "rust-analyzer"; command = "rust-analyzer";
filetypes = [ "rust" ]; filetypes = [ "rust" ];
@ -109,7 +191,7 @@ let
verbosity = 255; verbosity = 255;
}; };
languageServerOption = types.submodule { languageOption = types.submodule {
options = { options = {
filetypes = mkOption { filetypes = mkOption {
type = types.listOf types.str; type = types.listOf types.str;
@ -180,17 +262,11 @@ in
description = "Server timeout"; description = "Server timeout";
}; };
languageServers = mkOption { languages = mkOption {
type = types.attrsOf languageServerOption; type = types.attrsOf languageOption;
default = { }; default = { };
description = "The language options"; description = "The language options";
}; };
languageIds = mkOption {
type = types.attrsOf types.str;
default = { };
description = "Language IDs to be sent to the LSP";
};
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
@ -210,8 +286,7 @@ in
server.timeout = cfg.serverTimeout; server.timeout = cfg.serverTimeout;
snippet_support = cfg.enableSnippets; snippet_support = cfg.enableSnippets;
verbosity = 255; verbosity = 255;
language_server = lspConfig.language_servers // cfg.languageServers; language = lspConfig.languages // cfg.languages;
language_ids = lspConfig.language_ids // cfg.languageIds;
}) })
} \ } \
> $out > $out