Liste bekannter Dateitypen

54

Wie kann ich eine Liste der Namen von Dateitypen abrufen, die vim derzeit kennt?

Ich möchte in der Lage sein, dies zu tun, damit ich, wenn vim einen Dateityp nicht automatisch erkennt, einige der von vim bekannten Dateitypen ausprobieren kann.

Ich weiß, dass Vimscript-Dateien, die sich mit Dateitypen befassen, ftpluginnach Konvention in das Verzeichnis gestellt werden, aber das müssen sie nicht (ich bin nicht sicher, aber ich denke nicht, dass die Vimscript-Dateien im ftpluginVerzeichnis etwas Besonderes sind), also möchte ich nur Fragen Sie vim, welche Dateitypen es kennt, unabhängig davon, wie es von ihnen erfahren hat.

Praxeolitische
quelle
1
Sie können eine Liste anzeigen, wenn Sie versuchen, sie automatisch zu vervollständigen :setfiletype (dh mit Tabnach einem Leerzeichen). Ich bin mir nicht sicher, ob es sich um die vollständige Liste handelt oder wie ich sie in einem Puffer / einer Datei erfassen soll.
VanLaser
1
Verwenden Sie <c-d>anstelle von, <tab>um Vervollständigungen aufzulisten.
Peter Rincker
Geben Sie einen oder mehrere Buchstaben ein, um die Liste zu filtern und Einträge anzuzeigen, die mit diesen Buchstaben beginnen.
Shamaoke

Antworten:

63

Einfache Lösung

Geben Sie :setfiletype (mit einem Leerzeichen danach) ein und drücken Sie dann Ctrl-d.

Sehen Sie :help cmdline-completionfür weitere Informationen über die automatische Vervollständigung in der Befehlszeile des vim.

Komplizierte Lösung

Diese Lösung verwendet die 'runtimepath'Option, um alle verfügbaren Syntaxverzeichnisse abzurufen, und ruft dann eine Liste der Vimscript-Dateien in diesen Verzeichnissen ab, deren Erweiterungen entfernt wurden. Dies ist möglicherweise nicht die sicherste Methode, daher sind Verbesserungen willkommen:

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

Sie können diese Funktion dann wie gewünscht verwenden, z. B. um alle Werte in der Liste auszudrucken. Das könnten Sie so machen:

for f in GetFiletypes() | echo f | endfor

Beachten Sie, dass dies wahrscheinlich ziemlich stark komprimiert werden kann. Dies dient nur der Lesbarkeit. Ich werde nicht alle hier verwendeten Funktionen und Befehle erklären, aber hier sind alle Hilfeseiten für sie:

  • :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()
Immergrüner Baum
quelle
1
Wenn ich tippe set filetype<space><c d>, zeigt es mir eine Liste, aber HTML ist nicht in der Liste. Java ist nicht in der Liste. Wie zeige ich Dateitypnamen im Sinne von Dateitypen an, die den Syntaxformatierungskonfigurationen entsprechen?
John Meyer
6
@ John Meyer: Ich habe den gleichen Fehler gemacht. Der Befehl enthält tatsächlich :setfiletypekeinen typischen Abstand zwischen "set" und "filetype". Weitere Informationen finden Sie mit :help :setfiletypeund :help ftdetect.
Sanscore
Ich habe es versucht und es funktioniert! Übrigens kann ich damit einen :setfiletype ht<Ctrl+D>Dateityp auflisten, der mit ht beginnt und unerwünschte Ergebnisse filtert. :)
Pimgeek
18

Wenn Ihre Version von vim aktuell genug ist (v7.4.2011 +), können Sie mit der Funktion, die wir jetzt zur Definition der manuellen automatischen Vervollständigung verwenden können, nach bekannten Dateitypen fragen: getcompletion()

:echo getcompletion('', 'filetype')

Wenn Sie die Liste auf Dateitypen beschränken möchten, die mit a beginnen 'c', rufen Sie an

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

und so weiter.

Hinweis: Im Gegensatz zu Lösungen, in denen die Dateinamen und Verzeichnisnamen $VIMRUNTIME/{syntax,filetype}/analysiert werden, wird auch diese Lösung analysiert 'runtimepath'. Soweit ich weiß, werden keine neuen Dateitypen angezeigt, die im laufenden Betrieb set ft=foobaroder nach automatischen Befehlen definiert / registriert wurden .

Luc Hermitte
quelle
3

Sie können auch alle Dateitypen im Terminal drucken, indem Sie die folgenden 2 Befehle ausführen:

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

Der erste Befehl navigiert einfach zu Ihrem vim-Laufzeitpfad (für mich war es / usr / share / vim / vim80 ).

Der zweite Befehl listet alle Dateitypnamen in den beiden Ordnern auf, in denen vim die Dateitypdefinitionen speichert.

Aktualisieren

Verbesserungsvorschläge für die beiden Befehle von muru, die Folgendes bieten:

1.

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

2.

find syntax ftplugin -iname '*.vim' -exec basename -s .vim {} + | sort -u
Samir Alajmovic
quelle
3
Das ist eine zu komplizierte Pipeline. Wenn Sie trZeilenumbrüche nur in Null konvertieren, um sie beim nächsten Befehl wieder zu konvertieren, führen Sie die Substitution durch, wenn dies durch eine einfache Befehlsgruppierung möglich wäre. Ich würde folgendes vorschlagen:find syntax ftplugin -iname '*.vim' -exec basename -s .vim {} + | sort -u
muru
Schön, viel prägnanter. Gibt es eine bessere Lösung, um den VIMRUNTIME-Wert auch über das Terminal zu ermitteln?
Samir Alajmovic
1
vim -Nesc '!echo $VIMRUNTIME' -c qa, Ich denke.
Muru
Huch. Dieser zweite Befehl ist erschreckend. Es tut uns leid. Ich bin nicht nicht nett. ;) Für Spaß, hier ist ein Bash Alternativvorschlag zu muru ist , die nur einen externen Befehl verwendet (vorausgesetzt , printfein builtin): f=({ftplugin,syntax}/*.vim) && f=(${f[@]##*/}) && printf "%s\n" "${f[@]%%.*}" | sort -u. Eine Erläuterung der Hieroglyphen finden Sie unter "Parametererweiterung" in der Bash-Manpage.
B Schicht
Dies gibt Ihnen pseudo-Plugins wie bash, die kein echtes Plugin für Dateitypen sind ... und den Effekt von Dateityp "sh"
jeremysprofile