2

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

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

例如,启动term命令 ( M-x term RET RET) 然后立即点击C-d。一旦进程终止,缓冲区仍报告处于术语模式,但它们使用的键映射既不是term-mode-map也不是 term-raw-map

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

4

2 回答 2

3

试试这个:

(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不做你想做的事。

于 2013-01-21T17:58:10.993 回答
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)
于 2015-08-28T14:38:20.597 回答