Wie kann man eine Saite in Vim "chompen"?

32

Angenommen, Sie führen das folgende Vimscript aus:

let @z = system("date")

Dadurch wird eine String-Version des aktuellen Datums in das z-Register eingefügt, die Zeichenfolge endet jedoch mit einem Zeilenumbruch, den ich nicht möchte. Gibt es eine integrierte Möglichkeit (ähnlich wie bei Perl chomp), um die nachgestellten Zeilenumbrüche einer Zeichenfolge zu beseitigen?

bdesham
quelle

Antworten:

24

Sie können substitute()eine Funktion verwenden oder definieren:

function! Chomp(string)
    return substitute(a:string, '\n\+$', '', '')
endfunction

Diese Variante wird systemfür Sie anrufen und dann das Ergebnis berechnen:

function! ChompedSystem( ... )
    return substitute(call('system', a:000), '\n\+$', '', '')
endfunction

(Diese Funktion ist auch in meinem ingo-library Plugin als verfügbar ingo#system#Chomped.)

Ingo Karkat
quelle
Das funktioniert, aber warum die seltsame callSyntax? Warum nicht einfach Chompeinen Parameter mit dem Namen angeben stringund a:stringan übergeben substitute?
Bdesham
2
@bdesham Weil Chomp()es alle Argumente übergibt, die es verarbeitet system(), die nachgestellte Zeile aus der Ausgabe entfernt und diese zurückgibt.
Jamessan
Recht. system()hat ein optionales {input}Argument, und dieses behandelt alle diese generisch. Wenn Sie dies nicht benötigen, tun Sie es einfach auf herkömmliche Weise.
Ingo Karkat
25
let @z = systemlist('date')[0]

Entfernt den Zeilenumbruch für Sie.

romainl
quelle
Ich denke, das ist wahrscheinlich der Ansatz, den ich tatsächlich verwenden werde, aber ich habe die andere Antwort akzeptiert, weil sie allgemeiner anwendbar ist. (Beispielsweise werden abschließende Zeilenumbrüche aus einer mehrzeiligen Zeichenfolge entfernt, während andere Zeilenumbrüche in Ruhe gelassen werden.)
bdesham
5
Beachten Sie, dass dies bei Systemen, die etwas anderes als \nNewline verwenden, nicht korrekt funktioniert. systemlist()entfernt nur die \n, keine \r.
Jamessan
4

Christian Brabandt hat eine Reihe verschiedener Methoden auf superuser.com aufgelistet .

Ich mag dieses, weil es kurz ist:

let @z = system("date")[:-2]
joeytwiddle
quelle
Ich frage mich, wie es \r\nArt der Zeilenenden behandelt ...
X-Yuri
@ x-yuri Das ist auf jeden Fall eine Prüfung wert Zitiere mich nicht dazu, aber ich denke, Vim-on-Windows wird diese Zeilenenden normalisieren, \nbevor es sie zurückgibt.
Joeytwiddle