2011/12/11

開発版GNU Screenのlayoutを使ってみよう

本記事は ターミナルマルチプレクサ Advent Calendar 2011 : ATND の11日目です。10日目は screenでマルチディスプレイモードを利用する - ヌキのやる気のないエンジニアブログ でした。screen ネタが増えてきて嬉しい今日この頃です。それでは 5日目の記事 の続きとして開発版 GNU Screen のレイアウトについて説明します。

レイアウトがどのようなものであるかについては、以前まとめた記事がありますのでそちらをご覧ください。

使用したことがないので確かなことは言えませんが、いくつかのページを確認したところでは tmux でレイアウトに相当する概念はペインになるでしょうか。

配置を自在に操作する

いきなりですが以下が現在使用しているレイアウトに関する設定です。Ctrl-A Ctrl-YCtrl-A y でレイアウト操作モード(仮称)に移行して、レイアウトに関する操作(作成、削除、選択など)を行い、最後にレイアウト一覧を表示します。

レイアウトの操作は layout サブコマンドを使用しますが、ウィンドウに対するものと同じようなコマンドが多く、割り当てるキーに悩むことになりますので2ストロークキーにまとめた方が使いやすいと思います。このヒントは Re: New screen features available から得たものですが、自分なりに考えてウィンドウに対する操作とほぼ同じキーを割り当てています。また、現時点ではレイアウトの番号や名前を captionhardstatus に指定できませんので、モード移行時や操作後にどのレイアウトにいるのかを明らかにしています。

# trigger for layout sub-commands
bind ^Y eval 'command -c layout' 'layout show'
bind y  eval 'command -c layout' 'layout show'

# create/remove layout
bind -c layout c eval 'layout new'    'layout show'
bind -c layout X eval 'layout remove' 'layout show'

# change the current layout title or number
bind -c layout A colon 'layout title '
bind -c layout N colon 'layout number '

# switch to the layout identified by number or title (not prefix of a title)
bind -c layout \' eval 'layout select' 'layout show'

# switch to other layout
bind -c layout n eval 'layout next'     'layout show'
bind -c layout p eval 'layout prev'     'layout show'
bind -c layout 0 eval 'layout select 0' 'layout show'
bind -c layout 1 eval 'layout select 1' 'layout show'
bind -c layout 2 eval 'layout select 2' 'layout show'
bind -c layout 3 eval 'layout select 3' 'layout show'
bind -c layout 4 eval 'layout select 4' 'layout show'
bind -c layout 5 eval 'layout select 5' 'layout show'
bind -c layout 6 eval 'layout select 6' 'layout show'
bind -c layout 7 eval 'layout select 7' 'layout show'
bind -c layout 8 eval 'layout select 8' 'layout show'
bind -c layout 9 eval 'layout select 9' 'layout show'

# continuous switch to other layout
bind -c layout ^N eval 'layout next' 'command -c layout' 'layout show'
bind -c layout ^P eval 'layout prev' 'command -c layout' 'layout show'

レイアウト操作を試してみよう

上記設定に続いて、以下を記述したファイルを用意してください。

source ~/.screenrc

# create window
screen 0
screen 1
screen 2
screen 3
screen 4

# create layout
layout new 0:layout0:vertical
layout new 1:layout1:horizontal
layout new 2:dummy
layout new 3

# setup layout0
layout select 0
split -v
select 0
focus right
split
split
select 1
focus next
select 2
focus down
select 3
split -v
focus bottom
select 4
focus up

# setup layout1
layout select layout1:horizontal
select 2
split
focus down
select 1
split -v
split -v
split -v
focus next
select 0
focus right
select 3
focus bottom
select 4
resize -v -l 20%
focus top

# setup layout2
layout remove dummy
layout select 3
layout number 2
layout title single

select 2
stuff "echo here is current window\n"

# select layout0
layout select 0
layout show
つぎにそのファイルを指定して screen を起動してください。
% ~/local/bin/screen -c ./.screenrc.advent.layout

すると次のように領域を分割したレイアウト0が表示されます。

ここで Ctrl-A Ctrl-Y 1 と続けて入力するとレイアウト1が表示されます。(Ctrl-A はお使いの .screenrc で escape で割り当てているものに読み替えてください)

つぎに Ctrl-A Ctrl-Y ' と入力して、プロンプトで 2 を入力すると領域が一つだけのレイアウト2が表示されます。 最後に、次のような操作をしてからアタッチし直してみてください。デタッチ時のレイアウト0が表示されます。

  1. Ctrl-A Ctrl-Y でレイアウト操作モード(仮称)に移行
  2. Ctrl-P で一つ前のレイアウト(レイアウト1)を選択(モードはまだ継続中)
  3. Ctrl-P でもう一つ前のレイアウト(レイアウト0)を選択(モードはまだ継続中)
  4. ESC でモードを終了
  5. Ctrl-A d でデタッチ

おわりに

レイアウトについてご理解いただけましたでしょうか?ローカル端末だけで GNU Screen を使用しているときでも、「あーこの分割した領域ちょっと狭いんで最大化(only)したいわー。でもそうするとまたこの分割状態に戻すのかったるいわー」というときに、ひとつのウィンドウだけのレイアウトに切り替えられるだけでもかなり違います。そして例に挙げたように、作業でよく使うレイアウトやウィンドウ、その下で実行するコマンドを screen 初回起動時に一括して設定しておくと、素早く端末作業に取りかかれますのでオススメです。

領域の縦分割(split -v)とレイアウト(layout)、この2つの新機能だけでも開発版 GNU Screen を使う価値は十分あります。これらに比べると小さな変更ですが、他にも便利なところがいくつかありますので、そのあたりを紹介してゆければと思います。

0 件のコメント:

コメントを投稿