【问题标题】:Kill the *terminal* buffer with C-d用 C-d 杀死 *terminal* 缓冲区
【发布时间】:2013-01-21 17:40:32
【问题描述】:

我找到了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 终止缓冲区。

【问题讨论】:

    标签: emacs keyboard


    【解决方案1】:

    试试这个:

    (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 不执行您想要的操作的原因。

    【讨论】:

      【解决方案2】:

      虽然 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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-03
        相关资源
        最近更新 更多