Skip to content

Commit

Permalink
Merge branch 'next'
Browse files Browse the repository at this point in the history
* next:
  Guard against overflow when peeking at PDU size
  Doc: update HISTORY section
  Establish new benchmark baseline
  Fix memoization
  Fix off-by-one error in last_idx management
  Fix egregious matching bug
  Add <ESC> key xterm info to FAQ
  Add casts to silence Clang warnings
  Fix compiler warnings on CentOS
  Update docs with info about autoload optimization
  Use vim's autoload feature
  Never overwrite other mappings
  Only move MRU results if appropriate
  Update docs with info about :CommandTMRU
  Teach MRU module to ignore unlisted buffers
  Work around missing matches_for method
  Split MRU functionality into separate command
  Drop an unnecessary `#compact` call
  Rename Mru -> MRU
  Make MruBufferScanner inherit from BufferScanner
  Make the MRU buffer stack an actual stack
  Make MruBufferFinder inherit from BufferFinder
  Improve diagnostic info in CommandT::Stub error message
  Add missing method to CommandT::Stub
  Fix some cosmetic typos
  Get rid of $scanner global variable
  doc: Add Ton van den Heuvel to AUTHORS section
  Add missing copyright headers
  Add support for MRU buffer ordering

Signed-off-by: Greg Hurrell <greg@hurrell.net>
  • Loading branch information
wincent committed May 25, 2014
2 parents 5621c4e + 7a86796 commit cfc2e44
Show file tree
Hide file tree
Showing 13 changed files with 529 additions and 216 deletions.
193 changes: 193 additions & 0 deletions autoload/commandt.vim
Original file line number Diff line number Diff line change
@@ -0,0 +1,193 @@
" Copyright 2010-2014 Wincent Colaiuta. All rights reserved.
"
" Redistribution and use in source and binary forms, with or without
" modification, are permitted provided that the following conditions are met:
"
" 1. Redistributions of source code must retain the above copyright notice,
" this list of conditions and the following disclaimer.
" 2. Redistributions in binary form must reproduce the above copyright notice,
" this list of conditions and the following disclaimer in the documentation
" and/or other materials provided with the distribution.
"
" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
" ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
" POSSIBILITY OF SUCH DAMAGE.

if exists("g:command_t_autoloaded") || &cp
finish
endif
let g:command_t_autoloaded = 1

function s:CommandTRubyWarning()
echohl WarningMsg
echo "command-t.vim requires Vim to be compiled with Ruby support"
echo "For more information type: :help command-t"
echohl none
endfunction

function commandt#CommandTShowBufferFinder()
if has('ruby')
ruby $command_t.show_buffer_finder
else
call s:CommandTRubyWarning()
endif
endfunction

function commandt#CommandTShowFileFinder(arg)
if has('ruby')
ruby $command_t.show_file_finder
else
call s:CommandTRubyWarning()
endif
endfunction

function commandt#CommandTShowJumpFinder()
if has('ruby')
ruby $command_t.show_jump_finder
else
call s:CommandTRubyWarning()
endif
endfunction

function commandt#CommandTShowMRUFinder()
if has('ruby')
ruby $command_t.show_mru_finder
else
call s:CommandTRubyWarning()
endif
endfunction

function commandt#CommandTShowTagFinder()
if has('ruby')
ruby $command_t.show_tag_finder
else
call s:CommandTRubyWarning()
endif
endfunction

function commandt#CommandTFlush()
if has('ruby')
ruby $command_t.flush
else
call s:CommandTRubyWarning()
endif
endfunction

if !has('ruby')
finish
endif

function CommandTListMatches()
ruby $command_t.list_matches
endfunction

function CommandTHandleKey(arg)
ruby $command_t.handle_key
endfunction

function CommandTBackspace()
ruby $command_t.backspace
endfunction

function CommandTDelete()
ruby $command_t.delete
endfunction

function CommandTAcceptSelection()
ruby $command_t.accept_selection
endfunction

function CommandTAcceptSelectionTab()
ruby $command_t.accept_selection :command => 'tabe'
endfunction

function CommandTAcceptSelectionSplit()
ruby $command_t.accept_selection :command => 'sp'
endfunction

function CommandTAcceptSelectionVSplit()
ruby $command_t.accept_selection :command => 'vs'
endfunction

function CommandTQuickfix()
ruby $command_t.quickfix
endfunction

function CommandTRefresh()
ruby $command_t.refresh
endfunction

function CommandTToggleFocus()
ruby $command_t.toggle_focus
endfunction

function CommandTCancel()
ruby $command_t.cancel
endfunction

function CommandTSelectNext()
ruby $command_t.select_next
endfunction

function CommandTSelectPrev()
ruby $command_t.select_prev
endfunction

function CommandTClear()
ruby $command_t.clear
endfunction

function CommandTCursorLeft()
ruby $command_t.cursor_left
endfunction

function CommandTCursorRight()
ruby $command_t.cursor_right
endfunction

function CommandTCursorEnd()
ruby $command_t.cursor_end
endfunction

function CommandTCursorStart()
ruby $command_t.cursor_start
endfunction

" note that we only start tracking buffers from first (autoloaded) use of Command-T
augroup CommandTMRUBuffer
autocmd BufEnter * ruby CommandT::MRU.touch
autocmd BufDelete * ruby CommandT::MRU.delete
augroup END

ruby << EOF
# require Ruby files
begin
require 'command-t/vim'
require 'command-t/controller'
require 'command-t/mru'
$command_t = CommandT::Controller.new
rescue LoadError
load_path_modified = false
::VIM::evaluate('&runtimepath').to_s.split(',').each do |path|
lib = "#{path}/ruby"
if !$LOAD_PATH.include?(lib) and File.exist?(lib)
$LOAD_PATH << lib
load_path_modified = true
end
end
retry if load_path_modified

# could get here if C extension was not compiled, or was compiled
# for the wrong architecture or Ruby version
require 'command-t/stub'
$command_t = CommandT::Stub.new
end
EOF
19 changes: 17 additions & 2 deletions data/benchmark.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,24 @@
---
tests:
- name: pathological
times: 20
times: 200
paths:
- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
- aaaaaaaaaaaa
- aaaaaaaaaaaaaa
- aaaaaaaaaaaaaaaa
- aaaaaaaaaaaaaaaaaa
- aaaaaaaaaaaaaaaaaaaa
- aaaaaaaaaaaaaaaaaaaaaa
- aaaaaaaaaaaaaaaaaaaaaaaa
- aaaaaaaaaaaaaaaaaaaaaaaaaa
- aaaaaaaaaaaaaaaaaaaaaaaaaaaa
- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
queries:
- a
- aaa
Expand Down
66 changes: 52 additions & 14 deletions doc/command-t.txt
Original file line number Diff line number Diff line change
Expand Up @@ -369,32 +369,44 @@ paths which begin with the same prefix.
COMMANDS *command-t-commands*

*:CommandT*
|:CommandT| Brings up the Command-T file window, starting in the
|:CommandT| Brings up the Command-T file window, starting in the
current working directory as returned by the|:pwd|
command.

*:CommandTBuffer*
|:CommandTBuffer|Brings up the Command-T buffer window.
|:CommandTBuffer| Brings up the Command-T buffer window.
This works exactly like the standard file window,
except that the selection is limited to files that
you already have open in buffers.

*:CommandTMRU*
|:CommandTMRU| Brings up the Command-T buffer window, except that matches
are shown in MRU (most recently used) order. If you prefer to
use this over the normal buffer finder, I suggest overwriting
the standard mapping with a command like:

:nnoremap <silent> <leader>b :CommandTMRU<CR>

Note that Command-T only starts recording most recently used
buffers when you first use a Command-T command or mapping;
this is an optimization to improve startup time.

*:CommandTJumps*
|:CommandTJump| Brings up the Command-T jumplist window.
|:CommandTJump| Brings up the Command-T jumplist window.
This works exactly like the standard file window,
except that the selection is limited to files that
you already have in the jumplist. Note that jumps
can persist across Vim sessions (see Vim's |jumplist|
documentation for more info).

*:CommandTTag*
|:CommandTTag| Brings up the Command-T window tags window, which can
|:CommandTTag| Brings up the Command-T window tags window, which can
be used to select from the tags, if any, returned by
Vim's |taglist()| function. See Vim's |tag| documentation
for general info on tags.

*:CommandTFlush*
|:CommandTFlush|Instructs the plug-in to flush its path cache, causing
|:CommandTFlush| Instructs the plug-in to flush its path cache, causing
the directory to be rescanned for new or deleted paths
the next time the file window is shown (pressing <C-f> when
a match listing is visible flushes the cache immediately; this
Expand Down Expand Up @@ -742,6 +754,19 @@ To disable flow control, add the following to your `.zshrc` or

See the `stty` man page for more details.

Why doesn't the Escape key close the match listing in terminal Vim? ~

In some terminals such as xterm the Escape key misbehaves, so Command-T
doesn't set up a mapping for it. If you want to try using the escape key
anyway, you can add something like the following to your ~/.vimrc file:

if &term =~ "xterm" || &term =~ "screen"
let g:CommandTCancelMap = ['<ESC>', '<C-c>']
endif

This configuration has worked for me with recent versions of Vim on multiple
platforms (OS X, CentOS etc).


TIPS *command-t-tips*

Expand Down Expand Up @@ -863,17 +888,18 @@ Command-T is written and maintained by Wincent Colaiuta <win@wincent.com>.
Other contributors that have submitted patches include (in alphabetical
order):

Andy Waite Mike Lundy Shlomi Fish
Anthony Panozzo Nadav Samet Steven Moazami
Daniel Hahler Nate Kane Sung Pae
Felix Tjandrawibawa Nicholas Alpi Thomas Pelletier
Gary Bernhardt Noon Silk Victor Hugo Borja
Ivan Ukhov Paul Jolly Vít Ondruch
Jeff Kreeftmeijer Pavel Sergeev Woody Peterson
Lucas de Vries Rainux Luo Yan Pritzker
Marcus Brito Roland Puntaier Yiding Jia
Andy Waite Nadav Samet Steven Moazami
Anthony Panozzo Nate Kane Sung Pae
Daniel Hahler Nicholas Alpi Thomas Pelletier
Felix Tjandrawibawa Noon Silk Ton van den Heuvel
Gary Bernhardt Paul Jolly Victor Hugo Borja
Ivan Ukhov Pavel Sergeev Vít Ondruch
Jeff Kreeftmeijer Rainux Luo Woody Peterson
Lucas de Vries Roland Puntaier Yan Pritzker
Marcus Brito Ross Lagerwall Yiding Jia
Marian Schubert Scott Bronson Zak Johnson
Matthew Todd Seth Fowler
Mike Lundy Shlomi Fish

As this was the first Vim plug-in I had ever written I was heavily influenced
by the design of the LustyExplorer plug-in by Stephen Bach, which I understand
Expand Down Expand Up @@ -976,6 +1002,18 @@ POSSIBILITY OF SUCH DAMAGE.

HISTORY *command-t-history*

1.9 (not yet released)

- improved startup time using Vim's autload mechanism (patch from Ross
Lagerwall)
- added MRU (most-recently-used) buffer finder (patch from Ton van den Heuvel)
- fixed edge case in matching algorithm which could cause spurious matches
with queries containing repeated characters
- fixed slight positive bias in the match scoring algorithm's weighting of
matching characters based on distance from last match
- tune memoization in match scoring algorithm, yield a more than 10% speed
boost

1.8 (31 March 2014)

- taught Watchman file scanner to use the binary protocol instead of JSON,
Expand Down
Loading

0 comments on commit cfc2e44

Please sign in to comment.