Bir ipi Vim'de nasıl “chomp” edersiniz?


32

Aşağıdaki vimscript parçasını çalıştırdığınızı varsayalım:

let @z = system("date")

Bu, geçerli tarihin bir string versiyonunu z registerına koyacaktır, fakat string, istemediğim yeni bir satırla bitecektir. chompİpin takip eden yeni hatlarından kurtulmak için yerleşik bir yöntem (Perl'inkilere benzer ) var mı?

Yanıtlar:


24

substitute()Bir işlev kullanabilir veya bir işlev tanımlayabilirsiniz:

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

Bu değişken systemsizin için arayacak ve daha sonra sonucu aktaracaktır :

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

(Bu işlev aynı zamanda ingo-kitaplık eklentimde de mevcuttur ingo#system#Chomped.)


Bu işe yarar, ama neden garip callsözdizimi? Neden sadece Chompdenilen bir parametreyi verip stringsonra geçmiyorsunuz ? a:stringsubstitute
bdesham

2
@bdesham Çünkü Chomp()ne olursa olsun argümanları geçiyor system(), izleyen yeni satırı çıktısından çıkartarak geri veriyor.
jamessan

Sağ. system()isteğe bağlı bir {input}argüman var ve bu, bunların herhangi birini genel olarak ele alıyor. Buna ihtiyacınız yoksa, sadece geleneksel şekilde yapın.
Ingo Karkat

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

newline'ı sizin için kaldırır.


Sanırım gerçekten kullanacağım yaklaşım bu, ancak diğer cevabı kabul ettim çünkü daha genel olarak uygulanabilir. (Örneğin, izleyen yeni satırları çok satırlı bir dizgeden kaldıracak ve diğer satırları yalnız bırakacaktır.)
bdesham

5
Bunun, \nnewline dışında bir şey kullanan sistemler için doğru çalışmayacağını unutmayın . systemlist()sadece \n, hiçbiri kaldırmaz \r.
jamessan

4

Christian Brabandt, superuser.com adresinde birkaç farklı yöntem listelemiştir .

Bunu beğendim çünkü kısa.

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

Nasıl bittiğini merak ediyorum \r\n...
x-yuri

@ x-yuri Bu kesinlikle kontrol etmeye değer Bu konuda bana alıntı yapmayın, ancak Vim-on-Windows'un bu satır sonlarını döndürmeden önce normalleştireceğini düşünüyorum\n .
joeytwiddle
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.