Sunday, February 25, 2007

効率的なテキスト編集の7つの習慣 [vim]

去年から Google にジョインしている vim の作者,Bram Moolenaar が,先日 Google 本社にて "Seven habits of effective text editing 2.0 (効率的なテキスト編集の7つの習慣)" と題してプレゼンを行った模様.

プレゼンは約45分,質疑応答含めて80分.
7 Habits For Effective Text Editing 2.0 - Google Video

プレゼンビデオをファイルとしてダウンロードしたい方はこちら (DivX 507MB).
ftp://ftp.vim.org/pub/vim/stuff/7Habits20.avi

プレゼン資料はこちら (PDF 640KB).
http://www.moolenaar.net/habits_2007.pdf


Vimmer にとってはヨダレもの.また,Emacs を始めとする他のエディター愛用者にとっても興味深いプレゼンだと思うので,以下に要点を意訳しておく.



日々,様々なテキスト (ソースコード,ドキュメント,e-mail,ログファイルなど) を編集するのに,時間が足らない!

このプレゼンは「いかに多くの作業を少ない時間でこなすか」について.

良いエディタを選択することが最初のステップ
(もちろんここでは Vim を用いて説明)

もし既に自分の手に馴染むエディタを使っているなら,他のエディタを試すのは時間の無駄 (このプレゼン終了後に,あなたは自分が使っているエディタが本当に良いか悩むかもしれないけど…).

もし自分にピッタリのエディタを見つけられていないなら,Vim を使うこと.ガッカリはさせないから.

3つの基本ステップ:
Step 1. 非効率な作業を認識する
Step 2: より良い方法を見つける
Step 3. それを習慣にする

以降このプレゼンは,この3つのステップをベースに「7つの習慣」を説明する.

Step 1 は非効率な作業,つまり繰り返し行ったり,時間がかかる作業を見つけること.

Step 2 は,それをいかに改善するかについて.パワフルなエディタであれば,作業を高速化するコマンドがあるはず.スクリプトを組めたり,外部プログラムを呼んだりもできるかもしれない.

また,より良い方法を見つけるのは簡単ではないので,各習慣の Step 2 の部分では,いかにそれを見つけるかの例も一緒に紹介する.

Step 3 はそれを習慣にする,つまり指が勝手に動くようになるまで,その方法を使い続けること.

なぜ「7つ」の習慣?

今回7つという数字を選んだのは,"The 7 Habits of Highly Effective People" という本にインスパイアされたから.この本は本当にオススメです.

ところで "Seven years of highly defective people" というのもある.こちらは息抜きがてらに.

さて本題.

Habit 1: 高速に移動する

Step 1:
検索する際に,対象語をいちいちタイプしていないか?

Step 2:
-> searching のヘルプセクションを参照してみる

検索する際に,"hlsearch" オプションを有効にして,検索語をハイライトし,視認性を高める."*" コマンドでカーソル位置の単語をサクッと検索する.

Step 3:
.vimrc に ":set hlsearch" を記述し,"*" を使い続けること.

folding なども非常に有効.例えば関数毎に全て fold してしまい,一覧性を高めるとか.

Habit 2: 2回タイプしない

Step 1:
長くて複雑な関数名などはミスタイプしやすい.前の記述をコピペしている人もいるようだが,それだって非効率だ.

Step 2:
-> 他の人に聞いてみる (実は聞いてしまうのが結構良い方法だったりする.自分で全ての方法を探し出す必要はない)

インサートモードコンプリーション (CTRL_N) を使う.

Step 3:
使い続けていると,どれだけタイプすればコンプリーションに十分かコツがつかめるようになる (あまりに短いと,候補がたくさん出すぎる).

変わった名前の人に e-mail を書く場合など,辞書ファイルを作ってそこからコンプリーションをするのも有効.

Vim 7.0 以降では,omni completion も追加されている.

Habit 3: 間違いはすぐに修正する

Step 1:
文章を書いた後は,ミススペルしていないか見直さなければいけない.スペルチェッカーを使ってもいいけど,それだって非効率だ.

Step 2:
-> Vim の ML を検索してみる (とても多くの質問と回答,tips などが投稿されている)

スペルコレクション用のマクロを定義する.

:iabbrev teh the
:syntax keyword WordError teh

Step 3:
スポットされた単語は自分の辞書ファイルに随時追加していく.さらにそれを行うマップを定義してもいい.

Habit 4: 関連ファイルを渡り歩く

Step 1:
新しいプロジェクトに参加する時など,ファイルの依存関係を理解する必要がある.

Step 2:
-> quick reference guide を見てみる

tags と quickfix を使う.

:!ctags -R .
:tag init
:tnext
Exuberant ctags を推奨.

そのアイテムが使われている全ての場所を探すには,grep が使える.
:grep "\<K_HOME\>" **/*.h
:cnext

他にもいろいろな方法がある.
"gf" でそのファイルに飛んでいける.
"[I" でカーソル位置の単語を含むファイルを見つけ,"[<Tab>" で飛んでいける.

Habit 5: 他のアプリとの親和性について

Step 1:
MS-Word,OOo Calc,Outlook などのエディタが使いにくい.いつのまにか ":wq" してしまう.

多くのアプリは整形されたテキストを扱うことができるが,エディターが使いにくい.Vim は良いエディターだが,レイアウトにまでは関与しない.この両者の良い点を繋げることができれば良いのだが…

Step 2:
残念ながらこれを解決する最善の方法は無い.

2番目に良い方法としては,

:set tw=0 wrap linebreak
して,コピペすること.

Step 3:
これを習慣にしても,やはりいろんなところで :wq してしまう…

Habit 6: テキストは構造化されている

Step 1:
プレインテキストでも,多くの場合はなにかしらの構造 (規則性) を持つはず.これを利用して編集作業の生産性を上げることができる.例えば lint の不必要な warnings やログファイルの余分な情報をを除去する.

Step 2:
-> スクリプトで解決する

lint をクリーンアップしたいなら,

map _cl :call CleanLint()<CR>
func CleanLint()
        g/gtk_x11.c:.*enum/d
        g/if_perl.*conversion to.*proto/d
endfunc
を定義して,_cl 実行後に :cfile % して error list に変換する.

Step 3:
lint を通した後は,_cl する癖をつける.必要な情報まで除去しないように気をつけること.

この要領で,必要なコマンドをどんどん追加していけばいい.

Habit 7: いつも刃を研いでおくこと

自分のコマンドは必要に応じてチューニングを怠らないこと.
自分自身の行動から,改善点を見つけること.

- folding
- 自動インデント
- プラグイン
- ネットワーク越しの編集
- アドバンスド スクリプティング
- などなど
を駆使して刃を研ぎすませておこう.

最後の「習慣」は,これまで紹介した習慣をどのように「習慣」にするかについて.

これまでの Step 3 (「習慣にする」の部分) は,「ただやれ」と言っているようで,当たり前のように聞こえるかもしれないし,重要ではないように思えるかもしれないが,必要なタスクを習慣にしてはじめて高速に編集作業ができるようになるのである.何も考えずにエディタを使い続けるのではなく,少しずつ洗練させて行こう.

例えば車の運転と同じ.最初はギアチェンジすること,ワイパーやライトをオンにすることなどを覚えていくが,そのうち無意識に行うようになる.ただエディタには車よりもたくさんのコマンドがあるから,1つ1つ,必要に応じて着実に習得していこう.

「コマンドを知らないことによって,どれだけの時間が無駄にされているか」「今より優れた方法を探すのに,どれだけの時間がかかるか」「そのマクロを書くことによって,どれだけの時間が短縮されるか」といったことを基準にして,将来何が必要かを考えてみよう.

非効率的なテキスト編集のしかた

- ドキュメントを読んだり,新しいコマンドを覚える時間が無い
- エディタの全ての機能が知りたがり,その一部しか使わない

つまり,「習わなければ使えない」ということ.それから「使わないコマンドまで覚えようとしない」こと.

Vim を使った効率的なテキスト編集

ユーザーマニュアル大事.

:help user-manual


…とまあこんなところ.

質疑応答の部分は割愛するが,基本的な質問から,「あなたの .vimrc を見せて下さい」との質問に Moolenaar 氏が「ヤダ」と答える場面までいろいろあった中で,1つ興味深かったのは「Open Source と Closed Source についてどう考えるか?」という質問.

Moolenaar 氏の回答は,

Open Source は基本的に楽しい.
私自身も Open Source をエンジョイしているし,これはみんな同じはず.

問題は,金を稼がなければいけないという事実.
Open Source は,どうやってビジネスに繋げるかが非常に難しい.

もちろん不可能だとは言わないが,難しい.

Open にしたいのは山々だが,様々なしがらみから Closed にしているコードもあるはず.

何をフリーにして,何をしないか,というグレーゾーンはいつも難しい.

実は Google にも同じ問題がある.
多くの Google 社員は,コードをオープンにしたいと思ってるんだ.

というものだった.


【2007/02/28 追記】
多くの方にブクマして頂いているようなので,ちょっとだけ補足.

Vim に詳しい方は,内容を見て「意外と普通のこと言ってるな…」と思ったかもしれない.確かに tips の1つ1つは,びっくりするような内容ではない.

オーディエンスが全員コアな vimmer とは限らないので,ある程度無難なところを選んだというのもあるだろうが,それよりこのプレゼンは「vim の便利な使い方」ではなく,あくまでも「効率的なテキスト編集の7つの習慣」ということ.

つまり,他のエディタ使用者も含めて,"what" よりも "how" の部分,考え方やアプローチについて言及したかったのではないかと思う.

具体的には Step 2で示しているような,「人に聞いてみる」とか「ML を検索してみる」といったアプローチ,そして各 Step 3の考え方,特に Habit 7の「刃を研ぎすませよう」というのがこの日の彼の一番のメッセージだと個人的には受け止めた.

まあ Habit 4のところで Step 3を資料に入れ忘れて,「おっと,そこはキミらで考えといてくれたまえよ」とか言ってたぐらいだから,そこまでの思惑があったかどうかは分からないが…


0 comments: