Vim PHP omni завершение
Я пытаюсь получить автозаполнение PHP прямо в Vim. Прямо сейчас, когда я делаю $blog = new Blog(); $blog->
, а затем ударяю CTRL+X CTRL+O
, я ожидаю, что omnicompletion вернет все функции класса Blog
.
Вместо этого он возвращает все функции для всего проекта. Я построил ctags для моего проекта следующим образом: ctags -R *
Есть ли способ сделать контекстное представление автозаполнения?
Ответы
Ответ 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
Ответ 2
" Assuming Vim 7 (full version) is installed,
" adding the following to your ~/.vimrc should work.
filetype plugin on
au FileType php set omnifunc=phpcomplete#CompletePHP
" You might also find this useful
" PHP Generated Code Highlights (HTML & SQL)
let php_sql_query=1
let php_htmlInStrings=1
" Hope this helps!
(через http://www.linuxquestions.org/questions/linux-software-2/vim-omin-completion-for-php-621940/#post3155311)
Ответ 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, хотя...
Ответ 4
Это работает как ожидалось:
https://github.com/shawncplus/phpcomplete.vim
Мне просто не хватает параметров функции в pveview!
Ответ 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 справляется с завершением.
Ответ 7
Я создал vim плагин для моего padawan.php завершения сервер. Оформить заказ это видео, чтобы увидеть, как он работает.
Ответ 8
попробовать
curl -L -s https://git.io/ide | sh
затем перезапустите свой nvim. Возможно, вы получили завершение кода и функции определения goto.
* В настоящее время он доступен только для neovim