Есть ли оболочка, которая поддерживает нечеткое завершение, как в Sublime Text?

14

Я использую bash, и мне было интересно, есть ли какой-нибудь плагин в bash или другой оболочке, который позволяет мне делать это cat tfnislong.txt+ [tab]завершает, cat ThisFileNameIsSoLong.txtкак завершение табуляции в Sublime Text.

woodings
источник
Почему бы просто не сделать cat Th+ tab?
daviewales
1
@daviewales Показать все 269 причин?
Факс

Ответы:

11

Я знаю 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 полезным.

MWM
источник
6

Вы можете найти fzf полезным. Это нечеткий искатель общего назначения, написанный на Ruby, который можно использовать с любым списком вещей: файлы, процессы, история команд, ветки git и т. Д.

Его установочный скрипт установит CTRL-Tпривязку клавиш для вашей оболочки. Следующий GIF показывает, как это работает.

Джунгунн Чой
источник
ФЗФ это здорово! Большое спасибо за помощь. Это сэкономило мне недели работы. Я начал писать нечеткое завершение для Bash, когда, к счастью, нашел FZF. Он работает отлично, мне просто нужно было сохранить положение курсора перед вызовом fzf.. (tput sc), а затем восстановить его с помощью tput rc..
Håkon Hægland
3

Чтобы согласиться с другим ответом, вы можете заглянуть в zsh. Он обратно совместим с bash, так что вы можете использовать его как замену, но он поддерживает значительно расширенные функции, и одна из них - значительно улучшенное завершение контекстной вкладки.

zsh Completion FAQ расширяет варианты использования, но я верю, что в вашем примере вас больше всего интересует эта COMPLETE_IN_WORDфункция. Это не совсем желаемое поведение, но оно близко. Суть в том, что существует множество способов расширить базовую функциональность, возможно, более доступным способом, чем использование bash.

Вот расширение нечеткого совпадения, которое более точно соответствует желаемому; zsh-fuzzy match

Для некоторых идей вы можете взглянуть на популярный фреймворк oh-my-zsh, который имеет ряд функций для управления zsh и его расширения. Скорее всего, это больше, чем вы хотите, но под плагинами вы заметите сценарии автозавершения для различных ролей. Чтобы получить представление о возможностях.

Крондор
источник