Пусть zsh возвращает регистрозависимые совпадения без учета регистра, но предпочитает точные совпадения
Я использую zsh с rc-файлом oh-my-zsh, и некоторые действия меня особенно раздражают. По умолчанию oh-my-zsh настроен на возврат нечувствительных к регистру совпадений при автозаполнении. Такое поведение иногда хорошо, но в других случаях это действительно отстой. Можно ли настроить zsh на использование сопоставления без учета регистра только при отсутствии совпадений с учетом регистра?
Например, этот случай будет использовать регистрозависимое соответствие:
> ls
LICENSE.txt lib/
> emacs l <-- should autocomplete to lib/
В этом случае произойдет автоматическое завершение без учета регистра:
> ls
README lib/
> emacs r <-- should autocomplete to README
Спасибо!
3 ответа
Просто раскомментируйте следующую строку в ~/.zshrc:
# Uncomment the following line to use case-sensitive completion.
# CASE_SENSITIVE="true"
У меня сработало
Создать файл ~/.oh-my-zsh/custom/better-completion.zsh
(при условии, что вы используете пути по умолчанию для oh-my-zsh) со следующими строками
zstyle ':completion:*' matcher-list '' 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'
Объяснение:
Правила для матчей в zsh завершение в целом определены в matcher-list
стиль. Для ой-мой-zsh это определено в ~/.oh-my-zsh/lib/completion.zsh
(один раз для чувствительного к регистру и один раз для нечувствительного к регистру). Вы можете изменить его там, но он, вероятно, исчезнет, если вы обновите свой oh-my-zsh. ~/.oh-my-zsh/custom
специально предназначен для настройки и файлов с расширением .zsh
загружены оттуда .oh-my-zsh/oh-my-zsh.sh
в конце конфигурации.
Настройки по умолчанию (без учета регистра) для matcher-list
в о-о-о-о:
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'
Первый из которых говорит, чтобы обрабатывать верхний и нижний регистр взаимозаменяемы. Поскольку это первое правило, оно будет неизменно использоваться для каждого матча.
Единственное изменение, которое необходимо сделать, это предварительно ''
для простого завершения (это даже первый пример в zshcompsys(1)
за matcher-list
)
zstyle ':completion:*' matcher-list '' 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'
Сначала он пытается завершить текущее слово в точности так, как оно написано, а затем пробовать без учета регистра или других совпадений.
Быть завершенным:
- Второе (оригинальное) правило допускает частичное завершение до
.
,_
или же-
например,f.b
->foo.bar
, - Третье правило допускает завершение на левой стороне письменного текста, например
bar
->foobar
)
Для тех, кто не использует oh-my-zsh, вы можете добавить следующие две строки в
~/.zshrc
zstyle ':completion:*' matcher-list '' 'm:{a-zA-Z}={A-Za-z}' 'r:|=*' 'l:|=* r:|=*'
autoload -Uz compinit && compinit