2

数日前に、キーを使用してシェル バッファーを強制終了する方法を詳しく説明している素敵な投稿を見つけましたC-d。基本的に、プロセスを強制終了した後、もう一度タップしてバッファーを強制終了することもC-dできます。C-d

term-mode に似たようなものを実装しようとしていましたが、問題が発生しました。process という用語を (通常の で) kill した後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 に答える