Как мне найти текст во многих открытых буферах?

36

Допустим, у меня открыто 10 буферов, и я хочу найти все вхождения blahво всех 10 буферах. Как бы я это сделал?

nixeagle
источник

Ответы:

31

Придерживаясь встроенных команд Emacs, вы можете использовать multi-occurили multi-occur-in-matching-buffers( M-x multi-occur- TAB RET). multi-occurдает вам прекрасный контроль, запрашивая каждый буфер для использования, но это утомительно. multi-occur-in-matching-buffersпозволяет вам ввести регулярное выражение для сопоставления имен файлов (оно ищет только в буферах, которые посещают файлы); введите .в качестве файла регулярное выражение для поиска во всех буферах, которые посещают файл.

Есть также функции для инкрементного поиска по списку буферов или файлов, но они утомительны, так multi-occurкак требуют перечисления буферов или файлов один за другим.

Для поиска во всех файлах в каталоге или файлах, соответствующих определенным шаблонам, независимо от того, открыты они или нет, вы можете использовать grep. Есть варианты rgrepи grep-findпо подкаталогам искать рекурсивно.

Жиль "ТАК - прекрати быть злым"
источник
5
+1 за упоминание, что .это регулярное выражение для соответствия всем файлам.
user2699
12

В дополнение к тому, что упоминали другие - здесь есть два других ресурса для этого.

  1. M-x multi-isearch-buffersили M-x multi-isearch-buffers-regexp(vanilla Emacs) - добавочный поиск по нескольким буферам.

  2. Если вы используете Icicles, вы можете использовать icicle-search(или icicle-occurлюбое другое количество icicle-searchспециализаций) для поиска в нескольких файлах или буферах.

(В дополнение к поиску и замене в произвольных буферах , конечно, есть команды, которые делают это по нескольким файлам . grepНапример, другие упоминали . И, конечно, есть Aв Dired. Но вы не спрашивали о поиске файлов.)

Нарисовался
источник
10

Это можно сделать с помощью команды helmhelm-multi-occur . Вы можете установить helm из melpa и затем вызвать команду следующим образом:

M-x helm-multi-occur RET M-a RET

Это откроет helm-multi-occurи затем выберет все буферы. Вместо того, M-aчтобы использовать для маркировки всех буферов, вы можете по желанию выбрать интересующие буферы по одному. Перемещайтесь вверх и вниз по списку с помощью C-nи C-pи отмечайте буферы с помощью C-SPC. Когда все буферы помечены, нажмите, RETчтобы принять помеченные буферы и начать поиск.

Если вы добавите следующее в файл инициализации:

(require 'helm-regexp)
(eval-after-load "helm-regexp"
  '(setq helm-source-moccur
    (helm-make-source "Moccur" 'helm-source-multi-occur :follow 1)))

;; (source: http://stackoverflow.com/q/14726601)
(defun my-helm-multi-occur-buffers ()
  "multi-occur in all buffers backed by files."
  (interactive)
  (helm-multi-occur
   (delq nil
     (mapcar (lambda (b)
           (when (buffer-file-name b) (buffer-name b)))
         (buffer-list)))))

Затем вы можете связать команду my-helm-multi-occur-buffersдля многократного использования во всех буферах, которые поддерживаются файлами.

nispio
источник
3
Вы также можете посмотреть на helm-swoopпакет в MELPA. Это обеспечивает эту функциональность и позволяет быстро редактировать результаты.
Вамси
9

swiper-allИз пакета swiper предоставляется инструмент для этого. Это даже постепенно, поэтому он обновляется по мере ввода.

введите описание изображения здесь

Уилфред Хьюз
источник
это здорово ! хорошая находка
abourget
6

Вы можете использовать ibufferрежим, чтобы отметить буферы, которые вы хотели бы искать. Позвоните ibuffer-do-isearch(привязано M-s a C-sпо умолчанию) для поиска текста или ibuffer-do-isearch-regexpесли вам нужно найти регулярное выражение.

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

glucas
источник
1

Вот еще один способ с рулем: M-x helm-mini M-a C-s blah. После вызова helm-mini, M-aбудет отмечать все буфера открытия , то C-s blahбудет делать мульти происходит на отмеченных буферах.

xuchunyang
источник
0

Также решение с использованием helm-mode - с helm-swoop.

использование

M-x helm-swoop RET

затем для поиска во всех открытых буферах наберите

M-i

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

Кроме того, вы можете просто набрать

M-x helm-multi-swoop

затем отметьте все буферы, которые вы хотите найти, M-SPCили C-SPCнажмитеRET иblah .

Лукас Морейра
источник