如何在Emacs中不需要确认即可杀死缓冲区?

30

如何在不被询问的情况下在emacs中销毁缓冲区。

5个回答

33

如果当前缓冲区未被修改,则此操作将无需确认即可删除当前可见缓冲区。但如果缓冲区已被修改,则需要您回答 y/n。

(global-set-key [(control x) (k)] 'kill-this-buffer)

当在emacsclient中使用时,这会产生有趣的副作用。当然,出现错误是有原因的,但我希望能够获得一致的体验:@Noufal的解决方案更好。 - mike3996
2
Progo,有哪些副作用? - Rotsor
根据函数的文档,它只能从菜单栏可靠地调用,否则它可能会随机且悄无声息地不起作用。我观察到了这一点,并不得不像下面展示的那样移动到(kill-buffer (current-buffer)) - 9000
我仍然在helm缓冲区中看到这条消息:Buffer *helm for files*已被编辑。是否要杀死?(是或否) - alper

6

我使用这个

(defun volatile-kill-buffer ()
   "Kill current buffer unconditionally."
   (interactive)
   (let ((buffer-modified-p nil))
     (kill-buffer (current-buffer))))

(global-set-key (kbd "C-x k") 'volatile-kill-buffer)     ;; Unconditionally kill unmodified buffers.

如果不修改缓冲区,它将被清空。


5
“(let ((buffer-modified-p nil))”没有任何效果。它是一个函数,你不能用“let”来绑定它。 - nschum
好的观点。我从某个地方学到了这个,但并没有真正费心编辑它。 - Noufal Ibrahim
我该如何为(kill-matching-buffers "*helm")执行此操作? - alper

6

好的,我在Emacs手册中进行了一些调查,并找到了一个可行的解决方案(截至Emacs 23.4.1)。它与Noufal的解决方案几乎完全相同:

(defun kill-this-buffer-volatile ()
    "Kill current buffer, even if it has been modified."
    (interactive)
    (set-buffer-modified-p nil)
    (kill-this-buffer))

我将函数稍微改名,使其更接近于kill-this-buffer
显然,EmacsWiki上有一个关于此主题的页面,网址为http://www.emacswiki.org/emacs/KillBufferUnconditionally,但该代码只是 Noufal 的一份副本。

4

如果您想将其绑定到某个键,请使用(kill-current-buffer)而不是(kill-this-buffer)。有关(kill-this-buffer)的详细信息,请参阅文档。

...

该命令只能从菜单栏可靠地调用,否则它可能会决定默默地不执行任何操作。

(kill-current-buffer)

...

这类似于“kill-this-buffer”,但它不必通过菜单栏调用,并且不考虑菜单栏的框架。

因此,我会在我的init.el中放置以下内容:

(global-set-key (kbd "C-x k") 'kill-current-buffer)

这至少在emacs 26.1中有效。


2

我使用以下代码 -- 与Noufal的解决方案不同,它会保存缓冲区然后杀掉它。它还会删除窗口,当您有多个子窗口时这很重要 -- 默认情况下,它将删除窗口而不是切换到其他缓冲区。(当然,为了方便使用,您需要将某些键绑定到它上面。)

;; Kill the current buffer immediatly, saving it if needed.
(defvar kill-save-buffer-delete-windows t
  "*Delete windows when `kill-save-buffer' is used.
If this is non-nil, then `kill-save-buffer' will also delete the corresponding
windows.  This is inverted by `kill-save-buffer' when called with a prefix.")
(defun kill-save-buffer (arg)
  "Save the current buffer (if needed) and then kill it.
Also, delete its windows according to `kill-save-buffer-delete-windows'.
A prefix argument ARG reverses this behavior."
  (interactive "P")
  (let ((del kill-save-buffer-delete-windows))
    (when arg (setq del (not del)))
    (when (and (buffer-file-name) (not (file-directory-p (buffer-file-name))))
      (save-buffer))
    (let ((buf (current-buffer)))
      (when del (delete-windows-on buf))
      (kill-buffer buf))))

不要忘记将(global-set-key (kbd "C-q") kill-save-buffer')绑定到C-q(或其他键)。 - ppr
是的,我确实说过“你需要将一些键与它绑定”; 但使用 C-q 是个坏主意,因为它是 Emacs 中非常常见的绑定.... - Eli Barzilay
这段代码对你还有效吗?对我来说,它保存了缓冲区并将其关闭,但不再关闭emacs窗口。 - ppr
我仍然使用几乎相同的代码,只是在保存缓冲区的条件中添加了(buffer-modified-p) - Eli Barzilay
对我来说,下面的代码保存并退出缓冲区,但不关闭窗口(emacs保持打开状态)。另外,你能在你的帖子中添加(buffer-modified-p)代码吗? - ppr

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