DJ McMayhem'in çözümü , ctags'a ve matchit'e dayanan ve fonksiyon sınırlarının uygun bir analizini yapmam için bana ilham verdi.
Zor kısım birkaç yıldır lh-dev ve lh-tags tarafından yapılmıştır:
- geçerli dosya doğru seçeneklerle ctags aracılığıyla ayrıştırılır
- geçerli veri için elde edilen etiketlerle kısıtlı olan etiketler veritabanında tüm işlev tanımlarını ararız
- DB sayesinde, tüm işlevler için başlangıç satırı numaralarımız var (
template
ve inline
parçası ctags tarafından atlanabilir)
- basit bir yinelemeli arama ile (bir ikili arama yapılmış olabilir, ancak dosyaların "kısa" olması gerekiyordu), mevcut fonksiyonun başlangıcı bulunur
- Ve matchit eklentisi sayesinde, son satırı da bulunur - Evrensel ctags'ın,
end
bir fonksiyonun sonunu bulmak için de kullanılabilecek C, C ++, Python ve Vim ile kullanılabilecek bir alan sunduğunu görüyorum .
Bu algoritmanın herhangi bir bölümünün dosya türü temelinde geçersiz kılınabileceğini unutmayın. yani python fonksiyonlarının sınır tespiti def
girintiyi arayabilir ve analiz edebilir, sadece function
javascript içinde arayabiliriz , vb. - Başka bir deyişle, mevcut sürüm ayrıca Java, Vim ve diğer bazı dillerle de çalışır Python için yapmak)
Şimdi iki yeni eşleme tanımlarım: görsel mod eşlemesi ve operatör bekleyen mod eşlemesi:
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
Hangi güveniyor:
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
Sana birkaç yüz kod satırı ekliyorum lh#dev#find_function_boundaries()
DJ McMayhem'in haritalaması sayesinde
" Note that my vim settings requires two backslashes here instead of one
vnoremap / <esc>/\\%V
geçerli işlevde vif/pattern
aramak için bir yapabiliriz pattern
.
Ayrıca dif
, işlevleri silebilir , yanlarına alabilir yif
vb.
Gerçekçi bir C ++ işlevine uygulandığında (ör. 0 girintili değil) şöyle görünür :
lh#dev#find_function_boundaries
lh-