【问题标题】:Ultisnips python interpolation snippet, extracting number from filenameUltisnips python插值片段,从文件名中提取数字
【发布时间】:2016-07-11 13:33:13
【问题描述】:

我正在尝试制作一个帮助我选择正确版本的 sn-p 迁移编号,通过读取所有迁移文件 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

【问题讨论】:

  • 我很高兴知道原因,为什么x 的人否决了这个问题。问题不在于 python 本身,因为这很容易解决,而在于这种情况下的插件行为。
  • 我不是反对者,但我想争论两件事:您可能想点击flag 按钮并要求版主将问题移至vi.SE,更多人可能会能够在那里提供帮助。此外,我从未使用过 ultisnips,但我认为用纯 vimscript 编写这并不难。您可以使用split(globpath('application/migrations', '*.php')) 获取列表,然后在点击<tab> 后使用viwc
  • 重点是在输入时过滤结果,从而缩小搜索结果,而不是获得普通的文件列表

标签: python vim ultisnips


【解决方案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 将允许您逐步搜索与&lt;leader&gt;&lt;tab&gt; 匹配的内容。它将突出显示正在匹配的部分,要删除您需要键入&lt;leader&gt;&lt;cr&gt; 的突出显示。

您应该始终在使用后删除突出显示,因为原始搜索词会保留在内部,直到您将其销毁。在清除比赛之前使用&lt;leader&gt;&lt;tab&gt; 将替代上一场比赛的建议。

截图(我的领导是-):


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

【讨论】:

    【解决方案2】:

    这可以使用post-expand-actionshttps://github.com/SirVer/ultisnips/blob/master/doc/UltiSnips.txt#L1602来实现

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-03
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多