emacs:交互式搜索打开的缓冲区

emacs:交互式搜索打开的缓冲区,emacs,Emacs,有没有办法在所有打开的缓冲区中搜索特定的模式 C-s以交互方式搜索当前缓冲区。 类似地,是否存在搜索所有打开缓冲区的功能 我知道我可以使用“发生”,但是“发生”会带来一个新的缓冲区,并且会改变缓冲区组织。虽然这不是你想要的,但我使用grep(M-X grep)和grep find(M-X grep find)搜索多个文件。ibuffer可能会帮助你。看看这篇文章。我想这对你来说可能是最有趣的: “O”-ibuffer确实会出现 -在选定的缓冲区上执行一次操作。 这将对所有选定的缓冲区执行正则表达

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

C-s以交互方式搜索当前缓冲区。 类似地,是否存在搜索所有打开缓冲区的功能


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

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

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

“O”-ibuffer确实会出现 -在选定的缓冲区上执行一次操作。 这将对所有选定的缓冲区执行正则表达式搜索,并在“发生”窗口中显示结果。它在浏览代码时非常有用。当你将它与ibuffer的“过滤”功能结合在一起时,它会变得非常棒。例如:做C-xc-b,使用(比如)Perl主模式标记所有文件,找出这些文件中提到某个函数的所有位置。通过“发生”窗口随意导航到该点

“M-s a C-s”-ibuffer do isearch -在标记的缓冲区中执行增量搜索。
这真是太棒了,你必须马上去尝试。选择两个或多个缓冲区,点击热键,搜索所有这些缓冲区中出现的内容。仅这两个特性就足以让我成为伊布弗的终身粉丝。现在就去做

这类操作符合您的要求,当您搜索的字符串/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))
当搜索失败时,它不会切换到不同的缓冲区,当您按“备份”搜索结果时,您将不会弹出到以前搜索的缓冲区

我已经解决了待办事项:

;; 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)

从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)))))

您可能必须调整
中的条件,以过滤任何其他类型的缓冲区,您希望忽略这些缓冲区。

未提及匹配缓冲区中内置的
多重发生。我使用了一个修改过的版本(因为我总是想搜索所有缓冲区,每次指定一个缓冲区名称模式都很烦人)

(在匹配缓冲区(regexp&optional allbufs)中取消我的多线程
“在所有文件访问缓冲区中显示与REGEXP匹配的行。
给定前缀参数,在所有缓冲区中搜索。“
(交互式(发生读取主参数))
(在匹配的缓冲区中出现多个“.regexp allbufs”)
(全局设置键(kbd“M-s/”)my multi出现在匹配的缓冲区中)
要反转prefix参数的行为,以便默认行为是搜索所有缓冲区,请将调用更改为:

(在匹配的缓冲区中出现多个“.regexp(不是所有bufs))
(当然,还要相应地更新docstring。)

ICICCLES中,C-C'是命令
ICICCLE EXCEPT
,它可以搜索多个缓冲区

C-u C-C'搜索您选择的一组缓冲区。您可以通过使用minibuffer输入动态筛选缓冲区名称进行选择,然后点击C-!搜索名称匹配的所有缓冲区。类似地,C-99 C-C'只搜索访问文件的缓冲区

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

您要做的第一件事是给它一个定义搜索上下文的regexp。例如,如果你给它
*
,那么它的行为就像是
冰柱出现
:每个搜索上下文都是一行。如果给它一个只匹配函数定义的regexp,那么这些就是搜索上下文,依此类推


您不需要ibuffer,因为“标准”缓冲区菜单的作用是相同的:标记一些缓冲区并执行M-s a C-s(或M-x缓冲区菜单搜索缓冲区)。如果这个功能可以通用化,这样就不必标记缓冲区了,那就太好了。它应该很容易实现——存在一个multi-isearch buffers函数,只需要提供一个开放缓冲区列表作为其参数。谢谢你,Bozhidar B.和Leo a.我一直想要一种只在开放缓冲区中搜索和替换的方法。我不知道缓冲区列表只支持列出、访问和杀戮:这是我最大的疏忽;这太棒了。可能只是为了我,但是在我的emacs中,
iccile-occure
是用
C-C'
调用的。对——我修正了输入错误。Thx.在此之前是否应该有
(需要'cl)
?我不知道为什么,但这修正了我的一个错误。注:我是一个口齿不清的人。卡米尔:我想你是对的;“删除如果”和“删除如果没有”在“cl”库中。非常好。你可以花无限的时间调整和定制emacs…当我使用它时,它只会说“搜索1个缓冲区”,即使我在emacs中打开了20个缓冲区。为什么会这样?@johnbakers:最有可能的原因是
multi出现在匹配的缓冲区中
默认情况下只搜索访问缓冲区的文件。如果您传递一个前缀参数(可选的
allbufs
参数),那么它将搜索所有缓冲区(匹配缓冲区名称而不是文件名),但我未能在函数中传递该参数,因此忽略了前缀参数。我现在已经修好了。如果您希望反转该行为,请将
(多个出现在匹配缓冲区“*”regexp allbufs)
更改为
(多个出现在匹配缓冲区“*”regexp(而不是allbufs))