redcar 0.12.1 → 0.13

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 (84) hide show
  1. data/CHANGES +18 -0
  2. data/bin/redcar +1 -0
  3. data/lib/redcar.rb +4 -5
  4. data/lib/redcar/usage.rb +0 -1
  5. data/lib/redcar_quick_start.rb +3 -1
  6. data/plugins/application/lib/application.rb +1 -0
  7. data/plugins/application/lib/application/commands/treebook_commands.rb +11 -18
  8. data/plugins/application/lib/application/dialog.rb +1 -1
  9. data/plugins/application/lib/application/dialogs/filter_list_dialog.rb +13 -5
  10. data/plugins/application/lib/application/global_state.rb +21 -0
  11. data/plugins/application/lib/application/menu/item.rb +37 -11
  12. data/plugins/application/lib/application/notebook.rb +12 -0
  13. data/plugins/application/lib/application/tree/mirror.rb +0 -11
  14. data/plugins/application/lib/application/window.rb +32 -7
  15. data/plugins/application_swt/lib/application_swt.rb +1 -1
  16. data/plugins/application_swt/lib/application_swt/dialogs/filter_list_dialog_controller.rb +35 -10
  17. data/plugins/application_swt/lib/application_swt/icon.rb +1 -1
  18. data/plugins/application_swt/lib/application_swt/menu.rb +47 -15
  19. data/plugins/application_swt/lib/application_swt/notebook.rb +11 -2
  20. data/plugins/application_swt/lib/application_swt/window.rb +37 -34
  21. data/plugins/auto_indenter/lib/auto_indenter/analyzer.rb +1 -1
  22. data/plugins/auto_indenter/spec/auto_indenter/analyzer_spec.rb +9 -0
  23. data/plugins/declarations/lib/declarations.rb +31 -66
  24. data/plugins/declarations/lib/declarations/commands.rb +142 -0
  25. data/plugins/declarations/lib/declarations/file.rb +1 -1
  26. data/plugins/{outline_view → declarations}/spec/fixtures/some_project/javascript.js +0 -0
  27. data/plugins/{outline_view → declarations}/spec/fixtures/some_project/nothing_to_see.rb +0 -0
  28. data/plugins/{outline_view → declarations}/spec/fixtures/some_project/one_lonely_class.rb +0 -0
  29. data/plugins/{outline_view → declarations}/spec/fixtures/some_project/similar_names.rb +0 -0
  30. data/plugins/{outline_view → declarations}/spec/fixtures/some_project/something_fancy.rb +0 -0
  31. data/plugins/{outline_view → declarations}/spec/fixtures/some_project/trailing_space.rb +0 -0
  32. data/plugins/edit_view/lib/edit_view.rb +35 -2
  33. data/plugins/edit_view/lib/edit_view/commands/change_language_command.rb +31 -0
  34. data/plugins/edit_view/lib/edit_view/commands/language_settings_commands.rb +45 -0
  35. data/plugins/edit_view/lib/edit_view/document/command.rb +1 -1
  36. data/plugins/edit_view/lib/edit_view/edit_tab.rb +11 -13
  37. data/plugins/key_bindings/lib/key_bindings.rb +6 -2
  38. data/plugins/project/lib/project.rb +27 -32
  39. data/plugins/project/lib/project/commands.rb +3 -88
  40. data/plugins/project/lib/project/dir_controller.rb +12 -18
  41. data/plugins/project/lib/project/dir_mirror.rb +20 -25
  42. data/plugins/project/lib/project/file_mirror.rb +10 -10
  43. data/plugins/project/lib/project/find_file_dialog.rb +20 -18
  44. data/plugins/project/lib/project/find_recent_dialog.rb +6 -3
  45. data/plugins/project/lib/project/{adapters/local.rb → local_filesystem.rb} +35 -35
  46. data/plugins/project/lib/project/manager.rb +21 -75
  47. data/plugins/project/lib/project/sub_project.rb +3 -3
  48. data/plugins/project/plugin.rb +0 -1
  49. data/plugins/project_search/lib/project_search/lucene_refresh.rb +0 -1
  50. data/plugins/redcar/plugin.rb +2 -2
  51. data/plugins/redcar/redcar.rb +34 -42
  52. data/plugins/ruby/lib/ruby/syntax_checker.rb +27 -7
  53. data/plugins/scm/lib/scm.rb +1 -12
  54. data/plugins/sessions/lib/sessions.rb +22 -0
  55. data/plugins/sessions/lib/sessions/cursor_saver.rb +162 -0
  56. data/plugins/sessions/lib/sessions/loader.rb +99 -0
  57. data/plugins/sessions/lib/sessions/memory.rb +59 -0
  58. data/plugins/sessions/plugin.rb +8 -0
  59. data/plugins/strip_trailing_spaces/lib/strip_trailing_spaces.rb +2 -2
  60. data/plugins/syntax_check/lib/syntax_check.rb +2 -2
  61. data/plugins/tree_view_swt/lib/tree_view_swt.rb +1 -3
  62. data/redcar.gemspec +1 -1
  63. metadata +195 -291
  64. data/plugins/connection_manager/lib/connection_manager.rb +0 -57
  65. data/plugins/connection_manager/lib/connection_manager/commands.rb +0 -14
  66. data/plugins/connection_manager/lib/connection_manager/connection_store.rb +0 -87
  67. data/plugins/connection_manager/lib/connection_manager/controller.rb +0 -100
  68. data/plugins/connection_manager/lib/connection_manager/filter_dialog.rb +0 -38
  69. data/plugins/connection_manager/lib/connection_manager/private_key_store.rb +0 -93
  70. data/plugins/connection_manager/plugin.rb +0 -12
  71. data/plugins/connection_manager/views/index.html.erb +0 -284
  72. data/plugins/edit_view/lib/edit_view/info_speedbar.rb +0 -98
  73. data/plugins/outline_view/features/outline_view.feature +0 -79
  74. data/plugins/outline_view/features/project_outline.feature +0 -23
  75. data/plugins/outline_view/features/step_definitions/outline_steps.rb +0 -61
  76. data/plugins/outline_view/lib/outline_view.rb +0 -97
  77. data/plugins/outline_view/lib/outline_view/commands.rb +0 -19
  78. data/plugins/outline_view/plugin.rb +0 -10
  79. data/plugins/outline_view_swt/lib/outline_view_swt.rb +0 -79
  80. data/plugins/outline_view_swt/plugin.rb +0 -7
  81. data/plugins/project/lib/project/adapters/remote.rb +0 -96
  82. data/plugins/project/lib/project/adapters/remote_protocols/ftp.rb +0 -93
  83. data/plugins/project/lib/project/adapters/remote_protocols/protocol.rb +0 -94
  84. data/plugins/project/lib/project/adapters/remote_protocols/sftp.rb +0 -181
@@ -4,7 +4,7 @@ module Redcar
4
4
  module Icon
5
5
  def self.swt_image(icon)
6
6
  case icon
7
- when :directory
7
+ when :directory, :dir
8
8
  dir_image
9
9
  when :file
10
10
  file_image
@@ -16,8 +16,6 @@ module Redcar
16
16
 
17
17
  attr_reader :menu_bar
18
18
 
19
-
20
-
21
19
  def self.menu_types
22
20
  [Swt::SWT::BAR, Swt::SWT::POP_UP]
23
21
  end
@@ -31,11 +29,13 @@ module Redcar
31
29
  @keymap = keymap
32
30
  @menu_bar = Swt::Widgets::Menu.new(window.shell, type)
33
31
  @menu_bar.set_visible(false)
32
+
34
33
  return unless menu_model
35
34
  @handlers = []
36
35
  @use_numbers = options[:numbers]
37
36
  @number = 1
38
- add_entries_to_menu(@menu_bar, menu_model)
37
+
38
+ add_entries_to_menu(@menu_bar, nil, menu_model)
39
39
  #puts "ApplicationSWT::Menu initialize took #{Time.now - s}s"
40
40
  end
41
41
 
@@ -59,7 +59,26 @@ module Redcar
59
59
  @use_numbers
60
60
  end
61
61
 
62
- def add_entries_to_menu(menu, menu_model)
62
+ class MenuListener
63
+ attr_reader :items
64
+
65
+ def initialize
66
+ @items = []
67
+ end
68
+
69
+ def menu_shown(e)
70
+ items.each do |item, entry|
71
+ if entry.type == :check
72
+ item.setSelection(entry.checked?)
73
+ end
74
+ end
75
+ end
76
+
77
+ def menu_hidden(e)
78
+ end
79
+ end
80
+
81
+ def add_entries_to_menu(menu, menu_listener, menu_model)
63
82
  menu_model.each do |entry|
64
83
  if entry.is_a?(Redcar::Menu::LazyMenu)
65
84
  menu_header = Swt::Widgets::MenuItem.new(menu, Swt::SWT::CASCADE)
@@ -68,7 +87,7 @@ module Redcar
68
87
  menu_header.menu = new_menu
69
88
  menu_header.add_arm_listener do
70
89
  new_menu.get_items.each {|i| i.dispose }
71
- add_entries_to_menu(new_menu, entry)
90
+ add_entries_to_menu(new_menu, nil, entry)
72
91
  end
73
92
  elsif entry.is_a?(Redcar::Menu)
74
93
  menu_header = Swt::Widgets::MenuItem.new(menu, Swt::SWT::CASCADE)
@@ -76,7 +95,9 @@ module Redcar
76
95
  new_menu = Swt::Widgets::Menu.new(menu)
77
96
  menu_header.menu = new_menu
78
97
  menu_header.enabled = (entry.length > 0)
79
- add_entries_to_menu(new_menu, entry)
98
+ new_menu_listener = MenuListener.new
99
+ add_entries_to_menu(new_menu, new_menu_listener, entry)
100
+ new_menu.add_menu_listener(new_menu_listener)
80
101
  menu_header.add_arm_listener do
81
102
  entry.entries.zip(new_menu.get_items) do |sub_entry, swt_item|
82
103
  if sub_entry.lazy_text?
@@ -88,12 +109,15 @@ module Redcar
88
109
  item = Swt::Widgets::MenuItem.new(menu, Swt::SWT::SEPARATOR)
89
110
  elsif entry.is_a?(Redcar::Menu::Item)
90
111
  item = Swt::Widgets::MenuItem.new(menu, Menu.types[entry.type] || Swt::SWT::PUSH)
91
- item.setSelection(entry.active)
92
112
  if entry.command.is_a?(Proc)
93
113
  connect_proc_to_item(item, entry)
94
114
  else
95
115
  connect_command_to_item(item, entry)
96
116
  end
117
+ if [:check, :radio].include? entry.type
118
+ menu_listener.items << [item, entry] if menu_listener
119
+ item.setSelection(entry.checked?)
120
+ end
97
121
  else
98
122
  raise "unknown object of type #{entry.class} in menu"
99
123
  end
@@ -121,7 +145,11 @@ module Redcar
121
145
  else
122
146
  item.text = entry.text
123
147
  end
124
- item.addSelectionListener(ProcSelectionListener.new(entry))
148
+ if entry.enabled?
149
+ item.addSelectionListener(ProcSelectionListener.new(entry))
150
+ else
151
+ item.enabled = false
152
+ end
125
153
  end
126
154
 
127
155
  class SelectionListener
@@ -151,14 +179,18 @@ module Redcar
151
179
  else
152
180
  item.text = entry.text
153
181
  end
154
- item.add_selection_listener(SelectionListener.new(entry))
155
- h = entry.command.add_listener(:active_changed) do |value|
156
- unless item.disposed
157
- item.enabled = value
182
+ if entry.enabled?
183
+ item.add_selection_listener(SelectionListener.new(entry))
184
+ h = entry.command.add_listener(:active_changed) do |value|
185
+ unless item.disposed
186
+ item.enabled = value
187
+ end
158
188
  end
159
- end
160
- @handlers << [entry.command, h]
161
- if not entry.command.active?
189
+ @handlers << [entry.command, h]
190
+ if not entry.command.active?
191
+ item.enabled = false
192
+ end
193
+ else
162
194
  item.enabled = false
163
195
  end
164
196
  end
@@ -104,6 +104,12 @@ module Redcar
104
104
  def attach_view_listeners
105
105
  @tab_folder.add_ctab_folder2_listener(CTabFolder2Listener.new(self))
106
106
  @tab_folder.add_selection_listener(SelectionListener.new(self))
107
+ @tab_folder.add_listener(Swt::SWT::MenuDetect) do |event|
108
+ point = ApplicationSWT.display.map(nil, @tab_folder, Swt::Graphics::Point.new(event.x, event.y))
109
+ if item = @tab_folder.getItem(point)
110
+ @model.right_click_on_tab(tab_item_to_tab_model(item))
111
+ end
112
+ end
107
113
  end
108
114
 
109
115
  # Called by the models when a tab is selected by Redcar.
@@ -139,8 +145,11 @@ module Redcar
139
145
  private
140
146
 
141
147
  def focussed_tab
142
- focussed_tab_item = tab_folder.get_selection
143
- @model.tabs.detect {|tab| tab.controller.item == focussed_tab_item }
148
+ tab_item_to_tab_model(tab_folder.get_selection)
149
+ end
150
+
151
+ def tab_item_to_tab_model(tab_item)
152
+ @model.tabs.detect {|tab| tab.controller.item == tab_item }
144
153
  end
145
154
 
146
155
  end
@@ -2,11 +2,11 @@
2
2
  module Redcar
3
3
  class ApplicationSWT
4
4
  class Window
5
- attr_reader :shell, :window
5
+ attr_reader :shell, :window, :sash
6
6
 
7
7
  SASH_WIDTH = 5
8
- TREEBOOK_WIDTH = 200
9
8
  MINIMUM_TREEBOOK_WIDTH = 0
9
+ TREEBOOK_WIDTH = 200
10
10
  VISIBLE_TREEBOOK_WIDTH = 25
11
11
  TOOLBAR_HEIGHT = 25
12
12
  @toolbar_height = 30
@@ -67,8 +67,7 @@ module Redcar
67
67
  @window.add_listener(:speedbar_closed, &method(:speedbar_closed))
68
68
  @window.add_listener(:enlarge_notebook, &method(:enlarge_notebook))
69
69
  @window.add_listener(:reset_notebook_widths, &method(:reset_notebook_sash_widths))
70
- @window.add_listener(:increase_treebook_width, &method(:increase_treebook_width))
71
- @window.add_listener(:decrease_treebook_width, &method(:decrease_treebook_width))
70
+ @window.add_listener(:treebook_width_changed, &method(:set_sash_widths))
72
71
 
73
72
  @window.add_listener(:toggle_trees_visible, &method(:toggle_sash_widths))
74
73
  @window.treebook.add_listener(:tree_added) do
@@ -87,19 +86,34 @@ module Redcar
87
86
  @window.treebook.add_listener(:tree_removed) do
88
87
  reset_sash_widths
89
88
  end
89
+
90
90
  @shell.add_key_listener(KeyListener.new(self))
91
+ @sash.add_selection_listener do |e|
92
+ @treebook_open_width = e.x
93
+ end
91
94
  end
92
95
 
93
- def treebook_hidden?
94
- treebook_width <= VISIBLE_TREEBOOK_WIDTH
96
+ def default_treebook_width
97
+ TREEBOOK_WIDTH + SASH_WIDTH
95
98
  end
96
99
 
97
100
  def treebook_width
98
101
  @sash.layout_data.left.offset
99
102
  end
100
103
 
101
- def default_treebook_width
102
- TREEBOOK_WIDTH + SASH_WIDTH
104
+ def treebook_open_width
105
+ @treebook_open_width || default_treebook_width
106
+ end
107
+
108
+ def set_treebook_open_width(width)
109
+ @treebook_open_width = width
110
+ unless treebook_hidden?
111
+ set_sash_widths(width)
112
+ end
113
+ end
114
+
115
+ def treebook_hidden?
116
+ treebook_width <= VISIBLE_TREEBOOK_WIDTH
103
117
  end
104
118
 
105
119
  def fullscreen
@@ -109,6 +123,17 @@ module Redcar
109
123
  def fullscreen=(value)
110
124
  @shell.setFullScreen(value)
111
125
  end
126
+
127
+ def bounds
128
+ rect = @shell.bounds
129
+ [rect.x, rect.y, rect.width, rect.height]
130
+ end
131
+
132
+ def set_bounds(new_bounds)
133
+ @shell.set_bounds(
134
+ Java::OrgEclipseSwtGraphics::Rectangle.new(
135
+ new_bounds[0], new_bounds[1], new_bounds[2], new_bounds[3]))
136
+ end
112
137
 
113
138
  class KeyListener
114
139
  def initialize(edit_view_swt)
@@ -116,18 +141,13 @@ module Redcar
116
141
  end
117
142
 
118
143
  def key_pressed(key_event)
119
- p key_event
120
144
  if key_event.character == Swt::SWT::TAB
121
- p :tab_pressedwin
122
145
  elsif key_event.character == Swt::SWT::ESC
123
- p :esc_pressedwin
124
146
  end
125
147
  end
126
148
 
127
149
  def verify_key(key_event)
128
- p :verkey
129
150
  if key_event.character == Swt::SWT::TAB
130
- p :tab_pressed
131
151
  key_event.doit = false
132
152
  end
133
153
  end
@@ -138,9 +158,7 @@ module Redcar
138
158
 
139
159
  def create_treebook_controller
140
160
  treebook = @window.treebook
141
- controller = ApplicationSWT::Treebook.new(
142
- self,
143
- treebook)
161
+ controller = ApplicationSWT::Treebook.new(self, treebook)
144
162
  treebook.controller = controller
145
163
  end
146
164
 
@@ -353,11 +371,7 @@ module Redcar
353
371
  @treebook_unopened = !@window.treebook.trees.any?
354
372
  width = 0
355
373
  if @window.treebook.trees.any?
356
- if @treebook_open_width
357
- width = @treebook_open_width
358
- else
359
- width = default_treebook_width
360
- end
374
+ width = treebook_open_width
361
375
  end
362
376
  set_sash_widths(width)
363
377
  end
@@ -370,23 +384,12 @@ module Redcar
370
384
  set_sash_widths(MINIMUM_TREEBOOK_WIDTH)
371
385
  end
372
386
  end
373
-
374
- def decrease_treebook_width
375
- width = treebook_width
376
- unless width < MINIMUM_TREEBOOK_WIDTH + SASH_WIDTH
377
- set_sash_widths(width-SASH_WIDTH)
378
- end
379
- end
380
-
381
- def increase_treebook_width
382
- set_sash_widths(treebook_width+SASH_WIDTH)
383
- end
384
-
387
+
385
388
  def set_sash_widths(offset)
386
389
  @sash.layout_data.left = Swt::Layout::FormAttachment.new(0, offset)
387
390
  @shell.layout
388
391
  end
389
-
392
+
390
393
  def reset_notebook_sash_widths
391
394
  width = (100/@window.notebooks.length).to_i
392
395
  widths = [width]*@window.notebooks.length
@@ -52,7 +52,7 @@ module Redcar
52
52
  return 0, indent_next_line
53
53
  end
54
54
  line = @doc.get_line(current)
55
- if rules.unindented_line?(line)
55
+ if rules.unindented_line?(line) or line =~ /^\s*$/
56
56
  current -= 1
57
57
  else
58
58
  if indent_next_line == nil
@@ -58,6 +58,15 @@ RUBY
58
58
  should_indent(<<RUBY, :line => 1, :indent => 0)
59
59
  def foo
60
60
  end # should be dedented
61
+ RUBY
62
+ end
63
+
64
+ it "should ignore blank lines as part of the indentation" do
65
+ should_indent(<<RUBY, :line => 3, :indent => 1)
66
+ def foo
67
+ end
68
+
69
+ def foo
61
70
  RUBY
62
71
  end
63
72
  end
@@ -1,4 +1,5 @@
1
1
 
2
+ require 'declarations/commands'
2
3
  require 'declarations/completion_source'
3
4
  require 'declarations/file'
4
5
  require 'declarations/parser'
@@ -9,8 +10,17 @@ module Redcar
9
10
  class Declarations
10
11
  def self.menus
11
12
  Menu::Builder.build do
13
+ sub_menu "Edit" do
14
+ group :priority => 30 do
15
+ item "Find declaration", :command => Declarations::OpenOutlineViewCommand
16
+ end
17
+ end
18
+
12
19
  sub_menu "Project" do
13
- item "Go to declaration", :command => Declarations::GoToTagCommand, :priority => 30
20
+ group :priority => 60 do
21
+ item "Go to declaration", :command => Declarations::GoToTagCommand, :priority => 30
22
+ item "Find declaration", :command => Declarations::OpenProjectOutlineViewCommand, :priority => :first
23
+ end
14
24
  sub_menu "Refresh", :priority => 31 do
15
25
  item "Declarations file", :command => Declarations::RebuildTagsCommand
16
26
  end
@@ -21,10 +31,14 @@ module Redcar
21
31
  def self.keymaps
22
32
  linwin = Keymap.build("main", [:linux, :windows]) do
23
33
  link "Alt+G", Declarations::GoToTagCommand
34
+ link "Ctrl+I", Declarations::OpenOutlineViewCommand
35
+ link "Ctrl+Shift+I", Declarations::OpenProjectOutlineViewCommand
24
36
  end
25
37
 
26
38
  osx = Keymap.build("main", :osx) do
27
39
  link "Ctrl+Alt+G", Declarations::GoToTagCommand
40
+ link "Cmd+I", Declarations::OpenOutlineViewCommand
41
+ link "Cmd+Ctrl+I", Declarations::OpenProjectOutlineViewCommand
28
42
  end
29
43
 
30
44
  [linwin, osx]
@@ -38,6 +52,20 @@ module Redcar
38
52
  ::File.join(project.config_dir, 'tags')
39
53
  end
40
54
 
55
+ def self.icon_for_kind(kind)
56
+ h = {
57
+ :method => :node_insert,
58
+ :class => :open_source_flipped,
59
+ :attribute => :status,
60
+ :alias => :arrow_branch,
61
+ :assignment => :arrow,
62
+ :interface => :information,
63
+ :closure => :node_magnifier,
64
+ :none => nil
65
+ }
66
+ h[kind.to_sym]
67
+ end
68
+
41
69
  class ProjectRefresh < Task
42
70
  def initialize(project)
43
71
  @file_list = project.file_list
@@ -49,7 +77,6 @@ module Redcar
49
77
  end
50
78
 
51
79
  def execute
52
- return if @project.remote?
53
80
  file = Declarations::File.new(Declarations.file_path(@project))
54
81
  file.update_files(@file_list)
55
82
  file.dump
@@ -78,9 +105,9 @@ module Redcar
78
105
  end
79
106
  end
80
107
 
81
- def self.match_kind(path, regex)
108
+ def self.match_kind(path, regex)
82
109
  Declarations::Parser.new.match_kind(path, regex)
83
- end
110
+ end
84
111
 
85
112
  def self.clear_tags_for_path(path)
86
113
  @tags_for_path ||= {}
@@ -93,67 +120,5 @@ module Redcar
93
120
  regexp = Regexp.new(Regexp.escape(match[:match]))
94
121
  DocumentSearch::FindNextRegex.new(regexp, true).run_in_focussed_tab_edit_view
95
122
  end
96
-
97
- class RebuildTagsCommand < Command
98
- def execute
99
- project = Project::Manager.focussed_project
100
- tags_path = Declarations.file_path(project)
101
- FileUtils.rm tags_path if ::File.exists? tags_path
102
- ProjectRefresh.new(project).execute
103
- end
104
- end
105
-
106
- class GoToTagCommand < EditTabCommand
107
- sensitize :open_project
108
-
109
- def execute
110
- if Project::Manager.focussed_project.remote?
111
- Application::Dialog.message_box("Go to declaration doesn't work in remote projects yet :(")
112
- return
113
- end
114
-
115
- if doc.selection?
116
- handle_tag(doc.selected_text)
117
- else
118
- range = doc.current_word_range
119
- handle_tag(doc.get_slice(range.first, range.last))
120
- end
121
- end
122
-
123
- def handle_tag(token = '')
124
- tags_path = Declarations.file_path(Project::Manager.focussed_project)
125
- unless ::File.exist?(tags_path)
126
- Application::Dialog.message_box("The declarations file 'tags' has not been generated yet.")
127
- return
128
- end
129
- matches = find_tag(tags_path, token).uniq
130
-
131
- # save current cursor position before jump to another location.
132
- Redcar.app.navigation_history.save(doc) if matches.size > 0
133
-
134
- case matches.size
135
- when 0
136
- Application::Dialog.message_box("There is no declaration for '#{token}' in the 'tags' file.")
137
- when 1
138
- Redcar::Declarations.go_to_definition(matches.first)
139
- else
140
- open_select_tag_dialog(matches)
141
- end
142
-
143
- Redcar.app.navigation_history.save(doc) if matches.size > 0
144
- end
145
-
146
- def find_tag(tags_path, tag)
147
- Declarations.tags_for_path(tags_path)[tag] || []
148
- end
149
-
150
- def open_select_tag_dialog(matches)
151
- Declarations::SelectTagDialog.new(matches).open
152
- end
153
-
154
- def log(message)
155
- puts("==> Ctags: #{message}")
156
- end
157
- end
158
123
  end
159
124
  end