PyDev 自定义代码完整插件仅检测每隔一次击键



我创建了一个 Eclipse 插件来添加代码完成条目。 我将 Eclipse 配置为在我键入时自动显示代码完成(Windows |偏好 |PyDev |编辑 |代码完成 |请求完成所有字母字符和"_"? 起初,当我键入时,我一直显示模板而不是我的代码完成条目,所以我删除了所有模板( Windows |偏好 |PyDev |模板 - 全部选中,然后"删除")。 现在,当我键入它时,它适用于按下的所有其他键。 例如,当我键入"print"时,当我按"p"时,代码完成列表会按预期下拉我的条目。 但是,当我按"r"时,列表消失了。 当我按"i"时,列表再次显示,但当我按下一个键("n")时消失,依此类推。 这是 Pydev 的缺陷,还是我做错了什么? 它适用于模板和其他默认代码完成,但不适用于我的插件。 这是我代码的淡化版本截取的代码:

//...
public class MyPlugin implements IPyDevCompletionParticipant
@Override
public Collection<Object> getGlobalCompletions(CompletionRequest arg0,
    ICompletionState arg1) throws MisconfigurationException {
    String replacementString = "{" + arg0.qualifier + "}";
    int replacementOffset = arg0.documentOffset - arg0.qlen;
    int replacementLength = arg0.qlen;
    int cursorPosition = arg0.documentOffset;
    String displayString = arg0.qualifier;
    final IContextInformation contextInformation = new ContextInformation(
            "displayStr", "message");
    String additionalProposalInfo = "additionalProposalInfo";
    final String bundle = "com.github.EclipseChameleonPlugins";
    final org.eclipse.swt.graphics.Image image = new org.eclipse.swt.graphics.Image(getDisplay(), locateFile(bundle, "icons/smiley.gif").getPath());
    arg0.showTemplates = false;
    final CompletionProposal proposal = new CompletionProposal(
        replacementString, replacementOffset, replacementLength,
        cursorPosition, image, displayString, contextInformation, additionalProposalInfo);
    List<ICompletionProposal> proposals = new ArrayList<ICompletionProposal>();
    // ADD IT...
    proposals.add(proposal);
    final Collection<Object> returnProposals = new ArrayList<Object>(
            proposals);
    return returnProposals;
}

我搜索了Google和StackOverflow,很少看到有关PyDev插件的代码开发,也没有提到或解决这个问题。

以下是我看过的一些链接,但没有一个回答我的问题:

  • 在 PyDev 中自动完成
  • 不适用于 PyDev 的自定义模块的代码完成
  • pydev 远程调试 - 交互式控制台中的代码完成?

好吧,普通的 PyDev 对我来说是预期的(即:代码完成出现在所有击键上)。

现在,让我们看看我们是否可以更好地追踪它:

  1. 您应该做的不是删除模板,而是转到 Pydev>编辑器>首选项>代码完成(CTX 不敏感和通用令牌)并禁用"使用通用令牌自动代码完成?

  2. 您需要遵循的参考代码是:com.python.pydev.codecompletion.participant.ImportsCompletionParticipant 和 com.python.pydev.codecompletion.ctxinsensitive.CtxParticipant (即:IPyDevCompletionParticipant 界面 - 就像您已经做的那样)

  3. 我认为您遇到的主要问题是因为您没有实现完成的其他扩展(以验证其上下文并将其保留在那里) - 您可以创建自己的org.python.pydev.editor.codecompletion.AbstractPyCompletionProposalExtension2的子类,或者您可以使用org.python.pydev.editor.codecompletion.PyLinkedModeCompletionProposal(只是使用适当的参数构造它 - 我相信它支持具有空的IToken - 您可以将图像传递给如果令牌为空,则将使用它)。

  4. 你可能不应该在这一点上弄乱 CompletionRequest(当它到达扩展时,它应该被认为是不可变的——即使它实际上不是)。

最新更新