用 C-d 杀死 *终端* 缓冲区



>我发现了一些不错的帖子几天前详细介绍了如何使用 C-d 键杀死 shell 缓冲区。基本上使用C-d杀死进程后,您现在可以再次点击C-d以杀死缓冲区。

我试图为术语模式实现类似的东西,但我遇到了一个问题。在您杀死术语过程(通常的C-d)之后,似乎缓冲区使用的键映射发生了变化,但我找不到它是什么!

例如,启动term命令 ( M-x term RET RET ),然后立即击中C-d.一旦进程死了,缓冲区仍然报告正在在术语模式下,但他们使用的键盘映射既不term-mode-map也不 term-raw-map .

所以
我要么需要找出它正在使用什么地图,以便我可以将C-d绑定到kill-buffer
或者我需要另一种方法来终止C-d在术语模式下的缓冲区。

试试这个:

(defun delete-char-or-kill-terminal-buffer (N &optional killflag)
  (interactive "pnP")
  (if (string= (buffer-name) "*terminal*")
  (kill-buffer (current-buffer))
(delete-char N killflag)))
(global-set-key (kbd "C-d") 'delete-char-or-kill-terminal-buffer)

*terminal*进程退出时,缓冲区的模式切换到基波,这就是 C-d 不执行您想要的操作的原因。

虽然 Trey Jackson 的版本是绝对正确的,但下面是另一个不需要知道缓冲区名称的版本。这样就可以更轻松地管理多个终端缓冲区。

(defun term-handle-exit--close-buffer (&rest args)
  (when (null (get-buffer-process (current-buffer)))
    (insert "Press <C-d> to kill the buffer.")
    (use-local-map (let ((map (make-sparse-keymap)))
                     (define-key map (kbd "C-d")
                       (lambda ()
                         (interactive)
                         (kill-buffer (current-buffer))))
                     map))))
(advice-add 'term-handle-exit :after #'term-handle-exit--close-buffer)

最新更新