2008-10-27 10 views

Respuesta

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

¿Alguna posibilidad de que sepa cómo crear una macro copiar/pegar para múltiples vim en tmux, permitiendo pegar de un archivo a otro? – serup

+0

Intenté arriba, sin embargo cuando trato de leer 217 líneas, entonces las últimas 18 líneas cambiaron al frente del punto de inserción en vim - ¿sabes por qué podría pasar esto? ¿hay una envoltura cuando se han alcanzado 200 líneas? – serup

17

El {range} hace referencia 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: se ignora el 147.

2

Tendrá que:

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

tres pasos, pero va a lograr que se haga ...

+4

esto es mucho tipeo, lo siento :) –

+3

No es una buena solución, no se compara con la solución sed. –

2

Una gama permite un comando para ser aplicado a un grupo de líneas en el buffer actual.

Por lo tanto, el rango de las instrucciones de lectura significa dónde insertar el contenido en el archivo actual, pero no el rango de archivos que desea leer.

1

sólo tenía que hacer esto en un proyecto de código de la mina y lo hizo de esta manera:

en tampón con /path/to/foo/foo.c abierta:

:147,227w export.txt 

en tampón con los que trabajo:

: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.

+0

Esto plantea la pregunta: si tiene el archivo abierto y va a ingresar el rango, ¿por qué no simplemente tira de ese rango y lo coloca en el búfer de destino? –

19

Puede hacerlo en pura Vimscript, sin tener que utilizar una herramienta externa como sed:

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

Tenga en cuenta que hay que disminuir uno de los números de línea debido a las matrices comienzan a partir de 0, mientras que los números de línea de salida 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.

+0

¿No hay una forma de transformarlo en un comando vim cómodo, con una sintaxis similar a la propuesta por OP? p.ej. : '147,227ri /path/to/foo/foo.c '(observe' ri' para leer) –

+0

Sí, ciertamente podría hacer eso. Sin embargo, los comandos creados por el usuario deben comenzar con una letra mayúscula, por lo que su 'ri' debería ser' Ri' o 'RI'. – joeytwiddle

+0

Esto no parece funcionar cuando se usa tilde '~ /' para el directorio $ HOME, por ejemplo: 'readfile (" ~/Documents/something.txt ")' da como resultado 'E484: No se puede abrir el archivo '~/Documents/algo.txt'. – f1lt3r

1

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á primeras 20 líneas de xyz.xml en búfer en donde está el cursor

:r !tail -10 xyz.xml 

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

Los comandos de cabeza y 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 a partir de 700000 a 700030 de xyz.xml archivo en búfer en

Esta operación debe completar al instante, incluso para los archivos bastante grandes.

Cuestiones relacionadas