第 1 章 Vim のやり方 私達の仕事はその性質上、繰り返しが多い。同じ内容の細かな変更を何か所かに加 えるにせよ、ドキュメント内で似たような部分をいったりきたりするにせよ、たくさ んの操作 ( アクション ) を繰り返し行うのだ。同じ作業の繰り返しを簡潔に行えるよ うな何かがあれば、たくさんの時間を節約できるだろう。 Vim は同じことを繰り返すのがとても得意だ。同じ作業をサクサク繰り返せるのは、 私達が直前に行った操作を Vim が覚えてくれているからだ。キーを 1 っ押すだけで、 直前に行った変更作業をいつだって繰り返せる。便利なように聞こえるけれど、繰り 返すときにちゃんと意味のあることを行う作業単位となるように、 1 つ 1 つの操作を 組み上げていく方法を体得しない限りは、これはそんなに便利には使えない。この考 え方を体得するのが、 Vim を効率的に使えるようになるための鍵だ。 ドットコマンドから話を始めよう。一見すると簡単なコマンドだが、これは Vim の 道具箱にある工具のなかでも、使い道が一番たくさんあるものだ。そして、このコマ ンドを理解することが Vim マスターとなるためのファーストステップだ。ドットコマ ンドを使えばアッという間に終わる簡単な編集作業をいくつか見てみよう。それぞれ の作業はまったく違うもののように見えるが、その解決方法はほとんど同じものにな る。そこから編集作業における理想となる公式が見えてくるだろう。この公式で必要 なのは、カーソルを移動するためのキーストロークが 1 っと、何かを実行するための キーストロークがもう 1 つだけだ。 TIP 1 : ドットコマンドとは ドットコマンドを使うと、直前に行った変更を繰り返せる。これは Vim のコ マンドのなかで最も強力で、使い道も一番たくさんあるものだ。 Vim のドキュメントではドットコマンドについてシンプルに「直前の変更を繰り返 す」と書かれている ( : h . ◎ ) 。たいしたことではなさそうだ。しかし、このシン 25
第 1 1 章 マクロ Vim には変更を繰り返し行う方法がいくつかある。ドットコマンドについてはすで に紹介した。ドットコマンドは、ちょっとした変更を繰り返すのには便利に使える。 が、もっとたくさんの変更を繰り返したいのであれば、 Vim のマクロに手をつけるべ きだろう。マクロを使うと、いくつものキーストロークをレジスタに記録しておいて、 あとから、それらを再生できる。 似たような内容を記述している行や段落ーーーファイルでもよい - ーーが複数あり、そ れらに対して変更を繰り返すときにはマクロが最適だ。変更したいものがたくさんあ り、それらに対してマクロを実行するには 2 つの方法ーーマクロを直列に再生するか、 があることを、本章では見ていこう。そして、どんなと 並列に複数回実行するカ きに、どちらの方法を使うかについても説明しよう。 コマンドのシーケンスを記録するときには、常にミスを冒す可能性がある。でも、 失敗したものを捨てる必要はない。一度作成したマクロの末尾には、簡単にコマンド を追記できる。もっと大々的に修正をするときにも、マクロをドキュメントに貼り付 けて、コマンドのシーケンスを編集して、それをレジスタにヤンクすればよい。 テキストに連続する数字を挿入する必要がある場合がある。 TIP66 ( 217 ページ ) で は、簡単な Vim スクリプトと Expression レジスタを組み合わせて、これを行う方法 を紹介する。 オセロゲームと同じで、 Vim のマクロは覚えるのは簡単でも、一生をかけてマスター していくものだ。初心からエキスパートに至るまでのすべての人が、作業を簡単に自 動化してくれるこの機能の恩恵を受けられる。 211
TlP70 : イテレータを評価してリスト中の要素に番号をつけるく こでは例として、以下のテキストを変更することにしよう。 macros/incremental.txt partridge in a pear tree turtle doves French hens calling birds golden rings これを、以下のようにする。 1 ) 2 ) 3 ) 4 ) 5 ) partridge in a pear tree turtle doves French hens calling birds golden rings Vim に簡単な計算をさせる方法はすでにいくつか説明した。宿ミ / 如 ; コマンド と回数指定を使ってもよいし ( 47 ページの TIPIO 参照 ) 、 Expression レジスタを使っ てもよい ( 60 ページの TIP16 参照 ) 。 こでの解法としては、 Expression レジスタと Vim スクリプトを少々使うことにしよう。 簡単な Vim スクリプト 最初に、簡単なコマンドライン呼び出しをいくつか見てみよう。 let キーワードを 使うと、 i という変数を作成して、これに値 0 を代入できる。 : echo コマンドを使え ば、現在、変数に代入されている値がわかる。 : echo コマンドは、 1 :echo : let i + = 1 0 ー、 :echo :let i=0 変数に代入されている値を調べるのにピッタリだが、本当にし i の値は次のようにしてインクリメントできる。 231
第 20 章 Vim のスペルチェッカを使って タイプミスを発見、修正する Vim のスペルチェッカを使うと、スペルミスを簡単に発見して修正できる。次の TIP118 では、ノーマルモードからスペルチェッカを利用する方法を見てみよう。 TIP121 ( 372 ページ ) では、これが挿入モードでも利用できることを説明する。 Vim は通常、英語のスペルファイルだけを添付してリリースされるが、他言語用の スペルファイルも簡単にインストールできる。また、 TIP119 ( 369 ページ ) で見るよう に、アメリカ英語とイギリス英語 ( および他の英語 ) を切り替えることも可能だ。ま た、スペルミスとして単語が誤ってマークされたときには、これをスペルファイルに 追加するのも簡単だ。これについては TIP120 ( 371 ページ ) で見てみよう。 引 PI 18 : 作業結果にスペルチェックをかけてみよう → :set spell で、こうしたミスを強調表示できる。 最初の単語は明らかにスペルミスだ。組み込みのスペルチェッカを有効にすること Yoru mum has moustache . öe 第 check/yoru-moustache. txt 以下の引用を例としよう。 表示してもらえる。 語にフラグをつける。すぐにスペルミスにジャンプして、 Vim に修正候補を スペルチェッカが有効な場合、 Vim はスペルファイルに掲載されていない単 367 どのように表示されるかは使用しているカラースキームによる。 れる。一般的には、これはその単語が赤で強調表示されることを意味する。ただし、 上を実行すると、「 Yoru 」にはフラグがつけられ、 Spe11Bad 構文の強調表示が行わ
第 10 章コピー & ペースト 文字の入れ替え 筆者には入力ミスをしやすい単語がある。折々に触れ、いつもいつも決まった単語 をミススペルするのに気づいて、そうはならないように訓練してきた。でも、もっと 偶発的なミスだってある。筆者が一番よくやるミスは、 2 つの文字の順番を入れ替え てしまうことだ。 Vim では、そうしたミスを簡単に修正できる。 本書の書名を入力しているときに、文字の順番を間違えてしまったとしよう。 キーストロークバッフアの内容 {start} Practica lVil Practic 1vim Practic Vim Practical vim こでは空白文字の入力が早すぎた。でも、修正は簡単。コマンドで、順番を入 れ替えたい 2 文字の先頭にカーソルを移動する ( 159 ページの TIP49 を参照 ) 。まコマ ンドでカーソル位置の文字をカットして、その文字のコピーを無名レジスタに配置す る。そうしたら、日で無名レジスタの内容をカーソル位置の直後に貼り付ける。 まとめるとコマンドとなるが、これは「 Transpose the next two characters 」 ( 次 の 2 文字を入れ替える ) となる。 行の入れ替え 2 行のテキストの順番も簡単に入れ替えられる。まコマンドでカーソル位置の文字を カットするのではなく、コマンドを使えばよい。これにより、カーソル行がカット されて、無名レジスタに送られる。 キーストロークバッフアの内容 {start} 192 1 ) 3 ) 0 3 ) 1ine two line one 1ine three line one 1ine three
目次 謝辞・ 序文・ Read Me ・ RTFM (Read the Fo 「 gotten Manual) 第 1 章 Vim のやり方 TIP 1 : ドットコマンドとは・ TlP2 : DRY(Don't Repeat You 「 self) TIP3 : 一歩下がって、三歩進む 羽 P4 : 実行して、繰り返して、元に戻す・ TIP5 : 手作業での検索と置換・ TlP6 : ドットの公式・ 第 1 部モード 第 2 章ノーマルモード TlP7 : 埃を払って一息つこう・ TlP8 : アンドウはひとまとめに TIP9 : 変更を繰り返し可能なものにする・ TIPIO : 回数指定を使って簡単な計算を行う TIPI 1 : 繰り返しで済むなら、回数を指定しない TlP12 : 統合して統治せよ 第 3 章挿入モード TlP13 : 挿入モードで簡単修正・ 羽 P14 : ノーマルモードへの復帰 TlP15 : 挿入モードから抜けないでレジスタから貼り付け・ TlP16 : 簡単な計算をその場で実行・ 羽 P17 : 文字コードを使って特殊文字を入力 TIP 1 8 : ダイグラフによって特殊文字を挿入・ 羽 P19 : 置換モードで既存のテキストを上書き . 第 4 章ビジュアルモード TlP20 : ピジュアルモードとは・ 羽 P21 : ビジュアルな選択範囲の定義 0 2 3 5 5 5 8 1 3 4 7 2 2 2 3 3 っ CO 1 ィーー 2 4 7 9 1 5 5 6 8 0 1 2 3 5 5 7 6 6 3 4 4 4 4 4 4 5 5 5 5 5 6 6 6 6 6 5
第 8 章モーションによるファイル内の移動 この場合は、コマンドも、 0 モーションと同じように機能するであろうこと には注意しよう ( 179 ページの TIP55 を参照 ) 。 surround. vim プラグインは、こっし た操作をもっと簡単に行えるようにするコマンドを提供している。詳細については 176 ページの「 Surround. vim 」を参照してほしい。 対となるキーワード間の移動 Vim には matchit と呼ばれるプラグインが付属している。これは、第コマンドの機 能を拡張するものだ。このプラグインを有効化すると、第コマンドで対となるキーワー ドの組の間を移動できるようになる。たとえば、 HTML では、コマンドを使って開き タグと閉じタグの間を移動できる。 Ruby のファイルなら、 class と end 、 def と end 、 if と e Ⅱ d などの対の間を移動できる。 matchit は Vim に同梱されてはいるものの、デフォルトでは有効になっていない。 matchit プラグインを Vim の起動時に自動的に読み込むための最低限の記述をした Surround. Vim する。詳細については : h matchit ー i Ⅱ stall ◎①を参照してほしい。 このプラグインが提供する拡張機能は非常に便利なので、有効化することをお勧め runt ime macros/matchit . Vim filetype plugin on set nocompatible vimrc を以下に示す。 とえば、以下のコードの New Y 。 rk をいとも簡単にダブルクオートでくくること る * 6 。このコマンドを使うと、選択範囲を簡単にデリミタの対で囲めるのだ。た 筆者お気に入りのプラグインの 1 つに、 Tim Pope による surround. vim があ ができる。 キーストローク {start} バッフアの内容 cities = cities cities = ["London" ["London" ["London" lew York] "Ber1in" , Nev YO て ] NNew York"] * 6. http ://github.com/tpope/vim- surround 176
第 3 章 挿入モード Vim のコマンドの大半は挿入モード以外のモードから呼び出されるが、挿入モード から簡単にアクセスできる機能もある。本章では、そうしたコマンドを見ていこう。 削除コマンド、ヤンクコマンド、ブットコマンドはすべてノーマルモードから呼び出 されるが、挿入モードから抜けなくとも、レジスタからサクサクとテキストを貼り付 けられる便利なショートカットがある。キーポードからは入力できない特殊文字を挿 入するための簡単な方法も 2 つ用意されている。 置換モードは、特殊な挿入モードだ。これは、ドキュメントにすでに入力されている 文字を上書きしていく。このモードの起動方法を紹介するとともに、これが便利に使 える状況についていくつか考えてみよう。また、挿入ノーマルモード (InsertNormaI mode) についても触れよう。これは、ノーマルモードのコマンドを 1 つ起動してか ら、また挿入モードに戻ることができるサプモードだ。 自動補完は挿入モードから利用できる機能のなかで最も高度なものだ。これについ ては第 19 章「ダイヤル X を廻せ ! 自動補完だ」 ( 353 ページ ) で詳細に取り上げよう。 T 旧 13 : 挿入モードで簡単修正 挿入モードでテキストを記述しているときに間違えたら、そこですぐに修正 できる。モードを切り替える必要はない。 [ 年餌キー以外にも、手早く修 正をするのに、挿入モードのいくつかのコマンドが使用できる。 タッチタイピングというのは、単にキーポードを見ないというだけのものではない。 どういうことかというと、タッチタイピングは感覚で行うものだ。タッチタイプでき る人が入力ミスをするときには、その人は画面を見てミスを確認するよりも先に、そ のことがわかる。指で感じるんだ。階段を踏み外すのと似た感じだ。 タイプ入力中に間違えたら、 [ 餌キーを使って間違いを打ち消して、正しい入 力を行える。入力した単語の後ろのほうに間違いがあるのなら、修正をする一番手早 55
TlP29 : 「 : t 」 / 「 : m 」コマンドで行をコピー / 移動く 「 : t 」コマンドで行をコビー このお買い物リストはまだ完成していない。金物屋で釘 (nail) も買う必要がある。 リストを修正するために、ファイルの最下行を再利用して、「 Hardware store 」の下 にコピーしよう。これは Ex コマンドの : copy を使えば簡単だ。 キーストロークバッフアの内容 {start} :6copy ・ Shop ing list ardware Store Buy new hammer Beauty Par10r Buy nail polish remover Buy nails Shopping list Hardware Store nails Buy new hammer Beauty ParIor Buy nail polish remover Buy nails コピーコマンドの書式は以下のようになっている ( → :h :copyOO) : [range] copy {address} この例では、 [range] は行 6 だ。 {address} には、現在行を表す . 記号を使った。よっ て、「 : 6copy. 」コマンドは「 Make a copy of line 6 and put it below the current line 」 ( 6 行目のコピーを作成して現在行の下に挿入 ) と読める。 : copy コマンドは 2 文字に省略して : co と表記することも可能だ。あるいは、もっ と簡潔に : c 。 py の同義語である : t としてもよい。 ーモニック的には、これは「 c 叩 y TO 」だと考えられる。 : t コマンドの使用例を以下の表に示す。 コマンド :t6 : 6t . 結果 6 行目を現在行の下にコピー 現在行を 6 行目の下にコピー 現在行をコピー ( ノーマルモードの y に相当 ) 現在行をファイル末尾にコピー ビジュアルな選択範囲をファイル先頭にコピー
TlP56 : 変更リストを辿るく い。すなわち、ビジュアルモードで選択範囲を拡張するのに、これらのコマンドは使 えない。オペレータ待機モードでも使えない。ジャンプリストとは、編集セッション の間に、次々とファイルをオープンしていった足跡を簡単に戻っていけるようにする ためのパンくずリストみたいなものだと、筆者はよく考えている。 Vim は同時に複数のジャンプリストを管理できる。実際、個々のウインドウはそ れぞれが独自のジャンプリストを持っている。分割ウインドウや複数のタブページを 使っているときには、コマンドとき 0 ヨコマンドは常にアクテイプなウインドウ のジャンプリストを対象として動作する。 Tab キーのマッピングにご注意 挿入モードでく c ー i > を押してみよう。く Tab > キーを押したときと同じ動作になるの がわかるはずだ。これは、 Vim がく c ー i > とく Tab > を同一視しているからだ。 く Tab > キーに何かをマッピングしようというときには、く c ー i > を押したときにも マッピングした内容が呼び出されることに気をつけよう ( 逆も同じだ ) 。これのど こが問題なのだろうか ? く Tab > キーを別の何かにマッピングすると、く c ー i > コマ ンドのデフォルトの動作を上書きすることになる。トレードオフするだけの価値 があるのか、よく考えてみよう。一方向にしか移動できないのであれば、ジャン プリストは非常に使いづらいものになる。 T 旧 56 : 変更リストを辿る Vim は、ドキュメントに変更があるたびに、変更後のカーソル位置を記録す る。この変更のリスト ( 変更リスト ) は簡単に辿ることができるとともに 移動したい部分へ移動するための最も簡単な方法としても使える。 アンドゥコマンドの直後にリドゥコマンドを実行したことはあるだろうか ? この 2 つのコマンドは互いに互いのコマンドをなかったことにするものだが、直前に変更 が行われた場所にカーソルを移動するという副作用がある。ドキュメントで直前に編 集を行った場所にジャンプして戻りたくなったときに、これが便利に使えることがあ る。これはハックだが、をを実行すればそこにカーソルが移動する。 これはつまり、編集作業中に私達がバッフアに対して行う変更のリストを、 Vim が記 181