質問: ### 前提・実現したいこと 下記スクリプトを実行して、foldingのレベルを変更し、ビジュアルモード選択を解除したい。 ``` function! s:Test() call feedkeys("zcviz") execute "normal! :'<,'>ChalkUp\" execute "normal! :'<,'>s/^#/##\" endfunction ``` 処理としてはfoldingをtext-objで選択し、 選択範囲に対してvim-chalkプラグインの機能を使って以下のようにfoldingのレベルを変更することが目的となります。 ``` 段落1 {{{1 文章文章文章文章文章文章文章 }}}1 ↓ 段落1 {{{2 文章文章文章文章文章文章文章 }}}2 ``` ### 発生している問題・エラーメッセージ 処理自体は意図通りに動作しますが、feedkeys("zcviz")で行ったビジュアル選択が残ったままとなります。 ### 試したこと * call feedkeys("\\") などキーを送りこんで選択を解除しようとした。 executeでも試した。 * 処理をキャンセルするvimscriptを探したが、見つからず。 ### 補足情報(言語/Fw/ツール等のバージョンなど) * kaoriya-Macvimの最新バージョン * 使用プラグインkana/vim-textobj-fold, dbmrq/vim-chalk
回答: `feedkeys()` 関数は指定のキーシークエンスを処理キューに入れるだけなので、すぐには実行されません。この場合は関数を終了してユーザーに操作をもどす直前まで遅延します。この場合は `normal` コマンドを使いましょう。閉じた折り畳みにカーソルをのせてビジュアルモードを開始すると、折りたたみ全体を選択するので `normal! zcv` で十分です。 三行目の置換コマンドが失敗しない限りビジュアルモードを抜けて終了すると思います。置換コマンドの対象行が存在しないかもしれない場合は `silent!` コマンドを使い、エラーを無視するとよいです。 ``` function! s:test() abort normal! zcv '<,'>ChalkUp silent! '<,'>s/^#/## execute "normal! \" endfunction ```