Ich versuche gerade, Vimscript herauszufinden und bin auf die append()
Funktion gestoßen . In der Dokumentation heißt es, dass Sie die Zeile angeben können, an die ein Ausdruck angehängt werden soll. Deshalb habe ich versucht:
:call append(line('.'), Foo())
Foo()
gibt eine Zeichenfolge zurück.
Das Seltsame ist, dass die Zeichenfolge an die nächste Zeile nach meiner aktuellen angehängt wird. Also habe ich versucht line('.') - 1
, nur um zu sehen, dass es an die Zeile über der aktuellen angehängt wird.
Ich bin in diesem Moment erstaunt, verwirrt und sprachlos.
Hoffe, jemand kann etwas Licht ins Dunkel bringen.
A
Modusbefehl zu verwechseln, der tatsächlich Text an die aktuelle Zeile anfügt.:help function-list
, welche integrierten Funktionen verfügbar sind.Antworten:
append()
fügt mehrere Textzeilen unterhalb der als erstes Argument angegebenen Zeile ein. Dies steht im Einklang mit demappend
Befehl ex. Sie können beispielsweise:append
eingeben (und in den Ex-Modus wechseln), dann mehrere Textzeilen schreiben und den Ex-Modus beenden (indem Sie<c-c>
beispielsweise drücken ). Die Zeilen werden nach der Zeile angezeigt, auf der sich Ihr Cursor befindet. Mit anderen Wortenappend
bedeutet der Befehl: Hänge die Textzeilen an, die ich unter die aktuelle schreibe.Die VimScript-Funktion
append()
ermöglicht Zeilenspezifizierer, was sie nützlicher macht als den Befehl ex. Nützliche Dinge, die häufig vorkommen, sind Möglichkeiten, Textstücke am Anfang und Ende einer Datei einzufügen. zB für LaTeX kann dies nützlich sein:Wo
line('$')
ist die letzte Zeile in der Datei undline('^')
kehrt immer zurück0
(und ich hätte das stattdessen ohne Probleme schreiben können).Um das Verhalten von Vims
A
oder anderen Vim-Normalmodusbefehlen abzurufen, können Sie diese verwendennormal
. EsFoo()
kann etwas komplizierter sein, die Ausgabe von am Ende einer Zeile anzuzeigen, indem Sie Folgendes verwendenexecute
:Oder Sie können append verwenden und dann Folgendes ausführen
J
:(Beachten Sie, dass dies
x
erforderlich ist, um den von generierten Speicherplatz zu entfernen.J
Dies funktioniert jedoch möglicherweise nicht wie erwartet, wenn die von generierte ZeichenfolgeFoo()
mit Leerzeichen beginnt.)quelle
setline()
+getline()
ist eine weitere Option.gJ
macht die Verbindung ohne LeerzeichenDie
append()
Funktion sollte vielleicht benannt worden seinappendline()
: Sie hängt nur Zeilen an den Puffer an. Sie können damit keine vorhandenen Zeilen ändern.Es ist wie mit der
a
Flagge zufopen()
oder>>
in der Shell.Wenn Sie den Wert vorhandener Zeilen festlegen möchten, können Sie dies am einfachsten über VimScript tun
setline()
. Zum Beispiel, um die aktuelle Zeile auf Folgendes einzustellenCoconuts
:Sie können verwenden
getline()
, um den Wert der aktuellen Zeile abzurufen. UmCoconuts
an die Zeile anzuhängen , verwenden Sie Folgendes:Sie können auch mehrere Zeilen mithilfe einer Liste festlegen (genau wie bei
append()
):Um Text an mehrere Zeilen anzuhängen, müssen Sie eine
for
Schleife verwenden.Beachten Sie, dass dies nicht der einzige Weg ist. Andere Möglichkeiten wären, die Antwort von
:substitute
(z. B.:s/$/\=Foo()/
) oder gro♀ zu verwenden . Der "beste" Weg hängt vom Kontext ab, in dem Sie ihn verwenden, sowie von Ihren persönlichen Vorlieben.quelle