dotfiles

=> git.r.bdr.sh
=> summary
=> tree
=> log
=> refs

dotfiles/vim/tmp/command-t-1.2.1.vba | 112 KB

=> view raw

   1 " Vimball Archiver by Charles E. Campbell, Jr., Ph.D.
   2 UseVimball
   3 finish
   4 ruby/command-t/controller.rb	[[[1
   5 317
   6 # Copyright 2010-2011 Wincent Colaiuta. All rights reserved.
   7 #
   8 # Redistribution and use in source and binary forms, with or without
   9 # modification, are permitted provided that the following conditions are met:
  10 #
  11 # 1. Redistributions of source code must retain the above copyright notice,
  12 #    this list of conditions and the following disclaimer.
  13 # 2. Redistributions in binary form must reproduce the above copyright notice,
  14 #    this list of conditions and the following disclaimer in the documentation
  15 #    and/or other materials provided with the distribution.
  16 #
  17 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  18 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  19 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  20 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
  21 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  22 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  23 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  24 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  25 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  26 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  27 # POSSIBILITY OF SUCH DAMAGE.
  28 
  29 require 'command-t/finder/buffer_finder'
  30 require 'command-t/finder/file_finder'
  31 require 'command-t/match_window'
  32 require 'command-t/prompt'
  33 require 'command-t/vim/path_utilities'
  34 
  35 module CommandT
  36   class Controller
  37     include VIM::PathUtilities
  38 
  39     def initialize
  40       @prompt = Prompt.new
  41       @buffer_finder = CommandT::BufferFinder.new
  42       set_up_file_finder
  43       set_up_max_height
  44     end
  45 
  46     def show_buffer_finder
  47       @path          = VIM::pwd
  48       @active_finder = @buffer_finder
  49       show
  50     end
  51 
  52     def show_file_finder
  53       # optional parameter will be desired starting directory, or ""
  54       @path             = File.expand_path(::VIM::evaluate('a:arg'), VIM::pwd)
  55       @file_finder.path = @path
  56       @active_finder    = @file_finder
  57       show
  58     rescue Errno::ENOENT
  59       # probably a problem with the optional parameter
  60       @match_window.print_no_such_file_or_directory
  61     end
  62 
  63     def hide
  64       @match_window.close
  65       if VIM::Window.select @initial_window
  66         if @initial_buffer.number == 0
  67           # upstream bug: buffer number misreported as 0
  68           # see: https://wincent.com/issues/1617
  69           ::VIM::command "silent b #{@initial_buffer.name}"
  70         else
  71           ::VIM::command "silent b #{@initial_buffer.number}"
  72         end
  73       end
  74     end
  75 
  76     def flush
  77       set_up_max_height
  78       set_up_file_finder
  79     end
  80 
  81     def handle_key
  82       key = ::VIM::evaluate('a:arg').to_i.chr
  83       if @focus == @prompt
  84         @prompt.add! key
  85         list_matches
  86       else
  87         @match_window.find key
  88       end
  89     end
  90 
  91     def backspace
  92       if @focus == @prompt
  93         @prompt.backspace!
  94         list_matches
  95       end
  96     end
  97 
  98     def delete
  99       if @focus == @prompt
 100         @prompt.delete!
 101         list_matches
 102       end
 103     end
 104 
 105     def accept_selection options = {}
 106       selection = @match_window.selection
 107       hide
 108       open_selection(selection, options) unless selection.nil?
 109     end
 110 
 111     def toggle_focus
 112       @focus.unfocus # old focus
 113       @focus = @focus == @prompt ? @match_window : @prompt
 114       @focus.focus # new focus
 115     end
 116 
 117     def cancel
 118       hide
 119     end
 120 
 121     def select_next
 122       @match_window.select_next
 123     end
 124 
 125     def select_prev
 126       @match_window.select_prev
 127     end
 128 
 129     def clear
 130       @prompt.clear!
 131       list_matches
 132     end
 133 
 134     def cursor_left
 135       @prompt.cursor_left if @focus == @prompt
 136     end
 137 
 138     def cursor_right
 139       @prompt.cursor_right if @focus == @prompt
 140     end
 141 
 142     def cursor_end
 143       @prompt.cursor_end if @focus == @prompt
 144     end
 145 
 146     def cursor_start
 147       @prompt.cursor_start if @focus == @prompt
 148     end
 149 
 150     def leave
 151       @match_window.leave
 152     end
 153 
 154     def unload
 155       @match_window.unload
 156     end
 157 
 158   private
 159 
 160     def show
 161       @initial_window   = $curwin
 162       @initial_buffer   = $curbuf
 163       @match_window     = MatchWindow.new \
 164         :prompt               => @prompt,
 165         :match_window_at_top  => get_bool('g:CommandTMatchWindowAtTop'),
 166         :match_window_reverse => get_bool('g:CommandTMatchWindowReverse')
 167       @focus            = @prompt
 168       @prompt.focus
 169       register_for_key_presses
 170       clear # clears prompt and lists matches
 171     end
 172 
 173     def set_up_max_height
 174       @max_height = get_number('g:CommandTMaxHeight') || 0
 175     end
 176 
 177     def set_up_file_finder
 178       @file_finder = CommandT::FileFinder.new nil,
 179         :max_files              => get_number('g:CommandTMaxFiles'),
 180         :max_depth              => get_number('g:CommandTMaxDepth'),
 181         :always_show_dot_files  => get_bool('g:CommandTAlwaysShowDotFiles'),
 182         :never_show_dot_files   => get_bool('g:CommandTNeverShowDotFiles'),
 183         :scan_dot_directories   => get_bool('g:CommandTScanDotDirectories')
 184     end
 185 
 186     def exists? name
 187       ::VIM::evaluate("exists(\"#{name}\")").to_i != 0
 188     end
 189 
 190     def get_number name
 191       exists?(name) ? ::VIM::evaluate("#{name}").to_i : nil
 192     end
 193 
 194     def get_bool name
 195       exists?(name) ? ::VIM::evaluate("#{name}").to_i != 0 : nil
 196     end
 197 
 198     def get_string name
 199       exists?(name) ? ::VIM::evaluate("#{name}").to_s : nil
 200     end
 201 
 202     # expect a string or a list of strings
 203     def get_list_or_string name
 204       return nil unless exists?(name)
 205       list_or_string = ::VIM::evaluate("#{name}")
 206       if list_or_string.kind_of?(Array)
 207         list_or_string.map { |item| item.to_s }
 208       else
 209         list_or_string.to_s
 210       end
 211     end
 212 
 213     # Backslash-escape space, \, |, %, #, "
 214     def sanitize_path_string str
 215       # for details on escaping command-line mode arguments see: :h :
 216       # (that is, help on ":") in the Vim documentation.
 217       str.gsub(/[ \\|%#"]/, '\\\\\0')
 218     end
 219 
 220     def default_open_command
 221       if !get_bool('&hidden') && get_bool('&modified')
 222         'sp'
 223       else
 224         'e'
 225       end
 226     end
 227 
 228     def ensure_appropriate_window_selection
 229       # normally we try to open the selection in the current window, but there
 230       # is one exception:
 231       #
 232       # - we don't touch any "unlisted" buffer with buftype "nofile" (such as
 233       #   NERDTree or MiniBufExplorer); this is to avoid things like the "Not
 234       #   enough room" error which occurs when trying to open in a split in a
 235       #   shallow (potentially 1-line) buffer like MiniBufExplorer is current
 236       #
 237       # Other "unlisted" buffers, such as those with buftype "help" are treated
 238       # normally.
 239       initial = $curwin
 240       while true do
 241         break unless ::VIM::evaluate('&buflisted').to_i == 0 &&
 242           ::VIM::evaluate('&buftype').to_s == 'nofile'
 243         ::VIM::command 'wincmd w'     # try next window
 244         break if $curwin == initial # have already tried all
 245       end
 246     end
 247 
 248     def open_selection selection, options = {}
 249       command = options[:command] || default_open_command
 250       selection = File.expand_path selection, @path
 251       selection = relative_path_under_working_directory selection
 252       selection = sanitize_path_string selection
 253       ensure_appropriate_window_selection
 254       ::VIM::command "silent #{command} #{selection}"
 255     end
 256 
 257     def map key, function, param = nil
 258       ::VIM::command "noremap   #{key} " \
 259         ":call CommandT#{function}(#{param})"
 260     end
 261 
 262     def xterm?
 263       !!(::VIM::evaluate('&term') =~ /\Axterm/)
 264     end
 265 
 266     def vt100?
 267       !!(::VIM::evaluate('&term') =~ /\Avt100/)
 268     end
 269 
 270     def register_for_key_presses
 271       # "normal" keys (interpreted literally)
 272       numbers     = ('0'..'9').to_a.join
 273       lowercase   = ('a'..'z').to_a.join
 274       uppercase   = lowercase.upcase
 275       punctuation = '<>`@#~!"$%&/()=+*-_.,;:?\\\'{}[] ' # and space
 276       (numbers + lowercase + uppercase + punctuation).each_byte do |b|
 277         map "", 'HandleKey', b
 278       end
 279 
 280       # "special" keys (overridable by settings)
 281       { 'Backspace'             => '',
 282         'Delete'                => '',
 283         'AcceptSelection'       => '',
 284         'AcceptSelectionSplit'  => ['', ''],
 285         'AcceptSelectionTab'    => '',
 286         'AcceptSelectionVSplit' => '',
 287         'ToggleFocus'           => '',
 288         'Cancel'                => ['', ''],
 289         'SelectNext'            => ['', '', ''],
 290         'SelectPrev'            => ['', '', ''],
 291         'Clear'                 => '',
 292         'CursorLeft'            => ['', ''],
 293         'CursorRight'           => ['', ''],
 294         'CursorEnd'             => '',
 295         'CursorStart'           => '' }.each do |key, value|
 296         if override = get_list_or_string("g:CommandT#{key}Map")
 297           [override].flatten.each do |mapping|
 298             map mapping, key
 299           end
 300         else
 301           [value].flatten.each do |mapping|
 302             map mapping, key unless mapping == '' && (xterm? || vt100?)
 303           end
 304         end
 305       end
 306     end
 307 
 308     # Returns the desired maximum number of matches, based on available
 309     # vertical space and the g:CommandTMaxHeight option.
 310     def match_limit
 311       limit = VIM::Screen.lines - 5
 312       limit = 1 if limit < 0
 313       limit = [limit, @max_height].min if @max_height > 0
 314       limit
 315     end
 316 
 317     def list_matches
 318       matches = @active_finder.sorted_matches_for @prompt.abbrev, :limit => match_limit
 319       @match_window.matches = matches
 320     end
 321   end # class Controller
 322 end # module commandT
 323 ruby/command-t/extconf.rb	[[[1
 324 32
 325 # Copyright 2010 Wincent Colaiuta. All rights reserved.
 326 #
 327 # Redistribution and use in source and binary forms, with or without
 328 # modification, are permitted provided that the following conditions are met:
 329 #
 330 # 1. Redistributions of source code must retain the above copyright notice,
 331 #    this list of conditions and the following disclaimer.
 332 # 2. Redistributions in binary form must reproduce the above copyright notice,
 333 #    this list of conditions and the following disclaimer in the documentation
 334 #    and/or other materials provided with the distribution.
 335 #
 336 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 337 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 338 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 339 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
 340 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 341 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 342 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 343 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 344 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 345 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 346 # POSSIBILITY OF SUCH DAMAGE.
 347 
 348 require 'mkmf'
 349 
 350 def missing item
 351   puts "couldn't find #{item} (required)"
 352   exit 1
 353 end
 354 
 355 have_header('ruby.h') or missing('ruby.h')
 356 create_makefile('ext')
 357 ruby/command-t/finder/buffer_finder.rb	[[[1
 358 35
 359 # Copyright 2010-2011 Wincent Colaiuta. All rights reserved.
 360 #
 361 # Redistribution and use in source and binary forms, with or without
 362 # modification, are permitted provided that the following conditions are met:
 363 #
 364 # 1. Redistributions of source code must retain the above copyright notice,
 365 #    this list of conditions and the following disclaimer.
 366 # 2. Redistributions in binary form must reproduce the above copyright notice,
 367 #    this list of conditions and the following disclaimer in the documentation
 368 #    and/or other materials provided with the distribution.
 369 #
 370 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 371 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 372 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 373 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
 374 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 375 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 376 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 377 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 378 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 379 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 380 # POSSIBILITY OF SUCH DAMAGE.
 381 
 382 require 'command-t/ext' # CommandT::Matcher
 383 require 'command-t/scanner/buffer_scanner'
 384 require 'command-t/finder'
 385 
 386 module CommandT
 387   class BufferFinder < Finder
 388     def initialize
 389       @scanner = BufferScanner.new
 390       @matcher = Matcher.new @scanner, :always_show_dot_files => true
 391     end
 392   end # class BufferFinder
 393 end # CommandT
 394 ruby/command-t/finder/file_finder.rb	[[[1
 395 35
 396 # Copyright 2010-2011 Wincent Colaiuta. All rights reserved.
 397 #
 398 # Redistribution and use in source and binary forms, with or without
 399 # modification, are permitted provided that the following conditions are met:
 400 #
 401 # 1. Redistributions of source code must retain the above copyright notice,
 402 #    this list of conditions and the following disclaimer.
 403 # 2. Redistributions in binary form must reproduce the above copyright notice,
 404 #    this list of conditions and the following disclaimer in the documentation
 405 #    and/or other materials provided with the distribution.
 406 #
 407 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 408 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 409 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 410 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
 411 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 412 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 413 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 414 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 415 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 416 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 417 # POSSIBILITY OF SUCH DAMAGE.
 418 
 419 require 'command-t/ext' # CommandT::Matcher
 420 require 'command-t/finder'
 421 require 'command-t/scanner/file_scanner'
 422 
 423 module CommandT
 424   class FileFinder < Finder
 425     def initialize path = Dir.pwd, options = {}
 426       @scanner = FileScanner.new path, options
 427       @matcher = Matcher.new @scanner, options
 428     end
 429   end # class FileFinder
 430 end # CommandT
 431 ruby/command-t/finder.rb	[[[1
 432 52
 433 # Copyright 2010-2011 Wincent Colaiuta. All rights reserved.
 434 #
 435 # Redistribution and use in source and binary forms, with or without
 436 # modification, are permitted provided that the following conditions are met:
 437 #
 438 # 1. Redistributions of source code must retain the above copyright notice,
 439 #    this list of conditions and the following disclaimer.
 440 # 2. Redistributions in binary form must reproduce the above copyright notice,
 441 #    this list of conditions and the following disclaimer in the documentation
 442 #    and/or other materials provided with the distribution.
 443 #
 444 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 445 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 446 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 447 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
 448 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 449 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 450 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 451 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 452 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 453 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 454 # POSSIBILITY OF SUCH DAMAGE.
 455 
 456 require 'command-t/ext' # CommandT::Matcher
 457 
 458 module CommandT
 459   # Encapsulates a Scanner instance (which builds up a list of available files
 460   # in a directory) and a Matcher instance (which selects from that list based
 461   # on a search string).
 462   #
 463   # Specialized subclasses use different kinds of scanners adapted for
 464   # different kinds of search (files, buffers).
 465   class Finder
 466     def initialize path = Dir.pwd, options = {}
 467       raise RuntimeError, 'Subclass responsibility'
 468     end
 469 
 470     # Options:
 471     #   :limit (integer): limit the number of returned matches
 472     def sorted_matches_for str, options = {}
 473       @matcher.sorted_matches_for str, options
 474     end
 475 
 476     def flush
 477       @scanner.flush
 478     end
 479 
 480     def path= path
 481       @scanner.path = path
 482     end
 483   end # class Finder
 484 end # CommandT
 485 ruby/command-t/match_window.rb	[[[1
 486 387
 487 # Copyright 2010-2011 Wincent Colaiuta. All rights reserved.
 488 #
 489 # Redistribution and use in source and binary forms, with or without
 490 # modification, are permitted provided that the following conditions are met:
 491 #
 492 # 1. Redistributions of source code must retain the above copyright notice,
 493 #    this list of conditions and the following disclaimer.
 494 # 2. Redistributions in binary form must reproduce the above copyright notice,
 495 #    this list of conditions and the following disclaimer in the documentation
 496 #    and/or other materials provided with the distribution.
 497 #
 498 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 499 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 500 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 501 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
 502 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 503 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 504 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 505 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 506 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 507 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 508 # POSSIBILITY OF SUCH DAMAGE.
 509 
 510 require 'ostruct'
 511 require 'command-t/settings'
 512 
 513 module CommandT
 514   class MatchWindow
 515     @@selection_marker  = '> '
 516     @@marker_length     = @@selection_marker.length
 517     @@unselected_marker = ' ' * @@marker_length
 518     @@buffer            = nil
 519 
 520     def initialize options = {}
 521       @prompt = options[:prompt]
 522       @reverse_list = options[:match_window_reverse]
 523 
 524       # save existing window dimensions so we can restore them later
 525       @windows = []
 526       (0..(::VIM::Window.count - 1)).each do |i|
 527         window = OpenStruct.new :index => i, :height => ::VIM::Window[i].height
 528         @windows << window
 529       end
 530 
 531       # global settings (must manually save and restore)
 532       @settings = Settings.new
 533       ::VIM::set_option 'timeout'         # ensure mappings timeout
 534       ::VIM::set_option 'timeoutlen=0'    # respond immediately to mappings
 535       ::VIM::set_option 'nohlsearch'      # don't highlight search strings
 536       ::VIM::set_option 'noinsertmode'    # don't make Insert mode the default
 537       ::VIM::set_option 'noshowcmd'       # don't show command info on last line
 538       ::VIM::set_option 'report=9999'     # don't show "X lines changed" reports
 539       ::VIM::set_option 'sidescroll=0'    # don't sidescroll in jumps
 540       ::VIM::set_option 'sidescrolloff=0' # don't sidescroll automatically
 541       ::VIM::set_option 'noequalalways'   # don't auto-balance window sizes
 542 
 543       # show match window
 544       split_location = options[:match_window_at_top] ? 'topleft' : 'botright'
 545       if @@buffer # still have buffer from last time
 546         ::VIM::command "silent! #{split_location} #{@@buffer.number}sbuffer"
 547         raise "Can't re-open GoToFile buffer" unless $curbuf.number == @@buffer.number
 548         $curwin.height = 1
 549       else        # creating match window for first time and set it up
 550         split_command = "silent! #{split_location} 1split GoToFile"
 551         [
 552           split_command,
 553           'setlocal bufhidden=unload',  # unload buf when no longer displayed
 554           'setlocal buftype=nofile',    # buffer is not related to any file
 555           'setlocal nomodifiable',      # prevent manual edits
 556           'setlocal noswapfile',        # don't create a swapfile
 557           'setlocal nowrap',            # don't soft-wrap
 558           'setlocal nonumber',          # don't show line numbers
 559           'setlocal nolist',            # don't use List mode (visible tabs etc)
 560           'setlocal foldcolumn=0',      # don't show a fold column at side
 561           'setlocal foldlevel=99',      # don't fold anything
 562           'setlocal nocursorline',      # don't highlight line cursor is on
 563           'setlocal nospell',           # spell-checking off
 564           'setlocal nobuflisted',       # don't show up in the buffer list
 565           'setlocal textwidth=0'        # don't hard-wrap (break long lines)
 566         ].each { |command| ::VIM::command command }
 567 
 568         # sanity check: make sure the buffer really was created
 569         raise "Can't find GoToFile buffer" unless $curbuf.name.match /GoToFile\z/
 570         @@buffer = $curbuf
 571       end
 572 
 573       # syntax coloring
 574       if VIM::has_syntax?
 575         ::VIM::command "syntax match CommandTSelection \"^#{@@selection_marker}.\\+$\""
 576         ::VIM::command 'syntax match CommandTNoEntries "^-- NO MATCHES --$"'
 577         ::VIM::command 'syntax match CommandTNoEntries "^-- NO SUCH FILE OR DIRECTORY --$"'
 578         ::VIM::command 'highlight link CommandTSelection Visual'
 579         ::VIM::command 'highlight link CommandTNoEntries Error'
 580         ::VIM::evaluate 'clearmatches()'
 581 
 582         # hide cursor
 583         @cursor_highlight = get_cursor_highlight
 584         hide_cursor
 585       end
 586 
 587       # perform cleanup using an autocmd to ensure we don't get caught out
 588       # by some unexpected means of dismissing or leaving the Command-T window
 589       # (eg. ,  etc)
 590       ::VIM::command 'autocmd! * '
 591       ::VIM::command 'autocmd BufLeave  ruby $command_t.leave'
 592       ::VIM::command 'autocmd BufUnload  ruby $command_t.unload'
 593 
 594       @has_focus  = false
 595       @selection  = nil
 596       @abbrev     = ''
 597       @window     = $curwin
 598     end
 599 
 600     def close
 601       # Workaround for upstream bug in Vim 7.3 on some platforms
 602       #
 603       # On some platforms, $curbuf.number always returns 0. One workaround is
 604       # to build Vim with --disable-largefile, but as this is producing lots of
 605       # support requests, implement the following fallback to the buffer name
 606       # instead, at least until upstream gets fixed.
 607       #
 608       # For more details, see: https://wincent.com/issues/1617
 609       if $curbuf.number == 0
 610         # use bwipeout as bunload fails if passed the name of a hidden buffer
 611         ::VIM::command 'bwipeout! GoToFile'
 612         @@buffer = nil
 613       else
 614         ::VIM::command "bunload! #{@@buffer.number}"
 615       end
 616     end
 617 
 618     def leave
 619       close
 620       unload
 621     end
 622 
 623     def unload
 624       restore_window_dimensions
 625       @settings.restore
 626       @prompt.dispose
 627       show_cursor
 628     end
 629 
 630     def add! char
 631       @abbrev += char
 632     end
 633 
 634     def backspace!
 635       @abbrev.chop!
 636     end
 637 
 638     def select_next
 639       if @selection < @matches.length - 1
 640         @selection += 1
 641         print_match(@selection - 1) # redraw old selection (removes marker)
 642         print_match(@selection)     # redraw new selection (adds marker)
 643         move_cursor_to_selected_line
 644       else
 645         # (possibly) loop or scroll
 646       end
 647     end
 648 
 649     def select_prev
 650       if @selection > 0
 651         @selection -= 1
 652         print_match(@selection + 1) # redraw old selection (removes marker)
 653         print_match(@selection)     # redraw new selection (adds marker)
 654         move_cursor_to_selected_line
 655       else
 656         # (possibly) loop or scroll
 657       end
 658     end
 659 
 660     def matches= matches
 661       matches = matches.reverse if @reverse_list
 662       if matches != @matches
 663         @matches = matches
 664         @selection = @reverse_list ? @matches.length - 1 : 0
 665         print_matches
 666         move_cursor_to_selected_line
 667       end
 668     end
 669 
 670     def focus
 671       unless @has_focus
 672         @has_focus = true
 673         if VIM::has_syntax?
 674           ::VIM::command 'highlight link CommandTSelection Search'
 675         end
 676       end
 677     end
 678 
 679     def unfocus
 680       if @has_focus
 681         @has_focus = false
 682         if VIM::has_syntax?
 683           ::VIM::command 'highlight link CommandTSelection Visual'
 684         end
 685       end
 686     end
 687 
 688     def find char
 689       # is this a new search or the continuation of a previous one?
 690       now = Time.now
 691       if @last_key_time.nil? or @last_key_time < (now - 0.5)
 692         @find_string = char
 693       else
 694         @find_string += char
 695       end
 696       @last_key_time = now
 697 
 698       # see if there's anything up ahead that matches
 699       @matches.each_with_index do |match, idx|
 700         if match[0, @find_string.length].casecmp(@find_string) == 0
 701           old_selection = @selection
 702           @selection = idx
 703           print_match(old_selection)  # redraw old selection (removes marker)
 704           print_match(@selection)     # redraw new selection (adds marker)
 705           break
 706         end
 707       end
 708     end
 709 
 710     # Returns the currently selected item as a String.
 711     def selection
 712       @matches[@selection]
 713     end
 714 
 715     def print_no_such_file_or_directory
 716       print_error 'NO SUCH FILE OR DIRECTORY'
 717     end
 718 
 719   private
 720 
 721     def move_cursor_to_selected_line
 722       # on some non-GUI terminals, the cursor doesn't hide properly
 723       # so we move the cursor to prevent it from blinking away in the
 724       # upper-left corner in a distracting fashion
 725       @window.cursor = [@selection + 1, 0]
 726     end
 727 
 728     def print_error msg
 729       return unless VIM::Window.select(@window)
 730       unlock
 731       clear
 732       @window.height = 1
 733       @@buffer[1] = "-- #{msg} --"
 734       lock
 735     end
 736 
 737     def restore_window_dimensions
 738       # sort from tallest to shortest
 739       @windows.sort! { |a, b| b.height <=> a.height }
 740 
 741       # starting with the tallest ensures that there are no constraints
 742       # preventing windows on the side of vertical splits from regaining
 743       # their original full size
 744       @windows.each do |w|
 745         # beware: window may be nil
 746         window = ::VIM::Window[w.index]
 747         window.height = w.height if window
 748       end
 749     end
 750 
 751     def match_text_for_idx idx
 752       match = truncated_match @matches[idx]
 753       if idx == @selection
 754         prefix = @@selection_marker
 755         suffix = padding_for_selected_match match
 756       else
 757         prefix = @@unselected_marker
 758         suffix = ''
 759       end
 760       prefix + match + suffix
 761     end
 762 
 763     # Print just the specified match.
 764     def print_match idx
 765       return unless VIM::Window.select(@window)
 766       unlock
 767       @@buffer[idx + 1] = match_text_for_idx idx
 768       lock
 769     end
 770 
 771     # Print all matches.
 772     def print_matches
 773       match_count = @matches.length
 774       if match_count == 0
 775         print_error 'NO MATCHES'
 776       else
 777         return unless VIM::Window.select(@window)
 778         unlock
 779         clear
 780         actual_lines = 1
 781         @window_width = @window.width # update cached value
 782         max_lines = VIM::Screen.lines - 5
 783         max_lines = 1 if max_lines < 0
 784         actual_lines = match_count > max_lines ? max_lines : match_count
 785         @window.height = actual_lines
 786         (1..actual_lines).each do |line|
 787           idx = line - 1
 788           if @@buffer.count >= line
 789             @@buffer[line] = match_text_for_idx idx
 790           else
 791             @@buffer.append line - 1, match_text_for_idx(idx)
 792           end
 793         end
 794         lock
 795       end
 796     end
 797 
 798     # Prepare padding for match text (trailing spaces) so that selection
 799     # highlighting extends all the way to the right edge of the window.
 800     def padding_for_selected_match str
 801       len = str.length
 802       if len >= @window_width - @@marker_length
 803         ''
 804       else
 805         ' ' * (@window_width - @@marker_length - len)
 806       end
 807     end
 808 
 809     # Convert "really/long/path" into "really...path" based on available
 810     # window width.
 811     def truncated_match str
 812       len = str.length
 813       available_width = @window_width - @@marker_length
 814       return str if len <= available_width
 815       left = (available_width / 2) - 1
 816       right = (available_width / 2) - 2 + (available_width % 2)
 817       str[0, left] + '...' + str[-right, right]
 818     end
 819 
 820     def clear
 821       # range = % (whole buffer)
 822       # action = d (delete)
 823       # register = _ (black hole register, don't record deleted text)
 824       ::VIM::command 'silent %d _'
 825     end
 826 
 827     def get_cursor_highlight
 828       # as :highlight returns nothing and only prints,
 829       # must redirect its output to a variable
 830       ::VIM::command 'silent redir => g:command_t_cursor_highlight'
 831 
 832       # force 0 verbosity to ensure origin information isn't printed as well
 833       ::VIM::command 'silent! 0verbose highlight Cursor'
 834       ::VIM::command 'silent redir END'
 835 
 836       # there are 3 possible formats to check for, each needing to be
 837       # transformed in a certain way in order to reapply the highlight:
 838       #   Cursor xxx guifg=bg guibg=fg      -> :hi! Cursor guifg=bg guibg=fg
 839       #   Cursor xxx links to SomethingElse -> :hi! link Cursor SomethingElse
 840       #   Cursor xxx cleared                -> :hi! clear Cursor
 841       highlight = ::VIM::evaluate 'g:command_t_cursor_highlight'
 842       if highlight =~ /^Cursor\s+xxx\s+links to (\w+)/
 843         "link Cursor #{$~[1]}"
 844       elsif highlight =~ /^Cursor\s+xxx\s+cleared/
 845         'clear Cursor'
 846       elsif highlight =~ /Cursor\s+xxx\s+(.+)/
 847         "Cursor #{$~[1]}"
 848       else # likely cause E411 Cursor highlight group not found
 849         nil
 850       end
 851     end
 852 
 853     def hide_cursor
 854       if @cursor_highlight
 855         ::VIM::command 'highlight Cursor NONE'
 856       end
 857     end
 858 
 859     def show_cursor
 860       if @cursor_highlight
 861         ::VIM::command "highlight #{@cursor_highlight}"
 862       end
 863     end
 864 
 865     def lock
 866       ::VIM::command 'setlocal nomodifiable'
 867     end
 868 
 869     def unlock
 870       ::VIM::command 'setlocal modifiable'
 871     end
 872   end
 873 end
 874 ruby/command-t/prompt.rb	[[[1
 875 165
 876 # Copyright 2010 Wincent Colaiuta. All rights reserved.
 877 #
 878 # Redistribution and use in source and binary forms, with or without
 879 # modification, are permitted provided that the following conditions are met:
 880 #
 881 # 1. Redistributions of source code must retain the above copyright notice,
 882 #    this list of conditions and the following disclaimer.
 883 # 2. Redistributions in binary form must reproduce the above copyright notice,
 884 #    this list of conditions and the following disclaimer in the documentation
 885 #    and/or other materials provided with the distribution.
 886 #
 887 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 888 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 889 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 890 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
 891 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 892 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 893 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 894 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 895 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 896 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 897 # POSSIBILITY OF SUCH DAMAGE.
 898 
 899 module CommandT
 900   # Abuse the status line as a prompt.
 901   class Prompt
 902     attr_accessor :abbrev
 903 
 904     def initialize
 905       @abbrev     = ''  # abbreviation entered so far
 906       @col        = 0   # cursor position
 907       @has_focus  = false
 908     end
 909 
 910     # Erase whatever is displayed in the prompt line,
 911     # effectively disposing of the prompt
 912     def dispose
 913       ::VIM::command 'echo'
 914       ::VIM::command 'redraw'
 915     end
 916 
 917     # Clear any entered text.
 918     def clear!
 919       @abbrev = ''
 920       @col    = 0
 921       redraw
 922     end
 923 
 924     # Insert a character at (before) the current cursor position.
 925     def add! char
 926       left, cursor, right = abbrev_segments
 927       @abbrev = left + char + cursor + right
 928       @col += 1
 929       redraw
 930     end
 931 
 932     # Delete a character to the left of the current cursor position.
 933     def backspace!
 934       if @col > 0
 935         left, cursor, right = abbrev_segments
 936         @abbrev = left.chop! + cursor + right
 937         @col -= 1
 938         redraw
 939       end
 940     end
 941 
 942     # Delete a character at the current cursor position.
 943     def delete!
 944       if @col < @abbrev.length
 945         left, cursor, right = abbrev_segments
 946         @abbrev = left + right
 947         redraw
 948       end
 949     end
 950 
 951     def cursor_left
 952       if @col > 0
 953         @col -= 1
 954         redraw
 955       end
 956     end
 957 
 958     def cursor_right
 959       if @col < @abbrev.length
 960         @col += 1
 961         redraw
 962       end
 963     end
 964 
 965     def cursor_end
 966       if @col < @abbrev.length
 967         @col = @abbrev.length
 968         redraw
 969       end
 970     end
 971 
 972     def cursor_start
 973       if @col != 0
 974         @col = 0
 975         redraw
 976       end
 977     end
 978 
 979     def redraw
 980       if @has_focus
 981         prompt_highlight = 'Comment'
 982         normal_highlight = 'None'
 983         cursor_highlight = 'Underlined'
 984       else
 985         prompt_highlight = 'NonText'
 986         normal_highlight = 'NonText'
 987         cursor_highlight = 'NonText'
 988       end
 989       left, cursor, right = abbrev_segments
 990       components = [prompt_highlight, '>>', 'None', ' ']
 991       components += [normal_highlight, left] unless left.empty?
 992       components += [cursor_highlight, cursor] unless cursor.empty?
 993       components += [normal_highlight, right] unless right.empty?
 994       components += [cursor_highlight, ' '] if cursor.empty?
 995       set_status *components
 996     end
 997 
 998     def focus
 999       unless @has_focus
1000         @has_focus = true
1001         redraw
1002       end
1003     end
1004 
1005     def unfocus
1006       if @has_focus
1007         @has_focus = false
1008         redraw
1009       end
1010     end
1011 
1012   private
1013 
1014     # Returns the @abbrev string divided up into three sections, any of
1015     # which may actually be zero width, depending on the location of the
1016     # cursor:
1017     #   - left segment (to left of cursor)
1018     #   - cursor segment (character at cursor)
1019     #   - right segment (to right of cursor)
1020     def abbrev_segments
1021       left    = @abbrev[0, @col]
1022       cursor  = @abbrev[@col, 1]
1023       right   = @abbrev[(@col + 1)..-1] || ''
1024       [left, cursor, right]
1025     end
1026 
1027     def set_status *args
1028       # see ':help :echo' for why forcing a redraw here helps
1029       # prevent the status line from getting inadvertantly cleared
1030       # after our echo commands
1031       ::VIM::command 'redraw'
1032       while (highlight = args.shift) and  (text = args.shift) do
1033         text = VIM::escape_for_single_quotes text
1034         ::VIM::command "echohl #{highlight}"
1035         ::VIM::command "echon '#{text}'"
1036       end
1037       ::VIM::command 'echohl None'
1038     end
1039   end # class Prompt
1040 end # module CommandT
1041 ruby/command-t/scanner/buffer_scanner.rb	[[[1
1042 42
1043 # Copyright 2010-2011 Wincent Colaiuta. All rights reserved.
1044 #
1045 # Redistribution and use in source and binary forms, with or without
1046 # modification, are permitted provided that the following conditions are met:
1047 #
1048 # 1. Redistributions of source code must retain the above copyright notice,
1049 #    this list of conditions and the following disclaimer.
1050 # 2. Redistributions in binary form must reproduce the above copyright notice,
1051 #    this list of conditions and the following disclaimer in the documentation
1052 #    and/or other materials provided with the distribution.
1053 #
1054 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1055 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1056 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1057 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
1058 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1059 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1060 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
1061 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
1062 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
1063 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
1064 # POSSIBILITY OF SUCH DAMAGE.
1065 
1066 require 'command-t/vim'
1067 require 'command-t/vim/path_utilities'
1068 require 'command-t/scanner'
1069 
1070 module CommandT
1071   # Returns a list of all open buffers.
1072   class BufferScanner < Scanner
1073     include VIM::PathUtilities
1074 
1075     def paths
1076       (0..(::VIM::Buffer.count - 1)).map do |n|
1077         buffer = ::VIM::Buffer[n]
1078         if buffer.name # beware, may be nil
1079           relative_path_under_working_directory buffer.name
1080         end
1081       end.compact
1082     end
1083   end # class BufferScanner
1084 end # module CommandT
1085 ruby/command-t/scanner/file_scanner.rb	[[[1
1086 94
1087 # Copyright 2010-2011 Wincent Colaiuta. All rights reserved.
1088 #
1089 # Redistribution and use in source and binary forms, with or without
1090 # modification, are permitted provided that the following conditions are met:
1091 #
1092 # 1. Redistributions of source code must retain the above copyright notice,
1093 #    this list of conditions and the following disclaimer.
1094 # 2. Redistributions in binary form must reproduce the above copyright notice,
1095 #    this list of conditions and the following disclaimer in the documentation
1096 #    and/or other materials provided with the distribution.
1097 #
1098 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1099 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1100 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1101 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
1102 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1103 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1104 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
1105 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
1106 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
1107 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
1108 # POSSIBILITY OF SUCH DAMAGE.
1109 
1110 require 'command-t/vim'
1111 require 'command-t/scanner'
1112 
1113 module CommandT
1114   # Reads the current directory recursively for the paths to all regular files.
1115   class FileScanner < Scanner
1116     class FileLimitExceeded < ::RuntimeError; end
1117 
1118     def initialize path = Dir.pwd, options = {}
1119       @path                 = path
1120       @max_depth            = options[:max_depth] || 15
1121       @max_files            = options[:max_files] || 10_000
1122       @scan_dot_directories = options[:scan_dot_directories] || false
1123     end
1124 
1125     def paths
1126       return @paths unless @paths.nil?
1127       begin
1128         @paths = []
1129         @depth = 0
1130         @files = 0
1131         @prefix_len = @path.chomp('/').length
1132         add_paths_for_directory @path, @paths
1133       rescue FileLimitExceeded
1134       end
1135       @paths
1136     end
1137 
1138     def flush
1139       @paths = nil
1140     end
1141 
1142     def path= str
1143       if @path != str
1144         @path = str
1145         flush
1146       end
1147     end
1148 
1149   private
1150 
1151     def path_excluded? path
1152       # first strip common prefix (@path) from path to match VIM's behavior
1153       path = path[(@prefix_len + 1)..-1]
1154       path = VIM::escape_for_single_quotes path
1155       ::VIM::evaluate("empty(expand(fnameescape('#{path}')))").to_i == 1
1156     end
1157 
1158     def add_paths_for_directory dir, accumulator
1159       Dir.foreach(dir) do |entry|
1160         next if ['.', '..'].include?(entry)
1161         path = File.join(dir, entry)
1162         unless path_excluded?(path)
1163           if File.file?(path)
1164             @files += 1
1165             raise FileLimitExceeded if @files > @max_files
1166             accumulator << path[@prefix_len + 1..-1]
1167           elsif File.directory?(path)
1168             next if @depth >= @max_depth
1169             next if (entry.match(/\A\./) && !@scan_dot_directories)
1170             @depth += 1
1171             add_paths_for_directory path, accumulator
1172             @depth -= 1
1173           end
1174         end
1175       end
1176     rescue Errno::EACCES
1177       # skip over directories for which we don't have access
1178     end
1179   end # class FileScanner
1180 end # module CommandT
1181 ruby/command-t/scanner.rb	[[[1
1182 28
1183 # Copyright 2010-2011 Wincent Colaiuta. All rights reserved.
1184 #
1185 # Redistribution and use in source and binary forms, with or without
1186 # modification, are permitted provided that the following conditions are met:
1187 #
1188 # 1. Redistributions of source code must retain the above copyright notice,
1189 #    this list of conditions and the following disclaimer.
1190 # 2. Redistributions in binary form must reproduce the above copyright notice,
1191 #    this list of conditions and the following disclaimer in the documentation
1192 #    and/or other materials provided with the distribution.
1193 #
1194 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1195 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1196 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1197 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
1198 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1199 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1200 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
1201 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
1202 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
1203 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
1204 # POSSIBILITY OF SUCH DAMAGE.
1205 
1206 require 'command-t/vim'
1207 
1208 module CommandT
1209   class Scanner; end
1210 end # module CommandT
1211 ruby/command-t/settings.rb	[[[1
1212 77
1213 # Copyright 2010 Wincent Colaiuta. All rights reserved.
1214 #
1215 # Redistribution and use in source and binary forms, with or without
1216 # modification, are permitted provided that the following conditions are met:
1217 #
1218 # 1. Redistributions of source code must retain the above copyright notice,
1219 #    this list of conditions and the following disclaimer.
1220 # 2. Redistributions in binary form must reproduce the above copyright notice,
1221 #    this list of conditions and the following disclaimer in the documentation
1222 #    and/or other materials provided with the distribution.
1223 #
1224 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1225 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1226 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1227 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
1228 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1229 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1230 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
1231 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
1232 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
1233 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
1234 # POSSIBILITY OF SUCH DAMAGE.
1235 
1236 module CommandT
1237   # Convenience class for saving and restoring global settings.
1238   class Settings
1239     def initialize
1240       save
1241     end
1242 
1243     def save
1244       @timeoutlen     = get_number 'timeoutlen'
1245       @report         = get_number 'report'
1246       @sidescroll     = get_number 'sidescroll'
1247       @sidescrolloff  = get_number 'sidescrolloff'
1248       @timeout        = get_bool 'timeout'
1249       @equalalways    = get_bool 'equalalways'
1250       @hlsearch       = get_bool 'hlsearch'
1251       @insertmode     = get_bool 'insertmode'
1252       @showcmd        = get_bool 'showcmd'
1253     end
1254 
1255     def restore
1256       set_number 'timeoutlen', @timeoutlen
1257       set_number 'report', @report
1258       set_number 'sidescroll', @sidescroll
1259       set_number 'sidescrolloff', @sidescrolloff
1260       set_bool 'timeout', @timeout
1261       set_bool 'equalalways', @equalalways
1262       set_bool 'hlsearch', @hlsearch
1263       set_bool 'insertmode', @insertmode
1264       set_bool 'showcmd', @showcmd
1265     end
1266 
1267   private
1268 
1269     def get_number setting
1270       ::VIM::evaluate("&#{setting}").to_i
1271     end
1272 
1273     def get_bool setting
1274       ::VIM::evaluate("&#{setting}").to_i == 1
1275     end
1276 
1277     def set_number setting, value
1278       ::VIM::set_option "#{setting}=#{value}"
1279     end
1280 
1281     def set_bool setting, value
1282       if value
1283         ::VIM::set_option setting
1284       else
1285         ::VIM::set_option "no#{setting}"
1286       end
1287     end
1288   end # class Settings
1289 end # module CommandT
1290 ruby/command-t/stub.rb	[[[1
1291 46
1292 # Copyright 2010-2011 Wincent Colaiuta. All rights reserved.
1293 #
1294 # Redistribution and use in source and binary forms, with or without
1295 # modification, are permitted provided that the following conditions are met:
1296 #
1297 # 1. Redistributions of source code must retain the above copyright notice,
1298 #    this list of conditions and the following disclaimer.
1299 # 2. Redistributions in binary form must reproduce the above copyright notice,
1300 #    this list of conditions and the following disclaimer in the documentation
1301 #    and/or other materials provided with the distribution.
1302 #
1303 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1304 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1305 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1306 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
1307 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1308 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1309 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
1310 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
1311 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
1312 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
1313 # POSSIBILITY OF SUCH DAMAGE.
1314 
1315 module CommandT
1316   class Stub
1317     @@load_error = ['command-t.vim could not load the C extension',
1318                     'Please see INSTALLATION and TROUBLE-SHOOTING in the help',
1319                     'For more information type:    :help command-t']
1320 
1321     def show_file_finder
1322       warn *@@load_error
1323     end
1324 
1325     def flush
1326       warn *@@load_error
1327     end
1328 
1329   private
1330 
1331     def warn *msg
1332       ::VIM::command 'echohl WarningMsg'
1333       msg.each { |m| ::VIM::command "echo '#{m}'" }
1334       ::VIM::command 'echohl none'
1335     end
1336   end # class Stub
1337 end # module CommandT
1338 ruby/command-t/vim/path_utilities.rb	[[[1
1339 40
1340 # Copyright 2010-2011 Wincent Colaiuta. All rights reserved.
1341 #
1342 # Redistribution and use in source and binary forms, with or without
1343 # modification, are permitted provided that the following conditions are met:
1344 #
1345 # 1. Redistributions of source code must retain the above copyright notice,
1346 #    this list of conditions and the following disclaimer.
1347 # 2. Redistributions in binary form must reproduce the above copyright notice,
1348 #    this list of conditions and the following disclaimer in the documentation
1349 #    and/or other materials provided with the distribution.
1350 #
1351 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1352 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1353 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1354 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
1355 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1356 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1357 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
1358 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
1359 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
1360 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
1361 # POSSIBILITY OF SUCH DAMAGE.
1362 
1363 require 'command-t/vim'
1364 
1365 module CommandT
1366   module VIM
1367     module PathUtilities
1368 
1369     private
1370 
1371       def relative_path_under_working_directory path
1372         # any path under the working directory will be specified as a relative
1373         # path to improve the readability of the buffer list etc
1374         pwd = File.expand_path(VIM::pwd) + '/'
1375         path.index(pwd) == 0 ? path[pwd.length..-1] : path
1376       end
1377     end # module PathUtilities
1378   end # module VIM
1379 end # module CommandT
1380 ruby/command-t/vim/screen.rb	[[[1
1381 32
1382 # Copyright 2010 Wincent Colaiuta. All rights reserved.
1383 #
1384 # Redistribution and use in source and binary forms, with or without
1385 # modification, are permitted provided that the following conditions are met:
1386 #
1387 # 1. Redistributions of source code must retain the above copyright notice,
1388 #    this list of conditions and the following disclaimer.
1389 # 2. Redistributions in binary form must reproduce the above copyright notice,
1390 #    this list of conditions and the following disclaimer in the documentation
1391 #    and/or other materials provided with the distribution.
1392 #
1393 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1394 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1395 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1396 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
1397 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1398 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1399 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
1400 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
1401 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
1402 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
1403 # POSSIBILITY OF SUCH DAMAGE.
1404 
1405 module CommandT
1406   module VIM
1407     module Screen
1408       def self.lines
1409         ::VIM::evaluate('&lines').to_i
1410       end
1411     end # module Screen
1412   end # module VIM
1413 end # module CommandT
1414 ruby/command-t/vim/window.rb	[[[1
1415 38
1416 # Copyright 2010 Wincent Colaiuta. All rights reserved.
1417 #
1418 # Redistribution and use in source and binary forms, with or without
1419 # modification, are permitted provided that the following conditions are met:
1420 #
1421 # 1. Redistributions of source code must retain the above copyright notice,
1422 #    this list of conditions and the following disclaimer.
1423 # 2. Redistributions in binary form must reproduce the above copyright notice,
1424 #    this list of conditions and the following disclaimer in the documentation
1425 #    and/or other materials provided with the distribution.
1426 #
1427 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1428 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1429 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1430 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
1431 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1432 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1433 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
1434 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
1435 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
1436 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
1437 # POSSIBILITY OF SUCH DAMAGE.
1438 
1439 module CommandT
1440   module VIM
1441     class Window
1442       def self.select window
1443         return true if $curwin == window
1444         initial = $curwin
1445         while true do
1446           ::VIM::command 'wincmd w'           # cycle through windows
1447           return true if $curwin == window    # have selected desired window
1448           return false if $curwin == initial  # have already looped through all
1449         end
1450       end
1451     end # class Window
1452   end # module VIM
1453 end # module CommandT
1454 ruby/command-t/vim.rb	[[[1
1455 43
1456 # Copyright 2010 Wincent Colaiuta. All rights reserved.
1457 #
1458 # Redistribution and use in source and binary forms, with or without
1459 # modification, are permitted provided that the following conditions are met:
1460 #
1461 # 1. Redistributions of source code must retain the above copyright notice,
1462 #    this list of conditions and the following disclaimer.
1463 # 2. Redistributions in binary form must reproduce the above copyright notice,
1464 #    this list of conditions and the following disclaimer in the documentation
1465 #    and/or other materials provided with the distribution.
1466 #
1467 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1468 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1469 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1470 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
1471 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1472 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1473 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
1474 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
1475 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
1476 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
1477 # POSSIBILITY OF SUCH DAMAGE.
1478 
1479 require 'command-t/vim/screen'
1480 require 'command-t/vim/window'
1481 
1482 module CommandT
1483   module VIM
1484     def self.has_syntax?
1485       ::VIM::evaluate('has("syntax")').to_i != 0
1486     end
1487 
1488     def self.pwd
1489       ::VIM::evaluate 'getcwd()'
1490     end
1491 
1492     # Escape a string for safe inclusion in a Vim single-quoted string
1493     # (single quotes escaped by doubling, everything else is literal)
1494     def self.escape_for_single_quotes str
1495       str.gsub "'", "''"
1496     end
1497   end # module VIM
1498 end # module CommandT
1499 ruby/command-t/ext.c	[[[1
1500 65
1501 // Copyright 2010 Wincent Colaiuta. All rights reserved.
1502 //
1503 // Redistribution and use in source and binary forms, with or without
1504 // modification, are permitted provided that the following conditions are met:
1505 //
1506 // 1. Redistributions of source code must retain the above copyright notice,
1507 //    this list of conditions and the following disclaimer.
1508 // 2. Redistributions in binary form must reproduce the above copyright notice,
1509 //    this list of conditions and the following disclaimer in the documentation
1510 //    and/or other materials provided with the distribution.
1511 //
1512 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1513 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1514 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1515 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
1516 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1517 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1518 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
1519 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
1520 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
1521 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
1522 // POSSIBILITY OF SUCH DAMAGE.
1523 
1524 #include "match.h"
1525 #include "matcher.h"
1526 
1527 VALUE mCommandT         = 0; // module CommandT
1528 VALUE cCommandTMatch    = 0; // class CommandT::Match
1529 VALUE cCommandTMatcher  = 0; // class CommandT::Matcher
1530 
1531 VALUE CommandT_option_from_hash(const char *option, VALUE hash)
1532 {
1533     if (NIL_P(hash))
1534         return Qnil;
1535     VALUE key = ID2SYM(rb_intern(option));
1536     if (rb_funcall(hash, rb_intern("has_key?"), 1, key) == Qtrue)
1537         return rb_hash_aref(hash, key);
1538     else
1539         return Qnil;
1540 }
1541 
1542 void Init_ext()
1543 {
1544     // module CommandT
1545     mCommandT = rb_define_module("CommandT");
1546 
1547     // class CommandT::Match
1548     cCommandTMatch = rb_define_class_under(mCommandT, "Match", rb_cObject);
1549 
1550     // methods
1551     rb_define_method(cCommandTMatch, "initialize", CommandTMatch_initialize, -1);
1552     rb_define_method(cCommandTMatch, "matches?", CommandTMatch_matches, 0);
1553     rb_define_method(cCommandTMatch, "to_s", CommandTMatch_to_s, 0);
1554 
1555     // attributes
1556     rb_define_attr(cCommandTMatch, "score", Qtrue, Qfalse); // reader: true, writer: false
1557 
1558     // class CommandT::Matcher
1559     cCommandTMatcher = rb_define_class_under(mCommandT, "Matcher", rb_cObject);
1560 
1561     // methods
1562     rb_define_method(cCommandTMatcher, "initialize", CommandTMatcher_initialize, -1);
1563     rb_define_method(cCommandTMatcher, "sorted_matches_for", CommandTMatcher_sorted_matches_for, 2);
1564     rb_define_method(cCommandTMatcher, "matches_for", CommandTMatcher_matches_for, 1);
1565 }
1566 ruby/command-t/match.c	[[[1
1567 189
1568 // Copyright 2010 Wincent Colaiuta. All rights reserved.
1569 //
1570 // Redistribution and use in source and binary forms, with or without
1571 // modification, are permitted provided that the following conditions are met:
1572 //
1573 // 1. Redistributions of source code must retain the above copyright notice,
1574 //    this list of conditions and the following disclaimer.
1575 // 2. Redistributions in binary form must reproduce the above copyright notice,
1576 //    this list of conditions and the following disclaimer in the documentation
1577 //    and/or other materials provided with the distribution.
1578 //
1579 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1580 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1581 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1582 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
1583 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1584 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1585 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
1586 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
1587 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
1588 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
1589 // POSSIBILITY OF SUCH DAMAGE.
1590 
1591 #include "match.h"
1592 #include "ext.h"
1593 #include "ruby_compat.h"
1594 
1595 // use a struct to make passing params during recursion easier
1596 typedef struct
1597 {
1598     char    *str_p;                 // pointer to string to be searched
1599     long    str_len;                // length of same
1600     char    *abbrev_p;              // pointer to search string (abbreviation)
1601     long    abbrev_len;             // length of same
1602     double  max_score_per_char;
1603     int     dot_file;               // boolean: true if str is a dot-file
1604     int     always_show_dot_files;  // boolean
1605     int     never_show_dot_files;   // boolean
1606 } matchinfo_t;
1607 
1608 double recursive_match(matchinfo_t *m,  // sharable meta-data
1609                        long str_idx,    // where in the path string to start
1610                        long abbrev_idx, // where in the search string to start
1611                        long last_idx,   // location of last matched character
1612                        double score)    // cumulative score so far
1613 {
1614     double seen_score = 0;      // remember best score seen via recursion
1615     int dot_file_match = 0;     // true if abbrev matches a dot-file
1616     int dot_search = 0;         // true if searching for a dot
1617 
1618     for (long i = abbrev_idx; i < m->abbrev_len; i++)
1619     {
1620         char c = m->abbrev_p[i];
1621         if (c == '.')
1622             dot_search = 1;
1623         int found = 0;
1624         for (long j = str_idx; j < m->str_len; j++, str_idx++)
1625         {
1626             char d = m->str_p[j];
1627             if (d == '.')
1628             {
1629                 if (j == 0 || m->str_p[j - 1] == '/')
1630                 {
1631                     m->dot_file = 1;        // this is a dot-file
1632                     if (dot_search)         // and we are searching for a dot
1633                         dot_file_match = 1; // so this must be a match
1634                 }
1635             }
1636             else if (d >= 'A' && d <= 'Z')
1637                 d += 'a' - 'A'; // add 32 to downcase
1638             if (c == d)
1639             {
1640                 found = 1;
1641                 dot_search = 0;
1642 
1643                 // calculate score
1644                 double score_for_char = m->max_score_per_char;
1645                 long distance = j - last_idx;
1646                 if (distance > 1)
1647                 {
1648                     double factor = 1.0;
1649                     char last = m->str_p[j - 1];
1650                     char curr = m->str_p[j]; // case matters, so get again
1651                     if (last == '/')
1652                         factor = 0.9;
1653                     else if (last == '-' ||
1654                             last == '_' ||
1655                             last == ' ' ||
1656                             (last >= '0' && last <= '9'))
1657                         factor = 0.8;
1658                     else if (last >= 'a' && last <= 'z' &&
1659                             curr >= 'A' && curr <= 'Z')
1660                         factor = 0.8;
1661                     else if (last == '.')
1662                         factor = 0.7;
1663                     else
1664                         // if no "special" chars behind char, factor diminishes
1665                         // as distance from last matched char increases
1666                         factor = (1.0 / distance) * 0.75;
1667                     score_for_char *= factor;
1668                 }
1669 
1670                 if (++j < m->str_len)
1671                 {
1672                     // bump cursor one char to the right and
1673                     // use recursion to try and find a better match
1674                     double sub_score = recursive_match(m, j, i, last_idx, score);
1675                     if (sub_score > seen_score)
1676                         seen_score = sub_score;
1677                 }
1678 
1679                 score += score_for_char;
1680                 last_idx = str_idx++;
1681                 break;
1682             }
1683         }
1684         if (!found)
1685             return 0.0;
1686     }
1687     if (m->dot_file)
1688     {
1689         if (m->never_show_dot_files ||
1690             (!dot_file_match && !m->always_show_dot_files))
1691             return 0.0;
1692     }
1693     return (score > seen_score) ? score : seen_score;
1694 }
1695 
1696 // Match.new abbrev, string, options = {}
1697 VALUE CommandTMatch_initialize(int argc, VALUE *argv, VALUE self)
1698 {
1699     // process arguments: 2 mandatory, 1 optional
1700     VALUE str, abbrev, options;
1701     if (rb_scan_args(argc, argv, "21", &str, &abbrev, &options) == 2)
1702         options = Qnil;
1703     str             = StringValue(str);
1704     abbrev          = StringValue(abbrev); // already downcased by caller
1705 
1706     // check optional options hash for overrides
1707     VALUE always_show_dot_files = CommandT_option_from_hash("always_show_dot_files", options);
1708     VALUE never_show_dot_files = CommandT_option_from_hash("never_show_dot_files", options);
1709 
1710     matchinfo_t m;
1711     m.str_p                 = RSTRING_PTR(str);
1712     m.str_len               = RSTRING_LEN(str);
1713     m.abbrev_p              = RSTRING_PTR(abbrev);
1714     m.abbrev_len            = RSTRING_LEN(abbrev);
1715     m.max_score_per_char    = (1.0 / m.str_len + 1.0 / m.abbrev_len) / 2;
1716     m.dot_file              = 0;
1717     m.always_show_dot_files = always_show_dot_files == Qtrue;
1718     m.never_show_dot_files  = never_show_dot_files == Qtrue;
1719 
1720     // calculate score
1721     double score = 1.0;
1722     if (m.abbrev_len == 0) // special case for zero-length search string
1723     {
1724         // filter out dot files
1725         if (!m.always_show_dot_files)
1726         {
1727             for (long i = 0; i < m.str_len; i++)
1728             {
1729                 char c = m.str_p[i];
1730                 if (c == '.' && (i == 0 || m.str_p[i - 1] == '/'))
1731                 {
1732                     score = 0.0;
1733                     break;
1734                 }
1735             }
1736         }
1737     }
1738     else // normal case
1739         score = recursive_match(&m, 0, 0, 0, 0.0);
1740 
1741     // clean-up and final book-keeping
1742     rb_iv_set(self, "@score", rb_float_new(score));
1743     rb_iv_set(self, "@str", str);
1744     return Qnil;
1745 }
1746 
1747 VALUE CommandTMatch_matches(VALUE self)
1748 {
1749     double score = NUM2DBL(rb_iv_get(self, "@score"));
1750     return score > 0 ? Qtrue : Qfalse;
1751 }
1752 
1753 VALUE CommandTMatch_to_s(VALUE self)
1754 {
1755     return rb_iv_get(self, "@str");
1756 }
1757 ruby/command-t/matcher.c	[[[1
1758 164
1759 // Copyright 2010 Wincent Colaiuta. All rights reserved.
1760 //
1761 // Redistribution and use in source and binary forms, with or without
1762 // modification, are permitted provided that the following conditions are met:
1763 //
1764 // 1. Redistributions of source code must retain the above copyright notice,
1765 //    this list of conditions and the following disclaimer.
1766 // 2. Redistributions in binary form must reproduce the above copyright notice,
1767 //    this list of conditions and the following disclaimer in the documentation
1768 //    and/or other materials provided with the distribution.
1769 //
1770 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1771 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1772 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1773 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
1774 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1775 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1776 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
1777 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
1778 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
1779 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
1780 // POSSIBILITY OF SUCH DAMAGE.
1781 
1782 #include  /* for qsort() */
1783 #include  /* for strcmp() */
1784 #include "matcher.h"
1785 #include "ext.h"
1786 #include "ruby_compat.h"
1787 
1788 // comparison function for use with qsort
1789 int comp_alpha(const void *a, const void *b)
1790 {
1791     VALUE a_val = *(VALUE *)a;
1792     VALUE b_val = *(VALUE *)b;
1793     ID to_s = rb_intern("to_s");
1794 
1795     VALUE a_str = rb_funcall(a_val, to_s, 0);
1796     VALUE b_str = rb_funcall(b_val, to_s, 0);
1797     char *a_p = RSTRING_PTR(a_str);
1798     long a_len = RSTRING_LEN(a_str);
1799     char *b_p = RSTRING_PTR(b_str);
1800     long b_len = RSTRING_LEN(b_str);
1801     int order = 0;
1802     if (a_len > b_len)
1803     {
1804         order = strncmp(a_p, b_p, b_len);
1805         if (order == 0)
1806             order = 1; // shorter string (b) wins
1807     }
1808     else if (a_len < b_len)
1809     {
1810         order = strncmp(a_p, b_p, a_len);
1811         if (order == 0)
1812             order = -1; // shorter string (a) wins
1813     }
1814     else
1815         order = strncmp(a_p, b_p, a_len);
1816     return order;
1817 }
1818 
1819 // comparison function for use with qsort
1820 int comp_score(const void *a, const void *b)
1821 {
1822     VALUE a_val = *(VALUE *)a;
1823     VALUE b_val = *(VALUE *)b;
1824     ID score = rb_intern("score");
1825     double a_score = RFLOAT_VALUE(rb_funcall(a_val, score, 0));
1826     double b_score = RFLOAT_VALUE(rb_funcall(b_val, score, 0));
1827     if (a_score > b_score)
1828         return -1; // a scores higher, a should appear sooner
1829     else if (a_score < b_score)
1830         return 1;  // b scores higher, a should appear later
1831     else
1832         return comp_alpha(a, b);
1833 }
1834 
1835 VALUE CommandTMatcher_initialize(int argc, VALUE *argv, VALUE self)
1836 {
1837     // process arguments: 1 mandatory, 1 optional
1838     VALUE scanner, options;
1839     if (rb_scan_args(argc, argv, "11", &scanner, &options) == 1)
1840         options = Qnil;
1841     if (NIL_P(scanner))
1842         rb_raise(rb_eArgError, "nil scanner");
1843     rb_iv_set(self, "@scanner", scanner);
1844 
1845     // check optional options hash for overrides
1846     VALUE always_show_dot_files = CommandT_option_from_hash("always_show_dot_files", options);
1847     if (always_show_dot_files != Qtrue)
1848         always_show_dot_files = Qfalse;
1849     VALUE never_show_dot_files = CommandT_option_from_hash("never_show_dot_files", options);
1850     if (never_show_dot_files != Qtrue)
1851         never_show_dot_files = Qfalse;
1852     rb_iv_set(self, "@always_show_dot_files", always_show_dot_files);
1853     rb_iv_set(self, "@never_show_dot_files", never_show_dot_files);
1854     return Qnil;
1855 }
1856 
1857 VALUE CommandTMatcher_sorted_matches_for(VALUE self, VALUE abbrev, VALUE options)
1858 {
1859     // process optional options hash
1860     VALUE limit_option = CommandT_option_from_hash("limit", options);
1861 
1862     // get unsorted matches
1863     VALUE matches = CommandTMatcher_matches_for(self, abbrev);
1864 
1865     abbrev = StringValue(abbrev);
1866     if (RSTRING_LEN(abbrev) == 0 ||
1867         (RSTRING_LEN(abbrev) == 1 && RSTRING_PTR(abbrev)[0] == '.'))
1868         // alphabetic order if search string is only "" or "."
1869         qsort(RARRAY_PTR(matches), RARRAY_LEN(matches), sizeof(VALUE), comp_alpha);
1870     else
1871         // for all other non-empty search strings, sort by score
1872         qsort(RARRAY_PTR(matches), RARRAY_LEN(matches), sizeof(VALUE), comp_score);
1873 
1874     // apply optional limit option
1875     long limit = NIL_P(limit_option) ? 0 : NUM2LONG(limit_option);
1876     if (limit == 0 || RARRAY_LEN(matches) < limit)
1877         limit = RARRAY_LEN(matches);
1878 
1879     // will return an array of strings, not an array of Match objects
1880     for (long i = 0; i < limit; i++)
1881     {
1882         VALUE str = rb_funcall(RARRAY_PTR(matches)[i], rb_intern("to_s"), 0);
1883         RARRAY_PTR(matches)[i] = str;
1884     }
1885 
1886     // trim off any items beyond the limit
1887     if (limit < RARRAY_LEN(matches))
1888         (void)rb_funcall(matches, rb_intern("slice!"), 2, LONG2NUM(limit),
1889             LONG2NUM(RARRAY_LEN(matches) - limit));
1890     return matches;
1891 }
1892 
1893 VALUE CommandTMatcher_matches_for(VALUE self, VALUE abbrev)
1894 {
1895     if (NIL_P(abbrev))
1896         rb_raise(rb_eArgError, "nil abbrev");
1897     VALUE matches = rb_ary_new();
1898     VALUE scanner = rb_iv_get(self, "@scanner");
1899     VALUE always_show_dot_files = rb_iv_get(self, "@always_show_dot_files");
1900     VALUE never_show_dot_files = rb_iv_get(self, "@never_show_dot_files");
1901     VALUE options = Qnil;
1902     if (always_show_dot_files == Qtrue)
1903     {
1904         options = rb_hash_new();
1905         rb_hash_aset(options, ID2SYM(rb_intern("always_show_dot_files")), always_show_dot_files);
1906     }
1907     else if (never_show_dot_files == Qtrue)
1908     {
1909         options = rb_hash_new();
1910         rb_hash_aset(options, ID2SYM(rb_intern("never_show_dot_files")), never_show_dot_files);
1911     }
1912     abbrev = rb_funcall(abbrev, rb_intern("downcase"), 0);
1913     VALUE paths = rb_funcall(scanner, rb_intern("paths"), 0);
1914     for (long i = 0, max = RARRAY_LEN(paths); i < max; i++)
1915     {
1916         VALUE path = RARRAY_PTR(paths)[i];
1917         VALUE match = rb_funcall(cCommandTMatch, rb_intern("new"), 3, path, abbrev, options);
1918         if (rb_funcall(match, rb_intern("matches?"), 0) == Qtrue)
1919             rb_funcall(matches, rb_intern("push"), 1, match);
1920     }
1921     return matches;
1922 }
1923 ruby/command-t/ext.h	[[[1
1924 36
1925 // Copyright 2010 Wincent Colaiuta. All rights reserved.
1926 //
1927 // Redistribution and use in source and binary forms, with or without
1928 // modification, are permitted provided that the following conditions are met:
1929 //
1930 // 1. Redistributions of source code must retain the above copyright notice,
1931 //    this list of conditions and the following disclaimer.
1932 // 2. Redistributions in binary form must reproduce the above copyright notice,
1933 //    this list of conditions and the following disclaimer in the documentation
1934 //    and/or other materials provided with the distribution.
1935 //
1936 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1937 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1938 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1939 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
1940 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1941 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1942 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
1943 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
1944 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
1945 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
1946 // POSSIBILITY OF SUCH DAMAGE.
1947 
1948 #include 
1949 
1950 extern VALUE mCommandT;         // module CommandT
1951 extern VALUE cCommandTMatch;    // class CommandT::Match
1952 extern VALUE cCommandTMatcher;  // class CommandT::Matcher
1953 
1954 // Encapsulates common pattern of checking for an option in an optional
1955 // options hash. The hash itself may be nil, but an exception will be
1956 // raised if it is not nil and not a hash.
1957 VALUE CommandT_option_from_hash(const char *option, VALUE hash);
1958 
1959 // Debugging macro.
1960 #define ruby_inspect(obj) rb_funcall(rb_mKernel, rb_intern("p"), 1, obj)
1961 ruby/command-t/match.h	[[[1
1962 29
1963 // Copyright 2010 Wincent Colaiuta. All rights reserved.
1964 //
1965 // Redistribution and use in source and binary forms, with or without
1966 // modification, are permitted provided that the following conditions are met:
1967 //
1968 // 1. Redistributions of source code must retain the above copyright notice,
1969 //    this list of conditions and the following disclaimer.
1970 // 2. Redistributions in binary form must reproduce the above copyright notice,
1971 //    this list of conditions and the following disclaimer in the documentation
1972 //    and/or other materials provided with the distribution.
1973 //
1974 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1975 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1976 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1977 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
1978 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1979 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1980 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
1981 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
1982 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
1983 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
1984 // POSSIBILITY OF SUCH DAMAGE.
1985 
1986 #include 
1987 
1988 extern VALUE CommandTMatch_initialize(int argc, VALUE *argv, VALUE self);
1989 extern VALUE CommandTMatch_matches(VALUE self);
1990 extern VALUE CommandTMatch_score(VALUE self);
1991 extern VALUE CommandTMatch_to_s(VALUE self);
1992 ruby/command-t/matcher.h	[[[1
1993 30
1994 // Copyright 2010 Wincent Colaiuta. All rights reserved.
1995 //
1996 // Redistribution and use in source and binary forms, with or without
1997 // modification, are permitted provided that the following conditions are met:
1998 //
1999 // 1. Redistributions of source code must retain the above copyright notice,
2000 //    this list of conditions and the following disclaimer.
2001 // 2. Redistributions in binary form must reproduce the above copyright notice,
2002 //    this list of conditions and the following disclaimer in the documentation
2003 //    and/or other materials provided with the distribution.
2004 //
2005 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
2006 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2007 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2008 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
2009 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2010 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2011 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2012 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2013 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2014 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2015 // POSSIBILITY OF SUCH DAMAGE.
2016 
2017 #include 
2018 
2019 extern VALUE CommandTMatcher_initialize(int argc, VALUE *argv, VALUE self);
2020 extern VALUE CommandTMatcher_sorted_matches_for(VALUE self, VALUE abbrev, VALUE options);
2021 
2022 // most likely the function will be subsumed by the sorted_matcher_for function
2023 extern VALUE CommandTMatcher_matches_for(VALUE self, VALUE abbrev);
2024 ruby/command-t/ruby_compat.h	[[[1
2025 49
2026 // Copyright 2010 Wincent Colaiuta. All rights reserved.
2027 //
2028 // Redistribution and use in source and binary forms, with or without
2029 // modification, are permitted provided that the following conditions are met:
2030 //
2031 // 1. Redistributions of source code must retain the above copyright notice,
2032 //    this list of conditions and the following disclaimer.
2033 // 2. Redistributions in binary form must reproduce the above copyright notice,
2034 //    this list of conditions and the following disclaimer in the documentation
2035 //    and/or other materials provided with the distribution.
2036 //
2037 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
2038 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2039 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2040 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
2041 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2042 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2043 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2044 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2045 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2046 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2047 // POSSIBILITY OF SUCH DAMAGE.
2048 
2049 #include 
2050 
2051 // for compatibility with older versions of Ruby which don't declare RSTRING_PTR
2052 #ifndef RSTRING_PTR
2053 #define RSTRING_PTR(s) (RSTRING(s)->ptr)
2054 #endif
2055 
2056 // for compatibility with older versions of Ruby which don't declare RSTRING_LEN
2057 #ifndef RSTRING_LEN
2058 #define RSTRING_LEN(s) (RSTRING(s)->len)
2059 #endif
2060 
2061 // for compatibility with older versions of Ruby which don't declare RARRAY_PTR
2062 #ifndef RARRAY_PTR
2063 #define RARRAY_PTR(a) (RARRAY(a)->ptr)
2064 #endif
2065 
2066 // for compatibility with older versions of Ruby which don't declare RARRAY_LEN
2067 #ifndef RARRAY_LEN
2068 #define RARRAY_LEN(a) (RARRAY(a)->len)
2069 #endif
2070 
2071 // for compatibility with older versions of Ruby which don't declare RFLOAT_VALUE
2072 #ifndef RFLOAT_VALUE
2073 #define RFLOAT_VALUE(f) (RFLOAT(f)->value)
2074 #endif
2075 ruby/command-t/depend	[[[1
2076 24
2077 # Copyright 2010 Wincent Colaiuta. All rights reserved.
2078 #
2079 # Redistribution and use in source and binary forms, with or without
2080 # modification, are permitted provided that the following conditions are met:
2081 #
2082 # 1. Redistributions of source code must retain the above copyright notice,
2083 #    this list of conditions and the following disclaimer.
2084 # 2. Redistributions in binary form must reproduce the above copyright notice,
2085 #    this list of conditions and the following disclaimer in the documentation
2086 #    and/or other materials provided with the distribution.
2087 #
2088 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
2089 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2090 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2091 # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
2092 # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2093 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2094 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2095 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2096 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2097 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2098 # POSSIBILITY OF SUCH DAMAGE.
2099 
2100 CFLAGS += -std=c99 -Wall -Wextra -Wno-unused-parameter
2101 doc/command-t.txt	[[[1
2102 786
2103 *command-t.txt* Command-T plug-in for Vim         *command-t*
2104 
2105 CONTENTS                                        *command-t-contents*
2106 
2107  1. Introduction            |command-t-intro|
2108  2. Requirements            |command-t-requirements|
2109  3. Installation            |command-t-installation|
2110  3. Managing using Pathogen |command-t-pathogen|
2111  4. Trouble-shooting        |command-t-trouble-shooting|
2112  5. Usage                   |command-t-usage|
2113  6. Commands                |command-t-commands|
2114  7. Mappings                |command-t-mappings|
2115  8. Options                 |command-t-options|
2116  9. Authors                 |command-t-authors|
2117 10. Website                 |command-t-website|
2118 11. Donations               |command-t-donations|
2119 12. License                 |command-t-license|
2120 13. History                 |command-t-history|
2121 
2122 
2123 INTRODUCTION                                    *command-t-intro*
2124 
2125 The Command-T plug-in provides an extremely fast, intuitive mechanism for
2126 opening files and buffers with a minimal number of keystrokes. It's named
2127 "Command-T" because it is inspired by the "Go to File" window bound to
2128 Command-T in TextMate.
2129 
2130 Files are selected by typing characters that appear in their paths, and are
2131 ordered by an algorithm which knows that characters that appear in certain
2132 locations (for example, immediately after a path separator) should be given
2133 more weight.
2134 
2135 To search efficiently, especially in large projects, you should adopt a
2136 "path-centric" rather than a "filename-centric" mentality. That is you should
2137 think more about where the desired file is found rather than what it is
2138 called. This means narrowing your search down by including some characters
2139 from the upper path components rather than just entering characters from the
2140 filename itself.
2141 
2142 Screencasts demonstrating the plug-in can be viewed at:
2143 
2144   https://wincent.com/products/command-t
2145 
2146 
2147 REQUIREMENTS                                    *command-t-requirements*
2148 
2149 The plug-in requires Vim compiled with Ruby support, a compatible Ruby
2150 installation at the operating system level, and a C compiler to build
2151 the Ruby extension.
2152 
2153 
2154 1. Vim compiled with Ruby support
2155 
2156 You can check for Ruby support by launching Vim with the --version switch:
2157 
2158   vim --version
2159 
2160 If "+ruby" appears in the version information then your version of Vim has
2161 Ruby support.
2162 
2163 Another way to check is to simply try using the :ruby command from within Vim
2164 itself:
2165 
2166   :ruby 1
2167 
2168 If your Vim lacks support you'll see an error message like this:
2169 
2170   E319: Sorry, the command is not available in this version
2171 
2172 The version of Vim distributed with Mac OS X does not include Ruby support,
2173 while MacVim does; it is available from:
2174 
2175   http://github.com/b4winckler/macvim/downloads
2176 
2177 For Windows users, the Vim 7.2 executable available from www.vim.org does
2178 include Ruby support, and is recommended over version 7.3 (which links against
2179 Ruby 1.9, but apparently has some bugs that need to be resolved).
2180 
2181 
2182 2. Ruby
2183 
2184 In addition to having Ruby support in Vim, your system itself must have a
2185 compatible Ruby install. "Compatible" means the same version as Vim itself
2186 links against. If you use a different version then Command-T is unlikely
2187 to work (see TROUBLE-SHOOTING below).
2188 
2189 On Mac OS X Snow Leopard, the system comes with Ruby 1.8.7 and all recent
2190 versions of MacVim (the 7.2 snapshots and 7.3) are linked against it.
2191 
2192 On Linux and similar platforms, the linked version of Ruby will depend on
2193 your distribution. You can usually find this out by examining the
2194 compilation and linking flags displayed by the |:version| command in Vim, and
2195 by looking at the output of:
2196 
2197   :ruby puts RUBY_VERSION
2198 
2199 A suitable Ruby environment for Windows can be installed using the Ruby
2200 1.8.7-p299 RubyInstaller available at:
2201 
2202   http://rubyinstaller.org/downloads/archives
2203 
2204 If using RubyInstaller be sure to download the installer executable, not the
2205 7-zip archive. When installing mark the checkbox "Add Ruby executables to your
2206 PATH" so that Vim can find them.
2207 
2208 
2209 3. C compiler
2210 
2211 Part of Command-T is implemented in C as a Ruby extension for speed, allowing
2212 it to work responsively even on directory hierarchies containing enormous
2213 numbers of files. As such, a C compiler is required in order to build the
2214 extension and complete the installation.
2215 
2216 On Mac OS X, this can be obtained by installing the Xcode Tools that come on
2217 the Mac OS X install disc.
2218 
2219 On Windows, the RubyInstaller Development Kit can be used to conveniently
2220 install the necessary tool chain:
2221 
2222   http://rubyinstaller.org/downloads/archives
2223 
2224 At the time of writing, the appropriate development kit for use with Ruby
2225 1.8.7 is DevKit-3.4.5r3-20091110.
2226 
2227 To use the Development Kit extract the archive contents to your C:\Ruby
2228 folder.
2229 
2230 
2231 INSTALLATION                                    *command-t-installation*
2232 
2233 Command-T is distributed as a "vimball" which means that it can be installed
2234 by opening it in Vim and then sourcing it:
2235 
2236   :e command-t.vba
2237   :so %
2238 
2239 The files will be installed in your |'runtimepath'|. To check where this is
2240 you can issue:
2241 
2242   :echo &rtp
2243 
2244 The C extension must then be built, which can be done from the shell. If you
2245 use a typical |'runtimepath'| then the files were installed inside ~/.vim and
2246 you can build the extension with:
2247 
2248   cd ~/.vim/ruby/command-t
2249   ruby extconf.rb
2250   make
2251 
2252 Note: If you are an RVM user, you must perform the build using the same
2253 version of Ruby that Vim itself is linked against. This will often be the
2254 system Ruby, which can be selected before issuing the "make" command with:
2255 
2256   rvm use system
2257 
2258 
2259 MANAGING USING PATHOGEN                         *command-t-pathogen*
2260 
2261 Pathogen is a plugin that allows you to maintain plugin installations in
2262 separate, isolated subdirectories under the "bundle" directory in your
2263 |'runtimepath'|. The following examples assume that you already have
2264 Pathogen installed and configured, and that you are installing into
2265 ~/.vim/bundle. For more information about Pathogen, see:
2266 
2267   http://www.vim.org/scripts/script.php?script_id=2332
2268 
2269 If you manage your entire ~/.vim folder using Git then you can add the
2270 Command-T repository as a submodule:
2271 
2272   cd ~/.vim
2273   git submodule add git://git.wincent.com/command-t.git bundle/command-t
2274   git submodule init
2275 
2276 Or if you just wish to do a simple clone instead of using submodules:
2277 
2278   cd ~/.vim
2279   git clone git://git.wincent.com/command-t.git bundle/command-t
2280 
2281 Once you have a local copy of the repository you can update it at any time
2282 with:
2283 
2284   cd ~/.vim/bundle/command-t
2285   git pull
2286 
2287 Or you can switch to a specific release with:
2288 
2289   cd ~/.vim/bundle/command-t
2290   git checkout 0.8b
2291 
2292 After installing or updating you must build the extension:
2293 
2294   cd ~/.vim/bundle/command-t
2295   rake make
2296 
2297 While the Vimball installation automatically generates the help tags, under
2298 Pathogen it is necessary to do so explicitly from inside Vim:
2299 
2300   :call pathogen#helptags()
2301 
2302 
2303 TROUBLE-SHOOTING                                *command-t-trouble-shooting*
2304 
2305 Most installation problems are caused by a mismatch between the version of
2306 Ruby on the host operating system, and the version of Ruby that Vim itself
2307 linked against at compile time. For example, if one is 32-bit and the other is
2308 64-bit, or one is from the Ruby 1.9 series and the other is from the 1.8
2309 series, then the plug-in is not likely to work.
2310 
2311 As such, on Mac OS X, I recommend using the standard Ruby that comes with the
2312 system (currently 1.8.7) along with the latest version of MacVim (currently
2313 version 7.3). If you wish to use custom builds of Ruby or of MacVim (not
2314 recommmended) then you will have to take extra care to ensure that the exact
2315 same Ruby environment is in effect when building Ruby, Vim and the Command-T
2316 extension.
2317 
2318 For Windows, the following combination is known to work:
2319 
2320   - Vim 7.2 from http://www.vim.org/download.php:
2321       ftp://ftp.vim.org/pub/vim/pc/gvim72.exe
2322   - Ruby 1.8.7-p299 from http://rubyinstaller.org/downloads/archives:
2323       http://rubyforge.org/frs/download.php/71492/rubyinstaller-1.8.7-p299.exe
2324   - DevKit 3.4.5r3-20091110 from http://rubyinstaller.org/downloads/archives:
2325       http://rubyforge.org/frs/download.php/66888/devkit-3.4.5r3-20091110.7z
2326 
2327 If a problem occurs the first thing you should do is inspect the output of:
2328 
2329   ruby extconf.rb
2330   make
2331 
2332 During the installation, and:
2333 
2334   vim --version
2335 
2336 And compare the compilation and linker flags that were passed to the
2337 extension and to Vim itself when they were built. If the Ruby-related
2338 flags or architecture flags are different then it is likely that something
2339 has changed in your Ruby environment and the extension may not work until
2340 you eliminate the discrepancy.
2341 
2342 
2343 USAGE                                           *command-t-usage*
2344 
2345 Bring up the Command-T file window by typing:
2346 
2347   t
2348 
2349 This mapping is set up automatically for you, provided you do not already have
2350 a mapping for t or |:CommandT|. You can also bring up the file window
2351 by issuing the command:
2352 
2353   :CommandT
2354 
2355 A prompt will appear at the bottom of the screen along with a file window
2356 showing all of the files in the current directory (as returned by the
2357 |:pwd| command).
2358 
2359 For the most efficient file navigation within a project it's recommended that
2360 you |:cd| into the root directory of your project when starting to work on it.
2361 If you wish to open a file from outside of the project folder you can pass in
2362 an optional path argument (relative or absolute) to |:CommandT|:
2363 
2364   :CommandT ../path/to/other/files
2365 
2366 Type letters in the prompt to narrow down the selection, showing only the
2367 files whose paths contain those letters in the specified order. Letters do not
2368 need to appear consecutively in a path in order for it to be classified as a
2369 match.
2370 
2371 Once the desired file has been selected it can be opened by pressing .
2372 (By default files are opened in the current window, but there are other
2373 mappings that you can use to open in a vertical or horizontal split, or in
2374 a new tab.) Note that if you have |'nohidden'| set and there are unsaved
2375 changes in the current window when you press  then opening in the current
2376 window would fail; in this case Command-T will open the file in a new split.
2377 
2378 The following mappings are active when the prompt has focus:
2379 
2380             delete the character to the left of the cursor
2381            delete the character at the cursor
2382           move the cursor one character to the left
2383            move the cursor one character to the left
2384          move the cursor one character to the right
2385            move the cursor one character to the right
2386            move the cursor to the start (left)
2387            move the cursor to the end (right)
2388            clear the contents of the prompt
2389            change focus to the file listing
2390 
2391 The following mappings are active when the file listing has focus:
2392 
2393            change focus to the prompt
2394 
2395 The following mappings are active when either the prompt or the file listing
2396 has focus:
2397 
2398             open the selected file
2399           open the selected file in a new split window
2400            open the selected file in a new split window
2401            open the selected file in a new vertical split window
2402            open the selected file in a new tab
2403            select next file in the file listing
2404            select next file in the file listing
2405           select next file in the file listing
2406            select previous file in the file listing
2407            select previous file in the file listing
2408             select previous file in the file listing
2409            cancel (dismisses file listing)
2410 
2411 The following is also available on terminals which support it:
2412 
2413            cancel (dismisses file listing)
2414 
2415 Note that the default mappings can be overriden by setting options in your
2416 ~/.vimrc file (see the OPTIONS section for a full list of available options).
2417 
2418 In addition, when the file listing has focus, typing a character will cause
2419 the selection to jump to the first path which begins with that character.
2420 Typing multiple characters consecutively can be used to distinguish between
2421 paths which begin with the same prefix.
2422 
2423 
2424 COMMANDS                                        *command-t-commands*
2425 
2426                                                 *:CommandT*
2427 |:CommandT|     Brings up the Command-T file window, starting in the
2428                 current working directory as returned by the|:pwd|
2429                 command.
2430 
2431                                                 *:CommandTBuffer*
2432 |:CommandTBuffer|Brings up the Command-T buffer window.
2433                 This works exactly like the standard file window,
2434                 except that the selection is limited to files that
2435                 you already have open in buffers.
2436 
2437                                                 *:CommandTFlush*
2438 |:CommandTFlush|Instructs the plug-in to flush its path cache, causing
2439                 the directory to be rescanned for new or deleted paths
2440                 the next time the file window is shown. In addition, all
2441                 configuration settings are re-evaluated, causing any
2442                 changes made to settings via the |:let| command to be picked
2443                 up.
2444 
2445 
2446 MAPPINGS                                        *command-t-mappings*
2447 
2448 By default Command-T comes with only two mappings:
2449 
2450   t     bring up the Command-T file window
2451   b     bring up the Command-T buffer window
2452 
2453 However, Command-T won't overwrite a pre-existing mapping so if you prefer
2454 to define different mappings use lines like these in your ~/.vimrc:
2455 
2456   nmap  t :CommandT
2457   nmap  b :CommandTBuffer
2458 
2459 Replacing "t" or "b" with your mapping of choice.
2460 
2461 Note that in the case of MacVim you actually can map to Command-T (written
2462 as  in Vim) in your ~/.gvimrc file if you first unmap the existing menu
2463 binding of Command-T to "New Tab":
2464 
2465   if has("gui_macvim")
2466     macmenu &File.New\ Tab key=
2467     map  :CommandT
2468   endif
2469 
2470 When the Command-T window is active a number of other additional mappings
2471 become available for doing things like moving between and selecting matches.
2472 These are fully described above in the USAGE section, and settings for
2473 overriding the mappings are listed below under OPTIONS.
2474 
2475 
2476 OPTIONS                                         *command-t-options*
2477 
2478 A number of options may be set in your ~/.vimrc to influence the behaviour of
2479 the plug-in. To set an option, you include a line like this in your ~/.vimrc:
2480 
2481     let g:CommandTMaxFiles=20000
2482 
2483 To have Command-T pick up new settings immediately (that is, without having
2484 to restart Vim) you can issue the |:CommandTFlush| command after making
2485 changes via |:let|.
2486 
2487 Following is a list of all available options:
2488 
2489                                                *g:CommandTMaxFiles*
2490   |g:CommandTMaxFiles|                           number (default 10000)
2491 
2492       The maximum number of files that will be considered when scanning the
2493       current directory. Upon reaching this number scanning stops. This
2494       limit applies only to file listings and is ignored for buffer
2495       listings.
2496 
2497                                                *g:CommandTMaxDepth*
2498   |g:CommandTMaxDepth|                           number (default 15)
2499 
2500       The maximum depth (levels of recursion) to be explored when scanning the
2501       current directory. Any directories at levels beyond this depth will be
2502       skipped.
2503 
2504                                                *g:CommandTMaxHeight*
2505   |g:CommandTMaxHeight|                          number (default: 0)
2506 
2507       The maximum height in lines the match window is allowed to expand to.
2508       If set to 0, the window will occupy as much of the available space as
2509       needed to show matching entries.
2510 
2511                                                *g:CommandTAlwaysShowDotFiles*
2512   |g:CommandTAlwaysShowDotFiles|                 boolean (default: 0)
2513 
2514       When showing the file listing Command-T will by default show dot-files
2515       only if the entered search string contains a dot that could cause a
2516       dot-file to match. When set to a non-zero value, this setting instructs
2517       Command-T to always include matching dot-files in the match list
2518       regardless of whether the search string contains a dot. See also
2519       |g:CommandTNeverShowDotFiles|. Note that this setting only influences
2520       the file listing; the buffer listing treats dot-files like any other
2521       file.
2522 
2523                                                *g:CommandTNeverShowDotFiles*
2524   |g:CommandTNeverShowDotFiles|                  boolean (default: 0)
2525 
2526       In the file listing, Command-T will by default show dot-files if the
2527       entered search string contains a dot that could cause a dot-file to
2528       match. When set to a non-zero value, this setting instructs Command-T to
2529       never show dot-files under any circumstances. Note that it is
2530       contradictory to set both this setting and
2531       |g:CommandTAlwaysShowDotFiles| to true, and if you do so Vim will suffer
2532       from headaches, nervous twitches, and sudden mood swings. This setting
2533       has no effect in buffer listings, where dot files are treated like any
2534       other file.
2535 
2536                                                *g:CommandTScanDotDirectories*
2537   |g:CommandTScanDotDirectories|                 boolean (default: 0)
2538 
2539       Normally Command-T will not recurse into "dot-directories" (directories
2540       whose names begin with a dot) while performing its initial scan. Set
2541       this setting to a non-zero value to override this behavior and recurse.
2542       Note that this setting is completely independent of the
2543       |g:CommandTAlwaysShowDotFiles| and |g:CommandTNeverShowDotFiles|
2544       settings; those apply only to the selection and display of matches
2545       (after scanning has been performed), whereas
2546       |g:CommandTScanDotDirectories| affects the behaviour at scan-time.
2547 
2548       Note also that even with this setting off you can still use Command-T to
2549       open files inside a "dot-directory" such as ~/.vim, but you have to use
2550       the |:cd| command to change into that directory first. For example:
2551 
2552         :cd ~/.vim
2553         :CommandT
2554 
2555                                                *g:CommandTMatchWindowAtTop*
2556   |g:CommandTMatchWindowAtTop|                   boolean (default: 0)
2557 
2558       When this setting is off (the default) the match window will appear at
2559       the bottom so as to keep it near to the prompt. Turning it on causes the
2560       match window to appear at the top instead. This may be preferable if you
2561       want the best match (usually the first one) to appear in a fixed location
2562       on the screen rather than moving as the number of matches changes during
2563       typing.
2564 
2565                                                 *g:CommandTMatchWindowReverse*
2566   |g:CommandTMatchWindowReverse|                  boolean (default: 0)
2567 
2568       When this setting is off (the default) the matches will appear from
2569       top to bottom with the topmost being selected. Turning it on causes the
2570       matches to be reversed so the best match is at the bottom and the
2571       initially selected match is the bottom most. This may be preferable if
2572       you want the best match to appear in a fixed location on the screen
2573       but still be near the prompt at the bottom.
2574 
2575 As well as the basic options listed above, there are a number of settings that
2576 can be used to override the default key mappings used by Command-T. For
2577 example, to set  as the mapping for cancelling (dismissing) the Command-T
2578 window, you would add the following to your ~/.vimrc:
2579 
2580   let g:CommandTCancelMap=''
2581 
2582 Multiple, alternative mappings may be specified using list syntax:
2583 
2584   let g:CommandTCancelMap=['', '']
2585 
2586 Following is a list of all map settings and their defaults:
2587 
2588                               Setting   Default mapping(s)
2589 
2590                                       *g:CommandTBackspaceMap*
2591               |g:CommandTBackspaceMap|  
2592 
2593                                       *g:CommandTDeleteMap*
2594                  |g:CommandTDeleteMap|  
2595 
2596                                       *g:CommandTAcceptSelectionMap*
2597         |g:CommandTAcceptSelectionMap|  
2598 
2599                                       *g:CommandTAcceptSelectionSplitMap*
2600    |g:CommandTAcceptSelectionSplitMap|  
2601                                       
2602 
2603                                       *g:CommandTAcceptSelectionTabMap*
2604      |g:CommandTAcceptSelectionTabMap|  
2605 
2606                                       *g:CommandTAcceptSelectionVSplitMap*
2607   |g:CommandTAcceptSelectionVSplitMap|  
2608 
2609                                       *g:CommandTToggleFocusMap*
2610             |g:CommandTToggleFocusMap|  
2611 
2612                                       *g:CommandTCancelMap*
2613                  |g:CommandTCancelMap|  
2614                                        (not on all terminals)
2615 
2616                                       *g:CommandTSelectNextMap*
2617              |g:CommandTSelectNextMap|  
2618                                       
2619                                       
2620 
2621                                       *g:CommandTSelectPrevMap*
2622              |g:CommandTSelectPrevMap|  
2623                                       
2624                                       
2625 
2626                                       *g:CommandTClearMap*
2627                   |g:CommandTClearMap|  
2628 
2629                                       *g:CommandTCursorLeftMap*
2630              |g:CommandTCursorLeftMap|  
2631                                       
2632 
2633                                       *g:CommandTCursorRightMap*
2634             |g:CommandTCursorRightMap|  
2635                                       
2636 
2637                                       *g:CommandTCursorEndMap*
2638               |g:CommandTCursorEndMap|  
2639 
2640                                       *g:CommandTCursorStartMap*
2641             |g:CommandTCursorStartMap|  
2642 
2643 In addition to the options provided by Command-T itself, some of Vim's own
2644 settings can be used to control behavior:
2645 
2646                                                *command-t-wildignore*
2647   |'wildignore'|                                 string (default: '')
2648 
2649       Vim's |'wildignore'| setting is used to determine which files should be
2650       excluded from listings. This is a comma-separated list of glob patterns.
2651       It defaults to the empty string, but common settings include "*.o,*.obj"
2652       (to exclude object files) or ".git,.svn" (to exclude SCM metadata
2653       directories). For example:
2654 
2655         :set wildignore+=*.o,*.obj,.git
2656 
2657       A pattern such as "vendor/rails/**" would exclude all files and
2658       subdirectories inside the "vendor/rails" directory (relative to
2659       directory Command-T starts in).
2660 
2661       See the |'wildignore'| documentation for more information.
2662 
2663 
2664 AUTHORS                                         *command-t-authors*
2665 
2666 Command-T is written and maintained by Wincent Colaiuta .
2667 Other contributors that have submitted patches include (in alphabetical
2668 order):
2669 
2670   Daniel Hahler
2671   Lucas de Vries
2672   Matthew Todd
2673   Mike Lundy
2674   Scott Bronson
2675   Steven Moazami
2676   Sung Pae
2677   Victor Hugo Borja
2678   Zak Johnson
2679 
2680 As this was the first Vim plug-in I had ever written I was heavily influenced
2681 by the design of the LustyExplorer plug-in by Stephen Bach, which I understand
2682 is one of the largest Ruby-based Vim plug-ins to date.
2683 
2684 While the Command-T codebase doesn't contain any code directly copied from
2685 LustyExplorer, I did use it as a reference for answers to basic questions (like
2686 "How do you do 'X' in a Ruby-based Vim plug-in?"), and also copied some basic
2687 architectural decisions (like the division of the code into Prompt, Settings
2688 and MatchWindow classes).
2689 
2690 LustyExplorer is available from:
2691 
2692   http://www.vim.org/scripts/script.php?script_id=1890
2693 
2694 
2695 WEBSITE                                         *command-t-website*
2696 
2697 The official website for Command-T is:
2698 
2699   https://wincent.com/products/command-t
2700 
2701 The latest release will always be available from there.
2702 
2703 Development in progress can be inspected via the project's Git repository
2704 browser at:
2705 
2706   https://wincent.com/repos/command-t
2707 
2708 A copy of each release is also available from the official Vim scripts site
2709 at:
2710 
2711   http://www.vim.org/scripts/script.php?script_id=3025
2712 
2713 Bug reports should be submitted to the issue tracker at:
2714 
2715   https://wincent.com/issues
2716 
2717 
2718 DONATIONS                                       *command-t-donations*
2719 
2720 Command-T itself is free software released under the terms of the BSD license.
2721 If you would like to support further development you can make a donation via
2722 PayPal to win@wincent.com:
2723 
2724   https://wincent.com/products/command-t/donations
2725 
2726 
2727 LICENSE                                         *command-t-license*
2728 
2729 Copyright 2010-2011 Wincent Colaiuta. All rights reserved.
2730 
2731 Redistribution and use in source and binary forms, with or without
2732 modification, are permitted provided that the following conditions are met:
2733 
2734 1. Redistributions of source code must retain the above copyright notice,
2735    this list of conditions and the following disclaimer.
2736 2. Redistributions in binary form must reproduce the above copyright notice,
2737    this list of conditions and the following disclaimer in the documentation
2738    and/or other materials provided with the distribution.
2739 
2740 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
2741 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2742 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2743 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
2744 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2745 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2746 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2747 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2748 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2749 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2750 POSSIBILITY OF SUCH DAMAGE.
2751 
2752 
2753 HISTORY                                         *command-t-history*
2754 
2755 1.2.1 (30 April 2011)
2756 
2757 - Remove duplicate copy of the documentation that was causing "Duplicate tag"
2758   errors
2759 - Mitigate issue with distracting blinking cursor in non-GUI versions of Vim
2760   (patch from Steven Moazami)
2761 
2762 1.2 (30 April 2011)
2763 
2764 - added |g:CommandTMatchWindowReverse| option, to reverse the order of items
2765   in the match listing (patch from Steven Moazami)
2766 
2767 1.1b2 (26 March 2011)
2768 
2769 - fix a glitch in the release process; the plugin itself is unchanged since
2770   1.1b
2771 
2772 1.1b (26 March 2011)
2773 
2774 - add |:CommandTBuffer| command for quickly selecting among open buffers
2775 
2776 1.0.1 (5 January 2011)
2777 
2778 - work around bug when mapping |:CommandTFlush|, wherein the default mapping
2779   for |:CommandT| would not be set up
2780 - clean up when leaving the Command-T buffer via unexpected means (such as
2781   with  or similar)
2782 
2783 1.0 (26 November 2010)
2784 
2785 - make relative path simplification work on Windows
2786 
2787 1.0b (5 November 2010)
2788 
2789 - work around platform-specific Vim 7.3 bug seen by some users (wherein
2790   Vim always falsely reports to Ruby that the buffer numbers is 0)
2791 - re-use the buffer that is used to show the match listing, rather than
2792   throwing it away and recreating it each time Command-T is shown; this
2793   stops the buffer numbers from creeping up needlessly
2794 
2795 0.9 (8 October 2010)
2796 
2797 - use relative paths when opening files inside the current working directory
2798   in order to keep buffer listings as brief as possible (patch from Matthew
2799   Todd)
2800 
2801 0.8.1 (14 September 2010)
2802 
2803 - fix mapping issues for users who have set |'notimeout'| (patch from Sung
2804   Pae)
2805 
2806 0.8 (19 August 2010)
2807 
2808 - overrides for the default mappings can now be lists of strings, allowing
2809   multiple mappings to be defined for any given action
2810 - t mapping only set up if no other map for |:CommandT| exists
2811   (patch from Scott Bronson)
2812 - prevent folds from appearing in the match listing
2813 - tweaks to avoid the likelihood of "Not enough room" errors when trying to
2814   open files
2815 - watch out for "nil" windows when restoring window dimensions
2816 - optimizations (avoid some repeated downcasing)
2817 - move all Ruby files under the "command-t" subdirectory and avoid polluting
2818   the "Vim" module namespace
2819 
2820 0.8b (11 July 2010)
2821 
2822 - large overhaul of the scoring algorithm to make the ordering of returned
2823   results more intuitive; given the scope of the changes and room for
2824   optimization of the new algorithm, this release is labelled as "beta"
2825 
2826 0.7 (10 June 2010)
2827 
2828 - handle more |'wildignore'| patterns by delegating to Vim's own |expand()|
2829   function; with this change it is now viable to exclude patterns such as
2830   'vendor/rails/**' in addition to filename-only patterns like '*.o' and
2831   '.git' (patch from Mike Lundy)
2832 - always sort results alphabetically for empty search strings; this eliminates
2833   filesystem-specific variations (patch from Mike Lundy)
2834 
2835 0.6 (28 April 2010)
2836 
2837 - |:CommandT| now accepts an optional parameter to specify the starting
2838   directory, temporarily overriding the usual default of Vim's |:pwd|
2839 - fix truncated paths when operating from root directory
2840 
2841 0.5.1 (11 April 2010)
2842 
2843 - fix for Ruby 1.9 compatibility regression introduced in 0.5
2844 - documentation enhancements, specifically targetted at Windows users
2845 
2846 0.5 (3 April 2010)
2847 
2848 - |:CommandTFlush| now re-evaluates settings, allowing changes made via |let|
2849   to be picked up without having to restart Vim
2850 - fix premature abort when scanning very deep directory hierarchies
2851 - remove broken || key mapping on vt100 and xterm terminals
2852 - provide settings for overriding default mappings
2853 - minor performance optimization
2854 
2855 0.4 (27 March 2010)
2856 
2857 - add |g:CommandTMatchWindowAtTop| setting (patch from Zak Johnson)
2858 - documentation fixes and enhancements
2859 - internal refactoring and simplification
2860 
2861 0.3 (24 March 2010)
2862 
2863 - add |g:CommandTMaxHeight| setting for controlling the maximum height of the
2864   match window (patch from Lucas de Vries)
2865 - fix bug where |'list'| setting might be inappropriately set after dismissing
2866   Command-T
2867 - compatibility fix for different behaviour of "autoload" under Ruby 1.9.1
2868 - avoid "highlight group not found" warning when run under a version of Vim
2869   that does not have syntax highlighting support
2870 - open in split when opening normally would fail due to |'hidden'| and
2871   |'modified'| values
2872 
2873 0.2 (23 March 2010)
2874 
2875 - compatibility fixes for compilation under Ruby 1.9 series
2876 - compatibility fixes for compilation under Ruby 1.8.5
2877 - compatibility fixes for Windows and other non-UNIX platforms
2878 - suppress "mapping already exists" message if t mapping is already
2879   defined when plug-in is loaded
2880 - exclude paths based on |'wildignore'| setting rather than a hardcoded
2881   regular expression
2882 
2883 0.1 (22 March 2010)
2884 
2885 - initial public release
2886 
2887 ------------------------------------------------------------------------------
2888 vim:tw=78:ft=help:
2889 plugin/command-t.vim	[[[1
2890 164
2891 " command-t.vim
2892 " Copyright 2010-2011 Wincent Colaiuta. All rights reserved.
2893 "
2894 " Redistribution and use in source and binary forms, with or without
2895 " modification, are permitted provided that the following conditions are met:
2896 "
2897 " 1. Redistributions of source code must retain the above copyright notice,
2898 "    this list of conditions and the following disclaimer.
2899 " 2. Redistributions in binary form must reproduce the above copyright notice,
2900 "    this list of conditions and the following disclaimer in the documentation
2901 "    and/or other materials provided with the distribution.
2902 "
2903 " THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
2904 " AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2905 " IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2906 " ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
2907 " LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2908 " CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2909 " SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2910 " INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2911 " CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2912 " ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2913 " POSSIBILITY OF SUCH DAMAGE.
2914 
2915 if exists("g:command_t_loaded")
2916   finish
2917 endif
2918 let g:command_t_loaded = 1
2919 
2920 command CommandTBuffer call CommandTShowBufferFinder()
2921 command -nargs=? -complete=dir CommandT call CommandTShowFileFinder()
2922 command CommandTFlush call CommandTFlush()
2923 
2924 if !hasmapto(':CommandT')
2925   silent! nmap   t :CommandT
2926 endif
2927 
2928 if !hasmapto(':CommandTBuffer')
2929   silent! nmap   b :CommandTBuffer
2930 endif
2931 
2932 function s:CommandTRubyWarning()
2933   echohl WarningMsg
2934   echo "command-t.vim requires Vim to be compiled with Ruby support"
2935   echo "For more information type:  :help command-t"
2936   echohl none
2937 endfunction
2938 
2939 function s:CommandTShowBufferFinder()
2940   if has('ruby')
2941     ruby $command_t.show_buffer_finder
2942   else
2943     call s:CommandTRubyWarning()
2944   endif
2945 endfunction
2946 
2947 function s:CommandTShowFileFinder(arg)
2948   if has('ruby')
2949     ruby $command_t.show_file_finder
2950   else
2951     call s:CommandTRubyWarning()
2952   endif
2953 endfunction
2954 
2955 function s:CommandTFlush()
2956   if has('ruby')
2957     ruby $command_t.flush
2958   else
2959     call s:CommandTRubyWarning()
2960   endif
2961 endfunction
2962 
2963 if !has('ruby')
2964   finish
2965 endif
2966 
2967 function CommandTHandleKey(arg)
2968   ruby $command_t.handle_key
2969 endfunction
2970 
2971 function CommandTBackspace()
2972   ruby $command_t.backspace
2973 endfunction
2974 
2975 function CommandTDelete()
2976   ruby $command_t.delete
2977 endfunction
2978 
2979 function CommandTAcceptSelection()
2980   ruby $command_t.accept_selection
2981 endfunction
2982 
2983 function CommandTAcceptSelectionTab()
2984   ruby $command_t.accept_selection :command => 'tabe'
2985 endfunction
2986 
2987 function CommandTAcceptSelectionSplit()
2988   ruby $command_t.accept_selection :command => 'sp'
2989 endfunction
2990 
2991 function CommandTAcceptSelectionVSplit()
2992   ruby $command_t.accept_selection :command => 'vs'
2993 endfunction
2994 
2995 function CommandTToggleFocus()
2996   ruby $command_t.toggle_focus
2997 endfunction
2998 
2999 function CommandTCancel()
3000   ruby $command_t.cancel
3001 endfunction
3002 
3003 function CommandTSelectNext()
3004   ruby $command_t.select_next
3005 endfunction
3006 
3007 function CommandTSelectPrev()
3008   ruby $command_t.select_prev
3009 endfunction
3010 
3011 function CommandTClear()
3012   ruby $command_t.clear
3013 endfunction
3014 
3015 function CommandTCursorLeft()
3016   ruby $command_t.cursor_left
3017 endfunction
3018 
3019 function CommandTCursorRight()
3020   ruby $command_t.cursor_right
3021 endfunction
3022 
3023 function CommandTCursorEnd()
3024   ruby $command_t.cursor_end
3025 endfunction
3026 
3027 function CommandTCursorStart()
3028   ruby $command_t.cursor_start
3029 endfunction
3030 
3031 ruby << EOF
3032   # require Ruby files
3033   begin
3034     # prepare controller
3035     require 'command-t/vim'
3036     require 'command-t/controller'
3037     $command_t = CommandT::Controller.new
3038   rescue LoadError
3039     load_path_modified = false
3040     ::VIM::evaluate('&runtimepath').to_s.split(',').each do |path|
3041       lib = "#{path}/ruby"
3042       if !$LOAD_PATH.include?(lib) and File.exist?(lib)
3043         $LOAD_PATH << lib
3044         load_path_modified = true
3045       end
3046     end
3047     retry if load_path_modified
3048 
3049     # could get here if C extension was not compiled, or was compiled
3050     # for the wrong architecture or Ruby version
3051     require 'command-t/stub'
3052     $command_t = CommandT::Stub.new
3053   end
3054 EOF
Proxy Information
Original URL
gemini://r.bdr.sh/git/dotfiles/tree/7da00f6032b26afa3dcdee804933d4785ec48408/vim/tmp/command-t-1.2.1.vba
Status Code
Success (20)
Meta
text/gemini; charset=utf-8
Capsule Response Time
731.334097 milliseconds
Gemini-to-HTML Time
3.882948 milliseconds

This content has been proxied by September (ba2dc).