質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Vim

VimとはUnix / Linux 系のOSに標準搭載されているターミナル上で動くテキストエディタです。

Q&A

解決済

1回答

2701閲覧

vimscriptで選択範囲を解除したい

takets

総合スコア43

Vim

VimとはUnix / Linux 系のOSに標準搭載されているターミナル上で動くテキストエディタです。

0グッド

0クリップ

投稿2017/05/23 19:28

###前提・実現したいこと
下記スクリプトを実行して、foldingのレベルを変更し、ビジュアルモード選択を解除したい。

function! s:Test() call feedkeys("zcviz") execute "normal! :'<,'>ChalkUp\<CR>" execute "normal! :'<,'>s/^#/##\<CR>" endfunction

処理としてはfoldingをtext-objで選択し、
選択範囲に対してvim-chalkプラグインの機能を使って以下のようにfoldingのレベルを変更することが目的となります。

段落1 {{{1 文章文章文章文章文章文章文章 }}}1 ↓ 段落1 {{{2 文章文章文章文章文章文章文章 }}}2

###発生している問題・エラーメッセージ
処理自体は意図通りに動作しますが、feedkeys("zcviz")で行ったビジュアル選択が残ったままとなります。

###試したこと

  • call feedkeys("<Esc><Esc>") などキーを送りこんで選択を解除しようとした。

executeでも試した。

  • 処理をキャンセルするvimscriptを探したが、見つからず。

###補足情報(言語/Fw/ツール等のバージョンなど)

  • kaoriya-Macvimの最新バージョン
  • 使用プラグインkana/vim-textobj-fold, dbmrq/vim-chalk

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

feedkeys() 関数は指定のキーシークエンスを処理キューに入れるだけなので、すぐには実行されません。この場合は関数を終了してユーザーに操作をもどす直前まで遅延します。この場合は normal コマンドを使いましょう。閉じた折り畳みにカーソルをのせてビジュアルモードを開始すると、折りたたみ全体を選択するので normal! zcv で十分です。

三行目の置換コマンドが失敗しない限りビジュアルモードを抜けて終了すると思います。置換コマンドの対象行が存在しないかもしれない場合は silent! コマンドを使い、エラーを無視するとよいです。

vim

1function! s:test() abort 2 normal! zcv 3 '<,'>ChalkUp 4 silent! '<,'>s/^#/## 5 execute "normal! \<Esc>" 6endfunction

投稿2017/05/24 11:22

machakann

総合スコア112

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takets

2017/05/24 16:23 編集

ご回答ありがとうございます。 動作自体は意図通りに動作しましたが、関数を連続実行したとき、意図しない場所に関数の内容が反映されます。 ``` ## 段落A {{{2 文章文章文章 }}}2 # 段落B {{{1  ←関数を実行して、段落Aと同じく 文章文章文章   foldingのレベルを増やしたい }}}1    ↓ ### 段落A {{{3 ←こちらに関数が実行されてしまう 文章文章文章 }}}3 # 段落B {{{1 文章文章文章 }}}1 ``` 置換も成功しており、見かけ上の選択は解除されておりますが、実際には前に選択したfoldingに実行されているようです。
machakann

2017/05/25 11:23 編集

スクリプトの中でビジュアルモードに入った場合、ビジュアルモードを抜けるまで '< および '> マークの更新はされないのを忘れていました。 古い折り畳みが更新されずに残って変な感じになるみたいなので、マークを開いて更新するようにしました。開いたままでよければ、最後の normal! zc は必要ありません。 function! Test2() abort normal! zcv execute "normal! \<Esc>zo" '<,'>ChalkUp silent! '<,'>s/^#/## normal! zc endfunction
takets

2017/06/07 23:54

確認が遅くなり申し訳ありません。 実現できました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問