command-t 1.2

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.
@@ -0,0 +1,164 @@
1
+ " command-t.vim
2
+ " Copyright 2010-2011 Wincent Colaiuta. All rights reserved.
3
+ "
4
+ " Redistribution and use in source and binary forms, with or without
5
+ " modification, are permitted provided that the following conditions are met:
6
+ "
7
+ " 1. Redistributions of source code must retain the above copyright notice,
8
+ " this list of conditions and the following disclaimer.
9
+ " 2. Redistributions in binary form must reproduce the above copyright notice,
10
+ " this list of conditions and the following disclaimer in the documentation
11
+ " and/or other materials provided with the distribution.
12
+ "
13
+ " THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
14
+ " AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15
+ " IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16
+ " ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
17
+ " LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18
+ " CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19
+ " SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20
+ " INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21
+ " CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22
+ " ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
23
+ " POSSIBILITY OF SUCH DAMAGE.
24
+
25
+ if exists("g:command_t_loaded")
26
+ finish
27
+ endif
28
+ let g:command_t_loaded = 1
29
+
30
+ command CommandTBuffer call <SID>CommandTShowBufferFinder()
31
+ command -nargs=? -complete=dir CommandT call <SID>CommandTShowFileFinder(<q-args>)
32
+ command CommandTFlush call <SID>CommandTFlush()
33
+
34
+ if !hasmapto(':CommandT<CR>')
35
+ silent! nmap <unique> <silent> <Leader>t :CommandT<CR>
36
+ endif
37
+
38
+ if !hasmapto(':CommandTBuffer<CR>')
39
+ silent! nmap <unique> <silent> <Leader>b :CommandTBuffer<CR>
40
+ endif
41
+
42
+ function s:CommandTRubyWarning()
43
+ echohl WarningMsg
44
+ echo "command-t.vim requires Vim to be compiled with Ruby support"
45
+ echo "For more information type: :help command-t"
46
+ echohl none
47
+ endfunction
48
+
49
+ function s:CommandTShowBufferFinder()
50
+ if has('ruby')
51
+ ruby $command_t.show_buffer_finder
52
+ else
53
+ call s:CommandTRubyWarning()
54
+ endif
55
+ endfunction
56
+
57
+ function s:CommandTShowFileFinder(arg)
58
+ if has('ruby')
59
+ ruby $command_t.show_file_finder
60
+ else
61
+ call s:CommandTRubyWarning()
62
+ endif
63
+ endfunction
64
+
65
+ function s:CommandTFlush()
66
+ if has('ruby')
67
+ ruby $command_t.flush
68
+ else
69
+ call s:CommandTRubyWarning()
70
+ endif
71
+ endfunction
72
+
73
+ if !has('ruby')
74
+ finish
75
+ endif
76
+
77
+ function CommandTHandleKey(arg)
78
+ ruby $command_t.handle_key
79
+ endfunction
80
+
81
+ function CommandTBackspace()
82
+ ruby $command_t.backspace
83
+ endfunction
84
+
85
+ function CommandTDelete()
86
+ ruby $command_t.delete
87
+ endfunction
88
+
89
+ function CommandTAcceptSelection()
90
+ ruby $command_t.accept_selection
91
+ endfunction
92
+
93
+ function CommandTAcceptSelectionTab()
94
+ ruby $command_t.accept_selection :command => 'tabe'
95
+ endfunction
96
+
97
+ function CommandTAcceptSelectionSplit()
98
+ ruby $command_t.accept_selection :command => 'sp'
99
+ endfunction
100
+
101
+ function CommandTAcceptSelectionVSplit()
102
+ ruby $command_t.accept_selection :command => 'vs'
103
+ endfunction
104
+
105
+ function CommandTToggleFocus()
106
+ ruby $command_t.toggle_focus
107
+ endfunction
108
+
109
+ function CommandTCancel()
110
+ ruby $command_t.cancel
111
+ endfunction
112
+
113
+ function CommandTSelectNext()
114
+ ruby $command_t.select_next
115
+ endfunction
116
+
117
+ function CommandTSelectPrev()
118
+ ruby $command_t.select_prev
119
+ endfunction
120
+
121
+ function CommandTClear()
122
+ ruby $command_t.clear
123
+ endfunction
124
+
125
+ function CommandTCursorLeft()
126
+ ruby $command_t.cursor_left
127
+ endfunction
128
+
129
+ function CommandTCursorRight()
130
+ ruby $command_t.cursor_right
131
+ endfunction
132
+
133
+ function CommandTCursorEnd()
134
+ ruby $command_t.cursor_end
135
+ endfunction
136
+
137
+ function CommandTCursorStart()
138
+ ruby $command_t.cursor_start
139
+ endfunction
140
+
141
+ ruby << EOF
142
+ # require Ruby files
143
+ begin
144
+ # prepare controller
145
+ require 'command-t/vim'
146
+ require 'command-t/controller'
147
+ $command_t = CommandT::Controller.new
148
+ rescue LoadError
149
+ load_path_modified = false
150
+ ::VIM::evaluate('&runtimepath').to_s.split(',').each do |path|
151
+ lib = "#{path}/ruby"
152
+ if !$LOAD_PATH.include?(lib) and File.exist?(lib)
153
+ $LOAD_PATH << lib
154
+ load_path_modified = true
155
+ end
156
+ end
157
+ retry if load_path_modified
158
+
159
+ # could get here if C extension was not compiled, or was compiled
160
+ # for the wrong architecture or Ruby version
161
+ require 'command-t/stub'
162
+ $command_t = CommandT::Stub.new
163
+ end
164
+ EOF
@@ -0,0 +1,181 @@
1
+
2
+ SHELL = /bin/sh
3
+
4
+ #### Start of system configuration section. ####
5
+
6
+ srcdir = .
7
+ topdir = /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/universal-darwin10.0
8
+ hdrdir = $(topdir)
9
+ VPATH = $(srcdir):$(topdir):$(hdrdir)
10
+ exec_prefix = $(prefix)
11
+ prefix = $(DESTDIR)/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr
12
+ sharedstatedir = $(prefix)/com
13
+ mandir = $(DESTDIR)/usr/share/man
14
+ psdir = $(docdir)
15
+ oldincludedir = $(DESTDIR)/usr/include
16
+ localedir = $(datarootdir)/locale
17
+ bindir = $(exec_prefix)/bin
18
+ libexecdir = $(exec_prefix)/libexec
19
+ sitedir = $(DESTDIR)/Library/Ruby/Site
20
+ htmldir = $(docdir)
21
+ vendorarchdir = $(vendorlibdir)/$(sitearch)
22
+ includedir = $(prefix)/include
23
+ infodir = $(DESTDIR)/usr/share/info
24
+ vendorlibdir = $(vendordir)/$(ruby_version)
25
+ sysconfdir = $(prefix)/etc
26
+ libdir = $(exec_prefix)/lib
27
+ sbindir = $(exec_prefix)/sbin
28
+ rubylibdir = $(libdir)/ruby/$(ruby_version)
29
+ docdir = $(datarootdir)/doc/$(PACKAGE)
30
+ dvidir = $(docdir)
31
+ vendordir = $(libdir)/ruby/vendor_ruby
32
+ datarootdir = $(prefix)/share
33
+ pdfdir = $(docdir)
34
+ archdir = $(rubylibdir)/$(arch)
35
+ sitearchdir = $(sitelibdir)/$(sitearch)
36
+ datadir = $(datarootdir)
37
+ localstatedir = $(prefix)/var
38
+ sitelibdir = $(sitedir)/$(ruby_version)
39
+
40
+ CC = gcc
41
+ LIBRUBY = $(LIBRUBY_SO)
42
+ LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a
43
+ LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME)
44
+ LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)
45
+
46
+ RUBY_EXTCONF_H =
47
+ CFLAGS = -fno-common -arch i386 -arch x86_64 -g -Os -pipe -fno-common -DENABLE_DTRACE -fno-common -pipe -fno-common $(cflags)
48
+ INCFLAGS = -I. -I$(topdir) -I$(hdrdir) -I$(srcdir)
49
+ DEFS =
50
+ CPPFLAGS = -DHAVE_RUBY_H -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE $(DEFS) $(cppflags)
51
+ CXXFLAGS = $(CFLAGS)
52
+ ldflags = -L. -arch i386 -arch x86_64
53
+ dldflags =
54
+ archflag =
55
+ DLDFLAGS = $(ldflags) $(dldflags) $(archflag)
56
+ LDSHARED = cc -arch i386 -arch x86_64 -pipe -bundle -undefined dynamic_lookup
57
+ AR = ar
58
+ EXEEXT =
59
+
60
+ RUBY_INSTALL_NAME = ruby
61
+ RUBY_SO_NAME = ruby
62
+ arch = universal-darwin10.0
63
+ sitearch = universal-darwin10.0
64
+ ruby_version = 1.8
65
+ ruby = /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby
66
+ RUBY = $(ruby)
67
+ RM = rm -f
68
+ MAKEDIRS = mkdir -p
69
+ INSTALL = /usr/bin/install -c
70
+ INSTALL_PROG = $(INSTALL) -m 0755
71
+ INSTALL_DATA = $(INSTALL) -m 644
72
+ COPY = cp
73
+
74
+ #### End of system configuration section. ####
75
+
76
+ preload =
77
+
78
+ libpath = . $(libdir)
79
+ LIBPATH = -L. -L$(libdir)
80
+ DEFFILE =
81
+
82
+ CLEANFILES = mkmf.log
83
+ DISTCLEANFILES =
84
+
85
+ extout =
86
+ extout_prefix =
87
+ target_prefix =
88
+ LOCAL_LIBS =
89
+ LIBS = $(LIBRUBYARG_SHARED) -lpthread -ldl
90
+ SRCS = ext.c match.c matcher.c
91
+ OBJS = ext.o match.o matcher.o
92
+ TARGET = ext
93
+ DLLIB = $(TARGET).bundle
94
+ EXTSTATIC =
95
+ STATIC_LIB =
96
+
97
+ BINDIR = $(bindir)
98
+ RUBYCOMMONDIR = $(sitedir)$(target_prefix)
99
+ RUBYLIBDIR = $(sitelibdir)$(target_prefix)
100
+ RUBYARCHDIR = $(sitearchdir)$(target_prefix)
101
+
102
+ TARGET_SO = $(DLLIB)
103
+ CLEANLIBS = $(TARGET).bundle $(TARGET).il? $(TARGET).tds $(TARGET).map
104
+ CLEANOBJS = *.o *.a *.s[ol] *.pdb *.exp *.bak
105
+
106
+ all: $(DLLIB)
107
+ static: $(STATIC_LIB)
108
+
109
+ clean:
110
+ @-$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES)
111
+
112
+ distclean: clean
113
+ @-$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log
114
+ @-$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES)
115
+
116
+ realclean: distclean
117
+ install: install-so install-rb
118
+
119
+ install-so: $(RUBYARCHDIR)
120
+ install-so: $(RUBYARCHDIR)/$(DLLIB)
121
+ $(RUBYARCHDIR)/$(DLLIB): $(DLLIB)
122
+ $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR)
123
+ install-rb: pre-install-rb install-rb-default
124
+ install-rb-default: pre-install-rb-default
125
+ pre-install-rb: Makefile
126
+ pre-install-rb-default: Makefile
127
+ $(RUBYARCHDIR):
128
+ $(MAKEDIRS) $@
129
+
130
+ site-install: site-install-so site-install-rb
131
+ site-install-so: install-so
132
+ site-install-rb: install-rb
133
+
134
+ .SUFFIXES: .c .m .cc .cxx .cpp .C .o
135
+
136
+ .cc.o:
137
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
138
+
139
+ .cxx.o:
140
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
141
+
142
+ .cpp.o:
143
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
144
+
145
+ .C.o:
146
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
147
+
148
+ .c.o:
149
+ $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) -c $<
150
+
151
+ $(DLLIB): $(OBJS) Makefile
152
+ @-$(RM) $@
153
+ $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS)
154
+
155
+
156
+
157
+ ###
158
+ # Copyright 2010 Wincent Colaiuta. All rights reserved.
159
+ #
160
+ # Redistribution and use in source and binary forms, with or without
161
+ # modification, are permitted provided that the following conditions are met:
162
+ #
163
+ # 1. Redistributions of source code must retain the above copyright notice,
164
+ # this list of conditions and the following disclaimer.
165
+ # 2. Redistributions in binary form must reproduce the above copyright notice,
166
+ # this list of conditions and the following disclaimer in the documentation
167
+ # and/or other materials provided with the distribution.
168
+ #
169
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
170
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
171
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
172
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
173
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
174
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
175
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
176
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
177
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
178
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
179
+ # POSSIBILITY OF SUCH DAMAGE.
180
+
181
+ CFLAGS += -std=c99 -Wall -Wextra -Wno-unused-parameter
@@ -0,0 +1,317 @@
1
+ # Copyright 2010-2011 Wincent Colaiuta. All rights reserved.
2
+ #
3
+ # Redistribution and use in source and binary forms, with or without
4
+ # modification, are permitted provided that the following conditions are met:
5
+ #
6
+ # 1. Redistributions of source code must retain the above copyright notice,
7
+ # this list of conditions and the following disclaimer.
8
+ # 2. Redistributions in binary form must reproduce the above copyright notice,
9
+ # this list of conditions and the following disclaimer in the documentation
10
+ # and/or other materials provided with the distribution.
11
+ #
12
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
13
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
14
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
15
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
16
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
17
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
18
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
19
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
20
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
21
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
22
+ # POSSIBILITY OF SUCH DAMAGE.
23
+
24
+ require 'command-t/finder/buffer_finder'
25
+ require 'command-t/finder/file_finder'
26
+ require 'command-t/match_window'
27
+ require 'command-t/prompt'
28
+ require 'command-t/vim/path_utilities'
29
+
30
+ module CommandT
31
+ class Controller
32
+ include VIM::PathUtilities
33
+
34
+ def initialize
35
+ @prompt = Prompt.new
36
+ @buffer_finder = CommandT::BufferFinder.new
37
+ set_up_file_finder
38
+ set_up_max_height
39
+ end
40
+
41
+ def show_buffer_finder
42
+ @path = VIM::pwd
43
+ @active_finder = @buffer_finder
44
+ show
45
+ end
46
+
47
+ def show_file_finder
48
+ # optional parameter will be desired starting directory, or ""
49
+ @path = File.expand_path(::VIM::evaluate('a:arg'), VIM::pwd)
50
+ @file_finder.path = @path
51
+ @active_finder = @file_finder
52
+ show
53
+ rescue Errno::ENOENT
54
+ # probably a problem with the optional parameter
55
+ @match_window.print_no_such_file_or_directory
56
+ end
57
+
58
+ def hide
59
+ @match_window.close
60
+ if VIM::Window.select @initial_window
61
+ if @initial_buffer.number == 0
62
+ # upstream bug: buffer number misreported as 0
63
+ # see: https://wincent.com/issues/1617
64
+ ::VIM::command "silent b #{@initial_buffer.name}"
65
+ else
66
+ ::VIM::command "silent b #{@initial_buffer.number}"
67
+ end
68
+ end
69
+ end
70
+
71
+ def flush
72
+ set_up_max_height
73
+ set_up_file_finder
74
+ end
75
+
76
+ def handle_key
77
+ key = ::VIM::evaluate('a:arg').to_i.chr
78
+ if @focus == @prompt
79
+ @prompt.add! key
80
+ list_matches
81
+ else
82
+ @match_window.find key
83
+ end
84
+ end
85
+
86
+ def backspace
87
+ if @focus == @prompt
88
+ @prompt.backspace!
89
+ list_matches
90
+ end
91
+ end
92
+
93
+ def delete
94
+ if @focus == @prompt
95
+ @prompt.delete!
96
+ list_matches
97
+ end
98
+ end
99
+
100
+ def accept_selection options = {}
101
+ selection = @match_window.selection
102
+ hide
103
+ open_selection(selection, options) unless selection.nil?
104
+ end
105
+
106
+ def toggle_focus
107
+ @focus.unfocus # old focus
108
+ @focus = @focus == @prompt ? @match_window : @prompt
109
+ @focus.focus # new focus
110
+ end
111
+
112
+ def cancel
113
+ hide
114
+ end
115
+
116
+ def select_next
117
+ @match_window.select_next
118
+ end
119
+
120
+ def select_prev
121
+ @match_window.select_prev
122
+ end
123
+
124
+ def clear
125
+ @prompt.clear!
126
+ list_matches
127
+ end
128
+
129
+ def cursor_left
130
+ @prompt.cursor_left if @focus == @prompt
131
+ end
132
+
133
+ def cursor_right
134
+ @prompt.cursor_right if @focus == @prompt
135
+ end
136
+
137
+ def cursor_end
138
+ @prompt.cursor_end if @focus == @prompt
139
+ end
140
+
141
+ def cursor_start
142
+ @prompt.cursor_start if @focus == @prompt
143
+ end
144
+
145
+ def leave
146
+ @match_window.leave
147
+ end
148
+
149
+ def unload
150
+ @match_window.unload
151
+ end
152
+
153
+ private
154
+
155
+ def show
156
+ @initial_window = $curwin
157
+ @initial_buffer = $curbuf
158
+ @match_window = MatchWindow.new \
159
+ :prompt => @prompt,
160
+ :match_window_at_top => get_bool('g:CommandTMatchWindowAtTop'),
161
+ :match_window_reverse => get_bool('g:CommandTMatchWindowReverse')
162
+ @focus = @prompt
163
+ @prompt.focus
164
+ register_for_key_presses
165
+ clear # clears prompt and lists matches
166
+ end
167
+
168
+ def set_up_max_height
169
+ @max_height = get_number('g:CommandTMaxHeight') || 0
170
+ end
171
+
172
+ def set_up_file_finder
173
+ @file_finder = CommandT::FileFinder.new nil,
174
+ :max_files => get_number('g:CommandTMaxFiles'),
175
+ :max_depth => get_number('g:CommandTMaxDepth'),
176
+ :always_show_dot_files => get_bool('g:CommandTAlwaysShowDotFiles'),
177
+ :never_show_dot_files => get_bool('g:CommandTNeverShowDotFiles'),
178
+ :scan_dot_directories => get_bool('g:CommandTScanDotDirectories')
179
+ end
180
+
181
+ def exists? name
182
+ ::VIM::evaluate("exists(\"#{name}\")").to_i != 0
183
+ end
184
+
185
+ def get_number name
186
+ exists?(name) ? ::VIM::evaluate("#{name}").to_i : nil
187
+ end
188
+
189
+ def get_bool name
190
+ exists?(name) ? ::VIM::evaluate("#{name}").to_i != 0 : nil
191
+ end
192
+
193
+ def get_string name
194
+ exists?(name) ? ::VIM::evaluate("#{name}").to_s : nil
195
+ end
196
+
197
+ # expect a string or a list of strings
198
+ def get_list_or_string name
199
+ return nil unless exists?(name)
200
+ list_or_string = ::VIM::evaluate("#{name}")
201
+ if list_or_string.kind_of?(Array)
202
+ list_or_string.map { |item| item.to_s }
203
+ else
204
+ list_or_string.to_s
205
+ end
206
+ end
207
+
208
+ # Backslash-escape space, \, |, %, #, "
209
+ def sanitize_path_string str
210
+ # for details on escaping command-line mode arguments see: :h :
211
+ # (that is, help on ":") in the Vim documentation.
212
+ str.gsub(/[ \\|%#"]/, '\\\\\0')
213
+ end
214
+
215
+ def default_open_command
216
+ if !get_bool('&hidden') && get_bool('&modified')
217
+ 'sp'
218
+ else
219
+ 'e'
220
+ end
221
+ end
222
+
223
+ def ensure_appropriate_window_selection
224
+ # normally we try to open the selection in the current window, but there
225
+ # is one exception:
226
+ #
227
+ # - we don't touch any "unlisted" buffer with buftype "nofile" (such as
228
+ # NERDTree or MiniBufExplorer); this is to avoid things like the "Not
229
+ # enough room" error which occurs when trying to open in a split in a
230
+ # shallow (potentially 1-line) buffer like MiniBufExplorer is current
231
+ #
232
+ # Other "unlisted" buffers, such as those with buftype "help" are treated
233
+ # normally.
234
+ initial = $curwin
235
+ while true do
236
+ break unless ::VIM::evaluate('&buflisted').to_i == 0 &&
237
+ ::VIM::evaluate('&buftype').to_s == 'nofile'
238
+ ::VIM::command 'wincmd w' # try next window
239
+ break if $curwin == initial # have already tried all
240
+ end
241
+ end
242
+
243
+ def open_selection selection, options = {}
244
+ command = options[:command] || default_open_command
245
+ selection = File.expand_path selection, @path
246
+ selection = relative_path_under_working_directory selection
247
+ selection = sanitize_path_string selection
248
+ ensure_appropriate_window_selection
249
+ ::VIM::command "silent #{command} #{selection}"
250
+ end
251
+
252
+ def map key, function, param = nil
253
+ ::VIM::command "noremap <silent> <buffer> #{key} " \
254
+ ":call CommandT#{function}(#{param})<CR>"
255
+ end
256
+
257
+ def xterm?
258
+ !!(::VIM::evaluate('&term') =~ /\Axterm/)
259
+ end
260
+
261
+ def vt100?
262
+ !!(::VIM::evaluate('&term') =~ /\Avt100/)
263
+ end
264
+
265
+ def register_for_key_presses
266
+ # "normal" keys (interpreted literally)
267
+ numbers = ('0'..'9').to_a.join
268
+ lowercase = ('a'..'z').to_a.join
269
+ uppercase = lowercase.upcase
270
+ punctuation = '<>`@#~!"$%&/()=+*-_.,;:?\\\'{}[] ' # and space
271
+ (numbers + lowercase + uppercase + punctuation).each_byte do |b|
272
+ map "<Char-#{b}>", 'HandleKey', b
273
+ end
274
+
275
+ # "special" keys (overridable by settings)
276
+ { 'Backspace' => '<BS>',
277
+ 'Delete' => '<Del>',
278
+ 'AcceptSelection' => '<CR>',
279
+ 'AcceptSelectionSplit' => ['<C-CR>', '<C-s>'],
280
+ 'AcceptSelectionTab' => '<C-t>',
281
+ 'AcceptSelectionVSplit' => '<C-v>',
282
+ 'ToggleFocus' => '<Tab>',
283
+ 'Cancel' => ['<C-c>', '<Esc>'],
284
+ 'SelectNext' => ['<C-n>', '<C-j>', '<Down>'],
285
+ 'SelectPrev' => ['<C-p>', '<C-k>', '<Up>'],
286
+ 'Clear' => '<C-u>',
287
+ 'CursorLeft' => ['<Left>', '<C-h>'],
288
+ 'CursorRight' => ['<Right>', '<C-l>'],
289
+ 'CursorEnd' => '<C-e>',
290
+ 'CursorStart' => '<C-a>' }.each do |key, value|
291
+ if override = get_list_or_string("g:CommandT#{key}Map")
292
+ [override].flatten.each do |mapping|
293
+ map mapping, key
294
+ end
295
+ else
296
+ [value].flatten.each do |mapping|
297
+ map mapping, key unless mapping == '<Esc>' && (xterm? || vt100?)
298
+ end
299
+ end
300
+ end
301
+ end
302
+
303
+ # Returns the desired maximum number of matches, based on available
304
+ # vertical space and the g:CommandTMaxHeight option.
305
+ def match_limit
306
+ limit = VIM::Screen.lines - 5
307
+ limit = 1 if limit < 0
308
+ limit = [limit, @max_height].min if @max_height > 0
309
+ limit
310
+ end
311
+
312
+ def list_matches
313
+ matches = @active_finder.sorted_matches_for @prompt.abbrev, :limit => match_limit
314
+ @match_window.matches = matches
315
+ end
316
+ end # class Controller
317
+ end # module commandT