Die Lösung von DJ McMayhem hat mich dazu inspiriert, meine eigene zu schreiben, die sich auf ctags und matchit stützt, um eine ordnungsgemäße Analyse der Funktionsgrenzen durchzuführen.
Der schwierige Teil wird bereits seit einigen Jahren von lh-dev und lh-tags erledigt :
- Die aktuelle Datei wird durch ctags mit den richtigen Optionen analysiert
- Wir suchen nach allen Funktionsdefinitionen in der Tags-Datenbank, die auf die für die aktuelle Datei erhaltenen Tags beschränkt sind
- dank der DB haben wir die Startzeilennummern für alle Funktionen (auch der
template
und inline
Teil kann von ctags übersehen werden)
- mit einer einfachen iterativen Suche (eine binäre Suche hätte durchgeführt werden können, aber Dateien sollten "kurz" sein) wird der Anfang der aktuellen Funktion gefunden
- Und dank des Matchit-Plugins wird auch die letzte Zeile gefunden - ich sehe, dass universal ctags ein
end
Feld anbietet , das mit C, C ++, Python und Vim verwendet werden kann, um auch das Ende einer Funktion zu finden.
Beachten Sie, dass Teile dieses Algorithmus auf Dateitypbasis überschrieben werden können. dh die Erkennung der Grenzen von Python-Funktionen könnte nach def
Einrückungen suchen und diese analysieren, wir könnten nur function
in Javascript suchen und so weiter - Mit anderen Worten, die aktuelle Version funktioniert auch mit Java, Vim und einigen anderen Sprachen (ich habe noch etwas Arbeit) für Python zu tun)
Daher definiere ich jetzt zwei neue Zuordnungen: eine visuelle Moduszuordnung und eine vom Bediener ausstehende Moduszuordnung:
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
Welche stützen sich auf:
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
Ich erspare Ihnen die mehreren hundert Codezeilen von lh#dev#find_function_boundaries()
Und dank DJ McMayhem's Mapping
" Note that my vim settings requires two backslashes here instead of one
vnoremap / <esc>/\\%V
Wir können in der aktuellen Funktion vif/pattern
nach a suchen pattern
.
Wir können auch Funktionen mit löschen, mit dif
ziehen yif
usw.
So sieht es aus, wenn es auf eine realistische C ++ - Funktion angewendet wird (dh nicht mit 0 eingerückt):
lh#dev#find_function_boundaries
von lh-dev