Merge branch 'master' into cj-add-react-editor-shims

Conflicts:
	src/react-editor-view.coffee
This commit is contained in:
Nathan Sobo
2014-06-06 23:59:54 +09:00
24 changed files with 340 additions and 69 deletions

View File

@@ -11,11 +11,15 @@ propose changes to this document in a pull request.
## Submitting Issues
* Include the version of Atom you are using and the OS.
* Include screenshots and animated GIFs whenever possible; they are immensely
helpful.
* Include the behavior you expected and other places you've seen that behavior
such as Emacs, vi, Xcode, etc.
* Check the dev tools (`alt-cmd-i`) for errors and stack traces to include.
* Check the dev tools (`alt-cmd-i`) for errors to include. If the dev tools
are open _before_ the error is triggered, a full stack trace for the error
will be logged. If you can reproduce the error, use this approach to get the
full stack trace and include it in the issue.
* On Mac, check Console.app for stack traces to include if reporting a crash.
* Perform a cursory search to see if a similar issue has already been submitted.

View File

@@ -6,6 +6,6 @@
"url": "https://github.com/atom/atom.git"
},
"dependencies": {
"atom-package-manager": "0.61.0"
"atom-package-manager": "0.65.0"
}
}

View File

@@ -91,6 +91,16 @@ the current keystroke sequence and continue searching from its parent. If you
want to remove a binding from a keymap you don't control, such as keymaps in
Atom core or in packages, use the `unset!` directive.
For example, the following code removes the keybinding for `a` in the Tree View,
which is normally used to trigger the `tree-view:add-file` command:
```coffee
'.tree-view':
'a': 'unset!'
```
![](https://cloud.githubusercontent.com/assets/38924/3174771/e7f6ce64-ebf4-11e3-922d-f280bffb3fc5.png)
## Forcing Chromium's Native Keystroke Handling
If you want to force the native browser behavior for a given keystroke, use the

View File

@@ -171,6 +171,33 @@ you'll need to increment the version when republishing.
Returns 204 No Content
### Stars
#### GET /api/users/:login/stars
List a user's starred packages.
Return value is similar to **GET /api/packages**
#### GET /api/stars
List the authenticated user's starred packages; requires authentication.
Return value is similar to **GET /api/packages**
#### POST /api/packages/:name/star
Star a package; requires authentication.
Returns a package.
#### DELETE /api/packages/:name/star
Unstar a package; requires authentication.
Returns 204 No Content.
### Atom updates
#### GET /api/updates

View File

@@ -7,8 +7,13 @@ Ubuntu LTS 12.04 64-bit is the recommended platform.
* OS with 64-bit architecture
* [node.js](http://nodejs.org/download/) v0.10.x
* [npm](http://www.npmjs.org/) v1.4.x
* libgnome-keyring-dev `sudo apt-get install libgnome-keyring-dev` (refer to your distribution's manual on how to install packages if you are not on Debian or Ubuntu-based systems)
* libgnome-keyring-dev
* on Ubuntu/Debian: `sudo apt-get install libgnome-keyring-dev`
* on Fedora: `sudo yum --assumeyes install libgnome-keyring-devel`
* on other distributions refer to the manual on how to install packages
* `npm config set python /usr/bin/python2 -g` to ensure that gyp uses Python 2
* This command may require `sudo` depending on how you have
[configured npm](https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager#ubuntu-mint-elementary-os).
## Instructions
@@ -21,7 +26,6 @@ Ubuntu LTS 12.04 64-bit is the recommended platform.
script/grunt mkdeb # Generates a .deb package at $TMPDIR/atom-build
```
## Troubleshooting

100
docs/debugging.md Normal file
View File

@@ -0,0 +1,100 @@
# Debugging
Atom provides several tools to help you understand unexpected behavior and debug problems. This guide describes some of those tools and a few approaches to help you debug and provide more helpful information when [submitting issues].
## Update to the latest version
You might be running into an issue which was already fixed in a more recent version of Atom than the one you're using.
If you're building Atom from source, pull down the latest version of master and [re-build][building atom].
If you're using released version, check which version of Atom you're using:
```shell
$ atom --version
0.99.0
```
Head on over to the [list of releases][atom releases] and see if there's a more recent release. You can update to the most recent release by downloading Atom from the releases page, or with the in-app auto-updater. The in-app auto-updater checks for and downloads a new version after you restart Atom, or if you use the Atom > Check for Update menu option.
## Check Atom and package settings
In some cases, unexpected behavior might be caused by misconfigured or unconfigured settings in Atom or in one of the packages.
Open Atom's Settings View with `cmd-,` or the Atom > Preferences menu option.
![Settings View]
Check Atom's settings in the Settings pane, there's a description of each configuration option [here][customizing guide]. For example, if you want Atom to use hard tabs (real tabs) and not soft tabs (spaces), disable the "Soft Tabs" option.
Since Atom ships with a set of packages and you can install additional packages yourself, check the list of packages and their settings. For example, if you'd like to get rid of the vertical line in the middle of the editor, disable the [Wrap Guide package]. And if you don't like it when Atom strips trailing whitespace or ensures that there's a single trailing newline in the file, you can configure that in the [Whitespace packages'][whitespace package] settings.
![Package Settings]
## Check the keybindings
If a command is not executing when you hit a keystroke or the wrong command is executing, there might be an issue with the keybindings for that keystroke. Atom ships with the [Keybinding resolver][keybinding resolver package], a neat package which helps you understand which keybindings are executed.
Show the keybinding resolver with <code>cmd-.</code> or with "Key Binding Resolver: Show" from the Command palette. With the keybinding resolver shown, hit a keystroke:
![Keybinding Resolver]
The keybinding resolver shows you a list of keybindings that exist for the keystroke, where each item in the list has the following:
* the command for the keybinding,
* the CSS selector used to define the context in which the keybinding is valid, and
* the file in which the keybinding is defined.
Of all the keybinding that are listed (grey color), at most one keybinding is matched and executed (green color). If the command you wanted to trigger isn't listed, then a keybinding for that command hasn't been defined. More keybindings are provided by [packages] and you can [define your own keybindings][customizing keybindings].
If multiple keybindings are matched, Atom determines which keybinding will be executed based on the [specificity of the selectors and the order in which they were loaded][specificity and order]. If the command you wanted to trigger is listed in the Keybinding resolver, but wasn't the one that was executed, this is normally explained by one of two causes:
* the keystroke was not used in the context defined by the keybinding's selector. For example, you can't trigger the "Tree View: Add File" command if the Tree View is not focused, or
* there is another keybinding that took precedence. This often happens when you install a package which defines keybinding that conflict with existing keybindings. If the package's keybindings have selectors with higher specificity or were loaded later, they'll have priority over existing ones.
Atom loads core Atom keybindings and package keybindings first, and user-defined keybindings after last. Since user-defined keybindings are loaded last, you can use your `keymap.cson` file to tweak the keybindings and sort out problems like these. For example, you can remove keybindings with [the `unset!` directive][unset directive].
If you notice that a package's keybindings are taking precedence over core Atom keybindings, it might be a good idea to report the issue on the package's GitHub repository.
## Check if the problem shows up in safe mode
A large part of Atom's functionality comes from packages you can install. In some cases, these packages might be causing unexpected behavior, problems, or performance issues.
To determine if a package you installed is causing problems, start Atom from the terminal in safe mode:
```
$ atom --safe
```
This starts Atom, but does not load packages from `~/.atom/packages` or `~/.atom/dev/packages`. If you can no longer reproduce the problem in safe mode, it's likely it was caused by one of the packages.
To figure out which package is causing trouble, start Atom normally again and open Settings (`cmd-,`). Since Settings allow you to disable each installed package, you can disable packages one by one until you can no longer reproduce the issue. Restart (`cmd-q`) or reload (`cmd-ctrl-alt-l`) Atom after you disable each package to make sure it's completely gone.
When you find the problematic package, you can disable or uninstall the package, and consider creating an issue on the package's GitHub repository.
## Check your config files
You might have defined some custom functionality or styles in Atom's [Init script or Stylesheet]. In some situations, these personal hacks might be causing problems so try clearing those files and restarting Atom.
## Check for errors in the developer tools
When an error is thrown in Atom, the developer tools are automatically shown with the error logged in the Console tab. However, if the dev tools are open before the error is triggered, a full stack trace for the error will be logged:
![devtools error]
If you can reproduce the error, use this approach to get the full stack trace. The stack trace might point to a problem in your [Init script][init script or stylesheet] or a specific package you installed, which you can then disable and report an issue on its GitHub repository.
[submitting issues]: https://github.com/atom/atom/blob/master/CONTRIBUTING.md#submitting-issues
[building atom]: https://github.com/atom/atom#building
[atom releases]: https://github.com/atom/atom/releases
[customizing guide]: https://atom.io/docs/latest/customizing-atom#configuration-key-reference
[settings view]: https://f.cloud.github.com/assets/671378/2241795/ba4827d8-9ce4-11e3-93a8-6666ee100917.png
[package settings]: https://cloud.githubusercontent.com/assets/38924/3173588/7e5f6b0c-ebe8-11e3-9ec3-e8d140967e79.png
[wrap guide package]: https://atom.io/packages/wrap-guide
[whitespace package]: https://atom.io/packages/whitespace
[keybinding resolver package]: https://atom.io/packages/keybinding-resolver
[keybinding resolver]: https://f.cloud.github.com/assets/671378/2241702/5dd5a102-9cde-11e3-9e3f-1d999930492f.png
[customizing keybindings]: https://atom.io/docs/latest/customizing-atom#customizing-key-bindings
[packages]: https://atom.io/packages
[specificity and order]: https://atom.io/docs/latest/advanced/keymaps#specificity-and-cascade-order
[unset directive]: https://atom.io/docs/latest/advanced/keymaps#removing-bindings
[init script or stylesheet]: https://atom.io/docs/latest/customizing-atom#quick-personal-hacks
[devtools error]: https://cloud.githubusercontent.com/assets/38924/3177710/11b4e510-ec13-11e3-96db-a2e8a7891773.png

View File

@@ -61,6 +61,15 @@
'ctrl-k ctrl-down': 'window:focus-pane-below'
'ctrl-k ctrl-left': 'window:focus-pane-on-left'
'ctrl-k ctrl-right': 'window:focus-pane-on-right'
'alt-1': 'pane:show-item-1'
'alt-2': 'pane:show-item-2'
'alt-3': 'pane:show-item-3'
'alt-4': 'pane:show-item-4'
'alt-5': 'pane:show-item-5'
'alt-6': 'pane:show-item-6'
'alt-7': 'pane:show-item-7'
'alt-8': 'pane:show-item-8'
'alt-9': 'pane:show-item-9'
'.workspace .editor':
# Platform Bindings
@@ -77,7 +86,7 @@
# Sublime Parity
'ctrl-a': 'core:select-all'
'ctrl-alt-p': 'editor:log-cursor-scope'
'ctrl-alt-shift-p': 'editor:log-cursor-scope'
'ctrl-k ctrl-u': 'editor:upper-case'
'ctrl-k ctrl-l': 'editor:lower-case'

View File

@@ -79,7 +79,7 @@
# Sublime Parity
'ctrl-a': 'core:select-all'
'ctrl-alt-p': 'editor:log-cursor-scope'
'ctrl-alt-shift-p': 'editor:log-cursor-scope'
'ctrl-k ctrl-u': 'editor:upper-case'
'ctrl-k ctrl-l': 'editor:lower-case'

View File

@@ -34,14 +34,14 @@
"git-utils": "^1.3",
"grim": "0.10.0",
"guid": "0.0.10",
"jasmine-tagged": "^1.1.1",
"jasmine-tagged": "^1.1.2",
"less-cache": "0.12.0",
"mixto": "^1",
"mkdirp": "0.3.5",
"nslog": "0.5.0",
"oniguruma": "^1.0.6",
"optimist": "0.4.0",
"pathwatcher": "^1.3.1",
"pathwatcher": "^1.3.2",
"property-accessors": "^1",
"q": "^1.0.1",
"random-words": "0.0.1",
@@ -58,30 +58,30 @@
"temp": "0.5.0",
"text-buffer": "^2.2.2",
"theorist": "^1",
"underscore-plus": "^1.3.0",
"underscore-plus": "^1.4.1",
"vm-compatibility-layer": "0.1.0"
},
"packageDependencies": {
"atom-dark-syntax": "0.15.0",
"atom-dark-syntax": "0.16.0",
"atom-dark-ui": "0.29.0",
"atom-light-syntax": "0.17.0",
"atom-light-ui": "0.25.0",
"base16-tomorrow-dark-theme": "0.16.0",
"solarized-dark-syntax": "0.15.0",
"solarized-light-syntax": "0.7.0",
"solarized-dark-syntax": "0.16.0",
"solarized-light-syntax": "0.8.0",
"archive-view": "0.31.0",
"autocomplete": "0.28.0",
"autoflow": "0.17.0",
"autosave": "0.13.0",
"background-tips": "0.14.0",
"bookmarks": "0.22.0",
"bracket-matcher": "0.41.0",
"bracket-matcher": "0.42.0",
"command-palette": "0.21.0",
"deprecation-cop": "0.6.0",
"dev-live-reload": "0.31.0",
"exception-reporting": "0.18.0",
"feedback": "0.33.0",
"find-and-replace": "0.111.0",
"find-and-replace": "0.113.0",
"fuzzy-finder": "0.54.0",
"git-diff": "0.28.0",
"go-to-line": "0.22.0",
@@ -94,22 +94,22 @@
"open-on-github": "0.28.0",
"package-generator": "0.30.0",
"release-notes": "0.32.0",
"settings-view": "0.118.0",
"snippets": "0.44.0",
"spell-check": "0.35.0",
"settings-view": "0.119.0",
"snippets": "0.45.0",
"spell-check": "0.36.0",
"status-bar": "0.40.0",
"styleguide": "0.29.0",
"symbols-view": "0.55.0",
"tabs": "0.41.0",
"timecop": "0.19.0",
"tree-view": "0.96.0",
"tree-view": "0.97.0",
"update-package-dependencies": "0.6.0",
"welcome": "0.16.0",
"whitespace": "0.22.0",
"wrap-guide": "0.18.0",
"language-c": "0.15.0",
"language-coffee-script": "0.22.0",
"language-css": "0.16.0",
"language-css": "0.17.0",
"language-gfm": "0.38.0",
"language-git": "0.9.0",
"language-go": "0.12.0",
@@ -122,12 +122,12 @@
"language-make": "0.10.0",
"language-objective-c": "0.11.0",
"language-perl": "0.9.0",
"language-php": "0.14.0",
"language-php": "0.15.0",
"language-property-list": "0.7.0",
"language-python": "0.17.0",
"language-ruby": "0.26.0",
"language-python": "0.18.0",
"language-ruby": "0.27.0",
"language-ruby-on-rails": "0.14.0",
"language-sass": "0.11.0",
"language-sass": "0.12.0",
"language-shellscript": "0.8.0",
"language-source": "0.7.0",
"language-sql": "0.8.0",

View File

@@ -1,23 +1,8 @@
#!/usr/bin/env node
var fs = require('fs');
var nodeVersion = process.versions.node.split('.')
var nodeMajorVersion = +nodeVersion[0]
var nodeMinorVersion = +nodeVersion[1]
if (nodeMajorVersion === 0 && nodeMinorVersion < 10) {
console.warn("You must run script/bootstrap and script/build with node v0.10 or above");
process.exit(1);
}
// Make sure python2.7 is installed
if (process.platform == 'win32' && !fs.existsSync('C:\\Python27\\')) {
console.warn("You must have Python 2.7 installed at 'C:\\Python27\\'");
process.exit(1);
}
var verifyRequirements = require('./utils/verify-requirements');
var safeExec = require('./utils/child-process-wrapper.js').safeExec;
var fs = require('fs');
var path = require('path');
// Executes an array of commands one by one.
@@ -31,34 +16,47 @@ function executeCommands(commands, done, index) {
command = command.command;
}
safeExec(command, options, executeCommands.bind(this, commands, done, index + 1));
} else
}
else
done(null);
}
var apmInstallPath = path.resolve(__dirname, '..', 'apm');
if (!fs.existsSync(apmInstallPath))
function bootstrap() {
var apmInstallPath = path.resolve(__dirname, '..', 'apm');
if (!fs.existsSync(apmInstallPath))
fs.mkdirSync(apmInstallPath);
if (!fs.existsSync(path.join(apmInstallPath, 'node_modules')))
if (!fs.existsSync(path.join(apmInstallPath, 'node_modules')))
fs.mkdirSync(path.join(apmInstallPath, 'node_modules'));
var apmPath = path.resolve(__dirname, '..', 'apm', 'node_modules', 'atom-package-manager', 'bin', 'apm')
var apmFlags = process.env.JANKY_SHA1 || process.argv.indexOf('--no-color') !== -1 ? '--no-color' : '';
var apmPath = path.resolve(__dirname, '..', 'apm', 'node_modules', 'atom-package-manager', 'bin', 'apm')
var apmFlags = process.env.JANKY_SHA1 || process.argv.indexOf('--no-color') !== -1 ? '--no-color' : '';
var npmPath = path.resolve(__dirname, '..', 'build', 'node_modules', '.bin', 'npm');
var initialNpmCommand = fs.existsSync(npmPath) ? npmPath : 'npm';
var npmFlags = ' --userconfig=' + path.resolve('.npmrc') + ' ';
var npmPath = path.resolve(__dirname, '..', 'build', 'node_modules', '.bin', 'npm');
var initialNpmCommand = fs.existsSync(npmPath) ? npmPath : 'npm';
var npmFlags = ' --userconfig=' + path.resolve('.npmrc') + ' ';
var packagesToDedupe = ['fs-plus', 'humanize-plus', 'oniguruma', 'roaster', 'season'];
var echoNewLine = process.platform == 'win32' ? 'echo.' : 'echo';
var packagesToDedupe = ['fs-plus', 'humanize-plus', 'oniguruma', 'roaster', 'season'];
var echoNewLine = process.platform == 'win32' ? 'echo.' : 'echo';
var commands = [
var commands = [
{command: initialNpmCommand + npmFlags + 'install --quiet', options: {cwd: path.resolve(__dirname, '..', 'build'), ignoreStdout: true}},
{command: npmPath + npmFlags + 'install --quiet', options: {cwd: apmInstallPath, ignoreStdout: true}},
echoNewLine,
apmPath + ' clean ' + apmFlags,
apmPath + ' install --quiet ' + apmFlags,
apmPath + ' dedupe --quiet ' + apmFlags + ' ' + packagesToDedupe.join(' '),
];
];
process.chdir(path.dirname(__dirname));
executeCommands(commands, process.exit);
process.chdir(path.dirname(__dirname));
executeCommands(commands, process.exit);
}
verifyRequirements(function(error, successMessage) {
if (error) {
console.log(error);
process.exit(1);
}
console.log(successMessage);
bootstrap();
});

View File

@@ -1,9 +1,17 @@
#!/usr/bin/env node
var cp = require('./utils/child-process-wrapper.js');
var fs = require('fs');
var path = require('path');
// node build/node_modules/.bin/grunt "$@"
var gruntPath = path.resolve(__dirname, '..', 'build', 'node_modules', '.bin', 'grunt') + (process.platform === 'win32' ? '.cmd' : '');
if (!fs.existsSync(gruntPath)) {
console.error('Grunt command does not exist at: ' + gruntPath);
console.error('Run script/bootstrap to install Grunt');
process.exit(1);
}
var args = ['--gruntfile', path.resolve('build', 'Gruntfile.coffee')];
args = args.concat(process.argv.slice(2));
cp.safeSpawn(gruntPath, args, process.exit);

View File

@@ -21,10 +21,10 @@ mkdir -p "$TARGET/usr"
env INSTALL_PREFIX="$TARGET/usr" script/grunt install
mkdir -p "$TARGET/DEBIAN"
mv "$CONTROL_FILE" "$TARGET/DEBIAN/control"
cp "$CONTROL_FILE" "$TARGET/DEBIAN/control"
mkdir -p "$TARGET/usr/share/applications"
mv "$DESKTOP_FILE" "$TARGET/usr/share/applications"
cp "$DESKTOP_FILE" "$TARGET/usr/share/applications"
mkdir -p "$TARGET/usr/share/pixmaps"
cp "$ICON_FILE" "$TARGET/usr/share/pixmaps"

View File

@@ -0,0 +1,85 @@
var path = require('path');
var fs = require('fs');
var childProcess = require('child_process');
var pythonExecutable = process.env.PYTHON;
module.exports = function(cb) {
verifyNode(function(error, nodeSuccessMessage) {
if (error) {
cb(error);
return;
}
verifyPython27(function(error, pythonSuccessMessage) {
cb(error, (nodeSuccessMessage + "\n" + pythonSuccessMessage).trim());
});
});
};
function verifyNode(cb) {
var nodeVersion = process.versions.node;
var versionArray = nodeVersion.split('.');
var nodeMajorVersion = +versionArray[0];
var nodeMinorVersion = +versionArray[1];
if (nodeMajorVersion === 0 && nodeMinorVersion < 10) {
error = "node v0.10 is required to build Atom.";
cb(error);
}
else {
cb(null, "Node: v" + nodeVersion);
}
}
function verifyPython27(cb) {
if (process.platform == 'win32') {
if (!pythonExecutable) {
var systemDrive = process.env.SystemDrive || 'C:\\';
pythonExecutable = path.join(systemDrive, 'Python27', 'python.exe');
if (!fs.existsSync(pythonExecutable)) {
pythonExecutable = 'python';
}
}
checkPythonVersion(pythonExecutable, cb);
}
else {
cb(null, '');
}
}
function checkPythonVersion (python, cb) {
var pythonHelpMessage = "Set the PYTHON env var to '/path/to/Python27/python.exe' if your python is installed in a non-default location.";
childProcess.execFile(python, ['-c', 'import platform; print(platform.python_version());'], { env: process.env }, function (err, stdout) {
if (err) {
error = "Python 2.7 is required to build Atom. An error (" + err + ") occured when checking the version of '" + python + "'. ";
error += pythonHelpMessage;
cb(error);
return;
}
var version = stdout.trim();
if (~version.indexOf('+')) {
version = version.replace(/\+/g, '');
}
if (~version.indexOf('rc')) {
version = version.replace(/rc(.*)$/ig, '');
}
// Atom requires python 2.7 or higher (but not python 3) for node-gyp
var versionArray = version.split('.').map(function(num) { return +num; });
var goodPythonVersion = (versionArray[0] === 2 && versionArray[1] >= 7);
if (!goodPythonVersion) {
error = "Python 2.7 is required to build Atom. '" + python + "' returns version " + version + ". ";
error += pythonHelpMessage;
cb(error);
return;
}
// Finally, if we've gotten this far, callback to resume the install process.
cb(null, "Python: v" + version);
});
}

View File

@@ -7,8 +7,8 @@ sourceMaps = {}
formatStackTrace = (spec, message='', stackTrace) ->
return stackTrace unless stackTrace
jasminePattern = /^\s*at\s+.*\(?.*\/jasmine(-[^\/]*)?\.js:\d+:\d+\)?\s*$/
firstJasmineLinePattern = /^\s*at \/.*\/jasmine(-[^\/]*)?\.js:\d+:\d+\)?\s*$/
jasminePattern = /^\s*at\s+.*\(?.*[/\\]jasmine(-[^/\\]*)?\.js:\d+:\d+\)?\s*$/
firstJasmineLinePattern = /^\s*at [/\\].*[/\\]jasmine(-[^/\\]*)?\.js:\d+:\d+\)?\s*$/
convertedLines = []
for line in stackTrace.split('\n')
convertedLines.push(line) unless jasminePattern.test(line)
@@ -23,7 +23,7 @@ formatStackTrace = (spec, message='', stackTrace) ->
for line, index in lines
# Remove prefix of lines matching: at [object Object].<anonymous> (path:1:2)
prefixMatch = line.match(/at \[object Object\]\.<anonymous> \(([^\)]+)\)/)
prefixMatch = line.match(/at \[object Object\]\.<anonymous> \(([^)]+)\)/)
line = "at #{prefixMatch[1]}" if prefixMatch
# Relativize locations to spec directory

View File

@@ -14,8 +14,8 @@ try
{runSpecSuite} = require './jasmine-helper'
# Add 'src/exports' to module search path.
exportsPath = path.resolve(atom.getLoadSettings().resourcePath, 'exports')
# Add 'exports' to module search path.
exportsPath = path.join(atom.getLoadSettings().resourcePath, 'exports')
require('module').globalPaths.push(exportsPath)
# Still set NODE_PATH since tasks may need it.
process.env.NODE_PATH = exportsPath

View File

@@ -27,6 +27,9 @@ setSpecDirectory = (specDirectory) ->
runAllSpecs = ->
{resourcePath} = atom.getLoadSettings()
requireSpecs(path.join(resourcePath, 'spec'))
setSpecType('core')
fixturesPackagesPath = path.join(__dirname, 'fixtures', 'packages')
packagePaths = atom.packages.getAvailablePackageNames().map (packageName) ->
atom.packages.resolvePackagePath(packageName)

View File

@@ -151,8 +151,8 @@ class Atom extends Model
{devMode, safeMode, resourcePath} = @getLoadSettings()
configDirPath = @getConfigDirPath()
# Add 'src/exports' to module search path.
exportsPath = path.resolve(resourcePath, 'exports')
# Add 'exports' to module search path.
exportsPath = path.join(resourcePath, 'exports')
require('module').globalPaths.push(exportsPath)
# Still set NODE_PATH since tasks may need it.
process.env.NODE_PATH = exportsPath

View File

@@ -60,6 +60,10 @@ class AtomApplication
constructor: (options) ->
{@resourcePath, @version, @devMode, @safeMode} = options
# Normalize to make sure drive letter case is consistent on Windows
@resourcePath = path.normalize(@resourcePath) if @resourcePath
global.atomApplication = this
@pidsToOpenWindows = {}

View File

@@ -21,6 +21,10 @@ class AtomWindow
constructor: (settings={}) ->
{@resourcePath, pathToOpen, initialLine, initialColumn, @isSpec, @exitWhenDone} = settings
# Normalize to make sure drive letter case is consistent on Windows
@resourcePath = path.normalize(@resourcePath) if @resourcePath
global.atomApplication.addWindow(this)
@browserWindow = new BrowserWindow show: false, title: 'Atom', icon: @constructor.iconPath
@@ -29,6 +33,7 @@ class AtomWindow
loadSettings = _.extend({}, settings)
loadSettings.windowState ?= '{}'
loadSettings.appVersion = app.getVersion()
loadSettings.resourcePath = @resourcePath
# Only send to the first non-spec window created
if @constructor.includeShellLoadTime and not @isSpec
@@ -109,9 +114,15 @@ class AtomWindow
new ContextMenu(menuTemplate, this)
if @isSpec
# Workaround for https://github.com/atom/atom-shell/issues/380
# Don't focus the window when it is being blurred during close or
# else the app will crash on Windows.
if process.platform is 'win32'
@browserWindow.on 'close', => @isWindowClosing = true
# Spec window's web view should always have focus
@browserWindow.on 'blur', =>
@browserWindow.focusOnWebView()
@browserWindow.focusOnWebView() unless @isWindowClosing
openPath: (pathToOpen, initialLine, initialColumn) ->
if @loaded

View File

@@ -55,6 +55,8 @@ start = ->
console.log("App load time: #{Date.now() - global.shellStartTime}ms") unless args.test
global.devResourcePath = process.env.ATOM_DEV_RESOURCE_PATH ? path.join(app.getHomeDir(), 'github', 'atom')
# Normalize to make sure drive letter case is consistent on Windows
global.devResourcePath = path.normalize(global.devResourcePath) if global.devResourcePath
setupCrashReporter = ->
crashReporter.start(productName: 'Atom', companyName: 'GitHub')

View File

@@ -65,7 +65,7 @@ EditorComponent = React.createClass
if @mouseWheelScreenRow? and not (renderedStartRow <= @mouseWheelScreenRow < renderedEndRow)
mouseWheelScreenRow = @mouseWheelScreenRow
className = 'editor editor-colors react'
className = 'editor-contents editor-colors'
className += ' is-focused' if focused
div className: className, style: {fontSize, lineHeight, fontFamily}, tabIndex: -1,

View File

@@ -5,7 +5,9 @@ EditorComponent = require './editor-component'
module.exports =
class ReactEditorView extends View
@content: -> @div class: 'react-wrapper'
# The `overlayer` class is included for backwards compatibility with
# context menus. It should be removed in v1.0.0
@content: -> @div class: 'editor react overlayer'
focusOnAttach: false

View File

@@ -20,7 +20,11 @@
z-index: 2;
}
&.is-focused .cursors.blink-off .cursor {
.editor-contents.is-focused .cursor {
visibility: visible;
}
.cursors.blink-off .cursor {
visibility: hidden;
}
@@ -74,7 +78,7 @@
}
}
.editor {
.editor, .editor-contents {
overflow: hidden;
cursor: text;
display: -webkit-flex;

View File

@@ -38,7 +38,7 @@
background-color: @pane-item-background-color;
}
> *, > .react-wrapper > * {
> *, > .editor.react > * {
position: absolute;
top: 0;
right: 0;