Intellisense, PHP, ~Eclipse

kruzer25

Есть "простой" auto-completion (тупой, вроде того, который в виме, который не знает о контексте а есть - умный. Например, если мы набираем $xxx->abc, тупой auto-completion вывалит нам вообще все методы и поля, которые начинаются на abc, а умный будет знать, какого типа переменная $xxx, и покажет только те методы и поля, начинающиеся на abc, которые есть у заданного типа, и которые видны в текущем контексте. MS называют такой умный auto-completion словом intellisense, остальные называют его просто auto-completion.
Есть ли какие-нибудь бесплатные продукты, которые позволяют писать код на PHP, пользуясь всеми прелестями intellisense, кроме Eclipse PDT? Это не обязательно IDE, никакой отладки и прочей интеграции не нужно, только написание кода, подсветка синтаксиса, intellisense, go to definition и поиск методов/типов по имени. Ну и, естественно, работа не с одним файлом, а с кучей.
Пытался гуглить по словам вроде php intellisense emacs, emacs as php ide итп - безрезультатно. Неужели у Eclipse PDT нет никаких конкурентов?

katrin2201

Неужели у Eclipse PDT нет никаких конкурентов?
Есть Зенд студия, построенная поверх PDT. Афаик, все.

kruzer25

Есть Зенд студия, построенная поверх PDT. Афаик, все.
Насколько я понимаю, тут немного другая ситуация - не зенд студия построена поверх PDT, а PDT2 - кусок последней зенд студии.

sergeikozyr

cedet может быть. Насчёт автокомплита сомневаюсь, а навигация быть должна. Как настраивается можно посмотреть вот по ссылке: http://alexott-ru.blogspot.com/

sergeikozyr

 ;;; emacs-rc-cedet.el --- 

;; Copyright (C) 2003 Alex Ott
;;
;; Author: gmail.com
;; Keywords:
;; Requirements:
;; Status: not intended to be distributed yet

(load-file "~/emacs/cedet/common/cedet.el")

(semantic-load-enable-code-helpers)
(global-semantic-idle-completions-mode 1)
(semantic-load-enable-guady-code-helpers)

(setq senator-minor-mode-name "SN")
(setq semantic-imenu-auto-rebuild-directory-indexes nil)
(global-srecode-minor-mode 1)
(global-semantic-mru-bookmark-mode 1)

;; gcc setup
(require 'semantic-gcc)
;; (semantic-gcc-setup "gcc")

;; smart complitions
(require 'semantic-ia)

(setq-mode-local c-mode semanticdb-find-default-throttle
'(project unloaded system recursive
(setq-mode-local c++-mode semanticdb-find-default-throttle
'(project unloaded system recursive
(setq-mode-local erlang-mode semanticdb-find-default-throttle
'(project unloaded system recursive

(require 'eassist)

;; customisation of modes
(defun my-cedet-hook
; (local-set-key "\C-c/" 'semantic-ia-complete-symbol)
(local-set-key [(control return)] 'semantic-ia-complete-symbol)
(local-set-key "\C-c/" 'semantic-ia-complete-symbol-menu)
(local-set-key "\C-c." 'senator-complete-symbol)
;;
(local-set-key "\C-c>" 'semantic-complete-analyze-inline)
(local-set-key "\C-c=" 'semantic-decoration-include-visit)

(local-set-key "\C-cj" 'semantic-ia-fast-jump)
(local-set-key "\C-cp" 'semantic-analyze-proto-impl-toggle)
)
(add-hook 'c-mode-common-hook 'my-cedet-hook)
(add-hook 'lisp-mode-hook 'my-cedet-hook)

(defun my-c-mode-cedet-hook
; (local-set-key "." 'semantic-complete-self-insert)
; (local-set-key ">" 'semantic-complete-self-insert)
(local-set-key "\C-ct" 'eassist-switch-h-cpp)
(local-set-key "\C-xt" 'eassist-switch-h-cpp)
)
(add-hook 'c-mode-common-hook 'my-c-mode-cedet-hook)

;;
(setq-default semanticdb-default-save-directory "~/tmp/semantic")

(semantic-add-system-include "~/exp/include" 'c++-mode)
(semantic-add-system-include "~/exp/include" 'c-mode)

(custom-set-variables
'(semantic-idle-scheduler-idle-time 10)
)

;; (semantic-load-enable-all-exuberent-ctags-support)
;; (semantic-enable-exuberent-ctags 'c-mode)
;; (semantic-enable-exuberent-ctags 'c++-mode)

;;; ede customization
(require 'semantic-lex-spp)
(global-ede-mode t)

;; cpp-tests project definition
(ede-cpp-root-project "cpp-tests" :file "~/projects/lang-exp/cpp/CMakeLists.txt"
:system-include-path '("/home/ott/exp/include"
"/home/ott/exp/include/boost-1_37"
(ede-cpp-root-project "text-categorization" :file "~/projects/text-categorization/CMakeLists.txt"
:system-include-path '("/home/ott/exp/include"
"/home/ott/exp/include/boost-1_37"
(ede-cpp-root-project "wfilter" :file "~/projects/wfilter/README"
:system-include-path '("/home/ott/exp/include"
"/home/ott/exp/include/boost-1_37"

;;; emacs-rc-cedet.el ends here

kruzer25

Да, действительно, невнимательно на результаты поиска смотрел - вот ’んJ LJK;YJ んJ-んJ 絵VTんM^ http://sourceforge.net/projects/php-mode/
Правда, там, наверное, замучаешься всё это собирать и настраивать... и непонятно, будет ли там умный автокомплит (хотя, вроде бы, 忌めぬ - оно).

pitrik2

а как тогда идеевский автокомплишен называется?
там вываливают не все методы ентого объекта, а все те у которых тип возвращаемого объекта впишется в контекст
int a = $xxx->abc;
вывалятся токо abc возвращающие int
аааа, для php это наверна бессмысленно, т.к. нетипизированный язык

kruzer25

int a = $xxx->abc;
вывалятся токо abc возвращающие int
Лол. А если я хотел написать int a = $xxx->abc->getLength; ?
аааа, для php это наверна бессмысленно, т.к. нетипизированный язык
Для типизированных языков тоже не особо.

pitrik2

Лол. А если я хотел написать int a = $xxx->abc->getLength; ?
тогда надо два раза нажать
и список выпадет сразу двойной и по ентеру двойной подставится

pitrik2

Для типизированных языков тоже не особо.
постоянно пользуюсь этим в джаве
чяднт?

kruzer25

тогда надо два раза нажать
и список выпадет сразу двойной и по ентеру двойной подставится
А если $xxx->abc->def->ghi->jkl->mno->getLength ?
А если я не помню, через сколько шагов я получу нужный результат?
Имхо, бесполезная вещь.
ЗЫ: Имхо, и от явной типизации локальных переменных не очень много толку. Явная типизация нужна для полей/свойств объектов и аргументов/возвращаемого значения методов.

katrin2201

А если я не помню, через сколько шагов я получу нужный результат?
А если я хочу, чтоб код сам писался?
ЗЫ
Надо понимать, что смарт-автокомплит подсказывает не только имена методов, но так же имена классов (Set<String> a = new ...*Ctrl-Shif-Space* выдаст все имплементации интерфейса Set, с правильным генериком имена локальных переменных, итд.
Любому человеку, хоть немного поработавшему со смарт-автокомплитом, его преимущества очевидны.
Думаю, ты и сам можешь понять, если каждый раз при использовании простого комплита будешь задумываться, насколько бы помог тебе в данном случае смарт-автокомплит.
Ну и про отсутствие пользы типизированных параметров - это просто финиш...

kruzer25

Надо понимать, что смарт-автокомплит подсказывает не только имена методов, но так же имена классов (Set<String> a = new ...*Ctrl-Shif-Space* выдаст все имплементации интерфейса Set, с правильным генериком)
Не знаю, как у вас, а у нас можно писать List<string> a = new SomeClass(someargs).ToList;
Правда, тут это уже имеет какую-то пользу, потому что эта фича (new XXX.yyy) используется довольно редко.
Ну и про отсутствие пользы типизированных параметров - это просто финиш...
Про отсутствие пользы в явно указанных типах. Зачем писать List<string> a = new List<string> если можно написать var a = new List<string>?
Думаю, ты и сам можешь понять, если каждый раз при использовании простого комплита будешь задумываться, насколько бы помог тебе в данном случае смарт-автокомплит.
Такой автокомплит, о котором ты говоришь - минимум в 90% случаев не помог бы никак. Я в своём C# модуле очень редко пишу a = b.c, обычно точек гораздо больше одной.

pitrik2

Такой автокомплит, о котором ты говоришь - минимум в 90% случаев не помог бы никак. Я в своём C# модуле очень редко пишу a = b.c, обычно точек гораздо больше одной.
ну значит первые n-2 точки ты напишешь без смарт-автокомплита, а последние 2 с ним
чо те не нравится то?

Dasar

ну значит первые n-2 точки ты напишешь без смарт-автокомплита
на n-2 больше нажатий клавиш

katrin2201

Про отсутствие пользы в явно указанных типах. Зачем писать List<string> a = new List<string> если можно написать var a = new List<string>?
Мы говорим не о явном задании типа переменной, а об их строгой типизированности. А насколько я помню, задание переменной указанным тобой способом в сишарпе не лишает ее строгой типизированности.
Такой автокомплит, о котором ты говоришь - минимум в 90% случаев не помог бы никак. Я в своём C# модуле очень редко пишу a = b.c, обычно точек гораздо больше одной.
Я не понимаю, почему мы жуем элементарные вещи. Тем не менее, поясню.
Ты эту лесенку как пишешь, одним махом что ли?
Я думаю, сначала ты автокомплитом по кэмелкейсу добираешься до конца (или как это происходит в твоей среде а в конце уже выбираешь итоговый метод, не так ли? И вот в самом конце вполне может пригодиться смарт-автокомплит метода.
Меня этот смарт-автокомплит очень спасает, когда я выдергиваю ресурс какой-нибудь. Выдергивается он как правило из либы, помнить что там и где наизусть ломает, а ресурс обычно довольно специфичный класс имеет, так что тут даже глядеть не надо - жмешь, и вуаля.
Плюс, двойной Ctrl-Shift-Space тоже спасает, уже конечно в меньшем количестве случаев. Мне обычно надобится когда строку надо вытащить из дебрей очередного ящика.
Понятно, что применимость у смарт-автокомплита ограничена, но а чего ты ожидал? Чтобы по смартавтокомплиту код сам писался что ли?

kruzer25

Мы говорим не о явном задании типа переменной, а об их строгой типизированности. А насколько я помню, задание переменной указанным тобой способом в сишарпе не лишает ее строгой типизированности.
Я с этим и не спорю.
И вот в самом конце вполне может пригодиться смарт-автокомплит метода.
Только в самом конце. А все остальное время он будет только мешать (или я не понимаю, как он будет показывать и "подходящие" методы, и все методы нужного объекта вообще).
Понятно, что применимость у смарт-автокомплита ограничена, но а чего ты ожидал?
Я ничего не ожидал, и не я о нём заговорил.

katrin2201

Только в самом конце. А все остальное время он будет только мешать (или я не понимаю, как он будет показывать и "подходящие" методы, и все методы нужного объекта вообще).
Там разделение, типа Ctrl-Space - тупой автокомплит всего, чего вижу и подходит по кэмелкейсу.
Ctrl-Shift-Space - смарт, то о чем мы говорили.
Ctrl-Alt-Space - автокомплит по всем классам, в т.ч. незаимпортенным.
Собственно, это разнообразие автокомплитов при должной привычке позволяет писать код очень быстро, какие бы там длинные названия у классов/методов там ни были. Более того, это главная причина, почему я не живу под эклипсом (или любой другой джава-иде). К слову сказать, в эклипсе есть много приятных мулек, которых нету в идее, но...
Я ничего не ожидал, и не я о нём заговорил.
Но ты , что это вещь бесполезная. А это далеко не так.
В общем ладно, проехали.

kruzer25

Но ты сказал, что это вещь бесполезная. А это далеко не так.
Я там написал "имхо".
Для меня эта вещь как была бесполезной, так и осталась.

katrin2201

Для меня эта вещь как была бесполезной, так и осталась.
Ну и зря =)

kokoc88

Ну и зря =)
Дискуссия проходит в обычном авторском стиле. Как можно переубедить человека, кругозор которого имеет минимально возможный радиус?
Во-первых, он имеет понятие только о шарпе и пхп. А надо сказать, что там весьма ограниченный набор некоторых вещей. Например, в шарпе весьма скудный набор коллекций. Поэтому писать поле, которое имеет тип конкретной коллекции, для обычного глупого кодера вполне приемлемо.
Во-вторых, следует помнить предыдущие споры автора, связанные с ООП. Для него вполне естественно иметь архитектуру типа "полный граф". Это значит, что количество ситуаций, в которых нужен smart completion, будет стремиться к нулю.
В-третьих, автор не любит читать и понимать посты других людей. Это можно понять как по предыдущим его постам, так и по сегодняшним. Например, только так можно заикнуться про десять дружественных классов после того, как собеседник упомянул про уменьшение зависимостей.

katrin2201

Автор растет потихоньку =)
В контексте одного треда его переубедить действительно невозможно, тем не менее можно надеяться, что какие-то сомнения в его душе зародились =)
Кстати, интересный вопрос к автору, пользует ли он решарпер?

Andbar

Лол. А если я хотел написать int a = $xxx->abc->getLength; ?
Пример автокомплита, который я в своё время считал близким к идеалу - IDE Delphi. Для такого случая там предлагаются все варианты, из которых можно получить значение данного типа или значение, приводимое к данному типу. Плюс умная сортировка по значимости.

klyv

Плюс умная сортировка по значимости.
она мешает, когда исследуешь библиотеку и просто прочитываешь подряд всё, что есть в классе.

alfadred

она мешает, когда исследуешь библиотеку и просто прочитываешь подряд всё, что есть в классе.
Для этого документация есть.

klyv

Для этого документация есть.
далеко не у всех систем есть что-то замечательное вроде MSDN

Andbar

далеко не у всех систем есть что-то замечательное вроде MSDN
у Delphi 7 справка удобнее MSDN'овской хотя-бы тем, что быстрее работает :grin: Как с другими версиями - хз.
А для слабодокументированных либ при таком нецелевом использовании автокомплита это как раз помогает: вряд-ли тебя будут интересовать методы TObject, вот они и выкинуты в конец списка.

kruzer25

собеседник упомянул про уменьшение зависимостей
Собеседник не упоминал про уменьшение зависимостей.
Например, только так можно заикнуться про десять дружественных классов
А сколько их должно быть, по-твоему? Не больше одного?
А что же делать с, например, (str.getLength > 10)? Это же ужас, знаем аж о двух классах, так нельзя, надо навесить на string новый метод isLengthMoreThan(int)... ну, вы поняли.
Конечно, чем меньше знания о других классах, тем лучше; но до абсурда-то доводить не надо, "десять" - вполне нормальное число.

kokoc88

Собеседник не упоминал про уменьшение зависимостей.
Ну, вы поняли...
А сколько их должно быть, по-твоему? Не больше одного?

Их должно быть мало. И поэтому нельзя аргументировать бесполезность smart completion тем, что их может быть много.

kruzer25

И поэтому нельзя аргументировать бесполезность smart completion тем, что их может быть много
"Мало", "много" - это сколько?
И я не говорил, что их может быть много. Весь твой smart completion теряет смысл уже тогда, когда используется хотя бы один промежуточный тип. А до этого вообще говорилось, что нельзя писать больше одной точки - это уже полный пц.

kokoc88

И я не говорил, что их может быть много. Весь твой smart completion теряет смысл уже тогда, когда используется хотя бы один промежуточный тип.
Во-первых, он не мой. Во-вторых, smart completion вызывается не всегда. Тебе это уже сверху объяснили и разжевали, но ты не прочитал, не понял, и сделал однозначный вывод: нахер надо. Ты не можешь понять полезность smart completion лишь в силу своей ограниченности.
Давай для примера перейдём на Java. Я пишу поле класса Set<SomeType> = new, а затем smart completion выдаёт список всех реализаций, одну из которых я выбираю. Это пример, когда он просто необходим и часто используется. Тоже самое возможно и в шарпе, просто оно менее развито. Поэтому некоторые неопытные кодеры не могут этого понять.

klyv

у Delphi 7 справка удобнее MSDN'овской хотя-бы тем, что быстрее работает Как с другими версиями - хз.
Не знаю, не пробовал :) MSDN (после того как загрузится) работает достаточно быстро
А для слабодокументированных либ при таком нецелевом использовании автокомплита это как раз помогает: вряд-ли тебя будут интересовать методы TObject, вот они и выкинуты в конец списка.
если только это используется, то, да, куль.

Andbar

Не знаю, не пробовал :) MSDN (после того как загрузится) работает достаточно быстро
она может правильно вызываться из редактора/дизайнера форм/редактора свойств (вызывая справку по выделенному слову/компоненту/свойству)? На сколько я помню, из IDE по дефолту (в большинстве случаев) вызывается немного не та справка (и мне лень было разбираться). В 2003й студии, кстати, мсдн более тесно/удачно интегрирован.

klyv

На сколько я помню, из IDE по дефолту (в большинстве случаев) вызывается немного не та справка (и мне лень было разбираться).
эээ... ни разу не сталкивался с такой проблемой...
конечно, из какого-нить Immediate Window не то вызывается, но обычно то, что надо.
Хотя лучше бы интегрировались с XML Documentation поплотнее (всё равно, как я понимаю, MSDN во многом из неё компилится).
Оставить комментарий
Имя или ник:
Комментарий: