Пусть 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
Другие вопросы по тегам