วิธีการแก้ปัญหาของ DJ McMayhem เป็นแรงบันดาลใจให้ฉันเขียนของฉันเองที่อาศัย ctags และ matchit เพื่อทำการวิเคราะห์ขอบเขตของฟังก์ชั่นที่เหมาะสม
ส่วนที่ยากได้ทำไปแล้วโดยlh-devและ lh-tags เป็นเวลาหลายปี:
- ไฟล์ปัจจุบันจะถูกแยกวิเคราะห์ผ่าน ctags ด้วยตัวเลือกที่เหมาะสม
- เรามองหาคำจำกัดความของฟังก์ชั่นทั้งหมดในฐานข้อมูลแท็กซึ่งถูก จำกัด ไว้ที่แท็กที่ได้รับสำหรับไฟล์ปัจจุบัน
- ขอบคุณฐานข้อมูลเรามีหมายเลขบรรทัดเริ่มต้นสำหรับฟังก์ชั่นทั้งหมด (ดี
template
และinline
อาจจะพลาดส่วน ctags)
- ด้วยการค้นหาแบบวนซ้ำอย่างง่าย (การค้นหาแบบไบนารี่สามารถทำได้ แต่ไฟล์ที่ควรจะเป็น "สั้น") ซึ่งเป็นจุดเริ่มต้นของฟังก์ชั่นปัจจุบัน
- และด้วยการจับคู่กับปลั๊กอินบรรทัดสุดท้ายก็พบได้เช่นกัน - ฉันเห็นว่า ctags สากลนำเสนอ
end
ฟิลด์ที่สามารถใช้กับ C, C ++, Python และ Vim ที่สามารถใช้เพื่อค้นหาจุดสิ้นสุดของฟังก์ชัน
โปรดทราบว่าส่วนใด ๆ ของอัลกอริทึมนี้อาจถูกเขียนทับบนพื้นฐานชนิดไฟล์ เช่นการตรวจจับขอบเขตของฟังก์ชั่น python สามารถค้นหาdef
และวิเคราะห์การเยื้องเราสามารถค้นหาfunction
ใน javascript และอื่น ๆ - ในคำอื่น ๆ รุ่นปัจจุบันยังทำงานร่วมกับ Java, Vim และภาษาอื่น ๆ (ฉันยังมีงานบางอย่าง ทำเพื่อหลาม)
ดังนั้นฉันจึงกำหนดการแมปใหม่สองรายการในขณะนี้: การแมปโหมดภาพและการแมปโหมดที่ดำเนินการอยู่ระหว่างดำเนินการ:
onoremap <silent> if :<c-u>call lh#dev#_select_current_function()<cr>
xnoremap <silent> if :<c-u>call lh#dev#_select_current_function()<cr><esc>gv
ซึ่งพึ่งพา:
function! lh#dev#_select_current_function() abort
let fn = lh#dev#find_function_boundaries(line('.'))
exe fn.lines[0]
normal! v
exe fn.lines[1]
endfunction
ฉันขอให้คุณรหัสหลายร้อยบรรทัดของ lh#dev#find_function_boundaries()
และต้องขอบคุณการทำแผนที่ของ DJ McMayhem
" Note that my vim settings requires two backslashes here instead of one
vnoremap / <esc>/\\%V
เราสามารถvif/pattern
ทำการค้นหาpattern
ในฟังก์ชั่นปัจจุบัน
นอกจากนี้เรายังสามารถลบฟังก์ชั่นด้วยdif
ดึงมันด้วยyif
ฯลฯ
นี่คือสิ่งที่ดูเหมือนว่าเมื่อนำไปใช้กับฟังก์ชั่น C ++ ที่เหมือนจริง (เช่นไม่เยื้อง 0):
lh#dev#find_function_boundaries
จาก lh-dev