2016-07-10 3 views
0

Я пытаюсь сделать фрагмент, который поможет мне выбрать правильную ревизию номер для миграции, прочитав все файлы миграции из application/migrations.Ускоренный фрагмент интерполяции с помощью ultisnips python, извлечение числа из имени файла

Что мне удалось сделать сам, что мои имена файлов фильтруется в то время как я типирование, и когда только один матч оставил вставить свой номер ревизии в позиции курсора (которые являются первые 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

Я не являюсь нисходящим, но я бы хотел обсудить две вещи: вы можете нажать кнопку «flag», чтобы попросить модератора переместить вопрос на [vi.SE] (http: //vi.stackexchange. com /), там может помочь больше людей.Кроме того, я никогда не использовал ultisnips, но я бы сказал, что это не так сложно писать в чистом vimscript. Вы можете использовать 'split (globpath ('application/migrations', '* .php'))', чтобы получить список, а затем 'viwc', как только вы нажмете' '. – grochmal

+0

точка фильтрует результаты при наборе текста, тем самым сужая результаты поиска, не получая простой список файлов – branquito

ответ

1

Это может быть выполнено в чистом vimscript.

Вот рабочий прототип. Он работает, но имеет некоторые проблемы с переносимостью: глобальные переменные, зависимость от iskeyword и использует два ключа, а не один. Но это было скомпоновать в час или около того:

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> 

Добавление этого на ваш ~/.vimrc позволит вам шаги через поиск совпадения с <leader><tab>. Он будет подсвечивать часть, которая подбирается, чтобы отменить выделение, которое вам нужно ввести, <leader><cr>.

Вы всегда должны отбрасывать выделение после использования, потому что исходное слово поиска хранится внутри, пока вы не уничтожите его. С помощью <leader><tab> перед очисткой матча будут заменены предложения из предыдущего совпадения.

Screencast (мой лидер -):

enter image description here


Если у вас есть вопросы ВИМ присоединиться к vi.SE подраздел сайта. Вероятно, вы можете получить ответы на них.

 Смежные вопросы

  • Нет связанных вопросов^_^