Включите нечеткое сопоставление плюща везде, кроме как в swiper

10

Я давно пользуюсь flx-ido-modeи мне это нравится. Плющ может вести себя так же, используя ivy--regex-fuzzy.

Проблема в том, что swiperтеперь также будет использоваться нечеткое сопоставление, и в этом случае оно мне не очень нравится (по крайней мере, не по умолчанию, все время).

Поэтому я хотел бы продолжить использовать нечеткое сопоставление с Айви, кроме как в swiper. Есть ли способ настроить это? Или я могу как-то сказать, swiperчто я действительно ищу "эту" подстроку прямо сейчас, что-то с префиксом?

Смелый
источник

Ответы:

16

Я хотел бы продолжать использовать нечеткое сопоставление с Айви, кроме как в swiper.

Переменная, которая определяет, какой «конструктор регулярных выражений», как Айви ссылается на эти функции, используется для какой функции сбора ivy-re-builders-alist:

ivy-re-builders-alist is a variable defined in ‘ivy.el’.
Its value is ((t . ivy--regex-plus))

Documentation:
An alist of regex building functions for each collection function.

Each key is (in order of priority):
1. The actual collection function, e.g. ‘read-file-name-internal’.
2. The symbol passed by :caller into ‘ivy-read’.
3. ‘this-command’.
4. t.

Each value is a function that should take a string and return a
valid regex or a regex sequence (see below).

Possible choices: ‘ivy--regex’, ‘regexp-quote’,
‘ivy--regex-plus’, ‘ivy--regex-fuzzy’.

If a function returns a list, it should format like this:
’(("matching-regexp" . t) ("non-matching-regexp") ...).

The matches will be filtered in a sequence, you can mix the
regexps that should match and that should not match as you
like.

Таким образом, чтобы изменить стандартный конструктор регулярных выражений с ivy--regex-plusна ivy--regex-fuzzy, но оставить прежнее значение для swiper, вы можете

(setq ivy-re-builders-alist
      '((swiper . ivy--regex-plus)
        (t      . ivy--regex-fuzzy)))

или, более программно,

(with-eval-after-load 'ivy
  (push (cons #'swiper (cdr (assq t ivy-re-builders-alist)))
        ivy-re-builders-alist)
  (push (cons t #'ivy--regex-fuzzy) ivy-re-builders-alist))

Это описано более подробно в (ivy) Completion Styles.

Мне не очень нравится [нечеткое соответствие] (по крайней мере, не по умолчанию, все время)

Плющ позволяет вращать конструктор регулярных выражений на лету через интерфейс гидры. Довольно скрытое последнее предложение (ivy) ivy--regex-fuzzyссылается на это, и более полное описание можно найти под ним (ivy) Hydra in the minibuffer, но похоже, что руководство немного устарело, учитывая, что прошло немало времени с момента последнего выпуска.

В результате, начиная с 2017-07-04 , Ivy позволяет циклически проходить по построителям регулярных выражений во время завершения с помощью C-om( ivy-rotate-preferred-builders). Изменить : как указано Asme Justв комментарии , привязка ключа по умолчанию была изменена C-oMна 2019-02-06 .

Бэзил
источник
Не могли бы вы подробнее рассказать о завершении цикла? Например, если я запустил поиск swiper, Co немедленно выдаст мне сообщение «команда-выполнить: невозможно открыть загрузочный файл: такого файла или каталога нет, ivy-hydra».
B_old
@B_old Попробуйте сначала установить дополнительный ivy-hydraпакет. Моральный вопрос о том, должна ли существовать связка клавиш по умолчанию для необязательной (то есть не всегда установленной) функции , уже была поднята, и статус-кво вряд ли скоро изменится. Если у вас есть другие вопросы, о ivy-hydraкоторых не говорится в руководстве, рассмотрите возможность создания для них новых вопросов Emacs SE.
Василий
( ivy-rotate-preferred-builders) C-o M для меня в настоящее время по умолчанию.
Asme Just
@AsmeJust Спасибо, это было несовместимое с прошлым изменение, внесенное чуть более 2 недель назад: github.com/abo-abo/swiper/commit/…
Василий
2

Если вы хотите отключить сопоставление регулярных выражений в swiper, но оставляете его активным в другом месте, добавьте это в user-init-file:

(setq ivy-re-builders-alist
      '((swiper . regexp-quote)
        (t      . ivy--regex-fuzzy)))

Если вы хотите деактивировать его только один раз, нажмите M-rна swiper.

cayhorstmann
источник
+1 за упоминание удобной M-rпривязки. Обратите внимание, однако, что OP только указал, что они хотят отключить нечеткое сопоставление; какой регулярное выражение должно заменить его, осталось неясным.
Василий