Существует ли способ искать все открытые буферы конкретный шаблон?
C-s в интерактивном режиме ищет текущий буфер. Точно так же есть ли что-то, что ищет все открытые буферы?
Я знаю, что могу использовать, "происходят", но "Происходят", приносит новый буфер и изменения/путаницу с буферной организацией.
Я исправил 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)
Буфер может вам помочь. Взгляните на эту статью. Я полагаю, что это может быть наиболее интересно для вас:
'O' - ibuffer-do-происходить - выполнить событие в выбранных буферах. Это выполняет поиск по регулярному выражению во всех выбранные буферы и отображает результат в окне происходит . Это невероятно полезно при просмотре кода. Это становится поистине потрясающим, когда вы комбинируете его с «фильтрующими» возможностями буфера (впереди). Например: выполните C-x C-b, отметьте все файлы, используя (скажем) Perl major-mode, действительно обнаружите все места, где в этих файлах упоминается определенная функция. Перейдите к точке по желанию через окно Происхождения.
'M-s a C-s' - ibuffer-do-isearch - Выполните инкрементный поиск в отмеченных буферах. Это настолько круто, что вы должны попробовать прямо сейчас.Выберите два или более буфера, нажмите горячую клавишу, найдите что-нибудь, что происходит во всех этих буферах. Одних этих двух функций достаточно, чтобы сделать меня постоянным поклонником IBuffer. Давай, сделай это сейчас!
Хотя это не совсем то, о чем вы просите, я ищу несколько файлов с помощью grep ( M-X grep
) и grep-find ( M-X grep-find
).
Это делает то, что вы хотите: когда вы дойдете до конца совпадений для строки/регексапа, который вы ищете, следующая команда поиска начнется в новом буфере.
(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))
Он не переключается на другой буфер при неудачном поиске, и при "резервном копировании" результатов поиска нажатием
На основе комментария Лео Божидару :
(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)))))
Возможно, вам придется настроить условия внутри и
, чтобы отфильтровать любые другие типы буферов, которые вы хотите игнорировать.
О встроенных буферах множественных совпадений
не упоминалось. Я использую его модифицированную версию (потому что я всегда хочу искать все буферы, и каждый раз указывать шаблон имени буфера меня раздражает).
(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))
(и, конечно же, обновите строку документации соответствующим образом.)