トップ «前の日記(2008-05-14) 最新 次の日記(2008-05-16)» 編集

follow ikegami__ at http://twitter.com

イネムリネズミ日記

いけがみを召喚するには、出現予定を参考にしてください。三週間前までにメールをくだされば、日程を追加するなどしてスケジュールに組み込むことができるかもしれません。勉強会や個人的な会合、中途採用面接などに応じます。日記に書かないことはこちら

2003|04|05|06|07|11|12|
2004|01|02|03|04|05|06|07|10|11|
2005|01|02|03|04|05|06|07|08|11|
2006|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|11|12|
2010|03|04|12|
2011|02|03|04|06|08|09|10|

2008-05-15 シキザキベゴニアと幸福な日々 [長年日記]

_ vim でも flymake (on-the-fly syntax checking)

周りに vim を使う人が多い。私も vi を使うことがあるが、それは itojun 氏の nvi-m17n を昔使っていたからである。当時(という言葉を使いたくないが)、日本語を読み書きすることのできる高機能エディタは nvi か nemacs しか無かったのである(あ、Unix の話ね。MS-DOSや国産OSのほうが当時は日本語処理がまともだった)。どちらも痛し痒しで、状況に応じて両方を使い分けるしかなかったのだ。WWW なんてなかった頃の話である。

で、今はといえば、もう断然 Emacs である。 anything.el なる便利な仕掛けができてしまったので、私はついこの間、とうとう Emacs21 から Emacs22 に乗り換えた。.emacs を移し変えるにあたって、Emacs Lisp とひたすら戯れたのは言うまでもないことである。人生の中でもっとも楽しいのは .emacs いじりではなかろうか。非生産的だし。W4W (Work for Work).

しかし、 Emacs が洗練されているのなら、vi-clone も洗練されてきているのではないだろうか。食わず嫌いはよくないよな、と思って Vim 7 系列にも手を出してみた。昔取った杵柄で、手がキーバインドを覚えているので普通に使えるのだが、肝心の機能がない。 flymake がない。 flyspell もない。

そこで、vimscript で flymake を作った。vimscript を触るのは初めてだったが、一日で一応満足するものが作れた。 flyspell も同じようにできるのかもしれないが、vim の syntax highlight がかっちりしすぎて融通が効かない。 Emacs みたいにいい加減でいいのに。

Vim global plugin for on-the-fly syntax checker
Maintainer: Daisuke Ikegami 
  
Copyright 2008 Daisuke IKEGAMI
Free distribution, use, and modification permitted under BSD3
  
DESCRIPTION:
  Performs on-the-fly syntax checks of the files being edited
  using the external syntax check tool (usually the compiler).
  Highlights erroneous lines and displays associated error
  and warning messages. This plugin is a port of 'flymake-mode'
  for Emacs.
  
INSTALL:
  1. put flymake.vim into your plugin directory (~/.vim/plugin)
  2. put some file-type plugins into yours (~/.vim/ftplugin)
  
I've never written a vim plugin and this is the first project.
Please hack it and distribute freely under the BSD3 license.
  
HINT:
  To use flymake.vim (the first version), you have two hooks:
    
  1. autocmd BufWritePost * :call FlyMake(arg1, arg2, arg3)
  2. autocmd BufWinLeave  * :call FlyMakeCloseWindows()
  
  Here, the FlyMake function takes 3 arguments:
  
  arg1 : the external command to check syntax; which consists
         of the format of printf. arg1 must have two '%s':
         one is for a temporary directory
         another is for a program file (without path name)
  
  arg2 : a pattern match for error message. arg2 must have two
         groupings:
         one is a line number for where is error occurred
         another is a message for error message
  
  arg3 : a pattern match for warning message, like arg2.
  
  See examples in the ftplugin directory for hacking.

ファイルは固めて flymake-vim-plugin.0.0.1.tar.gz として置いておく。開発は、darcs repository でやってるので、patch 作ったら送ってくれてもいい。でも、たぶん、もう触らないと思う。勝手に fork してください。修正 BSD ライセンスです。

darcs repository: http://dora.koka-in.org/~ikegami/repos/flymake-plugin/
Get the latest (nightly build):
  % darcs get --partial http://dora.koka-in.org/~ikegami/repos/flymake-plugin/

サンプルとして、 C と Ruby の flymake ができるようになってる。C のほうは、Makefile 書いて、 check-syntax: ターゲットを作ってくれればいい。そこらへんは、Emacs の flymake と同じです。

結論:Emacs の方がずっと楽しい。食わず嫌いじゃなくて、やっぱり好みの問題だった。ただ、これで親から Emacs を取り上げられても vim で生きていけるだけのサバイバル能力は付いたのではなかろうか。

なお、作成に当たって、他のウィンドウにコマンドを送りつける - ボクノスさんのコードが非常に役に立った。これがなかったら、エラーメッセージをどう表示したらいいか途方に暮れるところだった。ありがとう。

flymake-vim-demo1
flymake-vim-demo2
flymake-vim-demo3
flymake-vim-demo4
flymake-vim-demo5

_ 追記(2008-05-16, 2008-05-): いくつかの反応を受けて

皆様、ご指摘感謝致します。

ka-nacht様より「中途半端なメッセージ表示などで苦労するくらいなら何故最初からquickfixを使わないのか。」
Emacs には M-x compile という、vim の quickfix に相当する機能がございます。いけがみは、Emacs の M-x compile にも、vim の quickfix にも不満があるのです。 flymake に求める機能は、ファイルセーブ時に highlight してほしいということなのです。これは、autosaveと組み合わせて、初めて効果を発揮します。ただし、後述する理由で、現状の flymake.vim プラグインには無視できない問題があり、autosave.vim とは組み合わせることをお勧め致しません。
ujihisa様より、ソースのあるディレクトリより上にあるディレクトリ全てを /tmp にコピーしてしまうという仕様は問題
多くのプログラミング言語は hierarchical module を採用しています。そのため、コンパイルには、ソースコードだけでなく、ディレクトリも必要になります。正確には、上下かかわらず、まわりのディレクトリを見る必要があるわけで、そのためには、ソースコードを構文解析しなければなりません。トレードオフとしては、モジュールパスを変数に格納するなどという方法が考えられますが、他にもアイデアはないでしょうか。Makefile や ruby なら、include path を埋め込むことができますが、そうでないプログラミング言語もあります。
致命的な弱点:その1
現状の flymake.vim は vim の syntax highlight にエラー行を match する Range でハイライトを行っています。ということは、該当ソースコード以外のソースコードを他のウィンドウで開いているとき、そちらもハイライトされます。これは困ったね。
致命的な弱点:その2
現状の flymake.vim は、background でコンパイルせず、foreground でコンパイルします。これは意図している機能ではありません。しかし、background でコンパイルするからには、コンパイル後のエラーに合わせて、ソースコードのバッファをハイライトする必要があります。前述の致命的な弱点1.を克服した上で、この問題を解決する必要があるでしょう。
Windows上では動かない(ので修正する必要がある)
flymake.vim を使ってみた - くふんといっしょさんから報告を読ませていただきました。*Name*っていう命名規則は Emacs から引き継いじゃったんだけど、vim ではダメだったんだね。なるほど。あと cygwin とか bcc は確かに頭から抜けていました。ということで、困った人は参考にしてみてください。気が向いたら、次のバージョンに適用します。僕は Windows なマシン持ってないので再現できないんです。
kana様がgithubで開発を始めたようです
どうぞご自由に改変してください。修正BSDライセンスを引き継いでいただきありがたいことです。私のコードがダメなら、全部消して一から作り直してもいいんじゃないかなと思います。

_ ちなみに

Vi v.s. Emacs の戦いは Usenet の頃からの不毛な争いであるので、これ以上参加したくはありません。どちらも使えたらいいんじゃないのかな。

僕が、なんで VimScript に手を出したかといえば、興味半分、あとはこないだ「作りたいソフトウエアもないのに言語をやたらに勉強してもしょうがないだろ」と言った手前です。「しょうがない」を「ダメ」ととらえる人はネガティブですね〜。なんか暗い過去でもあったのでしょうか。忘れた方がいいと思います。

チナミニ Flymake in GNU Emacs22 (YouTube) こんな風に動きます。


出現予定(召喚方法 ikegami@madscientist.jp):

RSS feed を再開しました。RSS の思想を尊重するために全文配信はしません、あしからず。