2014-12-29 4 views
0

У меня есть подключаемый модуль Eclipse, который я создал для добавления записей о завершении кода. Я настроил Eclipse для автоматического отображения кода при вводе (Windows | Preferences | PyDev | Редактор | Кодовое завершение | Запрос завершения на всех символах букв и «_»?). Сначала, когда я набрал, я продолжал получать шаблоны вместо моих записей о завершении кода, поэтому я удалил все шаблоны (Windows | Preferences | PyDev | Templates - выбрал все, а затем «Удалить»). Теперь, когда я печатаю его, он работает правильно для всех остальных нажатых клавиш. Например, когда я печатаю «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 плагин, и ничего, что не упоминает или адрес этой проблемы ,

Вот несколько ссылок, я посмотрел на, но никто не ответил на мой вопрос:

ответ

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 + space , но не хотел этого, поэтому мне пришлось удалить шаблоны в разделе «Шаблоны». (2) ОК ... (3) Это выглядит многообещающим ...Я попробую ... (4) Пробовал только то, что не сработало, и забыл очистить это - хорошо поймать. – MrMobileMan

+0

Я реализую IPyDevCompletionParticipant, в то время как эталонный код реализует этот класс + IPyDevCompletionParticipant2. Когда я пытаюсь реализовать этот второй интерфейс, я реализую необходимые методы (а именно computeConsoleCompletions (...)), но у него есть IScriptConsoleViewer в сигнатуре, которую Eclipse не может найти для меня, пока я не добавлю банку PyDev shared_interactive_console. Правильно ли я это делаю? Я установил точку останова и не ударил точку останова в методе computeConsoleCompletions (...) ... – MrMobileMan

+0

IPyDevCompletionParticipant2.computeConsoleCompletions не требуется - это необходимо только для добавления завершений при запросе кода в консоли - что нужно, это ICompletionProposalExtension2 и ICompletionProposalExtension, которые предоставляет AbstractPyCompletionProposalExtension2. –