redcar 0.7 → 0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -0,0 +1,9 @@
1
+
2
+ Plugin.define do
3
+ name "clipboard_viewer"
4
+ version "1.0"
5
+ file "lib", "clipboard_viewer"
6
+ object "Redcar::ClipboardViewer"
7
+ dependencies "application",">0",
8
+ "redcar" ,">0"
9
+ end
@@ -0,0 +1,15 @@
1
+
2
+ <script type="text/javascript" src="file://<%= Redcar::HtmlView.jquery_path %>"></script>
3
+ <% redcar_css = File.expand_path(File.join(Redcar.root, %w(plugins clipboard-viewer views default.css))) %>
4
+ <link rel="stylesheet" href="file://<%= redcar_css %>" type="text/css" media="screen">
5
+ <h1>Clipboard History</h1>
6
+ <div class="content" id="copies">
7
+ <table>
8
+ <thead><th>Recently Copied Text</th></thead>
9
+ <tbody>
10
+ <% @list.each_with_index do |item, i|%>
11
+ <tr><td class="copied-item" id="item_<%=i%>"><pre><%= item.join("").gsub("<", "&lt;").gsub(">", "&gt;") %></pre></td></td>
12
+ <% end %>
13
+ </tbody>
14
+ </table>
15
+ </div>
@@ -0,0 +1,43 @@
1
+ body {
2
+ margin:0;
3
+ }
4
+
5
+ h1 {
6
+ background: #5f282d url("redcar_small_icon.png") no-repeat 10px 10px;
7
+ color: #dcb663;
8
+ height: 30px;
9
+ line-height: 30px;
10
+ padding: 10px 10px 10px 52px;
11
+ font-family: Palatino, Times, serif;
12
+ letter-spacing: 3px;
13
+ font-size: 100%;
14
+ }
15
+
16
+ .content {
17
+ margin: 10px;
18
+ font-size: 1.2em;
19
+ }
20
+
21
+ td.copied-item pre {
22
+ font-family: monospace;
23
+ }
24
+
25
+ .refresh {
26
+ padding: 5px;
27
+ }
28
+
29
+ .even {
30
+ background-color: #ddd;
31
+ }
32
+
33
+ table {
34
+ font-size: 80%;
35
+ border-collapse: collapse;
36
+ border: 1px solid #888;
37
+ }
38
+
39
+ td,th {
40
+ border-collapse: collapse;
41
+ border: 1px solid #888;
42
+ padding: 8px;
43
+ }
@@ -0,0 +1,137 @@
1
+ Feature: Commenting lines by prefixing a comment string
2
+
3
+ Background:
4
+ When I open a new edit tab
5
+
6
+ Scenario: Commenting a single line
7
+ When I replace the contents with "A piece of code"
8
+ And I switch the language to "C"
9
+ And I move the cursor to 5
10
+ And I toggle comment lines
11
+ Then the contents should be "// A pie<c>ce of code"
12
+ When I toggle comment lines
13
+ Then the contents should be "A pie<c>ce of code"
14
+
15
+ Scenario: Uncommenting a single line
16
+ When I replace the contents with "# A piece of code"
17
+ And I switch the language to "Ruby"
18
+ And I move the cursor to 5
19
+ And I toggle comment lines
20
+ Then the contents should be "A p<c>iece of code"
21
+
22
+ Scenario: Commenting a single line among many
23
+ When I replace the contents with "foo\nbar\nbaz"
24
+ And I switch the language to "Ruby"
25
+ And I move the cursor to 4
26
+ And I toggle comment lines
27
+ Then the contents should be "foo\n<c># bar\nbaz"
28
+ When I toggle comment lines
29
+ Then the contents should be "foo\n<c>bar\nbaz"
30
+
31
+ Scenario: Uncommenting a single line that doesn't have the space
32
+ When I replace the contents with "#A piece of code"
33
+ And I switch the language to "Ruby"
34
+ And I move the cursor to 5
35
+ And I toggle comment lines
36
+ Then the contents should be "A piece of code"
37
+
38
+ Scenario: Commenting several lines
39
+ When I replace the contents with "Two pieces\nof code"
40
+ And I switch the language to "Ruby"
41
+ And I select from 0 to 13
42
+ And I toggle comment lines
43
+ Then the contents should be "<s># Two pieces\n# of<c> code"
44
+ When I toggle comment lines
45
+ Then the contents should be "<s>Two pieces\nof<c> code"
46
+
47
+ Scenario: Uncommenting several lines, not all of them have the space
48
+ When I replace the contents with "# Two pieces\n#of code"
49
+ And I switch the language to "Ruby"
50
+ And I select from 0 to 16
51
+ And I toggle comment lines
52
+ Then the contents should be "<s>Two pieces\nof<c> code"
53
+
54
+ Scenario: Commenting when not all the lines begin with the comment symbol
55
+ When I replace the contents with "# foo\n# bar\nbaz"
56
+ And I switch the language to "Ruby"
57
+ And I select from 0 to 15
58
+ And I toggle comment lines
59
+ Then the contents should be "<s># # foo\n# # bar\n# baz<c>"
60
+ When I toggle comment lines
61
+ Then the contents should be "# foo\n# bar\nbaz"
62
+
63
+ Scenario: Commenting a single line with the cursor on the next line
64
+ When I replace the contents with "Two pieces\nof code"
65
+ And I switch the language to "Ruby"
66
+ And I select from 0 to 11
67
+ And I toggle comment lines
68
+ Then the contents should be "<s># Two pieces\n<c>of code"
69
+ When I toggle comment lines
70
+ Then the contents should be "<s>Two pieces\n<c>of code"
71
+
72
+ Scenario: Commenting a single line with the cursor and selection point on the same line
73
+ When I replace the contents with "Two pieces\nof code"
74
+ And I switch the language to "Ruby"
75
+ And I select from 3 to 0
76
+ And I toggle comment lines
77
+ Then the contents should be "<c># Two<s> pieces\nof code"
78
+ When I toggle comment lines
79
+ Then the contents should be "<c>Two<s> pieces\nof code"
80
+
81
+ Scenario: Inserting a single space after comments when a line has no indentation
82
+ When I replace the contents with "A few\nlines\nof unindented\ncode"
83
+ And I switch the language to "Ruby"
84
+ And I select from 2 to 27
85
+ And I toggle comment lines
86
+ Then the contents should be "A <s># few\n# lines\n# of unindented\n# c<c>ode"
87
+ When I toggle comment lines
88
+ Then the contents should be "A <s>few\nlines\nof unindented\nc<c>ode"
89
+
90
+ Scenario: Commenting an indented single line
91
+ When I replace the contents with " A piece of code"
92
+ And I switch the language to "C"
93
+ And I toggle comment lines
94
+ Then the contents should be " // A piece of code"
95
+ When I toggle comment lines
96
+ Then the contents should be " A piece of code"
97
+
98
+ Scenario: Commenting several lines, not from the start of one of them
99
+ When I replace the contents with "Two pieces\nof code"
100
+ And I switch the language to "Ruby"
101
+ And I select from 2 to 13
102
+ And I toggle comment lines
103
+ Then the contents should be "Tw<s># o pieces\n# of<c> code"
104
+ When I toggle comment lines
105
+ Then the contents should be "Tw<s>o pieces\nof<c> code"
106
+
107
+ Scenario: Commenting several lines, not from the start of one of them
108
+ When I replace the contents with " foo\n bar"
109
+ And I switch the language to "Ruby"
110
+ And I select from 2 to 15
111
+ And I toggle comment lines
112
+ Then the contents should be " <s> # foo\n # bar<c>"
113
+ When I toggle comment lines
114
+ Then the contents should be " <s> foo\n bar<c>"
115
+
116
+ Scenario: Commenting several lines, with mismatched indentation, beginning in the start
117
+ When I replace the contents with " def foo\n dfo\n sdfj\n asdf\nasdf"
118
+ And I switch the language to "Ruby"
119
+ And I select from 0 to 40
120
+ And I toggle comment lines
121
+ Then the contents should be "<s># def foo\n# dfo\n# sdfj\n# asdf\n# as<c>df"
122
+
123
+ Scenario: Commenting several indented lines, beginning before the text starts
124
+ When I replace the contents with " def foo\n dfo"
125
+ And I switch the language to "Ruby"
126
+ And I select from 2 to 25
127
+ And I toggle comment lines
128
+ Then the contents should be " <s> # def foo\n # dfo<c>"
129
+
130
+ # This is pretty damn marginal, and I'm tired...
131
+ #Scenario: Commenting several lines, with mismatched indentation, beginning in the middle
132
+ # When I replace the contents with " def foo\n dfo\n sdfj\n asdf\nasdf"
133
+ # And I switch the language to "Ruby"
134
+ # And I select from 6 to 40
135
+ # And I toggle comment lines
136
+ # Then the contents should be " de<s># f foo\n # dfo\n # sdfj\n # asdf\n # as<c>df"
137
+
@@ -0,0 +1,21 @@
1
+ Feature: Commenting a selected area of text
2
+
3
+ Background:
4
+ When I open a new edit tab
5
+
6
+ Scenario: Commenting a part of a line
7
+ When I replace the contents with "a piece of code"
8
+ And I switch the language to "Java"
9
+ And I toggle block comment
10
+ Then I should see "/*a piece of code*/" in the edit tab
11
+ When I toggle block comment
12
+ Then I should see "a piece of code" in the edit tab
13
+
14
+ Scenario: Commenting a selection spanning several lines
15
+ When I replace the contents with "a piece\nof code"
16
+ And I switch the language to "C++"
17
+ And I select from 4 to 9
18
+ And I toggle block comment
19
+ Then I should see "a pi/*ece\no*/f code" in the edit tab
20
+ And I toggle block comment
21
+ Then I should see "a piece\nof code" in the edit tab
@@ -0,0 +1,7 @@
1
+ When /^I toggle block comment$/ do
2
+ Redcar::Comment::ToggleSelectionCommentCommand.new.run
3
+ end
4
+
5
+ When /^I toggle comment lines$/ do
6
+ Redcar::Comment::ToggleLineCommentCommand.new.run
7
+ end
@@ -0,0 +1,266 @@
1
+
2
+ module Redcar
3
+ class Comment
4
+ def self.menus
5
+ Menu::Builder.build do
6
+ sub_menu "Edit" do
7
+ sub_menu "Formatting" do
8
+ item "Toggle Line Comment" , ToggleLineCommentCommand
9
+ item "Toggle Selection Comment", ToggleSelectionCommentCommand
10
+ end
11
+ end
12
+ end
13
+ end
14
+
15
+ def self.storage
16
+ @storage ||=begin
17
+ storage = Plugin::Storage.new('comment_plugin')
18
+ storage.set_default('default_line_comment' , "#")
19
+ storage.set_default('default_start_block' , "/*")
20
+ storage.set_default('default_end_block' , "*/")
21
+ storage.set_default('warning_for_using_defaults' , true)
22
+ storage
23
+ end
24
+ end
25
+
26
+ def self.comment_map
27
+ @map ||=begin
28
+ c = File.read(Comment.comment_lib_path)
29
+ map = JSON.parse(c)
30
+ Comment.comment_extension_paths.each do |path|
31
+ json = File.read(path)
32
+ JSON.parse(json).each do |item,content|
33
+ map[item] = content
34
+ end
35
+ end
36
+ map
37
+ end
38
+ end
39
+
40
+ def self.extensions_file;"comment_extensions.json";end
41
+
42
+ def self.comment_lib_path
43
+ File.dirname(__FILE__) + "/../vendor/comment_lib.json"
44
+ end
45
+
46
+ def self.comment_extension_paths
47
+ project = Redcar::Project::Manager.focussed_project
48
+ if project
49
+ project.config_files(Comment.extensions_file)
50
+ else
51
+ Dir[File.join(Redcar.user_dir,Comment.extensions_file)]
52
+ end
53
+ end
54
+
55
+ def self.keymaps
56
+ osx = Redcar::Keymap.build("main", :osx) do
57
+ link "Cmd+/", ToggleLineCommentCommand
58
+ link "Cmd+.", ToggleSelectionCommentCommand
59
+ end
60
+ linwin = Redcar::Keymap.build("main", [:linux, :windows]) do
61
+ link "Ctrl+/", ToggleLineCommentCommand
62
+ link "Ctrl+.", ToggleSelectionCommentCommand
63
+ end
64
+ [osx, linwin]
65
+ end
66
+
67
+ def self.grammar_missing(grammar)
68
+ if Comment.storage['warning_for_using_defaults']
69
+ Application::Dialog.message_box("Comment type not found for #{grammar}. Using defaults instead.") unless @messaged
70
+ @messaged = true
71
+ end
72
+ end
73
+
74
+ class ToggleSelectionCommentCommand < Redcar::EditTabCommand
75
+ def execute
76
+ type = Comment.comment_map["#{tab.edit_view.grammar.gsub("\"","")}"]
77
+ if type
78
+ start = type["start_block"]
79
+ ending = type["end_block" ]
80
+ return unless start and ending
81
+ else
82
+ Comment.grammar_missing(tab.edit_view.grammar)
83
+ start = Comment.storage['default_start_block']
84
+ ending = Comment.storage['default_end_block']
85
+ end
86
+ doc.controllers(Redcar::AutoIndenter::DocumentController).first.disable do
87
+ doc.compound do
88
+ if doc.selection?
89
+ text = doc.selected_text
90
+ if text[0,start.split(//).length] == start and
91
+ text[text.split(//).length-ending.split(//).length,text.split(//).length] == ending
92
+ text = text[start.split(//).length,text.split(//).length]
93
+ text = text[0,text.split(//).length-ending.split(//).length]
94
+ doc.replace_selection(text)
95
+ else
96
+ doc.replace_selection("#{start}#{text}#{ending}")
97
+ end
98
+ else
99
+ line = doc.cursor_line
100
+ text = doc.get_line_without_end_of_line(line)
101
+ start_idx = text.index(start)
102
+ end_idx = text.rindex(ending)
103
+ start_length = start.split(//).length
104
+ ending_start_offset = text.split(//).length-ending.split(//).length
105
+ if text[0,start_length] == start and text[ending_start_offset,text.split(//).length] == ending
106
+ text = text[start.length,text.split(//).length]
107
+ text = text[0,ending_start_offset]
108
+ doc.replace_line(line,text)
109
+ else
110
+ replacement = "#{start}#{text}#{ending}"
111
+ replacement += "\n" if doc.get_line(line) =~ /\n$/
112
+ doc.replace_line(line,replacement)
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
119
+
120
+ class ToggleLineCommentCommand < Redcar::EditTabCommand
121
+
122
+ attr_reader :comment
123
+
124
+ def line_start_regex
125
+ /^(\s*)#{comment}\s?/
126
+ end
127
+
128
+ def starts_with_comment?(line)
129
+ line =~ line_start_regex
130
+ end
131
+
132
+ def strip_comment(line, offset=nil)
133
+ new_line = line.clone
134
+ if offset and offset != 0 and
135
+ new_line[0..offset] !~ /^\s*$/
136
+ new_line[offset..(offset + comment.length)] = ""
137
+ @point_comment_removed = offset
138
+ new_line
139
+ else
140
+ md = line.match(line_start_regex)
141
+ @point_comment_removed = md[1].length
142
+ md[1] + md.post_match
143
+ end
144
+ end
145
+
146
+ def add_comment(line, offset)
147
+ if line.length < offset
148
+ line + " "*(offset - line.length) + comment + " "
149
+ else
150
+ line.clone.insert(offset, comment + " ")
151
+ end
152
+ end
153
+
154
+ def comment_insertion_point_for(line)
155
+ md = line.match(/^(\s*)([^\s])/)
156
+ md[1].length
157
+ end
158
+
159
+ def execute
160
+ type = Comment.comment_map["#{tab.edit_view.grammar.gsub("\"","")}"]
161
+ if type
162
+ @comment = type["line_comment"]
163
+ return unless comment
164
+ else
165
+ Comment.grammar_missing(tab.edit_view.grammar)
166
+ @comment = Comment.storage['default_line_comment']
167
+ end
168
+ selected = doc.selection?
169
+ cursor_offset = doc.cursor_offset
170
+ selection_offset = doc.selection_offset
171
+ cursor_line = doc.cursor_line
172
+ selection_line = doc.selection_line
173
+ cursor_line_offset = doc.cursor_line_offset
174
+ selection_line_offset = doc.selection_line_offset
175
+ if cursor_offset < selection_offset
176
+ start_point_offset = cursor_offset
177
+ end_point_offset = selection_offset
178
+ start_point_line = cursor_line
179
+ start_point_line_offset = cursor_line_offset
180
+ else
181
+ start_point_offset = selection_offset
182
+ end_point_offset = cursor_offset
183
+ start_point_line = selection_line
184
+ start_point_line_offset = selection_line_offset
185
+ end
186
+ start_line = doc.line_at_offset(start_point_offset)
187
+ end_line = doc.line_at_offset(end_point_offset)
188
+
189
+ if doc.offset_at_line(end_line) == end_point_offset and start_line != end_line
190
+ end_line -= 1
191
+ end
192
+
193
+ doc.controllers(Redcar::AutoIndenter::DocumentController).first.disable do
194
+ doc.compound do
195
+ all_lines_are_already_commented = true
196
+ start_line_comment_offset = nil
197
+ insertion_column = 1000
198
+
199
+ (start_line..end_line).each do |line|
200
+ text = doc.get_line(line)
201
+ if text.length <= insertion_column + 1 and text =~ /^\s*$/
202
+ else
203
+ insertion_column = [insertion_column, comment_insertion_point_for(text)].min
204
+ end
205
+
206
+ if line == start_point_line and selected
207
+ text = text[start_point_line_offset..-1]
208
+ end
209
+
210
+ unless starts_with_comment?(text)
211
+ all_lines_are_already_commented = false
212
+ end
213
+ end
214
+
215
+ if all_lines_are_already_commented
216
+ (start_line..end_line).each do |line|
217
+ doc.replace_line(line) do |text|
218
+ new_text =
219
+ if line == start_point_line and selected
220
+ strip_comment(text, start_point_line_offset)
221
+ else
222
+ strip_comment(text)
223
+ end
224
+ diff = text.length - new_text.length
225
+ if cursor_offset < selection_offset
226
+ selection_offset -= diff
227
+ else
228
+ if cursor_line > line or (cursor_line == line and cursor_line_offset > @point_comment_removed)
229
+ cursor_offset -= diff
230
+ end
231
+ end
232
+ new_text
233
+ end
234
+ end
235
+ else
236
+ (start_line..end_line).each do |line|
237
+ doc.replace_line(line) do |text|
238
+ new_text = if line == start_point_line and selected
239
+ add_comment(text, [start_point_line_offset, insertion_column].max)
240
+ else
241
+ add_comment(text, insertion_column)
242
+ end
243
+ diff = new_text.length - text.length
244
+ if cursor_offset < selection_offset
245
+ selection_offset += diff
246
+ else
247
+ if cursor_line > line or (cursor_line == line and cursor_line_offset > insertion_column)
248
+ cursor_offset += diff
249
+ end
250
+ end
251
+ new_text
252
+ end
253
+ end
254
+ end
255
+ end
256
+ end
257
+
258
+ if selected
259
+ doc.set_selection_range(cursor_offset, selection_offset)
260
+ else
261
+ doc.set_selection_range(cursor_offset, cursor_offset)
262
+ end
263
+ end
264
+ end
265
+ end
266
+ end