├── Snippets ├── error.tmSnippet ├── debug.tmSnippet ├── p.tmSnippet ├── puts.tmSnippet ├── mixin.tmSnippet ├── app.tmSnippet ├── _addCallback.tmSnippet ├── _addErrback.tmSnippet ├── _addCancelback.tmSnippet ├── require.tmSnippet ├── rmdir.tmSnippet ├── _addListener.tmSnippet ├── exec.tmSnippet ├── mkdir.tmSnippet ├── rename.tmSnippet ├── hashbang.tmSnippet ├── readdir.tmSnippet ├── cat.tmSnippet ├── stat.tmSnippet └── exports.tmSnippet ├── Syntaxes └── JavaScript Node.tmLanguage ├── Commands └── Run File or Spec.tmCommand ├── README.md └── info.plist /Snippets/error.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | sys.error(${1:'${2:ALERT}'}); 7 | name 8 | error 9 | scope 10 | source.js.node 11 | tabTrigger 12 | err 13 | uuid 14 | 0DE90632-511B-4AE1-B8D0-494702E8748E 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/debug.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | sys.debug(${1:'${2:hello world}'}); 7 | name 8 | debug 9 | scope 10 | source.js.node 11 | tabTrigger 12 | deb 13 | uuid 14 | D95BACCA-897E-4F09-9576-76A9C528FD28 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/p.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | sys.${1:p}(${2:'${3:hello world}'}); 7 | name 8 | p/puts/print 9 | scope 10 | source.js.node 11 | tabTrigger 12 | p 13 | uuid 14 | B820ECC8-CA27-4EFF-B14F-BC002C4AFE0B 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/puts.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | sys.puts(${1:'${2:hello world}'}); 7 | name 8 | puts 9 | scope 10 | source.js.node 11 | tabTrigger 12 | puts 13 | uuid 14 | B250F874-11E1-4C13-9E9E-EDE16DB6C1C6 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/mixin.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | process.mixin(${1:exports}, { 7 | $0 8 | }); 9 | name 10 | mixin 11 | scope 12 | source.js.node 13 | tabTrigger 14 | mixin 15 | uuid 16 | E114B311-9CD7-422E-BBDB-DF8930F5C5CD 17 | 18 | 19 | -------------------------------------------------------------------------------- /Snippets/app.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | if (module.id == require.main.id) { 7 | $0 8 | } 9 | 10 | name 11 | app 12 | scope 13 | source.js.node 14 | tabTrigger 15 | app 16 | uuid 17 | B79BFD7D-FF06-402C-B2BA-F80EC68834D1 18 | 19 | 20 | -------------------------------------------------------------------------------- /Snippets/_addCallback.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | .addCallback(function(${1:e}) { 7 | $0 8 | }); 9 | name 10 | .addCallback 11 | scope 12 | source.js.node 13 | tabTrigger 14 | .cb 15 | uuid 16 | 9D08A939-64FB-42F6-BE49-774D1BFB3954 17 | 18 | 19 | -------------------------------------------------------------------------------- /Snippets/_addErrback.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | .addErrback(function(${1:e}) { 7 | $0 8 | }); 9 | name 10 | .addErrback 11 | scope 12 | source.js.node 13 | tabTrigger 14 | .errb 15 | uuid 16 | 7598842A-4E1A-4744-BAC6-EFB1256D6021 17 | 18 | 19 | -------------------------------------------------------------------------------- /Snippets/_addCancelback.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | .addCancelback(function(${1:e}) { 7 | $0 8 | }); 9 | name 10 | .addCancelback 11 | scope 12 | source.js.node 13 | tabTrigger 14 | .canb 15 | uuid 16 | 9D54AD88-5150-4959-934A-307C587BB3AC 17 | 18 | 19 | -------------------------------------------------------------------------------- /Snippets/require.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | var ${2:${1/(?:_|-)([A-Za-z0-9]+)(?:\.js)?/(?2::\u$1)/g}} = require('${1:sys}')$0; 7 | name 8 | require 9 | scope 10 | source.js.node 11 | tabTrigger 12 | req 13 | uuid 14 | 59AF7588-E4A5-4BD4-8CF0-50EDB8068520 15 | 16 | 17 | -------------------------------------------------------------------------------- /Snippets/rmdir.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | posix.rmdir(${1:'${2:path}'})${5:.addCallback(function() { 7 | $0 8 | \})}; 9 | 10 | name 11 | rmdir 12 | scope 13 | source.js.node 14 | tabTrigger 15 | rmdir 16 | uuid 17 | 7744B7DE-9DB0-48A2-A5F1-D15F54CEEEA1 18 | 19 | 20 | -------------------------------------------------------------------------------- /Snippets/_addListener.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | .addListener("${1:event}", function(${1:data}) { 7 | $0 8 | }); 9 | 10 | name 11 | .addListener 12 | scope 13 | source.js.node 14 | tabTrigger 15 | .lis 16 | uuid 17 | 180C087D-09AE-4F15-8861-2ED02DDD673F 18 | 19 | 20 | -------------------------------------------------------------------------------- /Snippets/exec.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | sys.exec(${1:'${2:ls -al}'})${5:.addCallback(function (stdout, stderr) { 7 | $0 8 | \})}; 9 | name 10 | exec 11 | scope 12 | source.js.node 13 | tabTrigger 14 | exec 15 | uuid 16 | C215A7E3-0F51-4671-99C8-D79DA19D9B02 17 | 18 | 19 | -------------------------------------------------------------------------------- /Snippets/mkdir.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | posix.mkdir(${1:'${2:path}'}, ${3:'${4:mode}'})${5:.addCallback(function() { 7 | $0 8 | \})}; 9 | 10 | name 11 | mkdir 12 | scope 13 | source.js.node 14 | tabTrigger 15 | rmdir 16 | uuid 17 | D63101FB-D494-44CD-BE60-F26F68FF6BE3 18 | 19 | 20 | -------------------------------------------------------------------------------- /Snippets/rename.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | posix.rename(${1:'${2:from}'}, ${3:'${4:to}'})${5:.addCallback(function() { 7 | $0 8 | \})}; 9 | 10 | name 11 | rename 12 | scope 13 | source.js.node 14 | tabTrigger 15 | ren 16 | uuid 17 | 0D22ED48-FA6C-4B12-ADE8-9A40A556DFCA 18 | 19 | 20 | -------------------------------------------------------------------------------- /Snippets/hashbang.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | #!/usr/local/bin/node 7 | 8 | ${1:require.paths.push(__dirname); 9 | process.chdir(__dirname); 10 | } 11 | $0 12 | name 13 | hashbang 14 | scope 15 | source.js.node 16 | tabTrigger 17 | #! 18 | uuid 19 | 1D449A2E-5814-4E34-A833-8770873E7ED4 20 | 21 | 22 | -------------------------------------------------------------------------------- /Snippets/readdir.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | posix.readdir(${1:'${2:path}'})${5:.addCallback(function(files) { 7 | ${10:sys.p(files);}$0 8 | \})}; 9 | 10 | name 11 | readdir 12 | scope 13 | source.js.node 14 | tabTrigger 15 | readdir 16 | uuid 17 | D2F95B9E-1273-477A-9018-05C91E8653B4 18 | 19 | 20 | -------------------------------------------------------------------------------- /Snippets/cat.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | posix.cat(${1:'${2:path}'}${3:, '${4:utf8}'})${5:.addCallback(function(content) { 7 | ${10:sys.puts(content);}$0 8 | \})}; 9 | 10 | name 11 | cat 12 | scope 13 | source.js.node 14 | tabTrigger 15 | cat 16 | uuid 17 | 483223F6-814F-4836-A105-DE8F6BA56281 18 | 19 | 20 | -------------------------------------------------------------------------------- /Snippets/stat.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | posix.stat(${1:'${2:path}'}).addCallback(function(stats) { 7 | ${10:sys.puts("stats: " + JSON.stringify(stats));}$0 8 | }); 9 | 10 | name 11 | stat 12 | scope 13 | source.js.node 14 | tabTrigger 15 | stat 16 | uuid 17 | F430F77A-4D98-4D2D-B816-87B963A61717 18 | 19 | 20 | -------------------------------------------------------------------------------- /Snippets/exports.tmSnippet: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | content 6 | `#!/usr/bin/env ruby 7 | if File.read(ENV['TM_FILEPATH']) =~ /^var ([\w_]*?) = exports;/m 8 | print $1 9 | else 10 | print "exports" 11 | end 12 | `.${2:name} = function(${3:arguments}) { 13 | $0 14 | }; 15 | name 16 | exports 17 | scope 18 | source.js.node 19 | tabTrigger 20 | exp 21 | uuid 22 | 5997D597-577F-4521-86D8-7119B0D86D1B 23 | 24 | 25 | -------------------------------------------------------------------------------- /Syntaxes/JavaScript Node.tmLanguage: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | comment 6 | node.js 7 | foldingStartMarker 8 | (^.*{[^}]*$|^.*\([^\)]*$|^.*/\*(?!.*\*/).*$) 9 | foldingStopMarker 10 | (^\s*\}|^\s*\)|^(?!.*/\*).*\*/) 11 | keyEquivalent 12 | ^~N 13 | name 14 | JavaScript Node 15 | patterns 16 | 17 | 18 | match 19 | \b(exports)\b 20 | name 21 | variable.language.module.js 22 | 23 | 24 | include 25 | source.js 26 | 27 | 28 | scopeName 29 | source.js.node 30 | uuid 31 | 17076F45-FE22-4123-AD00-0C8E31BC2EB8 32 | 33 | 34 | -------------------------------------------------------------------------------- /Commands/Run File or Spec.tmCommand: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | beforeRunningCommand 6 | saveActiveFile 7 | command 8 | #!/usr/bin/env node 9 | 10 | // NOTE: This original implementation has support for running node.js/express web application jspec test files. This will be extracted into a separate bundle + command at some stage. 11 | 12 | var sys = require("sys"); 13 | if(process.ENV.TM_FILENAME.match(/(.*)spec\.js/)) { 14 | require.paths.unshift(process.ENV.TM_BUNDLE_SUPPORT + '/spec/lib'); 15 | if (typeof process.ENV.TM_PROJECT_DIRECTORY != "undefined" && process.ENV.TM_PROJECT_DIRECTORY != null && process.ENV.TM_PROJECT_DIRECTORY != "") { 16 | require.paths.unshift(process.ENV.TM_PROJECT_DIRECTORY + '/lib'); 17 | require.paths.unshift(process.ENV.TM_PROJECT_DIRECTORY + '/src'); 18 | require.paths.unshift(process.ENV.TM_PROJECT_DIRECTORY + '/spec'); 19 | } 20 | require("jspec"); 21 | 22 | quit = process.exit; 23 | print = puts; 24 | 25 | readFile = function(path) { 26 | var promise = require('posix').cat(path, "utf8"); 27 | var result = ''; 28 | promise.addErrback(function(){ throw "failed to read file `" + path + "'"; }); 29 | promise.addCallback(function(contents){ 30 | result = contents; 31 | }); 32 | promise.wait(); 33 | return result; 34 | }; 35 | 36 | GLOBAL.console = { 37 | log: sys.puts, 38 | warn: sys.puts, 39 | error: sys.puts, 40 | group: function(){}, 41 | groupEnd: function(){} 42 | }; 43 | JSpec.exec(process.ENV.TM_FILEPATH); 44 | JSpec.run({ formatter: JSpec.formatters.Console, failuresOnly: true }); 45 | JSpec.report(); 46 | 47 | } else { 48 | var script = process.createChildProcess("node", [process.ENV.TM_FILEPATH]); 49 | script.addListener("output", function(data) { 50 | if (data !== null) { sys.puts(data); } 51 | }); 52 | script.addListener("error", function(data) { 53 | if (data !== null) { sys.puts("ERROR: " + data); } 54 | }); 55 | } 56 | 57 | input 58 | document 59 | keyEquivalent 60 | @r 61 | name 62 | Run File or Spec 63 | output 64 | showAsTooltip 65 | scope 66 | source.js.node 67 | uuid 68 | 5ECAB6F6-77CD-4A15-A646-BE4B01B3944F 69 | 70 | 71 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Textmate Bundle for Node.JS 2 | 3 | ## Common commands and short-cuts 4 | 5 | Important: Change your current grammar to "JavaScript Node" (short cut: Shift+Ctrl+Alt+N) 6 | 7 | * Cmd+R - run current file within node 8 | * req => var sys = require('sys'); 9 | * mixin => process.mixin(exports, {...}); 10 | * exp => exports.func_name = function() {...}; 11 | * process snippets 12 | * .lis - .addListener(...) 13 | * .cb - .addCallback(...) 14 | * .errb - .addErrback(...) 15 | * .canb - .addCancalback(...) 16 | * sys module: 17 | * puts - sys.puts('string'); 18 | * p - sys.p('string'); 19 | * debug - sys.debug('string'); 20 | * error - sys.error('string'); 21 | * exec - sys.exec('command').addCallback(...); 22 | * posix module: 23 | * cat, mkdir, readdir, rename, rmdir, stat 24 | 25 | Others: 26 | 27 | * app => if (module.id == require.main.id) { .. } 28 | 29 | ## Installation 30 | 31 | mkdir -p ~/Library/Application\ Support/TextMate/Bundles/ 32 | cd ~/Library/Application\ Support/TextMate/Bundles 33 | git clone git://github.com/magnars/javascript-node.tmbundle.git "JavaScript Node.tmbundle" 34 | osascript -e 'tell app "TextMate" to reload bundles' 35 | 36 | Alternately, in TextMate, from your drop down menu, select Bundles -> Bundle Editor -> Reload Bundles. 37 | 38 | ## Credits 39 | 40 | The Node.JS TM Bundle is currently authored by Dr Nic Williams. Contributors and co-maintainers are welcome. 41 | 42 | * **Dr Nic** - Author/Main contributor 43 | 44 | ## License 45 | 46 | Copyright (c) 2009-2010 Dr Nic Williams, Mocra 47 | 48 | Permission is hereby granted, free of charge, to any person obtaining a copy 49 | of this software and associated documentation files (the "Software"), to deal 50 | in the Software without restriction, including without limitation the rights 51 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 52 | copies of the Software, and to permit persons to whom the Software is 53 | furnished to do so, subject to the following conditions: 54 | 55 | The above copyright notice and this permission notice shall be included in 56 | all copies or substantial portions of the Software. 57 | 58 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 59 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 60 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 61 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 62 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 63 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 64 | THE SOFTWARE. 65 | -------------------------------------------------------------------------------- /info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | mainMenu 6 | 7 | items 8 | 9 | 5ECAB6F6-77CD-4A15-A646-BE4B01B3944F 10 | 59AF7588-E4A5-4BD4-8CF0-50EDB8068520 11 | 601B0CE2-907F-4C6B-B954-E8A94E657B18 12 | FECBF846-C17D-45FC-A59D-DF9D24BB999D 13 | C0C835F9-8F27-4C53-8215-8D8C983A4215 14 | 15 | submenus 16 | 17 | 601B0CE2-907F-4C6B-B954-E8A94E657B18 18 | 19 | items 20 | 21 | 180C087D-09AE-4F15-8861-2ED02DDD673F 22 | 9D08A939-64FB-42F6-BE49-774D1BFB3954 23 | 7598842A-4E1A-4744-BAC6-EFB1256D6021 24 | 9D54AD88-5150-4959-934A-307C587BB3AC 25 | 26 | name 27 | promises 28 | 29 | C0C835F9-8F27-4C53-8215-8D8C983A4215 30 | 31 | items 32 | 33 | 483223F6-814F-4836-A105-DE8F6BA56281 34 | D63101FB-D494-44CD-BE60-F26F68FF6BE3 35 | D2F95B9E-1273-477A-9018-05C91E8653B4 36 | 0D22ED48-FA6C-4B12-ADE8-9A40A556DFCA 37 | 7744B7DE-9DB0-48A2-A5F1-D15F54CEEEA1 38 | F430F77A-4D98-4D2D-B816-87B963A61717 39 | 40 | name 41 | posix 42 | 43 | FECBF846-C17D-45FC-A59D-DF9D24BB999D 44 | 45 | items 46 | 47 | B820ECC8-CA27-4EFF-B14F-BC002C4AFE0B 48 | B250F874-11E1-4C13-9E9E-EDE16DB6C1C6 49 | D95BACCA-897E-4F09-9576-76A9C528FD28 50 | 0DE90632-511B-4AE1-B8D0-494702E8748E 51 | C215A7E3-0F51-4671-99C8-D79DA19D9B02 52 | 53 | name 54 | sys 55 | 56 | 57 | 58 | name 59 | JavaScript Node 60 | ordering 61 | 62 | 17076F45-FE22-4123-AD00-0C8E31BC2EB8 63 | 5ECAB6F6-77CD-4A15-A646-BE4B01B3944F 64 | 59AF7588-E4A5-4BD4-8CF0-50EDB8068520 65 | E114B311-9CD7-422E-BBDB-DF8930F5C5CD 66 | 5997D597-577F-4521-86D8-7119B0D86D1B 67 | 180C087D-09AE-4F15-8861-2ED02DDD673F 68 | 9D08A939-64FB-42F6-BE49-774D1BFB3954 69 | 7598842A-4E1A-4744-BAC6-EFB1256D6021 70 | 9D54AD88-5150-4959-934A-307C587BB3AC 71 | B820ECC8-CA27-4EFF-B14F-BC002C4AFE0B 72 | B250F874-11E1-4C13-9E9E-EDE16DB6C1C6 73 | D95BACCA-897E-4F09-9576-76A9C528FD28 74 | 0DE90632-511B-4AE1-B8D0-494702E8748E 75 | C215A7E3-0F51-4671-99C8-D79DA19D9B02 76 | F430F77A-4D98-4D2D-B816-87B963A61717 77 | 0D22ED48-FA6C-4B12-ADE8-9A40A556DFCA 78 | 7744B7DE-9DB0-48A2-A5F1-D15F54CEEEA1 79 | D63101FB-D494-44CD-BE60-F26F68FF6BE3 80 | D2F95B9E-1273-477A-9018-05C91E8653B4 81 | 483223F6-814F-4836-A105-DE8F6BA56281 82 | 83 | uuid 84 | B4B8CCA9-FD56-471B-B7D8-A7B1A1B06E78 85 | 86 | 87 | --------------------------------------------------------------------------------