JVimには 様々な機能を持ったコマンドが多数ありますが, 自分の良く使う操作が
たまたま運悪く 打ちにくいキー操作だったりすると嫌なものですよね
たとえば「ファイルの先頭へ行く」という操作は 1G と打つのですが 意外とこれが面倒に感じたりします.(← これって私だけかな ??) こんな時に, 設定ファイルに
map Q 1G
と書いておくか, :map Q 1G と打てば, Q キーを押しただけで
ファイルの先頭に移動できるように
なります. つまり "Q"を打つと "1G" と押したことと同じ効果が
得られるようになるのです. このように, 特定のキーに 一連の操作を
割り当てることを「マップを定義する」などといいます. ここでは
マップ関連の操作について ひととおり説明します
キーに機能を割り当てるには, 最初の例のように…
map (こうすると) (こうなる)
みたいな形式で書きます. 割り当てるキーが通常の文字じゃなくて 例えば「コントロールを押しながら"A"」のような制御文字の場合は 本物の制御文字をそのまま書くようにします. 同様に, 割り当てる操作のほうも (Return)や Escキーを押すという時は 本物の制御文字として書かなければ いけません. たとえば CONT-A を押したら行番号が表示されるような マップを書きたいのであれば
map ^A :set number^M
のように書き, この "^A"とか "^M" という文字は実際の制御文字で, これを 入力するには "^A"なら挿入モード中に CONT-V CONT-A という操作 で入力するし, "^M"なら CONT-V を押してから(Return)キーを押します. たとえば
map (コントロールを押しながらPage-Upキー) 1G
のような割り当てをしたいと思ったら CONT-V を押した直後に 実際にコントロールを
押しながら PageUpキーを押して入力してみて下さい. おそらく何か変な文字が
いくつか入力されると思いますが とりあえず動けばラッキー(!)
だと思います. 端末などの設定によっては あまり特殊なキーは うまく動かない
ことが多いので, これで動かなくても JVimのせいじゃありません(多分). そのような時は
素直にあきらめましょう
…というわけで, これだけの知識でも コマンドモード中のキーをある程度カスタマイズして
遊ぶことができると思います
mapコマンドは 普通は「初期設定」として .vimrcや .exrcファイルの中に
一行づつ書きます. setコマンドのようにコメントを
書くことはできませんので それだけは注意して下さい
JVimの起動中に, 一時的にmapを試したい場合には, :(コロン)を打ってから
map なんとかかんとか… のように打てば, それ以降有効となります
ちょっと非現実的な例ですが…
map j k
map k j
のようなものを書いて j と k コマンドを入れ換えたいとします. でも
これはうまく動きません. 何故なら… "j"を押した瞬間, JVimはこれを "k"コマンド
だと解釈しようとしますが, 今度は"k"コマンドは"j"コマンドにマップされているので
永久に解釈し続けるような状況になってしまうからです. 実際には 1000回解釈した
時点でエラーメッセージを出すだけなのですが…とにかく これは出来ません
マップ内容の再解釈をしないようにさせるためには
noremap j k
noremap k j
で, 出来ます. noremap コマンドは 再解釈をさせないマップをさせるコマンド
です. 再解釈させるような複雑なマップを設定したい人は少ないでしょうから
多くの場合は mapよりも noremapのほうが安全で 使いやすいと思います
「マップの内容を再解釈させるようなマップなんて絶対に書かないぞ」と断言できる
人は remap オプションを解除すれば, 通常の mapでも再解釈を
しなくなりますので お好みでどうぞ
マップの定義を解除(やめたい)場合は :unmap ^A などと 解除したいキーを
指定すると, それ以降は mapが無効となります
ただ単に :map とだけ打つと, 現在設定されているmapの一覧を
見ることができます
今までの説明は どれもコマンドモードで有効なキー操作のマップばかりでしたが
imap ^B ^Ok
のように imap コマンドで挿入モード中のマップを定義できます. 使い方は
通常の mapと同じですが, 挿入モード中で使うわけですから 通常の文字に
コマンドを割り当てると「その文字を入力したい時に困る」ので
注意が必要です. こんな時でも CONT-V を押した直後にマップされたキーを
押せば「imapの解釈をさせずに」入力することが可能です
mapの時と同様に, inoremap で再解釈させないマップを定義でき,
iunmap コマンドでマップを解除できます
:(コロン)や /を打ってコマンドラインに
カーソルがある時に使えるキーも
マップ設定できます. 定義は cmap で設定します. これも同様に
cnoremap で再解釈させないマップが定義でき, cunmap で
マップ定義を解除できます
端末(の設定)によっては CONT-V の直後にファンクションキーを押すことで うまくマップ定義ができるものもあるかと思いますが
map #6 /
のように #(番号) という形式で書くと,「ファンクションキーへのマップ」と
解釈されます. 設定によっては これでもうまくできない場合もあります. ちなみに
この例だと「F6キーで検索」するようにしてますね
mapによって, かなり長い複雑な操作も キーをひとつ押すだけで出来るように
なるのですが, 困ったことに JVimは ほとんどのキーは すでに何らかのコマンドが
割り当てられていて, 新しい機能を割り当てたい時に困るかも知れません. さらに
現在のJVimには「空いているキーを調べる」方法が無いので マニュアルなどを
見ながら探すことになります. もしそれで空いているキーが見つかったとしても
せいぜい数個だと思うし, 「何か良い方法は無いかな…?」と思うことでしょう
そんな時のために #a とか #b …のような「二文字のコマンド」を作るようにすると きつい制限から解放され, かなり自由になれます. 私の場合は
map #ls ^Wn:0r!ls^M
のような「三文字」のマップも使ってます
この例ではマップの最初の文字が "#"なのですが… JVimでは # は
「カーソル位置の文字列を前方に検索」というコマンドなので これとの関係を
多少考慮しなければならなくなります. このように "#"コマンドがありながら
#a とか #ls といったマップを定義してしまうと # を押した
瞬間には何も起きなくなります. "#"が押された後に 何か文字が打たれるのを
(JVimが)待つようになるからです. そして その後に "a"がくれば, 対応した
処理が開始されるわけだし, "ls"が来れば, これまた対応した処理をします. …では
「単独の "#" コマンドは使えなくなったのか ? 」というと そうでもなくて,
# を押してから一秒間, マップに関係する文字が入力されなかった場合に
通常の # コマンドとしての動作をします
このような二文字以上のマップがある時には,「制限時間」があって, 〜秒以内に
マップとなるべき文字が入力されなかった場合は 一文字目が単独で入力されたと
みなすのです. この「制限時間」は オプション timeoutlen で設定します
とすれば (1秒=1000という単位なので) 2秒の制限時間を設けることになります. あるいは
この時間を「無制限」にしたい場合は この機能自体を set notimeout と
して解除できます
私の場合は map ## # として 一秒待たなくても # コマンドが ## と
打って使えるようにしています. このへんは好みで いろいろ工夫してみて下さい
二文字以上のマップを使うためには "#"文字よりも _ のほうが良いかと
思います. _ は, 直前に数値を指定しなければ何も起こらないので
わりと安全だと思うからです. 他にも自分の好みの文字を探していろいろやって
みましょう
生まれて初めて使うテキストエディタが JVimだったという人なら関係ありませんが…
今までのマップ関連の解説を読んで, 「前に使っていた(なんとか)エディタに
指がなじんでしまっているから」他のエディタの操作に似たようなキーに変更したく
なった人もいるんじゃないかと思います. しかし こういったカスタマイズは
うまくいかないと思います. Vi(風)のエディタは 他のエディタと設計思想が
全く(というか, かなり)違うので 最初から「今までとは全く違う世界」として
受け入れたほうが絶対に良いです
そんな風に使うのではなくて, 複雑な操作をキー操作ひとつで片付けるといった
目的で使うのに適しています
あるいは「このコマンドの挙動をちょっとだけ変更したい」時にも使えます. たとえば
:noremap yy 0y$ などとして「文字指向でyankするyy」コマンド
を作ったりできます. でも…このような「既存のコマンドの書き潰し」は,
控え目にしたほうが良いとは思います
mapコマンドは 実は かなり奥が深く, 他のいろいろなコマンドを知っている前提でないと
解説が難しいところもあるので とりあえず初心者向けのmap解説は これくらいに
しておきます. この続きは中級者向けの解説でどうぞ