osyo-manga / vital-over

18 stars 3 forks source link

<C-c> で overのキャンセルではなく Vim:Interrupt が呼ばれる #53

Closed haya14busa closed 10 years ago

haya14busa commented 10 years ago

ようになってるかと思われますが、結構前のコミットまで戻っても手元では 再現してしまい原因コミットがわかりませんでした.(最後まで戻ったわけではないので 単に怠慢もあります)

一応 vital-over使ってるプラグイン3つの確認と 単に make_default() したスクリプト作って 確認しましたが再現しました.

というかもしかしたら自分の環境のせいかとも疑ってるのですが、おしょーさんの環境 でも再現しますかね?

osyo-manga commented 10 years ago

最近なんか適当に変えた記憶があるので週末にでもみておきま…ウッ…

osyo-manga commented 10 years ago

あー手元の over.vim だと再現しませんでした…(普通にキャンセルされた。

haya14busa commented 10 years ago

あー手元の over.vim だと再現しませんでした…(普通にキャンセルされた。

ぐぬぬ...こちらではover.vim(最新)でも再現しますね...

なにか <C-c> 系の挙動が変わるオプションってありましたっけ?ご存知ですかね?

一応Vimのversion

VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Sep 25 2014 17:52:44)
Included patches: 1-460
Compiled by haya14busa@haya14busa-ThinkPad-X200s
Huge version with GTK2 GUI.  Features included (+) or not (-):
+acl             +conceal         +farsi           +libcall         +mouse_netterm   +profile         +syntax          +visualextra
+arabic          +cryptv          +file_in_path    +linebreak       +mouse_sgr       +python/dyn      +tag_binary      +viminfo
+autocmd         +cscope          +find_in_path    +lispindent      -mouse_sysmouse  +python3/dyn     +tag_old_static  +vreplace
+balloon_eval    +cursorbind      +float           +listcmds        +mouse_urxvt     +quickfix        -tag_any_white   +wildignore
+browse          +cursorshape     +folding         +localmap        +mouse_xterm     +reltime         -tcl             +wildmenu
++builtin_terms  +dialog_con_gui  -footer          +lua/dyn         +multi_byte      +rightleft       +terminfo        +windows
+byte_offset     +diff            +fork()          +menu            +multi_lang      +ruby            +termresponse    +writebackup
+cindent         +digraphs        +gettext         +mksession       -mzscheme        +scrollbind      +textobjects     +X11
+clientserver    +dnd             -hangul_input    +modify_fname    -netbeans_intg   +signs           +title           -xfontset
+clipboard       -ebcdic          +iconv           +mouse           +path_extra      +smartindent     +toolbar         +xim
+cmdline_compl   +emacs_tags      +insert_expand   +mouseshape      +perl            -sniff           +user_commands   +xsmp_interact
+cmdline_hist    +eval            +jumplist        +mouse_dec       +persistent_undo +startuptime     +vertsplit       +xterm_clipboard
+cmdline_info    +ex_extra        +keymap          +mouse_gpm       +postscript      +statusline      +virtualedit     -xterm_save
+comments        +extra_search    +langmap         -mouse_jsbterm   +printer         -sun_workshop    +visual          +xpm
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
 2nd user vimrc file: "~/.vim/vimrc"
      user exrc file: "$HOME/.exrc"
  system gvimrc file: "$VIM/gvimrc"
    user gvimrc file: "$HOME/.gvimrc"
2nd user gvimrc file: "~/.vim/gvimrc"
    system menu file: "$VIMRUNTIME/menu.vim"
  fall-back for $VIM: "/usr/local/share/vim"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK  -pthread -I/usr/include/gtk-2.0 -I/usr/lib/i386-linux-gnu/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/freetype2 -I/usr/include/glib-2.0 -I/usr/lib/i386-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/libpng12 -I/usr/include/harfbuzz     -g -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1      
Linking: gcc   -L. -L/home/haya14busa/.anyenv/envs/rbenv/versions/2.1.2/lib  -fstack-protector -rdynamic -Wl,-export-dynamic -Wl,-E   -L/usr/local/lib -Wl,--as-needed -o vim   -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfontconfig -lgobject-2.0 -lglib-2.0 -lfreetype   -lSM -lICE -lXpm -lXt -lX11 -lXdmcp -lSM -lICE  -lm -ltinfo    -lacl -lattr -lgpm -ldl   -Wl,-E  -fstack-protector -L/usr/local/lib  -L/usr/lib/perl/5.18/CORE -lperl -ldl -lm -lpthread -lcrypt    -Wl,-R -Wl,/home/haya14busa/.anyenv/envs/rbenv/versions/2.1.2/lib -L/home/haya14busa/.anyenv/envs/rbenv/versions/2.1.2/lib -lruby-static -lpthread -ldl -lcrypt -lm  -L/home/haya14busa/.anyenv/envs/rbenv/versions/2.1.2/lib   
osyo-manga commented 10 years ago

そもそも手元の vital-over(over.vim) を push してない可能性。 そこら辺も含めて週末みてみま・・・

osyo-manga commented 10 years ago

あと端末版か GUI 版かも教えてもらえると助かります。

haya14busa commented 10 years ago

あと端末版か GUI 版か

端末版で試してましたがGUIでも再現しました

haya14busa commented 10 years ago

試していたところ、もしかしたら <C-c>がマップされてるかどうかで結果が変わってるかもしれません

noremap <C-c> <C-c>

するだけで Vim:Interruptが起こらないようになりました(over.vim)

haya14busa commented 10 years ago

そもそも手元の vital-over(over.vim) を push してない可能性。 そこら辺も含めて週末みてみま・・・

期待力

osyo-manga commented 10 years ago

とりあえず、git に上がっているものは最新版でした>vital-over あと https://github.com/osyo-manga/vital-over/blob/master/example/simple.vim これで試してみましたが問題なく動作してるぽいです。

osyo-manga commented 10 years ago

試していたところ、もしかしたら がマップされてるかどうかで結果が変わってるかもしれません

手元だと に再マップしてなくても再現しませんね…。

haya14busa commented 10 years ago

普通にやると Interrupt, noremap <C-c> <C-c> すると問題なく動作しました

haya14busa commented 10 years ago

もしかして?: https://github.com/vim-jp/issues/issues/606

osyo-manga commented 10 years ago

うーん、どうなんでしょう。 ちなみに手元の Vim は 7.4.453 です。

osyo-manga commented 10 years ago

ちょっと Vim を更新して試してみます。

osyo-manga commented 10 years ago

7.4.471 にしてみましたが特に変わらず…。

osyo-manga commented 10 years ago

手元で $ vim -N -u NONE<C-c> してみましたがやはり再現しませんでした。 もうちょい詳しい再現手順(環境)がほしいですね。

haya14busa commented 10 years ago

結局良くわかっていませんが現状の自分のまとめです

source で読んだ場合

1. call_getchar.vim

call getchar()
  1. vim -N -u NONE -S call_getchar.vim
  2. Type <C-c>
  3. Interrupt
Error detected while processing /path/to/call_getchar.vim:
line    1:
Interrupted

2. remap_call_getchar.vim

noremap <C-c> <C-c>
call getchar()
  1. vim -N -u NONE -S call_getchar.vim
  2. Type <C-c>
  3. <C-c>をgetchar()で取得OK

こちらはVimのバージョンを下げるとInterruptが起こるようになりました (試したバージョンメモるの忘れましたが7.4初期の頃だとInterrupt)

なお両方とも開いてから :source % でも同じ結果

直接呼んだ場合

  1. vim -N -u NONE
  2. :call getchar()
  3. Type <C-c>
  4. 取得ok

vital-overで

simple.vim

exampleのsimple.vimを使用

  1. vim -N -u NONE --cmd "set rtp+=~/.vim/bundle/vital.vim,~/.vim/bundle/vital-over" simple.vim
  2. :so %
  3. Type <C-c>
  4. Interrupt

incsearch.vim

example の incsearch.vimを使用(こちらは呼び出しが関数になっている)

  1. vim -N -u NONE --cmd "set rtp+=~/.vim/bundle/vital.vim,~/.vim/bundle/vital-over" -S incsearch.vim
  2. :call Search()
  3. Type <C-c>
  4. Interruppt
haya14busa commented 10 years ago

手元で $ vim -N -u NONE → してみましたがやはり再現しました。

やはりというのは再現しなかったの間違いですかね? (ここでいう再現は Vim:Interrupt が再現するという意味での)

osyo-manga commented 10 years ago

やはりというのは再現しなかったの間違いですかね? (ここでいう再現は Vim:Interrupt が再現するという意味での)

あ、はいそうです(Vim:Interrupt は発生しなかった。

osyo-manga commented 10 years ago

とりあえず、少し試してみました。

source で読んだ場合

  1. call_getchar.vim

再現した。

  1. remap_call_getchar.vim

再現しなかった。

直接呼んだ場合

再現しなかった

環境

supermomonga commented 10 years ago

vital-overで

simple.vim

exampleのsimple.vimを使用

vim -N -u NONE --cmd "set rtp+=~/.vim/bundle/vital.vim,~/.vim/bundle/vital-over" simple.vim :so % Type Interrupt

おしょーさんに依頼されて私の環境でも試してみたところ、 こちらの手順で再現しました。

screenshot on 2014-10-12 at 13-43-13

環境は以下の通りです。

VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Aug 5 2014 12:00:18) MacOS X (unix) 版 適用済パッチ: 1-383

OS X 10.9.5

haya14busa commented 10 years ago

ありがとうございます...!

多分-S:source での読み込み中にInterruptが起こるのは問題ではなく, 問題は手動で呼んだ時, 僕の環境だと example/incsearch.vim の例で :call Search() で呼んでるにも関わらず Interruptが起こってしまうことだと思っています. (mapして呼んでも同様)

が、

  1. こちらの例では おしょーさん, ももんがさんの環境でInterruptが起こらなかった
  2. 普通に関数でgetchar()をラップして呼んでも自分の環境でもInterruptが起こらず最小構成がわからない

ので困りました...やっぱりなにか自分の環境が悪いのかも知れません...

一応自分の環境と 単に関数でラップしてみた例です。

環境

func_getchar.vim

function! Getchar()
    return getchar()
endfunction
  1. vim -N -u NONE -S func_getchar.vim
  2. :call Getchar()
  3. Type <C-c>
  4. Interrupt起こらない
supermomonga commented 10 years ago

こちらの例では おしょーさん, ももんがさんの環境でInterruptが起こらなかった

あ、いえ、「こちらの手順で再現しました。」というのは、Interruptが発生することが再現したという意味です。ややこしくてすみません。

あまり状況が把握できていないのですが、 上記私のコメントにあるvital-overのsimple.vimの手順以外でも再現するかどうか試したほうが良ければ、言って頂ければ試します。

haya14busa commented 10 years ago

あ、すいません では example/incsearch.vim の例でやってみていただけませんか? simple.vimは :source してるんですが、 incsearch.vimの例では直接 :call Search()しているという違いがあります

haya14busa commented 10 years ago

こちらです(すぐ試せるようにパスを絶対パスにupdate)

  1. vim -N -u NONE --cmd "set rtp+=~/.vim/bundle/vital.vim,~/.vim/bundle/vital-over" -S ~/.vim/bundle/vital-over/example/incsearch.vim
  2. :call Search()
  3. Type <C-c>
  4. Interruppt
supermomonga commented 10 years ago

すぐ試せるようにパスを絶対パスにupdate

ありがとうございます。

試したところ、再現(Interruppt発生)しました。

haya14busa commented 10 years ago

...!!! ありがとうございます! 自分だけじゃなかった力で少し安心(?)...

ということはvital-overのコード見ながら単にgetchar()を関数でラップする以外になにか条件があるはずなのでそのへん探して最小構成作れるようもうちょっと調査してみます.

haya14busa commented 10 years ago

多分最小構成を見つけました

interrupt_getchar.vim

function! TryGetchar()
    try
        return getchar()
    catch
        echo v:exception
        return ''
    endtry
endfunction

function! Getchar()
    return getchar()
endfunction

再現手順

  1. vim -N -u NONE -S interrupt_getchar.vim
  2. :call TryGetchar()
  3. Type <C-c>
  4. -> Vim:Interrupt

tryしないとInterrupt起こらない

  1. vim -N -u NONE -S interrupt_getchar.vim
  2. :call Getchar()
  3. Type <C-c>
  4. Interruptが起こらない

普通にやると<C-c>はそのままとれるのに, tryすると Interruptに解釈されてしまってるような感じがします。

haya14busa commented 10 years ago

もう少し試したところ, そもそも getchar()<C-c> が取れてなくて, try-catchすることでそれが表面化しただけかもしれません。

  1. vim -N -u NONE
  2. :let b = (getchar() == 3)
  3. Type <C-c>
  4. :echo b
  5. E121: Undefined variable: b E15: Invalid expression: b

つまり, <C-c>によって 2がエラー表示なしでキャンセルされてしまっているっぽいです.(そのせいで単にcallしたときは例外起こらないので最小構成じゃないと思い込んでた)

ちなみに期待した動作は b が 1 (true) になる (:echo nr2char(3) ==# "\<C-c>")

haya14busa commented 10 years ago

もしもvital-overで対応していただけるとしたらこんな感じでしょうか

function! s:getchar(...)
    while 1
        try
            let char = call("getchar", a:000)
        catch /^Vim:Interrupt$/
            let char = 3 " :echo nr2char(3) ==# "\<C-c>"
        endtry
        " Workaround for the <expr> mappings
        if char !=# "\x80\xfd`"
            return type(char) == type(0) ? nr2char(char) : char
        endif
    endwhile
endfunction

return nr2char(3) でもいいかな?

おしょーさんの環境では再現しないようだし、尚早かもしれませんが... (getchar() 周りに workaround 必要な挙動多くてつらい...)

osyo-manga commented 10 years ago

情報あざす。 いまちょい時間がない感じなのであとでまた検証してみまする(多分水曜日ぐらい

haya14busa commented 10 years ago

了解です

osyo-manga commented 10 years ago

あーこっちでも再現しました。 とりあえず、vital-over でははやぶささんのやつで対応してみます。

osyo-manga commented 10 years ago

あ、間違えて branch/async_update の方に commit してもーた…。あとでなんとかしておきます。。。

osyo-manga commented 10 years ago

(まだ push はしてない。 今日のよるあたりにアレしておきます。

haya14busa commented 10 years ago

おー再現しましたか。 別ブランチにcommitミスは git cherry-pick とかかな? どちらにせよ AsyncUpdate も getchar(1) 部分の修正いる感じっぽいです

osyo-manga commented 10 years ago

どちらにせよ AsyncUpdate も getchar(1) 部分の修正いる感じっぽいです

あー確かにそうですね。 もうめんどいのでとっとと master に merge してもいいよね…

haya14busa commented 10 years ago

もうめんどいのでとっとと master に merge してもいいよね…

okだと思います(すいません力)

osyo-manga commented 10 years ago

どちらにせよ AsyncUpdate も getchar(1) 部分の修正いる感じっぽいです

これって、必要なんですかね。入力の判定だけするし、いらないような気もする(意:修正してみたら AsyncUpdate がうまく動作しなくなった。

haya14busa commented 10 years ago

意:修正してみたら AsyncUpdate がうまく動作しなくなった。

あ、ホントですか... 確かメインのgetchar()修正後もInterruptが起こってしまったので AsyncUpdateの方のgetchar()を一旦コメントアウトして動作を確認したんですが、そう言えば try-catchしてAsyncUpdateの動作確認はしてませんでした, スイマセン...

ただInterruptは呼ばれる気がします

osyo-manga commented 10 years ago

あ、ホントですか... 確かメインのgetchar()修正後もInterruptが起こってしまったので

んー了解です。もうちょい試してみます。

haya14busa commented 10 years ago

確かに動きませんでした...単純にtry-catchすると<C-c>のキー入力も消費されてしまう...

ということでこう変更したら動いたんですがfeedkeys()ハックつらみがあるかもしれない...?

function! s:module.on_enter(cmdline)
    function! a:cmdline._update()
        call self.callevent("on_update")
        try
            if !getchar(1)
                return
            endif
        catch /^Vim:Interrupt$/
            call feedkeys("\<C-c>")
        endtry

        call self._input(s:V.import("Over.Commandline.Base").getchar(0))
        call self.draw()
    endfunction
endfunction
osyo-manga commented 10 years ago

call feedkeys("\<C-c>") じゃなくて call self._input("\<C-c>") でよさげ感。

haya14busa commented 10 years ago

なるほど..! ではこんな感じでよさそうかな?

function! s:module.on_enter(cmdline)
    function! a:cmdline._update()
        call self.callevent("on_update")
        try
            if !getchar(1)
                return
            endif
            call self._input(s:V.import("Over.Commandline.Base").getchar(0))
        catch /^Vim:Interrupt$/
            call self._input("\<C-c>")
        endtry
        call self.draw()
    endfunction
endfunction
haya14busa commented 10 years ago

(多分ここの変更とは関係ないと思いますが, vital-over起動 -> <C-c> を何回何回もやってるとまれに下記のエラー吐いて使えなくなる...)

謎力. \<C-c>がタイミングよく全然別の場所で発動して死みたいな感じかもしれません。

function incsearch#forward..<SNR>281_search..<SNR>281_get_input..630..628..635..614..661..<SNR>291_sort_by, line 1 Vim(let):E730: using List a
s a String
Error detected while processing function incsearch#forward..<SNR>281_search..<SNR>281_get_input..630..628..635..614..661..<SNR>291_sort_by:
line    1:
E730: using List as a String
E116: Invalid arguments for function has_key(v:val.slot.module, 'priority') ? v:val.slot.module.priority('on_leave') : 0]
Error detected while processing function incsearch#forward..<SNR>281_search..<SNR>281_get_input:
line   17:
E171: Missing :endif
osyo-manga commented 10 years ago

getchar(1) ですが branch/async_update で対応してみました。 これで問題なさそうであれば #41 ごと merge しまする。

haya14busa commented 10 years ago

これ https://github.com/osyo-manga/vital-over/commit/79ec77d2628f8c40769bb2f416f6f9b41703ee37#commitcomment-8183576 以外は特に問題なさそうデス

haya14busa commented 10 years ago

よさげデス...! :+1:

osyo-manga commented 10 years ago

41 で一緒に組み込みました。

haya14busa commented 10 years ago

ありがとうございます確認できました :+1: