内容

Emacs上で動くterminal emulatorのmulti-termでキーボードを使ったコピーを便利にする

動機

terminal emulator のコピー機能の貧弱さがひどい。この(個人的に)CUI全盛の時代にコピーにマウスが必要なのが気に食わない。 あと、Ctrl-,とかを無視するのが許せない。(今回関係ないけど) tmuxも試してみたけど、OSとのクリップボードの共有が単一のキーバインドでできなくて後一歩。(ペースト側はできるのに...)

方法

Emacs上のterminalでモードを切り替えて一時的にターミナルのバッファをfundamental-modeに切り替えることでコピーを容易にしてみた。 (書き変え防止のためにview-modeも設定してる)

;; multi-term.el
(require 'multi-term)
(setenv "LC_ALL" "C")
(defvar multi-term-cursor-point)
(setq multi-term-program shell-file-name)
(add-to-list 'term-unbind-key-list "C-v")
(add-hook 'term-mode-hook
                    '(lambda ()
                         (define-key term-raw-map (kbd "C-y") 'term-paste)
                         (define-key term-raw-map (kbd "ESC ESC") 'term-send-raw)
                         (define-key term-raw-map [delete] 'term-send-raw)
                         (define-key term-raw-map (kbd "C-v") nil)
                         (define-key term-raw-map (kbd "C-v C-v") 'toggle-term-view)
                         (define-key term-raw-map (kbd "C-r") 'term-send-reverse-search-history)
                         (define-key term-raw-map (kbd "C-p") 'term-send-up)
                         (define-key term-raw-map (kbd "C-n") 'term-send-down)
                         (define-key term-raw-map (kbd "C-c C-z") 'term-stop-subjob)))

(defun toggle-term-view () (interactive)
    (cond ((eq major-mode 'term-mode) 
                 (fundamental-mode) 
                 (view-mode-enable)
                 (local-set-key (kbd "C-v C-v") 'toggle-term-view)
                 (setq multi-term-cursor-point (point)))
                ((eq major-mode 'fundamental-mode) 
                 (view-mode-disable)
                 (goto-char multi-term-cursor-point)
                 (multi-term-internal))))


(set-language-environment  'utf-8)
(prefer-coding-system 'utf-8)
(setq file-name-coding-system 'utf-8)
(setq locale-coding-system 'utf-8)

toggle-term-view という関数がメイン。 設定するときはterm-modeだけじゃなくて、切り替え先のfundamental-modeでも切り戻すためのキーバインド設定が必要。つまり、このキーバインドを変更する場合には二箇所での変更が必要になるので注意。私はC-v,C-vに設定してしまっているけれど、普通だとC-vは割り当て済みのキーバインドなのでその点も要注意。 これをしておくと、ターミナルのログを普段の編集と同じように操作して必要な情報をコピーしてくることがキーボードのみでできるようになる。

他のところはおまけというか、ノイズに近いのだけど、ぺたっと貼って動かすにはあったのが使いやすいかもしれないと思って。

あと、multi-termではEmacsのキーバインドと衝突しないようにターミナルエミュレータ上では C- で使う機能が M- に振り替えられてるのだけど、モードを切り替える前提なら衝突するものはターミナル機能を優先すれば良いのでmulti-termのオリジナルのキーバインドから書き変えてる。

一部Esc Esc とか C-c C-zのような例外はあるので本当にterminal emuratorと同じ感覚では使えないかも。 (C-c C-c もだけどこれはmulti-termでの設定を使ってるので上のキーバインド設定にはない)

おまけ

multi-term の使いかたとか設定とかはこのあたりがとても参考になる。

Emacs 上で快適に Bash や Zsh を利用する設定 :紹介マニア

AnsiTerm Hints :EmacsWiki