เป็นกลุ่ม - ฉันสามารถส่ง args หลายรายการไปยังคำสั่งที่กำหนดเองโดยไม่ต้องเขียนฟังก์ชั่น


1

ฉันได้เขียนคำสั่งที่กำหนดเองต่อไปนี้ในไฟล์. vimrc ของฉัน:

command! -nargs=+ Sub :%s/<args>/g

มันทำให้ฉันสามารถแทนที่คำหนึ่งไปอีกคำหนึ่งและดำเนินการเช่นนี้:

:Sub <word>/<new word>

ฉันต้องการเขียนคำสั่งด้วย args หลายอันเช่นนี้

:Sub <word> <new word>

ฉันสามารถเขียนคำสั่งใหม่เพื่อยอมรับการขัดแย้งกันหลายครั้งได้หรือไม่?

เป็นการดีที่ฉันต้องการสิ่งนี้:

command! -nargs=+ Sub :%s/<arg1>/<arg2>/g

ขอบคุณล่วงหน้า.

คำตอบ:


1

ทำการแยกวิเคราะห์ด้วยตัวคุณเอง

หากคุณใช้: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คำสั่งที่ไม่สมบูรณ์และวางเคอร์เซอร์ไว้ตรงกลาง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.