¿Cómo puedo crear una sección de comentarios * con /// like en XCode?

8

En XCode, hay un complemento llamado vvdocument, que puede detectar tres /hits y transferirlos ///a:

/*!
*  @author Robbie Yi JIANG, 29-Jan-2016 14:01:45
*
*  
*/

¿Cómo puedo hacer esto en Vim?

Yi Jiang
fuente

Respuestas:

9

El método en mi respuesta anterior no se transforma bien en contenido dinámico. Aquí es donde entran los complementos de fragmentos como UltiSnips y SnipMate. Aquí proporcionaré una demostración de UltiSnips . Instálelo usando su método favorito de ¿Cómo instalo un complemento en vim / vi?

Ahora, crea un UltiSnipsdirectorio en tu .vimo _vimfilesdirectorio. En él, coloque un c.snippetarchivo que contenga:

snippet /// "My header" A
/*!
*  @author Robbie Yi JIANG, `date +'%d-%b-%Y %T'`
*
*  
*/
endsnippet

Ahora, si abre un archivo C y escribe ///, debería reemplazarse automáticamente con el encabezado, incluida la fecha y hora actuales. ¡Eso es!

Por lo general, UltiSnips inserta un fragmento cuando presiona Tab. Aquí, hemos especificado que el fragmento debe ingresarse automáticamente, eso es lo Aque indica al final de la primera línea. Pague :help UltiSnips-syntaxpara obtener más información sobre cómo escribir fragmentos.

La mayoría de las personas, sin embargo, comienzan con una colección de fragmentos, como vim-snippets. Hay demasiados para describir aquí, pero puede que algunos de ellos sean muy útiles.

muru
fuente
3
+1 para Ultisnips. También puede especificar ubicaciones de salto y ubicaciones predeterminadas para su cursor después de expandir un fragmento.
fruglemonkey
6

Una forma sería crear un archivo que contenga este fragmento y leerlo cuando escriba ///.

Por ejemplo, cree que ~/.vim/snippets/my_header.snipcontiene este encabezado. Luego defina este mapeo:

inoremap /// <esc>:r ~/.vim/snippets/my_header.snip<cr>i

O:

inoremap /// <esc>:call append(line('.')-1, readfile(expand('~/.vim/snippets/my_header.snip')))<cr>i

En la primera asignación, su cursor se colocará en la primera línea del texto insertado; y en el segundo, el cursor se colocará debajo del texto insertado.

Quizás el mapeo más simple, en términos de saltar modos, es:

inoremap /// <c-r><c-o>=readfile(expand('~/.vim/snippets/my_header.snip'))<cr>

Para un uso más general, es posible que desee buscar complementos de fragmentos. UltiSnips y SnipMate son dos populares. Yo tampoco lo uso, así que no recomendaré uno.

muru
fuente
3

Escriba una función que devuelva la cadena y llámela.

function! InsertHeader()
    let l:header = "/*!\n"
                \. "* @author Robbie Yi JIANG, " . strftime('%d-%b-%Y %H:%M:%S') . "\n"
                \. "*\n"
                \. "* \n"
                \. "*/\n"
    return l:header
endfunction

inoremap /// <C-R>=InsertHeader()<Enter><C-O>2k<C-O>$

Los detalles de strftimedependen de su plataforma, si no está en Windows y no funciona, entonces man strftimedeberá resolver los argumentos.

Esto funciona en modo de inserción, pero hace cosas extrañas para el procesamiento de barra diagonal. Si está haciendo //comentarios de estilo C ++ , la segunda barra no aparecerá hasta que escriba un espacio o algo después.

El <C-R>=inserta una expresión en la posición del cursor. El InsertHeader()<Enter>bit es la expresión que se evalúa. Construyo la cadena línea por línea en la función, .es la concatenación de cadenas y \es el carácter de continuación de línea (donde la continuación dice "combinar esto con la línea anterior", en contraste con cómo C y su familia lo hacen). Finalmente, dos <C-O>operaciones, una para subir dos líneas y otra para ir al final de la línea donde presumiblemente se ingresará un comentario de archivo; observe el espacio al final de la cadena en la cuarta línea de l:header.

dash-tom-bang
fuente