mover la selección a un archivo separado

12

Con vim, ¿cómo puedo mover un fragmento de texto a un nuevo archivo? Por el momento, hago esto:

  • selecciona el texto
  • utilizar :w new_file
  • selecciona el texto nuevamente
  • borrar el texto

¿Hay una manera más eficiente de hacer esto?

antes de

a.txt

sometext
some other text
some other other text
end

Después

a.txt

sometext
end

b.txt

some other text
some other other text
greg0ire
fuente

Respuestas:

4

¿Qué hay de estos comandos personalizados:

:command! -bang -range -nargs=1 -complete=file MoveWrite  <line1>,<line2>write<bang> <args> | <line1>,<line2>delete _
:command! -bang -range -nargs=1 -complete=file MoveAppend <line1>,<line2>write<bang> >> <args> | <line1>,<line2>delete _
Ingo Karkat
fuente
1
Esto es muy feo, pero bueno, parece que en un paso exactamente lo que pedí (lo intenté). +1, y aceptado. Estaba buscando una forma nativa de hacer esto rápidamente, pero como no parece haber una, la tuya funcionará bien. ¡Gracias!
greg0ire
1
La belleza está en el ojo del espectador. Esto me parece muy elegante; solo necesita escribirlo una vez (en su .vimrc).
Ingo Karkat
Tienes razón, "muy feo" debería haber sido "muy desconocido". Su comando es muy útil, y creo que definitivamente voy a tallarlo en mi .vimrc
greg0ire
8

Al "mover un fragmento de texto a un nuevo archivo", supongo que quiere decir cortar ese fragmento de texto del archivo actual y crear un nuevo archivo que contenga solo ese texto.

Varios ejemplos:

  • :1,1 w new_file para crear un nuevo archivo que contenga solo el texto de la línea número 1
  • :5,50 w newfile para crear un nuevo archivo que contenga el texto de la línea 5 a la línea 50
  • :'a,'b w newfilepara crear un nuevo archivo que contenga el texto de marca aa marcab
    • establece tus marcas usando may mbdonde quieras

Lo anterior solo copia el texto y crea un nuevo archivo que contiene ese texto. Luego tendrá que eliminar después.

Esto se puede hacer usando el mismo rango y el dcomando:

  • :5,50 d para eliminar el texto de la línea 5 a la línea 50
  • :'a,'b dpara eliminar el texto de marca aa marcab

O utilizando ddpara el caso de una sola línea.

Si, en cambio, selecciona el texto usando el modo visual y luego presiona :mientras el texto está seleccionado, verá lo siguiente en la línea de comando:

:'<,'>

Que indica el texto seleccionado. Luego puede expandir el comando para:

:'<,'>w >> old_file

Que añadir el texto a un archivo existente. Luego elimine como se indica arriba.


Un trazador de líneas:

:2,3 d | new +put! "

El desglose:

  • :2,3 d - eliminar líneas 2 a 3
  • | - técnicamente, esto redirige la salida del primer comando al segundo comando, pero dado que el primer comando no genera nada, solo estamos encadenando los comandos juntos
  • new - abre un nuevo búfer
  • +put! "- poner el contenido del registro sin nombre ( ") en el búfer
    • El bang ( !) está ahí para que el contenido se coloque antes de la línea actual. Esto provoca una línea vacía al final del archivo. Sin ella, hay una línea vacía en la parte superior del archivo.
Embedded.kyle
fuente
Tu suposición es correcta. Esto se ve bien, lo voy a probar. ¿Podría explicar 2. un poco más? No estoy muy familiarizado con los rangos. EDITAR: si intento esto en la segunda línea, escribe la primera línea en el otro archivo, no la segunda línea.
greg0ire
@ greg0ire Lo tengo un poco hacia atrás, lo editaré para explicarlo mejor
embedded.kyle
Agregué un ejemplo para aclarar mi pregunta.
greg0ire
@ greg0ire Corrigí mi respuesta. Todavía son dos pasos. Las primeras copias y escrituras. El segundo borra.
embedded.kyle el
1
Buena solución! También puedes escribirlo '<,'>d | new | 0put "para mayor claridad.
atripes
1

Basado en la respuesta de @ embedded.kyle y estas preguntas y respuestas , terminé con este revestimiento para agregar una selección a un archivo y eliminarlo del archivo actual. Después de seleccionar algunas líneas con Shift+V, presiona :y corre:

'<,'>w >> test | normal gvd 

La primera parte agrega líneas seleccionadas. El segundo comando ingresa al modo normal y se ejecuta gvdpara seleccionar la última selección y luego se elimina.

jtpereyda
fuente
0

Seleccione el texto en modo visual, luego presione ypara "tirarlo" al búfer (copiar) o dpara "borrarlo" al búfer (cortar).

Luego puede :split <new file name>dividir su ventana vim y presionar ppara pegar el texto arrancado. Escribe el archivo como de costumbre.

Para cerrar la división nuevamente, pase la división que desea cerrar :q.

Xyon
fuente
1
Tengo 4 pasos por el momento: seleccionar, escribir, seleccionar, eliminar. Con su método, tengo 6 pasos: seleccionar, eliminar, dividir, pegar, escribir, cerrar. Pedí algo más eficiente: P
greg0ire
Bueno, si pasa la división en su :xlugar, puede combinar la escritura y el cierre en uno y hacer cinco pasos. : P
Xyon
Eso es mejor, pero 5 todavía> 4: P
greg0ire