Emacs修改退出窗口以删除缓冲区而不仅仅是埋葬它


6

我想让Emacs不仅仅是埋葬一个缓冲区,而是当我按下q一个*Completions*/*Help*/etc缓冲区时也杀了它。我无法使用substitute-key-definition函数。我在OSX上运行Emacs24。

这就是我所拥有的:

(substitute-key-definition
        'quit-window '(lambda () (interactive) (quit-window "KILL")) global-map)

你有什么特别的理由想要杀死它吗?
NN

1
@NN例如,一旦我看到完成,我不需要它在退出窗口后仍然打开它。
bneil

Answers:


7

另一个答案实际上给出了一些不兼容的行为。考虑一种情况,你已经将一个框架拆分为两个窗口,然后打开一个帮助缓冲区并退出它。quit-window很聪明,知道它不应该杀死窗口,只是缓冲区。它实际上甚至还有一些更聪明的技巧,所以我们最好的选择是使用它并稍微调整一下。这是实现您想要的简单方法:

(defadvice quit-window (before quit-window-always-kill)
  "When running `quit-window', always kill the buffer."
  (ad-set-arg 0 t))
(ad-activate 'quit-window)

1
不要这样做。这样的建议quit-window很糟糕,几乎与重新定义它一样糟糕。它很可能会破坏Emacs的扩展和部分,例如[本例](github.com/joaotavora/sly/pull/143#issuecomment-361030487)。至少在called-interactively-p那里添加一个电话。
Joao Tavora

1
嗨Joao,感谢您的反馈。虽然我很欣赏你评论的基础,但我每天都使用这个评论至少六年,从未遇到过问题。我很抱歉这会导致你的项目出现虚假的GitHub问题,但是Emacs用户会建议并甚至重新定义自己的环境,这就是野兽的本质。鉴于这里的风险很低,我对于称之为“不好”犹豫不决 - 尽管它当然不太理想。我很感激添加的建议called-interactively-p
camdez

1
对不起@camdez,但你不能说服我,因为它对你有用,打破一个通用功能的合同并不是坏事和/或Emacs体验的一部分。如果有的话,零星破坏的东西比经常和可靠破坏的东西要糟糕得多。Emacs拥有足够的自定义手段而不会破坏其API。众所周知,许多人滥用Lisp的灵活性完全是另一回事。我或任何其他Emacs维护者可以为您提供更多示例,其中重新定义和其他defadvice呼叫造成了混乱。
Joao Tavora

2

重新定义功能似乎对我有用,即

(defun quit-window () 
 "modified quit window"
 (interactive)
 (kill-buffer-and-window)
 )

在您按q之前退出缓冲区之后,我永远不会理解仍然可以使用完成或帮助缓冲区的目的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.