redcar 0.7 → 0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (131) hide show
  1. data/CHANGES +42 -0
  2. data/README.md +5 -3
  3. data/Rakefile +39 -81
  4. data/bin/redcar +1 -1
  5. data/lib/redcar.rb +9 -6
  6. data/lib/redcar/installer.rb +1 -1
  7. data/lib/redcar/ruby_extensions.rb +19 -0
  8. data/lib/redcar/runner.rb +1 -1
  9. data/lib/redcar/usage.rb +3 -0
  10. data/lib/redcar_quick_start.rb +11 -11
  11. data/plugins/application/features/step_definitions/tree_steps.rb +22 -5
  12. data/plugins/application/features/step_definitions/window_steps.rb +9 -1
  13. data/plugins/application/features/support/env.rb +5 -2
  14. data/plugins/application/lib/application.rb +51 -46
  15. data/plugins/application/lib/application/window.rb +60 -30
  16. data/plugins/application_swt/lib/application_swt.rb +16 -16
  17. data/plugins/application_swt/lib/application_swt/window.rb +35 -7
  18. data/plugins/auto_completer/features/support/env.rb +0 -2
  19. data/plugins/auto_indenter/features/support/env.rb +0 -1
  20. data/plugins/auto_pairer/features/auto_pairer.feature +50 -45
  21. data/plugins/auto_pairer/features/support/env.rb +0 -1
  22. data/plugins/auto_pairer/lib/auto_pairer/document_controller.rb +11 -6
  23. data/plugins/clipboard-viewer/Screenshot.png +0 -0
  24. data/plugins/clipboard-viewer/lib/clipboard_viewer.rb +50 -0
  25. data/plugins/clipboard-viewer/lib/clipboard_viewer/browser_controller.rb +27 -0
  26. data/plugins/clipboard-viewer/lib/clipboard_viewer/clipboard_bar.rb +67 -0
  27. data/plugins/clipboard-viewer/plugin.rb +9 -0
  28. data/plugins/clipboard-viewer/views/clipboard.html.erb +15 -0
  29. data/plugins/clipboard-viewer/views/default.css +43 -0
  30. data/plugins/clipboard-viewer/views/redcar_small_icon.png +0 -0
  31. data/plugins/comment/features/line_comment.feature +137 -0
  32. data/plugins/comment/features/selection_comment.feature +21 -0
  33. data/plugins/comment/features/step_definitions/comment_steps.rb +7 -0
  34. data/plugins/comment/lib/comment.rb +266 -0
  35. data/plugins/comment/plugin.rb +7 -0
  36. data/plugins/comment/vendor/comment_lib.json +47 -0
  37. data/plugins/declarations/lib/declarations.rb +1 -1
  38. data/plugins/document_search/features/replace.feature +10 -2
  39. data/plugins/document_search/features/support/env.rb +0 -1
  40. data/plugins/document_search/lib/document_search.rb +4 -1
  41. data/plugins/document_search/lib/document_search/replace.rb +11 -3
  42. data/plugins/document_search/lib/document_search/search_and_replace.rb +5 -2
  43. data/plugins/edit_view/features/case_change.feature +9 -9
  44. data/plugins/edit_view/features/cursor_navigation.feature +36 -0
  45. data/plugins/edit_view/features/step_definitions/editing_steps.rb +63 -8
  46. data/plugins/edit_view/features/step_definitions/notebook_steps.rb +2 -0
  47. data/plugins/edit_view/features/step_definitions/tab_steps.rb +8 -5
  48. data/plugins/edit_view/features/support/env.rb +8 -2
  49. data/plugins/edit_view/lib/edit_view.rb +16 -1
  50. data/plugins/edit_view/lib/edit_view/actions/cmd_enter.rb +11 -0
  51. data/plugins/edit_view/lib/edit_view/document.rb +27 -10
  52. data/plugins/edit_view/lib/edit_view/edit_tab.rb +17 -4
  53. data/plugins/edit_view/spec/edit_view/document_spec.rb +3 -0
  54. data/plugins/edit_view_swt/lib/edit_view_swt.rb +42 -3
  55. data/plugins/edit_view_swt/lib/edit_view_swt/word_movement.rb +17 -15
  56. data/plugins/help/lib/help.rb +40 -0
  57. data/plugins/help/plugin.rb +8 -0
  58. data/plugins/html_view/features/step_definitions/html_view_steps.rb +6 -4
  59. data/plugins/line_tools/features/support/env.rb +0 -1
  60. data/plugins/macros/features/step_definitions/macro_steps.rb +0 -55
  61. data/plugins/macros/features/support/env.rb +0 -2
  62. data/plugins/open_default_app/lib/open_default_app.rb +35 -0
  63. data/plugins/open_default_app/plugin.rb +8 -0
  64. data/plugins/open_default_app/screenshot.png +0 -0
  65. data/plugins/plugin_manager_ui/lib/plugin_manager_ui.rb +17 -3
  66. data/plugins/project/features/find_file.feature +3 -2
  67. data/plugins/project/features/highlight_focussed_tab.feature +8 -0
  68. data/plugins/project/features/move_and_rename_files.feature +25 -0
  69. data/plugins/project/features/open_and_save_files.feature +10 -1
  70. data/plugins/project/features/open_directory_tree.feature +32 -2
  71. data/plugins/project/features/step_definitions/directory_steps.rb +17 -0
  72. data/plugins/project/features/step_definitions/project_tree_steps.rb +3 -0
  73. data/plugins/project/features/sub_project.feature +14 -0
  74. data/plugins/project/features/support/env.rb +22 -3
  75. data/plugins/project/features/watch_for_modified_files.feature +32 -9
  76. data/plugins/project/lib/project.rb +53 -21
  77. data/plugins/project/lib/project/adapters/local.rb +21 -16
  78. data/plugins/project/lib/project/adapters/remote.rb +15 -13
  79. data/plugins/project/lib/project/commands.rb +37 -16
  80. data/plugins/project/lib/project/dir_controller.rb +41 -42
  81. data/plugins/project/lib/project/drb_service.rb +35 -21
  82. data/plugins/project/lib/project/file_list.rb +7 -1
  83. data/plugins/project/lib/project/manager.rb +28 -3
  84. data/plugins/project/lib/project/sub_project.rb +17 -0
  85. data/plugins/project/lib/project/support/recycle.js +2 -0
  86. data/plugins/project/lib/project/support/trash.rb +72 -0
  87. data/plugins/project/spec/fixtures/multi-byte-files/a/341/204/200/341/205/247/341/206/274/341/204/205/341/205/251/foo +1 -0
  88. data/plugins/project/spec/fixtures/multi-byte-files//341/204/220/341/205/246/341/204/211/341/205/263/341/204/220/341/205/263.py +1 -0
  89. data/plugins/project/spec/project/file_list_spec.rb +4 -0
  90. data/plugins/redcar/features/goto_line_command.feature +20 -0
  91. data/plugins/redcar/redcar.rb +107 -47
  92. data/plugins/repl/lib/repl.rb +20 -20
  93. data/plugins/repl/lib/repl/clojure_mirror.rb +50 -58
  94. data/plugins/repl/lib/repl/groovy_mirror.rb +22 -41
  95. data/plugins/repl/lib/repl/repl_mirror.rb +85 -14
  96. data/plugins/repl/lib/repl/ruby_mirror.rb +12 -39
  97. data/plugins/repl/spec/repl/groovy_mirror_spec.rb +1 -1
  98. data/plugins/repl/spec/repl/ruby_mirror_spec.rb +12 -12
  99. data/plugins/ruby/README +6 -0
  100. data/plugins/ruby/lib/syntax_check/ruby.rb +28 -0
  101. data/plugins/ruby/plugin.rb +7 -0
  102. data/plugins/runnables/features/command_tree.feature +9 -0
  103. data/plugins/runnables/features/file_runner_input.feature +20 -0
  104. data/plugins/runnables/features/run_alternate_command.feature +14 -0
  105. data/plugins/runnables/features/support/env.rb +42 -5
  106. data/plugins/runnables/lib/runnables.rb +67 -21
  107. data/plugins/runnables/lib/runnables/commands.rb +35 -18
  108. data/plugins/runnables/lib/runnables/tree_mirror/nodes/runnable_group.rb +23 -37
  109. data/plugins/runnables/lib/runnables/tree_mirror/nodes/runnable_type_group.rb +16 -18
  110. data/plugins/scm_svn/features/support/env.rb +0 -3
  111. data/plugins/snippets/features/snippets.feature +17 -2
  112. data/plugins/snippets/features/support/env.rb +0 -1
  113. data/plugins/snippets/lib/snippets/tab_handler.rb +51 -18
  114. data/plugins/swt/lib/swt/cucumber_patches.rb +13 -68
  115. data/plugins/swt/lib/swt/cucumber_runner.rb +2 -3
  116. data/plugins/syntax_check/README +6 -0
  117. data/plugins/syntax_check/lib/syntax_check.rb +16 -0
  118. data/plugins/syntax_check/lib/syntax_check/checker.rb +47 -0
  119. data/plugins/syntax_check/lib/syntax_check/error.rb +23 -0
  120. data/plugins/syntax_check/plugin.rb +7 -0
  121. data/plugins/tree_view_swt/lib/tree_view_swt.rb +6 -0
  122. data/plugins/web_bookmarks/Screenshot.png +0 -0
  123. data/plugins/web_bookmarks/lib/web_bookmarks.rb +42 -0
  124. data/plugins/web_bookmarks/lib/web_bookmarks/bookmark.rb +43 -0
  125. data/plugins/web_bookmarks/lib/web_bookmarks/browser_bar.rb +70 -0
  126. data/plugins/web_bookmarks/lib/web_bookmarks/commands.rb +111 -0
  127. data/plugins/web_bookmarks/lib/web_bookmarks/tree.rb +67 -0
  128. data/plugins/web_bookmarks/lib/web_bookmarks/view_controller.rb +22 -0
  129. data/plugins/web_bookmarks/plugin.rb +11 -0
  130. data/plugins/web_bookmarks/views/index.html.erb +5 -0
  131. metadata +60 -10
@@ -43,7 +43,7 @@ class Redcar::REPL
43
43
  it "should have a prompt" do
44
44
  wait_for_prompt
45
45
  @mirror.read.should == (<<-Groovy).chomp
46
- // Groovy REPL
46
+ # Groovy REPL
47
47
 
48
48
  groovy>
49
49
  Groovy
@@ -10,7 +10,7 @@ class Redcar::REPL
10
10
 
11
11
  def commit_test_text1
12
12
  text = <<-RUBY
13
- # Redcar REPL
13
+ # Ruby REPL
14
14
 
15
15
  >> $internal_repl_test = 707
16
16
  RUBY
@@ -19,7 +19,7 @@ RUBY
19
19
 
20
20
  def result_test_text1
21
21
  (<<-RUBY).chomp
22
- # Redcar REPL
22
+ # Ruby REPL
23
23
 
24
24
  >> $internal_repl_test = 707
25
25
  => 707
@@ -29,7 +29,7 @@ RUBY
29
29
 
30
30
  def commit_test_text2
31
31
  text = <<-RUBY
32
- # Redcar REPL
32
+ # Ruby REPL
33
33
 
34
34
  >> $internal_repl_test = 707
35
35
  => 707
@@ -41,7 +41,7 @@ RUBY
41
41
 
42
42
  def result_test_text2
43
43
  (<<-RUBY).chomp
44
- # Redcar REPL
44
+ # Ruby REPL
45
45
 
46
46
  >> $internal_repl_test = 707
47
47
  => 707
@@ -54,7 +54,7 @@ RUBY
54
54
 
55
55
  def commit_no_input
56
56
  text = <<-RUBY
57
- # Redcar REPL
57
+ # Ruby REPL
58
58
 
59
59
  >>
60
60
  RUBY
@@ -62,7 +62,7 @@ RUBY
62
62
  end
63
63
 
64
64
  def prompt
65
- "# Redcar REPL\n\n"
65
+ "# Ruby REPL\n\n"
66
66
  end
67
67
 
68
68
  describe "with no history" do
@@ -72,7 +72,7 @@ RUBY
72
72
 
73
73
  it "should have a message and a prompt" do
74
74
  @mirror.read.should == (<<-RUBY).chomp
75
- # Redcar REPL
75
+ # Ruby REPL
76
76
 
77
77
  >>
78
78
  RUBY
@@ -94,13 +94,13 @@ RUBY
94
94
 
95
95
  it "should allow committing nothing as the first command" do
96
96
  commit_no_input
97
- @mirror.read.should == "# Redcar REPL\n\n>> \n=> nil\n>> "
97
+ @mirror.read.should == "# Ruby REPL\n\n>> \n=> nil\n>> "
98
98
  end
99
99
 
100
100
  it "should allow committing nothing as an xth command" do
101
101
  committed = commit_test_text2
102
102
  @mirror.commit committed + "\n>> "
103
- @mirror.read.should == "# Redcar REPL\n\n>> $internal_repl_test = 909\n=> 909\n>> \n=> nil\n>> "
103
+ @mirror.read.should == "# Ruby REPL\n\n>> $internal_repl_test = 909\n=> 909\n>> \n=> nil\n>> "
104
104
  end
105
105
 
106
106
  it "should emit changed event when text is executed" do
@@ -116,7 +116,7 @@ RUBY
116
116
  it "should display errors" do
117
117
  @mirror.commit(prompt + ">> nil.foo")
118
118
  @mirror.read.should == (<<-RUBY).chomp
119
- # Redcar REPL
119
+ # Ruby REPL
120
120
 
121
121
  >> nil.foo
122
122
  x> NoMethodError: undefined method `foo' for nil:NilClass
@@ -164,7 +164,7 @@ RUBY
164
164
  it "should execute inside a main object" do
165
165
  @mirror.commit(prompt + ">> self")
166
166
  @mirror.read.should == (<<-RUBY).chomp
167
- # Redcar REPL
167
+ # Ruby REPL
168
168
 
169
169
  >> self
170
170
  => main
@@ -177,7 +177,7 @@ RUBY
177
177
  @mirror.commit(sent)
178
178
  @mirror.commit(sent + "\n>> a")
179
179
  @mirror.read.should == (<<-RUBY).chomp
180
- # Redcar REPL
180
+ # Ruby REPL
181
181
 
182
182
  >> a = 13
183
183
  => 13
@@ -0,0 +1,6 @@
1
+ == Syntax checking for Ruby in Redcar
2
+
3
+ Get redcar from github.com/redcar/redcar and do a git clone in your
4
+ $HOME/.redcar/plugins of this repository. You will also need the
5
+ redcar_syntax_check plugin (timfel/redcar_syntax_check)
6
+
@@ -0,0 +1,28 @@
1
+ require 'java'
2
+
3
+ module Redcar
4
+ module SyntaxCheck
5
+ class Ruby < Checker
6
+ supported_grammars "Ruby", "Ruby on Rails"
7
+
8
+ def check(*args)
9
+ path = manifest_path(doc)
10
+ file = File.basename(path)
11
+ runtime = org.jruby.Ruby.global_runtime
12
+ io = java.io.FileInputStream.new(java.io.File.new(path))
13
+ begin
14
+ runtime.parse_from_main(io, file)
15
+ rescue SyntaxError => e
16
+ create_syntax_error(doc, e.exception.message, file).annotate
17
+ end
18
+ end
19
+
20
+ def create_syntax_error(doc, message, file)
21
+ message =~ /#{Regexp.escape(file)}:(\d+):(.*)/
22
+ line = $1.to_i - 1
23
+ message = $2
24
+ SyntaxCheck::Error.new(doc, line, message)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,7 @@
1
+ Plugin.define do
2
+ name "ruby"
3
+ version "0.1"
4
+ file "lib", "syntax_check", "ruby"
5
+ object "Redcar::SyntaxCheck::Ruby"
6
+ dependencies "syntax_check", ">0"
7
+ end
@@ -13,6 +13,15 @@ Feature: Showing commands in a command tree
13
13
  And I expand the tree row "fixture_runnables"
14
14
  Then I should see "An app" in the tree
15
15
 
16
+ Scenario: Shows groups and subgroups by slash-separated type
17
+ When I open the runnables tree
18
+ And I expand the tree row "fixture_runnables"
19
+ Then I should see "first" in the tree
20
+ And I expand the tree row "first"
21
+ Then I should see "second" in the tree
22
+ And I expand the tree row "second"
23
+ Then I should see "A nested app" in the tree
24
+
16
25
  Scenario: I can manually refresh the tree
17
26
  When I open the runnables tree
18
27
  And I change the command to "A changed app"
@@ -0,0 +1,20 @@
1
+ Feature: Using file properties in commands
2
+ As a user
3
+ I want to run commands that rely on the current edit view
4
+ So I don't have to write many similar commands
5
+
6
+ Background:
7
+ When I will choose "plugins/runnables/features/fixtures" from the "open_directory" dialog
8
+ And I open a directory
9
+
10
+ Scenario: Using the name of the current file in a command
11
+ Given I have opened "plugins/runnables/features/fixtures/name_app.rb"
12
+ And I run the command Redcar::Runnables::RunEditTabCommand
13
+ Then my active tab should be "Running name_app.rb"
14
+ And the HTML tab should say "name_app"
15
+
16
+ Scenario: Using the current line number in a command
17
+ Given I have opened "plugins/runnables/features/fixtures/line_app.rb"
18
+ And I run the command Redcar::Runnables::RunEditTabCommand
19
+ Then my active tab should be "Running line_app.rb"
20
+ And the HTML tab should say "1"
@@ -0,0 +1,14 @@
1
+ Feature: Running an alternate file runner
2
+ As a user
3
+ I want to run tabs in different ways
4
+ So I need a separate terminal less often
5
+
6
+ Background:
7
+ When I will choose "plugins/runnables/features/fixtures" from the "open_directory" dialog
8
+ And I open a directory
9
+
10
+ Scenario: Getting the second match from a list of file runners
11
+ Given I have opened "plugins/runnables/features/fixtures/alternate.ruby"
12
+ And I run the command Redcar::Runnables::RunAlternateEditTabCommand
13
+ Then my active tab should be "Running alternate.ruby"
14
+ And the HTML tab should say "hello world"
@@ -1,7 +1,3 @@
1
- RequireSupportFiles File.dirname(__FILE__) + "/../../../application/features/"
2
- RequireSupportFiles File.dirname(__FILE__) + "/../../../edit_view/features/"
3
- RequireSupportFiles File.dirname(__FILE__) + "/../../../html_view/features/"
4
- RequireSupportFiles File.dirname(__FILE__) + "/../../../project/features/"
5
1
 
6
2
  def runnable_fixtures
7
3
  File.expand_path(File.dirname(__FILE__) + "/../fixtures")
@@ -22,10 +18,21 @@ def reset_runnable_fixtures
22
18
  end
23
19
 
24
20
  File.open("#{runnable_fixtures}/params_app.rb", 'w') do |f|
25
- #f.puts "puts ARGV[0] +' '+ ARGV[1]"
26
21
  f.puts "ARGV.each { |it| print it+' '}"
27
22
  end
28
23
 
24
+ File.open("#{runnable_fixtures}/alternate.ruby", 'w') do |f|
25
+ f.puts "ARGV.each { |it| print it+' '}"
26
+ end
27
+
28
+ File.open("#{runnable_fixtures}/name_app.rb", 'w') do |f|
29
+ f.puts "ARGV.each { |it| println it}"
30
+ end
31
+
32
+ File.open("#{runnable_fixtures}/line_app.rb", 'w') do |f|
33
+ f.puts "ARGV.each { |it| println it}"
34
+ end
35
+
29
36
  File.open(runnable_config, 'w') do |f|
30
37
  f.print <<-EOS
31
38
  {
@@ -61,14 +68,44 @@ def reset_runnable_fixtures
61
68
  "name": "An appendable app",
62
69
  "command": "jruby params_app.rb hello",
63
70
  "description": "Runs an app that prints parameters"
71
+ },
72
+ {
73
+ "name": "A nested app",
74
+ "command": "echo 'lo'",
75
+ "description": "A test for nesting",
76
+ "type": "first/second"
64
77
  }
65
78
  ],
66
79
  "file_runners":[
80
+ {
81
+ "regex": ".*\\\\name_app.rb",
82
+ "name": "Run as ruby",
83
+ "command": "jruby \\"__PATH__\\" __NAME__",
84
+ "type": "app/ruby"
85
+ },
86
+ {
87
+ "regex": ".*\\\\.ruby",
88
+ "name": "Run as ruby",
89
+ "command": "jruby \\"__PATH__\\" 1 2 3",
90
+ "type": "app/ruby"
91
+ },
92
+ {
93
+ "regex": ".*\\\\line_app.rb",
94
+ "name": "Run as ruby",
95
+ "command": "jruby \\"__PATH__\\" __LINE__",
96
+ "type": "app/ruby"
97
+ },
67
98
  {
68
99
  "regex": ".*\\\\.rb",
69
100
  "name": "Run as ruby",
70
101
  "command": "jruby \\"__PATH__\\"",
71
102
  "type": "app/ruby"
103
+ },
104
+ {
105
+ "regex": ".*\\\\.ruby",
106
+ "name": "Run as ruby",
107
+ "command": "jruby \\"__PATH__\\" hello world",
108
+ "type": "app/ruby"
72
109
  }
73
110
  ]
74
111
  }
@@ -10,30 +10,22 @@ require 'runnables/tree_mirror/tree_mirror'
10
10
 
11
11
  module Redcar
12
12
  class Runnables
13
- TREE_TITLE = "Runnables"
14
- PARAMS = "__PARAMS__"
15
- DISPLAY_PARAMS = "__?__"
13
+ TREE_TITLE = "Runnables"
14
+ PARAMS = "__PARAMS__"
15
+ DISPLAY_PARAMS = "__?__"
16
16
  DISPLAY_NEXT_PARAMS = "_____"
17
+ LINE_HOLDER = "__LINE__"
18
+ PATH_HOLDER = "__PATH__"
19
+ NAME_HOLDER = "__NAME__"
17
20
 
18
21
  def self.run_process(path, command, title, output = "tab")
19
22
  window = Redcar.app.focussed_window
20
- while command.include?(PARAMS)
21
- msg = command.sub(PARAMS,DISPLAY_PARAMS)
22
- msg = msg.gsub(PARAMS,DISPLAY_NEXT_PARAMS)
23
- msg = "" if msg == DISPLAY_PARAMS
24
- msg_title = "Enter Command Parameters"
25
- out = Redcar::Application::Dialog.input(msg_title,msg)
26
- params = out[:value] || ""
27
- return if out[:button] == :cancel
28
- command = command.sub(PARAMS,params)
29
- end
23
+ command = Runnables.substitute_variables(window,command)
24
+ return unless command
30
25
  if Runnables.storage['save_project_before_running'] == true
31
26
  window.notebooks.each do |notebook|
32
27
  notebook.tabs.each do |tab|
33
- case tab
34
- when EditTab
35
- tab.edit_view.document.save! if tab.edit_view.document.modified?
36
- end
28
+ tab.edit_view.document.save! if tab.is_a?(EditTab) and tab.edit_view.document.modified?
37
29
  end
38
30
  end
39
31
  end
@@ -55,6 +47,52 @@ module Redcar
55
47
  end
56
48
  end
57
49
 
50
+ # Replaces placeholders in commands with values, like __PATH__,
51
+ # __LINE__, __NAME__ and __PARAMS__
52
+ def self.substitute_variables(window,command)
53
+ tab = window.focussed_notebook_tab
54
+ if tab and tab.is_a?(EditTab)
55
+ if command.include?(PATH_HOLDER)
56
+ path = tab.edit_view.document.path
57
+ command.gsub!(PATH_HOLDER, path)
58
+ if command.include?(LINE_HOLDER)
59
+ line = tab.edit_view.document.cursor_line + 1
60
+ command.gsub!(LINE_HOLDER, line.to_s)
61
+ end
62
+ end
63
+ if command.include?(NAME_HOLDER)
64
+ name = File.basename(tab.edit_view.document.path)
65
+ idx = name.rindex(".") if name.include?(".")
66
+ name = name[0,idx] if idx
67
+ command.gsub!(NAME_HOLDER, name.to_s)
68
+ end
69
+ end
70
+ while command.include?(PARAMS)
71
+ msg = command.sub(PARAMS,DISPLAY_PARAMS)
72
+ msg = msg.gsub(PARAMS,DISPLAY_NEXT_PARAMS)
73
+ msg = "" if msg == DISPLAY_PARAMS
74
+ msg_title = "Enter Command Parameters"
75
+ out = Redcar::Application::Dialog.input(msg_title,msg)
76
+ params = out[:value] || ""
77
+ return if out[:button] == :cancel
78
+ command = command.sub(PARAMS,params)
79
+ end
80
+ command
81
+ end
82
+
83
+ def self.file_mappings(project)
84
+ file_runners = []
85
+ if project
86
+ runnable_file_paths = project.config_files("runnables/*.json")
87
+ runnable_file_paths.each do |path|
88
+ json = File.read(path)
89
+ this_file_runners = JSON(json)["file_runners"]
90
+ file_runners += this_file_runners || []
91
+ end
92
+ end
93
+ file_runners
94
+ end
95
+
58
96
  def self.previous_tab_for(command)
59
97
  Redcar.app.all_tabs.detect do |t|
60
98
  t.respond_to?(:html_view) &&
@@ -64,19 +102,27 @@ module Redcar
64
102
  end
65
103
 
66
104
  def self.keymaps
67
- map = Keymap.build("main", [:osx, :linux, :windows]) do
105
+ linwin = Keymap.build("main", [:linux, :windows]) do
68
106
  link "Ctrl+R", Runnables::RunEditTabCommand
107
+ link "Ctrl+Alt+R", Runnables::RunAlternateEditTabCommand
108
+ end
109
+
110
+ osx = Keymap.build("main", :osx) do
111
+ link "Cmd+R", Runnables::RunEditTabCommand
112
+ link "Cmd+Alt+R", Runnables::RunAlternateEditTabCommand
69
113
  end
70
- [map, map]
114
+ [linwin,osx]
71
115
  end
72
116
 
73
117
  def self.menus
74
118
  Menu::Builder.build do
75
119
  sub_menu "Project" do
76
120
  group(:priority => 15) {
77
- separator
121
+ separator
78
122
  item "Runnables", Runnables::ShowRunnables
79
123
  item "Run Tab", Runnables::RunEditTabCommand
124
+ item "Alternate Run Tab", Runnables::RunAlternateEditTabCommand
125
+ separator
80
126
  }
81
127
  end
82
128
  end
@@ -107,4 +153,4 @@ module Redcar
107
153
  end
108
154
  end
109
155
  end
110
- end
156
+ end
@@ -31,34 +31,51 @@ module Redcar
31
31
  end
32
32
 
33
33
  class RunEditTabCommand < Redcar::EditTabCommand
34
- def file_mappings
34
+ sensitize :open_project
35
+ def execute
35
36
  project = Project::Manager.in_window(win)
36
- runnable_file_paths = project.config_files("runnables/*.json")
37
-
38
- file_runners = []
39
- runnable_file_paths.each do |path|
40
- json = File.read(path)
41
- this_file_runners = JSON(json)["file_runners"]
42
- file_runners += this_file_runners || []
37
+ f = Runnables.file_mappings(project).detect do |file_mapping|
38
+ regex = Regexp.new(file_mapping["regex"])
39
+ tab.edit_view.document.mirror.path =~ regex
43
40
  end
44
- file_runners
41
+ run_tab(project.home_dir,tab, f) if f
42
+ end
43
+
44
+ def run_tab(project_path,tab, file_mapping)
45
+ command = file_mapping["command"]
46
+ output = file_mapping["output"]
47
+ path = tab.edit_view.document.mirror.path
48
+ output = "tab" if output.nil?
49
+ Runnables.run_process(project_path,command, "Running #{File.basename(path)}", output)
50
+ end
51
+ end
52
+
53
+ class RunAlternateEditTabCommand < RunEditTabCommand
54
+ sensitize :open_project
55
+ def initialize
56
+ @default = nil
57
+ @alternate = nil
45
58
  end
46
59
 
47
60
  def execute
48
61
  project = Project::Manager.in_window(win)
49
- file_mappings.each do |file_mapping|
50
- regex = Regexp.new(file_mapping["regex"])
62
+ i = 0
63
+ Runnables.file_mappings(project).each do |f|
64
+ regex = Regexp.new(f["regex"])
51
65
  if tab.edit_view.document.mirror.path =~ regex
52
- command_schema = file_mapping["command"]
53
- output = file_mapping["output"]
54
- if output.nil?
55
- output = "tab"
66
+ if i == 0
67
+ @default = f
68
+ elsif i == 1
69
+ @alternate = f
56
70
  end
57
- path = tab.edit_view.document.mirror.path
58
- command = command_schema.gsub("__PATH__", path)
59
- Runnables.run_process(project.home_dir,command, "Running #{File.basename(path)}", output)
71
+ i = i + 1 #increment only for matches
60
72
  end
61
73
  end
74
+ if @alternate
75
+ run_tab(project.home_dir,tab, @alternate)
76
+ elsif @default
77
+ run_tab(project.home_dir,tab, @default)
78
+ end
62
79
  end
63
80
  end
64
81
  end