vimscriptで選択範囲を解除したい
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 1,496
前提・実現したいこと
下記スクリプトを実行して、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
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
feedkeys()
関数は指定のキーシークエンスを処理キューに入れるだけなので、すぐには実行されません。この場合は関数を終了してユーザーに操作をもどす直前まで遅延します。この場合は normal
コマンドを使いましょう。閉じた折り畳みにカーソルをのせてビジュアルモードを開始すると、折りたたみ全体を選択するので normal! zcv
で十分です。
三行目の置換コマンドが失敗しない限りビジュアルモードを抜けて終了すると思います。置換コマンドの対象行が存在しないかもしれない場合は silent!
コマンドを使い、エラーを無視するとよいです。
function! s:test() abort
normal! zcv
'<,'>ChalkUp
silent! '<,'>s/^#/##
execute "normal! \<Esc>"
endfunction
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.34%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/05/25 01:23 編集
動作自体は意図通りに動作しましたが、関数を連続実行したとき、意図しない場所に関数の内容が反映されます。
```
## 段落A {{{2
文章文章文章
}}}2
# 段落B {{{1 ←関数を実行して、段落Aと同じく
文章文章文章 foldingのレベルを増やしたい
}}}1
↓
### 段落A {{{3 ←こちらに関数が実行されてしまう
文章文章文章
}}}3
# 段落B {{{1
文章文章文章
}}}1
```
置換も成功しており、見かけ上の選択は解除されておりますが、実際には前に選択したfoldingに実行されているようです。
2017/05/25 20:23 編集
古い折り畳みが更新されずに残って変な感じになるみたいなので、マークを開いて更新するようにしました。開いたままでよければ、最後の normal! zc は必要ありません。
function! Test2() abort
normal! zcv
execute "normal! \<Esc>zo"
'<,'>ChalkUp
silent! '<,'>s/^#/##
normal! zc
endfunction
2017/06/08 08:54
実現できました。ありがとうございます!