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
templateet une inlinepartie 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
endchamp 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 defet analyser l'indentation, nous pourrions simplement rechercher functionen 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/patternrecherche patterndans 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_boundariesde lh-dev