From 1e493b9ce61b019052081da46612ac36301bc575 Mon Sep 17 00:00:00 2001 From: jolheiser Date: Wed, 20 Sep 2023 23:48:43 -0500 Subject: [PATCH] initial commit Signed-off-by: jolheiser --- config.nix | 226 +++++++++++++++++++++++++++++++++++++++++++++++++++++ flake.lock | 27 +++++++ flake.nix | 101 ++++++++++++++++++++++++ justfile | 3 + 4 files changed, 357 insertions(+) create mode 100644 config.nix create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 justfile diff --git a/config.nix b/config.nix new file mode 100644 index 0000000..97fa333 --- /dev/null +++ b/config.nix @@ -0,0 +1,226 @@ +{pkgs ? import {}}: { + settings = { + theme = "catppuccin_mocha_transparent"; + editor = { + line-number = "relative"; + mouse = false; + bufferline = "always"; + color-modes = true; + cursor-shape = { + insert = "bar"; + normal = "block"; + select = "underline"; + }; + file-picker = {hidden = false;}; + indent-guides = { + render = true; + skip-levels = 1; + }; + soft-wrap = {enable = true;}; + statusline = { + right = [ + "version-control" + "diagnostics" + "selections" + "position" + "file-encoding" + ]; + }; + lsp = {display-messages = true;}; + }; + keys = { + normal = { + space = { + q = ":quit"; + Q = ":quit!"; + w = ":write"; + W = ":write!"; + }; + C-c = ":config-open"; + C-r = ":config-reload"; + "C-/" = "toggle_comments"; + S-right = "goto_next_buffer"; + S-left = "goto_previous_buffer"; + C-b = ":buffer-close"; + C-s = ["select_all" "select_regex"]; + + C-j = "shrink_selection"; + C-k = "expand_selection"; + C-l = "select_next_sibling"; + C-a = "select_all"; + C-u = ["half_page_up" "align_view_center"]; + C-d = ["half_page_down" "align_view_center"]; + + "{" = ["goto_prev_paragraph" "collapse_selection"]; + "}" = ["goto_next_paragraph" "collapse_selection"]; + "0" = "goto_line_start"; + "$" = "goto_line_end"; + "^" = "goto_first_nonwhitespace"; + G = "goto_file_end"; + "%" = "match_brackets"; + V = ["select_mode" "extend_to_line_bounds"]; + C = ["collapse_selection" "extend_to_line_end" "change_selection"]; + D = ["extend_to_line_end" "delete_selection"]; + S = "surround_add"; + + d = { + d = ["extend_to_line_bounds" "delete_selection"]; + t = ["extend_till_char"]; + s = ["surround_delete"]; + i = ["select_textobject_inner"]; + a = ["select_textobject_around"]; + }; + + x = "delete_selection"; + p = "paste_clipboard_after"; + P = "paste_clipboard_before"; + y = [ + "yank_main_selection_to_clipboard" + "normal_mode" + "flip_selections" + "collapse_selection" + ]; + Y = [ + "extend_to_line_bounds" + "yank_main_selection_to_clipboard" + "goto_line_start" + "collapse_selection" + ]; + + w = ["move_next_word_start" "move_char_right" "collapse_selection"]; + e = ["move_next_word_end" "collapse_selection"]; + b = ["move_prev_word_start" "collapse_selection"]; + + i = ["insert_mode" "collapse_selection"]; + a = ["append_mode" "collapse_selection"]; + + esc = ["collapse_selection" "keep_primary_selection"]; + }; + insert = {esc = ["collapse_selection" "normal_mode"];}; + select = { + space = { + j = { + e = ":pipe jq"; + c = ":pipe jq -c"; + }; + }; + "{" = ["extend_to_line_bounds" "goto_prev_paragraph"]; + "}" = ["extend_to_line_bounds" "goto_next_paragraph"]; + "0" = "goto_line_start"; + "$" = "goto_line_end"; + "^" = "goto_first_nonwhitespace"; + G = "goto_file_end"; + D = ["extend_to_line_bounds" "delete_selection" "normal_mode"]; + C = ["goto_line_start" "extend_to_line_bounds" "change_selection"]; + "%" = "match_brackets"; + S = "surround_add"; + + i = "select_textobject_inner"; + a = "select_textobject_around"; + + tab = ["insert_mode" "collapse_selection"]; + C-a = ["append_mode" "collapse_selection"]; + + k = ["extend_line_up" "extend_to_line_bounds"]; + j = ["extend_line_down" "extend_to_line_bounds"]; + + d = ["yank_main_selection_to_clipboard" "delete_selection"]; + x = ["yank_main_selection_to_clipboard" "delete_selection"]; + y = [ + "yank_main_selection_to_clipboard" + "normal_mode" + "flip_selections" + "collapse_selection" + ]; + Y = [ + "extend_to_line_bounds" + "yank_main_selection_to_clipboard" + "goto_line_start" + "collapse_selection" + "normal_mode" + ]; + p = "replace_selections_with_clipboard"; + P = "paste_clipboard_before"; + + esc = ["collapse_selection" "keep_primary_selection" "normal_mode"]; + }; + }; + }; + languages = with pkgs; { + language = [ + { + name = "go"; + formatter = { + command = "${gofumpt}/bin/gofumpt"; + }; + } + { + name = "lua"; + formatter = with nodePackages; { + command = "${lua-fmt}/bin/luafmt"; + args = ["--stdin"]; + }; + } + { + name = "python"; + auto-format = true; + formatter = with python311Packages; { + command = "${black}/bin/black"; + args = ["--quiet" "-"]; + }; + } + { + name = "nix"; + auto-format = true; + formatter = { + command = "${alejandra}/bin/alejandra"; + args = ["-qq"]; + }; + } + { + name = "templ"; + auto-format = true; + scope = "source.templ"; + injection-regex = "templ"; + file-types = ["templ"]; + roots = ["go.mod"]; + comment-token = "//"; + language-server = { + command = "templ"; + args = ["lsp"]; + }; + formatter = { + command = "templ"; + args = ["fmt"]; + }; + } + ]; + }; + themes = { + catppuccin_frappe_transparent = { + inherits = "catppuccin_frappe"; + "ui.background" = {}; + }; + catppuccin_latte_transparent = { + inherits = "catppuccin_latte"; + "ui.background" = {}; + }; + catppuccin_macchiato_transparent = { + inherits = "catppuccin_macchiato"; + "ui.background" = {}; + }; + catppuccin_mocha_transparent = { + inherits = "catppuccin_mocha"; + "ui.background" = {}; + }; + }; + grammars = [ + { + name = "templ"; + url = "https://github.com/vrischmann/tree-sitter-templ"; + rev = "9f63037ad08a58050d0582ef1ae0009bd0fbf2f1"; + sha256 = "sha256-AGZm2D8rW08gMyZ8dSZyAgqgyl/lKiZxBOFDPX0LY4I="; + queries = "queries/templ"; + } + ]; +} diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..b15aaed --- /dev/null +++ b/flake.lock @@ -0,0 +1,27 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1694948089, + "narHash": "sha256-d2B282GmQ9o8klc22/Rbbbj6r99EnELQpOQjWMyv0rU=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "5148520bfab61f99fd25fb9ff7bfbb50dad3c9db", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..74f7d6a --- /dev/null +++ b/flake.nix @@ -0,0 +1,101 @@ +{ + description = "jolheiser helix derivation"; + + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; + }; + + outputs = { + self, + nixpkgs, + }: let + pkgs = nixpkgs.legacyPackages.x86_64-linux; + tomlFormat = pkgs.formats.toml {}; + config = import ./config.nix {pkgs = pkgs;}; + buildGrammar = grammar: let + source = pkgs.fetchgit { + inherit (grammar) url rev sha256; + }; + linkQueries = pkgs.lib.optionalString (builtins.hasAttr "queries" grammar) "cp -r ${source}/${grammar.queries} $out/queries"; + in + pkgs.stdenv.mkDerivation { + pname = "helix-tree-sitter-grammar-${grammar.name}"; + version = grammar.rev; + buildInputs = [pkgs.helix pkgs.git]; + src = source; + buildPhase = '' + runHook preBuild + + mkdir .helix + cat << EOF > .helix/languages.toml + use-grammars = { only = ["templ"] } + [[grammar]] + name = "${grammar.name}" + source = { git = "${grammar.url}", rev = "${grammar.rev}" } + EOF + + mkdir -p runtime/grammars/sources + cp -r ${source} runtime/grammars/sources/${grammar.name} + export CARGO_MANIFEST_DIR=$(pwd)/.helix + + #hx -g fetch + hx -g build + + mkdir $out + cp runtime/grammars/${grammar.name}.so $out/${grammar.name}.so + ${linkQueries} + + runHook postBuild + ''; + }; + builtGrammars = + builtins.map (grammar: { + inherit (grammar) name; + artifact = buildGrammar grammar; + }) + config.grammars; + configFile = pkgs.writeText "config.toml" (builtins.readFile (tomlFormat.generate "helix-config" config.settings)); + languageFile = pkgs.writeText "languages.toml" (builtins.readFile (tomlFormat.generate "helix-languages" config.languages)); + themeFiles = + pkgs.lib.mapAttrsToList ( + name: value: { + inherit name; + file = pkgs.writeText "${name}.toml" (builtins.readFile (tomlFormat.generate "helix-theme-${name}" value)); + } + ) + config.themes; + themeLinks = builtins.map (theme: "ln -s ${theme.file} $out/home/helix/themes/${theme.name}.toml") themeFiles; + grammarLinks = builtins.map (grammar: "ln -s ${grammar.artifact}/${grammar.name}.so $out/lib/runtime/grammars/${grammar.name}.so") builtGrammars; + queryLinks = builtins.map (grammar: "ln -s ${grammar.artifact}/queries $out/lib/runtime/queries/${grammar.name}") builtGrammars; + in { + packages.x86_64-linux.default = + pkgs.runCommand "jolheiser-helix" { + buildInputs = [pkgs.makeWrapper]; + } '' + mkdir $out + ln -s ${pkgs.helix}/* $out + rm $out/bin + + rm $out/lib + mkdir -p $out/lib/runtime + ln -s ${pkgs.helix}/lib/runtime/* $out/lib/runtime + + rm $out/lib/runtime/grammars + mkdir $out/lib/runtime/grammars + ln -s ${pkgs.helix}/lib/runtime/grammars/* $out/lib/runtime/grammars + ${builtins.concatStringsSep "\n" grammarLinks} + + rm $out/lib/runtime/queries + mkdir $out/lib/runtime/queries + ln -s ${pkgs.helix}/lib/runtime/queries/* $out/lib/runtime/queries + ${builtins.concatStringsSep "\n" queryLinks} + + mkdir -p $out/home/helix/themes + ln -s ${configFile} $out/home/helix/config.toml + ln -s ${languageFile} $out/home/helix/languages.toml + ${builtins.concatStringsSep "\n" themeLinks} + + makeWrapper ${pkgs.helix}/bin/.hx-wrapped $out/bin/hx --set HELIX_RUNTIME $out/lib/runtime --set XDG_CONFIG_HOME $out/home + ''; + }; +} diff --git a/justfile b/justfile new file mode 100644 index 0000000..8f92f5e --- /dev/null +++ b/justfile @@ -0,0 +1,3 @@ +build: + @git add . + @nix build