command-t 1.8 → 1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.txt +52 -14
- data/doc/command-t.txt +52 -14
- data/doc/tags +1 -0
- data/plugin/command-t.vim +8 -156
- data/ruby/command-t/Makefile +5 -5
- data/ruby/command-t/controller.rb +12 -1
- data/ruby/command-t/ext.bundle +0 -0
- data/ruby/command-t/finder/mru_buffer_finder.rb +50 -0
- data/ruby/command-t/match.c +5 -5
- data/ruby/command-t/matcher.c +13 -9
- data/ruby/command-t/mru.rb +58 -0
- data/ruby/command-t/scanner/mru_buffer_scanner.rb +48 -0
- data/ruby/command-t/stub.rb +11 -3
- data/ruby/command-t/util.rb +1 -1
- data/ruby/command-t/watchman.c +62 -28
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5ea08cbb41b53e0a6082ceb5a9742a0c5ed49ad4
|
4
|
+
data.tar.gz: 3aff58b953abcb7b3bc60b502e4ab3fc6aa27148
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 45148109bc52ac99034472a769bb7dfd9b0372fc587bda34f2a13603958acc25b2737a3da8f1ca62deed908e277936b3583245aaa3f6f38f5c102a159d7ca527
|
7
|
+
data.tar.gz: c7020d77f8466b583348b46f10a49a2c139075e181e3d54f05e1b2bab3f6f5ce9c22124cb608cc4497cebb04615b22dd2f0c4563fee5985ff1f1b983bde0679e
|
data/README.txt
CHANGED
@@ -369,18 +369,30 @@ paths which begin with the same prefix.
|
|
369
369
|
COMMANDS *command-t-commands*
|
370
370
|
|
371
371
|
*:CommandT*
|
372
|
-
|:CommandT|
|
372
|
+
|:CommandT| Brings up the Command-T file window, starting in the
|
373
373
|
current working directory as returned by the|:pwd|
|
374
374
|
command.
|
375
375
|
|
376
376
|
*:CommandTBuffer*
|
377
|
-
|:CommandTBuffer|Brings up the Command-T buffer window.
|
377
|
+
|:CommandTBuffer| Brings up the Command-T buffer window.
|
378
378
|
This works exactly like the standard file window,
|
379
379
|
except that the selection is limited to files that
|
380
380
|
you already have open in buffers.
|
381
381
|
|
382
|
+
*:CommandTMRU*
|
383
|
+
|:CommandTMRU| Brings up the Command-T buffer window, except that matches
|
384
|
+
are shown in MRU (most recently used) order. If you prefer to
|
385
|
+
use this over the normal buffer finder, I suggest overwriting
|
386
|
+
the standard mapping with a command like:
|
387
|
+
|
388
|
+
:nnoremap <silent> <leader>b :CommandTMRU<CR>
|
389
|
+
|
390
|
+
Note that Command-T only starts recording most recently used
|
391
|
+
buffers when you first use a Command-T command or mapping;
|
392
|
+
this is an optimization to improve startup time.
|
393
|
+
|
382
394
|
*:CommandTJumps*
|
383
|
-
|:CommandTJump|
|
395
|
+
|:CommandTJump| Brings up the Command-T jumplist window.
|
384
396
|
This works exactly like the standard file window,
|
385
397
|
except that the selection is limited to files that
|
386
398
|
you already have in the jumplist. Note that jumps
|
@@ -388,13 +400,13 @@ COMMANDS *command-t-commands*
|
|
388
400
|
documentation for more info).
|
389
401
|
|
390
402
|
*:CommandTTag*
|
391
|
-
|:CommandTTag|
|
403
|
+
|:CommandTTag| Brings up the Command-T window tags window, which can
|
392
404
|
be used to select from the tags, if any, returned by
|
393
405
|
Vim's |taglist()| function. See Vim's |tag| documentation
|
394
406
|
for general info on tags.
|
395
407
|
|
396
408
|
*:CommandTFlush*
|
397
|
-
|:CommandTFlush|Instructs the plug-in to flush its path cache, causing
|
409
|
+
|:CommandTFlush| Instructs the plug-in to flush its path cache, causing
|
398
410
|
the directory to be rescanned for new or deleted paths
|
399
411
|
the next time the file window is shown (pressing <C-f> when
|
400
412
|
a match listing is visible flushes the cache immediately; this
|
@@ -742,6 +754,19 @@ To disable flow control, add the following to your `.zshrc` or
|
|
742
754
|
|
743
755
|
See the `stty` man page for more details.
|
744
756
|
|
757
|
+
Why doesn't the Escape key close the match listing in terminal Vim? ~
|
758
|
+
|
759
|
+
In some terminals such as xterm the Escape key misbehaves, so Command-T
|
760
|
+
doesn't set up a mapping for it. If you want to try using the escape key
|
761
|
+
anyway, you can add something like the following to your ~/.vimrc file:
|
762
|
+
|
763
|
+
if &term =~ "xterm" || &term =~ "screen"
|
764
|
+
let g:CommandTCancelMap = ['<ESC>', '<C-c>']
|
765
|
+
endif
|
766
|
+
|
767
|
+
This configuration has worked for me with recent versions of Vim on multiple
|
768
|
+
platforms (OS X, CentOS etc).
|
769
|
+
|
745
770
|
|
746
771
|
TIPS *command-t-tips*
|
747
772
|
|
@@ -863,17 +888,18 @@ Command-T is written and maintained by Wincent Colaiuta <win@wincent.com>.
|
|
863
888
|
Other contributors that have submitted patches include (in alphabetical
|
864
889
|
order):
|
865
890
|
|
866
|
-
Andy Waite
|
867
|
-
Anthony Panozzo
|
868
|
-
Daniel Hahler
|
869
|
-
Felix Tjandrawibawa
|
870
|
-
Gary Bernhardt
|
871
|
-
Ivan Ukhov
|
872
|
-
Jeff Kreeftmeijer
|
873
|
-
Lucas de Vries
|
874
|
-
Marcus Brito
|
891
|
+
Andy Waite Nadav Samet Steven Moazami
|
892
|
+
Anthony Panozzo Nate Kane Sung Pae
|
893
|
+
Daniel Hahler Nicholas Alpi Thomas Pelletier
|
894
|
+
Felix Tjandrawibawa Noon Silk Ton van den Heuvel
|
895
|
+
Gary Bernhardt Paul Jolly Victor Hugo Borja
|
896
|
+
Ivan Ukhov Pavel Sergeev Vít Ondruch
|
897
|
+
Jeff Kreeftmeijer Rainux Luo Woody Peterson
|
898
|
+
Lucas de Vries Roland Puntaier Yan Pritzker
|
899
|
+
Marcus Brito Ross Lagerwall Yiding Jia
|
875
900
|
Marian Schubert Scott Bronson Zak Johnson
|
876
901
|
Matthew Todd Seth Fowler
|
902
|
+
Mike Lundy Shlomi Fish
|
877
903
|
|
878
904
|
As this was the first Vim plug-in I had ever written I was heavily influenced
|
879
905
|
by the design of the LustyExplorer plug-in by Stephen Bach, which I understand
|
@@ -976,6 +1002,18 @@ POSSIBILITY OF SUCH DAMAGE.
|
|
976
1002
|
|
977
1003
|
HISTORY *command-t-history*
|
978
1004
|
|
1005
|
+
1.9 (25 May 2014)
|
1006
|
+
|
1007
|
+
- improved startup time using Vim's autload mechanism (patch from Ross
|
1008
|
+
Lagerwall)
|
1009
|
+
- added MRU (most-recently-used) buffer finder (patch from Ton van den Heuvel)
|
1010
|
+
- fixed edge case in matching algorithm which could cause spurious matches
|
1011
|
+
with queries containing repeated characters
|
1012
|
+
- fixed slight positive bias in the match scoring algorithm's weighting of
|
1013
|
+
matching characters based on distance from last match
|
1014
|
+
- tune memoization in match scoring algorithm, yield a more than 10% speed
|
1015
|
+
boost
|
1016
|
+
|
979
1017
|
1.8 (31 March 2014)
|
980
1018
|
|
981
1019
|
- taught Watchman file scanner to use the binary protocol instead of JSON,
|
data/doc/command-t.txt
CHANGED
@@ -369,18 +369,30 @@ paths which begin with the same prefix.
|
|
369
369
|
COMMANDS *command-t-commands*
|
370
370
|
|
371
371
|
*:CommandT*
|
372
|
-
|:CommandT|
|
372
|
+
|:CommandT| Brings up the Command-T file window, starting in the
|
373
373
|
current working directory as returned by the|:pwd|
|
374
374
|
command.
|
375
375
|
|
376
376
|
*:CommandTBuffer*
|
377
|
-
|:CommandTBuffer|Brings up the Command-T buffer window.
|
377
|
+
|:CommandTBuffer| Brings up the Command-T buffer window.
|
378
378
|
This works exactly like the standard file window,
|
379
379
|
except that the selection is limited to files that
|
380
380
|
you already have open in buffers.
|
381
381
|
|
382
|
+
*:CommandTMRU*
|
383
|
+
|:CommandTMRU| Brings up the Command-T buffer window, except that matches
|
384
|
+
are shown in MRU (most recently used) order. If you prefer to
|
385
|
+
use this over the normal buffer finder, I suggest overwriting
|
386
|
+
the standard mapping with a command like:
|
387
|
+
|
388
|
+
:nnoremap <silent> <leader>b :CommandTMRU<CR>
|
389
|
+
|
390
|
+
Note that Command-T only starts recording most recently used
|
391
|
+
buffers when you first use a Command-T command or mapping;
|
392
|
+
this is an optimization to improve startup time.
|
393
|
+
|
382
394
|
*:CommandTJumps*
|
383
|
-
|:CommandTJump|
|
395
|
+
|:CommandTJump| Brings up the Command-T jumplist window.
|
384
396
|
This works exactly like the standard file window,
|
385
397
|
except that the selection is limited to files that
|
386
398
|
you already have in the jumplist. Note that jumps
|
@@ -388,13 +400,13 @@ COMMANDS *command-t-commands*
|
|
388
400
|
documentation for more info).
|
389
401
|
|
390
402
|
*:CommandTTag*
|
391
|
-
|:CommandTTag|
|
403
|
+
|:CommandTTag| Brings up the Command-T window tags window, which can
|
392
404
|
be used to select from the tags, if any, returned by
|
393
405
|
Vim's |taglist()| function. See Vim's |tag| documentation
|
394
406
|
for general info on tags.
|
395
407
|
|
396
408
|
*:CommandTFlush*
|
397
|
-
|:CommandTFlush|Instructs the plug-in to flush its path cache, causing
|
409
|
+
|:CommandTFlush| Instructs the plug-in to flush its path cache, causing
|
398
410
|
the directory to be rescanned for new or deleted paths
|
399
411
|
the next time the file window is shown (pressing <C-f> when
|
400
412
|
a match listing is visible flushes the cache immediately; this
|
@@ -742,6 +754,19 @@ To disable flow control, add the following to your `.zshrc` or
|
|
742
754
|
|
743
755
|
See the `stty` man page for more details.
|
744
756
|
|
757
|
+
Why doesn't the Escape key close the match listing in terminal Vim? ~
|
758
|
+
|
759
|
+
In some terminals such as xterm the Escape key misbehaves, so Command-T
|
760
|
+
doesn't set up a mapping for it. If you want to try using the escape key
|
761
|
+
anyway, you can add something like the following to your ~/.vimrc file:
|
762
|
+
|
763
|
+
if &term =~ "xterm" || &term =~ "screen"
|
764
|
+
let g:CommandTCancelMap = ['<ESC>', '<C-c>']
|
765
|
+
endif
|
766
|
+
|
767
|
+
This configuration has worked for me with recent versions of Vim on multiple
|
768
|
+
platforms (OS X, CentOS etc).
|
769
|
+
|
745
770
|
|
746
771
|
TIPS *command-t-tips*
|
747
772
|
|
@@ -863,17 +888,18 @@ Command-T is written and maintained by Wincent Colaiuta <win@wincent.com>.
|
|
863
888
|
Other contributors that have submitted patches include (in alphabetical
|
864
889
|
order):
|
865
890
|
|
866
|
-
Andy Waite
|
867
|
-
Anthony Panozzo
|
868
|
-
Daniel Hahler
|
869
|
-
Felix Tjandrawibawa
|
870
|
-
Gary Bernhardt
|
871
|
-
Ivan Ukhov
|
872
|
-
Jeff Kreeftmeijer
|
873
|
-
Lucas de Vries
|
874
|
-
Marcus Brito
|
891
|
+
Andy Waite Nadav Samet Steven Moazami
|
892
|
+
Anthony Panozzo Nate Kane Sung Pae
|
893
|
+
Daniel Hahler Nicholas Alpi Thomas Pelletier
|
894
|
+
Felix Tjandrawibawa Noon Silk Ton van den Heuvel
|
895
|
+
Gary Bernhardt Paul Jolly Victor Hugo Borja
|
896
|
+
Ivan Ukhov Pavel Sergeev Vít Ondruch
|
897
|
+
Jeff Kreeftmeijer Rainux Luo Woody Peterson
|
898
|
+
Lucas de Vries Roland Puntaier Yan Pritzker
|
899
|
+
Marcus Brito Ross Lagerwall Yiding Jia
|
875
900
|
Marian Schubert Scott Bronson Zak Johnson
|
876
901
|
Matthew Todd Seth Fowler
|
902
|
+
Mike Lundy Shlomi Fish
|
877
903
|
|
878
904
|
As this was the first Vim plug-in I had ever written I was heavily influenced
|
879
905
|
by the design of the LustyExplorer plug-in by Stephen Bach, which I understand
|
@@ -976,6 +1002,18 @@ POSSIBILITY OF SUCH DAMAGE.
|
|
976
1002
|
|
977
1003
|
HISTORY *command-t-history*
|
978
1004
|
|
1005
|
+
1.9 (25 May 2014)
|
1006
|
+
|
1007
|
+
- improved startup time using Vim's autload mechanism (patch from Ross
|
1008
|
+
Lagerwall)
|
1009
|
+
- added MRU (most-recently-used) buffer finder (patch from Ton van den Heuvel)
|
1010
|
+
- fixed edge case in matching algorithm which could cause spurious matches
|
1011
|
+
with queries containing repeated characters
|
1012
|
+
- fixed slight positive bias in the match scoring algorithm's weighting of
|
1013
|
+
matching characters based on distance from last match
|
1014
|
+
- tune memoization in match scoring algorithm, yield a more than 10% speed
|
1015
|
+
boost
|
1016
|
+
|
979
1017
|
1.8 (31 March 2014)
|
980
1018
|
|
981
1019
|
- taught Watchman file scanner to use the binary protocol instead of JSON,
|
data/doc/tags
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
:CommandTBuffer command-t.txt /*:CommandTBuffer*
|
3
3
|
:CommandTFlush command-t.txt /*:CommandTFlush*
|
4
4
|
:CommandTJumps command-t.txt /*:CommandTJumps*
|
5
|
+
:CommandTMRU command-t.txt /*:CommandTMRU*
|
5
6
|
:CommandTTag command-t.txt /*:CommandTTag*
|
6
7
|
command-t command-t.txt /*command-t*
|
7
8
|
command-t-authors command-t.txt /*command-t-authors*
|
data/plugin/command-t.vim
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
" command-t.vim
|
2
1
|
" Copyright 2010-2014 Wincent Colaiuta. All rights reserved.
|
3
2
|
"
|
4
3
|
" Redistribution and use in source and binary forms, with or without
|
@@ -27,168 +26,21 @@ if exists("g:command_t_loaded") || &cp
|
|
27
26
|
endif
|
28
27
|
let g:command_t_loaded = 1
|
29
28
|
|
30
|
-
command CommandTBuffer call
|
31
|
-
command CommandTJump call
|
32
|
-
command
|
33
|
-
command
|
34
|
-
command
|
29
|
+
command CommandTBuffer call commandt#CommandTShowBufferFinder()
|
30
|
+
command CommandTJump call commandt#CommandTShowJumpFinder()
|
31
|
+
command CommandTMRU call commandt#CommandTShowMRUFinder()
|
32
|
+
command CommandTTag call commandt#CommandTShowTagFinder()
|
33
|
+
command -nargs=? -complete=dir CommandT call commandt#CommandTShowFileFinder(<q-args>)
|
34
|
+
command CommandTFlush call commandt#CommandTFlush()
|
35
35
|
|
36
|
-
if !hasmapto(':CommandT<CR>')
|
36
|
+
if !hasmapto(':CommandT<CR>') && maparg('<Leader>t', 'n') == ''
|
37
37
|
silent! nnoremap <unique> <silent> <Leader>t :CommandT<CR>
|
38
38
|
endif
|
39
39
|
|
40
|
-
if !hasmapto(':CommandTBuffer<CR>')
|
40
|
+
if !hasmapto(':CommandTBuffer<CR>') && maparg('<Leader>b', 'n') == ''
|
41
41
|
silent! nnoremap <unique> <silent> <Leader>b :CommandTBuffer<CR>
|
42
42
|
endif
|
43
43
|
|
44
|
-
function s:CommandTRubyWarning()
|
45
|
-
echohl WarningMsg
|
46
|
-
echo "command-t.vim requires Vim to be compiled with Ruby support"
|
47
|
-
echo "For more information type: :help command-t"
|
48
|
-
echohl none
|
49
|
-
endfunction
|
50
|
-
|
51
|
-
function s:CommandTShowBufferFinder()
|
52
|
-
if has('ruby')
|
53
|
-
ruby $command_t.show_buffer_finder
|
54
|
-
else
|
55
|
-
call s:CommandTRubyWarning()
|
56
|
-
endif
|
57
|
-
endfunction
|
58
|
-
|
59
|
-
function s:CommandTShowFileFinder(arg)
|
60
|
-
if has('ruby')
|
61
|
-
ruby $command_t.show_file_finder
|
62
|
-
else
|
63
|
-
call s:CommandTRubyWarning()
|
64
|
-
endif
|
65
|
-
endfunction
|
66
|
-
|
67
|
-
function s:CommandTShowJumpFinder()
|
68
|
-
if has('ruby')
|
69
|
-
ruby $command_t.show_jump_finder
|
70
|
-
else
|
71
|
-
call s:CommandTRubyWarning()
|
72
|
-
endif
|
73
|
-
endfunction
|
74
|
-
|
75
|
-
function s:CommandTShowTagFinder()
|
76
|
-
if has('ruby')
|
77
|
-
ruby $command_t.show_tag_finder
|
78
|
-
else
|
79
|
-
call s:CommandTRubyWarning()
|
80
|
-
endif
|
81
|
-
endfunction
|
82
|
-
|
83
|
-
function s:CommandTFlush()
|
84
|
-
if has('ruby')
|
85
|
-
ruby $command_t.flush
|
86
|
-
else
|
87
|
-
call s:CommandTRubyWarning()
|
88
|
-
endif
|
89
|
-
endfunction
|
90
|
-
|
91
44
|
if !has('ruby')
|
92
45
|
finish
|
93
46
|
endif
|
94
|
-
|
95
|
-
function CommandTListMatches()
|
96
|
-
ruby $command_t.list_matches
|
97
|
-
endfunction
|
98
|
-
|
99
|
-
function CommandTHandleKey(arg)
|
100
|
-
ruby $command_t.handle_key
|
101
|
-
endfunction
|
102
|
-
|
103
|
-
function CommandTBackspace()
|
104
|
-
ruby $command_t.backspace
|
105
|
-
endfunction
|
106
|
-
|
107
|
-
function CommandTDelete()
|
108
|
-
ruby $command_t.delete
|
109
|
-
endfunction
|
110
|
-
|
111
|
-
function CommandTAcceptSelection()
|
112
|
-
ruby $command_t.accept_selection
|
113
|
-
endfunction
|
114
|
-
|
115
|
-
function CommandTAcceptSelectionTab()
|
116
|
-
ruby $command_t.accept_selection :command => 'tabe'
|
117
|
-
endfunction
|
118
|
-
|
119
|
-
function CommandTAcceptSelectionSplit()
|
120
|
-
ruby $command_t.accept_selection :command => 'sp'
|
121
|
-
endfunction
|
122
|
-
|
123
|
-
function CommandTAcceptSelectionVSplit()
|
124
|
-
ruby $command_t.accept_selection :command => 'vs'
|
125
|
-
endfunction
|
126
|
-
|
127
|
-
function CommandTQuickfix()
|
128
|
-
ruby $command_t.quickfix
|
129
|
-
endfunction
|
130
|
-
|
131
|
-
function CommandTRefresh()
|
132
|
-
ruby $command_t.refresh
|
133
|
-
endfunction
|
134
|
-
|
135
|
-
function CommandTToggleFocus()
|
136
|
-
ruby $command_t.toggle_focus
|
137
|
-
endfunction
|
138
|
-
|
139
|
-
function CommandTCancel()
|
140
|
-
ruby $command_t.cancel
|
141
|
-
endfunction
|
142
|
-
|
143
|
-
function CommandTSelectNext()
|
144
|
-
ruby $command_t.select_next
|
145
|
-
endfunction
|
146
|
-
|
147
|
-
function CommandTSelectPrev()
|
148
|
-
ruby $command_t.select_prev
|
149
|
-
endfunction
|
150
|
-
|
151
|
-
function CommandTClear()
|
152
|
-
ruby $command_t.clear
|
153
|
-
endfunction
|
154
|
-
|
155
|
-
function CommandTCursorLeft()
|
156
|
-
ruby $command_t.cursor_left
|
157
|
-
endfunction
|
158
|
-
|
159
|
-
function CommandTCursorRight()
|
160
|
-
ruby $command_t.cursor_right
|
161
|
-
endfunction
|
162
|
-
|
163
|
-
function CommandTCursorEnd()
|
164
|
-
ruby $command_t.cursor_end
|
165
|
-
endfunction
|
166
|
-
|
167
|
-
function CommandTCursorStart()
|
168
|
-
ruby $command_t.cursor_start
|
169
|
-
endfunction
|
170
|
-
|
171
|
-
ruby << EOF
|
172
|
-
# require Ruby files
|
173
|
-
begin
|
174
|
-
# prepare controller
|
175
|
-
require 'command-t/vim'
|
176
|
-
require 'command-t/controller'
|
177
|
-
$command_t = CommandT::Controller.new
|
178
|
-
rescue LoadError
|
179
|
-
load_path_modified = false
|
180
|
-
::VIM::evaluate('&runtimepath').to_s.split(',').each do |path|
|
181
|
-
lib = "#{path}/ruby"
|
182
|
-
if !$LOAD_PATH.include?(lib) and File.exist?(lib)
|
183
|
-
$LOAD_PATH << lib
|
184
|
-
load_path_modified = true
|
185
|
-
end
|
186
|
-
end
|
187
|
-
retry if load_path_modified
|
188
|
-
|
189
|
-
# could get here if C extension was not compiled, or was compiled
|
190
|
-
# for the wrong architecture or Ruby version
|
191
|
-
require 'command-t/stub'
|
192
|
-
$command_t = CommandT::Stub.new
|
193
|
-
end
|
194
|
-
EOF
|
data/ruby/command-t/Makefile
CHANGED
@@ -11,12 +11,12 @@ ECHO = $(ECHO1:0=@echo)
|
|
11
11
|
#### Start of system configuration section. ####
|
12
12
|
|
13
13
|
srcdir = .
|
14
|
-
topdir = /Users/glh/.rbenv/versions/2.0.0-
|
14
|
+
topdir = /Users/glh/.rbenv/versions/2.0.0-p451/include/ruby-2.0.0
|
15
15
|
hdrdir = $(topdir)
|
16
|
-
arch_hdrdir = /Users/glh/.rbenv/versions/2.0.0-
|
16
|
+
arch_hdrdir = /Users/glh/.rbenv/versions/2.0.0-p451/include/ruby-2.0.0/x86_64-darwin13.1.0
|
17
17
|
PATH_SEPARATOR = :
|
18
18
|
VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby
|
19
|
-
prefix = /Users/glh/.rbenv/versions/2.0.0-
|
19
|
+
prefix = /Users/glh/.rbenv/versions/2.0.0-p451
|
20
20
|
rubysitearchprefix = $(rubylibprefix)/$(sitearch)
|
21
21
|
rubyarchprefix = $(rubylibprefix)/$(arch)
|
22
22
|
rubylibprefix = $(libdir)/$(RUBY_BASE_NAME)
|
@@ -81,9 +81,9 @@ CCDLFLAGS = -fno-common
|
|
81
81
|
CFLAGS = $(CCDLFLAGS) -O3 -Wno-error=shorten-64-to-32 -pipe $(ARCH_FLAG)
|
82
82
|
INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir)
|
83
83
|
DEFS = -DWATCHMAN_BUILD
|
84
|
-
CPPFLAGS = -DHAVE_FCNTL_H -DHAVE_SYS_ERRNO_H -DHAVE_SYS_SOCKET_H -DHAVE_RUBY_ST_H -DHAVE_ST_H -I/Users/glh/.rbenv/versions/2.0.0-
|
84
|
+
CPPFLAGS = -DHAVE_FCNTL_H -DHAVE_SYS_ERRNO_H -DHAVE_SYS_SOCKET_H -DHAVE_RUBY_ST_H -DHAVE_ST_H -I/Users/glh/.rbenv/versions/2.0.0-p451/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT $(DEFS) $(cppflags)
|
85
85
|
CXXFLAGS = $(CCDLFLAGS) $(cxxflags) $(ARCH_FLAG)
|
86
|
-
ldflags = -L. -L/Users/glh/.rbenv/versions/2.0.0-
|
86
|
+
ldflags = -L. -L/Users/glh/.rbenv/versions/2.0.0-p451/lib
|
87
87
|
dldflags = -Wl,-undefined,dynamic_lookup -Wl,-multiply_defined,suppress
|
88
88
|
ARCH_FLAG =
|
89
89
|
DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG)
|
@@ -24,6 +24,7 @@
|
|
24
24
|
require 'command-t/finder/buffer_finder'
|
25
25
|
require 'command-t/finder/jump_finder'
|
26
26
|
require 'command-t/finder/file_finder'
|
27
|
+
require 'command-t/finder/mru_buffer_finder'
|
27
28
|
require 'command-t/finder/tag_finder'
|
28
29
|
require 'command-t/match_window'
|
29
30
|
require 'command-t/prompt'
|
@@ -50,6 +51,12 @@ module CommandT
|
|
50
51
|
show
|
51
52
|
end
|
52
53
|
|
54
|
+
def show_mru_finder
|
55
|
+
@path = VIM::pwd
|
56
|
+
@active_finder = mru_finder
|
57
|
+
show
|
58
|
+
end
|
59
|
+
|
53
60
|
def show_tag_finder
|
54
61
|
@path = VIM::pwd
|
55
62
|
@active_finder = tag_finder
|
@@ -372,6 +379,10 @@ module CommandT
|
|
372
379
|
@buffer_finder ||= CommandT::BufferFinder.new
|
373
380
|
end
|
374
381
|
|
382
|
+
def mru_finder
|
383
|
+
@mru_finder ||= CommandT::MRUBufferFinder.new
|
384
|
+
end
|
385
|
+
|
375
386
|
def file_finder
|
376
387
|
@file_finder ||= CommandT::FileFinder.new nil,
|
377
388
|
:max_depth => get_number('g:CommandTMaxDepth'),
|
@@ -393,4 +404,4 @@ module CommandT
|
|
393
404
|
:include_filenames => get_bool('g:CommandTTagIncludeFilenames')
|
394
405
|
end
|
395
406
|
end # class Controller
|
396
|
-
end # module
|
407
|
+
end # module CommandT
|
data/ruby/command-t/ext.bundle
CHANGED
Binary file
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# Copyright 2014 Wincent Colaiuta. All rights reserved.
|
2
|
+
#
|
3
|
+
# Redistribution and use in source and binary forms, with or without
|
4
|
+
# modification, are permitted provided that the following conditions are met:
|
5
|
+
#
|
6
|
+
# 1. Redistributions of source code must retain the above copyright notice,
|
7
|
+
# this list of conditions and the following disclaimer.
|
8
|
+
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
9
|
+
# this list of conditions and the following disclaimer in the documentation
|
10
|
+
# and/or other materials provided with the distribution.
|
11
|
+
#
|
12
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
13
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
14
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
15
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
|
16
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
17
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
18
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
19
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
20
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
21
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
22
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
23
|
+
|
24
|
+
require 'command-t/ext' # CommandT::Matcher
|
25
|
+
require 'command-t/scanner/mru_buffer_scanner'
|
26
|
+
require 'command-t/finder/buffer_finder'
|
27
|
+
|
28
|
+
module CommandT
|
29
|
+
class MRUBufferFinder < BufferFinder
|
30
|
+
# Override sorted_matches_for to prevent MRU ordered matches from being
|
31
|
+
# ordered alphabetically.
|
32
|
+
def sorted_matches_for str, options = {}
|
33
|
+
matches = super(str, options.merge(:sort => false))
|
34
|
+
|
35
|
+
# take current buffer (by definition, the most recently used) and move it
|
36
|
+
# to the end of the results
|
37
|
+
if MRU.stack.last &&
|
38
|
+
relative_path_under_working_directory(MRU.stack.last.name) == matches.first
|
39
|
+
matches[1..-1] + [matches.first]
|
40
|
+
else
|
41
|
+
matches
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def initialize
|
46
|
+
@scanner = MRUBufferScanner.new
|
47
|
+
@matcher = Matcher.new @scanner, :always_show_dot_files => true
|
48
|
+
end
|
49
|
+
end # class MRUBufferFinder
|
50
|
+
end # CommandT
|
data/ruby/command-t/match.c
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
// Copyright 2010-
|
1
|
+
// Copyright 2010-2014 Wincent Colaiuta. All rights reserved.
|
2
2
|
//
|
3
3
|
// Redistribution and use in source and binary forms, with or without
|
4
4
|
// modification, are permitted provided that the following conditions are met:
|
@@ -51,9 +51,10 @@ double recursive_match(matchinfo_t *m, // sharable meta-data
|
|
51
51
|
long i, j, distance;
|
52
52
|
int found;
|
53
53
|
double score_for_char;
|
54
|
+
long memo_idx = haystack_idx;
|
54
55
|
|
55
56
|
// do we have a memoized result we can return?
|
56
|
-
double memoized = m->memo[needle_idx * m->needle_len +
|
57
|
+
double memoized = m->memo[needle_idx * m->needle_len + memo_idx];
|
57
58
|
if (memoized != DBL_MAX)
|
58
59
|
return memoized;
|
59
60
|
|
@@ -125,11 +126,10 @@ double recursive_match(matchinfo_t *m, // sharable meta-data
|
|
125
126
|
}
|
126
127
|
|
127
128
|
score += score_for_char;
|
128
|
-
last_idx = haystack_idx
|
129
|
+
last_idx = haystack_idx++;
|
129
130
|
break;
|
130
131
|
}
|
131
132
|
}
|
132
|
-
|
133
133
|
if (!found) {
|
134
134
|
score = 0.0;
|
135
135
|
goto memoize;
|
@@ -145,7 +145,7 @@ double recursive_match(matchinfo_t *m, // sharable meta-data
|
|
145
145
|
score = score > seen_score ? score : seen_score;
|
146
146
|
|
147
147
|
memoize:
|
148
|
-
m->memo[needle_idx * m->needle_len +
|
148
|
+
m->memo[needle_idx * m->needle_len + memo_idx] = score;
|
149
149
|
return score;
|
150
150
|
}
|
151
151
|
|
data/ruby/command-t/matcher.c
CHANGED
@@ -127,12 +127,12 @@ void *match_thread(void *thread_args)
|
|
127
127
|
return NULL;
|
128
128
|
}
|
129
129
|
|
130
|
-
|
131
130
|
VALUE CommandTMatcher_sorted_matches_for(int argc, VALUE *argv, VALUE self)
|
132
131
|
{
|
133
132
|
long i, limit, path_count, thread_count;
|
134
133
|
#ifdef HAVE_PTHREAD_H
|
135
134
|
long err;
|
135
|
+
pthread_t *threads;
|
136
136
|
#endif
|
137
137
|
match_t *matches;
|
138
138
|
thread_args_t *thread_args;
|
@@ -144,6 +144,7 @@ VALUE CommandTMatcher_sorted_matches_for(int argc, VALUE *argv, VALUE self)
|
|
144
144
|
VALUE paths;
|
145
145
|
VALUE results;
|
146
146
|
VALUE scanner;
|
147
|
+
VALUE sort_option;
|
147
148
|
VALUE threads_option;
|
148
149
|
|
149
150
|
// process arguments: 1 mandatory, 1 optional
|
@@ -158,6 +159,7 @@ VALUE CommandTMatcher_sorted_matches_for(int argc, VALUE *argv, VALUE self)
|
|
158
159
|
// check optional options has for overrides
|
159
160
|
limit_option = CommandT_option_from_hash("limit", options);
|
160
161
|
threads_option = CommandT_option_from_hash("threads", options);
|
162
|
+
sort_option = CommandT_option_from_hash("sort", options);
|
161
163
|
|
162
164
|
// get unsorted matches
|
163
165
|
scanner = rb_iv_get(self, "@scanner");
|
@@ -176,7 +178,7 @@ VALUE CommandTMatcher_sorted_matches_for(int argc, VALUE *argv, VALUE self)
|
|
176
178
|
#define THREAD_THRESHOLD 1000 /* avoid the overhead of threading when search space is small */
|
177
179
|
if (path_count < THREAD_THRESHOLD)
|
178
180
|
thread_count = 1;
|
179
|
-
|
181
|
+
threads = malloc(sizeof(pthread_t) * thread_count);
|
180
182
|
if (!threads)
|
181
183
|
rb_raise(rb_eNoMemError, "memory allocation failed");
|
182
184
|
#endif
|
@@ -217,13 +219,15 @@ VALUE CommandTMatcher_sorted_matches_for(int argc, VALUE *argv, VALUE self)
|
|
217
219
|
free(threads);
|
218
220
|
#endif
|
219
221
|
|
220
|
-
if (
|
221
|
-
(RSTRING_LEN(abbrev) ==
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
222
|
+
if (NIL_P(sort_option) || sort_option == Qtrue) {
|
223
|
+
if (RSTRING_LEN(abbrev) == 0 ||
|
224
|
+
(RSTRING_LEN(abbrev) == 1 && RSTRING_PTR(abbrev)[0] == '.'))
|
225
|
+
// alphabetic order if search string is only "" or "."
|
226
|
+
qsort(matches, path_count, sizeof(match_t), cmp_alpha);
|
227
|
+
else
|
228
|
+
// for all other non-empty search strings, sort by score
|
229
|
+
qsort(matches, path_count, sizeof(match_t), cmp_score);
|
230
|
+
}
|
227
231
|
|
228
232
|
results = rb_ary_new();
|
229
233
|
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# Copyright 2014 Wincent Colaiuta. All rights reserved.
|
2
|
+
#
|
3
|
+
# Redistribution and use in source and binary forms, with or without
|
4
|
+
# modification, are permitted provided that the following conditions are met:
|
5
|
+
#
|
6
|
+
# 1. Redistributions of source code must retain the above copyright notice,
|
7
|
+
# this list of conditions and the following disclaimer.
|
8
|
+
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
9
|
+
# this list of conditions and the following disclaimer in the documentation
|
10
|
+
# and/or other materials provided with the distribution.
|
11
|
+
#
|
12
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
13
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
14
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
15
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
|
16
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
17
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
18
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
19
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
20
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
21
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
22
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
23
|
+
|
24
|
+
module CommandT
|
25
|
+
# Maintains a stack of seen buffers in MRU (most recently used) order.
|
26
|
+
module MRU
|
27
|
+
class << self
|
28
|
+
# The stack of used buffers in MRU order.
|
29
|
+
def stack
|
30
|
+
@stack ||= []
|
31
|
+
end
|
32
|
+
|
33
|
+
# Mark the current buffer as having been used, effectively moving it to
|
34
|
+
# the top of the stack.
|
35
|
+
def touch
|
36
|
+
return unless ::VIM::evaluate('buflisted(%d)' % $curbuf.number) == 1
|
37
|
+
return unless $curbuf.name
|
38
|
+
|
39
|
+
stack.delete $curbuf
|
40
|
+
stack.push $curbuf
|
41
|
+
end
|
42
|
+
|
43
|
+
# Mark a buffer as deleted, removing it from the stack.
|
44
|
+
def delete
|
45
|
+
# Note that $curbuf does not point to the buffer that is being deleted;
|
46
|
+
# we need to use Vim's <abuf> for the correct buffer number.
|
47
|
+
stack.delete_if do |b|
|
48
|
+
b.number == ::VIM::evaluate('expand("<abuf>")').to_i
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# Returns `true` if `buffer` has been used (ie. is present in the stack).
|
53
|
+
def used?(buffer)
|
54
|
+
stack.include?(buffer)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end # module MRU
|
58
|
+
end # module CommandT
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# Copyright 2014 Wincent Colaiuta. All rights reserved.
|
2
|
+
#
|
3
|
+
# Redistribution and use in source and binary forms, with or without
|
4
|
+
# modification, are permitted provided that the following conditions are met:
|
5
|
+
#
|
6
|
+
# 1. Redistributions of source code must retain the above copyright notice,
|
7
|
+
# this list of conditions and the following disclaimer.
|
8
|
+
# 2. Redistributions in binary form must reproduce the above copyright notice,
|
9
|
+
# this list of conditions and the following disclaimer in the documentation
|
10
|
+
# and/or other materials provided with the distribution.
|
11
|
+
#
|
12
|
+
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
13
|
+
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
14
|
+
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
15
|
+
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
|
16
|
+
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
17
|
+
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
18
|
+
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
19
|
+
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
20
|
+
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
21
|
+
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
22
|
+
# POSSIBILITY OF SUCH DAMAGE.
|
23
|
+
|
24
|
+
require 'command-t/vim/path_utilities'
|
25
|
+
require 'command-t/scanner/buffer_scanner'
|
26
|
+
|
27
|
+
module CommandT
|
28
|
+
# Returns a list of all open buffers, sorted in MRU order.
|
29
|
+
class MRUBufferScanner < BufferScanner
|
30
|
+
include VIM::PathUtilities
|
31
|
+
|
32
|
+
def paths
|
33
|
+
# Collect all buffers that have not been used yet.
|
34
|
+
unused_buffers = (0..(::VIM::Buffer.count - 1)).map do |n|
|
35
|
+
buffer = ::VIM::Buffer[n]
|
36
|
+
buffer if buffer.name && !MRU.used?(buffer)
|
37
|
+
end
|
38
|
+
|
39
|
+
# Combine all most recently used buffers and all unused buffers, and
|
40
|
+
# return all listed buffer paths.
|
41
|
+
(unused_buffers + MRU.stack).map do |buffer|
|
42
|
+
if buffer && buffer.name
|
43
|
+
relative_path_under_working_directory buffer.name
|
44
|
+
end
|
45
|
+
end.compact.reverse
|
46
|
+
end
|
47
|
+
end # class MRUBufferScanner
|
48
|
+
end # module CommandT
|
data/ruby/command-t/stub.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2010-
|
1
|
+
# Copyright 2010-2014 Wincent Colaiuta. All rights reserved.
|
2
2
|
#
|
3
3
|
# Redistribution and use in source and binary forms, with or without
|
4
4
|
# modification, are permitted provided that the following conditions are met:
|
@@ -25,10 +25,18 @@ module CommandT
|
|
25
25
|
class Stub
|
26
26
|
@@load_error = ['command-t.vim could not load the C extension',
|
27
27
|
'Please see INSTALLATION and TROUBLE-SHOOTING in the help',
|
28
|
+
"Vim Ruby version: #{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}",
|
28
29
|
'For more information type: :help command-t']
|
29
30
|
|
30
|
-
[
|
31
|
-
|
31
|
+
[
|
32
|
+
:flush,
|
33
|
+
:show_buffer_finder,
|
34
|
+
:show_file_finder,
|
35
|
+
:show_jump_finder,
|
36
|
+
:show_mru_finder,
|
37
|
+
:show_tag_finder
|
38
|
+
].each do |method|
|
39
|
+
define_method(method) { warn *@@load_error }
|
32
40
|
end
|
33
41
|
|
34
42
|
private
|
data/ruby/command-t/util.rb
CHANGED
data/ruby/command-t/watchman.c
CHANGED
@@ -297,6 +297,8 @@ int64_t watchman_load_int(char **ptr, char *end) {
|
|
297
297
|
* starting at `ptr` and finishing at or before `end`
|
298
298
|
*/
|
299
299
|
VALUE watchman_load_string(char **ptr, char *end) {
|
300
|
+
int64_t len;
|
301
|
+
VALUE string;
|
300
302
|
if (*ptr >= end) {
|
301
303
|
rb_raise(rb_eArgError, "unexpected end of input");
|
302
304
|
}
|
@@ -310,14 +312,14 @@ VALUE watchman_load_string(char **ptr, char *end) {
|
|
310
312
|
rb_raise(rb_eArgError, "invalid string header");
|
311
313
|
}
|
312
314
|
|
313
|
-
|
315
|
+
len = watchman_load_int(ptr, end);
|
314
316
|
if (len == 0) { // special case for zero-length strings
|
315
317
|
return rb_str_new2("");
|
316
318
|
} else if (*ptr + len > end) {
|
317
319
|
rb_raise(rb_eArgError, "insufficient string storage");
|
318
320
|
}
|
319
321
|
|
320
|
-
|
322
|
+
string = rb_str_new(*ptr, len);
|
321
323
|
*ptr += len;
|
322
324
|
return string;
|
323
325
|
}
|
@@ -327,11 +329,12 @@ VALUE watchman_load_string(char **ptr, char *end) {
|
|
327
329
|
* starting at `ptr` and finishing at or before `end`
|
328
330
|
*/
|
329
331
|
double watchman_load_double(char **ptr, char *end) {
|
332
|
+
double val;
|
330
333
|
*ptr += sizeof(int8_t); // caller has already verified the marker
|
331
334
|
if (*ptr + sizeof(double) > end) {
|
332
335
|
rb_raise(rb_eArgError, "insufficient double storage");
|
333
336
|
}
|
334
|
-
|
337
|
+
val = *(double *)*ptr;
|
335
338
|
*ptr += sizeof(double);
|
336
339
|
return val;
|
337
340
|
}
|
@@ -496,10 +499,14 @@ VALUE watchman_load(char **ptr, char *end) {
|
|
496
499
|
* format into a normal Ruby object.
|
497
500
|
*/
|
498
501
|
VALUE CommandTWatchmanUtils_load(VALUE self, VALUE serialized) {
|
502
|
+
char *ptr, *end;
|
503
|
+
long len;
|
504
|
+
uint64_t payload_size;
|
505
|
+
VALUE loaded;
|
499
506
|
serialized = StringValue(serialized);
|
500
|
-
|
501
|
-
|
502
|
-
|
507
|
+
len = RSTRING_LEN(serialized);
|
508
|
+
ptr = RSTRING_PTR(serialized);
|
509
|
+
end = ptr + len;
|
503
510
|
|
504
511
|
// expect at least the binary marker and a int8_t length counter
|
505
512
|
if ((size_t)len < sizeof(WATCHMAN_BINARY_MARKER) - 1 + sizeof(int8_t) * 2) {
|
@@ -512,21 +519,29 @@ VALUE CommandTWatchmanUtils_load(VALUE self, VALUE serialized) {
|
|
512
519
|
|
513
520
|
// get size marker
|
514
521
|
ptr += sizeof(WATCHMAN_BINARY_MARKER) - 1;
|
515
|
-
|
522
|
+
payload_size = watchman_load_int(&ptr, end);
|
516
523
|
if (!payload_size) {
|
517
524
|
rb_raise(rb_eArgError, "empty payload");
|
518
525
|
}
|
519
526
|
|
520
527
|
// sanity check length
|
521
528
|
if (ptr + payload_size != end) {
|
522
|
-
rb_raise(
|
529
|
+
rb_raise(
|
530
|
+
rb_eArgError,
|
531
|
+
"payload size mismatch (%lu)",
|
532
|
+
(unsigned long)(end - (ptr + payload_size))
|
533
|
+
);
|
523
534
|
}
|
524
535
|
|
525
|
-
|
536
|
+
loaded = watchman_load(&ptr, end);
|
526
537
|
|
527
538
|
// one more sanity check
|
528
539
|
if (ptr != end) {
|
529
|
-
rb_raise(
|
540
|
+
rb_raise(
|
541
|
+
rb_eArgError,
|
542
|
+
"payload termination mismatch (%lu)",
|
543
|
+
(unsigned long)(end - ptr)
|
544
|
+
);
|
530
545
|
}
|
531
546
|
|
532
547
|
return loaded;
|
@@ -542,15 +557,17 @@ VALUE CommandTWatchmanUtils_load(VALUE self, VALUE serialized) {
|
|
542
557
|
* (integers, floats), booleans, and nil.
|
543
558
|
*/
|
544
559
|
VALUE CommandTWatchmanUtils_dump(VALUE self, VALUE serializable) {
|
560
|
+
uint64_t *len;
|
561
|
+
VALUE serialized;
|
545
562
|
watchman_t *w = watchman_init();
|
546
563
|
watchman_dump(w, serializable);
|
547
564
|
|
548
565
|
// update header with final length information
|
549
|
-
|
566
|
+
len = (uint64_t *)(w->data + sizeof(WATCHMAN_HEADER) - sizeof(uint64_t) - 1);
|
550
567
|
*len = w->len - sizeof(WATCHMAN_HEADER) + 1;
|
551
568
|
|
552
569
|
// prepare final return value
|
553
|
-
|
570
|
+
serialized = rb_str_buf_new(w->len);
|
554
571
|
rb_str_buf_cat(serialized, (const char*)w->data, w->len);
|
555
572
|
watchman_free(w);
|
556
573
|
return serialized;
|
@@ -582,18 +599,29 @@ void watchman_raise_system_call_error(int number) {
|
|
582
599
|
* returns the result.
|
583
600
|
*/
|
584
601
|
VALUE CommandTWatchmanUtils_query(VALUE self, VALUE query, VALUE socket) {
|
585
|
-
|
602
|
+
char *payload;
|
603
|
+
int fileno, flags;
|
604
|
+
int8_t peek[WATCHMAN_PEEK_BUFFER_SIZE];
|
605
|
+
int8_t sizes[] = { 0, 0, 0, 1, 2, 4, 8 };
|
606
|
+
int8_t sizes_idx;
|
607
|
+
int8_t *pdu_size_ptr;
|
608
|
+
int64_t payload_size;
|
609
|
+
long query_len;
|
610
|
+
ssize_t peek_size, sent, received;
|
611
|
+
void *buffer;
|
612
|
+
VALUE loaded, serialized;
|
613
|
+
fileno = NUM2INT(rb_funcall(socket, rb_intern("fileno"), 0));
|
586
614
|
|
587
615
|
// do blocking I/O to simplify the following logic
|
588
|
-
|
616
|
+
flags = fcntl(fileno, F_GETFL);
|
589
617
|
if (fcntl(fileno, F_SETFL, flags & ~O_NONBLOCK) == -1) {
|
590
618
|
rb_raise(rb_eRuntimeError, "unable to clear O_NONBLOCK flag");
|
591
619
|
}
|
592
620
|
|
593
621
|
// send the message
|
594
|
-
|
595
|
-
|
596
|
-
|
622
|
+
serialized = CommandTWatchmanUtils_dump(self, query);
|
623
|
+
query_len = RSTRING_LEN(serialized);
|
624
|
+
sent = send(fileno, RSTRING_PTR(serialized), query_len, 0);
|
597
625
|
if (sent == -1) {
|
598
626
|
watchman_raise_system_call_error(errno);
|
599
627
|
} else if (sent != query_len) {
|
@@ -602,8 +630,7 @@ VALUE CommandTWatchmanUtils_query(VALUE self, VALUE query, VALUE socket) {
|
|
602
630
|
}
|
603
631
|
|
604
632
|
// sniff to see how large the header is
|
605
|
-
|
606
|
-
ssize_t received = recv(fileno, peek, WATCHMAN_SNIFF_BUFFER_SIZE, MSG_PEEK | MSG_WAITALL);
|
633
|
+
received = recv(fileno, peek, WATCHMAN_SNIFF_BUFFER_SIZE, MSG_PEEK | MSG_WAITALL);
|
607
634
|
if (received == -1) {
|
608
635
|
watchman_raise_system_call_error(errno);
|
609
636
|
} else if (received != WATCHMAN_SNIFF_BUFFER_SIZE) {
|
@@ -611,9 +638,12 @@ VALUE CommandTWatchmanUtils_query(VALUE self, VALUE query, VALUE socket) {
|
|
611
638
|
}
|
612
639
|
|
613
640
|
// peek at size of PDU
|
614
|
-
|
615
|
-
|
616
|
-
|
641
|
+
sizes_idx = peek[sizeof(WATCHMAN_BINARY_MARKER) - 1];
|
642
|
+
if (sizes_idx < WATCHMAN_INT8_MARKER || sizes_idx > WATCHMAN_INT64_MARKER) {
|
643
|
+
rb_raise(rb_eRuntimeError, "bad PDU size marker");
|
644
|
+
}
|
645
|
+
peek_size = sizeof(WATCHMAN_BINARY_MARKER) - 1 + sizeof(int8_t) +
|
646
|
+
sizes[sizes_idx];
|
617
647
|
|
618
648
|
received = recv(fileno, peek, peek_size, MSG_PEEK);
|
619
649
|
if (received == -1) {
|
@@ -621,15 +651,19 @@ VALUE CommandTWatchmanUtils_query(VALUE self, VALUE query, VALUE socket) {
|
|
621
651
|
} else if (received != peek_size) {
|
622
652
|
rb_raise(rb_eRuntimeError, "failed to peek at PDU header");
|
623
653
|
}
|
624
|
-
|
625
|
-
|
654
|
+
pdu_size_ptr = peek + sizeof(WATCHMAN_BINARY_MARKER) - sizeof(int8_t);
|
655
|
+
payload_size =
|
626
656
|
peek_size +
|
627
657
|
watchman_load_int((char **)&pdu_size_ptr, (char *)peek + peek_size);
|
628
658
|
|
629
659
|
// actually read the PDU
|
630
|
-
|
660
|
+
buffer = xmalloc(payload_size);
|
631
661
|
if (!buffer) {
|
632
|
-
rb_raise(
|
662
|
+
rb_raise(
|
663
|
+
rb_eNoMemError,
|
664
|
+
"failed to allocate %lld bytes",
|
665
|
+
(long long int)payload_size
|
666
|
+
);
|
633
667
|
}
|
634
668
|
received = recv(fileno, buffer, payload_size, MSG_WAITALL);
|
635
669
|
if (received == -1) {
|
@@ -637,8 +671,8 @@ VALUE CommandTWatchmanUtils_query(VALUE self, VALUE query, VALUE socket) {
|
|
637
671
|
} else if (received != payload_size) {
|
638
672
|
rb_raise(rb_eRuntimeError, "failed to load PDU");
|
639
673
|
}
|
640
|
-
|
641
|
-
|
674
|
+
payload = (char *)buffer + peek_size;
|
675
|
+
loaded = watchman_load(&payload, payload + payload_size);
|
642
676
|
free(buffer);
|
643
677
|
return loaded;
|
644
678
|
}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: command-t
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '1.
|
4
|
+
version: '1.9'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Wincent Colaiuta
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-05-25 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |2
|
14
14
|
Command-T provides a fast, intuitive mechanism for opening files with a
|
@@ -34,6 +34,7 @@ files:
|
|
34
34
|
- ruby/command-t/finder/buffer_finder.rb
|
35
35
|
- ruby/command-t/finder/file_finder.rb
|
36
36
|
- ruby/command-t/finder/jump_finder.rb
|
37
|
+
- ruby/command-t/finder/mru_buffer_finder.rb
|
37
38
|
- ruby/command-t/finder/tag_finder.rb
|
38
39
|
- ruby/command-t/finder.rb
|
39
40
|
- ruby/command-t/Makefile
|
@@ -42,6 +43,7 @@ files:
|
|
42
43
|
- ruby/command-t/match_window.rb
|
43
44
|
- ruby/command-t/matcher.c
|
44
45
|
- ruby/command-t/matcher.h
|
46
|
+
- ruby/command-t/mru.rb
|
45
47
|
- ruby/command-t/prompt.rb
|
46
48
|
- ruby/command-t/ruby_compat.h
|
47
49
|
- ruby/command-t/scanner/buffer_scanner.rb
|
@@ -50,6 +52,7 @@ files:
|
|
50
52
|
- ruby/command-t/scanner/file_scanner/watchman_file_scanner.rb
|
51
53
|
- ruby/command-t/scanner/file_scanner.rb
|
52
54
|
- ruby/command-t/scanner/jump_scanner.rb
|
55
|
+
- ruby/command-t/scanner/mru_buffer_scanner.rb
|
53
56
|
- ruby/command-t/scanner/tag_scanner.rb
|
54
57
|
- ruby/command-t/scanner.rb
|
55
58
|
- ruby/command-t/settings.rb
|
@@ -83,7 +86,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
83
86
|
version: '0'
|
84
87
|
requirements: []
|
85
88
|
rubyforge_project:
|
86
|
-
rubygems_version: 2.0.
|
89
|
+
rubygems_version: 2.0.14
|
87
90
|
signing_key:
|
88
91
|
specification_version: 4
|
89
92
|
summary: The Command-T plug-in for VIM.
|