2017-02-08 3 views
0

Ähnlich wie this Frage würde ich gerne wissen, ob es eine Möglichkeit gibt, Ctags einen Prozedurzeiger erkannt haben, und natürlich, wo es zeigt.Ctags mit Prozedur Zeigern in Fortran

Beispiel:

if(code_is_2D) then 
    get_convective => get_convective_2D 
else 
    get_convective => get_convective_3D 
end if 

Durch CTRL-] auf get_convective drücken, würde Ich mag darauf zu verstehen, je nachdem, welche Verfahren es verweist. Ich habe versucht, --fortran-kinds=+i hinzuzufügen, aber das hat nicht funktioniert.

Edit:

Ich wusste nicht, gibt es mehrere Versionen von ctags (exhuberant/universal) vor LucHermitte Kommentar. Ich benutzte das ehemalige. Ich entfernte es und installierte universal-ctags. Jetzt, wenn ich die Flags --fortran-kinds=+i verwende, werde ich in die Definition des Prozedurzeigers und NICHT in die Prozedur, auf die er zeigt, verschoben.

+0

Verwenden Sie die verlassenen exhuberant-ctags oder ihre gepflegte Gabel, d. H. Universal-ctags? –

+0

@LucHermitte Siehe Bearbeiten – solalito

Antwort

0

Die einzigen Felder in Ihrer tags-Datei, die Vim Rolle, wenn Sie <C-]> tun sind:

  • der Tag,
  • der Dateiname,
  • der verwendeten Ex-Befehl den Tag zu finden.

Die anderen Felder werden überhaupt nicht verwendet.

Wenn Sie <C-]> tun, sucht Vim nach dem Wort unter Ihrem Cursor am Anfang jeder Zeile in Ihrer Datei tags. Etwas wie:

/^\<get_convective\> 

Dann öffnet es den zugehörigen Dateinamen und führt den zugehörigen Ex-Befehl aus. Etwas wie:

:e path/to/filename 
:/^\ \ \ \ get_convective 

Aber Sie wollen nicht die get_convective Tag selbst, Sie wollen, was es zu in Ihrem Code verweist. Das Problem ist hier, dass Vim:

  • versteht nicht, Ihren Code,
  • wird nicht immer sehen, was zeigt auf, was im Zusammenhang mit der Tag-Suche.

Zusätzlich ctags selbst:

  • nicht, Ihren Code entweder nicht versteht,
  • nicht, dass die Beziehung aufnehmen sowieso.

Deshalb werden Sie fast sicherlich brauchen eine benutzerdefinierte Funktion wie diese:

function! JumpToTagOrInterface() 
    let this_line = getline('.') 
    if this_line =~ '=>' && col('.') < stridx(this_line, '=>') 
     execute 'tag' matchstr(this_line, '\S\{-}$') 
    else 
     tag <cword> 
    endif 
endfunction 
nnoremap <key> :call JumpToTagOrInterface()<CR> 

Beachten Sie, dass diese Funktion geht davon aus, dass Ihre Schnittstellen von ctags indiziert sind.