1

如何在 PyDev Jython 脚本中注册更改文本的通知?

我想为 PyDev 编写一个 Jython 脚本,它将分析编辑器中的文本,然后在某些情况下向文本添加一些注释。每次用户键入内容时,分析应该再次运行。

我通读了PyDev 中 Jython 脚本的介绍,并查看了示例脚本,但它们似乎都是从命令键触发的。我查看了PyEdit 类,看起来我应该注册IPyEditListener3 的 onInputChanged 事件

我尝试了下面的脚本,但它似乎没有调用我的事件处理程序。我错过了什么?

if False:
    from org.python.pydev.editor import PyEdit #@UnresolvedImport
    cmd = 'command string'
    editor = PyEdit

#-------------- REQUIRED LOCALS
#interface: String indicating which command will be executed
assert cmd is not None 

#interface: PyEdit object: this is the actual editor that we will act upon
assert editor is not None

print 'command is:', cmd, ' file is:', editor.getEditorFile().getName()
if cmd == 'onCreateActions':
    from org.python.pydev.editor import IPyEditListener #@UnresolvedImport
    from org.python.pydev.editor import IPyEditListener3 #@UnresolvedImport

    class PyEditListener(IPyEditListener, IPyEditListener3):
        def onInputChanged(self, 
                           edit, 
                           oldInput, 
                           newInput, 
                           monitor):
            print 'onInputChanged'

    try:
        editor.addPyeditListener(PyEditListener())
    except Exception, ex:
        print ex

print 'finished.'
4

1 回答 1

1

仅当某些编辑器绑定到一个文件然后绑定到另一个文件(而不是文档更改)时,才应调用 onInputChanged。

您可以通过收听命令“onSetDocument”上的文档更改来实现您想要的:

if False:
    from org.python.pydev.editor import PyEdit #@UnresolvedImport
    cmd = 'command string'
    editor = PyEdit

#-------------- REQUIRED LOCALS
#interface: String indicating which command will be executed
assert cmd is not None 

#interface: PyEdit object: this is the actual editor that we will act upon
assert editor is not None

print 'command is:', cmd, ' file is:', editor.getEditorFile().getName()
if cmd == 'onSetDocument':
    from org.eclipse.jface.text import IDocumentListener
    class Listener(IDocumentListener):

        def documentAboutToBeChanged(self, ev):
            print 'documentAboutToBeChanged'

        def documentChanged(self, ev):
            print 'documentChanged'

    doc = editor.getDocument()
    doc.addDocumentListener(Listener())

print 'finished.'

请注意您将要执行的操作,因为当用户键入内容时,它将在主线程中运行(在这种情况下,您绝对不希望您想要的东西变慢 - 如果您只是在分析当前行,事情应该没问题,但是如果您对整个文档运行启发式算法,事情可能会变慢)。

于 2012-06-12T12:15:22.373 回答