2016-07-10 22 views
0

application/migrationsからすべての移行ファイルを読み込んで、適切なリビジョン を選択するのに役立つスニペットを作成しようとしています。ファイル番号から番号を抽出する、UltisnipsのPython補間スニペット

私は自分自身を行うために管理することは、私は タイピング思いながら、私のファイル名がフィルタリングされている、とだけ1つの試合は(常にファイル名の最初の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

私はこの質問は投票ダウン人は 'X'理由を、知っているよりも幸せになります。問題はPython自体ではなく、簡単に解決できるので、この場合のプラグインの動作です。 – branquito

+0

私はdownvoterではありませんが、私は2つのことを主張したいと思います。あなたは 'flag'ボタンを押して司会者に[vi.SE](http://vi.stackexchange。 com /)、より多くの人々がそこで助けることができるかもしれません。また、私はultisnipsを使用したことはありませんが、私はこれが純粋なvimscriptで書くのは難しくないと主張したいと思います。リストを取得するには 'split(globpath( 'application/migrations'、 '* .php'))'を使い、 ''を押すと 'viwc'を使うことができます。 – grochmal

+0

ポイントはタイピング中の結果をフィルタリングしているので、検索結果が絞り込まれ、ファイルの単純なリストは取得されません – branquito

答えて

1

これは間違いなく純粋なvimscriptで実行できます。

ここには動作するプロトタイプがあります。それは動作しますが、移植性に関するいくつかの問題があります:グローバル変数、iskeywordへの依存、そして1つではなく2つのキーバインドを使用します。しかし、それは時間かそこらで一緒に置かれた:

set [email protected],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> 

は、検索が<leader><tab>と一致してのステップにあなたをできるようになりますあなたの~/.vimrcにこれを追加します。それは一致する部分をハイライト表示し、ハイライトをドロップするには<leader><cr>と入力する必要があります。

オリジナルの検索語は、削除するまで内部で保持されるため、使用後は必ずハイライトを削除してください。一致をクリアする前に<leader><tab>を使用すると、以前の試合の提案が代わりに使用されます。

スクリーンキャスト(私のリーダーが-です):

enter image description here


あなたはより多くのvimの質問がある場合は、ウェブサイトのvi.SEサブセクションに参加。あなたはおそらくもっと良い答えを得ることができます。

関連する問題