2010-01-15 29 views
13

¿Existe un comando para determinar la longitud de una línea más larga en vim? Y para agregar esa longitud al comienzo del archivo?línea más larga en vim?

+2

¿Se debe hacer esto en Vim? Lo pregunto porque es algo muy específico que quiero hacer, y probablemente sería más rápido armar un script de Python/Perl/Ruby para hacerlo si lo necesita en múltiples archivos. – ZoogieZork

+0

Esto suena como si estuviera buscando la solución incorrecta al problema real. ¿Qué estás tratando de lograr exactamente? – soulmerge

+0

@ ZoogieZork: a veces, vim es suficiente, y lo suficientemente simple, no es necesario usar herramientas externas. –

Respuesta

18

El comando wc de Gnu tiene una opción -L --max-line-length que imprime la longitud máxima de línea del archivo. Vea el gnu man wc. El freebsd wc también tiene -L, pero no --max-line-length, ver freebsd man wc.

¿Cómo usar esto de vim? El comando:

:%!wc -L 

Filtrará el archivo abierto a través de wc -L y hará que el contenido del archivo tenga la longitud de línea máxima.

para retener el contenido del archivo y poner la longitud máxima de línea en la primera línea de hacer:

:%yank 
:%!wc -L 
:put 

En lugar de utilizar wc, Find length of longest line - awk bash describe cómo usar awk para encontrar la longitud de la línea más larga.

Bien, ahora para una solución Vim pura. Soy algo nuevo en scripting, pero aquí va. Lo que sigue se basa en la función FilterLongestLineLength de textfilter.

function! PrependLongestLineLength () 
    let maxlength = 0 
    let linenumber = 1 
    while linenumber <= line("$") 
    exe ":".linenumber 
    let linelength = virtcol("$") 
    if maxlength < linelength 
     let maxlength = linelength 
    endif 
    let linenumber = linenumber+1 
    endwhile 

    exe ':0' 
    exe 'normal O' 
    exe 'normal 0C'.maxlength 
endfunction 

command PrependLongestLineLength call PrependLongestLineLength() 

poner este código en un archivo .vim (o su .vimrc) y: el archivo fuente. A continuación, utilice el nuevo comando:

:PrependLongestLineLength 

Gracias, averiguar esto fue divertido.

+1

Estaba en algo así como! Awk '{print (length ($ 0))}' stacker

+0

Incluso si la solución de Jonathan (pre-vim-7) es un poco compleja, tiene razón al usar 'virtcol()', las tabulaciones no se contarán como '1'. Me temo que todas las demás soluciones basadas en wc, awk, perl, etc. no darán las respuestas correctas. –

5

Si trabaja con tabulaciones ampliadas, un simple

:0put=max(map(getline(1,'$'), 'len(v:val)')) 

es suficiente.

De lo contrario, creo que necesitaremos la siguiente (que se puede encontrar como el último ejemplo en :h virtcol(), menos el -1):

0put=max(map(range(1, line('$')), "virtcol([v:val, '$'])-1")) 
+0

No llamaría a esa línea "simple". Sin embargo, funciona, así que no tengo quejas. – sleske

2

: wc -l%
en lugar de
:%! wc -L

Para agregar esa longitud al principio del archivo:
: 0r! wc -L% | cut -d '' -f1

+0

La ventaja de '%! Wc -L' es que funciona en almacenamientos intermedios no guardados o sin nombre. – wchargin

Cuestiones relacionadas