Comment «couper» une chaîne dans Vim?

32

Supposons que vous exécutiez la pièce suivante de vimscript:

let @z = system("date")

Cela mettra une version chaîne de la date actuelle dans le registre z, mais la chaîne se terminera par une nouvelle ligne que je ne veux pas. Existe-t-il un moyen intégré (similaire à celui de Perl chomp) pour se débarrasser des nouvelles lignes de fin d'une chaîne?

Bdesham
la source

Réponses:

24

Vous pouvez utiliser substitute()ou définir une fonction:

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

Cette variante appellera systempour vous puis chompera le résultat:

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

(Cette fonction est également disponible dans mon plugin ingo-library en tant que ingo#system#Chomped.)

Ingo Karkat
la source
Cela fonctionne, mais pourquoi la callsyntaxe bizarre ? Pourquoi ne pas simplement donner Chompun paramètre appelé stringpuis passer a:stringà substitute?
bdesham
2
@bdesham Parce qu'il Chomp()passe tous les arguments auxquels il parvient, en supprimant le retour à system()la ligne de fin de sa sortie et en le retournant.
jamessan
Droite. system()a un {input}argument facultatif , et celui-ci gère l'un de ces derniers de manière générique. Si vous n'en avez pas besoin, faites-le simplement de la manière conventionnelle.
Ingo Karkat
25
let @z = systemlist('date')[0]

supprime la nouvelle ligne pour vous.

romainl
la source
Je pense que c'est probablement l'approche que j'utiliserai réellement, mais j'ai accepté l'autre réponse parce qu'elle est plus généralement applicable. (Par exemple, il supprimera les sauts de ligne de fin d'une chaîne multiligne tout en laissant les autres sauts de ligne seuls.)
bdesham
5
Notez que cela ne fonctionnera pas correctement pour les systèmes qui utilisent autre chose que \npour la nouvelle ligne. systemlist()supprime seulement le \n, pas n'importe lequel \r.
jamessan
4

Christian Brabandt a répertorié un certain nombre de méthodes différentes sur superuser.com.

J'aime celui-ci car il est court:

let @z = system("date")[:-2]
Joeytwiddle
la source
Je me demande comment il gère les \r\ntypes de terminaisons de ligne ...
x-yuri
@ x-yuri Cela vaut certainement la peine d'être vérifié Ne me citez pas à ce sujet, mais je pense que Vim-on-Windows normalisera ces fins de ligne \navant de les renvoyer.
joeytwiddle