¿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?

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


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.


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]

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.