From 4fc62680d4390cab0d2806dfb13e4c727e36421e Mon Sep 17 00:00:00 2001 From: Xevion Date: Tue, 30 Dec 2025 17:11:10 -0600 Subject: [PATCH] docs: add comprehensive Fish shell keybindings reference --- docs/keybinds/fish.md | 263 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 263 insertions(+) create mode 100644 docs/keybinds/fish.md diff --git a/docs/keybinds/fish.md b/docs/keybinds/fish.md new file mode 100644 index 0000000..e97924a --- /dev/null +++ b/docs/keybinds/fish.md @@ -0,0 +1,263 @@ +# Fish Shell Keybindings + +Complete reference for Fish shell keybindings, including built-in defaults, plugins, and custom configurations. + +## Custom Bindings + +Personal keybindings configured in this dotfiles repository. + +| Keybinding | Action | Source | +|------------|--------|--------| +| Alt+a | `fzf_search_abbr` | `config.fish` - Search abbreviations/aliases with fzf | + +## Quick Reference + +### Most Useful "Hidden" Bindings + +These are the bindings most users don't know about: + +| Keybinding | What it does | +|------------|--------------| +| Alt+s | Toggle `sudo` prefix | +| Alt+. | Repeat last argument from previous command | +| Alt+e | Edit long commands in your editor | +| Alt+o | Preview file under cursor | +| Alt+l | Quick `ls` of path under cursor | +| Alt+w | `whatis` for command under cursor | +| Alt+p | Pipe output through pager automatically | +| Alt+# | Comment out command (save to history without running) | +| Alt+Up/Down | Search history for current token | +| F1 | Instant man page for current command | +| Ctrl+x / Ctrl+v | Native clipboard integration | +| Shift+Delete | Delete current history entry | + +### Emacs-Style Navigation Cheatsheet + +``` +Ctrl+a ─────────────────────────────────────────────────── Ctrl+e + │ │ + └─ Ctrl+b ◄─── cursor ───► Ctrl+f ────────────────┘ + │ + Ctrl+Left/Right (by word) + Shift+Left/Right (by WORD) +``` + +### Kill Ring + +Fish maintains a "kill ring" of deleted text: + +1. `Ctrl+k` / `Ctrl+u` / `Alt+d` - Kill (cut) text +2. `Ctrl+y` - Yank (paste) most recent kill +3. `Alt+y` - Cycle through previous kills + +## Plugin Bindings + +Keybindings added by Fish plugins (Fisher). + +### Atuin (History) + +| Keybinding | Action | Description | +|------------|--------|-------------| +| Ctrl+r | `_atuin_search` | Search shell history (replaces built-in `history-pager`) | + +### fzf.fish (PatrickF1/fzf.fish) + +| Keybinding | Action | Description | +|------------|--------|-------------| +| Ctrl+Alt+f | `fzf_search_directory` | Search files in current directory | +| Ctrl+Alt+l | `fzf_search_git_log` | Search git log | +| Ctrl+Alt+s | `fzf_search_git_status` | Search git status | +| Ctrl+Alt+p | `fzf_search_processes` | Search running processes | +| Alt+Ctrl+v | `fzf_search_variables` | Search shell variables (remapped from Ctrl+v) | + +> Note: `Ctrl+r` (history) is disabled in fzf.fish config to let Atuin handle it. + +## Built-in Bindings + +Default Fish shell keybindings (emacs mode). + +### Execution & Completion + +| Keybinding | Action | Description | +|------------|--------|-------------| +| Enter | `execute` | Execute current command | +| Ctrl+j | `execute` | Execute current command | +| Ctrl+m | `execute` | Execute current command | +| Ctrl+Enter | `execute` | Execute current command (prevents mistypes) | +| Tab | `complete` | Autocomplete | +| Ctrl+i | `complete` | Autocomplete (same as Tab) | +| Shift+Tab | `complete-and-search` | Complete and open search pager | +| Ctrl+s | `pager-toggle-search` | Toggle search in completion pager | + +### Navigation (Line) + +| Keybinding | Action | Description | +|------------|--------|-------------| +| Ctrl+a | `beginning-of-line` | Jump to start of line | +| Ctrl+e | `end-of-line` | Jump to end of line | +| Home | `beginning-of-line` | Jump to start of line | +| End | `end-of-line` | Jump to end of line | +| Ctrl+f | `forward-char` | Move right one character | +| Ctrl+b | `backward-char` | Move left one character | +| Right | `forward-char` | Move right one character | +| Left | `backward-char` | Move left one character | + +### Navigation (Word) + +| Keybinding | Action | Description | +|------------|--------|-------------| +| Ctrl+Right | `forward-word` | Jump forward one word | +| Ctrl+Left | `backward-word` | Jump backward one word | +| Shift+Right | `forward-bigword` | Jump forward one WORD (whitespace-delimited) | +| Shift+Left | `backward-bigword` | Jump backward one WORD | +| Alt+f | `nextd-or-forward-token` | Next directory OR forward token | +| Alt+b | `prevd-or-backward-word` | Previous directory OR backward word | +| Alt+Right | `nextd-or-forward-token` | Next directory OR forward token | +| Alt+Left | `prevd-or-backward-token` | Previous directory OR backward token | + +### Navigation (Buffer) + +| Keybinding | Action | Description | +|------------|--------|-------------| +| Alt+< | `beginning-of-buffer` | Jump to start of buffer | +| Alt+> | `end-of-buffer` | Jump to end of buffer | + +### Text Editing (Delete) + +| Keybinding | Action | Description | +|------------|--------|-------------| +| Backspace | `backward-delete-char` | Delete character before cursor | +| Shift+Backspace | `backward-delete-char` | Delete character before cursor | +| Ctrl+h | `backward-delete-char` | Delete character before cursor | +| Delete | `delete-char` | Delete character at cursor | +| Ctrl+d | `delete-or-exit` | Delete character or exit if line empty | +| Ctrl+w | `backward-kill-path-component` | Delete previous path component | +| Ctrl+u | `backward-kill-line` | Delete from cursor to start of line | +| Ctrl+k | `kill-line` | Delete from cursor to end of line | +| Alt+Backspace | `backward-kill-token` | Delete previous token | +| Ctrl+Alt+h | `backward-kill-token` | Delete previous token | +| Ctrl+Backspace | `backward-kill-word` | Delete previous word | +| Alt+Delete | `kill-token` | Delete token ahead | +| Ctrl+Delete | `kill-word` | Delete word ahead | +| Alt+d | `kill-word` / `dirh` | Delete word ahead OR show directory history if empty | + +### Text Editing (Transform) + +| Keybinding | Action | Description | +|------------|--------|-------------| +| Ctrl+t | `transpose-chars` | Swap current and previous characters | +| Alt+t | `transpose-words` | Swap current and previous words | +| Alt+u | `upcase-word` | UPPERCASE the current word | +| Alt+c | `capitalize-word` | Capitalize the current word | + +### Undo & Redo + +| Keybinding | Action | Description | +|------------|--------|-------------| +| Ctrl+z | `undo` | Undo last edit | +| Ctrl+/ | `undo` | Undo last edit | +| Ctrl+_ | `undo` | Undo last edit (XTerm) | +| Ctrl+Shift+z | `redo` | Redo last undone edit | +| Alt+/ | `redo` | Redo last undone edit | + +### Clipboard & Yank + +| Keybinding | Action | Description | +|------------|--------|-------------| +| Ctrl+x | `fish_clipboard_copy` | Copy commandline to system clipboard | +| Ctrl+v | `fish_clipboard_paste` | Paste from system clipboard | +| Ctrl+y | `yank` | Yank (paste) last killed text | +| Alt+y | `yank-pop` | Cycle through kill ring | + +### History Navigation + +| Keybinding | Action | Description | +|------------|--------|-------------| +| Up | `up-or-search` | Previous history / prefix search | +| Down | `down-or-search` | Next history / prefix search | +| Ctrl+p | `up-or-search` | Previous history / prefix search | +| Ctrl+n | `down-or-search` | Next history / prefix search | +| PageUp | `beginning-of-history` | Jump to oldest history entry | +| PageDown | `end-of-history` | Jump to newest history entry | +| Shift+Delete | `history-delete` | Delete current history entry | + +### History Token Search + +| Keybinding | Action | Description | +|------------|--------|-------------| +| Alt+Up | `history-token-search-backward` | Search history for token under cursor (backward) | +| Alt+Down | `history-token-search-forward` | Search history for token under cursor (forward) | +| Alt+. | `history-token-search-backward` | Insert last argument from previous command | + +### Special Functions + +| Keybinding | Action | Description | +|------------|--------|-------------| +| Alt+s | `fish_commandline_prepend sudo` | Toggle `sudo` prefix on current line | +| Alt+e | `edit_command_buffer` | Open command in `$EDITOR` | +| Alt+v | `edit_command_buffer` | Open command in `$EDITOR` | +| Alt+p | `__fish_paginate` | Pipe command output through pager | +| Alt+# | `__fish_toggle_comment_commandline` | Toggle `#` comment on line | +| Alt+l | `__fish_list_current_token` | List/expand current token (like `ls` on path) | +| Alt+o | `__fish_preview_current_file` | Preview file under cursor | +| Alt+w | `__fish_whatis_current_token` | Show `whatis` for command under cursor | +| F1 | `__fish_man_page` | Open man page for current command | +| Alt+h | `__fish_man_page` | Open man page for current command | + +### Line Control + +| Keybinding | Action | Description | +|------------|--------|-------------| +| Ctrl+l | `clear-screen` | Clear screen (with scrollback push if supported) | +| Ctrl+c | `clear-commandline` | Clear current command line | +| Ctrl+g | `cancel` | Cancel current operation | +| Escape | `cancel` | Cancel / exit mode | +| Ctrl+[ | `cancel` | Cancel (escape sequence) | + +### Text Insertion + +| Keybinding | Action | Description | +|------------|--------|-------------| +| Space | `self-insert expand-abbr` | Insert space and expand abbreviations | +| ; | `self-insert expand-abbr` | Insert semicolon and expand abbreviations | +| \| | `self-insert expand-abbr` | Insert pipe and expand abbreviations | +| & | `self-insert expand-abbr` | Insert ampersand and expand abbreviations | +| > | `self-insert expand-abbr` | Insert redirect and expand abbreviations | +| < | `self-insert expand-abbr` | Insert redirect and expand abbreviations | +| ) | `self-insert expand-abbr` | Insert paren and expand abbreviations | +| Shift+Enter | `commandline -i \n` | Insert newline without executing | +| Alt+Enter | `commandline -i \n` | Insert newline without executing | +| Ctrl+Space | Insert literal space | Insert space without expanding abbreviations | +| Shift+Space | `self-insert expand-abbr` | Insert space (same as Space) | + +## Configuration + +Keybindings are configured in: + +- **Built-in**: `fish_default_key_bindings` function (emacs mode) +- **Custom**: `~/.config/fish/config.fish` (this repo: `home/dot_config/fish/config.fish.tmpl`) +- **Plugins**: Managed via Fisher, configured in `config.fish` + +### Checking Current Bindings + +```fish +# List all bindings +bind + +# List preset (built-in) bindings +bind --preset + +# List user-defined bindings +bind --user + +# Show what a specific key does +bind \ea # Shows Alt+a binding +``` + +### Adding Custom Bindings + +```fish +# In config.fish +bind \ek 'echo "Hello"' # Alt+k +bind -M insert \ek 'echo "Hello"' # Also bind in insert mode (vi) +```