<!doctype linuxdoc system>

<article>

<title>viを使い倒そう
<author>はっとりまさあき
<date>last update: Mar. 14, 2009
<abstract>
この文書は<bf/vi/というテキストエディタの使い方に関するものです。
といっても本物のvi(Solaris等の商用UNIX付属のviでしょうか?)は、
Linuxディストリビューションには入っていませんので、
viクローンの使い方です。文書内ではviクローンをviと呼んでいます。
<!--
ここではLTGP(Linux Total Guide Project)で私が管理を担当する
<bf/vi/というテキストエディタの使い方に関する文書を公開しています。
といっても本物のvi(Solaris等の商用UNIX付属のviでしょうか?)は、
Linuxディストリビューションには入っていませんので、
viクローンの使い方です。文書内ではviクローンをviと呼んでいます。<newline>
<url url="http://www.misao.gr.jp" name="&lsqb;LTGP HomePageに戻る&rsqb;">
-->
</abstract>

<toc>

<sect>viとは?<p>
viとはLinuxはもちろん、多分すべてのUNIX系OS上で必ず使えるテキストエディタです。
テキストエディタとは、ASCIIコードや日本語文字コード(EUC, JIS, SJIS)
で書かれた文書ファイルの作成や編集をするためのソフトウェアです。
emacs/xemacs、Windowsのメモ帳(notepad)や秀丸エディタ等と機能的には同じものです。

Windowsユーザーでメモ帳(notepad)を使ったことがない人は珍しくないと思います。
ところが、Linuxを始めとするUNIX系のOSでは、
ユーザーの文書やプログラムソースだけでなく、
各種ドキュメントや非常に重要なシステム設定ファイルに至るまで、
多くのファイルがテキスト形式になっており、
これらに変更を加えたり、新たに作成したりするためには、
テキストエディタは必要不可欠なものなのです。

viはこれまで、UNIX上の標準的エディタとして管理者用途から一般ユーザーの文書作成まで、
広く利用されてきました。
ところが諸々の経緯により通常のエディタとはちょっと変わった操作方法になっているがゆえに、
これまで多くのLinux(UNIX)入門者を苦しめ、追い払って(?)きました。
<quote>
この辺の話は、やや古めのUNIXの入門書等にでているかも知れません。
興味のある方は調べてみて下さい。
</quote>

emacsがあればユーザーレベルのファイル編集のお仕事は事が足りますが、
Linuxを管理する上で不可欠な、
rootでの各種設定ファイルの編集操作はviで行うのが一般的です。
Linuxは個人で使われることが多いでしょうから、
ユーザーがrootでもあることがほとんどだと思います。
ですから、これからLinuxを始めようという貴方が
 
<bf/viを知ることに全く損はない/
 
と断言します。
  
一般的なエディタではカーソルの移動や文字の削除の操作は、
指をホームポシションから離さなくてはならないことが多いですが、
viはホームポジションに手をおいたままあらゆる編集操作が可能な点が特徴の一つです。

emacsでもそうした設定になっているようですが、
 <tt/&lsqb;Ctrl&rsqb;キーや&lsqb;ESC&rsqb;キー/
(<tt/&lsqb;Alt&rsqb;/キー)
とアルファベットキーを組み合わせたコマンド体系に私の指がついていかず、
私の手にはいまだに馴染んでいません。ということで、
私はプログラムコーディング・文書作成・編集作業・メール作成等の作業をすべて
viで行なっています。

<quote>
と言いながら、最近はxemacs+Mewでメールを読み書きすることが多いです。
それ以外は当然viですが。
</quote>


<sect>なぜviなのか?<p>
システム構成やそのときの状況によるので一概には言えないことですが、
viの必要性について私なりに考えたことを以下に書きます。

万が一、ハードディスクトラブルなどでLinuxがシステムダウンした際には、
レスキューフロッピーやシングルユーザーモードでシステムを立ち上げて、
設定ファイルの内容を書き換えたりしてシステム復旧を試みるわけですが、
このような場合emacsよりもviが動く可能性が高いです。

それは、emacsはviよりもかなり大きなプログラムでディスク占有率も大きいため、
ディスククラッシュの際、emacsに関わるデータが破壊されている可能性が確率的に高くなり、
結果的にコンパクトなviが生き残る可能性があるためです。

レスキューフロッピーで立ち上げた場合などでも、
/binディレクトリが生きていてこれがmountできればviは使えます。
一方emacsは、/usr以下の諸々のファイルが生きていないと動作に不都合を来たすと考えられます。

また、viはコンパクトですから、レスキューフロッピーの中にviを仕込んで置くことも可能です。
emacsは当然フロッピー1枚に収まるサイズではありません。

そんなわけで、viも使えた方が何かと便利ですよ、とここでは薦めています。 

<quote>
(余談1)<newline>
Linuxの入門書等では、
「ユーザーがrootでもあることがほとんどなので、
tcshよりbashを覚えた方が、起動スクリプト等の見通しが良くなるし、
一つのシェルを覚えるだけでよいので、お勧めです!!」
という紹介がよくあります(私自身もtcshよりbashが便利な部分が多いとは思います)。
ならば、エディタだってrootが必ず使う必要のあるviを勧めるのが筋では?
と少し思ったりしますが<bf/"emacsは環境である"/という言葉もあるので、
環境にはなり得ないviの肩身は狭いのかも知れません。
それでも私はこれからもviを使い続けるでしょう
(emacsも使えたらかっこいいだろうな、と思いつつ)。
</quote>


<sect>これだけ覚えれば使えます(1st Step)<p>

<sect1>起動方法<p>
Xのkterm、xterm、rxvt等のターミナルウィンドウ、
あるいはXの起動していないコンソール上で次にようにして起動してみます。
viはLinuxのどのディストリビューションにも必ず付属されるエディタですから、
特別な環境設定なしで動きます。
この例ではtest.txtという新しいテキストファイルを作成します。

    <verb>
    # vi test.txt

    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    ~
    "test.txt" [New File]
    </verb>

こんな具合に画面が切り替わり、viが起動したはずです。

次は何もせずに終了してみましょう。

<tt/:q!&lsqb;ENTER&rsqb;/と入力します。

    <verb>
    # vi test.txt
    #
    </verb>

となり終了しました。


<sect1> すべての操作はコマンドで!!<p>

  viではすべての操作をコマンドを入力することで行います。
  以下に基本的な操作方法(コマンド)を示します。

    <descrip>

    <tag/文字列挿入系の操作/
      カーソルの前に文字列を挿入 : <tt/i押し、文字列&lsqb;ESC&rsqb;/

      カーソルの後に文字列を挿入 : <tt/a押し、文字列&lsqb;ESC&rsqb;/

      カーソルの下に文字列を挿入 : <tt/o押し、文字列&lsqb;ESC&rsqb;/

      カーソルの上に文字列を挿入 : <tt/O押し、文字列&lsqb;ESC&rsqb;/

    なお、文字列の中には、改行とかスペース、タブも含まれます。
    また、文字列入力中の修正・削除は<tt/&lsqb;BS&rsqb;/キーで可能です。
    文字列の入力が終り、別の編集作業に移る場合には、必ず<tt/&lsqb;ESC&rsqb;/を
    押して下さい。文字列挿入系以外の編集操作が可能となります。

    最近のviは、デフォルトで文字列挿入状態になると画面(viのスクリーン)の左下に
    <tt/&lsqb;INS&rsqb;/
    とか
    <tt/-- INSERT --/
    といった 表示がされるようですので、
    文字列挿入可能になったかどうかの判断は、
    これを目安にするとよいでしょう。
  <tt/&lsqb;ESC&rsqb/を押すとこの表示は消えます。

    <tag/カーソル移動系の操作/
      カーソルを一つ左(←)に移動 : <tt/h/

      カーソルを一つ下(↓)に移動 : <tt/j/

      カーソルを一つ上(↑)に移動 : <tt/k/

      カーソルを一つ右(→)に移動 : <tt/l/

    最近のviはいわゆるカーソルキーでもカーソル移動ができますが、
    これではviを使う意義も半減してしまいます。
    もしviを使い込んでみようと思い立ったら、
    このカーソル移動方法を身体に覚え込ませましょう。
  
  また、"less"というテキストファイル表示コマンドがありますが、
  このカーソル操作もほぼviと同じです(上下移動のみです)。

    <tag/削除系の操作/
      カーソル位置の1文字を削除 : <tt/x/

      カーソルのある行を削除 : <tt/dd/

    <tag/保存終了/
      <tt/ZZ/<newline>

    </descrip>

 <sect1>大切なモードのお話<p>

 ところで、viには大きく分けて3つの動作モードがあります。
 <itemize>
 <item>文字を入力する
 <bf/"インサートモード"/
 <item>文字列の編集作業をする
 <bf/"コマンドモード"/
 <item>ターミナルの左下に<tt/:/(コロン)あるいは<tt>/</tt>(スラッシュ)を出して作業をする
 <bf/"exモード"/
 </itemize>
 vi上の作業はこれらのモードを行ったり来たりしながら行ないますが、
 この切替を行なうのが<tt/&lsqb;ESC&rsqb;/キーと文字列挿入系コマンドです。
 また、exモードにはコマンドモードで<tt/:/あるいは<tt>/</tt>を入力すると切り替わります。
 切り替わると、ターミナルの左下に<tt/:/あるいは<tt>/</tt>が表示され、
 コマンド待ち状態になります。

 特に<tt/&lsqb;ESC&rsqb;/キーは文字列入力を抜ける場合に使うだけでなく、
 今自分がviをどちらのモードで使っているのかわからなくなってしまった場合や、
 打ち込んだコマンドをキャンセルする場合に押すという重要な機能があります。
 <tt/&lsqb;ESC&rsqb;/キーを入力した場合のアクションは次のようになります。

 <descrip>
 <tag/コマンドモードだったら.../
  ビープ音がなってコマンドモードがリセット状態に戻ります。
 <tag/インサートモードだったら.../
  音は鳴らずにコマンドモードに切り替わります。
 <tag/exモードだったなら/
  ターミナルの下に表示されていた<tt/:/が消えてコマンドモードに切り替わります。
 </descrip>

 ですから、何か作業をする前に必ず<tt/&lsqb;ESC&rsqb;/キーを押す癖をつけることで、
 意図しない妙な入力ミスや編集処理を回避できます。

 ということで、viを使う際の座右の銘(?)として、

 <quote>
 <bf>困ったとき、何かする前にはまず<tt>&lsqb;ESC&rsqb;</tt>キー</bf>
 </quote>

 をあげておきます。これ以降コマンドの解説が出てきますが、
 実際に使ってみる場合には、
 事前に<tt/&lsqb;ESC&rsqb;/キーを忘れずに入力して下さい。

 <quote>
 xtermなどで-vb(visual bell)オプションを設定している場合は、
 ビープ音の代わりに画面がフラッシュします。
 </quote>

 <quote>
 (余談2)<newline>
 私事ですが、私はNEWS-OS(3.x)でUNIXを使い始めました。その頃のNEWS-OSには、
 エディタはviしかなかったので(emacsは当時のマシンには非常に重いソフトだった)、
 半分仕方なしに、キーボードと格闘しながら覚えました。ところがしばらくすると、
 vi以外のエディタはかったるくて使えなくなってしまいました。
 MS-DOS上でもviクローンのjstevieを使っていたくらいです。
 一般的にUNIXのツールには、
 とっつきは悪いけど慣れると手放せなくなるものが多いです。
 文書組版ツールのLaTeX、
 グラフ作成ツールのgnuplot、
 作図ツールのtgif、
 テキスト処理ツールのawk/sed、
 そして<bf/vi/が私にとってはそれにあたります。
 これらがないと、私の本業で頻繁に行うデータ整理やドキュメント作成はできません。
 </quote>

  これまでの説明の範囲で最低限のviの操作が可能ですが、
  本格的にviを操作する上で知っていると便利な使い方、
  というか私が日頃viを使う上で欠かせない使い方を、
  次のセクションで御紹介します。実はもっといろいろな機能がある(らしい)のですが、
  私の把握している範囲でよく使う機能、ということで御理解下さい。


<sect>少し進んだ使い方(1) -コマンドモード- (2nd Step)<p>

  <sect1> 作業の取消をしたい(アンドゥ)<p>
  <tt/u/

  <sect1> カーソルのある行の先頭/末尾にカーソルを移動したい<p>
  カーソルを行の先頭に移動 : <tt/0/

  カーソルを行の末尾に移動 : <tt/&dollar;/

  <sect1> 現在ページの先頭行/末尾行にカーソルを移動したい<p>
  先頭行 : <tt/H/

  末尾行 : <tt/L/

  <sect1> カーソル位置の上下ページにジャンプをしたい<p>
  カーソル位置から1ページ下に移動 : <tt/&lsqb;CTRL&rsqb;+f/

  カーソル位置から1ページ上に移動 : <tt/&lsqb;CTRL&rsqb;+b/

  <sect1> カーソルのある行と次の行を連結したい<p>
  <tt/J/

  <sect1> N文字単位のカーソル移動をしたい<p>
  右方向にN文字移動 : <tt/数字Nを押し、l/

  左方向にN文字移動 : <tt/数字Nを押し、h/

  <sect1> N行単位のカーソル移動をしたい<p>
  上方向にN行移動 : <tt/数字Nを押し、k/

  下方向にN行移動 : <tt/数字Nを押し、j/

  <sect1> N文字単位のコピーとペースト(貼り付け)をしたい<p>
  右方向にN文字 : <tt/数字Nを押し、ylし希望カーソル位置でp/

  左方向にN文字 : <tt/数字Nを押し、yhし希望カーソル位置でp/

  <sect1> カーソルのある1行のコピーとペースト(貼り付け)をしたい<p>
  カーソルの下の行にコピー : <tt/Yを押し、希望カーソル位置でp/

  カーソルの上の行にコピー : <tt/Yを押し、希望カーソル位置でP/

  <sect1> N行単位のコピーとペースト(貼り付け)をしたい<p>
  上方向のN行(1) : 
  <tt/数字Nを押してyk、次に希望カーソル位置でp/を押すとカーソルの下の行にコピー

  上方向のN行(2) : 
  <tt/数字Nを押してyk、次に希望カーソル位置でP/を押すとカーソルの上の行にコピー

  下方向のN行(1) :
  <tt/数字Nを押してyj、次に希望カーソル位置でp/を押すとカーソルの下の行にコピー

  下方向のN行(2) :
  <tt/数字Nを押してyj、次に希望カーソル位置でP/を押すとカーソルの上の行にコピー

  <sect1> 1文字だけ書き直しをしたい<p>
  書き直したい文字の上にカーソルを重ね、<tt/r/を押して正しい文字を入力

  <sect1> 1単語だけ書き直しをしたい<p>
  書き直したい単語の先頭にカーソルを重ね、<tt/cw/、次に正しい文字を入力

  <sect1> N文字だけ書き直しをしたい<p>
  書き直したい単語の先頭にカーソルを重ね、<tt/数字Nを押してcl/、次に正しい文字を入力

  <sect1> 直前操作の繰返しをしたい<p>
  <tt/./(ピリオド)を押す。
  同じ文字列を何回も挿入するような場合に便利で、
  私は個人的にこのコマンドが最も好きです。


<sect>少し進んだ使い方(2) -exモード- (3rd Step)<p>

  <sect1> 別の名前で保存をしたい<p>
  <tt/:w NewFilename&lsqb;ENTER&rsqb;/

  もし、<tt/NewFilename/が存在する場合には、
  <tt/:w! NewFilename&lsqb;ENTER&rsqb;/

  <sect1> viを操作中に一時的にシェル操作をしたい<p>
  <tt/:sh&lsqb;ENTER&rsqb;/で一時的にシェルに戻れます。
  再度viに戻るときは<tt/exit/コマンドを使います。

  <sect1> 文字列の検索をしたい<p>
  <tt>/検索したい文字列&lsqb;ENTER&rsqb;</tt>
  でカーソルが所望の文字列に移動。

  <tt/nを押すとページ下方を検索、Nを押すとページ上方を検索/。

  <tt>"/"(スラッシュ)、"&bsol;"(バックスラッシュ、円マーク)、"."(ピリオド)</tt>等の
  記号を含んだ文字列を検索する場合には、これらの記号の前に、
  <tt>&bsol;(バックスラッシュ)</tt>をつける必要があります。また、
  日本語対応のvi(jvim,jelvis)を使っている場合は、文字列に日本語を使えます。

  <sect1> 文字列の置換をしたい<p>
  <tt>:&percnt;s/置換前文字列/置換後文字列/&lsqb;ENTER&rsqb;</tt>
  でカーソル近辺の文字列を1つだけ置換。

  <tt>:&percnt;s/置換前文字列/置換後文字列/g&lsqb;ENTER&rsqb;</tt>
  で文書内の該当文字列をすべて置換。

  <tt>:B,Es/置換前文字列/置換後文字列/g&lsqb;ENTER&rsqb;</tt>
  で行番号B〜E内の該当文字列をすべて置換。

  日本語対応のvi(jvim,jelvis)を使っている場合は、文字列に日本語を使えます。


<sect>少し進んだ使い方(3) -マークを用いた編集作業- (4th Step)<p>

 MS-DOSやWindowsのテキストエディタでは、
 領域を指定してから削除やコピーを行なうことができますが、
 もちろんviでもできます。これもコマンドで行ないます。
 viのマークはマークをつけても文字が反転表示されたりしないので、
 ちょっと色気がないかも知れませんが、やりたいことはできます。

 <sect1>マークの付け方<p>
 <enum>
 <item>マークを付けたい先頭位置にカーソルを移動する。
 <item><tt/mx/(<tt/x/はアルファベットなら何でもOK)
 <item>マークを付けたい終了位置の次の位置にカーソルを移動する。
 <item><tt/`(バッククォート)x/と入力すると、
     マークをつけた位置にカーソルが戻る(マーク位置の確認)。
 </enum>

 <sect1>マークで領域指定しての削除<p>
 <enum>
 <item>マークを付けたい先頭位置にカーソルを移動する。
 <item><tt/mx/(<tt/x/はアルファベットなら何でもOK)
 <item>マークを付けたい終了位置の次の位置にカーソルを移動する。
 <item><tt/d`(バッククォート)x/と入力すると、
  マークをつけた位置から現在カーソル位置の手前まで文字(行)が削除される。
  削除された文字(行)はバッファに入っているので、
  所望のところで貼り付け(<tt/pあるいはP/)することはもちろん可能。
 </enum>

 <sect1>マークで領域指定してコピー<p>
 <enum>
 <item>マークを付けたい先頭位置にカーソルを移動する。
 <item><tt/mx/(<tt/x/はアルファベットなら何でもOK)
 <item>マークを付けたい終了位置の次の位置にカーソルを移動する。
 <item><tt/y`(バッククォート)x/と入力すると、
    マークをつけた位置から現在カーソル位置の手前までの文字(行)がバッファに入る。
 <item>コピーしたい位置にカーソルを移動して、<tt/p/あるいは<tt/P/。
 </enum>

 <quote>
 (参考:jvim/vimの領域指定の方法)<newline>
 vimおよび日本語対応viのjvimでは、
 領域指定をMS-DOS/Windowsのエディタのように行なうこともできます。<newline>
 <tt/v/(小文字)を押し、カーソルを移動させるとカーソルが移動した領域の文字が反転表示されて、
 マークをつけたのと同じになります。
 また、<tt/V/(大文字)を押すと、カーソルのある行全体が反転表示され、
 この状態でカーソルを上下に移動させると、行単位での領域指定が可能です。
 いずれの方法も所望の領域を反転表示させてから、
 <tt/d/で削除、<tt/y/でバッファにコピーが可能です。
 この方法の領域指定を解除する場合は、<tt/v/あるいは<tt/V/を押すか、
 <tt/&lsqb;ESC&rsqb;キー/を押してカーソルキーのいずれかを押すと、
 指定が解除されます。後者の場合はビープ音がなるでしょう。
 </quote>


<sect>初期化ファイル<tt/.exrc/の書き方(5th Step)<p>
 次に、viの起動時に環境設定用として読み込まれる<tt/.exrc/というファイルを紹介します。
 これは、次のようなviの動作環境を設定するためのファイルで、
  通常はユーザーのホームディレクトリに置かれます。

 <itemize>
 <item> タブ幅をカーソル何個分にするか(tabstop)
 <item> 行番号を表示するか(number)
 <item> 先頭にタブをつけた行で改行した場合、
        次行のカーソル位置をタブをつけた位置にするかどうか(autoindent)
 <item> 文字列挿入モードの表示を行なうか(showmode)
 <item> 括弧を閉じた時に、これと対になる頭の括弧にカーソルを飛ばすか(showmatch)
 </itemize>

 showmatchは、
 ネストが深いルーチンで括弧が確実に閉じられているかどうかを確認することができるので、
 通常の文書作成時よりもC言語等でプログラムを作成する際に便利です。

 次に私の使っている<tt/.exrc/の例を示します。

 <code>
    set tabstop=2
    set showmode
    set autoindent
    set nonumber 
    set showmatch
 </code>

 例えば、showmode、autoindentをOFFにしたい場合は次のようにします。
 要は<bf/no/をつければいいだけです。
 ただ、defaultでOFFの設定の場合は、そのエントリを外せば良いです。

 <code>
    set tabstop=2
    set noshowmode
    set noautoindent
    set nonumber 
    set showmatch
 </code>


 
<sect>viによる日本語入力(6th Step)<p>

  <sect1>はじめに<p>
  Kondara MNU/LinuxやVine Linuxといった最近の日本語対応ディストリビューションでは、
  Wnn、Cannaを問わず、個人で特に設定することなくkinput2による日本語入力が可能になっています。
  ですので、以下の説明はやや時代遅れの内容となっていますが(2001/02/26現在)、
	参考のため、作成時の内容のまま載せます。

  こうした便利な環境の構築をしていただいたディストリビューション開発者の方々に感謝いたします。


  <sect1>日本語対応viのための環境設定の方法<p>

    <tt>/bin/vi</tt>は日本語に対応していない場合がありますので、
    日本語の文書を入力する場合は、マルチバイト対応<tt/vim/、<tt/nvi/、<tt/jvim/、
   <tt/jelvis/といった日本語入力に対応したviクローンを使う必要があります。

  viによる日本語入力を常用する場合は、
  これらのコマンドを"vi"という名前で起動できるように、
  コマンド名の別名置換の設定をするのが便利です。

  以下はjvimが/usr/local/bin/にある場合の例です。

    <sect2>bashを使っている場合<p>
    ホームディレクトリの<tt/.bashrc/に設定を書き加えます。
    <verb>
      # cd
      # vi  .bashrc
       (以下の設定をファイルの後ろの方に追加して保存終了します)
      alias vi='/usr/local/bin/jvim'
      # source  .bashrc
    </verb>

    <sect2>csh,tcshを使っている場合<p>
    ホームディレクトリの<tt/.cshrc/に設定を書き加えます。
    <verb>
      % cd
      % vi .cshrc
       (以下の設定をファイルの後ろの方に追加して保存終了します)
      alias vi '/usr/local/bin/jvim'
      % source  .cshrc
    </verb>

  <sect1>日本語変換の方法<p>

    emacsでは、cannaやWnnの日本語変換サーバと直接やりとりして日本語変換処理を行ないますが、
    viでは私の知る範囲で5つの方法があります。

   <itemize>
      <item>  kinput2を使う(canna,Wnn4/6)
      <item>  xwnmoを使う(Wnn4/6)
      <item>  vje-deltaを使う(vje-delta)
      <item>  uumを起動した端末上でvi(jvim)を起動する(Wnn4/6)
      <item>  jvimでonewを起動する(canna, Wnn4/6)
   </itemize>

  最初の3つはX環境でしか使えませんが、
  後の2つはkonというコンソールを日本語化するソフトを動かせば、
  コンソール上でも使えるはずです。
  
  これらの方法それぞれについての解説は、
  viの解説を趣旨とする本文書の範囲を越えてしまうのでここでは説明しません、
  と言いたいところですが、それでは困ってしまう方もいらっしゃいますので、
  ここでは、私が日頃使っている
    <bf/Wnn4.2(Wnn6)+kinput2/
  による日本語入力についてのみ簡単に解説します。

  <sect2>日本語変換辞書サーバ(jserver)の起動<p>
  日本語変換処理をしてくれる辞書の機能を持つのがこれです。
  Wnnの場合、jserverというプログラムがこれを担当しています。

  例えば以下のようにjserverのプロセスが表示されれば、
  jserverは動いています(これはWnn4.2のインストールしてある私のマシンの例です)。

  <quote>
  Wnn4.2は今は、FreeWnnという名前になっています。
  </quote>

  <verb>
  #ps ax | grep jserver
  140  ?  S    0:23 /usr/local/bin/Wnn4/jserver
  #
  </verb>

  上の例のようにjserverのプロセスが表示されなかった場合、
  まずは手動で起動しましょう。

  <verb>
  # which jserver                  (←jserverの所在確認)
  /usr/local/bin/Wnn4/jserver
  # /usr/local/bin/Wnn4/jserver    (←jserverの起動)
  # ps ax | grep jserver           (←jserverの起動確認)
  12345 ?  S    0:23 /usr/local/bin/Wnn4/jserver
  #
  </verb>

  <sect2><tt/.Xdefaults/の編集<p>
  次に、kinput2をX環境およびviで使うための設定を準備します。
  具体的には、各ユーザーのホームディレクトリにある<tt/.Xdefaults/に設定を追加します。
  この設定は<tt/.Xdefaults/の最後に追加した方が間違いがないと思います。
  この作業はもちろん(?)viで行なって下さい(笑)。

  以下に私の<tt/.Xdefaults/のリソース設定例を示します。
  特に重要なのは、<tt/VT100/云々のところで、
  これがないとktermからkinput2を呼び出すことができませんので、
  viでもkinput2が使えなくなってしまいます。

  <code>
    !!
    !! setup for jserver and Wnn
    !!
    *CcWnn.jserver:  localhost
    *CcWnn.wnnEnvrc: /home/mkhatto/.Wnn4/wnnenvrc
    *CcWnn.ccdef:    /home/mkhatto/.Wnn4/myccdef
    !!
    !! setup for kinput2
    !!
    *VT100*translations: \
      #override Shift<Key>space: \ 
        begin-conversion(JAPANESE_CONVERSION)
    !!
    Kinput2.mappedWhenManaged: false
    Kinput2.width:  1
    Kinput2.height: 1
    Kinput2*ConversionStartKeys: Shift<Key>space
    Kinput2*OverTheSpotConversion.modeLocation: bottomleft
    !!
    *KinputProtocol.BackwardCompatible: true
    *KinputProtocol.XlcConversionStartKey:  Shift<Key>space
    !!
    !!
  </code>

  <sect2>viを起動するターミナル<p>
  X環境でviを使って日本語入力する場合、
  viを起動するターミナルが日本語に対応していなければなりません。
  Linuxの場合、ktermやrxvtがこれにあたります。xtermは日本語に対応していません。

  <sect2>kinput2の起動<p>
 kterm等から、次のように入力して下さい。
 特に問題がなければ、寡黙に起動されます。

  <verb>
  # /usr/X11R6/bin/kinput2 -jserver localhost & 
  #
  </verb>

 警告メッセージが出てkinput2がうまく起動されない場合の多くは、
 Wnn(jserver)の設定がうまくいっていない場合です。
 日本語環境に対応したディストリビューションで、
 Wnnを正常にインストールしてあれば、
 こうした問題はほとんど発生しないはずですが、もし問題が発生した場合は、
 Wnn関係のパッケージを再インストールするとよいでしょう。

  <sect2>変換開始と終了<p>

 先ほど説明した<tt/.Xdefaults/のリソース設定の中に実は起動の方法が書いてあります。

 <code>
    !!
    !! setup for kinput2
    !!
    *VT100*translations: \ 
      #override Shift<Key>space: \
        begin-conversion(JAPANESE_CONVERSION)
    !!
 </code>

 そうです、<tt>&lsqb;SHIFT&rsqb;+&lsqb;SPACE&rsqb;</tt>のキー操作で、
 kinput2による変換開始を行なうことができます。
 このキー設定を変えれば任意のキー操作により変換の開始を行なうことができます。

<!--
 なお、変換終了は<tt>&lsqb;SHIFT&rsqb;+&lsqb;SPACE&rsqb;</tt>で固定のようです。
-->

 <quote>
 この辺りのことは、『Linuxを256倍使うための本』(ASCII)に詳しく出ています。
 よろしかったら御一読下さい。
 </quote>

  <sect2>変換操作とキーの割り当て<p>
 defaultのキー操作は、<tt>/usr/lib/X11/ccdef/rule.func</tt>
 に書かれています。以下にその内容を示します。

 <code>

  # conversion function key bindings

  # function key bindings
  ""  '^J'    ""  convert
  ""  Kanji   ""  convert
  ""  '^C'    ""  convert-s
  ""  '^G'    ""  unconvert
  ""  '^F'    ""  forward
  ""  '^B'    ""  backward
  ""  '^N'    ""  next
  ""  mod1-n    ""  next-s
  ""  '^P'    ""  previous
  ""  mod1-p    ""  previous-s
  ""  Right   ""  forward
  ""  Left    ""  backward
  ""  Down    ""  next
  ""  Up    ""  previous
  ""  '^A'    ""  move-top
  ""  '^E'    ""  move-bottom
  ""  shift-Right ""  expand
  ""  shift-Left  ""  shrink
  ""  '^L'    ""  fix
  ""  '^U'    ""  clear
  ""  '^M'    ""  carriage-return
  ""  '^I'    "^I"  fix
  ""  '^H'    ""  backspace
  ""  Delete    ""  delete
  ""  F1    ""  to-katakana
  ""  mod1-1    ""  to-katakana
  ""  F2    ""  to-hiragana
  ""  mod1-2    ""  to-hiragana
  ""  F3    ""  to-hankaku
  ""  mod1-3    ""  to-hankaku
  ""  F4    ""  to-zenkaku
  ""  mod1-4    ""  to-zenkaku
  ""  shift-Escape  ""  symbol-input
  ""  @keypad   "&"
  ""  @printable  "&"
 </code>
 この場合、
<tt/^C(&lsqb;Ctrl&rsqb;+C)/で変換し、
<tt/^L(&lsqb;Ctrl&rsqb;+L)/で決定するようになっています。
 これを変更したい場合は、次のようにします。

 <verb>
  # mkdir /home/hoge/Wnn4
  # cp /usr/lib/X11/ccdef/ccdef Wnn4
  # cp /usr/lib/X11/ccdef/rule.func Wnn4
  # cd Wnn4
  # chmod u+w ccdef
  # chmod u+w rule.func
  # vi ccdef
    (ccdefを変更)

   .....................

    ### もしあなたがたまごのキーバインディングに慣れているならば
    ### 'rule.func' の代わりに 'rule.eggfunc' をインクルードして下さい
    #   include 'rule.func'
        include '/home/hoge/Wnn4/rule.func'

   .....................

  # vi rule.func
    (rule.funcをお好みのキー設定に変更)

  # kinput2 -jserver localhost -ccdef /home/hoge/Wnn4/ccdef & 
    (自分の設定でkinput2を起動する)

 </verb>

 これで、自分の設定したキー設定でkinput2を起動することができます。

<sect>最後に<p>
 viは実はまだまだここで紹介できない機能を持っていますが、
 何分私自身がこの程度の範囲でしか使っていないものですから、
 この程度の紹介しかできません。ですが、このくらい使えれば、
 仕事でも趣味でもそれなりに使えると思います。

 見た目は地味で寡黙でも、実は高性能のエディタであるviをあなたも使ってみませんか。
 キー操作に慣れた頃には、きっと私みたいにはまっていること請け合いです。

 この文書に関する御意見、御要望は、
 <it>
  <htmlurl url="mailto:mkhatto@gmail.com" name="mkhatto@gmail.com">
 </it>
 までお願いいたします。なおこの文書は配布自由ですが無保証です。


<sect>謝辞<p>
 この文書をまとめるにあたりまして、
 会津大学の木村さんからコマンド周りの説明のコンセプトについて、
 貴重なアドバイスをいただきました。
 またLTGP-MLに御参加の皆様から、貴重な御意見・御要望をいただきました。
 ここで紹介いたします(順不同)。もし、抜けがあったらごめんなさい。

 柴田さん<newline>
 今井さん<newline>
 松浦さん<newline>
 池田＠東北大 さん<newline>
 しん＠未来ネット さん<newline>
 西本＠早大理工情報 さん<newline>
 小野＠京大環境地球 さん<newline>
 Tetsuichi Hosokawa さん<newline>

 また、この文書をJFで公開して頂くにあたりまして、
 JF-MLにご参加の皆様にも御意見をいただききました。
 ありがとうございました。

 この場をお借りしまして、お礼を述べさせていただきます。
 ありがとうございました。


<sect>追記(Mar. 20, 2001)<p>
 最近のディストリビューションでは、viの実体が多様化しているようです。
 特に、libcのglibc-2.x系への移行に伴って、
 日本語が通らないものがパッケージ化されているようです。

<quote>
 実際にはすべてのディストリビューションの調査はできませんので、
 一部推測も入っています。ご了承下さい。
</quote>

 <itemize>
 <item> VineLinuxのviはnviですが、日本語編集が時々おかしくなります
     (2000年12月現在では直っています)。
 <item> RedHat-6.xにはvimが入っていますが、これも日本語がまともに扱えません
     (Alpha版での確認。多分、RedHat-6.x/7Jでは対応しているのではないかと思います)。
 <item> Kondara MNU/Linuxのviはマルチバイト対応のvimであり日本語編集(EUCのみ)が可能です。
 <item> いずれのパッケージでも、
        <tt>/bin/vi</tt>は日本語が通らず、
        <tt>/usr/bin/vi(実体はvimやnvi)</tt>は日本語が通るパターンが多そう。
 </itemize>

 ユーザー環境での日本語入力を伴う文書編集作業はemacs系のエディタ、
 日本語編集の不要な管理者作業用のエディタはvi、
 というような棲み分けが暗黙に行われているのかも知れません。

 なお、Debianのviに関しては、JF-MLで佐野さんから以下のような情報をいただきましたので、
 ここでご紹介します。佐野さんありがとうございました。

<code></code>

 Debian の場合、alternatives という仕組があって、複数の候補の中から
システム管理者が「標準の vi」を選択できます。

ただし、/bin/vi はありません。

「軽いエディタ」としては /bin/ae という vi 風にも emacs 風にも
なるというフルスクリーンエディタが用意されています。

 vi は /usr/bin/vi として用意されていて、実態はシステム管理者の
設定次第で vim/nvi/elvis/jvim/nvi-m17n などのどれにでもできます。

最小インストールだと m17n でない nvi がインストールされますが、
 task-japanese をインストールすれば jvim-canna と nvi-m17n-canna が
インストールされるので、たぶんこの状態なら nvi-m17n-canna が標準の
 vi になっているだろうと思います。

<code></code>

<!--
 私の自宅の環境はVineLinuxですがnviの日本語編集機能の調子が非常に悪いので、
 Slackware+JE時代から愛用している<bf/jvim/をmakeして使っています。
 onewによる日本語変換機能は使っていませんが、
 vim独自の拡張機能と安定した日本語編集環境により、
 私的には非常に効率的な編集作業を得られています。

 個人的にはonewなしでもよいので、
 jvimあるいはKondaraのvimが標準的にインストールされると嬉しいのですが。
-->

 今現在の私の環境はKondara MNU/Linuxですので、標準vimでも日本語は使えることは使えますが、
 それでもjvimを自分でmakeして使っています。その理由はjvimでは、
 <enum>
   <item>helpが日本語化されていること
   <item>JISコード文書の編集も可能なこと
   <item>日本語入力についてはトラブルが皆無であること
 </enum>
 等のメリットがあるからです
 (Kondaraのvimでは改行なしで行をまたいだ日本語入力を行うと表示が壊れてしまい、
 <tt/&lsqb;Ctrl&rsqb;+r/で再表示する必要があるという既知のバグがあります)。

<quote>
jvimは完全に日本語ローカライズされたプログラムなので、
Kondaraの目指すシングルバイナリでの国際化とは思想が異なります。
よって、jvimがKondaraにそのまま入ることはないでしょう。
</quote>

</article>

