diff --git a/clients/eclipse/feature/feature.xml b/clients/eclipse/feature/feature.xml
index bc946e5802f4..a7d93cc17569 100644
--- a/clients/eclipse/feature/feature.xml
+++ b/clients/eclipse/feature/feature.xml
@@ -2,7 +2,7 @@
@@ -19,6 +19,6 @@
+ version="0.0.2.25"/>
diff --git a/clients/eclipse/plugin/META-INF/MANIFEST.MF b/clients/eclipse/plugin/META-INF/MANIFEST.MF
index 35026e30e7bd..606601c995ec 100644
--- a/clients/eclipse/plugin/META-INF/MANIFEST.MF
+++ b/clients/eclipse/plugin/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Tabby Plugin for Eclipse
Bundle-SymbolicName: com.tabbyml.tabby4eclipse;singleton:=true
-Bundle-Version: 0.0.2.24
+Bundle-Version: 0.0.2.25
Bundle-Activator: com.tabbyml.tabby4eclipse.Activator
Bundle-Vendor: com.tabbyml
Require-Bundle: org.eclipse.ui,
diff --git a/clients/eclipse/plugin/plugin.xml b/clients/eclipse/plugin/plugin.xml
index 43b88aaef881..eb2061be7bb2 100644
--- a/clients/eclipse/plugin/plugin.xml
+++ b/clients/eclipse/plugin/plugin.xml
@@ -102,27 +102,42 @@
+ name="Tabby Code Completion">
+
+
+
+
+
+
+ name="Tabby Chat">
@@ -172,6 +187,18 @@
class="com.tabbyml.tabby4eclipse.commands.OpenPreferences"
commandId="com.tabbyml.tabby4eclipse.commands.openPreferences">
+
+
+
+
+
+
@@ -221,6 +248,24 @@
schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
sequence="M1+M3+L">
+
+
+
+
+
+
job = LanguageServerService
+ .getInstance().getServer().execute((server) -> {
+ ITextDocumentServiceExt textDocumentService = ((ILanguageServer) server)
+ .getTextDocumentServiceExt();
+ return textDocumentService.inlineCompletion(params);
+ });
+ job.thenAccept((completionList) -> {
+ if (completionList == null || request != current.request) {
+ return;
+ }
+ try {
+ InlineCompletionList list = request.convertInlineCompletionList(completionList);
+ int cycleIndex = calcCycleIndex(index, list.getItems().size(), step);
+ current.response = new InlineCompletionContext.Response(list, cycleIndex);
+ renderer.show(textViewer, current.response.getActiveCompletionItem());
+ EventParams eventParams = buildTelemetryEventParams(EventParams.Type.VIEW);
+ postTelemetryEvent(eventParams);
+ } catch (BadLocationException e) {
+ logger.error("Failed to show inline completion.", e);
+ }
+ });
+ InlineCompletionContext context = new InlineCompletionContext(request, job, current.response);
+ current = context;
+ } else {
+ int cycleIndex = calcCycleIndex(current.response.getItemIndex(),
+ current.response.completionList.getItems().size(), step);
+ current.response.setItemIndex(cycleIndex);
+ renderer.show(textViewer, current.response.getActiveCompletionItem());
+ EventParams eventParams = buildTelemetryEventParams(EventParams.Type.VIEW);
+ postTelemetryEvent(eventParams);
+ }
+ }
+
+ private int calcCycleIndex(int index, int listSize, int step) {
+ if (listSize <= 1) {
+ return index;
+ }
+ int cycleIndex = index + step;
+ while (cycleIndex >= listSize) {
+ cycleIndex -= listSize;
+ }
+ if (cycleIndex < 0) {
+ cycleIndex += listSize;
+ }
+ return cycleIndex;
+ }
+
@Override
public void accept() {
ITextEditor textEditor = EditorUtils.getActiveTextEditor();
@@ -258,12 +335,25 @@ public Response(InlineCompletionList completionList) {
this.itemIndex = 0;
}
+ public Response(InlineCompletionList completionList, int itemIndex) {
+ this.completionList = completionList;
+ this.itemIndex = itemIndex;
+ }
+
public InlineCompletionItem getActiveCompletionItem() {
if (itemIndex >= 0 && itemIndex < completionList.getItems().size()) {
return completionList.getItems().get(itemIndex);
}
return null;
}
+
+ public int getItemIndex() {
+ return itemIndex;
+ }
+
+ public void setItemIndex(int itemIndex) {
+ this.itemIndex = itemIndex;
+ }
}
private Request request;