From 4b5667b7e30fc1a65c5495bf16d7cb3019078288 Mon Sep 17 00:00:00 2001 From: Akin909 Date: Fri, 7 Sep 2018 13:26:14 +0100 Subject: [PATCH 1/2] [WIP] implement neovimCompletionRequestor --- browser/src/App.ts | 3 +- .../src/Editor/NeovimEditor/NeovimEditor.tsx | 10 ++++ .../Completion/NeovimCompletionsRequestor.ts | 60 +++++++++++++++++++ browser/src/neovim/NeovimInstance.ts | 1 + 4 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 browser/src/Services/Completion/NeovimCompletionsRequestor.ts diff --git a/browser/src/App.ts b/browser/src/App.ts index ab9efcbf99..19dd7ae5f2 100644 --- a/browser/src/App.ts +++ b/browser/src/App.ts @@ -283,12 +283,13 @@ export const start = async (args: string[]): Promise => { const CompletionProviders = await completionProvidersPromise CompletionProviders.activate(languageManager) + const completionProviders = CompletionProviders.getInstance() const initializeAllEditors = async () => { await startEditors( filesToOpen, Colors.getInstance(), - CompletionProviders.getInstance(), + completionProviders, configuration, diagnostics, languageManager, diff --git a/browser/src/Editor/NeovimEditor/NeovimEditor.tsx b/browser/src/Editor/NeovimEditor/NeovimEditor.tsx index 2ef1588c4f..be631a656c 100644 --- a/browser/src/Editor/NeovimEditor/NeovimEditor.tsx +++ b/browser/src/Editor/NeovimEditor/NeovimEditor.tsx @@ -97,6 +97,9 @@ import WildMenu from "./../../UI/components/WildMenu" import { CanvasRenderer } from "../../Renderer/CanvasRenderer" import { WebGLRenderer } from "../../Renderer/WebGL/WebGLRenderer" import { getInstance as getNotificationsInstance } from "./../../Services/Notifications" +import NeovimCompletionsRequestor, { + INeovimWithCompletions, +} from "../../Services/Completion/NeovimCompletionsRequestor" type NeovimError = [number, string] @@ -729,6 +732,13 @@ export class NeovimEditor extends Editor implements Oni.Editor { }), ) + const neovimCompletion = new NeovimCompletionsRequestor(this + .neovim as INeovimWithCompletions) + this._completionProviders.registerCompletionProvider( + "oni.completions.neovim", + neovimCompletion, + ) + this._commands = new NeovimEditorCommands( commandManager, this._contextMenuManager, diff --git a/browser/src/Services/Completion/NeovimCompletionsRequestor.ts b/browser/src/Services/Completion/NeovimCompletionsRequestor.ts new file mode 100644 index 0000000000..0d2e804956 --- /dev/null +++ b/browser/src/Services/Completion/NeovimCompletionsRequestor.ts @@ -0,0 +1,60 @@ +import { NeovimEditorCapability } from "oni-api" +import { CompletionItem, CompletionItemKind } from "vscode-languageserver-types" +import { CompletionsRequestContext, ICompletionsRequestor } from "./CompletionsRequestor" +import { INeovimCompletionInfo } from "../../neovim" +import { IEvent, IDisposable } from "oni-types" + +export interface INeovimWithCompletions extends NeovimEditorCapability { + onHidePopupMenu: IEvent + onShowPopupMenu: IEvent +} + +export default class NeovimCompletionsRequestor implements ICompletionsRequestor { + private _completions: CompletionItem[] = [] + // @ts-ignore + private _subscriptions: IDisposable[] + + constructor(private _neovim: INeovimWithCompletions) { + this._setupSubscriptions() + } + + private _setupSubscriptions() { + this._subscriptions = [ + this._neovim.onShowPopupMenu.subscribe(completionInfo => { + console.log("completionsInfo: ", completionInfo) + this._addNeovimCompletion(completionInfo) + }), + this._neovim.onHidePopupMenu.subscribe(() => { + this._clearNeovimCompletions() + }), + ] + } + + public async getCompletions(context: CompletionsRequestContext) { + console.log("this._completions: ", this._completions) + return this._completions + } + + public async getCompletionDetails( + fileLanguage: string, + filePath: string, + completionItem: CompletionItem, + ): Promise { + return null + } + + private _addNeovimCompletion(completionInfo: INeovimCompletionInfo) { + const items = completionInfo.items.map(item => { + return { + label: item.word, + kind: CompletionItemKind.Keyword, + detail: item.info, + } + }) + this._completions = items + } + + public _clearNeovimCompletions() { + this._completions = [] + } +} diff --git a/browser/src/neovim/NeovimInstance.ts b/browser/src/neovim/NeovimInstance.ts index 208ce294f5..ea13b7782c 100644 --- a/browser/src/neovim/NeovimInstance.ts +++ b/browser/src/neovim/NeovimInstance.ts @@ -839,6 +839,7 @@ export class NeovimInstance extends EventEmitter implements INeovimInstance { break case "popupmenu_show": const [items, selected, row, col] = a[0] + // console.log("ITEMS!!!!!: ", items) const mappedItems = items.map((item: string[]) => { const [word, kind, menu, info] = item From 4de8544597e987102429e1ec385758e54c711fa0 Mon Sep 17 00:00:00 2001 From: Akin909 Date: Sat, 8 Sep 2018 12:16:43 +0100 Subject: [PATCH 2/2] remove neovim popup menu for now --- browser/src/Editor/NeovimEditor/NeovimEditor.tsx | 14 +++++++------- .../Completion/NeovimCompletionsRequestor.ts | 9 ++------- browser/src/neovim/NeovimInstance.ts | 2 +- 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/browser/src/Editor/NeovimEditor/NeovimEditor.tsx b/browser/src/Editor/NeovimEditor/NeovimEditor.tsx index be631a656c..0710dc9bbd 100644 --- a/browser/src/Editor/NeovimEditor/NeovimEditor.tsx +++ b/browser/src/Editor/NeovimEditor/NeovimEditor.tsx @@ -243,13 +243,13 @@ export class NeovimEditor extends Editor implements Oni.Editor { , ) - this._popupMenu = new NeovimPopupMenu( - this._neovimInstance.onShowPopupMenu, - this._neovimInstance.onHidePopupMenu, - this._neovimInstance.onSelectPopupMenu, - this.onBufferEnter, - this._toolTipsProvider, - ) + // this._popupMenu = new NeovimPopupMenu( + // this._neovimInstance.onShowPopupMenu, + // this._neovimInstance.onHidePopupMenu, + // this._neovimInstance.onSelectPopupMenu, + // this.onBufferEnter, + // this._toolTipsProvider, + // ) const notificationManager = getNotificationsInstance() this._neovimInstance.onMessage.subscribe(messageInfo => { diff --git a/browser/src/Services/Completion/NeovimCompletionsRequestor.ts b/browser/src/Services/Completion/NeovimCompletionsRequestor.ts index 0d2e804956..820daf0b82 100644 --- a/browser/src/Services/Completion/NeovimCompletionsRequestor.ts +++ b/browser/src/Services/Completion/NeovimCompletionsRequestor.ts @@ -20,13 +20,8 @@ export default class NeovimCompletionsRequestor implements ICompletionsRequestor private _setupSubscriptions() { this._subscriptions = [ - this._neovim.onShowPopupMenu.subscribe(completionInfo => { - console.log("completionsInfo: ", completionInfo) - this._addNeovimCompletion(completionInfo) - }), - this._neovim.onHidePopupMenu.subscribe(() => { - this._clearNeovimCompletions() - }), + this._neovim.onShowPopupMenu.subscribe(this._addNeovimCompletion), + this._neovim.onHidePopupMenu.subscribe(this._clearNeovimCompletions), ] } diff --git a/browser/src/neovim/NeovimInstance.ts b/browser/src/neovim/NeovimInstance.ts index ea13b7782c..0b110b0820 100644 --- a/browser/src/neovim/NeovimInstance.ts +++ b/browser/src/neovim/NeovimInstance.ts @@ -839,7 +839,7 @@ export class NeovimInstance extends EventEmitter implements INeovimInstance { break case "popupmenu_show": const [items, selected, row, col] = a[0] - // console.log("ITEMS!!!!!: ", items) + console.log("ITEMS!!!!!: ", items) const mappedItems = items.map((item: string[]) => { const [word, kind, menu, info] = item