Closed haya14busa closed 10 years ago
最近なんか適当に変えた記憶があるので週末にでもみておきま…ウッ…
あー手元の over.vim だと再現しませんでした…(普通にキャンセルされた。
あー手元の 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
そもそも手元の vital-over(over.vim) を push してない可能性。 そこら辺も含めて週末みてみま・・・
あと端末版か GUI 版かも教えてもらえると助かります。
あと端末版か GUI 版か
端末版で試してましたがGUIでも再現しました
試していたところ、もしかしたら <C-c>
がマップされてるかどうかで結果が変わってるかもしれません
noremap <C-c> <C-c>
するだけで Vim:Interrupt
が起こらないようになりました(over.vim)
そもそも手元の vital-over(over.vim) を push してない可能性。 そこら辺も含めて週末みてみま・・・
期待力
とりあえず、git に上がっているものは最新版でした>vital-over あと https://github.com/osyo-manga/vital-over/blob/master/example/simple.vim これで試してみましたが問題なく動作してるぽいです。
試していたところ、もしかしたら
がマップされてるかどうかで結果が変わってるかもしれません
手元だと
普通にやると Interrupt, noremap <C-c> <C-c>
すると問題なく動作しました
うーん、どうなんでしょう。
ちなみに手元の Vim は 7.4.453
です。
ちょっと Vim を更新して試してみます。
7.4.471
にしてみましたが特に変わらず…。
手元で $ vim -N -u NONE
→ <C-c>
してみましたがやはり再現しませんでした。
もうちょい詳しい再現手順(環境)がほしいですね。
結局良くわかっていませんが現状の自分のまとめです
call getchar()
vim -N -u NONE -S call_getchar.vim
<C-c>
Error detected while processing /path/to/call_getchar.vim:
line 1:
Interrupted
noremap <C-c> <C-c>
call getchar()
vim -N -u NONE -S call_getchar.vim
<C-c>
<C-c>
をgetchar()で取得OKこちらはVimのバージョンを下げるとInterruptが起こるようになりました (試したバージョンメモるの忘れましたが7.4初期の頃だとInterrupt)
なお両方とも開いてから :source %
でも同じ結果
vim -N -u NONE
:call getchar()
<C-c>
exampleのsimple.vimを使用
vim -N -u NONE --cmd "set rtp+=~/.vim/bundle/vital.vim,~/.vim/bundle/vital-over" simple.vim
:so %
<C-c>
example の incsearch.vimを使用(こちらは呼び出しが関数になっている)
vim -N -u NONE --cmd "set rtp+=~/.vim/bundle/vital.vim,~/.vim/bundle/vital-over" -S incsearch.vim
:call Search()
<C-c>
手元で $ vim -N -u NONE →
してみましたがやはり再現しました。
やはりというのは再現しなかったの間違いですかね? (ここでいう再現は Vim:Interrupt が再現するという意味での)
やはりというのは再現しなかったの間違いですかね? (ここでいう再現は Vim:Interrupt が再現するという意味での)
あ、はいそうです(Vim:Interrupt は発生しなかった。
とりあえず、少し試してみました。
source で読んだ場合
- call_getchar.vim
再現した。
- remap_call_getchar.vim
再現しなかった。
直接呼んだ場合
再現しなかった
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
おしょーさんに依頼されて私の環境でも試してみたところ、 こちらの手順で再現しました。
環境は以下の通りです。
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
ありがとうございます...!
多分-S
や :source
での読み込み中にInterruptが起こるのは問題ではなく,
問題は手動で呼んだ時, 僕の環境だと example/incsearch.vim の例で :call Search()
で呼んでるにも関わらず Interruptが起こってしまうことだと思っています. (mapして呼んでも同様)
が、
getchar()
をラップして呼んでも自分の環境でもInterruptが起こらず最小構成がわからないので困りました...やっぱりなにか自分の環境が悪いのかも知れません...
一応自分の環境と 単に関数でラップしてみた例です。
function! Getchar()
return getchar()
endfunction
vim -N -u NONE -S func_getchar.vim
:call Getchar()
<C-c>
こちらの例では おしょーさん, ももんがさんの環境でInterruptが起こらなかった
あ、いえ、「こちらの手順で再現しました。」というのは、Interruptが発生することが再現したという意味です。ややこしくてすみません。
あまり状況が把握できていないのですが、 上記私のコメントにあるvital-overのsimple.vimの手順以外でも再現するかどうか試したほうが良ければ、言って頂ければ試します。
あ、すいません では example/incsearch.vim の例でやってみていただけませんか? simple.vimは :source
してるんですが、 incsearch.vim
の例では直接 :call Search()
しているという違いがあります
こちらです(すぐ試せるようにパスを絶対パスにupdate)
vim -N -u NONE --cmd "set rtp+=~/.vim/bundle/vital.vim,~/.vim/bundle/vital-over" -S ~/.vim/bundle/vital-over/example/incsearch.vim
:call Search()
<C-c>
すぐ試せるようにパスを絶対パスにupdate
ありがとうございます。
試したところ、再現(Interruppt発生)しました。
...!!! ありがとうございます! 自分だけじゃなかった力で少し安心(?)...
ということはvital-overのコード見ながら単にgetchar()を関数でラップする以外になにか条件があるはずなのでそのへん探して最小構成作れるようもうちょっと調査してみます.
多分最小構成を見つけました
function! TryGetchar()
try
return getchar()
catch
echo v:exception
return ''
endtry
endfunction
function! Getchar()
return getchar()
endfunction
vim -N -u NONE -S interrupt_getchar.vim
:call TryGetchar()
<C-c>
Vim:Interrupt
vim -N -u NONE -S interrupt_getchar.vim
:call Getchar()
<C-c>
普通にやると<C-c>
はそのままとれるのに, try
すると Interrupt
に解釈されてしまってるような感じがします。
もう少し試したところ, そもそも getchar()
で <C-c>
が取れてなくて, try-catch
することでそれが表面化しただけかもしれません。
vim -N -u NONE
:let b = (getchar() == 3)
<C-c>
:echo b
つまり, <C-c>
によって 2がエラー表示なしでキャンセルされてしまっているっぽいです.(そのせいで単にcallしたときは例外起こらないので最小構成じゃないと思い込んでた)
ちなみに期待した動作は b が 1 (true) になる (:echo nr2char(3) ==# "\<C-c>"
)
もしも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 必要な挙動多くてつらい...)
情報あざす。 いまちょい時間がない感じなのであとでまた検証してみまする(多分水曜日ぐらい
了解です
あーこっちでも再現しました。 とりあえず、vital-over でははやぶささんのやつで対応してみます。
あ、間違えて branch/async_update の方に commit してもーた…。あとでなんとかしておきます。。。
(まだ push はしてない。 今日のよるあたりにアレしておきます。
おー再現しましたか。
別ブランチにcommitミスは git cherry-pick とかかな?
どちらにせよ AsyncUpdate も getchar(1)
部分の修正いる感じっぽいです
どちらにせよ AsyncUpdate も getchar(1) 部分の修正いる感じっぽいです
あー確かにそうですね。 もうめんどいのでとっとと master に merge してもいいよね…
もうめんどいのでとっとと master に merge してもいいよね…
okだと思います(すいません力)
どちらにせよ AsyncUpdate も getchar(1) 部分の修正いる感じっぽいです
これって、必要なんですかね。入力の判定だけするし、いらないような気もする(意:修正してみたら AsyncUpdate がうまく動作しなくなった。
意:修正してみたら AsyncUpdate がうまく動作しなくなった。
あ、ホントですか... 確かメインのgetchar()修正後もInterruptが起こってしまったので AsyncUpdateの方のgetchar()を一旦コメントアウトして動作を確認したんですが、そう言えば try-catchしてAsyncUpdateの動作確認はしてませんでした, スイマセン...
ただInterruptは呼ばれる気がします
あ、ホントですか... 確かメインのgetchar()修正後もInterruptが起こってしまったので
んー了解です。もうちょい試してみます。
確かに動きませんでした...単純に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
call feedkeys("\<C-c>")
じゃなくて call self._input("\<C-c>")
でよさげ感。
なるほど..! ではこんな感じでよさそうかな?
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
(多分ここの変更とは関係ないと思いますが, 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
getchar(1)
ですが branch/async_update で対応してみました。
これで問題なさそうであれば #41 ごと merge しまする。
よさげデス...! :+1:
ありがとうございます確認できました :+1:
ようになってるかと思われますが、結構前のコミットまで戻っても手元では 再現してしまい原因コミットがわかりませんでした.(最後まで戻ったわけではないので 単に怠慢もあります)
一応 vital-over使ってるプラグイン3つの確認と 単に
make_default()
したスクリプト作って 確認しましたが再現しました.というかもしかしたら自分の環境のせいかとも疑ってるのですが、おしょーさんの環境 でも再現しますかね?