Vim
2012年11月24日
いいエディタとは、
手に馴染み、書きごこちの好い
万年筆のようである。
パソコンは筆記用具として、テキスト情報に限って秀逸である。
テキストを扱うソフトウェアであるエディタが秀逸であれば、である。
最近vimを使っていてとても気持ちいいので、使ってきたエディタを振り返りつつ、エディタの今後を考えてみる。
1.はじめにMIFESあり
MS-DOS ver.2や3の時代は、あまり選択肢もなかったが、フルスクリーンエディタとしてはMIFESがスタンダードであった。
OSについてくるエディタはEDLINといって、何行目かを指定しその一行を編集できるワンラインエディタというしろもの。これではconfig.sysを一つ編集するのも大変な苦労だった。
一方、一太郎などのワープロソフトは今と変わらず、機能豊富でありながら、重量級アプリであり動作が重く使いにくかった。
しかしながら、日本語入力をFEP(Front End Processor)として分離する技術はこの頃に確立され、日本語のテキスト環境は整いつつあった時代。論文や小説、プログラム、パソコン通信への投稿記事など、ある程度まとまった量のテキストを作成、編集するのにエディタは最適だった。
ぼくも多分にもれず、MIFESによりテキストの扱いを体が覚えていった。
2.すばらしきVZ Editor
その後、ビレッジセンターからVZ Editorというツールが発売される。
さくさくした動作と、あらゆる機能のカスタマイズが可能で、かつVZマクロという独自の言語体系を装備していた。
また、常駐モードにより、MS-DOSのバックログが取れたり、瞬間的な起動ができることも重宝した。(当時のソフト起動はフローッピーディスクのLoadingでかなりの時間がかかった)
キーバインドはMIFES用のマクロがはじめから用意されており、ぼくもそれを利用していた。
しかし、徐々に自分の利用スタイルができてくると、できあいのマクロを改造し始めるようになる。
使い始めて、一年ほどでほぼ自分カスタマイズのマクロは完成の域に達して、ぼくのエディタの原風景=スタンダードは、この状態に確立された。
PCを使う作業の大部分を占めることになる、テキストの読み書きという操作環境ができてしまうと、その環境をどこでも使いたいと思うようになり、自分環境を1フロッピーに入れて持ち歩くようになった。
しかしながら数年後、MS-DOSは、GUIそしてマルチタスクという流れに飲み込まれ、消えていく。
windows3.1では、できることがMS-DOSとほぼ変わらないのでスルーしたが、windows95はそうもいかなかった。TCP/IPの搭載と、インターネットの普及のためである。
そして、自分としては完璧と信じるエディタ環境であるVZ Editorと泣く泣くお別れしなければならなくなった。
3.vi事始め
UNIXとの出会いは、すなわち、viとの出会いでもある。
PC環境はVZ一本で暮らせてきたが、UNIX環境にVZはなかった。当然である。
はじめはviのモードやコマンドのわかりにくさに、ストレスフルな操作感であったものの、Cが理解できるようになるよりも早く、viの操作に慣れていった。
まだインターネットがTCP/IPの巨大な実験場であり、webが発明されていなかった時代。viに関する情報は非常に少なかった。
しかし、運が良いことに、よい先輩に恵まれ、UNIXが職人文化といわれる由縁である口伝継承により、viの便利な機能を徐々に教わり、VZの時とはまた違うエクスペリエンスを得ることができた。
そのためか、viをカスタマイズすることはほとんどなく、標準キーバインドのまま10年近くも使い続けていくことになる。
viの偉大なことは、その歴史的経緯により、特殊キーを必要とせず、CTRLキーやESCを使うくらいで、あとは一般キーのみで操作が完結していることである。
そのため、SunOSのSunView、OpenWindows、X-windowsのMotiff、KDEといったウィンドウシステムとキーの競合もおきず、日本語入力のwnnやcannaとも相性がよかった。
4.windowsは秀丸に決まり
viはviとして必要十分であったが、windows95以降のPC用エディタは少々困った。VZ Editorの後継として発売されたWZ Editorは、いまいちいまにのできであったし、OS標準のnotepadはEDLINと同様問題外だった。
DOS窓でVZを使ってみても、あまり便利ではない。
なぜならマウスやウィンドウシステムといったGUI環境と、MS-DOS上で設計された操作感が合わないためだ。シングルタスクOSであったMS-DOSでは画面も占有するし、他のアプリケーションとのクリップボード経由の情報交換も必要ない。
そんななか秀丸をみつけ、ふたたびVZ Editorをいじくったように、秀丸マクロをいじくりはじめた。
そうして、体にしみ込んでいたMIFES+VZ Editor的な独自キーバインドやメニュー構成を、windows用にさらにアレンジし、ガラパゴス化していくことになる。
5.HappyHacking Keyboardの参入
ほぼ安定化したかに見えた秀丸カスタマイズであるが、キーボードを変えたことで、その安定が崩れていく。
そう、有名なHappy Hacking Keyboardを買ったのである。無駄なキーがなく、コンパクトで、そして打ち心地がいいキーボード。
なんとファンクションキーがないのである。いや、ないのがカッコイイのであるが、困ることもある。
メニューを出すのに、MIFESの時代から、ファンクションキーを多用していた。しかし、HHKではFnキーを押しながら数字を押すことでファンクションキーとして機能する。
これはかなり面倒くさい。
ファンクションキーには、選択開始や新規ファイルのオープンといったよく使う機能が割り当ててある。
それらをコントロールキーの組み合わせに変えていかなければならないのだが、キーバインドを追加しだすと、玉突きというか、ところてん式に次々と変更せざるえなくなる。
正直困まりはてた。
数日間悩んだあげく、助けを求めたのはEmacsのキーバインドだった。
6.Emacsっていいかも
Emacsもviと同じく、一般キーを中心にキーバインドが設計されている。モードがないため、編集機能などは基本的にCtrlキーとの組み合わせが原則となるが、長い歴史の中でそれなりに洗練されているだろうと期待した。
調べ始めると、予想以上に簡単に機能拡張ができる。
anything.elのできのようさに感激し、これはいけると思い、google calenderとの連携にわくわくし、org-modeには惚れ込んだ。表の作成、文章構造の入れ替えなど、ビジュアル的に効率的に行える。
気を良くして、秀丸もEmacsバインドにし、ubuntuにもEmacsの最新版を入れた。
そうして、Emacsのカスタマイズを楽しみながら、2,3週間使い続けてみたところ・・・。
・・・慣れない。
いつまでもキーバインドのメモをみないと、やりたいことができない。
何事も、最初の習得コストはかかるものであるが、それにしても覚えられない。
数が多すぎる。Emacsを使う頻度が徐々に減っていき、なおさら記憶と指にキーバインドが定着せず、結局、Emacsをあきらめることになった。
しかし、得られたものもある。
カーソルキーをつかわず、カーソルを動かすEmacs風のキーバインドは身に付いた。bashと共通なことが定着した大きな理由だろう。
そしてこれが、後ほど役に立つことになる。
7.ubuntuはgeditに決まり
ubuntuには、OSの設定でEmacs風キーバインドを有効にする、という項目がある。
これをいれておくと、アプリケーションのテキスト入力時に、Ctrl+aやCtrl+eといったカーソル移動が可能となる。
これはこれで便利であり、さらに標準のgeditもカスタマイズができるけっこう高機能なエディタであり、実用的である。
8.OS Xってどうなの
エディタが固定化しないまま、ふらふらしているうちに、Macbook Airを使うことができるようになった。
会社で買ったものだが、漠然とぼくが占有することがなんとなく許されている。
ということで、OSのセットアップもそこそこに、OSX用のエディタ探しである。
しかし結局、満足できるエディタアプリを見つけることができなかった。
かなりいい線にいったのが、みみかきエディタmiであるが、いま一歩、ぼく望むキーバインドにはならない。
9.たどり着いたところはvi
Emacsにトライして得られたことは、UNIX系エディタのカスタマイズ性の広さである。
viは基本的に標準のまま使ってきたわけだが、OSXやubuntuがメインマシンになってきている今、viいやvimを本格的にカスタマイズしてみるのがいいのではないかと考えた。
google先生の助けを借りて、手探りをしながらvimの航海に船出した。
vimをメインディタにするこを決心できたのは、皮肉にもEmacsのおかげである。
vimでインサートモードのときに、ちょっとだけカーソルを動かしたいが、そのためだけにノーマルモードに戻るのは面倒だ。そんなときは、Emacsのキーバインドでカーソルを動かす。これが、非常に気持ちいい。楽ちんである。
わずかであるけどもEmacsを経験したことで、vimの最大の特徴であり欠点でもあるモードの切替の手間が画期的に減らせることができた。これが、vimを主エディタに決心したブレークポイントとなった。
そして、unite,vimfilerといったpluginと出会い、.vimrcの深みにずぶずぶとはまっていくことになる。
憧れのorg-modeも、自分が気に入ったところは、vimでも実現できた。
10.マルチプラットフォーム
ubuntu,MacOS,windowsをせわしなく行き交う生活をしていると、ショートカットキーの使い分けが混乱する。
ウィンドウ操作のキーバインドは、OSに深く依存しているので、実質統一するのは難しい。
しかし、エディタはvimで統一することで、ほぼ完全に一致できる。
日本語入力もgoogle IME(Mozc)を入れて、キーバインドファイルのエクスポート/インポートで、これまた統一できる。
ウィンドウマネージャ、エディタ、IMEで競合が起きないように、注意して一度設計してしまえば、それぞれの設定を共有することで、かなり統一的な操作環境を構築することができた。
IME(Mozc)はMacの「ことえり」をベースとし、それをカスタマイズする。
なぜなら、Macのことえりは、ほぼ一般キーを中心に作られていることに気づいたからだ。ATOK等ではF6やF7で文字種変換をするので、そこから変えていくのが面倒だからだ。
11.そしてevernoteへ
こうしてできあがったエディタ環境であるが、それぞれのマシンで作ったテキストはファイル単位で散乱する。
極力Dropboxで集約していくものの、一時的にデスクトップやローカルハードディスクに置くこともある。
それが、違うOSを使っている時に参照したくなるなど、分散してしまう不便さが残る。
そこで、テキストデータの終着点を決めておく必要がある。
いままでの経験から、やはりEvernoteが終着点に相応しいことがわかってきた。
一番の理由は全文検索ができること。またEvernoteでは、iPhoneなどのスマフォに同期することだ。もちろん、Dropboxでも参照はできるが、オンラインであることが前提になる。Dropboxで一度参照したファイルは、キャッシュされるので、オフラインでも参照可能であるが、どのファイルをキャッシュしておくかを決めるのは結局手作業だ。
その点、Evernoteでは、オンライン時に同期しておけば、その後はオフラインでもみれる。(ただし、プレミアム会員に限る)
vimでもEverVimを使ってEvernoteに直接書き込むこができるので、アップ自体もさほど面倒ではない。
Evervimの使い方は、こちら(ubuntu)とこちら(OSX)に書いた。
Evernoteをストレージとし、vimをフロントエンドとした、マルチマシン、マルチプラットフォームでのテキスト管理システムの完成である。
sublime text 2というテキストエディタが最近評判がいい。
いままでテキストエディタはローカルのなかでいろいろなソフトウェアと連携してきた。IDEやメールソフト、コンパイラやインタープリタだ。
これからはEvernoteやDropbox、ブログシステムなど、ネットワークを介した連携も求められる。
vimが内部でpythonを呼んでネットワークを扱うように、エディタ自身の拡張言語がRESTなどのネットワーク機能を持つようになるだろう。
実際、iPhoneのエディタはそうなっている。
これからのエディタの進化が楽しみだ。
12.おまけ
VZ Editor時代、FEPはATOKが圧倒的なシェアを持っていたが、WXというフリーウェアのFEPが一世を風靡した。ATOKに比べて小さな目な辞書であるにもかかわらず、精度の高い変換を行うことができた。また、キーバインドも自由自在にカスタマイズできた。
パブリックドメインソフトウェアであったため、パソコン通信でダウンロードするのが一般的な入手方法であったが、当時の通信環境は2400bps+NMP5による圧縮といった時代である。辞書ファイルが1MBを超えていたので、そのダウンロードだけでも数時間かかるほど。雑誌についてくるのはCD-ROMではなく、3.5インチFDDだった。WXが付いたムック本にはFDDが4枚も付いていた気がする。
電話代を使い気長にダウンロードしすぐに使うか、翌月の雑誌のFDDを待つか、といった選択を迫られたものである。
2012年10月22日
vimを本格的に使い始めたが、Emacsがうらやましいところがひとつある。org-modeがあることだ。
org-modeは、Emacsをアウトラインプロセッサとして使うための機能を付与する非常に強力なスクリプトである。
vimにもorg-modeプラグインが開発されているが導入が難しい。また、Emacsで使うからこそ強力で便利であるのであり、そのままの操作感をvimに持ち込んでも無理があるというもの。
そこで簡易なプラグインの導入で、アウトラインプロセッサとして実用になる手段を考えた。
え、ニーズ? なにそれ、おいしいの?
1.求める機能
org-modeで特に便利だと思っている機能のうち、以下の2つについてvimに持ち込む。
(1)表作成機能
テキストで表を作るとき、スペースの数を合わせるのが最も時間がかかる。 表の内容だけをスペース区切りで羅列し、ワンタッチで表形式に整える機能。 整形ルールは、1つのスペースに区切った項を、|(縦棒)を補って表形式にする。
(2)視覚的な文書構造の入れ替え機能
大項目、中項目、小項目といった各文章単位を、インデントを使い記述していき、ブロック単位で前後関係を入れ替えたり、レベルを上げ下げする。その際、視覚的にスライドして移動する機能。
2.実装に必要なプラグイン
(1)表作成機能
表を簡易に作成する機能はvim標準では存在しないので、以下のプラグインを導入し、任意のセパレータ文字で表形式に整える機能を付与する。
(2)文書構造の編集ー領域の選択の拡張
文書の階層構造におけるレベルの移動は、インデントの量により決まる。vimでは、ビジュアルモードで選択した行を、"<"と">"でインデント量を増減させられる。そこで、ビジュアルモードでインデントを基準とした選択をできるようにする。そのために以下のプラグインを導入する。
(3)文章構造の編集ー上下移動
vimには、複数行をひと塊として扱い、1行に畳み込んでみせるfold機能がある。 畳み込みにはレベルがあり、第一レベルの畳み込みに、複数の第二レベルの畳み込みを組み入れられる。 その機能を使い、章や段落を1行に見せかけて編集することで、文書構造を行の移動として入れ替えられる。標準のままでは、畳み込んだときの表示がわかりにくいので、以下のプラグインを導入する。
3.表の作成機能の設定と操作方法
(1)Alignの設定
上記のAlign.vimをインストールしたら、以下の設定を入れる。 マルチバイトを使うので、3を設定しておく。
|
(2)以下のキーマップを設定
どのキーに割り当てるかは任意。ここれは、,tに割り当てている。
|
(3)操作方法
[基本]スペース区切りで書いた表から、スペースを補完して整形する。
これは(1)のalign.vimの操作。
ビジュアルモードで整形したい表を選択し、<Leader>tsp
[縦棒で区切る]
これは、(2)の独自キーマップの操作。
ビジュアルモードで整形したい表を選択し、,t
その他の操作については、以下ページを参照。
4.文書構造の入れ替え
ここでは、まず選択を容易にするために、textobj-indentを使えるようにする。
そのあと、インデント幅を調整する左右の移動を容易にする。
文書の前後関係を調整するための、上下の移動については、スライドする方式と折りたたみ機能を使った方式を考える。
(1)領域の選択
vimの基本機能で、空行で挟まれた行は、段落として認識されるので、vipかvapで一気に選択できる。 vipはカーソル位置がそのまま、vapで選んだ場合は選択領域の最終行にカーソルが移動する。
インデント量が同じ領域を一気に選択するには、textobj-indentを使う。 textobj-indentには設定は特にない。操作方法は、以下のとおり。(最後の文字は、i(アイ)の大文字か小文字である)
vii | カレントの行のインデントレベルと、それ以下のレベルの行を選択する。空行があればそこで止まる。 |
viI | カレントの行のインデントレベルと同じレベルの行を選択する。空行があればそこで止まる。 |
vai | カレントの行のインデントレベルと、それ以下のレベルの行を選択する。空行があっても止まらず、上位のレベルの行で止まる。 |
vaI | カレントの行のインデントレベルと同じレベルの行を選択する。空行があっても止まらず、上位もしくは下位のレベルの行で止まる。 |
(2)左右の移動
こうして選択したした領域の、インデントの幅を変更するには、標準でも< >のキーを使うと、その領域のインデント量をshiftwidthの分だけ増減してくれる。しかし、変更が一回終わると、領域選択が解除されてしまい、連続的に移動することができない。そこで、以下のキーマップを.vimrcに追記することで、領域選択がキャンセルさなくなり、連続して移動させられる。
|
なお、tab幅については、下記参考ページのはてな技術勉強会のページに詳しい。
ぼくは、以下のように設定してある。
|
(3)上下の移動 スライド方式
選択した領域をddで消して、任意の場所にpで貼り付けてもよいのだが、その方法は、はっきりと、ここをここに移したい、と決まっている場合。
構成を考えながら、あっちにおいてみたり、こっちにおいてみたりしてみたい。org-modeでは、選択範囲を一行ずつスライドしていくことができたので、vimでも、それを実現した。
以下のvimスクリプトを.vimrcに組み込む。(下記、参考ページにあるtacahiroyさん作成)
下記のキーマップでは、ビジュアル選択状態でCTRL+pで一行上に、CTRL+nで一行下に、選択ブロックが移動する。
|
(4)畳込み(fold)の活用
vimには、あるルールで行を畳み込み、表題だけみせる機能がある。それを使い、文書構造全体を見回せるように表示する。
畳み込みルールは、中括弧3つを入力し、それで領域を認識させる方法(marker)と、インデント幅で認識させる方法(indent)がある。ぼくは自由に指定できるmarkerを使っている。
次に、左端に畳み込みレベルのマークを表示する。ここでは第5レベルまで表示とした。
|
使い方は以下。
za | 畳み込みのopenとcloseをトグルで切り替える。 |
zo/zO | 畳み込みを開く。大文字だと再起的に開く。 |
zc/zC | 畳み込みを閉じる。 |
zr/zR | 全ての畳み込みを開く。 |
zm/zM | 全ての畳み込みを閉じる。 |
zf | 畳み込み印を付与する。 |
zd | 対応する折り畳み印を削除する。 |
(5)FoldCCの設定
foldCCの設定。畳み込みしたときの表示テキストを、FoldCCのものにする。(するとレベルや行数が表示されるようになる)
|
(6)上下の移動 畳込み方式
畳み込むと複数行が1行に見る。そこにカーソルを持ってきて、ddで削除し、任意の位置でpで貼り付けてやると、畳み込んだ領域が全て移動することができる。
ちなみに、畳み込みをしているときに、(3)のスライド方式を使うと、畳込みの階層が崩れて逆に見にくい。
5.参考ページ
- めんどうな作業がわずか数十秒に!新人プログラマが知らないと一生後悔するVimを使ったHTML生成
- tacahiroy Eclipse の「1行上/下へ移動」を Vim で
- はてな技術勉強会 .vimrc 説明補足 [vim] TABの説明
ここでは紹介しなかったが、foldで畳み込んだ表題をリスト表示し、選んだ表題にすばやくカーソル移動できるuniteのプラグインがある。(これで、表題の移動ができれば最高なのだが・・・)
2012年10月19日
テキストファイルで、スペースで区切った表を作ることがあるが、これをちゃんとした表に見えるように空白を補うのは結構面倒だ。
align.vimは、それを自動で整形してくれるが、スペースを|(縦棒)に変換してくれたり、ましてや<td>タグでくくってくれたりはしない。
例えば、以下の様なスペース区切りの表を書く。
|
それをビジュアルモードで選択し、
|
とすると、こうなる。
|
これはこれで便利であるが、以下の様な表にしたい。
|
そのためにはキーマップで、以下のように定義する。
|
スペースひとつを、ひとつの区切りとしているので、連続したスペースをいれると項がずれるが、実用にはなる。縦棒を:(コロン)とか、好みのものに変えるのも簡単。
同じく、スペース区切りの表から、tableタグ用に<TD>と<TR>のタグを自動変換するキーマップは以下。
|
すると、こうなる。
|
align.vimが入っていない場合は、最後の<CR>から後ろを取れば良い。
|
参考にしたのは、以下のページ
Big Sky
2012年10月10日
通常であれば、terminalのスクロール機能で遡って、ウィンドウマネージャの機能でコピペをすればいいのだが、それすらもマウスを使わずにやろうとすると、なかなか難しい。
VZ Editorの時代は、VZを常駐させておけば、ワンキーでバックログをエディターに取り込めたものである。
ひとつのソリューションは、screenやtmuxといった、仮想端末の仕組みを導入することであるが、それは利用形態そのものが変わってしまうため、そこまでするのは大げさだと思った。
シェルのバックログを何らかの手段で保存しておき、それを任意のタイミングでvimのバッファに渡せればいいわけで、それを実現する方法を探ってみた。
vimshellも良さげであったが、しっくりしたのは、ConqueTermというvimのプラグイン。
http://code.google.com/p/conque/
vimからpythonを呼び出すのは、evervimと変わらないので、早速導入。
vimを起動して、
:ConqueTerm bash
と打つと、bashでシェル画面になる。
vimのインサートモードでシェルが動いているので、<ESC><Enter>と打つと、インサートモードを抜ける。
すると、今までの出力結果が、vimのバッファ上にある、という仕組み。
以下のショートカットと設定を、.vimrcに書いておくことにした。
CWinsertを1にしておくと、インサートモードからの抜け方がCtrl+wの1キーで抜けられるようになる。
また、シェル画面の開き方も、SplitやVsplitやtabが選べる。
これでまた、キーボードから手を離さなくてよくなった。
vim楽しい!
2012年09月09日
ぼくはEvernoteが大好きで、長年使っている。
そして、vimのカスタマイズが徐々に楽しくなってきている今日この頃である。
そこで考えるのが、vimからEvernoteを使いたい、という発想。
当然、偉大な先人がいて、Evervimというツールを作ってくれていた。
@kakkyz81さんに感謝。
サーバ作業中のログやコマンドのリストなど、テキストを一時保存する機会は多い。ひととおり作業が終わると、その結果や途中のログなどを、ブラウザのEvernoteにコピペしていたが、これで直接vim上からEvernoteに記録することができる。なんて便利!
早速、Mac OSX Mountain Lionに入れてみるものの、なかなか苦労した。
こちらのドキュメントには、
|
とあるが、vimでpythonがちゃんと動いてくれなかったので、結局パッケージ管理のhomebrewを導入し、pythonを入れ、vimも入れることとなった。
ついでにOpenBrowser.vimも入れる。これはvim上からURLやメールアドレスの文字列にカーソルをおき、このプラグインを起動すると、ブラウザでそのURLを開いてくれる機能を追加する。便利だ。
これを入れておくと、Evervimからノートをブラウザで開くことができるようになる。
Evervimでできることは、とてもシンプルであり、必要最小限である。
主たる機能は、以下の6つ。(全ての機能は、上記ドキュメントを参照のこと)
:EvervimNotebookList | ノートブックの一覧を表示する。 |
:EvervimListTags | タグの一覧を表示する。 |
:EvervimSearchByQuery {query} | 検索文字列を指定して、ヒットしたノートの一覧を表示する。 |
:EvervimCreateNote | 新規ノートを保存するためのバッファが開かれる。 |
:EvervimOpenBrowser | ノートをブラウザで開く。 |
:EvervimSetup | アカウントのセットアップを行う。 |
これらのコマンドを、.vimrcにショートカットに定義する。
ぼくは"\"のあとのアルファベットとした。
検索文字列は、\sと打ったあと、続けて入力するようにする。
|
これで環境設定は終了であるが、これはEvernoteクライアントのエディタを変更したと解釈してもよい。なんてすばらしいのでしょう。
こんどはubuntuのvimも同じ設定をしておこう。
余談であるが、vimでyankしたときに、ウィンドウシステムのクリップボードに入ってくれるといいと思ったが、今回vimを入れ直したことで、それも可能となった。
詳しくは、こちらの解説を。
vimエディタからクリップボードを利用する。
OS Xの標準vimは、+clipboardのオプションを付けてコンパイルされていなかったが、homebrewでhomebrew/dupesのリポジトリから入れたvimは、+clipboardになっていた。嬉しい。
2012年08月29日
追記:
ちゃんと使えました。