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?

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


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.


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]

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.