2

我正在尝试制作一个片段,通过从 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
4

2 回答 2

2

这可以通过以下方式实现post-expand-actionshttps ://github.com/SirVer/ultisnips/blob/master/doc/UltiSnips.txt#L1602

于 2016-07-11T05:33:13.777 回答
2

这绝对可以在纯 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小节。你可能会在那里得到更好的答案。

于 2016-07-11T01:44:59.727 回答