Full Code of lahmatiy/open-in-editor for AI

master 64cddf8d5ae7 cached
27 files
28.1 KB
8.0k tokens
5 symbols
1 requests
Download .txt
Repository: lahmatiy/open-in-editor
Branch: master
Commit: 64cddf8d5ae7
Files: 27
Total size: 28.1 KB

Directory structure:
gitextract_ejkaplpq/

├── .editorconfig
├── .gitignore
├── .jscsrc
├── .npmingnore
├── HISTORY.md
├── LICENSE
├── README.md
├── bin/
│   └── oe
├── lib/
│   ├── check.js
│   ├── detect.js
│   ├── editors/
│   │   ├── atom.js
│   │   ├── code.js
│   │   ├── common/
│   │   │   ├── jetbrains.js
│   │   │   └── terminal.js
│   │   ├── emacs.js
│   │   ├── idea14ce.js
│   │   ├── index.js
│   │   ├── phpstorm.js
│   │   ├── sublime.js
│   │   ├── vim.js
│   │   ├── visualstudio.js
│   │   ├── visualstudio.vbs
│   │   └── webstorm.js
│   ├── index.js
│   ├── open.js
│   └── utils.js
└── package.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .editorconfig
================================================
[*]
end_of_line = lf

[*.js]
charset = utf-8
indent_style = space
indent_size = 2

================================================
FILE: .gitignore
================================================
node_modules
*.swp


================================================
FILE: .jscsrc
================================================
{
    "excludeFiles": [
        "node_modules/**"
    ],

    "disallowEmptyBlocks": true,

    "disallowImplicitTypeConversion": ["numeric", "boolean", "binary", "string"],

    "disallowKeywords": ["with"],

    "disallowKeywordsOnNewLine": ["else", "catch", "finally"],

    "disallowMixedSpacesAndTabs": true,

    "disallowMultipleLineStrings": true,

    "disallowNewlineBeforeBlockStatements": true,

    "disallowOperatorBeforeLineBreak": ["."],

    "disallowPaddingNewlinesInBlocks": true,

    "disallowQuotedKeysInObjects": "allButReserved",

    "disallowSpaceAfterObjectKeys": true,

    "disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],

    "disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],

    "disallowSpacesInCallExpression": true,

    "disallowSpacesInFunction": {
        "beforeOpeningRoundBrace": true
    },

    "disallowSpacesInFunctionDeclaration": {
        "beforeOpeningRoundBrace": true
    },

    "disallowSpacesInFunctionExpression": {
        "beforeOpeningRoundBrace": true
    },

    "disallowSpacesInNamedFunctionExpression": {
        "beforeOpeningRoundBrace": true
    },

    "disallowSpacesInsideArrayBrackets": "all",

    "disallowSpacesInsideParentheses": true,

    "disallowTrailingComma": true,

    "disallowTrailingWhitespace": true,

    "disallowYodaConditions": true,

    "requireBlocksOnNewline": true,

    "requireCamelCaseOrUpperCaseIdentifiers": true,

    "requireCapitalizedConstructors": true,

    "requireCommaBeforeLineBreak": true,

    "requireCurlyBraces": [
        "if",
        "else",
        "for",
        "while",
        "do",
        "try",
        "catch",
        "finally"
    ],

    "requireDotNotation": true,

    "requireKeywordsOnNewLine": [
        "return",
        "for",
        "try",
        "do",
        "switch",
        "case"
    ],

    "requireLineBreakAfterVariableAssignment": true,

    "requireLineFeedAtFileEnd": true,

    "disallowMultipleVarDecl": true,

    "requireOperatorBeforeLineBreak": [
        "=",
        "+",
        "-",
        "/",
        "*",
        "==",
        "===",
        "!=",
        "!==",
        ">",
        ">=",
        "<",
        "<="
    ],

    "requireParenthesesAroundIIFE": true,

    "requireSpaceAfterBinaryOperators": [
        "=",
        ",",
        "+",
        "-",
        "/",
        "*",
        "==",
        "===",
        "!=",
        "!==",
        "<",
        ">",
        "<=",
        ">=",
        "%"
    ],

    "requireSpaceAfterKeywords": [
        "if",
        "else",
        "for",
        "while",
        "do",
        "switch",
        "case",
        "return",
        "try",
        "catch",
        "finally",
        "typeof"
    ],

    "requireSpaceAfterLineComment": true,

    "requireSpaceBeforeBinaryOperators": [
        "=",
        "+",
        "-",
        "/",
        "*",
        "==",
        "===",
        "!=",
        "!==",
        "<",
        ">",
        "<=",
        ">=",
        "%"
    ],

    "requireSpaceBeforeBlockStatements": true,

    "requireSpaceBeforeKeywords": [
        "else",
        "while",
        "catch",
        "finally"
    ],

    "requireSpaceBeforeObjectValues": true,

    "requireSpaceBetweenArguments": true,

    "requireSpacesInConditionalExpression": {
        "afterTest": true,
        "beforeConsequent": true,
        "afterConsequent": true,
        "beforeAlternate": true
    },

    "requireSpacesInForStatement": true,

    "requireSpacesInFunction": {
        "beforeOpeningCurlyBrace": true
    },

    "requireSpacesInFunctionDeclaration": {
        "beforeOpeningCurlyBrace": true
    },

    "requireSpacesInFunctionExpression": {
        "beforeOpeningCurlyBrace": true
    },

    "requireSpacesInNamedFunctionExpression": {
        "beforeOpeningCurlyBrace": true
    },

    "requireSemicolons": true,

    "requireSpacesInsideObjectBrackets": "all",

    "validateIndentation": 2,

    "validateLineBreaks": "LF",

    "validateParameterSeparator": ", ",

    "validateQuoteMarks": { "mark": "'", "escape": true }
}


================================================
FILE: .npmingnore
================================================
node_modules


================================================
FILE: HISTORY.md
================================================
## 2.2.0 (March 22, 2017)

- Fixed passing settings to `open()` when only `cmd` option is set (#10)
- Changed behaviour to use an editor settings as defaults when `editor` and `cmd` options are specified
- Added `--pattern` option to CLI

## 2.1.0 (March 21, 2017)

- Added basic support for `emacs` (thanks to @zefirka)
- Fixed crash on attempt to use `vim` on non-`darwin` platform

## 2.0.0 (March 15, 2017)

- Added basic support for `vim` (thanks to @pofigizm)
- Added support for `Visual Studio` (thanks to @generalov)
- Changed node.js support to `0.12` and greater

## 1.2.1 (November 14, 2016)

- Added support for `Visual Studio Code`

## 1.2.0 (November 12, 2015)

- Added support for JetBrains's IDEs on Windows (thanks to @Mavrin)

## 1.1.0 (November 8, 2015)

- Added support for `WebStorm` (thanks to @chicoxyzzy)
- Added support for `IDEA 14 CE` (thanks to @chicoxyzzy)
- Added support for `PhpStorm` (thanks to @silentroach)
- Removed `preferGlobal` option from `package.json`
- Improved documentation

## 1.0 (September 24, 2015)

- Initial release


================================================
FILE: LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2015 Roman Dvornov

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.



================================================
FILE: README.md
================================================
[![NPM version](https://img.shields.io/npm/v/open-in-editor.svg)](https://www.npmjs.com/package/open-in-editor)

NPM package to open a file in editor.

Supported editors:

- [Sublime Text](http://www.sublimetext.com/)
- [Atom Editor](https://atom.io/)
- [Visual Studio Code](https://code.visualstudio.com/)
- [WebStorm](https://www.jetbrains.com/webstorm/)
- [PhpStorm](https://www.jetbrains.com/phpstorm/)
- [IDEA 14 Community Edition](https://www.jetbrains.com/idea/download/)
- [Vim](http://www.vim.org/)
- [Emacs](https://www.gnu.org/software/emacs/)
- [Visual Studio](https://www.visualstudio.com/)

You also can use any other editor that is able to open files from command line.

## Installation

```
npm install open-in-editor
```

## Usage

First of all you should create an interface with your settings.

```js
var openInEditor = require('open-in-editor');
var editor = openInEditor.configure({
  // options
}, function(err) {
  console.error('Something went wrong: ' + err);
});
```

Resulting object has a single method `open`. This method runs terminal command that opens an editor. Result of this method is a promise:

```js
editor.open('path/to/file.js:3:10')
  .then(function() {
    console.log('Success!');
  }, function(err) {
    console.error('Something went wrong: ' + err);
  });
```

## API

```
openInEditor.configure([options][, failCallback]);
```

Arguments:

- `options` – *optional* is used to set up a command to launch an editor. If no options set it will try to get the command from [environment](#environment)
- `failCallback` – *optional* function that is called when something's wrong with editor setup.

If editor setup was successful `configure` method returns an interface with single method `open`. The method accepts file reference with the following format: `filename[:line[:column]]`, where `line` and `column` tell the editor where to place cursor when file is opened.

### Options

#### editor

Type: `String` or `null`  
Values: `'sublime'`, `'atom'`, `'code'`, `'webstorm'`, `'phpstorm'`, `'idea14ce'`, `'vim'`, `'emacs'`, `'visualstudio'`  
Default: `null`

Editor to open a file. Once value is set, we try to detect a command to launch an editor.

Supported editors:

- `sublime` – Sublime Text
- `atom` – Atom Editor
- `code` – Visual Studio Code
- `webstorm` – WebStorm
- `phpstorm` - PhpStorm
- `idea14ce` – IDEA 14 CE
- `vim` – Vim (via Terminal, Mac OS only)
- `emacs` – Emacs (via Terminal, Mac OS only)
- `visualstudio` – Visual Studio

#### cmd

Type: `String` or `null`  
Default: `null`

Command to launch an editor.

```js
var openInEditor = require('open-in-editor');
var editor = openInEditor.configure({
  cmd: '/path/to/editor/app'
});
```

If `editor` option is also set, an editor settings are using as default settings.

```js
var openInEditor = require('open-in-editor');
var editor = openInEditor.configure({
  editor: 'code',
  cmd: '/path/to/editor/app' // will be called as '/path/to/editor/app -r -g {filename}:{line}:{column}'
});
```

#### pattern

Type: `String` or `null`  
Default: `null`

Option to specify arguments for a command. Pattern can contain placeholders to be replaced by actual values. Supported placeholders: `filename`, `line` and `column`.

```js
var openInEditor = require('open-in-editor');
var editor = openInEditor.configure({
  cmd: 'code',
  pattern: '-r -g {filename}:{line}:{column}'
});
```

If there's no `{filename}` placeholder in the command then `{filename}:{line}:{column}` is appended. That way previous example can be simplified:

```js
var openInEditor = require('open-in-editor');
var editor = openInEditor.configure({
  cmd: 'code',
  pattern: '-r -g' // the same as '-r -g {filename}:{line}:{column}'
});
```

#### line

Type: `Number`  
Default: `1`

Defines the number of the first line in the editor. Usually it's `1`, but you can set it to `0`.

#### column

Type: `Number`  
Default: `1`

Defines the number of the first column in the editor. Usually it's `1`, but you can set it to `0`.


## Environment

If no `editor` or `cmd` option is specified, we try to get the command to launch an editor using environment settings. Following values can be used (in descending priority):

- `process.env.OPEN_FILE`
- `process.env.VISUAL`
- `process.env.EDITOR`

First value found is used. If it's `process.env.VISUAL` or `process.env.EDITOR`, it's used directly as `cmd` option. But `process.env.OPEN_FILE` is different: if value is a valid for `editor` option, it's used for it, otherwise it's used as a value for `cmd` option.

You can set env settings per command:

```
OPEN_FILE=atom oe path/to/file.js:4:15
OPEN_FILE="code -r -g" node script.js
```

## CLI

Package could be installed globally.

```
npm install open-in-editor -g
```

In this case `oe` command will be available in terminal.

```
Usage:

  oe [filename] [options]

Options:

      --cmd <command>      Command to open file
      --debug              Debug errors
  -e, --editor <editor>    Editor: atom, code, sublime, webstorm, phpstorm, idea14ce, vim, visualstudio, emacs
  -f, --file <filename>    File to open
  -h, --help               Output usage information
  -p, --pattern <pattern>  Filename pattern and args, i.e. something going after cmd
  -v, --version            Output the version
```

## Related projects

- [express-open-in-editor](https://github.com/lahmatiy/express-open-in-editor) – `Express` extension to open files from browser.
- [babel-plugin-source-wrapper](https://github.com/restrry/babel-plugin-source-wrapper) – `Babel` plugin that instruments source code to associate objects with location they defined in code base.
- [Component Inspector](https://github.com/lahmatiy/component-inspector) – developer tool to inspect components that can open component creation source location in editor. Has integrations for `React`, `Backbone` and can be adopted for other frameworks.

## License

MIT


================================================
FILE: bin/oe
================================================
#!/usr/bin/env node

var clap = require('clap');
var version = require('../package.json').version;
var editors = require('../lib/editors');
var fail = require('../lib/utils').fail;
var main = require('../lib/index');

var command = clap.create('oe', '[filename]')
  .description('Open file in editor')
  .version(version)

  .option('-f, --file <filename>', 'File to open')
  .option('-e, --editor <editor>', 'Editor: ' + Object.keys(editors).join(', '))
  .option('-p, --pattern <pattern>', 'Filename pattern and args, i.e. something going after cmd')
  .option('--cmd <command>', 'Command to open file')
  .option('--debug', 'Debug errors')

  .action(function(args) {
    main
      .configure(this.values, fail)
      .open(this.values.file || args[0])
      .catch(function(err) {
        if (this.values.debug) {
          process.nextTick(function() {
            throw err;
          });
        } else {
          fail(err);
        }
      }.bind(this));
  });

try {
  command.run();
} catch (err) {
  if (err instanceof clap.Error == false) {
    throw err;
  }

  fail(err);
}


================================================
FILE: lib/check.js
================================================
var exec = require('child_process').exec;
var fs = require('fs');
var quote = require('./utils').quote;

function checkCommand(cmd, name, args) {
  if (!args) {
    return Promise.reject('No args to check command: ' + cmd);
  }

  return new Promise(function(resolve, reject) {
    exec(cmd + ' ' + args, function(err, output) {
      if (err || output.indexOf(name) !== 0) {
        reject(err);
      } else {
        resolve(cmd);
      }
    });
  });
}

function checkPath(path, name) {
  if (!fs.existsSync(path)) {
    return Promise.reject('Path does not exist: ' + path);
  }

  return Promise.resolve(path);
}

module.exports = {
  command: checkCommand,
  path: checkPath
};


================================================
FILE: lib/detect.js
================================================
var check = require('./check');
var any = require('./utils').any;

function detect(name, commands, args, locations) {
  function run(task) {
    return this(task, name, args);
  }

  locations = locations[process.platform] || [];

  return any(
    [].concat(
      commands.map(run, check.command),
      locations.map(run, check.path)
    ),
    'Not detected'
  );
}

module.exports = detect;
module.exports.lazy = function(name, commands, args, locations) {
  var memo;

  return function() {
    if (!memo) {
      memo = detect(name, commands, args, locations);
    }

    return memo;
  };
};
module.exports.platformSupport = function(platforms, editor, resolveValue) {
  return function() {
    // we use only system parts so we haven't to check anything except os
    if (platforms.indexOf(process.platform) !== -1) {
      return Promise.resolve(resolveValue);
    }

    return Promise.reject('"Open in ' + editor + '" does not implemented for your platform (' + process.platform + ')');
  };
};


================================================
FILE: lib/editors/atom.js
================================================
var atHomeDir = require('../utils').atHomeDir;

var settings = {
  pattern: '{filename}:{line}:{column}'
};

var detect = require('../detect').lazy('Atom Editor', ['atom'], '-h', {
  darwin: [
    '/Applications/Atom.app/Contents/Resources/app/atom.sh'
  ],
  win32: [
    atHomeDir('AppData/Local/atom/bin/atom.cmd')
  ]
});

var open = require('../open').detectAndOpenFactory(detect, settings);

module.exports = {
  settings: settings,
  detect: detect,
  open: open
};


================================================
FILE: lib/editors/code.js
================================================
var atHomeDir = require('../utils').atHomeDir;

var settings = {
  pattern: '-r -g {filename}:{line}:{column}'
};

var detect = require('../detect').lazy('Visual Studio Code', ['code'], '-h', {
  darwin: [
    '/Applications/Visual Studio Code.app/Contents/MacOS/Electron'
  ],
  win32: [
    'C:/Program Files/Microsoft VS Code/bin/code.cmd',
    'C:/Program Files (x86)/Microsoft VS Code/bin/code.cmd',
    atHomeDir('AppData/Local/Code/bin/code.cmd')
  ]
});

var open = require('../open').detectAndOpenFactory(detect, settings);

module.exports = {
  settings: settings,
  detect: detect,
  open: open
};


================================================
FILE: lib/editors/common/jetbrains.js
================================================
var fs = require('fs');
var path = require('path');
var lazyDetect = require('../../detect').lazy;

var settings = {
  pattern: '{projectPath} --line {line} {filename}'
};

var winDirs = (function() {
  var jetbrainsFolder = 'c:/Program Files (x86)/JetBrains/';

  if (!fs.existsSync(jetbrainsFolder)) {
    return [];
  }

  return fs.readdirSync(jetbrainsFolder)
    .map(function(name) {
      return path.join(jetbrainsFolder, name);
    })
    .filter(function(path) {
      return fs.statSync(path).isDirectory();
    });
})();

module.exports = function(config) {
  var detect = lazyDetect(config.name, [], '', {
    darwin: [
      '/Applications/' + config.appFolder + '.app/Contents/MacOS/' + config.executable
    ],
    win32: winDirs.map(function(dir) {
      return dir + '/bin/' + config.executable + '.exe';
    })
  });
  var open = require('../../open').detectAndOpenFactory(detect, settings);

  return {
    settings: settings,
    detect: detect,
    open: open
  };
};


================================================
FILE: lib/editors/common/terminal.js
================================================
var osascript = function(script) {
  return 'osascript -e \'' + script + '\'';
};

var terminal = function(cmd) {
  return 'tell application "Terminal" to do script "' + cmd + '"';
};

var runInTerminal = function(cmd) {
  return osascript(terminal('cd {projectPath}; ' + cmd));
};

module.exports = runInTerminal;


================================================
FILE: lib/editors/emacs.js
================================================
var runInTerminal = require('./common/terminal');

var settings = {
  patternOnly: true,
  escapeQuotes: true,
  pattern: runInTerminal('emacs --no-splash \\"+{line}:{column}\\" {filename}')
};

var detect = require('../detect').platformSupport(['darwin'], 'vim');
var open = require('../open').detectAndOpenFactory(detect, settings);

module.exports = {
  settings: settings,
  detect: detect,
  open: open
};


================================================
FILE: lib/editors/idea14ce.js
================================================
var jetbrainsEditor = require('./common/jetbrains');

module.exports = jetbrainsEditor({
  name: 'IDEA 14 CE',
  appFolder: 'IntelliJ IDEA 14 CE',
  executable: 'idea'
});


================================================
FILE: lib/editors/index.js
================================================
module.exports = {
  atom: require('./atom'),
  code: require('./code'),
  sublime: require('./sublime'),
  webstorm: require('./webstorm'),
  phpstorm: require('./phpstorm'),
  idea14ce: require('./idea14ce'),
  vim: require('./vim'),
  visualstudio: require('./visualstudio'),
  emacs: require('./emacs')
};


================================================
FILE: lib/editors/phpstorm.js
================================================
var jetbrainsEditor = require('./common/jetbrains');

module.exports = jetbrainsEditor({
  name: 'PhpStorm IDE',
  appFolder: 'PhpStorm',
  executable: 'phpstorm'
});


================================================
FILE: lib/editors/sublime.js
================================================
var settings = {
  pattern: '{filename}:{line}:{column}'
};

var detect = require('../detect').lazy('Sublime Text', ['subl'], '-h', {
  darwin: [
    '/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl'
  ],
  win32: [
    'C:/Program Files/Sublime Text/subl.exe',
    'C:/Program Files/Sublime Text 2/subl.exe',
    'C:/Program Files/Sublime Text 3/subl.exe',
    'C:/Program Files (x86)/Sublime Text/subl.exe',
    'C:/Program Files (x86)/Sublime Text 2/subl.exe',
    'C:/Program Files (x86)/Sublime Text 3/subl.exe'
  ]
});

var open = require('../open').detectAndOpenFactory(detect, settings);

module.exports = {
  settings: settings,
  detect: detect,
  open: open
};


================================================
FILE: lib/editors/vim.js
================================================
var runInTerminal = require('./common/terminal');

var settings = {
  patternOnly: true,
  escapeQuotes: true,
  pattern: runInTerminal('vim {filename} \\"+call cursor({line}, {column})\\"')
};

var detect = require('../detect').platformSupport(['darwin'], 'vim');
var open = require('../open').detectAndOpenFactory(detect, settings);

module.exports = {
  settings: settings,
  detect: detect,
  open: open
};


================================================
FILE: lib/editors/visualstudio.js
================================================
var path = require('path');
var helperPath = path.resolve(__dirname, 'visualstudio.vbs');

var settings = {
  pattern: '{filename} {line} {column}'
};

var detect = require('../detect').platformSupport(['win32'], 'Visual Studio', helperPath);
var open = require('../open').detectAndOpenFactory(detect, settings);

module.exports = {
  settings: settings,
  detect: detect,
  open: open
};


================================================
FILE: lib/editors/visualstudio.vbs
================================================
' Copyright (c) 2016, Evgeny Panasyuk

' Permission is hereby granted, free of charge, to any person or organization
' obtaining a copy of the software and accompanying documentation covered by
' this license (the "Software") to use, reproduce, display, distribute,
' execute, and transmit the Software, and to prepare derivative works of the
' Software, and to permit third-parties to whom the Software is furnished to
' do so, all subject to the following:
' 
' The copyright notices in the Software and this entire statement, including
' the above license grant, this restriction and the following disclaimer,
' must be included in all copies of the Software, in whole or in part, and
' all derivative works of the Software, unless such copies or derivative
' works are solely in the form of machine-executable object code generated by
' a source language processor.
' 
' THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
' IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
' FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
' SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
' FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
' ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
' DEALINGS IN THE SOFTWARE.

' e-mail: E?????[dot]P???????[at]gmail.???

Option Explicit

Dim filename, line, column
Dim MSVS_versions, version
Dim dte, fso, wshShell
Dim fullpath

filename = WScript.Arguments(0)
line = WScript.Arguments(1)
column = WScript.Arguments(2)

MSVS_versions = Array _
( _
    "VisualStudio.DTE.7", _
    "VisualStudio.DTE.7.1", _
    "VisualStudio.DTE.8.0", _
    "VisualStudio.DTE.9.0", _
    "VisualStudio.DTE.10.0", _
    "VisualStudio.DTE.11.0", _
    "VisualStudio.DTE.12.0", _
    "VisualStudio.DTE.14.0", _
    "VisualStudio.DTE.15.0" _
)

On Error Resume Next

For each version in MSVS_versions
    Err.Clear
    Set dte = getObject(,version)
    If Err.Number = 0 Then
        Exit For
    End If
Next

If Err.Number <> 0 Then
    Set dte = WScript.CreateObject("VisualStudio.DTE")
    Err.Clear
End If

Set wshShell = WScript.CreateObject("WScript.Shell")
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
fullpath = fso.GetAbsolutePathName(filename)

dte.MainWindow.Activate()
dte.MainWindow.Visible = True
dte.UserControl = True
wshShell.AppActivate dte.MainWindow.Caption

dte.ItemOperations.OpenFile fullpath
dte.ActiveDocument.Selection.MoveToLineAndOffset line, column + 1

if Err.Number <> 0 Then
    WScript.Quit Err.Number
End If

On Error Goto 0


================================================
FILE: lib/editors/webstorm.js
================================================
var jetbrainsEditor = require('./common/jetbrains');

module.exports = jetbrainsEditor({
  name: 'WebStorm IDE',
  appFolder: 'WebStorm',
  executable: 'webstorm'
});


================================================
FILE: lib/index.js
================================================
var extractFilename = require('./utils').extractFilename;
var number = require('./utils').number;
var assign = require('./utils').assign;
var editors = require('./editors');
var openFactory = require('./open').factory;

module.exports = {
  configure: function(options, cb) {
    options = options || {};
    cb = cb || function() {};

    var sourceLineOffset = number(options.line, 1);
    var sourceColumnOffset = number(options.column, 1);
    var editor = options.editor;
    var cmd = options.cmd;
    var open;

    if (!cmd && !editor) {
      if (editors.hasOwnProperty(process.env.OPEN_FILE)) {
        editor = process.env.OPEN_FILE;
      } else {
        cmd = process.env.OPEN_FILE ||
              process.env.VISUAL ||
              process.env.EDITOR;
      }
    }

    // if editor option is set then fail on wrong value
    if (editor && !editors.hasOwnProperty(editor)) {
      cb('Wrong value for `editor` option: ' + editor);
      return;
    }

    if (cmd) {
      var settings = {};

      // use editor settings as base
      if (editors.hasOwnProperty(editor)) {
        assign(settings, editors[editor].settings);
      }

      open = openFactory(cmd, assign(settings, options));
    } else {
      if (!editor) {
        cb('Editor is not specified');
        return;
      }

      open = editors[editor].open;
    }

    return {
      open: function(filename) {
        if (!filename) {
          return Promise.reject('File is not specified');
        }

        var info = extractFilename(filename);

        return open([
          info.filename,
          Math.max(info.line - sourceLineOffset, 0),
          Math.max(info.column - sourceColumnOffset, 0)
        ].join(':'));
      }
    };
  }
};


================================================
FILE: lib/open.js
================================================
var exec = require('child_process').exec;
var number = require('./utils').number;
var quote = require('./utils').quote;
var extractFilename = require('./utils').extractFilename;
var append = require('./utils').append;

function makeArguments(filename, settings) {
  var info = extractFilename(filename);
  var pattern = settings.pattern || '';
  var values = {
    projectPath: process.env.PROJECT_PATH || process.PWD || process.cwd(),
    line: info.line + number(settings.line, 1),
    column: info.column + number(settings.column, 1)
  };

  if (!/\{filename\}/.test(pattern)) {
    pattern = append(pattern, '{filename}:{line}:{column}');
  }

  return pattern
    .replace(
      new RegExp('\\{(' + Object.keys(values).join('|') + ')\\}', 'g'),
      function(m, name) {
        return values[name];
      }
    )
    // replace `{filename}` and adjoined right string for quoted filename,
    // since filename can have spaces
    //
    //   {filename} --line 1 --column 2
    //   => "filename" --line 1 --column 2
    //
    //   {filename}:1:2
    //   => "filename:1:2"
    //
    .replace(/\{filename\}(\S*)/, function(m, rest) {
      return quote(info.filename + rest, settings.escapeQuotes);
    });
}

function open(cmd, filename, settings) {
  return new Promise(function(resolve, reject) {
    var args;

    settings = settings || {};
    args = makeArguments(filename, settings);
    cmd = settings.patternOnly ? args : append(quote(cmd), args);

    exec(cmd, function(err) {
      if (err) {
        reject(err);
      } else {
        resolve();
      }
    });
  });
}

module.exports = open;
module.exports.factory = function(cmd, settings) {
  return function openInEditor(filename) {
    return open(cmd, filename, settings);
  };
};

module.exports.detectAndOpenFactory = function(detect, settings) {
  return function openInEditor(filename) {
    return detect().then(function(cmd) {
      open(cmd, filename, settings);
    });
  };
};


================================================
FILE: lib/utils.js
================================================
var osHomeDir = require('os-homedir')();
var path = require('path');

module.exports = {
  number: function(value, fallback) {
    return isNaN(value) ? fallback : value;
  },
  quote: function(value, escapeQuotes) {
    value = String(value)
      .replace(/\\/g, '\\\\')
      .replace(/"/g, '\"');

    return escapeQuotes ?
      '\\"' + value + '\\"' :
      '"' + value + '"';
  },
  extractFilename: function(filename) {
    var parts = filename.match(/^(.+?)((?::\d+){0,4})$/);
    var segment = parts[2].split(':').slice(1);

    return {
      filename: parts[1],
      line: parseInt(segment[0] || 0, 10),
      column: parseInt(segment[1] || 0, 10)
    };
  },
  fail: function(msg) {
    console.error(String(msg).trimRight());
    process.exit(2);
  },
  atHomeDir: function(filename) {
    return path.join(osHomeDir, filename);
  },
  any: function(promises, err) {
    return new Promise(function(resolve, reject) {
      Promise.all(promises.map(function(item) {
        if (item && typeof item.then == 'function') {
          return item.then(
            resolve,    // any success resolves the main promise immediately
            function() { /* ignore any reject */ }
          );
        }

        return item;
      })).then(function(results) {
        reject(err);
      }, reject);
    });
  },
  append: function(str, appendix) {
    return String(str).replace(/\s*$/, (str ? ' ' : '') + appendix);
  },
  assign: function(dest, src) {
    for (var key in src) {
      if (Object.prototype.hasOwnProperty.call(src, key)) {
        dest[key] = src[key];
      }
    }

    return dest;
  }
};


================================================
FILE: package.json
================================================
{
  "name": "open-in-editor",
  "description": "Open file in editor",
  "version": "2.2.0",
  "author": "Roman Dvornov <rdvornov@gmail.com>",
  "license": "MIT",
  "repository": "lahmatiy/open-in-editor",
  "keywords": [
    "open",
    "file",
    "editor",
    "atom",
    "code",
    "vscode",
    "idea",
    "phpstorm",
    "webstorm",
    "sublime",
    "visual studio",
    "vim",
    "emacs"
  ],
  "main": "./lib/index.js",
  "engines": {
    "node": ">=0.12.0"
  },
  "bin": {
    "oe": "./bin/oe"
  },
  "dependencies": {
    "clap": "^1.1.3",
    "os-homedir": "~1.0.2"
  },
  "devDependencies": {},
  "scripts": {}
}
Download .txt
gitextract_ejkaplpq/

├── .editorconfig
├── .gitignore
├── .jscsrc
├── .npmingnore
├── HISTORY.md
├── LICENSE
├── README.md
├── bin/
│   └── oe
├── lib/
│   ├── check.js
│   ├── detect.js
│   ├── editors/
│   │   ├── atom.js
│   │   ├── code.js
│   │   ├── common/
│   │   │   ├── jetbrains.js
│   │   │   └── terminal.js
│   │   ├── emacs.js
│   │   ├── idea14ce.js
│   │   ├── index.js
│   │   ├── phpstorm.js
│   │   ├── sublime.js
│   │   ├── vim.js
│   │   ├── visualstudio.js
│   │   ├── visualstudio.vbs
│   │   └── webstorm.js
│   ├── index.js
│   ├── open.js
│   └── utils.js
└── package.json
Download .txt
SYMBOL INDEX (5 symbols across 3 files)

FILE: lib/check.js
  function checkCommand (line 5) | function checkCommand(cmd, name, args) {
  function checkPath (line 21) | function checkPath(path, name) {

FILE: lib/detect.js
  function detect (line 4) | function detect(name, commands, args, locations) {

FILE: lib/open.js
  function makeArguments (line 7) | function makeArguments(filename, settings) {
  function open (line 41) | function open(cmd, filename, settings) {
Condensed preview — 27 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (32K chars).
[
  {
    "path": ".editorconfig",
    "chars": 81,
    "preview": "[*]\nend_of_line = lf\n\n[*.js]\ncharset = utf-8\nindent_style = space\nindent_size = 2"
  },
  {
    "path": ".gitignore",
    "chars": 19,
    "preview": "node_modules\n*.swp\n"
  },
  {
    "path": ".jscsrc",
    "chars": 4117,
    "preview": "{\n    \"excludeFiles\": [\n        \"node_modules/**\"\n    ],\n\n    \"disallowEmptyBlocks\": true,\n\n    \"disallowImplicitTypeCon"
  },
  {
    "path": ".npmingnore",
    "chars": 13,
    "preview": "node_modules\n"
  },
  {
    "path": "HISTORY.md",
    "chars": 1067,
    "preview": "## 2.2.0 (March 22, 2017)\n\n- Fixed passing settings to `open()` when only `cmd` option is set (#10)\n- Changed behaviour "
  },
  {
    "path": "LICENSE",
    "chars": 1081,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2015 Roman Dvornov\n\nPermission is hereby granted, free of charge, to any person obt"
  },
  {
    "path": "README.md",
    "chars": 5902,
    "preview": "[![NPM version](https://img.shields.io/npm/v/open-in-editor.svg)](https://www.npmjs.com/package/open-in-editor)\n\nNPM pac"
  },
  {
    "path": "bin/oe",
    "chars": 1090,
    "preview": "#!/usr/bin/env node\n\nvar clap = require('clap');\nvar version = require('../package.json').version;\nvar editors = require"
  },
  {
    "path": "lib/check.js",
    "chars": 686,
    "preview": "var exec = require('child_process').exec;\nvar fs = require('fs');\nvar quote = require('./utils').quote;\n\nfunction checkC"
  },
  {
    "path": "lib/detect.js",
    "chars": 1007,
    "preview": "var check = require('./check');\nvar any = require('./utils').any;\n\nfunction detect(name, commands, args, locations) {\n  "
  },
  {
    "path": "lib/editors/atom.js",
    "chars": 473,
    "preview": "var atHomeDir = require('../utils').atHomeDir;\n\nvar settings = {\n  pattern: '{filename}:{line}:{column}'\n};\n\nvar detect "
  },
  {
    "path": "lib/editors/code.js",
    "chars": 609,
    "preview": "var atHomeDir = require('../utils').atHomeDir;\n\nvar settings = {\n  pattern: '-r -g {filename}:{line}:{column}'\n};\n\nvar d"
  },
  {
    "path": "lib/editors/common/jetbrains.js",
    "chars": 991,
    "preview": "var fs = require('fs');\nvar path = require('path');\nvar lazyDetect = require('../../detect').lazy;\n\nvar settings = {\n  p"
  },
  {
    "path": "lib/editors/common/terminal.js",
    "chars": 315,
    "preview": "var osascript = function(script) {\n  return 'osascript -e \\'' + script + '\\'';\n};\n\nvar terminal = function(cmd) {\n  retu"
  },
  {
    "path": "lib/editors/emacs.js",
    "chars": 411,
    "preview": "var runInTerminal = require('./common/terminal');\n\nvar settings = {\n  patternOnly: true,\n  escapeQuotes: true,\n  pattern"
  },
  {
    "path": "lib/editors/idea14ce.js",
    "chars": 172,
    "preview": "var jetbrainsEditor = require('./common/jetbrains');\n\nmodule.exports = jetbrainsEditor({\n  name: 'IDEA 14 CE',\n  appFold"
  },
  {
    "path": "lib/editors/index.js",
    "chars": 310,
    "preview": "module.exports = {\n  atom: require('./atom'),\n  code: require('./code'),\n  sublime: require('./sublime'),\n  webstorm: re"
  },
  {
    "path": "lib/editors/phpstorm.js",
    "chars": 167,
    "preview": "var jetbrainsEditor = require('./common/jetbrains');\n\nmodule.exports = jetbrainsEditor({\n  name: 'PhpStorm IDE',\n  appFo"
  },
  {
    "path": "lib/editors/sublime.js",
    "chars": 687,
    "preview": "var settings = {\n  pattern: '{filename}:{line}:{column}'\n};\n\nvar detect = require('../detect').lazy('Sublime Text', ['su"
  },
  {
    "path": "lib/editors/vim.js",
    "chars": 411,
    "preview": "var runInTerminal = require('./common/terminal');\n\nvar settings = {\n  patternOnly: true,\n  escapeQuotes: true,\n  pattern"
  },
  {
    "path": "lib/editors/visualstudio.js",
    "chars": 389,
    "preview": "var path = require('path');\nvar helperPath = path.resolve(__dirname, 'visualstudio.vbs');\n\nvar settings = {\n  pattern: '"
  },
  {
    "path": "lib/editors/visualstudio.vbs",
    "chars": 2638,
    "preview": "' Copyright (c) 2016, Evgeny Panasyuk\n\n' Permission is hereby granted, free of charge, to any person or organization\n' o"
  },
  {
    "path": "lib/editors/webstorm.js",
    "chars": 167,
    "preview": "var jetbrainsEditor = require('./common/jetbrains');\n\nmodule.exports = jetbrainsEditor({\n  name: 'WebStorm IDE',\n  appFo"
  },
  {
    "path": "lib/index.js",
    "chars": 1738,
    "preview": "var extractFilename = require('./utils').extractFilename;\nvar number = require('./utils').number;\nvar assign = require('"
  },
  {
    "path": "lib/open.js",
    "chars": 1966,
    "preview": "var exec = require('child_process').exec;\nvar number = require('./utils').number;\nvar quote = require('./utils').quote;\n"
  },
  {
    "path": "lib/utils.js",
    "chars": 1621,
    "preview": "var osHomeDir = require('os-homedir')();\nvar path = require('path');\n\nmodule.exports = {\n  number: function(value, fallb"
  },
  {
    "path": "package.json",
    "chars": 630,
    "preview": "{\n  \"name\": \"open-in-editor\",\n  \"description\": \"Open file in editor\",\n  \"version\": \"2.2.0\",\n  \"author\": \"Roman Dvornov <"
  }
]

About this extraction

This page contains the full source code of the lahmatiy/open-in-editor GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 27 files (28.1 KB), approximately 8.0k tokens, and a symbol index with 5 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!