Listar tipos de archivo conocidos

54

¿Cómo puedo obtener una lista de los nombres de los tipos de archivo que vim conoce actualmente?

Quiero poder hacer esto para que cuando vim no detecte automáticamente un tipo de archivo, pueda probar algunos de los tipos de archivo que vim sabe que pueden ser similares y ver si proporcionan un resaltado de sintaxis razonable.

Sé que los archivos vimscript que tratan con tipos de archivo se colocan en el ftplugindirectorio por convención, pero no es necesario que lo estén (no estoy seguro, pero no creo que los archivos vimscript en el ftplugindirectorio sean especiales), así que solo quiero pregúntele a Vim qué tipos de archivos conoce, independientemente de cómo se enteró de ellos.

Praxeolítico
fuente
1
Puede ver una lista cuando intenta autocompletar :setfiletype (es decir, Tabdespués de un espacio). No estoy seguro si es la lista completa o cómo capturarla en algún búfer / archivo.
VanLaser
1
Use en <c-d>lugar de <tab>para enumerar las terminaciones.
Peter Rincker
Escriba una letra o algunas para filtrar la lista y mostrar las entradas que comienzan con estas letras.
Shamaoke

Respuestas:

63

Solución simple

Escriba :setfiletype (con un espacio después) , luego presione Ctrl-d.

Vea :help cmdline-completionpara más información sobre autocompletado en la línea de comando de vim.

Solución complicada

Esta solución utiliza la 'runtimepath'opción para obtener todos los directorios de sintaxis disponibles y luego obtiene una lista de los archivos vimscript en esos directorios con sus extensiones eliminadas. Esta puede no ser la forma más segura de hacerlo, por lo que las mejoras son bienvenidas:

function! GetFiletypes()
    " Get a list of all the runtime directories by taking the value of that
    " option and splitting it using a comma as the separator.
    let rtps = split(&runtimepath, ",")
    " This will be the list of filetypes that the function returns
    let filetypes = []

    " Loop through each individual item in the list of runtime paths
    for rtp in rtps
        let syntax_dir = rtp . "/syntax"
        " Check to see if there is a syntax directory in this runtimepath.
        if (isdirectory(syntax_dir))
            " Loop through each vimscript file in the syntax directory
            for syntax_file in split(glob(syntax_dir . "/*.vim"), "\n")
                " Add this file to the filetypes list with its everything
                " except its name removed.
                call add(filetypes, fnamemodify(syntax_file, ":t:r"))
            endfor
        endif
    endfor

    " This removes any duplicates and returns the resulting list.
    " NOTE: This might not be the best way to do this, suggestions are welcome.
    return uniq(sort(filetypes))
endfunction

Luego puede usar esta función de la forma que desee, como imprimir todos los valores de la lista. Podrías lograr eso así:

for f in GetFiletypes() | echo f | endfor

Tenga en cuenta que esto probablemente se puede compactar un poco, es así para facilitar la lectura. No explicaré todas las funciones y comandos utilizados aquí, pero aquí están todas las páginas de ayuda para ellos:

  • :help 'runtimepath'
  • :help :let
  • :help :let-&
  • :help split()
  • :help :for
  • :help expr-.
  • :help :if
  • :help isdirectory()
  • :help glob()
  • :help fnamemodify()
  • :help add()
  • :help uniq()
  • :help sort()
Árbol de hoja perenne
fuente
1
Cuando escribo set filetype<space><c d>, me muestra una lista, pero html no está en la lista. Java no está en la lista. ¿Cómo muestro los nombres de tipo de archivo en el sentido de tipos de archivo que corresponden a las configuraciones de formato de sintaxis?
John Meyer
66
@ JohnMeyer: cometí el mismo error. El comando en realidad :setfiletypeno tiene el espacio típico entre "set" y "filetype". Puedes encontrar más información con :help :setfiletypey :help ftdetect.
Sanscore
¡He intentado esto y funciona! por cierto, puedo usar :setfiletype ht<Ctrl+D>para enumerar el tipo de archivo que comienza con ht, que filtra los resultados no deseados. :)
pimgeek
19

Si su versión de vim es lo suficientemente reciente (v7.4.2011 +), puede solicitar tipos de archivo conocidos con la función que ahora podemos usar para ayudar a definir la autocompletación manual: getcompletion()

:echo getcompletion('', 'filetype')

Si desea restringir la lista a tipos de archivo que comienzan con a 'c', debe llamar

:echo getcompletion('c', 'filetype')

y así.

Nota: a diferencia de las soluciones que analizan los nombres de archivo y de directorio $VIMRUNTIME/{syntax,filetype}/, esta solución también analiza 'runtimepath'. Según tengo entendido, no ve nuevos tipos de archivos definidos / registrados sobre la marcha set ft=foobar, ni después de los comandos automáticos.

Luc Hermitte
fuente
3

También puede imprimir todos los tipos de archivos en el terminal ejecutando los siguientes 2 comandos:

1)

cd $(vim -e -T dumb --cmd 'exe "set t_cm=\<C-M>"|echo $VIMRUNTIME|quit' | tr -d '\015')

2)

cat <(ls -1 ftplugin/*.vim) <(ls -1 syntax/*.vim) | tr '\n' '\0' | xargs -0 -n 1 basename | sort | uniq | cut -f 1 -d '.'

El primer comando simplemente navega a su ruta de tiempo de ejecución vim (para mí fue / usr / share / vim / vim80 ).

El segundo comando enumera todos los nombres de tipo de archivo en las dos carpetas donde vim almacena las definiciones de tipo de archivo.

Actualizar

Mejoras sugeridas a los dos comandos de muru que ofrecen:

1)

cd $(vim -Nesc '!echo $VIMRUNTIME' -c qa)

2)

find syntax ftplugin -iname '*.vim' -exec basename -s .vim {} + | sort -u
Samir Alajmovic
fuente
3
Esa es muuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu [[] sean una tubería Utilizando trpara convertir las nuevas líneas en nulas solo para volver a convertirlo en el siguiente comando, procese la sustitución cuando lo haría la simple agrupación de comandos. Sugeriría algo como:find syntax ftplugin -iname '*.vim' -exec basename -s .vim {} + | sort -u
muru
Bonito, mucho más sucinto. ¿Alguna mejor solución para encontrar el valor VIMRUNTIME desde la terminal también?
Samir Alajmovic
1
vim -Nesc '!echo $VIMRUNTIME' -c qa, Yo creo que.
muru
1
Yikes Ese segundo comando es aterrador. Lo siento. No estoy siendo amable. ;) Para la diversión, aquí es una alternativa a la sugerencia de Bash Muru que utiliza un solo comando externo (suponiendo que printfes una orden interna): f=({ftplugin,syntax}/*.vim) && f=(${f[@]##*/}) && printf "%s\n" "${f[@]%%.*}" | sort -u. Consulte "Expansión de parámetros" en la página de manual de Bash para obtener una explicación de los jeroglíficos.
Capa B
Esto le dará complementos de tipo de archivo psuedo como bash, que 'no es un complemento de tipo de archivo real ... y obtiene el efecto del tipo de archivo "sh"'
jeremysprofile
0

Intente ver en $ VIMRUNTIME / sintaxis. Use: echo $ VIMRUNTIME para conocer su valor. En mi computadora, $ VIMRUNTIME / syntax era / usr / share / vim / vim81 / syntax. Tiene todos los archivos de sintaxis.

Si tiene un vim con gui, también puede usar el menú Sintaxis para obtener todos los tipos de archivos compatibles.

silversilva
fuente