Come si "spezza" una stringa in Vim?


32

Supponiamo di eseguire il seguente pezzo di vimscript:

let @z = system("date")

Ciò inserirà una versione di stringa della data corrente nel registro z, ma la stringa terminerà con una nuova riga che non desidero. Esiste un modo integrato (simile a quello di Perl chomp) per sbarazzarsi delle newline finali di una stringa?

Risposte:


24

È possibile utilizzare substitute()o definire una funzione:

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

Questa variante ti chiamerà systeme poi troncerà il risultato:

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

(Questa funzione è disponibile anche nel mio plugin ingo-library come ingo#system#Chomped.)


Funziona, ma perché la strana callsintassi? Perché non dare semplicemente Chompun parametro chiamato stringe poi passare a:stringa substitute?
bdesham,

2
@bdesham Perché Chomp()sta trasmettendo qualsiasi argomento accada system(), togliendo la nuova riga finale dal suo output e restituendola.
Jamessan,

Destra. system()ha un {input}argomento facoltativo e questo gestisce uno di questi genericamente. Se non ti serve, fallo nel modo convenzionale.
Ingo Karkat,

25
let @z = systemlist('date')[0]

rimuove la nuova riga per te.


Penso che questo sia probabilmente l'approccio che userò effettivamente, ma ho accettato l'altra risposta perché è più generalmente applicabile. (Ad esempio, rimuoverà le nuove righe finali da una stringa multilinea lasciando altre righe nuove da sole.)
bdesham

5
Si noti che questo non funzionerà correttamente per i sistemi che usano qualcosa di diverso da quello \ndi Newline. systemlist()rimuove solo il \n, non nessuno \r.
Jamessan,

4

Christian Brabandt ha elencato diversi metodi su superuser.com.

Mi piace questo perché è breve:

let @z = system("date")[:-2]

Mi chiedo come gestisce il \r\ntipo di terminazioni di linea ...
x-yuri

@ x-yuri Vale sicuramente la pena di controllarlo Non citarmi su questo, ma penso che Vim-on-Windows normalizzerà quei terminali \nprima di restituirli.
joeytwiddle,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.