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
第 21 章 それからどうする おめでとう ! Vim を使い続けよう。経験を積むことで、最初はトリッキーに思えたものが、次に いよいよ本書の最後だ ! で、 これからどうするの ? 実践を続けよう ! 375 録 A では、カスタマイズ入門をお届けしよう。 Vim をカスタマイズして、いつでも自分のやり方にピッタリな構成にしておける。付 振る舞うように、 Vim をカスタマイズできる。 vimrc ファイルに自分の好みを保存し、 これらのデフォルト設定をガマンして使い続ける必要はない。自分が思うとおりに んなものになるだろう。「だって、 vi がそうだったからさ ! 」 でこんなふうに動作するのか、そのわけを知りたくなったら、その答えはおそらくこ ろというつもりはない。 Vim のデフォルト設定には残念なところもある。これがなん セットがユーザーに与えられる。でも、いつまでもデフォルト設定にしがみついてい きた。デフォルトの設定は使いやすさの基準となり、 Vim を使うための一般的な機能 ごく普通の Vim を扱って 本書の大半の部分では、インストールした状態のまま、 Vim を自分のものにしよう ればと思っている。 ザーに向けたものもある。本書を再び手にとって、何か新しいことを身につけてくれ め、最初はそのすべてが身にはつかないだろう。基本的な TIP もあるし、上級ユー 「実践 Vim 』は最初から最後までを順に読んでもらうことは意図していない。そのた きるようになるだろう。 ようになることを目標としよう。そこまできたら、思考する速度でテキストを編集で は自然なことになるだろう。自分が何をしているのかを考えなくとも、 Vim を使える
: マクロの内容を編集するく ・ ) く , ' >normal @a TlP71 1 ) partridge in a pear tree urt1e doves French hens calling birds ! 0 lden r ings 1 ) partridge in a pear tree 2 ) turtle doves 3 ) French hens 4 ) calling birds 5 ) golden rings 「 :normal @a」コマンドは、選択された各行に対してマクロを実行するように伝えて いる ( 222 ページの「マクロを並列に実行する」を参照 ) 。最初、 i の値は 2 だが、マク 口を実行するたびにその値はインクリメントされる。最終的には、各行の先頭に、連 続する値が挿入されるというわけだ。 ャンク、ブット、のミコマンドを使っても、同じことができるだろう。これは演習 問題として自分でやってみよう。 T 旧 71 : マクロの内容を編集する 羽 P68 ( 223 ページ ) では、マクロの末尾にコマンドを簡単に追加できるこ とを見た。でも、最後のコマンドを削除したいときにはどうする ? マクロ の先頭を変更したいときにはどうする ? ここでは、マクロの内容を、それ があたかもプレーンテキストであるかのように編集する方法を説明する。 問題 : フォーマットが揃っていない ! 220 ページの「一単位の仕事を記録」で見た手順に従い、キーストロークをレジスタ a に保存したとしよう。そして、目の前には以下のようなテキストがある。前と書式 が微妙に異なっている。 233
羽 P105 : quickfix リストをブラウスするく らず、 :copen を実行すれば、 quickfix リストウインドウに同一のリストが表示さ れるのだ。 基本的な quickf ⅸモーション :cnext コマンドと : cprevi 。 us コマンドを使うと、 quickfix リスト内の要素を前後 に辿れる。リストの最初の要素もしくは最後の要素にジャンプしたければ、 :cfirst コマンドと : clast コマンドでこれを行える。これら 4 つのコマンドは多用するので、 指が届きやすいところにマッピングしておくのが吉だ。お勧めのマッピングについて は 116 ページの「 Vim のリストをサクサク移動するためのキーマッピング」を参照して ほしい。 quickfix リストのスキップと巻き戻し :cnext と : cprev には回数を指定できる。よって、 quickfix リストの全要素を 1 つ すっ順番に辿っていく代わりに、以下のようにすれば、一度に 5 つの要素をスキップ できる。 → : 5cnext quickfix リストをプラウズ中に、数十ものマッチを含んでいるファイルに遭遇した としよう。しかも、それらのマッチには、重要と思われるものは何もない。そうした 場合には、結果を 1 つずっ ( あるいは一度に 10 個ずつ ) 進んでいくのではなく、その ファイルに含まれるすべての結果をスキップして、次のファイルの最初のレコードに ジャンプできたら便利だ。 : cnfile はまさにこれを実行してくれる。ご期待に添って、 : cpfile は同じことを逆方向に行ってくれる。つまり、前のファイルの最後の quick ⅱ x のレコードにジャンプしてくれるのだ。 337
TlP38 : 隠しファイルの管理く Vim が終了する。 保存されていない変更を確認せずに Vim を終了するのなら、 : qall ! コマンドを実行 するだけでよい。あるいは、 1 つ 1 つ確認せずに、変更されたバッフアをファイルに 書き出すのなら、 : wall コマンドが使える。表 6 ー 1 にこれらをまとめておこう。 表 6 ー 1 Vim 終了時の隠しバッフアの取り扱い コマンド :w[rite] :e [dit] ! :qa[ll] ! : wa [ 11 ] 動作 バッフアの内容をディスクに書き込む ファイルをバッフアに読み込む ( つまり、変更を取り消す ) 警告なしですべての変更を捨て、ウインドウを閉じる 変更されたバッフアをすべてディスクに書き込む 「 :argdo 」や「 :bufdo 」を実行する前に「 hidden 」設 定を有効にする デフォルトでは、 Vim は変更されたバッフアを捨てないようになっている。 :next! 、 :cnext! 、あるいは同様なコマンドのいずれを使おうが、最後のビックリマー : bnext ! 、 クをつけ忘れると、 Vim は「 No write since last change 」 ( 最後の変更が保存され ていません ) と文句をつけてくる。ほとんどの場合は、「ああ、忘れていた」と思い出 させてくれるので便利ではあるのだが、これがうるさい場合が 1 つある。 : argdo コマンドと : bufdo コマンドについて考えてみよう。 :argdo { cmd } コマンド は次のような感じに働いてくれる。 :first → : {cmd} - → : next : {cmd} 、一 etC . { cmd } に指定したコマンドが最初のバッフアを変更すると、 : Ⅱ ext は失敗する。最初 の要素を保存するまでは、引数リスト中の 2 つめの要素に移動させてくれないのだ。 これは使えない ! 123
第 14 章置換 c フラグを指定すると、 Vim はそれぞれのマッチについて「 Rep1ace with copy? 」 (copy に置換しますか ? ) と尋ねてくるようになる。そこで、ツと答えれば、変更が行 われ、でその変更をスキップする。 Vim はこちらの答えに従って処理をして、次の マッチに移動して、また問い合わせてくる。 この例では、と答えることで、最初と最後のマッチは変更して、 2 つめのヤツは そのままにしておくことになるだろう。 答え方は女と日の 2 つだけではない。実際には Vim は「 y/n/a/q/1/AE/AY 」というプ ロンプトを表示して、どんな選択肢があるかを教えてくれる。以下の表にそれぞれの 選択肢の意味をまとめておこう。 トリガ 4 動作 このマッチを置換 このマッチをスキップ 置換を終了 「 last 」 : このマッチを置換して終了 「 a Ⅱ」 : このマッチとこれ以降のすべてのマッチを置換 画面を下にスクロール 画面を上にスクロール Vim のヘルプを参照してもこの情報は掲載されている ( → :h :s-cOO)0 考察 284 両方の方法を試してみてから、気持ちよく使えるほうを使うようにしよう。 モードが使われる。すべてが、自分の思ったとおりに機能する。 ドットの公式を使った場合 ( 34 ページの TIP5 を参照 ) 、常にいつもどおりのノーマル 一面では、普段使っている機能はすべてここでは使えなくなる。これとは対照的に ある面では、これにより、最低限のキーストロークで仕事を完了させられる。もう それ以外はその動作はまったく異なるものだ。 しても何もしない。こキーを押せばいつもと変わらすノーマルモードに戻れるが、 通常とは異なり、 Vim の置換確認モードでは、キーポードのほとんどのボタンは押
第 13 章検索 ットする 引 P83 : 検索のマッチの末尾にカーソルをオフセ 266 おかしなことになる。なぜかわかるだろうか ? 最後の「 15g 」は実際には「 languages 」 そうでもない ? 同じコマンドシーケンス、言をもう一度叩き込むと、最後の単語が いが、最低限のことはできている。 要な残りが追加される。キーストロークは 3 つ。理想のドットの公式にはなっていな にジャンプして、トで単語の末尾に移動して、一により単語をフルスペルにするのに必 がやってくれるはす。 : と入力すれば、次の「 1 g 」を修正できる。で次のマッチ こうなったら、カーソルを適切な位置に動かしさえすれば、あとはドットコマンド あることであり、もこれが 1 つのコマンドのように指が滑っていくはすだ。 いⅱ age く Esc > と入力して単語の末尾に追加をする。単語の末尾に追加をするのはよく したい文字列を検索すると、カーソルが最初のマッチの先頭に移動する。そこから、 まず、検索オフセットを使わないでこれに挑戦してみる。 / 15g く c として、修正 を使う別の方法があるかを調べてみよう。その過程で何かが学べるかもしれない。 置換コマンドを使って「 :%s/lang/language/g 」とすることだ。でも、ドットの公式 3 つある「 1 g 」をフルスペルに展開するにはどうすればよいだろう。 1 つの方法は Which langs would you like t0 learn? Which lang did you pick up last year? Aim t0 learn a new programming lang each year. search/langs. txt 表記している。 それでは、例を見てみよう。以下の引用では、著者は一貫して「 language 」を省略 よいこともある。検索オフセットを使うことで、これが可能だ ( → :h search-offset フォルトの振る舞いは妥当なものに思えるが、カーソルがマッチの末尾にあったほうが 検索コマンドを実行するたびに、カーソルはマッチの先頭の文字に移動する。このデ で、ドットの公式を使って同じ変更を何度も繰り返すサンプルを紹介しよう。 だけ移動させるのに使える。ここでは、カーソルをマッチの末尾に置くこと 検索オフセットは、カーソルをマッチの先頭もしくは末尾から特定の文字数分
第 11 章マクロ これは、検索語の次のマッチへカーソルを移動させること ) かもしれないし、カー ソル行の先頭にカーソルを移動させること ( 0 ) かもしれないし、現在のファイルの先 頭行にカーソルを移動させること ( 空 ) かもしれない。多くの場合、何かの先頭から 始めることで、毎回のマクロ実行時に、正しいターゲットを撃ち抜くのが簡単になる。 繰り返し可能なモーションでターゲットを撃破しよう Vim ではたくさんの種類のモーションを使って、テキストファイルをあちらこちら に移動できる。これらをうまく使おう。 カーソルが目的地にたどり着くまで、一を叩き続けたりしてはいけない。思い出そ う。自分が入力したキーストロークを Vim は何も考えずに実行する。マクロの記録時 に、カーソルを 10 文字右に移動して、目的地にカーソルが到着した。でも、これをあ とから再生するとどうなるだろう。別の場面では、カーソルを 10 文字右に移動させる と、目的地をいきすぎたり、目的地まで届かないこともあるかもしれない。 ト、ふなど、単語単位のモーションのほうが、ふーという文字単位のモーショ ンよりも柔軟性が高くなることがよくある。 0 に続けてトというモーションを己録する と、実行するたびに予想どおりの結果が得られると考えられるだろう。カーノル行の 最初の単語の最後の文字にカーソルが移動する。その行に最低でも 1 つの単語があれ ば、単語の文字数はどうでもいい。 検索を使ってカーソルを移動しよう。テキストオプジェクトを使おう。マクロの柔 軟性を最大限に高めて、可能な限り繰り返し可能とするために、 Vim が用意している あらゆるモーションをフルに活用しよう。忘れちゃいけない。マクロを記録するとき に、マウスを使うのは御法度だ ! モーションに失敗したら処理は中断する モーションは失敗することがある。たとえば、ファイルの先頭行にカーソルがある 状態で、第コマンドを実行しても何も起こらない。ファイルの最後の行にカーソルがあ る状態での」コマンドも同じだ。デフォルトでは、モーションが失敗すると、 Vim は ピープ音を鳴らしてくれる。ただし、「 visualbell 」設定によって、これを鳴らさな いようにもできる ( → : h ' visualbell , ①◎ ) 。 216
TP103 : Vim のタグナビゲーションコマンドを使ってキーワード定義に移動するく 動させるよりも速いこともある。これはとくに、 Vim に tags ファイル内のすべての キーワードをタブ補完する機能があるからだ。たとえば、「 :tag Fran く Tab> 」と入力 すると、 Vim は途中まで入力したものを Franc 。 ph 。 ne に展開してくれるだろう。 また、これらの Ex コマンドを「 :tag /{pattern} 」や「 :tjump /{pattern} 」のよ うに使うと、これらのコマンドに正規表現を与えられる ({pattern} の前にある「 / 」 に注意 ) 。たとえば、「 phone 」で終わるキーワードの定義間を移動するには、以下のよ うな呼び出しを行えばよいだろう。 → : tjump /phone$ # pri kind tag 1 F C c Ang10phone f ile ( ファイル ) anglophone . rb class Ang10phone く Speaker Francophone francophone . rb class Francophone く Speaker Type number and く Enter> (empty cancels) : ( 番号とく Enter> を入力してください ( 空でキャンセル ) : 以下の表に、タグを使ってコードベースを移動するのに使えるコマンドをまとめる。 コマンド く 0 ー ] : tag {keyword} : tjump {keyword} :pop もしくは <C-t :tselect :tlast :tfirst : tprev : tnext :tag 動作 カーソル位置の単語にマッチする最初のタグにジャンプ カーソル位置にある単語の複数のマッチから選択するようにユー ザーにプロンプトを表示する。マッチが 1 つだけの場合、プロンプ トを表示せずにジャンプする { keyw 。て d } にマッチする最初のタグにジャンプ { keyw 。 rd } の複数のマッチから選択するようにユーザーにプロンプ トを表示する。マッチが 1 つだけの場合、プロンプトを表示せずに プトを表示する タグマッチリストからアイテムを選択するよう、ユーザーにプロン 最後にマッチするタグにジャンプ 最初にマッチするタグにジャンプ 前にあるマッチするタグにジャンプ 次にマッチするタグにジャンプ タグ履歴を辿る タグ履歴を遡る ジャンプする 329
・ , く ' >normal @a TlP68 : マクロにコマンドを追記するく 1 ) One 2 ) Two / / break up the monotony 3 ) Three マクロは最初から記録し直した。今度のマクロは、次の行に進む」コマンドがないこ とを除けば、最初のものとほとんど同じだ。今度は次の行に進む必要はない。 「 :normal @a」コマンドは、選択範囲の各行に対してマクロを実行するように Vim に 伝える。先ほどの例と同様、最初の 2 行ではマクロは成功して、 3 行目では失敗する。 でも、今度はそこで実行が中断せすに、仕事が完了している。なぜだろう。 さっきのやり方では、ト朝を実行することで、 5 回の繰り返しをキューに直列に入れ た。 3 回目の繰り返しで中断したところで、キューに残っていた要素は削除された。今 度は、 5 回の繰り返しを並列に並べているのだ。マクロの各呼び出しは互いに独立で あり、 3 回目の繰り返しが失敗しても、失敗はそこだけに隔離される。 結論 : 直列と並列、どっちにする ? 直列と並列とどっちがよいだろう。答えは ( いつものことだが ) 時と場合による。 複数の要素にマクロを並列に実行するほうが堅牢性は高い。この例では、こちらの ほうが解法としてはよい。でも、マクロ実行時にエラーが発生したら、失敗したこと を知らせる警報が鳴ってくれたほうがうれしいこともある。複数の要素にマクロを直 列に実行すると、いつどこでエラーが発生したのかがわかりやすくなる。 両方のテクニックを身につけよう。そして、どんな状況でどちらが正しい選択かを 把握できるようなスキルを身につけよう。 T 旧 68 : マクロにコマンドを追記する マクロの記録中に、大事な手順をすっ飛ばしてしまうことがたまにある。こ 以下のマクロを記録する必要があるとしよう ( これは、 219 ページの TIP67 のものだ ) 。 に追加のコマンドを付け加えられる。 んなとき、すべてを記録し直す必要はない。すでに記録済みのマクロの最後 223