492 lines
12 KiB
Nix
492 lines
12 KiB
Nix
{
|
|
lib,
|
|
pkgs,
|
|
sources,
|
|
...
|
|
}:
|
|
let
|
|
inherit (lib.attrsets) mapAttrs' nameValuePair;
|
|
|
|
helix = pkgs.helix.overrideAttrs (
|
|
finalAttrs: previousAttrs: {
|
|
version = "25.07.2";
|
|
src = pkgs.fetchzip {
|
|
url = "https://github.com/bloxx12/helix/releases/download/${finalAttrs.version}/helix-${finalAttrs.version}-source.tar.xz";
|
|
hash = "sha256-ZNsQwFfPXe6oewajx1tl68W60kVo7q2SuvTgy/o1HKk=";
|
|
stripRoot = false;
|
|
};
|
|
|
|
doInstallCheck = false;
|
|
|
|
cargoDeps = pkgs.rustPlatform.fetchCargoVendor {
|
|
inherit (helix) src;
|
|
hash = "sha256-3poZSvIrkx8lguxxDeNfngW6+4hH8TV/LHcZx5W5aXg=";
|
|
};
|
|
}
|
|
);
|
|
|
|
helix-with-plugins = pkgs.helix.overrideAttrs (
|
|
finalAttrs: previousAttrs: {
|
|
name = "helix-with-plugins";
|
|
version = "25.07.2";
|
|
src = pkgs.fetchzip {
|
|
url = "https://github.com/bloxx12/helix/releases/download/${finalAttrs.version}/helix-${finalAttrs.version}-source.tar.xz";
|
|
hash = "sha256-ZNsQwFfPXe6oewajx1tl68W60kVo7q2SuvTgy/o1HKk=";
|
|
stripRoot = false;
|
|
};
|
|
|
|
doInstallCheck = false;
|
|
|
|
cargoDeps = pkgs.rustPlatform.fetchCargoVendor {
|
|
inherit (helix) src;
|
|
hash = "sha256-3poZSvIrkx8lguxxDeNfngW6+4hH8TV/LHcZx5W5aXg=";
|
|
};
|
|
postInstall = ''
|
|
mv $out/bin/hx $out/bin/hxp
|
|
'';
|
|
}
|
|
);
|
|
|
|
toml = pkgs.formats.toml { };
|
|
|
|
languages =
|
|
let
|
|
inherit (lib.meta) getExe getExe';
|
|
|
|
nixfmt = pkgs.callPackage "${sources.nixfmt}/default.nix" { };
|
|
|
|
nil = pkgs.rustPlatform.buildRustPackage {
|
|
pname = "nil";
|
|
version = "unstable";
|
|
src = sources.nil;
|
|
cargoLock = {
|
|
lockFile = "${sources.nil}/Cargo.lock";
|
|
allowBuiltinFetchGit = false;
|
|
};
|
|
nativeBuildInputs = [ pkgs.nixVersions.latest ];
|
|
|
|
doInstallCheck = false;
|
|
meta.mainProgram = "nil";
|
|
};
|
|
|
|
new-deadnix = pkgs.deadnix.overrideAttrs (
|
|
finalAttrs: previousAttrs: {
|
|
version = "unstable-15-07-2025";
|
|
src = pkgs.fetchFromGitHub {
|
|
owner = "astro";
|
|
repo = "deadnix";
|
|
rev = "d75457b95d7cfa82fcd60970939f76fccfce19e5";
|
|
hash = "sha256-O/z2neAXL8JNkGosvxC+DyZnnJ8zYP9XHApxHVmlzfY=";
|
|
};
|
|
|
|
doInstallCheck = false;
|
|
|
|
cargoDeps = pkgs.rustPlatform.fetchCargoVendor {
|
|
inherit (new-deadnix) src;
|
|
hash = "sha256-O8yhqyPflOvQXAA19k1XpbrHysgV5VNWLBX0l5Q5GkM=";
|
|
};
|
|
meta.mainProgram = "nil";
|
|
}
|
|
);
|
|
in
|
|
{
|
|
language =
|
|
let
|
|
mark = lang: {
|
|
command = getExe pkgs.deno;
|
|
args = [
|
|
"fmt"
|
|
"-"
|
|
"--ext"
|
|
lang
|
|
];
|
|
};
|
|
in
|
|
[
|
|
{
|
|
name = "bash";
|
|
auto-format = true;
|
|
formatter = {
|
|
command = getExe pkgs.shfmt;
|
|
args = [
|
|
"-i"
|
|
"2"
|
|
];
|
|
};
|
|
}
|
|
{
|
|
name = "clojure";
|
|
injection-regex = "(clojure|clj|edn|boot|yuck)";
|
|
file-types = [
|
|
"clj"
|
|
"cljs"
|
|
"cljc"
|
|
"clje"
|
|
"cljr"
|
|
"cljx"
|
|
"edn"
|
|
"boot"
|
|
"yuck"
|
|
];
|
|
}
|
|
{
|
|
name = "cmake";
|
|
auto-format = true;
|
|
language-servers = [ "cmake-language-server" ];
|
|
formatter = {
|
|
command = getExe pkgs.cmake-format;
|
|
args = [ "-" ];
|
|
};
|
|
}
|
|
{
|
|
name = "javascript";
|
|
auto-format = true;
|
|
language-servers = [
|
|
"dprint"
|
|
"typescript-language-server"
|
|
];
|
|
}
|
|
{
|
|
name = "json";
|
|
formatter = mark "json";
|
|
}
|
|
{
|
|
name = "markdown";
|
|
auto-format = true;
|
|
formatter = mark "md";
|
|
language-servers = [ "taplo" ];
|
|
}
|
|
{
|
|
name = "nix";
|
|
language-servers = [ "nil" ];
|
|
}
|
|
{
|
|
name = "qml";
|
|
language-servers = [ "qmlls" ];
|
|
}
|
|
{
|
|
name = "python";
|
|
auto-format = true;
|
|
language-servers = [
|
|
"basedpyright"
|
|
"ruff"
|
|
];
|
|
}
|
|
{
|
|
name = "typescript";
|
|
auto-format = true;
|
|
language-servers = [
|
|
"dprint"
|
|
"typescript-language-server"
|
|
];
|
|
}
|
|
{
|
|
name = "rust";
|
|
}
|
|
{
|
|
name = "c";
|
|
auto-format = true;
|
|
language-servers = [ "clangd" ];
|
|
}
|
|
{
|
|
name = "zig";
|
|
auto-format = true;
|
|
}
|
|
{
|
|
name = "c";
|
|
}
|
|
];
|
|
|
|
language-server = {
|
|
bash-language-server = {
|
|
command = getExe pkgs.bash-language-server;
|
|
args = [ "start" ];
|
|
};
|
|
|
|
rust-analyzer = {
|
|
command = getExe pkgs.rust-analyzer;
|
|
config.rust-analyzer = {
|
|
checkOnSave.command = "clippy";
|
|
procMacro.enable = true;
|
|
cargo = {
|
|
loadOutDirsFromCheck = true;
|
|
features = "all";
|
|
};
|
|
assist = {
|
|
preferSelf = true;
|
|
};
|
|
check = {
|
|
command = "clippy";
|
|
extraArgs = [
|
|
"--"
|
|
"-W"
|
|
"clippy::pedantic"
|
|
"-W"
|
|
"clippy::nursery"
|
|
"-W"
|
|
"clippy::perf"
|
|
];
|
|
};
|
|
lens = {
|
|
references = true;
|
|
methodReferences = true;
|
|
};
|
|
completion.autoimport.enable = true;
|
|
experimental.procAttrMacros = true;
|
|
interpret.tests = true;
|
|
};
|
|
};
|
|
|
|
clangd = {
|
|
command = "${pkgs.clang-tools}/bin/clangd";
|
|
clangd.fallbackFlags = [ "-std=c++2b" ];
|
|
};
|
|
|
|
cmake-language-server = {
|
|
command = getExe pkgs.cmake-language-server;
|
|
};
|
|
|
|
deno-lsp = {
|
|
command = getExe pkgs.deno;
|
|
args = [ "lsp" ];
|
|
environment.NO_COLOR = "1";
|
|
config.deno = {
|
|
enable = true;
|
|
lint = true;
|
|
unstable = true;
|
|
suggest = {
|
|
completeFunctionCalls = false;
|
|
imports = {
|
|
hosts."https://deno.land" = true;
|
|
};
|
|
};
|
|
inlayHints = {
|
|
enumMemberValues.enabled = true;
|
|
functionLikeReturnTypes.enabled = true;
|
|
parameterNames.enabled = "all";
|
|
parameterTypes.enabled = true;
|
|
propertyDeclarationTypes.enabled = true;
|
|
variableTypes.enabled = true;
|
|
};
|
|
};
|
|
};
|
|
dprint = {
|
|
command = getExe pkgs.dprint;
|
|
args = [ "lsp" ];
|
|
};
|
|
|
|
nil = {
|
|
command = getExe nil;
|
|
config.nil = {
|
|
formatting.command = [ "${getExe nixfmt}" ];
|
|
diagnostics = {
|
|
bindingEndHintMinLines = 3;
|
|
};
|
|
nix.flake = {
|
|
autoArchive = true;
|
|
# autoEvalInputs = true;
|
|
nixpkgsInputName = "nixpkgs";
|
|
};
|
|
};
|
|
};
|
|
deadnix = {
|
|
command = getExe new-deadnix;
|
|
};
|
|
|
|
typescript-language-server = {
|
|
command = getExe pkgs.typescript-language-server;
|
|
args = [ "--stdio" ];
|
|
config = {
|
|
typescript-language-server.source = {
|
|
addMissingImports.ts = true;
|
|
fixAll.ts = true;
|
|
organizeImports.ts = true;
|
|
removeUnusedImports.ts = true;
|
|
sortImports.ts = true;
|
|
};
|
|
};
|
|
};
|
|
ruff = {
|
|
command = getExe pkgs.ruff;
|
|
args = [ "server" ];
|
|
};
|
|
|
|
qmlls = {
|
|
command = getExe' pkgs.kdePackages.qtdeclarative "qmlls";
|
|
args = [ "-E" ];
|
|
};
|
|
basedpyright.command = "${pkgs.basedpyright}/bin/basedpyright-langserver";
|
|
|
|
vscode-css-language-server = {
|
|
command = "${pkgs.vscode-langservers-extracted}/bin/vscode-css-language-server";
|
|
args = [ "--stdio" ];
|
|
config = {
|
|
provideFormatter = true;
|
|
css.validate.enable = true;
|
|
scss.validate.enable = true;
|
|
};
|
|
};
|
|
zls = {
|
|
command = getExe pkgs.zls;
|
|
config = {
|
|
enable_build_on_save = true;
|
|
build_on_save_args = [
|
|
"check"
|
|
"-fincremental"
|
|
"--watch"
|
|
];
|
|
enable_autofix = false;
|
|
warn_style = true;
|
|
highlight_global_var_declarations = true;
|
|
};
|
|
};
|
|
};
|
|
};
|
|
|
|
themes = {
|
|
rose_pine_transparent = {
|
|
inherits = "rose_pine";
|
|
"ui.background" = { };
|
|
};
|
|
rose_pine_dawn_transparent = {
|
|
inherits = "rose_pine_dawn";
|
|
"ui.background" = { };
|
|
};
|
|
nightfox_transparent = {
|
|
inherits = "nightfox";
|
|
"ui.background" = { };
|
|
};
|
|
nord_transparent = {
|
|
inherits = "nord";
|
|
"ui.background" = { };
|
|
};
|
|
};
|
|
|
|
settings = {
|
|
theme = "gruvbox_dark_hard";
|
|
editor = {
|
|
cursorline = true;
|
|
color-modes = true;
|
|
true-color = true;
|
|
indent-guides.render = true;
|
|
lsp = {
|
|
enable = true;
|
|
auto-signature-help = true;
|
|
display-inlay-hints = false;
|
|
display-messages = true;
|
|
snippets = true;
|
|
};
|
|
file-picker = {
|
|
hidden = true;
|
|
};
|
|
line-number = "relative";
|
|
auto-format = true;
|
|
completion-timeout = 5;
|
|
mouse = true;
|
|
bufferline = "multiple";
|
|
soft-wrap.enable = true;
|
|
word-completion = {
|
|
enable = true;
|
|
trigger-length = 2;
|
|
};
|
|
cursor-shape = {
|
|
insert = "bar";
|
|
normal = "block";
|
|
select = "underline";
|
|
};
|
|
statusline = {
|
|
left = [
|
|
"spinner"
|
|
"version-control"
|
|
"diagnostics"
|
|
"file-name"
|
|
];
|
|
right = [
|
|
"file-base-name"
|
|
"file-type"
|
|
"position"
|
|
"file-encoding"
|
|
];
|
|
};
|
|
gutters.layout = [
|
|
"diff"
|
|
"diagnostics"
|
|
"line-numbers"
|
|
"spacer"
|
|
];
|
|
inline-diagnostics = {
|
|
cursor-line = "hint";
|
|
other-lines = "error";
|
|
};
|
|
};
|
|
keys = {
|
|
normal = {
|
|
space = {
|
|
g = [
|
|
":new"
|
|
":buffer-close!"
|
|
":redraw"
|
|
];
|
|
i = ":toggle lsp.display-inlay-hints";
|
|
};
|
|
esc = [
|
|
"collapse_selection"
|
|
"keep_primary_selection"
|
|
"normal_mode"
|
|
];
|
|
A-H = "goto_previous_buffer";
|
|
A-L = "goto_next_buffer";
|
|
A-w = ":buffer-close";
|
|
A-f = ":format";
|
|
A-r = ":reload";
|
|
A-x = "extend_to_line_bounds";
|
|
X = [
|
|
"extend_line_up"
|
|
"extend_to_line_bounds"
|
|
];
|
|
";" = "flip_selections";
|
|
"A-;" = "collapse_selection";
|
|
|
|
# Kakoune-like config
|
|
H = "extend_char_left";
|
|
J = "extend_line_down";
|
|
K = "extend_line_up";
|
|
L = "extend_char_right";
|
|
};
|
|
select = {
|
|
A-x = "extend_to_line_bounds";
|
|
X = [
|
|
"extend_line_up"
|
|
"extend_to_line_bounds"
|
|
];
|
|
g = {
|
|
e = "goto_file_end";
|
|
};
|
|
};
|
|
};
|
|
};
|
|
in
|
|
{
|
|
packages = builtins.attrValues {
|
|
inherit helix;
|
|
inherit (pkgs)
|
|
tinymist
|
|
taplo
|
|
kdlfmt
|
|
gopls
|
|
;
|
|
};
|
|
|
|
files = {
|
|
".config/helix/config.toml".source = toml.generate "helix-config.toml" settings;
|
|
".config/helix/languages.toml".source = toml.generate "helix-languages.toml" languages;
|
|
|
|
}
|
|
// mapAttrs' (
|
|
name: value:
|
|
nameValuePair ".config/helix/themes/${name}.toml" {
|
|
source = toml.generate "helix-theme-${name}.toml" value;
|
|
}
|
|
) themes;
|
|
|
|
}
|