ทำการแยกวิเคราะห์ด้วยตัวคุณเอง
หากคุณใช้: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:1
a:2
- ด้วย
:help :command-range
คุณยังสามารถใช้คำสั่งเริ่มต้นทำงานกับบัฟเฟอร์ทั้งหมด แต่ยังอนุญาตให้ส่งผ่านช่วงอื่น ๆ
พิจารณาว่าคำสั่งดึงน้ำหนักจริงหรือไม่ ไม่ว่าการแยกวิเคราะห์ที่ใช้แล้วช่องว่างในการขัดแย้งเป็นปัญหาข้อเสียที่ต้นฉบับ:s
ไม่มี ประโยชน์อย่างเดียวที่ฉันเห็นคือมันพิมพ์ได้ง่ายกว่าเล็กน้อย แต่ก็สามารถทำได้ด้วยการแมปที่เติมคำสั่งล่วงหน้าด้วย:s
คำสั่งที่ไม่สมบูรณ์และวางเคอร์เซอร์ไว้ตรงกลาง