ElScreen と Term で疑似 GNU Screen を作る
昨日の記事(*)でEamcs 23 使えるようにしたので次は GNU Screen を Emacs で再現することにします。誤解がないように言っておきますが、 screen の本質は制限の多いリモートターミナルでもあのようなスクリーン切り替え機能やコピーモードが使えるところにあります。なので Emacs で screen を模倣したところで screen より優れるわけでも劣るわけでもありません。要するに別物と考える必要があります。
(*) http://dev.ariel-networks.com/Members/matsuyama/gentoo-emacs-23
では早速。
まず ElScreen をインストール。
% emerge elscreen
次に ElScreen の prefix-key を設定する必要がありますが、当方 screen でも C-z に prefix-key を割りあてているので、今回も C-z を prefix-key として使います。ちなみにデフォルトでは C-z は suspend-emacs に割り当てられていますが、 C-x C-z という別の割り当てがあるので困りません。まあそもそも suspend-emacs する時点で Emacsen として負けです。
.emacs:
(setq elscreen-prefix-key "\C-z") (setq elscreen-display-tab nil) (load "elscreen")
これで C-z c でスクリーン作成したり、 C-z n でスクリーン移動したりできます。
screen を捨てるにあたって重要になるのが、大体となるシェル機能ですが、僕の知るかぎり Emacs のシェル機能( shell とか eshell )はほとんど使いものになりません。設定はめんどうくさいし自動補完機能はわけわからないし、およそ正常に動作してるところを見たことがないのです(まあ zsh と比較するのが間違いかもしれませんが)。
そこで登場するのが term あるいは ansi-term で、こいつらは shell とか eshell と違って、キー入力をほとんど介入することなくそのままサブプロセスに送ります。そのためシェルの再現性は高いのですが、いかんせんキー入力を強奪しまくるので例えば C-p でバッファ移動できなくなったりします。また、先ほど割り当てた C-z も見事に強奪されちゃうのでこのままでは使いものになりません。なので以下のように設定します。
.emacs:
(add-hook 'term-mode-hook '(lambda () (define-key term-raw-map "\C-z" (lookup-key (current-global-map) "\C-z"))))
これで C-z のキー入力は current-global-map の C-z (つまり prefix-key )に割り当てられます。
C-p, C-n でバッファ移動したい場合は
.emacs:
(define-key term-raw-map "\C-p" 'previous-line) (define-key term-raw-map "\C-n" 'next-line)
とでもしておけば良いでしょう(必要に応じて設定していってください)。マークも設定できるので screen のコピーモードのような感じになります。一応 M-p と M-n がヒストリ選択になるので問題はないと思われます。
term で起動した場合、``C-c => C-x`` にマッピングされるのでそれがいやなら
(term-set-escape-char ?\C-x)
とするか ansi-term で起動するようにしましょう。
これで term 上でも一通りの作業ができるようになりました。 zsh もそのまま利用できるのでなかなか便利だと思います。
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/matsuyama/pseudo-screen-on-emacs-with-elscreen-and-term/tbping