Comment utiliser des numéros de ligne relatifs en mode ligne de commande?

16

Récemment, j'ai appris de Practical Vim un moyen de copier ou déplacer un bloc de lignes sans avoir à déplacer le curseur de la position actuelle. Cela se fait en mode ligne de commande. par exemple

:123,133m.  # moves lines from 123 to 133 below the cursor position.

Bien que je l'aime, il est difficile de taper les numéros de longue ligne, surtout lorsque le fichier contient trop de lignes.

Parfois, les lignes à déplacer sont relativement proches du curseur (mais je ne veux pas déplacer mon curseur, tirer, revenir là où j'étais, coller!). Ce serait formidable si je pouvais utiliser des nombres relatifs, similaires à ce que nous faisons en mode normal. C'est comme dire

déplacer 5 lignes qui sont 10 lignes au-dessus de la ligne actuelle ici

En bref, comment utiliser les nombres relatifs en mode ligne de commande (similaire au mode normal)?

rpattabi
la source

Réponses:

23

En supposant que vos lignes s'étendent de 15 à 10 lignes au-dessus de la ligne actuelle, vous pouvez obtenir ce que vous avez demandé en utilisant des numéros de ligne relatifs:

:-10,-15m.

Malheureusement, lorsque vous spécifiez une plage arrière, Vim vous demande de confirmer si c'est ce que vous vouliez vraiment. Pour éviter l'étape de confirmation, vous pouvez taper silentavant votre commande, ou simplement spécifier une plage vers l'avant:

:-15,-10m.

Comme vous vous en doutez, +peut être utilisé pour faire référence aux lignes sous la ligne actuelle.

Une aide détaillée peut être trouvée avec:

:help cmdline-ranges
joeytwiddle
la source
1
Mais je n'ai jamais utilisé cette fonctionnalité. Oui 15k d5j 10j P.
joeytwiddle
La différence est que 15k, 5j fonctionne en mode commande, et celui expliqué dans la réponse est en mode insertion. Donc, en fonction du mode, nous pouvons choisir celui qui convient. Les commandes en mode insertion sont généralement les critères de sélection pour exécuter d'autres commandes.
Soundararajan
12

Vous pouvez utiliser des nombres durs dans votre plage:

:200,300command

Ou des nombres relatifs:

:-27,+46command

Ou marques manuelles:

:'a,'bcommand

Ou marques automatiques:

:'[,'>command

Ou recherche:

:?foo?,/bar/command

Ou des raccourcis de ligne:

:.,$command

Ou toute combinaison des astuces ci-dessus:

:?foo?,+46command
:'a,$command
...
romainl
la source
3

Vous pouvez utiliser l'adressage relatif (par exemple .-10,.+3) avec n'importe quelle commande Ex, cp. :help :range.

Alternativement, jetez un œil à mon plugin LineJuggler ; il fournit plusieurs mappages courts pour déplacer des lignes ou les dupliquer, et tous ces mappages prennent un décalage de ligne relatif comme [count].

Ingo Karkat
la source