Я использую bash, и мне было интересно, есть ли какой-нибудь плагин в bash или другой оболочке, который позволяет мне сделать это cat tfnislong.txt
+ [tab]
завершает работу с cat ThisFileNameIsSoLong.txt
же, как завершение табуляции в Sublime Text.
3 ответа
Я знаю о https://github.com/mgalgs/fuzzy_bash_completion, который представляет собой набор функций оболочки, используемых с complete
.
Я думаю, что мы могли бы, возможно, сделать немного лучше, хотя, быть более кратким. Пришло время открыть ваш .bashrc или .profile ...
Основной хук, который мы используем, таков:
complete -o nospace -o filenames -F fuzzypath cd ls cat
Параметр -F означает использование функции оболочки для завершения табуляции, где параметры задаются в переменной COMPREPLY
. Так, например:
function fuzzypath() { if [ -z $2 ] then COMPREPLY=( `ls` ) else DIRPATH=`echo "$2" | gsed 's|[^/]*$||'` BASENAME=`echo "$2" | gsed 's|.*/||'` FILTER=`echo "$BASENAME" | gsed 's|.|\0.*|g'` COMPREPLY=( `ls $DIRPATH | grep -i "$FILTER" | gsed "s|^|$DIRPATH|g"` ) fi }
где DIRPATH
- это все, что находится перед последним / на вашем пути, который вы вводите, а BASENAME
- то, где находится курсор в данный момент.
FILTER
- это место, где появляется нечеткость. В общем , возьмите BASENAME
и вставьте .*
Между каждым символом, чтобы получить наше регулярное выражение.
Остальное просто объединяет регулярное выражение с ls для получения COMPREPLY
. Вы можете найти более умные вещи, чтобы сделать здесь, может быть, с помощью find
.
Я также нашел http://fahdshariff.blogspot.com/2011/04/writing-your-own-bash-completion.html полезным.
Вы можете найти FZF полезным. Это нечеткий искатель общего назначения, написанный на Ruby, который можно использовать с любым списком вещей: файлы, процессы, история команд, ветки git и т.д.
Его установочный скрипт установит привязку CTRL-T
для вашей оболочки. Следующий GIF показывает, как это работает.
Чтобы согласиться с другим ответом, вы можете заглянуть в zsh. Он обратно совместим с bash, так что вы можете использовать его как замену, но он поддерживает значительно расширенные функции, и одна из них - значительно улучшенное завершение контекстной вкладки.
zsh Completion FAQ расширяет варианты использования, но я верю, что в вашем примере вас больше всего заинтересует функция COMPLETE_IN_WORD
. Это не совсем желаемое поведение, но оно близко. Суть в том, что существует множество способов расширить базовую функциональность, возможно, более доступным способом, чем использование bash.
Вот расширение нечеткого совпадения, которое более точно соответствует желаемому; zsh-fuzzy match
Для некоторых идей вы можете взглянуть на популярный фреймворк oh-my-zsh, который имеет ряд функций для управления zsh и его расширения. Скорее всего, это больше, чем вы хотите, но под плагинами вы заметите сценарии автозавершения для различных ролей. Чтобы получить представление о возможностях.