Comment rechercher des lignes correspondant à la ligne actuelle dans vim

11

Je recherche généralement des mots par :/string, mais si je dois rechercher toute la ligne actuelle, comment faire.

event: 1  beacon: 0x02              //line 1
event: 19 beacon: 0x02              //line 2
event: 1  beacon: 0x03              //line 3
event: 1  beacon: 0x02              //line 4
event: 8  beacon: 0x01              //line 5
event: 19 beacon: 0x02              //line 6
event: 1  beacon: 0x02              //line 7

Par exemple, si cursorest actuellement sur la line 1façon de rechercher de la même manière que :/pour le texte contenant la ligne actuelle entière. Le curseur doit alors passer à l'appariement line 4, puis àline 7

manav mn
la source

Réponses:

7

Voici comment je le ferais:

  1. Tirez la ligne (dans le registre sans nom), sans inclure la nouvelle ligne à la fin: 0y$
  2. Lancer une recherche très nomagique :/\V
  3. Ajoutez la ligne tirée: <c-r>"
  4. Lancez la recherche: <cr>

Comme @EvergreenTree le fait remarquer dans un commentaire , vous pouvez bien sûr créer un mappage pour effectuer toutes les étapes en une seule fois:

nnoremap <leader>* 0y$/\V<c-r>"<cr>

Rubriques d'aide pertinentes:

:help registers
:help /magic
:help c_CTRL-R

NB Si la ligne que vous recherchez contient des barres obliques inverses, vous devrez toujours les parcourir et les échapper (en ajoutant une autre barre oblique inverse), même avec une recherche très nomagique .

Riches
la source
4
Bien sûr, vous pouvez également créer un mappage pour cela: nnoremap {key} 0y$/\V<c-r>"<cr>
EvergreenTree
9

Surtout à des fins de cartographie, je trouve l'utilisation getline()plus élégante que le fait de tirer soi-même. L'appel getline()avec une chaîne '.'renvoie la ligne sous le curseur. Il existe deux bonnes options pour l'utiliser:

:exec '/' . getline('.')

qui analyse les chaînes '/'et ce qui est retourné getline()ensemble et l'exécute comme une commande vim.

ou

/<C-r>=getline('.')<CR>

qui utilise le registre d'expression @=. L'expression suivante =est évaluée après la première <CR>et placée dans la ligne de commande.

Sakari Cajanus
la source
Agréable! Lorsque la ligne contient des caractères comme /ou 'cela ne fonctionne pas très bien. Quoi qu'il en soit, j'apprends quelque chose aujourd'hui! Merci
Luc M
4

Personnellement, j'obtiendrais un plugin Visual Star ( il y en a peu ). Il y a un joli Vimcast à ce sujet: Recherchez le texte sélectionné . Cela signifie que vous pouvez sélectionner visuellement la ligne, puis appuyer sur *.

Si un plugin n'est pas votre truc, vous pouvez ajouter le mappage suivant à votre vimrc:

xnoremap * :<c-u>let @/=@"<cr>gvy:let [@/,@"]=[@",@/]<cr>/\V<c-r>=substitute(escape(@/,'/\'),'\n','\\n','g')<cr><cr>

Remarque: Visual-block ( <c-v>) n'est pas pris en charge pour ce mappage.

Peter Rincker
la source
J'ai ajouté les mappages, mais en fait, il saute au premier mot correspondant et ne sélectionne PAS la ligne entière.
Manav mn
S'il correspond à un mot, je suppose que vous utilisez *le mode normal ou que le mappage n'est pas installé correctement.
Peter Rincker
4

Les réponses existantes échouent toutes si votre ligne contient certains éléments qui sont interprétés comme faisant partie d'un modèle. Le \Vpoint obtient l'essentiel du chemin, mais il gâche toujours la barre oblique inverse.

Essayez ceci pour échapper aux contre-obliques ...

/\V<C-R>=escape(getline('.'), '\')

Et puis, si vous l'utilisez dans un mappage, vous aurez besoin d'un ou deux <Enter>s à la fin selon la façon dont vous voulez que cela fonctionne.

dash-tom-bang
la source
Excellente réponse! Les lignes contiennent souvent les deux types de barre oblique qui confondent les autres réponses. Ce dernier argument d' évasion devrait également inclure une barre oblique:escape(…, '/\')
bobbogo
2

Avec vim-asterisk installé, utilisez simplement V$*(ou 0v$*) pour sélectionner la ligne actuelle et recherchez-la.

Dans la deuxième commande 0n'est pas nécessaire si le curseur est déjà au début de la ligne.

adelarsq
la source
1
Ne *recherche pas seulement le mot sous le curseur, et non la sélection visuelle actuelle?
EvergreenTree du
1
@EvergreenTree J'ai oublié de mentionner le plugin. Merci pour avis
adelarsq
2

Une autre façon de procéder consiste à utiliser la fenêtre de ligne de commande: yy/<Ctrl-F>p<Enter>

  • Coupez toute la ligne dont vous avez besoin avec yy
  • Appuyez sur /puis sur Ctrl-F pour ouvrir la fenêtre de ligne de commande
  • Appuyez ppour coller la ligne
  • Appuyez sur Entrée pour lancer la recherche
Boris Serebrov
la source
5
Vous pouvez également utiliser q/pour obtenir le même effet que/<c-f>
evilsoup
2

http://vim.wikia.com/wiki/Searching_for_expressions_which_include_slashes souligne que le registre de recherche peut être défini directement, comme ceci:

:let @/='/abc/def/ghi/'

Cela permet une recherche sur la ligne et fonctionne même lorsque la ligne comprend des barres obliques.

Donc, pour faire, par exemple, \*mapper à une recherche de ligne:

nnoremap <leader>* :set hlsearch<cr>:let @/=getline('.')<cr>
Bernard Ogden
la source