Bagaimana Anda "chomp" string di Vim?


32

Misalkan Anda menjalankan vimscript berikut:

let @z = system("date")

Ini akan memasukkan versi string dari tanggal saat ini ke dalam register z, tetapi string akan diakhiri dengan baris baru yang tidak saya inginkan. Apakah ada cara built-in (mirip dengan Perl chomp) untuk menghilangkan baris baru string?

Jawaban:


24

Anda dapat menggunakan substitute(), atau mendefinisikan suatu fungsi:

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

Varian ini akan memanggil systemAnda dan kemudian mengejar hasilnya:

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

(Fungsi ini juga tersedia dalam saya Plugin ingo-perpustakaan sebagai ingo#system#Chomped.)


Ini bekerja, tetapi mengapa callsintaks aneh ? Mengapa tidak memberikan Chompparameter yang dipanggil stringlalu beralih a:stringke substitute?
bdesham

2
@bdesham Karena Chomp()meneruskan argumen apa pun yang diterimanya, menghapus system()garis baru yang tertinggal dari outputnya, dan mengembalikannya.
jamessan

Kanan. system()memiliki {input}argumen opsional , dan ini menangani semua ini secara umum. Jika Anda tidak membutuhkan ini, lakukan saja dengan cara konvensional.
Ingo Karkat

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

menghapus baris baru untuk Anda.


Saya pikir ini mungkin pendekatan yang akan saya gunakan, tetapi saya menerima jawaban yang lain karena lebih umum berlaku. (Misalnya, ini akan menghapus baris baru dari string multiline sambil meninggalkan baris baru lainnya.)
bdesham

5
Perhatikan bahwa ini tidak akan berfungsi dengan benar untuk sistem yang menggunakan sesuatu selain \nuntuk baris baru. systemlist()hanya menghapus \n, tidak ada \r.
jamessan

4

Christian Brabandt telah mendaftarkan sejumlah metode berbeda di superuser.com.

Saya suka yang ini karena pendek:

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

Saya bertanya-tanya bagaimana ini menangani \r\njenis akhir baris ...
x-yuri

@ x-yuri Itu tentu patut dicoba. Jangan mengutip saya tentang ini, tapi saya pikir Vim-on-Windows akan menormalkan akhir-akhir \nsebelum kembali.
joeytwiddle
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.