Wyświetl znane typy plików

54

Jak mogę uzyskać listę nazw typów plików, o których vim obecnie wie?

Chcę móc to zrobić, aby gdy vim nie wykryje automatycznie typu pliku, mógłbym wypróbować niektóre typy plików, które vim wie, że mogą być podobne i sprawdzić, czy zapewniają rozsądne wyróżnianie składni.

Wiem, że pliki vimscript zajmujące się typami plików są umieszczane w ftpluginkatalogu zgodnie z konwencją, ale nie muszą być (nie jestem pewien, ale nie sądzę, aby pliki vimscript w ftpluginkatalogu były wyjątkowe), więc chcę po prostu zapytaj vima, jakie typy plików zna, niezależnie od tego, jak się o nich dowiedział.

Praxeolitic
źródło
1
Możesz wyświetlić listę, gdy próbujesz wykonać autouzupełnianie :setfiletype (np. TabPo spacji). Nie jestem pewien, czy jest to pełna lista, ani jak przechwycić ją do jakiegoś bufora / pliku.
VanLaser,
1
Użyj <c-d>zamiast, <tab>aby wyświetlić listę uzupełnień.
Peter Rincker,
Wpisz literę lub kilka, aby przefiltrować listę i wyświetlić wpisy rozpoczynające się tymi literami.
Shamaoke

Odpowiedzi:

63

Proste rozwiązanie

Wpisz :setfiletype (następnie spacją) , a następnie naciśnij Ctrl-d.

Zobacz :help cmdline-completionwięcej na temat autouzupełniania w wierszu poleceń vima.

Skomplikowane rozwiązanie

To rozwiązanie wykorzystuje 'runtimepath'opcję pobrania wszystkich dostępnych katalogów składni, a następnie pobiera listę plików vimscript w tych katalogach z usuniętymi rozszerzeniami. Może to nie być najbezpieczniejszy sposób, więc usprawnienia są mile widziane:

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

Następnie możesz użyć tej funkcji w dowolny sposób, na przykład drukując wszystkie wartości z listy. Możesz to zrobić w następujący sposób:

for f in GetFiletypes() | echo f | endfor

Zauważ, że prawdopodobnie można to dość mocno spakować, podobnie jest z czytelnością. Nie wyjaśnię wszystkich używanych tu funkcji i poleceń, ale oto wszystkie strony pomocy dla nich:

  • :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()
Wiecznie zielone drzewo
źródło
1
Kiedy piszę set filetype<space><c d>, pokazuje mi listę, ale HTML nie ma na liście. Java nie ma na liście. Jak wyświetlić nazwy typów plików w znaczeniu typów plików odpowiadających konfiguracjom formatowania składni?
John Meyer,
6
@JohnMeyer: Popełniłem ten sam błąd. Komenda faktycznie :setfiletypenie ma typowej spacji między „set” a „typ pliku”. Możesz znaleźć więcej informacji za pomocą :help :setfiletypei :help ftdetect.
sanscore
Próbowałem tego i działa! btw, mogę użyć :setfiletype ht<Ctrl+D>do wyświetlenia typu pliku zaczynającego się od ht, który filtruje niepożądane wyniki. :)
pimgeek
18

Jeśli twoja wersja vima jest wystarczająco aktualna (wersja 7.4.2011 +), możesz poprosić o znane typy plików za pomocą funkcji, której możemy teraz użyć do zdefiniowania ręcznego autouzupełniania: getcompletion()

:echo getcompletion('', 'filetype')

Jeśli chcesz ograniczyć listę do typów plików rozpoczynających się od 'c', zadzwonisz

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

i tak dalej.

Uwaga: w przeciwieństwie do rozwiązań, które analizują nazwy plików i katalogów $VIMRUNTIME/{syntax,filetype}/, to rozwiązanie również analizuje 'runtimepath'. O ile rozumiem, nie widzi nowych typów plików zdefiniowanych / zarejestrowanych w locie set ft=foobarani po poleceniach automatycznych.

Luc Hermitte
źródło
3

Możesz także wydrukować wszystkie typy plików w terminalu, uruchamiając następujące 2 polecenia:

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

Pierwsze polecenie po prostu przechodzi do ścieżki środowiska wykonawczego vim (dla mnie było to / usr / share / vim / vim80 ).

Drugie polecenie wyświetla wszystkie nazwy typów plików w dwóch folderach, w których vim przechowuje definicje typów plików.

Aktualizacja

Sugerowane ulepszenia dwóch poleceń Muru, które oferują:

1.

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

2)

find syntax ftplugin -iname '*.vim' -exec basename -s .vim {} + | sort -u
Samir Alajmovic
źródło
3
To jest zbyt skomplikowane. Używając trdo konwertowania nowych linii na zero, tylko w celu konwersji z powrotem następnego polecenia, zastępuj proces, gdy wystarczy proste grupowanie poleceń. Sugerowałbym coś takiego:find syntax ftplugin -iname '*.vim' -exec basename -s .vim {} + | sort -u
muru
Fajnie, bardziej zwięźle. Jakieś lepsze rozwiązanie do znalezienia wartości VIMRUNTIME z terminala?
Samir Alajmovic
1
vim -Nesc '!echo $VIMRUNTIME' -c qa, Myślę.
muru
Yikes. To drugie polecenie jest przerażające. Przepraszam. Nie jestem niemiła. ;) Dla zabawy, oto Bash alternatywą sugestię Muru, że używa tylko jednego polecenia zewnętrznego (zakładając, że printfjest wbudowane) f=({ftplugin,syntax}/*.vim) && f=(${f[@]##*/}) && printf "%s\n" "${f[@]%%.*}" | sort -u. Zobacz „Rozszerzanie parametrów” na stronie podręcznika użytkownika Bash, aby uzyskać wyjaśnienie hieroglifów.
B Warstwa
To da ci wtyczki typu pliku psuedo typu „ bashco” nie jest prawdziwą wtyczką typu pliku… i uzyska efekt typu pliku „sh” ”
jeremysprofile