Создание собственных завершений
Для указания завершения используйте команду complete. complete принимает в качестве параметра имя команды, для которой необходимо указать завершение. Например, чтобы добавить завершение для программы myprog, нужно начать команду завершения с complete -c myprog ...
Для предоставления списка возможных завершений для myprog используйте переключатель -a. Если myprog принимает аргументы start и stop, это можно указать как complete -c myprog -a 'start stop'. Аргумент переключателя -a всегда представляет собой строку. Во время завершения она будет разбита на токены пробелами и табуляцией, и произойдёт расширение переменных, подстановка команд и другие формы параметрического расширения.
fish имеет специальный синтаксис для поддержки указания переключателей, принимаемых командой. Переключатели -s, -l и -o используются для указания короткого переключателя (один символ, например, -l), переключателя в стиле GNU (например, --color) и переключателя старого стиля (например, -shuffle) соответственно. Если у команды «myprog» есть опция «-o», которую также можно записать как --output, и которая может принимать дополнительное значение «yes» или «no», это можно указать, написав:
complete -c myprog -s o -l output -a "yes no"
В полном вызове выше, аргументы -a применяются, когда опция -o/--output была задана, поэтому они предлагаются для:
> myprog -o<TAB> > myprog --output=<TAB>
По умолчанию, аргументы опций являются необязательными, поэтому кандидаты предлагаются только непосредственно присоединёнными, поэтому в данном случае они не предлагаются:
> myprog -o <TAB>
Обычно опции требуют параметр, поэтому вы бы дали --require-parameter / -r:
complete -c myprog -s o -l output -ra "yes no"
что предлагает yes/no в этих случаях:
> myprog -o<TAB> > myprog --output=<TAB> > myprog -o <TAB> > myprog --output <TAB>
В последних двух случаях файлы также будут предложены, потому что завершение файлов включено по умолчанию.
Вы можете либо отключить завершение файлов для отдельной опции:
complete -c myprog -s o -l output --no-files -ra "yes no"
или со специфическим условием:
complete -c myprog -f --condition '__fish_seen_subcommand_from somesubcommand'
или вы можете отключить завершение файлов глобально для команды:
complete -c myprog -f
Если вы отключили их глобально, вы можете включить их только для определенного условия или опции с помощью опции --force-files / -F:
# Disable files by default complete -c myprog -f # but reenable them for --config-file complete -c myprog -l config-file --force-files -r
В полном вызове выше, аргументы -a применяются, когда опция -o/--output была задана, поэтому они предлагаются для:
> myprog -o<TAB> > myprog --output=<TAB>
По умолчанию, аргументы опций являются необязательными, поэтому кандидаты предлагаются только непосредственно присоединёнными, поэтому в данном случае они не предлагаются:
> myprog -o <TAB>
Обычно опции требуют параметр, поэтому вы бы дали --require-parameter / -r:
complete -c myprog -s o -l output -ra "yes no"
что предлагает yes/no в этих случаях:
> myprog -o<TAB> > myprog --output=<TAB> > myprog -o <TAB> > myprog --output <TAB>
В последних двух случаях файлы также будут предложены, потому что завершение файлов включено по умолчанию.
Вы можете либо отключить завершение файлов для отдельной опции:
complete -c myprog -s o -l output --no-files -ra "yes no"
или со специфическим условием:
complete -c myprog -f --condition '__fish_seen_subcommand_from somesubcommand'
или вы можете отключить завершение файлов глобально для команды:
complete -c myprog -f
Если вы отключили их глобально, вы можете включить их только для определенного условия или опции с помощью опции --force-files / -F:
# Disable files by default complete -c myprog -f # but reenable them for --config-file complete -c myprog -l config-file --force-files -r
В качестве более подробного примера, вот комментированный фрагмент завершений для systemd’s timedatectl:
# All subcommands that timedatectl knows - this is useful for later.
set -l commands status set-time set-timezone list-timezones set-local-rtc set-ntp
# Disable file completions for the entire command
# because it does not take files anywhere
# Note that this can be undone by using "-F".
#
# File completions also need to be disabled
# if you want to have more control over what files are offered
# (e.g. just directories, or just files ending in ".mp3").
complete -c timedatectl -f
# This line offers the subcommands
# -"status",
# -"set-timezone",
# -"set-time"
# -"list-timezones"
# if no subcommand has been given so far.
#
# The `-n`/`--condition` option takes script as a string, which it executes.
# If it returns true, the completion is offered.
# Here the condition is the `__fish_seen_subcommands_from` helper function.
# If returns true if any of the given commands is used on the commandline,
# as determined by a simple heuristic.
# For more complex uses, you can write your own function.
# See e.g. the git completions for an example.
#
complete -c timedatectl -n "not __fish_seen_subcommand_from $commands" \
-a "status set-time set-timezone list-timezones"
# If the "set-timezone" subcommand is used,
# offer the output of `timedatectl list-timezones` as completions.
# Each line of output is used as a separate candidate,
# and anything after a tab is taken as the description.
# It's often useful to transform command output with `string` into that form.
complete -c timedatectl -n "__fish_seen_subcommand_from set-timezone" \
-a "(timedatectl list-timezones)"
# Completion candidates can also be described via `-d`,
# which is useful if the description is constant.
# Try to keep these short, because that means the user gets to see more at once.
complete -c timedatectl -n "not __fish_seen_subcommand_from $commands" \
-a "set-local-rtc" -d "Maintain RTC in local time"
# We can also limit options to certain subcommands by using conditions.
complete -c timedatectl -n "__fish_seen_subcommand_from set-local-rtc" \
-l adjust-system-clock -d 'Synchronize system clock from the RTC'
# These are simple options that can be used everywhere.
complete -c timedatectl -s h -l help -d 'Print a short help text and exit'
complete -c timedatectl -l version -d 'Print a short version string and exit'
complete -c timedatectl -l no-pager -d 'Do not pipe output into a pager'
Для примеров написания собственных сложных завершений, изучите завершения в /usr/share/fish/completions. (Точный путь зависит от выбранного префикса установки и может незначительно отличаться).
Полезные функции для написания завершений
fish поставляется с несколькими функциями, которые могут быть полезны при написании завершений для конкретных команд. Большинство из этих функций начинаются со строки __fish_. Такие функции являются внутренними для fish и их имя и интерфейс могут измениться в будущих версиях Fish. Несколько из этих функций описаны здесь.
Функции, начинающиеся со строки __fish_print_, выводят список строк, разделённых новой строкой. Например, __fish_print_filesystems выводит список всех известных файловых систем. Функции, начинающиеся со строки __fish_complete_, выводят список завершений с описаниями, разделённых знаком табуляции.
-
__fish_complete_directories STRING DESCRIPTIONвыполняет завершение путей для STRING, разрешая только каталоги и предоставляя им описание DESCRIPTION. -
__fish_complete_path STRING DESCRIPTIONвыполняет завершение путей для STRING, предоставляя им описание DESCRIPTION. -
__fish_complete_groupsвыводит список всех пользовательских групп с членами групп в качестве описания. -
__fish_complete_pidsвыводит список всех идентификаторов процессов с именем команды в качестве описания. -
__fish_complete_suffix SUFFIXвыполняет завершение файлов, но сначала сортирует файлы, заканчивающиеся на SUFFIX. Это полезно в сочетании сcomplete --keep-order. -
__fish_complete_usersвыводит список всех пользователей с их полным именем в качестве описания. -
__fish_print_filesystemsвыводит список всех известных файловых систем. В настоящее время это статический список, не зависящий от того, какие файловые системы фактически понимает операционная система хоста. -
__fish_print_hostnamesвыводит список всех известных хост-имен. Эта функция ищет в fstab nfs-серверы, ssh для известных хостов и проверяет файл/etc/hosts. -
__fish_print_interfacesвыводит список всех известных сетевых интерфейсов. -
__fish_print_packagesвыводит список всех установленных пакетов. Эта функция в настоящее время обрабатывает пакеты Debian, rpm и Gentoo.
Куда помещать завершения
Завершения могут быть определены в командной строке или в файле конфигурации, но они также могут быть загружены автоматически. Fish автоматически ищет все каталоги в переменной $fish_complete_path, и все определённые завершения загружаются автоматически при необходимости. Файл завершений должен иметь имя файла, состоящее из имени команды, для которой нужно выполнить завершение, и суффикса .fish.
По умолчанию Fish ищет завершения в следующих местах, используя первый доступный найденный файл:
- Каталог для конечных пользователей, чтобы хранить свои собственные завершения, обычно
~/.config/fish/completions(управляемый переменной средыXDG_CONFIG_HOME); - Каталог для системных администраторов, чтобы устанавливать завершения для всех пользователей в системе, обычно
/etc/fish/completions; - Указанный пользователем каталог для завершений сторонних поставщиков, обычно
~/.local/share/fish/vendor_completions.d(управляемый переменной средыXDG_DATA_HOME); - Каталог для поставщиков программного обеспечения сторонних производителей, чтобы предоставлять свои собственные завершения для своего программного обеспечения, обычно
/usr/share/fish/vendor_completions.d; - Завершения, поставляемые с Fish, обычно установленные в
/usr/share/fish/completions; и - Завершения, автоматически сгенерированные из справочника операционной системы, обычно хранящиеся в
~/.local/share/fish/generated_completions.
Эти пути контролируются параметрами, установленным во время сборки, установки или выполнения, и могут отличаться от указанных выше значений по умолчанию.
Этот обширный поиск может быть запутанным. Если вы не уверены, ваши завершения, вероятно, должны находиться в ~/.config/fish/completions.
Если вы написали новые завершения для распространённой команды Unix, пожалуйста, рассмотрите возможность поделиться своей работой, отправив её по инструкции в Дополнительная помощь и разработка.
Если вы разрабатываете другую программу и хотите включить завершения в вашу программу, установите их в каталог завершений «vendor». Поскольку этот путь может меняться от системы к системе, следует использовать фреймворк pkgconfig, чтобы обнаружить этот путь с помощью вывода pkg-config --variable completionsdir fish.
© 2005-2009 Axel Liljencrantz, 2009-2023 fish-shell contributors
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/3.7/completions.html