我正在尝试制作一个可以帮助我选择正确版本的代码段
通过读取所有迁移文件来进行迁移的编号
application/migrations
。
我自己设法做的是我的文件名正在被过滤 键入,当只剩下一个匹配时,在光标处插入其修订号 位置(始终是文件名的前14个字符)。
问题在于,当我点击TAB选择时,我也留下了我所拥有的东西
到目前为止键入以搜索该修订号,意思是这样的
remo20160812110447
。
问题是,在这种情况下如何摆脱remo
!
注意:示例使用硬编码值,以便于测试,这些将在以后进行
由# lst = os.listdir('application/migrations')
行替换。
另外一个额外的奖励效果是将这些20160710171947
值表示为
选择时人类可读的日期格式,但在点击TAB后插入它们
原始源版本。
global !p
import datetime
def complete(t, opts):
if t:
opts = [ m for m in opts if t in m ]
if len(opts) == 1:
return opts[0][:14]
return "(" + '|'.join(opts) + ')'
endglobal
snippet cimigration "Inserts desired migration number, obtained via filenames"
$1`!p import os
# lst = os.listdir('application/migrations')
lst = [
'20160710171947_create.php',
'20160810112347_delete.php',
'20160812110447_remove.php'
]
snip.rv = complete(t[1], lst)`
endsnippet
答案 0 :(得分:1)
这绝对可以在纯vimscript中执行。
这是一个工作原型。它确实有效,但在可移植性方面存在一些问题:全局变量,依赖iskeyword
并使用两个键绑定而不是一个。但它在一个小时左右就被放在一起了:
set iskeyword=@,48-57,_,-,.,192-255
let g:wordidx = 0
let g:word = ''
let g:match = 0
function! Suggest()
let l:glob = globpath('application/migrations', '*.php')
let l:files = map(split(l:glob), 'fnamemodify(v:val, ":t")')
let l:char = getline('.')[col('.')-1]
let l:word = ''
let l:suggestions = []
if l:char =~# '[a-zA-Z0-9_]'
if g:word ==# ''
let g:word = expand('<cword>')
let g:match = matchadd('ErrorMsg', g:word)
endif
let l:word = g:word
"let l:reg = '^' . l:word
let l:suggestions = filter(l:files, 'v:val =~ l:word')
if !empty(l:suggestions)
call add(l:suggestions, l:word)
"echo l:suggestions
let l:change = l:suggestions[g:wordidx]
let g:wordidx = (g:wordidx + 1) % len(l:suggestions)
"echo g:wordidx + 10
execute "normal! mqviwc" . l:change . "\<esc>`q"
endif
endif
"echo [l:word, l:suggestions]
endfunction
function! SuggestClear()
call matchdelete(g:match)
let g:wordidx = 0
let g:word = ''
let g:match = 0
endfunction
nnoremap <leader><tab> :call Suggest()<cr>
nnoremap <leader><cr> :call SuggestClear()<cr>
将此添加到~/.vimrc
将允许您逐步完成与<leader><tab>
的搜索匹配。它将突出显示匹配的部分,以删除键入<leader><cr>
所需的突出显示。
您应该始终在使用后删除突出显示,因为原始搜索词会保留在内部,直到您销毁它为止。在清除匹配项之前使用<leader><tab>
将替换上一场比赛中的建议。
截屏(我的领导是-
):
如果您有更多vim问题,请加入网站的vi.SE小节。你可能会在那里得到更好的答案。
答案 1 :(得分:1)
可以使用post-expand-actions
:https://github.com/SirVer/ultisnips/blob/master/doc/UltiSnips.txt#L1602