redcar 0.12.1 → 0.13

Sign up to get free protection for your applications and to get access to all the features.
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