Skip to content

statuslineの%{}などでevalした際に,try-catch でVimのエラーをキャッチしていても statusline が disable されてしまう #893

@haya14busa

Description

@haya14busa

質問・報告の内容

statuslineの%{}などでevalした際に,try-catch でエラーをキャッチしていても statusline が disable されてしまう

(キャッチされないエラーが発生したらstatuslineがdisableされるのは正しい)

再現方法

statusline_test.vimrc

set nocompatible

function! StatuslineKiller() abort
  try
    " :throw ではなく Vim のエラー(任意)を発生させる
    call eval('')
  catch
    return 'OK: error catched!'
  endtry
  return 'OK'
endfunction

set laststatus=2
set statusline=%{StatuslineKiller()}
  1. vim -u statusline_test.vimrc -i NONE -N
  • 'OK: error catched!' がstatuslineに表示される (actual & expected)
  1. :redrawstatus
    • " Press ENTER or type command to continue が表示 (actual & expected)
    • Enter を押す
    • statusline が disable される (&statusline == '')

Expected な挙動

  1. vim -u statusline_test.vimrc -i NONE -N
  • 'OK: error catched!' がstatuslineに表示される
  1. :redrawstatus
    • 'OK: error catched!' がstatuslineに表示される

関連問題

  • actual: statuslineでVimのエラーが発生し,キャッチもされないと, silentlyにstatuslineがdisableされる
  • 個人的な? expected: statuslineでVimのエラーが発生すると,エラーメッセージを表示した上でstatuslineがdisableされる

補足: statuslineがdisableされるのはstatuslineのredrawが起こるごとにエラーが出るとうっとおしいからdisableしているようです.

修正パッチ案

haya14busa/vim@0cd2c2f

ちょっと詳しくなくて付け焼き刃の調査をしながらの修正です.
なのでこれでいいのかよくわかりませんが,僕が意図した挙動になりました.

Vimのバージョン

7.4.1386

OSの種類

  • ArchLinux

どのOSでも再現するはず

その他

両者ともログ長いし読む必要はないですが,上記issueで問題が発覚し,silentlyにstatuslineがdisableされるせいで異常にデバッグが難しかったです.

問題や該当コードを見つけたのは @lambdalisue さんや watiko さんです.

cc @lambdalisue

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions