---
tags: [tooling, cheatsheet]
verified: 2026-09-02
---

# Fish Shell — справка

Справка по fish shell с учётом конфигурации CachyOS (cachyos-config.fish). Текст выверялся на fish 4.5.0 (февраль 2026); апстрим с тех пор ушёл к 4.8.x, так что при расхождениях стоит сверяться с `fish --version` и релиз-нотами своей сборки.

---

## Архитектура конфигурации

Fish загружает конфиги в определённом порядке, и это критично для понимания, почему одни настройки перезатираются другими.

Порядок загрузки:

1. `~/.config/fish/conf.d/*.fish` — фрагменты конфигурации (алфавитный порядок)
2. `~/.config/fish/config.fish` — основной пользовательский конфиг
3. Внутри `config.fish` выполняется `source /usr/share/cachyos-fish-config/cachyos-config.fish` — конфиг дистрибутива

Autoload-функции из `~/.config/fish/functions/` загружаются лениво при первом вызове, но **sourced-определения из config.fish перезатирают autoload-функции с тем же именем**. Поэтому если CachyOS определяет `function history` в своём конфиге, твой `functions/history.fish` не будет работать — переопределять нужно в `config.fish` после строки `source`.

---

## Навигация по истории

### Интерактивный поиск: `Ctrl+R`

Основной способ работы с историей в fish. Открывает fuzzy-поиск по всей истории команд. Начинаешь вводить фрагмент — fish фильтрует в реальном времени. Enter выполняет, Tab вставляет в строку для редактирования.

### `!!` и `!$` (эмуляция bash)

В конфиге CachyOS определены keybindings для `!` и `$`, которые эмулируют bash-поведение:

- `!!` — подставляет **предыдущую команду целиком**. Работает только интерактивно, при наборе в командной строке. Типичный сценарий: `sudo !!`.
- `!$` — подставляет **последний аргумент** предыдущей команды. Например, после `cat /etc/pacman.conf` ввод `nvim !$` подставит путь.

Важно: это не bash-синтаксис `!42` для запуска команды по номеру. В fish такого механизма нет нативно.

### Команда `history`

CachyOS переопределяет `history` так, что она всегда выводит timestamps в формате `%F %T`. Вывод идёт от новых к старым (поведение fish по умолчанию). Номера команд не отображаются.

Полезные варианты вызова:

```fish
history search --prefix "git"       # поиск по префиксу
history search --contains "docker"  # поиск по подстроке
history delete --prefix "secret"    # удалить команды по префиксу
history clear-session               # очистить историю текущей сессии
```

### Навигация стрелками

`↑`/`↓` — перемещение по истории (как в bash). Но если начать вводить текст и нажать `↑`, fish отфильтрует историю по введённому префиксу — это часто удобнее `Ctrl+R` для коротких запросов.

---

## Алиасы и утилиты из конфига

### Файловая система

`ls`, `la`, `ll`, `lt` — всё работает через `eza` (замена `ls` с иконками, git-статусами и цветами). `l.` — показывает только dotfiles.

```text
ls   → eza -al --color=always --group-directories-first --icons
la   → eza -a  (без long format)
ll   → eza -l  (long format без hidden)
lt   → eza -aT (дерево)
```

`..` через `......` — быстрая навигация вверх по директориям (от 1 до 5 уровней).

### Pacman / система

```text
update    → sudo pacman -Syu
cleanup   → sudo pacman -Rns (pacman -Qtdq)    # удаление orphan-пакетов
fixpacman → sudo rm /var/lib/pacman/db.lck      # разблокировка pacman
mirror    → sudo cachyos-rate-mirrors           # обновление зеркал
big       → список установленных пакетов по размеру
gitpkg    → количество -git пакетов
rip       → 200 последних установленных пакетов с датами
```

### Архивы

```text
tarnow <имя> <файлы>  → tar -acf (автоопределение формата по расширению)
untar <архив>          → tar -zxvf
```

### Диагностика

```text
hw      → hwinfo --short
jctl    → journalctl -p 3 -xb (только ошибки текущей загрузки)
psmem   → процессы отсортированные по RAM
psmem10 → топ-10 по RAM
```

### Утилиты

```fish
backup myfile.txt          # создаёт myfile.txt.bak
copy dir1 dir2             # cp -r с автоопределением директорий
tb                         # nc termbin.com 9999 — быстрый pastebin из pipe
```

---

## Man pages

Конфиг настраивает рендеринг man-страниц через `bat` с подсветкой синтаксиса:

```fish
set -x MANPAGER "sh -c 'col -bx | bat -l man -p'"
```

Это означает, что `man` будет показывать страницы с цветовой подсветкой вместо стандартного less.

---

## Уведомления о завершении команд

Плагин `done.fish` отслеживает длительные команды и показывает desktop-уведомление, когда команда, выполнявшаяся дольше 10 секунд (`__done_min_cmd_duration`), завершается. Уровень urgency — low, чтобы не отвлекать.

---

## LF — файловый менеджер

Привязка `Ctrl+O` запускает `lf` (терминальный файловый менеджер) с автоматическим `cd` в выбранную директорию при выходе. Конфигурация загружается из `~/.config/lf/lfcd.fish`.

---

## Полезные встроенные возможности fish

### Автодополнение

Fish автодополняет команды, пути, аргументы и даже man-страницы из коробки. Подсказка отображается серым — Tab принимает целиком, `→` принимает посимвольно, `Alt+→` принимает пословно.

### Abbreviations vs aliases

В конфиге используются `alias`, но fish также поддерживает `abbr` — аббревиатуры, которые раскрываются при нажатии Space/Enter. Преимущество `abbr`: видишь полную команду перед выполнением, она попадает в историю в развёрнутом виде. Для критичных команд (типа `cleanup`) это безопаснее.

```fish
abbr -a update 'sudo pacman -Syu'
```

### Переменные окружения

В fish вместо `export VAR=value` используется `set -x VAR value`. Для персистентных переменных — `set -Ux VAR value` (universal, сохраняется между сессиями). В конфиге `__done_min_cmd_duration` и `__done_notification_urgency_level` установлены через `set -U`, поэтому достаточно выполнить их один раз.

### PATH

Добавление в PATH: `fish_add_path ~/bin` (идемпотентно, не дублирует). В конфиге также используется `set -p PATH` для prepend с ручной проверкой на дубликаты — `fish_add_path` делает это автоматически и предпочтительнее.

---

## Структура конфигурации

```text
~/.config/fish/
├── config.fish                  # основной конфиг (sourced при запуске)
├── conf.d/                      # фрагменты (sourced до config.fish)
├── functions/                   # autoload-функции (одна функция = один файл)
│   └── имя_функции.fish         # файл должен совпадать с именем функции
└── completions/                 # пользовательские автодополнения
```

Системные конфиги CachyOS: `/usr/share/cachyos-fish-config/`.

---

## Частые операции

### Создание персистентной функции

```fish
function greet
    echo "Hello, $argv"
end
funcsave greet    # сохранит в ~/.config/fish/functions/greet.fish
```

### Проверка, откуда загружена команда

```fish
type -a history    # покажет все определения: функции, builtins, внешние команды
functions history  # покажет тело функции
```

### Перезагрузка конфига без перезапуска

```fish
source ~/.config/fish/config.fish
```

Для функций из `functions/` перезагрузка не нужна — autoload подхватит изменения при следующем вызове.

---

## Связанные заметки

- [tmux cheatsheet](./tmux-cheatsheet.md) — мультиплексор, в котором обычно живёт эта оболочка
- [Kitty terminal guide](./kitty-guide.md) — терминал, запускающий fish
- [Neovim: рабочая справка](./nvim-cheatsheet.md) — редактор из того же рабочего набора
- [CLI-инструменты поиска: ripgrep, fd, fzf, jq](./cli-search-toolkit.md) — утилиты, чьи биндинги и переменные окружения живут в конфиге оболочки
- [Домашний десктоп на CachyOS](./setups/cachyos-desktop/hyprland-desktop.md) — машина, на которой fish стоит оболочкой по умолчанию
