Завершение вкладки Zsh не работает должным образом для частичных путей

17

Я хочу нечёткое завершение без учета регистра для файлов и каталогов в zsh. Прочитав руководство в течение нескольких часов, я пришел к следующему:

zstyle ':completion:*:*:*:*:globbed-files' matcher 'r:|?=** m:{a-z\-}={A-Z\_}'
zstyle ':completion:*:*:*:*:local-directories' matcher 'r:|?=** m:{a-z\-}={A-Z\_}'
zstyle ':completion:*:*:*:*:directories' matcher 'r:|?=** m:{a-z\-}={A-Z\_}'

Кроме того, я хочу нажать TABодин раз, чтобы отобразить возможные варианты завершения, изменив только то, что я набрал, если есть только одно завершение. Затем TABповторное нажатие должно перевести меня в режим «Завершение меню». Основываясь на руководствах, я придумал это:

zstyle ':completion:*' menu select

Теперь все работает как надо, кроме одного обстоятельства. У меня есть две папки Desktopи .rstudio-desktopв моем домашнем каталоге. Так как у меня есть setopt globdots, я ожидаю, набрав следующее:

$ cd ~/dktop<TAB>

оставить мою команду, как введено, и отобразить в качестве кандидатов на завершение Desktopи .rstudio-desktop. Вместо этого он удаляет dktop , оставляя мне следующее:

$ cd ~/

Я просмотрел все соответствующие руководства, руководства, вопросы по обмену стеками и другие источники. Но что бы я ни делал, я не могу заставить это работать.

Интересно, что если я нахожусь в домашнем каталоге и набираю следующее, то все работает как положено:

$ cd dktop<TAB>

То есть это проблема только с не ведущими сегментами путей (и вы можете видеть, C-x hчто это соответствует directoriesтегу, а не используемому local-directoriesтегу).

Для облегчения воспроизводимости, здесь есть , ~/.zshrcчто будет воспроизвести ситуацию и поведение , описанное выше (проверено на свежей виртуальной машине El Capitan с zshот Homebrew).

Радон Росборо
источник
Не могу воспроизвести. zsh 5.3.1на Arch Linux. cd ~/dktop<tab>доходность cd ~/Desktop.
PythonNut
@PythonNut С zsh 5.3.1на OS X проблема воспроизводит. Интересно, что есть разница между операционными системами.
Радон Росборо
1
@PythonNut На самом деле, я уверен, что это потому, что в Linux учитывается регистр, а в macOS регистр не учитывается.
Радон Росборо
Точно так же, как дружеское напоминание, не все Mac / macOS нечувствительны к регистру, это зависит от того, форматирован ли ваш диск без учета регистра или нет.
Конки

Ответы:

1

Одним из возможных решений является сделать:

bindkey "^I" expand-word

Это приведет к расширению вкладки ~/до абсолютного пути.

ConstipatedNinja
источник
Может быть, я что-то упускаю, но я не понимаю, как это каким-либо образом связано с нечеткими дополнениями вкладок или с решением проблемы, описанной выше. Если я сделаю так, как вы предлагаете, то нажатие клавиши TAB выдаст меня cd /Users/raxod502/dktop, и завершение будет отключено.
Радон Росборо
@RadonRosborough Надежда заключалась в том, что, расширив ~/свой абсолютный путь, нечеткое завершение начнет работать. Казалось, один из тех случаев, когда проблема заключается в том, что он оценивает его один раз, но на самом деле вам нужно, чтобы он оценивал дважды, чтобы работать, поэтому наличие абсолютного пути вместо ~/означало бы, что нужно будет вернуться только к одной оценке. Но дерьмо, извините, я забыл, что bindkey заменяет старые привязки, и я не могу найти ничего, что говорит, возможно ли связать две функции с одной клавишей. Без моего bindkey, ваше завершение работает как задумано, когда дан абсолютные пути?
Запор
Нет. Не имеет значения, является ли входной путь ~/dktopили /Users/raxod502/dktop; результат тот же, а именно тот, dktopкоторый удаляется при нажатии клавиши TAB.
Радон Росборо