timer_startの関数の中でinputを使ったときにクリップボードから貼り付けることができない #1025

Closed
itchyny opened this Issue Feb 8, 2017 · 8 comments

Comments

Projects
None yet
3 participants
@itchyny

itchyny commented Feb 8, 2017

質問・報告の内容

test.vim

function! Foo(...)
  let g:test = input('> ')
endfunction
call timer_start(1000, 'Foo')

クリップボードに何かコピーしておく (例えば foo bar とする)

vim -u NONE -i NONE -N -S test.vim

入力待ち > に対してOSのクリップボードから cmd-v とか CTRL_R-* などで貼り付けようとしても受けつけられない。

Vimのバージョン

8.0.314

( :version で確認できます)

OSの種類/ディストリ/バージョン

  • macOS Sierra

使用している or 関係していそうなプラグイン

なし

その他

UbuntuのVim (8.0.0003) で確かめると一文字だけ入りました (クリップボードに foo bar が入っているのに最初の f しか入らない)。

@ichizok

This comment has been minimized.

Show comment
Hide comment
@ichizok

ichizok Feb 8, 2017

Member

同じく macOS Sierra の Terminal.app, iTerm2, tmux で確認しましたが、私の環境では (foo bar を) Cmd-V すると、

  • 最初の f だけ貼れる
  • f br のように飛び飛び
  • foobar<b0> のような余計なバイト (bracketed paste mode の終了コード?) が混ざる

などの結果になりました。

また、Cmd-V での貼り付け前後で CSI 200~, CSI 201~ が挿入される端末上で test.vim を実行すると、Cmd-V で貼り付けした後に CR, Esc, Ctrl-C 等入力しても input 待ち状態から戻れなくなりました。
Vim 8.0.0209 以前ではこの現象は発生しません。(貼り付けが正しくできないのは同様)

Member

ichizok commented Feb 8, 2017

同じく macOS Sierra の Terminal.app, iTerm2, tmux で確認しましたが、私の環境では (foo bar を) Cmd-V すると、

  • 最初の f だけ貼れる
  • f br のように飛び飛び
  • foobar<b0> のような余計なバイト (bracketed paste mode の終了コード?) が混ざる

などの結果になりました。

また、Cmd-V での貼り付け前後で CSI 200~, CSI 201~ が挿入される端末上で test.vim を実行すると、Cmd-V で貼り付けした後に CR, Esc, Ctrl-C 等入力しても input 待ち状態から戻れなくなりました。
Vim 8.0.0209 以前ではこの現象は発生しません。(貼り付けが正しくできないのは同様)

@ichizok

This comment has been minimized.

Show comment
Hide comment
@ichizok

ichizok Feb 8, 2017

Member

Cmd-V で貼り付けした後に CR, Esc, Ctrl-C 等入力しても input 待ち状態から戻れなくなりました。

bracketed paste mode が終了してない (CSI 201~ が処理できてない) のが原因?
だとすると問題としては同根か。

Member

ichizok commented Feb 8, 2017

Cmd-V で貼り付けした後に CR, Esc, Ctrl-C 等入力しても input 待ち状態から戻れなくなりました。

bracketed paste mode が終了してない (CSI 201~ が処理できてない) のが原因?
だとすると問題としては同根か。

@h-east h-east added the kind/bug label Feb 9, 2017

@ichizok

This comment has been minimized.

Show comment
Hide comment
@ichizok

ichizok Apr 14, 2017

Member

vgetc() 下で呼び出された timer callback で input() を呼んだとき、vgetc_busy > 0 になっているので

https://github.com/vim/vim/tree/9f92886277/src/getchar.c#L1982-L1983

vgetorpeek() のここで NUL が返るため、typebuf (read したデータを溜めておくバッファ) から取れなくなるのが原因。

https://github.com/vim/vim/compare/master...ichizok:fix/timer-input.diff

当件については修正されるが、AppVeyor が通らない。
cmdline window と timer+feedkeys() の組み合わせで停止している様子。

timer callback での feedkeys() が働かない。要修正。

Member

ichizok commented Apr 14, 2017

vgetc() 下で呼び出された timer callback で input() を呼んだとき、vgetc_busy > 0 になっているので

https://github.com/vim/vim/tree/9f92886277/src/getchar.c#L1982-L1983

vgetorpeek() のここで NUL が返るため、typebuf (read したデータを溜めておくバッファ) から取れなくなるのが原因。

https://github.com/vim/vim/compare/master...ichizok:fix/timer-input.diff

当件については修正されるが、AppVeyor が通らない。
cmdline window と timer+feedkeys() の組み合わせで停止している様子。

timer callback での feedkeys() が働かない。要修正。

@ichizok

This comment has been minimized.

Show comment
Hide comment
Member

ichizok commented May 12, 2017

関連?
vim/vim#1129

@ichizok

This comment has been minimized.

Show comment
Hide comment
@ichizok

ichizok May 16, 2017

Member

https://github.com/vim/vim/compare/master...ichizok:fix/timer-input.diff
timer_busy を定義。vgetc() の中で timer が発火するとき TRUE になる。
f_feedkeys() 内で timer_busy を確認することで、timer callback の feedkeys() でキー入力を与えられるようにした。

fu! TimerCb(timer)
  call feedkeys("hoge\<CR>", 'nt')
endfu
fu! Test(timer)
  call timer_start(100, 'TimerCb')
  let g:val = input('> ')
  "echomsg printf('[%s]', g:val)
endfu
call timer_start(100, 'Test')

これが動くようになる。

Member

ichizok commented May 16, 2017

https://github.com/vim/vim/compare/master...ichizok:fix/timer-input.diff
timer_busy を定義。vgetc() の中で timer が発火するとき TRUE になる。
f_feedkeys() 内で timer_busy を確認することで、timer callback の feedkeys() でキー入力を与えられるようにした。

fu! TimerCb(timer)
  call feedkeys("hoge\<CR>", 'nt')
endfu
fu! Test(timer)
  call timer_start(100, 'TimerCb')
  let g:val = input('> ')
  "echomsg printf('[%s]', g:val)
endfu
call timer_start(100, 'Test')

これが動くようになる。

@ichizok

This comment has been minimized.

Show comment
Hide comment
@ichizok

ichizok Jun 23, 2017

Member

投げました。
vim/vim#1790

Member

ichizok commented Jun 23, 2017

投げました。
vim/vim#1790

@ichizok

This comment has been minimized.

Show comment
Hide comment
Member

ichizok commented Jun 25, 2017

8.0.0670
vim/vim@1e8e145

@ichizok ichizok closed this Jun 25, 2017

@ichizok ichizok added the xlose/fixed label Jun 25, 2017

@itchyny

This comment has been minimized.

Show comment
Hide comment
@itchyny

itchyny Jun 25, 2017

ありがとうございました。

itchyny commented Jun 25, 2017

ありがとうございました。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment