Emacs: интерактивный поиск открытых буферов
Есть ли способ поиска всех открытых буферов для определенного шаблона?
C-s интерактивно ищет текущий буфер.
Аналогично, есть ли что-то, что ищет все открытые буферы?
Я знаю, что могу использовать "происходить", но "Occur" приносит новый буфер и изменяет/беспорядок с организацией буфера.
Ответы
Ответ 1
Я установил 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)
Ответ 2
Встроенный multi-occur-in-matching-buffers
не упоминается. Я использую модифицированную версию этого (потому что я неизменно хочу искать все буферы, и каждый раз указывать шаблон имен буфера раздражает).
(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))
(и, конечно же, обновить докшлингу соответственно.)
Ответ 3
ibuffer может вам помочь. Посмотрите эту статью. Я предполагаю, что это может быть вам наиболее интересно:
'O' - ibuffer-do-happen
- Выполняется на выбранных буферах.
Это выполняет поиск по регулярному выражению во всех выбранных буферах и отображает результат в окне возникновения. Это невероятно полезно при просмотре кода. Это становится действительно удивительным, когда вы совмещаете его с "полномочиями фильтров ibuffer (вперед). Например: C-x C-b, отметьте все файлы, используя (скажем) Perl major-mode, чтобы обнаружить все места, где определенная функция упоминается в этих файлах. Перейдите к точке в окне через окно" Окно".
'M-s a C-s' - ibuffer-do-isearch
- Выполняйте инкрементный поиск в отмеченных буферах.
Это так здорово, что вы должны попробовать это прямо сейчас. Выберите два или более буфера, нажмите горячую клавишу, найдите что-то, что происходит во всех этих буферах. Только этих двух функций достаточно, чтобы сделать меня пожизненным поклонником IBuffer. Идите делать это сейчас!
Ответ 4
Взяв ключ от комментария Лео к Божидару:
(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)))))
Возможно, вам придется настроить условия внутри and
, чтобы фильтровать любые другие типы буферов, которые вы хотите игнорировать.
Ответ 5
Хотя это не совсем то, о чем вы просите, я ищу несколько файлов, используя grep (M-X grep
) и grep-find (M-X grep-find
).
Ответ 6
Этот вид делает то, что вы хотите, в том случае, когда вы подошли к концу совпадений для строки /regexp, которую вы ищете, следующая команда поиска начнется в новом буфере.
(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))
Он не переключается на другой буфер, когда поиск завершается с ошибкой, а когда вы "создаете резервную копию" результатов поиска, нажимая <backspace>, вы не будете возвращаться в предыдущие буферы.
Ответ 7
В Icicles, C-c ' есть команда icicle-occur
, которая может искать несколько буферов.
C-u C-c ' выполняет поиск набора выбранных буферов. Вы можете динамически фильтровать имена буферов с помощью ввода минибуфера, а затем нажать C-! для поиска всех этих буферов, имена которых совпадают. Аналогично, C-99 C-c ' выполняет поиск только для буферов, которые посещают файлы.
Подобно occur
и grep
, icicle-occur
выполняет поиск по строкам. В более общем плане вместо использования строк в качестве контекстов поиска вы можете использовать любые части буфера вообще. C-c ` (backquote вместо цитаты) - команда icicle-search
. С неотрицательным префиксом arg он ищет набор выбранных буферов.
Первое, что вы делаете, это дать ему регулярное выражение, определяющее контексты поиска. Например, если вы даете ему .*
, тогда он действует как icicle-occur
: каждый контекст поиска является строкой. Если вы даете ему регулярное выражение, которое соответствует только определениям функций, то это контексты поиска и т.д.
http://www.emacswiki.org/emacs/Icicles_-_Search_Commands%2c_Overview