Comment inverser la sélection dans vim?


12

Après avoir sélectionné une plage de lignes avec la Vcommande, je voudrais supprimer toutes les lignes du fichier qui n'est PAS sélectionné, est donc un moyen d'inverser la sélection - sélectionner chaque ligne qui n'est pas sélectionnée?

Comme quoi

:g!/FOO/d

supprime chaque ligne qui ne contient PAS FOO .

Si j'avais une gamme en tête et que je voulais utiliser son inverse:

'a,'b

J'aurais besoin d'utiliser les deux gammes:

1,'a-1

et

'b+1,$

Je soupçonne que cela ne peut pas être fait en une seule étape - mais ce serait bien!


vous voulez donc une opération de style "recadrage"?
Quack Quichote

Réponses:


7

Créez d'abord le mappage suivant (par exemple lié à la <F4>clé)

map <F4> :<C-U>1,'<-1:delete<CR>:'>+1,$:delete<CR>

puis, après avoir sélectionné une plage en mode visuel, appuyez simplement sur <F4>pour déclencher la commande associée. La commande peut être facilement expliquée en plusieurs parties:

  • " :" Entrez en mode ligne de commande.
  • " <C-U>" Supprimer tous les caractères entre la position du curseur et le début de la ligne.
  • " 1,'<-1" Spécifiez la plage de la première ligne du fichier à la ligne avant le début de la sélection actuelle.
  • " :delete<CR>" Supprimer (la plage de lignes spécifiée précédemment).
  • " :'>+1,$:delete<CR>" Supprimer les lignes de la plage " '>+1,$", c'est-à-dire de la ligne après la fin de la sélection à la fin du fichier.

2
juste pour l'expliquer: 1, '<- 1 est la plage de la ligne 1 jusqu'au début de la sélection. '> + 1, $ est la plage de 1 ligne après la sélection jusqu'à la fin ...
Akira

Existe-t-il un moyen de le faire avec une seule commande "supprimer"?
Kevin Panko

1
@Kevin Panko: vous devez combiner les plages en une seule expression. j'ai regardé les documents et je ne pense pas que la syntaxe de la plage supporte une telle chose. vimdoc.sourceforge.net/htmldoc/cmdline.html#cmdline-ranges ,,, vim.wikia.com/wiki/Ranges
quack quixote

15
  1. sélectionnez votre texte
  2. "*yggdG"*p ce qui signifie ...

    "*y    " yank it to the selection register
    ggdG   " delete everything
    "*p    " and paste the selection again 
    

9
ygg "_dGP est le même mais plus court.
Kevin Panko

1
à la fin, vous obtenez le même texte, vrai :)
akira

Je voudrais simplement me référer aux réponses d'Akira et Kevin Panko (je ne peux pas ajouter de commentaires). "[o] pposite [d] elete in (v) isual mode vmap od ygg" _dGP
Marcin Rogacki

Des plugins comme github.com/maxbrunsfeld/vim-yankstack facilitent cette approche. Vous n'avez pas à vous soucier autant que votre registre yank soit obstrué par la suppression.
Jack O'Connor du

comment cela peut-il être ajouté comme mappage de clavier .vimrc? J'ai essayé plusieurs fois mais je ne l'ai pas encore eu. Mes tentatives ont été map <F4> n"*yggdG"*p etnmap <F4> "*yggdG"*p
Brad Parks

7

Juste pour la postérité:

:v/\%V/d

Cela fait un global inverse sur les lignes qui ne font pas partie de la sélection. Notez que: v est une construction basée sur les lignes, donc toute ligne contenant une sélection, que ce soit la sélection de ligne, de flux ou de bloc, sera supprimée.


1

étant donné que «inverser» signifie essentiellement créer des «multisélections» (la zone avant et après la sélection d'origine), j'ai de nouveau recherché les vimscripts http://www.vim.org/scripts/script.php?script_id=953 . essaye ça.

 There are a number of operations to very
 easily manipulate selections such as modifying 
 the regions (add/delete/inverte/clear), hiding, 
 refreshing, saving and restoring etc."
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.