Skip to content
This repository has been archived by the owner on Apr 1, 2020. It is now read-only.

Commit

Permalink
Refactoring: Split out Commands between GlobalCommands/NeovimEditorCo…
Browse files Browse the repository at this point in the history
…mmands (#1316)

* Split commands between GlobalCommands and NeovimEditorCommands

* Fix lint issues

* Fix merge conflict

* Add missing argument
  • Loading branch information
bryphe committed Jan 23, 2018
1 parent 7865308 commit 5109cd6
Show file tree
Hide file tree
Showing 6 changed files with 203 additions and 175 deletions.
12 changes: 10 additions & 2 deletions browser/src/Editor/NeovimEditor/NeovimEditor.tsx
Expand Up @@ -32,7 +32,6 @@ import { PluginManager } from "./../../Plugins/PluginManager"

import { IColors } from "./../../Services/Colors"
import { commandManager } from "./../../Services/CommandManager"
import { registerBuiltInCommands } from "./../../Services/Commands"
import { Completion } from "./../../Services/Completion"
import { Configuration, IConfigurationValues } from "./../../Services/Configuration"
import { IDiagnosticsDataSource } from "./../../Services/Diagnostics"
Expand Down Expand Up @@ -183,7 +182,15 @@ export class NeovimEditor extends Editor implements IEditor {
// Services
const errorService = new Errors(this._neovimInstance)

registerBuiltInCommands(commandManager, this._neovimInstance)
this._commands = new NeovimEditorCommands(
commandManager,
this._contextMenuManager,
this._definition,
this._languageIntegration,
this._neovimInstance,
this._rename,
this._symbols,
)

const updateViewport = () => {
const width = document.body.offsetWidth
Expand Down Expand Up @@ -439,6 +446,7 @@ export class NeovimEditor extends Editor implements IEditor {
this._contextMenuManager,
this._definition,
this._languageIntegration,
this._neovimInstance,
this._rename,
this._symbols,
)
Expand Down
96 changes: 95 additions & 1 deletion browser/src/Editor/NeovimEditor/NeovimEditorCommands.ts
Expand Up @@ -4,12 +4,22 @@
* Contextual commands for NeovimEditor
*
*/
import * as fs from "fs"
import * as os from "os"
import * as path from "path"

import { clipboard, remote } from "electron"
import * as Oni from "oni-api"

import { NeovimInstance } from "./../../neovim"
import { CallbackCommand, CommandManager } from "./../../Services/CommandManager"
import { getUserConfigFilePath } from "./../../Services/Configuration"
import { ContextMenuManager } from "./../../Services/ContextMenu"
import { LanguageEditorIntegration } from "./../../Services/Language"
import { editorManager } from "./../../Services/EditorManager"
import { findAllReferences, format, LanguageEditorIntegration } from "./../../Services/Language"
import { menuManager } from "./../../Services/Menu"
import { QuickOpen } from "./../../Services/QuickOpen"
import { replaceAll } from "./../../Utility"

import { Definition } from "./Definition"
import { Rename } from "./Rename"
Expand All @@ -24,13 +34,33 @@ export class NeovimEditorCommands {
private _contextMenuManager: ContextMenuManager,
private _definition: Definition,
private _languageEditorIntegration: LanguageEditorIntegration,
private _neovimInstance: NeovimInstance,
private _rename: Rename,
private _symbols: Symbols,
) { }

public activate(): void {
const isContextMenuOpen = () => this._contextMenuManager.isMenuOpen()

// TODO: This should be extracted
// - Should not depend on NeovimInstance
// - Should be able to work against the public 'IEditor' interface
const quickOpen = new QuickOpen(this._neovimInstance)

const quickOpenCommand = (innerCommand: Oni.Commands.CommandCallback) => (qo: QuickOpen) => {
return () => {
if (qo.isOpen()) {
return innerCommand(qo)
}

return false
}
}

const quickOpenFileNewTab = quickOpenCommand((qo: QuickOpen) => qo.openFileNewTab())
const quickOpenFileHorizontal = quickOpenCommand((qo: QuickOpen) => qo.openFileHorizontal())
const quickOpenFileVertical = quickOpenCommand((qo: QuickOpen) => qo.openFileVertical())

/**
* Higher-order function for commands dealing with completion
* - checks that the completion menu is open
Expand Down Expand Up @@ -61,13 +91,65 @@ export class NeovimEditorCommands {
this._contextMenuManager.previousMenuItem()
})

const pasteContents = async (neovimInstance: NeovimInstance) => {
const textToPaste = clipboard.readText()
const sanitizedText = replaceAll(textToPaste, { "<": "<lt>" })
.split(os.EOL)
.join("<cr>")

await neovimInstance.command("set paste")
await neovimInstance.input(sanitizedText)
await neovimInstance.command("set nopaste")
}

const openDefaultConfig = async (): Promise<void> => {

const activeEditor = editorManager.activeEditor
const buf = await activeEditor.openFile(getUserConfigFilePath())
const lineCount = buf.lineCount

if (lineCount === 1) {
const defaultConfigJsPath = path.join(__dirname, "configuration", "config.default.js")
const defaultConfigLines = fs.readFileSync(defaultConfigJsPath, "utf8").split(os.EOL)
await buf.setLines(0, defaultConfigLines.length, defaultConfigLines)
}
}

const shouldShowMenu = () => {
return !menuManager.isMenuOpen()
}

const openFolder = (neovimInstance: NeovimInstance) => {
const dialogOptions: any = {
title: "Open Folder",
properties: ["openDirectory"],
}

remote.dialog.showOpenDialog(remote.getCurrentWindow(), dialogOptions, (folder: string[]) => {
if (!folder || !folder[0]) {
return
}

const folderToOpen = folder[0]
neovimInstance.chdir(folderToOpen)
})
}

const isRenameActive = () => this._rename.isRenameActive()

const commands = [
new CallbackCommand("contextMenu.select", null, null, selectContextMenuItem, isContextMenuOpen),
new CallbackCommand("contextMenu.next", null, null, nextContextMenuItem, isContextMenuOpen),
new CallbackCommand("contextMenu.previous", null, null, previousContextMenuItem, isContextMenuOpen),
new CallbackCommand("contextMenu.close", null, null, closeContextMenu, isContextMenuOpen),

new CallbackCommand("editor.clipboard.paste", "Clipboard: Paste", "Paste clipboard contents into active text", () => pasteContents(this._neovimInstance)),
new CallbackCommand("editor.clipboard.yank", "Clipboard: Yank", "Yank contents to clipboard", () => this._neovimInstance.input("y")),
new CallbackCommand("oni.editor.findAllReferences", null, null, () => findAllReferences()),
new CallbackCommand("language.findAllReferences", "Find All References", "Find all references using a language service", () => findAllReferences()),

new CallbackCommand("language.format", null, null, () => format()),

// TODO: Deprecate
new CallbackCommand("oni.editor.gotoDefinition", null, null, () => this._definition.gotoDefinitionUnderCursor()),
new CallbackCommand("language.gotoDefinition", "Goto Definition", "Goto definition using a language service", () => this._definition.gotoDefinitionUnderCursor()),
Expand All @@ -82,6 +164,18 @@ export class NeovimEditorCommands {

new CallbackCommand("language.symbols.document", null, null, () => this._symbols.openDocumentSymbolsMenu()),
new CallbackCommand("language.symbols.workspace", null, null, () => this._symbols.openWorkspaceSymbolsMenu()),
new CallbackCommand("oni.config.openConfigJs", "Edit Oni Config", "Edit configuration file ('config.js') for Oni", () => openDefaultConfig()),

new CallbackCommand("oni.config.openInitVim", "Edit Neovim Config", "Edit configuration file ('init.vim') for Neovim", () => this._neovimInstance.openInitVim()),

new CallbackCommand("oni.openFolder", "Open Folder", "Set a folder as the working directory for Oni", () => openFolder(this._neovimInstance)),

// TODO: Factor these out
new CallbackCommand("quickOpen.show", null, null, () => quickOpen.show(), shouldShowMenu),
new CallbackCommand("quickOpen.showBufferLines", null, null, () => quickOpen.showBufferLines()),
new CallbackCommand("quickOpen.openFileNewTab", null, null, quickOpenFileNewTab(quickOpen)),
new CallbackCommand("quickOpen.openFileVertical", null, null, quickOpenFileVertical(quickOpen)),
new CallbackCommand("quickOpen.openFileHorizontal", null, null, quickOpenFileHorizontal(quickOpen)),

]

Expand Down
172 changes: 0 additions & 172 deletions browser/src/Services/Commands.ts

This file was deleted.

0 comments on commit 5109cd6

Please sign in to comment.