いものやま。

雑多な知識の寄せ集め

Screenのススメ。

プログラムをするとき、長時間を過ごすことになる端末。
このとき、一つのウィンドウ、一つのディレクトリだけで作業していると、何かと不便。
かといって、何個もウィンドウを開いたりすると、煩雑。

Macのターミナルの場合、タブを使うことも出来るけど、もっといいのがScreenを使う方法。

Screen - GNU Project - Free Software Foundation

Screenを使うと、一つのウィンドウでいくつもの仮想端末を使うことが出来るようになる。
端末を行き来するのも簡単。
さらに、スクロールやコピペをすることも出来たりする。
そして、これらをすべてキーボードから出来るというのも嬉しい。

ということで、Screenの使い方を説明してみる。

Screenの設定ファイル

まずは設定ファイルから。
というのも、デフォルトの状態だと、かなり使いにくいので。

自分の設定ファイル(.screenrc)は、以下のようになっている:

autodetach on
allpartial off
bell_msg "^G"
defkanji utf-8
defencoding utf-8
encoding utf-8 utf-8
defscrollback 10000
escape ^Jj
startup_message off
vbell off
#caption always "%{= wb} %-w%{=bu dr}%n %t%{-}%+w %= %{=b wk} [%l] %{=b wb}%y/%m/%d(%D) %{=b wm}%c"
caption always "%{= wb} %-w%{=bu dr}%n %t%{-}%+w %= %{=b wb}%Y-%m-%d(${WEEK}) %{=b wm}%c"
bind n screen
bind h prev
bind j next
bind l windowlist

当時、ネットで見た情報をほぼそのまま使ったので、今となっては設定の意味がところどころ分からない・・・(使い始めたのは2010年頃のはず)
やっぱりちゃんとどこかにメモを残しておかないとダメだね。

とりあえず、分かるところだけ。

画面の再描画

まず、画面の再描画に関する設定。

allpartial off

これがonになっていると、画面の再描画が部分的にしか行われなくなる(っぽい)。
CygwinでScreenを使っていたとき、この設定がないと変な描画になっていたはず。(うろ覚え)

エンコードの設定

次はエンコードの設定。

defkanji utf-8
defencoding utf-8
encoding utf-8 utf-8

これでUTF-8を使うようになる。

スクロールの設定

Screenでは、lessなどのページャを使わなくても、画面をスクロールして過去の結果を見ることが出来るようになっている。
次のは、そのスクロールに関する設定。

defscrollback 10000

これで、スクロールできる行数が10000行になる。(デフォルトは100行っぽい)

エスケープ文字の設定

Screenの操作(仮想端末の切り替えなど)を行う場合、デフォルトだとCtrl-aを押した後、何かキーを押すことになる。
ただ、Ctrl-aって、すごく押しにくい。
そこで、この設定を変更する。

escape ^Jj

こうすることで、Ctrl-jを押した後に何かキーを押してScreenを操作するようになる。
(Vi使いならこれで問題ないけど、Emacs使いだとちょっと問題があるみたい)

スタートアップメッセージの設定

Screenでは、スタートアップのときにコピーライトが表示されるっぽい。(次の設定をしているので、見た記憶がない・・・)

startup_message off

これでスタートアップメッセージが表示されないようになる。

タブ表示

デフォルトの状態だと、どの仮想端末を使っているのかが分かりにくい。
そこで、次の設定をしておくと、仮想端末がタブのように表示されるようになるので、使いやすくなる。

#caption always "%{= wb} %-w%{=bu dr}%n %t%{-}%+w %= %{=b wk} [%l] %{=b wb}%y/%m/%d(%D) %{=b wm}%c"
caption always "%{= wb} %-w%{=bu dr}%n %t%{-}%+w %= %{=b wb}%Y-%m-%d(${WEEK}) %{=b wm}%c"

なお、1行目はコメントアウトしてるので、実際には不要。
ネットで見つけたのは1行目の方で、普通はこのコメントアウトを外して使えばいいはず。

ただ、環境変数の設定によっては、1行目の方だと曜日が正しく表示されないことがある。(自分の環境だとダメだった)
ソースを確認したときのことを思い出すと、Screenのこの表示がマルチバイト文字に対応していなかったのが原因だったはず。

そこで、自分は2行目の方に変更した。
ただし、この場合、WEEK環境変数を適切に設定してある必要がある。
これについては後述。

キーバインドの変更

最後にキーバインドの変更。

bind n screen
bind h prev
bind j next
bind l windowlist

これで、キーバインドが次のようになる:

  • 新しい仮想端末の作成
    Ctrl-j n
  • 前の仮想端末へ切り替える
    Ctrl-j h
  • 次の仮想端末へ切り替える
    Ctrl-j j
  • 仮想端末のリストを表示する
    Ctrl-j l

Bashの設定ファイル

Bashの設定ファイル(.bashrc)も修正。

まず、先ほどのタブ表示がちゃんと働くようにするために、次のaliasを設定。

alias screen='WEEK=`LANG=C date "+%a"` screen'

そして、ウィンドウを開いたときに自動的にscreenが立ち上がるように、次のようにしている:

if [ $SHLVL == 1 ]
then
    screen
fi

なお、Cygwinを使っていたときは、次のようにしていたはず:

if [ $SHLVL == 2 ]
then
    screen
fi

Screenの操作

さて、ここからが肝心のScreenの操作。

新しい仮想端末の作成

新しい仮想端末を作るには、Ctrl-j nとする。
(なお、デフォルトのキーバインドCtrl-a c

仮想端末のタイトルの変更

仮想端末がたくさん増えると、どの仮想端末で何をやっていたのかが分からなくなったり。
そんな場合、仮想端末のタイトルを変更しておくと、分かりやすい。

仮想端末のタイトルを変更するには、Ctrl-j Aとする。
そうすると、タイトルの入力を求められるので、そこで設定したい文字列を入力すれば、仮想端末のタイトルが変更される。

仮想端末の切り替え

仮想端末には数字の番号がついている。
特定の番号の仮想端末に切り替えるには、Ctrl-j 数字とする。
(デフォルトのキーバインドだとCtrl-a 数字

また、Ctrl-j hとすれば、一つ前の数字の仮想端末、Ctrl-j jとすれば、一つ後の数字の仮想端末に切り替わる。
(デフォルトのキーバインドだと、それぞれCtrl-a Ctrl-pCtrl-a n

仮想端末の破棄

仮想端末を破棄するには、単にShellを終了すればいい。
なので、exitコマンドを実行したり、あるいはCtrl-dでもいい。

スクロール

仮想端末でスクロールを行うには、Ctrl-j [、あるいは、Ctrl-j Ctrl-[Ctrl-j <ESC>とする。
(デフォルトのキーバインドだとCtrl-a [Ctrl-a Ctrl-[Ctrl-a <ESC>
こうするとコピーモードになって、仮想端末のスクロールが行えるようになる。

スクロール中のカーソル操作はほぼViと同じ。
以下のキーで大体事足りると思う:

  • jkhl:下、上、左、右へカーソルを移動する。(必要ならスクロールする)
  • 0$:カーソルを行頭、行末へ移動する。
  • Ctrl-f:1画面分下へスクロール
  • Ctrl-b:1画面分上へスクロール
  • H;カーソルを画面の1行目へ
  • M:カーソルを画面の中央の行へ
  • L:カーソルを画面の一番下の行へ
  • /検索したい文字列:下方向へ指定した文字列を検索
  • ?検索したい文字列:上方向へ指定した文字列を検索
  • n:同じ方向へ前回検索したのと同じ文字列を検索
  • /:前回検索したのと同じ文字列を下方向へ検索
  • ?:前回検索したのと同じ文字列を上方向へ検索

スクロールを止めるにはCtrl-[もしくは<ESC>を押せばいい。

コピー&ペースト

コピーモードで<Space>を押すと、コピーの範囲選択が始まる。
そして、再度<Space>を押すと、選択された範囲がScreenのバッファにコピーされる。

Screenのバッファにコピーされた内容をペーストするには、Ctrl-j ]とする。
(デフォルトのキーバインドだとCtrl-a ]


自分が主に使う機能はここまで。

ただ、他にも

  • 画面分割
  • デタッチ、再アタッチ

などの機能もScreenにはあるので、気になる人は調べてみるといいと思う。

一応、自分がこれらの機能を使っていない理由を書いておくと、以下のとおり:

  • Viで複数ファイルを編集したい場合、Viで画面を分割するので、Screenでも画面分割をすると混乱する。
    そして、大抵は画面分割しなくても、仮想端末の切り替えやコピー&ペーストで事足りる。
  • デタッチや再アタッチは、リモートに接続して使う場合は有益だけど(サーバの電源は普通落とさないのでプロセスがちゃんと残ってる)、自分の場合、ローカル環境でScreenを使っているので、あまり意味がない(電源を切ってしまえば当然プロセスは残らない)。

今日はここまで!