10

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

3 ответа3

9

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

5

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

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

3

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .