Mac OS X 10.2にはScreen 3.9.10が標準でインストールされていますが、UNICODEに対応した最新のScreen 3.9.13をインストールしてみました。

上半分(0 bash)はtop、下半分(1 bash)はvimが動いています
そのままmakeすると、エラーが出て止まってしまうので、他のサイトを参考にして(ってまたかよ...(^_^;)、makeの前にosdef.hの空ファイルをtouch osdef.h
で作っておく必要があるようです。また、./configureでは、--prefix=/usr/local
を付けないと、/usrにインストールされるので注意が必要です。
● Screen 3.9.13のインストール
$ curl -O ftp://ftp.uni-erlangen.de/pub/utilities/screen/screen-3.9.13.tar.gz
$ tar xzf screen-3.9.13.tar.gz
$ cd screen-3.9.13
$ ./configure --prefix=/usr/local
$ touch osdef.h
$ make
$ sudo make install
UTF-8モードで起動させるために、オプションに-Uをつけて起動させます。
$ screen -U
なお、上図のように1つのウインドウを複数に分割するコマンドは以下のとおりです。
ウインドウ分割 ^a-S
ウインドウ分割の解除 ^a-Q
分割された他のウインドウへのカーソル移動 ^a-TAB
新しいウインドウとシェルを生成 ^a-^c(分割はしません)
かなり高機能なので、おいおい使っていきたいと思います。
Emacsの使用を諦めてVimばっかり使っているのですが、「Vim-6.1のインストール」のインストール方法だと文字コードの自動判別が出来ません。そこで、他のサイトを参考に、文字コードの自動判別を有効にしてビルド(+iconv)し、ステータスラインに文字コードを表示することが出来たので、その方法を以下に示します。

自動判別された文字コードと改行コード(sjis,mac)
文字コードの自動判別を有効にするには、あらかじめlibiconvをインストールしてからvimをインストールするのですが、以下に示すautoconf -o auto/configure
を実行しないと+iconvにならないようです。
● libiconv-1.8のインストール
$ curl -O ftp://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.8.tar.gz
$ tar xzf libiconv-1.8.tar.gz
$ cd libiconv-1.8
$ ./configure
$ make
$ sudo make install
● vim-6.1のインストール
$ curl -O ftp://ftp.vim.org/pub/vim/unix/vim-6.1-rt1.tar.gz
$ curl -O ftp://ftp.vim.org/pub/vim/unix/vim-6.1-rt2.tar.gz
$ curl -O ftp://ftp.vim.org/pub/vim/unix/vim-6.1-src1.tar.gz
$ curl -O ftp://ftp.vim.org/pub/vim/unix/vim-6.1-src2.tar.gz
$ tar xzf vim-6.1-rt1.tar.gz
$ tar xzf vim-6.1-rt2.tar.gz
$ tar xzf vim-6.1-src1.tar.gz
$ tar xzf vim-6.1-src2.tar.gz
$ cd vim61/src/
$ autoconf -o auto/configure
$ cd ..
$ ./configure --enable-multibyte
$ make
$ sudo make install
文字コードの自動判別の設定は、~/.vimrcのset fileencodings
で自動判別させる順序*1に文字コードを書けばよく、また、ステータスラインに文字コードを表示する設定は、set statusline
の設定文字列に関数を作って入れ込めばいいようです。これらオプションの書き方は、vimをインストールしたディレクトリのshare/vim/vim61/doc/options.txtに記載されています。(関数の書き方は...パクってきたので分かりません...(^_^;*2)
● サンプルの.vimrc
" .vimrc
" ()書きはデフォルト値
" ********************
" 一般
" ********************
" vi互換にしない(compatible)
set nocompatible
" バックアップをとる(nobackup)
set backup
" 記憶する履歴数(0)
set history=50
" ********************
" 画面
" ********************
" ルーラーを表示(noruler)
set ruler
" 入力中のコマンドを表示(noshowcmd)
set showcmd
" ステータスラインを常に表示(1)
set laststatus=2
" 行番号を表示させない(同じ)
set nonumber
" タブや改行を表示しない(同じ)
set nolist
" ステータスラインの表示項目(無し...たぶん標準は%t\ %m%h%r%=%l,%c%V\ %P)
" [1] sample.txt [type][encoding:format][+][RO] 1,1-1 All
set statusline=[%n]\ %t\ %y%{GetStatusEx()}%m%r%=%l,%c%V\ \ \ \ %P
" ********************
" 文章編集
" ********************
" 行頭の空白、改行、挿入モードの開始位置での削除を許す(無し)
set backspace=indent,eol,start
" 新しい行を直前の行と同じインデントにする(noautoindent)
set autoindent
" Tab文字の文字幅(8)
set tabstop=4
" cindentやautoindent時に挿入されるタブの幅(8)
set shiftwidth=4
" キーボードでTabキーを押した時に挿入される空白の量(同じ)
set softtabstop=0
" ********************
" 検索
" ********************
" 検索文字列が小文字の場合は大文字小文字を区別なく検索する(noignorecase)
set ignorecase
" 検索文字列に大文字が含まれている場合は区別して検索する(nosmartcase)
set smartcase
" 検索時に最後まで行ったら最初に戻る(同じ)
set wrapscan
" 検索文字列入力時に順次対象文字列にヒットさせない(同じ)
set noincsearch
" ********************
" 文字コード
" ********************
" 内部の文字コード(latin1)
set encoding=utf-8
" ファイルの文字コード(無し)
set fileencoding=utf-8
" 入力ファイルの自動識別(ucs-bom,utf-8,latin1)+iconvでビルドされている必要あり
set fileencodings=ucs-bom,iso-2022-jp,euc-jp,sjis,utf-8,latin1
" ファイルの改行コード(unix)
set fileformat=unix
" 入力ファイルの改行コードの自動識別(unix,dos)
set fileformats=mac,unix,dos
" ********************
" オートコマンド
" ********************
if has("autocmd")
" ファイル形式の検出、プラグインとインデントのロードを有効にする
filetype plugin indent on
" ファイル形式がtextの場合78文字で行を分割する
autocmd FileType text setlocal textwidth=78
" ファイル保存時のカーソル位置を記憶する
autocmd BufReadPost *
\ if line("'\"") > 0 && line("'\"") <= line("$") |
\ exe "normal g`\"" |
\ endif
endif
" ********************
" 関数の定義
" ********************
" 文字エンコーディングと改行コードの取得
function! GetStatusEx()
let str = &fileformat
if has("multi_byte") && &fileencoding != ""
let str = &fileencoding . ":" . str
endif
let str = "[" . str . "]"
return str
endfunction
なお、上記.vimrcのコメント行の( )書きはデフォルトの設定を記載しています。
Mac OS X v10.3の場合は、libiconv 1.9とvim 6.2がインストール済みとなっていますが、日本語を入力したい場合はvimにマルチバイトのオプションを付けてインストールする必要があるようです。
● vim-6.2のインストール
$ curl -O ftp://ftp.vim.org/pub/vim/unix/vim-6.2.tar.bz2
$ tar jxvf vim-6.2.tar.bz2
$ cd vim62
$ ./configure --enable-multibyte
$ make
$ sudo make install
なお、ターミナルのウインドウ設定で「非ASCII文字をエスエープする」にチェックが入っていると日本語が正しく表示されません。
Bash Prompt HOWTOにBashのプロンプトについて詳しい説明があるので、それを参考にプロンプト幅が一定になるように改良してみました。

プロンプト幅がターミナルのカラム幅と同じになるようにプロンプトを設定
また、システムの負荷値*1を表示して、その状態により色を変えるようにしてみました。上の図では左から、[ヒストリ番号][ユーザ名@ホスト名(負荷値)]---[カレントディレクトリ名]を表示しており、.bashrcのPS1の設定を以下のサンプルにすると、上記のようになります。
● サンプルの.bashrc(該当部分のみ)
# ********************
# CLUMNS幅のプロンプト
# ********************
function prompt_command {
# 文字列、数値の取得
# HOSTNAMEの.以下を削除
strHostname=$(echo -n $HOSTNAME | sed -e "s/\..*\.//")
# PWDのHOME以下を~に変更
strPwd=$(echo -n $PWD | sed -e "s:^$HOME:~:")
# システムの1分間の平均負荷の数値を抽出
valHostLoad=$(uptime | sed -e "s/.*load averages: \(.*\...\), \(.*\...\), \(.*\...\)/\1/" -e "s/ //g")
# プロンプトをCOLUMNS幅に調整
# [xxx][user@hostname(x.xx)]---[~]$
# Prompt全体の長さを取得
local valPromptSize=$(echo -n "[$HISTCMD][$USER@$strHostname($valHostLoad)][$strPwd]" | wc -c | tr -d " ")
# COLUMNSに値が入っていない場合は80を初期値とする
local valFillSize=$(( ${COLUMNS:-80}-$valPromptSize ))
strFill=""
# 短い場合は$strFillに"-"を追加
while [ $valFillSize -gt 0 ]
do
strFill="-$strFill"
valFillSize=$(( $valFillSize-1 ))
done
# 長い場合は$strPwdの左側を"..."に置き換えて削除
if [ $valFillSize -lt 0 ]
then
local valCutSize=$(( 3-$valFillSize ))
strPwd="...$(echo -n $strPwd | sed -e "s/\(^.\{$valCutSize\}\)\(.*\)/\2/")"
fi
# システムの1分間の平均負荷に応じてカラー設定
# bcは乗算すると小数点が入るので除算する
local valHostLoadInt=$(echo -e "$valHostLoad/0.01\nquit\n" | bc)
# ANSI Escape Sequences
# 0:normal 1:bold 4:underline 5:blink 7:reverse video 8:nondisplayed
# 30-37,39:foreground Color 39:default
# 30:black 31:red 32:green 33:yellow 34:blue 35:magenta 36:cyan 37:white
# 40-47,49:background Color 49:default
# 40:black 41:red 42:green 43:yellow 44:blue 45:magenta 46:cyan 47:white
if [ $valHostLoadInt -ge 200 ]
then
strHostLoadColor=31 # red
else
if [ $valHostLoadInt -ge 100 ]
then
strHostLoadColor=35 # magenta
else
strHostLoadColor=0 # normal
fi
fi
}
PROMPT_COMMAND=prompt_command
PS1='\n[$HISTCMD][$USER@$strHostname(\[\e[${strHostLoadColor}m\]$valHostLoad\[\e[0m\])]$strFill[$strPwd]\$ '
なお、既知の問題点として、パス名に日本語を含んでいるとズレ*2てきます。
上記の場合、Mac OS X v10.3では正しく表示されません。変数やコマンドの出力が変更になっているようです。
● $HOSTNAME
10.2の場合は"コンピュータ名.local."というふうに、最後に"."が付いていたのですが、10.3では付かなくなりました。したがって、コンピュータ名をsedで抜き出している箇所でエラーになります。
strHostname=$(echo -n $HOSTNAME | sed -e "s/\..*\.//")
↓
strHostname=$(echo -n $HOSTNAME | sed -e "s/\..*//")
● uptime
10.2のuptimeは、負荷の値がコンマ+空白区切りだったのですが、10.3ではコンマが無くなり空白のみになりました。これも、1分間の平均負荷をsedで抜き出している箇所でエラーになります。
valHostLoad=$(uptime | sed -e "s/.*load averages: \(.*\...\), \(.*\...\), \(.*\...\)/\1/" -e "s/ //g")
↓
valHostLoad=$(uptime | sed -e "s/.*load averages: \(.*\...\) \(.*\...\) \(.*\...\)/\1/" -e "s/ //g")
● エスケープシーケンス
これは原因がよく分からないのですが、プロンプトがズレて表示されてしまいます。とりあえずエスケープシーケンスの部分を削除して使っています。
PS1='\n[$HISTCMD][$USER@$strHostname(\[\e[${strHostLoadColor}m\]$valHostLoad\[\e[0m\])]$strFill[$strPwd]\$ '
↓
PS1='\n[$HISTCMD][$USER@$strHostname($valHostLoad)]$strFill[$strPwd]\$ '
(2003.12.14追記)
上記エスケープシーケンスでズレて表示される問題は、最初の \n
を取り除くことで解決しました。でもなぜ...(^_^;