web-dev-qa-db-ja.com

Vim-検索レジスターにヤンク

Vimの「最後の検索」レジスタ(「/」)に「ヤンク」する簡単な方法はありますか?

Vimのドキュメントから、答えは「いいえ」のようですが、「let」コマンドを使用して割り当てることができます。

It is writable with ":let", you can change it to have 'hlsearch' highlight
other matches without actually searching.  You can't yank or delete into this
register.

理想的には、私がしたいことは次のようなものです:

"/5yw

カーソルの下の次の5ワードをヤンクして、最後の検索バッファーに入れます。

あるいは、名前付きレジスターの内容を検索する方法がある場合、それも機能します。言い換えれば、私ができるなら:

"A5yw

次に、レジスタAの内容を検索します。これも機能します。

私が来ることができる最も近いのは、名前付きレジスタにヤンクして、そのレジスタを最後の検索レジスタにコピーすることです。

"A5yw
:let @/=@A

長い質問が長くなるリスクがありますが、「ヤンクして検索」したいのは常に5語ではないことを述べたいと思います。17文字の場合もあれば、行末までの場合もあります。そのため、ハードコーディングされたマクロでは、必要な柔軟性が得られません。

74
Dan

/を押して検索文字列を入力したら、Ctrl-Rを使用して、使用するレジスタを表す文字を入力できます。

例えば。

  • まず、"AywでWordをレジスタAにヤンクします。
  • 次に、/ ^R Aを使用して、レジスターAの内容を検索ストリングに入れます。
97
a'r

ヤンクテキストを格納するためにレジスターを使用しなかった場合、vimは0レジスターを使用します。 Ctrl-R 0の後に/と入力すると検索できます。

より複雑な例。別のバッファで、現在カーソルの下にある引用符内のテキストを検索するとします。

  • yi"(ヤンクインナークォート)でそれを行うことができます
  • 検索したいバッファに移動します
  • タイプ/Ctrl-R 0
31
csierra

そのために次のコードを使用しています。

vnoremap <silent>* <ESC>:call VisualSearch('/')<CR>/<CR>
vnoremap <silent># <ESC>:call VisualSearch('?')<CR>?<CR>

    function! VisualSearch(dirrection)
        let l:register=@@
        normal! gvy
        let l:search=escape(@@, '$.*/\[]')
        if a:dirrection=='/'
            execute 'normal! /'.l:search
        else
            execute 'normal! ?'.l:search
        endif
        let @/=l:search
        normal! gV
        let @@=l:register
    endfunction
9

つまり、基本的には#および*コマンドの拡張バージョンです。カスタムオペレーター(モーションを期待するコマンド)を定義したいようです。私は実際にこれを行ったことはありませんが、- plugin を見つけたので、それが簡単になりそうです。いくつかの例が提供されています。

5
Cascabel

選択の検索:

最初に行のセクションをヤンクしたい場合は、「v」を使用してカーソルで移動し、必要なものをマークしてから、yを押してヤンクします。これで、選択はレジスター0にあります。

次に、/Ctrl-R 0

4
serup