在emacs中的所有打开的缓冲区上运行keep-lines命令

时间:2013-11-21 04:19:50

标签: emacs buffer emacs24

我在emacs个缓冲区中打开了很多文件。现在我想在所有这个打开的缓冲区上运行keep-lines命令。

这样做的步骤是什么?

我正在使用emacs版本24.3。

2 个答案:

答案 0 :(得分:1)

迭代所有打开的缓冲区:使用dolist迭代buffer-list(或您喜欢的任何合适的子集)。使用with-current-buffer作为当前迭代的缓冲区,并在其中调用keep-lines

您可以调整它以获得更大的灵活性(例如,在keep-lines调用中):

(defun foo (regexp)
  (interactive (list (read-regexp "Regexp: ")))
  (dolist (buf  (buffer-list))
    (goto-char (point-min)) ; Is this what you want, to start at bob?
    (with-current-buffer buf (keep-lines regexp))))

但是,buffer-list会返回许多您可能不希望这样做的缓冲区。根据需要对其进行过滤,例如,使用remove-if(在cl-lib.el)或其他任何内容。

如果只处理文件缓冲区,则可能需要使用find-file-noselect。根据您的真实需要,有多种可能性。

你可以练习这样的东西:

(defun foo (regexp)
  (interactive (list (read-regexp "Regexp: ")))
  (dolist (buf  (buffer-list))
    (with-current-buffer buf
      (when (y-or-n-p (format "Do it to `%s'? " buf))
        (goto-char (point-min))
        (keep-lines regexp)))))

然后您可能想要考虑是否还要保存修改后的缓冲区等。

答案 1 :(得分:1)

对于更加手动控制的方法,您可以使用ibuffer

  • M-x ibuffer RET
  • 标记一些缓冲区
  • E (keep-lines "pattern") RET

或者,根据Drew的建议,(progn (goto-char (point-min)) (keep-lines "pattern"))

您可以在ibuffer中使用许多不同的标准来标记缓冲区。浏览“标记”菜单,查看 C-h m 了解详情。