5

lvimgrepそのため、現在選択されているテキストで実行されるバインディングを作成しようとしています。

  fun! s:get_visual_selection()
       let l=getline("'<")
       let [line1,col1] = getpos("'<")[1:2]
       let [line2,col2] = getpos("'>")[1:2]
       return l[col1 - 1: col2 - 1]
 endfun

 vnoremap <expr> <script><leader>* ":lvimgrep /" .  <SID>get_visual_selection()  . "/j **/*." .  expand("%:e") . " \|lopen"

関数は質問のコメントからのものです: VimScript で視覚的に選択されたテキストを取得する方法

問題は、それが非常に奇妙な動作をしていることです。ほとんどの場合、関数によって返されるテキストは視覚的な選択と一致せず、多くの場合、現在の視覚的な選択ではなく、最後の視覚的な選択のテキストです。

vimscript で視覚的な選択テキストを取得することに関する多くの投稿を行ってきましたが、機能させることができません。

https://stackoverflow.com/a/1534347/287085も試しましたが成功しませんでした (選択をコピーして登録する) - バインディングから呼び出されるとエラーが発生します。

4

1 に答える 1

4

問題は、現在の選択が終了するまで(コマンドを実行するか、 を使用して)'<,'>マークが設定されないことです。ここでは、式のマッピングにより、ビジュアル モードを最初に終了する前に を追加することがより複雑になるため、式を挿入しやすく、式 registerを使用する方が簡単です。<Esc><Esc>:help i_CTRL-R=

:vnoremap <script> <leader>* <Esc>:lvimgrep /<C-R><C-R>=<SID>get_visual_selection()<CR>/j **/*.<C-R><C-R>=expand("%:e")<CR>\|lopen

デフォルトのレジスタを上書きしても構わない場合は、選択範囲をヤンクすることもできます。

:vnoremap <leader>* y:lvimgrep /<C-R><C-R>"/j **/*.<C-R><C-R>=expand("%:e")<CR>\|lopen
于 2013-07-24T15:53:46.607 に答える