47 howm-mode.vim (2-24) howm_instantpreview によって閉じる動作が変わるのを修正

パッチを友人にテストしてもらって気づいたことの一つ。 howm_instantpreview の値によっては、検索ウィンドウとプレビューウィンドウの間にメモウィンドウがあるときに、新たに検索ウィンドウを開く(日付の上でENTERなど)と、メモウィンドウが閉じられるバグを発見。わかりにくいので、手順で書く。

  1. 検索ウィンドウを開く(一覧、検索どちらでも良い)
  2. 検索ウィンドウで ,c して、メモウィンドウを開く(プレビューと検索の間に位置する)
  3. メモウィンドウの日付で action-lock を動かす
  4. howm_instantpreview が真なら、さきほど開いたメモウィンドウが閉じる(偽なら閉じない)

自分は howm_instantpreview を真にして使っていたので、閉じるのが当然だと思っていた。どうやら違うみたい。プレビューの有無で動作が変わるのはおかしいので、修正することにした。

原因は、ウィンドウを閉じている間にもイベントが発生しているせいだと推測。あんまりよくわかってないけど、それ以外に思いつかない。プレビューの有無で動作が変わるとか考えられない。

" 指定したバッファ名のウィンドウを全て閉じる.
function! s:EliminateWindow(name)
  let ei = &eventignore
  set eventignore=all
  let nr = bufwinnr(a:name)
  while nr != -1
    exe nr.'wincmd w'
    if s:SafeClose() == 0
      break
    endif
    let nr = bufwinnr(a:name)
  endwhile
  let &eventignore = ei
endfunction

eventignore オプションを使って、:autocmd が動かない状態にしてから閉じる。終わったら戻す。よくわからないまま変えたのに、なんかうまく動いたよ!やった!

ついでに、42 で書いた ClosePreviewWindow にデバッグ用の変な :echo が混じっていたので、そいつも修正。

42: http://d.hatena.ne.jp/eclipse-a/20080210/1202654087

function! s:ClosePreviewWindow()
  let pwin = escape(s:prefix_howm.s:buftitle_preview, ' ')
  let rwin = escape(s:prefix_howm.s:buftitle_ftresult, ' ')
  let n = winnr('$')
  let i = 1
  while i <= n
    exe i "wincmd \<C-w>"
    let bname = bufname('%')
    if (bname !~# pwin) && (bname !~# rwin)
      break
    endif
    let i = i + 1
  endwhile
  if i > n | new | endif
  call s:EliminateWindow(pwin)
endfunction

まだ、もうすこしテストするね!