Как интегрировать что-либо — происходит в режиме isearch

#emacs

#emacs

Вопрос:

Мне очень нравится anything.el . Пользовательский интерфейс anything замечательный.

Я также использую isearch очень часто, и он предоставляет привязку клавиш M-s o для вызова occur с помощью isearch входной строки. Но собственный режим occurre недостаточно мощный.

В occur-mode вы не можете снова отфильтровать результат. И функция перехода тоже базовая.

Я считаю, что anything-occur это более мощно, чем occur , вы можете фильтровать результат, переходить на позицию в любом стиле.

Но есть проблема, как интегрировать anything-occur ? Моя последняя попытка:

 (defun occur-in-isearch ()
  (interactive)
  (let ((case-fold-search isearch-case-fold-search))
    (occur (if isearch-regexp isearch-string (regexp-quote isearch-string)))))
  

Я заменяю occur на anything-occur , но это бесполезно. anything-occur это defun, который не принимает параметров. Я не могу передать строку isearch в anything-occur .

Как я мог бы интегрировать anything-occur ? Или есть лучший способ использовать anything-occur внутри isearch-mode ?

Ответ №1:

Я ничем не пользуюсь, но этот код выполняет 99% того, что вы хотите. Единственное предостережение заключается в том, что начальная строка ввода не обновляется должным образом при вводе backspace. Я не знаю, почему это так. Все остальное работает, кажется, работает так, как ожидалось.

 (eval-after-load "isearch"
  '(define-key isearch-mode-map (kbd "M-s o") 'isearch-anything-occur))

(defun isearch-anything-occur (regexp amp;optional nlines)
  "isearch anything occur"
  (interactive
   ;; from isearch-occur
   (list
    (cond
     (isearch-word (concat "\b" (replace-regexp-in-string
                                  "\W " "\W "
                                  (replace-regexp-in-string
                                   "^\W \|\W $" "" isearch-string)
                                  nil t)
                           "\b"))
     (isearch-regexp isearch-string)
     (t (regexp-quote isearch-string)))
    (if current-prefix-arg (prefix-numeric-value current-prefix-arg))))
  ;; from occur-anything
  (let ((anything-compile-source-functions
         ;; rule out anything-match-plugin because the input is one regexp.
         (delq 'anything-compile-source--match-plugin
               (copy-sequence anything-compile-source-functions))))
    (anything :sources 'anything-c-source-occur
              :input regexp
              :buffer "*Anything Occur*")))
  

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

1. Это очень приятно, но это не просто backspace сломано — похоже, что ключевая карта anything не включена, что делает это намного менее полезным. Я не совсем понимаю, как в этом случае работают карты ключей, но было бы здорово, если бы этот код работал.

Ответ №2:

Очень похоже —

В Icicles, во время удара Isearch S-TAB . Нажмите RET , чтобы принять тот же шаблон поиска, или сначала отредактируйте его, а затем нажмите RET .

Это открывает поиск Icicles со всеми совпадениями в качестве контекстов поиска. Чтобы сузить / отфильтровать эти контексты с помощью дополнительного шаблона, просто введите больше текста.

Чтобы постепенно фильтровать по нескольким шаблонам, нажмите M-SPC между шаблонами. Перебирайте совпадения с помощью C-down (и т.д.) или завершите до любого из них или нажмите C-mouse-2 на любое из них в *Completions .

http://www.emacswiki.org/emacs/Icicles_-_Isearch_Enhancements#IciclesSearchFromIsearch