第 1 章 Vim のやり方 まコマンド、コマンド、トコマンドはすべてノーマルモードで実行されるが、変更 は挿入モードに入るたびに行われるものでもある。挿入モードに入った瞬間はを押す など ) からノーマルモードに戻る (kEs を押す ) までの間、Ⅵ m はすべてのキース トロークを記録する。このような変更を行ったあとで、ドットコマンドを実行すると このキーストロークが繰り返される ( このときの注意点については 43 ページの「挿入 モードでカーソルキーを使うと、変更がリセットされる」を参照してほしい ) 。 ドットコマンド = マイクロマクロ 第 11 章「マクロ」 ( 211 ページ ) では、 Vim ではキーストロークを好きなだけ記憶し て、あとからその操作を繰り返せるという話をする。この機能を使うと、繰り返し作 業のほとんどを記録して、それをキーを 1 っ押すだけで、再実行できる。ドットコマ ンドはマクロのミニチュア版ーーそっちがよければ「マイクロ」マクローー・と考えら ストプラクティスも紹介する。 れる。 また、 TIP9 ( 44 ページ ) 、 TIP23 ( 72 ページ ) ではドットコマンドを活用するためのべ ドットコマンドの使い方については、本章でもこのあといくつかの例を紹介する。 28 1 作業を終わらせるには、残りの 2 行でもこれとまったく同じキー操作を行えばよい ンドが使える。そして、ミ ; く Esc > で変更できる。 から、挿入モードに切り替えて、変更をする。カーソル移動 ( モーション ) にはコマ 各行の末尾にセミコロンを追加したい。そうするには、カーソルを行末に移動して var foobar = f00 + bar var bar var f00 he vim-way/2-foo bar,js 以下のような JavaScript コードがあるとしよう。 Vim は 2 つの手順を一度で行える専用のコマンドを提供している。 何行にも渡って行末にセミコロンを追加するといったよくある状況について、 引 P2 : DRY (Don't Repeat YourseIf)
第 1 章Ⅵ m のやり方 理想形 : 移動にキー入力 1 回、何かするのにキー入力 1 回 これらの例のすべてで、ドットコマンドを使うことで、直前の変更を繰り返してい る。ただし、共通するのはこれだけではない。キーストローク 1 回で、次の変更対象 までカーソルを移動する必要がある。 1 回のキーストロークをカーソル移動に、もう 1 回のキーストロークを何か実行す 38 るのに使っている。 るよう、このパターンを「ドットの公式」と呼ぶことにしよう。 理想的な解法だ。この編集方針はこれから何度も何度も出てくるので、話が簡単にな これより少ないキーストロークというのはたぶん無理だ。これが
RTFM (Read the Forgotten Manual) く か骨が折れることだが、慣れるにつれて上達するだろう。 和音を鳴らす すものもあるが、この表記法ではこれらもうまく表現できる。以下の例を見てほしい。 もこの記法が使える。 Vim のコマンドのなかには、和音とキーストロークを順番に押 使っているし ( : h key-notation ◎⑩ ) 、カスタムのキーマッピングを定義するのに 理由もなく、この記法を選んだわけではない。 Vim のドキュメントでこの表記を を同時に押す」ことを意味する。 し・・・・・・」ということではない。第という表記は↓と同じ、つまり、「朝と日 のなどのキーストロークが現れても、これは鳶を押し、 0 を押し、そして ; を押 表記 C-w> く C- 意味 て 1 ミとを同時に押す を押したあとに、いとーを同時に押す $Ct て 1 と第を同時に押したあとに、 0 を押す trl とを同時に押したあとに、 t て新とトを同時に押す プレースホルダ Vim のコマンドの多くでは、複数のキーストロークを順番に入力する必要がある。 コマンドのなかには、それに続けて特定のキーストロークを入力しなければならない ものもあるし、キーポードの任意のキーを続けて入力できるコマンドもある。コマン ドのあとに入力可能なキーストロークを示すのに、本書では { } を使用する。以下はそ の例だ。 表記 4 ( OtiO Ⅱ 意味 まを押して、そのあとに任意の文字を続ける ーを押して、そのあとに任意の小文字を続ける 量を押して、そのあとに任意の大文字小文字を続ける 4 を押して、そのあとに任意のモーションコマンドを続ける ' ーをと第を同時に押して、そのあとにレジスタのアドレスを続ける 17
RTFM (Read the Forgotten Manual) 特殊キーの表示 キーのなかには、名前で呼ばれるものもある。以下の表にそれらのキーをいくつか 示そう。 表記 く ESC <Ctr1* <Tab く Shift く S—Tab く DOWII 意味 スペースパー ( [ 匚」 ) を押す 下矢印キー (CV) キー) を押す 上矢印キー ( ①キー ) を押す ks ft ゝキーと fTa いキーを同時に押す Shift キー ( [ $ 通 ] キー ) を押す Tab キー ( 區司キー ) を押す control キー ( [ 0 キー ) を押す キャリッジリターンキーを押す ( 別名 : fEnter>) Escape キー ( [ ] キー ) を押す スペースパーをこで表しているのに注意。これは、 cha 發コマンドと組み合わせて ( 次の半角スペースまでカーソルを移動 ) のような表記をするのに使うことがある。 コマンドの途中におけるモードの切り替え Vim を使っていると、ノーマルモードと挿入モードの間でのモード切り替えが頻繁 に行われる。現在アクテイプなモードによって、キーストロークの意味が異なること もある。ノーマルモードのキーストロークと簡単に見分けがつくように、挿入モード で入力されたキーストロークを表現するのに上記とは異なる形式を本書では使用して いる。 「 ggreplacement く Esc> 」という例を考えてみよう。ノーマルモードのコマンドによ りカーソル位置からそこにある単語の末尾までが削除されたところで挿入モードへ切 り替わる。そして、挿入モードで「 replacement 」という語を入力したところで、き朝 を押してノーマルモードに戻っている。 ノーマルモードの表記方法はビジュアルモードでのキーストロークの表記にも使っ ている。一方、挿入モードの表記方法はコマンドラインモードおよび置換モードで入 力されるキーストロークを表現できる。どのモードがアクテイプかは文脈からわかる はずだ。
第 11 章マクロ キーストローク バッフアの内容 2 . 1 ) 2 . 1 ) 2 . two two two 日を押して記録を終えた瞬間に、一を押して次の行に移動しなければならなかったと 気がついた。 これを修正する前に、レジスタ a の内容を確認してみよう。 ¯> : reg a ← " a Of . r) と入力すれば、 Vim はキーストロークを記録して、レジスタ a にこれを保存して くれる。このとき、それまでのレジスタの内容は上書きされる。と入力すると、キー ストロークを記録して、これをいまのレジスタ a の内容に追記してくれる。ミスを修 正できるということだ。 キーストロークバッフアの内容 1 ) One 1 ) One 2 . two これでレジスタ a の内容がどうなったかを確認してみよう。 ー、 : reg a ← "a 0f . r)w-j 最初に記録したコマンドはすべて残っていて、 224 最後に」が付加されている。
第 8 章モーションによるファイル内の移動 T 旧 50 : 検索して移動 検索コマンドを使うと、ほんのわずかなキーストロークで近距離でも遠距離 でもサクサクと移動できる。 文字検索コマンドは五 ) 、、な ) など ) は手早く効率的だが、限界がある。 れらは一度に 1 つの文字しか検索できない。また、その対象もカーソル行だ。複数の 文字を検索したり、カーソル行を越えて検索をしたりしたいのであれば、文字検索コ マンドではなく、検索コマンドが使える。 以下のサンプルの「 takes 」にカーソルを移動させたいとしよう。 市 6 朝 / 365 記 h 」 haiku , す x す、 . ー : ニ , : : : search for your target it only takes a moment tO get where you want / t es として単語を検索することで、これが可能だ。この短めのサンプルでは、 単語は 1 つしかないので、一度の移動で、いきたいところに移動できるのは確実だ。 ただし、もっと少ないキーストロークでもこれを行えるかもしれないのだ。これを見 てみよう。 キーストローク {start} /tafGR' /takk$ バッフアの内容 earch for your target it 0 Ⅱ 1y takes a moment tO get where you want search for your 4rget it only 第ミ k es a moment tO get where you want search for your target it only aFes a moment tO get where you want 2 文字の文字列「 ta 」だと、 2 つにヒットする。が、 3 文字の文字列「 t 」ならユ ークにヒットする。この例ではほんの少しの距離の移動だが、サイズの大きなドキュ メントでこの方法を使うと、ほんのいくつかのキーストロークで長大な距離を移動で きる。検索コマンドはカーソルを移動する非常に効率的な方法だ。 164
RTFM (Read the Forgotten Manual) るドキュメントへのハイバーリンクだ。 誌面で Vim の操作を再現するための記法 Vim にはモードがある。このユーザーインターフェイスは、 Vim を他のテキストェ デイタから際立たせるものだ。音楽的な比喩をするために、 QWERTY キーポードと ピアノの鍵盤を比較してみよう。ピアニストは一度に 1 つの音程を鳴らすことでメロ ディを奏でたり、あるいは、一度に複数の鍵を押し込むことで和音を鳴らしたりでき る。たいがいのテキストエデイタでは、 1 つ以上の修飾キー ( 〔 0 キーや〔 0 亟司キー など ) を押しながら何かのキーを押すことで、キーボードショートカットが発動され る。これは、 QWERTY キーポードにおいては、ピアノの鍵盤で和音を鳴らすのと同 じ操作になる。 Vim のコマンドのなかには、和音を鳴らすのと同様に複数のキーを一度に押すこと で呼び出されるものもあるが、ノーマルモードのコマンドは連続するキーストローク を入力するように設計されている。これは、 QWERTY キーポードにおいては、ピア ノのキーボードでメロディを奏でるのと同じ操作になる。 0 朝一トは和音的なキーポードコマンドを表す一般的な表記であり、これは「 0 キー とキーを同時に押す」ことを表している。ただし、この表記法は、 Vim のモーダルな コマンドセットを表現するには十分ではない。以下では、本書を通して、Ⅵ m の使い 方を示すための表記法を紹介していく。 メロディを奏でる ノーマルモードでは、 マンドを組み立てる。 これらのコマンドは次のように表記する。 1 つ以上の連続するキーストロークをタイプする こと 0 、 コ 表記法 ま 意味 ふトを順に押す 4 朝を順に押す まを一度押す これらのシーケンスの大半は 2 つか 3 つのキーストロークだが、もっと長くなるこ ともある。 Vim のノーマルモードのコマンドシーケンスの意味を解読するのはなかな
第 2 章ノ ーマルモード オペレータ待機モード ノーマルモード、挿入モード、ビジュアルモードはすぐにわかるが、 Vim にはこ 54 Vim のボキャブラリーが拡張できるというわけだ。 で、カスタムオペレータやカスタムモーションを作れるのであり、これによって ゲットとするカスタムマッピングを作れるからだ。言い換えると、これのおかげ よい質問だ ! それは、オペレータ待機モードを開始する、あるいはそれをター 名前空間的なコマンドは単なるノーマルモードの拡張だというのはなせだろう ? び出すほんのわずかな瞬間のためにだけに使われるモードがあるのに、その一方で こんなふうに思うかもしれない。オペレータコマンドとモーションコマンドを呼 待機モードが開始されるのは、オペレータコマンドだけだ。 コマンドマッピングの数を拡張する名前空間と考えることができる。オペレータ ではオペレータ待機モードは開始されない。そうではなく、これらは利用可能な に次のキーストロークのプレフィクスとして機能するだけだ。そうしたコマンド :h [ ◎⑩を検索してみよう ) 。でも、多くの場合は、最初のキーストロークは単 ( どんなものがあるか知りたければ、 :h gO ◎、 :h z ◎◎、 :h Ctr1-wO ◎、 2 つあるいは 3 つのキーストロークによって起動されるコマンドはたくさんある モードに戻れる。 ( これにより、その操作が中止される ) を押すといういつものやり方でノーマル では何も起こらない。オペレータ待機モードがアクティブなときには、匡司キー このモードがアクティブになり、操作を完了させるようなモーションを与えるま ンコマンドだけを受け付ける状態のことだ。オペレータコマンドを呼び出すと、 Vim を有限状態機械 (FSM) として考えると、オペレータ待機モードはモーショ てしまう ! キーを押してから w キーを押すまでのほんのわすかな時間だ。瞬きしてたら見逃し 行するときには、このモードを呼び出している。このモードに滞在するのは、 d れども、このモードはほんの一瞬で終わってしまう。たとえば、 dw コマンドを実 機モード (Ope 「 ato 「 -Pending mode) だ。 1 日に何十回とこのモードを使うけ のほかにも気がつきにくいモードがある。その典型といえるのが、オペレータ待
第 8 章モー よう。 キーストローク {start} ションによるファイル内の移動 バッフアの内容 ind the first occurrence Of {char} and move tO ind the first occurrence Of {char} and move tO Find the first ・ ccurrence Of {char} and move tO it . it . it . 文字 x がある この例では、コマンドでは何も起こらない。 Vim は行末に向けて、 かを検索するが、マッチしないので、カーソルは動かすにそのままだ。コマンドは だからといって、いつでもをな新メコマンドでこんなにうまくいくとは限らない。 感じるくらいだ。 この例のようにうまくいったときには、 Vim が自分の心を読んでいるんじゃないかと ロークよりも少ない手順でこれを行う方法はない。な可コマンドは効率的であり、 単語。 ccu て rence の先頭にカーソルを移動する必要があるときに、 2 つのキースト 文字。があるのをみつけるので、カーソルは最初にマッチする部分に移動する。 カーソルを { c れ ar } の先頭の c に移動したいとする。コマンドを使うとどうなるかを 見てみよう。 キーストローク {start} バッフアの内容 ind the first occurrence Of Find the first 0 currence Of Find the first OC rrence Of Find the first occurre e Of Find the first occurrence Of {char} and move tO {char} and move tO {char} and move t0 {char} and move t0 { 印 la て } and move to it . it . it . it . it . この行には文字 c がいくつもあるので、今度は移動させたいところにスパッと移 動できない。そこまで移動させるには、何度かカーソル移動を繰り返すことになる。 ラッキーなのは、繰り返すときにコマンドをまた入力する必要はない点だ。 Vim は 直前のまな検索を記録しているので、一コマンドを使えば、同じ検索を繰り返せる ( →山 ; ◎ ) 。この例では、カーソルを目的地まで移動させるために一を 3 回押す必 要がある。 ) コマンドとーコマンドはとても強力な組み合わせであり、ほんのわずかの キーストロークでかなりの距離のカーソル移動をカバーできる。ただし、カーソルが 160
第 13 章検索 最初のマッチの先頭の文字に移動する。 次の g リ / / e く CR > がポイントだ。「 //e く CR> 」をモーションとして使うのだ。これはマッ チの先頭から末尾までをその範囲とする。マッチが 3 文字か (xml) 、 5 文字か (Xhtm1) はどうでもよい。 / / CR > モーションはマッチ全体を処理の対象とする。 でも、これには問題がある。キーを押すと、直前の検索が繰り返される。これに は //e く CR> オフセットが含まれる。これだと、次のマッチの先頭にジャンプするので はなく、キーにより、マッチの末尾に移動してしまう。先頭に移動するには、 / / く c としてオフセットなしで検索を繰り返さなければならない。 これはちょっとめんどうだ。よいことがあるとすれば、それはドットコマンドは直 前の変更、つまり、 / / e く CR > を繰り返してくれることだ。問題なのは、 / / 59 で次 のマッチの先頭にジャンプしなければならないところ。理想的なドットの公式はだ。 でも、 / / 5 でガマンしなければならない。以下の「マッチを表すテキストオプジェ クト」では、もっと理想的な解法について話をしよう。ただし、これにはプラグイン が必要だ。 この例には別の解法、があることに気がついているかもしれない。モーショ ンはマッチの先頭から、次の文字「 1 」までの範囲にジャンプをする。そして、「 xml 」 も「 Xhtm1 」もこの同じ文字で終わっているので、これはどちらの場合もうまくいくは すだ。 この例を考えたときには、筆者はこの方法を思いつかなかったが、これはなかなか 考えさせてくれるものだ。大文字の存在感は、小文字の存在感よりも大きい。狙いを 定めやすいし、それゆえにヒットもしやすい ( 163 ページの「スクラブルゲームみたい に考えよう」を参照 ) 。「 MixedCase 」という単語を操作する場合、次の大文字の直前 まで ( を 0 を狙うほうが、その直前にある小文字 ( ) を狙うよりも簡単だ。 マッチを表すテキストオブジェクト 理想的なドットの公式ではカーソル移動にキーストロークを 1 つ、変更を実行 するのにキーストロークを 1 つが要求される。 TIP84 ( 268 ページ ) の例では、 カーソルを移動するだけに 3 つのキーストロークを使っている ()/ く CR>)O これ は理想にはちょっと足りていない。マッチを扱うのに、これ以上に便利な組み込 みのモーションが Vim にはないというのは驚きだ。 Vim スクリプトを巧妙に使うことで、この機能を \/im に追加できる。筆者とし 270