Я только изучаю разработку плагинов Eclipse, в настоящее время с целью добавления нескольких простых пользовательских команд, которые никто не удосужился реализовать.Я заметил, что API плагинов Eclipse ... оставляет желать лучшего.Существуют ли библиотеки с открытым исходным кодом, которые пытаются улучшить опыт разработки плагинов?(Я начал лениво рассуждать о написании своего собственного ...).
Я знаю, что Eclipse 4.0 должен решить некоторые из этих проблем в долгосрочной перспективе, но я вряд ли смогу перейти кэто на работе в ближайшее время.
Редактировать
Вот пример того, что я имею в виду.Это реализация функции "голодного удаления" для emacs:
(defmacro hungry-delete-backward (&optional limit)
(if limit
`(let ((limit (or ,limit (point-min))))
(while (progn
;; skip-syntax-* doesn't count \n as whitespace..
(skip-chars-backward " \t\n\r\f\v" limit)
(and (eolp)
(eq (char-before) ?\\)
(> (point) limit)))
(backward-char)))
'(while (progn
(skip-chars-backward " \t\n\r\f\v")
(and (eolp)
(eq (char-before) ?\\)))
(backward-char))))
А вот часть эквивалентной реализации для Eclipse, не включая файл манифеста, plugin.xml илиАктиватор для плагина:
@Override
public Object execute(ExecutionEvent event) throws ExecutionException {
IEditorPart editor = HandlerUtil.getActiveEditorChecked(event);
if (!(editor instanceof ITextEditor)) return null;
ITextEditor ite = (ITextEditor) editor;
IDocumentProvider idp = ite.getDocumentProvider();
IDocument doc = idp.getDocument(ite.getEditorInput());
ISelection selection = ite.getSelectionProvider().getSelection();
if (!(editor instanceof ITextSelection)) return null;
ITextSelection its = (ITextSelection) selection;
int currentCursorPosition = its.getOffset();
int deletionStart, deletionEnd;
if (its.getLength() == 0) {
deletionStart = currentCursorPosition - 1;
deletionEnd = currentCursorPosition;
FindReplaceDocumentAdapter frda = new FindReplaceDocumentAdapter(doc);
while (Character.isWhitespace(frda.charAt(deletionStart)) && deletionStart > 0) {
deletionStart--;
}
if (deletionStart != 0 && deletionStart + 1 != deletionEnd) deletionStart++;
} else {
deletionStart = its.getOffset();
deletionEnd = its.getOffset() + its.getLength();
}
int deletionLength = deletionEnd - deletionStart;
try {
doc.replace(deletionStart, deletionLength, "");
} catch (BadLocationException ble) {
// Bad location, just ignore it.
}
return null;
}
Кусок шаблона в верхней части версии Java, например, может быть легко заменен библиотекой.