Respuestas:
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 UltiSnips
directorio en tu .vim
o _vimfiles
directorio. En él, coloque un c.snippet
archivo 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 A
que indica al final de la primera línea. Pague :help UltiSnips-syntax
para 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.
Una forma sería crear un archivo que contenga este fragmento y leerlo cuando escriba ///
.
Por ejemplo, cree que ~/.vim/snippets/my_header.snip
contiene 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.
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 strftime
dependen de su plataforma, si no está en Windows y no funciona, entonces man strftime
deberá 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
.