La solution de DJ McMayhem m'a inspiré pour écrire le mien qui s'appuie sur ctags et sur matchit pour faire une analyse appropriée des limites de fonctions.
La partie difficile est déjà réalisée par lh-dev et lh-tags depuis plusieurs années:
- le fichier actuel est analysé par ctags avec les bonnes options
- nous recherchons toutes les définitions de fonction dans la base de données de balises qui est limitée aux balises obtenues pour le fichier courant
- grâce à la DB, nous avons les numéros de ligne de départ pour toutes les fonctions (bien la
template
et une inline
partie peut MANQUER par ctags)
- avec une recherche itérative simple (une recherche binaire aurait pu être faite, mais bon, les fichiers sont supposés être "courts"), le début de la fonction courante est trouvé
- Et grâce au plugin matchit, sa ligne finale est également trouvée - je vois que les ctags universels offrent un
end
champ qui peut être utilisé avec C, C ++, Python et Vim qui pourrait également être utilisé pour trouver la fin d'une fonction.
Notez que toutes les parties de cet algorithme peuvent être remplacées par type de fichier. c'est-à-dire que la détection des limites des fonctions python pourrait rechercher def
et analyser l'indentation, nous pourrions simplement rechercher function
en javascript, etc. - En d'autres termes, la version actuelle fonctionne également avec Java, Vim et d'autres langages (j'ai encore du travail à faire pour Python)
Je définis donc maintenant deux nouveaux mappages: un mappage de mode visuel et un mappage de mode en attente d'opérateur:
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
Qui s'appuient sur:
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
Je vous épargne les quelques centaines de lignes de code de lh#dev#find_function_boundaries()
Et grâce à la cartographie de DJ McMayhem
" Note that my vim settings requires two backslashes here instead of one
vnoremap / <esc>/\\%V
nous pouvons faire une vif/pattern
recherche pattern
dans la fonction actuelle.
Nous pouvons également supprimer des fonctions avec dif
, les tirer avec yif
, etc.
Voici à quoi cela ressemble lorsqu'il est appliqué sur une fonction C ++ réaliste (c'est-à-dire non en retrait 0):
lh#dev#find_function_boundaries
de lh-dev