VIM - более точная альтернатива / обходной путь для ctags / Cscope для PHP? - PullRequest
13 голосов
/ 02 декабря 2011

Я знаю, что можно использовать Ctrl + ] , чтобы перейти к определению в Vim, и это может работать совместно с ctags или Cscope. Я ищу более точную альтернативу ctags и Cscope при работе PHP. Иногда есть несколько возможных результатов или ложных срабатываний. Я только хочу перейти к фактическому определению того, что находится под курсором. В идеале это должно работать для переменных, функций, констант и классов.

Я не понимаю, почему этого нельзя сделать, проанализировав файлы. Наконец-то я преодолел почти все другие неприятности / недоразумения, которые у меня были с Vim, благодаря обучению и настройке, поэтому, если бы я смог прибить это, это было бы здорово.

Кроме того, согласны ли другие, что Cscope и ctags недостаточно точны для PHP или я что-то не так делаю?

UPDATE

4 года спустя я все еще использую Vim с PHP, и у меня все еще есть эта проблема. Я пробовал eclim, ctags, exubarant-ctags, универсальные ctags и cscope. Я попытался передать различные аргументы этим программам, чтобы заставить их генерировать лучшие теги. Для всех этих вариантов опыт очень плохой.

Но теперь я понимаю проблему намного лучше. Там может быть ничего плохого с тегами, созданными этими программами. Кажется, проблема в том, что когда вы нажимаете Ctrl + ] в Vim или Neovim, он просто ищет тег с таким именем. Он не смотрит на контекст файла, который вы редактируете, чтобы увидеть, какой тег с таким именем он должен использовать. Он даже не понимает, на каком языке вы редактируете, и ищет теги из кода на этом языке. Есть ли способ сделать поиск vim по файлу тегов более разумным, основанным на контексте, и затем перейти к наиболее вероятному местоположению? Вы знаете, как то, что случилось бы в хорошей IDE?

Ответы [ 6 ]

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

Как разработчик C ++ у меня были подобные проблемы в течение длительного времени. Пока я не реорганизовал свой подход к использованию файлов тегов в Vim несколько лет назад. Уловка, которая заставила меня работать, состояла в том, чтобы сгенерировать отдельные файлы тегов для различных фрагментов кода: мой проект, различные библиотеки внешнего кода и т. Д. Затем мне пришлось установить опцию «теги», чтобы искать файлы в приоритете. порядок, сначала идут файлы проекта моего локального кода, а затем работают оттуда с файлами заголовков системы LAST.

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

  1. Мой местный проект
  2. Любой другой проект, который использует этот проект
  3. Системные библиотеки (boost)
  4. Системные библиотеки (WxWidgets)
  5. Системные библиотеки (стандартные библиотеки C ++)
  6. Системные библиотеки (все остальное)

Я не разработчик PHP, но, опять же, главная ошибка, которую я допустил в течение долгого времени, заключалась в создании одного файла тегов ДЛЯ ВСЕГО. У меня будет более 30 тегов для поиска во многих случаях (с помощью команды: tag). Если вы генерируете несколько файлов тегов, вы гораздо больше контролируете порядок поиска тегов и, следовательно, какие теги в каких файлах находятся.

Посмотрите, работает ли это для вас. Это для меня.

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

Чтобы улучшить ctags для PHP, вы можете создать файл тегов следующим образом:

#!/bin/bash
cd /path/to/framework/library
exec ctags-exuberant -f ~/.vim/mytags/framework \
-h ".php" -R \
--exclude="\.svn" \
--totals=yes \
--tag-relative=yes \
--PHP-kinds=+cf \
--regex-PHP='/abstract class ([^ ]*)/\1/c/' \
--regex-PHP='/interface ([^ ]*)/\1/c/' \
--regex-PHP='/(public |static |abstract |protected |private )+function ([^ (]*)/\2/f/'

и загрузить теги

:set tags=~/.vim/mytags/framework

, взятые из моего сообщения в блоге

2 голосов
/ 23 июня 2017

Долго боролся с той же проблемой, пока не нашел LanguageServer для PHP .

Он предоставляет такие функции, как GoToDefinition, ShowReferences, Теги в текущем документе и т. Д. Он хорошо интегрируется с fzf прямо из коробки.

Вещи, которые мне не нравятся в этом:

  1. автозаполнение медленное по сравнению с другими фреймворками, такими как падаван
  2. он не кэширует (пока) индекс вашего проекта, что означает, что он должен переиндексировать при открытии neovim. Тем не менее, вы можете использовать функциональность GoToDefinition, пока она еще индексируется.

Быстрая настройка для vim-plug :

Plug 'autozimu/LanguageClient-neovim', { 'do': ':UpdateRemotePlugins' }

Plug 'roxma/LanguageServer-php-neovim', {'do': 'composer install && composer run-script parse-stubs'}

autocmd FileType php LanguageClientStart

nnoremap <silent> gd :call LanguageClient_textDocument_definition()<CR>

nnoremap <silent> gr :call LanguageClient_textDocument_references()<CR>

Лучшее решение, которое я нашел до сих пор.

2 голосов
/ 15 февраля 2012

Вы также можете взглянуть на eclim .

Это может использовать функцию завершения eclipse, и она должна нормально работать на PHP (я не пробовал).

1 голос
/ 01 августа 2016

LanguageServer-php-neovim - это плагин Neovim, который отлично подходит для поиска определений кода. Это даже хорошо работает для переменных! В основном это позволяет вам использовать плагин php-language-server , который был первоначально разработан для VS Code, внутри Neovim через плагин LanguageClient-neovim . Это все возможно, потому что php-language-server был разработан для использования VS Server Language Server Protocol, который является открытым протоколом, созданным Microsoft, который теперь поддерживается многими редакторами для многих языков. Некоторые люди заинтересованы в том, чтобы протокол языкового сервера имел встроенную поддержку в Neovim без необходимости в плагине для поддержки этого протокола. Я не удивлюсь, если это произойдет в ближайшее время, поскольку уже ведется работа запрос на получение . Если Neovim начнет поддерживать это, вам понадобится только один плагин для языка.

Если вы не хотите или не можете настроить это для правильной работы вашего проекта, и вы полны решимости придерживаться тегов, важно понимать ограничения тегов. Файл тегов обычно представляет собой просто файл с ключевыми словами, которые появляются в вашем коде, и где они находятся в вашем коде. Потребовалось бы немало работы, настройки и изобретательности, чтобы использовать что-то подобное в редакторе или IDE для обеспечения завершения кода или перехода к функциям, которые столь же умны, как и другие инструменты, предназначенные для более глубокого понимания вашего кода. При этом, если вы действительно хотите придерживаться тегов, я лично считаю, что мой плагин project-tags - лучший опыт, который вы получите в Vim, поскольку я сделал это, чтобы удовлетворить эту потребность и сделать то, что я хотел, чтобы другие теги плагины сделали.

Ох, забудь об этом. Языковые серверы слишком проблематичны. Я разместил свой вопрос 5 лет назад, а через 5 лет все еще не нашел хорошего решения. Я сдаюсь! Я разочаровываюсь в PHP и разочаровываюсь в Vim и Neovim. Я переключаюсь на Kotlin и InjelliJ IDE. Хотя я все еще должен использовать PHP, я переключаюсь на PhpStorm. Я все еще буду использовать плагин Vim. Vim и Noevim - отличные редакторы, но пытаться свалить кучу интеллектуальных инструментов, чтобы работать внутри них, как если бы они все были разработаны для совместной работы, чтобы обеспечить хороший опыт, просто не работает для меня, и я пытался в течение многих лет. У меня всегда будут эти инструменты, чтобы обращаться к ним по мере необходимости, и они отлично подходят для случаев, когда вам необходимо подключиться к серверу через ssh и выполнить простое редактирование. Но для разработки ядра ядра вам нужны языковые средства, повышающие производительность инструменты, которые прекрасно продуманы для совместной работы в синергетическом ключе, чтобы обеспечить исключительный опыт. Или, другими словами, вам нужна интегрированная среда разработки.

1 голос
/ 02 декабря 2011

Больше обходного пути, но если вы нажмете g CTRL+[ вместо просто CTRL+', вы получите список всех тегов этого имени и сможете выбрать, к какому из них перейти.

...