Home > Archives > 2009-04

2009-04

Hack #3: Vimから外部コマンドを呼び出す

外部コマンドの呼び出し

このHackではVimから外部のコマンドを呼び出す方法を紹介します。Vimだけでなく、外部コマンドの力を借りることでグッと編集効率を上げることができます。

単純な例

最も単純な外部コマンドの呼び出しはExモードで「!」を使うことです。

:!外部コマンド
:!ls
:!ruby %
:!svn ci %

Vimのコマンドで「%」を入力すると自動的に今開いているファイルのパスに置き換えられます。つまりそれぞれ、シェル上で「ls」「ruby /example/hoge.txt」「svn ci /example/hoge.txt」と実行しているのと同義です。

呼び出したコマンドの結果を挿入する

svnやrubyなどそのまま外部コマンドを呼び出すだけでも意味のあるものとは別にlsのように実行するだけではあまり意味がないものもあります。(結果が知りたいというだけなら別ですが)「:r」と「:!」を組合せることで外部コマンドの結果を挿入することができます。

:r!外部コマンド
:r!date

上記のように「:r」と「:!」と組合せることでdateの結果を開いているファイルに挿入することができます。例えばあるディレクトリ内にあるファイル一覧やsvn stの一覧をテキストで扱いたいという場合に便利です。他にもrubyやperlなどのワンライナーで動的に文字列や数式の結果を挿入することも可能です。

指定した範囲に外部コマンドを適用させる

範囲を指定してから「:!」を使用すると、指定した範囲に対して外部コマンドを実行し、かつ実行結果に置き換えてくれます。よくある例が選択範囲に対してcatを行番号付きで実行し、その結果に置き換えるというものです。

:'<,'>!cat -n

まとめ

いくつか例を示しましたが、このようにVimは非常にラクに外部コマンドと連携を取ることが可能です。Vimだけではちょっと大変だなということも外部コマンドを使えばラクにできることも多いです。まずは普段よく使うコマンドをVimから呼び出すことでラクができないか考えてみるといいのではないでしょうか。

ukstudio

Hack #2: Vimを使う前に見直しておきたいポイント

Vimが持つ豊富な機能を最大限有効に活用するためには、Vimの操作方法を自分にあったかたちに設定する必要があります。文字入力と編集にかかる時間が短くなることは、あなたの仕事を早く終わらせるだけではなく、思考を表現する際の時間差がなくなることから、成果物の質の向上を促進します。また、作業にかかる負担を減らすことがあなたの労働持続力の低下を抑えるだけでなく、文字入力と編集というもっとも基本的な動作にすらインタラクティブな楽しみを見いだすことが出来、あなたの日々の生活に潤いをもたらします。

あなたが仕事でプログラムを書くとき、使う言語、プラットフォーム、ライブラリの選択の余地がない可能性はありますが、あなたがどのエディタを使い、それをどうカスタマイズするかはあなたの自由です。もしその自由が与えられていないならば、まずはあなた自身の権利を主張し、自由を獲得するというタスクをこなす必要があります。

Vimをうまく設定することで、高速でかつ長時間に渡るの文書の入力・編集が可能になります。本書の後のHackにはVimをカスタマイズする様々な方法が掲載されています。本Hack #2では、あなたがどの設定を採用するかの選択の指針となる3つの原則を示します。

最小打鍵数の原則

よく入力するコマンドほど、短い打鍵数で実行できるよう設定することが何よりも大切です。入力頻度とそれに要する打鍵数は負の相関があるべきです。例えば編集中ファイルを保存するためには:writeまたはその省略形である:wと打鍵する必要があります。打鍵数はリターンキーを含め、3です。一方:nnoremap w :<C-u>w<Return>などと事前に設定しておくことで、打鍵数を容易に1にまで減らすことができます。また、[Hack #36: バッファを自動的に保存する]で紹介する方法で自動保存するよう設定しておくことで、0打鍵数でファイルの保存を行うことができます。このことはあなたの文書入力にかかる時間を減らすばかりでなく、同じようなコマンドばかり入力するという精神的重圧の高い作業からあなたを解放してくれます。

初めて何らかのVim pluginをインストールしたとき、その機能を使うために提供されているインタフェースがExコマンドのみでしかもコマンド名が長い場合、不便を感じることがあると思います。これは、あなたが自分でkey mappingを定義することをそのpluginの作者が期待しているのであり、毎回長いExコマンドを入力することを必ずしも要求しているわけではないことに注意すべきです。

独自のkey mappingを定義する具体的方法についてはHack #?: Key mappingを定義するを参照してください。

最大持続時間の原則

一般的なプログラマは一日の大半を文字入力と編集に費やすことになり、それによってかかる負担は時として指に壊滅的なダメージを与えることが知られています。この指の体力をここではFP (Finger Point)と定義します。たくさんのキーを打鍵することによってあなたのFPは消耗し、逆に休憩やマッサージを行うことで回復します。

どの指を酷使することで多くのFPを消耗するかは人によって大きく異なります。ある人々は左手小指が急所となっており、それ以外の人々はそうでありません。また、親指を内側にひねって叩くのを苦手とする人もいます。これはあなたの指の長さや太さにも依存します。一般に、小指が短い人は小指のFPが少ないと言われています。あなたがどの指を酷使しても大丈夫か、また酷使してはいけないかを把握しておくことは、あなたのVimの設定に非常に重要な役割を果たします。

筆者は左手小指を酷使することを非常に苦手としており、極力Ctrlキーと左Shiftキーを使わなくて済むよう設定しています。例えばUS配列キーボードでコロンを入力するためには左手でシフトキーを押したまま右手でセミコロンキーを叩く必要があります。セミコロンよりもコロンを入力する頻度が圧倒的に高いことを考慮し、セミコロンとコロンを逆に再配置することで、左シフトキーの入力回数を減らすことに成功しました。また、Vimで最も多く利用する<Esc>またはそれと同等の<C-[>のどちらのキーを叩くべきかという選択において、筆者は左手中指で打鍵する<Esc>のみを使い、<C-[>を使わないことで左手小指を保護しています。

なお、良いキーボードを使うことや日頃からの鍛錬でFPの消耗を抑えることも無視すべきでないとても重要な事柄ですが、本書ではいかにしてVim側の設定であなたのFPを高く保つかという点のみを議論します。

直感性の原則

Vimが標準で提供する機能はキーボードの各キーに直感的に配置されています。例えばInsert modeに入る(=テキスト入力を開始する)にはi、単語(= word)単位の移動はwと、直感的に理解しやすいキーに割り当てられています。

同様にあなたが新たにkey mappingを定義する際に、直感に反しないキーに配置することによって、新たに追加された多くの割当を容易に覚えることができます。

あなたにとっての直感と、Vim環境をよく知る人たちの共通の認識の、二つの種類の直感性があります。後者を充分に尊重することで、他の人と設定を共有することが容易になります。ここで注意しておきたいことは、あなたが何をもって直感的であると感じるかどうかはあなたの経験に依存しすることです。もしもあなたが自分のことをVimのエキスパートと認識していないのであれば、はじめのうちは可能な限りVim界の常識をそのまま受け入れることを経験しておくことをお薦めします。Vimのエキスパートは日常の文字入力・編集作業における様々な障害とその克服方法を既に編み出しており、それら先人の知恵を有効活用することが望まれます。

なお、この直感性の原則よりも、前の二つの原則が優先されます。同じ打鍵数でかつ同程度のFP消費の複数のキーから選択する際にのみ、この直感性を考慮することになります。

まとめ

本Hackは後のHackに先立ってどのような設定を採用するべきかの指針を与えました。その際、あなたが効率的に文字入力・編集を行うためにどのようなVimの設定を採用するべきかを考えるときに参考になる三つの原則を示しました。

ujihisa

Hack #1: Vimを使うために必要な最小限の設定

問題

数あるviクローンの中でも数多の機能を備えているVimですが、デフォルトでは可能な限りvi互換で動作するようになっており、一切設定を行なっていない状態ではVimを使う意味がほとんどありません。しかし設定を行おうにも項目は多岐に渡るため、どこから手をつければいいのか初心者には判断することができません。そこで、まず最初にVimをVimとして使うための最小限の設定を行う必要があります。

解決方法

  1. Vimを起動する。
  2. 次のコマンドを実行する:
    *nix環境の場合
    :edit $HOME/.vimrc
    Windows環境の場合
    :edit $HOME/_vimrcまたは:edit $VIM/_vimrc
    もし$HOMEの意味が分からない場合は$VIMの方を使ってください。
    その他の環境の場合
    :edit vimrc
    ただしvimrc:help vimrcを参照して自分に最適な値に置き換えてください。
  3. 次のコマンドを実行する: :write
  4. Vimを終了する。

これで次にVimを起動するとvi互換ではなくVimらしいデフォルト値が設定された状態になります。

解説

Vimの各種挙動は多数のオプションで変更可能ですが、デフォルト値の多くはvi互換で動作する場合とそうでない場合とで値が異なります。Vimは起動時にユーザー固有の設定が記述されたファイルvimrcを読み込むのですが、このファイルが存在しない場合はvi互換で動作するようになっています。逆に、中身が空であってもvimrcが存在しさえすればVim独自のデフォルト値が設定された状態で起動するようになります。

このvi互換の動作をするかどうかについてはオプション'compatible'で明示的に設定することもできます。ただしこのオプションは副作用が大きいため、特に理由のない限りは明示的に設定する必要はありません。

kana

Vim勉強会 in MTLが無事終了しました

多数のご参加ありがとうございました。

また、こういう機会を提供してくださった永和システムマネジメントの皆さん及びメディアテクノロジーラボの皆さん、本当にありがとうございました。

当日のLingrのログその様子

Home > Archives > 2009-04

Search
Feeds
Links
  • 公式
  • 勉強会
  • 情報
  • コミュニティ
  • Meta
    Etc
    Creative Commons License
    This blog is licensed under a Creative Commons License.

    Return to page top