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.
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.
"Ayw
pour insérer un mot dans le registre A/ ^R A
pour mettre le contenu du registre A dans la chaîne de recherche.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:
yi"
(citation intérieure)/Ctrl-R 0
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
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.
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