noautocmd で CursorMoved を一時的に無効にできない #964

Closed
rickhowe opened this Issue Oct 7, 2016 · 3 comments

Projects

None yet

2 participants

@rickhowe
rickhowe commented Oct 7, 2016

CursorMoved イベントを autocmd (matchparen.vim など) している状態で、たとえば

:call cursor(1, 1)

でカーソルを動かすと、CursorMoved が発生したことが確認できます (set vbs=9)。

このイベントを一時的に無効にしたいのですが、

:noautocmd call cursor(1, 1)

としても発生します。これは不具合でしょうか?

なお、

:set eventignore=CursorMoved | call cursor(1, 1)

で eventignore を元に戻さないままですと発生しませんが、これではいつまでもイベントが発生しなくなります。

gvim 7.3, 7.4, 8.0 で再現します。

@mattn
Member
mattn commented Oct 7, 2016

CursorMoved の検知はコマンドが実行し終わった後で行われます。なので :noautocmd ... が終わり、その後での検知になるのでその時点では noautocmd ではないのです。

                            *CursorMoved*
CursorMoved         After the cursor was moved in Normal or Visual
                mode.  Also when the text of the cursor line
                has been changed, e.g., with "x", "rx" or "p".
                Not triggered when there is typeahead or when
                an operator is pending.
                For an example see |match-parens|.
                Careful: This is triggered very often, don't
                do anything that the user does not expect or
                that is slow.

help でも言うようにあまり当にはしないほうがいいと思います。ですので

letl old_eventignore=&eventignore
try
  set eventignore=CursorHold
  call cursor(1, 1)
finally
  let &eventignore=old_eventignore
endtry

の様にしてあげるのが一番確実かと思います。

@mattn
Member
mattn commented Oct 7, 2016

んー。ダメっぽいですね。一回アイドル状態にならないと検知が行われない様です。

@rickhowe
rickhowe commented Oct 9, 2016

そうみたいですね。

:call cursor(1, 1) | set eventignore=CursorMoved

のように、動かした後に eventignore すると発生しなくなりますので、
cursor() はイベントの直接の発生要因ではなさそうです。
現状では一時的に無効にする方法はないということでクローズします。

@rickhowe rickhowe closed this Oct 9, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment