我发现了一些nice post
几天前详细介绍了如何使用C-d
键杀死shell缓冲区。基本上,
在使用C-d
终止该过程后,您现在可以再次点按C-d
以进行杀戮
缓冲区。
我试图为term-mode实现类似的东西,但我遇到了一个
问题。在您杀死术语进程(使用通常的C-d
)后,似乎就是这样
缓冲区使用的键映射发生了变化,但我无法找到它是什么!
例如,启动term
命令(M-x term RET RET
),然后启动
立即点击C-d
。一旦进程停止,缓冲区仍会报告
在术语模式中,但它们使用的键映射既不是term-mode-map
也不是
term-raw-map
。
因此
我要么找出它正在使用的地图,所以我可以将C-d
绑定到kill-buffer
或者我需要另一种方法来在术语模式下使用C-d
来终止缓冲区。
答案 0 :(得分:2)
试试这个:
(defun delete-char-or-kill-terminal-buffer (N &optional killflag)
(interactive "p\nP")
(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 不能达到你想要的效果。
答案 1 :(得分:1)
虽然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)