screenの設定

MacBook内のApacheTracを動かそうとしてはまっている山葵です。
Tracのこともおいおい書きたいのですが、今回はScreenについてです。

Screenとは

UNIXLINUXでは単一のコンソールだけでは、足りないことがあります。
コンソール上でパッケージ管理システムでインストール作業などを行っている場合に
他の作業などを行いたい場合にはAlt+→などで他のコンソール画面を呼び出すこともできますが。
X上でのktermなどではそれができません。
screenはこのような場合に、単一のコンソール上で仮想画面を複数操作するためのソフトウェアです。

インストール方法

すでに、さくらインターネットへのインストール方法は書きました。
BSD、Linuxでのインストール方法は以下のとおり。
あ、うろ覚えなので間違ってるかもです(ぇ

  1. FreeBSD,OpenBSD
# port install screen
  1. Debian,Ubuntu
# aptitude install screen
  1. Fedora,CentOS
# yum install screen

で、実際の設定について

設定ファイルはホームディレクトリ(~/)に.screenrcを作成しましょう。

エンコーディング

まず、使用する文字コードの指定をします。
文字コードには、euc、jis、sjisutf-8などがあります。

defencodig utf-8
Prefixキーの設定

次にPrefixキーの設定を行います。
Screen起動後に、Screenの操作を行うためには、そのことをscreenに教えてあげるために
Prefixキーを打つ必要があります。
初期設定ではPrefixキーは!^Aa(Control+a)に割り当てられていますが、
僕はEmacsユーザなので、このキーをscreenに取られると困ることが多々あるので、
他のPrefixキーを割り当てます。
例えば、Control+zとか。

escape ^Zz
スタートアップメニューの削除

Screen起動後に端末に表示されるメッセージの表示がうざい人は消しましょう。

startup_message off
デタッチ

現在利用中のScreenを中断することをデタッチ(中断)、
再開することをアタッチ(再開)と呼びます。
不安定な端末などをScreen上に表示している場合などには、
端末が突然終了する場合もあり、そのような場合には自動的に端末を中断状態にしたいです。

autodetach on

現在実行しているscreenから抜けるには、C-z dとタイプします。
デタッチしたscreenにもう一度アタッチすることで前の状態に戻る。

アタッチ

一度抜けたscreenを再度起動するには以下のコマンドを実行する。

$ screen -x (screenのプロセス番号)

screenプロセスが1つしかない場合は、プロセス番号は省略可能です。

プロセス番号の確認

端末のプロセス番号の確認方法

$ screen -ls
コピーモード

C-z [ とタイプすると、screenはコピーモードになります。
viなキーバインドでカーソル移動が可能である。
なお、Emacsキーバインドを用いるには下記の設定を記述する。

markkeys h=^b:l=^f:$=^e:^d=^v:^D=^V

スペースキーを押せばコピーの始点が記憶され、二度目で終点が記憶されてコピーモードを抜ける。
C-z [ でコピーモードを抜けます。

Emacs key bind

bind 2 split などとするとデフォルトの
ウインドウ切り替えコマンドを上書きしてしまう場合がある

bind x eval 'echo "2: split / 1: only / 0: remove / o: focus r: resize"' 'command -c REGION'
bind -c REGION 2 split
bind -c REGION 1 only
bind -c REGION 0 remove
bind -c REGION o focus
bind -c REGION r eval 'echo "j: -1 / k: +1 / other: quit"' 'command -c RESIZE'
bind -c RESIZE = eval 'resize ='  'command -c RESIZE'
bind -c RESIZE J eval 'resize +5' 'command -c RESIZE'
bind -c RESIZE K eval 'resize -5' 'command -c RESIZE'
bind -c RESIZE j eval 'resize +1' 'command -c RESIZE'
bind -c RESIZE k eval 'resize -1' 'command -c RESIZE'

# 本当はevalとかについても詳しく書くべきなのだろうなぁ。

logging

Screenでのコマンド履歴を保存します。
logで保存のon、offを指定し、logfileでlogfileの場所を指定する。
(以下は僕のMacBookの場合です。)

log on
deflog on
logfile "/Users/hogehoge/log/screen-%Y%m%d-%n.log"
コマンド履歴

コマンドの履歴の保存行数を示す。

defscrollback 3000
ビジュアルベル

Screenではビープ音を鳴らす代わりに、端末下部にメッセージを表示します。
うざい人は消しましょう。

vbell off
端末下部のステータスラインに情報を表示する

ステータスラインに情報を表示すること設定も可能です。
ここでは、見つけたものをいくつか。

  • ステータスラインに端末一覧と時刻を表示する。
hardstatus alwayslastline "[%02c] %`%-w%{=b bw}%n %t%{-}%+w"
  • ステータスラインに端末一覧と時刻を表示する。
hardstatus alwayslastline "%{= rw} %H %{= wk}%-Lw%{= bw}%n%f* %t%{= wk}%+Lw %{= wk}%=%{= gk} %y/%m/%d %c "
  • ステータスラインに端末一覧のみを表示する。
hardstatus alwayslastline "%w"

表示方法については、おぼえがき@tips for GNU screenが詳しいです。

コピペ用

# エンコーディング
defencodig utf-8

## Prefixキーの設定
escape ^Zz

# スタートアップメニューの削除
startup_message off

# プロセス番号の確認
## $ screen -ls

# オートデタッチ
autodetach on

# コピーモード
# C-z [ とタイプすると、screenはコピーモードになる。
# viなキーバインドでカーソル移動可能
# スペースキーを1度押せばmark set 二度目でコピー。
# C-z [ でコピーモードを抜ける。
# emacs keybind for copy mode
markkeys h=^b:l=^f:$=^e:^d=^v:^D=^V

# Emacs key bind
# bind 2 split などとするとデフォルトの
# ウインドウ切り替えコマンドを上書きしてしまう場合がある
bind x eval 'echo "2: split / 1: only / 0: remove / o: focus r: resize"' 'command -c REGION'
bind -c REGION 2 split
bind -c REGION 1 only
bind -c REGION 0 remove
bind -c REGION o focus
bind -c REGION r eval 'echo "j: -1 / k: +1 / other: quit"' 'command -c RESIZE'
bind -c RESIZE = eval 'resize ='  'command -c RESIZE'
bind -c RESIZE J eval 'resize +5' 'command -c RESIZE'
bind -c RESIZE K eval 'resize -5' 'command -c RESIZE'
bind -c RESIZE j eval 'resize +1' 'command -c RESIZE'
bind -c RESIZE k eval 'resize -1' 'command -c RESIZE'

# logging
log on
deflog on
logfile "/Users/hogehoge/log/screen-%Y%m%d-%n.log"
 
# copy/scrollback mode (C-t esc)で戻れるhistory bufferを増やす。
defscrollback 3000

# ビジュアルベルをoffにする。 
vbell off

# 画面下に時刻&スクリーン一覧を表示する。
# hardstatus alwayslastline "[%02c] %`%-w%{=b bw}%n %t%{-}%+w"

# 色つき。
hardstatus alwayslastline "%{= rw} %H %{= wk}%-Lw%{= bw}%n%f* %t%{= wk}%+Lw %{= wk}%=%{= gk} %y/%m/%d %c "

# 画面下にスクリーン一覧を表示する。
# hardstatus alwayslastline "%w"