Jak „chomp” ciąg znaków w Vimie?

32

Załóżmy, że uruchamiasz następujący fragment vimscript:

let @z = system("date")

Spowoduje to umieszczenie wersji rejestru bieżącej daty w rejestrze Z, ale ciąg zakończy się nową linią, której nie chcę. Czy istnieje wbudowany sposób (podobny do Perla chomp), aby pozbyć się nowych linii ciągu?

bdesham
źródło

Odpowiedzi:

24

Możesz użyć substitute()lub zdefiniować funkcję:

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

Ten wariant zadzwoni systempo ciebie, a następnie odczeka wynik:

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

(Ta funkcja jest również dostępna w mojej wtyczce ingo-library as ingo#system#Chomped.)

Ingo Karkat
źródło
To działa, ale dlaczego ta dziwna callskładnia? Dlaczego nie podać Chompparametru o nazwie, stringa następnie przejść a:stringdo substitute?
bdesham,
2
@bdesham Ponieważ Chomp()przekazuje wszelkie argumenty, do których się dochodzi system(), usuwając końcowy znak nowej linii z jego wyniku i zwracając to.
jamessan,
Dobrze. system()ma opcjonalny {input}argument, który obsługuje ogólnie dowolny z nich. Jeśli nie potrzebujesz tego, po prostu zrób to w tradycyjny sposób.
Ingo Karkat
25
let @z = systemlist('date')[0]

usuwa dla ciebie nowy wiersz.

romainl
źródło
Myślę, że jest to prawdopodobnie podejście, którego faktycznie użyję, ale zaakceptowałem inną odpowiedź, ponieważ ma ona bardziej ogólne zastosowanie. (Na przykład usunie końcowe znaki nowej linii z ciągu wielowierszowego, pozostawiając inne nowe
znaki w
5
Zauważ, że to nie zadziała poprawnie w systemach, które używają czegoś innego niż \nnowa linia. systemlist()usuwa tylko \n, nie żadnych \r.
jamessan
4

Christian Brabandt wymienił wiele różnych metod na superuser.com.

Podoba mi się ten, ponieważ jest krótki:

let @z = system("date")[:-2]
joeytwiddle
źródło
Zastanawiam się, jak radzi sobie z \r\ntypem zakończeń linii ...
x-yuri,
@ x-yuri Z pewnością warto to sprawdzić Nie cytuj mnie, ale myślę, że Vim-on-Windows znormalizuje te zakończenia linii \nprzed ich zwróceniem.
joeytwiddle