web-dev-qa-db-fra.com

vim - Comment lire une plage de lignes d'un fichier dans le tampon courant

Je veux lire la ligne n1-> n2 du fichier foo.c dans le tampon actuel.

J'ai essayé: 147,227r /path/to/foo/foo.c

Mais j'obtiens: "E16: Plage non valide", bien que je sois certain que foo.c contient plus de 1000 lignes.

53
Aman Jain
:r! sed -n 147,227p /path/to/foo/foo.c
83
boxxar

Vous pouvez le faire en pur Vimscript, sans avoir à utiliser un outil externe comme sed:

:put =readfile('/path/to/foo/foo.c')[146:226]

Notez que nous devons décrémenter un à partir des numéros de ligne car les tableaux commencent à 0 tandis que les numéros de ligne commencent à 1.

Inconvénients : Cette solution est 7 caractères plus longue que la réponse acceptée, et elle consommera temporairement de la mémoire par rapport à la taille de l'autre fichier.

24
joeytwiddle

La {plage} fait référence à la destination dans le fichier actuel, pas à la plage de lignes dans le fichier source.

Après quelques expérimentations, il semble

:147,227r /path/to/foo/foo.c

signifie insérer le contenu de /path/to/foo/foo.c après la ligne 227 de ce fichier. c'est-à-dire: il ignore le 147.

18
Stewart Johnson

Les autres solutions publiées sont idéales pour des numéros de ligne spécifiques. C'est souvent le cas que vous souhaitez lire du haut ou du bas d'un autre fichier. Dans ce cas, la lecture de la sortie de la tête ou de la queue est très rapide. Par exemple -

:r !head -20 xyz.xml

Lit les 20 premières lignes de xyz.xml dans le tampon actuel où se trouve le curseur

:r !tail -10 xyz.xml 

Lit les 10 dernières lignes de xyz.xml dans le tampon actuel où se trouve le curseur

Les commandes head et tail sont extrêmement rapides, donc même les combiner peut être beaucoup plus rapide que d'autres approches pour les très gros fichiers.

:r !head -700030 xyz.xml| tail -30

Lira les numéros de ligne de 700000 à 700030 du fichier xyz.xml dans le tampon actuel

Cette opération devrait se terminer instantanément, même pour des fichiers assez volumineux.

5
raj

Je devais juste le faire dans un de mes projets de code et je l'ai fait de cette façon:

En tampon avec /path/to/foo/foo.c ouvert:

:147,227w export.txt

Dans le tampon avec lequel je travaille:

:r export.txt

Beaucoup plus facile dans mon livre ... Cela nécessite d'avoir les deux fichiers ouverts, mais si j'importe un ensemble de lignes, je les ai généralement toutes les deux ouvertes de toute façon. Cette méthode est plus générale et plus facile à retenir pour moi, surtout si j'essaie d'exporter/d'importer un ensemble de lignes plus délicat en utilisant g/<search_criteria/:.w >> export.txt ou une autre manière plus compliquée de sélectionner des lignes.

2
DigitalAce69

Une plage permet d'appliquer une commande à un groupe de lignes dans le tampon actuel.

Ainsi, la plage d'instructions de lecture signifie où insérer le contenu dans le fichier actuel, mais pas la plage de fichiers que vous souhaitez lire.

2
Justin

Tu devras:

:r /path/to/foo/foo.c
:d 228,$
:d 1,146

Trois étapes, mais ce sera fait ...

2
PaulB