web-dev-qa-db-fra.com

Vim - yank dans le registre de recherche

Existe-t-il un moyen facile/rapide de "tirer" dans le registre "dernière recherche" de vim ("/)?

D'après la documentation de vim, il apparaît que la réponse est non, mais qu'elle peut être attribuée via une commande "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.

Idéalement, ce que j'aimerais faire, c'est quelque chose comme:

"/5yw

qui tirerait les 5 prochains mots sous le curseur et les mettrait dans le dernier tampon de recherche

Alternativement, s'il existe un moyen de rechercher le contenu d'un registre nommé, cela fonctionnerait aussi. En d'autres termes, si je pouvais faire:

"A5yw

puis recherchez ce qui se trouve dans le registre A, cela fonctionnerait aussi.

Le plus proche que je puisse faire est de tirer dans un registre nommé puis de copier ce registre dans le dernier registre de recherche, par ex.

"A5yw
:let @/=@A

Au risque de faire une longue question plus longue, je tiens à préciser que ce ne sont pas toujours 5 mots que j'aimerais "yank & search" - parfois c'est 17 caractères, parfois c'est jusqu'à la fin de la ligne, etc ... donc une macro codée en dur ne me donne pas la flexibilité que je souhaiterais.

74
Dan

Après avoir appuyé sur / pour saisir une chaîne de recherche, vous pouvez ensuite utiliser Ctrl-R puis tapez la lettre représentant le registre que vous souhaitez utiliser.

par exemple.

  • Première, "Ayw pour insérer un mot dans le registre A
  • Ensuite, / ^R A pour mettre le contenu du registre A dans la chaîne de recherche.
97
a'r

Si vous n'avez utilisé aucun registre pour stocker le texte copié, vim utilise 0 S'inscrire. Vous pouvez rechercher cela en tapant Ctrl-R 0 après /.

Un exemple plus compliqué. Supposons que vous souhaitiez rechercher dans un autre tampon le texte entre guillemets qui se trouve sous le curseur en ce moment:

  • Vous pouvez le faire avec yi" (citation intérieure)
  • Accédez au tampon où vous souhaitez rechercher
  • Tapez /Ctrl-R 0
31
csierra

J'utilise le code suivant pour cela:

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
Nikolay Frantsev

Donc, fondamentalement, une version étendue des commandes # et *, non? Il semble que vous souhaitiez définir un opérateur personnalisé (une commande qui attend un mouvement). Je n'ai jamais fait cela, mais j'ai trouvé un plugin qui semble pouvoir le rendre plus facile. Il y a quelques exemples fournis.

5
Cascabel

Recherche d'une sélection:

si vous voulez d'abord tirer sur une section d'une ligne, puis utilisez "v" et déplacez-vous avec les curseurs jusqu'à ce que vous ayez marqué ce que vous voulez, puis appuyez sur y pour tirer et maintenant la sélection est dans le registre 0

vous pouvez ensuite taper /Ctrl-R 0

4
serup