103

ここ数日のvim

少し前からプログラミングの独学を始めたことは以前にも書いたが(たぶん)、それに際してプログラマがよく使っていると言われるvimおよびemacsなるエディタ。これらにはぜひ触れてみたいと思っていた。

Emacs実践入門 ?思考を直感的にコード化し、開発を加速する (WEB+DB PRESS plus)

Emacs実践入門 ?思考を直感的にコード化し、開発を加速する (WEB+DB PRESS plus)

Vimテクニックバイブル ?作業効率をカイゼンする150の技

Vimテクニックバイブル ?作業効率をカイゼンする150の技

#これらの本自体はとくに以下の内容に関わりません。ビジュアル要素的に入れてみた。

さて、まずはどちらを試そうか、と両方少しずつ試して直感的にラクだなと思ったのはvimで、そのまましばらく触っていたんだけど、ちょっとemacsも試してみようかと思って触り始めたらなんと普段使っているMacのテキスト入力の大抵の状況でこのemacsキーバインド(キーボードショートカットみたいな)が応用できることがわかり、一気にemacsをやる気になった。

と言ってもどこから入ればいいのかすぐには分からなくて、まずは基礎の基礎みたいなことから僕らのドットインストールに教えて頂いた。
http://dotinstall.com/lessons/basic_emacs

何と言ってもemacsキーバインドが素晴らしいのは、コントロール+dがデリート(進行方向に消去)だったりコントロール+f,bで左右にカーソルが動いたりとか、とにかく矢印キーとかトラックパッド(僕はマウス使ってないので作業場で仕事しているときはMagic Trackpadがメインだが)とかに手を伸ばさなくてもどんどん文字が打ち込める点である。そして繰り返すがこれを我らがMacでは大抵の状況下で使用できる。Facebookにコメントを打ち込む時だって、デフォルトのテキストアプリにメモを書くときにだって普通に使える。何を書くときにもあまりにも便利なこれには革命的に感心した。
というかMac使い始めて5年ほどだが、今まで一度も、こんなショートカットが用意されていたなんて本当に一度も気づかなかった。あんなに文字を書いてきたのに! たったの一度も、「あれ?」とすら思わなかった。どうして気付かなかったんだろう?

ともあれ、emacsを試してみたことでそういう副作用的な効能もあったり、あるいはまつもとゆきひろさんや宮川達彦さんといったスタープログラマemacsを使っているというし、これはますますemacsで行ってみるかと思っていたが、どうもその横で、つねにvimを使ってる人たちのなんというか、キャラクターというか態度というか、それについて話している感じが面白そうに思われてならなかった。
なので、できれば初級者のうちはあれこれと手を出して二兎追うものは一兎をも得ず的状況になりたくないな・・と思いつつもあらためてvimを試し始めたのが先週末ぐらいだった。

で、ここでもとりあえず僕らのドットインストールさんに色々教えて頂いた。
ちなみにドットインストールって手軽な入門的に使えると思うけど結構充実しているようでもあり、このシリーズはいろんな合間に何度も見た。無料でこのようなものを提供してもらって本当にありがたいです。
http://dotinstall.com/lessons/basic_vim

さてしかし、僕はついこの間までvimとかemacsというのは、そのドットインストールで覚え始めたからということもあろうが、基本的にはターミナルから使うものだと思っていたのだけど、それだと今まで使っていたGUIエディタ(いわゆる普通のエディタ。僕ならCoteditor)でやってきたようなことが色々できないのでメインでは使えないよな、とも思っていた。
今までやってきたようなこと、というのはたとえば、毎日開く「memo.txt」というテキストファイルをQuicksilverというランチャーでトリガー設定(まあキーボードショートカットのこと)してキー一発で出るようにしているが、ターミナルの画面にいちいちファイル名を打ち込んで開く、なんてやっている方式だとそれができない。

が、emacsをいじっているときに、それをターミナルからではなくアプリケーションとしてダウンロードして使えるということを知り、であるならば、vimにもそういうものがあってもおかしくないのでは? とふと思い、そしてもしそういうものがあるなら、そのvim用のアプリで開くようにすればショートカット問題は解決するのでは? とも思ったのだった。

果たして、検索して出てきたMacVimというのがそれで、これをインストールしたところ、まさに思うとおりの挙動をしてくれたのでそこからメインエディタにvimを使うという可能性が一気に広がってきた。

vimの基本的なカーソル移動などはその前に試したときからおおむね把握できてはいたが、それでも不便だなーと思ったのは、インサートモードという文字を編集するための状況下ではキーボードだけで移動できないことだった。ノーマルモードという、文字を編集できない状態であればj,k,h,lという各キーで十全にあちこちへ動けるのだけど、編集中にちょっと右や左へ動きたいと思ったときにいちいちモードを切り替えるというのは直感的ではなさすぎる。だから理想としては、ノーマルモードやインサートモードなどの複数モードを使い分けるスタイルはそのままに、インサートモードの状態でemacs的に動くようにならないかなー・・まあ、そんなことできるわけないか、それが望みなら初めからemacsを使えばいいわけだし・・とか言われそうだし・・と思いつつ、しかしこのような欲望を持つのは自分だけであるはずもないのでは・・と思い直し検索したらすぐにやり方が出てきた。

vimを自分の好きなようにカスタマイズするには、ひとつにはプラグインというのを入れる方法があるようだったが、それは自分がよく知らない他人の書いたコードを、よく理解もできないまま自分のマシンに入れて動かすということになりそうだから、初心者的には気が進まず、しかしそんなことをしなくとも「.vimrc」というファイルをマシン内に作って、そこにちょこちょこっと文字を打ち込んでカスタマイズする方法があるという事がわかり、それによって上記のemacsキーバインドというのも実現できるというので反映してみたらサクッと望みどおりの動きをするようになった。

じつはカスタマイズ用の設定ファイルにいろいろ書けばいい、というのはemacsを試したときに似たような状況に直面し、そこで一回なんというか洗礼を受けるようなことになっていたので今回のこれは自分でも驚くほどすんなり対応できている。やはり基本、無駄なことなんてないなと思う。
ちなみにemacsの設定の際には、コントロール+hがバックスペースになるようにする設定がどうしても効かなくて相当ハマったが、新しいMacBook Airでは同じ設定で普通に動いたのでマシンのせいだったようでもある。(具体的に書くと、一時的には動作するが再起動すると動かなくなった。普通は再起動したら設定完了なので逆なわけだが、なぜそうなったのかは今も分からない)

話を戻すと、vimのインサートモードにおけるemacs風の動作が実現すると、欲は出てくるものであれも足りない、これも欲しい、GUIのエディタならできるのに、みたいなことが芋づる式に出てきて、そのうち実現したものを以下に参考リンクと共に記しておきたい。(覚えているうちに)

  • MacVimインストール

上にも書いたが日本語版のMacVimを落としたのはこちら。
https://code.google.com/p/macvim-kaoriya/

  • 設定ファイル作成

.vimフォルダや.vimrcの作り方を教えてくれたのは同じサイトのこのページ。
https://code.google.com/p/macvim-kaoriya/wiki/Tutorial_0

インサートモード時にemacs風に動かすための設定は以下のコメント欄から。
http://blog.ruedap.com/entry/20110117/vim_unite_plugin_1_week
ついでにESCをC-jでできるようにしたんだけど、それは上記を見よう見まねで。

  • 表示行での上下移動

ノーマルモード時にjkで上下移動できるのはありがたいんだけど、これは「見かけの行」ではなく「未改行のカタマリ」を1行として捉えて大きめに移動してしまうので、見かけの行(表示行と言うらしい。逆を物理行というらしい)における1行ごとの上下移動をしたいなと思って検索したら以下が出てきたのでそのように対応したらできた。
http://d.hatena.ne.jp/thata/20100606/1275796513
https://sites.google.com/site/fudist/Home/vim-nihongo-ban/vim-japanese#TOC--3
ほんとの希望としてはさらに、インサートモードでのC-p, C-nも表示行での上下移動がいいのだけど、検索で見た先ではそうしない方がいいと書いてあったりそもそもやり方も分からなかったのでとりあえずそのままにしている。

  • 色テーマ設定

ここまで揃ってくると、「どうしても必要な変更」というのはほぼ無くなってきて、もっとこうだったらラクなんだけどな、というゆるめかつ贅沢なリクエストが出てくる。その分かりやすい例的に、MacVimのデフォルトのテーマがちょっと気になってきた。具体的にはもう少し明るくしたい。
で、メニューバーの「編集」というところからテーマ設定はできて、その中の「delek」というテーマがとりあえずいいかなと思ったんだけど、これは一時的な設定のような感じで、新たに起動したファイルには反映されない。デフォルトで設定を変えたかったので調べたら、以下にやり方が書いてあって、「.gvim」のファイルもこのときに作った。
https://sites.google.com/site/fudist/Home/vim-nihongo-ban/vim-color

  • 行端で止まらず上下に移動

そのまま多少使ううちに新たに気になったのが、ノーマルモードでカーソルやh,lで左右移動をしているときに、行頭や行末にあたるとそれ以上動かなくなる。普通のエディタなら、行末より右に行こうとすれば下へ移動し、行頭より左へ行こうとすれば上の行へ行くけどvimでは止まってしまう。こういうのも不便にようやく感じられるようになり、検索で以下を見つけて設定した。
http://fisto.hatenablog.com/entry/2012/11/16/181349
https://sites.google.com/site/fudist/Home/vim-nihongo-ban/-vimrc-sample
上記ではh,lキーについて書かれていないけど、単に足したら反映された。

  • 文字カウント

編集作業では結構切実だが、長文のファイルを編集しているときなどに自分が今どこにいるのか、つまりそのファイルは現状トータル何文字で、そのうちの何文字目にいるのか、ということが分かりやすく表示されないので(これまたCoteditorなら非常に分かりやすく出てくる)そういうの欲してる人はどうするんだろう、と検索したところ、gを押してからコントロール+gとすれば出てくるとわかった。
http://www.atmarkit.co.jp/ait/articles/1106/15/news127_3.html
これは任意の部分を選択した状態だとその選択範囲について表示されるので素晴らしすぎる。

  • 日付&時刻表示

先日scholaの打ち合わせで池袋ジュンク堂さんへ行った時に買ったこれを少し読んでいたら、

開発ツール徹底攻略 (WEB+DB PRESS plus)

開発ツール徹底攻略 (WEB+DB PRESS plus)

日付や時刻が簡単に出てくるように設定できるという。今までそのようなときにはGoogle日本語入力で「きょう」「いま」とか入れて変換していたけど、「,df」と打てばそれが出てくるというならその方がいい、ということで設定したら出来るようになった。

inoremap ,df strftime('%Y/%m/%d %H:%M:%S')
inoremap ,dd strftime('%Y/%m/%d')
inoremap ,dt strftime('%H:%M:%S')

  • .vimrcをすぐに出す

同書に載っていたこれもやった。スペースキーとピリオドを続けて押すと設定ファイルが一瞬で出てくる。便利!

nnoremap . :edit $MYVIMRC

  • 複数行のコピー(orカット)&ペースト

これについては結局素晴らしい解決はしていないんだが、どうもvimでは複数行にわたるコピペがしづらい印象があって、色々調べると以下のようなことを書いている記事がマジョリティのように思われた。
http://www.softel.co.jp/blogs/tech/archives/2661
カッコイイとは思ったんだけど、すぐには慣れづらい・・と思っていたらこのMacVimでは普通のコピペ(コマンド+c,v)が効くのでとりあえずそれでいいか、と使ってる。軟派だ。(参考

  • 分割ウィンドウ同士での移動

これどうやるんだ・・と思って検索したら以下が出てきた。
http://www.ksknet.net/vi/post_121.html
ようするに上下に分割した場合にはC-wのあとにjkで上下移動。左右に分割した場合にはC-wのあとにhlで左右移動、という至って論理的かつシンプルなことだった。


とまあ、書いているうちにキリがなくなってきたので続編はないような気がしてきたが、思い出せるかぎりでは現状セットしたのはそんなところで、まだ多少気になるところはあるがまあよしとしている。というよりそもそもの希望は単にインサートモード時にemacs風に動けばいいのに・・ということだったわけで、それから考えたら充分すぎるリッチぶりである。

ちなみにそう言いつつも今気になっているのは、普通のエディタならばず〜っと下向きカーソル(矢印キー)を押していたら最終行の行末にカーソルが合うはずなんだけど、vimだと最終行の行頭になってしまうので、最終行の行末に行きたい場合にはそこでさらに1アクションが必要になって直感的ではない。ずっと下へ進んで最終行にぶつかったらそのまま右へ動いてほしいし、あるいはせめてノーマルモードでシフト+lを押したら最終行の行末、とかなると美しいのだが・・

いずれにしても、「こういう設定ないのかなー」と思って検索すると大抵出てくるのが面白い。その中に知り合いは一人もいないが、よく分からないあり方でつながっているようでいい感じだと思う。