แทนด้วย vimscript บริสุทธิ์ (ไม่มี `: s`)


12

ฉันมีดังต่อไปนี้ใน vimrc ของฉัน:

func! AddSpaceBeforeEqual()
  s/\([a-z)_0-9"'\[\]]\)=/\1 =/ge
endfunc

ฉันใช้vintเพื่อกำจัด vimrc ของฉันและได้รับคำเตือนต่อไปนี้:

ProhibitCommandWithUnintendedSideEffect หลีกเลี่ยงคำสั่งที่มีผลข้างเคียงที่ไม่ได้ตั้งใจ หลีกเลี่ยงการใช้: [ubstitute] ในขณะที่เลื่อนเคอร์เซอร์และพิมพ์ข้อความผิดพลาด ชอบฟังก์ชั่น (เช่นการค้นหา ()) ที่เหมาะสมกับสคริปต์ สำหรับคำสั่ง vim จำนวนมากฟังก์ชั่นมีอยู่ที่ทำสิ่งเดียวกันโดยมีผลข้างเคียงน้อย โปรดดู: ฟังก์ชั่นช่วยเหลือ () สำหรับรายการฟังก์ชั่นในตัว คู่มือสไตล์ Google Vimscript

อย่างไรก็ตามฉันไม่คิดว่าพวกเขาเป็นวิธีการทดแทนโดยไม่ต้องใช้:sคำสั่ง

ตัวอย่างเช่นsearch()ฟังก์ชันให้บรรทัดที่จับคู่รูปแบบ แต่ไม่มีวิธีการทดแทน substitute()ฟังก์ชั่นดำเนินการในสตริงและไม่ทดแทนในไฟล์ทั้งหมด

ฉันควรใช้วิธีการทดแทนด้วยตัวเองหรือพวกเขาเป็นวิธีที่ชาญฉลาดในการเขียนฟังก์ชั่นของฉันใหม่?

คำตอบ:


10

นี่คือการใช้งานฟังก์ชันของคุณง่าย ๆ ซึ่งเขียนด้วยsubstitute():

function! AddSpaceBeforeEqualInWholeBuffer()
    let l = 1
    for line in getline(1,"$")
        call setline(l, substitute(line, '\([^= ]\)=', '\1 =', "g"))
        let l = l + 1
    endfor
endfunction

ปรับรูปแบบการค้นหาเพื่อลิ้มรส


10

เหตุผลที่มันจะเตือนคุณเกี่ยวกับผลข้างเคียงที่ไม่ได้ตั้งใจเป็นเพราะ:substituteไม่เลื่อนเคอร์เซอร์และเขียนทับค้นหาก่อนหน้านี้(ถ้านอกมือสองของฟังก์ชั่น) :substituteแต่นี้ไม่ได้หมายความว่าคุณไม่ควรใช้มันในขณะที่คุณสามารถย้อนกลับผลข้างเคียงของ ตัวอย่างเช่นนี่คือฟังก์ชั่นที่ฉันสร้างขึ้นโดยใช้คำสั่ง replace เพื่อตัดช่องว่างต่อท้าย:

function! StripTrailingWhitespace()
    " Save cursor position
    let l:save = winsaveview()
    " Remove trailing whitespace
    %s/\s\+$//e
    " Move cursor to original position
    call winrestview(l:save)
    echo "Stripped trailing whitespace"
endfunction

โปรดทราบว่าคุณสามารถใช้:markคำสั่งเพื่อบันทึกตำแหน่งเคอร์เซอร์ได้ แต่นั่นก็หมายความว่าคุณจะเขียนทับเครื่องหมายที่คุณตัดสินใจใช้ ฉันไม่เคยใช้ vint มาก่อน แต่หนึ่งเคล็ดลับในการ linters คือคุณสามารถใช้คำเตือนของพวกเขาด้วยเม็ดเกลือ ในกรณีนี้มันเป็นความจริงที่:substituteมีผลข้างเคียง แต่เป็นผลข้างเคียงที่สามารถป้องกันได้ นอกจากนี้ยังไม่มีวิธีที่ดีกว่าในการค้นหาและแทนที่ไฟล์


6
คำค้นหาที่ใช้ครั้งสุดท้ายจะถูกกู้คืนโดยอัตโนมัติหลังจากออกจากฟังก์ชั่นดังนั้นการบันทึกและการกู้คืนที่ไม่จำเป็นเมื่อใช้ในฟังก์ชั่น ดู:help function-search-undo
Martin Tournoij

1
ค่อนข้างใช้ winsaveview () / winrestview () แทนเคอร์เซอร์ ()
Christian Brabandt

1

:sคำสั่งเป็นวิธีการ Vimscript บริสุทธิ์

ฉันเดาว่าเป็นคำเตือนเท่านั้นหมายความว่าเคอร์เซอร์น่าจะถูกวางผิดหลังการใช้งาน (ซึ่งคุณสามารถหลีกเลี่ยงได้โดยการใช้winsaveview()ฟังก์ชั่นก่อนหน้าและคำสั่งwinrestview()หลังการใช้งาน) นอกจากนี้คุณต้องดูแลข้อผิดพลาดที่อาจเกิดขึ้น ซึ่งมักจะจัดการโดยใช้การeตั้งค่าสถานะ นอกจากนี้ยังต้องดูแลการตั้งค่าบางอย่างเช่นการgdefaultตั้งค่าซึ่งตีความความหมายของgธง

เราต้องดูแลข้อมูลเฉพาะเหล่านั้นและนั่นอาจเป็นสาเหตุของคำเตือนเหล่านั้น แต่นั่นไม่ได้หมายความว่าจะหลีกเลี่ยงการใช้:sคำสั่ง มันไม่เป็นไรที่จะใช้:sคำสั่งถ้าคุณต้องการแทนที่บางสิ่งในบัฟเฟอร์ปัจจุบัน

(โปรดทราบว่าอาจมีวิธีหนึ่งวนรอบทุกบรรทัดและใช้วิธีการค้นหา () / getline () / setline () แต่โดยทั่วไปแล้วจะช้ากว่า)

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