Compare commits
2
Commits
66714d0675
...
2ea3058215
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2ea3058215 | ||
|
|
2423b09caa |
No files matched your search
@@ -5,6 +5,7 @@
|
|||||||
./user/sleepMode.nix
|
./user/sleepMode.nix
|
||||||
./user/ghostty.nix
|
./user/ghostty.nix
|
||||||
./user/qt.nix
|
./user/qt.nix
|
||||||
|
./user/helix.nix
|
||||||
./user/zed-idea.nix
|
./user/zed-idea.nix
|
||||||
./user/walker.nix
|
./user/walker.nix
|
||||||
./user/btop.nix
|
./user/btop.nix
|
||||||
|
|||||||
@@ -0,0 +1,193 @@
|
|||||||
|
{ inputs, pkgs, lib, config, ... }: let
|
||||||
|
# glibc >= 2.44 defines bsearch() as a C23 const-generic macro, which clashes
|
||||||
|
# with the copy vendored by some tree-sitter grammars (tree-sitter-perl).
|
||||||
|
# Drop the vendored implementation, same as nixpkgs does for upstream helix.
|
||||||
|
patchedStdenv = pkgs.stdenv // {
|
||||||
|
mkDerivation = args: pkgs.stdenv.mkDerivation (args // {
|
||||||
|
postPatch = (args.postPatch or "") + ''
|
||||||
|
if [ -e src/bsearch.c ]; then
|
||||||
|
rm src/bsearch.c
|
||||||
|
substituteInPlace src/tsp_unicode.h \
|
||||||
|
--replace-fail '#include "bsearch.c"' ""
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
helixGrammars = pkgs.callPackage "${inputs.helix-steel}/grammars.nix" {
|
||||||
|
stdenv = patchedStdenv;
|
||||||
|
};
|
||||||
|
|
||||||
|
helixSteel =
|
||||||
|
(
|
||||||
|
pkgs.callPackage "${inputs.helix-steel}/default.nix" {
|
||||||
|
gitRev = inputs.helix-steel.rev;
|
||||||
|
|
||||||
|
# The upstream flake builds the grammars with its own callPackage,
|
||||||
|
# swap in the patched ones.
|
||||||
|
callPackage = path: args:
|
||||||
|
if toString path == toString "${inputs.helix-steel}/grammars.nix" then helixGrammars
|
||||||
|
else pkgs.callPackage path args;
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.overrideAttrs (old: {
|
||||||
|
cargoBuildFlags = (old.cargoBuildFlags or []) ++ [
|
||||||
|
"--features"
|
||||||
|
"steel,git"
|
||||||
|
];
|
||||||
|
});
|
||||||
|
|
||||||
|
comment-headers = pkgs.fetchurl {
|
||||||
|
url = "https://github.com/codingvivi/comment-dividers.hx/raw/refs/heads/main/comment_headers.scm";
|
||||||
|
name = "comment_headers.scm";
|
||||||
|
hash = "sha256-ohgn6DFJl0rdRJuri6Frs/uUlUsPxMvPHDuw4FS3qEE=";
|
||||||
|
};
|
||||||
|
|
||||||
|
patched-comment-headers = pkgs.runCommand "comment_headers.scm" { } ''
|
||||||
|
install -m 0644 ${comment-headers} "$out"
|
||||||
|
|
||||||
|
${pkgs.python3}/bin/python3 - <<'PY'
|
||||||
|
from pathlib import Path
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
p = Path(os.environ["out"])
|
||||||
|
s = p.read_text()
|
||||||
|
|
||||||
|
start_marker = "(define (get-block-delims)"
|
||||||
|
end_marker = "(define (delete_till_first_nonwhitespace!)"
|
||||||
|
|
||||||
|
try:
|
||||||
|
start = s.index(start_marker)
|
||||||
|
end = s.index(end_marker, start)
|
||||||
|
except ValueError as e:
|
||||||
|
sys.exit(f"failed to find function markers: {e}")
|
||||||
|
|
||||||
|
new_get_block_delims = """(define (get-block-delims)
|
||||||
|
(helix.static.open_above)
|
||||||
|
(helix.static.insert_string "test_string")
|
||||||
|
(helix.static.normal_mode)
|
||||||
|
(helix.static.extend_to_line_bounds)
|
||||||
|
(helix.static.trim_selections)
|
||||||
|
(helix.static.toggle_comments)
|
||||||
|
(let* ([commented-test-string (helix.static.current-highlighted-text!)]
|
||||||
|
[strings-without-whitespace (split-whitespace commented-test-string)])
|
||||||
|
(delete-line-noyank!)
|
||||||
|
(cond
|
||||||
|
[(and (> (length strings-without-whitespace) 1)
|
||||||
|
(equal? (last strings-without-whitespace) "test_string"))
|
||||||
|
(list (first strings-without-whitespace) "")]
|
||||||
|
[(> (length strings-without-whitespace) 2)
|
||||||
|
(list (first strings-without-whitespace) (last strings-without-whitespace))]
|
||||||
|
[else
|
||||||
|
(list "" "")])))
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
s = s[:start] + new_get_block_delims + s[end:]
|
||||||
|
|
||||||
|
old = "(make-line line-length fill-pattern #f padding-pattern)"
|
||||||
|
new = "(make-line line-length \"\" fill-pattern padding-pattern)"
|
||||||
|
|
||||||
|
if old not in s:
|
||||||
|
sys.exit("failed to find insert-divider make-line call")
|
||||||
|
|
||||||
|
s = s.replace(old, new)
|
||||||
|
|
||||||
|
p.write_text(s)
|
||||||
|
PY
|
||||||
|
'';
|
||||||
|
in {
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
steel
|
||||||
|
wakatime-cli
|
||||||
|
];
|
||||||
|
|
||||||
|
# Wakapi is WakaTime-compatible, so the same plugin/client works.
|
||||||
|
sops.templates.".wakatime.cfg" = {
|
||||||
|
path = "${config.home.homeDirectory}/.wakatime.cfg";
|
||||||
|
mode = "0600";
|
||||||
|
content = ''
|
||||||
|
[settings]
|
||||||
|
api_url = https://coding.srcoder.moe/api
|
||||||
|
api_key = ${config.sops.placeholder."tokens/apis/wakapi"}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
home.activation.installWakatimeHx = lib.hm.dag.entryAfter [ "writeBoundary" ] ''
|
||||||
|
export PATH="${pkgs.steel}/bin:$PATH"
|
||||||
|
export STEEL_HOME="${config.xdg.dataHome}/steel"
|
||||||
|
|
||||||
|
if [ ! -f "$STEEL_HOME/cogs/wakatime/wakatime.scm" ]; then
|
||||||
|
forge pkg install --git https://github.com/Xerxes-2/wakatime.hx.git
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
|
||||||
|
programs.helix = {
|
||||||
|
enable = true;
|
||||||
|
package = helixSteel;
|
||||||
|
defaultEditor = true;
|
||||||
|
|
||||||
|
settings = {
|
||||||
|
# theme = "catppuccin-mocha";
|
||||||
|
editor = {
|
||||||
|
rulers = [ 81 ];
|
||||||
|
insert-final-newline = false;
|
||||||
|
indent-guides.render = true;
|
||||||
|
|
||||||
|
whitespace.render = {
|
||||||
|
space = "all";
|
||||||
|
tab = "all";
|
||||||
|
nbsp = "none";
|
||||||
|
nnbsp = "none";
|
||||||
|
newline = "none";
|
||||||
|
};
|
||||||
|
|
||||||
|
cursor-shape = {
|
||||||
|
normal = "block";
|
||||||
|
insert = "bar";
|
||||||
|
select = "underline";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
keys.normal = {
|
||||||
|
space = {
|
||||||
|
C-c = {
|
||||||
|
h = ":comment-h1";
|
||||||
|
j = ":comment-h2";
|
||||||
|
k = ":comment-h3";
|
||||||
|
d = ":comment-divider";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
S-down = ["extend_to_line_bounds" "delete_selection" "paste_after"];
|
||||||
|
S-up = ["extend_to_line_bounds" "delete_selection" "move_line_up" "paste_before"];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
xdg.configFile = {
|
||||||
|
"helix/cogs/comment_headers.scm".source = patched-comment-headers;
|
||||||
|
"helix/helix.scm".text = ''
|
||||||
|
(require (prefix-in div. "cogs/comment_headers.scm"))
|
||||||
|
|
||||||
|
(provide comment-h1 comment-h2 comment-h3 comment-divider)
|
||||||
|
|
||||||
|
(define (comment-h1)
|
||||||
|
(div.insert-h1!))
|
||||||
|
|
||||||
|
(define (comment-h2)
|
||||||
|
(div.insert-h2!))
|
||||||
|
|
||||||
|
(define (comment-h3)
|
||||||
|
(div.insert-h3!))
|
||||||
|
|
||||||
|
(define (comment-divider)
|
||||||
|
(div.insert-divider! 80 "~"))
|
||||||
|
'';
|
||||||
|
"helix/init.scm".text = ''
|
||||||
|
;; Steel init file
|
||||||
|
(require "wakatime/wakatime.scm")
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -4,5 +4,6 @@
|
|||||||
age.keyFile = "${config.home.homeDirectory}/.config/sops/age/keys.txt";
|
age.keyFile = "${config.home.homeDirectory}/.config/sops/age/keys.txt";
|
||||||
|
|
||||||
secrets."tokens/apis/wallhaven" = {};
|
secrets."tokens/apis/wallhaven" = {};
|
||||||
|
secrets."tokens/apis/wakapi" = {};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -1,18 +1,19 @@
|
|||||||
tokens:
|
tokens:
|
||||||
apis:
|
apis:
|
||||||
wallhaven: ENC[AES256_GCM,data:pW9QiCB8yM2xSZQG96qCKOGOJbSFFrFxu8s1tHfmzWw=,iv:sezKkABxqVtd3mK8+WxEDPd+GtpyBcUJVLDlj/D68nU=,tag:HWE2QZf66dZGjK21WcxtiA==,type:str]
|
wallhaven: ENC[AES256_GCM,data:yO+thw4xgpMBuNx2LyxguDxAzoKSeDCyAAOcgtTxx74=,iv:j3LGKXnmykTamSuuIFbACT0kRDFazOhNEgWtVoxiWK4=,tag:jLaJrcUmDuxVj1D65NZhyg==,type:str]
|
||||||
|
wakapi: ENC[AES256_GCM,data:B4BOqy6TyZj4qPB9H7Ne+XaW701tX+ho8dMn0EGvqzdVOKq+,iv:/P6KZV9KgIBXslB3yZD5G3XER279iJ6/R2n+ZdTaBLs=,tag:r/SDXjofl8DdDlzP9Xo5mQ==,type:str]
|
||||||
sops:
|
sops:
|
||||||
age:
|
age:
|
||||||
- enc: |
|
- enc: |
|
||||||
-----BEGIN AGE ENCRYPTED FILE-----
|
-----BEGIN AGE ENCRYPTED FILE-----
|
||||||
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBUVVBNekFNbWNhSEx1d0c0
|
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA1MXcwbkFxZ2R4V0ppOGo3
|
||||||
NHRNWW9iR3FSMnZIMkRKQy9pTTIzV2R6VG1BClJ4clI5SzRCTnJhZ25JSEJ3dkFF
|
UmFsTTJGekQ0NGVtTFpCRm50ekxJcEZUUW1FCkF5aStVckVNaVJndmptdnhtNjgx
|
||||||
QVE4VUt3YXBKZnRES3dXSjJxM2RJU0kKLS0tIExKci9iQWJ4VVdyU1dteVZXb21k
|
Z056TVF5ZVRuMWJZKzk1WlRZTXN3bjAKLS0tIEhHd1JyTkhIdjJuZVZtSFlTRXIy
|
||||||
S1VhaW5rQVkzUWMweHdNaThmblRYWWMKrhP0P4ftPNKfjss5JDa4SESSYXdop/U/
|
cTRWRkZXUmcrcHRXU2pyTzh1OGhaSkkKiqYLrPm1zS0PfrIeUnZHXvvHcY15PxDS
|
||||||
uIfI1RPTXbReF124NIIEvJ6AsiQKDDCjpgT0m/1i/U3yIF1UejPiQg==
|
01jUzubGavkuOXb0hJmr6oBkEkSMBW+GLewduqj0SxGF2yxTSkM0kQ==
|
||||||
-----END AGE ENCRYPTED FILE-----
|
-----END AGE ENCRYPTED FILE-----
|
||||||
recipient: age1tx6jdr6535xxeygpwkkgvdwc24tulr420cm7gk56xzfp0slzeqks2nwpyg
|
recipient: age1tx6jdr6535xxeygpwkkgvdwc24tulr420cm7gk56xzfp0slzeqks2nwpyg
|
||||||
lastmodified: "2026-10-17T13:36:46Z"
|
lastmodified: "2026-10-21T17:46:52Z"
|
||||||
mac: ENC[AES256_GCM,data:stlsKKQhQL6+utokuXvNZH1dlWfEeUa5nORN5eQnbNcXbo1MrFVz9wVDqVtpgZOc3/v8p4YaHXLhQl8/RpawAwQH03gvcZ5zt1aA+Z7K6yh9ONRSnwz2lUXwCbpaf0xYRIlzv7pSPBJdLfYSN3kaEwVKrItAsPxuHEI/WEh8M3Y=,iv:W1vLWvQ7b635MpbUC7m3ATBPa/MujvAji2/MN9kldq4=,tag:DlVg1LCVvjPOg4nRP3rjAA==,type:str]
|
mac: ENC[AES256_GCM,data:mLdD78pb0Qf30+l/igb+jXMHxNXTXJPNtsi3cGeEgYLKxnx02OVBuOnncMZvN351yh7h5if9pCqwCJeOISWU8uFZrQdJeDjdmIPlP1eqzBQ7fK4fhEeRzAcn4dTQ5tcmu3uXmWElKcBYhMFEPr3/etyfDcX5ZFwOra8wUqU8nq4=,iv:TydKNjO5stupovtCF/rHMtr1Da2IFafMZiLQxsln1uA=,tag:kXl5eELy9I5APJkAQ8tk3w==,type:str]
|
||||||
unencrypted_suffix: _unencrypted
|
unencrypted_suffix: _unencrypted
|
||||||
version: 3.13.3
|
version: 3.13.3
|
||||||
Reference in new issue
Block a user