texto que pegar insertar editar copiar con busquedas archivo aprende vim

pegar - que es vim



vim-Cómo leer el rango de líneas de un archivo en el búfer actual (7)

Quiero leer la línea n1-> n2 del archivo foo.c en el búfer actual.

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

Pero me aparece: "E16: rango inválido", aunque estoy seguro de que foo.c contiene más de 1000 líneas.


{Range} se refiere al destino en el archivo actual, no al rango de líneas en el archivo fuente.

Después de algunos experimentos, parece

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

significa insertar el contenido de /path/to/foo/foo.c después de la línea 227 en este archivo. es decir: ignora el 147.


:r! sed -n 147,227p /path/to/foo/foo.c


Necesitaras:

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

Tres pasos, pero lo hará ...


Solo tuve que hacer esto en un proyecto de código mío y lo hice de esta manera:

En el búfer con /path/to/foo/foo.c abierto:

:147,227w export.txt

En buffer estoy trabajando con:

:r export.txt

Mucho más fácil en mi libro ... Requiere tener ambos archivos abiertos, pero si estoy importando un conjunto de líneas, generalmente los tengo abiertos. Este método es más general y más fácil de recordar para mí, especialmente si estoy tratando de exportar / importar un conjunto de líneas más complicado utilizando g/<search_criteria/:.w >> export.txt o alguna otra forma más complicada de seleccionar líneas .


Un rango permite que un comando se aplique a un grupo de líneas en el búfer actual.

Entonces, el rango de instrucción de lectura significa dónde insertar el contenido en el archivo actual, pero no el rango de archivo que desea leer.


Otras soluciones publicadas son excelentes para números de línea específicos. A menudo es el caso que desea leer desde la parte superior o inferior de otro archivo. En ese caso, leer la salida de la cabeza o la cola es muy rápido. Por ejemplo -

:r !head -20 xyz.xml

Leerá las primeras 20 líneas de xyz.xml en el búfer actual donde está el cursor

:r !tail -10 xyz.xml

Leerá las últimas 10 líneas de xyz.xml en el búfer actual donde está el cursor

Los comandos de la cabeza y la cola son extremadamente rápidos, por lo que incluso combinarlos puede ser mucho más rápido que otros enfoques para archivos muy grandes.

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

Leerá los números de línea de 700000 a 700030 del archivo xyz.xml en el búfer actual

Esta operación debe completarse instantáneamente incluso para archivos bastante grandes.


Puedes hacerlo en Vimscript puro, sin tener que usar una herramienta externa como sed:

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

Tenga en cuenta que debemos disminuir uno de los números de línea porque las matrices comienzan desde 0 mientras que los números de línea comienzan desde 1.

Desventajas : esta solución tiene 7 caracteres más que la respuesta aceptada, y consumirá memoria temporalmente en relación con el tamaño del otro archivo.