如何在Emacs中同时保存多个自选缓冲区?

16
当我按下 C-x ssave-some-buffers)或者 C-x C-csave-buffers-kill-terminal)时,Emacs 会逐个显示修改过的缓冲区名称,并询问每个缓冲区要进行哪种操作(保存、查看差异、跳过等)。一个一个按下 y 很慢。按下 ! 不让你看到正在保存哪些缓冲区。

如何让所有修改过的缓冲区名称先显示出来,以便我可以将其中一些标记并快速保存所有其他缓冲区?


3
您希望的不是保存所有已修改的缓冲区。标题有误导性。 - Bahbar
我编辑过了。现在应该不那么令人困惑了。 - zrajm
6个回答

17

C-x C-bM-x list-buffers)会显示所有缓冲区的列表。修改过的缓冲区旁边会有一个*。您可以通过按下s来标记缓冲区以进行保存。完成后,按下x以保存您标记的所有缓冲区。

不幸的是,据我所知,没有办法仅显示未保存的缓冲区或对它们进行排序以便它们都位于顶部。

(实际上,我更喜欢使用M-x ibuffer而不是M-x list-buffers,但是ibuffer提供了类似的功能。)


16

在Emacs 23中,使用ibuffer:

  • 执行'M-x ibuffer'(打开缓冲区列表)
  • 同时按下'*u',标记所有未保存的缓冲区
  • 按下'S'保存所有标记的缓冲区

奇怪的是,*u不能标记像scratchcompilation等“特殊”缓冲区。我想这是因为它们的名称被正则表达式过滤了...


2
回复:*scratch*等,它只是不会标记没有可保存的buffer-file-name的“未保存”缓冲区。 - phils

4

使用ibuffer,它应该随着所有的最新版本的Emacs一起提供。将以下内容放入您的.emacs文件中:

(autoload 'ibuffer "ibuffer" "" t)
(global-set-key (kbd "C-x C-b") 'ibuffer)


(defun my-ibuffer-load-hook ()
  "Hook for when ibuffer is loaded."

  (define-ibuffer-filter unsaved-file-buffers
   "Only show unsaved buffers backed by a real file."
 (:description "unsaved file buffers")
 (and (buffer-local-value 'buffer-file-name buf)
   (buffer-modified-p buf)))

  (define-key ibuffer-mode-map (kbd "/ *") 'ibuffer-filter-by-unsaved-file-buffers)
  )

;; (add-hook 'ibuffer-load-hook 'my-ibuffer-load-hook)

(eval-after-load 'ibuf-ext '(my-ibuffer-load-hook))

然后使用 C-x C-b 命令打开 ibuffer 列表,输入 / * 来只显示未保存的真实文件缓冲区(这样您就不会在列表中看到例如 *scratch*)。使用 m 标记所需的缓冲区,然后使用 S 保存它们。


4

标题中问题的答案是传递一个参数给save-buffers-kill-emacs(或-kill-terminal),即使用键盘组合C-u C-x C-c,它会自动保存所有缓冲区并退出(或者使用C-u C-x s只是自动保存所有缓冲区)。


为什么我要杀掉emacs? - Ricky Robinson

2

我已经在谷歌上搜索了这个问题,并在这里找到了解决方案http://johntellsall.blogspot.com.es/2013/03/emacs-save-all-modified-buffers.html

你需要将以下配置添加到你的~/.emacs.d/init.el emacs配置文件中

(global-set-key 
 (kbd "M-*")
 (lambda ()
   (interactive)
   (save-some-buffers t)))

保存并评估init.el文件的缓冲区(M-evalb-buffer),然后当您想要保存所有修改后的文件时,只需按下带有“*”的Meta键,如第二行所示。我希望这个解决方案能够奏效!Juan

2

在emacs 23中

  • C-x C-b (M-x list-buffers) 查看缓冲列表
  • m 标记需要保存的缓冲区
  • S 保存已标记的缓冲区
  • u 取消单个缓冲区的标记,或使用M-x dired-unmark-all-marks取消所有标记

这是正解,适用于正文中的问题(而不是标题中误导性的问题)。 - blueFast

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接