emacs isearch с автоматическим применением регулярного выражения между символами

#regex #emacs #hook #isearch

#регулярное выражение #emacs #перехват #isearch

Вопрос:

Я хотел бы иметь привязку к isearch-forward функции Emacs, чтобы она автоматически применяла регулярное выражение между входными символами при поиске строки. Например, я хотел бы установить для этого регулярного выражения значение [-=<>] . Если я сейчас введу foobar в isearch, оно должно соответствовать foo<bar , fo=ob=>ar , f-o-o-b-a-r и т.д.

Доступна ли такая функциональность уже? Я безуспешно изучал ELPA и MELPA. В случае, если это недоступно, и поскольку мои возможности Elisp очень ограничены: как это можно реализовать?

Комментарии:

1. Ваше использование слова «игнорировать» сбивает меня с толку. Похоже, вы хотите, чтобы Emacs автоматически вызывал isearch-forward-regexp и добавлял ваш шаблон между каждым символом исходного шаблона. Примеры довольно ясно показывают желаемый результат, но формулировка, похоже, не подходит.

2. Правильно. Надеюсь, теперь это лучше.

Ответ №1:

Хорошо, я нашел решение самостоятельно после проверки hexl.el из Emacs.

Вот код.

 (defun my-isearch-function ()
  "Make isearch skip characters -=<> while searching."
  (if (not isearch-regexp)
      (lambda (string amp;optional bound noerror count)
        (funcall
         (if isearch-forward
             're-search-forward
           're-search-backward)
         (mapconcat (lambda (c) (regexp-quote (string c))) string
                    "\(?:[-=<>]*\)?")
         bound
         noerror
         count))
    (isearch-search-fun-default)))


(defun toggle-my-isearch ()
  "Toggle my search mode.
If activated, incremental search skips characters -=<> while
searching.

For example, searching `foobar' matches `foo-bar' or `f-o-o=b<a>r'."
  (interactive)
  (if (eq isearch-search-fun-function 'isearch-search-fun-default)
      (progn
        (setq isearch-search-fun-function 'my-isearch-function)
        (message "my isearch on"))
    (setq isearch-search-fun-function 'isearch-search-fun-default)
    (message "my isearch off")))


(global-set-key (kbd "s-s") 'toggle-my-isearch)
  

Ответ №2:

Я написал пакет под названием flex-isearch , который в основном вставляет «.*» между каждым символом строки поиска (это немного сложнее, чем это) и переключается на поиск по регулярному выражению. Это делается автоматически, когда isearch завершается неудачей.