Liste les types de fichiers connus

54

Comment puis-je obtenir une liste des noms de types de fichiers connus de vim?

Je veux pouvoir le faire de sorte que lorsque vim ne détecte pas automatiquement un type de fichier, je puisse essayer certains des types de fichiers que vim sait déjà similaires et voir s'ils fournissent une coloration syntaxique raisonnable.

Je sais que les fichiers vimscript traitant des types de fichiers sont placés dans le ftpluginrépertoire par convention, mais ils n'ont pas besoin de l'être (je ne suis pas sûr, mais je ne pense pas que les fichiers vimscript du ftpluginrépertoire sont spéciaux), alors je veux simplement demandez à vim quels types de fichiers il connaît, quelle que soit la façon dont il les a appris.

Praxéolitique
la source
1
Vous pouvez afficher une liste lorsque vous essayez de compléter automatiquement :setfiletype (c'est-à-dire Tabaprès un espace). Vous ne savez pas si c'est la liste complète, ou comment la capturer dans un tampon / fichier.
VanLaser
1
Utilisez <c-d>au lieu de <tab>pour lister les complétions.
Peter Rincker
Tapez une lettre ou quelques lettres pour filtrer la liste et afficher les entrées commençant par ces lettres.
Shamaoke

Réponses:

63

Solution simple

Tapez :setfiletype (avec un espace après) , puis appuyez sur Ctrl-d.

Voir :help cmdline-completionpour plus d'informations sur l'auto-complétion dans la ligne de commande de vim.

Solution compliquée

Cette solution utilise l' 'runtimepath'option permettant d'obtenir tous les répertoires de syntaxe disponibles, puis extrait une liste des fichiers vimscript de ces répertoires avec leurs extensions supprimées. Ce n'est peut-être pas le moyen le plus sûr de le faire, donc les améliorations sont les bienvenues:

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

Vous pouvez ensuite utiliser cette fonction comme vous le souhaitez, par exemple pour imprimer toutes les valeurs de la liste. Vous pouvez accomplir cela comme suit:

for f in GetFiletypes() | echo f | endfor

Notez que ceci peut probablement être un peu compacté, il en va de même pour la lisibilité. Je ne vous expliquerai pas toutes les fonctions et commandes utilisées ici, mais voici toutes les pages d'aide correspondantes:

  • :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()
Arbre à feuilles persistantes
la source
1
Lorsque je tape set filetype<space><c d>, il me montre une liste, mais HTML n'est pas dans la liste. Java n'est pas dans la liste. Comment afficher les noms de type de fichier au sens de types de fichier correspondant aux configurations de formatage de la syntaxe?
John Meyer
6
@ JohnMeyer: J'ai fait la même erreur. La commande est en fait :setfiletypesans l'espace typique entre "set" et "filetype". Vous pouvez trouver plus d'informations avec :help :setfiletypeet :help ftdetect.
sanscore
J'ai essayé ça et ça marche! En fait, je peux utiliser :setfiletype ht<Ctrl+D>pour lister le type de fichier commençant par ht, qui filtre les résultats indésirables. :)
pimgeek
19

Si votre version de vim est suffisamment récente (v7.4.2011 +), vous pouvez demander des types de fichiers connus avec la fonction que nous pouvons maintenant utiliser pour vous aider à définir l'auto-complétion manuelle: getcompletion()

:echo getcompletion('', 'filetype')

Si vous souhaitez restreindre la liste aux types de fichiers commençant par un 'c', vous pouvez appeler

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

etc.

Remarque: contrairement aux solutions qui analysent les noms de fichier et les noms de répertoire $VIMRUNTIME/{syntax,filetype}/, cette solution est également analysée 'runtimepath'. Autant que je sache, de nouveaux types de fichiers ne sont pas définis / enregistrés à la volée avec set ft=foobar, ni après les autocommandes.

Luc Hermitte
la source
3

Vous pouvez également imprimer tous les types de fichiers du terminal en exécutant les 2 commandes suivantes:

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 '.'

La première commande navigue simplement vers votre chemin d’exécution vim (pour moi c’était / usr / share / vim / vim80 ).

La deuxième commande répertorie tous les noms de type de fichier dans les deux dossiers où vim stocke les définitions de type de fichier.

Mise à jour

Améliorations suggérées aux deux commandes de muru qui offrent:

1.

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

2

find syntax ftplugin -iname '*.vim' -exec basename -s .vim {} + | sort -u
Samir Alajmovic
la source
3
C'est trop compliqué pour un pipeline. Utilisant trpour convertir les nouvelles lignes en null uniquement pour la reconvertir à la commande suivante, effectuez une substitution lorsque le regroupement de commandes simple suffirait. Je suggère quelque chose comme:find syntax ftplugin -iname '*.vim' -exec basename -s .vim {} + | sort -u
Muru
Nice, beaucoup plus succinct. Une meilleure solution pour rechercher la valeur VIMRUNTIME à partir du terminal également?
Samir Alajmovic
1
vim -Nesc '!echo $VIMRUNTIME' -c qa, Je pense.
Muru
1
Beurk. Ce second commandement est effrayant. Pardon. Je ne suis pas gentil ;) Pour le plaisir, voici une alternative Bash à la suggestion de Muru qui utilise seulement une commande externe ( en supposant printfest une commande interne): f=({ftplugin,syntax}/*.vim) && f=(${f[@]##*/}) && printf "%s\n" "${f[@]%%.*}" | sort -u. Voir "Extension de paramètres" dans la page de manuel Bash pour une explication des hiéroglyphes.
Couche B
Cela vous donnera des plugins de type de fichier psuedo comme bash, ce qui n'est pas un vrai plugin de type de fichier ... et donne l'effet du type de fichier "sh"
jeremysprofile
0

Essayez de voir dans $ VIMRUNTIME / syntax. Utilisez: echo $ VIMRUNTIME pour connaître sa valeur. Sur mon ordinateur, $ VIMRUNTIME / syntax était / usr / share / vim / vim81 / syntax. Il a tous les fichiers de syntaxe.

Si vous avez un vim avec interface graphique, vous pouvez également utiliser le menu Syntaxe pour obtenir tous les types de fichiers pris en charge.

Silversilva
la source