Files
nixos-blueprint/modules/home/programs/editor/helix.nix
2025-06-14 17:26:23 +03:00

188 lines
5.5 KiB
Nix

{
pkgs,
config,
lib,
...
}: let
inherit (lib) mkIf mkEnableOption getExe;
cfg = config.editor.helix;
in {
options = {
editor.helix.enable =
mkEnableOption "enable helix editor";
};
config = mkIf cfg.enable {
programs.helix = {
enable = true; # vim-like editor in rust
defaultEditor = true;
settings = {
editor = {
bufferline = "multiple";
cursorline = true;
inline-diagnostics.cursor-line = "warning";
line-number = "relative";
lsp = {
display-messages = true;
display-inlay-hints = true;
};
cursor-shape = {
insert = "bar";
normal = "block";
select = "underline";
};
statusline = {
left = ["mode" "spinner" "version-control"];
center = ["file-name"];
right = ["diagnostics" "selections" "position" "file-encoding" "file-line-ending" "file-type"];
separator = "|";
};
soft-wrap = {
enable = true;
max-wrap = 25;
max-indent-retain = 0;
wrap-indicator = "";
};
};
keys = {
insert.C-c = "normal_mode";
normal = {
esc = ["collapse_selection" "keep_primary_selection"];
space = {
space = "file_picker";
w = ":w";
q = ":q";
x = ":x";
n = ":n";
"," = "goto_previous_buffer";
"." = "goto_next_buffer";
l = ":reflow";
};
};
};
};
languages = {
language-server = {
# markdown-oxide.command = getExe pkgs.markdown-oxide;
# nixd.command = getExe pkgs.nixd;
# pyright = {
# command = getExe pkgs.pyright;
# args = ["-"];
# };
# rust-analyzer.command = getExe pkgs.rust-analyzer;
# texlab.command = getExe pkgs.texlab;
bash-language-server = {
command = getExe pkgs.bash-language-server;
environment = {
"SHELLCHECK_PATH" = getExe pkgs.shellcheck;
"SHFMT_PATH" = getExe pkgs.shfmt;
};
};
clangd.command = "${pkgs.clang-tools}/bin/clangd";
fsac = {
command = getExe pkgs.fsautocomplete;
config = {
# editor.formatOnSave = true;
AutomaticWorkspaceInit = true;
FSharp.ExternalAutocomplete = true;
FSharp.linting.fsharplint.enabled = true;
FSharp.linting.fsharplint.configFile = "fsharplint.json";
FSharp.formatting.fantomas.enabled = true;
};
};
nil = {
command = getExe pkgs.nil;
config = {
formatting.command = [(getExe pkgs.alejandra)];
};
};
ruff = {
command = getExe pkgs.ruff;
args = ["server"];
};
tinymist.command = getExe pkgs.tinymist;
vscode-json-language-server.command = getExe pkgs.nodePackages.vscode-json-languageserver;
yaml-language-server.command = getExe pkgs.yaml-language-server;
zk = {
command = getExe pkgs.zk;
args = ["lsp"];
};
};
language = [
{
name = "nix";
auto-format = true;
language-servers = ["nil"];
}
{
name = "typst";
auto-format = true;
formatter.command = getExe pkgs.typstyle;
language-servers = ["tinymist"];
}
{
name = "markdown";
# auto-format = true;
language-servers = ["zk" "markdown-oxide"];
}
{
name = "c";
auto-format = true;
# formatter.command = "${pkgs.clang-tools}/bin/clang-format";
}
{
name = "cpp";
auto-format = true;
# formatter.command = "${pkgs.clang-tools}/bin/clang-format";
}
{
name = "fsharp";
auto-format = true;
language-servers = ["fsac"];
scope = "source.fs";
roots = ["fsproj" "sln" ".git"];
}
# {
# name = "rust";
# auto-format = true;
# language-servers = ["rust-analyzer"];
# formatter.command = getExe pkgs.rustfmt;
# }
{
name = "json";
auto-format = true;
formatter.command = getExe pkgs.jq;
language-servers = ["vscode-json-language-server"];
}
{
name = "yaml";
auto-format = true;
formatter.command = getExe pkgs.yamlfmt;
formatter.args = ["-"];
language-servers = ["yaml-language-server"];
}
{
name = "bash";
auto-format = true;
# formatter.command = getExe pkgs.shfmt;
# formatter.args = ["-"];
}
{
name = "python";
auto-format = true;
language-servers = [
{
name = "ruff";
# only-features = ["format" "diagnostics"];
}
# {
# name = "pyright";
# except-features = ["format" "diagnostics"];
# }
];
}
];
};
};
};
}