Vim, C ++, поиск функции-члена - PullRequest
1 голос
/ 10 марта 2010

Я использую Vim 7.x

Я использую альтернативный файл.

У меня есть сопоставление * .hpp <-> * .cpp

Предположим, я в

class Foo {

  void some_me#mber_func(); // # = my cursor

}

в Foo.hpp

есть ли способ заставить vim сделать следующее:

  1. Схватить слово под # (легко, развернуть ("")
  2. Посмотрите на класс, в котором я нахожусь ("Foo") <- я понятия не имею, как это сделать </li>
  3. Добавить `1 & 2 (просто: используя". ") ->" Foo :: some_member_func " 4: Переключение файлов (просто,: A)
  4. делать а / в 4

Так что, по сути, я могу написать все это вместе, кроме «найти имя включающего класса, в котором я участвую (особенно если классы вложены).

Я знаю о ctags. Я знаю о cscope. Я предпочитаю не использовать их - я предпочитаю решения, где я понимаю, где они ломаются.

1 Ответ

4 голосов
/ 10 марта 2010

Это относительно легко сделать грубо и очень трудно сделать хорошо. C и C ++ - довольно сложные языки для надежного анализа. Опасаясь лишиться права голоса, я лично рекомендую проанализировать файл тегов, сгенерированный ctags, , но , если вы действительно хотите сделать это в Vim, есть несколько вариантов для «сырого» метода.

  1. Сделайте некоторые предположения. Ваши предположения зависят от того, насколько сложным вы хотите, чтобы это было. На самом простом уровне: предположим, что вы находитесь в определении класса, и поблизости нет других фигурных скобок. Исходя из вашего стиля кодирования, предположим, что открывающая фигурная скобка определения класса находится на той же строке, что и «класс».

    let classlineRE = '^class\s\+\(\k\+\)\s\+{.*'
    let match = search(classlineRE, 'bnW')
    if match != 0
        let classline = getline(match)
        let classname = substitute(classline, classlineRE, '\1', '')
        " Now do something with classname
    endif
    

    Модель предположений, очевидно, может быть расширена / обобщена настолько, насколько вы считаете нужным. Вы можете просто найти фигурную скобку, а затем найти класс и взять то, что находится между ними (для обработки фигурных скобок в отдельной строке для «класса»). Вы можете отфильтровать комментарии. Если вы хотите быть по-настоящему умным, вы можете посмотреть, на каком уровне скобок вы находитесь, и убедиться, что это верхний уровень (переходите к началу файла, добавляйте 1 каждый раз, когда видите «{», и вычитайте один каждый раз, когда вы видите '}' и т. д.). Ваш скрипт vim станет очень, очень, очень сложным.

  2. Еще один риск для downvote: вы можете использовать один из различных синтаксических анализаторов C, написанных на python, и использовать интерфейс vim-python, чтобы заставить его работать как скрипт vim. Если честно, если вы думаете об этом, я бы остановился на ctags / cscope.

  3. Использование rainbow.vim . Это делает подсвечивание на основе глубины отступа, так что вы можете быть немного умнее и искать (используя search('{', 'bW') или аналогичный) для открывающих фигурных скобок, а затем запросить подсветку синтаксиса этих фигурных скобок (используя synIDattr(synID(line("."), col("."),1), "name")), и если это hlLevel0 Вы знаете, что это скобка верхнего уровня. Затем вы можете выполнить поиск по классу и разобрать его согласно пункту 1.

Я надеюсь, что все вышеперечисленное дает вам пищу для размышлений ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...