ทำการแยกวิเคราะห์ด้วยตัวคุณเอง
หากคุณใช้:help <q-args>คุณจะได้รับสตริงที่ยกมาซึ่งคุณสามารถsplit()แยกออกเป็นสองส่วน:
command! -nargs=+ Sub execute '%substitute/' . split(<q-args>, ' ')[0] . '/' . split(<q-args>, ' ')[1] . '/g'
เราสามารถหลีกเลี่ยงการแยกวิเคราะห์สองครั้งด้วย metaprogramming ( call()) และprintf():
command! -nargs=+ Sub execute call('printf', ['%%substitute/%s/%s/g'] + split(<q-args>, ' '))
วิธีนี้ใช้ได้ผล แต่การจัดการข้อผิดพลาดยังไม่ดี (ถ้าคุณผ่าน ARG เพียงครั้งเดียวมันจะบ่นด้วยE766: Insufficient arguments for printf()) :functionคุณจะได้รับการควบคุมมากขึ้นโดยแยกรหัสเป็น
Vim สามารถแยกอาร์กิวเมนต์ได้
แยกยังช่วยให้กลุ่มที่จะทำอาร์กิวเมนต์แยกสำหรับคุณผ่านทาง:function:help <f-args>
command! -nargs=+ Sub call Sub(<f-args>)
function! Sub( ... )
execute printf('%%substitute/%s/%s/g', a:1, a:2)
endfunction
ด้วยฟังก์ชั่นคุณสามารถตรวจสอบจำนวนอาร์กิวเมนต์ที่ถูกต้องได้อย่างง่ายดาย:
function! Sub( ... )
if a:0 != 2
echo "Need two arguments"
return
endif
...
ข้อเสียของฟังก์ชันคือข้อผิดพลาด (เช่นรูปแบบไม่ตรงกันบัฟเฟอร์ไม่สามารถแก้ไขได้) ทำให้เกิดข้อผิดพลาดแบบหลายบรรทัดและไม่เป็นมิตร try...catchจะต้องมีการใช้เพื่อรับข้อความแสดงข้อผิดพลาดบรรทัดเดียวที่ดี
โบนัส: สถานที่รับได้จากที่นั่น
- ในขณะที่คุณซ่อน
:sคำสั่ง (และตัวคั่นที่ใช้) จากผู้ใช้ฉันคิดว่าไม่ควรกำหนดว่าตัวคั่นจะต้องถูกหลีกหนี ใช้escape(a:1, '/')แทน/a:1a:2
- ด้วย
:help :command-rangeคุณยังสามารถใช้คำสั่งเริ่มต้นทำงานกับบัฟเฟอร์ทั้งหมด แต่ยังอนุญาตให้ส่งผ่านช่วงอื่น ๆ
พิจารณาว่าคำสั่งดึงน้ำหนักจริงหรือไม่ ไม่ว่าการแยกวิเคราะห์ที่ใช้แล้วช่องว่างในการขัดแย้งเป็นปัญหาข้อเสียที่ต้นฉบับ:sไม่มี ประโยชน์อย่างเดียวที่ฉันเห็นคือมันพิมพ์ได้ง่ายกว่าเล็กน้อย แต่ก็สามารถทำได้ด้วยการแมปที่เติมคำสั่งล่วงหน้าด้วย:sคำสั่งที่ไม่สมบูรณ์และวางเคอร์เซอร์ไว้ตรงกลาง