คุณ“ chomp” สตริงใน Vim ได้อย่างไร?


32

สมมติว่าคุณใช้ vimscript ในส่วนต่อไปนี้:

let @z = system("date")

สิ่งนี้จะใส่สตริงของวันที่ปัจจุบันลงใน z register แต่สตริงจะลงท้ายด้วยการขึ้นบรรทัดใหม่ที่ฉันไม่ต้องการ มีวิธีการในตัว (คล้ายกับ Perl ของchomp) เพื่อกำจัดบรรทัดใหม่ต่อท้ายของสตริง?

คำตอบ:


24

คุณสามารถใช้substitute()หรือกำหนดฟังก์ชั่น:

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

ชุดตัวเลือกนี้จะโทรsystemหาคุณแล้วส่งผลให้:

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

(ฟังก์ชั่นนี้ยังมีอยู่ในของฉันปลั๊กอิน Ingo ห้องสมุดเป็นingo#system#Chomped.)


ใช้งานได้ แต่ทำไมcallไวยากรณ์แปลก ๆ ทำไมไม่ให้Chompพารามิเตอร์ที่เรียกว่าstringแล้วส่งa:stringไปที่substitute?
bdesham

2
@bdesham เพราะChomp()ผ่านการขัดแย้งอะไรก็ตามที่มันเกิดขึ้นให้system()ลอก newline ที่ต่อท้ายจากเอาท์พุทของมันกลับคืนมา
jamessan

ขวา. system()มี{input}อาร์กิวเมนต์ที่เป็นตัวเลือกและสิ่งนี้จะจัดการกับสิ่งเหล่านี้โดยทั่วไป หากคุณไม่ต้องการสิ่งนี้เพียงทำตามวิธีปกติ
Ingo Karkat

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

ลบบรรทัดใหม่สำหรับคุณ


ฉันคิดว่านี่อาจเป็นวิธีที่ฉันใช้จริง แต่ฉันยอมรับคำตอบอื่น ๆ เพราะมันใช้งานได้มากกว่าปกติ (ตัวอย่างเช่นมันจะลบบรรทัดใหม่ต่อท้ายออกจากสตริงหลายบรรทัดขณะที่ปล่อยบรรทัดใหม่อื่น ๆ อยู่คนเดียว)
bdesham

5
โปรดทราบว่าวิธีนี้ใช้ไม่ได้กับระบบที่ใช้อย่างอื่นที่ไม่ใช่\nnewline systemlist()ลบเฉพาะส่วนที่\nไม่ใช่\rออกเท่านั้น
jamessan

4

Christian Brabandt ได้ระบุวิธีการต่าง ๆไว้มากมายบน superuser.com

ฉันชอบอันนี้เพราะมันสั้น:

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

ฉันสงสัยว่ามันจัดการกับ\r\nชนิดของการสิ้นสุดบรรทัดได้อย่างไร ...
x-yuri

@ x-yuri นั่นคุ้มค่าที่จะตรวจสอบอย่าอ้างฉันเกี่ยวกับเรื่องนี้ แต่ฉันคิดว่า Vim-on-Windows จะทำให้บรรทัดสุดท้ายเหล่านั้นกลับสู่มาตรฐาน\nก่อนที่จะส่งคืน
joeytwiddle
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.