Подтвердить что ты не робот

Более точная альтернатива/обходной путь для ctags/Cscope для PHP?

Я знаю, что можно использовать 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?

4b9b3361

Ответ 1

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

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

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

Ответ 2

В качестве разработчика С++ у меня были подобные проблемы в течение длительного времени. До сих пор я реорганизовал свой подход к использованию файлов тегов под Vim несколько лет назад. Трюк, который заставлял его работать для меня, заключался в том, чтобы генерировать отдельные файлы тегов для разных фрагментов кода: мой проект, различные внешние библиотеки кода и т.д. Затем мне пришлось установить параметр "теги" для поиска файлов с приоритетом заказывайте, когда мои файлы проекта локального кода идут первыми, а затем работают оттуда с файлами системного заголовка LAST.

В моем случае у меня были отдельные файлы тегов для каждого из них и перечисленные в этом порядке в опции "теги":

  • Мой локальный проект
  • Любой другой проект, который использует этот проект
  • Системные библиотеки (boost)
  • Системные библиотеки (WxWidgets)
  • Системные библиотеки (стандартные библиотеки С++)
  • Системные библиотеки (все остальные)

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

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

Ответ 3

Чтобы улучшить 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

из моего сообщения

Ответ 4

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

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

Ответ 5

В течение долгого времени боролась с той же проблемой, пока не нашла LanguageServer for PHP.

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

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

  • автозаполнение медленное по сравнению с другими платформами, такими как padawan
  • он не кэширует (пока) ваш индекс проекта, а значит, он должен переиндексироваться, когда вы открываете 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>

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

Ответ 6

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