まさはる's Weblog

まさはる's Weblog
Macintoshとオーディオの話題
2002年12月

2002年12月23日

Screen-3.9.13のインストール

Category : Terminal / Posted at 2002年12月23日 01:00

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

Screenで分割した状態
上半分(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(分割はしません)

 かなり高機能なので、おいおい使っていきたいと思います。

このページのトップに戻る

Vim-6.1のインストール(その2)

Category : Terminal / Posted at 2002年12月23日 00:00

 Emacsの使用を諦めてVimばっかり使っているのですが、「Vim-6.1のインストール」のインストール方法だと文字コードの自動判別が出来ません。そこで、他のサイトを参考に、文字コードの自動判別を有効にしてビルド(+iconv)し、ステータスラインに文字コードを表示することが出来たので、その方法を以下に示します。

Vim-6.1
自動判別された文字コードと改行コード(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のコメント行の( )書きはデフォルトの設定を記載しています。

*1 書く順序によって、自動判別がうまくいかない場合もあるようです。utf-8はlatin1よりも前に書かないとutf-8のファイルがうまく表示されません。(試行錯誤により)
*2 eval.txtとusr_41.txtあたりに記載されています。

 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文字をエスエープする」にチェックが入っていると日本語が正しく表示されません。

このページのトップに戻る

2002年12月21日

Bashのプロンプト

Category : Terminal / Posted at 2002年12月21日 00:00

 Bash Prompt HOWTOにBashのプロンプトについて詳しい説明があるので、それを参考にプロンプト幅が一定になるように改良してみました。

CLUMNS幅のプロンプト
プロンプト幅がターミナルのカラム幅と同じになるようにプロンプトを設定

 また、システムの負荷値*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てきます。

*1 負荷値はuptimeの1分間の平均値を使っていて、これは待ちスレッドの数だそうです。私が普通に使っていると1以下なので、1を超えると色の変更をするようにしていますが、使用環境によっては2ぐらいが適当かもしれません。
*2 wcで文字数を数えているのですが、日本語(utf-8)はどうやら1文字が3バイトあるため、英数2文字分の幅を3文字とカウントしてしまうところに問題がありそうです。

 上記の場合、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 を取り除くことで解決しました。でもなぜ...(^_^;

このページのトップに戻る