Respostas:
O método na minha resposta anterior não se transforma bem em conteúdo dinâmico. É aqui que entram os plug-ins de trechos como UltiSnips e SnipMate. Vou fornecer uma demonstração do UltiSnips aqui. Instale-o usando seu método favorito em Como instalar um plug-in no vim / vi?
Agora, crie um UltiSnips
diretório no seu diretório .vim
ou _vimfiles
. Nele, coloque um c.snippet
arquivo contendo:
snippet /// "My header" A
/*!
* @author Robbie Yi JIANG, `date +'%d-%b-%Y %T'`
*
*
*/
endsnippet
Agora, se você abrir um arquivo C e digitar ///
, ele deverá ser substituído automaticamente pelo cabeçalho, incluindo a data e a hora atuais. É isso aí!
Normalmente, o UltiSnips insere um trecho quando você pressiona Tab. Aqui, especificamos que o snippet deve ser inserido automaticamente - é o que A
indica no final da primeira linha. Confira :help UltiSnips-syntax
mais informações sobre como escrever snippets.
A maioria das pessoas, no entanto, começa com uma coleção de trechos, como vim-snippets
. Há muitos para descrever aqui, mas alguns deles podem ser muito úteis.
Uma maneira seria criar um arquivo contendo esse trecho e lê-lo quando você digita ///
.
Por exemplo, crie ~/.vim/snippets/my_header.snip
contendo esse cabeçalho. Em seguida, defina este mapeamento:
inoremap /// <esc>:r ~/.vim/snippets/my_header.snip<cr>i
Ou:
inoremap /// <esc>:call append(line('.')-1, readfile(expand('~/.vim/snippets/my_header.snip')))<cr>i
No primeiro mapeamento, seu cursor será colocado na primeira linha do texto inserido; e no segundo, o cursor será colocado abaixo do texto inserido.
Talvez o mapeamento mais simples, em termos de alternância de modos, seja:
inoremap /// <c-r><c-o>=readfile(expand('~/.vim/snippets/my_header.snip'))<cr>
Para uso mais geral, convém procurar plug-ins de trechos. UltiSnips e SnipMate são dois populares. Eu também não uso, então não vou recomendar um.
Escreva uma função que retorne a string e chame-a.
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>$
Os detalhes strftime
dependem da sua plataforma, se você não estiver no Windows e não estiver funcionando, será necessário man strftime
descobrir os argumentos.
Isso funciona no modo de inserção, mas faz coisas estranhas no processamento da barra. Se você estiver fazendo //
comentários no estilo C ++ , a segunda barra não será exibida até que você digite um espaço ou algo depois dela.
O <C-R>=
insere uma expressão na posição do cursor. O InsertHeader()<Enter>
bit é a expressão que é avaliada. Eu construo a string linha por linha na função, .
é concatenação de string e \
é o caractere de continuação de linha (onde continuation diz "combine isso com a linha anterior", em contraste com o modo como C e sua família o fazem). Finalmente, duas <C-O>
operações, uma para subir duas linhas e outra para o final da linha, onde presumivelmente um comentário de arquivo será inserido; observe o espaço no final da string na quarta linha de l:header
.