aboutsummaryrefslogtreecommitdiffstats
path: root/modules/by-name
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--modules/by-name/at/atuin/module.nix7
-rw-r--r--modules/by-name/au/ausweisapp/module.nix3
-rw-r--r--modules/by-name/ba/backup/env.vars1
-rw-r--r--modules/by-name/ba/backup/module.nix28
-rw-r--r--modules/by-name/bo/boot/module.nix51
-rw-r--r--modules/by-name/ca/calibre/module.nix38
-rw-r--r--modules/by-name/cl/cleanup/module.nix2
-rwxr-xr-xmodules/by-name/di/direnv/landrun-fish.sh30
-rw-r--r--modules/by-name/di/direnv/module.nix84
-rwxr-xr-xmodules/by-name/di/direnv/pre-cache.sh89
-rw-r--r--modules/by-name/fi/fish/config/01_show-task.fish14
-rw-r--r--modules/by-name/fi/fish/config/keybindings/00__start.fish1
-rw-r--r--modules/by-name/fi/fish/config/keybindings/01_insert.fish85
-rw-r--r--modules/by-name/fi/fish/config/keybindings/02_command.fish178
-rw-r--r--modules/by-name/fi/fish/config/keybindings/03_visual.fish94
-rw-r--r--modules/by-name/fi/fish/config/keybindings/04_replace.fish9
-rw-r--r--modules/by-name/fi/fish/config/keybindings/05_operator.fish33
-rw-r--r--modules/by-name/fi/fish/config/keybindings/06_replace_one.fish7
-rw-r--r--modules/by-name/fi/fish/config/keybindings/07_others.fish9
-rw-r--r--modules/by-name/fi/fish/config/keybindings/08__end.fish1
-rw-r--r--modules/by-name/fi/fish/module.nix76
-rw-r--r--modules/by-name/fo/foot/module.nix13
-rw-r--r--modules/by-name/gi/git/git_ignore.git3
-rw-r--r--modules/by-name/gp/gpg/module.nix60
-rw-r--r--modules/by-name/gt/gtk/module.nix82
-rw-r--r--modules/by-name/i3/i3bar-river/module.nix2
-rw-r--r--modules/by-name/lf/lf/commands/default.nix3
-rwxr-xr-xmodules/by-name/lf/lf/commands/scripts/trash_restore.sh6
-rw-r--r--modules/by-name/lf/lf/keybindings/default.nix103
-rw-r--r--modules/by-name/lf/lf/module.nix15
-rw-r--r--modules/by-name/lu/lutris/module.nix29
-rw-r--r--modules/by-name/mp/mpv/module.nix58
-rw-r--r--modules/by-name/ni/nix-index/command_not_found.fish111
-rw-r--r--modules/by-name/ni/nix-index/command_not_found.zsh (renamed from modules/by-name/ni/nix-index/command_not_found.sh)0
-rw-r--r--modules/by-name/ni/nix-index/module.nix6
-rw-r--r--modules/by-name/ni/nix/module.nix5
-rw-r--r--modules/by-name/ni/nixos-shell/module.nix2
-rw-r--r--modules/by-name/nv/nvim/module.nix4
-rw-r--r--modules/by-name/qu/qutebrowser/module.nix2
-rw-r--r--modules/by-name/ri/river/keymap.nix2
-rw-r--r--modules/by-name/ri/river/module.nix2
-rw-r--r--modules/by-name/ss/ssh/module.nix12
-rw-r--r--modules/by-name/st/starship/module.nix157
-rw-r--r--modules/by-name/st/steam/module.nix5
-rw-r--r--modules/by-name/ta/taskwarrior/module.nix5
-rw-r--r--modules/by-name/un/unison/module.nix11
-rw-r--r--modules/by-name/ve/version/module.nix12
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";
};
};
}