第 4 章 最初に ビジュアルモード Chapter Norma1 mode lnsert mode V i sual mode Chapter Norma1 mode lnsert mode Visua1 mode Chapter Ehapter Norma1 mode lnsert mode Visua1 mode Chapter Norma1 mode lnsert mode Visua1 mode Page 15 31 44 Page 15 31 44 P age Page 15 31 44 Page 15 31 44 ミを使ってプロック指向のビジュアルモードに切り替える。そして、カー ソルを何行か下に移動して列選択を行う。まキーを押すとその列が削除されるので、 ドットコマンドで同じテキスト範囲の削除を繰り返す。右側の列との空きが空白文字 2 つ分になるまでこれを続ける。 ドットコマンドを使わずに、カーソルを 2 つか 3 つ右側に動かして、列選択を矩形 状にすることもできるだろう。そうすると削除は一度で済む。筆者は、 1 列を削除し てそれを繰り返すたびに、すぐにフィードバックが目に入ってくるほうが好みだ。 これで 2 つの列がいい具合の間隔で並んだ。あとは間に縦線を引くだけだ。コ ンドで直前に行ったビジュアルな選択範囲をもう一度選択して、日を押すと、選択範 囲の各文字がパイプ記号で置き換えられる。 こまできたら、表の見出しとその下の行を分ける水平線も入れたらどうだろう。 これは行指向のヤンクとブットを使って先頭行をコピーしてげ ) 、コピーした行の すべての文字をハイフンに置き換えればよい (G)O 76
TIPI 4 : ノーマルモードへの復帰く ノーマルモードに戻る古来からの方法は ,f キーだが、多くのキーポードでは ちょっと遠くにある。その代わりに、ゴミを押してもよい。結果はどちらも同じだ ( → :h i-Ctr1-[ ◎◎ ) 。 キーストローク結果 SC C- ノーマルモードに切り替え ノーマルモードに切り替え 挿入ノーマルモードに切り替え モードの切り替えを頻繁に行う必要があるために、 Vim 初心者がヘロへ口になって しまうことがよくある。しかし、鍛練を積めば、これが普通に感じられるようになって くる。Ⅵ m の特徴であるモードの概念は、ある状況では残念なものに感じられる。 の状況とは、現在、挿入モードにいて、ノーマルモードのコマンドを 1 つだけ実行して から、また挿入モードで作業を続けたいときだ。モード切り替えの煩雑さを減少させ てくれるなかなかうまい解法が用意されている。これが挿入ノーマルモード (lnsert NormaI mode) だ 挿入ノーマルモードとは 挿入ノーマルモードはノーマルモードの特殊バージョンで、込められる弾丸は 1 発 だけとなっている。発射できるコマンドは 1 つだけで、そのあとには、すぐに挿入 モードに戻る。如 : を押すと、挿入モードから挿入ノーマルモードに切り替えられ る ( → :h i-CTRL-0 ①◎ ) 。 ウインドウの最上行か最下行にカーソルがあり、画面をスクロールして、前後をも う少し確認したいことがある。罍コマンドは、画面を再描画して、このときにカーソ ル行を中央に移動してくれる。これにより、そのときに作業をしていた行の前後の行 を画面に半分ずっ表示できる。筆者はー。 > と入力して挿入ノーマルモードからこ のコマンドを実行することがよくある。これにより、すぐに挿入モードに戻って、思 考を中断することなく、入力を続けられる。 57
TlP3 : 一歩下がって、 三歩進むく T 旧 3 : 一歩下がって、三歩進む ar f00 var f00 var f00 var f00 var f00 var f00 var f00 うすると、以下のようになる。 りももう少しは目に優しく書けるだろう。 + 記号の前後に空白文字を入れるのだ。そ JavaScript では、文字列の連結を気持ちよく書けることはまずない。でも、これよ var f00 "method(" + argumentl + " , ” + argument2 + "刃 he-vim-way/3-concat. js 以下のようなコード行があるとしよう。 は、仕事をするのに余計な手間がかからなくなるってことだ。 けれど、このやり方には繰り返しが可能というメリットがある。ということ の前後に空白文字を挿入できる。最初は「うーん ? 」と思うかもしれない。 Vim にはイディオム的な操作方法があるのだが、これを使うと、ある 1 文字 var f00 "method ( " + argument 1 + " " 十 argument2 十 " 変更を繰り返し可能とする イディオム的な使い方をすることで、 この問題を解決できる。 キーストローク {start} 十く Esc> バッフアの内容 "method( " + argumentl + ” , ” + argument2 + " "method(" "method ( " "method ( ” "method ( " "method ( " "method ( " + argument2 + ” ) " ・ argument 1 + " " + argument 1 + " , " + argument2 十 " ) " ・ " + argument2 + " + argumentl ー + argument2 十 ") " ・ 十 argumentl 十 " + argument2 十 " ) " ・ 十 argument 1 十” " + argument2 + " ) " 十 argument 1 + コマンドは、カーソル位置の文字を削除して、挿入モードに切り替える、という 2 つの操作を一度に行う。 + 記号が削除されたところで、と入力してから挿入モー
RTFM (Read the Forgotten Manual) く コマンドラインでの操作 いくつかの TIP では、シェルもしくは Vim の内部からコマンドラインを実行する。 以下に示すのは、シェルで grep コマンドを実行するときの表記だ。 $ grep ーⅡ Wa1d0 * また、 Vim の組み込み : grep コマンドを実行するときには、以下のような表記になる。 : grep Wa1d0 * 本書では、コマンドラインが外部シェルで実行されることを「 $ 」記号で示し、コマ ンドラインがコマンドラインモードから内部で実行されることを「 : 」で示す。それ以 外のプロンプトを目にすることもあるだろう。これらのプロンプトを以下にまとめて おこう。 プロンプト 意味 外部シェルでコマンドラインを入力 ードで Vim のスクリプト式を評価 ードで後方検索を実行 ードで前方検索を実行 コマンドラインモードで Ex コマンドを実行 コマンドラインモ コマンドラインモ コマンドラインモ 本文中に外部コマンド (:write など ) が記載されたときには、如 R > キーを押すとコ マンドが実行されると考えてよい。押さない限りは何も実行されないので、如は暗 黙のうちに指定されていると考えておこう。 これとは逆に、 Vim の検索コマンドでは、、を押す前から最初にマッチするもの をプレビューできる ( 263 ページの TIP81 を参照 ) 。本文中に検索コマンドが含まれて いるときには ( 「 /pattern く CRS 」など ) 、€c キーストロークを明示的に記載している。 がない場合には、あえてそうしているのであり、これは匡亟司キーをまだ押しては 下の例では、「 0 Ⅱ e 」という単語の先頭にカーソルがあるのが見て取れるはずだ。 バッフアの内容を表記する際には、カーソルがどこにあるかがわかると便利だ。以 バッフア内でのカーソル位置の表記 いけないということだ
第 19 章 ダイヤル X を廻せ ! 自動補完だ 自動補完は単語全体を入力する手間を省いてくれる。最初の数文字を入力すると、 Vim はそこに続く候補のリストを作成して、ユーザーが選択できるようにしてくれる。 これが使えるものになるかどうかは、候補のリストの扱いにどの程度習熟するかしだ いだ。 TIP112 ( 356 ページ ) では、自動補完メニューを使ううえでのテクニックをい くつか見てみよう。 次の TIPIII では、自動補完の基本について説明する。自動補完の候補のリストは、 現在の編集セッションでオープンされているファイル、インクルードされるファイル、 タグファイルのすべてをスキャンすることで作成される。この意味については TIPI 13 ( 358 ページ ) で説明しよう。また、候補のリストを絞り込む方法も説明する。 キーワードだけではなく、候補のリストを構築する方法はほかにもある。表 19 ー 1 ( 355 ページ ) に、代表的なものをまとめよう。これらについてそれぞれ、本章の対応 する TIP で取り上げる。 Vim の自動補完機能をフルに活用するには、 2 つのことを理解しておく必要がある。 関連する候補を呼び出す方法と、リストから適切な単語を選択する方法がそうだ。こ れらについて、以下の TIP で順に見ていこう。 T 旧 1 1 1 : Vim のキーワード自動補完機能とは キーワードの自動補完では、 Vim はユーザー入力途中の単語を推測しようと する。このおかげで、単語全体を手で入力する手間が省ける。 Vim の自動補完機能は挿入モードから起動される。起動されると、現在の編集セッ ションの個々のバッフアの内容から単語リストを構築し、途中まで入力されている単 語があるか、カーソルの左側にある文字を調べる。そうした単語があれば、単語リス トがフィルタリングされて、途中まで入力されている文字で始まっていないものすべ 353
第 8 章モーションによるファイル内の移動 ; コマンドと , コマンドは相補的なコマンドだ。どちらかを使えないようにしてし まうと、文字検索コマンドが全体として使いづらいものになってしまう。 検索対象を文字検索に含めるか、含めないか 文字検索コマンドにはえなコマンド、一コマンド、一コマンド以外のコマンドも ある。以下の表にすべての文字検索コマンドをまとめておこう。 コマンド ま { char 敢 char V{char char 動作 次にある { char } までカーソルを末尾方向に移動 前にある { char } までカーソルを先頭方向に移動 次にある { char } の直前の文字までカーソルを末尾方向に移動 前にある { char } の直後の文字までカーソルを先頭方向に移動 直前の文字検索コマンドを繰り返す 直前の文字検索コマンドを逆方向に繰り返す : ) コマンドと ) コマンドは、指定した文字の手前まで (till) を検索す ると考えよう。カーソルは { char } の 1 文字手前で止まる。一方、なコマンド と言コマンドは指定した文字の上にカーソルを移動させる。 両方の種類の文字検索が必要な理由はちょっとわかりにくい。実際に例を見てみ よう。 キーストローク {start} バッフアの内容 臼 've been expecting you, Mister Bond. I 've been expecting yo Mister Bond. I ' ve been expecting yo まず、カーソルをカンマ記号の上にそのまま移動させたい。これには、、コマンド を実行する。次に、センテンスの末尾までのテキストをすべて削除したい。ただし、 ピリオド記号自体は残しておきたい。今度は並 , コマンドでこれを行う。 あるいは、 4 を使うのもありだろう。これは、カーソル位置から「 Bond 」の最後 の文字までをすべて削除する。最終的な結果は同じだが、 4 いのほうが認識しやすい 162
第 5 章コマンドラインモード -- → : colorscheme く C—d> blackboard desert blue darkblue default delek elflord evelllng koehler mormng murphy pablo peachpuff mac_classic ron shine slate solarized torte zellner こでは 5 によって、利用可能なカラースキームから候補の一覧が表示されてい る。 s 。 larized スキームを有効にしたかったとしたら、「 s 。」とだけ入力して [ な司キー を叩けばコマンドが補完されていただろう。 多くの状況で、 Vim のタブ補完はこれと同じように機能する。引数にファイルバス を指定するコマンドを入力して (:edit 、 :write など ) 、行 ~ を押すと、カレントディ レクトリからの相対指定でディレクトリ名とファイル名が補完される。 : tag コマンド なら、タグ名を自動補完できる。 : set コマンドと : help コマンドは Vim のすべての 構成オプションを知っていて、これらを補完してくれる。 カスタムの Ex コマンドを独自に作成するときには、タブ補完の動作を定義するこ とだって可能だ。何ができるのかは、 :h : c 。 mm 囲 d ー c 。 mplete ◎◎をチェックしてみ よう。 複数のマッチから選択 タブ補完の候補が 1 つだけなら、 Vim はマッチした全体を使用する。しかし、複数 の候補があるときには、次のいすれかとなる。デフォルトでは、 [ 立司キーが押された とき、 Vim は最初の 1 回は一番目の候補を展開する。そのあとで區司キーを押すと、 98 set wildmode=full set wildmenu うがよいかもしれない。 zsh が提供する自動補完メニューを使ったことがあるのなら、以下のようにするほ set wildmode=longest , list をカスタマイズできる。以下に例を示す。 wil 面。 de オプション ( → :h 'wildmode' ①◎ ) を変更することで、この振る舞い それ以外の候補が順次表示されていく。
第 5 章コマンドラインモード : t . が現在行をコピーすることに注意しよう。このコマンド以外にも、ノーマルモー ドのヤンクコマンド / ブットコマンドを使っても同じことができる (yyp) 。現在行を コピーする、これら 2 つの方法の大きな違いは y はレジスタを使っているが、 :t. で はレジスタを使っていないところだ。筆者は、デフォルトレジスタの現在値を上書き : t で現在行をコピーすることがたまにある。 したくないというときに 上の例では、簽的な方法で必要な行をコピーすることもできただろう。でも、そ うすると、カーソルをよけいに動かすことになっていた。コピーしたい行に移動して ( ) 、これをャンク ( ) 、最初の場所に戻ってから ( メ ) 、ブットコマンドで行を コピーする (p) わけだ。カーソル位置から離れたところにある行をコピーするときに : [range] move {address} のようなものだ。 : m 。 ve コマンドは : c 。 py コマンドに似ている ( → :h 「 : m 」コマンドで行を移動 の例は、まさにこの原則を実地に示したものだ。 近を対象にするが、 Ex コマンドの射程は長い」という一般原則について話をした。 「 Ex コマンドの射程は広範囲」 ( 84 ページ ) では「ノーマルコマンドはカーソル行付 は、 : t コマンドのほうが普通はもっと効率的だ。 :move ①◎ ) 。その書式は以下 1 文字に短縮して : m という表記も可能だ。「 Hardware store 」セクションを「 Beauty parlor 」セクションの下に移動したいとしよう。これは表 5 ー 2 に示す手順で : m 。 ve コマンドを使えば可能だ。 表 5 ー 2 「 : m 」コマンドで複数行を移動 キーストロークバッフアの内容 {start} 92 Shop ing list ardware Store Buy nails Buy new hammer Beauty Par10r Buy nail polish remover Buy nails
TlP28 : 連続する行に対してコマンドを実行するく 現在行を表すのに「 . 」記号を使える。つまり、以下のようにするだけで、現在行か らファイル末尾までのすべてを表す範囲にできる。 ← 2 3 4 5 : 2 く html> く head> く tit1e>Practica1 Vim く /title> く /head> く body> く hI>PracticaI Vim く /hl> く /body> く /html> % 記号にも特殊な意味がある。これは現在のファイルのすべての行を表す。 ← 1 2 3 4 く ! DOCTYPE html> く html> く head> く tit1e>Practica1 Vim く /title> く /head> く body> く hI>PracticaI Vim く /hl> く /body> 5 く /html> 87 /html> く body> く hI>PracticaI Vim く / 五 1 > く / body グー く head > く七 itfe > やて act1C f 、ⅳ土 m く / モ 1 も 1 ~ / 五 ead 一 html> く ! DOCTYPE html> とになる。 に続けて立 4 を実行すると、以下のようにビジュアルモードでの範囲指定が行われるこ 数字で行範囲を指定する代わりに、ビジュアルに範囲を選択することも可能だ。 ビジュアルな選択範囲を使って行範囲を指定 れる ) 。置換については、第 14 章「置換」 ( 279 ページ ) でさらに詳しく解説しよう。 に伝えている ( 1 行に複数の「 practical 」があったときには最初のものだけが置換さ このコマンドは、各行にある「 practical 」を「 pragmatic 」に置換するように、 Vim : %s/Practica1/Pragmatic/ せることも非常によく行われている。 これは : 1 , $ p と同じことをする。この省略記法と : substitute コマンドを組み合わ
TlP85 : 検索履歴を繰り返しながら複雑なバターンを作り上げるく 進歩はあった。最初の 2 行が思ったとおりにマッチしている。でも、 3 行目では、 れまでとは別な問題が発生している。 3 行目では「 , 」がアポストロフィとして使われ ていて、そこでマッチを終了してはいけないのだ。このパターンはさらに調整する必 要があるだろう。 3 : もう 1 回 ! アポストロフィと終端のシングルクオートの違いについて考える必要がある。ちょっ と例を挙げよう。「 won't 」、「 d 。Ⅱ , t 」、「 we're 」。どの場合も、「 , 」の直後には文字が 続く。空白文字や句読点 ( 「 . 」および「 , 」 ) は続かない。「 , 」の直後に単語を構成す る文字が続く場合だけを対象とするようにパターンを修正すればいいということだ。 修正したものを以下に示そう。 これには非常に重要な変更点がある。追加の「 , \ w 」を入力する必要があるだけでは なく、 2 つの候補をカッコのなかに入れて、それらをパイプ記号 (l) で分離する必要 もある。こで奥の手を出そう。 な : を押して検索フィールドに直前の検索を表示するのではなく、と入力して、 コマンドラインウインドウを表示しよう。以前の検索履歴が表示されることを除けば、 このウインドウは Vim の通常のバッフアとだいたい同じように使える。 1 行に履歴が 1 つだ ( 102 ページの「コマンドラインウインドウとは」を参照 ) 。モーダルな編集と いう Vim の特徴を最大限に活用して、直前のパターンを編集できる。 以下の編集手順は、この変更を行う方法を示したものだ。第( く c-r>") く Esc> がよく わからないという人は、 TIP54 ( 174 ページ ) か TIP15 ( 58 ページ ) を読んでみよう。 キーストローク {start} 日名( く c-r>") く Esc> 新 ' \w く Esc> これだというパタ バッフアの内容 ーンになったら、起キ ーを押すだけで、検索が実行される。ド 273