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?

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


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.


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]

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.