Wie kann ich einen // Kommentarbereich mit /// wie in XCode erstellen?

8

In XCode gibt es ein Add-On namens vvdocument, das drei /Treffer erkennen und übertragen kann ///in:

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

Wie kann ich das in Vim machen?

Yi Jiang
quelle

Antworten:

9

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 UltiSnipsVerzeichnis in Ihrem .vimoder _vimfilesVerzeichnis. Platzieren Sie darin eine c.snippetDatei 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 Aam Ende der ersten Zeile an. :help UltiSnips-syntaxWeitere 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.

muru
quelle
3
+1 für Ultisnips. Sie können auch Sprungpositionen und Standardpositionen für Ihren Cursor angeben, nachdem Sie ein Snippet erweitert haben.
Fruglemonkey
6

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.snipmit 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.

muru
quelle
3

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 strftimehängen von Ihrer Plattform ab. Wenn Sie nicht unter Windows arbeiten und es nicht funktioniert, müssen Sie man strftimedie 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.

Dash-Tom-Bang
quelle