2010-11-10 18 views
5

Edito archivos en Vim donde registré las líneas de comando del terminal junto con las descripciones de lo que hice. Todos mis líneas de comandos comienzan con $, por lo que los archivos de mi aspecto:¿Cómo puedo definir una excepción para los saltos de línea en Vim?

This is a description of what this 
command does, it can be quite long and 
should have line breaks. 

$ ./the_command.sh 

Estas son en realidad Viki archivos, pero supongo que esta cuestión debe aplicarse a cualquier tipo de archivo. Tengo detección de tipo de archivo y los archivos están identificados correctamente.

La pregunta ahora es:

Quiero línea (duro) se rompe para insertarse en todo el texto a excepción de las copias reales de las líneas de comandos, lo que podría ser fácilmente identificados por el líder $.

¿Es posible en Vim definir una excepción para aplicar la regla de salto de línea basada en un patrón? ¿Lo haría en el archivo de sintaxis para los archivos viki?

ACTUALIZACIÓN Usando una combinación de lo que sugirió Herbert y Jefromi, ahora tengo esto en mi .vimrc:

au CursorMovedI *.viki call SetTextWidth() 

function! SetTextWidth() 
    if getline(".")=~'^\$' 
     set textwidth=1000 
    else 
     set textwidth=80 
    endif 
endfunction 

Hace exactamente lo que quiero. ¡Gracias chicos!

+0

Solo para aclarar: Quiero que los saltos de línea que se insertan automáticamente mientras se escribe. En mi .vimrc tengo una línea "autocmd FileType viki setlocal textwidth = 80" para establecer el ancho de texto específicamente para los archivos viki, que funciona bien, excepto que también rompe mis líneas "$ COMMAND". – tospo

Respuesta

3

Deduzco cuando usted dice que quiere "línea dura se rompe" quiere decir que desea Vim para romper una línea de forma automática, como cuando llega una columna textwidth. Creo que la mejor manera de hacerlo es definir un comando 'au' que establece el ancho de texto en un número alto (más alto que la línea más larga posible) cuando está en una línea que comienza con un "$".

así que algo como esto cambiaría textwidth siempre que entre o salga del modo de inserción en una línea:

au InsertEnter call SetTextWidth() 
au InsertLeave call SetTextWidth() 

function! SetTextWidth() 
    if getline(line('.')) =~ '^\$' 
     " [edit: 'set textwidth = 0' is preferable to line below] 
     set textwidth =1000 
    else 
     set textwidth=78 
    endif 
endfunction 

Es posible que desee utilizar los grupos CursorMoved/CursorMovedI en lugar de InsertEnter/Deja ya que son más bien -grabado Se activan cada vez que mueves el cursor, por lo que la función termina siendo llamada muchas veces más, pero la función es lo suficientemente simple como para que no vaya a presentar una degradación notable en el rendimiento.

Para prescindir de una función en absoluto que probablemente se podría usar algo como esto:

au InsertEnter exec "set tw=" . getline(line('.'))=~'^\$' ? 1000 : 78 
au InsertLeave exec "set tw=" . getline(line('.'))=~'^\$' ? 1000 : 78 
+0

Probablemente podría usar 'CursorMovedI' para implementar manualmente el ajuste de línea y dejar solo el ancho de texto. – Cascabel

+0

Muchas gracias por esta solución. ¿No debería ser simplemente "getline ('.')" En lugar de getline (línea ('.'))? El problema con este enfoque es que solo funciona si comienza a editar una línea, escribe "$" y luego sale y vuelve al modo insertar. De lo contrario, no hay "$" al comienzo de la línea cuando ingresa INSERT, lo que significa que se insertarán saltos de línea y, por lo tanto, no hay un "$" inicial en la línea actual cuando sale del modo INSERTAR. Tengo que probar con CursorMovedI ahora, supongo que debería funcionar. – tospo

+0

OK, funciona bien con CursorMovedI, ¡muchas gracias! – tospo

0

Aunque no estoy seguro de lo que quiere (usted debe ser un poco más específico sobre dónde (qué, cómo) que desea insertar saltos de línea duros), pero se puede emitir un comando como

:v:^\s*$: <Your command to insert line break, e.g. s/something/\r/ > 

Este comando anterior busca cualquier línea que no comience con espacios en blanco seguidos por $, luego ejecuta el comando que especifique.

HTH

+0

como dije, quiero que la línea dura se divida en todas partes del archivo, excepto en las líneas que comienzan con $ (copias de las líneas de comando). Quiero que esos saltos de línea se inserten sobre la marcha, es decir, estableciendo el ancho de texto vairable (que he hecho específicamente para el tipo de archivo viki). Entonces, lo que sugieres no es exactamente lo que estaba buscando, ¡gracias de todos modos! – tospo

+0

OK, ahora lo entiendo. En este caso, debes considerar las otras respuestas. –

2

Creo que esto se reuniría con su búsqueda:

set textwidth=78 
v/^$/normal gq/^$\|\%$^M 

^M es ctrl-v seguido de enter

Permite descomponer esto en pedazos más pequeños

/^$\|\%$ es un patrón que coincide con cada línea que no comienza con $. El \%$ incluirá las líneas entre la última línea $ started y el final del archivo.

gq/^$\|\%$ formatos de la línea actual hasta el patrón /^$\|\%$

:normal {cmd} ejecuta un comando de modo normal en la línea actual.

:v/pattern/ es equivalente a :g!/pattern/ que ejecuta un comando en cada lote línea coincidente/patrón/

Esta solución no da formato a medida que escribe como una solución de asiento @Herbert hace. En su lugar formatea el texto de una sola vez al final.

Por supuesto podría aplicar esto antes de cada escritura con

au BufWritePre filename-pattern-here set textwidth=78 | v/^$/normal gq/^$\|\%$^M 
au BufWritePost filename-pattern-here set textwidth=0 
+0

gracias por la solución. Iré con Herbert simplemente porque prefiero que se apliquen estos saltos de línea mientras escribo, ¡pero gracias por la explicación! – tospo

Cuestiones relacionadas