TIPI : ドットコマンドとはく の行を削除しろ」と Vim に伝えることになる。 てくれる。に続けてドットコマンドを使うと、「直前の変更を繰り返す」とは「現在 キーストローク {start} バッフアの内容 1ne Line Line Line Line Line 1ne Line one tWO three two three four three four 最後にコマンド。 これは、現在の行からファイルの末尾までのインデントを 1 段 階深くする。このコマンドに続けてドットコマンドを実行すると、「直前の変更を繰り 返す」とは「現在の行からファイル末尾までのインデントを 1 段階深くしろ」と Vim に伝えることになる。以下の例では、何がどうなるかがよくわかるように、最初はカー ソルが 2 行目にあるとしよう。 キーストロークバッフアの内容 {start} Line one ine tWO Line three Line four Line one ine tWO Line three Line four Line one Line two ine three Line four Line one Line two ine Line four Line one Line t 0 Line three ine four 27
第 1 章 Vim のやり方 なに ? 」 しているものが何か、その中核が見えてくる。最初に問うべきはこれだ。「変更って プルな定義のなかに、モードを持った Vim の編集モデルをこれほどまでに効率的に ドットコマンド 0 ) を使うと、「直前の変更を繰り返す」とは「カーソル位置にある まコマンドはカーソル位置にある 1 文字を削除する。まコマンドを実行したあとに Line four Line three Line two Line one the vm way/O mechamcs. txt 例として、以下のようなテキストを使おう。 るものだってある。 もあれば、行全体のレベルで行われるものもあるし、ファイル全体のレベルで行われ 更」となるのかを把握する必要がある。変更は、個々の文字のレベルで行われるもの ドットコマンドの強力さを理解するには、いろいろな操作のなかで何が「直前の変 キーストロークバッフアの内容 1 文字を削除しろ」と Vim に伝えることになる。以下に例を示そう。 {start} 1ne one Line two Line three Line four e one Line two Line three Line four 1 膕 Line Line Line Line Line Line t 0 three four two three 冒キーを何度か押して変更を取り消せば、ファイルを元の状態に戻せる。 も削除をするコマンドだ。ただし、こちらはカーソルがある行をまるごと削除し 26
TlP19 : 置換モ 使えるだろう。 ードで既存のテキストを上書きく T 旧 19 : 置換モードで既存のテキストを上書き 置換モードは、これがドキュメントにすでに入力されているテキストを上書 きすることを除けば、挿入モードと同じだ。 以下のようなテキストの引用があったとしよう。 nsert-mode/replace. txt Typing in lnsert mode extends the line . But in Rep1ace mode the line length doesn't change ・ センテンスが 2 つあるが、ピリオドをカンマに変更して、これを 1 つのセンテンス にまとめようと思っているところだ。「 But 」の「 B 」を小文字にする必要もある。これ キーストロークバッフアの内容 は置換モードの使い方を示す例だ。 {start} b く Esc> き yping in lnsert mode extends the line . the line length doesn 't change ・ Typing in lnsert mode extends the line the line length doesn ' t change ・ Typing in lnsert mode extends the line , the line length doesn ' t change . But in RepIace mode But in RepIace mode Rep1ace mode ノーマルモードからは、コマンドで置換モードに切り替えられる。例を見ればわか るように、「 , b 」と入力すればそこにあった「 . B 」が上書きされる。置換モードを 仮想置換モードでタブ文字を上書き 使って挿入モードと置換モードを切り替えることもできる。 にあるわけではないけれど、自分のキーポードにく lnsert> キーがあるのなら、これを 終えるときには、如 sc > を押せばノーマルモードに復帰できる。すべてのキー ポード 63 えてみよう。これはファイル中では 1 文字で表現されるが、画面上ではこれは何文 置換モードでややこしい事態を招くことになる文字もある。タブ文字について考
TlP59 : 無名レジスタを使った削除 / ャンク / ブットく 1 ) line one を ) 1ine two 3 ) 1ine three キーストロークバッフアの内容 ができる。 Vim では行単位のヤンクに続けてブット操作をすることで、これを行える。 行を新たに入力したいときには、行をコピーして、これをテンプレートに使うことで楽 だいたいの内容は同じだが、細かなところが 1 つか 2 つ違っているというテキスト 行のコビー ( カーソル行と次の行の順番を入れ替える ) ことを意味していると考えてもよいだろう。 宿というキーシーケンスは「 Transpose the order of this line and its successor 」 ドはカーソル位置の文字の直後に文字を貼り付けていた。 に貼り付けてくれる。覚えているだろうか ? 上の例で聖を押したときには、トコマン ことを、そのとおりにしてくれる。つまり、無名レジスタの内容をカーソル行の直後 今度は行単位のテキストを扱っていることをコマンドがわかってくれ、してほしい one two one two two とジの 2 つのキーシーケンスの類似性に注目してほしい。前者は行単位のカッ 193 い場合について見てみよう。ますは、以下の例から。 よくある仕事を本当に簡単に行えるようにしてくれる。では、こんなにうまくいかな こまでのところ、 Vim の削除 / ャンク / ブット操作は極めて直感的だ。これらは おおっと ! ャンクしたのを上書きしちゃったよ のコピー & ペーストであり、これは行のコピーを効率的に行うものだ。 ト & ペーストであり、これは 2 行の順番を効率的に入れ替えるものだ。後者は行単位 {start} 1 ) line 2 ) line 1 ) line 2 ) line を ) line
第 17 章 quickfix リストを使って、コードのコンパイルとエラー発生箇所への移動を行う テストとして、以下に示す FizzBuzz の JavaScript 実装を使おう。 u iokfix/ izzb uzz. 1 ; for (i=l; 土く = 100 ; i + + ) { if(i % 15 console else if(i console else if(i console } else { console .10g('Fizzbuzz') ; .10g('Buzz'); .10g('Fizz'); ・ log(i); node ⅱ nt を呼び出すように「 :make 」を構成する : m e を実行したときに呼び出されるプログラムは、「 makeprg 」設定で指定できる ( → : 五 'makeprg' ①④ ) 。 nodelint を実行するには、以下のようにして Vim にその ことを指示できる。 → : setlocal makeprg=NODE—DISABLE—COLORS=1\ nodelint\ % % 記号は、現在のファイルのパスに展開される。よって、 -/quickfix/fizzbuzz ・ js というファイルを編集しているのなら、 Vim 内部で : make を実行するのは、シェルで 以下を実行するのと等価である。 $ export NODE—DISABLE_COLORS=I $ nodelint -/quickfix/fizzbuzz ・ JS -/quickfix/fizzbuzz. j s , line 2 , for (i=l; i く = 100 ; i + + ) { -/quickfix/fizzbuzz ・ j s , line 3 , if(i % 15 -/quickfix/fizzbuzz. j s , line 5 , } else if(i % 5 -/quickfix/fizzbuzz. js , line 7 , } else if(i % 3 -/quickfix/fizzbuzz ・ js , line 12 , 5 errors 340 character 2 : character 21 : character 21 : character 15 : character 22 : Unexpected ) 十十 ' Expected ' = Expected ' = Expected ' = Unexpected ' ・
第 6 章複数ファイルの管理 ファイルはディスクに保存されるもので、バッフアはメモリ上に存在するものだ。 Vim でファイルを開くと、その内容がバッフアに読み込まれる。バッフアの名前はファ イル名と同じだ。最初は、バッフアの内容はファイルの内容と同じだが、バッフアに 対して変更を行っていくことで、両者の内容は異なるものになっていく。変更を保存 しておこうと思ったところで、バッフアの内容をファイルへと書き出すことができる。 Vim のコマンドの大半はバッフアを操作するが、ファイルを操作するものもいくつか ある。たとえば、 :write 、 :update 、 :saveas コマンドがそうた バッファリスト Vim では、複数のバッフアを同時に扱える。シェルから以下のコマンドを実行して、 ファイルをいくつかオープンしてみよう。 $ cd code/files $ vim * . txt 2 files to edit *. txt というワイルドカードがカレントディレクトリにある 2 つのファイル、 a. txt と b. txt にマッチしているとする。このコマンドは、 Vim にこれらのファイルをオー プンするように伝える。 Vim の起動時には、ウインドウが 1 つ開き、そこには 2 つの ファイルのうち最初のものが表示される。もう 1 つのファイルは表示はされないもの の、バックグラウンドのバッフアには読み込まれている。これは以下のコマンドを実 行すればわかるとおりだ。 :ls 1 %a 2 ( 1 %a ー a. txt " "b . txt" " a. txt " t'b . txt" 行 1 ) 行 0 ) line 1 line 0 : ls は、メモリに読み込まれている全バッフアを一覧表示するコマンドだ ( → :h :ls ①◎ ) 。リスト中の次のバッフアに切り替えるには : b Ⅱ ext コマンドを実行すればよい。 : bnext → : ls 2 %a 114 ー a. txt " "b . txt" line 1 line 1
第 9 章ジャンプによるファイル間の移動 録 / 管理しているということだ。これは変更リストと呼ばれており ( → :h changelist ◎◎ ) 、その内容は以下のコマンドで調べられる。 → : changes 列テキスト ) ← change line C01 text ( 変更行 1 8 Line one 2 7 Line two 3 9 Line three Press ENTER or type command tO continue ( 続けるには ENTER を押すかコマンドを入力してください ) 上の出力例からは、 Vim が個々の変更について行番号と列位置を記録していること がわかる。変更リストは、コマンドとコマンドを使って前後に辿れる。ーコマン ドと : コマンドが直前のまなコマンドを繰り返したり逆方向に実行したりするのに 使えるのを思い出すと ( 159 ページの TIP49 を参照 ) 、とも少しは覚えやすくなる だろう。 ドキュメントで直前に変更があった場所にジャンプして戻るには、を使う。これ により、直前に編集が行われたあとの行 / 列にカーソルが戻る。この結果は、ゝ を押したときと一緒だ。一緒だが、ジャンプして戻るために、ドキュメントに変更を 加えることがない。 ( 0 っ乙 -1 直前の変更を表すマーク 変更リストを補完するために、 Vim はいくつかのマークを自動的に作成する。 マークは常に、直前に行われた変更の位置を参照する ( → :h 。 . ◎◎ ) 。一方、マー クは、直前の挿入モードから抜けたときのカーソル位置を覚えていてくれる ( → :h ← ほとんどの状況では、マークへのジャンプと、コマンドは同じことになる。こ のマークは直前に行われた変更の位置を参照するだけだが、変更リストには複数の位 置が記録される。まを何度も押すと、そのたびに、変更リストに以前に記録された位置 へとジャンプが行われる。一方、は常に変更リストの最後の要素へとジャンプする。 をマークは直前の挿入を参照する。これは、単なる直前の変更とは少々異なってい る。挿入モードから抜けて、ドキュメントのあちらこちらをウロウロとしてから、い きついた場所で駐を押してみよう ( → :h giOO)0 一度の操作で、マークを使っ 182
第 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
TlP61 : レジスタを使ってビジュアルな選択範囲を置換く ペーストでは getCIipb 。 a て d ( ) が呼び出される。 Vim のコマンドをビジュアルモー ドで使うと、両方のメソッドが呼び出される。つまり、無名レジスタの内容の取得と、 無名レジスタの内容の設定の両方が行われるのだ。 これは次のように捉えよう。ドキュメント内のビジュアルな選択範囲とレジスタに 格納されているテキストが位置を入れ替えるのだ。そういう機能なのだろうか ? バ グだろうか ? それは自分が決めることだ。 2 つの単語を入れ替える ビジュアルモードでブットコマンドを実行したときのこの奇妙な振る舞いだって、うま く活用はできる。以下のテキストの 2 つの単語の順番を入れ替えて、「 fish and chips 」 にしたいとしよう。 キーストロークバッフアの内容 {start} 臼 I I I I like chips and fish. ips and fish. like like and fish . like and fish . like and ish . I like and I like and chip! I like and chips ・ I like fisk and chips ・ 203 で順番を入れ替えるのにもこのテクニックは使える。 除して「 fish and chips 」と入力したほうが簡単かもしれない。でも、長いフレーズ こでは、こんなことはせずに、第コマンドなどを使い「 chips and fish 」を削 スタから「 fish 」をドキュメントに書き戻せばよい。 レジスタにコピーされる。そうしたら、 2 個の空白文字のところまで戻って無名レジ る対象だ。トコマンドを使うと、「 chips 」がドキュメントに送られて、「 fish 」が無名 に、ビジュアルモードで「 fish 」という単語を選択している。これが場所を入れ替え で「 chips 」という単語をカットして、これを無名レジスタにコピーしている。次
第 15 章グローバルコマンド 先ほどのコマンドは 2 つの Ex コマンドに分けられる。末尾から戻る感じに、何を しているのかを確認してみよう。以下は正しい Ex コマンドだ。 . + 1 , / } / ー 1 sort 314 これは「 For each range of lines beginning with {start} and ending with {finish}, , {finish} [cmd] : g/{start}/ :global コマンドは通常、以下のような形態を取る。 考察 ルールプロック内でアルファベット順に並べ替えられるというわけだ。 は { } プロックの末尾で終了する。最終的な結果は、すべての CSS プロバティが個々の に対して、 :sort コマンドが [ r ge ] を対象として実行される。このとき、 [range] { というパターンは個々の { } プロックの先頭にマッチする。マッチするすべての行 せてみよう。すると以下のようになる。 だった。では、最初に戻って、 :global コマンドと Ex コマンドの [cmd] を組み合わ ( 移動したいの これにより、カーソルは { } プロックの先頭に移動する。まさ 0 :global コマンドの { pattern } を使って検索を実行してみよう。 実行して、そのプロック内のルールをアルファベット順にソートするだけだ。では、 . ,/}/sort 」コマンドを あとはカーソルを、個々の { } プロック内に移動させて、「 : ドは対応する { } プロック内のルールをアルファベット順にソートしてくれるはずだ。 前のもともとの CSS ファイルの 1 行目か 9 行目にカーソルを置くと、この Ex コマン と一 1 は単に範囲を狭めて、 { } プロックの内側を処理の対象としているだけだ。ソート から「 / } / 」というパターンに次にマッチする行まで ) と解釈できる。オフセットの + 1 「 from the current line up until the next line that matches the / } / pattern 」 ( 現在行 範囲からオフセットを削除してみると、これは単純に「 . , / } / 」となる。これは、