2017-01-22 6 views
1

Я попытался использовать Ctags с Vim, и я обнаружил следующую проблему:Vim: tnext не перемещает курсор к следующему тегу

Во-первых, давайте посмотрим на следующую картину: enter image description here Если я нажимаю C-], то курсор будет перемещаться по строке 7, как вы можете видеть здесь: enter image description here

Но если я наберу команду: tn курсор все еще находится в строке 7 вместо строки 14, где следующий тег. Почему это происходит и как я могу это решить? Если вы посмотрите на следующее изображение enter image description here внизу слева, это показывает: «tag 2 of 3», так что означает: tn работает, я думаю, но курсор не перемещается.

+0

Прочтите ': help: tnext' снова. – romainl

+0

@romainl, он говорит: перейдите к [count] следующему совпадающему тегу, где [count] равен 1 по умолчанию. Я прочитал тег! и я увидел, что если тег находится в текущем файле, будет выполнено следующее действие: goto tag. И это именно то, чего я ожидаю, но, к сожалению, это не работает. Что мне не хватает? – IonutC

+0

Вы можете показать список ': tselect', чтобы понять' tag 2 of 3'. –

ответ

3

Если вы посмотрите на файл tags вы можете увидеть, что ваши три определения для fc() идентичны:

fc pam.cpp /^  void fc() {$/;" f class:A 
fc pam.cpp /^  void fc() {$/;" f class:B 
fc pam.cpp /^  void fc() {$/;" f class:C 

По умолчанию Ctags не предоставляет строку: столбец информации Vim, она просто обеспечивает поиск образец. Поскольку это один и тот же шаблон поиска для всех трех тегов, Vim всегда выполняет один и тот же поиск и всегда попадает в одно и то же место. Неважно, используете ли вы :tag fc, <C-]>, :tnext, :tselect или любые их друзья.

С опцией -n, Ctags выводит номера строк вместо поиска моделей:

fc pam.cpp 14;" f class:B 
fc pam.cpp 21;" f class:C 
fc pam.cpp 7;" f class:A 

Это лучше, потому что Vim теперь может перейти к правильной линии, но метки упорядочены неправильно. Один из способов, чтобы исправить это было бы использовать -u вариант:

A pam.cpp 5;" c file: 
fc pam.cpp 7;" f class:A 
B pam.cpp 12;" c file: 
fc pam.cpp 14;" f class:B 
C pam.cpp 19;" c file: 
fc pam.cpp 21;" f class:C 

В заключение, вы должны создать свой tags с -n и -u вариантов. Что-то вроде:

$ ctags -Rnu . 

См. $ man ctags.

+0

Я думал, что Vim увидит, что они из разных классов, но затем я прочитал ': help ctags', и я увидел, что'; ''интерпретируется Vi как начало комментария (я этого не знал), поэтому следующее будет проигнорировано, и Vim не увидит, что они из разных классов. Все это имеет смысл сейчас. Спасибо за ответ. – IonutC

+0

См. мое редактирование. – romainl

+0

Vim просто не заботится о классе или чем-либо кроме имени файла и команда ex для выполнения. – romainl