You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

189 lines
3.3 KiB

'use strict';
const path = require('path');
const allEditors = () => [
{
id: 'sublime',
name: 'Sublime Text',
binary: 'subl',
isTerminalEditor: false,
paths: [
'/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl',
'/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl'
],
keywords: []
},
{
id: 'atom',
name: 'Atom',
binary: 'atom',
isTerminalEditor: false,
paths: [
'/Applications/Atom.app/Contents/Resources/app/atom.sh'
],
keywords: []
},
{
id: 'vscode',
name: 'Visual Studio Code',
binary: 'code',
isTerminalEditor: false,
paths: [
'/Applications/Visual Studio Code.app/Contents/Resources/app/bin/code'
],
keywords: [
'vs code'
]
},
{
id: 'webstorm',
name: 'WebStorm',
binary: 'webstorm',
isTerminalEditor: false,
paths: [],
keywords: [
'wstorm'
]
},
{
id: 'textmate',
name: 'TextMate',
binary: 'mate',
isTerminalEditor: false,
paths: [],
keywords: []
},
{
id: 'vim',
name: 'Vim',
binary: 'vim',
isTerminalEditor: true,
paths: [],
keywords: []
},
{
id: 'neovim',
name: 'NeoVim',
binary: 'nvim',
isTerminalEditor: true,
paths: [],
keywords: [
'vim'
]
},
{
id: 'intellij',
name: 'IntelliJ IDEA',
binary: 'idea',
isTerminalEditor: false,
paths: [],
keywords: [
'idea',
'java',
'jetbrains',
'ide'
]
},
{
id: 'nano',
name: 'GNU nano',
binary: 'nano',
isTerminalEditor: true,
paths: [],
keywords: []
},
{
id: 'emacs',
name: 'GNU Emacs',
binary: 'emacs',
isTerminalEditor: true,
paths: [],
keywords: []
},
{
id: 'emacsforosx',
name: 'GNU Emacs for Mac OS X',
binary: 'Emacs',
isTerminalEditor: false,
paths: [
'/Applications/Emacs.app/Contents/MacOS/Emacs'
],
keywords: []
},
{
id: 'android-studio',
name: 'Android Studio',
binary: 'studio',
isTerminalEditor: false,
paths: [
'/Applications/Android Studio.app/Contents/MacOS/studio',
'/usr/local/Android/android-studio/bin/studio.sh',
'C:\\Program Files (x86)\\Android\\android-studio\\bin\\studio.exe',
'C:\\Program Files\\Android\\android-studio\\bin\\studio64.exe'
],
keywords: [
'studio'
]
}
];
const getEditor = editor => {
editor = editor.trim();
const needle = editor.toLowerCase();
const id = needle.split(/[/\\]/).pop().replace(/\s/g, '-');
const binary = id.split('-')[0];
for (const editor of allEditors()) {
// TODO: Maybe use `leven` module for more flexible matching
if (
needle === editor.id ||
needle === editor.name.toLowerCase() ||
binary === editor.binary
) {
return editor;
}
for (const editorPath of editor.paths) {
if (path.normalize(needle) === path.normalize(editorPath.toLowerCase())) {
return editor;
}
}
for (const keyword of editor.keywords) {
if (needle === keyword) {
return editor;
}
}
}
return {
id,
name: editor,
binary,
isTerminalEditor: false,
paths: [],
keywords: []
};
};
module.exports.defaultEditor = () => {
const editor = process.env.EDITOR || process.env.VISUAL;
if (!editor) {
throw new Error(
// eslint-disable-next-line indent
`
Your $EDITOR environment variable is not set.
Set it to the command/path of your editor in ~/.zshenv or ~/.bashrc:
export EDITOR=atom
`
);
}
return getEditor(editor);
};
module.exports.getEditor = getEditor;
module.exports.allEditors = allEditors;