Listado de archivos en autocompletado personalizado para Vim

Estoy usando el complemento Utl para Vim y estoy buscando un método para crear una función de autocompletar personalizada para generar un enlace a una etiqueta de identificación dentro del archivo. El formato que quiero usar es:

:CommandName <file> <id tag in file>

Me gustaría que la función actuara como la finalización de directorio estándar para el primer argumento. Para el segundo argumento, me gustaría buscar en el archivo especificado en el primer argumento todas las cadenas que comienzan con "id =" y devolver los valores.

He copiado una función similar del paquete principal de Utl, pero todavía tengo que acercarme a que funcione, actualmente se ve así:

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

¿Alguien tiene alguna idea?

preguntado el 27 de agosto de 11 a las 15:08

2 Respuestas

Puedes probar frawor. Si lo instalas, el código será el siguiente:

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(@<)']})

Respondido 29 ago 11, 08:08

Gracias, eso es casi perfecto. - Sparky

Aunque la responder un muy pregunta similar, He escrito una función completa que determina el número de un argumento de comando para completar. A continuación se muestra una versión de esa función, adaptada a su caso.

command! -nargs=* -complete=custom,FooComplete Foo echo [<f-args>]

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 logic.
endfunction

La función maneja correctamente los espacios en blanco de escape (como parte de un argumento, no como un separador) y los espacios en blanco antes del nombre del comando. Tenga en cuenta que los caracteres de espacio en blanco en los candidatos de sugerencia deben ser de escape; de ​​lo contrario, Vim trataría un solo argumento como dos argumentos.

Respondido 22 Feb 20, 09:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.