Она позволяет парсить исходный код на языках Python, Perl, Ruby, PHP, JavaScript, Tcl, LESS, SCSS, и некоторых других, и делать следующее:
- находить список auto-completions к нужным именами,
- находить строки объявления функций (с их параметрами),
- находить позицию объявления имен переменных/функций в коде.
Библиотеку можно скачать со страницы проекта SublimeCodeIntel (части находятся в папках libs и arch), а «нормальной» страницы библиотеки на сайте ActiveState я не нашел — не афишируют ее они. От SublimeCodeIntel вы возьмете версию для Python 2.6, именно 2.6, а не 2.7, т.к. там есть бинарники, которые собраны под 2.6 (так было когда я ее брал).
API не очень уклюжее у CodeIntel. Официального туториала по CodeIntel я не нашел. Рассмотрим простой пример, как, скажем, найти список completions к некоторому имени класса.
Пусть у нас есть файл на Питоне «test.py»:
# test class class CName: prop1 = 0 prop2 = 1 def __init__(self, val1, val2): pass def func1(self, par1, par2 = 10, par3 = None): return par1 + par2 * par3; def func2(self, l = [], count = 0): return l[:count] c = CName() c.
Задача: получить список completions к имени объекта «c» с точкой. По коду видно, что должно получиться — это 2 свойства prop1, prop2 и 3 метода __init__, func1, func2. Пишем наш скрипт «run.py»:
import sys import os class Info(object): # our demo data pass info = Info() info.timeout = 15 # max timeout for id searching, sec info.filename = sys.argv[1] # source file name (py, php, pl, etc) _codeintel = r'g:\_CodeIntel' # path to libs/arch folders sys.path.insert(0, os.path.join(_codeintel, 'arch')) sys.path.insert(0, os.path.join(_codeintel, 'libs')) from codeintel2.manager import Manager from codeintel2.common import EvalController # need to reset Codeintel cache? if info.filename == '_reset_': mgr = Manager() mgr.db.reset(False) exit(0) sys.path.append(os.path.basename(info.filename)) info.filepos = os.path.getsize(info.filename) # get end-of-file pos 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) mgr = Manager() mgr.upgrade() mgr.initialize() # read file buf = mgr.buf_from_path(info.filename) buf.scan() # get trigger trg = buf.trg_from_pos(info.filepos) result1, result2 = _do(buf, trg, info.timeout) print 'auto-complete result:' for s1, s2 in result1: print s1, s2 mgr.finalize()
По комментариям примерно видно, как использовать codeintel. Пускаем «python path\run.py path2\test.py», получаем ответ:
auto-complete result: function func1 function func2 variable prop1 variable prop2 variable __class__ variable __doc__ function __init__
Прим.: скрипт run.py ищет результат для позиции «конец файла», если позиция «каретки» нужна другая, то скрипт надо поправить.
Так же можно получить и function call-tip для, например, функции c.func1: для этого в скрипте надо вывести не result1, а result2. Только файл test.py надо будет поправить — окончить его на такую строку: c.func1(
.
Ну и наконец. Codeintel создает огроменный кеш в районе "%userprofile%\.codeintel". В run.py показано, как этот кеш очистить.
ссылка на оригинал статьи http://habrahabr.ru/post/194140/
Добавить комментарий