multilingual patch for Keith Bostic's nvi Jun-ichiro itojun Hagino $Id: README.japanese,v 1.1.2.5 1999/03/10 14:23:14 itojun Exp $ vi users of the world, unite! この文書は、英語版の翻訳です。英語版の方が更新されていますので 実際と異なる点があったら英語版を参照してください。 これなあに? このpatchkitは、nvi 1.79に対する多国語化パッチです。 このパッチのことを"nvi-m17n"と読んでいます。"m17n"とは、 multilingualizationのこと(m + 17文字 + n)です。 nviの最新版は、以下から得ることができます: ftp://ftp.cs.berkeley.edu/ucb/4bsd/ このパッケージの最新版は、以下から得ることができます: ftp://ftp.foretune.co.jp/pub/tools/nvi-m17n/ 日本語化パッチからスタートしたので、以前は"jnvi"と呼んでました。 このため、"jnvi"という記述が残ってるかもしれません。 "nvi-m17n"と読み替えてください。 REDISTRIBUTION Freely redistributable, under condition written in LICENSE file. WARRANITY AND COPYRIGHT Absolutely no warranty. Pray and backup before try. The patch is based on the Japanization work on nvi 1.03 by: Yoshitaka Tokugawa and Japanization patch to elvis(vi clone by Steve Kirkendall) by: Jun-ichiro itojun Itoh Some part of multibyte support has been derived from other people's work. See comment in multibyte.c. Multilingual portion copyright(c) 1996, 1997 by Jun-ichiro Itoh. All rights reserved. 表記について 明白な場合、"多国語化nvi"のことを"nvi"と表記します。 区別したい場合には"nvi-m17n"と呼んでいます。 とりあえず使いたい(いらちなひとに) まず、このpatchはもとのnviの全ての機能を多国語化してると保証されてる わけではない、ということに注意してください。 いくつかの機能はまだ使ってはいけない場合があります。 "多国語化済み"と"多国語未対応"の節を見るとどの機能がokでどの機能が まだかわかります。 0. nviのパッケージにpatchをあてます。 % cd nvi-1.79 % patch -p1 < nvi-m17n.diff 1. 多国語パッチを活かしてconfigureします。 % cd build % ./configure --enable-multibyte nviから直接cannaを使いたい場合、以下のようにconfigureを呼び出して ください。以下の例だと、/usr/local/cannaにcannaのライブラリや ヘッダファイルがインストールされている必要があります。 % ./configure --enable-multibyte --enable-canna=/usr/local/canna 2. makeしてインストールしましょう。 % make % su password: xxxx # make install 3. Xを使っている場合、多国語表示のためにkterm 6.2.0をインストール することをおすすめします。kterm 6.2.0はX11R6 contribのミラーを しているftpサーバから持ってこれます。フォントも追加インストール しましょう。 単に日本語が使いたいだけなら古いktermでも平気です。 4. 設定ファイルを編集しましょう。(~/.exrc) 4-a. iso-2022-*の表示 iso-2022-*対応の端末ソフトを使っている場合、以下の行を 足しましょう(ktermの場合こっちです): set noskipdisplay そうでなければ、以下の行を足しましょう: set skipdisplay 4-b. 表示のencoding 別の節にあるリストから、端末への表示に使うencodingを選び、 以下のように設定しましょう: set displayencoding=iso-2022-jp set displayencoding=sjis set displayencoding=euc-jp set displayencoding=big5 いくつかのencodingを指定した場合、動作にクセがあります。 "多国語対応済み"の節を参照してください。 4-c. キー入力のencoding 別の節にあるリストから、キー入力に使うencodingを選び、 以下のように設定しましょう: set inputencoding=euc-jp 一部のencodingはキー入力には使えませんので注意しましょう。 4-d. ファイルのencoding 同様にファイル入出力に使うencodingを選び、以下のように 設定しましょう: set fileencoding=iso-2022-jp また、ファイルオープン/入力時にファイルのencodingを自動判別 したければ、以下を設定しましょう: set autodetect=jp (euc-jp/sjis/iso-2022-jp、を判定) set autodetect=cn (euc-cn/big5/hz/iso-2022-cn、othersを判定) set autodetect=tw (euc-tw/big5/hz/iso-2022-cn、othersを判定) set autodetect=kr (euc-kr/iso-2022-kr、を判定) また、ファイルのオープン時に(:e/:nコマンドで)自動判定結果で fileencodingの値を上書きすることもできます。 この場合、以下のように設定します。こうすることで、 ファイルのencodingがファイル編集前と編集後で 変わらないようにすることができます。たとえば: set autodetect=jp+ set autodetect=cn+ 中国語の自動判別をしたい場合(:set autodetect=cn)、 fileencodingを"euc-cn"または"big5"に設定することをお勧めします。 euc-cnとbig5を自動判別するのはほとんど不可能なので、 自動判別はたいてい失敗します。自動判別が失敗した場合、 fileencodingに設定されたencodingが使われます。 ので、big5をよく使う場合、以下のようにしましょう: set autodetect=cn fileencoding=big5 euc-cnをよく使う場合、以下のようにしましょう: set autodetect=cn fileencoding=euc-cn 中国語の自動判別をする場合、これ以外の設定はお勧めしません。 台湾語(?)の自動判別をしたい場合(:set autodetect=tw)も、 上記の記述はあてはまります。fileencodingは"euc-tw"か"big5"の どちらかに設定してください。 4-e. cannaサポート cannaによる日本語入力を使いたい場合、以下の行を追加します: set canna cannaの入力モード(フェンス)のon/offの自動制御を使いたい場合、 以下も設定してください(あと、fepkeyを好みにあわせてください): set cannactrl cannaサーバを指定する場合、以下のようにします: set cannaserver=somehost.your.domain canna入力モードに入るキーを変えたい場合、以下のようにします。 この設定をすると入力モードに入るキーがcontrol-Oになります。 キーは*慎重に*選んで下さい!: set cannakey=^O 5. このパッチをあてた場合、原作nviのドキュメントに述べられている 説明文の一部は適用されなくなることに注意してください。 例えば、locale関連のもの(nvi-1.79/FAQのいちばん最初の質問、とか) はnvi-m17nに関して正しくありません。 6. これであがりです。Enjoy! .exrcの例題をいくつか: 例1: iso-2022-*表示のできる端末を使っていて、euc-jpをencodingとして 使います。日本語のファイルencoding自動判別を使います。 set noskipdisplay set displayencoding=euc-jp set inputencoding=euc-jp set fileencoding=euc-jp set autodetect=jp 例2: iso-2022-*表示のできる端末を使っていて、iso-2022-jpをencoding として使います。日本語のファイルencoding自動判別を使います。 cannaと、自動cannaモード制御を使います。 set noskipdisplay set displayencoding=iso-2022-jp set inputencoding=iso-2022-jp set fileencoding=iso-2022-jp set autodetect=jp set canna cannactrl 例2: iso-2022-*表示のできる端末を使っていて、big5をencoding として使います。中国語のファイルencoding自動判別を使います。 set noskipdisplay set displayencoding=big5 set inputencoding=big5 set fileencoding=big5 set autodetect=cn encoding 行左端の"*"印は、このencodingをキー入力のencodingに使えることを 示しています。(:set inputencoding=xxx) 行左端の"!"印は、このencodingの実装は仕様を完全に満たしていないことを 示します。表の次にある註を読んで下さい。 encodingの仕様にない多国語をencodeする場合、iso-2022-*的な指示が 使われます。 (例えば、iso-2022-kr中のlatin-1とか、iso-2022-cn中のcyrillicとか) 単一言語encodingの場合、知らない文字セットは単に飛ばされます。 encodingの扱われ方の詳細は"多国語化済み"の節を参照してください。 多国語encoding: name note initially designated charsets --- --- --- * euc-jp-old G0=ascii, G1=JIS X0208-1976, G2=JIS X0201 kana, G3=JIS X0212-1990. SS1 and SS2 used * euc-jp G0=ascii, G1=JIS X0208-1983, G2=JIS X0201 kana, G3=JIS X0212-1990. SS1 and SS2 used * euc-cn G0=ascii/G1=GB2312 * euc-kr G0=ascii/G1=KSC5601 * iso-8859-1 8bit G0=ascii/G1=iso-8859-1 * iso-8859-2 8bit G0=ascii/G1=iso-8859-2 * iso-8859-3 8bit G0=ascii/G1=iso-8859-3 * iso-8859-4 8bit G0=ascii/G1=iso-8859-4 * iso-8859-7 8bit G0=ascii/G1=iso-8859-7 * iso-8859-8 8bit G0=ascii/G1=iso-8859-8 * iso-8859-9 8bit G0=ascii/G1=iso-8859-9 * latin1 8bit iso-8859-1の別名 * latin2 8bit iso-8859-2の別名 * iso-2022-cn-ext G0=ascii rfc1922 SI, SO, SS2 and SS3 used * iso-2022-cn rfc1922 iso-2022-cn-extの別名 (仕様が互換) * iso-2022-jp-2 rfc1554 G0=ascii SS2 used * iso-2022-jp rfc1468 iso-2022-jp-2の別名 (仕様が互換) *! iso-2022-kr rfc1557 G0=ascii SI and SO used * ctext X11 compound text G0=ascii/G1=iso-8859-1 8bit no locking shift used * iso-2022-7-1 テスト用の汎用7bit、G0のみ使用 * iso-2022-7-2 テスト用の汎用7bit、G0/1のみ使用 * iso-2022-8-2 テスト用の汎用8bit、G0/1のみ使用 単一言語encoding: name note charsets --- --- --- * none パッチ前のnviの動作 G0=ascii, G1=ascii(binary) * sjis MS-Kanji/Shift JIS * big5 * euc-tw G0=ascii, G1=CNS11643-1, G2=CNS11643-[2-7] hz rfc1842 iso-2022-krの解釈: rfc1557には述べられていませんが、実際の運用ではKSC5601の指示だけの 行があると、その行は捨てられます(行末文字を無視)。 nvi-m17nはこの挙動を実装しています。 文字セット nviは、以下にあげられていない文字セットの指示を認識しません。 ある文字セットを認識するようにしてほしい場合、作者にコンタクト してください。 94文字セット: name designation to G0 note --- --- --- IRV ESC ( @ UK ESC ( A ASCII ESC ( B hardcoded Swedish ESC ( C Norwegian ESC ( E JIS X0201 right ESC ( I 1バイトカタカナ JIS X0201 left ESC ( J German ESC ( K French ESC ( R Italian ESC ( Y Spanish ESC ( Z 96文字セット: name designation to G0 note --- --- --- Latin1 ESC , A iso-8859-1 Latin2 ESC , B iso-8859-2 Latin3 ESC , C iso-8859-3 Latin4 ESC , D iso-8859-4 Greek ESC , F iso-8859-7 Arabic ESC , G iso-8859-6 Hebrew ESC , H iso-8859-8 Cyrillic ESC , L iso-8859-5 Latin5 ESC , M iso-8859-9 Thai ESC , T TIS620.2529 Latin6 ESC , V iso-8859-10 Latin6 additions ESC , X iso-8859-10 additions 94x94文字セット: name designation to G0 note --- --- --- JIS X0208.1976 ESC $ ( @ or ESC $ @ GB2312 ESC $ ( A or ESC $ A JIS X0208.1983 ESC $ ( B or ESC $ B KSC5601 ESC $ ( C JIS X0212.1990 ESC $ ( D ISO IR-165 ESC $ ( E CNS11643-1992-1 ESC $ ( G CNS11643-1992-2 ESC $ ( H CNS11643-1992-3 ESC $ ( I CNS11643-1992-4 ESC $ ( J CNS11643-1992-5 ESC $ ( K CNS11643-1992-6 ESC $ ( L CNS11643-1992-7 ESC $ ( M Big5-1 ESC $ ( 0 非公式、Muleに類似 Big5-2 ESC $ ( 1 非公式、Muleに類似 増えたオプション name type range description --- --- --- --- autodetect(ad) str - ファイル入力encoding自動判別 displayencoding(de) str global 表示encoding fepkey str - fenceを自動制御するコマンド名 fileencoding(fe) str - ファイル入出力encoding inputencoding(ie) str - キー入力encoding skipdisplay(sd) bool - 表示できない文字セットは飛ばす canna利用時に増えるオプション name type range description --- --- --- --- canna bool global cannaを使う/使わない cannactrl bool - fence自動制御 cannakey str - canna入力モードに入るキー cannaserver str global cannaサーバ configureの設定 多国語化 configureするときに、"--enable-multibyte"をつける必要があります。 通常のインストール手順は以下の通り: % cd build % ./configure --enable-multibyte % make configureのときにencodingのデフォルト値を指定することができます: % ./configure --enable-multibyte=euc-kr % ./configure --enable-multibyte=iso-2022-jp % ./configure --enable-multibyte=euc-cn encodingを指定しないと、"none"になります。 canna cannaによる日本語入力を使う場合、"--enable-canna"をconfigureの 引数につける必要があります。"--enable-multibyte"が必要です。 % cd build % ./configure --enable-multibyte --enable-canna ヘッダやライブラリのあるディレクトリを指定する必要があるかも しれません。 --enable-cannaの後にディレクトリSOMEWHEREを指定した場合: % ./configure --enable-multibyte --enable-canna=SOMEWHERE 以下にヘッダファイルとライブラリファイルがあることを意味します: SOMEWHERE/include/canna/jrkanji.h SOMEWHERE/lib/libcanna.a 非一般的な設定をしていて、ヘッダとライブラリのパス名のprefixが 違う場合、ディレクトリを個別に指定する必要があります。 例えば以下のところにファイルがある場合: SOMEWHERE/canna/jrkanji.h ELSEWHERE/libcanna.a 以下のようにconfigureを起動します: % env CFLAGS=-ISOMEWHERE LDFLAGS=-LELSEWHERE \ ./configure --enable-multibyte --enable-canna たいていの場合、以下の設定でうまくいきます: % ./configure --enable-multibyte --enable-canna=/usr/local/canna 多国語化済み 多国語文字の上の移動/多国語文字の入力。 多国語の単語移動(日本語/韓国語のみ) iso-2022-*をサポートする端末のための多国語表示。 euc-jp/euc-cn/euc-kr/euc-tw/sjis/big5端末のための基本的なサポートも してます。 表示のためのencodingはこんな風に設定しないといけません: :set displayencoding=foobaa 表示に使えるencodingは"encoding"の節に列挙してあります。 残念ながら、表示方法は直観的ではないので、以下を注意深く 読んで下さい。 多国語文字は以下の方法で表示されます: 1. そのencoding用に特別の方法が定義されていたら、それを使います。 これは、8bit系のencodingの場合に定義されています。 name note --- --- euc-jp G0/G1のみ G0=ASCII, G1=JIS X0208-1983/1976 euc-cn euc-kr euc-tw G0/G1のみ (G0=ASCII, G1=CNS11643-1) sjis X0208-1983/1976とJIS X0201カタカナ big5 2. ":set skipdisplay"の設定の場合、多国語文字は"?"か"??"として 表示されます。 3. そうでなければ、表示対象の文字セットをiso-2022-*のエスケープ シーケンスを使ってG0に指示して表示します。 例えば、JIS X0208-1983の場合"ESC $ B"、latin-1の場合"ESC , A" G0だけを使うのは単純化のためです。これはnviのencodingの "iso-2022-7-1"に似ています。 多国語表示のためには(上記の3.の場合)iso-2022-*完全対応の端末の 利用をお勧めします。例えば、kterm-6.2.0を試すとよいでしょう。 X11R6 contribのあるftpサーバにはたいてい置いてあります。 cursesの多国語化について詳細が知りたければ、curses/README.m17nを 見て下さい :set displayencoding=xxxという設定はnvi全体についての設定なので、 全てのサブ画面に対して効きます。:set skipdisplayはサブ画面ごとに 設定できます。 ファイル入出力encodingは切替え可能です。 使えるencodingは"encoding"の節に列挙してあります。 ほとんどの多国語encodingは汎用iso-2022-*解析器/生成器で 取り扱われています。 一部のencodingの仕様は、一部の文字セットをどう指示するか 規定していないことに注意してください。例えば、iso-2022-jp2(RFC1544) では全ての文字セットについてどう指示するかを規定していますが、 iso-2022-kr(RFC1557)では規定されていません。 このような場合には、nviはiso-2022-*のエスケープシーケンスを 解釈/生成します。 例: ":set fileencoding=latin1"と指定しているときにJIS X0208-1983を 使った場合、nviは"ESC $ B ほげほげ ESC ( B"を出力します。 これはJIS X0208-1983を指定する方法として正当です。 単一言語encoding(特にsjisとhz)はプログラムコードとして動作が 決め打ちされていて、知らない文字セットは全て飛ばすように なっています。 :set fileencoding=xxxはフィルタ系のコマンド(viの!コマンド)、 ファイルのオープン/入力/出力(:r、:w、:eや:n)、およびshellとの 入出力(:script)に影響します。 ファイルオープン/入力時のencoding自動判別。 一部のencodingを必要なときに自動判別できます。 set autodetect=jp (euc-jp/sjis/iso-2022-jp) set autodetect=cn (euc-cn/big5/hz/iso-2022-cn) set autodetect=tw (euc-tw/big5/hz/iso-2022-cn) set autodetect=kr (euc-kr/iso-2022-kr) 他の値を設定すると、自動判別は働きません。 ファイル編集開始時(:nとか:eとか)またはファイル読み込み時(:r)に、 ファイルの内容はデータベースに読み込まれ、そのあと自動判別の ためのプログラムコードが呼ばれます。自動判別のためのコードは encodingを判別し、それに従いデータベースの内容を適切な方法で 内部表現に変換します。 自動判別が成功しなかった場合、fileencodingに指定されている値が デフォルト値として使われます。 また、ファイルのオープン時に(:e/:nコマンドで)自動判定結果で fileencodingの値を上書きすることもできます。 こうすることで、ファイルのencodingがファイル編集前と編集後で 変わらないようにすることができます。 この場合、以下のように末尾に"+"を加えて設定します: set autodetect=jp+ set autodetect=cn+ この設定を使うと、viコマンドのcontrol-Gでfileencodingの値が 表示されるようになります。 大きなファイルを扱うと、自動判別に時間がかかることがあります。 自動判別コードはデータベースに読み込まれたファイルを、自動判別が 終るまで調べにいくからです(つまり、全行調べちゃう場合がある)。 (最大行数はcommon/multibyte.cの中のPREDICT_MAXLINESの設定を変えると 変更できます) 自動判別が不可能な場合というのもあります。特にファイルが短い 場合は無理な場合があります。 バイナリファイルを読み込んでしまった場合、自動判別は きっとうまくいきません。注意して下さい。 :set autodetect=xxxはファイルのオープン/入力にだけ影響します (:r、:eと:n)。 中国語の自動判別をしたい場合(:set autodetect=cn)、 fileencodingを"euc-cn"または"big5"に設定することをお勧めします。 euc-cnとbig5を自動判別するのはほとんど不可能なので、 自動判別はたいてい失敗します。自動判別が失敗した場合、 fileencodingに設定されたencodingが使われます。 ので、big5をよく使う場合、以下のようにしましょう: set autodetect=cn fileencoding=big5 euc-cnをよく使う場合、以下のようにしましょう: set autodetect=cn fileencoding=euc-cn 中国語の自動判別をする場合、これ以外の設定はお勧めしません。 台湾語(?)の自動判別をしたい場合(:set autodetect=tw)も、 上記の記述はあてはまります。fileencodingは"euc-tw"か"big5"の どちらかに設定してください。 多国語キー入力。 キー入力encodingを指定するには以下のようにします: :set inputencoding=euc-jp :set inputencoding=iso-2022-jp euc-jp/kr/cnとiso-2022-*を指定した場合、汎用iso-2022-*解析器が 使われます。このため、これらの場合完全多国語キー入力が 可能です。 受け付け可能なsingle shiftとlocking shiftの種類は、encodingに 何が指定されているかで決まります。例えば、euc-*を指定している場合には、 SS2RとSS3R(0x8eと0x8f)しか解釈されません。 iso-2022-*系のencodingをキー入力に使う場合、文字コード指定の エスケープシーケンスとESCキーとの区別が難しくなります。 これらはタイムアウトを使って判別されます。非常に遅い回線越しに nviを使う場合、問題が生じる場合があり得ます。 多国語の正規表現検索が可能です。 制約事項についてはregex/README.m17n参照。 cannaによる日本語入力をサポートしています。 "canna"はクライアントサーバ形式の日本語変換システムです。 cannaを使う場合に追加されるオプションのリストは別の節に 挙げてあります。 cannaのサポートはviモードの場合のみです。exモードでは、 cannaによる日本語入力はできません。 cannaを利用する場合、以下を行います: :set canna こうするとnviはcannaサーバと接続します。cannaサーバとの接続を 切るにはこうします: :set nocanna canna入力モードに入ったり抜けたりするには、control-Oを打ちます。 このキーストローク(control-O)はcannakeyオプションで決められて います。 cannakeyオプションを変えるとキーストロークを変えられます。 例えば、control-Xでcanna入力モードの切替えをする場合はこんな かんじ: :set cannakey=^X (colonモードで入力するには^V^X) cannakeyの設定には*細心の注意を払って下さい*。ここで選択された キーストロークは全てに優先し、このキーストロークはcanna オプションが設定されている間、二度とnvi自体に渡らなくなります。 viコマンドモードでcannaのfenceがでているのが邪魔になることが ありませんか? nviはcanna入力モードを自動制御することができます。 この機能を使うには以下のコマンドを入力します: :set cannactrl このオプションを設定した場合、以下のようになります: - (特定のコマンドについて)テキスト入力を終ると、cannaのfenceが 自動的にoffになります。 - (特定のコマンドについて)テキスト入力の場面になると、cannaの fenceが自動的にonになります。 - (全てのコマンドについて)viコマンドモードに戻ると、cannaの fenceが自動的にoffになります。 「特定のコマンド」は、fepkeyオプションを設定することで 指定できます。デフォルトでは"/?aioAIO"が設定されています。 なんでも指定したい場合、こんなこともできます: :set fepkey=?/aioAIOcCrRtfTF この設定はちゃんと動きます。嘘じゃないよ。 cannaサーバを切替える場合、以下を実行します: :set cannaserver=hostname.your.domain cannaサポートにはいくつか直観的でないところがあります。 "ひねくれているところ"の節をみてください。 nvi-m17n特有のでオプションを設定する 以上で述べたように、nvi-m17nではnviに対しいくつかオプションを 追加しています。しかし、いくつかの場合、.exrcに書いたオプション 設定で困ることがあります: 1. nvi-m17nとnvi(または他のクローンvi)を両方使っている場合、nviや他の viクローンはnvi-m17nが拡張したオプションを解釈してくれない場合が あります。この場合、起動時にエラーメッセージがでたり、 他のviが起動しなかったりします。 2. 複数の設定を頻繁に切替えて使う場合、簡単に切替えられると素敵です。 1.の場合、3つの逃げ方があります: - 他のvi(クローン)とnviの間のオプション設定を使い分けるために、 .exrcのかわりに.nexrcを使うことができます。 .nexrcはオリジナルのnviで導入されたものなので、オリジナルのnviと nvi-m17nの間でオプション設定を区別するためには使えません。 - 同様に、環境変数NEXINITも使えます。これはEXINITと同様に 働きますが、オリジナルのnviとnvi-m17nでしか使われません。 - wrapperスクリプトを使います。以下参照。 2.の場合、wrapperスクリプトが便利でしょう。 wrapperスクリプト 以下のようなwrapperスクリプトを使うと、nvi-m17nに特定のオプションを 渡すことができます。これを使うと、.exrcに非一般的なオプションを 含めずに済みます: --->8 日本語を編集する場合の例(たとえば"jnvi"として使う) #! /bin/sh EXINIT0="set canna cannactrl autodetect=jp fileencoding=iso-2022-jp displayencoding=iso-2022-jp inputencoding=iso-2022-jp noskipdisplay" if [ -f ~/.exrc ]; then EXINIT="$EXINIT0 `sed -e '/^set /!d' -e 's/^set //' < ~/.exrc | tr '\012' ' '`" else EXINIT=$EXINIT0 fi export EXINIT exec /usr/local/bin/nvi $* --->8 追加ツール nvi-m17nでは"regular"というスクリプトが追加されています。 regular [-options] 一部の文書には、ASCIIで表現できる文字に対して余分な文字セットの 指示がつけられていることがあります。たとえば、UK文字セットの"a"とか JIS X0201左側(JIS roman)文字セットの"a"とかがそうです。 このような指示は間違ってはいないのですが、たまにnvi-m17nの ユーザをいらつかせる原因になります。なぜなら、ASCIIの"a"以外を キーボードから入力するのは結構難しかったり不可能だったりするからです。 Regularは、このような文字を全部ASCIIの"a"に変換します。 Regularにはいくつかのオプションがあります。 -7 出力を、nviのencodingでいうとiso-2022-7-1にします。 全ての文字セットはG0に呼び出されます。 1ocking shiftやsingle shiftは使われません。 オプションをなにも指定しなかった場合、この動作を します。 -8 出力を、nviのencodingでいうとiso-2022-8-2にします。 94/94x94文字セットはG0に、96/96x96文字セットはG1に 呼び出されます。locking shiftやsingle shiftは 使われません。 -kr 入力がiso-2022-krと仮定します。 すなわち、G0/G1/その他に呼び出された文字セットは 行を越えて保存されます。 -krを指定していない場合には、改行ごとに G0=ASCII/G1=G2=G3=なし というようにリセットされます。 Regularは標準入力からテキストを読み、標準出力に結果を出力します。 % regular < source.txt > dst.txt のように使うか、あるいはフィルタコマンド(viモードの!コマンド)で 呼び出すかしてください。 ひねくれているところ: - nvi-m17nはregularの出力encodingを処理できますが、regularの出力 encodingは一般的ではありません。 regularは汎用ツールではありません。nvi-m17nのサポート専用と 思って下さい。 - euc-*/sjis/big5等のencodingで書かれたファイルを安全に取り扱う ことはできません。フィルタコマンドを使う場合、nvi-m17nのfileencoding オプションをiso-2022-*系のencodingにしておく必要があります。 - regularの動作は非常に低速です。 もし遅すぎて困ったら、"qregular"をかわりに使ってください。 ただし、qregularはG0/G1への直接の指示しか考慮しません (SIとかSOとかは解釈できません)。 多国語未対応 このpatchはnviの全機能を多国語化するわけではありません。 このため、いくつかの機能は使うべきではありません。 そのうち*一部*をここに並べておきます。より細かく制約を知りたい場合は ソースコードを確認してください。 - 横スクロール画面モード(:set leftright)はときどきcoreを吐いたり 無限ループに落ちたりします。 - curses以外の画面出力インタフェースは動きません。 - perlをlinkすることはできるようです。が、多分役にたちません。 なぜなら、perlスクリプト内ではnviの内部コードを扱わないと いけないからです。 - tclをlinkした場合、きっと動きません。 - exモードでは、キー入力のエコーバックはnviではなく端末ソフトウェア によって処理されます(オリジナルのnviがそうなっています)。 このため、端末ソフトウェアが正しく処理しない場合、文字が化けて エコーバックされることがあります。 - cannaサポートはexモードでは動きません。tty制御のしかたが viモードと違ってcookedモードだからです(viのコロンモードでは cannaが使えます) ひねくれているところ/ばぐ(nvi 1.79について) tcsh 6.05.00のバグのせいで、tcsh 6.05.00とnviを一緒に使うと トラブルが発生することがあります。 tcsh 6.05.00では % echo -n 'hoge' | tcsh -c cat をするとハングします。また、 % ( echo 'hoge'; echo -n 'hoge') | tcsh -c cat とすると、最初の1行だけが出力されます。これは標準のcshの動作とは 異なります。 このため、login shellがtcsh 6.05.00のときに、nviから"1行だけfilter" するコマンド("!!cat"とか"!!fmt"とか)を実行すると、nviはtcshの 道連れになってハングします。 一番簡単な抜け道は、nviと一緒にtcshを使わないことです。 例えば、以下を.exrcに足せば回避できます: set shell=/bin/csh :set の直後に :set all すると、画面が必要な量より1行多くスクロールします。 このため、:set allの出力の一番上の行が見えません。 原作nviのコードには、ctype.hで定義されているマクロ(isprint()とか isblank()とか)に負の数をつっこんだときにもちゃんと動くことを 仮定して書かれた部分があります。 (註: これはANSI Cの仕様にはありません!) もしこれが満たされていない場合、8ビットめが立っている値(0x80-0xff)が 文書中に現れるとnviはハングアップすることがあります。 多国語化の際に、8ビットめが立った値をかなりの頻度で使っているため、 これはかなり大きな問題になります。 ほとんどの部分は問題ないように修正してありますが、やりのこしが あるかもしれません。nviがハングアップしたら、状況を再現するための 操作手順を作者まで送ってください。 ひねくれているところ/ばぐ(nvi-m17nについて) iso-2022-*をキー入力encodingに使っている場合(:set inputencoding=xxx)、 control-Oとcontrol-Nは常にSI/SOとして取り扱われます。 このため、control-Nをviの「次の行へ」コマンドとして使うことは できなくなります。 (cannaを使っている場合、canna入力モードへの移行キーはここでの 説明より優先してcannaのために使われます) これらのようなキーを入力したい場合、以下のように一時的にキー入力 encodingを切替える必要があります: :set inputencoding=none キー入力、端末出力、ファイル入出力のための多国語encoding解析器/ 生成器はそれぞれ別々に実装されていて、動作がそれぞれ異なります。 これは以下の理由によります: - キー入力は中途半端な状態の入力を処理しないといけません。 - 端末出力はcursesの制限から全ての文字セットをG0に指示しないと いけません(sjis等の単一言語encodingの場合8bitも使えますが)。 - ファイル入出力は中では一番簡単なので、結構完全にできます。 中国語のencodingの自動判別は原理的にほとんど不可能です。 canna入力モードへの移行キー(:set cannakeyで設定)は全てに優先します。 このため、例えばこれをcontrol-Oに設定すると、キー入力にcontrol-Oが あった場合それをSIと解釈できません。 もしcannakeyをcontrol-Mに設定すると、リターンが二度と打てなくなります! canna入力モードへの移行キーは慎重に設定してください。 viコマンドのうちいくつかは、他のviコマンドの組みあわせで実現 されています。例えば、Sコマンドはc_コマンドとして実現されています。 C/D/S/Yのコマンドはこのように作られています。fepkeyオプションは 実際の実現に使われるコマンド名を対象にfence制御を行います。 このため、cコマンドについてfence制御をonにすると、Sコマンドについても 自動的にfence制御がonになります。 詳細はvi/vi.cのv_alias()を参照。 wrapmargin/wraplenオプションが設定されている場合、viのW/Bコマンドで 認識される単語境界で行が区切られます。このため、英語以外の行では ときどき行末の長さが揃わなかったりします。 多国語の行の区切り方についてよい方法はないか模索しているところです。 なにか意見があったらお知らせください。 中国語/韓国語の自動判別についてはチェックが甘いです。 お気軽に御意見をお寄せください。 iso-2022-*系のエンコーディングをキーボード入力に利用している場合、 ESCのあとのタイムアウトが長くなってしまっています(2倍に延びて しまいます)。 このパッチをあてた場合、原作nviのドキュメントに述べられている 説明文の一部は適用されなくなることに注意してください。 例えば、locale関連のもの(nvi-1.79/FAQのいちばん最初の質問、とか) はnvi-m17nに関して正しくありません。 nvi-m17nをiso-2022のエスケープシーケンスを正しくサポートしていない 端末上で利用した場合、nvi-m17nの起動時に、画面左上に"B"が残る ことがあります。これは、ASCII文字セットをG0(=GL)に呼び出すための "ESC ( B"が端末に正しく処理されなかったために表示されます。 nvi-m17nは起動時に、ASCII文字セットをG0(=GL)に呼び出すために 必ずこのシーケンスを出力します。 もしこの挙動が気になる場合には、curses/refresh.cの以下の行を 変更してください(関数putdesig()の中です): 配布時: static enum { NO, ASCII, CACHED } prevstate = NO; 変更後: static enum { NO, ASCII, CACHED } prevstate = ASCII; この場合、nvi-m17nは、nvi-m17nの起動時にはASCII文字セットが G0(=GL)に呼び出されていると仮定して動作します(多くの場合、 これは正しい仮定とは言えません)。 カーソルキー(termcapのku/kdなどで定義されたエスケープシーケンスの 入力)による移動は、うまくいかないことがあるようです。これはかなり 多数の原因が混じっていますが、作者がカーソルキーなんて使う気がない ため、あまりまじめにおっかける気がありません。 感想・意見 バグやコメントは以下のいずれかの方法で送ってください: web: http://www.itojun.org/cgi-bin/gnats-send-pr e-mail: nvi-m17n@dit.co.jp その際、patchのバージョン番号を明示してください。 作者 Jun-ichiro itojun Hagino (Jun-ichiro Itoh) itojun@itojun.org Contribution to the author, in any form (example: just say "thanks"), is always appreciated.