Risposte:
Il metodo nella mia risposta precedente non si trasforma bene in contenuto dinamico. È qui che entrano in gioco plugin di frammenti come UltiSnips e SnipMate. Qui fornirò una demo di UltiSnips . Installalo usando il tuo metodo preferito da Come posso installare un plugin in vim / vi?
Ora, crea una UltiSnips
directory nella tua .vim
o _vimfiles
directory. In esso, inserire un c.snippet
file contenente:
snippet /// "My header" A
/*!
* @author Robbie Yi JIANG, `date +'%d-%b-%Y %T'`
*
*
*/
endsnippet
Ora, se apri un file C e digiti ///
, dovrebbe essere sostituito automaticamente con l'intestazione, inclusa la data e l'ora correnti. Questo è tutto!
Di solito, UltiSnips inserisce uno snippet quando si preme Tab. Qui, abbiamo specificato che lo snippet deve essere inserito automaticamente - questo è ciò A
che indica alla fine della prima riga. Checkout :help UltiSnips-syntax
per ulteriori informazioni sulla scrittura di frammenti.
La maggior parte delle persone, tuttavia, inizia con una raccolta di frammenti, come ad esempio vim-snippets
. Ce ne sono troppi da descrivere qui, ma alcuni potrebbero essere molto utili.
Un modo sarebbe quello di creare un file contenente questo frammento e leggerlo durante la digitazione ///
.
Ad esempio, creare ~/.vim/snippets/my_header.snip
contenente questa intestazione. Quindi definire questo mapping:
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
Nella prima mappatura, il cursore verrà posizionato sulla prima riga del testo inserito; e nel secondo, il cursore verrà posizionato sotto il testo inserito.
Forse la mappatura più semplice, in termini di saltare le modalità, è:
inoremap /// <c-r><c-o>=readfile(expand('~/.vim/snippets/my_header.snip'))<cr>
Per un utilizzo più generale, potresti voler esaminare i plug-in dei frammenti. UltiSnips e SnipMate sono due popolari. Nemmeno io uso, quindi non lo consiglio.
Scrivi una funzione che restituisce la stringa e chiamala.
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>$
I dettagli di strftime
dipendono dalla tua piattaforma, se non sei su Windows e non funziona, dovrai man strftime
capire gli argomenti.
Funziona in modalità insert ma fa cose strane per l'elaborazione in avanti. Se stai facendo //
commenti in stile C ++ , la seconda barra non uscirà finché non digiti uno spazio o qualcosa dopo.
La <C-R>=
inserisce un'espressione nella posizione del cursore. Il InsertHeader()<Enter>
bit è l'espressione che viene valutata. Costruisco la stringa riga per riga nella funzione, .
è la concatenazione di stringhe ed \
è il carattere di continuazione della riga (dove la continuazione dice "combina questo con la riga precedente", in contrasto con il modo in cui C e la sua famiglia lo fanno). Infine, due <C-O>
operazioni, una per spostarsi di due righe in alto e una per spostarsi alla fine della riga, dove presumibilmente verrà inserito un commento di file; notare lo spazio alla fine della stringa nella quarta riga di l:header
.