Искать теги только в текущем файле - PullRequest
9 голосов
/ 28 декабря 2011

Я использую ": ta", чтобы перейти к методу.
Например, я получил два класса с именами A.java и B.java.У них обоих есть метод foo(), а у B.java есть другой метод с именем fooBar().Затем я открываю A.java и вводю :ta foo, затем нажимаю TAB , тогда я получу два завершения: foo и fooBar.Но сейчас я хочу просто добавить тег в текущий файл, мне не нравится отображать тег в другом файле.

И я обнаружил, что список тегов очень хорош в этой работе.Поэтому, если я смогу использовать тег, сгенерированный taglist для поиска, это будет очень приятно.

Ответы [ 3 ]

3 голосов
/ 28 декабря 2011

В зависимости от того, сколько раз вы вызываете ваши методы, может быть достаточно пары *.

Без использования тегов, gd может использоваться для перехода к локальному объявлению метода под вашим курсором.,Я обычно выбираю самое низкотехнологичное решение, поэтому я бы выбрал это.

Но ctags также может генерировать теги только для одного файла или для произвольного выбора файлов.Это может быть сделано в несколько шагов, но это определенно не так просто, как то, что вы привыкли делать ...

  1. Создайте файл с именами файлов, которые выхочу сканировать.Допустим, он называется files.txt и находится в корне вашего рабочего каталога.

  2. Создайте файл tags, используя аргумент -L <file>: ctags -L files.txt.

На этом этапе у вас должен быть файл tags, содержащий только теги, присутствующие в файлах, указанных на шаге 1.

Генерация различных файлов tags дляВесь проект и для отдельных файлов может быть полезен здесь.Короткий сценарий, генерирующий файл tags с именем текущего файла и делающий его единственным источником tags, может упростить задачу.

РЕДАКТИРОВАТЬ

На самом делеTagList и TagBar не генерируют файлы tags.Вывод команды ctags <options>, которую они запускают, используется внутренне и анализируется всеми видами регулярных выражений для фильтрации по области действия, имени файла или как угодно.

2 голосов
/ 28 декабря 2011

К сожалению, это нельзя сделать с помощью ctags . Ctags не учитывает контекст, это чистый список всех возможных «функций». Попробуйте открыть файл тега с помощью редактора (например, vim), и вы увидите, что это просто список «функций» (в случае Java они являются «методами»). Пример:

getDesc src/com/redhat/rhn/internal/doclet/Handler.java /^    public String getDesc() {$/;" m   class:Handler
getDoc  src/com/redhat/rhn/internal/doclet/ApiCall.java /^    public String getDoc() {$/;"  m   class:ApiCall

Vim просто ищет файл "как есть", не давая ему никакого контекста - он просто ищет "функцию". Умеет искать файлы, классы, методы, перечисления и т. Д. Формат тегов более подробно описан здесь: http://ctags.sourceforge.net/FORMAT

В Vim у вас мало возможностей. Есть несколько плагинов, которые дают Vim некоторую чувствительность к контексту, но вы не можете использовать теги для этого. Сам Vim имеет функцию под названием OmniComplete , и есть несколько плагинов, предназначенных для Java. Затем вы можете использовать Ctrl-X Ctrl-O , чтобы начать завершение. Я рекомендую вам сопоставить это с другим ключом (может быть, Ctrl-Space, если хотите). Подробнее о плагинах Java OmniComplete здесь:

Vim omnicompletion для Java

Eclim (http://eclim.org/) очень сложный, но сложный в настройке (необходимо запустить Eclipse в фоновом режиме). JDE-скрипт проще и надежнее (http://www.vim.org/scripts/script.php?script_id=1213). И, пожалуйста, обратите внимание на сообщество IntelliJ IDEA Редакция (бесплатная) также имеет очень хороший плагин Vim, который можно использовать бесплатно, но я вас понимаю - Vim - это Vim.

Удачи!

1 голос
/ 03 января 2012

Не совсем ответ на ваш вопрос, но, похоже, нет способа сделать именно то, что вам нужно, поэтому я бы порекомендовал вам следующее: для вашей разработки Java в Vim попробуйте eclim .

Этот инструмент поможет вам использовать ваш любимый текстовый редактор Vim с мощью Eclipse (IDE). Я не могу найти аналог для завершения табуляции :ta, но я знаю умный аналог для g]: это команда :JavaSearchContext. Вы можете сопоставить это с чем-то.

Например, если у вас есть два класса A и B, и у вас есть метод foo() в каждом классе, тогда g] будет спрашивать вас каждый раз, когда вы захотите перейти к foo(), но :JavaSearchContext всегда будет переходить к правильному объявлению foo().

Конечно, есть много других функций.

...