わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

mintty+screenで巡回

俺流・シェルとEmacsの使用方法で,巡回の仕方を書いたのですが,Cygwin 1.7ではckが使えないので,minttyで同じようにシェルを行き来する方法を,検討してみました.
やはりscreenですね.minttyでも使用します.ただしプレフィクスをC-pとするのでは,Linuxサーバに入ってからscreenすると大変なことになるので,

  • LinuxのscreenではC-pのまま
  • minttyのscreenではC-l(Ctrlを押しながらL)

としました.C-lは,シェルにもEmacsでもほとんど使いませんし,もし必要になれば,2回,連打すればいいのです.
目標とする使い方は,以下のとおり:

少しだけ,絵を変えています.具体的には,「Linux A screen 0$」と「Linux B screen 0$」の下に,長方形があります.下側の1枚1枚は,mintty+screenが管理するシェルです.横方向に巡回するのは,Linux側で管理されているシェルです.
準備ですが,まず(screenなしで)minttyを起動します.which screenで,コマンドが存在することを確認してから,

$ cp /etc/screenrc ~/.screenrc
$ echo 'escape ^l^l' >> ~/.screenrc
$ echo 'msgwait 2' >> ~/.screenrc
$ echo 'shell zsh' >> ~/.screenrc
$ echo 'defscrollback 2000' >> ~/.screenrc

として,screenを実行すると,うまくいきました.
C-l cで,2枚目のシェルを起動し,sshLinuxサーバに入ってからscreen -xRとすると,キープしていた仮装端末が出てきました.そして,リモートホスト内のシェルはC-pで,ローカルホスト内のシェルはC-lで巡回できました.
起動方法にも,手を加えましょう.zshの上でscreenを開いてzshを出すというのは,screenの下のzshが無駄です.といってログインシェルをshにするのは,素っ気ないし…
mintty + zshを見直しまして,この~/bin/mintty.shの,最後の行を書き換えてみました.

#!/bin/sh
ZDOTDIR=$HOME/.zsh; export ZDOTDIR
CYGWIN=nodosfilewarning; export CYGWIN
LANG=ja_JP.UTF-8; export LANG
LC_ALL=$LANG; export LC_ALL
PATH=/usr/local/bin:/usr/bin:/usr/sbin:$PATH; export PATH

#exec /usr/bin/zsh
exec /usr/bin/screen -xR

「-xR」は,Linuxのscreenでも指定しているオプションで,「screenの仮装端末があればそこに接続し,なければ新規に接続する」というのと「screenの仮装端末に二重接続(多重接続?)して,そのいずれからもキー入力ができる」というものです.詳細はhttp://www.linux.or.jp/JM/html/GNU_screen/man1/screen.1.htmlへ.
動作確認をします.minttyがない状態で,ランチャのminttyのアイコンをクリックすると,問題なく起動しました.もう一回,クリックすると,またウィンドウが出て…表示内容が連動しています.成功です.
安心して,一つを終了したら,あっと,もう一つのウィンドウも消えてなくなった!? …exitコマンドを実行したので,シェルがなくなったのでした.
動作確認をやり直し.2つ,ウィンドウを立ち上げて,いろいろ打ち込んでから,一方の右上バッテンをクリックすると…そっちは消えて,もう一つは何もなかったかのように利用可能です*1

*1:mintty+screenのウィンドウをすべてなくしてから,再度立ち上げても,終了する前の状態で端末が出てきました.