Ultisnips python插值片段,从文件名中提取数字

时间:2016-07-10 20:15:49

标签: python vim ultisnips

我正在尝试制作一个可以帮助我选择正确版本的代码段 通过读取所有迁移文件来进行迁移的编号 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

2 个答案:

答案 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>将替换上一场比赛中的建议。

截屏(我的领导是-):

enter image description here

如果您有更多vim问题,请加入网站的vi.SE小节。你可能会在那里得到更好的答案。

答案 1 :(得分:1)