Solusi DJ McMayhem mengilhami saya untuk menulis sendiri yang mengandalkan ctag dan matchit untuk melakukan analisis yang tepat tentang batas fungsi.
Bagian yang sulit telah dilakukan oleh lh-dev dan lh-tag selama beberapa tahun:
- file saat ini diuraikan melalui ctag dengan opsi yang tepat
- kami mencari semua definisi fungsi di basis data tag yang terbatas pada tag yang diperoleh untuk file saat ini
- terima kasih kepada DB, kami memiliki nomor baris awal untuk semua fungsi (baik bagian
template
dan inline
mungkin dilewatkan oleh ctags)
- dengan pencarian berulang sederhana (pencarian biner bisa dilakukan, tetapi yah, file seharusnya "pendek"), awal fungsi saat ini ditemukan
- Dan berkat plugin matchit, baris terakhirnya juga ditemukan - Saya melihat bahwa ctag universal menawarkan
end
bidang yang dapat digunakan dengan C, C ++, Python, dan Vim yang juga dapat digunakan untuk menemukan akhir fungsi.
Perhatikan bahwa bagian mana pun dari algoritma ini dapat diganti berdasarkan tipe file. yaitu deteksi batas fungsi python dapat mencari def
dan menganalisis indentasi, kita bisa mencari function
di javascript, dan sebagainya - Dengan kata lain, versi saat ini juga berfungsi dengan Java, Vim dan beberapa bahasa lainnya (saya masih memiliki beberapa pekerjaan lakukan untuk Python)
Jadi saya mendefinisikan sekarang dua pemetaan baru: pemetaan mode visual, dan pemetaan mode menunggu operator:
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
Yang mengandalkan:
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
Saya menghindarkan Anda beberapa ratus baris kode lh#dev#find_function_boundaries()
Dan terima kasih untuk pemetaan DJ McMayhem
" Note that my vim settings requires two backslashes here instead of one
vnoremap / <esc>/\\%V
kita dapat melakukan vif/pattern
untuk mencari pattern
di fungsi saat ini.
Kami juga dapat menghapus fungsi dengan dif
, menariknya dengan yif
, dll.
Berikut ini tampilannya ketika diterapkan pada fungsi C ++ yang realistis (mis. Bukan 0 indentasi):
lh#dev#find_function_boundaries
dari lh-dev