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..0710dc9bbd 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] @@ -240,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 => { @@ -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..820daf0b82 --- /dev/null +++ b/browser/src/Services/Completion/NeovimCompletionsRequestor.ts @@ -0,0 +1,55 @@ +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(this._addNeovimCompletion), + 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..0b110b0820 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