42 votes

Insérer la sortie d'une commande système à l'emplacement actuel dans vim

Dans vim, lorsque j'utilise

:r !ls somefilename

il insère la sortie de cette commande sur une nouvelle ligne en dessous de la ligne actuelle.

Si je fais

let @a = system("ls")

et plus tard

"ap

il insère toujours la sortie sur une nouvelle ligne en dessous de la ligne actuelle.

Y a-t-il un moyen de faire en sorte que vim insère la sortie à l'emplacement actuel ?

47voto

devav2 Points 33862
:r !command 

lira la sortie de la commande et l'insérera à la ligne en dessous de la ligne actuelle. C'est ainsi que vi est programmé, vous ne pouvez pas changer ce comportement.

Mais, si vous êtes à la ligne numéro 3. Si vous essayez :r !date. Il insérera la valeur de la date dans la ligne numéro 4.

Si vous voulez que la valeur de la date apparaisse à la ligne numéro 3, alors vous essayez :2r !date insérera la valeur de la date à la ligne numéro 3.

17voto

user3048 Points 133

Vous pouvez coller le contenu du presse-papiers entre les caractères avec Ctrl-R * en mode insertion (et une approche similaire pour d'autres tampons). Donc, si vous pouvez mettre la commande système dans un tampon, vous devriez être prêt. (Source: https://stackoverflow.com/questions/1491135/paste-multi-line-string-into-gvim-at-cursor-position ).

:let @a=system("ls -l") mettra la sortie de ls -l dans le registre a. Vous pouvez ensuite le coller (en mode insertion) avec ^R-a.

16voto

kenorb Points 8840

Voici une autre façon de coller la sortie de la commande externe avant le curseur :

:exe 'norm i' . system("ls -l")

ou utilisez le registre d'expression (:help @=) :

"=system('ls -la')

puis appuyez sur P. Ou une façon plus courte :

=system('ls -la')

1voto

Sergiy Kolodyazhnyy Points 97292

En plus de let et p, nous pouvons également utiliser les fonctions de vim setreg() et put comme ceci :

:call setreg('f',system("ls"))

:put f

Notez que le registre f a été choisi dans cet exemple simplement pour représenter de manière mnémonique le mot "fichiers". Il n'y a rien de particulièrement spécial à ce sujet et vous êtes libre de choisir votre propre registre.

0voto

jspencer Points 101

La commande :r prend une plage de lignes dans laquelle les résultats seront lus. Dans les lignes de commande vim, "." dans une plage signifie "la ligne actuelle". Ainsi, :r ... est équivalent à :.r ..., et signifie "mettre ce que je lis après la ligne actuelle.

Vous êtes libre de spécifier la plage à écrire en utilisant une expression basée sur .. En particulier, la chose que vous demandez devrait être facilement faite avec:

:.-1r !ls somefilename

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X