>我发现了一些不错的帖子几天前详细介绍了如何使用 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)