Подтвердить что ты не робот

Emacs: интерактивный поиск открытых буферов

Есть ли способ поиска всех открытых буферов для определенного шаблона?

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

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

4b9b3361

Ответ 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