Vim PHP всевозможное завершение - PullRequest
33 голосов
/ 04 августа 2009

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

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

Есть ли способ сделать автозаполнение контекстно-зависимым?

Ответы [ 9 ]

17 голосов
/ 13 октября 2010

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

Решение: phpComplete

Это скрипт Vim: phpComplete

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

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

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

Позволяет также поддерживать одноэлементные экземпляры:

$instance = Class::getInstance(); 
$instance->completeMe(); // sweet completion
9 голосов
/ 04 августа 2009
" 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)

7 голосов
/ 23 февраля 2010

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

Простое решение

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

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

Альтернативные

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

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

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

Просто мысль

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

5 голосов
/ 15 ноября 2012

Этот работает как положено:

https://github.com/shawncplus/phpcomplete.vim

Мне просто не хватает параметров функции в pveview!

3 голосов
/ 20 апреля 2011

следующее работает лучше. Взято из 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 работать в течение последних нескольких часов, я советую всем, кто тоже пытается это сделать, - ОСТАНОВИТЬ. Это не работает хорошо и не стоит хлопот.

1 голос
/ 02 марта 2018

Вы можете использовать довольно мощную комбинацию:

Я много чего перепробовал: PHPComplete, Padawan и так далее. Это лучшее, что я смог найти.

Если вам интересно, я также написал статью о том, как сделать PHP IDE с Vim .

1 голос
/ 07 августа 2009

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

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

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

0 голосов
/ 27 сентября 2017

1001 * попробовать *

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

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

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

0 голосов
/ 09 мая 2015

Я создал плагин vim для моего сервера завершения padawan.php . Оформить заказ этого видео , чтобы увидеть, как оно работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...