5. 環境設定 --- シェルとエディタ

前回に引き続き環境設定です。 シェルとエディタを中心に説明しますが,同時に, 前回 4.1 節に引き続き, 日本語環境についても説明していきます。 実際, Cygwin 標準のパッケージだけで Shift JIS の日本語テキストを編集することも, ページャで閲覧することも可能です。

5.1 .bashrc ファイル

筆者自身が使っている Cygwin 用 ~/.bashrc の一つを紹介します。*1

export LESS=MrXE
if [ $TERM == dumb ]
then PS1='$?$SHLVL:\w\$ '
else PS1='\[\e]0;\w\a\e[36m\]$?$SHLVL:\w\[\e[32m\]\$\[\e[0m\] '
fi
alias ls='ls -F --show-control-chars'  la='ls -a'  v='ls -l'
alias remacs='emacs -l remacs'
alias romeadow='meadow -l remacs'
function ff { diff $1~ $1 ; }
function ffc { diff -c $1~ $1 ; }
function va { v -a "$@" | more ; }
HISTCONTROL=ignoredups
HISTFILESIZE=5000
HISTSIZE=5000

環境変数 LESS の設定は, 伝統的なページャ・コマンド more がなかった BeOS で, 同類のコマンド less の振舞を more に似せるために苦闘した痕跡です。 MrXE の各文字がそれぞれ less コマンドのオプション -M と -r と -X と -E に相当します。 適当に追加削除してください。 ただし,日本語表示のために r だけは必須です。 これにより,less に -r つまり --raw-control-chars オプションが付加されますから, 日本語を含むテキストをそのまま表示できるようになります。 日本語を日本語と認識して表示するわけでなく 単に 8 ビット透過にしているだけですが,ページャの用途には十分です。

コマンド・プロンプトを指定するシェル変数 PS1 はダム端末とそれ以外 (標準のコマンド・プロンプトや,X11 の xterm 等) とで設定を分けています。 後者の場合,タイトルバーにカレント・ディレクトリを表示し, 水色で直前のコマンド終了ステータス (下図では 0), 現在のシェル・レベル (下図では 1), コロンをはさんでカレント・ディレクトリ (下図では ~/Desktop) を表示し, 緑色で $ を表示して,コマンド・プロンプトとしています。 *2

2005年12月追記: §14.6 の "Bash 3.0 のプロンプト" も併せてお読みください。



ls コマンドのエイリアスでは, 出力を 8 ビット透過にするオプション --show-control-chars を与えています。 v はかつて GNU のコマンド群で ls -l と同じ振舞のコマンドとして用意されていました。 *3 いつの頃からか GNU の配布物から姿を消してしまいましたが, 当時のなごりで同名,同機能のエイリアスを用意しているわけです。 remacs と romeadow は,vi に対する view のような, 読み取り専用の emacs と meadow を用意するためのエイリアスです。 後日,詳しく説明します。

5.2 .vimrc ファイル

Cygwin の標準パッケージの一つとして vi エディタ互換の vim があります。 インストールすると vi や view という名前でも呼び出すことができます。 これは独自の機能として,日本語を含む各国語対応をしています。 多バイトの日本語文字を日本語文字として認識しますから, bash 等と異なり, カーソル移動や削除などの編集操作も問題ありません。 Shift JIS に設定するため, 下記の内容の ~/.vimrc ファイルを用意します。 *4

set encoding=shift_jis

好みが分かれるところですが, 下記のようにすればエディタの各メッセージも日本語になります。

let $LANG='ja'
set encoding=shift_jis

これはその状態で Shift JIS テキスト・ファイルを view した例です。



5.3 多バイト文字関数と locale についての制限

上図に表示されているのは前回 4.1 節後半部の訂正前の HTML ですが,やや不正確な記述でした (今は訂正済みです)。

現行の cygwin-1.5.7 は,mbrtowc 等の多バイト文字関数 (ISO/IEC 9899 Amd.1 参照) を,多バイト文字を前提に実装しています。 おなじみの setup.exe で cygwin-1.5.7-1 のソースをダウンロードし, 展開して得られる

      cygwin-1.5.7-1/newlib/libc/stdlib/

にその実装を見ることができます。 各関数実装はマクロ名 MB_CAPABLE が定義されているかどうかで, 多バイト文字可能か1バイト文字決め打ちかを分けています。 デフォルトの設定では MB_CAPABLE が定義されますから, 多バイト文字が可能になっています。

しかし,その実装は readline ライブラリが期待するような Unicode ベースではありません。

しかも,それさえ Cygwin に移植された一般の Unix アプリケーションが 享受することはありません。 多バイト文字関数は locale にしたがって動作します。 もしも locale 設定が1バイト文字コード固定ならば, 機能は封印され,1バイト文字用の動作しか得られません。 残念ながら,Cygwin の setlocale 関数は 事実上ほぼそうなっています。 man ページの冒頭を引用します。

SETLOCALE(3)                        NEWLIB                        SETLOCALE(3)

NAME
       `setlocale', `localeconv'--select or query locale

SYNOPSIS
            #include <locale.h>
            char *setlocale(int CATEGORY, const char *LOCALE);
            lconv *localeconv(void);

            char *_setlocale_r(void *REENT,
                int CATEGORY, const char *LOCALE);
            lconv *_localeconv_r(void *REENT);

DESCRIPTION
       `setlocale'  is  the facility defined by ANSI C to condition the execu-
       tion environment for international collating  and  formatting  informa-
       tion; `localeconv' reports on the settings of the current locale.

          This is a minimal implementation, supporting only the required `"C"'
       value for LOCALE; strings representing other locales  are  not  honored
       unless  MB_CAPABLE  is  defined  in which case three new extensions are
       allowed for LC_CTYPE or LC_MESSAGES only: `"C-JIS"', `"C-EUCJP"',  `"C-
       SJIS"', or `"C-ISO-8859-1"'.  (`""' is also accepted; it represents the
       default locale for an implementation, here equivalent to `"C"'.)

これによれば,独自の拡張仕様として,たとえば

setlocale(LC_CTYPE, "C-SJIS");

とすると,多バイト文字関数に関して Shift JIS が認識されそうです。 しかし,それは結局 Shift JIS 決め打ちのアプリケーションを書くことと同じです。 日本人用にあつらえたアプリケーションでない限り, このようにプログラムされることはないでしょう。

Unix アプリケーションでは

setlocale(LC_ALL, "");  /* 環境変数等に基づき locale 全般を設定する */

あるいは

setlocale(LC_CTYPE, "");  /* 環境変数等に基づき文字コードを設定する */

などとするのが一般的です。 残念ながら,今の Cygwin の setlocale 関数では環境変数は無視され, いずれも1バイト文字コードの "C" locale になります。

5.4 nkf コマンド

今まで Cygwin の標準パッケージの枠内で話をすすめてきました。 ここで初めて標準パッケージ以外のコマンドを導入します。

よく知られているように, Windows で使われる日本語文字のエンコーディングは Shift JIS だけではありません。 標準エディタである「メモ帳」(Notepad) では, Shift JIS に加え,Unicode (utf-16) や utf-8 でファイルを読み書きします。 たとえ将来,utf-8 等への移行が進むとしても, メールで使われる iso-2022-jp は,相手のあることですから, おそらく最後まで使われ続けることでしょう。 もちろん,Unix とのデータ交換では euc-jp を扱う必要がしばしばあります。

Cygwin の標準パッケージだけでこの問題を解決し, 各種文字コードの双方向の変換を行いたい場合, libiconv パッケージに含まれる iconv コマンドを利用できます。 たとえば,utf-8 テキストをページャで読みたい場合,

$ iconv -f utf-8 -t shift_jis README.utf8 | less

のようにできます。 しかし,ポンド記号や丸数字など, 文字によってはうまく変換できないものがあります。 上記の shift_jiscp932 に変えても, この問題は解決しません。

そこで日本の Unix 界で長く事実上の標準として使われてきた 文字コード変換フィルタ nkf を導入します。euc-jp や iso-2022-jp や utf-8 に加え, 最新版は utf-16 やいわゆる機種依存文字にも対応しています。 そのうえ,多くの場合,どの文字コードか正確に自動判別してくれます。

下記のように導入します。

  1. http://sourceforge.jp/projects/nkf/ から今年正月にリリースされた nkf 2.0.4 を取ってきます。
    ファイル名は nkf204.tar.gz です。
    2005年11月追記: 2004年正月の nkf 2.0.4 の改訂版として 2005年4月に nkf 2.0.5 が同じ場所でリリースされています。
  2. $ zcat nkf204.tar.gz | tar xvf -
  3. $ cd nkf204
  4. 必要に応じて config.h を編集します(下記参照)。
  5. $ make
  6. $ make test
    (すべて Ok で終わるはずです)
  7. $ cp -av nkf.exe /usr/local/bin
  8. $ mkdir -p /usr/local/man/man1
  9. $ cp -av nkf.1 /usr/local/man/man1

make 前に config.h を下記のように書き換えると, デフォルトの出力コードが Shift JIS になりますから, Cygwin 用に便利です。 ここで ffc config.hdiff -c config.h~ config.h と等価です。 5.1 節を参照してください。 config.h ファイル内の日本語コメントは iso-2022-jp で記述されていますが, ここでは | nkf によってそれを Shift JIS で表示しています。 *5

01:~/src/nkf204$ ffc config.h | nkf
*** config.h~   Fri Jan  2 15:08:21 2004
--- config.h    Wed Mar  3 17:22:38 2004
***************
*** 43,50 ****
  /******************************/
  /* デフォルトの出力コード選択 */
  /* Select DEFAULT_CODE */
! #define DEFAULT_CODE_JIS
! /* #define DEFAULT_CODE_SJIS */
  /* #define DEFAULT_CODE_EUC */
  /* #define DEFAULT_CODE_UTF8 */
  /******************************/
--- 43,50 ----
  /******************************/
  /* デフォルトの出力コード選択 */
  /* Select DEFAULT_CODE */
! /* #define DEFAULT_CODE_JIS */
! #define DEFAULT_CODE_SJIS
  /* #define DEFAULT_CODE_EUC */
  /* #define DEFAULT_CODE_UTF8 */
  /******************************/

次回予告

次回は Cygwin 上の Python インタープリタについてお話しします。 Python によって,Windows 標準のものよりもずっと操作性のよい ソリティアをプレイすることさえできます ;-)
2005年11月追記: Python インタープリタの章は公開前にディスククラッシュで失われました。 1年半後に,内容を増して新しく書いたものが 第15章にあります。 ソリティアについては15.5節にあります。


脚注

*1 この .bashrc の各部分は SunOS, SVR4, FreeBSD, Linux, BeOS 等々を経て今に至っています。 「マイ ドキュメント」とホーム・ディレクトリの関係をどうするか, 独自コマンドを /usr/local/bin におくか ~/config/bin におくか等々, 筆者の Cygwin の設定は各マシンごとに少しずつ違っていますし, 環境設定も少しずつ違いますが,ここに示したのは最も素に近い環境のものです。

*2 ちなみに BeOS では, 白地に黒の Terminal に映えるように,青と赤の2色のプロンプトにしていました。

PS1='\[\e[34m\]$?$SHLVL:\w\[\e[31m\]\$\[\e[0m\] '

下記は現在の筆者の BeOS の画面例です。



Mac OS X でも同様の設定にしています。



*3 SunOS 4 等に /usr/local/bin/v のようにインストールして使っていました。 当時の GNU コマンド群はあくまで既存の Unix に対する後付けでした。 Linux のように GNU が本体になっているシステムが広く使われるようになるとは, 当時は夢物語だったのです。

*4 具体的にはホームディレクトリで下記をすれば ~/.vimrc を作れます。

$ echo 'set encoding=shift_jis' > .vimrc

*5 もちろん,ここで使っている nkf コマンドは, config.h を書き換えて作成したものです。 書き換えない場合,デフォルトで iso-2022-jp 出力になりますから, Shift JIS での出力を指定するオプション -s を与えて | nkf -s とタイプしなければなりません。

目次へ戻る


Copyright (c) 2004, 2005 Oki Software Co., Ltd.