Завершение с помощью табуляции может быть большим преимуществом инструментов CL с точки зрения удобства использования, но встроить его в вашу программу непросто, а в Интернете не так много ресурсов с практическими рекомендациями. К счастью, я нашел отличный туториал, написанный Джеймсом Когланом, и использовал его для создания автодополнения табуляции для моей программы заметки.

Он основывает свое руководство на автозавершениях вкладок, предлагаемых rbenv, средой Ruby и менеджером пакетов. Между прочим, это похоже на то, как аналог rbenv в Python, virtualenv, развертывает завершение вкладок.

Когда я ввожу заметки в командную строку и нажимаю вкладку, вызывается функция, которая создает и отображает список заметок.

Дополнения, которые я написал, работают для Bash и Zsh. При запуске оболочки определяется специфичная для оболочки функция завершения, которая подключается к оболочке с помощью одной из следующих команд:

# Bash
complete -F <completion_function> notes
# Zsh
compctl -K <completion_function> notes

Есть несколько способов убедиться, что это происходит. Первый — поместить скрипт с функцией завершения и командой в специальный каталог оболочки, например /etc/bash_completion.d. Тот, который я предпочитаю, используемый rbenv и virtualenv, заключается в том, чтобы потребовать, чтобы пользователь сам создал сценарий завершения, добавив строку в свой файл запуска оболочки:

# rbenv
eval "$(rbenv init -)"
# virtualenv
source /usr/local/bin/virtualenvwrapper.sh
# notes
which notes >/dev/null && . "$( notes -i )"

Мне нравится этот метод, потому что он не зависит от специальных каталогов завершения и не развертывает в них файлы. В случае с примечаниями, если вызывается notes -i, он возвращает абсолютный путь «управляющего» скрипта завершения. Этот сценарий решает, какой сценарий завершения для конкретной оболочки вызывать, в зависимости от оболочки. Пользователь просто загружает этот управляющий скрипт в свой файл запуска, и бум, заметки получают завершение табуляции!

Первоначально опубликовано на kylebebak.github.io 19 февраля 2016 г.