vimmate 0.8.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.autotest +10 -0
- data/CHANGELOG +108 -0
- data/COPYING +20 -0
- data/README +221 -0
- data/Rakefile +31 -0
- data/TODO +21 -0
- data/bin/vimmate +105 -0
- data/config/environment.rb +35 -0
- data/controllers/file_filter_controller.rb +101 -0
- data/controllers/file_popup_menu_controller.rb +40 -0
- data/controllers/vim_controller.rb +28 -0
- data/controllers/vim_mate_controller.rb +76 -0
- data/images/file.png +0 -0
- data/images/file_green.png +0 -0
- data/images/file_orange.png +0 -0
- data/images/file_red.png +0 -0
- data/images/folder.png +0 -0
- data/images/folder_green.png +0 -0
- data/images/folder_orange.png +0 -0
- data/images/folder_red.png +0 -0
- data/images/processing.png +0 -0
- data/images/svn_added.png +0 -0
- data/images/svn_conflict.png +0 -0
- data/images/svn_deleted.png +0 -0
- data/images/svn_locked.png +0 -0
- data/images/svn_modified.png +0 -0
- data/images/svn_normal.png +0 -0
- data/images/svn_readonly.png +0 -0
- data/images/vimmate16.png +0 -0
- data/images/vimmate32.png +0 -0
- data/images/vimmate48.png +0 -0
- data/lib/active_window/active_column.rb +218 -0
- data/lib/active_window/active_tree_store/columns.rb +88 -0
- data/lib/active_window/active_tree_store/extentions.rb +81 -0
- data/lib/active_window/active_tree_store/index.rb +53 -0
- data/lib/active_window/active_tree_store.rb +26 -0
- data/lib/active_window/application.rb +137 -0
- data/lib/active_window/controller.rb +58 -0
- data/lib/active_window/dot_file.rb +29 -0
- data/lib/active_window/filtered_active_tree_store.rb +113 -0
- data/lib/active_window/listed_item.rb +127 -0
- data/lib/active_window/signal.rb +46 -0
- data/lib/active_window.rb +8 -0
- data/lib/config_window.rb +90 -0
- data/lib/file_tree_store.rb +74 -0
- data/lib/filtered_file_tree_store.rb +34 -0
- data/lib/gtk_thread_helper.rb +73 -0
- data/lib/listed_directory.rb +45 -0
- data/lib/listed_file.rb +67 -0
- data/lib/try.rb +9 -0
- data/lib/vim/buffers.rb +18 -0
- data/lib/vim/integration.rb +38 -0
- data/lib/vim/netbeans.rb +154 -0
- data/lib/vim/source.vim +18 -0
- data/lib/vim_mate/config.rb +132 -0
- data/lib/vim_mate/dummy_window.rb +14 -0
- data/lib/vim_mate/files_menu.rb +110 -0
- data/lib/vim_mate/icons.rb +156 -0
- data/lib/vim_mate/nice_singleton.rb +53 -0
- data/lib/vim_mate/plugins/inotify/init.rb +4 -0
- data/lib/vim_mate/plugins/inotify/lib/INotify.rb +208 -0
- data/lib/vim_mate/plugins/inotify/lib/directory.rb +58 -0
- data/lib/vim_mate/plugins/subversion/init.rb +7 -0
- data/lib/vim_mate/plugins/subversion/lib/file.rb +59 -0
- data/lib/vim_mate/plugins/subversion/lib/menu.rb +96 -0
- data/lib/vim_mate/plugins/subversion/lib/subversion.rb +157 -0
- data/lib/vim_mate/plugins.rb +6 -0
- data/lib/vim_mate/requirer.rb +68 -0
- data/lib/vim_mate/search_window.rb +227 -0
- data/lib/vim_mate/tags_window.rb +167 -0
- data/lib/vim_mate/terminals_window.rb +163 -0
- data/lib/vim_mate/version.rb +29 -0
- data/lib/vim_mate/vim_widget.rb +143 -0
- data/spec/active_window/active_column_spec.rb +41 -0
- data/spec/active_window/active_tree_store_spec.rb +312 -0
- data/spec/active_window/controller_spec.rb +6 -0
- data/spec/lib/file_tree_store_spec.rb +40 -0
- data/spec/lib/listed_directory_spec.rb +26 -0
- data/spec/lib/listed_file_spec.rb +53 -0
- data/spec/nice_singleton_spec.rb +23 -0
- data/spec/spec.opts +6 -0
- data/spec/spec_helper.rb +10 -0
- data/views/vim_mate.glade +500 -0
- data/vimmate.gemspec +138 -0
- metadata +146 -0
@@ -0,0 +1,167 @@
|
|
1
|
+
=begin
|
2
|
+
= VimMate: Vim graphical add-on
|
3
|
+
Copyright (c) 2006 Guillaume Benny
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
|
+
this software and associated documentation files (the "Software"), to deal in
|
7
|
+
the Software without restriction, including without limitation the rights to
|
8
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
9
|
+
of the Software, and to permit persons to whom the Software is furnished to do
|
10
|
+
so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
22
|
+
=end
|
23
|
+
|
24
|
+
module VimMate
|
25
|
+
|
26
|
+
class TagsWindow
|
27
|
+
|
28
|
+
#treestore columns
|
29
|
+
# Column for the tag name
|
30
|
+
NAME = 0
|
31
|
+
# Column for the line it is in
|
32
|
+
LINE = 1
|
33
|
+
PATH = 2
|
34
|
+
|
35
|
+
#path_node_connection columns
|
36
|
+
NODE = 0
|
37
|
+
METHODS = 1
|
38
|
+
CLASSES = 2
|
39
|
+
|
40
|
+
def add_parent_rows(paths)
|
41
|
+
#add some parents
|
42
|
+
@path_node_connection = Hash.new(false)
|
43
|
+
paths.each do |path|
|
44
|
+
node = @tags_treestore.append(nil)
|
45
|
+
node[0] = path.split('/').last
|
46
|
+
node[1] = ''
|
47
|
+
node[2] = ''
|
48
|
+
methods = @tags_treestore.append(node)
|
49
|
+
methods[0] = 'Methods'
|
50
|
+
methods[1] = ''
|
51
|
+
methods[2] = ''
|
52
|
+
classes = @tags_treestore.append(node)
|
53
|
+
classes[0] = 'Classes'
|
54
|
+
classes[1] = ''
|
55
|
+
classes[2] = ''
|
56
|
+
@path_node_connection[path] = [node, methods, classes]
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def initialize(vim_window = FalseClass)
|
61
|
+
@vim_window = vim_window
|
62
|
+
@tags_treestore = Gtk::TreeStore.new(String,String,String)
|
63
|
+
|
64
|
+
# Tree View
|
65
|
+
@tags_tree_view = Gtk::TreeView.new(@tags_treestore)
|
66
|
+
@tags_tree_view.selection.mode = Gtk::SELECTION_SINGLE
|
67
|
+
@tags_tree_view.headers_visible = Config[:file_headers_visible]
|
68
|
+
@tags_tree_view.hover_selection = Config[:file_hover_selection]
|
69
|
+
|
70
|
+
tags_renderer = Gtk::CellRendererText.new
|
71
|
+
col = Gtk::TreeViewColumn.new("Identifier", tags_renderer, :text => NAME)
|
72
|
+
@tags_tree_view.append_column(col)
|
73
|
+
col = Gtk::TreeViewColumn.new("Line", tags_renderer, :text => LINE)
|
74
|
+
@tags_tree_view.append_column(col)
|
75
|
+
|
76
|
+
# Double-click, Enter, Space: Signal to open the file
|
77
|
+
@tags_tree_view.signal_connect("row-activated") do |view, path, column|
|
78
|
+
iter = @tags_treestore.get_iter(path)
|
79
|
+
@vim_window.open_and_jump_to_line iter[PATH], iter[LINE].to_i
|
80
|
+
end
|
81
|
+
|
82
|
+
Signal.on_file_opened do |path|
|
83
|
+
sleep 0.5
|
84
|
+
do_refresh_tags
|
85
|
+
end
|
86
|
+
|
87
|
+
#@tags_text_buffer = Gtk::TextBuffer.new()
|
88
|
+
#gtk_text_view = Gtk::TextView.new(@tags_text_buffer)
|
89
|
+
#gtk_text_view.editable = false
|
90
|
+
#gtk_text_view.cursor_visible = false
|
91
|
+
|
92
|
+
# Set the default size for the file list
|
93
|
+
|
94
|
+
Signal.on_file_modified do |path|
|
95
|
+
paths = @vim_window.get_all_buffer_paths
|
96
|
+
if paths.include?(path)
|
97
|
+
do_refresh_tags
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
#Signal.on_file_deleted do |path|
|
102
|
+
# #do_refresh_tags
|
103
|
+
#end
|
104
|
+
|
105
|
+
#Signal.on_file_created do |path|
|
106
|
+
# #do_refresh_tags
|
107
|
+
#end
|
108
|
+
end
|
109
|
+
|
110
|
+
# The "window" for this object
|
111
|
+
def gtk_window
|
112
|
+
@tags_tree_view
|
113
|
+
end
|
114
|
+
|
115
|
+
#TODO:
|
116
|
+
#refresh upon switch to this tab:
|
117
|
+
#switch-page: self, page, page_num
|
118
|
+
#Emitted when the user or a function changes the current page.
|
119
|
+
#
|
120
|
+
# * self: the object which received the signal.
|
121
|
+
# * page: the new current Gtk::NotebookPage
|
122
|
+
# * page_num: the index of the page
|
123
|
+
|
124
|
+
def do_refresh_tags(paths=nil)
|
125
|
+
if not paths
|
126
|
+
paths = @vim_window.get_all_buffer_paths
|
127
|
+
end
|
128
|
+
|
129
|
+
@tags_treestore.clear
|
130
|
+
add_parent_rows(paths)
|
131
|
+
|
132
|
+
paths.each do |path|
|
133
|
+
#TODO make me dependent/configurable on file type/suffix
|
134
|
+
tags = `ctags --sort=1 -ex #{path}`
|
135
|
+
last_class = nil
|
136
|
+
|
137
|
+
whats_a_tag = %r[^(\w+)\s+(\w+\s?\w+)\s+(\d+)\s+(\S+)]
|
138
|
+
tags.each_line do |tag|
|
139
|
+
if elems = whats_a_tag.match(tag)
|
140
|
+
id, type, line, file = elems[1..-1]
|
141
|
+
case type
|
142
|
+
when 'function'
|
143
|
+
new_row = @tags_treestore.append(@path_node_connection[path][METHODS])
|
144
|
+
new_row.set_value(NAME, id)
|
145
|
+
new_row.set_value(LINE, line)
|
146
|
+
new_row.set_value(PATH, file)
|
147
|
+
when 'class'
|
148
|
+
new_row = @tags_treestore.append(@path_node_connection[path][CLASSES])
|
149
|
+
new_row.set_value(NAME, id)
|
150
|
+
new_row.set_value(LINE, line)
|
151
|
+
new_row.set_value(PATH, file)
|
152
|
+
last_class = new_row
|
153
|
+
when /^(singleton )?method|member$/
|
154
|
+
new_row = @tags_treestore.append(last_class)
|
155
|
+
new_row.set_value(NAME, id)
|
156
|
+
new_row.set_value(LINE, line)
|
157
|
+
new_row.set_value(PATH, file)
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
@tags_tree_view.expand_all
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
end
|
@@ -0,0 +1,163 @@
|
|
1
|
+
=begin
|
2
|
+
= VimMate: Vim graphical add-on
|
3
|
+
Copyright (c) 2006 Guillaume Benny
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
|
+
this software and associated documentation files (the "Software"), to deal in
|
7
|
+
the Software without restriction, including without limitation the rights to
|
8
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
9
|
+
of the Software, and to permit persons to whom the Software is furnished to do
|
10
|
+
so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
22
|
+
=end
|
23
|
+
|
24
|
+
require 'set'
|
25
|
+
require 'vte'
|
26
|
+
|
27
|
+
module VimMate
|
28
|
+
|
29
|
+
# Do not load the terminals if they are disabled
|
30
|
+
Requirer.raise_load_error_if do
|
31
|
+
not Config[:terminals_enabled]
|
32
|
+
end
|
33
|
+
|
34
|
+
class ::Vte::Terminal
|
35
|
+
attr_accessor :pid
|
36
|
+
end
|
37
|
+
|
38
|
+
# The window that contains the terminals
|
39
|
+
class TerminalsWindow
|
40
|
+
|
41
|
+
# Create a TerminalsWindow
|
42
|
+
def initialize
|
43
|
+
@expander_signal = Set.new
|
44
|
+
|
45
|
+
# Create the tabbed page
|
46
|
+
@gtk_notebook = Gtk::Notebook.new
|
47
|
+
@gtk_notebook.scrollable = true
|
48
|
+
# Add a terminal at startup
|
49
|
+
@gtk_notebook.append_page(new_terminal)
|
50
|
+
# The last page is just an icon to create new tabs
|
51
|
+
@gtk_notebook.append_page(Gtk::EventBox.new,
|
52
|
+
Gtk::Image.new(Gtk::Stock::NEW, Gtk::IconSize::MENU))
|
53
|
+
# When we try to go to the last page, we create a new terminal instead
|
54
|
+
@gtk_notebook.signal_connect_after("switch-page") do |notebook, page, page_num|
|
55
|
+
add_new_terminal if page_num == (@gtk_notebook.n_pages - 1)
|
56
|
+
end
|
57
|
+
@gtk_notebook.set_size_request(0, Config[:terminals_height])
|
58
|
+
end
|
59
|
+
|
60
|
+
# The "window" for this object
|
61
|
+
def gtk_window
|
62
|
+
@gtk_notebook
|
63
|
+
end
|
64
|
+
|
65
|
+
# Add a block that will be called when the user choose to expand or
|
66
|
+
# close the expander. The block takes one argument: if the expander
|
67
|
+
# is opened or closed
|
68
|
+
def add_expander_signal(&block)
|
69
|
+
@expander_signal << block
|
70
|
+
end
|
71
|
+
|
72
|
+
# Set the focus to the current terminal
|
73
|
+
def focus_terminal
|
74
|
+
page = @gtk_notebook.get_nth_page(@gtk_notebook.page)
|
75
|
+
page.has_focus = true if page
|
76
|
+
end
|
77
|
+
|
78
|
+
# Add a new terminal at the left of the tab bar.
|
79
|
+
def add_new_terminal
|
80
|
+
page_num = @gtk_notebook.n_pages - 1
|
81
|
+
@gtk_notebook.insert_page(page_num, new_terminal)
|
82
|
+
@gtk_notebook.page = page_num
|
83
|
+
end
|
84
|
+
|
85
|
+
# Deletes terminal with number *page_num*, defaults to current page number.
|
86
|
+
def delete_current_terminal
|
87
|
+
page = @gtk_notebook.get_nth_page(@gtk_notebook.page)
|
88
|
+
prev_terminal
|
89
|
+
Process.kill 'HUP', page.pid
|
90
|
+
end
|
91
|
+
|
92
|
+
# Switch the next (right) terminal, if there exists one. Otherwise start
|
93
|
+
# again with the first terminal on the left.
|
94
|
+
def next_terminal
|
95
|
+
if @gtk_notebook.page < @gtk_notebook.n_pages - 2
|
96
|
+
@gtk_notebook.next_page
|
97
|
+
else
|
98
|
+
@gtk_notebook.page = 0
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
# Switch the previous (left) terminal, if there exists one. Otherwise start
|
103
|
+
# with again with the last terminal on the right.
|
104
|
+
def prev_terminal
|
105
|
+
if @gtk_notebook.page > 0
|
106
|
+
@gtk_notebook.prev_page
|
107
|
+
else
|
108
|
+
@gtk_notebook.page = @gtk_notebook.n_pages - 2
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
private
|
113
|
+
|
114
|
+
# Create a new terminal and return it
|
115
|
+
def new_terminal
|
116
|
+
# Setup of the terminal
|
117
|
+
gtk_terminal = Vte::Terminal.new
|
118
|
+
gtk_terminal.audible_bell = Config[:terminals_audible_bell]
|
119
|
+
gtk_terminal.visible_bell = Config[:terminals_visible_bell]
|
120
|
+
gtk_terminal.set_font(Config[:terminals_font])
|
121
|
+
forecolor = Gdk::Color.parse(Config[:terminals_foreground_color])
|
122
|
+
backcolor = Gdk::Color.parse(Config[:terminals_background_color])
|
123
|
+
gtk_terminal.set_colors(forecolor, backcolor, [])
|
124
|
+
|
125
|
+
# Hide and destroy the terminal when the shell exits
|
126
|
+
gtk_terminal.signal_connect("child-exited") do |terminal|
|
127
|
+
break if @gtk_notebook.destroyed?
|
128
|
+
# Select the page before
|
129
|
+
page_num = @gtk_notebook.page_num(terminal)
|
130
|
+
if page_num == 0
|
131
|
+
@gtk_notebook.page = 0
|
132
|
+
else
|
133
|
+
@gtk_notebook.page = page_num - 1
|
134
|
+
end
|
135
|
+
# Hide it and destroy it after a while
|
136
|
+
terminal.hide
|
137
|
+
Thread.new do
|
138
|
+
sleep(5)
|
139
|
+
terminal.destroy unless terminal.destroyed?
|
140
|
+
end
|
141
|
+
end
|
142
|
+
# When the title of the terminal changes, set the name of the page
|
143
|
+
gtk_terminal.signal_connect("window-title-changed") do |terminal|
|
144
|
+
@gtk_notebook.set_tab_label_text(terminal, terminal.window_title)
|
145
|
+
end
|
146
|
+
if (Config[:terminals_login_shell])
|
147
|
+
begin
|
148
|
+
require 'etc'
|
149
|
+
rescue LoadError
|
150
|
+
end
|
151
|
+
shell = (ENV["SHELL"] || Etc.getpwnam(Etc.getlogin).shell rescue nil || "/bin/sh")
|
152
|
+
gtk_terminal.pid = gtk_terminal.fork_command(shell, ["-l"])
|
153
|
+
else
|
154
|
+
gtk_terminal.pid = gtk_terminal.fork_command
|
155
|
+
end
|
156
|
+
gtk_terminal.feed_child(Config[:terminals_autoexec])
|
157
|
+
gtk_terminal.show
|
158
|
+
gtk_terminal
|
159
|
+
end
|
160
|
+
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
=begin
|
2
|
+
= VimMate: Vim graphical add-on
|
3
|
+
Copyright (c) 2006 Guillaume Benny
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
|
+
this software and associated documentation files (the "Software"), to deal in
|
7
|
+
the Software without restriction, including without limitation the rights to
|
8
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
9
|
+
of the Software, and to permit persons to whom the Software is furnished to do
|
10
|
+
so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
22
|
+
=end
|
23
|
+
|
24
|
+
module VimMate
|
25
|
+
|
26
|
+
# VimMate's version
|
27
|
+
VERSION = "0.6.6"
|
28
|
+
end
|
29
|
+
|
@@ -0,0 +1,143 @@
|
|
1
|
+
=begin
|
2
|
+
= VimMate: Vim graphical add-on
|
3
|
+
Copyright (c) 2006 Guillaume Benny
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
|
+
this software and associated documentation files (the "Software"), to deal in
|
7
|
+
the Software without restriction, including without limitation the rights to
|
8
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
9
|
+
of the Software, and to permit persons to whom the Software is furnished to do
|
10
|
+
so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
22
|
+
=end
|
23
|
+
|
24
|
+
|
25
|
+
module VimMate
|
26
|
+
|
27
|
+
# A window that can display and send information to the
|
28
|
+
# GTK GUI of Vim (gVim)
|
29
|
+
class VimWidget
|
30
|
+
|
31
|
+
include Vim::Integration
|
32
|
+
|
33
|
+
# Create the VimWindow. You must call start after this window is visible
|
34
|
+
def initialize
|
35
|
+
# A unique Vim server name
|
36
|
+
@vim_server_name = "VimMate_#{Process.pid}"
|
37
|
+
@gtk_socket = Gtk::Socket.new
|
38
|
+
@gtk_socket.show_all
|
39
|
+
@gtk_socket.signal_connect("delete_event") do
|
40
|
+
false
|
41
|
+
end
|
42
|
+
@gtk_socket.signal_connect("destroy") do
|
43
|
+
Gtk.main_quit
|
44
|
+
end
|
45
|
+
@gtk_socket.can_focus = true
|
46
|
+
@gtk_socket.has_focus = true
|
47
|
+
@vim_started = false
|
48
|
+
end
|
49
|
+
|
50
|
+
# The "window" for this object
|
51
|
+
def window
|
52
|
+
@gtk_socket
|
53
|
+
end
|
54
|
+
|
55
|
+
def extras_source_path
|
56
|
+
File.join( File.dirname(__FILE__), '..', 'vim', 'source.vim')
|
57
|
+
end
|
58
|
+
|
59
|
+
# Open the specified file in Vim
|
60
|
+
def open(path, kind = :open)
|
61
|
+
start
|
62
|
+
path = path.gsub "'", "\\'"
|
63
|
+
case kind
|
64
|
+
when :split
|
65
|
+
remote_send '<ESC><ESC><ESC>:split<CR>'
|
66
|
+
exec_gvim "--remote '#{path}'"
|
67
|
+
when :open, :split
|
68
|
+
exec_gvim "--remote '#{path}'"
|
69
|
+
when :tab
|
70
|
+
exec_gvim "--remote-tab '#{path}'"
|
71
|
+
else
|
72
|
+
raise "Unknow open kind: #{kind}"
|
73
|
+
end
|
74
|
+
remote_send "<ESC><ESC><ESC>:buffer #{path}<CR>"
|
75
|
+
focus!
|
76
|
+
#Signal.emit_file_opened(path)
|
77
|
+
self
|
78
|
+
end
|
79
|
+
|
80
|
+
def open_and_jump_to_line(path,lnum)
|
81
|
+
unless buffer = buffers.index(path)
|
82
|
+
open path, Config[:files_default_open_in_tabs] ? :tab_open : :open
|
83
|
+
sleep 0.5
|
84
|
+
end
|
85
|
+
send_command buffer, 'setDot', [lnum,0]
|
86
|
+
focus!
|
87
|
+
self
|
88
|
+
end
|
89
|
+
|
90
|
+
def jump_to_line(line)
|
91
|
+
start
|
92
|
+
if line >= 0
|
93
|
+
# TODO use neatbeans
|
94
|
+
remote_send "<ESC><ESC><ESC>:#{line}<CR>"
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
# Start Vim's window. This must be called after the window which
|
99
|
+
# will contain Vim is visible.
|
100
|
+
def start
|
101
|
+
return if @vim_started
|
102
|
+
return unless @gtk_socket
|
103
|
+
@vim_started = true
|
104
|
+
listen
|
105
|
+
fork do
|
106
|
+
exec %Q[#{Executable} --servername #{@vim_server_name} --socketid #{@gtk_socket.id} -nb:localhost:#{port}:#{Password} -S #{extras_source_path}]
|
107
|
+
end
|
108
|
+
self
|
109
|
+
end
|
110
|
+
|
111
|
+
# Set the focus to Vim
|
112
|
+
def focus!
|
113
|
+
@gtk_socket.can_focus = true
|
114
|
+
@gtk_socket.has_focus = true
|
115
|
+
end
|
116
|
+
|
117
|
+
def get_current_buffer_path
|
118
|
+
if @vim_started
|
119
|
+
#`gvim --servername #{@vim_server_name} --remote-send ':redir! > outputfile<cr>'`
|
120
|
+
#`gvim --servername #{@vim_server_name} --remote-send ':echo getcwd()<cr>'`
|
121
|
+
#`gvim --servername #{@vim_server_name} --remote-send ':echo bufname(bufnr(""))<cr>'`
|
122
|
+
#`gvim --servername #{@vim_server_name} --remote-send ':redir END<cr>'`
|
123
|
+
|
124
|
+
get_current_buffer_number
|
125
|
+
|
126
|
+
cwd = exec_gvim "--remote-expr 'getcwd()'".chomp+'/'
|
127
|
+
if cwd
|
128
|
+
return cwd + exec_gvim(%Q~--remote-expr 'bufname(bufnr(""))'~)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def get_current_buffer_number
|
134
|
+
send_function('getCursor')
|
135
|
+
end
|
136
|
+
|
137
|
+
def get_all_buffer_paths
|
138
|
+
buffers[1..-1]
|
139
|
+
end
|
140
|
+
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
|
3
|
+
describe ActiveWindow::ActiveColumn do
|
4
|
+
before( :each ) do
|
5
|
+
@class = ActiveWindow::ActiveColumn
|
6
|
+
end
|
7
|
+
|
8
|
+
it "shold be a Class" do
|
9
|
+
@class.should be_a(Class)
|
10
|
+
end
|
11
|
+
|
12
|
+
shared_examples_for "any column" do
|
13
|
+
it "should be a ActiveColumn" do
|
14
|
+
@col.should be_a(ActiveWindow::ActiveColumn)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should have a view" do
|
18
|
+
@col.view.should_not be_nil
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "of type String" do
|
24
|
+
before( :each ) do
|
25
|
+
@col = @class.create(0,'name', :string)
|
26
|
+
end
|
27
|
+
it_should_behave_like 'any column'
|
28
|
+
|
29
|
+
it "should be a ActiveTextColumn" do
|
30
|
+
@col.should be_a(ActiveWindow::ActiveTextColumn)
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should take a String" do
|
34
|
+
@col.data_class.should == String
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|