Como você "chomp" uma string no Vim?

32

Suponha que você execute a seguinte parte do vimscript:

let @z = system("date")

Isso colocará uma versão em cadeia da data atual no registro z, mas a cadeia terminará com uma nova linha que eu não quero. Existe uma maneira embutida (semelhante à do Perl chomp) de livrar-se das novas linhas finais de uma string?

Bdesham
fonte

Respostas:

24

Você pode usar substitute()ou definir uma função:

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

Essa variante chama systempor você e depois chomp o resultado:

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

(Esta função também está disponível no meu plugin ingo-library como ingo#system#Chomped.)

Ingo Karkat
fonte
Isso funciona, mas por que a callsintaxe estranha ? Por que não dar Chompum parâmetro chamado stringe depois passar a:stringpara substitute?
bdesham
2
@bdesham Porque Chomp()está passando os argumentos a que se dedica, retira system()a nova linha à direita de sua saída e retorna isso.
jamessan
Direita. system()possui um {input}argumento opcional , e isso lida com qualquer um deles genericamente. Se você não precisar disso, faça da maneira convencional.
Ingo Karkat
25
let @z = systemlist('date')[0]

remove a nova linha para você.

romainl
fonte
Acho que essa é provavelmente a abordagem que realmente utilizarei, mas aceitei a outra resposta porque é mais aplicável em geral. (Por exemplo, é possível remover arrastando novas linhas a partir de uma cadeia de várias linhas, deixando outras novas linhas sozinho.)
bdesham
5
Observe que isso não funcionará corretamente para sistemas que usam algo diferente de \nnova linha. systemlist()remove apenas o \n, não nenhum \r.
jamessan
4

Christian Brabandt listou vários métodos diferentes no superuser.com.

Eu gosto deste porque é curto:

let @z = system("date")[:-2]
joeytwiddle
fonte
Gostaria de saber como ele lida com o \r\ntipo de terminações de linha ...
x-yuri 16/11
@ x-yuri Isso certamente vale a pena conferir Não me cite, mas acho que o Vim-no-Windows normalizará essas terminações de linha \nantes de devolvê-las.
Joeytwiddle