Giải pháp của DJ McMayhem đã truyền cảm hứng cho tôi viết bài của riêng mình dựa trên ctags và trên matchit để phân tích chính xác ranh giới chức năng.
Phần khó đã được thực hiện bởi lh-dev và lh-tags trong vài năm:
- tập tin hiện tại được phân tích cú pháp thông qua ctags với các tùy chọn phù hợp
- chúng tôi tìm kiếm tất cả các định nghĩa hàm trong cơ sở dữ liệu thẻ được giới hạn ở các thẻ thu được cho tệp hiện tại
- nhờ DB, chúng tôi có số dòng bắt đầu cho tất cả các chức năng (tốt
template
và inline
phần nào có thể được bỏ qua bởi ctags)
- với một tìm kiếm lặp đơn giản (một tìm kiếm nhị phân có thể đã được thực hiện, nhưng tốt, các tệp được cho là "ngắn"), bắt đầu tìm thấy hàm hiện tại
- Và nhờ có plugin matchit, dòng cuối cùng của nó cũng được tìm thấy - Tôi thấy rằng các ctags phổ quát đang cung cấp một
end
trường có thể được sử dụng với C, C ++, Python và Vim cũng có thể được sử dụng để tìm phần cuối của hàm.
Lưu ý rằng bất kỳ phần nào của thuật toán này có thể được ghi đè trên cơ sở loại tệp. tức là phát hiện ranh giới của các hàm python có thể tìm kiếm def
và phân tích thụt lề, chúng ta chỉ có thể tìm kiếm function
trong javascript, v.v. - Nói cách khác, phiên bản hiện tại cũng hoạt động với Java, Vim và một số ngôn ngữ khác (tôi vẫn còn một số ngôn ngữ khác để làm cho Python)
Vì vậy, bây giờ tôi xác định hai ánh xạ mới: ánh xạ chế độ trực quan và ánh xạ chế độ chờ toán tử:
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
Mà dựa vào:
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
Tôi dành cho bạn hàng trăm dòng mã lh#dev#find_function_boundaries()
Và cảm ơn bản đồ của DJ McMayhem
" Note that my vim settings requires two backslashes here instead of one
vnoremap / <esc>/\\%V
chúng ta có thể làm một vif/pattern
để tìm kiếm pattern
trong chức năng hiện tại.
Chúng ta cũng có thể xóa các chức năng với dif
, kéo chúng với yif
, v.v.
Đây là giao diện khi được áp dụng trên hàm C ++ thực tế (nghĩa là không thụt lề 0):
lh#dev#find_function_boundaries
từ lh-dev