command-t 1.13 → 2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE +1 -1
- data/README.txt +209 -67
- data/Rakefile +47 -57
- data/doc/command-t.txt +209 -67
- data/doc/tags +9 -0
- data/plugin/command-t.vim +22 -13
- data/ruby/command-t.rb +7 -2
- data/ruby/command-t/Makefile +32 -32
- data/ruby/command-t/controller.rb +33 -25
- data/ruby/command-t/depend +1 -1
- data/ruby/command-t/ext.bundle +0 -0
- data/ruby/command-t/ext.c +1 -1
- data/ruby/command-t/ext.h +1 -1
- data/ruby/command-t/extconf.rb +1 -1
- data/ruby/command-t/finder.rb +7 -1
- data/ruby/command-t/finder/buffer_finder.rb +5 -1
- data/ruby/command-t/finder/file_finder.rb +5 -1
- data/ruby/command-t/finder/jump_finder.rb +5 -1
- data/ruby/command-t/finder/mru_buffer_finder.rb +5 -1
- data/ruby/command-t/finder/tag_finder.rb +5 -1
- data/ruby/command-t/match.c +5 -2
- data/ruby/command-t/match.h +2 -1
- data/ruby/command-t/match_window.rb +36 -21
- data/ruby/command-t/matcher.c +12 -2
- data/ruby/command-t/matcher.h +1 -1
- data/ruby/command-t/metadata/fallback.rb +12 -0
- data/ruby/command-t/mru.rb +1 -1
- data/ruby/command-t/path_utilities.rb +1 -1
- data/ruby/command-t/prompt.rb +7 -6
- data/ruby/command-t/ruby_compat.h +1 -1
- data/ruby/command-t/scanner.rb +1 -1
- data/ruby/command-t/scanner/buffer_scanner.rb +1 -1
- data/ruby/command-t/scanner/file_scanner.rb +1 -4
- data/ruby/command-t/scanner/file_scanner/find_file_scanner.rb +1 -1
- data/ruby/command-t/scanner/file_scanner/git_file_scanner.rb +1 -1
- data/ruby/command-t/scanner/file_scanner/ruby_file_scanner.rb +3 -1
- data/ruby/command-t/scanner/file_scanner/watchman_file_scanner.rb +1 -1
- data/ruby/command-t/scanner/jump_scanner.rb +1 -1
- data/ruby/command-t/scanner/mru_buffer_scanner.rb +1 -1
- data/ruby/command-t/scanner/tag_scanner.rb +1 -1
- data/ruby/command-t/scm_utilities.rb +1 -1
- data/ruby/command-t/settings.rb +2 -1
- data/ruby/command-t/stub.rb +1 -1
- data/ruby/command-t/util.rb +1 -1
- data/ruby/command-t/vim.rb +3 -3
- data/ruby/command-t/vim/screen.rb +1 -1
- data/ruby/command-t/vim/window.rb +1 -1
- data/ruby/command-t/watchman.c +1 -1
- data/ruby/command-t/watchman.h +1 -1
- metadata +3 -4
- data/ruby/command-t/metadata.rb +0 -8
- data/ruby/command-t/scanner/file_scanner/file_limit_exceeded.rb +0 -10
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2010-
|
1
|
+
# Copyright 2010-present Greg Hurrell. All rights reserved.
|
2
2
|
# Licensed under the terms of the BSD 2-clause license.
|
3
3
|
|
4
4
|
module CommandT
|
@@ -24,6 +24,10 @@ module CommandT
|
|
24
24
|
def flush
|
25
25
|
@scanner.flush
|
26
26
|
end
|
27
|
+
|
28
|
+
def name
|
29
|
+
'Files'
|
30
|
+
end
|
27
31
|
end # class FileFinder
|
28
32
|
end # class Finder
|
29
33
|
end # module CommandT
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2011-
|
1
|
+
# Copyright 2011-present Greg Hurrell. All rights reserved.
|
2
2
|
# Licensed under the terms of the BSD 2-clause license.
|
3
3
|
|
4
4
|
module CommandT
|
@@ -8,6 +8,10 @@ module CommandT
|
|
8
8
|
@scanner = Scanner::JumpScanner.new
|
9
9
|
@matcher = Matcher.new @scanner, :always_show_dot_files => true
|
10
10
|
end
|
11
|
+
|
12
|
+
def name
|
13
|
+
'Jumps'
|
14
|
+
end
|
11
15
|
end # class JumpFinder
|
12
16
|
end # class Finder
|
13
17
|
end # module CommandT
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2014 Greg Hurrell. All rights reserved.
|
1
|
+
# Copyright 2014-present Greg Hurrell. All rights reserved.
|
2
2
|
# Licensed under the terms of the BSD 2-clause license.
|
3
3
|
|
4
4
|
module CommandT
|
@@ -23,6 +23,10 @@ module CommandT
|
|
23
23
|
matches
|
24
24
|
end
|
25
25
|
end
|
26
|
+
|
27
|
+
def name
|
28
|
+
'Recent'
|
29
|
+
end
|
26
30
|
end # class MRUBufferFinder
|
27
31
|
end # class Finder
|
28
32
|
end # CommandT
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2011-
|
1
|
+
# Copyright 2011-present Greg Hurrell. All rights reserved.
|
2
2
|
# Licensed under the terms of the BSD 2-clause license.
|
3
3
|
|
4
4
|
module CommandT
|
@@ -21,6 +21,10 @@ module CommandT
|
|
21
21
|
def flush
|
22
22
|
@scanner.flush
|
23
23
|
end
|
24
|
+
|
25
|
+
def name
|
26
|
+
'Tags'
|
27
|
+
end
|
24
28
|
end # class TagFinder
|
25
29
|
end # class Finder
|
26
30
|
end # module CommandT
|
data/ruby/command-t/match.c
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
// Copyright 2010-
|
1
|
+
// Copyright 2010-present Greg Hurrell. All rights reserved.
|
2
2
|
// Licensed under the terms of the BSD 2-clause license.
|
3
3
|
|
4
4
|
#include <float.h> /* for DBL_MAX */
|
@@ -16,6 +16,7 @@ typedef struct {
|
|
16
16
|
int always_show_dot_files; // boolean
|
17
17
|
int never_show_dot_files; // boolean
|
18
18
|
int case_sensitive; // boolean
|
19
|
+
int recurse; // boolean
|
19
20
|
double *memo; // memoization
|
20
21
|
} matchinfo_t;
|
21
22
|
|
@@ -94,7 +95,7 @@ double recursive_match(matchinfo_t *m, // sharable meta-data
|
|
94
95
|
score_for_char *= factor;
|
95
96
|
}
|
96
97
|
|
97
|
-
if (++j < m->haystack_len) {
|
98
|
+
if (++j < m->haystack_len && m->recurse) {
|
98
99
|
// bump cursor one char to the right and
|
99
100
|
// use recursion to try and find a better match
|
100
101
|
double sub_score = recursive_match(m, j, i, last_idx, score);
|
@@ -125,6 +126,7 @@ void calculate_match(VALUE str,
|
|
125
126
|
VALUE case_sensitive,
|
126
127
|
VALUE always_show_dot_files,
|
127
128
|
VALUE never_show_dot_files,
|
129
|
+
VALUE recurse,
|
128
130
|
match_t *out)
|
129
131
|
{
|
130
132
|
long i, max;
|
@@ -138,6 +140,7 @@ void calculate_match(VALUE str,
|
|
138
140
|
m.always_show_dot_files = always_show_dot_files == Qtrue;
|
139
141
|
m.never_show_dot_files = never_show_dot_files == Qtrue;
|
140
142
|
m.case_sensitive = case_sensitive;
|
143
|
+
m.recurse = recurse == Qtrue;
|
141
144
|
|
142
145
|
// calculate score
|
143
146
|
score = 1.0;
|
data/ruby/command-t/match.h
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
// Copyright 2010-
|
1
|
+
// Copyright 2010-present Greg Hurrell. All rights reserved.
|
2
2
|
// Licensed under the terms of the BSD 2-clause license.
|
3
3
|
|
4
4
|
#include <ruby.h>
|
@@ -14,4 +14,5 @@ extern void calculate_match(VALUE str,
|
|
14
14
|
VALUE case_sensitive,
|
15
15
|
VALUE always_show_dot_files,
|
16
16
|
VALUE never_show_dot_files,
|
17
|
+
VALUE recurse,
|
17
18
|
match_t *out);
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2010-
|
1
|
+
# Copyright 2010-present Greg Hurrell. All rights reserved.
|
2
2
|
# Licensed under the terms of the BSD 2-clause license.
|
3
3
|
|
4
4
|
require 'ostruct'
|
@@ -20,6 +20,9 @@ module CommandT
|
|
20
20
|
@prompt = options[:prompt]
|
21
21
|
@reverse_list = options[:match_window_reverse]
|
22
22
|
|
23
|
+
quoted_name = VIM::escape_for_single_quotes(options[:name])
|
24
|
+
escaped_name = ::VIM::evaluate("fnameescape('#{quoted_name}')")
|
25
|
+
|
23
26
|
# save existing window dimensions so we can restore them later
|
24
27
|
@windows = (0..(::VIM::Window.count - 1)).map do |i|
|
25
28
|
OpenStruct.new(
|
@@ -43,26 +46,31 @@ module CommandT
|
|
43
46
|
|
44
47
|
# show match window
|
45
48
|
split_location = options[:match_window_at_top] ? 'topleft' : 'botright'
|
46
|
-
if
|
47
|
-
::VIM::command "silent! #{split_location} #{
|
48
|
-
|
49
|
+
if ((number = buffer_number)) # still have buffer from last time
|
50
|
+
::VIM::command "silent! #{split_location} #{number}sbuffer"
|
51
|
+
if $curbuf.number != number
|
52
|
+
raise "Can't re-open Command-T match listing buffer"
|
53
|
+
end
|
49
54
|
$curwin.height = 1
|
55
|
+
::VIM::command "0file"
|
56
|
+
::VIM::command "keepalt file #{escaped_name}"
|
50
57
|
else # creating match window for first time and set it up
|
51
|
-
::VIM::command "silent! #{split_location} 1split
|
52
|
-
set 'bufhidden', 'unload'
|
53
|
-
set 'buftype', 'nofile'
|
54
|
-
set '
|
55
|
-
set '
|
56
|
-
set '
|
57
|
-
set '
|
58
|
-
set '
|
59
|
-
set '
|
60
|
-
set '
|
61
|
-
set '
|
62
|
-
set '
|
63
|
-
set '
|
64
|
-
set '
|
65
|
-
set '
|
58
|
+
::VIM::command "silent! keepalt #{split_location} 1split #{escaped_name}"
|
59
|
+
set 'bufhidden', 'unload' # unload buf when no longer displayed
|
60
|
+
set 'buftype', 'nofile' # buffer is not related to any file
|
61
|
+
set 'filetype', 'command-t' # provide for detectability/extensibility
|
62
|
+
set 'modifiable', false # prevent manual edits
|
63
|
+
set 'readonly', false # avoid W10 "Changing a readonly file"
|
64
|
+
set 'swapfile', false # don't create a swapfile
|
65
|
+
set 'wrap', false # don't soft-wrap
|
66
|
+
set 'number', false # don't show line numbers
|
67
|
+
set 'list', false # don't use List mode (visible tabs etc)
|
68
|
+
set 'foldcolumn', 0 # don't show a fold column at side
|
69
|
+
set 'foldlevel', 99 # don't fold anything
|
70
|
+
set 'cursorline', false # don't highlight line cursor is on
|
71
|
+
set 'spell', false # spell-checking off
|
72
|
+
set 'buflisted', false # don't show up in the buffer list
|
73
|
+
set 'textwidth', 0 # don't hard-wrap (break long lines)
|
66
74
|
|
67
75
|
# don't show the color column
|
68
76
|
set 'colorcolumn', 0 if VIM::exists?('+colorcolumn')
|
@@ -71,7 +79,9 @@ module CommandT
|
|
71
79
|
set 'relativenumber', false if VIM::exists?('+relativenumber')
|
72
80
|
|
73
81
|
# sanity check: make sure the buffer really was created
|
74
|
-
|
82
|
+
if File.basename($curbuf.name) != options[:name]
|
83
|
+
raise "Can't find Command-T match listing buffer"
|
84
|
+
end
|
75
85
|
@@buffer = $curbuf
|
76
86
|
end
|
77
87
|
|
@@ -117,6 +127,9 @@ module CommandT
|
|
117
127
|
|
118
128
|
def buffer_number
|
119
129
|
@@buffer && @@buffer.number
|
130
|
+
rescue Vim::DeletedBufferError
|
131
|
+
# Beware of people manually deleting Command-T's hidden, unlisted buffer.
|
132
|
+
@@buffer = nil
|
120
133
|
end
|
121
134
|
|
122
135
|
def close
|
@@ -140,7 +153,9 @@ module CommandT
|
|
140
153
|
# For more details, see: https://wincent.com/issues/1617
|
141
154
|
if $curbuf.number == 0
|
142
155
|
# use bwipeout as bunload fails if passed the name of a hidden buffer
|
143
|
-
|
156
|
+
base = File.basename($curbuf.name)
|
157
|
+
escaped_name = ::VIM::evaluate("fnameescape('#{base}')")
|
158
|
+
::VIM::command "silent! bwipeout! #{escaped_name}"
|
144
159
|
@@buffer = nil
|
145
160
|
else
|
146
161
|
::VIM::command "silent! bunload! #{@@buffer.number}"
|
data/ruby/command-t/matcher.c
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
// Copyright 2010-
|
1
|
+
// Copyright 2010-present Greg Hurrell. All rights reserved.
|
2
2
|
// Licensed under the terms of the BSD 2-clause license.
|
3
3
|
|
4
4
|
#include <stdlib.h> /* for qsort() */
|
@@ -90,6 +90,7 @@ typedef struct {
|
|
90
90
|
VALUE abbrev;
|
91
91
|
VALUE always_show_dot_files;
|
92
92
|
VALUE never_show_dot_files;
|
93
|
+
VALUE recurse;
|
93
94
|
} thread_args_t;
|
94
95
|
|
95
96
|
void *match_thread(void *thread_args)
|
@@ -103,6 +104,7 @@ void *match_thread(void *thread_args)
|
|
103
104
|
args->case_sensitive,
|
104
105
|
args->always_show_dot_files,
|
105
106
|
args->never_show_dot_files,
|
107
|
+
args->recurse,
|
106
108
|
&args->matches[i]);
|
107
109
|
}
|
108
110
|
|
@@ -123,8 +125,10 @@ VALUE CommandTMatcher_sorted_matches_for(int argc, VALUE *argv, VALUE self)
|
|
123
125
|
VALUE always_show_dot_files;
|
124
126
|
VALUE limit_option;
|
125
127
|
VALUE never_show_dot_files;
|
128
|
+
VALUE ignore_spaces;
|
126
129
|
VALUE options;
|
127
130
|
VALUE paths;
|
131
|
+
VALUE recurse;
|
128
132
|
VALUE results;
|
129
133
|
VALUE scanner;
|
130
134
|
VALUE sort_option;
|
@@ -136,16 +140,21 @@ VALUE CommandTMatcher_sorted_matches_for(int argc, VALUE *argv, VALUE self)
|
|
136
140
|
if (NIL_P(abbrev))
|
137
141
|
rb_raise(rb_eArgError, "nil abbrev");
|
138
142
|
|
139
|
-
// check optional options
|
143
|
+
// check optional options hash for overrides
|
140
144
|
case_sensitive = CommandT_option_from_hash("case_sensitive", options);
|
141
145
|
limit_option = CommandT_option_from_hash("limit", options);
|
142
146
|
threads_option = CommandT_option_from_hash("threads", options);
|
143
147
|
sort_option = CommandT_option_from_hash("sort", options);
|
148
|
+
ignore_spaces = CommandT_option_from_hash("ignore_spaces", options);
|
149
|
+
recurse = CommandT_option_from_hash("recurse", options);
|
144
150
|
|
145
151
|
abbrev = StringValue(abbrev);
|
146
152
|
if (case_sensitive != Qtrue)
|
147
153
|
abbrev = rb_funcall(abbrev, rb_intern("downcase"), 0);
|
148
154
|
|
155
|
+
if (ignore_spaces == Qtrue)
|
156
|
+
abbrev = rb_funcall(abbrev, rb_intern("delete"), 1, rb_str_new2(" "));
|
157
|
+
|
149
158
|
// get unsorted matches
|
150
159
|
scanner = rb_iv_get(self, "@scanner");
|
151
160
|
paths = rb_funcall(scanner, rb_intern("paths"), 0);
|
@@ -181,6 +190,7 @@ VALUE CommandTMatcher_sorted_matches_for(int argc, VALUE *argv, VALUE self)
|
|
181
190
|
thread_args[i].abbrev = abbrev;
|
182
191
|
thread_args[i].always_show_dot_files = always_show_dot_files;
|
183
192
|
thread_args[i].never_show_dot_files = never_show_dot_files;
|
193
|
+
thread_args[i].recurse = recurse;
|
184
194
|
|
185
195
|
#ifdef HAVE_PTHREAD_H
|
186
196
|
if (i == thread_count - 1) {
|
data/ruby/command-t/matcher.h
CHANGED
@@ -0,0 +1,12 @@
|
|
1
|
+
# Copyright 2015-present Greg Hurrell. All rights reserved.
|
2
|
+
# Licensed under the terms of the BSD 2-clause license.
|
3
|
+
|
4
|
+
module CommandT
|
5
|
+
module Metadata
|
6
|
+
# This file gets overwritten with actual data during the installation
|
7
|
+
# process (when `ruby extconf.rb` is run).
|
8
|
+
EXPECTED_RUBY_VERSION = '[unknown]'
|
9
|
+
EXPECTED_RUBY_PATCHLEVEL = '[unknown]'
|
10
|
+
UNKNOWN = true
|
11
|
+
end # module Metadata
|
12
|
+
end # module CommandT
|
data/ruby/command-t/mru.rb
CHANGED
data/ruby/command-t/prompt.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2010-
|
1
|
+
# Copyright 2010-present Greg Hurrell. All rights reserved.
|
2
2
|
# Licensed under the terms of the BSD 2-clause license.
|
3
3
|
|
4
4
|
module CommandT
|
@@ -6,10 +6,11 @@ module CommandT
|
|
6
6
|
class Prompt
|
7
7
|
attr_accessor :abbrev
|
8
8
|
|
9
|
-
def initialize
|
10
|
-
@abbrev
|
11
|
-
@col
|
12
|
-
@
|
9
|
+
def initialize(options = {})
|
10
|
+
@abbrev = '' # abbreviation entered so far
|
11
|
+
@col = 0 # cursor position
|
12
|
+
@cursor_color = options[:cursor_color] || 'Underlined'
|
13
|
+
@has_focus = false
|
13
14
|
end
|
14
15
|
|
15
16
|
# Erase whatever is displayed in the prompt line,
|
@@ -117,7 +118,7 @@ module CommandT
|
|
117
118
|
if @has_focus
|
118
119
|
prompt_highlight = 'Comment'
|
119
120
|
normal_highlight = 'None'
|
120
|
-
cursor_highlight =
|
121
|
+
cursor_highlight = @cursor_color
|
121
122
|
else
|
122
123
|
prompt_highlight = 'NonText'
|
123
124
|
normal_highlight = 'NonText'
|
data/ruby/command-t/scanner.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2010-
|
1
|
+
# Copyright 2010-present Greg Hurrell. All rights reserved.
|
2
2
|
# Licensed under the terms of the BSD 2-clause license.
|
3
3
|
|
4
4
|
module CommandT
|
@@ -9,9 +9,6 @@ module CommandT
|
|
9
9
|
# obtain file listings via different strategies (for examples, see the
|
10
10
|
# RubyFileScanner and FindFileScanner subclasses).
|
11
11
|
class FileScanner < Scanner
|
12
|
-
# Errors
|
13
|
-
autoload :FileLimitExceeded, 'command-t/scanner/file_scanner/file_limit_exceeded'
|
14
|
-
|
15
12
|
# Subclasses
|
16
13
|
autoload :FindFileScanner, 'command-t/scanner/file_scanner/find_file_scanner'
|
17
14
|
autoload :GitFileScanner, 'command-t/scanner/file_scanner/git_file_scanner'
|
@@ -1,9 +1,11 @@
|
|
1
|
-
# Copyright 2010-
|
1
|
+
# Copyright 2010-present Greg Hurrell. All rights reserved.
|
2
2
|
# Licensed under the terms of the BSD 2-clause license.
|
3
3
|
|
4
4
|
module CommandT
|
5
5
|
class Scanner
|
6
6
|
class FileScanner
|
7
|
+
FileLimitExceeded = Class.new(::RuntimeError)
|
8
|
+
|
7
9
|
# Pure Ruby implementation of a file scanner.
|
8
10
|
class RubyFileScanner < FileScanner
|
9
11
|
def paths!
|