2009-12-23 25 views
7

Quiero usar vim para escribir una parte de mi archivo en otro archivo. Por ejemplo, tengo el siguiente archivo:En vim, ¿cómo escribir una línea parcial en un archivo?

This is line 1

and this is the next line

Quiero que mi archivo de salida para leer:

line 1

and this is

Sé cómo usar vi para escribir una serie de líneas en un archivo:

:20,22 w partial.txt

Una alternativa es seleccionar visualmente el texto deseado y luego escribir:

:'<'> w partial.txt

Sin embargo, al usar este método, vim insiste en escribir la línea completa en la salida, y no he encontrado forma de escribir una línea parcial. ¿Alguna idea?

Respuesta

5

Tengo dos enfoques (muy similares) para esto. No hay forma de hacerlo con el comando de escritura incorporado, pero es bastante fácil generar su propia función que debe hacer lo que quiera (y puede llamarlo como desee, incluso W si lo desea).

Un enfoque muy simple que sólo manejará oscila de una sola línea es tener una función como esta:

command! -nargs=1 -complete=file -range WriteLinePart <line1>,<line2>call WriteLinePart(<f-args>) 

function! WriteLinePart(filename) range 
    " Get the start and end of the ranges 
    let RangeStart = getpos("'<") 
    let RangeEnd = getpos("'>") 

    " Result is [bufnum, lnum, col, off] 

    " Check both the start and end are on the same line 
    if RangeStart[1] == RangeEnd[1] 
     " Get the whole line 
     let WholeLine = getline(RangeStart[1]) 

     " Extract the relevant part and put it in a list 
     let PartLine = [WholeLine[RangeStart[2]-1:RangeEnd[2]-1]] 

     " Write to the requested file 
     call writefile(PartLine, a:filename) 
    endif 
endfunction 

Esto se llama con :'<,'>WriteLinePart test.txt.

Si desea admitir rangos de línea múltiples, puede expandir esto para incluir condiciones variables, o puede pellizcar el código de mi respuesta al this question. Deshacerse de la broca sobre la sustitución de las barras invertidas y, a continuación, podría tener una función muy simple que hace algo así (no probado, aunque ...) esto:

command! -nargs=1 -complete=file -range WriteLinePart <line1>,<line2>call writelines([GetVisualRange()], a:filename) 
+0

Excelente, esto es exactamente lo que necesito. Solo necesitaba un rango único, pero es grandioso saber sobre la solución de rango múltiple si la necesito en el futuro. Gracias, y Feliz Navidad (o Súper Solsticio, si la Navidad no es lo tuyo)! – Magnus

Cuestiones relacionadas