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

Russian main discussion
Post Reply
  • Author
  • Message
Offline
Posts: 19
Joined: Fri Jan 14, 2011 3:29 am

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

Post 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'у в виде плагина.

Offline
Posts: 6
Joined: Thu Aug 22, 2013 9:21 pm

Post by EditPP »

Интересно. даже очень. нашел ваш пост а сам бьюс как раз с скриптом из SublimeCodeIntel. И тут вы описали что "дергать". :)

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

Offline
Posts: 6
Joined: Thu Aug 22, 2013 9:21 pm

Post by EditPP »

Меня смущает что Пи скрипт будет работать долго. жмем клавишу autocomplete- ждем до 2-3 секунд- и потом только видим.

Offline
Posts: 19
Joined: Fri Jan 14, 2011 3:29 am

Post by lexa »

Сначала идёт сбор базы. Ляжет в ~/.codeintel (%userprofile% в Windows). Потом работает быстрее.

Offline
Posts: 6
Joined: Thu Aug 22, 2013 9:21 pm

Post by EditPP »

хм... Вот я открыл один файл в вкладке. вызвал плагин. потом другой файл. вызвал плагин. база будет расти для каждого файлика?

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

Offline
Posts: 19
Joined: Fri Jan 14, 2011 3:29 am

Post by lexa »

Извините, не знаю. :( Так его не копал.

Offline
Posts: 6
Joined: Thu Aug 22, 2013 9:21 pm

Post by EditPP »

Все таки главное- тормоз. у меня скрипт работает 4-6 секунд. это на P4 CPU. слишком долго. вот написать резидента который бы ловил запросы на комплит. это другое дело. тормоз при ините скрипта был бы одноразовым. а так парссинг посли инита быстрый. 1с.

Offline
Posts: 6
Joined: Thu Aug 22, 2013 9:21 pm

Post by EditPP »

Тормоза решились, было слишком много каталогов в path. так оно 1-1.5 с работает.

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

Offline
Posts: 6
Joined: Thu Aug 22, 2013 9:21 pm

Post 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 или ошибка

Offline
Posts: 19
Joined: Fri Jan 14, 2011 3:29 am

Post by lexa »

Пробовал, но безуспешно. :(
Post Reply