Page 1 of 1

Интеграция Code Intelligence

Posted: Mon May 13, 2013 5:29 pm
by lexa
Привет.

У Komodo IDE есть отличная штука для автокомплита - Code Intelligence. Она доступна под лицензией MPL, как часть Open Komodo. К сожалению, я второй день не могу достучаться до их SVN-репозитория поэтому использую код библиотеки из проекта SublimeCodeIntel (плагин к Sublime Text).

Привожу пример работы Code Intelligence. Тестовые файлы созданы в директории [SublimeCodeIntel-master]\libs\ для простоты использования.

Для работы нужен Python 2.6. С 2.7 проблемы у модуля SilverCity (нужно перекомпилировать модули pyd в директориях _sys, где sys ваша система - _win32, _linux_libcpp6_x86 и т.д.).

Для теста я создал три файла:
_test.php - основной "код",
_test2.php - файл для подключения,
_test.py - точка входа.

_test.php:

Code: Select all

<?
include '_test2.php';

$testo = new Test;
$testo->
_test2.php:

Code: Select all

<?
class Test {
    public $var = 10;

    public function hello(){
    }

    public function nice(){
    }

    public function __get($name){
    }

    public function toString(){
    }
}
_test.py:

Code: Select all

from codeintel2.manager import Manager;

mgr = Manager();
mgr.upgrade();
mgr.initialize();

try:
    buf = mgr.buf_from_path('_test.php', 'PHP', None, 'utf-8');
    buf.scan();

    trg = buf.trg_from_pos(57);
    cplns = buf.cplns_from_trg(trg, 2);
    
    print cplns;

    mgr.finalize();
except Exception, e:
    print e;
И запуск:

Code: Select all

python _test.py

Code: Select all

[('function', 'hello'), ('function', 'nice'), ('function', 'toString'), ('function', '__get')]
Достаточно интересно, правда? Code Intelligence поддерживает не только пользовательские, но, конечно же, и стандартные библиотеки языков. Достаточно ввести "str" и CI выдаст все строковые функции совпадающие с именем.

Я первым делом решил интегрировать Code Intelligence для себя через внешний JScript API. Но алгоритм пришедший в голову, мягко говоря, дикий: exec + чтение stdout + ShowMenu.js (как дополнять окошечко автокомплита плагина Coder я не представляю).

Наверное, я смог бы использовать код в Си подключив python.h и по схеме. Но точно не смогу подключить решение к AkelPad'у в виде плагина.

Posted: Thu Aug 22, 2013 9:24 pm
by EditPP
Интересно. даже очень. нашел ваш пост а сам бьюс как раз с скриптом из SublimeCodeIntel. И тут вы описали что "дергать". :)

Я не для Акеля это, а для своей программы (если интересно, личкой).

Posted: Thu Aug 22, 2013 10:04 pm
by EditPP
Меня смущает что Пи скрипт будет работать долго. жмем клавишу autocomplete- ждем до 2-3 секунд- и потом только видим.

Posted: Thu Aug 22, 2013 10:10 pm
by lexa
Сначала идёт сбор базы. Ляжет в ~/.codeintel (%userprofile% в Windows). Потом работает быстрее.

Posted: Thu Aug 22, 2013 10:16 pm
by EditPP
хм... Вот я открыл один файл в вкладке. вызвал плагин. потом другой файл. вызвал плагин. база будет расти для каждого файлика?

А как подсунуть codeintel-у файл конфигурации, под Win? не знаете? который .codeintel/config.

Posted: Thu Aug 22, 2013 10:17 pm
by lexa
Извините, не знаю. :( Так его не копал.

Posted: Fri Aug 23, 2013 12:31 am
by EditPP
Все таки главное- тормоз. у меня скрипт работает 4-6 секунд. это на P4 CPU. слишком долго. вот написать резидента который бы ловил запросы на комплит. это другое дело. тормоз при ините скрипта был бы одноразовым. а так парссинг посли инита быстрый. 1с.

Posted: Fri Aug 23, 2013 8:28 pm
by EditPP
Тормоза решились, было слишком много каталогов в path. так оно 1-1.5 с работает.

можно исп-ть.

Posted: Wed Aug 28, 2013 2:25 pm
by EditPP
lexa
Вы не пробовали получить не только autocomplete, но еще и declararion position?

Code: Select all

from codeintel2.manager import Manager
from codeintel2.common import EvalController             

def _do(buf, trg, timeout):
    ctlr = EvalController()
    buf.async_eval_at_trg(trg, ctlr)
    ctlr.wait(timeout)
    if not ctlr.is_done():
        ctlr.done("timed out")
        ctlr.abort()
        raise EvalTimeout("eval for %s timed-out" % trg)
    return (ctlr.cplns, ctlr.calltips, ctlr.defns)

mgr = Manager()
mgr.upgrade()
mgr.initialize()

buf = mgr.buf_from_path(info.filename)
buf.scan()
    
trg = buf.trg_from_pos(_pos)
result = _do(buf, trg, _timeout)
print result
я взял _do из кода codeintel. в tuple возвращаю
1) autocomplete
2) calltips
3) definition pos.

если передать позицию в trg сразу после "$testo->", то первое есть.
если передать позицию в trg сразу после "$testo->test(", то второе есть.
а вот третьего НЕТ. никак не получить. все время None или ошибка

Posted: Fri Aug 30, 2013 8:19 am
by lexa
Пробовал, но безуспешно. :(