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

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

ただいまの
回答率

88.91%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,394

takets

score 39

前提・実現したいこと

下記スクリプトを実行して、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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 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

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

    キャンセル

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

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る