Antworten:
Die Methode in meiner früheren Antwort lässt sich nicht gut in dynamischen Inhalt umwandeln. Hier kommen Snippet-Plugins wie UltiSnips und SnipMate ins Spiel. Ich werde hier eine Demo von UltiSnips bereitstellen . Installieren Sie es mit Ihrer bevorzugten Methode von Wie installiere ich ein Plugin in vim / vi?
Erstellen Sie nun ein UltiSnips
Verzeichnis in Ihrem .vim
oder _vimfiles
Verzeichnis. Platzieren Sie darin eine c.snippet
Datei mit:
snippet /// "My header" A
/*!
* @author Robbie Yi JIANG, `date +'%d-%b-%Y %T'`
*
*
*/
endsnippet
Wenn Sie nun eine C-Datei öffnen und eingeben ///
, sollte diese automatisch durch den Header ersetzt werden, einschließlich des aktuellen Datums und der aktuellen Uhrzeit. Das ist es!
Normalerweise fügt UltiSnips beim Drücken ein Snippet ein Tab. Hier haben wir festgelegt, dass das Snippet automatisch eingegeben werden soll - das zeigt das A
am Ende der ersten Zeile an. :help UltiSnips-syntax
Weitere Informationen zum Schreiben von Snippets finden Sie an der Kasse .
Die meisten Leute beginnen jedoch mit einer Sammlung von Schnipsel, wie z vim-snippets
. Es gibt zu viele, um sie hier zu beschreiben, aber Sie könnten einige davon sehr nützlich finden.
Eine Möglichkeit wäre, eine Datei mit diesem Snippet zu erstellen und diese bei der Eingabe zu lesen ///
.
Erstellen Sie beispielsweise ~/.vim/snippets/my_header.snip
mit diesem Header. Definieren Sie dann diese Zuordnung:
inoremap /// <esc>:r ~/.vim/snippets/my_header.snip<cr>i
Oder:
inoremap /// <esc>:call append(line('.')-1, readfile(expand('~/.vim/snippets/my_header.snip')))<cr>i
In der ersten Zuordnung wird Ihr Cursor in die erste Zeile des eingefügten Textes gesetzt. und im zweiten wird der Cursor unter dem eingefügten Text platziert.
Das vielleicht einfachste Mapping in Bezug auf das Herumspringen ist:
inoremap /// <c-r><c-o>=readfile(expand('~/.vim/snippets/my_header.snip'))<cr>
Für eine allgemeinere Verwendung sollten Sie sich Snippet-Plugins ansehen. UltiSnips und SnipMate sind zwei beliebte. Ich benutze es auch nicht, daher werde ich es nicht empfehlen.
Schreiben Sie eine Funktion, die den String zurückgibt, und rufen Sie ihn auf.
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>$
Die Details von strftime
hängen von Ihrer Plattform ab. Wenn Sie nicht unter Windows arbeiten und es nicht funktioniert, müssen Sie man strftime
die Argumente herausfinden.
Dies funktioniert im Einfügemodus, macht aber seltsame Dinge bei der Verarbeitung von Schrägstrichen. Wenn Sie //
Kommentare im C ++ - Stil ausführen, wird der zweite Schrägstrich erst ausgegeben, wenn Sie ein Leerzeichen oder etwas danach eingeben.
Das <C-R>=
fügt einen Ausdruck an der Cursorposition ein. Das InsertHeader()<Enter>
Bit ist der Ausdruck, der ausgewertet wird. Ich baue die Zeichenfolge Zeile für Zeile in der Funktion auf, .
ist die Zeichenfolgenverkettung und \
das Zeilenfortsetzungszeichen (wobei die Fortsetzung "Kombiniere dies mit der vorherigen Zeile" sagt, im Gegensatz dazu, wie C und seine Familie dies tun). Schließlich zwei <C-O>
Operationen, eine, um zwei Zeilen nach oben zu bewegen, und eine, um an das Ende der Zeile zu gelangen, wo vermutlich ein Dateikommentar eingegeben wird; Beachten Sie das Leerzeichen am Ende der Zeichenfolge in der vierten Zeile von l:header
.