第 11 章マクロ Oacros/mixed-lines. txt 1 . One 2 . Two 3 . three 4 . four すでに大文字になっている行もあるし、小文字のままの行もある。さっきのマクロ では一コマンドを使っていた。これは、カーソル位置にある文字の大文字 / 小文字を トグルする ( → :h ~ ◎◎ ) 。ーを使わずに、を使うようにマクロを変更してみよう。 はカーソル位置にある文字を大文字にするコマンドだ ( →山 v-UOO)0 マクロ内のキーコード この例では、わりとシンプルなシンプルなレジスタを使っている。でも、もっと 大規模なマクロを編集するときには、これほど話は簡単じゃないかもしれない。 たとえば、羽 P69 ( 225 ページ ) で記録したマクロを見てみよう、 5 。 ¯> : reg a ( ーーーレジスタ Registers "a gg/c1assAMOmouI く 80>kb く 80>kbdu1e RankA [j>GGoen& [ 何かおかしなところに気がついたかな。まず、がいくつかある。く Esc > を押し たかく c ー [ > を押したかに関係なく、 Vim は匡キーをこのように表現する。 もっとおかしいのはく 80 > kb という記号だ。これは巨キーを表している。 キーストロークを分析してみよう。このマクロを記録したとき、筆者は「 m 。 ul 」 と始めてしまった。ミスタイプに気づいて、〔自巨キーを何度か叩いて、続き の「 dule 」を入力したんだ。 現実的には、この操作は無意味だ。上記のキーストロークを再生すると、 Vim は 間違いとその修正も再生するだろう。最終的な結果は正しいものになる。でも、 レジスタは読みにくくなるし、その編集もめんどうくさくなる。 * 5. 訳注 : レジスタ a の値は、原書では「 Om 。 ul く 80 > kb く 80 > kbdule R に [j>GGoendA [ 」となっていましたが、マ クロ記録時、最初にファイルの先頭に移動して ( ) 、 class を検索している (/classkc+) ので、実際には 「 gg/c1ass*MOmou1 く 80>kb く 80>kbdu1e RankA [j>GGoendA[ 」などのようになります。これに従って、訳書では 出力を差し替えています。 234
第 11 章マクロ これは、検索語の次のマッチへカーソルを移動させること ) かもしれないし、カー ソル行の先頭にカーソルを移動させること ( 0 ) かもしれないし、現在のファイルの先 頭行にカーソルを移動させること ( 空 ) かもしれない。多くの場合、何かの先頭から 始めることで、毎回のマクロ実行時に、正しいターゲットを撃ち抜くのが簡単になる。 繰り返し可能なモーションでターゲットを撃破しよう Vim ではたくさんの種類のモーションを使って、テキストファイルをあちらこちら に移動できる。これらをうまく使おう。 カーソルが目的地にたどり着くまで、一を叩き続けたりしてはいけない。思い出そ う。自分が入力したキーストロークを Vim は何も考えずに実行する。マクロの記録時 に、カーソルを 10 文字右に移動して、目的地にカーソルが到着した。でも、これをあ とから再生するとどうなるだろう。別の場面では、カーソルを 10 文字右に移動させる と、目的地をいきすぎたり、目的地まで届かないこともあるかもしれない。 ト、ふなど、単語単位のモーションのほうが、ふーという文字単位のモーショ ンよりも柔軟性が高くなることがよくある。 0 に続けてトというモーションを己録する と、実行するたびに予想どおりの結果が得られると考えられるだろう。カーノル行の 最初の単語の最後の文字にカーソルが移動する。その行に最低でも 1 つの単語があれ ば、単語の文字数はどうでもいい。 検索を使ってカーソルを移動しよう。テキストオプジェクトを使おう。マクロの柔 軟性を最大限に高めて、可能な限り繰り返し可能とするために、 Vim が用意している あらゆるモーションをフルに活用しよう。忘れちゃいけない。マクロを記録するとき に、マウスを使うのは御法度だ ! モーションに失敗したら処理は中断する モーションは失敗することがある。たとえば、ファイルの先頭行にカーソルがある 状態で、第コマンドを実行しても何も起こらない。ファイルの最後の行にカーソルがあ る状態での」コマンドも同じだ。デフォルトでは、モーションが失敗すると、 Vim は ピープ音を鳴らしてくれる。ただし、「 visualbell 」設定によって、これを鳴らさな いようにもできる ( → : h ' visualbell , ①◎ ) 。 216
第 9 章ジャンプによるファイル間の移動 設定を処理してしまうのだ。 Ruby 関連でもっといろいろとしたいのであれば、現在 でも活発にメンテナンスが行われているので、ファイルタイププラグインの最新バー ジョンを GitHub から入手することをお勧めする * 3 。 suffixesadd オプションと path オプションはバッファごとにローカルに設定され るので、これらは異なるファイルタイプごとにそれぞれの方法で構成できる。 Vim は Ruby 以外にもたくさんの言語用のファイルタイププラグインを含んで配布されてい る。よって、実際には、これらのオプションを自分自身で設定する必要が出てくるこ とはそれほど多くはないだろう。ではあるのだが、コマンドの動作原理を理解して おくことには価値がある。このコマンドは、ドキュメントに記述されている各ファイ ーリンク的に振る舞うようにする。そのおかげで、コードベース内を ルノヾスカ、イノヾ 簡単に移動できるようになる。 50 ー畛コマンドにも同様な役割がある。こちらも少々設定が必要になるが ( これに ついては 323 ページの TIP102 で話をしよう ) 、正しく設定を行えば、このコマンドを 使って、あるメソッドを呼び出している部分から、そのメソッドの定義へと直接移動 できるようになる。このサンプルについては TIP103 ( 326 ページ ) を参照してほしい。 ジャンプリストと変更リストはパンくすリストのようなもので、これらを使って、自 分が辿ってきたジャンプの経路を逆戻りできる。これに対して、朝コマンドと 5C1 コ マンドはコードベース内のある場所から別の場所へと瞬間移動するためのワームホー ルを提供してくれる。 T 旧 58 : グローバルマークを使ってファイル間を テキパキと移動する グローバルマークは、ファイル間をジャンプするのに使えるブックマークの ようなものだ。コードベースのなかを歩きまくったあとに、ファイルに一発 で戻るのに、グローバルマークはとくに便利に使える。 i コマンドを使うと、現在のカーソル位置にマークをつけられる ( → :hm ①① ) 。 { letter } に小文字を使うとバッフアにローカルなマークが作られる。一方、 { letter } に大文字を使うとグローバルマークが作られる。マークをつけたら、は tter * 3. ht tps : //gi thub.com/vim—ruby/vim—ruby 186
Read Me 「実践 Vim 』は、自分の技量を向上させたいプログラマに向けたものだ。聞いたこと があるだろうが、熟練者の手にかかれば、 Vim は思考のスピードでテキストを切り刻 んでいく。この目標に向かう次のステップが本書を読み込むことだ。 「実践 Vim 』は Vim マスターへの近道だ。手取り足取り教えたりはしないが、前提と なる知識は Vim チューター * 1 (Vim と一緒に配布されているインタラクテイプな Vim 入門 ) をひとしきり実行すればわかるだろう。「実践 VimJ は、 Vim の中核となるコ ンセプトとイディオム的な使い方に着目することで、この前提となる知識からさらな る高みを目指すものだ。 Vim は非常に柔軟に構成を行える。ただし、カスタマイズは個人的な話だ。だから、 vim て c ファイルに何を記述すべきか、何を記述すべきではないかについて、何かをお勧 リモートサーバーに SSH 接続 めしたりはしない。そうではなく、「実践 Vim 』では して使っていようが、ローカルマシンでいくっかの機能拡張プラグインをインストー ルした状態で GVim を起動していようが、必す扱うことになる一一工デイタのコア機 能に注力する。 Vim のコア機能をマスターしよう。そうすれば、どんな環境にあって も強力なテキスト編集ツールを使えるようになる。 本書の構成 「実践 Vim 』はレシピ本だ。最初から最後まで順に読んでいくような作りにはなって いない ( これは本当だ。次にある「 RTFM 」では、まず、ここは飛ばして、実際にやっ てみようとお勧めするくらいだ ) 。各章はテーマごとに TIP が集められていて、各 TIP は特定の機能を実地に説明している。一話完結的な TIP もあるし、本書の別の TIP で 取り上げた話題を再度取り上げるものもある。そうした TIP では、相互に参照を掲載 することで、簡単に移動できるようにしている。 本書では、やさしい話題から高度な話題へと順に話を進めてはいないが、各章のな かではそうなるようにしている。初心者なら、本書に初めて目を通すときには、各章 の先頭のほうにある TIP を読んでもよい。上級者なら、各章の後半にある TIP を読ん だり、必要に応じてつまみ読みしてくれてもかまわない。 * 1 . http : //vimdoc. sourceforge. net/htm1doc/usr-01. html#vimtutor 13
T 旧 17 : 文字コ バッフアの内容 ードを使って特殊文字を入力く キーストローク 4 トゝ 6 * 35 く C 点ミ 6 chairs, each costing $ 35 , totals $ ー 6 chairs, each costing $ 35 , totals $ 210 簡単な計算だけではなく、 Expression レジスタではもっと複雑なことが可能だ。も うちょっと高度なャツは TIP70 ( 230 ページ ) で紹介しよう。 T 旧 17 : 文字コードを使って特殊文字を入力 Vim はその文字コードを指定することでどんな文字でも入力できる。キー ボードに対応するキーがない記号を入力するときに、これが便利だ。 これ以外には、コマンドに続けて、数値以外のキーを入力すると、そのキー 立たない。そうしたときには、 Unicode 表を見ないといけないだろう。 ちろん、ドキュメントに含まれていない文字の文字コードを知りたいときには役には 示され、その文字コードが 10 進記法および 16 進記法で示される ( → :h gaOO)0 も ていって、コマンドを実行するだけだ。これにより、画面最下部にメッセージが表 ドキュメント内にある何かの文字の数値コードを知るには、カーソルをそこに持っ :h i—CTRL—V_digit ①◎ れる。挿入モードで記、元と入力するだけでいい。詳細は次を参照してほしい。 転させた文字 0 ) を入力するとしたらどうだろう。これは文字コード 00bf で表現さ できるにこでは数値の前に u が前置されていることに注意しよう ) 。疑問符を上下反 使って 5 v > 竏朝のように入力することで、 BMP に含まれるすべての文字を入力 のアドレス空間には最大で 65535 文字が格納される。よって、 4 桁の 16 進コードを いのだろう。たとえば、 Unicode の基本多言語面 (Basic Multilingual Plane : BMP) しかし、 3 桁より大きな文字コードを持っ文字を挿入したいときにはどうすればい としよう。 この文字コードは 65 だ。ということは、の、と入力する必要がある。 この数値コードは 3 桁でなければならない。たとえば、大文字の「 A 」を挿入したい たい文字を表すコードとなる。 できる。挿入モードでは、当まと入力するだけだ。このとき { c 。 de } は挿入し 文字コードがわかっていれば、どんな文字でも挿入するように Vim に伝えることが
RTFM (Read the Forgotten Manual) く 本書における Vim スクリプトの扱い Vim スクリプトを使うと、 Vim に新たな機能を追加したり、既存の機能を変更した りできる。 Vim スクリプトはそれ自体が完全なスクリプト言語であり、それ自体で 1 冊の本とするだけの価値があるものだ。本書はそのための本ではないのだが。 とはいえ、これをまったく取り上げないというわけでもない。 Vim スクリプトはい つだってすぐそばに姿を隠していて、私達の命令を実行できるように待機している。 TIP96 ( 299 ページ ) の 2 つ。これらの TIP では、筆者お勧めのプラグインで、筆者的 パーテイプラグインのことはあまり考えていない。例外は、 TIP86 ( 275 ページ ) と 本書は、 Vim のコア機能を使いこなす方法を示すものだ。言い換えると、サード は、毎日の仕事で Vim スクリプトを活用するサンプルをいくつか紹介する。 TIP16 ( 60 ページ ) 、 TIP70 ( 230 ページ ) 、 TIP94 ( 294 ページ ) 、 TIP95 ( 296 ペ ージ ) で 23 ストールし、その上で動作する Vim 7.3.547 を使って、実行を確認しています。 * 4. 訳注 : 翻訳に当たっては、 VMwa 「 e ()O 「 kstation 9/Fusion 5 ) 上に Ubuntu Desktop 13.04 をイン しれない。 : versi 。 n コマンドでその機能が使えるかどうかをチェックしてみよう。 本書で説明している機能がないときには、最小限の Vim ビルドを使っているのかも 覧できる。山 + feature-list ⑩◎ normal 、 big 、 huge という名前の機能セットがある ) 。機能リストは次のコマンドで一 すると、本当に基本的な機能を除いて、すべてが無効化される ( これ以外にも small 、 構成時に「 --with-features=tiny 」オプションを指定できる。このオプションを指定 Vim の機能のなかには、コンパイル時に無効化できるものもある。たとえば、ビルド で取り上げる機能の多くは 6. x でも利用できる、 4 。 ている。しかしながら、ほとんどのサンプルは 7. x リリースでも動くだろうし、本書 本書のすべてのサンプルは、執筆時点での Vim の最新バージョン ( 7.3 ) でテストし Vim のノヾーション にうれしいことはない。 れを使って何を実現できるかがわかるはすだ。読者が興味を持ってくれたら、こんな Qargs. vim の実装を説明なしでご覧に入れよう。 Vim スクリプトがどんな感じか、 すれも、 Vim の機能がどれほど簡単に拡張可能かを示すものだ。 visualstar. vim と コードを書く必要はない ( 10 行に満たない Vim スクリプト ) 。これらのサンプルはい にはなくてはならない機能を追加する。どちらの TIP でも、プラグインではほとんど
TlP27 : Vim のコマンドラインモードく ( 93 ページの TIP30 を参照 ) 。 :delete 、 :yank 、 : put の各コマンドについては第 10 章「コピー & ペースト」 ( 191 ページ ) で詳しく解説する。 : substitute コマンドと : g1 。 bal コマンドは非常に強力 なので、それぞれのコマンドについて章を設けた。第 14 章「置換」 ( 279 ページ ) と第 15 章「グローノヾルコマンド」 ( 305 ページ ) を参照してほしい。 Vim ( とその一味 ) の語源 ed は初期の Un ⅸのテキストエデイタであり、ビデオディスプレイがまだ一般的 ではない時代に作られたものだ。その頃は、ロール紙にソースコードが印字され、 テレタイプターミナルで編集するのが当たり前だった , 1 。ターミナルに入力した コマンドは、メインフレームコンピュータへと送られて処理され、コマンドこと に出力が印字されるというものだった。その当時は、ターミナルとメインフレー ムとの接続速度は低く、あまりに低速だった。どのくらい遅かったかというと、 タイプ入力が得意な人だとネットワークを追い越して、それを処理するためにコ マンドがメインフレームに送信されるよりも高速に、そのコマンドを入力できて しまうほどだった。このような状況では、 ed が簡潔な構文を提供することが重要 だった。 p は現在行を印字して、加がファイル全体を印字するというのはどうい うことか、よく考えてみよう。 ed は何世代にもわたり進化を続けてきた。そのなかには em ( 別名 : 「 edito 「 fo 「 mo 「 tals 」、「寿命ありき者のためのエデイタ」 ) 、 en などがあり、最後に ex が登 場した ' 2 。この頃には、ビデオディスプレイがもっと一般的になっていた。 ex は ターミナルの画面を、ファイルの内容を表示する対話的な窓口とする機能を追加 した。変更を行うとリアルタイムで、それを目で確認できた。画面編集モードは、 :visual コマンドか、これを省略して : vi というコマンドを入力することで有効 になった。これが vi という名前の由来だ。 Vim は「 vi imp 「 oved 」を意味している。これは謙遜だ。ふつうの vi を使うなん て、筆者には無理だ ! vi では使えない Vim の機能にどんなものがあるかを知 りたければ、 :h vi-differences ◎◎を見てみよう。 Vim では根本から拡張が 施されているが、それでも vi から受け継いでいるものはいまだにたくさんある。 さまざまな制約によって Vim のこ先祖さまたちの設計の影響を受けているけれど も、この制約があったからこそ、現代でも大きな価値を持つ、非常に効率のよい コマンドセットをいま私達は手にすることができているのだ。 * 1 . http://en.wikipedia.org/wiki/Te1eprinter * 2. http: //www.theregister. co. uk/2003/09/11/bi11_joys_greatest_gift/ 83
TP120 : スペルファイルに単語を追加するく T 旧 120 : スペルファイルに単語を追加する Vim のスペルチェック用辞書はそれほど大規模なものではないが、単語をス ベルファイルに追加することで、これを拡張していける。 何かの単語をスペルミスだと、 Vim が間違えてマークすることがある。これは、そ の単語が辞書に掲載されていないからだ。それらの単語を Vim に認識させるには、 コマンドが使える ( → : h zg ◎ ) 。このコマンドにより、カーソル位置にある単語がス ベルファイルに追加される。 また、これと対になるコマンドもある。これは、カーソル位置にある単語をスペ ルミスしている単語だとマークする。実際には、このコマンドにより、それらの単語が スペルファイルから削除される。何かの偶然で、コマンドやコマンドを起動して しまうと、そんなつもりはないのに、スペルファイルに対して単語の追加 / 削除が行 われてしまう。そのような事態に備えて、専用のアンドゥコマンドもある。これカッ だ。このコマンドは、カーソル位置にある単語に対して行われたコマンド / 縄コマ ンドをキャンセルする。 Vim はスペルファイルの辞書に追加された単語を記録しているので、 Vim をいった ん終了してから、再起動しても、それらの変更は永続的だ。スペルファイルの名前は、 言語およびファイルエンコーディングによって決まる。 たとえば、 UTF-8 工ンコードされたファイルを使っていて、スペルチェッカが英語の 辞書を使っているとしたら、コマンドで追加される単語はすべて ~ /. vim / spell / e Ⅱ . utf ー 8. add という名前のファイルに記録される。 専門用語を格納するスペルファイルを作成する 「 spellfile 」オプションを使用して、コマンド / コマンドで追加 / 削除される単 語を Vim が記録するファイルのパスを指定できる ( → :h 'spellfile' ◎◎ ) 。スペ ルファイルは複数を同時に指定可能だ。つまり、複数の単語リストを維持管理できる。 本書 ( 原書 ) には、英単語としては認識されないテキスト文字列がたくさん含まれ ている。たとえば、 Vim のコマンド年 i 当など ) や設定 ( spelll g など ) がそうだ。 これらにスペルミスとしてフラグをつけられたくはない。が、これらを正しい英単語 371
TP114 : 辞書を使って単語を自動補完く 汎用の自動補完のカスタマイズ 汎用のキーワード補完がスキャンを行う場所のリストは、「 complete 」オプション を使用してカスタマイズできる。このオプションには 1 文字のフラグをカンマ区 切りで指定する。このフラグを指定することで、特定の部分のスキャンが有効化 される。デフォルトの設定は「 complete= ・ ,w,b,u,t,i 」だ。以下を実行すると、 インクルードファイルのスキャンを無効化できる。 → :set complete¯=i あるいは、以下を実行することで、スペル辞書での単語の補完を有効化できるだ ろう。 → : set complete + =k 各フラグの動作については、 :h 'complete' ◎◎を参照してほしい。 T 旧 1 14 : 辞書を使って単語を自動補完 Vim の辞書による自動補完では、単語のリストから候補のリストが構築され る。 Vim を設定して、辞書による自動補完が組み込みのスペ丿レチェッカと同 じ単語リストを使うようにできる。 オープンされているバッフア、インクルードファイル、タグファイルのいずれにも 存在していない単語についても自動補完できるようにしたいことがたまにある。そう した場合には、常に辞書をルックアップするようにできる。これはく q-k > コマン ドを実行すると起動される ( → :h compl-dictionary ◎◎ ) 。 この機能を有効にするには、 Vim に適切な単語リストを与えてやる必要がある。これ には、「 :set spell 」を実行して Vim のスペルチェッカを有効化してやるのが、一番簡 単だ ( 詳細については 367 ページの第 20 章「 Vim のスペルチェッカを使ってタイプミス を発見、修正する」を参照 ) 。スペル辞書に掲載されているすべての単語が三 コマンドで利用できるようになる。 Vim のスペルチェッカを有効化したくないときには、「 dictionary 」オプションで単語 リストを格納しているファイルを 1 つ以上指定してもよい ( →山 'dictionary'OO)0 361
第 19 章 ダイヤル X を廻せ ! 自動補完だ 自動補完は単語全体を入力する手間を省いてくれる。最初の数文字を入力すると、 Vim はそこに続く候補のリストを作成して、ユーザーが選択できるようにしてくれる。 これが使えるものになるかどうかは、候補のリストの扱いにどの程度習熟するかしだ いだ。 TIP112 ( 356 ページ ) では、自動補完メニューを使ううえでのテクニックをい くつか見てみよう。 次の TIPIII では、自動補完の基本について説明する。自動補完の候補のリストは、 現在の編集セッションでオープンされているファイル、インクルードされるファイル、 タグファイルのすべてをスキャンすることで作成される。この意味については TIPI 13 ( 358 ページ ) で説明しよう。また、候補のリストを絞り込む方法も説明する。 キーワードだけではなく、候補のリストを構築する方法はほかにもある。表 19 ー 1 ( 355 ページ ) に、代表的なものをまとめよう。これらについてそれぞれ、本章の対応 する TIP で取り上げる。 Vim の自動補完機能をフルに活用するには、 2 つのことを理解しておく必要がある。 関連する候補を呼び出す方法と、リストから適切な単語を選択する方法がそうだ。こ れらについて、以下の TIP で順に見ていこう。 T 旧 1 1 1 : Vim のキーワード自動補完機能とは キーワードの自動補完では、 Vim はユーザー入力途中の単語を推測しようと する。このおかげで、単語全体を手で入力する手間が省ける。 Vim の自動補完機能は挿入モードから起動される。起動されると、現在の編集セッ ションの個々のバッフアの内容から単語リストを構築し、途中まで入力されている単 語があるか、カーソルの左側にある文字を調べる。そうした単語があれば、単語リス トがフィルタリングされて、途中まで入力されている文字で始まっていないものすべ 353