2010-08-13 9 views
20

En nuestra base de código C++ guardamos 99 líneas de columnas pero comentarios de líneas múltiples de 79 columnas. ¿Hay una buena estrategia para hacer esto automágicamente? Supongo que los modos ya son conocidos debido a la unión de línea de comentario inteligente y la inserción * leading.Vim ancho de texto diferente para comentarios C multilínea?

+0

Puede establecer un 'formatexpr' personalizado o' formatprg', sin embargo, esto requerirá escribir un complemento vim o un programador de formateador externo, consulte la ayuda para obtener más información. No conozco ningún complemento que pueda hacer esto por usted, pero no estoy seguro de que no existan. – ZyX

+0

¿Le importaría publicar código de muestra o proporcionar un enlace con el código que desea formatear? Sin promesas, pero podría escribir un programa de formateo simple. –

+0

@molecules: No estoy buscando un programa de formateo, algo que automáticamente sepa que mi ancho de texto es 79 en lugar de los 99 normales cuando estoy escribiendo dentro de un comentario de varias líneas. – cdleary

Respuesta

15

Aparentemente, tanto el código como los comentarios usan la misma opción textwidth. Por lo que yo puedo ver, el único truco es configurar esta opción de forma dinámica:

:autocmd CursorMoved,CursorMovedI * :if match(getline(.), '^\s*\*') == 0 | :setlocal textwidth=79 | :else | :setlocal textwidth=99 | :endif 

Aquí la parte crítica está detectando cuando estamos en un comentario. Si sólo se formatea los comentarios de esta manera:

/* 
* my comment 
*/ 

mi expresión regular debería funcionar ... a menos que tenga líneas en el código que empieza con * (que supongo que puede suceder en C, con menor frecuencia en C++). Si utiliza comentarios como este:

// comment line 1 
// comment line 2 

la expresión regular es aún más fácil de escribir. Si desea cubrir todas las situaciones posibles, incluidos los casos de esquina, bueno ... supongo que lo mejor sería definir una función de detección por separado y llamarla desde el :autocmd en lugar de match().

+0

+1, habría publicado una proposición similar, pero hubiera sido idéntica a esta. – progo

+0

¿Qué tipo de impacto tiene esto en el rendimiento? Si estoy SSHed en un servidor, ¿podría esto aumentar notablemente mi latencia? –

+0

No será @Kazark, toda la lógica se realiza dentro de Vim (es decir, en el lado del servidor). Habiendo dicho eso, afectará el rendimiento de la misma manera que se ve afectado si lo estuviera usando localmente (es decir, no a través de SSH) –

1

Me encontré con este mismo problema y creo que he encontrado una solución adecuada.

Lo que quería que mis comentarios envuelvan palabras para que cuando estoy escribiendo no tenga que preocuparme por formatear el texto. Esto funciona bien con el texto de comentarios. Pero no me sentía cómodo con tener el formato vim de mi código. Así que quería que vim resaltara todo en rojo después de la columna x.

Para hacer esto con solo código cpp, agregaría lo siguiente a su archivo ~/.vim/ftdetect/cpp.vim.

set textwidth=79 
match ErrorMsg '\%>99v.\+' 

Nota: Puede que tenga que crear el archivo y las carpetas si no existen.

Si tiene problemas con esta asegurarse de que tiene formatoptions establecidos a:

formatoptions=croql 

se puede ver la siguiente orden: formatoptions conjunto dentro de vim.

+0

Lo siento, pero no, esta es la misma solución que obtuve a esta pregunta que hice: http://stackoverflow.com/questions/235439/ Resaltar basura por todas partes es mucho menos refinado de lo que esperaba. – cdleary

Cuestiones relacionadas