Список файлов в пользовательском автозаполнении для Vim - PullRequest
1 голос
/ 27 августа 2011

Я использую плагин Utl для Vim и ищу способ создания пользовательской функции автозаполнения для генерации ссылки на тег id внутри файла. Формат, который я хочу использовать:

:CommandName <file> <id tag in file>

Я бы хотел, чтобы функция действовала как стандартное завершение каталога для первого аргумента. Для второго аргумента мне бы хотелось, чтобы он поискал в файле, указанном в первом аргументе, все строки, начинающиеся с «id =», и возвращал значения.

Я скопировал аналогичную функцию из основного пакета Utl, но мне еще предстоит приблизиться к тому, чтобы заставить ее работать, в настоящее время она выглядит так:

fu! CompleteArgs(dummy_argLead, cmdLine, dummy_cursorPos)

" Split cmdLine to figure out how many arguments have been provided by user
" so far. If Using argument keepempty=1 for split will provide empty last
" arg in case of a new arg is about to begin or an non empty last argument
" in case of an incomplete last argument. So can just remove the last arg.
exe "echo \"cmdline:\" \"".a:cmdLine."\""
let utlArgs=split(a:cmdLine, '\s\+', 1)
execute "echo" string(utlArgs)
echo "echo" "test complete"
"remove the function name
call remove(utlArgs, -1)

" 1st arg to complete
if len(utlArgs)==1
return string(glob("*"))
endi

" 2nd arg to complete
if len(utlArgs)==2
    "insert code here
endif
endfun

У кого-нибудь есть идеи?

Ответы [ 2 ]

1 голос
/ 29 августа 2011

Вы можете попробовать frawor .Если вы установите его код будет следующим:

execute frawor#Setup('0.0', {'@/fwc': '0.2',
            \           '@/commands': '0.0',})
" No need to write bang here: above command will forbid script to be sourced 
" twice, see :h frawor#Reload for how it can be updated.
function s:F.cmdfunc(file, tag)
    " It will be called when the command launches. Alternatively you can replace 
    " `s:F.cmdfunc' in the below command.add call with a string you already had 
    " before. Note that you will have to replace s: in function names with <SID> 
    " and s:* variables will be just unaccessible.
endfunction
function s:F.gettags(file)
    " This assumes that format is the same as used in ~/.vim/doc/tags. Note that 
    " if there may be any spaces, then you must escape them.
    return map(readfile(a:file), 'matchstr(v:val, "\\v^.{-}\\t")[:-2]')
endfunction
" This replaces direct :command call, see :h frawor-f-command.add
call s:_f.command.add('CommandName', s:F.cmdfunc,
            \{  'nargs': '+',
            \'complete': ['path in*F.gettags(@<)']})
1 голос
/ 28 августа 2011

Ответ очень похожий вопрос Я написал полную функцию, которая определяет номер аргумента команды для завершения.Ниже приведена его версия, адаптированная для вашего случая.

command! -nargs=* -complete=custom,FooComplete Foo echo [<f-args>]
" Custom completion function for the command 'Foo'
function! FooComplete(arg, line, pos)
    let l = split(a:line[:a:pos-1], '\%(\%(\%(^\|[^\\]\)\\\)\@<!\s\)\+', 1)
    let n = len(l) - index(l, 'Foo') - 1
    if n == 1
        return string(glob('*'))
    endif
    return "1\n2\n3" " Replace this with appropriate id-completion code
endfunction

Функция правильно обрабатывает экранированный пробел (который является частью аргумента, а не разделителя) и пробел перед именем команды.Обратите внимание, что пробельные символы в кандидатах на предложение должны быть экранированы, иначе Vim будет рассматривать один аргумент как два аргумента.

...