Real Vim Hacks Project
Posted at 2010/07/25ツイート
Vim 7.3が今年の夏に出るという今、Vim 7.4 or Vim 8.0に必要な機能を議論し、あわよくばパッチまで書いてVim本体に取り込んでもらおうという企画です。自由に編集してください。ただしVimをシェルやIDE化するという、Vim本体でやるべきではない機能についてはReal Vim Hacksでは対象外とします。あくまで、Vimを拡張しやすくする方向で考えてください。できることなら、新機能のパッチをまとめて、Windowsユーザーでも気軽に試せるような環境を整えたいと考えています。皆さんの協力をお待ちしています。
我々はなぜパッチを書かなければならないか
それはVimの作者でありメンテナであるBramさんがVimの安定化に尽力していて、「パッチが出たら精査して取り込む。自分の方からは積極的に新機能を追加しない」という姿勢だからです。つまりどんなに欲しい機能を妄想したとしても、誰かがパッチを書かないと一生実装されません。幸いなことに、Vimはオープンソースなので誰もがパッチを書くことができます。ソースコードの解読は難しいですが、先人たちの残した資料があります。皆さんもVimを使いやすくするために協力しようではありませんか!
Vimに欲しい機能
関数によるsidの参照
現在はs:GetSID()などをユーザー側で定義しなければなりません。 これは面倒なので、標準で欲しいところです。
無名関数やバッファローカル関数
スクリプト内関数のように、名前をランダムなものにしてエミュレーションすればできるような気がします。
タイマー機能
CursorHoldIで代用するのはさすがにひどいので……。 コマンドごとにタイマーを定義できるといいのですが。 あと、CursorHoldIはポップアップメニューが出てくると動作しないなど、仕様がひどいです。 せめてCursorMovedI並に、ポップアップメニューの候補が無くなったらイベントが発生して欲しい。
あと、call feedkeys("\<NOP>")
でCursorHold, CursorHoldIが発生して欲しいです。
todoにもありますが、holdtimeを作って、updatetimeとは分離するべきでしょう。
理想的な仕様は、次のようなものです。
autocmd CursorHoldI <timer=1000> call foo()
<timer=xxx>
というのがイベントの実行時間を表します。単位はms。CursorHoldI, CursorHoldでのみ有効。
省略されると今までと同様にholdtimeかupdatetimeを使います。
非同期実行機能
スレッドまで作れればいいのですが、制御が面倒そう。 デバッグの手間も考えると、かなりの議論が必要です。
setbufline(), appendbufline(), deletebufline()
なぜないんだ!
copyfile(from, to), rmdir()
なぜないんだ!
libcall()の多引数化, libcallext()
最近mattnさんがやっていました。これは標準で欲しいですね。 libcallext()はコールバック関数として使えるようです。C側からvimをいじれるということ? ちょっとこれは難しそう。
オブジェクト指向のサポート
ビット演算
あれば便利そうですが、まぁ無くても困らないかな。普通の人は。 tyruさんによると、Cとのやりとりを効率的に行う際に必要、だとのことです。 しかし、パーサ関係を書き直すのは大変そうですね。
組み込み補完をVim Scriptから利用する
これがないから、neocomplcacheは自前で補完を実装することになってしまいました。いい加減どうにかして欲しいですね。
ポップアップ補完モード
pnoremapとか。既存の機能との互換性をどう付けるか……。
ポップアップ補完時のautocmd
この辺りが欲しい
- PopUpSelect
<C-y>
や入力を続けて補完が確定したときに発生 。<aword>
が確定したキーワード。 - PopUpNarrow 絞り込み時に発生。
<aword>
で絞り込んだキーワードを取得できる。
deleteでディレクトリも消せるように
これは本来当たり前の機能のはず……。
パッケージマネージャ
地味に一番重要な機能です。 Vimには独自のパッケージマネージャが乱立している上に、 マルチプラットフォームでインストールしやすい決定的なものは登場していません。 できればVim Scriptレベルで解決したいところですが、 簡単にインストールできるならば他のインタプリタで実装しても良いです。
Bool型の追加
地味ですが、重要な機能です。Vim Scriptには真偽値型が存在しないために、現在はスクリプト毎にtrue/falseを定義しているような状態です。新しい型を導入するのが大変ならば、v:true/v:falseを実装して代用するという手があります。
ツールチップ機能
Emacsにはあるのに……。auto-completeではツールチップを使用してヘルプを表示できたりするので、previewの代わりになるといいですね。ただし、GVim限定でしょう。
組み込み補完へのアクセス
completelist({completion} [, {expr}])で、taglist()のように、{expr}にマッチする組み込み補完の候補リストを取得できるようにすることを考えています。Vim 7.3がリリースされる前になんとしても実装したいところです。ソースコードを見たところ、if (parse_compl_arg(xp_name, xp_namelen, &xp_type, &argt, &xp_arg) == FAIL)というようにコマンドラインをパースしているので、これが使えそうな気がしています。
ソースコード解釈のためのTips
オプション変数はoption.cにp_{オプションの短い名前}で置いてある
tyruさん情報。
get_tv_string_buf*() の第2引数はもし数値だった場合に変換された文字列を保存するためのバッファ
tyruさん情報。
tyruさんのReal Vim Hacks Project
Real Vim Hacksリポジトリ
この企画に賛同してくれたtyruさんのリポジトリ。
My Real Vim Hacks Project
mbstrlen()のパッチを書いたらしいです。本家のMLに投げるらしいので、期待。
Vimスクリプトでlambda-like Funcref
Vim Scriptにlambda式を追加しようという構想。
Real Vim Hacksリポジトリ
wcwidth()追加したという話とmbyte.cの内部構造まとめ。
tyruさんがパッチを投げたところ、必要性が認められてVim 7.3に次の三種類の関数が追加されました!
strchars(): 文字数を数える
strwidth(): 文字幅を数える
strdisplaywidth(): スクリーン上の文字幅を数える
Exコマンドに対応する関数が知りたい場合
VimのExコマンドに対応する関数の探し方に関するTips。
参考記事
Vim Hack: 組み込み関数の追加手順
Vim: Gauche interface
参考になります。
VimM#2前後の行動記録
libcall祭り。
Vimのダメなところ: Vim Scriptがアレ
まぁ、Vim Scriptがあれなのは今に始まったことでは……。
Metaobject Protocol on Vim Script
いつかはこのレベルにいきたいですね。
Vim: curryingもどき
うーむ。カリー化か……。
kanaさんのsettabvar()パッチ
kanaさんのVim Hack格闘記録
パッチ作りの参考になりそう。
Vimプチハックのメモ
非常に有用な資料でしたが、サイト閉鎖。
Kaoriya版のVim
kaoriya版特有の機能まとめ
こちらの機能も本家にマージできるものはやっておきたいですね。
syslib.vim
Vimに足りないシステム操作系の関数を追加しよう、というプロジェクト。ただ、そこまでやるなら本体にマージした方がよさそうです。
GNU Emacs Lispリファレンスマニュアル: Timers
Emacsのタイマーの仕様。Vimにもこのレベルは欲しいです。Emacs 24では、並列化のサポートが提案されているので、今後の行く末に注目しています。
todo.txt
大量にあるVimのToDo List。なかなか魅力的な妄想的機能がそろっていますが、誰かが実装しなければ実現することはありません。
kanaさんのVimリポジトリ
独自のパッチが当てられています。本家にマージできそうならマージしたいですね。
Vimのgitリポジトリ
Mercurialリポジトリのミラー。github上にあるので、forkするのに便利です。本家からもリンクが張られる予定。
Windows で Vim をソースコードからビルドする
Windows上でVimをソースコードからビルドするのは大変骨が折れる作業です。そんなときは、thincaさんの秀逸なこの記事を参考にしましょう。これでWindowsでもReal Vim Hacksができます。
Shougoもどる
blog comments powered by Disqus