¿Cómo se "mastica" una cuerda en Vim?

32

Supongamos que ejecuta el siguiente fragmento de vimscript:

let @z = system("date")

Esto colocará una versión de cadena de la fecha actual en el registro z, pero la cadena terminará con una nueva línea que no quiero. ¿Existe una forma integrada (similar a la de Perl chomp) para deshacerse de las nuevas líneas finales de una cadena?

Bdesham
fuente

Respuestas:

24

Puede usar substitute()o definir una función:

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

Esta variante te llamará systemy luego morderá el resultado:

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

(Esta función también está disponible en mi complemento ingo-library como ingo#system#Chomped.)

Ingo Karkat
fuente
Esto funciona, pero ¿por qué la callsintaxis extraña ? ¿Por qué no simplemente dar Chompun parámetro llamado stringy luego pasar a:stringa substitute?
bdesham
2
@bdesham Porque Chomp()pasa todos los argumentos a los que llega system(), quitando la nueva línea final de su salida y devolviéndola.
jamessan
Correcto. system()tiene un {input}argumento opcional , y este maneja cualquiera de estos genéricamente. Si no necesita esto, simplemente hágalo de la manera convencional.
Ingo Karkat
25
let @z = systemlist('date')[0]

elimina la nueva línea por ti.

romainl
fuente
Creo que este es probablemente el enfoque que realmente usaré, pero acepté la otra respuesta porque es más generalmente aplicable. (Por ejemplo, eliminará las nuevas líneas finales de una cadena multilínea y dejará solo otras nuevas).
bdesham
55
Tenga en cuenta que esto no funcionará correctamente para los sistemas que usan algo más que \npara nueva línea. systemlist()solo elimina el \n, no ninguno \r.
jamessan
4

Christian Brabandt ha enumerado varios métodos diferentes en superuser.com.

Me gusta este porque es corto:

let @z = system("date")[:-2]
joeytwiddle
fuente
Me pregunto cómo maneja el \r\ntipo de terminaciones de línea ...
x-yuri
@ x-yuri Sin duda vale la pena comprobarlo. No me cite sobre esto, pero creo que Vim-on-Windows normalizará esas terminaciones de línea \nantes de devolverlas.
joeytwiddle