Comparar commits

...

246 Commits

Autor SHA1 Mensagem Data
Kevin Sawicki 85df5e61e5 Upgrade to settings-view@0.97.0 2014-03-20 15:22:32 -07:00
Kevin Sawicki 5e477ff984 Upgrade to apm 0.35.0 2014-03-20 15:12:47 -07:00
Kevin Sawicki 2baf9eda61 Upgrade to apm 0.34.0 2014-03-20 15:05:47 -07:00
Kevin Sawicki 7d6d8175b9 Upgrade to apm 0.33.0 2014-03-20 14:57:23 -07:00
Kevin Sawicki 0fdda032cc Guard against interval firing after editor is destroyed 2014-03-20 14:41:16 -07:00
Kevin Sawicki c82d0f8c1c Upgrade to tree-view@0.83.0 2014-03-20 14:39:17 -07:00
Nathan Sobo 65ff108615 Warn and exit if script/bootstrap is run with wrong node version 2014-03-20 13:05:49 -06:00
Nathan Sobo 075611eb65 Don't recalculate dimensions on stylesheet changes for detached editors 2014-03-20 12:19:34 -06:00
Kevin Sawicki b82537b020 Upgrade to git-utils 1.0.1 2014-03-20 10:54:33 -07:00
Kevin Sawicki 06fee4636a Prepare 0.75.0 release 2014-03-20 10:10:40 -07:00
Kevin Sawicki 5fe1af3239 Upgrade to language-ruby-on-rails@0.12.0 2014-03-20 09:26:13 -07:00
Kevin Sawicki bf6cc3d384 Upgrade to tree-view@0.82.0 2014-03-20 09:21:21 -07:00
Kevin Sawicki b4a4ba91b0 Upgrade to settings-view@0.96.0 2014-03-20 09:13:20 -07:00
Kevin Sawicki 271776944a Merge pull request #1769 from atom/bump-apm
update apm submodule to 0.32.0
2014-03-20 09:04:09 -07:00
Nathan Sobo b1d5a3d75f Merge pull request #1772 from atom/ns-update-editor-dimensions
Update editor properly when line height or char width change via a stylesheet
2014-03-20 10:01:08 -06:00
Nathan Sobo bd68790a10 Cleanup stylesheets added during spec in afterEach 2014-03-19 21:51:08 -06:00
Nathan Sobo f0a7663447 Recalculate line-height and char-width when stylesheets change
If either of these dimensions change, we request a display update for
the editor.
2014-03-19 21:37:26 -06:00
Kevin Sawicki db627d65c7 Upgrade to language-html@0.14.0 2014-03-19 18:18:25 -07:00
Cheng Zhao a9f581797a Upgrade to minidump@0.5.x
This will generate symbols from .dSYM file if we have one.
2014-03-20 09:14:42 +08:00
Kevin Sawicki 763291230d Upgrade to bookmars@0.22.0 2014-03-19 17:49:26 -07:00
Kevin Sawicki 55a77a34bd Upgrade to language-gfm@0.22.0 2014-03-19 17:47:26 -07:00
Kevin Sawicki f4f975c6b7 Upgrade to image-view@0.32.0 2014-03-19 16:33:03 -07:00
Nathan Sobo 2d26382510 Emit 'stylesheet-changed' from atom.themes
Whenever stylesheets are applied or removed.
2014-03-19 15:51:36 -06:00
Kevin Sawicki c5cd56a99e Upgrade to language-toml@0.12.0 2014-03-19 14:50:25 -07:00
Nathan Sobo 24943dd526 Avoid sending arguments object to child process.
The arguments variable is not a real array, and gets screwed up when
sending it to the child process. This updates it to send an array
instead.

Thanks to @lackac!

Refs atom/terminal#23.
2014-03-19 15:40:35 -06:00
Kevin Sawicki 8b32e30ee7 Upgrade to language-todo@0.9.0 2014-03-19 14:37:22 -07:00
Kevin Sawicki 72c99be0f2 Upgrade to whitespace@0.21.0 2014-03-19 14:26:59 -07:00
Kevin Sawicki 10ac1f6ae8 Upgrade to language-gfm@0.21.0 2014-03-19 14:05:44 -07:00
Kevin Sawicki 524170534c Upgrade to language-gfm@0.20.0 2014-03-19 13:32:05 -07:00
Kevin Sawicki d542f35336 Upgrade to fuzzy-finder@0.42.0 2014-03-19 10:56:09 -07:00
Kevin Sawicki 697ba53c6b Upgrade to settings-view@0.95.0 2014-03-19 10:50:51 -07:00
Kevin Sawicki 148a8bad2e Merge pull request #1771 from atom/ks-dont-trim-leading-whitespace-on-newline
Ignore leading whitespace when auto-indenting a newline
2014-03-19 10:24:05 -07:00
Daniel Hengeveld 7a344b91aa update apm submodule to 0.32.0 2014-03-19 10:15:50 -07:00
Kevin Sawicki 5783350484 📝 Tweak option comment 2014-03-19 10:06:10 -07:00
Kevin Sawicki 9fce23d5ac Update option to preserveLeadingWhitespace 2014-03-19 10:05:34 -07:00
Kevin Sawicki 7c17c99b9e Update spec description 2014-03-19 10:05:34 -07:00
Kevin Sawicki ff560bc3a3 Update spec to not be before whitespace 2014-03-19 10:05:34 -07:00
Kevin Sawicki 61f01f4713 📝 Add through 2014-03-19 10:05:34 -07:00
Kevin Sawicki 2e8c0234bb Tweak spec description 2014-03-19 10:05:34 -07:00
Kevin Sawicki 8e62d772b3 Ignore leading whitespace when auto-indenting a newline
Refs atom/language-less#1
2014-03-19 10:05:34 -07:00
Kevin Sawicki 532cfb5775 Upgrade to tree-view@0.81.0 2014-03-19 09:19:56 -07:00
Kevin Sawicki f912eb805d Add npm as build dependency
This switches script/bootstrap to use a locally installed npm so that
the version of npm being used to bootstrap apm is now managed in
build/package.json instead of whatever version is installed globally on the
machine running script/bootstrap.

Closes #1770
2014-03-19 08:41:08 -07:00
Cheng Zhao 6838ff8ea2 Merge pull request #1762 from atom/linux-build
Make Atom build on Linux
2014-03-19 01:40:11 +00:00
Kevin Sawicki 8aa2c40bbf Don't capture whitespace group in comment patterns
This was causing corruption when uncommenting XML since the fact that
it was being captured was throwing off the index used into the match.

Closes atom/language-xml#3
2014-03-18 18:19:59 -07:00
Kevin Sawicki c2d603769e Upgrade to language-hyperlink@0.9.0 2014-03-18 17:29:50 -07:00
Nathan Sobo 3710d85e63 Upgrade to atom-keymap@0.9.0 to improve pending mode timeout behavior 2014-03-18 18:12:41 -06:00
Kevin Sawicki 12a72302d9 Upgrade to bracket-matcher@0.26.0 2014-03-18 09:41:35 -07:00
Kevin Sawicki 2c70f0dc27 Upgrade to language-html@0.13.0 2014-03-18 09:05:27 -07:00
Kevin Sawicki 6165c65a51 Upgrade to language-todo@0.8.0 2014-03-18 09:02:48 -07:00
Kevin Sawicki 3ea3f64214 Upgrade to language-php@0.13.0 2014-03-18 09:01:37 -07:00
Cheng Zhao 08601d32a3 Upgrade to atom-shell@0.11.1 2014-03-18 17:57:34 +08:00
Cheng Zhao 0ae1f6858c Upgrade to apm@0.31.0 2014-03-18 17:02:31 +08:00
Cheng Zhao f2e5b480e1 Fix specs on Mac. 2014-03-18 16:32:34 +08:00
Cheng Zhao 19ab197bc1 🐧 Make atom.sh work. 2014-03-18 16:27:43 +08:00
Cheng Zhao 8bf1464b64 Fix setting NODE_PATH in specs window. 2014-03-18 15:57:16 +08:00
Cheng Zhao 0ee3421cbc Merge branch 'master' into linux-build 2014-03-18 15:54:52 +08:00
Cheng Zhao a18536e8a4 🐧 Add keymap. 2014-03-18 15:51:13 +08:00
Cheng Zhao cc2e1eecd3 Still set NODE_PATH since tasks may need it. 2014-03-18 15:38:57 +08:00
Cheng Zhao 87b95128f9 Do not rely on NODE_PATH env. 2014-03-18 15:34:24 +08:00
Cheng Zhao 344a56b47a 🐧 Add menu. 2014-03-18 14:12:25 +08:00
Cheng Zhao da8d055817 🐧 Quit when all windows are closed. 2014-03-18 14:09:43 +08:00
Nathan Sobo c07272633f Merge pull request #1760 from atom/ns-extract-keymap
Extract and improve Keymap
2014-03-17 22:40:38 -06:00
Nathan Sobo b26e0d42d5 Merge branch 'master' into ns-extract-keymap 2014-03-17 22:28:14 -06:00
Nathan Sobo 8ee4e927a1 Unspy setTimeout in an attempt to fix flaky spec 2014-03-17 22:27:26 -06:00
Cheng Zhao 7eaa3cb2b6 Upgrade to grunt-download-atom-shell@0.6.1 2014-03-18 12:24:22 +08:00
Cheng Zhao 696928540c Upgrade to keytar@1.x 2014-03-18 12:18:08 +08:00
Cheng Zhao b33f36d30a Update apm: Fix keytar on Linux. 2014-03-18 12:17:20 +08:00
Nathan Sobo 179b392a49 Merge branch 'master' into ns-extract-keymap 2014-03-17 21:59:20 -06:00
Nathan Sobo 857f19c382 Upgrade to image-view@0.31.0 to fix flakey spec 2014-03-17 21:58:21 -06:00
Nathan Sobo 8a333208a2 Upgrade to atom-keymap@0.8.0 2014-03-17 13:51:25 -06:00
Nathan Sobo ff23f62c3e Move jQuery.Event::abortKeyBinding to keymap-extensions 2014-03-17 13:05:47 -06:00
Nathan Sobo dcdc9d6b90 Construct Keymap with options object 2014-03-17 13:05:47 -06:00
Nathan Sobo 3d28f957c7 Export Keymap from keymap-extensions 2014-03-17 13:05:47 -06:00
Nathan Sobo 2eb2aa5bef Rename season variable to CSON for consistency 2014-03-17 13:05:46 -06:00
Nathan Sobo 371820fd59 Use ^ prefix for pathwatcher dependency 2014-03-17 13:05:46 -06:00
Nathan Sobo 596c584ef1 Add atom-keymap classes to the docs grunt task 2014-03-17 13:05:46 -06:00
Nathan Sobo 27a1577021 Upgrade to atom-keymap@0.6.0 for bug fixes 2014-03-17 13:05:46 -06:00
Nathan Sobo 8f2745c248 Remove old keymap-spec. It has been supplanted by the atom-keymap npm 2014-03-17 13:05:46 -06:00
Nathan Sobo 1c964d05f8 💄 spec helper's keydownEvent 2014-03-17 13:05:46 -06:00
Nathan Sobo 2dcbf7f751 Replace Keymap subclass with keymap-extensions 2014-03-17 13:05:46 -06:00
Nathan Sobo 067f73da38 Defend against jQuery-wrapped targets in keydownEvent spec helper 2014-03-17 13:05:46 -06:00
Nathan Sobo ae324c13a6 Upgrade to atom-keymap@0.5.0 to support keybinding resolver 2014-03-17 13:05:46 -06:00
Nathan Sobo 9a488adbb9 Suggest people bind to .workspace instead of body 2014-03-17 13:05:46 -06:00
Nathan Sobo 4c0f1efec6 Set the keymap default target to atom.workspaceView's DOM element 2014-03-17 13:05:46 -06:00
Nathan Sobo 8974cb5f34 Make a quick and dirty subclass of the Keymap from the npm 2014-03-17 13:05:46 -06:00
Nathan Sobo cb303a3149 Depend on atom-keymap npm and a compatible pathwatcher version 2014-03-17 13:05:45 -06:00
Kevin Sawicki c44628a5b1 Upgrade to language-ruby-on-rails@0.11.0 2014-03-17 11:52:17 -07:00
Kevin Sawicki fb1effc654 Upgrade to language-html@0.12.0 2014-03-17 11:50:17 -07:00
Kevin Sawicki 5ab213b854 Upgrade to language-javascript@0.21.0 2014-03-17 10:34:47 -07:00
Kevin Sawicki bbf738635c Upgrade to language-php@0.12.0 2014-03-17 10:27:07 -07:00
Cheng Zhao 705d3e9fbc Do not run grunt install on Linux by default.
On Linux we usually separate build from install, and only run install
with sudo when needed.
2014-03-17 07:44:58 +00:00
Cheng Zhao 6bd3728548 Fix grunt on Linux. 2014-03-17 07:28:36 +00:00
Cheng Zhao 7d997f6d9a Use multi-platform-node branch of apm. 2014-03-17 04:11:31 +00:00
Cheng Zhao e919eb3eba Upgrade to atom-shell@0.11.0 2014-03-16 14:05:06 +00:00
Nathan Sobo c2b2096c8c Merge pull request #1761 from atom/enable_graphics_switching
Enable automatic graphics switching
2014-03-15 19:17:52 -06:00
Lincoln Stoll 46638d2ea1 Enable automatic graphics switching 2014-03-15 19:24:40 +01:00
Kevin Sawicki fdb08517d3 Prepare 0.74.0 release 2014-03-14 09:37:27 -07:00
Kevin Sawicki f272962562 Upgrade to settings-view@0.94.0 2014-03-14 09:14:50 -07:00
Kevin Sawicki 9e661d8a99 Upgrade to find-and-replace@0.92.0 2014-03-13 18:23:40 -07:00
Kevin Sawicki 43c0b79273 Upgrade to tabs@0.31.0 2014-03-13 18:01:44 -07:00
Corey Johnson 96e96c3c7f Merge pull request #1757 from atom/cj-shhhhh
Don't show error messages for version and help cli options
2014-03-13 17:42:19 -07:00
probablycorey 15c51b4417 Redirect help and version stderr to /dev/null
Closes #1580 based on @zcbenz's suggestion.
2014-03-13 15:00:24 -07:00
Kevin Sawicki 6c93ca0e42 Prepare 0.73.0 2014-03-13 14:52:47 -07:00
probablycorey a3cb98a3d3 Shorten the spec-directory description 2014-03-13 14:38:05 -07:00
Kevin Sawicki 31ecd39f08 Don't echo app location 2014-03-13 12:41:08 -07:00
probablycorey 4d986b8417 Upgrade to image-view@0.30.0 2014-03-13 11:48:04 -07:00
Kevin Sawicki 2d14c06089 Merge pull request #1756 from atom/ks-mousemove-out-of-control
Stop out of control mouse move listener
2014-03-13 11:36:10 -07:00
Corey Johnson 7746ad0b13 Merge pull request #1753 from atom/cj-fixup-shell-script
Don't assume Atom is in /Applications when using the CLI
2014-03-13 11:26:16 -07:00
probablycorey 1cbaf8d1f5 Added comments because shell scripts can be confusing 2014-03-13 11:14:26 -07:00
Kevin Sawicki cb41e2c41a Remove unneeded do -> block 2014-03-13 11:00:24 -07:00
probablycorey 2fd71f2fa8 Use mdfind to locate Atom.app if it isn't in /Applications 2014-03-13 10:57:55 -07:00
Kevin Sawicki 37d67e8a83 Add spec for dragging with editor hidden 2014-03-13 10:56:31 -07:00
Kevin Sawicki 2f8e67d679 Add event.which to 1 in more specs 2014-03-13 10:49:34 -07:00
Kevin Sawicki 22dc165a25 Set event.which to 1 in specs 2014-03-13 10:47:03 -07:00
Kevin Sawicki ebfe50aafc Keep mouse move handler from going out of control
Previously the editor could be hidden and the mouse move handler
would start logging errors since it will still trying to compute
positions based on the move events still firing on the document.

Now the display property is checked in the handler and also the selection
is finalized when a move event occurs and the button is no longer pressed.

Closes #1755
2014-03-13 10:33:18 -07:00
Kevin Sawicki de58936ed1 Upgrade to settings-view@0.93.0 2014-03-13 10:03:45 -07:00
Kevin Sawicki eba2abd5d9 📝 Doc save, saveAs, and getPath as public 2014-03-13 09:21:06 -07:00
Kevin Sawicki 864ab0c095 Use file path in save as dialog
Previously the dirname of the file path was used which caused the
save dialog to not be filled in with the current file name

Closes #1748
2014-03-12 18:41:50 -07:00
Kevin Sawicki de3d424f51 Map cmd-shift-backspace to editor:backspace-to-beginning-of-line
Closes #1752
2014-03-12 18:16:52 -07:00
Kevin Sawicki 68c2c18d83 Don't allow the tab length to go below 1
Closes #1751
2014-03-12 18:00:11 -07:00
probablycorey 54907455fe Add ~/Desktop 2014-03-12 17:44:00 -07:00
probablycorey ba8ab21a0d Search for the Atom app in the usual locations when using the atom cli
Sorta closes #1595
2014-03-12 17:10:36 -07:00
Corey Johnson f272d9abde Upgrade to solarized-dark-syntax@0.14.0 2014-03-12 14:00:39 -07:00
Corey Johnson 972f194388 Upgrade to tree-view@0.80.0 2014-03-12 13:44:15 -07:00
Kevin Sawicki adb2f31e7f Kill associated processes on will-quit
Previously processes were only killed when the window was destroyed.

This affected `atom --wait` when using cmd-q to quit the app.

Closes #1679
2014-03-12 12:51:47 -07:00
Corey Johnson ccfd239ad1 Upgrade to autosave@0.13.0 2014-03-12 11:28:36 -07:00
Kevin Sawicki 6fc56b9372 Upgrade to language-coffee-script@0.16.0 2014-03-12 11:27:21 -07:00
Kevin Sawicki 9072a6da7a Upgrade to language-javascript@0.20.0 2014-03-12 11:24:11 -07:00
Kevin Sawicki d39547097c Upgrade to symbols-view@0.44.0 2014-03-12 11:22:48 -07:00
Kevin Sawicki 3b2f58fa22 Upgrade to symbols-view@0.43.0 2014-03-12 10:34:27 -07:00
Kevin Sawicki cbddc4eb6f Revert "Upgrade to language-php@0.12.0"
This reverts commit 96a0c1039a.
2014-03-12 10:34:13 -07:00
Kevin Sawicki 96a0c1039a Upgrade to language-php@0.12.0 2014-03-12 10:33:46 -07:00
Kevin Sawicki 1390bef626 Upgrade apm to v0.30.0 2014-03-12 10:30:58 -07:00
Kevin Sawicki e70a2ab3de Upgrade to language-ruby@0.16.0 2014-03-12 10:11:20 -07:00
Kevin Sawicki e0d1bdc072 Upgrade to language-todo@0.7.0 2014-03-12 10:07:18 -07:00
Kevin Sawicki 79c60d3884 Upgrade to language-php@0.11.0 2014-03-12 09:59:29 -07:00
Kevin Sawicki 1e85bc66b4 Upgrade to language-javascript@0.19.0 2014-03-12 09:58:53 -07:00
Kevin Sawicki 0d633a1e27 Upgrade to fs-plus 2.0.4 2014-03-12 09:55:21 -07:00
Kevin Sawicki 0759f6a1fd Upgrade to whitespace@0.20.0 2014-03-12 09:35:21 -07:00
Nathan Sobo 99b5675c4e Ensure position is a Point in Selection::selectToPosition
Fixes #1750
2014-03-11 20:42:42 -06:00
Nathan Sobo 4f7957183c Upgrade to text-buffer@1.4.4 to fix problems serializing MarkerPatches 2014-03-11 20:35:01 -06:00
Kevin Sawicki 2de18d3c4d 📝 Add examples for atom.workspaceView 2014-03-11 18:23:59 -07:00
Kevin Sawicki fecf13e2df Upgrade to text-buffer 1.4.3 2014-03-11 18:11:01 -07:00
Kevin Sawicki 31e44d50e4 Upgrade to symbols-view@0.42.0 2014-03-11 17:34:29 -07:00
Kevin Sawicki c28aeeac4a Upgrade to snippets@0.37.0 2014-03-11 17:33:31 -07:00
Kevin Sawicki 5649de6cd1 Upgrade to markdown-preview@0.49.0 2014-03-11 17:25:59 -07:00
Kevin Sawicki 26a649abda Upgrade to dev-live-reload@0.29.0 2014-03-11 17:24:07 -07:00
Kevin Sawicki 3b02ae1ce9 Upgrade to archive-view@0.29.0 2014-03-11 17:21:39 -07:00
Kevin Sawicki 13278c3d40 Upgrade to whitespace@0.19.0 2014-03-11 17:16:58 -07:00
Kevin Sawicki 17760a458a Upgrade to pathwatcher@0.19.0 2014-03-11 16:53:36 -07:00
Kevin Sawicki 282814fe59 Upgrade to archive-view@0.28.0 2014-03-11 16:36:56 -07:00
Kevin Sawicki 35fb02fce9 Upgrade to pathwatcher@0.18.0 2014-03-11 16:28:22 -07:00
Kevin Sawicki 7286c339c8 Upgrade to first-mate 1.4.2 2014-03-11 16:22:54 -07:00
Kevin Sawicki b956fa4d1f Upgrade to fuzzy-finder@0.41.0 2014-03-11 16:15:30 -07:00
Kevin Sawicki 8cb66895f0 Check that activations events are present
Having an empty array, object, or string will now be treated
as no activation events.

This was reported as being confusing since people were just clearing
the array generated by the package generator but their packages weren't
activating.
2014-03-11 16:15:30 -07:00
probablycorey 3a9584b840 Upgrade to tree-view@0.79.0 2014-03-11 15:48:21 -07:00
Kevin Sawicki 5d20a518ae Upgrade to first-mate 1.4.1 2014-03-11 14:30:35 -07:00
Kevin Sawicki bd3dc453ef Wrap command line arguments in quotes
Closes #1639
2014-03-11 13:35:19 -07:00
Kevin Sawicki 151d22c325 Destroy items on pane:close
Previously pane:close would do nothing because of the guards in
Pane::destroy.

Also renames the menu to Close Pane to be more accurate.

Closes #1686
2014-03-11 13:22:03 -07:00
Kevin Sawicki d6433a67c8 Incluse JavaScript specs when loading suite
Closes #1615
2014-03-11 13:01:28 -07:00
Kevin Sawicki be561f0e5e 📝 Update styleguide keybinding
Closes #1628
2014-03-11 12:29:23 -07:00
Kevin Sawicki 1f6d90319b Upgrade to settings-view@0.92.0 2014-03-11 12:20:12 -07:00
Kevin Sawicki eca63364a6 Upgrade to find-and-replace@0.91.0 2014-03-11 12:20:12 -07:00
Nathan Sobo 38f25160d6 Upgrade to q@1.0.1, which doesn't need loophole to avoid CSP errors 2014-03-11 13:18:56 -06:00
Kevin Sawicki 28ce023164 Upgrade to setting-view@0.91.0 2014-03-11 11:39:14 -07:00
Kevin Sawicki 10b3d56682 Upgrade to oniguruma 1.0.3 2014-03-11 11:30:27 -07:00
probablycorey 945011f9e3 Add data to the same jquery object that is appended to the list.
Closes #1747
2014-03-11 11:20:03 -07:00
Nathan Sobo d7c6cd68b9 Merge pull request #1741 from atom/cz-first-responder-menu
Send command to first responder when no window is focused
2014-03-11 11:10:36 -06:00
Cheng Zhao ed4c3fde2d Merge pull request #1742 from atom/atom-shell-v0.10.7
Upgrade to atom-shell@0.10.7
2014-03-11 14:21:43 +00:00
Cheng Zhao c5db1c33a0 Upgrade to atom-shell@0.10.7 2014-03-11 22:12:59 +08:00
Cheng Zhao d719ea74dd Send command to first responder when no window is focused. 2014-03-11 15:31:54 +08:00
Kevin Sawicki 996defaadb Merge pull request #1740 from atom/ks-cson-safe-grunt
Safe CSON during build
2014-03-10 18:56:36 -07:00
Kevin Sawicki 86cd7f7a01 Handle non-integer indentation level values
This was already occurring when using hard tabs but soft tabs still
had issues.

Refs atom/language-c#7
2014-03-10 18:45:18 -07:00
Kevin Sawicki a79090c65a Unfocus spec 2014-03-10 18:43:38 -07:00
Kevin Sawicki 86c720af81 Normalize all tabs, not just the first one
Refs atom/language-javascript#10
2014-03-10 17:57:10 -07:00
Ben Ogle a9becd5cc8 Upgrade to solarized-dark-syntax@0.13.0 2014-03-10 17:52:38 -07:00
Kevin Sawicki 1e327699b8 Upgrade to grunt-cson@0.8.0 2014-03-10 17:24:32 -07:00
Nathan Sobo 0ba9425bb6 Upgrade to archive-view 0.27.0 to suppress CSP errors requiring 'q'
archive-view indirectly depends on a different version of 'q' and so it
isn't requiring the deduped version that already has its warnings
suppressed in atom.coffee.
2014-03-10 17:06:12 -06:00
probablycorey 7d19b839d9 Upgrade to metrics@0.32.0 2014-03-10 13:16:01 -07:00
probablycorey e1a9f0a533 Upgrade to metrics@0.31.0, again 2014-03-10 12:14:29 -07:00
Kevin Sawicki f6d0051446 Prepare 0.72.0 release 2014-03-10 11:46:37 -07:00
Kevin Sawicki 126df1fa03 Upgrade to tree-view@0.78.0 2014-03-10 11:18:56 -07:00
Kevin Sawicki 0a72d9539f Upgrade to atom-dark-ui@0.25.0 2014-03-10 11:13:08 -07:00
Kevin Sawicki 60ecbe054e Upgrade to wrap-guide@0.18.0 2014-03-10 11:02:43 -07:00
Kevin Sawicki 5a3fa18863 Upgrade to atom-light-syntax@0.16.0 2014-03-10 10:53:55 -07:00
probablycorey bea4f2abde Revert "Upgrade to metrics@0.31.0"
This reverts commit c80d3eea47.

Conflicts:
	package.json
2014-03-10 10:44:11 -07:00
Ivan Žužak 3fc2ca3d77 Merge pull request #1738 from atom/izuzak/upgrade-underscore-plus
Upgrade to underscore-plus@1.0.5
2014-03-10 18:34:34 +01:00
Kevin Sawicki 29fcc4727a Upgrade to language-javascript@0.18.0 2014-03-10 10:34:33 -07:00
Kevin Sawicki ddb973b03a Upgrade to markdown-preview@0.48.0 2014-03-10 10:23:39 -07:00
Kevin Sawicki c2b05f9956 Upgrade to tabs@0.30.0 2014-03-10 10:10:25 -07:00
Ivan Žužak 7fd452102f Upgrade to underscore-plus@1.0.5
See: https://github.com/atom/underscore-plus/commit/31c7cb6d50922a5237523f1282f0607679eff563
2014-03-10 18:09:03 +01:00
probablycorey c80d3eea47 Upgrade to metrics@0.31.0 2014-03-10 09:42:14 -07:00
Nathan Sobo 8421edbb72 Upgrade find-and-replace to 0.90.0 to avoid security policy exceptions 2014-03-10 10:40:59 -06:00
Kevin Sawicki 03587f54be Upgrade to tree-view@0.77.0 2014-03-10 09:39:38 -07:00
Kevin Sawicki dac7760018 Upgrade to atom-light-ui@0.23.0 2014-03-10 09:21:32 -07:00
Kevin Sawicki bd28d5d7b1 Upgrade to atom-dark-ui@0.24.0 2014-03-10 09:18:49 -07:00
Kevin Sawicki 34df19b204 Prepare 0.71.0 release 2014-03-10 09:06:17 -07:00
Kevin Sawicki 6e824dadf2 Upgrade to tabs@0.29.0 2014-03-10 08:52:35 -07:00
Cheng Zhao c50cfc1714 Upgrade to pathwatcher@0.17.0 2014-03-10 12:13:50 +08:00
Nathan Sobo d0fcd573bd Merge pull request #1702 from atom/enable-csp
initial attempt at CSP policy to see what breaks
2014-03-08 02:20:22 +02:00
Nathan Sobo 79089ced97 💄 whitespace 2014-03-07 17:19:53 -07:00
Nathan Sobo aa6811a088 Upgrade to loophole@0.3.0 for bugfix 2014-03-07 17:13:11 -07:00
Nathan Sobo dd27a35039 Silence CSP warnings from q's feature detection 2014-03-07 17:01:51 -07:00
Kevin Sawicki f3b696c5ec Upgrade to status-bar@0.36.0 2014-03-07 15:57:21 -08:00
Nathan Sobo 8405041f64 Merge branch 'master' into enable-csp
Conflicts:
	package.json
2014-03-07 16:46:00 -07:00
probablycorey a372993c44 Only listen of update events once when checking for update. 2014-03-07 15:39:44 -08:00
Nathan Sobo 909e0d7312 Remove defunct 'autoIndentOnPaste' option from customizing-atom docs 2014-03-07 13:39:36 -07:00
Kevin Sawicki e8503f7ddc Upgrade to tree-view@0.76.0 2014-03-07 12:02:08 -08:00
Kevin Sawicki 42a6caf7dc Upgrade to tree-view@0.75.0 2014-03-07 11:34:47 -08:00
Nathan Sobo eaffb12ffb Upgrade to text-buffer@1.4.2 to honor persistent: true marker param 2014-03-07 12:20:15 -07:00
Kevin Sawicki 105e0d3c82 Upgrade to tabs@0.28.0 2014-03-07 11:10:22 -08:00
Kevin Sawicki 534a36c7e1 Upgrade to settings-view@0.90.0 2014-03-07 11:08:07 -08:00
Cheng Zhao b5b8f757b2 Merge pull request #1728 from atom/atom-shell-v0.10.6
Upgrade to atom-shell@0.10.6
2014-03-07 14:11:24 +00:00
Cheng Zhao 10e3dfbfdb Upgrade to atom-shell@0.10.6 2014-03-07 22:05:09 +08:00
Nathan Sobo bfdcbbe9f1 Upgrade to snippets@0.36.0 for CSP support in dev-mode 2014-03-06 19:19:04 -07:00
Nathan Sobo 5d49839236 Don't require loophole unless we need it. Won't happen in production. 2014-03-06 19:13:27 -07:00
Nathan Sobo e6508237e7 Merge pull request #1710 from atom/ns-duplicate-multiple-lines
Handle multiple lines and multiple selections with the editor::duplicate-lines command
2014-03-07 04:01:59 +02:00
Nathan Sobo 2d4797c84e Define allowUnsafeEval in an npm module 2014-03-06 18:56:09 -07:00
Nathan Sobo 392516e60f Delegate activateNextPane correctly 2014-03-06 18:32:24 -07:00
Nathan Sobo d09a2d0772 Merge branch 'master' into ns-duplicate-multiple-lines
Conflicts:
	package.json
2014-03-06 18:16:48 -07:00
Nathan Sobo 2bd5c10f09 Merge branch 'master' into enable-csp 2014-03-06 18:14:25 -07:00
Nathan Sobo 5c910113a3 Depend on text-buffer 1.4.1 since there was a regression in 1.4.0 2014-03-06 18:10:32 -07:00
Kevin Sawicki c591a2e098 Upgrade to language-javascript@0.17.0 2014-03-06 16:26:12 -08:00
Kevin Sawicki b5acc9b093 Upgrade to language-css@0.13.0 2014-03-06 16:17:42 -08:00
Kevin Sawicki 5b6f8ff0f6 Upgrade to wrap-guide@0.17.0 2014-03-06 15:59:03 -08:00
Kevin Sawicki d530d0a4d5 Upgrade to language-html@0.11.0 2014-03-06 15:36:05 -08:00
Kevin Sawicki 211ce4b2d3 Prepare 0.70.0 release 2014-03-06 15:21:34 -08:00
Nathan Sobo b9b3d021cc Add private method docs to DisplayBuffer::outermostFoldsInBufferRange 2014-03-06 15:31:14 -07:00
Nathan Sobo 6e202e18d8 💄 more comment formatting 2014-03-06 15:29:25 -07:00
Nathan Sobo da85a07dae 💄 comment formatting 2014-03-06 15:17:34 -07:00
Nathan Sobo eda744f07f Pluralize "Duplicate Lines" menu item 2014-03-06 14:55:15 -07:00
Nathan Sobo 4acfe11af1 Remove previous duplicate-line specs from editor-view-spec 2014-03-06 14:49:20 -07:00
Nathan Sobo 85824c5df6 Handle last buffer line in Editor::duplicateLines 2014-03-06 14:48:52 -07:00
Nathan Sobo 20a0c27111 Rename duplicate-line to duplicate-lines (but retain deprecated method)
Might as well make the name accurate while it's early.
2014-03-06 14:36:25 -07:00
Nathan Sobo 76200884d5 Preserve folds when duplicating lines 2014-03-06 13:16:16 -07:00
Nathan Sobo ce4ce55b29 Make outermostFoldsForBufferRowRange exclusive of end row 2014-03-06 12:52:27 -07:00
Nathan Sobo 66f6e38788 Fix ::translateToBufferMarkerAttributes reference 2014-03-06 12:42:16 -07:00
Nathan Sobo d97a0a3324 Add DisplayBuffer::outermostFoldsInBufferRowRange 2014-03-06 12:36:42 -07:00
Nathan Sobo 63f5a0a324 💄 Rename attributes to params to match TextBuffer naming 2014-03-06 12:32:17 -07:00
Nathan Sobo f0837bb98b 📝 Improve DisplayBuffer::findMarkers docs 2014-03-06 12:31:55 -07:00
Nathan Sobo aff37d1ae4 WIP: Add failing spec for duplicating folds when duplicating lines 2014-03-06 00:29:35 -07:00
Nathan Sobo a0234d0cc6 Handle empty selections on folded lines 2014-03-06 00:07:59 -07:00
Nathan Sobo 8a77acb51e Duplicate multiple selections and multiple lines; folds are broken 2014-03-05 23:29:28 -07:00
Nathan Sobo 5e8213d45f Add atom.allowUnsafeEval loophole and disable unsafe-eval again
With Node.js baked in, there's no water-tight way to prevent users from
evaluating code at runtime, at least with CSP alone. This is because
node exposes a 'vm' module that allows scripts to be compiled. There's
also `module._compile`, etc.

I think a reasonable compromise is to protect users from eval'ing code
by accident. This commit adds an atom.allowUnsafeEval method which
re-enables eval in the dynamic scope of the given function.

I then use this to compile the keystroke grammar which saves us the
complexity of pre-compiling it during specs.

What do people think?
2014-03-05 09:57:08 -07:00
Patrick Toomey fc543fc5a6 add unsafe-eval for now 2014-03-05 09:32:49 -06:00
Patrick Toomey 2e3aec81e7 initial attempt at CSP policy to see what breaks 2014-03-05 09:03:27 -06:00
61 arquivos alterados com 958 adições e 1045 exclusões
+1 -1
Ver Arquivo
@@ -10,7 +10,7 @@ to propose changes to this document in a pull request.
that behavior such as Emacs, vi, Xcode, etc.
* Check the Console app for stack traces to include if reporting a crash.
* Check the Dev tools (`alt-cmd-i`) for errors and stack traces to include.
### Package Repositories
This is the repository for the core Atom editor only. Atom comes bundled with
+56 -15
Ver Arquivo
@@ -1,11 +1,13 @@
#!/bin/sh
ATOM_PATH=${ATOM_PATH-/Applications/Atom.app}
ATOM_BINARY=$ATOM_PATH/Contents/MacOS/Atom
#!/bin/bash
if [ ! -d $ATOM_PATH ]; then sleep 5; fi # Wait for Atom to reappear, Sparkle may be replacing it.
if [ ! -d $ATOM_PATH ]; then
echo "Atom application not found at '$ATOM_PATH'" >&2
if [ "`uname`" == 'Darwin' ]; then
OS='Mac'
elif [ "`expr substr $(uname -s) 1 5`" == 'Linux' ]; then
OS='Linux'
elif [ "`expr substr $(uname -s) 1 10`" == 'MINGW32_NT' ]; then
OS='Cygwin'
else
echo "Your platform (`uname -a`) is not supported."
exit 1
fi
@@ -16,7 +18,11 @@ while getopts ":wtfvhs-:" opt; do
wait)
WAIT=1
;;
help|version|foreground|test)
help|version)
REDIRECT_STDERR=1
EXPECT_OUTPUT=1
;;
foreground|test)
EXPECT_OUTPUT=1
;;
esac
@@ -24,25 +30,60 @@ while getopts ":wtfvhs-:" opt; do
w)
WAIT=1
;;
h|v|f|t)
h|v)
REDIRECT_STDERR=1
EXPECT_OUTPUT=1
;;
f|t)
EXPECT_OUTPUT=1
;;
esac
done
if [ $EXPECT_OUTPUT ]; then
$ATOM_BINARY --executed-from="$(pwd)" --pid=$$ $@
exit $?
else
open -a $ATOM_PATH -n --args --executed-from="$(pwd)" --pid=$$ $@
if [ $REDIRECT_STDERR ]; then
exec 2> /dev/null
fi
# Used to exit process when atom is used as $EDITOR
if [ $OS == 'Mac' ]; then
ATOM_PATH=${ATOM_PATH:-/Applications} # Set ATOM_PATH unless it is already set
ATOM_APP_NAME=Atom.app
# If ATOM_PATH isn't a executable file, use spotlight to search for Atom
if [ ! -x "$ATOM_PATH/$ATOM_APP_NAME" ]; then
ATOM_PATH=$(mdfind "kMDItemCFBundleIdentifier == 'com.github.atom'" | head -1 | xargs dirname)
fi
# Exit if Atom can't be found
if [ -z "$ATOM_PATH" ]; then
echo "Cannot locate Atom.app, it is usually located in /Applications. Set the ATOM_PATH environment variable to the directory containing Atom.app."
exit 1
fi
if [ $EXPECT_OUTPUT ]; then
"$ATOM_PATH/$ATOM_APP_NAME/Contents/MacOS/Atom" --executed-from="$(pwd)" --pid=$$ "$@"
exit $?
else
open -a "$ATOM_PATH/$ATOM_APP_NAME" -n --args --executed-from="$(pwd)" --pid=$$ "$@"
fi
elif [ $OS == 'Linux' ]; then
ATOM_PATH='/opt/Atom/atom'
[ -x "$ATOM_PATH" ] || ATOM_PATH='/tmp/atom-build/Atom/atom'
if [ $EXPECT_OUTPUT ]; then
"$ATOM_PATH" --executed-from="$(pwd)" --pid=$$ "$@"
exit $?
else
nohup "$ATOM_PATH" --executed-from="$(pwd)" --pid=$$ "$@" > /dev/null &
fi
fi
# Exits this process when Atom is used as $EDITOR
on_die() {
exit 0
}
trap 'on_die' SIGQUIT SIGTERM
# If the wait flag is set, don't exit this process until Atom tells it to.
if [ $WAIT ]; then
while true; do
sleep 1
+15 -2
Ver Arquivo
@@ -46,7 +46,7 @@ module.exports = (grunt) ->
contentsDir = shellAppDir
appDir = path.join(shellAppDir, 'resources', 'app')
atomShellDownloadDir = path.join(os.tmpdir(), 'atom-cached-atom-shells')
else
else if process.platform is 'darwin'
appName = 'Atom.app'
tmpDir = '/tmp'
installRoot = '/Applications'
@@ -56,6 +56,16 @@ module.exports = (grunt) ->
contentsDir = path.join(shellAppDir, 'Contents')
appDir = path.join(contentsDir, 'Resources', 'app')
atomShellDownloadDir = '/tmp/atom-cached-atom-shells'
else
appName = 'Atom'
tmpDir = '/tmp'
installRoot = '/opt'
buildDir = grunt.option('build-dir') ? path.join(tmpDir, 'atom-build')
symbolsDir = path.join(buildDir, 'Atom.breakpad.syms')
shellAppDir = path.join(buildDir, appName)
contentsDir = shellAppDir
appDir = path.join(shellAppDir, 'resources', 'app')
atomShellDownloadDir = '/tmp/atom-cached-atom-shells'
installDir = path.join(installRoot, appName)
@@ -227,4 +237,7 @@ module.exports = (grunt) ->
grunt.registerTask('test', ['shell:kill-atom', 'run-specs'])
grunt.registerTask('ci', ['output-disk-space', 'download-atom-shell', 'build', 'dump-symbols', 'set-version', 'check-licenses', 'lint', 'test', 'codesign', 'publish-build'])
grunt.registerTask('docs', ['markdown:guides', 'build-docs'])
grunt.registerTask('default', ['download-atom-shell', 'build', 'set-version', 'install'])
defaultTasks = ['download-atom-shell', 'build', 'set-version']
defaultTasks.push 'install' unless process.platform is 'linux'
grunt.registerTask('default', defaultTasks)
+5 -4
Ver Arquivo
@@ -17,8 +17,8 @@
"grunt-contrib-csslint": "~0.1.2",
"grunt-contrib-coffee": "~0.9.0",
"grunt-contrib-less": "~0.8.0",
"grunt-cson": "0.6.0",
"grunt-download-atom-shell": "git+https://atom-bot:467bac80a0017b96fb5be5cfc686f5e0cc607b10@github.com/atom/grunt-download-atom-shell#v0.6.0",
"grunt-cson": "0.8.0",
"grunt-download-atom-shell": "git+https://atom-bot:467bac80a0017b96fb5be5cfc686f5e0cc607b10@github.com/atom/grunt-download-atom-shell#v0.6.1",
"grunt-lesslint": "0.13.0",
"grunt-markdown": "~0.4.0",
"grunt-peg": "~1.1.0",
@@ -26,13 +26,14 @@
"harmony-collections": "~0.3.8",
"json-front-matter": "~0.1.3",
"legal-eagle": "~0.3.0",
"minidump": "0.4.x",
"minidump": "0.5.x",
"rcedit": "~0.1.2",
"request": "~2.27.0",
"rimraf": "~2.2.2",
"runas": "0.5.x",
"underscore-plus": "1.x",
"unzip": "~0.1.9",
"vm-compatibility-layer": "~0.1.0"
"vm-compatibility-layer": "~0.1.0",
"npm": "~1.4.5"
}
}
+1 -1
Ver Arquivo
@@ -14,7 +14,7 @@ module.exports = (grunt) ->
if process.platform is 'darwin'
cp 'atom-shell/Atom.app', shellAppDir
else if process.platform is 'win32'
else
cp 'atom-shell', shellAppDir
mkdir appDir
+2
Ver Arquivo
@@ -143,6 +143,8 @@ downloadFileFromRepo = ({repo, file}, callback) ->
downloadIncludes = (callback) ->
includes = [
{repo: 'atom-keymap', file: 'src/keymap.coffee'}
{repo: 'atom-keymap', file: 'src/key-binding.coffee'}
{repo: 'first-mate', file: 'src/grammar.coffee'}
{repo: 'first-mate', file: 'src/grammar-registry.coffee'}
{repo: 'node-pathwatcher', file: 'src/directory.coffee'}
+2
Ver Arquivo
@@ -48,3 +48,5 @@ module.exports = (grunt) ->
rcedit = require('rcedit')
rcedit(shellExePath, {'version-string': strings}, done)
else
done()
+1 -1
Ver Arquivo
@@ -130,7 +130,7 @@ Ideally, you won't need much in the way of styling. We've provided a standard
set of components which define both the colors and UI elements for any package
that fits into Atom seamlessly. You can view all of Atom's UI components by opening
the styleguide: open the command palette (`cmd-shift-P`) and search for _styleguide_,
or just type `cmd-ctrl-G`.
or just type `cmd-ctrl-shift-G`.
If you _do_ need special styling, try to keep only structural styles in the package
stylesheets. If you _must_ specify colors and sizing, these should be taken from
-1
Ver Arquivo
@@ -110,7 +110,6 @@ You can open this file in an editor from the _Atom > Open Your Config_ menu.
- `themes`: An array of theme names to load, in cascading order
- `editor`
- `autoIndent`: Enable/disable basic auto-indent (defaults to `true`)
- `autoIndentOnPaste`: Enable/disable auto-indented pasted text (defaults to `false`)
- `nonWordCharacters`: A string of non-word characters to define word boundaries
- `fontSize`: The editor font size
- `fontFamily`: The editor font family
+1 -1
Ver Arquivo
@@ -12,7 +12,7 @@
# '.editor':
# 'enter': 'editor:newline'
#
# 'body':
# '.workspace':
# 'ctrl-P': 'core:move-up'
# 'ctrl-p': 'core:move-down'
#
+2 -1
Ver Arquivo
@@ -96,6 +96,7 @@
'.editor':
# Apple Specific
'cmd-backspace': 'editor:backspace-to-beginning-of-line'
'cmd-shift-backspace': 'editor:backspace-to-beginning-of-line'
'cmd-delete': 'editor:backspace-to-beginning-of-line'
'ctrl-A': 'editor:select-to-first-character-of-line'
'ctrl-E': 'editor:select-to-end-of-line'
@@ -134,7 +135,7 @@
'ctrl-cmd-down': 'editor:move-line-down'
'cmd-/': 'editor:toggle-line-comments'
'cmd-j': 'editor:join-lines'
'cmd-D': 'editor:duplicate-line'
'cmd-D': 'editor:duplicate-lines'
'cmd-L': 'editor:split-selections-into-lines'
'cmd-alt-[': 'editor:fold-current-row'
+107
Ver Arquivo
@@ -0,0 +1,107 @@
'body':
# Atom Specific
'enter': 'core:confirm'
'escape': 'core:cancel'
'up': 'core:move-up'
'down': 'core:move-down'
'left': 'core:move-left'
'right': 'core:move-right'
'ctrl-alt-r': 'window:reload'
'ctrl-alt-i': 'window:toggle-dev-tools'
'ctrl-alt-p': 'window:run-package-specs'
'ctrl-alt-s': 'application:run-all-specs'
# Sublime Parity
'ctrl-N': 'application:new-window'
'ctrl-W': 'window:close'
'ctrl-o': 'application:open'
'ctrl-T': 'pane:reopen-closed-item'
'ctrl-n': 'application:new-file'
'ctrl-s': 'core:save'
'ctrl-S': 'core:save-as'
'ctrl-w': 'core:close'
'ctrl-z': 'core:undo'
'ctrl-y': 'core:redo'
'ctrl-x': 'core:cut'
'ctrl-c': 'core:copy'
'ctrl-v': 'core:paste'
'shift-up': 'core:select-up'
'shift-down': 'core:select-down'
'shift-left': 'core:select-left'
'shift-right': 'core:select-right'
'delete': 'core:delete'
'pageup': 'core:page-up'
'pagedown': 'core:page-down'
'backspace': 'core:backspace'
'ctrl-tab': 'pane:show-next-item'
'ctrl-shift-tab': 'pane:show-previous-item'
'ctrl-shift-up': 'core:move-up'
'ctrl-shift-down': 'core:move-down'
'ctrl-=': 'window:increase-font-size'
'ctrl-+': 'window:increase-font-size'
'ctrl--': 'window:decrease-font-size'
'ctrl-_': 'window:decrease-font-size'
'ctrl-0': 'window:reset-font-size'
'ctrl-k up': 'pane:split-up' # Atom Specific
'ctrl-k down': 'pane:split-down' # Atom Specific
'ctrl-k left': 'pane:split-left' # Atom Specific
'ctrl-k right': 'pane:split-right' # Atom Specific
'ctrl-k ctrl-w': 'pane:close' # Atom Specific
'ctrl-k alt-ctrl-w': 'pane:close-other-items' # Atom Specific
'ctrl-k ctrl-p': 'window:focus-previous-pane'
'ctrl-k ctrl-n': 'window:focus-next-pane'
'ctrl-k ctrl-up': 'window:focus-pane-above'
'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'
'.workspace .editor':
# Windows specific
'ctrl-delete': 'editor:backspace-to-beginning-of-word'
# Sublime Parity
'ctrl-a': 'core:select-all'
'ctrl-alt-p': 'editor:log-cursor-scope'
'ctrl-k ctrl-u': 'editor:upper-case'
'ctrl-k ctrl-l': 'editor:lower-case'
'.workspace .editor:not(.mini)':
# Atom specific
'alt-ctrl-z': 'editor:checkout-head-revision'
'ctrl-<': 'editor:scroll-to-cursor'
'alt-ctrl-f': 'editor:fold-selection'
# Sublime Parity
'ctrl-enter': 'editor:newline-below'
'ctrl-shift-enter': 'editor:newline-above'
'ctrl-]': 'editor:indent-selected-rows'
'ctrl-[': 'editor:outdent-selected-rows'
'ctrl-up': 'editor:move-line-up'
'ctrl-down': 'editor:move-line-down'
'ctrl-/': 'editor:toggle-line-comments'
'ctrl-j': 'editor:join-lines'
'ctrl-D': 'editor:duplicate-lines'
'ctrl-alt-[': 'editor:fold-current-row'
'ctrl-alt-]': 'editor:unfold-current-row'
'ctrl-alt-{': 'editor:fold-all' # Atom Specific
'ctrl-alt-}': 'editor:unfold-all' # Atom Specific
'ctrl-k ctrl-0': 'editor:unfold-all'
'ctrl-k ctrl-1': 'editor:fold-at-indent-level-1'
'ctrl-k ctrl-2': 'editor:fold-at-indent-level-2'
'ctrl-k ctrl-3': 'editor:fold-at-indent-level-3'
'ctrl-k ctrl-4': 'editor:fold-at-indent-level-4'
'ctrl-k ctrl-5': 'editor:fold-at-indent-level-5'
'ctrl-k ctrl-6': 'editor:fold-at-indent-level-6'
'ctrl-k ctrl-7': 'editor:fold-at-indent-level-7'
'ctrl-k ctrl-8': 'editor:fold-at-indent-level-8'
'ctrl-k ctrl-9': 'editor:fold-at-indent-level-9'
# allow standard input fields to work correctly
'body .native-key-bindings':
'ctrl-z': 'native!'
'ctrl-Z': 'native!'
'ctrl-x': 'native!'
'ctrl-c': 'native!'
'ctrl-v': 'native!'
+1 -1
Ver Arquivo
@@ -81,7 +81,7 @@
'ctrl-down': 'editor:move-line-down'
'ctrl-/': 'editor:toggle-line-comments'
'ctrl-j': 'editor:join-lines'
'ctrl-D': 'editor:duplicate-line'
'ctrl-D': 'editor:duplicate-lines'
'ctrl-alt-[': 'editor:fold-current-row'
'ctrl-alt-]': 'editor:unfold-current-row'
+2 -2
Ver Arquivo
@@ -38,7 +38,7 @@
{ label: 'Save All', command: 'window:save-all' }
{ type: 'separator' }
{ label: 'Close Buffer', command: 'core:close' }
{ label: 'Close All Buffers', command: 'pane:close' }
{ label: 'Close Pane', command: 'pane:close' }
{ label: 'Close Window', command: 'window:close' }
]
}
@@ -65,7 +65,7 @@
{ type: 'separator' }
{ label: 'Move Line Up', command: 'editor:move-line-up' }
{ label: 'Move Line Down', command: 'editor:move-line-down' }
{ label: 'Duplicate Line', command: 'editor:duplicate-line' }
{ label: 'Duplicate Lines', command: 'editor:duplicate-lines' }
{ label: 'Delete Line', command: 'editor:delete-line' }
{ label: 'Join Lines', command: 'editor:join-lines' }
]
+156
Ver Arquivo
@@ -0,0 +1,156 @@
'menu': [
{
label: '&File'
submenu: [
{ label: 'New &Window', command: 'application:new-window' }
{ label: '&New File', command: 'application:new-file' }
{ label: '&Open...', command: 'application:open' }
{ label: 'Reopen Last &Item', command: 'pane:reopen-closed-item' }
{ type: 'separator' }
{ label: '&Preferences...', command: 'application:show-settings' }
{ type: 'separator' }
{ label: '&Save', command: 'core:save' }
{ label: 'Save &As...', command: 'core:save-as' }
{ label: 'Save A&ll', command: 'window:save-all' }
{ type: 'separator' }
{ label: '&Close Buffer', command: 'core:close' }
{ label: 'Close All &Buffers', command: 'pane:close' }
{ label: 'Clos&e Window', command: 'window:close' }
{ type: 'separator' }
{ label: 'E&xit', command: 'application:quit' }
]
}
{
label: '&Edit'
submenu: [
{ label: '&Undo', command: 'core:undo' }
{ label: '&Redo', command: 'core:redo' }
{ type: 'separator' }
{ label: '&Cut', command: 'core:cut' }
{ label: 'C&opy', command: 'core:copy' }
{ label: 'Copy Pat&h', command: 'editor:copy-path' }
{ label: '&Paste', command: 'core:paste' }
{ label: 'Select &All', command: 'core:select-all' }
{ type: 'separator' }
{ label: '&Toggle Comments', command: 'editor:toggle-line-comments' }
{
label: 'Lines',
submenu: [
{ label: '&Indent', command: 'editor:indent-selected-rows' }
{ label: '&Outdent', command: 'editor:outdent-selected-rows' }
{ label: '&Auto Indent', command: 'editor:auto-indent' }
{ type: 'separator' }
{ label: 'Move Line &Up', command: 'editor:move-line-up' }
{ label: 'Move Line &Down', command: 'editor:move-line-down' }
{ label: 'Du&plicate Lines', command: 'editor:duplicate-lines' }
{ label: 'D&elete Line', command: 'editor:delete-line' }
{ label: '&Join Lines', command: 'editor:join-lines' }
]
}
{
label: 'Text',
submenu: [
{ label: '&Upper Case', command: 'editor:upper-case' }
{ label: '&Lower Case', command: 'editor:lower-case' }
{ type: 'separator' }
{ label: 'Delete to End of &Word', command: 'editor:delete-to-end-of-word' }
{ label: '&Delete Line', command: 'editor:delete-line' }
{ type: 'separator' }
{ label: '&Transpose', command: 'editor:transpose' }
]
}
{
label: 'Folding',
submenu: [
{ label: '&Fold', command: 'editor:fold-current-row' }
{ label: '&Unfold', command: 'editor:unfold-current-row' }
{ label: 'Unfold &All', command: 'editor:unfold-all' }
{ type: 'separator' }
{ label: 'Fol&d All', command: 'editor:fold-all' }
{ label: 'Fold Level 1', command: 'editor:fold-at-indent-level-1' }
{ label: 'Fold Level 2', command: 'editor:fold-at-indent-level-2' }
{ label: 'Fold Level 3', command: 'editor:fold-at-indent-level-3' }
{ label: 'Fold Level 4', command: 'editor:fold-at-indent-level-4' }
{ label: 'Fold Level 5', command: 'editor:fold-at-indent-level-5' }
{ label: 'Fold Level 6', command: 'editor:fold-at-indent-level-6' }
{ label: 'Fold Level 7', command: 'editor:fold-at-indent-level-7' }
{ label: 'Fold Level 8', command: 'editor:fold-at-indent-level-8' }
{ label: 'Fold Level 9', command: 'editor:fold-at-indent-level-9' }
]
}
]
}
{
label: '&View'
submenu: [
{ label: '&Reload', command: 'window:reload' }
{ label: 'Toggle &Full Screen', command: 'window:toggle-full-screen' }
{
label: 'Developer'
submenu: [
{ label: 'Open In &Dev Mode...', command: 'application:open-dev' }
{ label: 'Run &Atom Specs', command: 'application:run-all-specs' }
{ label: 'Run Package &Specs', command: 'window:run-package-specs' }
{ label: 'Toggle Developer &Tools', command: 'window:toggle-dev-tools' }
]
}
{ type: 'separator' }
{ label: 'Toggle Soft &Wrap', command: 'editor:toggle-soft-wrap' }
]
}
{
label: '&Selection'
submenu: [
{ label: 'Add Selection &Above', command: 'editor:add-selection-above' }
{ label: 'Add Selection &Below', command: 'editor:add-selection-below' }
{ label: 'S&plit into Lines', command: 'editor:split-selections-into-lines'}
{ type: 'separator' }
{ label: 'Select to &Top', command: 'core:select-to-top' }
{ label: 'Select to Botto&m', command: 'core:select-to-bottom' }
{ type: 'separator' }
{ label: 'Select &Line', command: 'editor:select-line' }
{ label: 'Select &Word', command: 'editor:select-word' }
{ label: 'Select to Beginning of W&ord', command: 'editor:select-to-beginning-of-word' }
{ label: 'Select to Beginning of L&ine', command: 'editor:select-to-beginning-of-line' }
{ label: 'Select to First &Character of Line', command: 'editor:select-to-first-character-of-line' }
{ label: 'Select to End of Wor&d', command: 'editor:select-to-end-of-word' }
{ label: 'Select to End of Lin&e', command: 'editor:select-to-end-of-line' }
]
}
{
label: 'F&ind'
submenu: []
}
{
label: '&Packages'
submenu: []
}
{
label: '&Window'
submenu: [
{ label: 'Mi&nimize', command: 'application:minimize' }
{ label: 'Ma&ximize', command: 'application:zoom' }
{ type: 'separator' }
{ label: 'Bring &All to Front', command: 'application:bring-all-windows-to-front' }
]
}
{
label: '&Help'
submenu: [
{ label: '&About Atom...', command: 'application:about' }
{ label: 'View &License', command: 'application:open-license' }
{ label: "VERSION", enabled: false }
{ label: "Install &update", command: 'application:install-update', visible: false }
{ type: 'separator' }
{ label: '&Documentation', command: 'application:open-documentation' }
{ type: 'separator' }
]
}
]
+1 -1
Ver Arquivo
@@ -43,7 +43,7 @@
{ type: 'separator' }
{ label: 'Move Line &Up', command: 'editor:move-line-up' }
{ label: 'Move Line &Down', command: 'editor:move-line-down' }
{ label: 'Du&plicate Line', command: 'editor:duplicate-line' }
{ label: 'Du&plicate Lines', command: 'editor:duplicate-lines' }
{ label: 'D&elete Line', command: 'editor:delete-line' }
{ label: '&Join Lines', command: 'editor:join-lines' }
]
+45 -45
Ver Arquivo
@@ -1,7 +1,7 @@
{
"name": "atom",
"productName": "Atom",
"version": "0.69.0",
"version": "0.75.0",
"main": "./src/browser/main.js",
"repository": {
"type": "git",
@@ -11,33 +11,33 @@
"url": "https://github.com/atom/atom/issues"
},
"license": "All Rights Reserved",
"atomShellVersion": "0.10.5",
"atomShellVersion": "0.11.1",
"dependencies": {
"async": "0.2.6",
"atom-keymap": "^0.9.0",
"bootstrap": "git://github.com/atom/bootstrap.git#6af81906189f1747fd6c93479e3d998ebe041372",
"clear-cut": "0.4.0",
"coffee-script": "1.7.0",
"coffeestack": "0.7.0",
"delegato": "1.x",
"emissary": "1.x",
"first-mate": ">=1.4 <2.0",
"fs-plus": "2.x",
"first-mate": ">=1.4.2 <2.0",
"fs-plus": ">=2.0.4 < 3.0",
"fstream": "0.1.24",
"fuzzaldrin": "~1.1",
"git-utils": "1.x",
"git-utils": "^1.0.1",
"guid": "0.0.10",
"jasmine-tagged": ">=1.1.1 <2.0",
"mkdirp": "0.3.5",
"keytar": "0.15.1",
"keytar": "1.x",
"less-cache": "0.12.0",
"mixto": "1.x",
"nslog": "0.5.0",
"oniguruma": "1.x",
"oniguruma": ">=1.0.3 <2.0",
"optimist": "0.4.0",
"pathwatcher": "0.16.0",
"pegjs": "0.8.0",
"pathwatcher": "^1.0.0",
"property-accessors": "1.x",
"q": "1.0.x",
"q": "^1.0.1",
"random-words": "0.0.1",
"runas": "0.5.x",
"scandal": "0.15.0",
@@ -47,83 +47,83 @@
"serializable": "1.x",
"space-pen": "3.1.1",
"temp": "0.5.0",
"text-buffer": "^1.4.0",
"text-buffer": "^1.4.4",
"theorist": "1.x",
"underscore-plus": ">=1.0.2 <2.0",
"underscore-plus": ">=1.0.5 <2.0",
"vm-compatibility-layer": "0.1.0"
},
"packageDependencies": {
"atom-dark-syntax": "0.15.0",
"atom-dark-ui": "0.23.0",
"atom-light-syntax": "0.15.0",
"atom-light-ui": "0.22.0",
"atom-dark-ui": "0.25.0",
"atom-light-syntax": "0.16.0",
"atom-light-ui": "0.23.0",
"base16-tomorrow-dark-theme": "0.13.0",
"solarized-dark-syntax": "0.12.0",
"solarized-dark-syntax": "0.14.0",
"solarized-light-syntax": "0.7.0",
"archive-view": "0.26.0",
"archive-view": "0.29.0",
"autocomplete": "0.27.0",
"autoflow": "0.15.0",
"autosave": "0.12.0",
"autosave": "0.13.0",
"background-tips": "0.9.0",
"bookmarks": "0.21.0",
"bracket-matcher": "0.25.0",
"bookmarks": "0.22.0",
"bracket-matcher": "0.26.0",
"command-palette": "0.19.0",
"dev-live-reload": "0.28.0",
"dev-live-reload": "0.29.0",
"exception-reporting": "0.17.0",
"feedback": "0.28.0",
"find-and-replace": "0.89.1",
"fuzzy-finder": "0.39.0",
"find-and-replace": "0.92.0",
"fuzzy-finder": "0.42.0",
"git-diff": "0.25.0",
"go-to-line": "0.18.0",
"grammar-selector": "0.23.0",
"image-view": "0.29.0",
"image-view": "0.32.0",
"keybinding-resolver": "0.11.0",
"link": "0.20.0",
"markdown-preview": "0.47.0",
"metrics": "0.30.0",
"markdown-preview": "0.49.0",
"metrics": "0.32.0",
"open-on-github": "0.23.0",
"package-generator": "0.30.0",
"release-notes": "0.26.0",
"settings-view": "0.89.0",
"snippets": "0.35.0",
"settings-view": "0.97.0",
"snippets": "0.37.0",
"spell-check": "0.28.0",
"status-bar": "0.35.0",
"status-bar": "0.36.0",
"styleguide": "0.26.0",
"symbols-view": "0.41.0",
"tabs": "0.27.0",
"symbols-view": "0.44.0",
"tabs": "0.31.0",
"timecop": "0.17.0",
"tree-view": "0.74.0",
"tree-view": "0.83.0",
"update-package-dependencies": "0.6.0",
"welcome": "0.11.0",
"whitespace": "0.18.0",
"wrap-guide": "0.16.0",
"whitespace": "0.21.0",
"wrap-guide": "0.18.0",
"language-c": "0.13.0",
"language-coffee-script": "0.15.0",
"language-css": "0.12.0",
"language-gfm": "0.19.0",
"language-coffee-script": "0.16.0",
"language-css": "0.13.0",
"language-gfm": "0.22.0",
"language-git": "0.9.0",
"language-go": "0.7.0",
"language-html": "0.10.0",
"language-hyperlink": "0.8.0",
"language-html": "0.14.0",
"language-hyperlink": "0.9.0",
"language-java": "0.9.0",
"language-javascript": "0.16.0",
"language-javascript": "0.21.0",
"language-json": "0.8.0",
"language-less": "0.6.0",
"language-make": "0.9.0",
"language-objective-c": "0.10.0",
"language-perl": "0.8.0",
"language-php": "0.10.0",
"language-php": "0.13.0",
"language-property-list": "0.7.0",
"language-python": "0.12.0",
"language-ruby": "0.15.0",
"language-ruby-on-rails": "0.10.0",
"language-ruby": "0.16.0",
"language-ruby-on-rails": "0.12.0",
"language-sass": "0.8.0",
"language-shellscript": "0.8.0",
"language-source": "0.7.0",
"language-sql": "0.7.0",
"language-text": "0.6.0",
"language-todo": "0.6.0",
"language-toml": "0.11.0",
"language-todo": "0.9.0",
"language-toml": "0.12.0",
"language-xml": "0.8.0",
"language-yaml": "0.6.0"
},
+2
Ver Arquivo
@@ -32,6 +32,8 @@
<string>MainMenu</string>
<key>NSPrincipalClass</key>
<string>AtomApplication</string>
<key>NSSupportsAutomaticGraphicsSwitching</key>
<true/>
<key>SUPublicDSAKeyFile</key>
<string>speakeasy.pem</string>
<key>SUScheduledCheckInterval</key>
+15 -4
Ver Arquivo
@@ -1,4 +1,11 @@
#!/usr/bin/env node --harmony_collections
var nodeMinorVersion = process.versions.node.split('.')[1]
if (nodeMinorVersion !== '10') {
console.warn("You must run script/bootstrap and script/build with node v0.10.x");
process.exit(1);
}
var safeExec = require('./utils/child-process-wrapper.js').safeExec;
var fs = require('fs');
var path = require('path');
@@ -27,15 +34,19 @@ if (!fs.existsSync(path.join(apmInstallPath, 'node_modules')))
var apmPath = '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 npmFlags = ' --userconfig=' + path.resolve('.npmrc') + ' ';
var packagesToDedupe = ['fs-plus', 'humanize-plus', 'oniguruma', 'roaster', 'season'];
var npmCommand = 'npm --userconfig=' + path.resolve('.npmrc') + ' ';
var echoNewLine = process.platform == 'win32' ? 'echo.' : 'echo';
var commands = [
'git submodule --quiet sync',
'git submodule --quiet update --recursive --init',
{command: npmCommand + 'install --quiet', options: {cwd: path.resolve(__dirname, '..', 'build'), ignoreStdout: true}},
{command: npmCommand + 'install --quiet', options: {cwd: apmVendorPath, ignoreStdout: true}},
{command: npmCommand + 'install --quiet ' + apmVendorPath, options: {cwd: apmInstallPath, ignoreStdout: true}},
{command: 'npm' + npmFlags + 'install --quiet', options: {cwd: path.resolve(__dirname, '..', 'build'), ignoreStdout: true}},
{command: npmPath + npmFlags + 'install --quiet', options: {cwd: apmVendorPath, ignoreStdout: true}},
{command: npmPath + npmFlags + 'install --quiet ' + apmVendorPath, options: {cwd: apmInstallPath, ignoreStdout: true}},
echoNewLine,
apmPath + ' clean ' + apmFlags,
apmPath + ' install --quiet ' + apmFlags,
+10
Ver Arquivo
@@ -126,6 +126,16 @@ describe "the `atom` global", ->
expect(eventHandler.callCount).toBe 2
expect(mainModule.activate.callCount).toBe 1
it "activates the package immediately when the events are empty", ->
mainModule = require './fixtures/packages/package-with-empty-activation-events/index'
spyOn(mainModule, 'activate').andCallThrough()
waitsForPromise ->
atom.packages.activatePackage('package-with-empty-activation-events')
runs ->
expect(mainModule.activate.callCount).toBe 1
describe "when the package has no main module", ->
it "does not throw an exception", ->
spyOn(console, "error")
+11
Ver Arquivo
@@ -525,6 +525,17 @@ describe "DisplayBuffer", ->
expect(displayBuffer.lineForRow(8).text).toMatch /^9-+/
expect(displayBuffer.lineForRow(10).fold).toBeDefined()
describe ".outermostFoldsInBufferRowRange(startRow, endRow)", ->
it "returns the outermost folds entirely contained in the given row range, exclusive of end row", ->
fold1 = displayBuffer.createFold(4, 7)
fold2 = displayBuffer.createFold(5, 6)
fold3 = displayBuffer.createFold(11, 15)
fold4 = displayBuffer.createFold(12, 13)
fold5 = displayBuffer.createFold(16, 17)
expect(displayBuffer.outermostFoldsInBufferRowRange(3, 18)).toEqual [fold1, fold3, fold5]
expect(displayBuffer.outermostFoldsInBufferRowRange(5, 16)).toEqual [fold3]
describe ".clipScreenPosition(screenPosition, wrapBeyondNewlines: false, wrapAtSoftNewlines: false, skipAtomicTokens: false)", ->
beforeEach ->
displayBuffer.setSoftWrap(true)
+99 -4
Ver Arquivo
@@ -2506,7 +2506,7 @@ describe "Editor", ->
describe "when the line preceding the newline does't add a level of indentation", ->
it "indents the new line to the same level a as the preceding line", ->
editor.setCursorBufferPosition([5, 13])
editor.setCursorBufferPosition([5, 14])
editor.insertText('\n')
expect(editor.indentationForBufferRow(6)).toBe editor.indentationForBufferRow(5)
@@ -2529,6 +2529,16 @@ describe "Editor", ->
expect(editor.indentationForBufferRow(1)).toBe 1
expect(editor.indentationForBufferRow(2)).toBe 1
describe "when the cursor is before whitespace", ->
it "retains the whitespace following the cursor on the new line", ->
editor.setText(" var sort = function() {}")
editor.setCursorScreenPosition([0, 23])
editor.insertNewline()
expect(buffer.lineForRow(0)).toBe ' var sort = function()'
expect(buffer.lineForRow(1)).toBe ' {}'
expect(editor.getCursorScreenPosition()).toEqual [1, 2]
describe "when inserted text matches a decrease indent pattern", ->
describe "when the preceding line matches an increase indent pattern", ->
it "decreases the indentation to match that of the preceding line", ->
@@ -2552,7 +2562,7 @@ describe "Editor", ->
expect(editor.lineForBufferRow(13)).toBe "}; # too many closing brackets!"
describe "when inserted text does not match a decrease indent pattern", ->
it "does not the indentation", ->
it "does not decrease the indentation", ->
editor.setCursorBufferPosition([12, 0])
editor.insertText(' ')
expect(editor.lineForBufferRow(12)).toBe ' };'
@@ -2669,6 +2679,67 @@ describe "Editor", ->
expect(editor.lineForBufferRow(9)).toBe ' }; return sort(Array.apply(this, arguments)); };'
expect(editor.getSelectedBufferRange()).toEqual [[9, 3], [9, 49]]
describe ".duplicateLines()", ->
it "for each selection, duplicates all buffer lines intersected by the selection", ->
editor.foldBufferRow(4)
editor.setCursorBufferPosition([2, 5])
editor.addSelectionForBufferRange([[3, 0], [8, 0]], preserveFolds: true)
editor.duplicateLines()
expect(editor.getTextInBufferRange([[2, 0], [13, 5]])).toBe """
\ if (items.length <= 1) return items;
if (items.length <= 1) return items;
var pivot = items.shift(), current, left = [], right = [];
while(items.length > 0) {
current = items.shift();
current < pivot ? left.push(current) : right.push(current);
}
var pivot = items.shift(), current, left = [], right = [];
while(items.length > 0) {
current = items.shift();
current < pivot ? left.push(current) : right.push(current);
}
"""
expect(editor.getSelectedBufferRanges()).toEqual [[[3, 5], [3, 5]], [[9, 0], [14, 0]]]
# folds are also duplicated
expect(editor.lineForScreenRow(5).fold).toBeDefined()
expect(editor.lineForScreenRow(7).fold).toBeDefined()
expect(editor.lineForScreenRow(7).text).toBe " while(items.length > 0) {"
expect(editor.lineForScreenRow(8).text).toBe " return sort(left).concat(pivot).concat(sort(right));"
it "duplicates all folded lines for empty selections on folded lines", ->
editor.foldBufferRow(4)
editor.setCursorBufferPosition([4, 0])
editor.duplicateLines()
expect(editor.getTextInBufferRange([[2, 0], [11, 5]])).toBe """
\ if (items.length <= 1) return items;
var pivot = items.shift(), current, left = [], right = [];
while(items.length > 0) {
current = items.shift();
current < pivot ? left.push(current) : right.push(current);
}
while(items.length > 0) {
current = items.shift();
current < pivot ? left.push(current) : right.push(current);
}
"""
expect(editor.getSelectedBufferRange()).toEqual [[8, 0], [8, 0]]
it "can duplicate the last line of the buffer", ->
editor.setSelectedBufferRange([[11, 0], [12, 2]])
editor.duplicateLines()
expect(editor.getTextInBufferRange([[11, 0], [14, 2]])).toBe """
\ return sort(Array.apply(this, arguments));
};
return sort(Array.apply(this, arguments));
};
"""
expect(editor.getSelectedBufferRange()).toEqual [[13, 0], [14, 2]]
describe ".shouldPromptToSave()", ->
it "returns false when an edit session's buffer is in use by more than one session", ->
jasmine.unspy(editor, 'shouldPromptToSave')
@@ -2725,10 +2796,18 @@ describe "Editor", ->
describe "when the editor uses soft tabs but the row has hard tabs", ->
it "only replaces whitespace charachters", ->
editor.setSoftWrap(true)
editor.setText(" 1\n 2")
editor.setText("\t1\n\t2")
editor.setCursorBufferPosition([0, 0])
editor.setIndentationForBufferRow(0, 2)
expect(editor.getText()).toBe(" 1\n 2")
expect(editor.getText()).toBe(" 1\n\t2")
describe "when the indentation level is a non-integer", ->
it "does not throw an exception", ->
editor.setSoftWrap(true)
editor.setText("\t1\n\t2")
editor.setCursorBufferPosition([0, 0])
editor.setIndentationForBufferRow(0, 2.1)
expect(editor.getText()).toBe(" 1\n\t2")
describe ".reloadGrammar()", ->
beforeEach ->
@@ -2805,3 +2884,19 @@ describe "Editor", ->
{tokens} = editor.lineForScreenRow(0)
expect(tokens[2].value).toBe "SELECT"
expect(tokens[2].scopes).toEqual ["source.js", "comment.line.double-slash.js", "keyword.other.DML.sql"]
describe ".normalizeTabsInBufferRange()", ->
it "normalizes tabs depending on the editor's soft tab/tab length settings", ->
editor.setTabLength(1)
editor.setSoftTabs(true)
editor.setText('\t\t\t')
editor.normalizeTabsInBufferRange([[0, 0], [0, 1]])
expect(editor.getText()).toBe ' \t\t'
editor.setTabLength(2)
editor.normalizeTabsInBufferRange([[0, 0], [Infinity, Infinity]])
expect(editor.getText()).toBe ' '
editor.setSoftTabs(false)
editor.normalizeTabsInBufferRange([[0, 0], [Infinity, Infinity]])
expect(editor.getText()).toBe ' '
+53 -65
Ver Arquivo
@@ -587,7 +587,7 @@ describe "EditorView", ->
editorView.renderedLines.trigger mousedownEvent(editorView: editorView, point: [4, 10])
# moving changes selection
$(document).trigger mousemoveEvent(editorView: editorView, point: [5, 27])
$(document).trigger mousemoveEvent(editorView: editorView, point: [5, 27], which: 1)
range = editor.getSelection().getScreenRange()
expect(range.start).toEqual({row: 4, column: 10})
@@ -617,12 +617,12 @@ describe "EditorView", ->
originalScrollTop = editorView.scrollTop()
# moving changes selection
$(document).trigger mousemoveEvent(editorView: editorView, pageX: 0, pageY: -1)
$(document).trigger mousemoveEvent(editorView: editorView, pageX: 0, pageY: -1, which: 1)
expect(editorView.scrollTop()).toBe originalScrollTop - editorView.lineHeight
# every mouse move selects more text
for x in [0..10]
$(document).trigger mousemoveEvent(editorView: editorView, pageX: 0, pageY: -1)
$(document).trigger mousemoveEvent(editorView: editorView, pageX: 0, pageY: -1, which: 1)
expect(editorView.scrollTop()).toBe 0
@@ -633,7 +633,7 @@ describe "EditorView", ->
event = mousedownEvent(editorView: editorView, point: [4, 10])
event.originalEvent.which = 2
editorView.renderedLines.trigger(event)
$(document).trigger mousemoveEvent(editorView: editorView, point: [5, 27])
$(document).trigger mousemoveEvent(editorView: editorView, point: [5, 27], which: 1)
$(document).trigger 'mouseup'
range = editor.getSelection().getScreenRange()
@@ -654,6 +654,25 @@ describe "EditorView", ->
expect(range.start).toEqual({row: 4, column: 10})
expect(range.end).toEqual({row: 4, column: 10})
describe "when the editor is hidden", ->
it "stops scrolling the editor", ->
editorView.vScrollMargin = 0
editorView.attachToDom(heightInLines: 5)
editorView.scrollToBottom()
spyOn(window, 'setInterval').andCallFake ->
editorView.renderedLines.trigger mousedownEvent(editorView: editorView, point: [12, 0])
originalScrollTop = editorView.scrollTop()
$(document).trigger mousemoveEvent(editorView: editorView, pageX: 0, pageY: -1, which: 1)
expect(editorView.scrollTop()).toBe originalScrollTop - editorView.lineHeight
editorView.hide()
$(document).trigger mousemoveEvent(editorView: editorView, pageX: 100000, pageY: -1, which: 1)
expect(editorView.scrollTop()).toBe originalScrollTop - editorView.lineHeight
describe "double-click and drag", ->
it "selects the word under the cursor, then continues to select by word in either direction as the mouse is dragged", ->
expect(editor.getCursorScreenPosition()).toEqual(row: 0, column: 0)
@@ -662,11 +681,11 @@ describe "EditorView", ->
editorView.renderedLines.trigger mousedownEvent(editorView: editorView, point: [0, 8], originalEvent: {detail: 2})
expect(editor.getSelectedText()).toBe "quicksort"
editorView.renderedLines.trigger mousemoveEvent(editorView: editorView, point: [1, 8])
editorView.renderedLines.trigger mousemoveEvent(editorView: editorView, point: [1, 8], which: 1)
expect(editor.getSelectedBufferRange()).toEqual [[0, 4], [1, 10]]
expect(editor.getCursorBufferPosition()).toEqual [1, 10]
editorView.renderedLines.trigger mousemoveEvent(editorView: editorView, point: [0, 1])
editorView.renderedLines.trigger mousemoveEvent(editorView: editorView, point: [0, 1], which: 1)
expect(editor.getSelectedBufferRange()).toEqual [[0, 0], [0, 13]]
expect(editor.getCursorBufferPosition()).toEqual [0, 0]
@@ -691,12 +710,12 @@ describe "EditorView", ->
expect(editor.getSelectedBufferRange()).toEqual [[4, 0], [5, 0]]
# moving changes selection linewise
editorView.renderedLines.trigger mousemoveEvent(editorView: editorView, point: [5, 27])
editorView.renderedLines.trigger mousemoveEvent(editorView: editorView, point: [5, 27], which: 1)
expect(editor.getSelectedBufferRange()).toEqual [[4, 0], [6, 0]]
expect(editor.getCursorBufferPosition()).toEqual [6, 0]
# moving changes selection linewise
editorView.renderedLines.trigger mousemoveEvent(editorView: editorView, point: [2, 27])
editorView.renderedLines.trigger mousemoveEvent(editorView: editorView, point: [2, 27], which: 1)
expect(editor.getSelectedBufferRange()).toEqual [[2, 0], [5, 0]]
expect(editor.getCursorBufferPosition()).toEqual [2, 0]
@@ -706,11 +725,11 @@ describe "EditorView", ->
describe "meta-click and drag", ->
it "adds an additional selection", ->
editorView.renderedLines.trigger mousedownEvent(editorView: editorView, point: [4, 10])
editorView.renderedLines.trigger mousemoveEvent(editorView: editorView, point: [5, 27])
editorView.renderedLines.trigger mousemoveEvent(editorView: editorView, point: [5, 27], which: 1)
editorView.renderedLines.trigger 'mouseup'
editorView.renderedLines.trigger mousedownEvent(editorView: editorView, point: [6, 10], metaKey: true)
editorView.renderedLines.trigger mousemoveEvent(editorView: editorView, point: [8, 27], metaKey: true)
editorView.renderedLines.trigger mousemoveEvent(editorView: editorView, point: [8, 27], metaKey: true, which: 1)
editorView.renderedLines.trigger 'mouseup'
selections = editor.getSelections()
@@ -2781,61 +2800,6 @@ describe "EditorView", ->
expect(buffer.lineForRow(1)).toBe ' if (items.length <= 1) return items;'
expect(buffer.lineForRow(2)).toBe ' var sort = function(items) {'
describe "when editor:duplicate-line is triggered", ->
describe "where there is no selection", ->
describe "when the cursor isn't on a folded line", ->
it "duplicates the current line below and moves the cursor down one row", ->
editor.setCursorBufferPosition([0, 5])
editorView.trigger 'editor:duplicate-line'
expect(buffer.lineForRow(0)).toBe 'var quicksort = function () {'
expect(buffer.lineForRow(1)).toBe 'var quicksort = function () {'
expect(editor.getCursorBufferPosition()).toEqual [1, 5]
describe "when the cursor is on a folded line", ->
it "duplicates the entire fold before and moves the cursor to the new fold", ->
editor.setCursorBufferPosition([4])
editor.foldCurrentRow()
editorView.trigger 'editor:duplicate-line'
expect(editor.getCursorScreenPosition()).toEqual [5]
expect(editor.isFoldedAtScreenRow(4)).toBeTruthy()
expect(editor.isFoldedAtScreenRow(5)).toBeTruthy()
expect(buffer.lineForRow(8)).toBe ' while(items.length > 0) {'
expect(buffer.lineForRow(9)).toBe ' current = items.shift();'
expect(buffer.lineForRow(10)).toBe ' current < pivot ? left.push(current) : right.push(current);'
expect(buffer.lineForRow(11)).toBe ' }'
describe "when the cursor is on the last line and it doesn't have a trailing newline", ->
it "inserts a newline and the duplicated line", ->
editor.moveCursorToBottom()
editorView.trigger 'editor:duplicate-line'
expect(buffer.lineForRow(12)).toBe '};'
expect(buffer.lineForRow(13)).toBe '};'
expect(buffer.lineForRow(14)).toBeUndefined()
expect(editor.getCursorBufferPosition()).toEqual [13, 2]
describe "when the cursor in on the last line and it is only a newline", ->
it "duplicates the current line below and moves the cursor down one row", ->
editor.moveCursorToBottom()
editor.insertNewline()
editor.moveCursorToBottom()
editorView.trigger 'editor:duplicate-line'
expect(buffer.lineForRow(13)).toBe ''
expect(buffer.lineForRow(14)).toBe ''
expect(buffer.lineForRow(15)).toBeUndefined()
expect(editor.getCursorBufferPosition()).toEqual [14, 0]
describe "when the cursor is on the second to last line and the last line only a newline", ->
it "duplicates the current line below and moves the cursor down one row", ->
editor.moveCursorToBottom()
editor.insertNewline()
editor.setCursorBufferPosition([12])
editorView.trigger 'editor:duplicate-line'
expect(buffer.lineForRow(12)).toBe '};'
expect(buffer.lineForRow(13)).toBe '};'
expect(buffer.lineForRow(14)).toBe ''
expect(buffer.lineForRow(15)).toBeUndefined()
expect(editor.getCursorBufferPosition()).toEqual [13, 0]
describe "when the escape key is pressed on the editor view", ->
it "clears multiple selections if there are any, and otherwise allows other bindings to be handled", ->
atom.keymap.bindKeys 'name', '.editor', {'escape': 'test-event'}
@@ -2958,6 +2922,30 @@ describe "EditorView", ->
editorView.pixelPositionForScreenPosition([1, 5])
expect(editorView.measureToColumn.callCount).toBe 0
describe "when stylesheets are changed", ->
afterEach ->
atom.themes.removeStylesheet 'line-height'
atom.themes.removeStylesheet 'char-width'
it "updates the editor if the line height or character width changes due to a stylesheet change", ->
editorView.attachToDom()
editor.setCursorScreenPosition([1, 3])
expect(editorView.pixelPositionForScreenPosition([1, 3])).toEqual {top: 20, left: 30}
expect(editorView.getCursorView().position()).toEqual {top: 20, left: 30}
atom.themes.applyStylesheet 'line-height', """
.editor { line-height: 2; }
"""
expect(editorView.pixelPositionForScreenPosition([1, 3])).toEqual {top: 32, left: 30}
expect(editorView.getCursorView().position()).toEqual {top: 32, left: 30}
atom.themes.applyStylesheet 'char-width', """
.editor { letter-spacing: 2px; }
"""
expect(editorView.pixelPositionForScreenPosition([1, 3])).toEqual {top: 32, left: 36}
expect(editorView.getCursorView().position()).toEqual {top: 32, left: 36}
describe "when the editor contains hard tabs", ->
it "correctly calculates the the position left for a column", ->
editor.setText('\ttest')
@@ -0,0 +1 @@
module.exports = activate: ->
@@ -0,0 +1,5 @@
{
"name": "no events",
"version": "0.1.0",
"activationEvents": []
}
-454
Ver Arquivo
@@ -1,454 +0,0 @@
fs = require 'fs-plus'
path = require 'path'
temp = require 'temp'
Keymap = require '../src/keymap'
{$, $$, WorkspaceView} = require 'atom'
describe "Keymap", ->
fragment = null
keymap = null
resourcePath = atom.getLoadSettings().resourcePath
configDirPath = null
beforeEach ->
configDirPath = temp.mkdirSync('atom')
keymap = new Keymap({configDirPath, resourcePath})
fragment = $ """
<div class="command-mode">
<div class="child-node">
<div class="grandchild-node"/>
</div>
</div>
"""
afterEach ->
keymap.destroy()
describe ".handleKeyEvent(event)", ->
deleteCharHandler = null
insertCharHandler = null
commandZHandler = null
beforeEach ->
keymap.bindKeys 'name', '.command-mode', 'x': 'deleteChar'
keymap.bindKeys 'name', '.insert-mode', 'x': 'insertChar'
keymap.bindKeys 'name', '.command-mode', 'cmd-z': 'commandZPressed'
deleteCharHandler = jasmine.createSpy('deleteCharHandler')
insertCharHandler = jasmine.createSpy('insertCharHandler')
commandZHandler = jasmine.createSpy('commandZHandler')
fragment.on 'deleteChar', deleteCharHandler
fragment.on 'insertChar', insertCharHandler
fragment.on 'commandZPressed', commandZHandler
describe "when no binding matches the event's keystroke", ->
it "does not return false so the event continues to propagate", ->
expect(keymap.handleKeyEvent(keydownEvent('0', target: fragment[0]))).not.toBe false
describe "when a non-English keyboard language is used", ->
it "uses the physical character pressed instead of the character it maps to in the current language", ->
event = keydownEvent('U+03B6', metaKey: true, which: 122, target: fragment[0]) # This is the 'z' key using the Greek keyboard layout
result = keymap.handleKeyEvent(event)
expect(result).toBe(false)
expect(commandZHandler).toHaveBeenCalled()
describe "when at least one binding fully matches the event's keystroke", ->
describe "when the event's target node matches a selector with a matching binding", ->
it "triggers the command event associated with that binding on the target node and returns false", ->
result = keymap.handleKeyEvent(keydownEvent('x', target: fragment[0]))
expect(result).toBe(false)
expect(deleteCharHandler).toHaveBeenCalled()
expect(insertCharHandler).not.toHaveBeenCalled()
deleteCharHandler.reset()
fragment.removeClass('command-mode').addClass('insert-mode')
event = keydownEvent('x', target: fragment[0])
keymap.handleKeyEvent(event)
expect(deleteCharHandler).not.toHaveBeenCalled()
expect(insertCharHandler).toHaveBeenCalled()
describe "when the event's target node *descends* from a selector with a matching binding", ->
it "triggers the command event associated with that binding on the target node and returns false", ->
target = fragment.find('.child-node')[0]
result = keymap.handleKeyEvent(keydownEvent('x', target: target))
expect(result).toBe(false)
expect(deleteCharHandler).toHaveBeenCalled()
expect(insertCharHandler).not.toHaveBeenCalled()
deleteCharHandler.reset()
fragment.removeClass('command-mode').addClass('insert-mode')
keymap.handleKeyEvent(keydownEvent('x', target: target))
expect(deleteCharHandler).not.toHaveBeenCalled()
expect(insertCharHandler).toHaveBeenCalled()
describe "when the event's target node descends from multiple nodes that match selectors with a binding", ->
beforeEach ->
keymap.bindKeys 'name', '.child-node', 'x': 'foo'
it "only triggers bindings on selectors associated with the closest ancestor node", ->
fooHandler = jasmine.createSpy 'fooHandler'
fragment.on 'foo', fooHandler
target = fragment.find('.grandchild-node')[0]
keymap.handleKeyEvent(keydownEvent('x', target: target))
expect(fooHandler).toHaveBeenCalled()
expect(deleteCharHandler).not.toHaveBeenCalled()
expect(insertCharHandler).not.toHaveBeenCalled()
describe "when 'abortKeyBinding' is called on the triggered event", ->
[fooHandler1, fooHandler2] = []
beforeEach ->
fooHandler1 = jasmine.createSpy('fooHandler1').andCallFake (e) ->
expect(deleteCharHandler).not.toHaveBeenCalled()
e.abortKeyBinding()
fooHandler2 = jasmine.createSpy('fooHandler2')
fragment.find('.child-node').on 'foo', fooHandler1
fragment.on 'foo', fooHandler2
it "aborts the current event and tries again with the next-most-specific key binding", ->
target = fragment.find('.grandchild-node')[0]
keymap.handleKeyEvent(keydownEvent('x', target: target))
expect(fooHandler1).toHaveBeenCalled()
expect(fooHandler2).not.toHaveBeenCalled()
expect(deleteCharHandler).toHaveBeenCalled()
it "does not throw an exception if the event was not triggered by the keymap", ->
fragment.find('.grandchild-node').trigger 'foo'
describe "when the event bubbles to a node that matches multiple selectors", ->
describe "when the matching selectors differ in specificity", ->
it "triggers the binding for the most specific selector", ->
keymap.bindKeys 'name', 'div .child-node', 'x': 'foo'
keymap.bindKeys 'name', '.command-mode .child-node !important', 'x': 'baz'
keymap.bindKeys 'name', '.command-mode .child-node', 'x': 'quux'
keymap.bindKeys 'name', '.child-node', 'x': 'bar'
fooHandler = jasmine.createSpy 'fooHandler'
barHandler = jasmine.createSpy 'barHandler'
bazHandler = jasmine.createSpy 'bazHandler'
fragment.on 'foo', fooHandler
fragment.on 'bar', barHandler
fragment.on 'baz', bazHandler
target = fragment.find('.grandchild-node')[0]
keymap.handleKeyEvent(keydownEvent('x', target: target))
expect(fooHandler).not.toHaveBeenCalled()
expect(barHandler).not.toHaveBeenCalled()
expect(bazHandler).toHaveBeenCalled()
describe "when the matching selectors have the same specificity", ->
it "triggers the bindings for the most recently declared selector", ->
keymap.bindKeys 'name', '.child-node', 'x': 'foo', 'y': 'baz'
keymap.bindKeys 'name', '.child-node', 'x': 'bar'
fooHandler = jasmine.createSpy 'fooHandler'
barHandler = jasmine.createSpy 'barHandler'
bazHandler = jasmine.createSpy 'bazHandler'
fragment.on 'foo', fooHandler
fragment.on 'bar', barHandler
fragment.on 'baz', bazHandler
target = fragment.find('.grandchild-node')[0]
keymap.handleKeyEvent(keydownEvent('x', target: target))
expect(barHandler).toHaveBeenCalled()
expect(fooHandler).not.toHaveBeenCalled()
keymap.handleKeyEvent(keydownEvent('y', target: target))
expect(bazHandler).toHaveBeenCalled()
describe "when the event's target is the document body", ->
it "triggers the mapped event on the workspaceView", ->
atom.workspaceView = new WorkspaceView
atom.workspaceView.attachToDom()
keymap.bindKeys 'name', 'body', 'x': 'foo'
fooHandler = jasmine.createSpy("fooHandler")
atom.workspaceView.on 'foo', fooHandler
result = keymap.handleKeyEvent(keydownEvent('x', target: document.body))
expect(result).toBe(false)
expect(fooHandler).toHaveBeenCalled()
expect(deleteCharHandler).not.toHaveBeenCalled()
expect(insertCharHandler).not.toHaveBeenCalled()
describe "when the event matches a 'native!' binding", ->
it "returns true, allowing the browser's native key handling to process the event", ->
keymap.bindKeys 'name', '.grandchild-node', 'x': 'native!'
nativeHandler = jasmine.createSpy("nativeHandler")
fragment.on 'native!', nativeHandler
expect(keymap.handleKeyEvent(keydownEvent('x', target: fragment.find('.grandchild-node')[0]))).toBe true
expect(nativeHandler).not.toHaveBeenCalled()
describe "when at least one binding partially matches the event's keystroke", ->
[quitHandler, closeOtherWindowsHandler] = []
beforeEach ->
keymap.bindKeys 'name', "*",
'ctrl-x ctrl-c': 'quit'
'ctrl-x 1': 'close-other-windows'
quitHandler = jasmine.createSpy('quitHandler')
closeOtherWindowsHandler = jasmine.createSpy('closeOtherWindowsHandler')
fragment.on 'quit', quitHandler
fragment.on 'close-other-windows', closeOtherWindowsHandler
it "only matches entire keystroke patterns", ->
expect(keymap.handleKeyEvent(keydownEvent('c', target: fragment[0]))).not.toBe false
describe "when the event's target node matches a selector with a partially matching multi-stroke binding", ->
describe "when a second keystroke added to the first to match a multi-stroke binding completely", ->
it "triggers the event associated with the matched multi-stroke binding", ->
expect(keymap.handleKeyEvent(keydownEvent('x', target: fragment[0], ctrlKey: true))).toBeFalsy()
expect(keymap.handleKeyEvent(keydownEvent('ctrl', target: fragment[0]))).toBeFalsy() # This simulates actual key event behavior
expect(keymap.handleKeyEvent(keydownEvent('c', target: fragment[0], ctrlKey: true))).toBeFalsy()
expect(quitHandler).toHaveBeenCalled()
expect(closeOtherWindowsHandler).not.toHaveBeenCalled()
quitHandler.reset()
expect(keymap.handleKeyEvent(keydownEvent('x', target: fragment[0], ctrlKey: true))).toBeFalsy()
expect(keymap.handleKeyEvent(keydownEvent('1', target: fragment[0]))).toBeFalsy()
expect(quitHandler).not.toHaveBeenCalled()
expect(closeOtherWindowsHandler).toHaveBeenCalled()
describe "when a second keystroke added to the first doesn't match any bindings", ->
it "clears the queued keystroke without triggering any events", ->
expect(keymap.handleKeyEvent(keydownEvent('x', target: fragment[0], ctrlKey: true))).toBe false
expect(keymap.handleKeyEvent(keydownEvent('c', target: fragment[0]))).toBe false
expect(quitHandler).not.toHaveBeenCalled()
expect(closeOtherWindowsHandler).not.toHaveBeenCalled()
expect(keymap.handleKeyEvent(keydownEvent('c', target: fragment[0]))).not.toBe false
describe "when the event's target node descends from multiple nodes that match selectors with a partial binding match", ->
it "allows any of the bindings to be triggered upon a second keystroke, favoring the most specific selector", ->
keymap.bindKeys 'name', ".grandchild-node", 'ctrl-x ctrl-c': 'more-specific-quit'
grandchildNode = fragment.find('.grandchild-node')[0]
moreSpecificQuitHandler = jasmine.createSpy('moreSpecificQuitHandler')
fragment.on 'more-specific-quit', moreSpecificQuitHandler
expect(keymap.handleKeyEvent(keydownEvent('x', target: grandchildNode, ctrlKey: true))).toBeFalsy()
expect(keymap.handleKeyEvent(keydownEvent('1', target: grandchildNode))).toBeFalsy()
expect(quitHandler).not.toHaveBeenCalled()
expect(moreSpecificQuitHandler).not.toHaveBeenCalled()
expect(closeOtherWindowsHandler).toHaveBeenCalled()
closeOtherWindowsHandler.reset()
expect(keymap.handleKeyEvent(keydownEvent('x', target: grandchildNode, ctrlKey: true))).toBeFalsy()
expect(keymap.handleKeyEvent(keydownEvent('c', target: grandchildNode, ctrlKey: true))).toBeFalsy()
expect(quitHandler).not.toHaveBeenCalled()
expect(closeOtherWindowsHandler).not.toHaveBeenCalled()
expect(moreSpecificQuitHandler).toHaveBeenCalled()
describe "when there is a complete binding with a less specific selector", ->
it "favors the more specific partial match", ->
describe "when there is a complete binding with a more specific selector", ->
it "favors the more specific complete match", ->
describe ".bindKeys(name, selector, bindings)", ->
it "normalizes bindings that use shift with lower case alpha char", ->
fooHandler = jasmine.createSpy('fooHandler')
fragment.on 'foo', fooHandler
keymap.bindKeys 'name', '*', 'ctrl-shift-l': 'foo'
result = keymap.handleKeyEvent(keydownEvent('l', ctrlKey: true, altKey: false, shiftKey: true, target: fragment[0]))
expect(result).toBe(false)
expect(fooHandler).toHaveBeenCalled()
it "normalizes bindings that use shift with upper case alpha char", ->
fooHandler = jasmine.createSpy('fooHandler')
fragment.on 'foo', fooHandler
keymap.bindKeys 'name', '*', 'ctrl-shift-L': 'foo'
result = keymap.handleKeyEvent(keydownEvent('l', ctrlKey: true, altKey: false, shiftKey: true, target: fragment[0]))
expect(result).toBe(false)
expect(fooHandler).toHaveBeenCalled()
it "normalizes bindings that use an upper case alpha char without shift", ->
fooHandler = jasmine.createSpy('fooHandler')
fragment.on 'foo', fooHandler
keymap.bindKeys 'name', '*', 'ctrl-L': 'foo'
result = keymap.handleKeyEvent(keydownEvent('l', ctrlKey: true, altKey: false, shiftKey: true, target: fragment[0]))
expect(result).toBe(false)
expect(fooHandler).toHaveBeenCalled()
it "normalizes the key patterns in the hash to put the modifiers in alphabetical order", ->
fooHandler = jasmine.createSpy('fooHandler')
fragment.on 'foo', fooHandler
keymap.bindKeys 'name', '*', 'ctrl-alt-delete': 'foo'
result = keymap.handleKeyEvent(keydownEvent('delete', ctrlKey: true, altKey: true, target: fragment[0]))
expect(result).toBe(false)
expect(fooHandler).toHaveBeenCalled()
fooHandler.reset()
keymap.bindKeys 'name', '*', 'ctrl-alt--': 'foo'
result = keymap.handleKeyEvent(keydownEvent('-', ctrlKey: true, altKey: true, target: fragment[0]))
expect(result).toBe(false)
expect(fooHandler).toHaveBeenCalled()
describe ".remove(name)", ->
it "removes the binding set with the given selector and bindings", ->
keymap.add 'nature',
'.green':
'ctrl-c': 'cultivate'
'.brown':
'ctrl-h': 'harvest'
keymap.add 'medical',
'.green':
'ctrl-v': 'vomit'
expect(keymap.keyBindingsMatchingElement($$ -> @div class: 'green')).toHaveLength 2
expect(keymap.keyBindingsMatchingElement($$ -> @div class: 'brown')).toHaveLength 1
keymap.remove('nature')
expect(keymap.keyBindingsMatchingElement($$ -> @div class: 'green')).toHaveLength 1
expect(keymap.keyBindingsMatchingElement($$ -> @div class: 'brown')).toEqual []
describe ".keystrokeStringForEvent(event)", ->
describe "when no modifiers are pressed", ->
it "returns a string that identifies the key pressed", ->
expect(keymap.keystrokeStringForEvent(keydownEvent('a'))).toBe 'a'
expect(keymap.keystrokeStringForEvent(keydownEvent('['))).toBe '['
expect(keymap.keystrokeStringForEvent(keydownEvent('*'))).toBe '*'
expect(keymap.keystrokeStringForEvent(keydownEvent('left'))).toBe 'left'
expect(keymap.keystrokeStringForEvent(keydownEvent('\b'))).toBe 'backspace'
describe "when ctrl, alt or command is pressed with a non-modifier key", ->
it "returns a string that identifies the key pressed", ->
expect(keymap.keystrokeStringForEvent(keydownEvent('a', altKey: true))).toBe 'alt-a'
expect(keymap.keystrokeStringForEvent(keydownEvent('[', metaKey: true))).toBe 'cmd-['
expect(keymap.keystrokeStringForEvent(keydownEvent('*', ctrlKey: true))).toBe 'ctrl-*'
expect(keymap.keystrokeStringForEvent(keydownEvent('left', ctrlKey: true, metaKey: true, altKey: true))).toBe 'alt-cmd-ctrl-left'
describe "when shift is pressed when a non-modifer key", ->
it "returns a string that identifies the key pressed", ->
expect(keymap.keystrokeStringForEvent(keydownEvent('A', shiftKey: true))).toBe 'shift-A'
expect(keymap.keystrokeStringForEvent(keydownEvent('{', shiftKey: true))).toBe '{'
expect(keymap.keystrokeStringForEvent(keydownEvent('left', shiftKey: true))).toBe 'shift-left'
expect(keymap.keystrokeStringForEvent(keydownEvent('Left', shiftKey: true))).toBe 'shift-left'
describe ".keyBindingsMatchingElement(element)", ->
it "returns the matching bindings for the element", ->
keymap.bindKeys 'name', '.command-mode', 'c': 'c'
keymap.bindKeys 'name', '.grandchild-node', 'g': 'g'
bindings = keymap.keyBindingsMatchingElement(fragment.find('.grandchild-node'))
expect(bindings).toHaveLength 2
expect(bindings[0].command).toEqual "g"
expect(bindings[1].command).toEqual "c"
describe "when multiple bindings match a keystroke", ->
it "only returns bindings that match the most specific selector", ->
keymap.bindKeys 'name', '.command-mode', 'g': 'cmd-mode'
keymap.bindKeys 'name', '.command-mode .grandchild-node', 'g': 'cmd-and-grandchild-node'
keymap.bindKeys 'name', '.grandchild-node', 'g': 'grandchild-node'
bindings = keymap.keyBindingsMatchingElement(fragment.find('.grandchild-node'))
expect(bindings).toHaveLength 3
expect(bindings[0].command).toEqual "cmd-and-grandchild-node"
describe ".keyBindingsForCommandMatchingElement(element)", ->
beforeEach ->
keymap.add 'nature',
'.green':
'ctrl-c': 'cultivate'
'.green-2':
'ctrl-o': 'cultivate'
'.brown':
'ctrl-h': 'harvest'
'.blue':
'ctrl-c': 'fly'
it "finds a keymap for an element", ->
el = $$ -> @div class: 'green'
bindings = keymap.keyBindingsForCommandMatchingElement('cultivate', el)
expect(bindings).toHaveLength 1
expect(bindings[0].keystroke).toEqual "ctrl-c"
it "no keymap an element without that map", ->
el = $$ -> @div class: 'brown'
bindings = keymap.keyBindingsForCommandMatchingElement('cultivate', el)
expect(bindings).toHaveLength 0
describe "loading platform specific keybindings", ->
customKeymap = null
beforeEach ->
resourcePath = temp.mkdirSync('atom')
customKeymap = new Keymap({configDirPath, resourcePath})
afterEach ->
customKeymap.destroy()
it "doesn't load keybindings from other platforms", ->
win32FilePath = path.join(resourcePath, "keymaps", "win32.cson")
darwinFilePath = path.join(resourcePath, "keymaps", "darwin.cson")
fs.writeFileSync(win32FilePath, '"body": "ctrl-l": "core:win32-move-left"')
fs.writeFileSync(darwinFilePath, '"body": "ctrl-l": "core:darwin-move-left"')
customKeymap.loadBundledKeymaps()
keyBindings = customKeymap.keyBindingsForKeystroke('ctrl-l')
expect(keyBindings).toHaveLength 1
expect(keyBindings[0].command).toBe "core:#{process.platform}-move-left"
describe "when the user keymap file is changed", ->
it "is reloaded", ->
keymapFilePath = path.join(configDirPath, "keymap.cson")
fs.writeFileSync(keymapFilePath, '"body": "ctrl-l": "core:move-left"')
keymap.loadUserKeymap()
spyOn(keymap, 'loadUserKeymap').andCallThrough()
fs.writeFileSync(keymapFilePath, "'body': 'ctrl-l': 'core:move-right'")
waitsFor ->
keymap.loadUserKeymap.callCount > 0
runs ->
keyBinding = keymap.keyBindingsForKeystroke('ctrl-l')[0]
expect(keyBinding.command).toBe 'core:move-right'
keymap.loadUserKeymap.reset()
fs.removeSync(keymapFilePath)
waitsFor ->
keymap.loadUserKeymap.callCount > 0
runs ->
keyBinding = keymap.keyBindingsForKeystroke('ctrl-l')[0]
expect(keyBinding).toBeUndefined()
it "logs a warning when it can't be parsed", ->
keymapFilePath = path.join(configDirPath, "keymap.json")
fs.writeFileSync(keymapFilePath, '')
keymap.loadUserKeymap()
spyOn(keymap, 'loadUserKeymap').andCallThrough()
fs.writeFileSync(keymapFilePath, '}{')
spyOn(console, 'warn')
waitsFor ->
keymap.loadUserKeymap.callCount > 0
runs ->
expect(console.warn.callCount).toBe 1
expect(console.warn.argsForCall[0][0].length).toBeGreaterThan 0
describe "when adding a binding with an invalid selector", ->
it "logs a warning and does not add it", ->
spyOn(console, 'warn')
keybinding =
'##selector':
'cmd-a': 'invalid-command'
keymap.add('test', keybinding)
expect(console.warn.callCount).toBe 1
expect(console.warn.argsForCall[0][0].length).toBeGreaterThan 0
expect(-> keymap.keyBindingsMatchingElement(document.body)).not.toThrow()
expect(keymap.keyBindingsForCommand('invalid:command')).toEqual []
+14
Ver Arquivo
@@ -208,6 +208,20 @@ describe "LanguageMode", ->
languageMode.toggleLineCommentsForBufferRows(0, 0)
expect(buffer.lineForRow(0)).toBe "// @color: #4D926F;"
describe "xml", ->
beforeEach ->
editor = atom.project.openSync('sample.xml', autoIndent: false)
editor.setText("<!-- test -->")
{buffer, languageMode} = editor
waitsForPromise ->
atom.packages.activatePackage('language-xml')
describe "when uncommenting lines", ->
it "removes the leading whitespace from the comment end pattern match", ->
languageMode.toggleLineCommentsForBufferRows(0, 0)
expect(buffer.lineForRow(0)).toBe "test"
describe "folding", ->
beforeEach ->
editor = atom.project.openSync('sample.js', autoIndent: false)
+1 -1
Ver Arquivo
@@ -292,7 +292,7 @@ describe "Pane", ->
pane.activeItem.path = __filename
pane.activeItem.saveAs = jasmine.createSpy("saveAs")
pane.saveActiveItemAs()
expect(atom.showSaveDialogSync).toHaveBeenCalledWith(__dirname)
expect(atom.showSaveDialogSync).toHaveBeenCalledWith(__filename)
expect(pane.activeItem.saveAs).toHaveBeenCalledWith('/selected/path')
describe "when the current item does not have a saveAs method", ->
+2 -2
Ver Arquivo
@@ -159,14 +159,14 @@ describe "PaneView", ->
describe "when an unmodifed buffer's path is deleted", ->
it "removes the pane item", ->
jasmine.unspy(window, 'setTimeout')
filePath = temp.openSync('atom').path
editor = atom.project.openSync(filePath)
pane.activateItem(editor)
expect(pane.items).toHaveLength(5)
fs.removeSync(filePath)
waitsFor 30000, ->
pane.items.length == 4
waitsFor -> pane.items.length == 4
describe "when a pane is destroyed", ->
[pane2, pane2Model] = []
+9
Ver Arquivo
@@ -43,6 +43,15 @@ describe "SelectListView", ->
expect(list.find('li:eq(0)')).toHaveClass 'A'
expect(selectList.getSelectedItem()).toBe items[0]
it "allows raw HTML to be returned", ->
selectList.viewForItem = (item) ->
"<li>#{item}</li>"
selectList.setItems(['Bermuda', 'Bahama'])
expect(list.find('li:eq(0)')).toHaveText 'Bermuda'
expect(selectList.getSelectedItem()).toBe 'Bermuda'
describe "when the text of the mini editor changes", ->
beforeEach ->
selectList.attachToDom()
+8
Ver Arquivo
@@ -1,6 +1,8 @@
# Start the crash reporter before anything else.
require('crash-reporter').start(productName: 'Atom', companyName: 'GitHub')
path = require 'path'
try
require '../src/window'
Atom = require '../src/atom'
@@ -12,6 +14,12 @@ try
{runSpecSuite} = require './jasmine-helper'
# Add 'src/exports' to module search path.
exportsPath = path.resolve(atom.getLoadSettings().resourcePath, 'exports')
require('module').globalPaths.push(exportsPath)
# Still set NODE_PATH since tasks may need it.
process.env.NODE_PATH = exportsPath
document.title = "Spec Suite"
runSpecSuite './spec-suite', atom.getLoadSettings().logFile
catch error
+10 -2
Ver Arquivo
@@ -6,8 +6,8 @@ require '../vendor/jasmine-jquery'
path = require 'path'
_ = require 'underscore-plus'
fs = require 'fs-plus'
Keymap = require '../src/keymap-extensions'
{$, WorkspaceView} = require 'atom'
Keymap = require '../src/keymap'
Config = require '../src/config'
{Point} = require 'text-buffer'
Project = require '../src/project'
@@ -180,7 +180,15 @@ window.keyIdentifierForKey = (key) ->
"U+00" + charCode.toString(16)
window.keydownEvent = (key, properties={}) ->
properties = $.extend({originalEvent: { keyIdentifier: keyIdentifierForKey(key) }}, properties)
originalEventProperties = {}
originalEventProperties.ctrl = properties.ctrlKey
originalEventProperties.alt = properties.altKey
originalEventProperties.shift = properties.shiftKey
originalEventProperties.cmd = properties.metaKey
originalEventProperties.target = properties.target?[0] ? properties.target
originalEventProperties.which = properties.which
originalEvent = Keymap.keydownEvent(key, originalEventProperties)
properties = $.extend({originalEvent}, properties)
$.Event("keydown", properties)
window.mouseEvent = (type, properties) ->
+2 -1
Ver Arquivo
@@ -5,7 +5,7 @@ path = require 'path'
require './spec-helper'
requireSpecs = (specDirectory, specType) ->
for specFilePath in fs.listTreeSync(specDirectory) when /-spec\.coffee$/.test specFilePath
for specFilePath in fs.listTreeSync(specDirectory) when /-spec\.(coffee|js)$/.test specFilePath
require specFilePath
# Set spec directory on spec for setting up the project in spec-helper
@@ -26,6 +26,7 @@ setSpecDirectory = (specDirectory) ->
runAllSpecs = ->
{resourcePath} = atom.getLoadSettings()
# Only run core specs when resource path is the Atom repository
if Git.exists(resourcePath)
requireSpecs(path.join(resourcePath, 'spec'))
+9
Ver Arquivo
@@ -170,8 +170,11 @@ describe "ThemeManager", ->
expect($(document.body).css('font-weight')).not.toBe("bold")
themeManager.requireStylesheet(cssPath)
expect($(document.body).css('font-weight')).toBe("bold")
themeManager.on 'stylesheets-changed', stylesheetsChangedHandler = jasmine.createSpy("stylesheetsChangedHandler")
themeManager.removeStylesheet(cssPath)
expect($(document.body).css('font-weight')).not.toBe("bold")
expect(stylesheetsChangedHandler).toHaveBeenCalled()
describe "base stylesheet loading", ->
beforeEach ->
@@ -204,12 +207,15 @@ describe "ThemeManager", ->
fs.writeFileSync(userStylesheetPath, 'body {border-style: dotted !important;}')
spyOn(themeManager, 'getUserStylesheetPath').andReturn userStylesheetPath
themeManager.on 'stylesheets-changed', stylesheetsChangedHandler = jasmine.createSpy("stylesheetsChangedHandler")
waitsForPromise ->
themeManager.activateThemes()
runs ->
expect($(document.body).css('border-style')).toBe 'dotted'
expect(stylesheetsChangedHandler).toHaveBeenCalled()
stylesheetsChangedHandler.reset()
spyOn(themeManager, 'loadUserStylesheet').andCallThrough()
fs.writeFileSync(userStylesheetPath, 'body {border-style: dashed}')
@@ -218,6 +224,8 @@ describe "ThemeManager", ->
runs ->
expect($(document.body).css('border-style')).toBe 'dashed'
expect(stylesheetsChangedHandler).toHaveBeenCalled()
stylesheetsChangedHandler.reset()
fs.removeSync(userStylesheetPath)
waitsFor ->
@@ -225,6 +233,7 @@ describe "ThemeManager", ->
runs ->
expect($(document.body).css('border-style')).toBe 'none'
expect(stylesheetsChangedHandler).toHaveBeenCalled()
describe "when a non-existent theme is present in the config", ->
it "logs a warning but does not throw an exception (regression)", ->
+11
Ver Arquivo
@@ -452,3 +452,14 @@ describe "TokenizedBuffer", ->
expect(tokenizedBuffer.tokenForPosition([0,0]).value).toBe ' '
atom.config.set('editor.tabLength', 6)
expect(tokenizedBuffer.tokenForPosition([0,0]).value).toBe ' '
it "does not allow the tab length to be less than 1", ->
buffer = atom.project.bufferForPathSync('sample.js')
buffer.setText('\ttest')
tokenizedBuffer = new TokenizedBuffer({buffer})
fullyTokenize(tokenizedBuffer)
expect(tokenizedBuffer.tokenForPosition([0,0]).value).toBe ' '
atom.config.set('editor.tabLength', 1)
expect(tokenizedBuffer.tokenForPosition([0,0]).value).toBe ' '
atom.config.set('editor.tabLength', 0)
expect(tokenizedBuffer.tokenForPosition([0,0]).value).toBe ' '
+8 -1
Ver Arquivo
@@ -138,7 +138,7 @@ class Atom extends Model
@loadTime = null
Config = require './config'
Keymap = require './keymap'
Keymap = require './keymap-extensions'
PackageManager = require './package-manager'
Clipboard = require './clipboard'
Syntax = require './syntax'
@@ -148,6 +148,12 @@ class Atom extends Model
{devMode, resourcePath} = @getLoadSettings()
configDirPath = @getConfigDirPath()
# Add 'src/exports' to module search path.
exportsPath = path.resolve(resourcePath, 'exports')
require('module').globalPaths.push(exportsPath)
# Still set NODE_PATH since tasks may need it.
process.env.NODE_PATH = exportsPath
@config = new Config({configDirPath, resourcePath})
@keymap = new Keymap({configDirPath, resourcePath})
@packages = new PackageManager({devMode, configDirPath, resourcePath})
@@ -236,6 +242,7 @@ class Atom extends Model
WorkspaceView = require './workspace-view'
@workspace = Workspace.deserialize(@state.workspace) ? new Workspace
@workspaceView = new WorkspaceView(@workspace)
@keymap.defaultTarget = @workspaceView[0]
$(@workspaceViewParentSelector).append(@workspaceView)
deserializePackageStates: ->
+49 -13
Ver Arquivo
@@ -163,8 +163,8 @@ class AtomApplication
autoUpdater.removeListener 'update-not-available', @onUpdateNotAvailable
dialog.showMessageBox type: 'warning', buttons: ['OK'], message: 'There was an error checking for updates.', detail: message
autoUpdater.on 'update-not-available', @onUpdateNotAvailable
autoUpdater.on 'error', @onUpdateError
autoUpdater.once 'update-not-available', @onUpdateNotAvailable
autoUpdater.once 'error', @onUpdateError
autoUpdater.checkForUpdates()
# Registers basic application commands, non-idempotent.
@@ -196,10 +196,15 @@ class AtomApplication
@openPathOnEvent('application:open-your-stylesheet', 'atom://.atom/stylesheet')
app.on 'window-all-closed', ->
app.quit() if process.platform is 'win32'
app.quit() if process.platform in ['win32', 'linux']
app.on 'will-quit', => @deleteSocketFile()
app.on 'will-exit', => @deleteSocketFile()
app.on 'will-quit', =>
@killAllProcesses()
@deleteSocketFile()
app.on 'will-exit', =>
@killAllProcesses()
@deleteSocketFile()
app.on 'open-file', (event, pathToOpen) =>
event.preventDefault()
@@ -246,7 +251,26 @@ class AtomApplication
# The optional arguments to pass along.
sendCommand: (command, args...) ->
unless @emit(command, args...)
@focusedWindow()?.sendCommand(command, args...)
focusedWindow = @focusedWindow()
if focusedWindow?
focusedWindow.sendCommand(command, args...)
else
@sendCommandToFirstResponder(command)
# Translates the command into OS X action and sends it to application's first
# responder.
sendCommandToFirstResponder: (command) ->
return false unless process.platform is 'darwin'
switch command
when 'core:undo' then Menu.sendActionToFirstResponder('undo:')
when 'core:redo' then Menu.sendActionToFirstResponder('redo:')
when 'core:copy' then Menu.sendActionToFirstResponder('copy:')
when 'core:cut' then Menu.sendActionToFirstResponder('cut:')
when 'core:paste' then Menu.sendActionToFirstResponder('paste:')
when 'core:select-all' then Menu.sendActionToFirstResponder('selectAll:')
else return false
true
# Public: Open the given path in the focused window when the event is
# triggered.
@@ -335,13 +359,25 @@ class AtomApplication
@pidsToOpenWindows[pidToKillWhenClosed] = openedWindow
openedWindow.browserWindow.on 'destroyed', =>
for pid, trackedWindow of @pidsToOpenWindows when trackedWindow is openedWindow
try
process.kill(pid)
catch error
if error.code isnt 'ESRCH'
console.log("Killing process #{pid} failed: #{error.code}")
delete @pidsToOpenWindows[pid]
@killProcessForWindow(openedWindow)
# Kill all processes associated with opened windows.
killAllProcesses: ->
@killProcess(pid) for pid of @pidsToOpenWindows
# Kill process associated with the given opened window.
killProcessForWindow: (openedWindow) ->
for pid, trackedWindow of @pidsToOpenWindows
@killProcess(pid) if trackedWindow is openedWindow
# Kill the process with the given pid.
killProcess: (pid) ->
try
process.kill(pid)
catch error
if error.code isnt 'ESRCH'
console.log("Killing process #{pid} failed: #{error.code}")
delete @pidsToOpenWindows[pid]
# Open an atom:// url.
#
+2 -22
Ver Arquivo
@@ -1,5 +1,4 @@
BrowserWindow = require 'browser-window'
Menu = require 'menu'
ContextMenu = require './context-menu'
app = require 'app'
dialog = require 'dialog'
@@ -22,12 +21,7 @@ class AtomWindow
{@resourcePath, pathToOpen, initialLine, @isSpec, @exitWhenDone} = settings
global.atomApplication.addWindow(this)
@setupNodePath(@resourcePath)
@browserWindow = new BrowserWindow show: false, title: 'Atom', icon: @constructor.iconPath
@browserWindow.restart = _.wrap _.bind(@browserWindow.restart, @browserWindow), (restart) =>
@setupNodePath(@resourcePath)
restart()
@handleEvents()
loadSettings = _.extend({}, settings)
@@ -50,9 +44,6 @@ class AtomWindow
@openPath(pathToOpen, initialLine)
setupNodePath: (resourcePath) ->
process.env['NODE_PATH'] = path.resolve(resourcePath, 'exports')
getUrl: (loadSettingsObj) ->
# Ignore the windowState when passing loadSettings via URL, since it could
# be quite large.
@@ -126,7 +117,7 @@ class AtomWindow
sendCommand: (command, args...) ->
if @isSpecWindow()
unless @sendCommandToFirstResponder(command)
unless global.atomApplication.sendCommandToFirstResponder(command)
switch command
when 'window:reload' then @reload()
when 'window:toggle-dev-tools' then @toggleDevTools()
@@ -134,24 +125,13 @@ class AtomWindow
else if @isWebViewFocused()
@sendCommandToBrowserWindow(command, args...)
else
unless @sendCommandToFirstResponder(command)
unless global.atomApplication.sendCommandToFirstResponder(command)
@sendCommandToBrowserWindow(command, args...)
sendCommandToBrowserWindow: (command, args...) ->
action = if args[0]?.contextCommand then 'context-command' else 'command'
ipc.sendChannel @browserWindow.getProcessId(), @browserWindow.getRoutingId(), action, command, args...
sendCommandToFirstResponder: (command) ->
switch command
when 'core:undo' then Menu.sendActionToFirstResponder('undo:')
when 'core:redo' then Menu.sendActionToFirstResponder('redo:')
when 'core:copy' then Menu.sendActionToFirstResponder('copy:')
when 'core:cut' then Menu.sendActionToFirstResponder('cut:')
when 'core:paste' then Menu.sendActionToFirstResponder('paste:')
when 'core:select-all' then Menu.sendActionToFirstResponder('selectAll:')
else return false
true
close: -> @browserWindow.close()
focus: -> @browserWindow.focus()
+1 -1
Ver Arquivo
@@ -77,7 +77,7 @@ parseCommandLine = ->
options.alias('h', 'help').boolean('h').describe('h', 'Print this usage message.')
options.alias('l', 'log-file').string('l').describe('l', 'Log all output to file.')
options.alias('n', 'new-window').boolean('n').describe('n', 'Open a new window.')
options.alias('s', 'spec-directory').string('s').describe('s', 'Set the directory from which specs are loaded (default: Atom\'s spec directory).')
options.alias('s', 'spec-directory').string('s').describe('s', 'Set the spec directory (default: Atom\'s spec directory).')
options.alias('t', 'test').boolean('t').describe('t', 'Run the specified specs and exit with error code on failures.')
options.alias('v', 'version').boolean('v').describe('v', 'Print the version.')
options.alias('w', 'wait').boolean('w').describe('w', 'Wait for window to be closed before returning.')
+1 -1
Ver Arquivo
@@ -146,7 +146,7 @@ class DisplayBufferMarker
@bufferMarker.setAttributes(attributes)
matchesAttributes: (attributes) ->
attributes = @displayBuffer.translateToBufferMarkerAttributes(attributes)
attributes = @displayBuffer.translateToBufferMarkerParams(attributes)
@bufferMarker.matchesAttributes(attributes)
# Destroys the marker
+34 -15
Ver Arquivo
@@ -215,6 +215,13 @@ class DisplayBuffer extends Model
largestFoldContainingBufferRow: (bufferRow) ->
@foldsContainingBufferRow(bufferRow)[0]
# Returns the folds in the given row range (exclusive of end row) that are
# not contained by any other folds.
outermostFoldsInBufferRowRange: (startRow, endRow) ->
@findFoldMarkers(containedInRange: [[startRow, 0], [endRow, 0]])
.map (marker) => @foldForMarker(marker)
.filter (fold) -> not fold.isInsideLargerFold()
# Public: Given a buffer row, this returns folds that include it.
#
#
@@ -519,24 +526,34 @@ class DisplayBuffer extends Model
# Refer to {DisplayBuffer::findMarkers} for details.
#
# Returns a {DisplayBufferMarker} or null
findMarker: (attributes) ->
@findMarkers(attributes)[0]
findMarker: (params) ->
@findMarkers(params)[0]
# Finds all valid markers satisfying the given attributes
# Public: Find all markers satisfying a set of parameters.
#
# attributes - The attributes against which to compare the markers' attributes
# There are some reserved keys that match against derived marker properties:
# startBufferRow - The buffer row at which the marker starts
# endBufferRow - The buffer row at which the marker ends
# params - An {Object} containing parameters that all returned markers must
# satisfy. Unreserved keys will be compared against the markers' custom
# properties. There are also the following reserved keys with special
# meaning for the query:
# :startBufferRow - A {Number}. Only returns markers starting at this row in
# buffer coordinates.
# :endBufferRow - A {Number}. Only returns markers ending at this row in
# buffer coordinates.
# :containsBufferRange - A {Range} or range-compatible {Array}. Only returns
# markers containing this range in buffer coordinates.
# :containsBufferPosition - A {Point} or point-compatible {Array}. Only
# returns markers containing this position in buffer coordinates.
# :containedInBufferRange - A {Range} or range-compatible {Array}. Only
# returns markers contained within this range.
#
# Returns an {Array} of {DisplayBufferMarker}s
findMarkers: (attributes) ->
attributes = @translateToBufferMarkerAttributes(attributes)
@buffer.findMarkers(attributes).map (stringMarker) => @getMarker(stringMarker.id)
findMarkers: (params) ->
params = @translateToBufferMarkerParams(params)
@buffer.findMarkers(params).map (stringMarker) => @getMarker(stringMarker.id)
translateToBufferMarkerAttributes: (attributes) ->
stringMarkerAttributes = {}
for key, value of attributes
translateToBufferMarkerParams: (params) ->
bufferMarkerParams = {}
for key, value of params
switch key
when 'startBufferRow'
key = 'startRow'
@@ -546,8 +563,10 @@ class DisplayBuffer extends Model
key = 'containsRange'
when 'containsBufferPosition'
key = 'containsPosition'
stringMarkerAttributes[key] = value
stringMarkerAttributes
when 'containedInBufferRange'
key = 'containedInRange'
bufferMarkerParams[key] = value
bufferMarkerParams
findFoldMarker: (attributes) ->
@findFoldMarkers(attributes)[0]
+50 -12
Ver Arquivo
@@ -20,7 +20,23 @@ LongLineLength = 1000
# ## Requiring in packages
#
# ```coffee
# {EditorView} = require 'atom'
# {EditorView} = require 'atom'
#
# miniEditorView = new EditorView(mini: true)
# ```
#
# ## Iterating over the open editor views
#
# ```coffee
# for editorView in atom.workspace.getEditorViews()
# console.log(editorView.getEditor().getPath())
# ```
#
# ## Subscribing to every current and future editor
#
# ```coffee
# atom.workspace.eachEditorView (editorView) ->
# console.log(editorView.getEditor().getPath())
# ```
module.exports =
class EditorView extends View
@@ -209,7 +225,7 @@ class EditorView extends View
'editor:copy-path': => @copyPathToClipboard()
'editor:move-line-up': => @editor.moveLineUp()
'editor:move-line-down': => @editor.moveLineDown()
'editor:duplicate-line': => @editor.duplicateLine()
'editor:duplicate-lines': => @editor.duplicateLines()
'editor:join-lines': => @editor.joinLines()
'editor:toggle-indent-guide': => atom.config.toggle('editor.showIndentGuide')
'editor:toggle-line-numbers': => atom.config.toggle('editor.showLineNumbers')
@@ -403,6 +419,8 @@ class EditorView extends View
@scrollView.on 'overflowchanged', =>
updateWidthInChars() if @[0].classList.contains('soft-wrap')
@subscribe atom.themes, 'stylesheets-changed', => @recalculateDimensions()
handleInputEvents: ->
@on 'cursor:moved', =>
return unless @isFocused
@@ -445,20 +463,29 @@ class EditorView extends View
selectOnMousemoveUntilMouseup: ->
lastMoveEvent = null
finalizeSelections = =>
clearInterval(interval)
$(document).off 'mousemove', moveHandler
$(document).off 'mouseup', finalizeSelections
unless @editor.isDestroyed()
@editor.mergeIntersectingSelections(isReversed: @editor.getLastSelection().isReversed())
@editor.finalizeSelections()
@syncCursorAnimations()
moveHandler = (event = lastMoveEvent) =>
if event
return unless event?
if event.which is 1 and @[0].style.display isnt 'none'
@editor.selectToScreenPosition(@screenPositionFromMouseEvent(event))
lastMoveEvent = event
else
finalizeSelections()
$(document).on "mousemove.editor-#{@id}", moveHandler
interval = setInterval(moveHandler, 20)
$(document).one "mouseup.editor-#{@id}", =>
clearInterval(interval)
$(document).off 'mousemove', moveHandler
@editor.mergeIntersectingSelections(isReversed: @editor.getLastSelection().isReversed())
@editor.finalizeSelections()
@syncCursorAnimations()
$(document).one "mouseup.editor-#{@id}", finalizeSelections
afterAttach: (onDom) ->
return unless onDom
@@ -857,6 +884,18 @@ class EditorView extends View
fragment.remove()
@setHeightInLines()
recalculateDimensions: ->
return unless @attached
oldCharWidth = @charWidth
oldLineHeight = @lineHeight
@calculateDimensions()
unless @charWidth is oldCharWidth and @lineHeight is oldLineHeight
@clearCharacterWidthCache()
@requestDisplayUpdate()
updateLayerDimensions: ->
height = @lineHeight * @editor.getScreenLineCount()
unless @layerHeight == height
@@ -964,8 +1003,7 @@ class EditorView extends View
(startRow <= @firstRenderedScreenRow and endRow >= @lastRenderedScreenRow) # selection surrounds the rendered items
syncCursorAnimations: ->
for cursorView in @getCursorViews()
do (cursorView) -> cursorView.resetBlinking()
cursorView.resetBlinking() for cursorView in @getCursorViews()
autoscroll: (options={}) ->
for cursorView in @getCursorViews()
+50 -28
Ver Arquivo
@@ -373,10 +373,16 @@ class Editor extends Model
#
# bufferRow - A {Number} indicating the buffer row.
# newLevel - A {Number} indicating the new indentation level.
setIndentationForBufferRow: (bufferRow, newLevel) ->
currentIndentLength = @lineForBufferRow(bufferRow).match(/^\s*/)[0].length
# options - An {Object} with the following keys:
# :preserveLeadingWhitespace - true to preserve any whitespace already at
# the beginning of the line (default: false).
setIndentationForBufferRow: (bufferRow, newLevel, {preserveLeadingWhitespace}={}) ->
if preserveLeadingWhitespace
endColumn = 0
else
endColumn = @lineForBufferRow(bufferRow).match(/^\s*/)[0].length
newIndentString = @buildIndentString(newLevel)
@buffer.change([[bufferRow, 0], [bufferRow, currentIndentLength]], newIndentString)
@buffer.change([[bufferRow, 0], [bufferRow, endColumn]], newIndentString)
# Public: Get the indentation level of the given line of text.
#
@@ -400,17 +406,23 @@ class Editor extends Model
# Constructs the string used for tabs.
buildIndentString: (number) ->
if @getSoftTabs()
_.multiplyString(" ", number * @getTabLength())
_.multiplyString(" ", Math.floor(number * @getTabLength()))
else
_.multiplyString("\t", Math.floor(number))
# {Delegates to: TextBuffer.save}
# Public: Saves the editor's text buffer.
#
# See {TextBuffer::save} for more details.
save: -> @buffer.save()
# {Delegates to: TextBuffer.saveAs}
saveAs: (path) -> @buffer.saveAs(path)
# Public: Saves the editor's text buffer as the given path.
#
# See {TextBuffer::saveAs} for more details.
#
# filePath - A {String} path.
saveAs: (filePath) -> @buffer.saveAs(filePath)
# {Delegates to: TextBuffer.getPath}
# Public: Returns the {String} path of this editor's text buffer.
getPath: -> @buffer.getPath()
# Public: Returns a {String} representing the entire contents of the editor.
@@ -679,7 +691,7 @@ class Editor extends Model
# {Range}.
normalizeTabsInBufferRange: (bufferRange) ->
return unless @getSoftTabs()
@scanInBufferRange /\t/, bufferRange, ({replace}) => replace(@getTabText())
@scanInBufferRange /\t/g, bufferRange, ({replace}) => replace(@getTabText())
# Public: For each selection, if the selection is empty, cut all characters
# of the containing line following the cursor. Otherwise cut the selected
@@ -838,6 +850,10 @@ class Editor extends Model
largestFoldStartingAtScreenRow: (screenRow) ->
@displayBuffer.largestFoldStartingAtScreenRow(screenRow)
# {Delegates to: DisplayBuffer.outermostFoldsForBufferRowRange}
outermostFoldsInBufferRowRange: (startRow, endRow) ->
@displayBuffer.outermostFoldsInBufferRowRange(startRow, endRow)
# Move lines intersection the most recent selection up by one row in screen
# coordinates.
moveLineUp: ->
@@ -948,28 +964,34 @@ class Editor extends Model
@setSelectedBufferRange(selection.translate([insertDelta]), preserveFolds: true)
# Duplicate the most recent cursor's current line.
duplicateLine: ->
return unless @getSelection().isEmpty()
duplicateLines: ->
@transact =>
cursorPosition = @getCursorBufferPosition()
cursorRowFolded = @isFoldedAtCursorRow()
if cursorRowFolded
screenRow = @screenPositionForBufferPosition(cursorPosition).row
bufferRange = @bufferRangeForScreenRange([[screenRow], [screenRow + 1]])
else
bufferRange = new Range([cursorPosition.row], [cursorPosition.row + 1])
for selection in @getSelectionsOrderedByBufferPosition().reverse()
selectedBufferRange = selection.getBufferRange()
if selection.isEmpty()
{start} = selection.getScreenRange()
selection.selectToScreenPosition([start.row + 1, 0])
insertPosition = new Point(bufferRange.end.row)
if insertPosition.row > @buffer.getLastRow()
@unfoldCurrentRow() if cursorRowFolded
@buffer.append("\n#{@getTextInBufferRange(bufferRange)}")
@foldCurrentRow() if cursorRowFolded
else
@buffer.insert(insertPosition, @getTextInBufferRange(bufferRange))
[startRow, endRow] = selection.getBufferRowRange()
endRow++
@setCursorScreenPosition(@getCursorScreenPosition().translate([1]))
@foldCurrentRow() if cursorRowFolded
foldedRowRanges =
@outermostFoldsInBufferRowRange(startRow, endRow)
.map (fold) -> fold.getBufferRowRange()
rangeToDuplicate = [[startRow, 0], [endRow, 0]]
textToDuplicate = @getTextInBufferRange(rangeToDuplicate)
textToDuplicate = '\n' + textToDuplicate if endRow > @getLastBufferRow()
@buffer.insert([endRow, 0], textToDuplicate)
delta = endRow - startRow
selection.setBufferRange(selectedBufferRange.translate([delta, 0]))
for [foldStartRow, foldEndRow] in foldedRowRanges
@createFold(foldStartRow + delta, foldEndRow + delta)
# Deprecated: Use {::duplicateLines} instead.
duplicateLine: ->
@duplicateLines()
mutateSelectedText: (fn) ->
@transact => fn(selection) for selection in @getSelections()
+4
Ver Arquivo
@@ -41,6 +41,10 @@ class Fold
range.end.column = 0
range
getBufferRowRange: ->
{start, end} = @getBufferRange()
[start.row, end.row]
# Returns the fold's start row as a {Number}.
getStartRow: ->
@getBufferRange().start.row
-63
Ver Arquivo
@@ -1,63 +0,0 @@
_ = require 'underscore-plus'
fs = require 'fs-plus'
{specificity} = require 'clear-cut'
module.exports =
class KeyBinding
@parser: null
@currentIndex: 1
@specificities: null
@calculateSpecificity: (selector) ->
@specificities ?= {}
value = @specificities[selector]
unless value?
value = specificity(selector)
@specificities[selector] = value
value
@normalizeKeystroke: (keystroke) ->
normalizedKeystroke = keystroke.split(/\s+/).map (keystroke) =>
keys = @parseKeystroke(keystroke)
modifiers = keys[0...-1]
modifiers.sort()
key = _.last(keys)
modifiers.push 'shift' if /^[A-Z]$/.test(key) and 'shift' not in modifiers
key = key.toUpperCase() if /^[a-z]$/.test(key) and 'shift' in modifiers
[modifiers..., key].join('-')
normalizedKeystroke.join(' ')
@parseKeystroke: (keystroke) ->
unless @parser?
try
@parser = require './keystroke-pattern'
catch
keystrokePattern = fs.readFileSync(require.resolve('./keystroke-pattern.pegjs'), 'utf8')
PEG = require 'pegjs'
@parser = PEG.buildParser(keystrokePattern)
@parser.parse(keystroke)
constructor: (source, command, keystroke, selector) ->
@source = source
@command = command
@keystroke = KeyBinding.normalizeKeystroke(keystroke)
@selector = selector.replace(/!important/g, '')
@specificity = KeyBinding.calculateSpecificity(selector)
@index = KeyBinding.currentIndex++
matches: (keystroke) ->
multiKeystroke = /\s/.test keystroke
if multiKeystroke
keystroke == @keystroke
else
keystroke.split(' ')[0] == @keystroke.split(' ')[0]
compare: (keyBinding) ->
if keyBinding.specificity == @specificity
keyBinding.index - @index
else
keyBinding.specificity - @specificity
+27
Ver Arquivo
@@ -0,0 +1,27 @@
fs = require 'fs-plus'
path = require 'path'
Keymap = require 'atom-keymap'
CSON = require 'season'
{jQuery} = require 'space-pen'
Keymap::loadBundledKeymaps = ->
@loadKeyBindings(path.join(@resourcePath, 'keymaps'))
@emit('bundled-keymaps-loaded')
Keymap::getUserKeymapPath = ->
if userKeymapPath = CSON.resolve(path.join(@configDirPath, 'keymap'))
userKeymapPath
else
path.join(@configDirPath, 'keymap.cson')
Keymap::loadUserKeymap = ->
userKeymapPath = @getUserKeymapPath()
if fs.isFileSync(userKeymapPath)
@loadKeyBindings(userKeymapPath, watch: true, suppressErrors: true)
# This enables command handlers registered via jQuery to call
# `.abortKeyBinding()` on the `jQuery.Event` object passed to the handler.
jQuery.Event::abortKeyBinding = ->
@originalEvent?.abortKeyBinding?()
module.exports = Keymap
-223
Ver Arquivo
@@ -1,223 +0,0 @@
{$} = require './space-pen-extensions'
_ = require 'underscore-plus'
fs = require 'fs-plus'
path = require 'path'
CSON = require 'season'
KeyBinding = require './key-binding'
{File} = require 'pathwatcher'
{Emitter} = require 'emissary'
Modifiers = ['alt', 'control', 'ctrl', 'shift', 'cmd']
# Public: Associates keybindings with commands.
#
# An instance of this class is always available as the `atom.keymap` global.
#
# Keymaps are defined in a CSON/JSON format. A typical keymap looks something
# like this:
#
# ```cson
# 'body':
# 'ctrl-l': 'package:do-something'
# '.someClass':
# 'enter': 'package:confirm'
# ```
#
# As a key, you define the DOM element you want to work on, using CSS notation.
# For that key, you define one or more key:value pairs, associating keystrokes
# with a command to execute.
module.exports =
class Keymap
Emitter.includeInto(this)
constructor: ({@resourcePath, @configDirPath})->
@keyBindings = []
destroy: ->
@unwatchUserKeymap()
# Public: Returns an array of all {KeyBinding}s.
getKeyBindings: ->
_.clone(@keyBindings)
# Public: Returns a array of {KeyBinding}s (sorted by selector specificity)
# that match a keystroke and element.
#
# keystroke - The {String} representing the keys pressed (e.g. ctrl-P).
# element - The DOM node that will match a {KeyBinding}'s selector.
keyBindingsForKeystrokeMatchingElement: (keystroke, element) ->
keyBindings = @keyBindingsForKeystroke(keystroke)
@keyBindingsMatchingElement(element, keyBindings)
# Public: Returns a array of {KeyBinding}s (sorted by selector specificity)
# that match a command.
#
# command - The {String} representing the command (tree-view:toggle).
# element - The DOM node that will match a {KeyBinding}'s selector.
keyBindingsForCommandMatchingElement: (command, element) ->
keyBindings = @keyBindingsForCommand(command)
@keyBindingsMatchingElement(element, keyBindings)
# Public: Returns an array of {KeyBinding}s that match a keystroke
#
# keystroke: The {String} representing the keys pressed (e.g. ctrl-P)
keyBindingsForKeystroke: (keystroke) ->
keystroke = KeyBinding.normalizeKeystroke(keystroke)
@keyBindings.filter (keyBinding) -> keyBinding.matches(keystroke)
# Public: Returns an array of {KeyBinding}s that match a command
#
# keystroke - The {String} representing the keys pressed (e.g. ctrl-P)
keyBindingsForCommand: (command) ->
@keyBindings.filter (keyBinding) -> keyBinding.command == command
# Public: Returns a array of {KeyBinding}s (sorted by selector specificity)
# whos selector matches the element.
#
# element - The DOM node that will match a {KeyBinding}'s selector.
keyBindingsMatchingElement: (element, keyBindings=@keyBindings) ->
keyBindings = keyBindings.filter ({selector}) -> $(element).closest(selector).length > 0
keyBindings.sort (a, b) -> a.compare(b)
# Public: Returns a keystroke string derived from an event.
#
# event - A DOM or jQuery event.
# previousKeystroke - An optional string used for multiKeystrokes.
keystrokeStringForEvent: (event, previousKeystroke) ->
if event.originalEvent.keyIdentifier.indexOf('U+') == 0
hexCharCode = event.originalEvent.keyIdentifier[2..]
charCode = parseInt(hexCharCode, 16)
charCode = event.which if !@isAscii(charCode) and @isAscii(event.which)
key = @keyFromCharCode(charCode)
else
key = event.originalEvent.keyIdentifier.toLowerCase()
modifiers = []
if event.altKey and key not in Modifiers
modifiers.push 'alt'
if event.metaKey and key not in Modifiers
modifiers.push 'cmd'
if event.ctrlKey and key not in Modifiers
modifiers.push 'ctrl'
if event.shiftKey and key not in Modifiers
# Don't push the shift modifier on single letter non-alpha keys (e.g. { or ')
modifiers.push 'shift' unless /^[^a-z]$/i.test(key)
if 'shift' in modifiers and /^[a-z]$/i.test(key)
key = key.toUpperCase()
else
key = key.toLowerCase()
keystroke = [modifiers..., key].join('-')
if previousKeystroke
if keystroke in Modifiers
previousKeystroke
else
"#{previousKeystroke} #{keystroke}"
else
keystroke
loadBundledKeymaps: ->
@loadDirectory(path.join(@resourcePath, 'keymaps'))
@emit('bundled-keymaps-loaded')
getUserKeymapPath: ->
if userKeymapPath = CSON.resolve(path.join(@configDirPath, 'keymap'))
userKeymapPath
else
path.join(@configDirPath, 'keymap.cson')
unwatchUserKeymap: ->
@userKeymapFile?.off()
@remove(@userKeymapPath) if @userKeymapPath?
loadUserKeymap: ->
@unwatchUserKeymap()
userKeymapPath = @getUserKeymapPath()
if fs.isFileSync(userKeymapPath)
@userKeymapPath = userKeymapPath
@userKeymapFile = new File(userKeymapPath)
@userKeymapFile.on 'contents-changed moved removed', => @loadUserKeymap()
@add(@userKeymapPath, @readUserKeymap())
readUserKeymap: ->
try
CSON.readFileSync(@userKeymapPath) ? {}
catch error
console.warn("Failed to load your keymap file: #{@userKeymapPath}", error.stack ? error)
{}
loadDirectory: (directoryPath) ->
platforms = ['darwin', 'freebsd', 'linux', 'sunos', 'win32']
otherPlatforms = platforms.filter (name) -> name != process.platform
for filePath in fs.listSync(directoryPath, ['.cson', '.json'])
continue if path.basename(filePath, path.extname(filePath)) in otherPlatforms
@load(filePath)
load: (path) ->
@add(path, CSON.readFileSync(path))
add: (source, keyMappingsBySelector) ->
for selector, keyMappings of keyMappingsBySelector
@bindKeys(source, selector, keyMappings)
remove: (source) ->
@keyBindings = @keyBindings.filter (keyBinding) -> keyBinding.source isnt source
bindKeys: (source, selector, keyMappings) ->
for keystroke, command of keyMappings
keyBinding = new KeyBinding(source, command, keystroke, selector)
try
$(keyBinding.selector) # Verify selector is valid before registering
@keyBindings.push(keyBinding)
catch
console.warn("Keybinding '#{keystroke}': '#{command}' in #{source} has an invalid selector: '#{selector}'")
handleKeyEvent: (event) ->
element = event.target
element = atom.workspaceView if element == document.body
keystroke = @keystrokeStringForEvent(event, @queuedKeystroke)
keyBindings = @keyBindingsForKeystrokeMatchingElement(keystroke, element)
if keyBindings.length == 0 and @queuedKeystroke
@queuedKeystroke = null
return false
else
@queuedKeystroke = null
for keyBinding in keyBindings
partialMatch = keyBinding.keystroke isnt keystroke
if partialMatch
@queuedKeystroke = keystroke
shouldBubble = false
else
if keyBinding.command is 'native!'
shouldBubble = true
else if @triggerCommandEvent(element, keyBinding.command, event)
shouldBubble = false
break if shouldBubble?
shouldBubble ? true
triggerCommandEvent: (element, commandName, event) ->
commandEvent = $.Event(commandName)
commandEvent.originalEvent = event
commandEvent.abortKeyBinding = -> commandEvent.stopImmediatePropagation()
$(element).trigger(commandEvent)
not commandEvent.isImmediatePropagationStopped()
isAscii: (charCode) ->
0 <= charCode <= 127
keyFromCharCode: (charCode) ->
switch charCode
when 8 then 'backspace'
when 9 then 'tab'
when 13 then 'enter'
when 27 then 'escape'
when 32 then 'space'
when 127 then 'delete'
else String.fromCharCode(charCode)
-3
Ver Arquivo
@@ -1,3 +0,0 @@
keystrokePattern = key:key additionalKeys:additionalKey* { return [key].concat(additionalKeys); }
additionalKey = '-' key:key { return key; }
key = '-' / chars:[^-]+ { return chars.join('') }
+6 -5
Ver Arquivo
@@ -39,13 +39,13 @@ class LanguageMode
return unless commentStartString
buffer = @editor.buffer
commentStartRegexString = _.escapeRegExp(commentStartString).replace(/(\s+)$/, '($1)?')
commentStartRegexString = _.escapeRegExp(commentStartString).replace(/(\s+)$/, '(?:$1)?')
commentStartRegex = new OnigRegExp("^(\\s*)(#{commentStartRegexString})")
shouldUncomment = commentStartRegex.test(buffer.lineForRow(start))
if commentEndString
if shouldUncomment
commentEndRegexString = _.escapeRegExp(commentEndString).replace(/^(\s+)/, '($1)?')
commentEndRegexString = _.escapeRegExp(commentEndString).replace(/^(\s+)/, '(?:$1)?')
commentEndRegex = new OnigRegExp("(#{commentEndRegexString})(\\s*)$")
startMatch = commentStartRegex.search(buffer.lineForRow(start))
endMatch = commentEndRegex.search(buffer.lineForRow(end))
@@ -265,10 +265,11 @@ class LanguageMode
# Given a buffer row, this indents it.
#
# bufferRow - The row {Number}
autoIndentBufferRow: (bufferRow) ->
# bufferRow - The row {Number}.
# options - An options {Object} to pass through to {Editor::setIndentationForBufferRow}.
autoIndentBufferRow: (bufferRow, options) ->
indentLevel = @suggestedIndentForBufferRow(bufferRow)
@editor.setIndentationForBufferRow(bufferRow, indentLevel)
@editor.setIndentationForBufferRow(bufferRow, indentLevel, options)
# Given a buffer row, this decreases the indentation.
#
+14 -2
Ver Arquivo
@@ -69,7 +69,7 @@ class Package
@loadStylesheets()
@grammarsPromise = @loadGrammars()
@scopedPropertiesPromise = @loadScopedProperties()
@requireMainModule() unless @metadata.activationEvents?
@requireMainModule() unless @hasActivationEvents()
catch error
console.warn "Failed to load package named '#{@name}'", error.stack ? error
@@ -87,7 +87,7 @@ class Package
@activationDeferred = Q.defer()
@measure 'activateTime', =>
@activateResources()
if @metadata.activationEvents?
if @hasActivationEvents()
@subscribeToActivationEvents()
else
@activateNow()
@@ -262,6 +262,18 @@ class Package
path.join(@path, 'index')
@mainModulePath = fs.resolveExtension(mainModulePath, ["", _.keys(require.extensions)...])
hasActivationEvents: ->
if _.isArray(@metadata.activationEvents)
return @metadata.activationEvents.some (activationEvent) ->
activationEvent?.length > 0
else if _.isString(@metadata.activationEvents)
return @metadata.activationEvents.length > 0
else if _.isObject(@metadata.activationEvents)
for event, selector of @metadata.activationEvents
return true if event.length > 0 and selector.length > 0
false
subscribeToActivationEvents: ->
return unless @metadata.activationEvents?
if _.isArray(@metadata.activationEvents)
+3 -1
Ver Arquivo
@@ -75,7 +75,9 @@ class PaneView extends View
@command 'pane:split-right', => @splitRight(@copyActiveItem())
@command 'pane:split-up', => @splitUp(@copyActiveItem())
@command 'pane:split-down', => @splitDown(@copyActiveItem())
@command 'pane:close', => @model.destroy()
@command 'pane:close', =>
@model.destroyItems()
@model.destroy()
@command 'pane:close-other-items', => @destroyInactiveItems()
# Deprecated: Use ::destroyItem
+3 -5
Ver Arquivo
@@ -1,5 +1,4 @@
{find, compact, extend, last} = require 'underscore-plus'
{dirname} = require 'path'
{Model, Sequence} = require 'theorist'
Serializable = require 'serializable'
PaneAxis = require './pane-axis'
@@ -265,10 +264,9 @@ class Pane extends Model
return unless item?.saveAs?
itemPath = item.getPath?()
itemPath = dirname(itemPath) if itemPath
path = atom.showSaveDialogSync(itemPath)
if path
item.saveAs(path)
newItemPath = atom.showSaveDialogSync(itemPath)
if newItemPath
item.saveAs(newItemPath)
nextAction?()
# Public: Saves all items.
+2 -2
Ver Arquivo
@@ -153,8 +153,8 @@ class SelectListView extends View
for i in [0...Math.min(filteredItems.length, @maxItems)]
item = filteredItems[i]
itemView = @viewForItem(item)
$(itemView).data('select-list-item', item)
itemView = $(@viewForItem(item))
itemView.data('select-list-item', item)
@list.append(itemView)
@selectItemView(@list.find('li:first'))
+4 -2
Ver Arquivo
@@ -1,4 +1,4 @@
{Range} = require 'text-buffer'
{Point, Range} = require 'text-buffer'
{Emitter} = require 'emissary'
{pick} = require 'underscore-plus'
@@ -141,6 +141,8 @@ class Selection
#
# position - An instance of {Point}, with a given `row` and `column`.
selectToScreenPosition: (position) ->
position = Point.fromObject(position)
@modifySelection =>
if @initialScreenRange
if position.isLessThan(@initialScreenRange.start)
@@ -299,7 +301,7 @@ class Selection
if options.autoIndent
@editor.autoIndentBufferRow(row) for row in newBufferRange.getRows()
else if options.autoIndentNewline and text == '\n'
@editor.autoIndentBufferRow(newBufferRange.end.row)
@editor.autoIndentBufferRow(newBufferRange.end.row, preserveLeadingWhitespace: true)
else if options.autoDecreaseIndent and /\S/.test text
@editor.autoDecreaseIndentForBufferRow(newBufferRange.start.row)
+1 -1
Ver Arquivo
@@ -87,7 +87,7 @@ class Task
if _.isFunction(callback)
@callback = callback
else
args = arguments
args.push(callback)
@send({event: 'start', args})
# Public: Send message to the task.
+2
Ver Arquivo
@@ -191,6 +191,7 @@ class ThemeManager
removeStylesheet: (stylesheetPath) ->
fullPath = @resolveStylesheet(stylesheetPath) ? stylesheetPath
@stylesheetElementForId(@stringToId(fullPath)).remove()
@emit 'stylesheets-changed'
applyStylesheet: (path, text, ttype = 'bundled', htmlElement=$('html')) ->
styleElement = @stylesheetElementForId(@stringToId(path), htmlElement)
@@ -201,3 +202,4 @@ class ThemeManager
htmlElement.find("head style.#{ttype}:last").after "<style class='#{ttype}' id='#{@stringToId(path)}'>#{text}</style>"
else
htmlElement.find("head").append "<style class='#{ttype}' id='#{@stringToId(path)}'>#{text}</style>"
@emit 'stylesheets-changed'
+2 -2
Ver Arquivo
@@ -20,7 +20,7 @@ class TokenizedBuffer extends Model
visible: false
constructor: ({@buffer, @tabLength}) ->
@tabLength ?= atom.config.get('editor.tabLength') ? 2
@tabLength ?= atom.config.getPositiveInt('editor.tabLength', 2)
@subscribe atom.syntax, 'grammar-added grammar-updated', (grammar) =>
if grammar.injectionSelector?
@@ -40,7 +40,7 @@ class TokenizedBuffer extends Model
@emit "changed", { start: 0, end: lastRow, delta: 0 }
@subscribe atom.config.observe 'editor.tabLength', callNow: false, =>
@setTabLength(atom.config.getPositiveInt('editor.tabLength'))
@setTabLength(atom.config.getPositiveInt('editor.tabLength', 2))
@reloadGrammar()
+1 -1
Ver Arquivo
@@ -196,7 +196,7 @@ class Workspace extends Model
# Public: Make the next pane active.
activateNextPane: ->
@paneContainer.activateNext()
@paneContainer.activateNextPane()
# Public: Make the previous pane active.
activatePreviousPane: ->
+2 -32
Ver Arquivo
@@ -3,39 +3,9 @@
<head>
<title></title>
<script>
window.onload = function() {
var path = require('path');
var ipc = require('ipc');
try {
// Skip "?loadSettings=".
var loadSettings = JSON.parse(decodeURIComponent(location.search.substr(14)));
<meta http-equiv="Content-Security-Policy" content="default-src *; script-src 'self'; style-src 'self' 'unsafe-inline';">
// Start the crash reporter before anything else.
require('crash-reporter').start({
productName: 'Atom',
companyName: 'GitHub',
// By explicitly passing the app version here, we could save the call
// of "require('remote').require('app').getVersion()".
extra: {_version: loadSettings.appVersion}
});
require('vm-compatibility-layer');
require('coffee-script').register();
require(path.resolve(__dirname, '..', 'src', 'coffee-cache')).register();
require(loadSettings.bootstrapScript);
ipc.sendChannel('window-command', 'window:loaded')
}
catch (error) {
var currentWindow = require('remote').getCurrentWindow();
currentWindow.setSize(800, 600);
currentWindow.center();
currentWindow.show();
currentWindow.openDevTools();
console.error(error.stack || error);
}
}
</script>
<script src="index.js"></script>
</head>
<body tabindex="-1">
</body>
+31
Ver Arquivo
@@ -0,0 +1,31 @@
window.onload = function() {
var path = require('path');
var ipc = require('ipc');
try {
// Skip "?loadSettings=".
var loadSettings = JSON.parse(decodeURIComponent(location.search.substr(14)));
// Start the crash reporter before anything else.
require('crash-reporter').start({
productName: 'Atom',
companyName: 'GitHub',
// By explicitly passing the app version here, we could save the call
// of "require('remote').require('app').getVersion()".
extra: {_version: loadSettings.appVersion}
});
require('vm-compatibility-layer');
require('coffee-script').register();
require(path.resolve(__dirname, '..', 'src', 'coffee-cache')).register();
require(loadSettings.bootstrapScript);
ipc.sendChannel('window-command', 'window:loaded')
}
catch (error) {
var currentWindow = require('remote').getCurrentWindow();
currentWindow.setSize(800, 600);
currentWindow.center();
currentWindow.show();
currentWindow.openDevTools();
console.error(error.stack || error);
}
}
externo
+1 -1
Submodule vendor/apm updated: 9ca4f9ffc7...b85d052154