LINUX.ORG.RU

Переезжаем на Fish

 , ,

Переезжаем на Fish

4

3

Fish — это современный командный интерпретатор, недавно переписанный на Rust, который не требует особой настройки, поддерживая из коробки автодополнение и подсветку синтаксиса. Является лучшим Unix SHELL по версии Slant.

Установка

Установка Fish:

# Arch Linux, Manjaro и тп 
sudo pacman -S fish

# Fedora
sudo dnf install fish

# NixOS
nix-env -i fish

# Ubuntu и остальные Debian-based
sudo add-apt-repository ppa:fish-shell/release-4
sudo apt update
sudo apt install fish

Чтобы сделать fish оболочкой по умолчанию для текущего пользователя:

sudo chsh -s $(which fish) $(whoami)

Прочитайте справку после запуска fish:

help

Fisher — это менеджер плагинов для Fish:

# Из стандартного репозитория Arch
pacman -S fisher

# Вручную
curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source && fisher install jorgebucaran/fisher

Конфигурация Fish

Основная конфигурация хранится в ~/.config/fish/config.fish:

if not status is-interactive
  exit
end

# Эти пути будут добавлены в $PATH единожды
fish_add_path -m ~/bin ~/.local/bin

# Определим переменные XDG
set -q XDG_DATA_HOME || set -U XDG_DATA_HOME $HOME/.local/share
set -q XDG_STATE_HOME || set -U XDG_STATE_HOME $HOME/.local/state
set -q XDG_CONFIG_HOME || set -U XDG_CONFIG_HOME $HOME/.config
set -q XDG_CACHE_HOME || set -U XDG_CACHE_HOME $HOME/.cache

# Различные настройки
# Используем привычные сочетания клавиш
set -U fish_key_bindings fish_default_key_bindings

# Двойное нажатие ESC не работает, если выставить меньше
set -g fish_escape_delay_ms 300

# В Yakuake вывод fetch не очень смотрится
if command -q fastfetch && ! string match -q -- "*yakuake*" (pstree -s -p $fish_pid)
  fastfetch
end

Настроить fish можно через веб-интерфейс:

fish_config

Отличия Fish от Bash и ZSH

Другой синтаксис

  • Нет $$ и прочих $*.
  • Не нужно экранировать переменные.
  • Нет HEREDOC.
  • Он напоминает Ruby с его end для обозначения окончания блока вместо fi, done, esac и тп.
  • Вместо $(command) нужно писать просто (command).
  • Кроме алиасов есть аббревиатуры, которые при вводе заменяются на полную команду.

Существует множество отличий с которыми лучше ознакомиться, прочитав документацию:

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

Fish использует собственный механизм управления переменными окружения, который отличается от bash и zsh. Основные типы переменных:

  • set VAR value — устанавливает переменную VAR только в текущей сессии.
  • set -x VAR value — делает переменную доступной для дочерних процессов (аналог export в bash).
  • set -gx VAR value — глобальная переменная, доступная во всех сессиях fish.
  • set -Ux VAR value — универсальная переменная, которая сохраняется в ~/.config/fish/fish_variables, те эту команду достаточно ввести в терминале один раз.
  • set -e VAR — удаляет переменную.

Пример установки переменных:

set -x PATH /usr/local/bin $PATH  # Добавляем путь в переменную окружения
set -Ux EDITOR vim                # Устанавливаем универсальную переменную

Для модификации $PATH есть функция fish_path_add:

fish_add_path $HOME/bin $HOME/.local/bin

Это аналогично установке универсальных переменных:

set -U fish_user_paths $HOME/bin $HOME/.local/bin

Темы и плагины

Темы можно ставить как через fisher так и Oh my fish.

Oh my fish содержит ряд адаптированных тем из мегапопулярного Oh my zsh, а так же дополнительно позволяет ставить плагины:

По всей видимости, oh my fish сломан и его лучше не использовать

curl -L https://get.oh-my.fish | fish

Поиск тем или пакетов:

omf search [ -t | -p ] name

Список тем:

omf theme

Установка темы:

omf install pure

Смена ее на дефолтную:

omf theme default

Через fisher так же можно ставить темы:

fisher install pure-fish/pure

Работа с плагинами через fisher:

fisher install plugin_name
fisher remove plugin_name
fisher list

Редактирование списка установленных плагинов:

$EDITOR $__fish_config_dir/fish_plugins

Пример плагинов для установки:

Gazorby/fish-abbreviation-tips
PatrickF1/fzf.fish
jethrokuan/z
jorgebucaran/autopair.fish
jorgebucaran/replay.fish
nickeb96/puffer-fish

Популярные плагины, которые можно поставить:

  • Gazorby/fish-abbreviation-tips: показывает подсказки для аббревиатур, помогая запомнить их.

  • PatrickF1/fzf.fish: интеграция fzf для удобного поиска файлов, истории команд и Git-веток.

  • acomagu/fish-async-prompt: асинхронно обновляет промпт. Бажный.

  • franciscolourenco/done: показывает десктопные уведомления о завершении длительных команд.

  • jethrokuan/z: быстрый переход по каталогам с использованием z.

  • jorgebucaran/autopair.fish: автоматическое закрытие скобок.

  • jorgebucaran/replay.fish: позволяет запускать команды Bash (replay ...).

  • joseluisq/gitnow@2.12.0: содержит функции для работы с git.

  • nickeb96/puffer-fish: добавляет привычный многим !! для быстрой подстановки предыдущей команды.

После редактирования списка запускаем обновление плагинов:

fisher update

При установке через fisher install плагины добавляются в тот список в файле, remove — удаляются. Если что-то удалить из него, то при вызове update будут удалены соответствующие плагины.

Ряд плагинов можно поставить через OMF:

omf update  # Обновим Oh my fish
omf install pyenv

Но лучше это делать через fisher:

fisher install oh-my-fish/plugin-<name>

Например:

fisher install oh-my-fish/plugin-pyenv

Прочее

Для работы с буфером обмена есть готовые функции fish_clipboard_copy и fish_clipboard_paste.

Автодополнения генерируются прямо из man-файлов:

fish_update_completions

Алиасы можно сохранять прямо из терминала с помощью флага -s:

# Заменим убогий ls на модный ROR-аналог
alias -s ls "eza --icons"

Добавляем sudo к текущей либо предыдущей команде:

function repeat_with_sudo
    # Получаем текущую команду из командной строки
    set -l cmd (commandline)
    
    # Если команда пустая, берём последнюю команду из истории
    if test -z "$cmd"
        set cmd $history[1]
    end
    
    # Заменяем текущую команду на "sudo <команда>"
    commandline -r "sudo $cmd"
end

funcsave repeat_with_sudo

# Это нужно добавить в конфиг
# Привязка к Alt+S
bind \es 'repeat_with_sudo'

# Готовый плагин для oh my fish
fisher install oh-my-fish/plugin-sudope

Переопределяем command not found:

function fish_command_not_found
  # Вместо этой строки нужно какую-то логику реализовать
  __fish_default_command_not_found_handler $argv[1]
end

funcsave fish_command_not_found

В арче, если установлен pkgfile, то все работает из коробки:

~
❯ python2
python2 may be found in the following packages:
  archlinuxcn/python2 2.7.18-12 /usr/bin/python2

Менеджер сниппетов Pet можно интегрировать с fish через плагин otms61/fish-pet:

fisher install otms61/fish-pet

Добавляем сочетание клавиш:

# Сочетания должны храниться в функции
function fish_user_key_bindings
  bind \cs 'pet-select'
end

# Сохраняем сочетания
funcsave fish_user_key_bindings

# Если сочетания заданы, то отредактируйте ф-ию
funced fish_user_key_bindings

Добавление аббревиатур:

abbr -a vimrc 'vim ~/.vim/vimrc'
abbr > ~/.config/fish/conf.d/abbrs.fish

Аббревиатуры заменяются на полные команды.

Заключение

Fish — простой шеллозаменитель для тех, кому лень заморачиваться с настройкой zsh. Он существует достаточно давно, но его фанатская база не является какой-то огромной, пользователи часто пользуются дефолтом, редко меняя шелл.

Что радует:

  • работает заметно быстрее того же zsh;
  • минимум настроек;
  • чистые конфиги;
  • более дружелюбный синтаксис и предсказуемое поведение с попыткой сохранить совместимость в отличии от какого-нибудь марсианского nushell.

Что огорчает:

  • мало плагинов;
  • странные баги, которые вылечить можно только сносом ~/.config/fish;
  • нестандартный синтаксис не позволяет копипастить команды без использования того же replay + нужно переучиваться.

Вердикт: стоит попробовать.

Полезные ресурсы

Дополнительные плагины и информация:

Полезные статьи про fish:

★★★

Проверено: dataman ()
Последнее исправление: rtxtxtrx (всего исправлений: 30)
Ответ на: комментарий от rtxtxtrx

Что он табличками что-то выводит ничего не значит.

TUI все это дело отображает с помощью псевдографики

тут разве нет противоречия?

https://www.nushell.sh/assets/0_67_header-CCFeUsjF.png

https://www.nushell.sh/assets/0_67_vs_code-BEghWYga.png

https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRB7bonU6scTlbbnVo4bRi6ScW9Y0H8CzNe8g&s

https://www.nushell.sh/assets/0_21_line_chart-Bvz1nclA.png

gagarin0
()

Уже с fish на nushell переезжаем же?

ahdenchik
()
Ответ на: комментарий от monk

Предлагаю исходить из геометрических соображений. CLI — одномерный случай, по стандартному потоку вывода можно перемещаться строго в одном направлении, для каждого символа мы можем сказать, что он правее или левее другого символа на сколько-то позиций. TUI/GUI — двумерный случай, взаимодействие с данными идёт не символ-за-символом, а по координатам. Соответственно, если в качестве координат выступают знакоместа терминала — TUI, если пиксели графического дисплея — GUI.

ugoday ★★★★★
()
Ответ на: комментарий от ugoday

там не из чего исходить:

  • элементы tui, встроенные в нющель не делают из него tui, он так и остается щелью
  • tui используют ncurses или напрямую glibc, запускаются через терминал или эмулятор терминала, имеют типичные графические элементы типа окошечек и прочих рюшечек, реализованные через псевдографику (vim, htop и тп)
  • псевдографика - это буквы, цифры, знаки пунктациии, те текстовые символы, содержащиеся в шрифте

у гагарина какие-то проблемы с логикой. если я могу гавкать как собака, то я псом от этого не становлюсь… беда если он погроммист какой

rtxtxtrx ★★★
() автор топика
Последнее исправление: rtxtxtrx (всего исправлений: 3)
Ответ на: комментарий от rtxtxtrx

Не работал с этим шеллом, так что воздержусь от суждений. Там псевдографикой только вывод команд оформляется или есть более сложные способы взаимодействия? В первом случае, в рамках моего подхода — это чистый CLI.

ugoday ★★★★★
()
Ответ на: комментарий от rtxtxtrx

псевдографика - это символы юникода и тп. значки в nerd fonts и тп

Вот этот зелёный терминал работает только в графическом режиме и полоски рисует как полоски, а не псевдографику.

monk ★★★★★
()
Ответ на: комментарий от ugoday

CLI — одномерный случай, по стандартному потоку вывода можно перемещаться строго в одном направлении,

Не строго. Практически во всех современных CLI есть Readline/LibEdit.

Соответственно, если в качестве координат выступают знакоместа терминала — TUI, если пиксели графического дисплея — GUI.

Опять спорные случаи: Emacs с одной стороны (у которого по текстовым координатам могут быть картинки) и зелёный терминал мейнфрейма (у которого текст по пиксельным координатам) с другой.

monk ★★★★★
()
Ответ на: комментарий от ugoday

если в качестве координат выступают знакоместа терминала — TUI, если пиксели графического дисплея — GUI.

Наверное, лучше критерий устройства ввода. Если для работы нужны стрелки, это TUI, если мышка, то GUI.

monk ★★★★★
()
Ответ на: комментарий от gagarin0

получается что nushell это и shell и TUI одновременно?

Да.

TUI это подвид CLI, работающий через те же интерфейсы ввода-вывода (по крайней мере в этих наших юниксах), использующий особенности терминала и специальные последовательности символов для отрисовки в нём всякого.

А $SHELL это просто интерпретатор, работающий с этим интерфейсами. Не обязательно bash, zsh, fish и прочие *sh - вполне можно использовать python, node, guile и как пользовательский шелл, и для отрисовки TUI.

От реализации программы на её интерпретаторе зависит, является она TUI или CLI. git например ругается, если его в тупом терминале запустить, но всё равно работает, а какой-нибудь mc будет абсолютно неюзабельным.

Твой nushell при запуске в dumb terminal корёжит, то есть у него TUI.

pisemsky
()
Ответ на: комментарий от pisemsky

TUI это подвид CLI,

Тогда в любом TUI должна была бы быть командная строка. Но это, очевидно, не так. Есть TUI, где командной строки нет, например aptitude.

Твой nushell при запуске в dumb terminal корёжит, то есть у него TUI.

Интересный критерий. ls --color тоже уже TUI?

И интерфейс типа adduser или make config я бы отнёс скорее к TUI, чем к CLI, так как команд нет, но требования выбрать из пунктов есть.

monk ★★★★★
()
Ответ на: комментарий от gagarin0

я считаю что наоборот, CLI это частный случай TUI

Иногда даже GUI. Например, AutoCAD.

monk ★★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.