RTFM (Read the Forgotten Manual) ー、 :verslon VIM ー Vi IMproved 7.3 ( 2010 Aug 15 , compiled Sep 18 2011 16 : 00 : 17 ) Huge version with MacVim GUI . Features included ( + ) 0 て not ( ー ) : 十 arabic 十 autocmd 十 ba1100 Ⅱー eval 十 browse + builtin—terms 十 byte_offset + cindent + clientserver + clipboard + cmdline—compl + cmdline_hist 十 cmdline_info 十 comments 最近のコンピュータでは、 huge 機能セットよりも少ない機能セットを使用する理由 はどこにもない ! ターミナルか GUI か、どっちにする ? 伝統的に、 Vim は、 GUI を持たないターミナル内で実行されるものだ 。っいって もよいだろう。 Vim は TUI (Textual User lnterface) を持っていると。 1 日の大半を コマンドラインを使って過ごしているのなら、これはすごくよく手に馴染むと思う。 GUI べースのテキストエデイタに飼い慣らされている方には、 GVim ()S X なら MacVim) が Vim の世界との架け橋となってくれるだろう ()h guiOO)0 GVim は 構文の強調表示用にターミナルバージョンよりも多くのフォント / 色をサポートして いる。マウスも使える。 OS 固有の作法も一部尊重されている。たとえば、 MacVim で は、 0 はキー、第キーを使ってクリップポードを扱ったり、朝第きキーでドキュ メントを保存したり、 0 キーでウインドウをクローズしたりできる。 Vim に慣れ ていない間はこれらを使おう。ただし、常にもっとよい方法があることは覚えておく 本書が目的としている範囲では、 Vim をターミナルで実行しても、 GVim として実 行しても、どちらでもかまわない。本書では、 Vim でも GVim でも機能するコアなコ マンドを対象としている。第 1 章 Vim のやり方で何かをする方法を学んでいこう。 24
第 5 章コマンドラインモード プロンプトで Ex コマンドを組み立て中に、もっと強力な編集機能が必要だと気づ いたときにはどうすればよいだろう。コマンドラインモードでは、ミ 0 ゴ ~ キーマッピ ングを使って、コマンドラインウインドウに切り替えられる。このときには、プロン プトに入力したコマンドがコピーされ、そのまま使える。コマンドラインウインドウ を召喚する方法を以下の表にまとめておこう。 コマンド 結果 検索履歴を含むコマンドラインウインドウを表示 Ex コマンド履歴を含むコマンドラインウインドウを表示 コマンドラインモードからコマンドラインウインドウに切り替え コマンドと : q コマンドは間違えやすい。みんな、ホントは Vim を終了するつも りだったのに、間違ってコマンドラインモードを開いてしまったことがあるはずだ。 これは残念なことだ。というのは、この機能は本当に便利だから。でも、初めて ( 間 違って ) コマンドラインウインドウに出会ったときには、たくさんの人がイラッとす るものだ。コマンドラインウインドウのサンプルについては、 TIP85 ( 271 ページ ) も 参考にしてほしい。 T 旧 35 : シェルでコマンドを実行 外部プログラムは、 Vim を終了しなくても、カンタンに呼び出せる。一番い いのは、コマンドの標準入力にバッフアの内容を送り込んだり、外部コマン ドの標準出力をバッフア内に取り込んだりできるところだ。 こでお話しするコマンドが一番効果を発揮するのは、ターミナルで Vim を使って いて、そこから実行する場合だ。 GVim ( もしくは MacVim) を使っているのなら、こ こでいうほどうまくはコトが運ばないかもしれない。驚いたりしないようにしよう。 Vim 自体がシェルから実行されているのなら、 Vim からシェルに作業を丸投げするの はとても簡単だ。 GVim のほうがもっと便利に使えるところもあるけれども、シェル でコマンドを実行する点に関しては、ターミナルから起動している Vim のほうが便 利だ。 104
謝辞 Vim を作ってくれたことを、 BramMoolenaar に感謝する。それから、その開発に 貢献してくださった皆さんにも感謝。 Vim は永久に不滅のソフトウェアであり、 Vim とともに筆者も成長を続けられることを楽しみにしている。 本書を可能な限り最高のものにすべく一丸となって作業をしてくださった pragmatic BooksheIf の皆さんにも感謝する。とりわけ、 Kay KeppIer に。彼は編集者として筆 者を指南してくれ、ライターとはどうあるべきかを筆者に教えて込んでくれた。と同 時に、産みの苦しみに耐え、筆者のイライラに耐えながら、本書を作り上げるのに大い に尽力してくれた。普通の本の書式設定とはちょっと違うようにしてくれ、という筆 者のリクエストに見事に答えてくれた DavidKe Ⅱ y にもありがとうといわせてほしい。 『実践 Vim 』の企画が立ち上がった当初、これはレシピ本ではなかった。でも、 susannah Pfa レ er が、この本はレシピ本の体裁がベストだと気づいた。たくさん書き直さなけれ ばならないのはきつかったが、書き直していくうちに、初めて満足のいく原稿ができ あがった。 Susannah は何がベストかがわかっている。そして、彼女がその深い見識を 分け与えてくれたことに感謝する。 Pragmatic Bookshelf を立ち上げた Dave Thomas と Andy Hunt にお礼をいいたい。 他の出版社から出版したいなんてことは思いもしなかったし、 PragmaticBookshelf の カタログに他の本と一緒にこの本が掲載されることを光栄に思っている。 テクニカルレビューをしてくれた皆さんがいなければ、「実践 Vim 』ができあがるこ とはなかっただろう。レビューをしてくれた方々が何かしらの形で本書の力となり、 この本ができあがった。 Adam McCrea 、 Alan Gardner 、 Alex Kahn 、 AIi AIwasity 、 Anders Janmyr 、 Andrew Donaldson 、 Angus NeiI 、 CharIie TanksIey 、 Ches Martin 、 DanieI Bretoi 、 David Morris 、 Denis Gorin 、 EIyézer Mendes Rezende 、 Erik St. Mar tin 、 Federico Galassi 、 Felix Geisendörfer 、 FIorian VaIIen 、 Graeme Mathieson 、 Hans Hasselberg 、 Henrik Nyh 、 Javier Collado 、 Jeff HoIIand 、 Josh SuIIivan 、 Joshua Flana gan 、 Kana Natsuno 、 Kent Frazier 、 Luis Merino 、 Mathias Meyer 、 Matt Southerden 、 Mislav Marohnic 、 Mitch Guthrie 、 Morgan Prior 、 Paul Barry 、 Peter Aronoffs Peter Rihn 、 PhiIip Roberts 、 Robert Evans 、 Ryan Stenhouse 、 Steven! Ragnarök 、 Tibor Simic 、 Tim Chase 、 Tim Pope 、 Tim TyrreII 、 Tobias SaiIer に感謝する。 インターネット上で深い知識を共有してくれている Vim コミュニティのすべての 10
謝辞く 方々にも深く感謝したい。本書で説明している多くの TIP は、 StackOverflow の Vim タグを読んだり、 vim ー use メーリングリストを購読したりすることで身につけたものだ。 Vim スゴイ ! と筆者が得心する大きなきっかけとなったのは、 Tim P 叩 e の rails. vim プラグインだ。そして、 Tim が作ったその他のプラグインも筆者の Vim 設 定には欠かせないものとなっている。 Kana Natsuno が作成したプラグインを使うこ とでも Vim に対する理解が深まった。筆者がこれまで目にしてきたなかでも、彼のカ スタムテキストオプジェクトは、 Vim のコア機能に対する拡張でベストなものの 1 つ だ。のこぎりの切れ味をよくしてくれ、僕らに大きな恵みを与えてくれたお二方に感 謝する。 :make コマンドの説明で使った wakeup のソースコードを提供してくれた JoeRozner にありがとう。 OIegE ⅱ mov は。 delint の問題に素早く対処してくれた。ありがと う。ロポットと忍者のイラストを描いてくれた BenCormack に感謝する。 2012 年の 1 月に、筆者たちはベルリンに引っ越した。そこで出会った技術者コミュ ニティが、筆者に本書を書き上げるためのモチベーションを授けてくれた。 Vim ベル リンユーザーグループを創設してくれた GregorSchmidt 、会合を開催してくれた Jan schu レー Hofen にありがとうといいたい。 Vim の上級ユーザーと話をする機会を持て たことで、頭の中をいろいろと整理整頓できた。そういうわけで、ベルリンで開催さ れた Vim ミーティングに参加してくれたすべての人たちのことをすばらしく思う。住 居を僕らに又貸ししてくれた DanieIHo Ⅱ e と NinaHolle にも感謝する。生活をするに もすばらしい場所だったし、仕事をするうえでも非常に生産的な場所だった。 2011 年の 3 月、筆者は内臓の癒着を取り除くための手術をしなければならなくなっ た。実家から遠く離れたところに住んでいたのはたいへんだったが、幸い、妻は筆者の そばにいてくれた。 Hannah は南シナイホスピタルに入院させてくれた。 こで、筆 者はすばらしい治療を受けた。病院のすべてのスタッフの親切な助け、それから見事 な手術を施してくれた Shawket Gerges 先生に感謝したい。 筆者に手術が必要なことを知ったとき、筆者の母はすべてをなげうって、すぐにェ ジプトへと飛んできてくれた。革命の真っ只中にあったことを考えると、母がエジプ トまでくるのにはとても勇気がいったことだろう。母の経験とサポートがなかったら、 Hannah と筆者はどれほどの苦労をしたことか、想像もつかない。生涯のなかで、 んなにもすばらしい 2 人の女性に出会えるとは、自分は本当に恵まれていると思う。
引 P45 : スーバーユーザーとしてファイルを保存く T 旧 45 : スーバーユーザーとしてファイルを保存 スーバーユーザー権限で Vim を実行するのはそうあることじゃない。でも、 sudo バーミッションを必要とするファイルに変更を保存しなければならない ことはたまにある。その処理をシェルプロセスに任せて、それを sudo で実 行することで、 Vim を再起動しなくても、これを行える。 こで話すことは GVim ではうまくいかないだろうし、 Windows ではます間違いな くうまくいかない。これがうまくいくのは、 Linux でターミナルから Vim を実行して いる場合だ。これは十分にあり得るお話なので、 ーこに含めるだけの価値は十二分に ある。 例として / etc / h 。 sts ファイルを使おう。このファイルは r 。。 t が所有している。で も、こっちは「 drew 」というユーザー名でログインしているので、このファイルにつ いては読み取りパーミッションしか持っていない。 $ ls -al /etc/ ー grep hosts 1 root wheel $ whoami ← - drew 634 4 月 6 15 : 59 hosts ユーザー drew としてこのファイルを Vim でオープンする。 $ vim /etc/hosts 145 し、マナーに則っていないと、ディスクへの書き込みはさせてくれない。 読み込み専用のバッフアへの変更でも Vim はこれを止めさせたりはしない。ただ はとりあえず変更を受けつける。 の友好的なメッセージについて考えてみよう。このメッセージを表示したあと、 Vim 用ファイルを変更します ) というメッセージを表示する。絶対的な規則ではない、こ 加する。 Vim は「 W10 : warning: Changing a readonly file 」 ( W10 : 警告・読込専 変更をして、何が起こるかを試してみよう。コマンドでファイル末尾に空行を追 [readonly] ( [ 読込専用 ] ) とラベルをつけていることだ。 まず見ておきたいのは、ファイルの状態を見ようとミ魲 g > を押すと、 Vim はこれに
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
第 8 章モーションによるファイル内の移動 この場合は、コマンドも、 0 モーションと同じように機能するであろうこと には注意しよう ( 179 ページの TIP55 を参照 ) 。 surround. vim プラグインは、こっし た操作をもっと簡単に行えるようにするコマンドを提供している。詳細については 176 ページの「 Surround. vim 」を参照してほしい。 対となるキーワード間の移動 Vim には matchit と呼ばれるプラグインが付属している。これは、第コマンドの機 能を拡張するものだ。このプラグインを有効化すると、第コマンドで対となるキーワー ドの組の間を移動できるようになる。たとえば、 HTML では、コマンドを使って開き タグと閉じタグの間を移動できる。 Ruby のファイルなら、 class と end 、 def と end 、 if と e Ⅱ d などの対の間を移動できる。 matchit は Vim に同梱されてはいるものの、デフォルトでは有効になっていない。 matchit プラグインを Vim の起動時に自動的に読み込むための最低限の記述をした Surround. Vim する。詳細については : h matchit ー i Ⅱ stall ◎①を参照してほしい。 このプラグインが提供する拡張機能は非常に便利なので、有効化することをお勧め runt ime macros/matchit . Vim filetype plugin on set nocompatible vimrc を以下に示す。 とえば、以下のコードの New Y 。 rk をいとも簡単にダブルクオートでくくること る * 6 。このコマンドを使うと、選択範囲を簡単にデリミタの対で囲めるのだ。た 筆者お気に入りのプラグインの 1 つに、 Tim Pope による surround. vim があ ができる。 キーストローク {start} バッフアの内容 cities = cities cities = ["London" ["London" ["London" lew York] "Ber1in" , Nev YO て ] NNew York"] * 6. http ://github.com/tpope/vim- surround 176
序文 世間一般では、 Vim の学習曲線は非常に急激なものだといわれている。ほとんどの Vim ユーザーがこの意見には賛同しないと私は考えている。最初の壁は高い、確かに。 しかし、 vimtutor を一通り実行し、ⅵ mrc に何を書けばいいのか、そこのところの基 本が身につけば、よちょち歩きではあっても、実際に何かをできるだけのところまで は到達している。 では、次にどうすればいいのだろう。インターネットに聞いてみたところ、その答 えは「 TIP 」一一一つまり、何か具体的な問題を解決するためのレシピ だ。この解決 策は最適解じゃないのでは ? と感じたときには何かの TIP を検索したりするかもし れない。あるいは、広く知られている TIP を自分から進んで読み進めたりすることも あるかもしれない。この方法はうまくいく一一一そうやって私は勉強したのだから しかし、その歩みは遅々としたものになる。カーソル位置にある単語を検索する第コマ ンドを勉強するのは役に立っことだが、 Vim マスターのように考える役には立たない だろう。 とすると、「実践 VimJ が TIP 本の体裁になっていることに気づいたときに で大丈夫なのか」と思ったことも理解できるだろう。数百個の TIP で、数千の問題を 解決できるようなところまで到達できるのだろうか ? 数ベージを読んだところで、 私自身の TIP の定義が狭量なものだったことがわかった。私は TIP を「問題 / 解法」 のパターンになっていると思っていた。しかし、これとは対照的に「実践 Vim 」の TIP は Vim の上級ユーザーのように考えるための知識を教えてくれる。ある意味、レシピ というよりは、むしろ比喩のような感じが強い。最初のいくっかの TIP は、一コマンド をさまざまな状況で適用するためのレッスンだ。これは、すべての Vim 上級ユーザー にとっては使いこなしが必須のものだ。それなのに、当時は一コマンドについてのガイ ダンスがなかったので、私はこれをちゃんと理解するまでに数年を費やした。 そういうわけで、私は「実践 Vim 』の出版に胸を躍らせている。 Vim 初心者が次の ステップについて尋ねてきても、いまなら彼らに何ていえばいいのかハッキリしてい る。なにせ、私でさえ「実践 Vim 』から教えられることがあったくらいだ。 Tim Pope Vim core contributor April 2012 12
TlP63 : システムレベルのクリップポードを扱うく の先頭にカーソルが位置する。必要に応じて内容を修正するには、こっちが便利だ。 考察 GVim を使っているのならまったく無視してかまわない。ますはターミナルから Vim これは Vim をターミナルから起動しているときにだけ使えるテクニックなので、 前準備 ションを有効にしておくことで回避できる。 題はシステムレベルの貼り付けコマンドを使う前にあらかじめ「 paste 」オプ に、これを使うと、思ってもいなかった事態が発生することがある。この問 ンドが使えるときもある。ただし、ターミナ丿レから Vim を起動しているとき Vim に組み込みのブットコマンドに加えて、システムレベルの貼り付けコマ 引 P63 : システムレベルのクリップポードを扱う 感的に使える。 単位の短いテキスト領域については、 ~ {registe マッピングのほうがもっと直 トと戸は、複数行のテキスト領域を貼り付けるのに最適なコマンドだ。ただし、文字 → : set autoindent は、「 autoindent 」設定を有効にするのが確実だ。 システムレベルのクリップポードから貼り付けるときに、変なことを発生させるに $ vim —u NONE —N を起動しよう。 207 ロードして、これを別のテキストエデイタ ( か Web プラウザ ) で開いて、システムレ PDF からコードをコピーするとおかしなことになるので、サンプルコードをダウン 最後に、以下のコードをシステムレベルのクリップポードにコピーする必要がある。
TlP40 : タブページを使ってウインドウのレイアウトを管理く て管理する ( 113 ページの TIP36 を参照 ) 。 Vim のタブページはバッフアとは 1 対 1 の関係にマップされない。そうではなく、 タブページはウインドウのコレクションを格納するコンテナだと考えよう。図 6 ー 1 で は 3 つのタブページを持っワークスペースがある。これらのタブにはそれぞれ、 1 つ 以上のウインドウが格納されている。それぞれのタブでは、グレーの部分がアクティ プなウインドウ、アクテイプなタブを示している。 GVim を使っていてもターミナルから Vim を実行していても、タブページは利用可 能だ。 GVim はタブを GUI の構成要素として描画するので、 web プラウザなどのタブ インターフェイスと同じような見た目になる。ターミナルから Vim を実行していると きには、タブを区切るバーはテキスト UI (TUI) となる。見た目の違いを除けば、タ プページは GUI だろうが TUI だろうが同じように機能する。 タブページの使い方 Vim のタブページは、仕事をいくつかのワークスペースに分離するのに使える。 Vim 以外のテキストエデイタのタブインターフェイスよりも、 Linux の仮想デスクトップ のほうが共通する部分が多い。 あるプロジェクトの作業をしているとしよう。ワークスペースはいくつかの分割ウィ ンドウに分かれている。いきなり何か緊急な要件が発生して、まったく別のことをし なければならなくなった。現在のタブページで新たにファイルをオープンすると、丹 精込めて作り上げたワークスペースがグチャグチャになってしまうので、そんなこと はしないで、こではタブページを新たに作って、そこで作業をするとよい。それま での作業に戻れるようになったら、最初のタブページに戻るだけだ。そこには、すべ てのウインドウが以前と同じまま残っている。 「 :lcd {path} 」コマンドを使うと、作業ディレクトリが現在のウインドウごとに ローカルに設定される。タブページを新規に作成して、 : lcd コマンドで別のディレ クトリに移動すると、気分よく、それぞれのタブページを別々のプロジェクト専用に できる。 : lcd は現在のウインドウにローカルに適用されることには注意しよう。現在 のタブページではない。複数の分割ウインドウを格納しているタブページがある場合 は「 :windo lcd {path} 」を実行すると、分割ウインドウのすべてに対してローカルな 作業ディレクトリを設定できる。詳細については Vimcasts のエピソード 9 をチェッ 129