Compare commits

...

145 commits

Author SHA1 Message Date
48af3d5449
ghostty: use window decorations 2025-01-17 20:56:28 +01:00
1b367e2322
nemo: add tpm2 tooling + perms 2025-01-16 16:38:52 +01:00
cc9fc76545
jj: fancier status 2025-01-15 20:04:18 +01:00
dcc102f9bf
ghostty: keymap c-m + friends 2025-01-15 20:02:41 +01:00
6b1a4b5d04
jj: pass args to 's' alias 2025-01-15 14:50:54 +01:00
62246715bb
jj: fancy 's' command as default
new `util exec` is very nice 😀
2025-01-15 14:38:23 +01:00
eb06ace77d
nix: update 2025-01-15 14:38:17 +01:00
fac0a155e2
fish: jj dynamic completion 2025-01-14 21:55:58 +01:00
de6547851a
fish: remove unused config 2025-01-14 21:55:14 +01:00
a6013523fa
nvim: cleanup 2025-01-12 23:01:30 +01:00
ad82eb1cbf
nvim: Add autoformat on save w/toggle ui 2025-01-12 23:01:30 +01:00
3b577407f7
nvim: remove codeium cmp source 2025-01-12 17:19:13 +01:00
8e2d043650
nvim: add mini.files 2025-01-12 17:00:54 +01:00
0b6313671c
ghostty: reduce font size a bit 2025-01-12 15:09:26 +01:00
81f036c147
nvim: use mini.visits for history w/frecency 2025-01-12 13:44:14 +01:00
f8c7a5ecfe
nvim: revert minipick preview key 2025-01-12 13:42:31 +01:00
a93861071d
nvim: cleanup 2025-01-12 13:27:19 +01:00
b5a3d0ec9e
nvim: colors 2025-01-12 01:14:15 +01:00
2cd4b5c52a
nvim: picker + cmp tweaks 2025-01-11 23:10:02 +01:00
cea9b407c8
nvim: ruler format tweaks 2025-01-11 23:09:30 +01:00
fec53f5ca0
nvim: re-enable neocodium. bink-cmp config 2025-01-11 19:36:45 +01:00
ccf59fbaee
zoxide: add fzf border and avoid sorting (which ruins zoxide weighting) 2025-01-10 21:45:35 +01:00
f263c95f03
ghostty: don't start nvim automatically 2025-01-09 17:27:35 +01:00
c68bdd3818
nvim: blink-cmp changes 2025-01-09 17:27:23 +01:00
3ec86e59ba
nemo: disable coolercontrol + gnome vitals 2025-01-09 14:36:57 +01:00
03e20d83e1
nemo: disable sunshine 2025-01-09 14:36:21 +01:00
3ef41dd400
nemo: set OTEL endpoint globally 2025-01-08 18:58:40 +01:00
b82010faf8
nvim: add sqls 2025-01-08 15:39:04 +01:00
223bff6315
fish: remove grc 2025-01-07 22:00:37 +01:00
7a2d1a7e4e
nemo: re-enable pam_rssh 2025-01-07 19:45:49 +01:00
78d818056b
jj: use bright magenta for bookmarks 2025-01-07 19:44:44 +01:00
fac15cd4c5
nix: update 2025-01-05 23:13:58 +01:00
6d35750873
hardware.pulseaudio -> services.pulseaudio 2025-01-05 23:10:32 +01:00
476542b697
jj: colorific 2025-01-05 22:57:19 +01:00
b23bc6b9af
nix: add nixfmt 2025-01-05 00:10:27 +01:00
4bb1fa1f40
ghostty: fix .desktop entries 2025-01-04 19:11:37 +01:00
7152b0bf09
nix: add nix-index 2025-01-04 13:59:19 +01:00
9ca1072e00
rename nemo -> devel for ghostty+ssh 2025-01-03 19:40:42 +01:00
09694db337
nix update 2025-01-03 19:22:53 +01:00
90b5b48d2a
vcs: remove unused lazyjj, gitui 2025-01-03 19:22:32 +01:00
4766311654
ghostty: add desktop entries for secondary (condensed) terminals 2025-01-03 18:46:13 +01:00
6dd68098e0
jj: use jj flake directly 2025-01-03 15:35:11 +01:00
5032e07ee9
zoxide: fzf clown vomit mitigation effort 2025-01-03 14:01:49 +01:00
7954844ff6
fish: colorings 2025-01-03 13:38:56 +01:00
afa495919c
nvim: colorings 2025-01-03 13:38:53 +01:00
9b9389592e
eza: monochrome theme. use home-manager aliases. 2025-01-03 12:14:16 +01:00
79e3ffbac3
nvim: more subtle mini cursor word 2025-01-03 12:14:16 +01:00
a8adda373c
fish: bold prompt symbol instead of colored 2025-01-03 12:14:16 +01:00
243a476525
ghostty: lower underline position 2025-01-03 11:06:35 +01:00
6223f1e7c9
test-term: add ANSI color sets 2025-01-03 11:05:58 +01:00
5a35ac9aeb
nvim: absolute line numbers by default 2025-01-03 00:12:02 +01:00
70fec1c1f1
nvim: just color underlines for diagnostics 2025-01-03 00:11:36 +01:00
7e89879ae9
lsjostro has his own home-manager setup now 2025-01-02 23:08:36 +01:00
f0710b34fb
nvim: update Patagia logo 2025-01-02 23:05:49 +01:00
f8ad364bc9
ghostty: color adjustments 2025-01-02 22:16:03 +01:00
37372a5c69
nvim: colors 2025-01-02 20:28:12 +01:00
13348be8e9
nvim: Add dieter/dieter-nocolor variants. Switch with <Leader>uc 2025-01-02 19:50:05 +01:00
091442fcdf
ghostty: use berkeley mono v2 2025-01-02 17:04:32 +01:00
a603dd1cad
ghostty: module has been merged to home-manager 2025-01-02 16:22:32 +01:00
311cd9042e
nvim: wrapper script for persistent+remote control 2025-01-02 15:23:31 +01:00
9ee84b89e6
nvim: color scheme tweaks 2025-01-02 00:31:28 +01:00
376fb67f48
nix update 2025-01-01 16:55:35 +01:00
be77222a99
Ditch tmux for ghostty tabs + a more stateless living 2025-01-01 16:42:54 +01:00
494bd5cad1
nvim: <Leader>uw toggles line wrap 2024-12-31 14:48:50 +01:00
cdc020ff0d
nvim: trying out just using blink cmp for neocodium as well 2024-12-31 14:34:16 +01:00
c749caf2e9
nvim: do not enable inlay hints by default 2024-12-31 14:32:38 +01:00
be8780d846
Experiment with having no system wide language tooling 2024-12-31 13:57:40 +01:00
2497584fd0
Remove unused zed 2024-12-30 22:01:35 +01:00
be47c9500b
dinky is laptop 2024-12-30 21:29:53 +01:00
46c13deee7
nix update 2024-12-30 09:46:34 +01:00
c4a2a60fa6
nvim: implement projects picker 2024-12-30 09:46:34 +01:00
714cbcb8a9
nvim: reformat 2024-12-30 09:46:25 +01:00
461f3a9a46
nix update 2024-12-29 22:55:40 +01:00
b455010624
nvim: blink-cmp goodness 2024-12-28 00:54:23 +01:00
f26beb87bd
nvim: nvim-tree-pairs appears broken right now 2024-12-28 00:54:23 +01:00
8b46fa253d
nvim fixings 2024-12-28 00:54:23 +01:00
49d4bbd7c1
gimp: skip plugins for now 2024-12-27 22:58:17 +01:00
baaf516939
nix: bump 2024-12-27 20:00:40 +01:00
fa7fce620a
ghostty: Use official (now released + public) flake 2024-12-27 19:59:22 +01:00
1379ed01f0
Use cache-nixos-org.aarn.patagia.net as cache 2024-12-27 19:35:11 +01:00
f53cbba16f
Enable avahi 2024-12-27 19:14:55 +01:00
f5af1628e7
atuin: moved to atuin.patagia.net 2024-12-19 10:27:26 +01:00
0ff88467e6
athens moved to athens.patagia.net 2024-12-19 10:26:55 +01:00
195a66d7bf
nvim: add direnv-vim plugin 2024-12-15 23:56:40 +01:00
4c259757db
nvim: add c-p binding 2024-12-15 23:05:56 +01:00
378fd7caa0
patagia.dev -> patagia.net 2024-12-11 00:03:28 +01:00
264546666c
lazyjj: nixpkgs caught up and ran by 2024-12-10 09:15:23 +01:00
2d5364c5de
nvim: blink-cmp 0.7.3 is in nixpkgs now 2024-12-08 23:01:18 +01:00
da605daf08
jj: upgrade to 0.24.0 2024-12-08 22:56:26 +01:00
4465aa5abc
chore: fix typo 2024-12-08 20:45:21 +01:00
aed9af6f45
nvim: enable inlay hints + toggling 2024-12-05 00:22:39 +01:00
5c319ac288
nvim: Iterate on colors 2024-12-05 00:22:04 +01:00
c94ce60795
ghostty: use hardcoded session names in tmux 2024-12-04 20:30:41 +01:00
dc126a49d6
nvim: add harper ls 2024-12-04 18:03:46 +01:00
37ddc91613
nvim: upgrade blink-cmp. lsp config for web stuff. 2024-12-04 17:26:36 +01:00
7a4712c057
chore: typo 2024-12-02 12:33:20 +01:00
0357c7ff05
ghostty: add .desktop for secondary tmux session 2024-12-01 23:23:24 +01:00
761b506dac
desktop: nerd-fonts are split into separate packages now 2024-12-01 23:20:01 +01:00
4dadbe3542
nix: update 2024-11-30 21:18:03 +01:00
b6b4abddf5
Revert running tmux from fish, set ripgrep config explicitly.
There should be a better way to do this? 🤔
2024-11-30 21:17:02 +01:00
b0668e2ef7
nvim: Add blink.compat for nvim-cmp compatibility for blink.cmp
https://github.com/Saghen/blink.compat
2024-11-30 21:15:59 +01:00
38a179be12
README 2024-11-29 12:08:09 +01:00
3dee43330a
nvim: clear Normal group and use terminal defaults for
background+foreground
2024-11-28 12:47:30 +01:00
e1c3fd6cb8
ghostty+nvim: Add oled mode for darker darks on laptop 2024-11-28 12:28:29 +01:00
a7aa9c7a72
vcs+rg: fix ignore globs 2024-11-28 12:21:12 +01:00
71660705f0
nvim: mini.pick ripgrep->rg tool name 2024-11-28 12:20:02 +01:00
dfa99a5d4c
ghostty: run tmux in shell 2024-11-27 23:38:45 +01:00
9a31f83e80
ghostty+nvim: color tweaks to please the eyeballs 2024-11-27 15:46:31 +01:00
e7d96ac4c0
fish: fix viddy arguments for w 2024-11-26 21:17:25 +01:00
18a27db983
nix: update 2024-11-26 21:16:57 +01:00
b09da9efbe
ghostty+nvim: try on some oled black background 2024-11-26 21:12:54 +01:00
e3858e3adf
nvim: blink-cmp has been merged to unstable 2024-11-21 20:10:37 +01:00
4e803491d6
nvim: add <Leader>ub to toggle light/dark background 2024-11-21 16:43:00 +01:00
2994a40003
nix: update 2024-11-21 15:16:57 +01:00
010e4bc4d7
ghostty: automatic switching between light/dark themes 2024-11-21 15:16:16 +01:00
8ad810254b
nemo: add woodpecker user for woodpecker-agent 2024-11-21 14:53:16 +01:00
fe829e19c5
fish: Remove right prompt. Put vcs info on terminal bottom line. 2024-11-21 13:56:54 +01:00
49bf77b97f
fish: Add icons to jj fish prompt 2024-11-19 22:40:01 +01:00
0069a95e5d
fish: Prettier prompt w/jj desc in separator line 2024-11-19 21:49:53 +01:00
74c622efab
tmux: add stty command alias for resizing (serial) terminals 2024-11-19 12:51:36 +01:00
74e5882919
Nix update 2024-11-19 12:33:39 +01:00
a1906f2380
jj: fewer log entries by default 2024-11-18 18:44:52 +01:00
0496c8544b
home: i like file 2024-11-12 21:26:03 +01:00
d82a46a490
nvim: ignore /nix/store and cargo files in shada / oldfiles + friends 2024-11-10 20:25:03 +01:00
663119c828
nvim: sort buffers by most recent use 2024-11-10 14:19:05 +01:00
8648722d9a
nvim: remove nil lsp in favor of nixd 2024-11-10 14:18:32 +01:00
38ede1036e
nix: upgrade 2024-11-09 20:28:44 +01:00
b433ecef3c
nvim: blink-cmp 0.5.1 + styling 2024-11-09 17:16:35 +01:00
1eb8637840
nvim: colors 2024-11-09 01:34:01 +01:00
f6f2286505
nvim: use blink.cmp for completion
https://github.com/Saghen/blink.cmp
2024-11-09 00:22:09 +01:00
273c88b4fe
tmux: use C-t as prefix 2024-11-09 00:20:12 +01:00
e77885fdef
nvim: mini.pick fixings 2024-11-08 23:16:34 +01:00
6cbd28148a
nvim: move treesitter to separate file 2024-11-07 23:11:11 +01:00
d3b07a2e77
nvim: Add neocodium 2024-11-07 18:06:47 +01:00
2bad613a8a
nvim: completion and styling 2024-11-07 17:45:50 +01:00
f3628d2cf1
jj: upgrade to v0.23.0 2024-11-07 10:33:23 +01:00
6615366df7
nix: add cachix 2024-11-07 10:33:01 +01:00
9bc0226264
nvim: cleanup 2024-11-07 10:32:40 +01:00
01b97bf22c
nix: add cachix community cache 2024-11-07 01:20:15 +01:00
f4aa6d3cda
nvim: use neovim-nightly 2024-11-07 01:15:38 +01:00
cdeb64a7e4
nvim: mini + tree-sitter setup 2024-11-07 00:23:55 +01:00
f3d1d92840
nvim: add bufremove 2024-11-06 20:03:42 +01:00
29ea7970c3 nvim: mini all the things (#2)
Reviewed-on: dln/nixos-config#2
2024-11-06 00:03:58 +00:00
ab8ee834e9
nvim: add diagflow plugin 2024-11-06 01:00:41 +01:00
2f0f291167
cleanup 2024-11-06 00:49:48 +01:00
46 changed files with 2091 additions and 5136 deletions

View file

@ -1,31 +1,3 @@
# NixOS Config
# Configuration and various sundries
IT in a box!
## Bootstrapping from a fresh NixOS installation
1. Install NixOS
2. Clone this repo:
```
nix-shell -p git --command 'git clone https://patagia.dev/dln/nixos-config.git'
```
3. Ensure host configuration exists at `./nixos-config/hosts/${HOSTNAME}` and contains at minimum the hardware configuration. The NixOS installer will write this out to `/etc/nixos/hardware-configuration.nix`.
4. Apply configuration:
```
sudo nixos-rebuild boot --flake ./nixos-config#${HOSTNAME}
```
## Use
1. Clone this repo somewhere convenient, like `~/src/shelman/nixos-config`
2. Apply configuration: `just switch`
## Update
Update nixpkgs and switch: `just update`
# Home Manager
`just home-switch`
IT in a box.

View file

@ -51,6 +51,18 @@
'';
};
services.avahi = {
nssmdns4 = true;
enable = true;
ipv4 = true;
ipv6 = true;
publish = {
enable = true;
addresses = true;
workstation = true;
};
};
# Open ports in the firewall.
# networking.firewall.allowedTCPPorts = [ ... ];
# networking.firewall.allowedUDPPorts = [ ... ];

View file

@ -57,10 +57,9 @@ in
};
packages = with pkgs; [
inter
jetbrains-mono
liberation_ttf
monaspace
(pkgs.nerdfonts.override { fonts = [ "JetBrainsMono" ]; })
nerd-fonts.symbols-only
noto-fonts
noto-fonts-cjk-sans
noto-fonts-color-emoji
@ -94,7 +93,7 @@ in
xkb.variant = "us";
};
hardware.pulseaudio.enable = false;
services.pulseaudio.enable = false;
security.rtkit.enable = true;
services.pipewire = {
enable = true;

View file

@ -7,12 +7,11 @@
let
inherit (lib) mkIf mkEnableOption;
cfg = config.patagia.podman;
in
{
options.patagia.laptop.enable = mkEnableOption "Laptop tools and configuration";
config = mkIf cfg.enable {
config = mkIf config.patagia.laptop.enable {
environment.systemPackages = with pkgs; [ gnomeExtensions.battery-health-charging ];
services.fprintd.enable = true;

View file

@ -20,10 +20,15 @@
# Workaround for https://github.com/NixOS/nix/issues/9574
nix-path = config.nix.nixPath;
substituters = [
# "https://cache-nixos-org.aarn.shelman.io"
"https://cache.nixos.org/"
"https://cache-nixos-org.aarn.patagia.net/"
];
trusted-public-keys = [ "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" ];
extra-substituters = [
"https://nix-community.cachix.org"
];
extra-trusted-public-keys = [
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
];
};
channel.enable = false;
registry = lib.mapAttrs (_: flake: { inherit flake; }) flakeInputs;

View file

@ -12,7 +12,7 @@ set fish_emoji_width 2
# Colors
set fish_color_command --bold
set fish_color_comment --italics --dim
set fish_color_autosuggestion --italics --bold red
set fish_color_autosuggestion --italics --bold --dim
set fish_color_cancel
set fish_color_command --bold
set fish_color_comment --italics --dim

View file

@ -1,37 +0,0 @@
set GO_TASK_PROGNAME task
function __task_get_tasks --description "Prints all available tasks with their description"
# Read the list of tasks (and potential errors)
$GO_TASK_PROGNAME --list-all 2>&1 | read -lz rawOutput
# Return on non-zero exit code (for cases when there is no Taskfile found or etc.)
if test $status -ne 0
return
end
# Grab names and descriptions (if any) of the tasks
set -l output (echo $rawOutput | sed -e '1d; s/\* \(.*\):\s*\(.*\)\s*(aliases.*/\1\t\2/' -e 's/\* \(.*\):\s*\(.*\)/\1\t\2/'| string split0)
if test $output
echo $output
end
end
complete -c $GO_TASK_PROGNAME -d 'Runs the specified task(s). Falls back to the "default" task if no task name was specified, or lists all tasks if an unknown task name was
specified.' -xa "(__task_get_tasks)"
complete -c $GO_TASK_PROGNAME -s c -l color -d 'colored output (default true)'
complete -c $GO_TASK_PROGNAME -s d -l dir -d 'sets directory of execution'
complete -c $GO_TASK_PROGNAME -l dry -d 'compiles and prints tasks in the order that they would be run, without executing them'
complete -c $GO_TASK_PROGNAME -s f -l force -d 'forces execution even when the task is up-to-date'
complete -c $GO_TASK_PROGNAME -s h -l help -d 'shows Task usage'
complete -c $GO_TASK_PROGNAME -s i -l init -d 'creates a new Taskfile.yml in the current folder'
complete -c $GO_TASK_PROGNAME -s l -l list -d 'lists tasks with description of current Taskfile'
complete -c $GO_TASK_PROGNAME -s o -l output -d 'sets output style: [interleaved|group|prefixed]' -xa "interleaved group prefixed"
complete -c $GO_TASK_PROGNAME -s p -l parallel -d 'executes tasks provided on command line in parallel'
complete -c $GO_TASK_PROGNAME -s s -l silent -d 'disables echoing'
complete -c $GO_TASK_PROGNAME -l status -d 'exits with non-zero exit code if any of the given tasks is not up-to-date'
complete -c $GO_TASK_PROGNAME -l summary -d 'show summary about a task'
complete -c $GO_TASK_PROGNAME -s t -l taskfile -d 'choose which Taskfile to run. Defaults to "Taskfile.yml"'
complete -c $GO_TASK_PROGNAME -s v -l verbose -d 'enables verbose mode'
complete -c $GO_TASK_PROGNAME -l version -d 'show Task version'
complete -c $GO_TASK_PROGNAME -s w -l watch -d 'enables watch of the given task'

View file

@ -1,338 +0,0 @@
# TODO: passthru other args? E.g.. --at-operation, --repository
function __jj
command jj --ignore-working-copy --color=never --quiet $argv 2>/dev/null
end
# Aliases
# Based on https://github.com/fish-shell/fish-shell/blob/cd71359c42f633d9d71a63591ae16d150407a2b2/share/completions/git.fish#L625.
#
# Aliases are stored in global variables.
# `__jj_aliases` is a list of all aliases and `__jj_alias_$alias` is the command line for the alias.
function __jj_add_alias
set -l alias $argv[1]
set -l alias_escaped (string escape --style=var -- $alias)
set -g __jj_alias_$alias_escaped $argv
set --append -g __jj_aliases $alias
end
__jj config list aliases -T 'concat(name, "\t", value, "\n")' --include-defaults | while read -l config_alias
set -l parsed (string match --regex '^aliases\.(.+)\t(.*)$' --groups-only -- $config_alias)
set -l alias $parsed[1]
set -l command $parsed[2]
set -l args $alias
# Replace wrapping `[]` if any
set -l command (string replace -r --all '^\[|]$' "" -- $command)
while test (string length -- $command) -gt 0
set -l parsed (string match -r '^"((?:\\\"|[^"])*?)"(?:,\s)?(.*)$' --groups-only -- $command)
set --append args $parsed[1]
set command $parsed[2]
end
__jj_add_alias $args
end
__jj_add_alias ci commit
__jj_add_alias desc describe
__jj_add_alias op operation
__jj_add_alias st status
# Resolve aliases that call another alias.
for alias in $__jj_aliases
set -l handled $alias
while true
set -l alias_escaped (string escape --style=var -- $alias)
set -l alias_varname __jj_alias_$alias_escaped
set -l aliased_command $$alias_varname[1][2]
set -l aliased_escaped (string escape --style=var -- $aliased_command)
set -l aliased_varname __jj_alias_$aliased_escaped
set -q $aliased_varname
or break
# Prevent infinite recursion
contains $aliased_escaped $handled
and break
# Expand alias in cmdline
set -l aliased_cmdline $$aliased_varname[1][2..-1]
set --append aliased_cmdline $$alias_varname[1][3..-1]
set -g $alias_varname $$alias_varname[1][1] $aliased_cmdline
set --append handled $aliased_escaped
end
end
function __jj_aliases_with_descriptions
for alias in $__jj_aliases
set -l alias_escaped (string escape --style=var -- $alias)
set -l alias_varname __jj_alias_$alias_escaped
set -l aliased_cmdline (string join " " -- $$alias_varname[1][2..-1] | string replace -r --all '\\\"' '"')
printf "%s\talias: %s\n" $alias $aliased_cmdline
end
end
# Based on https://github.com/fish-shell/fish-shell/blob/2d4e42ee93327b9cfd554a0d809f85e3d371e70e/share/functions/__fish_seen_subcommand_from.fish.
# Test to see if we've seen a subcommand from a list.
# This logic may seem backwards, but the commandline will often be much shorter than the list.
function __jj_seen_subcommand_from
set -l cmd (commandline -opc)
set -e cmd[1]
# Check command line arguments first.
for i in $cmd
if contains -- $i $argv
return 0
end
end
# Check aliases.
set -l alias $cmd[1]
set -l alias_escaped (string escape --style=var -- $alias)
set -l varname __jj_alias_$alias_escaped
set -q $varname
or return 1
for i in $$varname[1][2..-1]
if contains -- $i $argv
return 0
end
end
return 1
end
function __jj_changes
__jj log --no-graph --limit 1000 -r $argv[1] \
-T 'separate("\t", change_id.shortest(), if(description, description.first_line(), "(no description set)")) ++ "\n"'
end
function __jj_bookmarks
set -f filter $argv[1]
if string length --quiet -- $argv[2]
__jj bookmark list --all-remotes -r "$argv[2]" \
-T "if($filter, name ++ if(remote, \"@\" ++ remote) ++ \"\t\" ++ if(normal_target, normal_target.change_id().shortest() ++ \": \" ++ if(normal_target.description(), normal_target.description().first_line(), \"(no description set)\"), \"(conflicted bookmark)\") ++ \"\n\")"
else
__jj bookmark list --all-remotes \
-T "if($filter, name ++ if(remote, \"@\" ++ remote) ++ \"\t\" ++ if(normal_target, normal_target.change_id().shortest() ++ \": \" ++ if(normal_target.description(), normal_target.description().first_line(), \"(no description set)\"), \"(conflicted bookmark)\") ++ \"\n\")"
end
end
function __jj_all_bookmarks
__jj_bookmarks '!remote || !remote.starts_with("git")' $argv[1]
end
function __jj_local_bookmarks
__jj_bookmarks '!remote' ''
end
function __jj_remote_bookmarks
__jj_bookmarks 'remote && !remote.starts_with("git")' ''
end
function __jj_all_changes
if string length --quiet -- $argv[1]
set -f REV $argv[1]
else
set -f REV "all()"
end
__jj_changes $REV
__jj_all_bookmarks $REV
end
function __jj_mutable_changes
set -f REV "mutable()"
__jj_changes $REV
__jj_all_bookmarks $REV
end
function __jj_revision_modified_files
if test $argv[1] = "@"
set -f suffix ""
else
set -l change_id (__jj log --no-graph --limit 1 -T 'change_id.shortest()')
set -f suffix " in $change_id"
end
__jj diff -r $argv[1] --summary | while read -l line
set -l file (string split " " -m 1 -- $line)
switch $file[1]
case M
set -f change Modified
case D
set -f change Deleted
case A
set -f change Added
end
printf "%s\t%s%s\n" $file[2] $change $suffix
end
end
function __jj_remotes
__jj git remote list | while read -l remote
printf "%s\t%s\n" (string split " " -m 1 -- $remote)
end
end
function __jj_operations
__jj operation log --no-graph --limit 1000 -T 'separate("\t", id.short(), description) ++ "\n"'
end
function __jj_parse_revision
set -l cmd (commandline -opc)
set -e cmd[1]
set -l return_next false
set -l return_value 1
# Check aliases.
set -l alias $cmd[1]
set -l alias_escaped (string escape --style=var -- $alias)
set -l varname __jj_alias_$alias_escaped
if set -q $varname
set cmd $$varname[1][2..-1] $cmd[2..-1]
end
# Check command line arguments first.
for i in $cmd
if $return_next
echo $i
set return_value 0
else if contains -- $i -r --revision --from
set return_next true
else
set -l match (string match --regex '^(?:-r=?|--revision=|--from=)(.+)\s*$' --groups-only -- $i)
if set -q match[1]
echo $match[1]
set return_value 0
end
end
end
return $return_value
end
function __jj_revision_files
set -l description (__jj log --no-graph --limit 1 -r $argv[1] -T 'change_id.shortest() ++ ": " ++ coalesce(description.first_line().substr(0, 30), "(no description set)")')
__jj file list -r $argv[1] | while read -l file
printf "%s\t%s\n" $file $description
end
end
function __jj_revision_conflicted_files
__jj resolve --list -r $argv[1] | while read -l line
set -l file (string split " " -m 1 -- $line)
printf "%s\t%s\n" $file[1] $file[2]
end
end
function __jj_parse_revision_files
set -l rev (__jj_parse_revision)
if test $status -eq 1
set rev "@"
end
__jj_revision_files $rev
end
function __jj_parse_revision_conflicted_files
set -l rev (__jj_parse_revision)
if test $status -eq 1
set rev "@"
end
__jj_revision_conflicted_files $rev
end
function __jj_parse_revision_files_or_wc_modified_files
set -l revs (__jj_parse_revision)
if test $status -eq 1
__jj_revision_modified_files "@"
else
for rev in $revs
__jj_revision_files $rev
end
end
end
function __jj_parse_revision_modified_files_or_wc_modified_files
set -l revs (__jj_parse_revision)
if test $status -eq 1
__jj_revision_modified_files "@"
else
for rev in $revs
__jj_revision_modified_files $rev
end
end
end
# Aliases.
complete -f -c jj -n __fish_use_subcommand -a '(__jj_aliases_with_descriptions)'
# Files.
complete -f -c jj -n '__jj_seen_subcommand_from file; and __jj_seen_subcommand_from show' -ka '(__jj_parse_revision_files)'
complete -f -c jj -n '__jj_seen_subcommand_from file; and __jj_seen_subcommand_from chmod' -ka '(__jj_parse_revision_files)'
complete -f -c jj -n '__jj_seen_subcommand_from commit' -ka '(__jj_revision_modified_files "@")'
complete -c jj -n '__jj_seen_subcommand_from diff' -ka '(__jj_parse_revision_files_or_wc_modified_files)'
complete -c jj -n '__jj_seen_subcommand_from interdiff' -ka '(__jj_parse_revision_files)'
complete -f -c jj -n '__jj_seen_subcommand_from resolve' -ka '(__jj_parse_revision_conflicted_files)'
complete -f -c jj -n '__jj_seen_subcommand_from restore' -ka '(__jj_parse_revision_files_or_wc_modified_files)'
complete -f -c jj -n '__jj_seen_subcommand_from split' -ka '(__jj_parse_revision_modified_files_or_wc_modified_files)'
complete -f -c jj -n '__jj_seen_subcommand_from squash' -ka '(__jj_parse_revision_modified_files_or_wc_modified_files)'
complete -f -c jj -n '__jj_seen_subcommand_from untrack' -ka '(__jj_parse_revision_files_or_wc_modified_files)'
# Revisions.
complete -f -c jj -n '__jj_seen_subcommand_from abandon' -ka '(__jj_mutable_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from backout' -s r -l revision -rka '(__jj_all_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from backout' -s d -l destination -rka '(__jj_all_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from file; and __jj_seen_subcommand_from show' -s r -l revision -rka '(__jj_all_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from chmod' -s r -l revision -rka '(__jj_mutable_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from describe' -ka '(__jj_mutable_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from diff' -s r -l revision -rka '(__jj_all_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from diff' -l from -rka '(__jj_all_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from diff' -l to -rka '(__jj_all_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from diffedit' -s r -l revision -rka '(__jj_mutable_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from diffedit' -l from -rka '(__jj_all_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from diffedit' -l to -rka '(__jj_mutable_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from duplicate' -ka '(__jj_all_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from edit' -ka '(__jj_mutable_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from file; and __jj_seen_subcommand_from list' -s r -l revision -rka '(__jj_all_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from interdiff' -l from -rka '(__jj_all_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from interdiff' -l to -rka '(__jj_all_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from log' -s r -rka '(__jj_all_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from new' -ka '(__jj_all_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from new' -s A -l after -l insert-after -rka '(__jj_all_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from new' -s B -l before -l insert-before -rka '(__jj_mutable_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from obslog' -s r -l revision -rka '(__jj_all_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from parallelize' -ka '(__jj_mutable_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from rebase' -s r -l revisions -rka '(__jj_mutable_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from rebase' -s s -l source -rka '(__jj_mutable_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from rebase' -s b -l bookmark -rka '(__jj_mutable_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from rebase' -s d -l destination -rka '(__jj_all_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from rebase' -s A -l after -l insert-after -rka '(__jj_all_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from rebase' -s B -l before -l insert-before -rka '(__jj_mutable_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from resolve' -s r -l revision -rka '(__jj_mutable_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from restore' -l from -rka '(__jj_all_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from restore' -l to -rka '(__jj_mutable_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from restore' -s c -l changes-in -rka '(__jj_all_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from show' -ka '(__jj_all_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from split' -s r -l revision -rka '(__jj_mutable_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from squash' -s r -l revision -rka '(__jj_mutable_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from squash' -l from -rka '(__jj_mutable_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from squash' -l to -l into -rka '(__jj_mutable_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from unsquash' -s r -l revision -rka '(__jj_mutable_changes)'
# Bookmarks
complete -f -c jj -n '__jj_seen_subcommand_from bookmark; and __jj_seen_subcommand_from delete forget rename set d f r s' -ka '(__jj_local_bookmarks)'
complete -f -c jj -n '__jj_seen_subcommand_from bookmark; and __jj_seen_subcommand_from track t' -ka '(__jj_bookmarks "remote && !tracked" "")'
complete -f -c jj -n '__jj_seen_subcommand_from bookmark; and __jj_seen_subcommand_from untrack' -ka '(__jj_bookmarks "remote && tracked && !remote.starts_with(\"git\")" "")'
complete -f -c jj -n '__jj_seen_subcommand_from bookmark; and __jj_seen_subcommand_from create move set c m s' -s r -l revision -kra '(__jj_all_changes)'
complete -f -c jj -n '__jj_seen_subcommand_from bookmark; and __jj_seen_subcommand_from move' -l from -rka '(__jj_changes "all()")'
complete -f -c jj -n '__jj_seen_subcommand_from bookmark; and __jj_seen_subcommand_from move' -l to -rka '(__jj_changes "all()")'
# Git.
complete -f -c jj -n '__jj_seen_subcommand_from git; and __jj_seen_subcommand_from push' -s c -l change -kra '(__jj_changes "all()")'
complete -f -c jj -n '__jj_seen_subcommand_from git; and __jj_seen_subcommand_from push' -s r -l revisions -kra '(__jj_changes "all()")'
complete -f -c jj -n '__jj_seen_subcommand_from git; and __jj_seen_subcommand_from fetch push' -s b -l bookmark -rka '(__jj_local_bookmarks)'
complete -f -c jj -n '__jj_seen_subcommand_from git; and __jj_seen_subcommand_from fetch push' -l remote -rka '(__jj_remotes)'
complete -f -c jj -n '__jj_seen_subcommand_from git; and __jj_seen_subcommand_from remote; and __jj_seen_subcommand_from remove rename set-url' -ka '(__jj_remotes)'
# Operations.
complete -f -c jj -l at-op -l at-operation -rka '(__jj_operations)'
complete -f -c jj -n '__jj_seen_subcommand_from undo' -ka '(__jj_operations)'
complete -f -c jj -n '__jj_seen_subcommand_from operation; and __jj_seen_subcommand_from abandon undo restore' -ka '(__jj_operations)'

View file

@ -53,15 +53,6 @@ function vcs_log
commandline -f repaint
end
function vcs_ui
if __jj_in_repo
lazyjj
else
gitui
end
commandline -f repaint
end
# Abbreviations
abbr -a d vcs_diff
@ -71,6 +62,9 @@ abbr -a s vcs_status
bind \c_ vcs_jump
bind \ea vcs_log
bind \ee vcs_broot
bind \eg vcs_ui
bind \eS vcs_diff
bind \es vcs_status
# jj completions
COMPLETE=fish jj | source

View file

@ -186,3 +186,109 @@ for i in $(seq 255 -1 128); do
echo -n " "
done
resetOutput
## Color test
# Tom Hale, 2016. MIT Licence.
# Print out 256 colours, with each number printed in its corresponding colour
# See http://askubuntu.com/questions/821157/print-a-256-color-test-pattern-in-the-terminal/821163#821163
set -eu # Fail on errors or undeclared variables
printable_colours=256
# Return a colour that contrasts with the given colour
# Bash only does integer division, so keep it integral
function contrast_colour {
local r g b luminance
colour="$1"
if (( colour < 16 )); then # Initial 16 ANSI colours
(( colour == 0 )) && printf "15" || printf "0"
return
fi
# Greyscale # rgb_R = rgb_G = rgb_B = (number - 232) * 10 + 8
if (( colour > 231 )); then # Greyscale ramp
(( colour < 244 )) && printf "15" || printf "0"
return
fi
# All other colours:
# 6x6x6 colour cube = 16 + 36*R + 6*G + B # Where RGB are [0..5]
# See http://stackoverflow.com/a/27165165/5353461
# r=$(( (colour-16) / 36 ))
g=$(( ((colour-16) % 36) / 6 ))
# b=$(( (colour-16) % 6 ))
# If luminance is bright, print number in black, white otherwise.
# Green contributes 587/1000 to human perceived luminance - ITU R-REC-BT.601
(( g > 2)) && printf "0" || printf "15"
return
# Uncomment the below for more precise luminance calculations
# # Calculate percieved brightness
# # See https://www.w3.org/TR/AERT#color-contrast
# # and http://www.itu.int/rec/R-REC-BT.601
# # Luminance is in range 0..5000 as each value is 0..5
# luminance=$(( (r * 299) + (g * 587) + (b * 114) ))
# (( $luminance > 2500 )) && printf "0" || printf "15"
}
# Print a coloured block with the number of that colour
function print_colour {
local colour="$1" contrast
contrast=$(contrast_colour "$1")
printf "\e[48;5;%sm" "$colour" # Start block of colour
printf "\e[38;5;%sm%3d" "$contrast" "$colour" # In contrast, print number
printf "\e[0m " # Reset colour
}
# Starting at $1, print a run of $2 colours
function print_run {
local i
for (( i = "$1"; i < "$1" + "$2" && i < printable_colours; i++ )) do
print_colour "$i"
done
printf " "
}
# Print blocks of colours
function print_blocks {
local start="$1" i
local end="$2" # inclusive
local block_cols="$3"
local block_rows="$4"
local blocks_per_line="$5"
local block_length=$((block_cols * block_rows))
# Print sets of blocks
for (( i = start; i <= end; i += (blocks_per_line-1) * block_length )) do
printf "\n" # Space before each set of blocks
# For each block row
for (( row = 0; row < block_rows; row++ )) do
# Print block columns for all blocks on the line
for (( block = 0; block < blocks_per_line; block++ )) do
print_run $(( i + (block * block_length) )) "$block_cols"
done
(( i += block_cols )) # Prepare to print the next row
printf "\n"
done
done
}
echo
echo "ANSI 4-bit colors:"
echo
print_run 0 16 # The first 16 colours are spread over the whole spectrum
echo
echo
echo "ANSI 8-bit colors:"
print_blocks 16 231 6 6 3 # 6x6x6 colour cube between 16 and 231 inclusive
print_blocks 232 255 12 2 1 # Not 50, but 24 Shades of Grey

View file

@ -1,5 +1,95 @@
{
"nodes": {
"flake-compat": {
"flake": false,
"locked": {
"lastModified": 1696426674,
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
"owner": "edolstra",
"repo": "flake-compat",
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
"type": "github"
},
"original": {
"owner": "edolstra",
"repo": "flake-compat",
"type": "github"
}
},
"flake-compat_2": {
"flake": false,
"locked": {
"lastModified": 1733328505,
"narHash": "sha256-NeCCThCEP3eCl2l/+27kNNK7QrwZB1IJCrXfrbv5oqU=",
"owner": "edolstra",
"repo": "flake-compat",
"rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec",
"type": "github"
},
"original": {
"owner": "edolstra",
"repo": "flake-compat",
"type": "github"
}
},
"flake-compat_3": {
"flake": false,
"locked": {
"lastModified": 1696426674,
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
"owner": "edolstra",
"repo": "flake-compat",
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
"type": "github"
},
"original": {
"owner": "edolstra",
"repo": "flake-compat",
"type": "github"
}
},
"flake-parts": {
"inputs": {
"nixpkgs-lib": [
"neovim-nightly-overlay",
"nixpkgs"
]
},
"locked": {
"lastModified": 1736143030,
"narHash": "sha256-+hu54pAoLDEZT9pjHlqL9DNzWz0NbUn8NEAHP7PQPzU=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "b905f6fc23a9051a6e1b741e1438dbfc0634c6de",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "flake-parts",
"type": "github"
}
},
"flake-parts_2": {
"inputs": {
"nixpkgs-lib": [
"neovim-nightly-overlay",
"hercules-ci-effects",
"nixpkgs"
]
},
"locked": {
"lastModified": 1733312601,
"narHash": "sha256-4pDvzqnegAfRkPwO3wmwBhVi/Sye1mzps0zHWYnP88c=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "205b12d8b7cd4802fbcb8e8ef6a0f1408781a4f9",
"type": "github"
},
"original": {
"id": "flake-parts",
"type": "indirect"
}
},
"flake-utils": {
"inputs": {
"systems": "systems"
@ -18,42 +108,109 @@
"type": "github"
}
},
"ghostty": {
"flake-utils_2": {
"inputs": {
"nixpkgs-stable": [
"nixpkgs"
],
"nixpkgs-unstable": [
"nixpkgs"
],
"zig": "zig"
"systems": "systems_2"
},
"locked": {
"lastModified": 1730776162,
"narHash": "sha256-ODmmTWz3jqaPmJ1UiJgHD3oy90BTEd871GZHyT5Xn9M=",
"ref": "refs/heads/main",
"rev": "f9199a46118f173ac7a005130f871fdf050f94d1",
"revCount": 7881,
"type": "git",
"url": "ssh://git@github.com/ghostty-org/ghostty"
},
"original": {
"type": "git",
"url": "ssh://git@github.com/ghostty-org/ghostty"
}
},
"ghostty-hm": {
"locked": {
"lastModified": 1702368251,
"narHash": "sha256-hafrDmzGplzm+vdIo+LkOjRfA4qRcy5JmpGGksnht5c=",
"owner": "clo4",
"repo": "ghostty-hm-module",
"rev": "887e13a6e7acf5ffaab0119d96e476d84db90904",
"lastModified": 1731533236,
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
"owner": "clo4",
"repo": "ghostty-hm-module",
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"ghostty": {
"inputs": {
"flake-compat": "flake-compat",
"nixpkgs-stable": "nixpkgs-stable",
"nixpkgs-unstable": "nixpkgs-unstable",
"zig": "zig"
},
"locked": {
"lastModified": 1736911212,
"narHash": "sha256-OLly4X2kN1tDb2gMYcWeim6uJECPoc52ltJsz1iD5Ug=",
"owner": "ghostty-org",
"repo": "ghostty",
"rev": "ff9414d9ea7b16a375d41cde8f6f193de7e5db72",
"type": "github"
},
"original": {
"owner": "ghostty-org",
"repo": "ghostty",
"type": "github"
}
},
"git-hooks": {
"inputs": {
"flake-compat": "flake-compat_3",
"gitignore": "gitignore",
"nixpkgs": [
"neovim-nightly-overlay",
"nixpkgs"
]
},
"locked": {
"lastModified": 1735882644,
"narHash": "sha256-3FZAG+pGt3OElQjesCAWeMkQ7C/nB1oTHLRQ8ceP110=",
"owner": "cachix",
"repo": "git-hooks.nix",
"rev": "a5a961387e75ae44cc20f0a57ae463da5e959656",
"type": "github"
},
"original": {
"owner": "cachix",
"repo": "git-hooks.nix",
"type": "github"
}
},
"gitignore": {
"inputs": {
"nixpkgs": [
"neovim-nightly-overlay",
"git-hooks",
"nixpkgs"
]
},
"locked": {
"lastModified": 1709087332,
"narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
"owner": "hercules-ci",
"repo": "gitignore.nix",
"rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "gitignore.nix",
"type": "github"
}
},
"hercules-ci-effects": {
"inputs": {
"flake-parts": "flake-parts_2",
"nixpkgs": [
"neovim-nightly-overlay",
"nixpkgs"
]
},
"locked": {
"lastModified": 1735695978,
"narHash": "sha256-cwk53OX1S1bCFY09zydubZNmmwcx9l5XEba8mVYuNE4=",
"owner": "hercules-ci",
"repo": "hercules-ci-effects",
"rev": "f6233b5cfbada692d93a73d6ed35bdbfd0fdb9c4",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "hercules-ci-effects",
"type": "github"
}
},
@ -64,11 +221,11 @@
]
},
"locked": {
"lastModified": 1730633670,
"narHash": "sha256-ZFJqIXpvVKvzOVFKWNRDyIyAo+GYdmEPaYi1bZB6uf0=",
"lastModified": 1736785676,
"narHash": "sha256-TY0jUwR3EW0fnS0X5wXMAVy6h4Z7Y6a3m+Yq++C9AyE=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "8f6ca7855d409aeebe2a582c6fd6b6a8d0bf5661",
"rev": "fc52a210b60f2f52c74eac41a8647c1573d2071d",
"type": "github"
},
"original": {
@ -77,13 +234,190 @@
"type": "github"
}
},
"jujutsu": {
"inputs": {
"flake-utils": "flake-utils_2",
"nixpkgs": "nixpkgs",
"rust-overlay": "rust-overlay"
},
"locked": {
"lastModified": 1735928141,
"narHash": "sha256-KN5rfdDj3vB/GNVw4YZU4tJv2BnUQiQdOz1kEQyketI=",
"owner": "dln",
"repo": "jj",
"rev": "cb103fb4692c4e2b90c4663804b81a5ff1e49c06",
"type": "github"
},
"original": {
"owner": "dln",
"ref": "openssh",
"repo": "jj",
"type": "github"
}
},
"neovim-nightly-overlay": {
"inputs": {
"flake-compat": "flake-compat_2",
"flake-parts": "flake-parts",
"git-hooks": "git-hooks",
"hercules-ci-effects": "hercules-ci-effects",
"neovim-src": "neovim-src",
"nixpkgs": "nixpkgs_2",
"treefmt-nix": "treefmt-nix"
},
"locked": {
"lastModified": 1736924666,
"narHash": "sha256-1Mnw9hNMmsnfZuNbeTgmRev99vLZ9FsgrfCChjwnzSk=",
"owner": "nix-community",
"repo": "neovim-nightly-overlay",
"rev": "7e61ee6d94536d30888c2fbeb1e9d53f4aa3f8b8",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "neovim-nightly-overlay",
"type": "github"
}
},
"neovim-src": {
"flake": false,
"locked": {
"lastModified": 1736864394,
"narHash": "sha256-QEbgudJG4M9kVmuhGDEG2EP397zAbPmnZ5DX2GFwZCI=",
"owner": "neovim",
"repo": "neovim",
"rev": "e8a6c1b02122852da83dc52184e78369598d8240",
"type": "github"
},
"original": {
"owner": "neovim",
"repo": "neovim",
"type": "github"
}
},
"nix-index-database": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1736652904,
"narHash": "sha256-8uolHABgroXqzs03QdulHp8H9e5kWQZnnhcda1MKbBM=",
"owner": "nix-community",
"repo": "nix-index-database",
"rev": "271e5bd7c57e1f001693799518b10a02d1123b12",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "nix-index-database",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1730531603,
"narHash": "sha256-Dqg6si5CqIzm87sp57j5nTaeBbWhHFaVyG7V6L8k3lY=",
"lastModified": 1731890469,
"narHash": "sha256-D1FNZ70NmQEwNxpSSdTXCSklBH1z2isPR84J6DQrJGs=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "5083ec887760adfe12af64830a66807423a859a7",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-stable": {
"locked": {
"lastModified": 1733423277,
"narHash": "sha256-TxabjxEgkNbCGFRHgM/b9yZWlBj60gUOUnRT/wbVQR8=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "7ffd9ae656aec493492b44d0ddfb28e79a1ea25d",
"rev": "e36963a147267afc055f7cf65225958633e536bf",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "release-24.11",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-stable_2": {
"locked": {
"lastModified": 1736867362,
"narHash": "sha256-i/UJ5I7HoqmFMwZEH6vAvBxOrjjOJNU739lnZnhUln8=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "9c6b49aeac36e2ed73a8c472f1546f6d9cf1addc",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-24.11",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-unstable": {
"locked": {
"lastModified": 1733229606,
"narHash": "sha256-FLYY5M0rpa5C2QAE3CKLYAM6TwbKicdRK6qNrSHlNrE=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "566e53c2ad750c84f6d31f9ccb9d00f823165550",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-unstable_2": {
"locked": {
"lastModified": 1736848588,
"narHash": "sha256-9B6fQqphF3j9lpcxQnKyIUgp3NyGi7ikb9CjCYqixcY=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "357cd3dfdb8993af11268d755d53357720675e66",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_2": {
"locked": {
"lastModified": 1736848588,
"narHash": "sha256-9B6fQqphF3j9lpcxQnKyIUgp3NyGi7ikb9CjCYqixcY=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "357cd3dfdb8993af11268d755d53357720675e66",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_3": {
"locked": {
"lastModified": 1736798957,
"narHash": "sha256-qwpCtZhSsSNQtK4xYGzMiyEDhkNzOCz/Vfu4oL2ETsQ=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "9abb87b552b7f55ac8916b6fc9e5cb486656a2f3",
"type": "github"
},
"original": {
@ -93,29 +427,37 @@
"type": "github"
}
},
"nixpkgs-stable": {
"locked": {
"lastModified": 1730741070,
"narHash": "sha256-edm8WG19kWozJ/GqyYx2VjW99EdhjKwbY3ZwdlPAAlo=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "d063c1dd113c91ab27959ba540c0d9753409edf3",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-24.05",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"ghostty": "ghostty",
"ghostty-hm": "ghostty-hm",
"home-manager": "home-manager",
"nixpkgs": "nixpkgs",
"nixpkgs-stable": "nixpkgs-stable"
"jujutsu": "jujutsu",
"neovim-nightly-overlay": "neovim-nightly-overlay",
"nix-index-database": "nix-index-database",
"nixpkgs": "nixpkgs_3",
"nixpkgs-stable": "nixpkgs-stable_2",
"nixpkgs-unstable": "nixpkgs-unstable_2"
}
},
"rust-overlay": {
"inputs": {
"nixpkgs": [
"jujutsu",
"nixpkgs"
]
},
"locked": {
"lastModified": 1732242723,
"narHash": "sha256-NWI8csIK0ujFlFuEXKnoc+7hWoCiEtINK9r48LUUMeU=",
"owner": "oxalica",
"repo": "rust-overlay",
"rev": "a229311fcb45b88a95fdfa5cecd8349c809a272a",
"type": "github"
},
"original": {
"owner": "oxalica",
"repo": "rust-overlay",
"type": "github"
}
},
"systems": {
@ -133,6 +475,42 @@
"type": "github"
}
},
"systems_2": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
},
"treefmt-nix": {
"inputs": {
"nixpkgs": [
"neovim-nightly-overlay",
"nixpkgs"
]
},
"locked": {
"lastModified": 1736154270,
"narHash": "sha256-p2r8xhQZ3TYIEKBoiEhllKWQqWNJNoT9v64Vmg4q8Zw=",
"owner": "numtide",
"repo": "treefmt-nix",
"rev": "13c913f5deb3a5c08bb810efd89dc8cb24dd968b",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "treefmt-nix",
"type": "github"
}
},
"zig": {
"inputs": {
"flake-compat": [

View file

@ -1,28 +1,38 @@
{
description = "NixOS configuration";
nixConfig = {
substituters = [
"https://cache-nixos-org.aarn.patagia.net/"
];
extra-substituters = [
"https://nix-community.cachix.org"
];
extra-trusted-public-keys = [
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
];
};
inputs = {
ghostty.url = "github:ghostty-org/ghostty";
jujutsu.url = "github:dln/jj/openssh";
neovim-nightly-overlay.url = "github:nix-community/neovim-nightly-overlay";
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-24.05";
nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-24.11";
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixpkgs-unstable";
nix-index-database.url = "github:nix-community/nix-index-database";
nix-index-database.inputs.nixpkgs.follows = "nixpkgs";
home-manager.url = "github:nix-community/home-manager";
home-manager.inputs.nixpkgs.follows = "nixpkgs";
ghostty = {
url = "git+ssh://git@github.com/ghostty-org/ghostty";
inputs = {
nixpkgs-stable.follows = "nixpkgs";
nixpkgs-unstable.follows = "nixpkgs";
};
};
ghostty-hm.url = "github:clo4/ghostty-hm-module";
};
outputs =
inputs@{
self,
nix-index-database,
nixpkgs,
ghostty-hm,
home-manager,
...
}:
@ -48,8 +58,8 @@
inherit inputs outputs;
};
modules = [
ghostty-hm.homeModules.default
./home/common
nix-index-database.hmModules.nix-index
] ++ modules;
};
in
@ -60,6 +70,9 @@
packages = with pkgs; [
just
nh
nil
nixd
nixfmt-rfc-style
];
};
@ -73,7 +86,6 @@
"dln@dinky" = mkHome [ ./home/dln/dinky.nix ];
"dln@nemo" = mkHome [ ./home/dln/nemo.nix ];
"dln@pearl" = mkHome [ ./home/dln/pearl.nix ];
"lsjostro@nemo" = mkHome [ ./home/lsjostro/nemo.nix ];
};
};
}

View file

@ -13,7 +13,7 @@
search_mode_shell_up_key_binding = "prefix";
show_help = false;
style = "compact";
sync_address = "https://atuin.patagia.dev";
sync_address = "https://atuin.patagia.net";
sync.records = true;
daemon = {

View file

@ -19,4 +19,6 @@
];
options.patagia.desktop.enable = lib.mkEnableOption "Desktop environment";
options.patagia.laptop.enable = lib.mkEnableOption "Laptop";
options.patagia.oled.enable = lib.mkEnableOption "Darker darks on oled screens";
}

View file

@ -2,32 +2,16 @@
{
home.packages = with pkgs; [
age-plugin-fido2-hmac
bacon
cargo
clang
codeium
comma
dogdns
gnumake
go
file
just
ldns
minio-client
nil
nix-output-monitor
nixd
nixfmt-rfc-style
nodejs_22
passage
rage
prettierd
rust-analyzer
rustc
stylua
tree-sitter
];
home.sessionVariables = {
GOPROXY = "https://athena.patagia.dev";
GOPROXY = "https://athena.patagia.net";
};
}

View file

@ -1,14 +1,9 @@
{ lib, pkgs, ... }:
{
programs.fish = {
enable = true;
plugins = [
{
name = "grc";
src = pkgs.fishPlugins.grc.src;
}
{
name = "transient";
src = pkgs.fishPlugins.transient-fish.src;
@ -43,40 +38,11 @@
body = ''confirm " Really shutdown $(hostname)?" && command shutdown $argv'';
};
tmux-refresh-env = {
description = "Refresh environment variables from tmux session";
body = ''
for var in (tmux show-environment | string match -rv '^-')
set -l parts (string split -m 1 '=' $var)
if test (count $parts) -eq 2
set -Ux $parts[1] $parts[2]
end
end
'';
};
kubectl = {
description = "Wraps kubectl in grc";
wraps = "kubectl";
body = "grc.wrap kubectl $argv";
};
edit = {
description = "Open a file in already running nvim and switch tab";
e = {
description = "Open a file in already running nvim";
argumentNames = [ "file" ];
body = ''
set _file (readlink -f "$file")
if test -z "$file"
set _root (vcs_root)
set _file (fd --type f . "$_root" | sed -e "s#^$_root/##" | fzf --no-sort --layout=reverse)
set _file "$_root/$_file"
end
set _nvim_socket "$XDG_RUNTIME_DIR/nvim-persistent.sock"
if test -S "$_nvim_socket" && tmux select-window -t nvim 2>/dev/null
nvim --server "$_nvim_socket" --remote "$_file"
return 0
end
tmux new-window -S -n nvim nvim --listen "$_nvim_socket" "$_file"
nvim-remote --remote (readlink -f "$file")
'';
};
@ -90,61 +56,52 @@
'';
fish_jj_prompt.body = ''
# Is jj installed?
if not command -sq jj
if not command -sq jj || not jj root --quiet &>/dev/null
return 1
end
end
# Are we in a jj repo?
if not jj root --quiet &>/dev/null
return 1
end
# Generate prompt
jj log --ignore-working-copy --no-graph --color always -r @ -T '
separate(
" ",
change_id.shortest(),
coalesce(
surround(
"\"",
"\"",
if(
description.first_line().substr(0, 24).starts_with(description.first_line()),
description.first_line().substr(0, 24),
description.first_line().substr(0, 23) ++ ""
)
),
"(no description set)"
),
bookmarks.join(", "),
commit_id.shortest(),
if(conflict, "(conflict)"),
if(empty, "(empty)"),
if(divergent, "(divergent)"),
if(hidden, "(hidden)"),
)
jj log --ignore-working-copy --no-graph --color never -r @ -T '
surround(
" \e[2;3m",
"\e[0m",
separate(
" ",
surround(
"\e[0;2;3m",
"\e[0m",
coalesce(
surround(
"\e[1;2;3m",
"\e[0m",
if(
description.first_line().substr(0, 80).starts_with(description.first_line()),
description.first_line().substr(0, 80),
description.first_line().substr(0, 79) ++ ""
)
),
""
),
),
surround("\e[0;1;95m ", "\e[0;2;3m", change_id.shortest()),
surround("\e[0;35m󰸕 ", "\e[0m", bookmarks.join("")),
surround("\e[0;34m ", "\e[0;2;3m", commit_id.shortest()),
if(conflict, "󰂭"),
if(empty, ""),
if(divergent, ""),
if(hidden, "󰘓"),
)
)
'
'';
fish_prompt.body = ''
echo
string join "" -- (set_color --italics) (prompt_hostname) ':' (prompt_pwd --full-length-dirs=4) (set_color yellow) ' ' (set_color normal)
'';
fish_right_prompt.body = ''
fish_jj_prompt || fish_vcs_prompt
if test $CMD_DURATION -gt 3000
# Show duration of the last command in seconds
set duration (echo "$CMD_DURATION 1000" | awk '{printf "%.1fs", $1 / $2}')
echo " $duration"
end
echo -e "\033[s\033[$LINES;1H\033[1;2;38;5;238m$(string pad -c '' -w $COLUMNS (fish_jj_prompt || fish_vcs_prompt))\033[0m\033[u"
string join "" -- (set_color --dim) (prompt_hostname) ':' (prompt_pwd --full-length-dirs=4) (set_color --bold normal) ' ' (set_color normal)
'';
transient_prompt_func.body = ''
echo
string join "" -- (set_color yellow) ' ' (set_color normal)
string join "" -- (set_color --bold) ' ' (set_color normal)
'';
rg.body = ''
@ -159,19 +116,14 @@
interactiveShellInit = lib.concatStringsSep "\n" [
(builtins.readFile ../../files/config/fish/config.fish)
(builtins.readFile ../../files/config/fish/semantic-prompt.fish)
(builtins.readFile ../../files/config/fish/go-task.fish)
(builtins.readFile ../../files/config/fish/jj.fish)
(builtins.readFile ../../files/config/fish/vcs.fish)
];
shellAbbrs = {
e = "edit";
l = "bat";
ls = "eza";
tree = "eza --tree";
top = "btm --basic --enable_cache_memory --battery";
ts = "TZ=Z date '+%Y%m%dT%H%M%SZ'";
w = "viddy -n1 $history[1]";
w = "viddy $history[1]";
xc = "fish_clipboard_copy";
};
};

View file

@ -5,102 +5,79 @@
pkgs,
...
}:
let
launch-ghostty = pkgs.writeShellApplication {
name = "launch-ghostty";
text = ''
if [ "$(gsettings get org.gnome.desktop.interface color-scheme)" = "'prefer-dark'" ]; then
theme="theme_dark"
else
theme="theme_light"
fi
exec ghostty --config-file="$HOME/.config/ghostty/$theme" "$@"
'';
};
in
{
config = lib.mkIf config.patagia.desktop.enable {
home.packages = with pkgs; [
inputs.ghostty.packages.${pkgs.system}.default
launch-ghostty
];
programs.ghostty = {
enable = true;
enableFishIntegration = true;
package = inputs.ghostty.packages.${pkgs.system}.default;
settings = {
font-size = 14;
font-family = "Berkeley Mono Variable";
font-size = 12.5;
font-family = "TX-02";
font-family-bold-italic = "Monaspace Xenon";
font-style-bold = "Bold";
font-style-italic = "Light Oblique";
font-style-bold-italic = "ExtraLight Italic";
font-synthetic-style = false;
font-variation-italic = [ "wght=100" ];
adjust-cell-height = 1;
adjust-cursor-thickness = 5;
adjust-font-baseline = 1;
adjust-underline-position = 2;
adjust-underline-thickness = -1;
adjust-cursor-thickness = 4;
adjust-underline-position = 5;
adjust-underline-thickness = -2;
mouse-hide-while-typing = true;
cursor-style = "block";
unfocused-split-opacity = 1.0;
shell-integration = "fish";
window-decoration = false;
gtk-tabs-location = "bottom";
gtk-titlebar = false;
window-padding-x = 12;
window-padding-y = 0;
gtk-tabs-location = "hidden";
gtk-titlebar = true;
gtk-titlebar-hide-when-maximized = true;
window-padding-balance = true;
window-padding-color = "extend";
window-theme = "system";
theme = "light:PatagiaLight,dark:PatagiaDark";
keybind = [
"alt+shift+c=copy_to_clipboard"
"alt+shift+v=paste_from_clipboard"
"ctrl+i=text:\\x09"
"ctrl+m=text:\\x0D"
"ctrl+tab=goto_split:previous"
"ctrl+[=text:\\x1B"
"super+enter=toggle_fullscreen"
"ctrl+enter=unbind"
"alt+one=unbind"
"alt+two=unbind"
"alt+three=unbind"
"alt+four=unbind"
"alt+five=unbind"
"alt+six=unbind"
"alt+seven=unbind"
"alt+eight=unbind"
"alt+nine=unbind"
];
};
};
xdg.configFile."ghostty/theme_dark".text = ''
background = #0d1117
foreground = #b2b2b2
cursor-color = #00d992
selection-background = #d7d7d7
selection-foreground = #000000
palette = 0=#000000
palette = 1=#ff0035
palette = 2=#85ff00
palette = 3=#ffc900
palette = 4=#00a7ff
palette = 5=#cb01ff
palette = 6=#00e0ff
palette = 7=#f0f0f0
palette = 8=#444444
palette = 9=#ff8c88
palette = 10=#baff94
palette = 11=#ffe090
palette = 12=#88ccff
palette = 13=#e38dff
palette = 14=#97eeff
palette = 15=#ffffff
'';
xdg.configFile."ghostty/themes/PatagiaDark".text =
let
background = if config.patagia.oled.enable then "#000000" else "#14151a";
in
''
background = "${background}"
foreground = #b7bec7
cursor-color = #e7e7b7
selection-background = #84979f
selection-foreground = #000000
palette = 0=#000000
palette = 1=#ff0035
palette = 2=#85ff00
palette = 3=#ffc900
palette = 4=#00a7ff
palette = 5=#cb01ff
palette = 6=#00e0ff
palette = 7=#b7bec7
palette = 8=#444444
palette = 9=#ff8c88
palette = 10=#baff94
palette = 11=#ffe090
palette = 12=#88ccff
palette = 13=#e38dff
palette = 14=#97eeff
palette = 15=#ffffff
'';
xdg.configFile."ghostty/theme_light".text = ''
xdg.configFile."ghostty/themes/PatagiaLight".text = ''
background = #fefeff
foreground = #222222
cursor-color = #aa0000
@ -125,35 +102,58 @@ in
'';
xdg.desktopEntries = {
ghostty-local = {
ghostty-secondary = {
categories = [
"System"
"TerminalEmulator"
];
exec = ''launch-ghostty --class=com.mitchellh.ghostty-local -e "tmux new-session -A -s0 -nt1"'';
genericName = "Ghostty (local)";
exec = ''
ghostty --class=com.mitchellh.ghostty-secondary --font-style="ExtraCondensed" --font-style-bold="Bold ExtraCondensed" --font-style-italic="ExtraCondensed Oblique" -e bash
'';
genericName = "Ghostty Secondary";
icon = "com.mitchellh.ghostty";
name = "Ghostty (local)";
name = "Ghostty Secondary";
settings = {
StartupWMClass = "com.mitchellh.ghostty-local";
TryExec = "launch-ghostty";
StartupWMClass = "com.mitchellh.ghostty-secondary";
TryExec = "ghostty";
};
terminal = false;
type = "Application";
};
ghostty-nemo = {
ghostty-devel = {
categories = [
"System"
"TerminalEmulator"
];
exec = ''launch-ghostty --class=com.mitchellh.ghostty-nemo -e "ssh -t nemo tmux new-session -A -s0 -nt1"'';
genericName = "Ghostty (nemo)";
exec = ''
ghostty --class=com.mitchellh.ghostty-devel --command="ssh -t devel" --initial-command="ssh -t devel"
'';
genericName = "Ghostty (devel)";
icon = "com.mitchellh.ghostty";
name = "Ghostty (nemo)";
name = "Ghostty (devel)";
settings = {
StartupWMClass = "com.mitchellh.ghostty-nemo";
TryExec = "launch-ghostty";
StartupWMClass = "com.mitchellh.ghostty-devel";
TryExec = "ghostty";
};
terminal = false;
type = "Application";
};
ghostty-devel-secondary = {
categories = [
"System"
"TerminalEmulator"
];
exec = ''
ghostty --class=com.mitchellh.ghostty-devel-secondary --font-style="ExtraCondensed" --font-style-bold="Bold ExtraCondensed" --font-style-italic="ExtraCondensed Oblique" --command="ssh -t devel" --initial-command="ssh -t devel"
'';
genericName = "Ghostty Secondary (devel)";
icon = "com.mitchellh.ghostty";
name = "Ghostty Secondary (devel)";
settings = {
StartupWMClass = "com.mitchellh.ghostty-devel-secondary";
TryExec = "ghostty";
};
terminal = false;
type = "Application";

View file

@ -13,7 +13,6 @@ with lib.hm.gvariant;
gnomeExtensions.desktop-clock
gnomeExtensions.emoji-copy
gnomeExtensions.just-perfection
gnomeExtensions.vitals
];
dconf.settings = {
@ -168,7 +167,6 @@ with lib.hm.gvariant;
enabled-extensions = [
"emoji-copy@felipeftn"
"just-perfection-desktop@just-perfection"
"Vitals@CoreCoding.com"
];
};
@ -187,10 +185,6 @@ with lib.hm.gvariant;
top-panel-position = 0;
};
"org/gnome/shell/extensions/vitals" = {
update-time = 15;
};
"org/gnome/tweaks" = {
show-extensions-notice = false;
};

View file

@ -0,0 +1,69 @@
require 'blink-cmp'.setup({
keymap = {
preset = 'enter',
['<Tab>'] = { 'select_next', 'fallback' },
['<S-Tab>'] = { 'select_prev', 'fallback' },
['<PageDown>'] = { 'scroll_documentation_down', 'fallback' },
['<PageUp>'] = { 'scroll_documentation_up', 'fallback' },
},
completion = {
accept = {
auto_brackets = { enabled = true, },
},
documentation = {
auto_show = true,
auto_show_delay_ms = 800,
window = { border = 'rounded', },
},
ghost_text = { enabled = false },
list = {
selection = {
preselect = false,
auto_insert = false
},
},
menu = {
auto_show = true,
border = 'rounded',
direction_priority = { 'n' },
draw = {
components = {
kind_icon = {
ellipsis = false,
text = function(ctx)
local kind_icon, _, _ = require('mini.icons').get('lsp', ctx.kind)
return kind_icon
end,
-- Optionally, you may also use the highlights from mini.icons
highlight = function(ctx)
local _, hl, _ = require('mini.icons').get('lsp', ctx.kind)
return hl
end,
}
}
}
}
},
fuzzy = {
prebuilt_binaries = {
download = false
},
},
signature = {
enabled = true,
window = { border = 'rounded', },
},
sources = {
default = { 'lsp' },
cmdline = {},
providers = {},
},
})

View file

@ -1,106 +1,171 @@
{ lib, pkgs, ... }:
{
inputs,
lib,
pkgs,
...
}:
let
nvim-remote = pkgs.writeShellApplication {
name = "nvim-remote";
text = ''
_sess=$(echo -n "$USER@''${SSH_CONNECTION:-$HOSTNAME}" | tr -c '[:alnum:]@.' '_')
_nvim_sock="''${XDG_RUNTIME_DIR:-/tmp}/nvim.$_sess.sock"
exec nvim --listen "$_nvim_sock" --server "$_nvim_sock" "$@"
'';
};
in
{
imports = [
./treesitter.nix
];
home.packages = [ nvim-remote ];
programs.man.generateCaches = false;
programs.neovim = {
enable = true;
enable = true;
package = inputs.neovim-nightly-overlay.packages.${pkgs.system}.default;
defaultEditor = true;
viAlias = true;
vimAlias = true;
withNodeJs = false;
withPython3 = false;
withRuby = false;
viAlias = true;
vimAlias = true;
withNodeJs = false;
withPython3 = false;
withRuby = false;
extraLuaConfig = lib.fileContents ./init.lua;
extraPackages = with pkgs; [
black
cue
go
gopls
gotools
codeium
harper
lua-language-server
nil
nixd
nodePackages.prettier
nodePackages.typescript
nodePackages.typescript-language-server
nodePackages.bash-language-server
rust-analyzer
shellcheck
shfmt
stylua
tree-sitter
tree-sitter-grammars.tree-sitter-bash
tree-sitter-grammars.tree-sitter-yaml
tree-sitter-grammars.tree-sitter-go
tree-sitter-grammars.tree-sitter-markdown
tree-sitter-grammars.tree-sitter-lua
tree-sitter-grammars.tree-sitter-html
tree-sitter-grammars.tree-sitter-vim
tree-sitter-grammars.tree-sitter-nix
vscode-langservers-extracted
];
plugins = with pkgs.vimPlugins; [
friendly-snippets
go-nvim
rustaceanvim
targets-vim
targets-vim
ts-comments-nvim
{
plugin = pkgs.vimUtils.buildVimPlugin {
name = "direnv-nvim";
src = pkgs.fetchFromGitHub {
owner = "actionshrimp";
repo = "direnv.nvim";
rev = "main";
hash = "sha256-7NcVskgAurbIuEVIXxHvXZfYQBOEXLURGzllfVEQKNE=";
};
};
type = "lua";
config = ''
require('direnv-nvim').setup {
type = "dir"
}
'';
}
{
plugin = nvim-lspconfig;
type = "lua";
config = lib.fileContents ./lsp.lua;
}
{
plugin = blink-cmp;
type = "lua";
config = lib.fileContents ./blink-cmp.lua;
}
{
plugin = pkgs.vimUtils.buildVimPlugin {
name = "blink.compat";
src = pkgs.fetchFromGitHub {
owner = "saghen";
repo = "blink.compat";
rev = "5ca8848c8cc32abdc980e5db4f0eb7bb8fbf84dc"; # Dec 25, 2024
hash = "sha256-tFQeKyqdo3mvptYnWxKhTpI4ROFNQ6u3P8cLqtlsozw=";
};
};
type = "lua";
config = ''
require('blink.compat').setup()
'';
}
{
plugin = pkgs.vimUtils.buildVimPlugin {
name = "inlay-hints";
src = pkgs.fetchFromGitHub {
owner = "MysticalDevil";
repo = "inlay-hints.nvim";
rev = "3259b54f3b954b4d8260f3ee49ceabe978ea5636";
hash = "sha256-99KCGoPowa4PA1jkCm4ZbbgrFl84NWnKQMgkfy8KS5E=";
};
};
type = "lua";
config = ''
require('inlay-hints').setup {
autocmd = { enable = false },
}
'';
}
{
plugin = pkgs.vimUtils.buildVimPlugin {
name = "neocodeium";
src = pkgs.fetchFromGitHub {
owner = "monkoose";
repo = "neocodeium";
rev = "4da81528468b33585c411f31eb390dce573ccb14"; # v1.8.0
hash = "sha256-1n9nNqBNwNDSzbAkm8eB4HZLNy5HmMg25jPwQAnW5OU=";
};
doCheck = false;
};
type = "lua";
config = ''
local neocodeium =require('neocodeium')
neocodeium.setup()
vim.keymap.set("i", "<C-j>", neocodeium.accept, { remap = true })
vim.keymap.set("i", "<A-f>", neocodeium.accept, { remap = true })
vim.keymap.set("i", "<C-h>", neocodeium.cycle_or_complete, { remap = true })
'';
}
{
plugin = pkgs.vimUtils.buildVimPlugin {
name = "diagflow";
src = pkgs.fetchFromGitHub {
owner = "dgagn";
repo = "diagflow.nvim";
rev = "fc09d55d2e60edc8ed8f9939ba97b7b7e6488c99";
hash = "sha256-2WNuaIEXcAgUl2Kb/cCHEOrtehw9alaoM96qb4MLArw=";
};
};
type = "lua";
config = ''
require('diagflow').setup {
scope = "line",
gap_size = 0,
max_width = 50,
max_height = 20,
show_borders = true,
toggle_event = { "InsertEnter", "InsertLeave" },
}
'';
}
{
plugin = pkgs.vimUtils.buildVimPlugin {
name = "dieter-nvim";
src = pkgs.fetchgit {
url = "https://patagia.dev/Patagia/dieter.nvim.git";
rev = "08fae6ffec4ae70ba6b2e1cafa780ff317ef0b61";
hash = "sha256-C+Vo2SUVfNMkBwuLWqLoA59Pmy9aFwur7fBpfVkLm6Q=";
};
src = ./dieter;
};
type = "lua";
config = ''
vim.cmd.colorscheme "dieter"
'';
}
{
plugin = nvim-treesitter.withAllGrammars; # Treesitter
type = "lua";
config = ''
require'nvim-treesitter.configs'.setup {
highlight = { enable = true, },
indent = { enable = true },
}
'';
}
{
plugin = pkgs.vimUtils.buildVimPlugin {
name = "nvim-tree-pairs"; # make % match in TS
src = pkgs.fetchFromGitHub {
owner = "yorickpeterse";
repo = "nvim-tree-pairs";
rev = "e7f7b6cc28dda6f3fa271ce63b0d371d5b7641da";
hash = "sha256-fb4EsrWAbm8+dWAhiirCPuR44MEg+KYb9hZOIuEuT24=";
};
};
type = "lua";
config = "require('tree-pairs').setup()";
}
{
plugin = nvim-treesitter-textobjects; # helix-style selection of TS tree
type = "lua";
config = ''
require'nvim-treesitter.configs'.setup {
incremental_selection = {
enable = true,
keymaps = {
init_selection = "<M-o>",
scope_incremental = "<M-O>",
node_incremental = "<M-o>",
node_decremental = "<M-i>",
},
},
}
vim.cmd.colorscheme "dieter-nocolor"
'';
}
@ -111,10 +176,11 @@
}
{
plugin = nvim-lspconfig; # Interface for LSPs
plugin = rustaceanvim;
type = "lua";
config = lib.fileContents ./lsp.lua;
config = lib.fileContents ./rust.lua;
}
];
};
}

View file

@ -0,0 +1,2 @@
package.loaded["dieter"] = nil
require("dieter").setup_nocolor()

View file

@ -0,0 +1,2 @@
package.loaded["dieter"] = nil
require("dieter").setup()

View file

@ -0,0 +1,71 @@
-- https://github.com/EmmanuelOga/columns/blob/master/utils/color.lua
local M = {}
--- Converts an HSL color value to RGB. Conversion formula
--- adapted from http://en.wikipedia.org/wiki/HSL_color_space.
--- Assumes h, s, and l are contained in the set [0, 1] and
--- returns r, g, and b in the set [0, 255].
---
--- @param h number The hue
--- @param s number The saturation
--- @param l number The lightness
--- @return number, number, number # The RGB representation
function M.hslToRgb(h, s, l)
--- @type number, number, number
local r, g, b
if s == 0 then
r, g, b = l, l, l -- achromatic
else
--- @param p number
--- @param q number
--- @param t number
local function hue2rgb(p, q, t)
if t < 0 then
t = t + 1
end
if t > 1 then
t = t - 1
end
if t < 1 / 6 then
return p + (q - p) * 6 * t
end
if t < 1 / 2 then
return q
end
if t < 2 / 3 then
return p + (q - p) * (2 / 3 - t) * 6
end
return p
end
--- @type number
local q
if l < 0.5 then
q = l * (1 + s)
else
q = l + s - l * s
end
local p = 2 * l - q
r = hue2rgb(p, q, h + 1 / 3)
g = hue2rgb(p, q, h)
b = hue2rgb(p, q, h - 1 / 3)
end
return r * 255, g * 255, b * 255
end
--- Converts an HSL color value to RGB in Hex representation.
--- @param h number The hue
--- @param s number The saturation
--- @param l number The lightness
--- @return string # The hex representation
function M.hslToHex(h, s, l)
local r, g, b = M.hslToRgb(h / 360, s / 100, l / 100)
return string.format("#%02x%02x%02x", r, g, b)
end
return M

View file

@ -0,0 +1,269 @@
local hsl = require("dieter.hsl").hslToHex
local colors = {
light = {
background = "NONE",
foreground = "NONE",
accent1 = hsl(12, 100, 50),
dimmed = hsl(0, 0, 80),
dimmed_subtle = hsl(0, 0, 20),
string = hsl(96, 50, 33),
comment = hsl(230, 66, 40),
comment_error = hsl(2, 85, 40),
diagnostic_error = hsl(347, 80, 45),
diagnostic_warning = hsl(30, 100, 50),
diagnostic_info = hsl(145, 80, 30),
diagnostic_hint = hsl(145, 80, 30),
popup_error_bg = hsl(0, 90, 99),
popup_warning_bg = hsl(27, 90, 99),
popup_info_bg = hsl(112, 90, 99),
popup_hint_bg = hsl(112, 90, 99),
add = hsl(84, 50, 80),
add_quarter = hsl(84, 80, 95),
change = hsl(41, 80, 80),
change_quarter = hsl(224, 100, 85),
delete = hsl(350, 100, 40),
dialog_bg = hsl(224, 5, 92),
selection = hsl(270, 75, 92),
highlight_subtle = hsl(0, 0, 94),
highlight_intense = hsl(42, 100, 30),
},
dark = {
background = "NONE",
foreground = "NONE",
accent1 = hsl(202, 57, 57), -- Blue
accent2 = hsl(40, 57, 57), -- Yellow
dimmed = hsl(212, 19, 25),
dimmed_subtle = hsl(212, 19, 50),
highlight_subtle = hsl(212, 27, 11),
highlight = hsl(212, 27, 18),
highlight_intense = hsl(58, 100, 60),
dialog_fg = hsl(191, 15, 75),
string = hsl(90, 30, 60),
-- comment = hsl(2, 69, 68),
comment = hsl(216, 30, 55),
comment_error = hsl(2, 85, 50),
func = hsl(40, 57, 87),
member = hsl(213, 45, 75),
punc = hsl(213, 45, 50),
diagnostic_error = hsl(353, 100, 45),
diagnostic_warning = hsl(30, 100, 50),
diagnostic_info = hsl(176, 80, 60),
diagnostic_hint = hsl(210, 74, 60),
popup_error_bg = hsl(0, 95, 7),
popup_warning_bg = hsl(27, 95, 7),
popup_info_bg = hsl(112, 95, 7),
popup_hint_bg = hsl(112, 95, 7),
add = hsl(100, 100, 12),
add_quarter = hsl(84, 80, 15),
change = hsl(41, 100, 15),
change_quarter = hsl(224, 100, 15),
delete = hsl(350, 100, 40),
delete_quarter = hsl(350, 100, 15),
selection = hsl(218, 90, 20),
search_bg = hsl(43, 100, 8),
search_fg = hsl(43, 100, 85),
cmp_bg = hsl(218, 30, 13),
cmp_fg = hsl(218, 30, 80),
cmp_selected_bg = hsl(218, 30, 25),
cmp_selected_fg = hsl(218, 50, 80),
doc_bg = hsl(220, 80, 10),
doc_fg = hsl(200, 30, 60),
suggestion = hsl(180, 55, 40),
},
}
local setupGroups = function(c)
c.dialog_bg = c.background
return {
Normal = { fg = c.foreground, bg = c.background },
Constant = { link = "NormalNC" },
Delimiter = { link = "NormalNC" },
Function = { fg = c.func },
Identifier = { link = "NormalNC" },
Keyword = { fg = c.foreground, bold = true },
Operator = { link = "NormalNC" },
Special = { link = "NormalNC" },
Type = { link = "NormalNC" },
MsgArea = { fg = c.dimmed_subtle },
String = { fg = c.string },
Visual = { bg = c.selection },
Search = { bg = c.search_bg, fg = c.search_fg },
CurSearch = { link = "Search" },
Comment = { fg = c.comment, italic = true, bold = true },
CommentError = { fg = c.comment_error, italic = true, bold = true },
["@comment.note"] = { link = "Comment" },
["@comment.todo"] = { link = "CommentError" },
["@comment.error"] = { link = "CommentError" },
["@comment.warning"] = { link = "CommentError" },
DiffAdd = { fg = c.add, bg = c.add_quarter },
GitSignsAdd = { fg = c.add, bg = c.background },
GitSignsAddNr = { link = "DiffAdd" },
DiffChange = { fg = c.change, bg = c.change_quarter },
GitSignsChange = { fg = c.change, bg = c.background },
GitSignsChangeNr = { link = "DiffChange" },
DiffDelete = { fg = c.delete, bg = c.delete_quarter },
GitSignsDelete = { fg = c.delete, bg = c.background },
GitSignsDeleteNr = { link = "DiffDelete" },
-- Treesitter
["@punctuation.special"] = { fg = c.punc },
["@special"] = { link = "NormalNC" },
["@variable"] = { link = "NormalNC" },
["@variable.member"] = { fg = c.member },
["@variable.parameter"] = { fg = c.accent2 },
-- UI Elements
CursorLine = { bg = c.highlight_subtle },
DiagnosticError = { fg = c.diagnostic_error, italic = true },
DiagnosticFloatingError = { fg = c.diagnostic_error, bg = c.popup_error_bg },
DiagnosticFloatingWarn = { fg = c.diagnostic_warning, bg = c.popup_warning_bg },
DiagnosticFloatingInfo = { fg = c.diagnostic_info, bg = c.popup_info_bg },
DiagnosticFloatingHint = { fg = c.diagnostic_hint, bg = c.popup_hint_bg },
DiagnosticUnderlineError = { fg = c.foreground, undercurl = true, sp = c.diagnostic_error },
DiagnosticUnderlineWarn = { fg = c.foreground, undercurl = true, sp = c.diagnostic_warn },
DiagnosticUnderlineInfo = { fg = c.foreground, undercurl = true, sp = c.diagnostic_info },
DiagnosticUnderlinehint = { fg = c.foreground, undercurl = true, sp = c.diagnostic_hint },
DiagnosticSignError = { fg = c.diagnostic_error },
DiagnosticSignHint = { fg = c.diagnostic_hint },
DiagnosticSignInfo = { fg = c.diagnostic_info },
DiagnosticSignWarn = { fg = c.diagnostic_warning },
LineNr = { fg = c.dimmed },
CursorLineNr = { fg = c.dimmed_subtle, bg = c.highlight_subtle },
IndentLine = { fg = c.highlight },
IndentLineCurrent = { fg = c.highlight },
MiniIndentscopeSymbol = { link = "IndentLine" },
MiniIndentscopeSymbolOff = { link = "IndentLine" },
TreesitterContext = { reverse = true },
TreesitterContextLineNumber = { bg = c.dimmed, reverse = true, italic = true },
InclineNormal = { bg = c.background },
InclineNormalNC = { bg = c.background },
WinSeparator = { bg = c.dialog_bg, fg = c.dialog_fg },
NormalFloat = { bg = c.background, fg = c.foreground },
FloatBorder = { fg = c.foreground },
FloatTitle = { fg = c.doc_fg, bold = true },
Title = { fg = c.foreground, bold = true },
MiniPickNormal = { bg = c.dialog_bg, fg = c.dialog_fg },
MiniPickBorder = { link = "MiniPickNormal" },
MiniPickBorderText = { link = "MiniPickBorder" },
MiniPickMatchCurrent = { bg = c.dialog_bg, fg = c.dialog_fg, reverse = true },
MiniClueBorder = { link = "MiniPicBorder" },
MiniClueTitle = { bg = c.background, fg = c.foreground, bold = true },
MiniClueNextKey = { link = "MiniClueTitle" },
MiniClueDescGroup = { bg = c.background, fg = c.foreground, italic = true },
MiniClueDescSingle = { bg = c.background, fg = c.foreground },
MiniClueSeparator = { link = "MiniClueBorder" },
MiniCursorWord = { underdotted = true, bold = true, sp = c.diagnostic_hint },
MiniStarterCurrent = { link = "MiniPickMatchCurrent" },
BlinkCmpMenu = { bg = c.cmp_bg, fg = c.cmp_fg },
BlinkCmpMenuSelection = { bg = c.cmp_selected_bg, fg = c.cmp_selected_fg, reverse = false },
BlinkCmpMenuBorder = { bg = c.cmp_bg, fg = c.cmp_fg },
BlinkCmpLabel = { link = 'BlinkCmpMenu' },
BlinkCmpLabelMatch = { link = 'BlinkCmpMenu', underline = true },
BlinkCmpDoc = { bg = c.doc_bg, fg = c.foreground },
BlinkCmpDocBorder = { bg = c.doc_bg, fg = c.doc_fg },
BlinkCmpDocDetail = { link = 'BlinkCmpDoc' },
BlinkCmpSignatureHelp = { link = 'BlinkCmpDoc' },
BlinkCmpSignatureHelpBorder = { link = 'BlinkCmpDocBorder' },
NeoCodeiumSuggestion = { fg = c.suggestion, bold = true, italic = true },
LspReferenceText = { fg = c.highlight_intense, undercurl = true },
LspInlayHint = { fg = c.accent1, italic = true, bold = true },
}
end
local setupGroupsNoColor = function(c)
local g = setupGroups(c)
local cl = { link = "NormalNC" }
g.Constant = cl
g.Delimiter = cl
g.Function = cl
g.Identifier = cl
g.Keyword = cl
g.Operator = cl
g["@punctuation.special"] = cl
g["@special"] = cl
g["@string"] = cl
g["@lsp.type.string"] = cl
g.Special = cl
g.String = cl
g.Type = cl
g.Variable = cl
g["@variable"] = cl
g["@variable.member"] = cl
g["@variable.parameter"] = cl
-- g.Comment = { fg = c.dimmed_subtle, italic = true, bold = true }
g.CommentError = { link = "Comment" }
return g
end
local setup_common = function(groups)
vim.cmd("hi clear")
if vim.fn.exists("syntax_on") == 1 then
vim.cmd("syntax reset")
end
for group, hl in pairs(groups) do
vim.api.nvim_set_hl(0, group, hl)
end
end
local T = {}
T.setup = function()
local c = colors[vim.o.background]
local groups = setupGroups(c)
setup_common(groups)
vim.g.colors_name = "dieter"
end
T.setup_nocolor = function()
local c = colors[vim.o.background]
local groups = setupGroupsNoColor(c)
setup_common(groups)
vim.g.colors_name = "dieter-nocolor"
end
return T

View file

@ -1,12 +1,14 @@
-- vim.g.mapleader = "<space>"
vim.g.maplocalleader = ','
vim.env.RIPGREP_CONFIG_PATH = vim.env.HOME .. "/.config/ripgrep/ripgreprc"
vim.g.mapleader = ' '
vim.g.maplocalleader = ","
-- UI
vim.opt.cursorline = true
vim.opt.laststatus = 0
vim.opt.number = true
vim.opt.relativenumber = true
vim.opt.number = false
vim.opt.relativenumber = false
vim.opt.ruler = true
vim.opt.syntax = "on"
vim.opt.termguicolors = true
@ -14,18 +16,33 @@ vim.opt.termguicolors = true
-- Ruler
function GetIndicators()
local bufnr = vim.api.nvim_get_current_buf()
local counts = vim.diagnostic.count(bufnr)
local errors = counts[vim.diagnostic.severity.ERROR] or 0
local warnings = counts[vim.diagnostic.severity.WARN] or 0
local warn_string = warnings > 0 and "%#DiagnosticWarn# " .. warnings .. " " or " "
local error_string = errors > 0 and "%#DiagnosticError# " .. errors .. " " or " "
return warn_string .. error_string
local counts = vim.diagnostic.count(bufnr)
local errors = counts[vim.diagnostic.severity.ERROR] or 0
local warnings = counts[vim.diagnostic.severity.WARN] or 0
local warn_string = warnings > 0 and "%#DiagnosticWarn# " .. warnings .. " " or ""
local error_string = errors > 0 and "%#DiagnosticError# " .. errors .. " " or ""
return warn_string .. error_string
end
function GetRulerIcon()
local icon = vim.bo.modified and "" or ""
return "%#CustomRulerSeparator#%#CustomRulerIcon#" .. icon .. " "
function CondensedPath()
local path = vim.fn.expand("%:p")
local home = os.getenv("HOME")
if home then
path = vim.fn.substitute(path, '^' .. home, '~', '')
end
local segments = vim.fn.split(path, '/')
if #segments <= 3 then
return path
end
local early_path = table.concat(vim.list_slice(segments, 1, #segments - 2), '/')
local late_path = table.concat(vim.list_slice(segments, #segments - 1), '/')
return vim.fn.pathshorten(early_path) .. '/' .. late_path
end
vim.opt.rulerformat = "%40(%=%{%v:lua.GetIndicators()%}%#Label#│ %t %)"
vim.opt.rulerformat = "%50(%=%{%v:lua.GetIndicators()%}%#MsgArea#%{%v:lua.CondensedPath()%}%)%7(%l:%c%)"
-- Search
vim.opt.ignorecase = true
@ -46,29 +63,28 @@ vim.opt.smartindent = true
vim.opt.tabstop = 2
vim.opt.wrap = false
vim.opt.list = true
im.opt.listchars = "tab:»·,trail:·"
vim.opt.listchars = "tab:»·,trail:·"
-- Folds
vim.opt.foldenable = false
vim.opt.foldtext = "v:lua.vim.treesitter.foldtext()"
vim.opt.foldmethod = "expr"
vim.opt.foldexpr = "nvim_treesitter#foldexpr()"
qqq
--
vim.o.autochdir = true
vim.o.cia = 'kind,abbr,menu'
vim.o.fillchars = "stl: ,stlnc: ,eob:░,vert:│"
vim.o.icm = "split"
vim.o.list = false
vim.o.scrolloff = 7
vim.o.splitkeep = "screen"
vim.o.updatetime = 50
vim.o.timeout = true
vim.o.timeoutlen = 10
vim.o.icm = "split"
-- vim.o.cia = 'kind,abbr,menu' wait for nightly to drop
vim.o.shada = vim.o.shada .. ',r~/.cargo/,r~/go/,r/nix/store/,r/run/,r/tmp/,rhealth:,rterm:'
vim.o.showcmd = false
vim.o.showmode = false
vim.o.smoothscroll = true
vim.o.splitkeep = "screen"
vim.o.timeout = false
vim.o.updatetime = 250
-- Use rg
vim.o.grepprg = [[rg --glob "!.jj" --glob "!.git" --no-heading --vimgrep --follow $*]]
@ -91,6 +107,7 @@ vim.fn.sign_define(
{ text = "", hl = "DiagnosticSignHint", texthl = "DiagnosticSignHint", culhl = "DiagnosticSignHintLine" }
)
-- Make <Tab> work for snippets
vim.keymap.set({ "i", "s" }, "<Tab>", function()
if vim.snippet.active({ direction = 1 }) then
@ -100,8 +117,92 @@ vim.keymap.set({ "i", "s" }, "<Tab>", function()
end
end, { expr = true })
vim.keymap.set({ "n" }, "<c-/>", "gcc", { remap = true })
vim.keymap.set({ "v" }, "<c-/>", "gc", { remap = true })
vim.keymap.set({ "n" }, "<c-_>", "gcc", { remap = true })
vim.keymap.set({ "v" }, "<c-_>", "gc", { remap = true })
-- Autoformat
vim.g.autoformat_enabled = true -- set to true by default
vim.api.nvim_create_user_command('ToggleAutoFormat', function()
vim.g.autoformat_enabled = not vim.g.autoformat_enabled
print('Autoformatting ' .. (vim.g.autoformat_enabled and 'enabled' or 'disabled'))
end, {})
vim.api.nvim_create_augroup("AutoFormat", {})
vim.api.nvim_create_autocmd("BufWritePre", {
group = "AutoFormat",
callback = function()
if vim.g.autoformat_enabled then
vim.lsp.buf.format({
async = false,
timeout_ms = 2000 -- Adjust timeout as needed
})
end
end,
})
-- Keymap
local opts = function(label)
return { noremap = true, silent = true, desc = label }
end
-- Comments
vim.keymap.set("n", "<c-/>", "gcc", { remap = true })
vim.keymap.set("v", "<c-/>", "gc", { remap = true })
vim.keymap.set("n", "<c-_>", "gcc", { remap = true })
vim.keymap.set("v", "<c-_>", "gc", { remap = true })
vim.keymap.set({ "n", "v" }, "<Leader>a", vim.lsp.buf.code_action, { remap = true, desc = "Code action" })
vim.keymap.set("n", "<Leader>af", function()
vim.lsp.buf.format({ async = true })
end, opts("Format Buffer"))
vim.keymap.set('n', '<Leader><Leader>', "<cmd>Pick visit_paths cwd=''<cr>", opts("Visits"))
vim.keymap.set('n', '<Leader>b', "<cmd>Pick buffers<cr>", opts("Open buffer picker"))
vim.keymap.set('n', '<Leader>/', "<cmd>Pick grep_live_root<cr>", opts("Search workspace files"))
vim.keymap.set('n', '<Leader>d', "<cmd>Pick diagnostic<cr>", opts("Open diagnostics picker"))
vim.keymap.set("n", "<Leader>D", vim.diagnostic.setloclist, { desc = "Diagnostics to location list" })
vim.keymap.set("n", "<Leader>r", vim.lsp.buf.rename, opts("Rename Symbol"))
vim.keymap.set('n', '<Leader>F', "<cmd>Pick files<cr>", opts("Open file picker CWD"))
vim.keymap.set('n', '<Leader>f', "<cmd>Pick files_root<cr>", opts("Open file picker"))
vim.keymap.set('n', '<c-p>', "<Leader>f", { remap = true })
vim.keymap.set('n', '<Leader>g', "<cmd>Pick oldfiles<cr>", opts("Open file picker history"))
vim.keymap.set("n", '<Leader>k', vim.lsp.buf.hover, opts("Show docs for item under cursor"))
vim.keymap.set('n', '<Leader>p', "<cmd>Pick projects<cr>", opts("Open projects picker"))
vim.keymap.set('n', '<Leader>q', require('mini.bufremove').delete, opts("Delete buffer"))
vim.keymap.set('n', '<Leader>s', "<cmd>Pick lsp scope='document_symbol'<cr>", opts("Open symbol picker"))
vim.keymap.set('n', '<Leader>S', "<cmd>Pick lsp scope='workspace_symbol'<cr>", opts("Open workspace symbol picker"))
vim.keymap.set("n", "<Leader>ws", "<C-w>s", opts("Horizontal split"))
vim.keymap.set("n", "<Leader>wv", "<C-w>v", opts("Vertical split"))
vim.keymap.set("n", "<m-f>", require('mini.files').open, opts("Open file manager"))
vim.keymap.set('n', '<tab>', "<cmd>Pick buffers include_current=false<cr>", opts("Buffers"))
vim.keymap.set("n", "zz", "zt", { remap = true })
vim.keymap.set({ "n", "v" }, "<Leader>y", '"+y', opts("Yank to clipboard"))
vim.keymap.set("n", "gD", vim.lsp.buf.declaration, opts("Declaration"))
vim.keymap.set("n", "gd", vim.lsp.buf.definition, opts("Definition"))
vim.keymap.set("n", "gi", vim.lsp.buf.implementation, opts("Implementation"))
vim.keymap.set("n", "gr", vim.lsp.buf.references, opts("Buffer References"))
vim.keymap.set("n", "gt", vim.lsp.buf.type_definition, opts("Type Definition"))
vim.keymap.set({ "n", "i" }, "<M-k>", vim.lsp.buf.signature_help, opts("Signature Help"))
vim.keymap.set({ "n", "v" }, "<Leader>aa", vim.lsp.buf.code_action, opts("Code Action"))
vim.keymap.set("n", "K", function()
vim.lsp.buf.hover {
border = 'rounded',
max_height = 24,
max_width = 80,
offset_x = 2,
}
end, {})
vim.keymap.set("n", "<Leader>ub", function()
vim.o.background = (vim.o.background == "light" and "dark" or "light")
end, opts("Toggle dark/light background"))
vim.keymap.set("n", "<Leader>uc", function()
if vim.g.colors_name == "dieter-nocolor" then
vim.cmd [[colorscheme dieter]]
else
vim.cmd [[colorscheme dieter-nocolor]]
end
end, opts("Toggle Dieter colors"))
vim.keymap.set("n", "<Leader>uf", "<cmd>ToggleAutoFormat<cr>", opts("Toggle autoformat on save"))
vim.keymap.set("n", "<Leader>uh", "<cmd>InlayHintsToggle<cr>", opts("Toggle inlay hints"))
vim.keymap.set("n", "<Leader>un", "<cmd>set invnumber<cr>", opts("Toggle line numbers"))
vim.keymap.set("n", "<Leader>uw", "<cmd>set invwrap<cr>", opts("Toggle line wrapping"))

View file

@ -1,92 +1,67 @@
vim.keymap.set("n", "<space>d", vim.diagnostic.setloclist, { desc = "Add buffer diagnostics to the location list." })
vim.api.nvim_create_autocmd("LspAttach", {
group = vim.api.nvim_create_augroup("UserLspConfig", {}),
callback = function(ev)
-- Enable completion triggered by <c-x><c-o>
vim.bo[ev.buf].omnifunc = "v:lua.vim.lsp.omnifunc"
-- Buffer local mappings.
-- See `:help vim.lsp.*` for documentation on any of the below functions
local opts = function(str)
return { buffer = ev.buf, desc = str }
end
local client = vim.lsp.get_client_by_id(ev.data.client_id)
if client.server_capabilities.codeLensProvider then
vim.lsp.codelens.refresh({ bufnr = bufnr })
end
vim.keymap.set("n", "K", vim.lsp.buf.hover, {})
vim.keymap.set("n", "gd", vim.lsp.buf.definition, {})
vim.keymap.set({ "n", "v" }, "<leader>ca", vim.lsp.buf.code_action, {})
vim.keymap.set("n", "gD", vim.lsp.buf.declaration, opts("Declaration"))
vim.keymap.set("n", "gd", vim.lsp.buf.definition, opts("Definition"))
vim.keymap.set("n", "gi", vim.lsp.buf.implementation, opts("Implementation"))
vim.keymap.set("n", "<M-k>", vim.lsp.buf.signature_help, opts("Signature Help"))
vim.keymap.set("i", "<M-k>", vim.lsp.buf.signature_help, opts("Signature Help"))
vim.keymap.set("n", "<space>wa", vim.lsp.buf.add_workspace_folder, opts("Add Workspace Folder"))
vim.keymap.set("n", "<space>wr", vim.lsp.buf.remove_workspace_folder, opts("Remove Workspace Folder"))
vim.keymap.set("n", "<space>wl", function()
print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
end, opts("List Workspace Folders"))
vim.keymap.set("n", "<space>D", vim.lsp.buf.type_definition, opts("Type Definition"))
vim.keymap.set("n", "<space>r", vim.lsp.buf.rename, opts("Rename Symbol"))
vim.keymap.set({ "n", "v" }, "<space>a", vim.lsp.buf.code_action, opts("Code Action"))
vim.keymap.set("n", "gr", vim.lsp.buf.references, opts("Buffer References"))
vim.keymap.set("n", "<space>cf", function()
vim.lsp.buf.format({ async = true })
end, opts("Format Buffer"))
end,
})
local configs = require('lspconfig.configs')
local lspconfig = require("lspconfig")
local capabilities = vim.lsp.protocol.make_client_capabilities()
local servers = {
'gopls',
'nil_ls',
'ts_ls',
cssls = {},
html = {},
jsonls = {},
sqls = {},
superhtml = {},
ts_ls = {},
gopls = {
settings = {
gopls = {
hints = {
rangeVariableTypes = true,
parameterNames = true,
constantValues = true,
assignVariableTypes = true,
compositeLiteralFields = true,
compositeLiteralTypes = true,
functionTypeParameters = true,
},
},
},
},
harper_ls = {
filetypes = {
"asciidoc", "c", "gitcommit", "go", "html", "javascript", "just", "lua", "markdown",
"nix", "python", "ruby", "rust", "text", "toml", "typescript", "zig",
}
},
lua_ls = {
settings = {
Lua = {
runtime = {
version = "LuaJIT",
path = vim.split(package.path, ";"),
},
diagnostics = { globals = { "vim", "hs" } },
hint = { enable = true },
workspace = {
library = {
[vim.fn.expand("$VIMRUNTIME/lua")] = true,
[vim.fn.expand("$VIMRUNTIME/lua/vim/lsp")] = true,
},
},
},
},
},
nixd = {
cmd = { "nixd" },
settings = {
nixd = {
nixpkgs = { expr = "import <nixpkgs> { }" },
formatting = { command = { "nixfmt" } },
options = {},
},
},
},
}
for _, ls in ipairs(servers) do
lspconfig[ls].setup {
capabilities = capabilities,
on_attach = function(_, buf)
vim.api.nvim_set_option_value('omnifunc', 'v:lua.MiniCompletion.completefunc_lsp', {buf = buf})
end,
}
for server, config in pairs(servers) do
config.capabilities = require('blink.cmp').get_lsp_capabilities(config.capabilities)
lspconfig[server].setup(config)
end
lspconfig.nixd.setup({
capabilities = capabilities,
cmd = { "nixd" },
settings = {
nixd = {
nixpkgs = { expr = "import <nixpkgs> { }" },
formatting = { command = { "nixfmt" } },
options = {},
},
},
})
lspconfig.lua_ls.setup({
capabilities = capabilities,
settings = {
Lua = {
runtime = {
version = "LuaJIT",
path = vim.split(package.path, ";"),
},
diagnostics = { globals = { "vim", "hs" } },
workspace = {
library = {
[vim.fn.expand("$VIMRUNTIME/lua")] = true,
[vim.fn.expand("$VIMRUNTIME/lua/vim/lsp")] = true,
},
},
},
},
})

View file

@ -1,128 +1,256 @@
local opts = function(label)
return {noremap = true, silent = true, desc = label}
end
require('mini.ai').setup()
require('mini.align').setup()
require('mini.bracketed').setup()
require('mini.completion').setup()
require('mini.diff').setup()
require('mini.extra').setup()
require('mini.icons').setup()
require('mini.jump').setup()
require('mini.surround').setup()
require('mini.splitjoin').setup()
require('mini.ai').setup()
require('mini.align').setup()
require('mini.bracketed').setup()
require('mini.bufremove').setup()
require('mini.comment').setup()
require('mini.diff').setup()
require('mini.extra').setup()
require('mini.files').setup()
require('mini.icons').setup()
require('mini.jump').setup()
require('mini.surround').setup()
require('mini.splitjoin').setup()
require('mini.trailspace').setup()
require('mini.visits').setup()
require('mini.files').setup()
local oil_style = function()
if not MiniFiles.close() then
MiniFiles.open(vim.api.nvim_buf_get_name(0))
MiniFiles.reveal_cwd()
end
end
vim.keymap.set('n', '-', oil_style, opts("File Explorer"));
require('mini.cursorword').setup({
delay = 800
})
local hipatterns = require('mini.hipatterns')
hipatterns.setup({ -- highlight strings and colors
highlighters = {
-- Highlight standalone 'FIXME', 'HACK', 'TODO', 'NOTE'
fixme = { pattern = '%f[%w]()FIXME()%f[%W]', group = 'MiniHipatternsFixme' },
hack = { pattern = '%f[%w]()HACK()%f[%W]', group = 'MiniHipatternsHack' },
todo = { pattern = '%f[%w]()TODO()%f[%W]', group = 'MiniHipatternsTodo' },
note = { pattern = '%f[%w]()NOTE()%f[%W]', group = 'MiniHipatternsNote' },
local hipatterns = require('mini.hipatterns')
hipatterns.setup({
highlighters = {
-- Highlight standalone 'FIXME', 'HACK', 'TODO', 'NOTE'
fixme = { pattern = '%f[%w]()FIXME()%f[%W]', group = 'MiniHipatternsFixme' },
hack = { pattern = '%f[%w]()HACK()%f[%W]', group = 'MiniHipatternsHack' },
todo = { pattern = '%f[%w]()TODO()%f[%W]', group = 'MiniHipatternsTodo' },
note = { pattern = '%f[%w]()NOTE()%f[%W]', group = 'MiniHipatternsNote' },
hex_color = hipatterns.gen_highlighter.hex_color(),
}
})
-- Highlight hex color strings (`#rrggbb`) using that color
hex_color = hipatterns.gen_highlighter.hex_color(),
}
})
local indentscope = require('mini.indentscope')
indentscope.setup({
draw = {
delay = 10,
animation = indentscope.gen_animation.none(),
},
symbol = '',
})
require('mini.jump2d').setup({
mappings = {
start_jumping = 'gw'
}
})
require('mini.jump2d').setup({
mappings = { start_jumping = 'gw' }
})
require('mini.pick').setup({
mappings = {
move_down = '<tab>'
},
options = {
use_cache = true
}
})
MiniPick.registry.files_root = function(local_opts)
local root_patterns = { ".jj", ".git" }
local root_dir = vim.fs.dirname(vim.fs.find(root_patterns, { upward = true })[1])
local opts = { source = { cwd = root_dir, tool = "ripgrep"} }
local_opts.cwd = root_dir
local_opts.tool = "rg"
return MiniPick.builtin.files(local_opts, opts)
end
MiniPick.registry.grep_live_root = function(local_opts)
local root_patterns = { ".jj", ".git" }
local root_dir = vim.fs.dirname(vim.fs.find(root_patterns, { upward = true })[1])
local opts = { source = { cwd = root_dir } }
local_opts.cwd = root_dir
return MiniPick.builtin.grep_live(local_opts, opts)
end
vim.keymap.set('n', '<space>/', "<cmd>Pick grep_live_root<cr>", opts("Live Grep"))
vim.keymap.set('n', '<space>F', "<cmd>Pick files<cr>", opts("Find Files in CWD"))
vim.keymap.set('n', '<space>ff', "<cmd>Pick files_root<cr>", opts("Find Files"))
vim.keymap.set('n', '<space>fr', "<cmd>Pick oldfiles<cr>", opts("Recent Files"))
vim.keymap.set('n', '<space>b', "<cmd>Pick buffers<cr>", opts("Buffers"))
vim.keymap.set('n', '<space>d', "<cmd>Pick diagnostics<cr>", opts("Diagnostics"))
vim.keymap.set('n', '<tab>', "<cmd>Pick buffers include_current=false<cr>", opts("Buffers"))
vim.keymap.set('n', "<space>'", "<cmd>Pick resume<cr>", opts("Last Picker"))
vim.keymap.set('n', "<space>g", "<cmd>Pick git_commits<cr>", opts("Git Commits"))
local picker_win_config = function()
local height = vim.o.lines - 8
local width = 80
return {
border = 'rounded',
anchor = 'NW',
height = height,
width = width,
row = 2,
col = 5,
}
end
require('mini.pick').setup({
mappings = {
move_down = '<tab>',
move_up = '<S-tab>',
toggle_info = '<C-k>',
toggle_preview = '<C-p>',
},
options = { use_cache = true },
window = {
config = picker_win_config,
},
})
local miniclue = require('mini.clue')
miniclue.setup({ -- cute prompts about bindings
triggers = {
{ mode = 'n', keys = '<Leader>' },
{ mode = 'x', keys = '<Leader>' },
{ mode = 'n', keys = '<space>' },
{ mode = 'x', keys = '<space>' },
local MiniPick = require('mini.pick')
MiniPick.registry.projects = function(local_opts)
local root = vim.fn.expand("~/src")
-- Built-in completion
{ mode = 'i', keys = '<C-x>' },
local command = {
"fd",
"--max-depth=8",
"--one-file-system",
"--unrestricted",
"--full-path",
"/.jj/repo/store/type$|/.git/HEAD$",
root,
}
-- `g` key
{ mode = 'n', keys = 'g' },
{ mode = 'x', keys = 'g' },
local postprocess = function(paths)
local result = {}
for _, path in ipairs(paths) do
path = path:gsub("%/.jj/repo/store/type$", "")
path = path:gsub("%/.git/HEAD$", "")
local item = {
path = path,
text = path:gsub("%" .. root .. "/", ""),
}
table.insert(result, item)
end
return result
end
-- Marks
{ mode = 'n', keys = "'" },
{ mode = 'n', keys = '`' },
{ mode = 'x', keys = "'" },
{ mode = 'x', keys = '`' },
local choose = function(item)
local_opts.cwd = item.path
vim.fn.chdir(item.path)
vim.schedule(function()
MiniPick.builtin.files(local_opts, { source = { cwd = item.path, tool = "rg" } })
end)
end
-- Registers
{ mode = 'n', keys = '"' },
{ mode = 'x', keys = '"' },
{ mode = 'i', keys = '<C-r>' },
{ mode = 'c', keys = '<C-r>' },
return MiniPick.builtin.cli({ command = command, postprocess = postprocess }, { source = { choose = choose } })
end
-- Window commands
{ mode = 'n', keys = '<C-w>' },
MiniPick.registry.files_root = function(local_opts)
local root_patterns = { ".jj", ".git" }
local root_dir = vim.fs.dirname(vim.fs.find(root_patterns, { upward = true })[1])
local_opts.cwd = root_dir
local_opts.tool = "rg"
return MiniPick.builtin.files(local_opts, { source = { cwd = root_dir, tool = "rg" } })
end
-- `z` key
{ mode = 'n', keys = 'z' },
{ mode = 'x', keys = 'z' },
MiniPick.registry.grep_live_root = function(local_opts)
local root_patterns = { ".jj", ".git" }
local root_dir = vim.fs.dirname(vim.fs.find(root_patterns, { upward = true })[1])
local_opts.cwd = root_dir
return MiniPick.builtin.grep_live(local_opts, { source = { cwd = root_dir } })
end
-- Bracketed
{ mode = 'n', keys = '[' },
{ mode = 'n', keys = ']' },
},
clues = {
miniclue.gen_clues.builtin_completion(),
miniclue.gen_clues.g(),
miniclue.gen_clues.marks(),
miniclue.gen_clues.registers(),
miniclue.gen_clues.windows(),
miniclue.gen_clues.z(),
},
window = {
delay = 15,
}
})
require("mini.pick").registry.buffers = function(local_opts, opts)
local_opts = vim.tbl_deep_extend(
"force",
{ sort_lastused = false, sort_mru = true, include_current = true, include_unlisted = false },
local_opts or {}
)
local buffers_output = vim.api.nvim_exec("buffers" .. (local_opts.include_unlisted and "!" or ""), true)
local cur_buf_id, include_current = vim.api.nvim_get_current_buf(), local_opts.include_current
local items = {}
local default_selection_idx = 1
for _, l in ipairs(vim.split(buffers_output, "\n")) do
local buf_str, name = l:match("^%s*%d+"), l:match('"(.*)"')
local buf_id = tonumber(buf_str)
local flag = buf_id == vim.fn.bufnr("") and "%" or (buf_id == vim.fn.bufnr("#") and "#" or " ")
local item = { text = name, bufnr = buf_id, flag = flag }
if buf_id ~= cur_buf_id or include_current then
if local_opts.sort_lastused and not local_opts.ignore_current_buffer and flag == "#" then
default_selection_idx = 2
end
if local_opts.sort_lastused and (flag == "#" or flag == "%") then
local idx = ((items[1] ~= nil and items[1].flag == "%") and 2 or 1)
table.insert(items, idx, item)
else
table.insert(items, item)
end
end
end
if local_opts.sort_mru then
table.sort(items, function(a, b)
return vim.fn.getbufinfo(a.bufnr)[1].lastused > vim.fn.getbufinfo(b.bufnr)[1].lastused
end)
end
local show = function(buf_id, items, query)
require("mini.pick").default_show(buf_id, items, query, { show_icons = true })
end
local default_opts = { source = { name = "Buffers", show = show } }
opts = vim.tbl_deep_extend("force", default_opts, opts or {}, { source = { items = items } })
if default_selection_idx > 1 then
vim.api.nvim_create_autocmd("User", {
pattern = "MiniPickStart",
once = true,
callback = function()
local mappings = require("mini.pick").get_picker_opts().mappings
local keys = vim.fn["repeat"](mappings.move_down, default_selection_idx - 1)
vim.api.nvim_input(vim.api.nvim_replace_termcodes(keys, true, true, true))
end,
})
end
return require("mini.pick").start(opts)
end
local miniclue = require('mini.clue')
miniclue.setup({ -- cute prompts about bindings
triggers = {
{ mode = 'n', keys = '<Leader>' },
{ mode = 'x', keys = '<Leader>' },
{ mode = 'n', keys = '<space>' },
{ mode = 'x', keys = '<space>' },
-- Built-in completion
{ mode = 'i', keys = '<C-x>' },
-- `g` key
{ mode = 'n', keys = 'g' },
{ mode = 'x', keys = 'g' },
-- Marks
{ mode = 'n', keys = "'" },
{ mode = 'n', keys = '`' },
{ mode = 'x', keys = "'" },
{ mode = 'x', keys = '`' },
-- Registers
{ mode = 'n', keys = '"' },
{ mode = 'x', keys = '"' },
{ mode = 'i', keys = '<C-r>' },
{ mode = 'c', keys = '<C-r>' },
-- Window commands
{ mode = 'n', keys = '<C-w>' },
-- `z` key
{ mode = 'n', keys = 'z' },
{ mode = 'x', keys = 'z' },
-- Bracketed
{ mode = 'n', keys = '[' },
{ mode = 'n', keys = ']' },
},
clues = {
miniclue.gen_clues.builtin_completion(),
miniclue.gen_clues.g(),
miniclue.gen_clues.marks(),
miniclue.gen_clues.registers(),
miniclue.gen_clues.windows(),
miniclue.gen_clues.z(),
},
window = {
delay = 0,
config = {
border = 'rounded',
width = 'auto',
},
}
})
local notify_win_config = function()
local has_statusline = vim.o.laststatus > 0
local pad = vim.o.cmdheight + (has_statusline and 1 or 0)
return { anchor = 'SE', border = 'rounded', col = vim.o.columns, row = vim.o.lines - pad }
end
require('mini.notify').setup({
window = {
config = notify_win_config,
winblend = 0,
},
})
require('mini.starter').setup({
header =
[[
]]
})

40
home/common/nvim/rust.lua Normal file
View file

@ -0,0 +1,40 @@
vim.g.rustaceanvim = {
server = {
settings = {
["rust-analyzer"] = {
inlayHints = {
bindingModeHints = {
enable = false,
},
chainingHints = {
enable = true,
},
closingBraceHints = {
enable = true,
minLines = 25,
},
closureReturnTypeHints = {
enable = "never",
},
lifetimeElisionHints = {
enable = "never",
useParameterNames = false,
},
maxLength = 25,
parameterHints = {
enable = true,
},
reborrowHints = {
enable = "never",
},
renderColons = true,
typeHints = {
enable = true,
hideClosureInitialization = false,
hideNamedConstructor = false,
},
},
},
},
},
}

View file

@ -0,0 +1,66 @@
{
inputs,
lib,
pkgs,
...
}:
{
programs.neovim = {
extraPackages = with pkgs; [
tree-sitter
];
plugins = with pkgs.vimPlugins; [
nvim-ts-context-commentstring
playground
ts-comments-nvim
{
plugin = nvim-treesitter-context;
type = "lua";
config = ''
require'treesitter-context'.setup{
enable = false,
}
vim.keymap.set('n', '<space>ut', "<cmd>TSContextToggle<cr>", {noremap = true, silent = true, desc = "TS Context"})
'';
}
{
plugin = nvim-treesitter.withAllGrammars;
type = "lua";
config = ''
require'nvim-treesitter.configs'.setup {
highlight = { enable = true, },
indent = { enable = true },
rainbow = { enable = true },
textobjects = {
select = {
enable = true,
lookahead = true,
},
},
}
'';
}
{
plugin = nvim-treesitter-textobjects;
type = "lua";
config = ''
require'nvim-treesitter.configs'.setup {
incremental_selection = {
enable = true,
keymaps = {
init_selection = "<M-o>",
scope_incremental = "<M-O>",
node_incremental = "<M-o>",
node_decremental = "<M-i>",
},
},
}
'';
}
];
};
}

View file

@ -6,7 +6,7 @@
clock24 = true;
escapeTime = 500;
mouse = true;
shortcut = "o";
shortcut = "t";
extraConfig = ''
set -g allow-passthrough on
set -g default-terminal "tmux-256color"
@ -25,22 +25,23 @@
set -g status-right '%F | %R'
set -g status off
set -g update-environment "SSH_AUTH_SOCK"
setenv -g "SSH_AUTH_SOCK" "$XDG_RUNTIME_DIR/ssh-agent"
setw -g alternate-screen on
setw -g automatic-rename off
setw -g window-status-format ""
setw -g window-status-current-format ""
setw -g window-status-separator ""
bind -n M-1 if-shell 'tmux select-window -t nvim' refresh-client 'new-window -S -n nvim nvim --listen $XDG_RUNTIME_DIR/nvim-persistent.sock'
bind -n M-2 if-shell 'tmux select-window -t t1' refresh-client 'new-window -S -n t1'
bind -n M-3 if-shell 'tmux select-window -t t2' refresh-client 'new-window -S -n t2'
bind -n M-4 if-shell 'tmux select-window -t t3' refresh-client 'new-window -S -n t3'
bind -n M-5 if-shell 'tmux select-window -t t4' refresh-client 'new-window -S -n t4'
bind -n M-6 if-shell 'tmux select-window -t t5' refresh-client 'new-window -S -n t5'
bind -n M-7 if-shell 'tmux select-window -t t6' refresh-client 'new-window -S -n t6'
bind -n M-8 if-shell 'tmux select-window -t t7' refresh-client 'new-window -S -n t7'
bind -n M-9 if-shell 'tmux select-window -t t8' refresh-client 'new-window -S -n t8'
bind -n M-0 if-shell 'tmux select-window -t t9' refresh-client 'new-window -S -n t9'
set -s command-alias[1000] stty='run-shell "tmux send-keys \"stty cols #{pane_width} rows #{pane_height}\" Enter"'
bind -n C-2 if-shell 'tmux select-window -t t1' refresh-client 'new-window -S -n t1'
bind -n C-3 if-shell 'tmux select-window -t t2' refresh-client 'new-window -S -n t2'
bind -n C-4 if-shell 'tmux select-window -t t3' refresh-client 'new-window -S -n t3'
bind -n C-5 if-shell 'tmux select-window -t t4' refresh-client 'new-window -S -n t4'
bind -n C-6 if-shell 'tmux select-window -t t5' refresh-client 'new-window -S -n t5'
bind -n C-7 if-shell 'tmux select-window -t t6' refresh-client 'new-window -S -n t6'
bind -n C-8 if-shell 'tmux select-window -t t7' refresh-client 'new-window -S -n t7'
bind -n C-9 if-shell 'tmux select-window -t t8' refresh-client 'new-window -S -n t8'
bind -n C-0 if-shell 'tmux select-window -t t9' refresh-client 'new-window -S -n t9'
bind -T copy-mode-vi WheelUpPane select-pane \; send-keys -X -N 1 scroll-up
bind -T copy-mode-vi WheelDownPane select-pane \; send-keys -X -N 1 scroll-down
bind C-s set-option -g status

View file

@ -1,7 +1,6 @@
{ pkgs, ... }:
{
home.packages = with pkgs; [
grc
dust
jless
procs
@ -33,11 +32,6 @@
};
};
eza = {
enable = true;
enableFishIntegration = true;
};
fd.enable = true;
fzf = {
@ -53,17 +47,29 @@
ripgrep = {
enable = true;
arguments = [
"--glob=!.git/*"
"--glob=!.jj/*"
"--glob=!result/*"
"--glob=!target/*"
"--glob=!**/.cache/*"
"--glob=!**/.direnv/*"
"--glob=!**/.git/*"
"--glob=!**/.jj/*"
"--glob=!**/{node_modules,.npm,dist}/*"
"--glob=!**/target/*"
"--glob=!**/result/*"
];
};
zoxide = {
};
programs.eza = {
enable = true;
enableFishIntegration = true;
options = [ "--cmd=cd" ];
};
};
home.sessionVariables.EZA_COLORS = "reset:oc=0:ur=0:uw=0:ux=0:ue=0:gr=0:gw=0:gx=0:tr=0:tw=0:tx=0:su=0:sf=0:xa=0:sn=0:nb=0:nk=0:nm=0:ng=0:nt=0:sb=0:ub=0:uk=0:um=0:ug=0:ut=0:df=0:ds=0:uu=0:uR=0:un=0:gu=0:gR=0:gn=0:lc=0:lm=0:ga=0:gm=0:gd=0:gv=0:gt=0:gi=0:gc=0:Gm=0:Go=0:Gc=0:Gd=0:xx=0:da=0:in=0:bl=0:hd=0:lp=3:cc=0:bO=0:sp=0:mp=0:im=0:vi=0:mu=0:lo=0:cr=0:do=0:co=0:tm=0:cm=0:bu=0:sc=0:ic=0:Sn=0:Su=0:Sr=0:St=0:Sl=0:ff=0:di=1:ex=0:fi=0:pi=0:so=0:bd=0:cd=0:ln=3:or=3";
programs.zoxide = {
enable = true;
enableFishIntegration = true;
options = [ "--cmd=cd" ];
};
home.sessionVariables._ZO_FZF_OPTS="--reverse --height=10 --border=rounded --no-info --no-separator --no-scrollbar --no-color --no-sort";
}

View file

@ -1,4 +1,4 @@
{ config, pkgs, ... }:
{ config, inputs, pkgs, ... }:
{
home.packages = with pkgs; [
@ -7,7 +7,6 @@
difftastic
git-get
git-graph
lazyjj
tea
];
@ -116,9 +115,12 @@
"*.so"
"*.swp"
".direnv"
".env"
".idea"
".nixos-test-history"
".null-ls_*"
"result"
"/result*"
"/target"
];
signing = {
@ -127,45 +129,8 @@
};
};
programs.gitui = {
enable = true;
keyConfig = ''
(
open_help: Some(( code: F(1), modifiers: "")),
move_left: Some(( code: Char('h'), modifiers: "")),
move_right: Some(( code: Char('l'), modifiers: "")),
move_up: Some(( code: Char('k'), modifiers: "")),
move_down: Some(( code: Char('j'), modifiers: "")),
popup_up: Some(( code: Char('p'), modifiers: "CONTROL")),
popup_down: Some(( code: Char('n'), modifiers: "CONTROL")),
page_up: Some(( code: Char('b'), modifiers: "CONTROL")),
page_down: Some(( code: Char('f'), modifiers: "CONTROL")),
home: Some(( code: Char('g'), modifiers: "")),
end: Some(( code: Char('G'), modifiers: "SHIFT")),
shift_up: Some(( code: Char('K'), modifiers: "SHIFT")),
shift_down: Some(( code: Char('J'), modifiers: "SHIFT")),
edit_file: Some(( code: Char('I'), modifiers: "SHIFT")),
status_reset_item: Some(( code: Char('U'), modifiers: "SHIFT")),
diff_reset_lines: Some(( code: Char('u'), modifiers: "")),
diff_stage_lines: Some(( code: Char('s'), modifiers: "")),
stashing_save: Some(( code: Char('w'), modifiers: "")),
stashing_toggle_index: Some(( code: Char('m'), modifiers: "")),
stash_open: Some(( code: Char('l'), modifiers: "")),
abort_merge: Some(( code: Char('M'), modifiers: "SHIFT")),
)
'';
theme = ''
(
selection_bg: Some(Black),
selection_fg: Some(Reset),
cmdbar_bg: Some(Reset),
cmdbar_extra_lines_bg: Some(Reset),
)
'';
};
programs.jujutsu = {
enable = true;
package = pkgs.jujutsu-openssh;
package = inputs.jujutsu.packages.${pkgs.system}.default;
};
}

View file

@ -7,15 +7,13 @@
home.packages = with pkgs; [
cameractrls-gtk4
dynamic-wallpaper
gimp-with-plugins
gimp
inkscape
inputs.ghostty.packages.${pkgs.system}.default
moonlight-qt
obsidian
pavucontrol
plexamp
signal-desktop
zed-editor
];
xdg.desktopEntries = {

View file

@ -5,6 +5,11 @@
./desktop.nix
];
patagia = {
laptop.enable = true;
oled.enable = true;
};
dconf.settings = {
"org/gnome/shell" = {
enabled-extensions = [ "Battery-Health-Charging@maniacx.github.com" ];

View file

@ -1,4 +1,9 @@
{ config, pkgs, ... }:
{
config,
lib,
pkgs,
...
}:
let
realName = "Daniel Lundin";
email = "dln@arity.se";
@ -60,12 +65,7 @@ in
};
ui = {
"default-command" = [
"log"
"--limit=25"
"-T"
"builtin_log_comfortable"
];
"default-command" = [ "s" ];
pager = "delta";
};
@ -107,23 +107,35 @@ in
];
d = [
"diff"
"--tool=difftu"
"--tool=difft"
];
dd = [
"diff"
"--git"
];
ds = [
du = [
"diff"
"--tool=difft"
];
s = [
"show"
"--tool=difftu"
];
ss = [
"show"
"--tool=difft"
s = [
"util"
"exec"
"--"
"bash"
"-c"
''
#!/usr/bin/env bash
set -eo pipefail
printf '\e[38;5;240m\u2504%.0s\e[0m' $(seq 1 $(tput cols)) '\n'
jj show --stat
printf '\e[38;5;240m\u2504%.0s\e[0m' $(seq 1 $(tput cols)) '\n'
if [ -n "$1" ]; then
jj diff --tool=difft -r "$@"
else
jj log --limit=15 -T builtin_log_comfortable
fi
''
""
];
};
@ -136,26 +148,137 @@ in
"ready" = "open() ~ (wip::)";
};
colors = {
"commit_id prefix" = {
bold = true;
};
colors =
let
bold = {
bold = true;
};
dim = {
fg = "bright black";
};
underline = {
fg = "default";
underline = true;
};
in
{
"error" = bold;
"warning" = bold;
"error heading" = bold;
"error_source heading" = bold;
"warning heading" = bold;
"hint heading" = bold;
"prefix" = bold;
"rest" = "bright black";
"divergent prefix" = underline;
"bookmark" = "bright magenta";
"bookmarks" = "bright magenta";
"change_id" = "bright magenta";
"local_bookmarks" = "bright magenta";
"rest" = {
fg = "bright black";
bold = false;
};
"diff file_header" = bold;
"diff hunk_header" = "cyan";
"diff removed" = "red";
"diff removed token" = "red";
"diff added" = "green";
"diff added token" = "green";
"diff modified" = "cyan";
"diff untracked" = "blue";
"diff renamed" = "cyan";
"diff copied" = "green";
"diff access-denied" = {
bg = "red";
};
"empty" = "green";
"elided" = "blue";
"node elided" = dim;
"node working_copy" = {
fg = "green";
bold = true;
};
"node current_operation" = bold;
"node immutable" = bold;
"node conflict" = {
fg = "red";
bold = true;
};
"operation id" = "blue";
"operation current_operation" = bold;
"remote_bookmarks" = "bright magenta";
"working_copy" = {
fg = "green";
bold = true;
};
"working_copy empty" = {
fg = "green";
bold = true;
};
"working_copy change_id" = "bright magenta";
"working_copy description placeholder" = "green";
"working_copy empty description placeholder" = "green";
"working_copy bookmark" = "bright magenta";
"working_copy bookmarks" = "bright magenta";
"working_copy local_bookmarks" = "bright magenta";
"working_copy remote_bookmarks" = "bright magenta";
}
// lib.genAttrs [
"author"
"branch"
"branches"
"commit_id"
"committer"
"config_list name"
"config_list overridden"
"config_list overridden name"
"config_list overridden value"
"config_list value"
"conflict"
"conflict_description"
"conflict_description difficult"
"description placeholder"
"diff token"
"divergent"
"divergent change_id"
"divergent rest"
"empty description placeholder"
"error_source"
"git_head"
"git_refs"
"hidden prefix"
"hint"
"local_branches"
"operation current_operation id"
"operation current_operation time"
"operation current_operation user"
"operation time"
"operation user"
"placeholder"
"remote_branches"
"root"
"separator"
"tag"
"tags"
"timestamp"
"working_copies"
"working_copy author"
"working_copy branch"
"working_copy branches"
"working_copy commit_id"
"working_copy committer"
"working_copy conflict"
"working_copy divergent"
"working_copy divergent change_id"
"working_copy git_refs"
"working_copy local_branches"
"working_copy placeholder"
"working_copy remote_branches"
"working_copy tag"
"working_copy tags"
"working_copy timestamp"
"working_copy working_copies"
] (_: "default");
"diff added token" = {
bg = "#002200";
fg = "#66ffcc";
underline = false;
};
"diff removed token" = {
bg = "#220011";
underline = true;
};
};
};
};
@ -164,12 +287,12 @@ in
'';
programs.ssh.matchBlocks = {
dev = {
dev-old = {
hostname = "10.1.100.16";
forwardAgent = true;
};
nemo = {
devel = {
hostname = "10.1.100.20";
forwardAgent = true;
localForwards = [

View file

@ -1,40 +0,0 @@
{ pkgs, ... }:
{
home = {
username = "lsjostro";
homeDirectory = "/home/lsjostro";
packages = with pkgs; [ openconnect ];
};
programs.git = {
userName = "Lars Sjöstrom";
userEmail = "lars@radicore.se";
};
programs.ssh.matchBlocks = {
dev = {
hostname = "10.1.100.17";
};
nemo = {
hostname = "10.1.100.20";
forwardAgent = true;
localForwards = [
{
bind.address = "localhost";
bind.port = 8000;
host.address = "localhost";
host.port = 8000;
}
{
bind.address = "localhost";
bind.port = 8080;
host.address = "localhost";
host.port = 8080;
}
];
};
};
home.stateVersion = "24.05"; # https://nixos.wiki/wiki/FAQ/When_do_I_update_stateVersion
}

View file

@ -1,6 +0,0 @@
{ ... }:
{
imports = [ ./home.nix ];
# Host specific user config goes here
}

View file

@ -78,10 +78,10 @@
networking = {
hostName = "dinky";
domain = "aarn.patagia.dev";
domain = "aarn.patagia.net";
search = [
"patagia.dev"
"aarn.patagia.dev"
"patagia.net"
"aarn.patagia.net"
];
useDHCP = lib.mkDefault true;
};
@ -120,7 +120,7 @@
nix.settings.trusted-users = [ "dln" ];
nix.buildMachines = [
{
hostName = "nemo.aarn.patagia.dev";
hostName = "nemo.aarn.patagia.net";
sshUser = "nixremote";
sshKey = "/root/.ssh/id_ed25519";
system = "x86_64-linux";
@ -138,7 +138,7 @@
nix.distributedBuilds = true;
nix.settings.builders-use-substitutes = true;
nix.settings.trusted-substituters = [
"ssh-ng://nemo.aarn.patagia.dev"
"ssh-ng://nemo.aarn.patagia.net"
];
system.stateVersion = "24.05"; # Did you read the comment?

View file

@ -87,7 +87,7 @@
networking = {
hostName = "nemo"; # Define your hostname.
domain = "aarn.patagia.dev";
domain = "aarn.patagia.net";
nameservers = [
"10.1.100.11"
"10.1.100.12"
@ -124,27 +124,26 @@
};
# FIXME: pam_rssh is broken from rust 1.80 upgrade
# environment.systemPackages = [ pkgs.pam_rssh ];
# security = {
# pam.services.doas =
# { config, ... }:
# {
# rules.auth.rssh = {
# order = config.rules.auth.ssh_agent_auth.order - 1;
# control = "sufficient";
# modulePath = "${pkgs.pam_rssh}/lib/libpam_rssh.so";
# settings.authorized_keys_command = pkgs.writeShellScript "get-authorized-keys" ''
# cat "/etc/ssh/authorized_keys.d/$1"
# '';
# };
# };
# };
security = {
pam.services.doas =
{ config, ... }:
{
rules.auth.rssh = {
order = config.rules.auth.ssh_agent_auth.order - 1;
control = "sufficient";
modulePath = "${pkgs.pam_rssh}/lib/libpam_rssh.so";
settings.authorized_keys_command = pkgs.writeShellScript "get-authorized-keys" ''
cat "/etc/ssh/authorized_keys.d/$1"
'';
};
};
};
services.resolved = {
enable = true;
domains = [
"patagia.dev"
"aarn.patagia.dev"
"patagia.net"
"aarn.patagia.net"
];
llmnr = "false";
fallbackDns = [ "9.9.9.9" ];
@ -159,12 +158,6 @@
};
};
services.sunshine = {
enable = true;
openFirewall = true;
settings = { };
};
patagia = {
desktop.enable = true;
plymouth.enable = true;
@ -175,17 +168,29 @@
ffado
libcamera
lm_sensors
# pkgs.pam_rssh
pam_rssh
openconnect
tpm2-tools
v4l-utils
];
programs.coolercontrol.enable = true;
environment.variables = {
OTEL_EXPORTER_OTLP_ENDPOINT = "https://otel.aarn.patagia.net";
};
security.tpm2 = {
enable = true;
pkcs11.enable = true;
tctiEnvironment.enable = true;
};
users.users.dln = {
isNormalUser = true;
description = "Daniel Lundin";
extraGroups = [ "wheel" ];
extraGroups = [
"tss"
"wheel"
];
openssh.authorizedKeys.keys = [
"sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIIHMAEZx02kbHrEygyPQYStiXlrIe6EIqBCv7anIkL0pAAAABHNzaDo= dln@dinky"
"sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIJNOBFoU7Cdsgi4KpYRcv7EhR/8kD4DYjEZnwk6urRx7AAAABHNzaDo= dln@nemo"
@ -195,7 +200,10 @@
users.users.lsjostro = {
isNormalUser = true;
description = "Lars Sjöström";
extraGroups = [ "wheel" ];
extraGroups = [
"tss"
"wheel"
];
openssh.authorizedKeys.keys = [
"sk-ecdsa-sha2-nistp256@openssh.com AAAAInNrLWVjZHNhLXNoYTItbmlzdHAyNTZAb3BlbnNzaC5jb20AAAAIbmlzdHAyNTYAAABBBJ10mLOpInoqDaySyrxbzvcOrJfLw48Y6eWHa9501lw+hEEBXya3ib7nlvpCqEQJ8aPU5fVRqpkOW5zSimCiRbwAAAAEc3NoOg=="
"sk-ecdsa-sha2-nistp256@openssh.com AAAAInNrLWVjZHNhLXNoYTItbmlzdHAyNTZAb3BlbnNzaC5jb20AAAAIbmlzdHAyNTYAAABBBLpoKvsZDIQQLfgzJhe1jAQubBNxjydkj8UfdUPaSXqgfB02OypMOC1m5ZuJYcQIxox0I+4Z8xstFhYP6s8zKZwAAAAEc3NoOg=="
@ -213,11 +221,19 @@
};
users.groups.nixremote = { };
nix.sshServe.enable = true;
nix.sshServe.keys = [
"sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIIHMAEZx02kbHrEygyPQYStiXlrIe6EIqBCv7anIkL0pAAAABHNzaDo= dln@dinky"
"sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIJNOBFoU7Cdsgi4KpYRcv7EhR/8kD4DYjEZnwk6urRx7AAAABHNzaDo= dln@nemo"
"sk-ecdsa-sha2-nistp256@openssh.com AAAAInNrLWVjZHNhLXNoYTItbmlzdHAyNTZAb3BlbnNzaC5jb20AAAAIbmlzdHAyNTYAAABBBJ10mLOpInoqDaySyrxbzvcOrJfLw48Y6eWHa9501lw+hEEBXya3ib7nlvpCqEQJ8aPU5fVRqpkOW5zSimCiRbwAAAAEc3NoOg=="
"sk-ecdsa-sha2-nistp256@openssh.com AAAAInNrLWVjZHNhLXNoYTItbmlzdHAyNTZAb3BlbnNzaC5jb20AAAAIbmlzdHAyNTYAAABBBLpoKvsZDIQQLfgzJhe1jAQubBNxjydkj8UfdUPaSXqgfB02OypMOC1m5ZuJYcQIxox0I+4Z8xstFhYP6s8zKZwAAAAEc3NoOg=="
];
nix.settings.trusted-users = [
"dln"
"lsjostro"
"nixremote"
];
system.stateVersion = "24.05"; # https://nixos.wiki/wiki/FAQ/When_do_I_update_stateVersion
system.stateVersion = "24.11"; # https://nixos.wiki/wiki/FAQ/When_do_I_update_stateVersion
}

View file

@ -4,6 +4,20 @@
...
}:
{
users.users.woodpecker = {
isSystemUser = true;
group = "woodpecker";
extraGroups = [
"docker"
"podman"
];
createHome = true;
home = "/etc/woodpecker";
homeMode = "764";
};
users.groups.woodpecker = { };
services.woodpecker-agents.agents.docker = {
enable = true;
package = pkgs.woodpecker-agent;
@ -27,7 +41,11 @@
];
# restartIfChanged = false;
serviceConfig = {
User = "woodpecker";
Group = "woodpecker";
WorkingDirectory = "/etc/woodpecker";
BindPaths = [ "/run/podman/podman.sock" ];
};
};
}

View file

@ -33,10 +33,10 @@
networking = {
hostName = "pearl";
domain = "aarn.patagia.dev";
domain = "aarn.patagia.net";
search = [
"patagia.dev"
"aarn.patagia.dev"
"aarn.patagia.net"
];
useDHCP = lib.mkDefault true;
};
@ -99,7 +99,7 @@
console.keyMap = "sv-latin1";
# Enable sound with pipewire.
hardware.pulseaudio.enable = false;
services.pulseaudio.enable = false;
security.rtkit.enable = true;
services.pipewire = {
enable = true;

View file

@ -9,7 +9,6 @@
gnome-keyring = prev.gnome-keyring.overrideAttrs (oldAttrs: {
configureFlags = oldAttrs.configureFlags or [ ] ++ [ "--disable-ssh-agent" ];
});
};
unstable-packages = final: _prev: {
@ -17,7 +16,7 @@
system = final.system;
config.allowUnfree = true;
};
unstable = import inputs.nixpkgs-unstable {
nixpkgs-unstable = import inputs.nixpkgs-unstable {
system = final.system;
config.allowUnfree = true;
};

View file

@ -1,5 +1,3 @@
pkgs: {
gnome-ssh-askpass4 = pkgs.callPackage ./gnome-ssh-askpass4 { };
jujutsu-openssh = pkgs.callPackage ./jujutsu-openssh { };
lazyjj = pkgs.callPackage ./lazyjj { };
}

File diff suppressed because it is too large Load diff

View file

@ -1,89 +0,0 @@
{
lib,
fetchFromGitHub,
rustPlatform,
pkg-config,
openssl,
gzip,
libgit2,
openssh,
zstd,
installShellFiles,
nix-update-script,
testers,
jujutsu-openssh,
}:
rustPlatform.buildRustPackage rec {
pname = "jujutsu-openssh";
version = "0.22.0+pr3191.openssh";
src = fetchFromGitHub {
owner = "dln";
repo = "jj";
rev = "da04712b5735fadb0d9c164f301723a4f9830936"; # https://github.com/dln/jj/tree/openssh
hash = "sha256-IhUJPH/h6Gm8zv7Ps1UxeMSqYAt1FO2ZMReLEAoOVmk=";
};
cargoLock.lockFile = ./Cargo.lock;
cargoLock.outputHashes = {
"git2-0.19.0" = "sha256-fV8dFChGeDhb20bMyqefpAD5/+raQQ2sMdkEtlA1jaE=";
};
cargoBuildFlags = [
"--bin"
"jj"
]; # don't install the fake editors
useNextest = false; # nextest is the upstream integration framework, but is problematic for test skipping
ZSTD_SYS_USE_PKG_CONFIG = "1"; # disable vendored zlib
nativeBuildInputs = [
gzip
installShellFiles
pkg-config
];
buildInputs = [
openssl
zstd
libgit2
openssh
];
postInstall = ''
$out/bin/jj util mangen > ./jj.1
installManPage ./jj.1
installShellCompletion --cmd jj \
--bash <($out/bin/jj util completion bash) \
--fish <($out/bin/jj util completion fish) \
--zsh <($out/bin/jj util completion zsh)
'';
checkFlags = [
# signing tests spin up an ssh-agent and do git checkouts
"--skip=test_ssh_signing"
];
passthru = {
updateScript = nix-update-script { };
tests = {
version = testers.testVersion {
package = jujutsu-openssh;
command = "jj --version";
};
};
};
meta = with lib; {
description = "Git-compatible DVCS that is both simple and powerful";
homepage = "https://github.com/martinvonz/jj";
changelog = "https://github.com/martinvonz/jj/blob/v${version}/CHANGELOG.md";
license = licenses.asl20;
maintainers = with maintainers; [
_0x4A6F
thoughtpolice
];
mainProgram = "jj";
};
}

View file

@ -1,30 +0,0 @@
{
stdenvNoCC,
fetchzip,
}:
let
version = "0.3.1";
in
stdenvNoCC.mkDerivation {
name = "lazyjj";
inherit version;
src = fetchzip {
url = "https://github.com/Cretezy/lazyjj/releases/download/v0.3.1/lazyjj-v0.3.1-x86_64-unknown-linux-musl.tar.gz";
hash = "sha256-6R4W6uyq8sns8WLoJxp06xAYaJ0Zn+pZLtwhVIPobmc=";
};
installPhase = ''
runHook preInstall
mkdir -p $out/bin
install -m755 -D $src/lazyjj $out/bin/lazyjj
runHook postInstall
'';
meta = {
homepage = "https://github.com/Cretezy/lazyjj";
description = "TUI for jj";
mainProgram = "lazyjj";
platforms = [ "x86_64-linux" ];
};
}