Если вы посмотрите на :help tags-file-format
, Vim использует третий столбец (с именем {tagaddress}
) в качестве команды (поиска) (:help tag-search
). В сгенерированном файле тегов это выглядит так:
f foo.cpp /^void f($/;" f signature:( )
f foo.cpp /^void f($/;" f signature:( int x )
Шаблон поиска для обеих перегрузок (/^void f($/
) идентичен ; Вот почему каждый прыжок тега будет определять местонахождение первого экземпляра! Другими словами, хотя приятно, что программа тегов добавила подпись, Vim, к сожалению, не учитывает это.
При этом очевидный способ обойти проблему - переформатировать исходный код, чтобы (части) подписи были включены в одну строку. Тогда будут разные шаблоны:
b bar.cpp /^void b()$/;" f signature:()
b bar.cpp /^void b(int x)$/;" f signature:(int x)
Более правильным (но также и более сложным) путем для решения этой проблемы было бы расширение программы ctags
для распознавания этих неоднозначностей, а затем добавление в шаблон положительного взгляда , чтобы также рассмотреть материал в следующей строке.
f foo.cpp /^void f(\%(\n\s*int x\)\@=/;" f signature:( )
f foo.cpp /^void f(\n\s*)/;" f signature:( int x )
К сожалению, Vim, похоже, не понимает этот синтаксис (ни с предвидением, ни без него); Я просто получаю E435: Couldn't find tag, just guessing!
.