第 5 章コマンドラインモ ード アドレス ファイルの先頭行 ファイルの最終行 ファイルの先頭行の前にある仮想的な行 カーソル行 マーク m がつけられた行 ピジュアルな選択範囲の開始位置 ビジュアルな選択範囲の終了位置 ファイル全体 ( : 1 , $ の省略表記 ) 行 0 は実際には存在しないが、これがアドレスとして使えると便利な場合がある。と くに、指定した範囲の行をファイルの先頭にコピー / 移動する際に、「 :copy {address} 」 コマンドと「 :move {address} 」コマンドの最後の引数にこれを使える。これらのコ マンドのサンプルについては、このあとの 2 つの TIP で見てみよう。 [range] を指定すると、それは常に連続する行を表す。 :global コマンドを使って、 Ex コマンドを非連続行に対して実行することも可能だ。 これについては第 15 章「グ ローバルコマンド」 ( 305 ページ ) で詳しく解説する。 T 旧 29 : 「 : t 」 / 「 : m 」コマンドで行をコビー / 移動 :copy コマンド ( とその短縮形の : t ) を使うと、 1 行以上の行をドキュメント 内のある場所から別の場所にコピーできる。一方、 :move コマンドでは、ド キュメント内の別の場所へ移動できる。 説明のために、以下のようなお買い物リストを使っているとしよう。 ex modehshopping=jist. tOdO 1 Shopping list Hardware Store 2 Buy new hammer 3 Beauty Par10r 4 Buy nail polish remover 5 Buy nails 6 く > 90
TlP76 : 単語の境界を指定するく こでこのパターンを検索してみよう。すると、「 the the 」が検索にマッチし では、 たとして強調表示されるはすだ。この 2 行を連結してみよう ( ) 。それでも、これ がマッチしていることがわかるはずだ。さらにいえば、これは「 the the 」だけにマッ チするわけじゃない。これは、どんな単語でもそれが重複していればうまく機能する のだ。正規表現だけを取り出して、これがどんなふうに機能するのかを見てみよう。 なぜ同じ単語の連続にマッチするのか、そのトリックは ( ) と \ 1 の組み合わせのな かにある。カッコ内部にマッチするものはすべて自動的に、一時的な格納場所に代入 される。キャプチャされたテキストは \ 1 として参照できる。このパターンが 1 対以上 のカッコを含んでいる場合、各カッコが表す部分マッチを \ 1 、 \ 2 、 、 \ 9 で参照で きる。 \ 0 は、パターン中でカッコが使われているかどうかに関係なく、常にマッチ全 体を表す。 構文的幻想にマッチする正規表現には、これ以外にもいくつかのテクニックが含ま れている。 \ v パターンスイッチで very magic 検索が有効化されるのは、 TIP73 ( 243 ページ ) ですでに見た。「く」記号と「 > 」記号は単語境界にマッチする ( 次の TIP76 を参照 ) 。最後に、 \ ー s は空白文字もしくは改行文字にマッチする ( それぞれ次を参照 →山 / \ ー①①、 : h 27.8 ①◎ ) 。 検索パターンで部分マッチを便利に使える状況は多くはない。例としてはあと 1 つ 考えられる。 XML や HTML の開きタグと閉じタグにマッチさせることだ。ただし、 TIP93 ( 293 ページ ) で見るように、部分マッチは、 :substitute コマンドの置換フィー ルドの { stri Ⅱ g } でも使える。 引 P76 : 単語の境界を指定する バターンを定義するときには、単語がどこから始まってどこで終わるのかを 指定するとうまくいくことがある。 Vim の単語デリミタ要素を使うとこれを 行える。 単語によっては一一それが短い単語である場合はとくに一一他の単語のなかに出現 することがよくある。たとえば、「 the 」は「 these 」、「 they 」やそれ以外にもたくさん の単語のなかに出現する。なので、以下の引用から / the く c として検索を行うと、想 249
第 13 章検索 を繰り返すが、それに加えてオフセットもつけてくれる。 T 旧 84 : マッチ全体に対して処理を行う Vim の検索コマンドでは、マッチを強調表示したり、マッチからマッチに簡 単にジャンプしたりできる。でも、マッチ全体に対して処理を加えるのはそ れほど簡単なことではない。マッチの長さが変わるような場合であっても、 それらすべてのマッチに対して処理を行えるようなモーションを組み立てる 方法をここでは見ていこう。 Vim の検索コマンドは、ドキュメント内でパターンにマッチするものの間をジャン プするのには便利に使える。でも、個々のマッチに変更を加えたいとしたらどうすれ ばいいだろう。 テキストエデイタのなかには、検索コマンドは単にカーソルをマッチまで移動させ るだけではないものもある。マッチするものをすべて選択するのだ。こうした挙動は、 マッチに対して処理を行いたい場合には便利だ。これとは対照的に、 Vim では、マッチ 全体が強調表示されるが ( hlsearch が有効な場合 ) 、カーソルはマッチの先頭にある。 したがって、マッチに対して処理をしたければ、強調表示されたテキストをビジュア ルに選択するか、何らかの範囲のテキストを対象とするモーションを使う必要がある。 これに使えるモーションにはどんなものがあるだろう。お約東だが、これは「時と場 合による」。パターンが単語全体にマッチするのなら、日コマンドやコマンドを使っ てその単語を操作すればよいだろう。でも、単語の一部にだけマッチする場合はどう すればいいのだろう。あるいは、個々のマッチの長さがバラバラだったらどうすれば いいのだろう。 例を見てみよう。以下のテキストでは、 Xm1Document 、 Xhtm1Document 、 xm1Tag 、 Xhtm1Tag というクラスを使っている。 268
TlP43 : netrw でファイルシステムを探索く あるのだ。 1 つは app/controllers ディレクトリに、もう 1 つは app/views ディレク トリにある。 : find Main. j s く Tab> Main. js というファイル名を打ち込んで fTa を叩く。すると、 Vim は最初に完全 にマッチするパス全体に展開を行う。この場合は、 . /app/controIIers/Main. js とな る。ミをもう一度叩くと、次にマッチするファイルバスが表示される。この場合 は・ /app/views/Main. js が表示される、50 匡亟司キーを押すと、そのファイルバス ( 展 開された場合 ) もしくは最初に完全にマッチしたもの ( ab > 展開が行われなかった場 合 ) が使われる。 「 wildmode 」設定をデフォルト値の「 full 」から変更すると、タブ補完の振る舞いが ちょっと変わるのが見られる。この詳細については、 TIP32 ( 97 ページ ) を参照して ほしい。 T 旧 43 : netrw でファイルシステムを探索 ファイルの内容を表示 ( して編集 ) するだけではなく、 Vim ではディレクトリ の内容を表示することも可能だ。 Vim に同梱の netrw プラグインを使うと、 ファイルシステムを探索できる。 前準備 こでお話しする機能は Vim のコアソースコードに実装されているものではなく、 netrw というプラグインで実装されている。このプラグインは Vim のディストリビュー ションに標準で含まれているので、何かをインストールしたりする必要はないが、プ ラグインをロードするように Vim を構成しておく必要がある。 vimrc ファイルに最低 限必要な構成行を以下に示す。 ssential.Vlm * 5. 訳注 : 実際に表示されるパス名はこれとは異なる場合があります ( が、実際に参照しているファイルは同じも のです ) 。 139
第 18 章 grep/vimgrep などを使って プロジェクト全体を検索する Vim の検索コマンドは、単一のファイルに含まれているパターンを検索するのに適 している。だが、プロジェクト全体からマッチをみつけたいときにはどうだろう。こ の場合、たくさんのファイルに検索をかけなければならない。従来なら、 こは grep という専用の Unix ツールの出番となるところだった。 本章では、 Vim の : grep コマンドを見ていこう。これを使うと、エデイタを抜けす に、外部プログラムを呼び出せる。このコマンドはデフォルトで grep を呼び出すが ( 呼び出せる場合 ) 、 ack など、別の専用プログラムに処理を委任するようにカスタマ イズするのも簡単だ。 外部プログラムを使うことの短所の 1 つは、それらのツールにおける正規表現構文 が Vim の検索で使う正規表現構文と異なるかもしれないことだ。 vimgrep コマンドな ら、 Vim にネイテイプな検索エンジンを使って複数ファイルからパターンを検索でき ることを見てみよう。これには代償もある。つまり、 vimgrep は他の専用プログラム ほどには高速ではない。 T 旧 108 : Vim を抜けずに grep を呼び出す Vim の :grep コマンドは、外部の grep プログラム ( または grep 的なプログ ラム ) のラッパーとして機能する。このラッパーを使うことで、 Vim を抜ける ことなく複数ファイルに対して grep によるバターン検索を実行し、 quickfix リストを使ってその結果に移動できる。 最初に、 grep と Vim を別々に実行し、 grep と Vim が連携しない場合の作業手順を 見てみよう。この方法の欠点を確認してから、それらの欠点を解消するために grep と Vim を統合した解法について検討する。 345
TIPI 05 : quickfix リストをブラウスするく 迷子にならないようにしよう :make コマンドを実行すると、 Vim は自動的に最初のエラーにジャンプをする ( 工 ラーがない場合を除く ) 。カーソル位置を移動させたくないときには、代わりに以 下を実行しよう。 末尾の「 ! 」は、最初の要素へのジャンプなしで quickfix リストを更新するよう に伝える。ここで、 :make を実行して、すぐに「 ! 」っきのほうを使うべきだった と気がついたとしよう。 :make を実行する前にいたところには、どうすれば戻れ るだろう。そんなときには、く c ー。 > コマンドを使って、ジャンプリストの以前の位 置に戻ればよい。詳細については、羽 P55 ( 1 79 ページ ) を参照してほしい。 T 旧 105 : quickfix リストをブラウズする quickfix リストには、 ] つ以上のファイルのロケーションのコレクションが 保持される。個々のレコードは、 :make 実行時にコンバイラで発生したエラー の場合もあるし、 :grep 実行時に返された検索マッチの場合もある。リスト がどのようにして作られたかに関係なく、これらのレコードをナビゲーショ ンできなければならない。ここでは、 quickfix リストをブラウズする方法を 簡単に説明しよう。 quick x リストをナビゲーションするためのコマンドは、 :h quickfixOO を見れ ば、やまほどみつかる。表 1 7 ー 1 に、その中でも最も便利なものをいくつか掲載して おこつ。 表 17 ー 1 quickfix リストをナビゲーションするためのコマンド コマンド : cnext : cprev : cfirst :clast : cnfile 動作 次の要素にジャンプ 前の要素にジャンプ 最初の要素にジャンプ 最後の要素にジャンプ 次のファイルの最初の要素にジャンプ 335
第 13 章検索 る。でも、を押してコマンドを実行すると、カーソルが「 carr 。 t 」の先頭にジャ ンプする。 検索語の入力と同時に行われるフィードバックのおかげで、どこまで入力すればター ゲットにヒットするかを知ることができる。カーソルを「 carrot 」の先頭に移動した いだけなら、検索フィールドに単語のすべての綴りを入力する必要はないということ だ。この場合は /carrZCR で十分。 i Ⅱ csearch 機能を有効にしていない場合、検索を実 行するまでは、そのパターンで目的地にジャンプできるかどうかはわからないだろう。 マッチが存在しているかをチェック この例では、「 car 」について 1 行のなかで 2 つの部分マッチがある。でも、「 car 」 と「 carrot 」が数百語離れていたらどうなるだろう。検索フィールドを「 car 」から 「 carr 」にすると、「 carrot 」が表示されるように、 Vim はドキュメントをスクロール しなければならないだろう。そして、実際にこれが行われる。 「 carrot 」という単語が現在のドキュメントに存在しているかどうかを、カーソルを 移動することなくチェックしたいだけだとしよう。「 incsearch 」オプションを有効化 すると、検索プロンプトを表示して、最初にマッチする単語として画面に表示される まで「 carrot 」の文字を順々に入力していくだけで済む。単語がみつかったら、 4 を押すだけ。そうすれば、最初のカーソル位置にすぐに戻ってこれる。思考の流れを 途切れさせる必要はない。 マッチのプレビューをもとに、検索フィールドを自動補完 先ほどの例では、「 carrot 」の綴りをすべて入力する前にコマンドを実行していた。 カーソルを最初のマッチに移動するだけなら、これで十分だ。でも、パターンを「 carr 。 t 」 という単語全体にマッチさせる必要があったとしよう。たとえば、検索コマンドに続 けて置換コマンドを実行しようと思っている場合などだ。 もちろん、「 carrot 」とすべて入力するだけでもよいだろう。でも、のゝ記ミと いうもっと便利なショートカットがある。これは、現在のマッチのプレビューの残り の部分を使って検索フィールドを自動補完してくれる。検索フィールドに「 carr 」を 入力したところでこのコマンドを使うと、「。 t 」が付加される。これにより、マッチが 264
TP121 : スペルミスを挿入モー 普通のやり方 : ノーマルモードにする ドで修正するく スペルミスを修正するには、ノーマルモードに切り替えて、宿コマンドでスペルミ スまでジャンプして、新でそれを修正することが考えられる。修正をしたら、コマ ンドで挿入モードに切り替えて、元の場所から続けることになるだろう。 もっと手早いやり方 : スペルの自動補完を使う このほかに、挿入モードでざ第 4 コマンドを使ってスペルミスを修正する方法があ る。このコマンドは、自動補完の特殊形態を起動する ( → :h compl-spelling ◎① ) 。 、こ一と入力してもよい ( こっちのほうが多少入力しやすい ) 。三コマンド の起動前後の画面を以下に示す。この間、ずっと挿入モードにいることに注目しよう。 - り修正補 (sANAP) 1 番目の該当 ( 全該当 100 個市 ) 1 YO 「 e 円 u 円 has 8 moustache . - 挿入 - 1 YO 「 u mum has 3 moustache. 373 ト 3 コマンドがホントに役立つのは、 1 行のなかにスペルミスがいくつもあるときだ。 る。 TIP112 ( 356 ページ ) で説明した方法をどれでも使って、結果を選択できる。 正候補から単語リストを作成して、これらを自動補完ポップアップメニューに表示す ラーをスキャンし、スペルミスが見つかったところでスキャンを中断する。次に、修 する候補を提供する。だが、起をの場合、 Vim はカーソル位置から戻りながら工 自動補完コマンドを起動すると、 Vim は通常現在のカーソル位置にある単語を修正 たのと同じものが含まれている。 自動補完の単語リストには TIP118 ( 367 ページ ) でコマンドを実行したときに見
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
TP107 : 外部コンバイラのカスタマイズく コマンドが指定された回数だけ実行される。 : c 。 lder もしくは : c Ⅱ ewer を実行したあとに quick ⅱ x ウインドウをオープンすると、 そのステータス行にはそのリストを生成するために実行されたコマンドが表示される。 : colder コマンドと : cnewer コマンドは、 quickfix リストのアンドウとリドウのよ うなものだと考えられる。つまり、 quickfix リストを再設定するコマンドを試してみ るコストが安くつくということだ。なぜなら、いつでも : colder を実行して以前のリ ストに戻れるからだ。また、 : make コマンドや : grep コマンドを何度も繰り返すのでは なく、そのコマンドを前回実行したときの結果を参照するといったことも可能だ ( 何 もファイルを変更していない場合 ) 。これは本当に時間の節約になる。とくに、コマン ドの実行に時間がかかる場合は。 T 旧 107 : 外部コンバイラのカスタマイズ :make コマンドは m e プログラムしか呼び出せないわけではない。自分の マシンで実行可能な任意のコンバイラを実行できる (Vim における「コンバ イラ」の定義は皆さんが普通に思っているものよりも緩い。これについては 343 ページの「「℃ ompile 「」と「 :make 」はコンバイル型の言語のためだけ のものじゃない』を参照してほしい ) 。ここでは、 :make コマンドを設定して、 これが JSLint を経由して JavaSc 「 ipt ファイルを渡し、その出力を使って quickfix リストを設定できるようにしよう。 まず、 :make を実行するとⅡ。 deli Ⅱ t 、 2 が呼び出されるように、 Vim を構成する (nodelint は JSLint 、 3 へのコマンドラインインターフェイスだ ) 。これは N0de. js に 依存しており、シンプルに以下を実行することで、 NPM を使ってインストールでき . る * 4 * 5 * 2. * 3. * 4. * 5. $ npm install nodelint —g https ://github.com/tav/nodelint http://jslint.com/ http://nodejs ・ 0 て g および http://npmjs ・ org/ 訳注 : npm を使ってクローバルモード (-g) でインストールを行うには sud 。コマンドを利用するなど、管理 者権限が必要になる場合があります。また、 Node. js や NPM が適切にインストールされている必要もあり ます。 339