@ -1,736 +0,0 @@ | |||
*command-t.txt* Command-T plug-in for Vim *command-t* | |||
CONTENTS *command-t-contents* | |||
1. Introduction |command-t-intro| | |||
2. Requirements |command-t-requirements| | |||
3. Installation |command-t-installation| | |||
3. Managing using Pathogen |command-t-pathogen| | |||
4. Trouble-shooting |command-t-trouble-shooting| | |||
5. Usage |command-t-usage| | |||
6. Commands |command-t-commands| | |||
7. Mappings |command-t-mappings| | |||
8. Options |command-t-options| | |||
9. Authors |command-t-authors| | |||
10. Website |command-t-website| | |||
11. Donations |command-t-donations| | |||
12. License |command-t-license| | |||
13. History |command-t-history| | |||
INTRODUCTION *command-t-intro* | |||
The Command-T plug-in provides an extremely fast, intuitive mechanism for | |||
opening files with a minimal number of keystrokes. It's named "Command-T" | |||
because it is inspired by the "Go to File" window bound to Command-T in | |||
TextMate. | |||
Files are selected by typing characters that appear in their paths, and are | |||
ordered by an algorithm which knows that characters that appear in certain | |||
locations (for example, immediately after a path separator) should be given | |||
more weight. | |||
To search efficiently, especially in large projects, you should adopt a | |||
"path-centric" rather than a "filename-centric" mentality. That is you should | |||
think more about where the desired file is found rather than what it is | |||
called. This means narrowing your search down by including some characters | |||
from the upper path components rather than just entering characters from the | |||
filename itself. | |||
Screencasts demonstrating the plug-in can be viewed at: | |||
https://wincent.com/products/command-t | |||
REQUIREMENTS *command-t-requirements* | |||
The plug-in requires Vim compiled with Ruby support, a compatible Ruby | |||
installation at the operating system level, and a C compiler to build | |||
the Ruby extension. | |||
1. Vim compiled with Ruby support | |||
You can check for Ruby support by launching Vim with the --version switch: | |||
vim --version | |||
If "+ruby" appears in the version information then your version of Vim has | |||
Ruby support. | |||
Another way to check is to simply try using the :ruby command from within Vim | |||
itself: | |||
:ruby 1 | |||
If your Vim lacks support you'll see an error message like this: | |||
E319: Sorry, the command is not available in this version | |||
The version of Vim distributed with Mac OS X does not include Ruby support, | |||
while MacVim does; it is available from: | |||
http://github.com/b4winckler/macvim/downloads | |||
For Windows users, the Vim 7.2 executable available from www.vim.org does | |||
include Ruby support, and is recommended over version 7.3 (which links against | |||
Ruby 1.9, but apparently has some bugs that need to be resolved). | |||
2. Ruby | |||
In addition to having Ruby support in Vim, your system itself must have a | |||
compatible Ruby install. "Compatible" means the same version as Vim itself | |||
links against. If you use a different version then Command-T is unlikely | |||
to work (see TROUBLE-SHOOTING below). | |||
On Mac OS X Snow Leopard, the system comes with Ruby 1.8.7 and all recent | |||
versions of MacVim (the 7.2 snapshots and 7.3) are linked against it. | |||
On Linux and similar platforms, the linked version of Ruby will depend on | |||
your distribution. You can usually find this out by examining the | |||
compilation and linking flags displayed by the |:version| command in Vim, and | |||
by looking at the output of: | |||
:ruby puts RUBY_VERSION | |||
A suitable Ruby environment for Windows can be installed using the Ruby | |||
1.8.7-p299 RubyInstaller available at: | |||
http://rubyinstaller.org/downloads/archives | |||
If using RubyInstaller be sure to download the installer executable, not the | |||
7-zip archive. When installing mark the checkbox "Add Ruby executables to your | |||
PATH" so that Vim can find them. | |||
3. C compiler | |||
Part of Command-T is implemented in C as a Ruby extension for speed, allowing | |||
it to work responsively even on directory hierarchies containing enormous | |||
numbers of files. As such, a C compiler is required in order to build the | |||
extension and complete the installation. | |||
On Mac OS X, this can be obtained by installing the Xcode Tools that come on | |||
the Mac OS X install disc. | |||
On Windows, the RubyInstaller Development Kit can be used to conveniently | |||
install the necessary tool chain: | |||
http://rubyinstaller.org/downloads/archives | |||
At the time of writing, the appropriate development kit for use with Ruby | |||
1.8.7 is DevKit-3.4.5r3-20091110. | |||
To use the Development Kit extract the archive contents to your C:\Ruby | |||
folder. | |||
INSTALLATION *command-t-installation* | |||
Command-T is distributed as a "vimball" which means that it can be installed | |||
by opening it in Vim and then sourcing it: | |||
:e command-t.vba | |||
:so % | |||
The files will be installed in your |'runtimepath'|. To check where this is | |||
you can issue: | |||
:echo &rtp | |||
The C extension must then be built, which can be done from the shell. If you | |||
use a typical |'runtimepath'| then the files were installed inside ~/.vim and | |||
you can build the extension with: | |||
cd ~/.vim/ruby/command-t | |||
ruby extconf.rb | |||
make | |||
Note: If you are an RVM user, you must perform the build using the same | |||
version of Ruby that Vim itself is linked against. This will often be the | |||
system Ruby, which can be selected before issuing the "make" command with: | |||
rvm use system | |||
MANAGING USING PATHOGEN *command-t-pathogen* | |||
Pathogen is a plugin that allows you to maintain plugin installations in | |||
separate, isolated subdirectories under the "bundle" directory in your | |||
|'runtimepath'|. The following examples assume that you already have | |||
Pathogen installed and configured, and that you are installing into | |||
~/.vim/bundle. For more information about Pathogen, see: | |||
http://www.vim.org/scripts/script.php?script_id=2332 | |||
If you manage your entire ~/.vim folder using Git then you can add the | |||
Command-T repository as a submodule: | |||
cd ~/.vim | |||
git submodule add git://git.wincent.com/command-t.git bundle/command-t | |||
git submodule init | |||
Or if you just wish to do a simple clone instead of using submodules: | |||
cd ~/.vim | |||
git clone git://git.wincent.com/command-t.git bundle/command-t | |||
Once you have a local copy of the repository you can update it at any time | |||
with: | |||
cd ~/.vim/bundle/command-t | |||
git pull | |||
Or you can switch to a specific release with: | |||
cd ~/.vim/bundle/command-t | |||
git checkout 0.8b | |||
After installing or updating you must build the extension: | |||
cd ~/.vim/bundle/command-t | |||
rake make | |||
While the Vimball installation automatically generates the help tags, under | |||
Pathogen it is necessary to do so explicitly from inside Vim: | |||
:call pathogen#helptags() | |||
TROUBLE-SHOOTING *command-t-trouble-shooting* | |||
Most installation problems are caused by a mismatch between the version of | |||
Ruby on the host operating system, and the version of Ruby that Vim itself | |||
linked against at compile time. For example, if one is 32-bit and the other is | |||
64-bit, or one is from the Ruby 1.9 series and the other is from the 1.8 | |||
series, then the plug-in is not likely to work. | |||
As such, on Mac OS X, I recommend using the standard Ruby that comes with the | |||
system (currently 1.8.7) along with the latest version of MacVim (currently | |||
version 7.3). If you wish to use custom builds of Ruby or of MacVim (not | |||
recommmended) then you will have to take extra care to ensure that the exact | |||
same Ruby environment is in effect when building Ruby, Vim and the Command-T | |||
extension. | |||
For Windows, the following combination is known to work: | |||
- Vim 7.2 from http://www.vim.org/download.php: | |||
ftp://ftp.vim.org/pub/vim/pc/gvim72.exe | |||
- Ruby 1.8.7-p299 from http://rubyinstaller.org/downloads/archives: | |||
http://rubyforge.org/frs/download.php/71492/rubyinstaller-1.8.7-p299.exe | |||
- DevKit 3.4.5r3-20091110 from http://rubyinstaller.org/downloads/archives: | |||
http://rubyforge.org/frs/download.php/66888/devkit-3.4.5r3-20091110.7z | |||
If a problem occurs the first thing you should do is inspect the output of: | |||
ruby extconf.rb | |||
make | |||
During the installation, and: | |||
vim --version | |||
And compare the compilation and linker flags that were passed to the | |||
extension and to Vim itself when they were built. If the Ruby-related | |||
flags or architecture flags are different then it is likely that something | |||
has changed in your Ruby environment and the extension may not work until | |||
you eliminate the discrepancy. | |||
USAGE *command-t-usage* | |||
Bring up the Command-T match window by typing: | |||
<Leader>t | |||
This mapping is set up automatically for you, provided you do not already have | |||
a mapping for <Leader>t or |:CommandT|. You can also bring up the match window | |||
by issuing the command: | |||
:CommandT | |||
A prompt will appear at the bottom of the screen along with a match window | |||
showing all of the files in the current directory (as returned by the | |||
|:pwd| command). | |||
For the most efficient file navigation within a project it's recommended that | |||
you |:cd| into the root directory of your project when starting to work on it. | |||
If you wish to open a file from outside of the project folder you can pass in | |||
an optional path argument (relative or absolute) to |:CommandT|: | |||
:CommandT ../path/to/other/files | |||
Type letters in the prompt to narrow down the selection, showing only the | |||
files whose paths contain those letters in the specified order. Letters do not | |||
need to appear consecutively in a path in order for it to be classified as a | |||
match. | |||
Once the desired file has been selected it can be opened by pressing <CR>. | |||
(By default files are opened in the current window, but there are other | |||
mappings that you can use to open in a vertical or horizontal split, or in | |||
a new tab.) Note that if you have |'nohidden'| set and there are unsaved | |||
changes in the current window when you press <CR> then opening in the current | |||
window would fail; in this case Command-T will open the file in a new split. | |||
The following mappings are active when the prompt has focus: | |||
<BS> delete the character to the left of the cursor | |||
<Del> delete the character at the cursor | |||
<Left> move the cursor one character to the left | |||
<C-h> move the cursor one character to the left | |||
<Right> move the cursor one character to the right | |||
<C-l> move the cursor one character to the right | |||
<C-a> move the cursor to the start (left) | |||
<C-e> move the cursor to the end (right) | |||
<C-u> clear the contents of the prompt | |||
<Tab> change focus to the match listing | |||
The following mappings are active when the match listing has focus: | |||
<Tab> change focus to the prompt | |||
The following mappings are active when either the prompt or the match listing | |||
has focus: | |||
<CR> open the selected file | |||
<C-CR> open the selected file in a new split window | |||
<C-s> open the selected file in a new split window | |||
<C-v> open the selected file in a new vertical split window | |||
<C-t> open the selected file in a new tab | |||
<C-j> select next file in the match listing | |||
<C-n> select next file in the match listing | |||
<Down> select next file in the match listing | |||
<C-k> select previous file in the match listing | |||
<C-p> select previous file in the match listing | |||
<Up> select previous file in the match listing | |||
<C-c> cancel (dismisses match listing) | |||
The following is also available on terminals which support it: | |||
<Esc> cancel (dismisses match listing) | |||
Note that the default mappings can be overriden by setting options in your | |||
~/.vimrc file (see the OPTIONS section for a full list of available options). | |||
In addition, when the match listing has focus, typing a character will cause | |||
the selection to jump to the first path which begins with that character. | |||
Typing multiple characters consecutively can be used to distinguish between | |||
paths which begin with the same prefix. | |||
COMMANDS *command-t-commands* | |||
*:CommandT* | |||
|:CommandT| Brings up the Command-T match window, starting in the | |||
current working directory as returned by the|:pwd| | |||
command. | |||
*:CommandTFlush* | |||
|: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 match window is shown. In addition, all | |||
configuration settings are re-evaluated, causing any | |||
changes made to settings via the |:let| command to be picked | |||
up. | |||
MAPPINGS *command-t-mappings* | |||
By default Command-T comes with only one mapping: | |||
<Leader>t bring up the Command-T match window | |||
However, Command-T won't overwrite a pre-existing mapping so if you prefer | |||
to define a different mapping use a line like this in your ~/.vimrc: | |||
nmap <silent> <Leader>t :CommandT<CR> | |||
Replacing "<Leader>t" with your mapping of choice. | |||
Note that in the case of MacVim you actually can map to Command-T (written | |||
as <D-t> in Vim) in your ~/.gvimrc file if you first unmap the existing menu | |||
binding of Command-T to "New Tab": | |||
if has("gui_macvim") | |||
macmenu &File.New\ Tab key=<nop> | |||
map <D-t> :CommandT<CR> | |||
endif | |||
When the Command-T window is active a number of other additional mappings | |||
become available for doing things like moving between and selecting matches. | |||
These are fully described above in the USAGE section, and settings for | |||
overriding the mappings are listed below under OPTIONS. | |||
OPTIONS *command-t-options* | |||
A number of options may be set in your ~/.vimrc to influence the behaviour of | |||
the plug-in. To set an option, you include a line like this in your ~/.vimrc: | |||
let g:CommandTMaxFiles=20000 | |||
To have Command-T pick up new settings immediately (that is, without having | |||
to restart Vim) you can issue the |:CommandTFlush| command after making | |||
changes via |:let|. | |||
Following is a list of all available options: | |||
*g:CommandTMaxFiles* | |||
|g:CommandTMaxFiles| number (default 10000) | |||
The maximum number of files that will be considered when scanning the | |||
current directory. Upon reaching this number scanning stops. | |||
*g:CommandTMaxDepth* | |||
|g:CommandTMaxDepth| number (default 15) | |||
The maximum depth (levels of recursion) to be explored when scanning the | |||
current directory. Any directories at levels beyond this depth will be | |||
skipped. | |||
*g:CommandTMaxHeight* | |||
|g:CommandTMaxHeight| number (default: 0) | |||
The maximum height in lines the match window is allowed to expand to. | |||
If set to 0, the window will occupy as much of the available space as | |||
needed to show matching entries. | |||
*g:CommandTAlwaysShowDotFiles* | |||
|g:CommandTAlwaysShowDotFiles| boolean (default: 0) | |||
By default Command-T will show dot-files only if the entered search | |||
string contains a dot that could cause a dot-file to match. When set to | |||
a non-zero value, this setting instructs Command-T to always include | |||
matching dot-files in the match list regardless of whether the search | |||
string contains a dot. See also |g:CommandTNeverShowDotFiles|. | |||
*g:CommandTNeverShowDotFiles* | |||
|g:CommandTNeverShowDotFiles| boolean (default: 0) | |||
By default Command-T will show dot-files if the entered search string | |||
contains a dot that could cause a dot-file to match. When set to a | |||
non-zero value, this setting instructs Command-T to never show dot-files | |||
under any circumstances. Note that it is contradictory to set both this | |||
setting and |g:CommandTAlwaysShowDotFiles| to true, and if you do so Vim | |||
will suffer from headaches, nervous twitches, and sudden mood swings. | |||
*g:CommandTScanDotDirectories* | |||
|g:CommandTScanDotDirectories| boolean (default: 0) | |||
Normally Command-T will not recurse into "dot-directories" (directories | |||
whose names begin with a dot) while performing its initial scan. Set | |||
this setting to a non-zero value to override this behavior and recurse. | |||
Note that this setting is completely independent of the | |||
|g:CommandTAlwaysShowDotFiles| and |g:CommandTNeverShowDotFiles| | |||
settings; those apply only to the selection and display of matches | |||
(after scanning has been performed), whereas | |||
|g:CommandTScanDotDirectories| affects the behaviour at scan-time. | |||
Note also that even with this setting on you can still use Command-T to | |||
open files inside a "dot-directory" such as ~/.vim, but you have to use | |||
the |:cd| command to change into that directory first. For example: | |||
:cd ~/.vim | |||
:CommandT | |||
*g:CommandTMatchWindowAtTop* | |||
|g:CommandTMatchWindowAtTop| boolean (default: 0) | |||
When this settings is off (the default) the match window will appear at | |||
the bottom so as to keep it near to the prompt. Turning it on causes the | |||
match window to appear at the top instead. This may be preferable if you | |||
want the best match (usually the first one) to appear in a fixed location | |||
on the screen rather than moving as the number of matches changes during | |||
typing. | |||
As well as the basic options listed above, there are a number of settings that | |||
can be used to override the default key mappings used by Command-T. For | |||
example, to set <C-x> as the mapping for cancelling (dismissing) the Command-T | |||
window, you would add the following to your ~/.vimrc: | |||
let g:CommandTCancelMap='<C-x>' | |||
Multiple, alternative mappings may be specified using list syntax: | |||
let g:CommandTCancelMap=['<C-x>', '<C-c>'] | |||
Following is a list of all map settings and their defaults: | |||
Setting Default mapping(s) | |||
*g:CommandTBackspaceMap* | |||
|g:CommandTBackspaceMap| <BS> | |||
*g:CommandTDeleteMap* | |||
|g:CommandTDeleteMap| <Del> | |||
*g:CommandTAcceptSelectionMap* | |||
|g:CommandTAcceptSelectionMap| <CR> | |||
*g:CommandTAcceptSelectionSplitMap* | |||
|g:CommandTAcceptSelectionSplitMap| <C-CR> | |||
<C-s> | |||
*g:CommandTAcceptSelectionTabMap* | |||
|g:CommandTAcceptSelectionTabMap| <C-t> | |||
*g:CommandTAcceptSelectionVSplitMap* | |||
|g:CommandTAcceptSelectionVSplitMap| <C-v> | |||
*g:CommandTToggleFocusMap* | |||
|g:CommandTToggleFocusMap| <Tab> | |||
*g:CommandTCancelMap* | |||
|g:CommandTCancelMap| <C-c> | |||
<Esc> (not on all terminals) | |||
*g:CommandTSelectNextMap* | |||
|g:CommandTSelectNextMap| <C-n> | |||
<C-j> | |||
<Down> | |||
*g:CommandTSelectPrevMap* | |||
|g:CommandTSelectPrevMap| <C-p> | |||
<C-k> | |||
<Up> | |||
*g:CommandTClearMap* | |||
|g:CommandTClearMap| <C-u> | |||
*g:CommandTCursorLeftMap* | |||
|g:CommandTCursorLeftMap| <Left> | |||
<C-h> | |||
*g:CommandTCursorRightMap* | |||
|g:CommandTCursorRightMap| <Right> | |||
<C-l> | |||
*g:CommandTCursorEndMap* | |||
|g:CommandTCursorEndMap| <C-e> | |||
*g:CommandTCursorStartMap* | |||
|g:CommandTCursorStartMap| <C-a> | |||
In addition to the options provided by Command-T itself, some of Vim's own | |||
settings can be used to control behavior: | |||
*command-t-wildignore* | |||
|'wildignore'| string (default: '') | |||
Vim's |'wildignore'| setting is used to determine which files should be | |||
excluded from listings. This is a comma-separated list of glob patterns. | |||
It defaults to the empty string, but common settings include "*.o,*.obj" | |||
(to exclude object files) or ".git,.svn" (to exclude SCM metadata | |||
directories). For example: | |||
:set wildignore+=*.o,*.obj,.git | |||
A pattern such as "vendor/rails/**" would exclude all files and | |||
subdirectories inside the "vendor/rails" directory (relative to | |||
directory Command-T starts in). | |||
See the |'wildignore'| documentation for more information. | |||
AUTHORS *command-t-authors* | |||
Command-T is written and maintained by Wincent Colaiuta <win@wincent.com>. | |||
Other contributors that have submitted patches include (in alphabetical | |||
order): | |||
Lucas de Vries | |||
Matthew Todd | |||
Mike Lundy | |||
Scott Bronson | |||
Sung Pae | |||
Zak Johnson | |||
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 | |||
is one of the largest Ruby-based Vim plug-ins to date. | |||
While the Command-T codebase doesn't contain any code directly copied from | |||
LustyExplorer, I did use it as a reference for answers to basic questions (like | |||
"How do you do 'X' in a Ruby-based Vim plug-in?"), and also copied some basic | |||
architectural decisions (like the division of the code into Prompt, Settings | |||
and MatchWindow classes). | |||
LustyExplorer is available from: | |||
http://www.vim.org/scripts/script.php?script_id=1890 | |||
WEBSITE *command-t-website* | |||
The official website for Command-T is: | |||
https://wincent.com/products/command-t | |||
The latest release will always be available from there. | |||
Development in progress can be inspected via the project's Git repository | |||
browser at: | |||
https://wincent.com/repos/command-t | |||
A copy of each release is also available from the official Vim scripts site | |||
at: | |||
http://www.vim.org/scripts/script.php?script_id=3025 | |||
Bug reports should be submitted to the issue tracker at: | |||
https://wincent.com/issues | |||
DONATIONS *command-t-donations* | |||
Command-T itself is free software released under the terms of the BSD license. | |||
If you would like to support further development you can make a donation via | |||
PayPal to win@wincent.com: | |||
https://wincent.com/products/command-t/donations | |||
LICENSE *command-t-license* | |||
Copyright 2010-2011 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. | |||
HISTORY *command-t-history* | |||
1.0.1 (5 January 2011) | |||
- work around bug when mapping |:CommandTFlush|, wherein the default mapping | |||
for |:CommandT| would not be set up | |||
- clean up when leaving the Command-T buffer via unexpected means (such as | |||
with <C-W k> or similar) | |||
1.0 (26 November 2010) | |||
- make relative path simplification work on Windows | |||
1.0b (5 November 2010) | |||
- work around platform-specific Vim 7.3 bug seen by some users (wherein | |||
Vim always falsely reports to Ruby that the buffer numbers is 0) | |||
- re-use the buffer that is used to show the match listing, rather than | |||
throwing it away and recreating it each time Command-T is shown; this | |||
stops the buffer numbers from creeping up needlessly | |||
0.9 (8 October 2010) | |||
- use relative paths when opening files inside the current working directory | |||
in order to keep buffer listings as brief as possible (patch from Matthew | |||
Todd) | |||
0.8.1 (14 September 2010) | |||
- fix mapping issues for users who have set |'notimeout'| (patch from Sung | |||
Pae) | |||
0.8 (19 August 2010) | |||
- overrides for the default mappings can now be lists of strings, allowing | |||
multiple mappings to be defined for any given action | |||
- <Leader>t mapping only set up if no other map for |:CommandT| exists | |||
(patch from Scott Bronson) | |||
- prevent folds from appearing in the match listing | |||
- tweaks to avoid the likelihood of "Not enough room" errors when trying to | |||
open files | |||
- watch out for "nil" windows when restoring window dimensions | |||
- optimizations (avoid some repeated downcasing) | |||
- move all Ruby files under the "command-t" subdirectory and avoid polluting | |||
the "Vim" module namespace | |||
0.8b (11 July 2010) | |||
- large overhaul of the scoring algorithm to make the ordering of returned | |||
results more intuitive; given the scope of the changes and room for | |||
optimization of the new algorithm, this release is labelled as "beta" | |||
0.7 (10 June 2010) | |||
- handle more |'wildignore'| patterns by delegating to Vim's own |expand()| | |||
function; with this change it is now viable to exclude patterns such as | |||
'vendor/rails/**' in addition to filename-only patterns like '*.o' and | |||
'.git' (patch from Mike Lundy) | |||
- always sort results alphabetically for empty search strings; this eliminates | |||
filesystem-specific variations (patch from Mike Lundy) | |||
0.6 (28 April 2010) | |||
- |:CommandT| now accepts an optional parameter to specify the starting | |||
directory, temporarily overriding the usual default of Vim's |:pwd| | |||
- fix truncated paths when operating from root directory | |||
0.5.1 (11 April 2010) | |||
- fix for Ruby 1.9 compatibility regression introduced in 0.5 | |||
- documentation enhancements, specifically targetted at Windows users | |||
0.5 (3 April 2010) | |||
- |:CommandTFlush| now re-evaluates settings, allowing changes made via |let| | |||
to be picked up without having to restart Vim | |||
- fix premature abort when scanning very deep directory hierarchies | |||
- remove broken |<Esc>| key mapping on vt100 and xterm terminals | |||
- provide settings for overriding default mappings | |||
- minor performance optimization | |||
0.4 (27 March 2010) | |||
- add |g:CommandTMatchWindowAtTop| setting (patch from Zak Johnson) | |||
- documentation fixes and enhancements | |||
- internal refactoring and simplification | |||
0.3 (24 March 2010) | |||
- add |g:CommandTMaxHeight| setting for controlling the maximum height of the | |||
match window (patch from Lucas de Vries) | |||
- fix bug where |'list'| setting might be inappropriately set after dismissing | |||
Command-T | |||
- compatibility fix for different behaviour of "autoload" under Ruby 1.9.1 | |||
- avoid "highlight group not found" warning when run under a version of Vim | |||
that does not have syntax highlighting support | |||
- open in split when opening normally would fail due to |'hidden'| and | |||
|'modified'| values | |||
0.2 (23 March 2010) | |||
- compatibility fixes for compilation under Ruby 1.9 series | |||
- compatibility fixes for compilation under Ruby 1.8.5 | |||
- compatibility fixes for Windows and other non-UNIX platforms | |||
- suppress "mapping already exists" message if <Leader>t mapping is already | |||
defined when plug-in is loaded | |||
- exclude paths based on |'wildignore'| setting rather than a hardcoded | |||
regular expression | |||
0.1 (22 March 2010) | |||
- initial public release | |||
------------------------------------------------------------------------------ | |||
vim:tw=78:ft=help: |
@ -1,151 +0,0 @@ | |||
" command-t.vim | |||
" Copyright 2010 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_loaded") | |||
finish | |||
endif | |||
let g:command_t_loaded = 1 | |||
command -nargs=? -complete=dir CommandT call <SID>CommandTShow(<q-args>) | |||
command CommandTFlush call <SID>CommandTFlush() | |||
if !hasmapto(':CommandT<CR>') | |||
silent! nmap <unique> <silent> <Leader>t :CommandT<CR> | |||
endif | |||
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 s:CommandTShow(arg) | |||
if has('ruby') | |||
ruby $command_t.show | |||
else | |||
call s:CommandTRubyWarning() | |||
endif | |||
endfunction | |||
function s:CommandTFlush() | |||
if has('ruby') | |||
ruby $command_t.flush | |||
else | |||
call s:CommandTRubyWarning() | |||
endif | |||
endfunction | |||
if !has('ruby') | |||
finish | |||
endif | |||
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 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 | |||
ruby << EOF | |||
# require Ruby files | |||
begin | |||
# prepare controller | |||
require 'command-t/vim' | |||
require 'command-t/controller' | |||
$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 |
@ -1,181 +0,0 @@ | |||
SHELL = /bin/sh | |||
#### Start of system configuration section. #### | |||
srcdir = . | |||
topdir = /Users/Sebastian/.rvm/rubies/ruby-1.8.7-p249/lib/ruby/1.8/i686-darwin10.2.0 | |||
hdrdir = $(topdir) | |||
VPATH = $(srcdir):$(topdir):$(hdrdir) | |||
exec_prefix = $(prefix) | |||
prefix = $(DESTDIR)/Users/Sebastian/.rvm/rubies/ruby-1.8.7-p249 | |||
sharedstatedir = $(prefix)/com | |||
mandir = $(datarootdir)/man | |||
psdir = $(docdir) | |||
oldincludedir = $(DESTDIR)/usr/include | |||
localedir = $(datarootdir)/locale | |||
bindir = $(exec_prefix)/bin | |||
libexecdir = $(exec_prefix)/libexec | |||
sitedir = $(libdir)/ruby/site_ruby | |||
htmldir = $(docdir) | |||
vendorarchdir = $(vendorlibdir)/$(sitearch) | |||
includedir = $(prefix)/include | |||
infodir = $(datarootdir)/info | |||
vendorlibdir = $(vendordir)/$(ruby_version) | |||
sysconfdir = $(prefix)/etc | |||
libdir = $(exec_prefix)/lib | |||
sbindir = $(exec_prefix)/sbin | |||
rubylibdir = $(libdir)/ruby/$(ruby_version) | |||
docdir = $(datarootdir)/doc/$(PACKAGE) | |||
dvidir = $(docdir) | |||
vendordir = $(libdir)/ruby/vendor_ruby | |||
datarootdir = $(prefix)/share | |||
pdfdir = $(docdir) | |||
archdir = $(rubylibdir)/$(arch) | |||
sitearchdir = $(sitelibdir)/$(sitearch) | |||
datadir = $(datarootdir) | |||
localstatedir = $(prefix)/var | |||
sitelibdir = $(sitedir)/$(ruby_version) | |||
CC = gcc | |||
LIBRUBY = $(LIBRUBY_A) | |||
LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a | |||
LIBRUBYARG_SHARED = | |||
LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static | |||
RUBY_EXTCONF_H = | |||
CFLAGS = -fno-common -g -O2 -pipe -fno-common $(cflags) | |||
INCFLAGS = -I. -I$(topdir) -I$(hdrdir) -I$(srcdir) | |||
DEFS = | |||
CPPFLAGS = -DHAVE_RUBY_H -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE $(DEFS) $(cppflags) | |||
CXXFLAGS = $(CFLAGS) | |||
ldflags = -L. | |||
dldflags = | |||
archflag = | |||
DLDFLAGS = $(ldflags) $(dldflags) $(archflag) | |||
LDSHARED = cc -dynamic -bundle -undefined suppress -flat_namespace | |||
AR = ar | |||
EXEEXT = | |||
RUBY_INSTALL_NAME = ruby | |||
RUBY_SO_NAME = ruby | |||
arch = i686-darwin10.2.0 | |||
sitearch = i686-darwin10.2.0 | |||
ruby_version = 1.8 | |||
ruby = /Users/Sebastian/.rvm/rubies/ruby-1.8.7-p249/bin/ruby | |||
RUBY = $(ruby) | |||
RM = rm -f | |||
MAKEDIRS = mkdir -p | |||
INSTALL = /usr/bin/install -c | |||
INSTALL_PROG = $(INSTALL) -m 0755 | |||
INSTALL_DATA = $(INSTALL) -m 644 | |||
COPY = cp | |||
#### End of system configuration section. #### | |||
preload = | |||
libpath = . $(libdir) | |||
LIBPATH = -L. -L$(libdir) | |||
DEFFILE = | |||
CLEANFILES = mkmf.log | |||
DISTCLEANFILES = | |||
extout = | |||
extout_prefix = | |||
target_prefix = | |||
LOCAL_LIBS = | |||
LIBS = -ldl -lobjc | |||
SRCS = ext.c match.c matcher.c | |||
OBJS = ext.o match.o matcher.o | |||
TARGET = ext | |||
DLLIB = $(TARGET).bundle | |||
EXTSTATIC = | |||
STATIC_LIB = | |||
BINDIR = $(bindir) | |||
RUBYCOMMONDIR = $(sitedir)$(target_prefix) | |||
RUBYLIBDIR = $(sitelibdir)$(target_prefix) | |||
RUBYARCHDIR = $(sitearchdir)$(target_prefix) | |||
TARGET_SO = $(DLLIB) | |||
CLEANLIBS = $(TARGET).bundle $(TARGET).il? $(TARGET).tds $(TARGET).map | |||
CLEANOBJS = *.o *.a *.s[ol] *.pdb *.exp *.bak | |||
all: $(DLLIB) | |||
static: $(STATIC_LIB) | |||
clean: | |||
@-$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) | |||
distclean: clean | |||
@-$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log | |||
@-$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) | |||
realclean: distclean | |||
install: install-so install-rb | |||
install-so: $(RUBYARCHDIR) | |||
install-so: $(RUBYARCHDIR)/$(DLLIB) | |||
$(RUBYARCHDIR)/$(DLLIB): $(DLLIB) | |||
$(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR) | |||
install-rb: pre-install-rb install-rb-default | |||
install-rb-default: pre-install-rb-default | |||
pre-install-rb: Makefile | |||
pre-install-rb-default: Makefile | |||
$(RUBYARCHDIR): | |||
$(MAKEDIRS) $@ | |||
site-install: site-install-so site-install-rb | |||
site-install-so: install-so | |||
site-install-rb: install-rb | |||
.SUFFIXES: .c .m .cc .cxx .cpp .C .o | |||
.cc.o: | |||
$(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $< | |||
.cxx.o: | |||
$(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $< | |||
.cpp.o: | |||
$(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $< | |||
.C.o: | |||
$(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $< | |||
.c.o: | |||
$(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) -c $< | |||
$(DLLIB): $(OBJS) Makefile | |||
@-$(RM) $@ | |||
$(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS) | |||
### | |||
# Copyright 2010 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. | |||
CFLAGS += -std=c99 -Wall -Wextra -Wno-unused-parameter |
@ -1,307 +0,0 @@ | |||
# Copyright 2010 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. | |||
require 'command-t/finder' | |||
require 'command-t/match_window' | |||
require 'command-t/prompt' | |||
module CommandT | |||
class Controller | |||
def initialize | |||
@prompt = Prompt.new | |||
set_up_max_height | |||
set_up_finder | |||
end | |||
def show | |||
# optional parameter will be desired starting directory, or "" | |||
@path = File.expand_path(::VIM::evaluate('a:arg'), VIM::pwd) | |||
@finder.path = @path | |||
@initial_window = $curwin | |||
@initial_buffer = $curbuf | |||
@match_window = MatchWindow.new \ | |||
:prompt => @prompt, | |||
:match_window_at_top => get_bool('g:CommandTMatchWindowAtTop') | |||
@focus = @prompt | |||
@prompt.focus | |||
register_for_key_presses | |||
clear # clears prompt and lists matches | |||
rescue Errno::ENOENT | |||
# probably a problem with the optional parameter | |||
@match_window.print_no_such_file_or_directory | |||
end | |||
def hide | |||
@match_window.close | |||
if VIM::Window.select @initial_window | |||
if @initial_buffer.number == 0 | |||
# upstream bug: buffer number misreported as 0 | |||
# see: https://wincent.com/issues/1617 | |||
::VIM::command "silent b #{@initial_buffer.name}" | |||
else | |||
::VIM::command "silent b #{@initial_buffer.number}" | |||
end | |||
end | |||
end | |||
def flush | |||
set_up_max_height | |||
set_up_finder | |||
end | |||
def handle_key | |||
key = ::VIM::evaluate('a:arg').to_i.chr | |||
if @focus == @prompt | |||
@prompt.add! key | |||
list_matches | |||
else | |||
@match_window.find key | |||
end | |||
end | |||
def backspace | |||
if @focus == @prompt | |||
@prompt.backspace! | |||
list_matches | |||
end | |||
end | |||
def delete | |||
if @focus == @prompt | |||
@prompt.delete! | |||
list_matches | |||
end | |||
end | |||
def accept_selection options = {} | |||
selection = @match_window.selection | |||
hide | |||
open_selection(selection, options) unless selection.nil? | |||
end | |||
def toggle_focus | |||
@focus.unfocus # old focus | |||
@focus = @focus == @prompt ? @match_window : @prompt | |||
@focus.focus # new focus | |||
end | |||
def cancel | |||
hide | |||
end | |||
def select_next | |||
@match_window.select_next | |||
end | |||
def select_prev | |||
@match_window.select_prev | |||
end | |||
def clear | |||
@prompt.clear! | |||
list_matches | |||
end | |||
def cursor_left | |||
@prompt.cursor_left if @focus == @prompt | |||
end | |||
def cursor_right | |||
@prompt.cursor_right if @focus == @prompt | |||
end | |||
def cursor_end | |||
@prompt.cursor_end if @focus == @prompt | |||
end | |||
def cursor_start | |||
@prompt.cursor_start if @focus == @prompt | |||
end | |||
def leave | |||
@match_window.leave | |||
end | |||
def unload | |||
@match_window.unload | |||
end | |||
private | |||
def set_up_max_height | |||
@max_height = get_number('g:CommandTMaxHeight') || 0 | |||
end | |||
def set_up_finder | |||
@finder = CommandT::Finder.new nil, | |||
:max_files => get_number('g:CommandTMaxFiles'), | |||
:max_depth => get_number('g:CommandTMaxDepth'), | |||
:always_show_dot_files => get_bool('g:CommandTAlwaysShowDotFiles'), | |||
:never_show_dot_files => get_bool('g:CommandTNeverShowDotFiles'), | |||
:scan_dot_directories => get_bool('g:CommandTScanDotDirectories') | |||
end | |||
def exists? name | |||
::VIM::evaluate("exists(\"#{name}\")").to_i != 0 | |||
end | |||
def get_number name | |||
exists?(name) ? ::VIM::evaluate("#{name}").to_i : nil | |||
end | |||
def get_bool name | |||
exists?(name) ? ::VIM::evaluate("#{name}").to_i != 0 : nil | |||
end | |||
def get_string name | |||
exists?(name) ? ::VIM::evaluate("#{name}").to_s : nil | |||
end | |||
# expect a string or a list of strings | |||
def get_list_or_string name | |||
return nil unless exists?(name) | |||
list_or_string = ::VIM::evaluate("#{name}") | |||
if list_or_string.kind_of?(Array) | |||
list_or_string.map { |item| item.to_s } | |||
else | |||
list_or_string.to_s | |||
end | |||
end | |||
def relative_path_under_working_directory path | |||
# any path under the working directory will be specified as a relative | |||
# path to improve the readability of the buffer list etc | |||
pwd = File.expand_path(VIM::pwd) + '/' | |||
path.index(pwd) == 0 ? path[pwd.length..-1] : path | |||
end | |||
# Backslash-escape space, \, |, %, #, " | |||
def sanitize_path_string str | |||
# for details on escaping command-line mode arguments see: :h : | |||
# (that is, help on ":") in the Vim documentation. | |||
str.gsub(/[ \\|%#"]/, '\\\\\0') | |||
end | |||
def default_open_command | |||
if !get_bool('&hidden') && get_bool('&modified') | |||
'sp' | |||
else | |||
'e' | |||
end | |||
end | |||
def ensure_appropriate_window_selection | |||
# normally we try to open the selection in the current window, but there | |||
# is one exception: | |||
# | |||
# - we don't touch any "unlisted" buffer with buftype "nofile" (such as | |||
# NERDTree or MiniBufExplorer); this is to avoid things like the "Not | |||
# enough room" error which occurs when trying to open in a split in a | |||
# shallow (potentially 1-line) buffer like MiniBufExplorer is current | |||
# | |||
# Other "unlisted" buffers, such as those with buftype "help" are treated | |||
# normally. | |||
initial = $curwin | |||
while true do | |||
break unless ::VIM::evaluate('&buflisted').to_i == 0 && | |||
::VIM::evaluate('&buftype').to_s == 'nofile' | |||
::VIM::command 'wincmd w' # try next window | |||
break if $curwin == initial # have already tried all | |||
end | |||
end | |||
def open_selection selection, options = {} | |||
command = options[:command] || default_open_command | |||
selection = File.expand_path selection, @path | |||
selection = relative_path_under_working_directory selection | |||
selection = sanitize_path_string selection | |||
ensure_appropriate_window_selection | |||
::VIM::command "silent #{command} #{selection}" | |||
end | |||
def map key, function, param = nil | |||
::VIM::command "noremap <silent> <buffer> #{key} " \ | |||
":call CommandT#{function}(#{param})<CR>" | |||
end | |||
def xterm? | |||
!!(::VIM::evaluate('&term') =~ /\Axterm/) | |||
end | |||
def vt100? | |||
!!(::VIM::evaluate('&term') =~ /\Avt100/) | |||
end | |||
def register_for_key_presses | |||
# "normal" keys (interpreted literally) | |||
numbers = ('0'..'9').to_a.join | |||
lowercase = ('a'..'z').to_a.join | |||
uppercase = lowercase.upcase | |||
punctuation = '<>`@#~!"$%&/()=+*-_.,;:?\\\'{}[] ' # and space | |||
(numbers + lowercase + uppercase + punctuation).each_byte do |b| | |||
map "<Char-#{b}>", 'HandleKey', b | |||
end | |||
# "special" keys (overridable by settings) | |||
{ 'Backspace' => '<BS>', | |||
'Delete' => '<Del>', | |||
'AcceptSelection' => '<CR>', | |||
'AcceptSelectionSplit' => ['<C-CR>', '<C-s>'], | |||
'AcceptSelectionTab' => '<C-t>', | |||
'AcceptSelectionVSplit' => '<C-v>', | |||
'ToggleFocus' => '<Tab>', | |||
'Cancel' => ['<C-c>', '<Esc>'], | |||
'SelectNext' => ['<C-n>', '<C-j>', '<Down>'], | |||
'SelectPrev' => ['<C-p>', '<C-k>', '<Up>'], | |||
'Clear' => '<C-u>', | |||
'CursorLeft' => ['<Left>', '<C-h>'], | |||
'CursorRight' => ['<Right>', '<C-l>'], | |||
'CursorEnd' => '<C-e>', | |||
'CursorStart' => '<C-a>' }.each do |key, value| | |||
if override = get_list_or_string("g:CommandT#{key}Map") | |||
[override].flatten.each do |mapping| | |||
map mapping, key | |||
end | |||
else | |||
[value].flatten.each do |mapping| | |||
map mapping, key unless mapping == '<Esc>' && (xterm? || vt100?) | |||
end | |||
end | |||
end | |||
end | |||
# Returns the desired maximum number of matches, based on available | |||
# vertical space and the g:CommandTMaxHeight option. | |||
def match_limit | |||
limit = VIM::Screen.lines - 5 | |||
limit = 1 if limit < 0 | |||
limit = [limit, @max_height].min if @max_height > 0 | |||
limit | |||
end | |||
def list_matches | |||
matches = @finder.sorted_matches_for @prompt.abbrev, :limit => match_limit | |||
@match_window.matches = matches | |||
end | |||
end # class Controller | |||
end # module commandT |
@ -1,24 +0,0 @@ | |||
# Copyright 2010 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. | |||
CFLAGS += -std=c99 -Wall -Wextra -Wno-unused-parameter |
@ -1,65 +0,0 @@ | |||
// Copyright 2010 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. | |||
#include "match.h" | |||
#include "matcher.h" | |||
VALUE mCommandT = 0; // module CommandT | |||
VALUE cCommandTMatch = 0; // class CommandT::Match | |||
VALUE cCommandTMatcher = 0; // class CommandT::Matcher | |||
VALUE CommandT_option_from_hash(const char *option, VALUE hash) | |||
{ | |||
if (NIL_P(hash)) | |||
return Qnil; | |||
VALUE key = ID2SYM(rb_intern(option)); | |||
if (rb_funcall(hash, rb_intern("has_key?"), 1, key) == Qtrue) | |||
return rb_hash_aref(hash, key); | |||
else | |||
return Qnil; | |||
} | |||
void Init_ext() | |||
{ | |||
// module CommandT | |||
mCommandT = rb_define_module("CommandT"); | |||
// class CommandT::Match | |||
cCommandTMatch = rb_define_class_under(mCommandT, "Match", rb_cObject); | |||
// methods | |||
rb_define_method(cCommandTMatch, "initialize", CommandTMatch_initialize, -1); | |||
rb_define_method(cCommandTMatch, "matches?", CommandTMatch_matches, 0); | |||
rb_define_method(cCommandTMatch, "to_s", CommandTMatch_to_s, 0); | |||
// attributes | |||
rb_define_attr(cCommandTMatch, "score", Qtrue, Qfalse); // reader: true, writer: false | |||
// class CommandT::Matcher | |||
cCommandTMatcher = rb_define_class_under(mCommandT, "Matcher", rb_cObject); | |||
// methods | |||
rb_define_method(cCommandTMatcher, "initialize", CommandTMatcher_initialize, -1); | |||
rb_define_method(cCommandTMatcher, "sorted_matches_for", CommandTMatcher_sorted_matches_for, 2); | |||
rb_define_method(cCommandTMatcher, "matches_for", CommandTMatcher_matches_for, 1); | |||
} |
@ -1,36 +0,0 @@ | |||
// Copyright 2010 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. | |||
#include <ruby.h> | |||
extern VALUE mCommandT; // module CommandT | |||
extern VALUE cCommandTMatch; // class CommandT::Match | |||
extern VALUE cCommandTMatcher; // class CommandT::Matcher | |||
// Encapsulates common pattern of checking for an option in an optional | |||
// options hash. The hash itself may be nil, but an exception will be | |||
// raised if it is not nil and not a hash. | |||
VALUE CommandT_option_from_hash(const char *option, VALUE hash); | |||
// Debugging macro. | |||
#define ruby_inspect(obj) rb_funcall(rb_mKernel, rb_intern("p"), 1, obj) |
@ -1,32 +0,0 @@ | |||
# Copyright 2010 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. | |||
require 'mkmf' | |||
def missing item | |||
puts "couldn't find #{item} (required)" | |||
exit 1 | |||
end | |||
have_header('ruby.h') or missing('ruby.h') | |||
create_makefile('ext') |
@ -1,51 +0,0 @@ | |||
# Copyright 2010 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. | |||
require 'command-t/ext' # CommandT::Matcher | |||
require 'command-t/scanner' | |||
module CommandT | |||
# Encapsulates a Scanner instance (which builds up a list of available files | |||
# in a directory) and a Matcher instance (which selects from that list based | |||
# on a search string). | |||
class Finder | |||
def initialize path = Dir.pwd, options = {} | |||
@scanner = Scanner.new path, options | |||
@matcher = Matcher.new @scanner, options | |||
end | |||
# Options: | |||
# :limit (integer): limit the number of returned matches | |||
def sorted_matches_for str, options = {} | |||
@matcher.sorted_matches_for str, options | |||
end | |||
def flush | |||
@scanner.flush | |||
end | |||
def path= path | |||
@scanner.path = path | |||
end | |||
end # class Finder | |||
end # CommandT |
@ -1,189 +0,0 @@ | |||
// Copyright 2010 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. | |||
#include "match.h" | |||
#include "ext.h" | |||
#include "ruby_compat.h" | |||
// use a struct to make passing params during recursion easier | |||
typedef struct | |||
{ | |||
char *str_p; // pointer to string to be searched | |||
long str_len; // length of same | |||
char *abbrev_p; // pointer to search string (abbreviation) | |||
long abbrev_len; // length of same | |||
double max_score_per_char; | |||
int dot_file; // boolean: true if str is a dot-file | |||
int always_show_dot_files; // boolean | |||
int never_show_dot_files; // boolean | |||
} matchinfo_t; | |||
double recursive_match(matchinfo_t *m, // sharable meta-data | |||
long str_idx, // where in the path string to start | |||
long abbrev_idx, // where in the search string to start | |||
long last_idx, // location of last matched character | |||
double score) // cumulative score so far | |||
{ | |||
double seen_score = 0; // remember best score seen via recursion | |||
int dot_file_match = 0; // true if abbrev matches a dot-file | |||
int dot_search = 0; // true if searching for a dot | |||
for (long i = abbrev_idx; i < m->abbrev_len; i++) | |||
{ | |||
char c = m->abbrev_p[i]; | |||
if (c == '.') | |||
dot_search = 1; | |||
int found = 0; | |||
for (long j = str_idx; j < m->str_len; j++, str_idx++) | |||
{ | |||
char d = m->str_p[j]; | |||
if (d == '.') | |||
{ | |||
if (j == 0 || m->str_p[j - 1] == '/') | |||
{ | |||
m->dot_file = 1; // this is a dot-file | |||
if (dot_search) // and we are searching for a dot | |||
dot_file_match = 1; // so this must be a match | |||
} | |||
} | |||
else if (d >= 'A' && d <= 'Z') | |||
d += 'a' - 'A'; // add 32 to downcase | |||
if (c == d) | |||
{ | |||
found = 1; | |||
dot_search = 0; | |||
// calculate score | |||
double score_for_char = m->max_score_per_char; | |||
long distance = j - last_idx; | |||
if (distance > 1) | |||
{ | |||
double factor = 1.0; | |||
char last = m->str_p[j - 1]; | |||
char curr = m->str_p[j]; // case matters, so get again | |||
if (last == '/') | |||
factor = 0.9; | |||
else if (last == '-' || | |||
last == '_' || | |||
last == ' ' || | |||
(last >= '0' && last <= '9')) | |||
factor = 0.8; | |||
else if (last >= 'a' && last <= 'z' && | |||
curr >= 'A' && curr <= 'Z') | |||
factor = 0.8; | |||
else if (last == '.') | |||
factor = 0.7; | |||
else | |||
// if no "special" chars behind char, factor diminishes | |||
// as distance from last matched char increases | |||
factor = (1.0 / distance) * 0.75; | |||
score_for_char *= factor; | |||
} | |||
if (++j < m->str_len) | |||
{ | |||
// bump cursor one char to the right and | |||
// use recursion to try and find a better match | |||
double sub_score = recursive_match(m, j, i, last_idx, score); | |||
if (sub_score > seen_score) | |||
seen_score = sub_score; | |||
} | |||
score += score_for_char; | |||
last_idx = str_idx++; | |||
break; | |||
} | |||
} | |||
if (!found) | |||
return 0.0; | |||
} | |||
if (m->dot_file) | |||
{ | |||
if (m->never_show_dot_files || | |||
(!dot_file_match && !m->always_show_dot_files)) | |||
return 0.0; | |||
} | |||
return (score > seen_score) ? score : seen_score; | |||
} | |||
// Match.new abbrev, string, options = {} | |||
VALUE CommandTMatch_initialize(int argc, VALUE *argv, VALUE self) | |||
{ | |||
// process arguments: 2 mandatory, 1 optional | |||
VALUE str, abbrev, options; | |||
if (rb_scan_args(argc, argv, "21", &str, &abbrev, &options) == 2) | |||
options = Qnil; | |||
str = StringValue(str); | |||
abbrev = StringValue(abbrev); // already downcased by caller | |||
// check optional options hash for overrides | |||
VALUE always_show_dot_files = CommandT_option_from_hash("always_show_dot_files", options); | |||
VALUE never_show_dot_files = CommandT_option_from_hash("never_show_dot_files", options); | |||
matchinfo_t m; | |||
m.str_p = RSTRING_PTR(str); | |||
m.str_len = RSTRING_LEN(str); | |||
m.abbrev_p = RSTRING_PTR(abbrev); | |||
m.abbrev_len = RSTRING_LEN(abbrev); | |||
m.max_score_per_char = (1.0 / m.str_len + 1.0 / m.abbrev_len) / 2; | |||
m.dot_file = 0; | |||
m.always_show_dot_files = always_show_dot_files == Qtrue; | |||
m.never_show_dot_files = never_show_dot_files == Qtrue; | |||
// calculate score | |||
double score = 1.0; | |||
if (m.abbrev_len == 0) // special case for zero-length search string | |||
{ | |||
// filter out dot files | |||
if (!m.always_show_dot_files) | |||
{ | |||
for (long i = 0; i < m.str_len; i++) | |||
{ | |||
char c = m.str_p[i]; | |||
if (c == '.' && (i == 0 || m.str_p[i - 1] == '/')) | |||
{ | |||
score = 0.0; | |||
break; | |||
} | |||
} | |||
} | |||
} | |||
else // normal case | |||
score = recursive_match(&m, 0, 0, 0, 0.0); | |||