diff options
Diffstat (limited to '')
47 files changed, 1413 insertions, 137 deletions
diff --git a/modules/by-name/at/atuin/module.nix b/modules/by-name/at/atuin/module.nix index caabdf40..81a97c26 100644 --- a/modules/by-name/at/atuin/module.nix +++ b/modules/by-name/at/atuin/module.nix @@ -39,6 +39,10 @@ in { }; soispha.programs.zsh.integrations.atuin = ./atuin.zsh; + soispha.services.unison.pathsToIgnore = [ + # Already synchronized by atuin sync server + "~/.local/share/atuin" + ]; home-manager.users.soispha = { programs.atuin = { @@ -48,8 +52,9 @@ in { daemon.enable = true; - # We can do this on our own. + # We can (and have to) do this on our own. enableZshIntegration = false; + enableFishIntegration = false; settings = { sync = lib.mkIf cfg.enableAge { diff --git a/modules/by-name/au/ausweisapp/module.nix b/modules/by-name/au/ausweisapp/module.nix index 3a89db9d..e74f3d91 100644 --- a/modules/by-name/au/ausweisapp/module.nix +++ b/modules/by-name/au/ausweisapp/module.nix @@ -14,5 +14,8 @@ in { soispha.impermanence.userDirectories = [ ".config/AusweisApp" ]; + soispha.services.unison.pathsToSync = [ + "~/.config/AusweisApp" + ]; }; } diff --git a/modules/by-name/ba/backup/env.vars b/modules/by-name/ba/backup/env.vars new file mode 100644 index 00000000..339c5a5b --- /dev/null +++ b/modules/by-name/ba/backup/env.vars @@ -0,0 +1 @@ +RESTIC_COMPRESSION=max diff --git a/modules/by-name/ba/backup/module.nix b/modules/by-name/ba/backup/module.nix index dd0dfac7..031445cf 100644 --- a/modules/by-name/ba/backup/module.nix +++ b/modules/by-name/ba/backup/module.nix @@ -63,12 +63,23 @@ in { soispha.impermanence.directories = lib.mkMerge [ (lib.mkIf cfg.storagebox.enable [ "/var/cache/restic-backups-storagebox" + + # Generate the base systemd.mount from impermanence (we will override this, so it + # points to the non-admin one instead) + "/var/cache/restic-backups-storagebox-admin" ]) (lib.mkIf cfg.local.enable [ "/var/cache/restic-backups-local" ]) ]; + # TODO: Make this work (`systemd.mounts` is a list, so _this_ doesn't work.) <2026-07-07> + # systemd.mounts."/var/cache/restic-backups-storagebox-admin" = { + # # TODO: Don't hardcode the path, but use + # # `systemd.mounts."/var/cache/restic-backups-storagebox".what` instead <2026-07-07> + # what = "/srv/var/cache/restic-backups-storagebox"; + # }; + age.secrets = { resticStorageboxSshKey = lib.mkIf cfg.storagebox.enable { file = cfg.storagebox.sshKey; @@ -97,6 +108,8 @@ in { }; }; + programs.fuse.enable = cfg.storagebox.enable || cfg.local.enable; + systemd.services = { prepare-backup = { requires = []; @@ -154,16 +167,21 @@ in { ]; exclude = [ "${homeDir}/soispha/.cache" + "${homeDir}/soispha/.local/share/lutris/install" + "${homeDir}/soispha/.local/share/Steam/steamapps/common" ]; extraBackupArgs = [ + # Don't scan the filesystem to determine an estimate. + "--no-scan" "--verbose=2" ]; + environmentFile = "${./env.vars}"; in { local = lib.mkIf cfg.local.enable { inhibitsSleep = true; initialize = true; - inherit paths exclude extraBackupArgs; + inherit paths exclude extraBackupArgs environmentFile; passwordFile = config.age.secrets.resticLocalRepositoryPassword.path; @@ -177,7 +195,7 @@ in { inhibitsSleep = true; initialize = true; - inherit paths exclude extraBackupArgs; + inherit paths exclude extraBackupArgs environmentFile; passwordFile = config.age.secrets.resticStorageboxRepositoryPassword.path; extraOptions = [ @@ -199,9 +217,13 @@ in { # This is only for listing, pruning and such stuff. storagebox-admin = lib.mkIf cfg.storagebox.enable { - inhibitsSleep = false; + inhibitsSleep = true; + + # Don't create the repository if it doesn't exist yet. initialize = false; + inherit paths exclude extraBackupArgs environmentFile; + passwordFile = config.age.secrets.resticStorageboxRepositoryPassword.path; extraOptions = [ "rclone.program='ssh -p 23 ${cfg.storagebox.user}@${cfg.storagebox.user}.your-storagebox.de command_forced_on_remote'" diff --git a/modules/by-name/bo/boot/module.nix b/modules/by-name/bo/boot/module.nix index 4dc9130a..80a47420 100644 --- a/modules/by-name/bo/boot/module.nix +++ b/modules/by-name/bo/boot/module.nix @@ -37,42 +37,43 @@ iso_options = ## General options? [ - "initrd=${tails.initrd}" - # "noprompt" - # "timezone=Etc/UTC" # "config" - # "noautologin" - # "slab_nomerge" - # "slub_debug=FZ" - # "mce=0" - # "vsyscall=none" - # "init_on_free=1" - # "mds=full,nosmt" - # "page_alloc.shuffle=1" - # "randomize_kstack_offset=on" - # "efi_pstore.pstore_disable=1" - # "erst_disable" - # "spec_store_bypass_disable=on" - # "systemd.condition_needs_update=no" + "initrd=${tails.initrd}" + + "efi_pstore.pstore_disable=1" + "erst_disable" + "init_on_free=1" + "mce=0" + "mds=full,nosmt" + "noautologin" + "noprompt" + "page_alloc.shuffle=1" + "randomize_kstack_offset=on" + "slab_nomerge" + "slub_debug=FZ" + "spec_store_bypass_disable=on" + "systemd.condition_needs_update=no" + "timezone=Etc/UTC" + "vsyscall=none" ] ## Systemd log options ++ [ - "systemd.log_level=debug" - "systemd.log_target=console" - "console=tty1" - "systemd.journald.forward_to_console=1" - "systemd.unit=rescue.target" + # "systemd.log_level=debug" + # "systemd.log_target=console" + # "console=tty1" + # "systemd.journald.forward_to_console=1" + # "systemd.unit=rescue.target" ] ## Options for the first `init` script ++ [ # Use the `*-live` scripts "boot=live" - # "splash" - "plymouth.enable=0" + "splash" + # "plymouth.enable=0" # "quiet" - "debug" + # "debug" ] ## Options for the `*-live` `init` scripts ++ [ @@ -207,6 +208,8 @@ in { }; extraFiles = { + # TODO: Check that the ISO we use for booting is _actually_ still the one we + # copied there (someone might exchange it in between) <2026-06-09> "${tails.root}" = "${iso}/tails.iso"; "${tails.vmlinuz}" = "${iso}/live/vmlinuz-linux"; "${tails.initrd}" = "${iso}/live/initrd.img"; diff --git a/modules/by-name/ca/calibre/module.nix b/modules/by-name/ca/calibre/module.nix new file mode 100644 index 00000000..4188e360 --- /dev/null +++ b/modules/by-name/ca/calibre/module.nix @@ -0,0 +1,38 @@ +# nixos-config - My current NixOS configuration +# +# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de> +# SPDX-License-Identifier: GPL-3.0-or-later +# +# This file is part of my nixos-config. +# +# You should have received a copy of the License along with this program. +# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>. +{ + config, + lib, + libraries, + ... +}: let + cfg = config.soispha.programs.calibre; +in { + options.soispha.programs.calibre = { + enable = libraries.base.options.mkEnable "calibre"; + }; + + config = lib.mkIf cfg.enable { + soispha.impermanence.userDirectories = [ + ".config/calibre" + ]; + soispha.services.unison.pathsToSync = [ + "~/.config/calibre" + ]; + + # Calibre depends on multiple “AI” slop stuff, which I don't really want to have in my + # closure. + # Considering, that calibre is probably also LLM friendly (and maybe contains + # vibe-coded stuff), I should probably replace it, but currently I'll keep it. + home-manager.users.soispha.programs.calibre = { + enable = false; + }; + }; +} diff --git a/modules/by-name/cl/cleanup/module.nix b/modules/by-name/cl/cleanup/module.nix index 9b42b337..11e16032 100644 --- a/modules/by-name/cl/cleanup/module.nix +++ b/modules/by-name/cl/cleanup/module.nix @@ -24,6 +24,8 @@ in { services.speechd.enable = false; + system.disableInstallerTools = true; + environment = { defaultPackages = lib.mkForce []; }; diff --git a/modules/by-name/di/direnv/landrun-fish.sh b/modules/by-name/di/direnv/landrun-fish.sh new file mode 100755 index 00000000..09687afb --- /dev/null +++ b/modules/by-name/di/direnv/landrun-fish.sh @@ -0,0 +1,30 @@ +#! /usr/bin/env sh + +export NO_DIRENV_LOAD=true +landrun \ + --env PATH \ + --env USER \ + --env IN_NIX_SHELL \ + --env NIX_SHELL_LEVEL \ + --env NO_DIRENV_LOAD \ + --env SHLVL \ + --rox /nix/store \ + --ro /etc/ \ + --ro /proc/ \ + --rw /dev/ \ + --rw "/run/user/$(id --user)" \ + --ro "$HOME/.config" \ + --rw "$HOME/.cache" \ + --ro "$HOME/.local/share/nix/trusted-settings.json" \ + --rw "$HOME/.local/share/nix/repl-history" \ + --rw "$HOME/.local/share/task/" \ + --rw "$HOME/.local/share/nvim/" \ + --rw "$HOME/.local/share/cargo/" \ + --rw "$HOME/.local/share/ctpv/" \ + --rw "$HOME/.local/share/direnv" \ + --ro "$HOME/.config/fish/" \ + --connect-tcp 80 \ + --connect-tcp 443 \ + -- fish "$@" + +# vim: ft=sh diff --git a/modules/by-name/di/direnv/module.nix b/modules/by-name/di/direnv/module.nix index 363f5cea..93e29f51 100644 --- a/modules/by-name/di/direnv/module.nix +++ b/modules/by-name/di/direnv/module.nix @@ -11,26 +11,90 @@ config, lib, pkgs, + sources, ... }: let cfg = config.soispha.programs.direnv; + direnvCfg = config.home-manager.users.soispha.programs.direnv; + + inherit (sources) devshells nixpkgs; + + pre-cache = pkgs.runCommand "pre-cache.sh" {} '' + cat "${./pre-cache.sh}" > $out + + substituteInPlace $out \ + --replace-fail "%DEVSHELLS_REPO%" "${devshells}" \ + --replace-fail "%DEVSHELLS_REPO_REF%" "${devshells.sourceInfo.rev}.${builtins.readFile "${nixpkgs}/.git-revision"}" + ''; + + landrun-fish = pkgs.writeShellApplication { + name = "landrun-fish"; + text = builtins.readFile ./landrun-fish.sh; + inheritPath = true; + runtimeInputs = [ + pkgs.landrun + ]; + }; in { options.soispha.programs.direnv = { enable = lib.mkEnableOption "direnv"; }; - config.home-manager.users.soispha.programs.direnv = lib.mkIf cfg.enable { - enable = true; + config = lib.mkIf cfg.enable { + soispha.programs.fish.integrations.direnv = + # fish + '' + function __direnv_export_eval + ${lib.getExe direnvCfg.package} export fish | source; + end - nix-direnv = { - enable = true; - package = pkgs.nix-direnv.override {nix = config.nix.package;}; - }; + if test -z "$NO_DIRENV_LOAD" + function _direnv_hook + if test -f ".env" -o -f ".envrc" -o -f ".nenvrc" + ${landrun-fish} --interactive --command='__direnv_export_eval' + end + end + + function __direnv_on_prompt --on-event fish_prompt; + _direnv_hook + end + + function _direnv_on_preexec --on-event fish_preexec; + _direnv_hook + end + end + ''; + + home-manager.users.soispha = { + programs.direnv = { + enable = true; + + package = pkgs.direnv-patched; + + nix-direnv = { + enable = true; + package = pkgs.nix-direnv.override {nix = config.nix.package;}; + }; + + # Handled by myself (and the script is overridden) + enableBashIntegration = true; + enableZshIntegration = true; + enableFishIntegration = false; + + config = { + warn_timeout = 0; + + # NOTE: Something variable is undeclared in the my default loaded stuff :/. <2026-08-18> + # strict_env = true; - config = { - warn_timeout = 0; - # strict_env = true; - # disable_stdin = true; + # disable_stdin = true; + }; + }; + xdg.configFile = { + "direnv/lib/hm-pre-cache.sh" = { + source = pre-cache; + }; + }; }; }; } diff --git a/modules/by-name/di/direnv/pre-cache.sh b/modules/by-name/di/direnv/pre-cache.sh new file mode 100755 index 00000000..706dae61 --- /dev/null +++ b/modules/by-name/di/direnv/pre-cache.sh @@ -0,0 +1,89 @@ +#! /usr/bin/env sh + +_pre_cache_log() { + printf "pre-cache: %s\n" "$1" +} +_pre_cache_preflight() { + set -eu + _nix_direnv_preflight + + REPO="%DEVSHELLS_REPO%" + system="x86_64-linux" + cache_dir="$XDG_CACHE_HOME/pre_cache" + [ -d "$cache_dir" ] || mkdir --parents "$cache_dir" + + repo_ref="%DEVSHELLS_REPO_REF%" + final_cache="$cache_dir/$repo_ref" + + if ! [ -d "$final_cache" ]; then + _pre_cache_log "Cache dir invalidated" + + # There is not yet a final cache directory, so the ref must have changed. + # Therefore we delete the whole cache directory, so we invalidate old cached shells. + set -u + rm --recursive "$cache_dir" + + mkdir --parents "$final_cache" + fi + + # TODO: Direnv requires `-u` to be unset, for it's stdlib :/. <2026-08-22> + set +u +} + +_pre_cache_load_shell() { + lang="$1" + lang_cache="$final_cache/$lang" + + if ! [ -f "$lang_cache" ]; then + tmp_profile="$final_cache/__tmp_profile" + profile="$final_cache/__profile" + + # It does not already exists, we need to evaluate it. + _nix print-dev-env --profile "$tmp_profile" "$REPO#$lang" >"$lang_cache" + + _nix_add_gcroot "$tmp_profile" "$profile" + # rm "$tmp_profile" "$tmp_profile"* || true + fi + + _pre_cache_log "Loaded dev-shell for $lang." + _nix_import_env "$lang_cache" +} + +_pre_cache_build_shells() { + installables="" + + for lang in "$@"; do + lang_cache="$final_cache/$lang" + + if ! [ -f "$lang_cache" ]; then + new_part="$REPO#devShells.$system.$lang" + + if [ -z "$installables" ]; then + installables="$new_part" + else + installables="$installables $new_part" + fi + fi + done + + if [ -n "$installables" ]; then + _pre_cache_log "Building '$installables'..." + + # We want shell-spliting + # shellcheck disable=SC2086 + _nix build --no-link $installables + fi +} + +pre_cache_load() { + _pre_cache_preflight + + # Build all not-yet build shells concurrently. That speeds up the initial load. + _pre_cache_build_shells "$@" + + for lan in "$@"; do + _pre_cache_load_shell "$lan" + done +} + +# vim: ft=sh diff --git a/modules/by-name/fi/fish/config/01_show-task.fish b/modules/by-name/fi/fish/config/01_show-task.fish new file mode 100644 index 00000000..7287f885 --- /dev/null +++ b/modules/by-name/fi/fish/config/01_show-task.fish @@ -0,0 +1,14 @@ +#!/usr/bin/env fish + +# nixos-config - My current NixOS configuration +# +# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de> +# SPDX-License-Identifier: GPL-3.0-or-later +# +# This file is part of my nixos-config. +# +# You should have received a copy of the License along with this program. +# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>. + +# Display current tasks +test -z "$NVIM"; and task next diff --git a/modules/by-name/fi/fish/config/keybindings/00__start.fish b/modules/by-name/fi/fish/config/keybindings/00__start.fish new file mode 100644 index 00000000..75227ef1 --- /dev/null +++ b/modules/by-name/fi/fish/config/keybindings/00__start.fish @@ -0,0 +1 @@ +bind --erase --all diff --git a/modules/by-name/fi/fish/config/keybindings/01_insert.fish b/modules/by-name/fi/fish/config/keybindings/01_insert.fish new file mode 100644 index 00000000..738b5272 --- /dev/null +++ b/modules/by-name/fi/fish/config/keybindings/01_insert.fish @@ -0,0 +1,85 @@ +bind --preset --mode insert ctrl-y yank +bind --preset --mode insert alt-y yank-pop +bind --preset --mode insert right forward-char +bind --preset --mode insert left backward-char +bind --preset --mode insert ctrl-right forward-token +bind --preset --mode insert ctrl-left backward-token +bind --preset --mode insert pageup beginning-of-history +bind --preset --mode insert pagedown end-of-history +bind --preset --mode insert ctrl-x fish_clipboard_copy +bind --preset --mode insert ctrl-v fish_clipboard_paste +bind --preset --mode insert tab complete +bind --preset --mode insert ctrl-i complete +bind --preset --mode insert ctrl-s pager-toggle-search +bind --preset --mode insert shift-tab complete-and-search +bind --preset --mode insert shift-delete history-delete or backward-delete-char +bind --preset --mode insert down down-or-search +bind --preset --mode insert up up-or-search +bind --preset --mode insert shift-right forward-bigword +bind --preset --mode insert shift-left backward-bigword +bind --preset --mode insert alt-b prevd-or-backward-word +bind --preset --mode insert alt-f nextd-or-forward-word +bind --preset --mode insert alt-right nextd-or-forward-word +bind --preset --mode insert \e\[1\;9C nextd-or-forward-word +bind --preset --mode insert alt-left prevd-or-backward-word +bind --preset --mode insert \e\[1\;9D prevd-or-backward-word +bind --preset --mode insert alt-up history-token-search-backward +bind --preset --mode insert alt-down history-token-search-forward +bind --preset --mode insert \e\[1\;9A history-token-search-backward +bind --preset --mode insert \e\[1\;9B history-token-search-forward +bind --preset --mode insert alt-. history-token-search-backward +bind --preset --mode insert alt-l __fish_list_current_token +bind --preset --mode insert alt-o __fish_preview_current_file +bind --preset --mode insert alt-w __fish_whatis_current_token +bind --preset --mode insert ctrl-l 'status test-terminal-feature scroll-content-up && commandline -f scrollback-push' clear-screen +bind --preset --mode insert ctrl-c clear-commandline +bind --preset --mode insert ctrl-u backward-kill-line +bind --preset --mode insert ctrl-k kill-line +bind --preset --mode insert ctrl-w backward-kill-path-component +bind --preset --mode insert end end-of-line +bind --preset --mode insert home beginning-of-line +bind --preset --mode insert alt-d 'if test "$(commandline; printf .)" = \\n.; __fish_echo dirh; else; commandline -f kill-word; end' +bind --preset --mode insert ctrl-d delete-or-exit +bind --preset --mode insert alt-s 'for cmd in sudo doas please run0; if command -q $cmd; fish_commandline_prepend $cmd; break; end; end' +bind --preset --mode insert f1 __fish_man_page +bind --preset --mode insert alt-h __fish_man_page +bind --preset --mode insert alt-p __fish_paginate +bind --preset --mode insert alt-# __fish_toggle_comment_commandline +bind --preset --mode insert alt-e edit_command_buffer +bind --preset --mode insert alt-v edit_command_buffer +bind --preset --mode insert '' self-insert +bind --preset --mode insert space self-insert expand-abbr +bind --preset --mode insert \; self-insert expand-abbr +bind --preset --mode insert \| self-insert expand-abbr +bind --preset --mode insert \& self-insert expand-abbr +bind --preset --mode insert \> self-insert expand-abbr +bind --preset --mode insert \< self-insert expand-abbr +bind --preset --mode insert shift-enter 'commandline -i \\n (commandline --search-field >/dev/null && echo --search-field)' expand-abbr +bind --preset --mode insert alt-enter 'commandline -i \\n (commandline --search-field >/dev/null && echo --search-field)' expand-abbr +bind --preset --mode insert \) self-insert expand-abbr +bind --preset --mode insert ctrl-space 'test -n "$(commandline)" && commandline -i " " (commandline --search-field >/dev/null && echo --search-field)' +bind --preset --mode insert shift-space 'commandline -i " " (commandline --search-field >/dev/null && echo --search-field)' expand-abbr +bind --preset --mode insert enter execute +bind --preset --mode insert ctrl-j execute +bind --preset --mode insert ctrl-m execute +bind --preset --mode insert ctrl-enter execute + +bind --preset --mode insert ctrl-n accept-autosuggestion +bind --preset --mode insert delete delete-char +bind --preset --mode insert backspace backward-delete-char +bind --preset --mode insert shift-backspace backward-delete-char +bind --preset --mode insert ctrl-h backward-delete-char + +function _bind_insert_escape + if commandline -P + commandline -f cancel + else + set fish_bind_mode default + if test (count (commandline --cut-at-cursor | tail -c2)) != 2 + commandline -f backward-char + end + commandline -f repaint-mode + end +end +bind --preset --mode insert escape _bind_insert_escape +bind --preset --mode insert ctrl-\[ _bind_insert_escape diff --git a/modules/by-name/fi/fish/config/keybindings/02_command.fish b/modules/by-name/fi/fish/config/keybindings/02_command.fish new file mode 100644 index 00000000..56f64b32 --- /dev/null +++ b/modules/by-name/fi/fish/config/keybindings/02_command.fish @@ -0,0 +1,178 @@ +bind --preset --mode default ctrl-y yank +bind --preset --mode default alt-y yank-pop +bind --preset --mode default right forward-char +bind --preset --mode default left backward-char +bind --preset --mode default ctrl-right forward-token +bind --preset --mode default ctrl-left backward-token +bind --preset --mode default pageup beginning-of-history +bind --preset --mode default pagedown end-of-history +bind --preset --mode default ctrl-x fish_vi_dec +bind --preset --mode default ctrl-v fish_clipboard_paste +bind --preset --mode default escape 'set -g __fish_vi_count' +bind --preset --mode default ctrl-\[ 'set -g __fish_vi_count' +bind --preset --mode default tab complete +bind --preset --mode default ctrl-i complete +bind --preset --mode default ctrl-s pager-toggle-search +bind --preset --mode default shift-tab complete-and-search +bind --preset --mode default shift-delete history-delete or backward-delete-char +bind --preset --mode default down down-or-search +bind --preset --mode default up up-or-search +bind --preset --mode default shift-right forward-bigword +bind --preset --mode default shift-left backward-bigword +bind --preset --mode default alt-b prevd-or-backward-word +bind --preset --mode default alt-f nextd-or-forward-word +bind --preset --mode default alt-right nextd-or-forward-word +bind --preset --mode default \e\[1\;9C nextd-or-forward-word +bind --preset --mode default alt-left prevd-or-backward-word +bind --preset --mode default \e\[1\;9D prevd-or-backward-word +bind --preset --mode default alt-up history-token-search-backward +bind --preset --mode default alt-down history-token-search-forward +bind --preset --mode default \e\[1\;9A history-token-search-backward +bind --preset --mode default \e\[1\;9B history-token-search-forward +bind --preset --mode default alt-. history-token-search-backward +bind --preset --mode default alt-l __fish_list_current_token +bind --preset --mode default alt-o __fish_preview_current_file +bind --preset --mode default alt-w __fish_whatis_current_token +bind --preset --mode default ctrl-l 'status test-terminal-feature scroll-content-up && commandline -f scrollback-push' clear-screen +bind --preset --mode default --sets-mode insert ctrl-c clear-commandline repaint-mode +bind --preset --mode default ctrl-u backward-kill-line +bind --preset --mode default ctrl-k kill-line +bind --preset --mode default ctrl-w backward-kill-path-component +bind --preset --mode default end end-of-line +bind --preset --mode default home beginning-of-line +bind --preset --mode default alt-d 'if test "$(commandline; printf .)" = \\n.; __fish_echo dirh; else; commandline -f kill-word; end' +bind --preset --mode default ctrl-d delete-or-exit +bind --preset --mode default alt-s 'for cmd in sudo doas please run0; if command -q $cmd; fish_commandline_prepend $cmd; break; end; end' +bind --preset --mode default f1 __fish_man_page +bind --preset --mode default alt-h __fish_man_page +bind --preset --mode default alt-p __fish_paginate +bind --preset --mode default alt-# __fish_toggle_comment_commandline +bind --preset --mode default alt-e edit_command_buffer +bind --preset --mode default alt-v edit_command_buffer +bind --preset --mode default :,q exit +bind --preset --mode default 1 'fish_vi_arg_digit 1' +bind --preset --mode default 2 'fish_vi_arg_digit 2' +bind --preset --mode default 3 'fish_vi_arg_digit 3' +bind --preset --mode default 4 'fish_vi_arg_digit 4' +bind --preset --mode default 5 'fish_vi_arg_digit 5' +bind --preset --mode default 6 'fish_vi_arg_digit 6' +bind --preset --mode default 7 'fish_vi_arg_digit 7' +bind --preset --mode default 8 'fish_vi_arg_digit 8' +bind --preset --mode default 9 'fish_vi_arg_digit 9' +bind --preset --mode default 0 'if test -n "$__fish_vi_count"; fish_vi_arg_digit 0; else; commandline -f beginning-of-line; end' +bind --preset --mode default h 'fish_vi_run_count backward-char' +bind --preset --mode default l 'fish_vi_run_count forward-char' +bind --preset --mode default k 'fish_vi_run_count up-or-search' +bind --preset --mode default j 'fish_vi_run_count down-or-search' +bind --preset --mode default b 'fish_vi_run_count backward-word' +bind --preset --mode default B 'fish_vi_run_count backward-bigword' +bind --preset --mode default g,e 'fish_vi_run_count backward-word-end' +bind --preset --mode default g,E 'fish_vi_run_count backward-bigword-end' +bind --preset --mode default w 'fish_vi_run_count forward-word-vi' +bind --preset --mode default W 'fish_vi_run_count forward-bigword-vi' +bind --preset --mode default e 'fish_vi_run_count forward-word-end' +bind --preset --mode default E 'fish_vi_run_count forward-bigword-end' +bind --preset --mode default x __fish_vi_delete_char +bind --preset --mode default X __fish_vi_backward_delete_char + +bind --preset --mode default --sets-mode insert enter execute +bind --preset --mode default --sets-mode insert ctrl-j execute +bind --preset --mode default --sets-mode insert ctrl-m execute +bind --preset --mode default --sets-mode insert o 'set fish_cursor_end_mode exclusive' insert-line-under repaint-mode +bind --preset --mode default --sets-mode insert O 'set fish_cursor_end_mode exclusive' insert-line-over repaint-mode +bind --preset --mode default --sets-mode insert i repaint-mode +bind --preset --mode default --sets-mode insert I beginning-of-line repaint-mode +bind --preset --mode default --sets-mode insert a 'set fish_cursor_end_mode exclusive' forward-single-char repaint-mode +bind --preset --mode default --sets-mode insert A 'set fish_cursor_end_mode exclusive' end-of-line repaint-mode +bind --preset --mode default --sets-mode visual v begin-selection repaint-mode +bind --preset --mode default g,g beginning-of-buffer +bind --preset --mode default G end-of-buffer +bind --preset --mode default \$ end-of-line +bind --preset --mode default g,\$ end-of-line +bind --preset --mode default ^ beginning-of-line +bind --preset --mode default g,^ beginning-of-line +bind --preset --mode default _ beginning-of-line +bind --preset --mode default u undo +bind --preset --mode default ctrl-r redo +bind --preset --mode default \[ history-token-search-backward +bind --preset --mode default \] history-token-search-forward +bind --preset --mode default --sets-mode insert / history-pager repaint-mode + +bind --preset --mode default delete delete-char +bind --preset --mode default backspace backward-char +bind --preset --mode default ctrl-h backward-char +bind --preset --mode default d 'fish_vi_start_operator delete' +bind --preset --mode default c 'fish_vi_start_operator change' +bind --preset --mode default y 'fish_vi_start_operator yank' +bind --preset --mode default g,\~ 'fish_vi_start_operator swap-case' + +bind --preset --mode default D kill-line +bind --preset --mode default d,\$ kill-line +bind --preset --mode default d,^ backward-kill-line +bind --preset --mode default d,0 backward-kill-line +bind --preset --mode default d,i,w kill-inner-word +bind --preset --mode default d,i,W kill-inner-bigword +bind --preset --mode default d,a,w kill-a-word +bind --preset --mode default d,a,W kill-a-bigword +bind --preset --mode default d,i,b jump-till-matching-bracket and jump-till-matching-bracket and begin-selection jump-till-matching-bracket kill-selection end-selection +bind --preset --mode default d,a,b jump-to-matching-bracket and jump-to-matching-bracket and begin-selection jump-to-matching-bracket kill-selection end-selection +bind --preset --mode default d,i backward-jump-till and repeat-jump-reverse and begin-selection repeat-jump kill-selection end-selection +bind --preset --mode default d,a backward-jump and repeat-jump-reverse and begin-selection repeat-jump kill-selection end-selection +bind --preset --mode default d,\; begin-selection repeat-jump kill-selection end-selection +bind --preset --mode default d,comma begin-selection repeat-jump-reverse kill-selection end-selection +bind --preset --mode default \~ togglecase-char forward-single-char +bind --preset --mode default g,u downcase-word +bind --preset --mode default g,U upcase-word +bind --preset --mode default J end-of-line delete-char +bind --preset --mode default K 'man (commandline -t) 2>/dev/null; or echo -n \\a' +bind --preset --mode default \",\*,y,y fish_clipboard_copy +bind --preset --mode default \",\*,Y fish_clipboard_copy +bind --preset --mode default \",+,y,y fish_clipboard_copy +bind --preset --mode default \",+,Y fish_clipboard_copy +bind --preset --mode default Y kill-whole-line yank +bind --preset --mode default y,\$ kill-line yank +bind --preset --mode default y,^ backward-kill-line yank +bind --preset --mode default y,0 backward-kill-line yank +bind --preset --mode default y,i,w kill-inner-word yank +bind --preset --mode default y,i,W kill-inner-bigword yank +bind --preset --mode default y,a,w kill-a-word yank +bind --preset --mode default y,a,W kill-a-bigword yank +bind --preset --mode default y,i,b jump-till-matching-bracket and jump-till-matching-bracket and begin-selection jump-till-matching-bracket fish_vi_yank_selection end-selection +bind --preset --mode default y,a,b jump-to-matching-bracket and jump-to-matching-bracket and begin-selection jump-to-matching-bracket fish_vi_yank_selection end-selection +bind --preset --mode default y,i backward-jump-till and repeat-jump-reverse and begin-selection repeat-jump fish_vi_yank_selection end-selection +bind --preset --mode default y,a backward-jump and repeat-jump-reverse and begin-selection repeat-jump fish_vi_yank_selection end-selection +bind --preset --mode default % jump-to-matching-bracket +bind --preset --mode default f forward-jump +bind --preset --mode default F backward-jump +bind --preset --mode default t forward-jump-till +bind --preset --mode default T backward-jump-till +bind --preset --mode default \; repeat-jump +bind --preset --mode default comma repeat-jump-reverse +bind --preset --mode default p 'set -g fish_cursor_end_mode exclusive' forward-char 'set -g fish_cursor_end_mode inclusive' yank +bind --preset --mode default P yank +bind --preset --mode default g,p yank-pop +bind --preset --mode default \",\*,p 'set -g fish_cursor_end_mode exclusive' forward-char 'set -g fish_cursor_end_mode inclusive' fish_clipboard_paste +bind --preset --mode default \",\*,P fish_clipboard_paste +bind --preset --mode default \",+,p 'set -g fish_cursor_end_mode exclusive' forward-char 'set -g fish_cursor_end_mode inclusive' fish_clipboard_paste +bind --preset --mode default \",+,P fish_clipboard_paste + +bind --preset --mode default --sets-mode replace_one r repaint-mode +bind --preset --mode default --sets-mode replace R repaint-mode + +bind --preset --mode default ctrl-a fish_vi_inc +bind --preset --mode default \# __fish_toggle_comment_commandline + +bind --preset --mode default --sets-mode insert s delete-char repaint-mode +bind --preset --mode default --sets-mode insert S kill-inner-line repaint-mode +bind --preset --mode default --sets-mode insert C kill-line repaint-mode +bind --preset --mode default --sets-mode insert c,\$ kill-line repaint-mode +bind --preset --mode default --sets-mode insert c,^ backward-kill-line repaint-mode +bind --preset --mode default --sets-mode insert c,0 backward-kill-line repaint-mode +bind --preset --mode default --sets-mode insert c,i,w kill-inner-word repaint-mode +bind --preset --mode default --sets-mode insert c,i,W kill-inner-bigword repaint-mode +bind --preset --mode default --sets-mode insert c,a,w kill-a-word repaint-mode +bind --preset --mode default --sets-mode insert c,a,W kill-a-bigword repaint-mode +bind --preset --mode default --sets-mode insert c,i,b jump-till-matching-bracket and jump-till-matching-bracket and begin-selection jump-till-matching-bracket kill-selection end-selection +bind --preset --mode default --sets-mode insert c,a,b jump-to-matching-bracket and jump-to-matching-bracket and begin-selection jump-to-matching-bracket kill-selection end-selection +bind --preset --mode default --sets-mode insert c,i backward-jump-till and repeat-jump-reverse and begin-selection repeat-jump kill-selection end-selection repaint-mode +bind --preset --mode default --sets-mode insert c,a backward-jump and repeat-jump-reverse and begin-selection repeat-jump kill-selection end-selection repaint-mode diff --git a/modules/by-name/fi/fish/config/keybindings/03_visual.fish b/modules/by-name/fi/fish/config/keybindings/03_visual.fish new file mode 100644 index 00000000..3996549b --- /dev/null +++ b/modules/by-name/fi/fish/config/keybindings/03_visual.fish @@ -0,0 +1,94 @@ +bind --preset --mode visual ctrl-y yank +bind --preset --mode visual alt-y yank-pop +bind --preset --mode visual right forward-char +bind --preset --mode visual left backward-char +bind --preset --mode visual ctrl-right forward-token +bind --preset --mode visual ctrl-left backward-token +bind --preset --mode visual pageup beginning-of-history +bind --preset --mode visual pagedown end-of-history +bind --preset --mode visual ctrl-x fish_clipboard_copy +bind --preset --mode visual ctrl-v fish_clipboard_paste +bind --preset --mode visual --sets-mode default escape end-selection repaint-mode +bind --preset --mode visual --sets-mode default ctrl-\[ end-selection repaint-mode +bind --preset --mode visual tab complete +bind --preset --mode visual ctrl-i complete +bind --preset --mode visual ctrl-s pager-toggle-search +bind --preset --mode visual shift-tab complete-and-search +bind --preset --mode visual shift-delete history-delete or backward-delete-char +bind --preset --mode visual down down-or-search +bind --preset --mode visual up up-or-search +bind --preset --mode visual shift-right forward-bigword +bind --preset --mode visual shift-left backward-bigword +bind --preset --mode visual alt-b prevd-or-backward-word +bind --preset --mode visual alt-f nextd-or-forward-word +bind --preset --mode visual alt-right nextd-or-forward-word +bind --preset --mode visual \e\[1\;9C nextd-or-forward-word +bind --preset --mode visual alt-left prevd-or-backward-word +bind --preset --mode visual \e\[1\;9D prevd-or-backward-word +bind --preset --mode visual alt-up history-token-search-backward +bind --preset --mode visual alt-down history-token-search-forward +bind --preset --mode visual \e\[1\;9A history-token-search-backward +bind --preset --mode visual \e\[1\;9B history-token-search-forward +bind --preset --mode visual alt-. history-token-search-backward +bind --preset --mode visual alt-l __fish_list_current_token +bind --preset --mode visual alt-o __fish_preview_current_file +bind --preset --mode visual alt-w __fish_whatis_current_token +bind --preset --mode visual ctrl-l 'status test-terminal-feature scroll-content-up && commandline -f scrollback-push' clear-screen +bind --preset --mode visual --sets-mode default ctrl-c end-selection repaint-mode +bind --preset --mode visual ctrl-u backward-kill-line +bind --preset --mode visual ctrl-k kill-line +bind --preset --mode visual ctrl-w backward-kill-path-component +bind --preset --mode visual end end-of-line +bind --preset --mode visual home beginning-of-line +bind --preset --mode visual alt-d 'if test "$(commandline; printf .)" = \\n.; __fish_echo dirh; else; commandline -f kill-word; end' +bind --preset --mode visual ctrl-d delete-or-exit +bind --preset --mode visual alt-s 'for cmd in sudo doas please run0; if command -q $cmd; fish_commandline_prepend $cmd; break; end; end' +bind --preset --mode visual f1 __fish_man_page +bind --preset --mode visual alt-h __fish_man_page +bind --preset --mode visual alt-p __fish_paginate +bind --preset --mode visual alt-# __fish_toggle_comment_commandline +bind --preset --mode visual alt-e edit_command_buffer +bind --preset --mode visual alt-v edit_command_buffer + +bind --preset --mode visual h backward-char +bind --preset --mode visual l forward-char +bind --preset --mode visual k up-line +bind --preset --mode visual j down-line +bind --preset --mode visual b backward-word +bind --preset --mode visual B backward-bigword +bind --preset --mode visual g,e backward-word-end +bind --preset --mode visual g,E backward-bigword-end +bind --preset --mode visual w forward-word-vi +bind --preset --mode visual W forward-bigword-vi +bind --preset --mode visual e forward-word-end +bind --preset --mode visual E forward-bigword-end +bind --preset --mode visual o swap-selection-start-stop repaint-mode +bind --preset --mode visual % jump-to-matching-bracket +bind --preset --mode visual f forward-jump +bind --preset --mode visual t forward-jump-till +bind --preset --mode visual F backward-jump +bind --preset --mode visual T backward-jump-till +bind --preset --mode visual \; repeat-jump +bind --preset --mode visual comma repeat-jump-reverse +bind --preset --mode visual \$ end-of-line +bind --preset --mode visual g,\$ end-of-line +bind --preset --mode visual ^ beginning-of-line +bind --preset --mode visual 0 beginning-of-line +bind --preset --mode visual g,^ beginning-of-line +bind --preset --mode visual _ beginning-of-line + +bind --preset --mode visual --sets-mode default v end-selection repaint-mode +bind --preset --mode visual --sets-mode insert i end-selection repaint-mode +bind --preset --mode visual --sets-mode insert I end-selection beginning-of-line repaint-mode +bind --preset --mode visual --sets-mode insert c kill-selection end-selection repaint-mode +bind --preset --mode visual --sets-mode insert s kill-selection end-selection repaint-mode +bind --preset --mode visual --sets-mode default d kill-selection end-selection backward-char repaint-mode +bind --preset --mode visual --sets-mode default x kill-selection end-selection repaint-mode +bind --preset --mode visual --sets-mode default X kill-whole-line end-selection repaint-mode +bind --preset --mode visual --sets-mode default y fish_vi_yank_selection end-selection repaint-mode +bind --preset --mode visual --sets-mode default \",\*,y 'fish_clipboard_copy; commandline -f end-selection repaint-mode' +bind --preset --mode visual --sets-mode default \",+,y 'fish_clipboard_copy; commandline -f end-selection repaint-mode' +bind --preset --mode visual --sets-mode default \~ togglecase-selection end-selection repaint-mode +bind --preset --mode visual --sets-mode default g,u downcase-selection end-selection repaint-mode +bind --preset --mode visual --sets-mode default g,U upcase-selection end-selection repaint-mode +bind --preset --mode visual \# __fish_toggle_comment_commandline diff --git a/modules/by-name/fi/fish/config/keybindings/04_replace.fish b/modules/by-name/fi/fish/config/keybindings/04_replace.fish new file mode 100644 index 00000000..95de4cc0 --- /dev/null +++ b/modules/by-name/fi/fish/config/keybindings/04_replace.fish @@ -0,0 +1,9 @@ +bind --preset --mode replace '' delete-char self-insert +bind --preset --mode replace --sets-mode insert enter execute repaint-mode +bind --preset --mode replace --sets-mode insert ctrl-j execute repaint-mode +bind --preset --mode replace --sets-mode insert ctrl-m execute repaint-mode +bind --preset --mode replace --sets-mode default escape cancel repaint-mode +bind --preset --mode replace --sets-mode default ctrl-\[ cancel repaint-mode +bind --preset --mode replace backspace backward-char +bind --preset --mode replace shift-backspace backward-char +bind --preset --mode replace \# __fish_toggle_comment_commandline diff --git a/modules/by-name/fi/fish/config/keybindings/05_operator.fish b/modules/by-name/fi/fish/config/keybindings/05_operator.fish new file mode 100644 index 00000000..67f84d82 --- /dev/null +++ b/modules/by-name/fi/fish/config/keybindings/05_operator.fish @@ -0,0 +1,33 @@ +bind --preset --mode operator \; 'fish_vi_exec_motion repeat-jump' +bind --preset --mode operator comma 'fish_vi_exec_motion repeat-jump-reverse' +bind --preset --mode operator d 'fish_vi_exec_motion --linewise' +bind --preset --mode operator c 'fish_vi_exec_motion --linewise' +bind --preset --mode operator y 'fish_vi_exec_motion --linewise' +bind --preset --mode operator \~ 'fish_vi_exec_motion --linewise' + +bind --preset --mode operator escape fish_vi_operator_cancel +bind --preset --mode operator ctrl-\[ fish_vi_operator_cancel +bind --preset --mode operator 1 'fish_vi_arg_digit 1' +bind --preset --mode operator 2 'fish_vi_arg_digit 2' +bind --preset --mode operator 3 'fish_vi_arg_digit 3' +bind --preset --mode operator 4 'fish_vi_arg_digit 4' +bind --preset --mode operator 5 'fish_vi_arg_digit 5' +bind --preset --mode operator 6 'fish_vi_arg_digit 6' +bind --preset --mode operator 7 'fish_vi_arg_digit 7' +bind --preset --mode operator 8 'fish_vi_arg_digit 8' +bind --preset --mode operator 9 'fish_vi_arg_digit 9' +bind --preset --mode operator 0 'fish_vi_exec_motion beginning-of-line' +bind --preset --mode operator h 'fish_vi_exec_motion backward-char' +bind --preset --mode operator l 'fish_vi_exec_motion forward-char' +bind --preset --mode operator k 'fish_vi_exec_motion up-line' +bind --preset --mode operator j 'fish_vi_exec_motion down-line' +bind --preset --mode operator b 'fish_vi_exec_motion backward-word' +bind --preset --mode operator B 'fish_vi_exec_motion backward-bigword' +bind --preset --mode operator g,e 'fish_vi_exec_motion backward-word-end' +bind --preset --mode operator g,E 'fish_vi_exec_motion backward-bigword-end' +bind --preset --mode operator w 'fish_vi_exec_motion forward-word-vi' +bind --preset --mode operator W 'fish_vi_exec_motion forward-bigword-vi' +bind --preset --mode operator e 'fish_vi_exec_motion forward-word-end' +bind --preset --mode operator E 'fish_vi_exec_motion forward-bigword-end' +bind --preset --mode operator ^ 'fish_vi_exec_motion beginning-of-line' +bind --preset --mode operator \$ 'fish_vi_exec_motion end-of-line' diff --git a/modules/by-name/fi/fish/config/keybindings/06_replace_one.fish b/modules/by-name/fi/fish/config/keybindings/06_replace_one.fish new file mode 100644 index 00000000..0d2672b4 --- /dev/null +++ b/modules/by-name/fi/fish/config/keybindings/06_replace_one.fish @@ -0,0 +1,7 @@ +bind --preset --mode replace_one --sets-mode default '' 'set -g fish_cursor_end_mode exclusive' delete-char self-insert backward-char repaint-mode 'set -g fish_cursor_end_mode inclusive' +bind --preset --mode replace_one --sets-mode default enter 'set -g fish_cursor_end_mode exclusive' 'commandline -f delete-char; commandline -i \\n; commandline -f backward-char' repaint-mode 'set -g fish_cursor_end_mode inclusive' +bind --preset --mode replace_one --sets-mode default ctrl-j 'set -g fish_cursor_end_mode exclusive' 'commandline -f delete-char; commandline -i \\n; commandline -f backward-char' repaint-mode 'set -g fish_cursor_end_mode inclusive' +bind --preset --mode replace_one --sets-mode default ctrl-m 'set -g fish_cursor_end_mode exclusive' 'commandline -f delete-char; commandline -i \\n; commandline -f backward-char' repaint-mode 'set -g fish_cursor_end_mode inclusive' +bind --preset --mode replace_one --sets-mode default escape cancel repaint-mode +bind --preset --mode replace_one --sets-mode default ctrl-\[ cancel repaint-mode + diff --git a/modules/by-name/fi/fish/config/keybindings/07_others.fish b/modules/by-name/fi/fish/config/keybindings/07_others.fish new file mode 100644 index 00000000..99679857 --- /dev/null +++ b/modules/by-name/fi/fish/config/keybindings/07_others.fish @@ -0,0 +1,9 @@ +bind --preset --mode operator --sets-mode f f '' +bind --preset --mode operator --sets-mode F F '' +bind --preset --mode operator --sets-mode t t '' +bind --preset --mode operator --sets-mode T T '' + +bind --preset --mode f '' get-key 'fish_vi_exec_motion commandline --forward-jump=$fish_key' 'set -eg fish_key' +bind --preset --mode F '' get-key 'fish_vi_exec_motion commandline --backward-jump=$fish_key' 'set -eg fish_key' +bind --preset --mode t '' get-key 'fish_vi_exec_motion commandline --forward-jump-till=$fish_key' 'set -eg fish_key' +bind --preset --mode T '' get-key 'fish_vi_exec_motion commandline --backward-jump-till=$fish_key' 'set -eg fish_key' diff --git a/modules/by-name/fi/fish/config/keybindings/08__end.fish b/modules/by-name/fi/fish/config/keybindings/08__end.fish new file mode 100644 index 00000000..20efad65 --- /dev/null +++ b/modules/by-name/fi/fish/config/keybindings/08__end.fish @@ -0,0 +1 @@ +fish_vi_key_bindings diff --git a/modules/by-name/fi/fish/module.nix b/modules/by-name/fi/fish/module.nix new file mode 100644 index 00000000..42746c5c --- /dev/null +++ b/modules/by-name/fi/fish/module.nix @@ -0,0 +1,76 @@ +# nixos-config - My current NixOS configuration +# +# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de> +# SPDX-License-Identifier: GPL-3.0-or-later +# +# This file is part of my nixos-config. +# +# You should have received a copy of the License along with this program. +# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>. +{ + config, + lib, + ... +}: let + cfg = config.soispha.programs.fish; + + sourceFile = path: "source ${path}\n"; + + extraFiles = builtins.concatStringsSep "\n" ( + builtins.map (value: + if builtins.isPath value + then (sourceFile value) + else value) ( + builtins.attrValues cfg.integrations + ) + ); +in { + options.soispha.programs.fish = { + enable = lib.mkEnableOption "fish"; + + integrations = lib.mkOption { + type = lib.types.attrsOf (lib.types.either lib.types.path lib.types.str); + example = '' + { + atuin = ./integrations/atuin.fish; + } + ''; + default = {}; + }; + }; + + config = lib.mkIf cfg.enable { + home-manager.users.soispha = { + home.sessionPath = lib.mkForce []; + + programs.fish = { + enable = true; + + interactiveShellInit = let + start = lib.modules.mkBefore ( + sourceFile ./config/01_show-task.fish + ); + end = lib.modules.mkAfter ( + sourceFile ./config/keybindings/00__start.fish + + sourceFile ./config/keybindings/01_insert.fish + + sourceFile ./config/keybindings/02_command.fish + + sourceFile ./config/keybindings/03_visual.fish + + sourceFile ./config/keybindings/04_replace.fish + + sourceFile ./config/keybindings/05_operator.fish + + sourceFile ./config/keybindings/06_replace_one.fish + + sourceFile ./config/keybindings/07_others.fish + + sourceFile ./config/keybindings/08__end.fish + ); + in + lib.modules.mkMerge + [ + start + + extraFiles + + end + ]; + }; + }; + }; +} diff --git a/modules/by-name/fo/foot/module.nix b/modules/by-name/fo/foot/module.nix index 370c4d5a..8d5cfe2b 100644 --- a/modules/by-name/fo/foot/module.nix +++ b/modules/by-name/fo/foot/module.nix @@ -27,6 +27,15 @@ in { ]; home-manager.users.soispha = { + systemd.user.services.foot = { + # Don't restart the foot server (otherwise all my open foot terminals would exit + # too) + Unit.X-SwitchMethod = "keep-old"; + + # TODO: This should probably be added <2026-07-02> + # OOMScoreAdjust=-100; + }; + programs.foot = { enable = true; server.enable = true; @@ -45,6 +54,10 @@ in { launch = "ll \${match}"; }; + colors-dark = { + jump-labels = "f2f4f8 484848"; + }; + key-bindings = { regex-launch = [ "[hashes] Control+h" diff --git a/modules/by-name/gi/git/git_ignore.git b/modules/by-name/gi/git/git_ignore.git index 8f29815e..9a92db69 100644 --- a/modules/by-name/gi/git/git_ignore.git +++ b/modules/by-name/gi/git/git_ignore.git @@ -1,4 +1,7 @@ # default nvim Session file name Session.vim +# The .direnv file for pre-cache devshells +.nenvrc + # vim: ft=gitignore diff --git a/modules/by-name/gp/gpg/module.nix b/modules/by-name/gp/gpg/module.nix index d5136e92..9be4cada 100644 --- a/modules/by-name/gp/gpg/module.nix +++ b/modules/by-name/gp/gpg/module.nix @@ -22,7 +22,47 @@ in { }; config = lib.mkIf cfg.enable { - soispha.programs.qutebrowser.key = "8321 ED3A 8DB9 99A5 1F3B F80F F268 2914 EA42 DE26"; + soispha = { + programs = { + qutebrowser.key = "8321 ED3A 8DB9 99A5 1F3B F80F F268 2914 EA42 DE26"; + + # fish.integrations.gpg = + # # fish + # '' + # set --export --global GPG_TTY $(tty) + # + # # Ensure that get gpg agent is started (necessary because ssh does not start it + # # automatically and has it's tty updated) + # gpg-connect-agent updatestartuptty /bye + # ''; + + zsh.integrations.gpg = + # bash + '' + export GPG_TTY=$(tty) + + # Magic copied from the gpg-agent manual + unset SSH_AGENT_PID + if [ "''${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]; then + export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)" + fi + + + # Ensure that get gpg agent is started (necessary because ssh does not start it + # automatically and has it's tty updated) + gpg-connect-agent /bye + ''; + }; + + services.unison.pathsToIgnore = [ + # "Unknown filetype" (and there is no real reason to (try to) synchronize sockets) + "~/.local/share/gnupg/S.gpg-agent" + "~/.local/share/gnupg/S.gpg-agent.browser" + "~/.local/share/gnupg/S.gpg-agent.extra" + "~/.local/share/gnupg/S.gpg-agent.ssh" + "~/.local/share/gnupg/S.scdaemon" + ]; + }; home-manager.users.soispha = { programs.gpg = { @@ -51,7 +91,8 @@ in { services = { gpg-agent = { enable = true; - enableZshIntegration = true; + enableZshIntegration = false; + enableFishIntegration = true; enableScDaemon = true; # smartcards and such things # Cache the key passwords @@ -74,20 +115,5 @@ in { }; }; }; - - soispha.programs.zsh.integrations.gpg = '' - export GPG_TTY=$(tty) - - # Magic copied from the gpg-agent manual - unset SSH_AGENT_PID - if [ "''${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]; then - export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)" - fi - - - # Ensure that get gpg agent is started (necessary because ssh does not start it - # automatically and has it's tty updated) - gpg-connect-agent /bye - ''; }; } diff --git a/modules/by-name/gt/gtk/module.nix b/modules/by-name/gt/gtk/module.nix new file mode 100644 index 00000000..44442077 --- /dev/null +++ b/modules/by-name/gt/gtk/module.nix @@ -0,0 +1,82 @@ +# nixos-config - My current NixOS configuration +# +# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de> +# SPDX-License-Identifier: GPL-3.0-or-later +# +# This file is part of my nixos-config. +# +# You should have received a copy of the License along with this program. +# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>. +{ + config, + pkgs, + lib, + packageSets, + libraries, + ... +}: let + cfg = config.soispha.gtk; + + homeConfig = config.home-manager.users.soispha; +in { + options.soispha.gtk = { + enable = libraries.base.options.mkEnable "gtk themes"; + }; + + config.home-manager.users.soispha = lib.mkIf cfg.enable { + gtk = { + enable = true; + theme = { + # NOTE: The `nordic` package pulls the whole plasma shell, to copy some stuff from a plasma theme :/ <2026-05-29> + # NOTE: Unstable removed the nordic theme, as it also supported gtk2, which is + # insecure. So we use stable until unstable adds it again. <2026-08-13> + package = packageSets.stable.nordic; + name = "Nordic"; + }; + cursorTheme = { + package = pkgs.nordzy-cursor-theme; + name = "Nordzy-cursors"; + }; + iconTheme = { + package = pkgs.nordzy-icon-theme; + name = "Nordzy-icon"; + }; + font = { + name = "Noto Sans"; + size = 10; + }; + gtk2 = { + configLocation = "${homeConfig.xdg.configHome}/gtk-2.0/gtkrc"; + # extraConfig = '' + # gtk-enable-animations=1 + # gtk-primary-button-warps-slider=0 + # gtk-toolbar-style=3 + # gtk-menu-images=1 + # gtk-button-images=1 + # + # ''; + }; + gtk3 = { + # extraConfig = '' + # gtk-button-images=true + # gtk-decoration-layout=icon:minimize,maximize,close + # gtk-enable-animations=true + # gtk-menu-images=true + # gtk-primary-button-warps-slider=false + # gtk-toolbar-style=3 + # #gtk-modules=window-decorations-gtk-module:colorreload-gtk-module + # ''; + extraCss = ""; + }; + gtk4 = { + theme = homeConfig.gtk.theme; + # extraConfig = '' + # gtk-application-prefer-dark-theme=true + # gtk-decoration-layout=icon:minimize,maximize,close + # gtk-enable-animations=true + # gtk-primary-button-warps-slider=false + # ''; + }; + }; + }; +} diff --git a/modules/by-name/i3/i3bar-river/module.nix b/modules/by-name/i3/i3bar-river/module.nix index 982ec1e3..55ac59e9 100644 --- a/modules/by-name/i3/i3bar-river/module.nix +++ b/modules/by-name/i3/i3bar-river/module.nix @@ -186,7 +186,7 @@ in { }; # The font and various sizes - font = "SauceCodePro Nerd Font Mono:pixelsize=26"; + font = "SauceCodePro NFM:pixelsize=26"; height = 24; margin_top = 10; margin_bottom = 0; diff --git a/modules/by-name/lf/lf/commands/default.nix b/modules/by-name/lf/lf/commands/default.nix index 42dc548e..98b3119f 100644 --- a/modules/by-name/lf/lf/commands/default.nix +++ b/modules/by-name/lf/lf/commands/default.nix @@ -169,9 +169,6 @@ in { dependencies = [ pkgs.conceal pkgs.fzf - pkgs.gawk - pkgs.trashy - pkgs.gnused ]; }; diff --git a/modules/by-name/lf/lf/commands/scripts/trash_restore.sh b/modules/by-name/lf/lf/commands/scripts/trash_restore.sh index 7b078c26..789ab59a 100755 --- a/modules/by-name/lf/lf/commands/scripts/trash_restore.sh +++ b/modules/by-name/lf/lf/commands/scripts/trash_restore.sh @@ -19,9 +19,5 @@ fs="$fs" # shellcheck disable=SC2269 id="$id" -while IFS="$(printf '\n')" read -r file; do - set -- "$@" "$(pwd)/$file" -done <"$(conceal list | fzf --multi --ansi | awk '{$1="";$2=""; print $0}' | sed 's/^\s*//' | tmp)" - -[ "$#" -ne 0 ] && trash restore --match=exact "$@" +conceal restore --finder=fzf # vim: ft=sh diff --git a/modules/by-name/lf/lf/keybindings/default.nix b/modules/by-name/lf/lf/keybindings/default.nix index d7f8eb95..bd4b2a2c 100644 --- a/modules/by-name/lf/lf/keybindings/default.nix +++ b/modules/by-name/lf/lf/keybindings/default.nix @@ -11,69 +11,99 @@ uid, downloadDir, }: { - # Remove some defaults - "'\"'" = null; - ";" = null; - "\"'\"" = null; + # v o visual-change + # v <esc> visual-discard + # v o visual-change + # v V visual-accept + + "\\!" = "shell-wait"; + "\\$" = "shell"; + "\\%" = "shell-pipe"; + "\\&" = "shell-async"; + "\\:" = "read"; + + "<f-1>" = "help"; + + "<left>" = "updir"; + "<right>" = "open"; + "<down>" = "down"; + "<up>" = "up"; + + "<c-f>" = "page-down"; + "<pgdn>" = "page-down"; + "<pgup>" = "page-up"; + "<c-b>" = "page-up"; + + "[" = "jump-prev"; + "]" = "jump-next"; + q = "quit"; # Sorting - # k = null; k = { - n = ":set sortby natural; set info"; - s = ":set sortby size; set info size"; - t = ":set sortby time; set info time"; - a = ":set sortby atime; set info atime"; - c = ":set sortby ctime; set info ctime"; - e = ":set sortby ext; set info"; + a = ":{{ set sortby atime; set info atime; }}"; + b = ":{{ set sortby btime; set info btime; }}"; + c = ":{{ set sortby ctime; set info ctime; }}"; + e = ":{{ set sortby ext; set info; }}"; + n = ":{{ set sortby natural; set info; }}"; + s = ":{{ set sortby size; set info size; }}"; + t = ":{{ set sortby time; set info time; }}"; + }; + z = { + a = "set info size:time"; + h = "set hidden!"; + n = "set info"; + r = "set reverse!"; + s = "set info size"; + t = "set info time"; }; # Searching l = "search-next"; L = "search-prev"; + "/" = "search"; + "?" = "search-back"; + F = "find-back"; + "," = "find-prev"; + # File edit - # e = null; e = { - e = "\$\$EDITOR \"$f\""; - s = "\$ nvim -S \"$f\""; + e = "\${{ $EDITOR \"$f\" }}"; + s = "\${{ nvim -S \"$f\" }}"; }; u = "view_file"; - # f = null; f = { e = "execute"; l = "follow_link"; }; - # c = null; c = { + h = "chmod"; p = "set_clipboard_path"; s = "stripspace"; - h = "chmod"; }; # Archive Mappings a = { - u = "archive_decompress"; a = "archive_compress"; + u = "archive_decompress"; }; D = { D = "delete"; }; - # d = null; d = { # Trash Mappings d = "trash"; # Dragon Mapping + i = "dragon_individual"; r = "dragon"; s = "dragon_stay"; - i = "dragon_individual"; }; - # j = null; j = { c = "trash_clear"; r = "trash_restore"; @@ -86,17 +116,22 @@ s = "open"; # Basic Functions - "." = "set hidden!"; p = "paste"; x = "cut"; y = "copy"; "<enter>" = "open"; - # m = null; + # Selecting + v = "invert"; + V = "visual"; + "<space>" = ":{{ toggle; down; }}"; + C = "clear"; + U = "unselect"; + m = { - k = "mk_link"; - f = "mk_file"; d = "mk_directory"; + f = "mk_file"; + l = "mk_link"; s = "mk_script"; }; @@ -104,18 +139,24 @@ g = "set_wallpaper"; }; - r = ":rename; cmd-end"; + r = ":{{ rename; cmd-end; }}"; + "<c-r>" = "reload"; R = "reload"; - C = "clear"; - U = "unselect"; + "<c-l>" = "redraw"; + + # Change cursor position + G = "bottom"; + H = "high"; + M = "middle"; # (walking) Movement w = { - u = "cd /run/user/${builtins.toString uid}"; - e = "cd /etc"; d = "cd ${downloadDir}"; - t = "cd /tmp"; + e = "cd /etc"; + H = "cd ~"; h = "cd_project_root"; + t = "cd /tmp"; + u = "cd /run/user/${builtins.toString uid}"; }; g = "cd_lf_make_map"; diff --git a/modules/by-name/lf/lf/module.nix b/modules/by-name/lf/lf/module.nix index 0a0e193f..4205771e 100644 --- a/modules/by-name/lf/lf/module.nix +++ b/modules/by-name/lf/lf/module.nix @@ -14,11 +14,24 @@ shell_library, system, lib, + libraries, ... }: let - commands = import ./commands {inherit pkgs sysLib shell_library system;}; + real_commands = import ./commands {inherit pkgs sysLib shell_library system;}; keybindings_raw = import ./keybindings {inherit (cfg.keymaps) uid downloadDir;}; + # NOTE: There is no (easy) way for me to make sure, that the `clearmaps` command is + # generated in the lf config before the keymapping commands. + # This command injection works around that. <2026-07-21> + commands = libraries.extra.warnMerge real_commands { + __clearmaps_injection = '' + :{{ + clearmaps + }}; + clearmaps + ''; + } "lf command map"; + process = prefix: attrs: lib.mapAttrsToList (name: value: if (builtins.isAttrs value) diff --git a/modules/by-name/lu/lutris/module.nix b/modules/by-name/lu/lutris/module.nix index 728322e1..eabc11fb 100644 --- a/modules/by-name/lu/lutris/module.nix +++ b/modules/by-name/lu/lutris/module.nix @@ -11,6 +11,7 @@ lib, config, libraries, + pkgs, ... }: let cfg = config.soispha.programs.lutris; @@ -20,12 +21,34 @@ in { }; config = lib.mkIf cfg.enable { + soispha.impermanence.userDirectories = [ + ".config/lutris" + ]; + soispha.services.unison.pathsToSync = [ + "~/.config/lutris" + ]; + + # TODO: This should also have something, to avoid giving the games network access: 'https://github.com/lutris/docs/blob/master/DisableNetworkAccess.md' <2026-07-10> home-manager.users.soispha = { programs.lutris = { enable = true; - steamPackage = - lib.mkIf config.programs.steam.enable - config.programs.steam.package; + extraPackages = [ + # Show fps and such in game + pkgs.mangohud + + pkgs.winetricks + + # Runs game in it's own compositor (avoids issues with all the resolution stuff) + pkgs.gamescope + + pkgs.gamemode + pkgs.umu-launcher + ]; + steamPackage = lib.mkIf config.programs.steam.enable config.programs.steam.package; + defaultWinePackage = pkgs.proton-ge-bin; + protonPackages = [pkgs.proton-ge-bin]; + + # winePackages = [pkgs.wineWow64Packages.full]; }; }; }; diff --git a/modules/by-name/mp/mpv/module.nix b/modules/by-name/mp/mpv/module.nix index 0610dcd8..496dcd47 100644 --- a/modules/by-name/mp/mpv/module.nix +++ b/modules/by-name/mp/mpv/module.nix @@ -19,38 +19,44 @@ in { enable = lib.mkEnableOption "mpv"; }; - config.home-manager.users.soispha = lib.mkIf cfg.enable { - programs.mpv = { - enable = true; + config = lib.mkIf cfg.enable { + soispha.services.unison.pathsToSync = [ + "~/.local/state/mpv" + ]; - package = pkgs.mpv.override { - mpv-unwrapped = pkgs.mpv-unwrapped.override { - ffmpeg = pkgs.ffmpeg-headless; + home-manager.users.soispha = { + programs.mpv = { + enable = true; + + package = pkgs.mpv.override { + mpv-unwrapped = pkgs.mpv-unwrapped.override { + ffmpeg = pkgs.ffmpeg-headless; + }; }; - }; - bindings = { - q = "quit 0"; - "Ctrl+c" = "quit 1"; - "Shift+q" = "quit-watch-later 1"; - }; + bindings = { + q = "quit 0"; + "Ctrl+c" = "quit 1"; + "Shift+q" = "quit-watch-later 1"; + }; - config = { - osd-bar = true; + config = { + osd-bar = true; - border = false; - }; - scriptOpts = { - osc = { - scalewindowed = 0.8; - hidetimeout = 300; + border = false; }; - thumbfast = { - hwdec = true; - network = false; - spawn_first = false; - max_height = 250; - max_width = 250; + scriptOpts = { + osc = { + scalewindowed = 0.8; + hidetimeout = 300; + }; + thumbfast = { + hwdec = true; + network = false; + spawn_first = false; + max_height = 250; + max_width = 250; + }; }; }; }; diff --git a/modules/by-name/ni/nix-index/command_not_found.fish b/modules/by-name/ni/nix-index/command_not_found.fish new file mode 100644 index 00000000..bbdb2230 --- /dev/null +++ b/modules/by-name/ni/nix-index/command_not_found.fish @@ -0,0 +1,111 @@ +#!/usr/bin/env fish + +# nixos-config - My current NixOS configuration +# +# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de> +# SPDX-License-Identifier: GPL-3.0-or-later +# +# This file is part of my nixos-config. +# +# You should have received a copy of the License along with this program. +# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>. + +# This was taken from the +# `${pkgs.nix-index}/etc/profile.d/command-not-found.sh` file on 2024-02-28 + +function _log + printf $argv >&2 +end + +function _bail + __fish_default_command_not_found_handler $argv + return "$status" +end + +function _common_prefix + set --function prefix + + for str in $argv + set position 1 + for c in (string split '' "$str") + if test -z $prefix[$position] + set prefix[$position] "$c" + else if test $prefix[$position] != "$c" + if test $position = 1 + # The first letter of the prefix mis-matched. + # As such there is no shared prefix, and we can simple bail early. + echo "" + return + else + set prefix $prefix[1..(math $position - 1)] + end + break + end + + set position (math $position + 1) + end + end + + echo "$(string join "" $prefix)" +end + +function fish_command_not_found + # Only run if it's an interactive shell + if not status is-interactive + return (_bail $argv) + end + + # The nixpkgs flake should always be available on NixOS + set --local toplevel nixpkgs + set --local cmd "$argv[1]" + + set --local attrs "$(nix-locate --minimal --no-group --type x --type s --whole-name --at-root "/bin/$cmd")" + + if test -n "$attrs" + set --function len "$(echo "$attrs" | count)" + else + set --function len 0 + end + + switch "$len" + case 0 + case 1 or '*' + _log "The program '%s' is currently not installed.\n" "$cmd" + end + + switch "$len" + case 0 + return (_bail $argv) + case 1 + # If only one package provides this, then we can invoke it + # without asking the user. + + # These will not return 127 if they worked correctly. + + _log "A shell will be opened with it.\n" + + if nix build "$toplevel#$attrs" --no-link + nix shell "$toplevel#$attrs" + return "$status" + else + _log "Failed to build: '%s#%s'\n" "$toplevel" "$attrs" + return (_bail $argv) + end + case '*' + _log "It is provided by several packages. You can run it load it with:\n" + + set --local counter 0 + set --local attrs $(echo $attrs) + for attr in $attrs + _log "%3s)" "$counter" + _log " nix shell %s#%s\n" "$toplevel" "$attr"; + + set counter "$(math "$counter" + 1)" + end + + commandline "nix shell $toplevel#$(_common_prefix $attrs)" + end + + # command not found should always exit with 127 + return 127 +end diff --git a/modules/by-name/ni/nix-index/command_not_found.sh b/modules/by-name/ni/nix-index/command_not_found.zsh index 579f9db4..579f9db4 100644 --- a/modules/by-name/ni/nix-index/command_not_found.sh +++ b/modules/by-name/ni/nix-index/command_not_found.zsh diff --git a/modules/by-name/ni/nix-index/module.nix b/modules/by-name/ni/nix-index/module.nix index 5ddaece3..72be6b52 100644 --- a/modules/by-name/ni/nix-index/module.nix +++ b/modules/by-name/ni/nix-index/module.nix @@ -20,7 +20,11 @@ in { }; config = lib.mkIf cfg.enable { - soispha.programs.zsh.integrations.nix-index = ./command_not_found.sh; + soispha.programs = { + zsh.integrations.nix-index = ./command_not_found.zsh; + fish.integrations.nix-index = ./command_not_found.fish; + }; + home-manager.users.soispha = { imports = [ modules.nix-index-database.homeModules.nix-index diff --git a/modules/by-name/ni/nix/module.nix b/modules/by-name/ni/nix/module.nix index 65b6ed5c..b7e64989 100644 --- a/modules/by-name/ni/nix/module.nix +++ b/modules/by-name/ni/nix/module.nix @@ -19,7 +19,7 @@ externalDependencies, ... }: let - nixpkgs = sources.loadFlake "nixpkgs"; + inherit (sources) nixpkgs; cfg = config.soispha.nix; in { @@ -59,6 +59,9 @@ in { }; settings = { + # Don't warn about dirty git trees (It is usually absolutely useless) + warn-dirty = false; + auto-optimise-store = true; experimental-features = [ "nix-command" diff --git a/modules/by-name/ni/nixos-shell/module.nix b/modules/by-name/ni/nixos-shell/module.nix index 3556a98b..1a0190c8 100644 --- a/modules/by-name/ni/nixos-shell/module.nix +++ b/modules/by-name/ni/nixos-shell/module.nix @@ -15,7 +15,7 @@ ... }: let cfg = config.soispha.nixos-shell; - nixpkgs = sources.loadFlake "nixpkgs"; + inherit (sources) nixpkgs; in { options.soispha.nixos-shell = { enable = lib.mkEnableOption "nixos-shell"; diff --git a/modules/by-name/nv/nvim/module.nix b/modules/by-name/nv/nvim/module.nix index 81d7febf..860610bd 100644 --- a/modules/by-name/nv/nvim/module.nix +++ b/modules/by-name/nv/nvim/module.nix @@ -42,6 +42,10 @@ in { }; config = lib.mkIf cfg.enable { + soispha.services.unison.pathsToSync = [ + "~/.local/state/nvim" + ]; + home-manager.users.soispha = { imports = [ modules.nixvim.homeModules.nixvim diff --git a/modules/by-name/qu/qutebrowser/module.nix b/modules/by-name/qu/qutebrowser/module.nix index 51c1b239..d7689793 100644 --- a/modules/by-name/qu/qutebrowser/module.nix +++ b/modules/by-name/qu/qutebrowser/module.nix @@ -80,7 +80,7 @@ in { config = lib.mkIf cfg.enable { home-manager.users.soispha = { disabledModules = [ - "${sources.sources.home-manager}/modules/programs/qutebrowser.nix" + "${sources.home-manager}/modules/programs/qutebrowser.nix" ]; imports = [ ./module.hm.nix diff --git a/modules/by-name/ri/river/keymap.nix b/modules/by-name/ri/river/keymap.nix index 1d4b8c3e..897d11df 100644 --- a/modules/by-name/ri/river/keymap.nix +++ b/modules/by-name/ri/river/keymap.nix @@ -69,7 +69,7 @@ in { "x" = { "q" = ["exit"]; "l" = mkSpawn pkgs.lock "" {once = true;}; - "h" = mkSpawn' pkgs.procps "pkill" "--signal USR1 i3bar-river" {once = true;}; + "h" = mkSpawn pkgs.systemd-toggle "--user i3bar-river.service" {once = true;}; }; # Media control diff --git a/modules/by-name/ri/river/module.nix b/modules/by-name/ri/river/module.nix index 7eb30014..f9ecea0f 100644 --- a/modules/by-name/ri/river/module.nix +++ b/modules/by-name/ri/river/module.nix @@ -229,7 +229,7 @@ in { home.packages = [ river-start - pkgs.swallow + pkgs.sw ]; xdg.configFile."river/init" = { diff --git a/modules/by-name/ss/ssh/module.nix b/modules/by-name/ss/ssh/module.nix index 87c50728..39c203fd 100644 --- a/modules/by-name/ss/ssh/module.nix +++ b/modules/by-name/ss/ssh/module.nix @@ -55,6 +55,13 @@ in { text = cfg.rootKnownHosts; }) ); + "Host *.your-storagebox.de" = { + # Don't try to authenticate via password for these, because we need to use the + # forced commands, and they are only provided via the ssh key login. + # So password login is a footgun (it is, however, valid to use it for non-root + # use-cases) + PasswordAuthentication = false; + }; }; }; @@ -64,6 +71,11 @@ in { settings = { "Host *" = mkDefaultMatchBlock "${config.home-manager.users.soispha.xdg.dataHome}/ssh/known_hosts"; + "Host *.your-storagebox.de" = { + # Port 22 is for sftp, and when we connect as user, we probably want an + # interactive shell. + Port = 23; + }; }; }; }; diff --git a/modules/by-name/st/starship/module.nix b/modules/by-name/st/starship/module.nix new file mode 100644 index 00000000..9c0ef7ba --- /dev/null +++ b/modules/by-name/st/starship/module.nix @@ -0,0 +1,157 @@ +# nixos-config - My current NixOS configuration +# +# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de> +# SPDX-License-Identifier: GPL-3.0-or-later +# +# This file is part of my nixos-config. +# +# You should have received a copy of the License along with this program. +# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>. +{ + lib, + pkgs, + config, + libraries, + ... +}: let + cfg = config.soispha.programs.starship; +in { + options.soispha.programs.starship = { + enable = libraries.base.options.mkEnable "starship"; + + showBattery = lib.mkOption { + type = lib.types.bool; + default = false; + description = "Whether to show the current battery percentage in the prompt"; + }; + }; + + config.home-manager.users.soispha = lib.mkIf cfg.enable { + programs.starship = { + enable = true; + enableZshIntegration = true; + enableFishIntegration = true; + + settings = { + add_newline = false; + format = lib.concatStrings [ + "$directory" + "$username" + "\${custom.in_nixos_shell}" + "$cmd_duration" + "$status" + "$character" + ]; + + right_format = lib.concatStrings ( + [ + "$git_metrics" + "$git_branch" + "$git_status" + "$git_commit" + "$git_state" + "$time" + ] + ++ lib.optionals cfg.showBattery ["$battery"] + ); + + scan_timeout = 20; + + character = { + # success_symbol = "[❯](bold blue)"; + # a = "⬢"; + success_symbol = "[](bold blue)"; + error_symbol = "[](bold red)"; + }; + + status = { + disabled = false; + format = "([($common_meaning )($status)( $signal_name)]($style) )"; + }; + + time = { + disabled = false; + format = "[\\[$time\\]]($style)"; + }; + + username = { + format = "as [$user]($style) "; + }; + + git_branch = { + format = "[($symbol$branch(:$remote_branch) )]($style)"; + }; + git_status = { + disabled = true; + format = "([\\[$ahead_behind\\]]($style) )"; + ahead = "⇡$count"; + diverged = "⇕⇡$ahead_count⇣$behind_count"; + behind = "⇣$count"; + }; + git_metrics = { + disabled = true; + ignore_submodules = true; + }; + git_state = { + format = "[($state( $progress_current of $progress_total))]($style) "; + rebase = "[rebasing](bold magenta)"; + merge = "[merging](bold yellow)"; + revert = "[reverting](bold blue)"; + cherry_pick = "[picking](bold red)"; + bisect = "[bisecting](bold red)"; + am = "[applying](bold green)"; + am_or_rebase = "[applying/rebasing](bold yellow)"; + }; + git_commit = { + disabled = true; + tag_disabled = false; + tag_symbol = "v"; + format = "[(\\[$tag\\] )]($style)"; + }; + + directory = { + truncate_to_repo = true; + read_only = " "; + before_repo_root_style = "black bold dimmed"; + }; + + cmd_duration = { + min_time = 2000; # Milliseconds + style = "bold white"; + }; + + custom = { + in_nixos_shell = { + symbol = "VM "; + style = "bold white"; + when = ''test "$IN_NIXOS_SHELL" = true''; + shell = ["${lib.getExe pkgs.dash}"]; + description = "Show if a shell is run in a vm"; + }; + }; + + battery = { + # ' ' + # ' ' + # ' ' + # ' ' + # ' ' + display = [ + { + threshold = 10; + style = "bold red"; + } + { + threshold = 30; + style = "bold blue"; + } + { + threshold = 50; + style = "bold green"; + } + ]; + }; + }; + }; + }; +} diff --git a/modules/by-name/st/steam/module.nix b/modules/by-name/st/steam/module.nix index aaa36fd3..f44aa0dd 100644 --- a/modules/by-name/st/steam/module.nix +++ b/modules/by-name/st/steam/module.nix @@ -26,6 +26,11 @@ in { "steam-run" ]; + soispha.services.unison.pathsToIgnore = [ + # That is just to big to be synchronized (# TODO: Work around that <2024-08-31> ) + "~/.local/share/Steam" + ]; + programs.steam = { enable = true; }; diff --git a/modules/by-name/ta/taskwarrior/module.nix b/modules/by-name/ta/taskwarrior/module.nix index d757be90..d499c08e 100644 --- a/modules/by-name/ta/taskwarrior/module.nix +++ b/modules/by-name/ta/taskwarrior/module.nix @@ -110,6 +110,11 @@ in { inherit mkHook; }; + soispha.services.unison.pathsToIgnore = [ + # Already synchronized by TaskChampion sync server + "~/.local/share/task" + ]; + age.secrets.taskwarrior_sync_server_encryption_key = lib.mkIf (cfg.enable && cfg.enableAge) { file = ./secrets/sync_server_encryption_key.age; mode = "700"; diff --git a/modules/by-name/un/unison/module.nix b/modules/by-name/un/unison/module.nix index 8d156b00..8e943304 100644 --- a/modules/by-name/un/unison/module.nix +++ b/modules/by-name/un/unison/module.nix @@ -84,6 +84,17 @@ in { }; config = lib.mkIf cfg.enable { + soispha.services.unison.pathsToIgnore = let + prefix = "/home/soispha/"; + dataDir = + if lib.strings.hasPrefix prefix cfg.dataDir + then "~/${lib.strings.removePrefix prefix cfg.dataDir}" + else builtins.throw "Wrong prefix in unison"; + in [ + # Should not be synchronized + dataDir + ]; + home-manager.users.soispha = { home.sessionVariables = { UNISON = cfg.dataDir; diff --git a/modules/by-name/ve/version/module.nix b/modules/by-name/ve/version/module.nix index fc03b107..d666695d 100644 --- a/modules/by-name/ve/version/module.nix +++ b/modules/by-name/ve/version/module.nix @@ -10,19 +10,19 @@ { config, lib, - self, + sources, ... }: let cfg = config.soispha.version; + + inherit (sources) nixpkgs; in { options.soispha.version = { - enable = lib.mkEnableOption "storing the git revision in /etc/nixos_git_rev"; + enable = lib.mkEnableOption "storing the git revision in /etc/nixpkgs-git-revision"; }; config = lib.mkIf cfg.enable { - environment.etc.nixos_git_rev = { - text = builtins.toString (self.longRev - or self.lastModified - or "unknown"); + environment.etc.nixpkgs-git-revision = { + source = "${nixpkgs}/.git-revision"; }; }; } |
