使用C-d终止* terminal *缓冲区

时间:2013-01-21 17:40:33

标签: emacs keyboard

我发现了一些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来终止缓冲区。

2 个答案:

答案 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)