Полный плагин пользовательского кода PyDev обнаруживает только каждое второе нажатие клавиши

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

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


person MrMobileMan    schedule 29.12.2014    source источник


Ответы (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 в этот момент (когда он попадает в расширение, его следует считать неизменяемым, даже если это не так).

person Fabio Zadrozny    schedule 29.12.2014
comment
Спасибо за быстрый ответ! В ответ на ваши 4 пункта: (1) «использовать автоматическое завершение кода с общими токенами» не было отмечено, и я все еще получал шаблоны, отображаемые как второй набор дополнений кода - я мог переключаться между ними с помощью ctrl + пробел, но не хотел этого, поэтому мне пришлось удалить шаблоны в разделе «Шаблоны». (2) Хорошо... (3) Выглядит многообещающе... Попробую... (4) Пробовал что-то, что не сработало, и забыл почистить - хороший улов. - person MrMobileMan; 30.12.2014
comment
Я реализую IPyDevCompletionParticipant, а эталонный код реализует этот класс + IPyDevCompletionParticipant2. Когда я пытаюсь реализовать этот второй интерфейс, я реализую необходимые методы (а именно, calculateConsoleCompletions(...)), но у него есть IScriptConsoleViewer в сигнатуре, которую Eclipse не может найти для меня, пока я не добавил банку PyDev shared_interactive_console. Правильно ли я поступаю? Я установил точку останова, и она не попадает в точку останова в методе calculateConsoleCompletions(...)... - person MrMobileMan; 30.12.2014
comment
IPyDevCompletionParticipant2.computeConsoleCompletions не нужен — он нужен только для добавления дополнений, когда в консоли запрашивается завершение кода — нужны ICompletionProposalExtension2 и ICompletionProposalExtension — которые предоставляет AbstractPyCompletionProposalExtension2. - person Fabio Zadrozny; 30.12.2014
comment
Я изменил сигнатуру класса на: ... реализует IPyDevCompletionParticipant, IPyDevCompletionParticipant2, ICompletionProposalExtension2, ICompletionProposalExtension и реализовал необходимые методы, но я все еще не нажимаю ни один из недавно добавленных методов (точки останова)... Нужно ли мне что-то добавлять в мой plugin.xml, чтобы использовать другую точку расширения? - person MrMobileMan; 30.12.2014
comment
Единственное, что вам нужно сделать, это добавить точку расширения для регистрации вашего подкласса IPyDevCompletionParticipant: › -- кроме того, пробовали ли вы расширять AbstractPyCompletionProposalExtension2? (в котором уже реализована большая часть этого протокола) - person Fabio Zadrozny; 30.12.2014
comment
У меня было установлено расширение для pydev_completion в файле plugin.xml, и именно так запускается плагин. Теперь я использую следующую подпись класса (включая расширение AbstractPyCompletionProposalExtension2) и реализую необходимые методы: открытый класс MyPlugin extends AbstractPyCompletionProposalExtension2 реализует IPyDevCompletionParticipant, IPyDevCompletionParticipant2, ICompletionProposalExtension2, ICompletionProposalExtension. Я пытался переключиться с Java 8 на Java 7, но получил те же результаты... - person MrMobileMan; 30.12.2014
comment
... а именно, когда я нажимаю, например, «zzzzz», первый «z» работает правильно, и я вижу вывод из конструктора аргументов 0 и методов getGlobalCompletionRequest(), и я получаю раскрывающийся список, как и ожидалось. Однако 2-й «z» просто заставляет раскрывающийся список скрываться, и ни один из моих методов не срабатывает. Для конструктора аргументов 0 мне теперь требуется вызвать суперконструктор, и я использую: super(null, fLen, fLen, fLen, fAdditionalProposalInfo); -- я использую нули и 0 для значений -- но я не думаю, это вызовет проблему... Идеи? - person MrMobileMan; 30.12.2014
comment
Я думаю, что ваша проблема - просто передать 0 с... (смещения должны быть правильными, чтобы это работало). - person Fabio Zadrozny; 30.12.2014
comment
Как должен выглядеть вызов super()? Конструктор с 0 аргументами вызывается и не имеет входных данных, затем должен вызывать super(...) в первой строке конструктора... идеи? - person MrMobileMan; 30.12.2014
comment
У вас есть код на github, чтобы посмотреть там (эта тема становится слишком большой). - person Fabio Zadrozny; 30.12.2014
comment
Пожалуйста, дайте мне знать, если вы можете воспроизвести это... Спасибо! - person MrMobileMan; 05.01.2015
comment
Я думаю, что это дефект PyDev, поскольку я НЕ наблюдаю эту проблему с моими плагинами для поддержки контента/дополнения кода для Java, JavaScript, XML, Text, C или C++... - person MrMobileMan; 23.01.2015
comment
Хорошо, только что создал для вас запрос на вытягивание, где он работает. Я изменил его для работы с SourceToken, чтобы упростить его (но он также будет работать, если вы создали org.python.pydev.editor.codecompletion.PyLinkedModeCompletionProposal или подкласс org.python.pydev.editor.codecompletion.AbstractPyCompletionProposalExtension2 и настроили это правильно). - person Fabio Zadrozny; 23.01.2015
comment
На будущее: рабочий пример находится по адресу: github.com/fabioz/PythonPluginProofOfConc и все необходимый код (кроме регистрации в plugin.xml) находится в github.com/fabioz/PythonPluginProofOfConc/blob/master/ (метод getGlobalCompletions) - person Fabio Zadrozny; 26.01.2015
comment
Ваше решение возвращает SourceTokens вместо CompletionProposals, но мне нужно вернуть CompletionProposals, чтобы заменить введенный текст моим собственным текстом. Использование SourceTokens делает так, что оно не отбрасывает каждое второе нажатие клавиши, НО это не позволяет мне заменить набранный текст моим собственным текстом, что мне и нужно. - person MrMobileMan; 04.02.2015
comment
Взгляните на org.python.pydev.editor.codecompletion.AbstractPyCodeCompletion.changeItokenToCompletionPropostal(CompletionRequest, List‹ICompletionProposal›, List‹Object›, boolean, ICompletionState), который преобразует IToken в фактически используемый PyLinkedModeCompletionProposal (который затем правильно работать для завершения в PyDev - тот же код имеет более простую версию, которая настроила PyCompletionProposal, которая немного проще, чем PyLinkedModeCompletionProposal, и также должна работать, хотя и с меньшим количеством функций). - person Fabio Zadrozny; 05.02.2015
comment
Я пытаюсь иметь что-то, что поддерживает пробелы. Например, плагин, который заменит одно дерево, два дерева или три дерева, например, испанскими эквивалентами, например: un arbol, dos arboles, tres arboles, но всякий раз, когда я нажимаю пробел, даже с вашим кодом , он запускает новый токен. Однако я могу создать этот подключаемый модуль с ожидаемым поведением без каких-либо проблем для Java, JavaScript, C, C++ и text/html. Мне это кажется дефектом в PyDev. Если вы можете обновить пример github для поддержки нескольких слов или обновить PyDev для его поддержки, это было бы здорово. - person MrMobileMan; 10.02.2015
comment
Привет, к сожалению, у меня нет на это времени (поэтому я не могу дать вам какие-либо сроки по этому поводу, так как я занимаюсь другими делами, поскольку у вас достаточно деталей, чтобы вы уже до этого дошли, но этот код полностью с открытым исходным кодом, -- см.: pydev.org/developers.html, чтобы получить его -- поэтому , вы можете взглянуть на него, и я уверен, что его можно настроить для поддержки любого вида завершения, который вы хотите — в худшем случае придется что-то изменить в самом PyDev). Однако я могу предложить коммерческую поддержку, чтобы сделать что-то для вас, если вы хотите... (напишите мне на fabioz.pydev в gmail точка com, если вы заинтересованы). - person Fabio Zadrozny; 11.02.2015
comment
Это отвечает на мой первоначальный вопрос, поэтому я отмечу его как ответ. Спасибо за вашу помощь! У меня все еще есть вопрос без ответа, и я добавил его здесь: stackoverflow.com/questions/29609408/ - person MrMobileMan; 13.04.2015