Ответы:
Я знаю https://github.com/mgalgs/fuzzy_bash_completion, который представляет собой набор функций оболочки, используемых с complete
.
Я думаю, что мы могли бы сделать немного лучше, хотя быть более кратким. Пора открыть ваш .bashrc или .profile ...
Основной хук, который мы используем, таков:
complete -o nospace -o filenames -F fuzzypath cd ls cat
Параметр -F означает использование функции оболочки для завершения табуляции, где параметры задаются в COMPREPLY
переменной. Так, например:
function fuzzypath () { если [-z $ 2] затем COMPREPLY = (`ls`) еще 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 "`) фи }
где 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 показывает, как это работает.
fzf
.. (tput sc), а затем восстановить его с помощью tput rc
..
Чтобы согласиться с другим ответом, вы можете заглянуть в zsh. Он обратно совместим с bash, так что вы можете использовать его как замену, но он поддерживает значительно расширенные функции, и одна из них - значительно улучшенное завершение контекстной вкладки.
zsh Completion FAQ расширяет варианты использования, но я верю, что в вашем примере вас больше всего интересует эта COMPLETE_IN_WORD
функция. Это не совсем желаемое поведение, но оно близко. Суть в том, что существует множество способов расширить базовую функциональность, возможно, более доступным способом, чем использование bash.
Вот расширение нечеткого совпадения, которое более точно соответствует желаемому; zsh-fuzzy match
Для некоторых идей вы можете взглянуть на популярный фреймворк oh-my-zsh, который имеет ряд функций для управления zsh и его расширения. Скорее всего, это больше, чем вы хотите, но под плагинами вы заметите сценарии автозавершения для различных ролей. Чтобы получить представление о возможностях.
cat Th
+tab
?