emacs: в интерактивном режиме ищите открытые буферы

Существует ли способ искать все открытые буферы конкретный шаблон?

C-s в интерактивном режиме ищет текущий буфер. Точно так же есть ли что-то, что ищет все открытые буферы?

Я знаю, что могу использовать, "происходят", но "Происходят", приносит новый буфер и изменения/путаницу с буферной организацией.

21
задан John D. Cook 8 August 2010 в 11:43
поделиться

6 ответов

Я исправил TODO:

;; I know that string is in my Emacs somewhere!
(require 'cl)
(defcustom search-all-buffers-ignored-files (list (rx-to-string '(and bos (or ".bash_history" "TAGS") eos)))
  "Files to ignore when searching buffers via \\[search-all-buffers]."
  :type 'editable-list)

(require 'grep)
(defun search-all-buffers (regexp prefix)
  "Searches file-visiting buffers for occurence of REGEXP.  With
prefix > 1 (i.e., if you type C-u \\[search-all-buffers]),
searches all buffers."
  (interactive (list (grep-read-regexp)
                     current-prefix-arg))
  (message "Regexp is %s; prefix is %s" regexp prefix)
  (multi-occur
   (if (member prefix '(4 (4)))
       (buffer-list)
     (remove-if
      (lambda (b) (some (lambda (rx) (string-match rx  (file-name-nondirectory (buffer-file-name b)))) search-all-buffers-ignored-files))
      (remove-if-not 'buffer-file-name (buffer-list))))

   regexp))

(global-set-key [f7] 'search-all-buffers)
16
ответ дан 29 November 2019 в 06:28
поделиться

Буфер может вам помочь. Взгляните на эту статью. Я полагаю, что это может быть наиболее интересно для вас:

'O' - ibuffer-do-происходить - выполнить событие в выбранных буферах. Это выполняет поиск по регулярному выражению во всех выбранные буферы и отображает результат в окне происходит . Это невероятно полезно при просмотре кода. Это становится поистине потрясающим, когда вы комбинируете его с «фильтрующими» возможностями буфера (впереди). Например: выполните C-x C-b, отметьте все файлы, используя (скажем) Perl major-mode, действительно обнаружите все места, где в этих файлах упоминается определенная функция. Перейдите к точке по желанию через окно Происхождения.

'M-s a C-s' - ibuffer-do-isearch - Выполните инкрементный поиск в отмеченных буферах. Это настолько круто, что вы должны попробовать прямо сейчас.Выберите два или более буфера, нажмите горячую клавишу, найдите что-нибудь, что происходит во всех этих буферах. Одних этих двух функций достаточно, чтобы сделать меня постоянным поклонником IBuffer. Давай, сделай это сейчас!

11
ответ дан 29 November 2019 в 06:28
поделиться

Хотя это не совсем то, о чем вы просите, я ищу несколько файлов с помощью grep ( M-X grep ) и grep-find ( M-X grep-find ).

1
ответ дан 29 November 2019 в 06:28
поделиться

Это делает то, что вы хотите: когда вы дойдете до конца совпадений для строки/регексапа, который вы ищете, следующая команда поиска начнется в новом буфере.

(setq isearch-wrap-function 'isearch-bury-buffer-instead-of-wrap)
(defun isearch-bury-buffer-instead-of-wrap ()
  "bury current buffer, try to search in next buffer"
  (bury-buffer))

Он не переключается на другой буфер при неудачном поиске, и при "резервном копировании" результатов поиска нажатием , вы не вернетесь в предыдущие буферы поиска.

1
ответ дан 29 November 2019 в 06:28
поделиться

На основе комментария Лео Божидару :

(defun my-isearch-buffers ()
  "isearch multiple buffers."
  (interactive)
  (multi-isearch-buffers
   (delq nil (mapcar (lambda (buf)
                       (set-buffer buf)
                       (and (not (equal major-mode 'dired-mode))
                            (not (string-match "^[ *]" (buffer-name buf)))
                            buf))
                     (buffer-list)))))

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

7
ответ дан 29 November 2019 в 06:28
поделиться

О встроенных буферах множественных совпадений не упоминалось. Я использую его модифицированную версию (потому что я всегда хочу искать все буферы, и каждый раз указывать шаблон имени буфера меня раздражает).

(defun my-multi-occur-in-matching-buffers (regexp &optional allbufs)
  "Show lines matching REGEXP in all file-visiting buffers.

Given a prefix argument, search in ALL buffers."
  (interactive (occur-read-primary-args))
  (multi-occur-in-matching-buffers "." regexp allbufs))

(global-set-key (kbd "M-s /") 'my-multi-occur-in-matching-buffers)

Чтобы изменить поведение аргумента префикса таким образом, чтобы по умолчанию выполнялся поиск всех буферов, измените вызов на:

(multi-occur-in-matching-buffers "." regexp (not allbufs))

(и, конечно же, обновите строку документации соответствующим образом.)

30
ответ дан 29 November 2019 в 06:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: