可以在TextMate中实现Python代码补全吗?

21 投票
4 回答
8434 浏览
提问于 2025-04-11 20:30

PySmell 看起来是个不错的起点。

我觉得这是可行的,PySmell 的 idehelper.py 处理了大部分复杂的事情,主要就是给它当前的代码行,提供一些补全选项(这一点我不太确定),然后用选中的内容替换掉原来的行。

>>> import idehelper
>>> # The path is where my PYSMELLTAGS file is located:
>>> PYSMELLDICT = idehelper.findPYSMELLDICT("/Users/dbr/Desktop/pysmell/")
>>> options = idehelper.detectCompletionType("", "" 1, 2, "", PYSMELLDICT)
>>> completions = idehelper.findCompletions("proc", PYSMELLDICT, options)
>>> print completions
[{'dup': '1', 'menu': 'pysmell.pysmell', 'kind': 'f', 'word': 'process', 'abbr': 'process(argList, excluded, output, verbose=False)'}]

虽然它永远不会完美,但会非常有用(即使只是用来补全标准库模块,因为这些模块是不会变化的,所以你不需要每次添加函数时都重新生成 PYSMELLTAGS 文件)。


进展中!我已经实现了补全的基本功能——虽然几乎不能用,但已经很接近了。

我运行了 python pysmells.py /System/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/*.py -O /Library/Python/2.5/site-packages/pysmell/PYSMELLTAGS

把下面的内容放到 TextMate 的包脚本里,设置“输入:整个文档”,“输出:插入为文本”,“激活:快捷键:alt+esc”,“范围选择器:source.python”。

#!/usr/bin/env python

import os
import sys
from pysmell import idehelper

CUR_WORD = os.environ.get("TM_CURRENT_WORD")

cur_file = os.environ.get("TM_FILEPATH")
orig_source = sys.stdin.read()
line_no = int(os.environ.get("TM_LINE_NUMBER"))
cur_col = int(os.environ.get("TM_LINE_INDEX"))

# PYSMELLS is currently in site-packages/pysmell/
PYSMELLDICT = idehelper.findPYSMELLDICT("/Library/Python/2.5/site-packages/pysmell/blah")
options = idehelper.detectCompletionType(cur_file, orig_source, line_no, cur_col, "", PYSMELLDICT)
completions = idehelper.findCompletions(CUR_WORD, PYSMELLDICT, options)

if len(completions) > 0:
    new_word = completions[0]['word']
    new_word = new_word.replace(CUR_WORD, "", 1) # remove what user has already typed
    print new_word

然后我新建了一个 Python 文档,输入“import urll”,按下 alt+escape,结果它补全成了“import urllib”!

正如我所说,这完全是一个正在进行中的项目,所以现在还不要使用它。


最后更新:

orestis 已经把这个功能整合进了 PySmell 项目的代码里!后续的调整会在 github 上进行。

4 个回答

1

虽然不是完美的,但你可以试试看这个链接:http://mtod.org/tempy

4

这可能不是你想要的内容,但可以帮助你入门:

在Django中使用TextMate

这些内容看起来有点针对Django,但其中的一些代码片段可能对你有帮助。你也可以在这个基础上使用PySmells来进一步开发。

9

编辑:我实际上把你上面的代码整合进了一个命令里。这样你就可以看到一个完成列表,方便你选择。

你可以在这里下载:http://github.com/orestis/pysmell/tree/master(点击下载,然后运行 python setup.py install)。虽然还有点粗糙,但可以用。- 如果有任何错误,请在这里反馈:http://code.google.com/p/pysmell/

--

你好,我是 PySmell 的开发者。我也在用 Mac,所以如果你能发封邮件给我(联系方式在源代码里),告诉我你的进展,我可以尝试把它整合进来 :)

哦,对了,它叫 PySmell - 后面没有 's' 哦 :)

撰写回答