Wie kann ich Text an die aktuelle Zeile anhängen?

8

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.

Plätzchen-Klopfer
quelle
In der Dokumentation ist eindeutig angegeben, dass der Ausdruck Foo () in diesem Fall als eine Zeile unter der angegebenen Zeile angehängt werden sollte. Es ist nicht mit dem normalen AModusbefehl zu verwechseln, der tatsächlich Text an die aktuelle Zeile anfügt.
Naumann
1
Schauen Sie sich an :help function-list, welche integrierten Funktionen verfügbar sind.
Antony

Antworten:

8

append()fügt mehrere Textzeilen unterhalb der als erstes Argument angegebenen Zeile ein. Dies steht im Einklang mit dem appendBefehl ex. Sie können beispielsweise :appendeingeben (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 Worten appendbedeutet 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:

call append(line('^'), [ '\documentclass[12pt]{article}'
\                      , '\begin{document}'])
call append(line('$'), '\end{document}')

Wo line('$')ist die letzte Zeile in der Datei und line('^')kehrt immer zurück 0(und ich hätte das stattdessen ohne Probleme schreiben können).

Um das Verhalten von Vims Aoder anderen Vim-Normalmodusbefehlen abzurufen, können Sie diese verwenden normal. Es Foo()kann etwas komplizierter sein, die Ausgabe von am Ende einer Zeile anzuzeigen, indem Sie Folgendes verwenden execute:

execute ':normal! A' . Foo()

Oder Sie können append verwenden und dann Folgendes ausführen J:

call append(line('.'), Foo())
normal! Jx

(Beachten Sie, dass dies xerforderlich ist, um den von generierten Speicherplatz zu entfernen. JDies funktioniert jedoch möglicherweise nicht wie erwartet, wenn die von generierte Zeichenfolge Foo()mit Leerzeichen beginnt.)

gro♀
quelle
5
setline()+ getline()ist eine weitere Option.
Antony
2
gJmacht die Verbindung ohne Leerzeichen
SergioAraujo
10

Die append()Funktion sollte vielleicht benannt worden sein appendline(): Sie hängt nur Zeilen an den Puffer an. Sie können damit keine vorhandenen Zeilen ändern.

Es ist wie mit der aFlagge zu fopen()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 einzustellen Coconuts:

:call setline('.', 'Coconuts')

Sie können verwenden getline(), um den Wert der aktuellen Zeile abzurufen. Um Coconutsan die Zeile anzuhängen , verwenden Sie Folgendes:

:call setline('.', getline('.') . 'Coconuts')

Sie können auch mehrere Zeilen mithilfe einer Liste festlegen (genau wie bei append()):

:call setline('.', ['Coconuts', 'Bananas'])

Um Text an mehrere Zeilen anzuhängen, müssen Sie eine forSchleife 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.

Martin Tournoij
quelle