docs: add comprehensive Fish shell keybindings reference

This commit is contained in:
2025-12-30 17:11:10 -06:00
parent 1b611f4559
commit 4fc62680d4
+263
View File
@@ -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)
```