Vim のバグっぽい挙動

私が今のところ把握している Vim のバグっぽい挙動。本当は vim_dev に投げるべきなんだろうけど英語書く気力とか能力とかもろもろがないのでメモ代わりにとりあえずここにまとめておく。

buftype=acwrite なバッファでの undo

通常のバッファで undo を行うと、'modified' オプションの値は最後に保存したタイミングでは nomodified になり、それ以外では modified になる。
ところが、buftype=acwrite なバッファで BufWriteCmd イベント時に setlocal nomodified するようにしておくと、最後に保存したタイミングだけでなく過去に保存したタイミングすべてで nomodified になってしまう。

" Execute by hand, not as a script.
edit sample
setlocal buftype=acwrite
autocmd BufWriteCmd <buffer> setlocal nomodified
put ='1st'  " The 1st change of buffer.
write
put ='2nd'  " The 2nd change of buffer.
put ='3rd'  " The 3rd change of buffer.
write
set modified?  " => nomodified
undo
set modified?  " => modified
undo
set modified?  " => nomodified

例えばこんな感じにすると、2回 undo することで nomodified -> modified -> nomodified という風になってしまう。

特定の文字を含むバッファが Windows で作れない

具体的には、*?"|<> などの文字。ファイル名としては使えないけれど、仮想バッファを作りたい場合もあるのでバッファは作れてもいい気がする。と言うか作らせてください。

特定手順でウィンドウがおかしくなる

具体的には以下の手順。

vsplit
setlocal winfixheight
split
setlocal winfixheight

これを実行してから、Vim のウィンドウを縦方向に広げると、以下のようになる。

これは gVim での例だけど、CUIVim でも再現する。また、横方向でも同様に発生する。

X server が死ぬと Clipboard 繋いでた CUIVim がおかしくなる

これはサーバマシンに Windows から Xming で繋いでいたときに発見した。Xming 立ち上げて、putty でログインして DISPLAY 環境変数が設定されている状態で vim を立ち上げて、この状態で Xming を落とすと Vim のキーマッピングが一切設定されていないかのような挙動になってしまった。:map を見ると設定されている。なんだかよくわからない。

スクリプト内で :global や :substitute などを使った場合でも検索パターンが更新される

明確にバグとも言い切れないけど、ユーザからしたら完全に意図しない挙動だと思う。コマンドの履歴みたいに、ユーザの入力があった場合だけ履歴が更新されるのが正しいと思う。