A solução do DJ McMayhem me inspirou a escrever minha própria, que depende de ctags e matchit, para fazer uma análise adequada dos limites das funções.
A parte difícil já foi feita pelo lh-dev e lh-tags por vários anos:
- o arquivo atual é analisado através de ctags com as opções corretas
- procuramos todas as definições de funções no banco de dados de tags, restritas às tags obtidas para o arquivo atual
- graças ao DB, temos os números da linha de partida para todas as funções (bem, a parte
template
e inline
pode ser perdida por ctags)
- com uma pesquisa iterativa simples (uma pesquisa binária poderia ter sido feita, mas os arquivos devem ser "curtos"), o início da função atual é encontrado
- E graças ao plug-in matchit, sua linha final também é encontrada - vejo que ctags universais estão oferecendo um
end
campo que pode ser usado com C, C ++, Python e Vim, que também pode ser usado para encontrar o fim de uma função.
Observe que qualquer parte desse algoritmo pode ser substituída com base no tipo de arquivo. ou seja, a detecção de limites das funções python poderia procurar def
e analisar a indentação, poderíamos procurar apenas function
em javascript e assim por diante - Em outras palavras, a versão atual também funciona com Java, Vim e outras linguagens (ainda tenho algum trabalho fazer pelo Python)
Portanto, defino agora dois novos mapeamentos: um mapeamento de modo visual e um mapeamento de modo pendente de operador:
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
Que contam com:
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
Eu poupo as várias centenas de linhas de código de lh#dev#find_function_boundaries()
E graças ao mapeamento do DJ McMayhem
" Note that my vim settings requires two backslashes here instead of one
vnoremap / <esc>/\\%V
podemos fazer um vif/pattern
para procurar pattern
na função atual.
Também podemos excluir funções com dif
, puxá-las com yif
, etc.
Aqui está o que parece quando aplicado em uma função C ++ realista (ou seja, não recuada com 0):
lh#dev#find_function_boundaries
de lh-dev