emacs:交互式搜索开放缓冲区

时间:2010-04-14 21:32:28

标签: emacs

有没有办法搜索特定模式的所有打开缓冲区?

C-s以交互方式搜索当前缓冲区。 同样,是否有搜索所有开放缓冲区的内容?

我知道我可以使用“发生”,但“发生”会带来一个新的缓冲区并改变/混乱缓冲组织。

7 个答案:

答案 0 :(得分:30)

尚未提及内置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)

要反转prefix参数的行为,以便默认行为是搜索所有缓冲区,请将调用更改为:

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

(当然,相应地更新文档字符串。)

答案 1 :(得分:16)

我修好了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 :(得分:11)

ibuffer可能会帮到你。看看this文章。我想这对你来说可能是最有趣的:

'O' - 发生ibuffer-do - 在选定的缓冲区上发生。 这会对所有选定的缓冲区执行正则表达式搜索,并在发生窗口中显示结果。浏览代码时,这是非常有用的。当你将它与ibuffer的“过滤”功能结合起来(即将到来)时,它变得非常棒。例如:C-x C-b,使用(例如)Perl major-mode标记所有文件,确实会找出这些文件中提到某个功能的所有地方。通过Occur窗口随意导航到该点。

'M-s a C-s' - ibuffer-do-isearch - 在标记的缓冲区中进行增量搜索。 这太棒了,你必须立即尝试。选择两个或多个缓冲区,点击热键,搜索所有这些缓冲区中出现的内容。仅这两个特征就足以让我成为IBuffer的终身粉丝。现在去做吧!

答案 3 :(得分:7)

从Leo对Bozhidar的评论中找到线索:

(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内的条件来过滤您想要忽略的其他类型的缓冲区。

答案 4 :(得分:1)

虽然这不是您要求的,但我使用grep(M-X grep)和grep-find(M-X grep-find)搜索多个文件。

答案 5 :(得分:1)

这样做你想要的,因为当你为你正在搜索的字符串/ 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> “备份”搜索结果时,您将不会弹回到上一个搜索缓冲区。

答案 6 :(得分:1)

Icicles 中, C-c'是命令icicle-occur,可以搜索多个缓冲区。

C-u C-c'搜索您选择的一组缓冲区。您可以通过使用迷你缓冲区输入动态过滤缓冲区名称来选择,然后点击 C - !来搜索名称匹配的所有缓冲区。同样, C-99 C-c'仅搜索正在访问文件的缓冲区。

occurgrep一样,icicle-occur逐行搜索。更一般地,不是使用行作为搜索上下文,而是可以使用任何缓冲区部分。 C-c` (反引号而不是引号)是命令icicle-search。使用非负前缀arg,它会搜索您选择的一组缓冲区。

你要做的第一件事是给它一个定义搜索上下文的正则表达式。例如,如果你给它.*,它就像icicle-occur一样:每个搜索上下文都是一行。如果你给它一个只匹配函数定义的正则表达式那么那些就是搜索上下文,依此类推。

http://www.emacswiki.org/emacs/Icicles_-_Search_Commands%2c_Overview