Files
bankrupt/home-manager/modules/fish.nix
T
tomatocream d0047a1c7b misc tweaks: skhd bnpf bindings, neovim/doom/fish fixes
- skhd: remap window nav/move/resize/stack from hjkl to Emacs-style bnpf;
  remap fullscreen/zoom to m, borders to o, prev/next space to [/];
  add super-z to open emacsclient
- neovim: fix catppuccin integration key (neo_tree -> neotree) so init
  loads without the "module not found" traceback
- doom: disable lispy/objed/parinfer modules
- fish: add ~/.bun/bin to PATH

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-25 19:17:22 +08:00

132 lines
7.6 KiB
Nix

# Fish shell configuration - batteries included
# A comprehensive, quality-of-life focused fish setup with useful plugins
{
inputs,
lib,
config,
pkgs,
...
}: {
programs.fish = {
enable = true;
# ═══════════════════════════════════════════════════════════════════════════
# PLUGINS - Curated selection for productivity
# ═══════════════════════════════════════════════════════════════════════════
plugins = with pkgs.fishPlugins; [
# ── Directory Navigation ──────────────────────────────────────────────────
# z: Jump to frequently used directories (like autojump/zoxide but pure fish)
{ name = "z"; src = z.src; }
# fish-bd: Quickly go back to a parent directory in your working tree
{ name = "fish-bd"; src = fish-bd.src; }
# ── Prompt ────────────────────────────────────────────────────────────────
# tide: Modern, extensible prompt
{ name = "tide"; src = tide.src; }
# ── Fuzzy Finding ─────────────────────────────────────────────────────────
# fzf-fish: Superior fzf integration - Ctrl+R history, Ctrl+Alt+F files, Ctrl+V vars
{ name = "fzf.fish"; src = fzf-fish.src; }
# fifc: Fzf powers on top of fish completion engine with customizable rules
{ name = "fifc"; src = fifc.src; }
# ── Git Integration ───────────────────────────────────────────────────────
# forgit: Interactive git with fzf (ga, glo, gi, gd, grh, gcf, gss, gclean)
{ name = "forgit"; src = forgit.src; }
# plugin-git: Git aliases and status helpers (similar to oh-my-zsh git)
{ name = "plugin-git"; src = plugin-git.src; }
# ── Quality of Life ───────────────────────────────────────────────────────
# autopair: Auto-insert matching brackets, quotes, etc.
{ name = "autopair"; src = autopair.src; }
# done: Notifications when long-running commands complete
{ name = "done"; src = done.src; }
# sponge: Remove failed commands and typos from history automatically
{ name = "sponge"; src = sponge.src; }
# puffer: Text expansions (!! for last command, !$ for last argument)
{ name = "puffer"; src = puffer.src; }
# fish-you-should-use: Reminds you to use your aliases
{ name = "fish-you-should-use"; src = fish-you-should-use.src; }
# ── Shell Compatibility ───────────────────────────────────────────────────
# bass: Run bash scripts and capture environment changes
{ name = "bass"; src = bass.src; }
# foreign-env: Source files from other shells (bash, zsh env files)
{ name = "foreign-env"; src = foreign-env.src; }
# plugin-sudope: Quickly put 'sudo' in your command
{ name = "plugin-sudope"; src = plugin-sudope.src; }
# ── Utility ───────────────────────────────────────────────────────────────
# grc: Colorize output of common commands (ping, traceroute, make, etc.)
{ name = "grc"; src = grc.src; }
# colored-man-pages: Colorize man pages for better readability
{ name = "colored-man-pages"; src = colored-man-pages.src; }
# spark: Sparklines for Fish
{ name = "spark"; src = spark.src; }
# humantime-fish: Turn milliseconds into a human-readable string
{ name = "humantime-fish"; src = humantime-fish.src; }
] ++ lib.optionals pkgs.stdenv.isDarwin [
# ── Platform-Specific (macOS) ─────────────────────────────────────────────
# macos: MacOS functions for Fish
{ name = "macos"; src = macos.src; }
];
# ═══════════════════════════════════════════════════════════════════════════
# INTERACTIVE SHELL INITIALIZATION
# ═══════════════════════════════════════════════════════════════════════════
interactiveShellInit = ''
# Set up fzf.fish key bindings (Ctrl+R history, Ctrl+Alt+F files, etc.)
fzf_configure_bindings
echo "🐟 "(set_color cyan)(whoami)(set_color normal)" @ "(set_color yellow)(hostname -s)(set_color normal)" in "(set_color green)(prompt_pwd)(set_color normal)
'';
# ═══════════════════════════════════════════════════════════════════════════
# SHELL INIT (runs for all shells, including non-interactive)
# ═══════════════════════════════════════════════════════════════════════════
shellInit = ''
# Ensure locale is set properly for UTF-8
if test -z "$LANG"
set -gx LANG en_US.UTF-8
end
if test -z "$LC_ALL"
set -gx LC_ALL en_US.UTF-8
end
# Bun global bin directory
fish_add_path -g $HOME/.bun/bin
'';
# ═══════════════════════════════════════════════════════════════════════════
# LOGIN SHELL INIT
# ═══════════════════════════════════════════════════════════════════════════
loginShellInit = ''
# Add any login-specific initialization here
# This runs only for login shells
'';
};
# ═════════════════════════════════════════════════════════════════════════════
# ADDITIONAL PACKAGES needed for fish plugins and functions
# ═════════════════════════════════════════════════════════════════════════════
home.packages = with pkgs; [
grc # Generic colorizer (for grc plugin)
libnotify # For done plugin notifications (Linux)
] ++ lib.optionals pkgs.stdenv.isDarwin [
terminal-notifier # For done plugin notifications (macOS)
];
}