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

Vim PHP omni завершение

Я пытаюсь получить автозаполнение PHP прямо в Vim. Прямо сейчас, когда я делаю $blog = new Blog(); $blog->, а затем ударяю CTRL+X CTRL+O, я ожидаю, что omnicompletion вернет все функции класса Blog.

Вместо этого он возвращает все функции для всего проекта. Я построил ctags для моего проекта следующим образом: ctags -R *

Есть ли способ сделать контекстное представление автозаполнения?

4b9b3361

Ответ 1

catchmeifyoutry answer указывает на обход, добавив комментарий, например /* @var $myVar myClass */, непосредственно перед линией, на которой вы используете omnicomplete, однако это громоздко и для время, которое требуется для написания комментария, вы можете написать имя функции самостоятельно.

Решение: phpComplete

Это Vim script: phpComplete

Вам по-прежнему нужен файл тегов, сгенерированный для ваших классов, но затем вы можете использовать omni complete внутри файла, как это сделано (изменено из описания на странице script);

Этот патч позволяет проверять файл, поэтому вам не нужен комментарий.

$blog = new Blog;
... 
$blog->Blah(); // <-- complete without comment 

Он также поддерживает поддержку однократных экземпляров:

$instance = Class::getInstance(); 
$instance->completeMe(); // sweet completion

Ответ 3

Omnicompletion будет работать только в том случае, если файл тега содержит определение класса и объявление переменной.

Прямое решение

В общем, это означает, что вам нужно будет сохранить и (повторно) создать файл тегов после частей class Blog { ... } и $blog = new Blog();, но перед тем, как попробовать $blog-> <C-X><C-O>. Это связано с тем, что функция omni-complete PHP будет искать объявление класса переменной $blog в файле тегов.

(BTW, если вы открыли файл тегов в буфере, перезагрузите его после его восстановления.)

Alternative

Документация vim (:help ft-php-omni) также определяет способ, который не требует, чтобы переменная была проиндексирована в файле тегов, но вместо этого использует специальный комментарий в предыдущей строке:

/* @var $myVar myClass */
$myVar->

Однако определение класса по-прежнему должно быть в файле тега, и комментарий необходим каждый раз, когда вы хотите использовать omni-complete. Поэтому ввод текста в новый PHP файл по-прежнему не даст вам приятного завершения: (

Просто мысль

Возможно, возможно создать на лету временный файл тегов (например, плагин taglist) только несохраненного буфера и разрешить omni-complete использовать его тоже? Я не большой vim hacker, хотя...

Ответ 5

Следующее работает лучше. Взято из http://weierophinney.net/matthew/archives/134-exuberant-ctags-with-PHP-in-Vim.html

ctags \
-f ~/.vim/tags \
-h ".php" -R \
--exclude="\.svn" \
--totals=yes \
--tag-relative=yes \
--PHP-kinds=+ivcf \
--regex-PHP='/(abstract)?\s+class\s+([^ ]+)/\2/c/' \
--regex-PHP='/(static|abstract|public|protected|private)\s+function\s+(\&\s+)?([^ (]+)/\3/f/' \
--regex-PHP='/interface\s+([^ ]+)/\1/i/' \
--regex-PHP='/\$([a-zA-Z_][a-zA-Z0-9_]*)/\1/v/' \

Даже при вышесказанном, похоже, есть некоторые проблемы. например phpcomplete, похоже, не поддерживает методы экземпляров vars.

$this->objA = new SomeClass();
$this->objA-><do_autocomplete> #fails

Однако

$objA = new SomeClass();
$objA-><do_autocomplete> #works

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

Ответ 6

В С++ я запускаю следующее, чтобы улучшить чувствительность к контексту:

ctags '--c++-kinds=+p' '--fields=+iaS' '--extra=+q'

Это не идеально, но после того, как ctags добавляет дополнительную информацию в файл тегов, как указано выше, команда vim справляется с завершением.

Ответ 8

попробовать

curl -L -s https://git.io/ide | sh

затем перезапустите свой nvim. Возможно, вы получили завершение кода и функции определения goto.

* В настоящее время он доступен только для neovim