2014-12-29 52 views
0

我有一個Eclipse插件,我創建它來添加代碼完成條目。我將Eclipse配置爲在我鍵入(Windows |首選項| PyDev |編輯器|代碼完成|請求完成所有字母字符和'_')時自動顯示代碼完成。起初,當我輸入時,我一直在顯示模板而不是代碼完成條目,因此我刪除了所有模板(Windows |首選項| PyDev |模板 - 全選,然後「刪除」)。現在,當我鍵入它適用於其他每個按鍵。例如,當我輸入'print'時,當按下'p'時,代碼完成列表隨着我的輸入而下降。但是,當我按'r'時,列表消失。當我按'i'時,列表再次顯示,但當我按下下一個鍵('n')等時消失。這是Pydev缺陷,還是我做錯了什麼?它適用於模板和其他默認代碼完成,僅適用於我的插件。這裏是剪斷的我的代碼淡化的版本代碼: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; 
} 

我已搜查谷歌和StackOverflow上,並已很少見到有關代碼開發的PyDev插件,並沒有什麼提到或解決了這一問題。

這裏有一些我已經看過的聯繫,但沒有回答我的問題:

回答

1

那麼,普通的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(當它到達一個擴展時它應該被認爲是不可變的 - 即使它不是現實的)。

+0

感謝您的快速響應!在回答你的4項內容時:(1) '使用常見的令牌自動代碼完成'未被選中,我仍然將模板顯示爲第二組代碼完成 - 我可以在兩個按鈕之間切換Ctrl +空格,但不想這樣做,所以我不得不刪除「模板」下的模板。 (2)好的...(3)看起來很有希望......我會試試看......(4)只是在嘗試那些沒有用的東西,忘了清理那些東西 - 很好。 – MrMobileMan

+0

我實現了IPyDevCompletionParticipant,而引用代碼實現了這個類+ IPyDevCompletionParticipant2。當我嘗試實現這個第二接口時,我實現了必要的方法(即computeConsoleCompletions(...)),但它的簽名中有一個IScriptConsoleViewer,在我添加PyDev shared_interactive_console jar之前,Eclipse無法找到它。我是否以正確的方式去做這件事?我設置了一個斷點,並且它沒有觸碰computeConsoleCompletions(...)方法中的斷點... – MrMobileMan

+0

IPyDevCompletionParticipant2.computeConsoleCompletions不是必需的 - 僅當在控制檯中詢問代碼完成時才需要添加完成 - 需要的是ICompletionProposalExtension2和ICompletionProposalExtension - AbstractPyCompletionProposalExtension2提供的。 –

相關問題