Список известных типов файлов

54

Как я могу получить список имен типов файлов, о которых в настоящее время знает vim?

Я хочу иметь возможность сделать это так, чтобы, когда vim автоматически не обнаруживал тип файла, я мог попробовать некоторые из типов файлов, о которых знает vim, которые могут быть похожими, и посмотреть, обеспечивают ли они разумную подсветку синтаксиса.

Я знаю, что файлы vimscript, имеющие дело с типами файлов, помещаются в ftpluginкаталог по соглашению, но они не должны быть (я не уверен, но я не думаю, что файлы vimscript в ftpluginкаталоге являются специальными), поэтому я хочу просто спросите vim, о каких типах файлов он знает, независимо от того, как он узнал о них.

Praxeolitic
источник
1
Вы можете просмотреть список при попытке автозаполнения :setfiletype (например, Tabпосле пробела). Не уверен, что это полный список или как записать его в какой-нибудь буфер / файл.
VanLaser
1
Используйте <c-d>вместо <tab>списка завершений.
Питер Ринкер,
Введите букву или несколько, чтобы отфильтровать список и показать записи, которые начинаются с этих букв.
Shamaoke

Ответы:

63

Простое решение

Введите :setfiletype (с пробелом после) , затем нажмите Ctrl-d.

Смотрите :help cmdline-completionподробнее об автозаполнении в командной строке vim.

Сложное решение

Это решение использует 'runtimepath'параметр для получения всех доступных каталогов синтаксиса, а затем извлекает список файлов vimscript в этих каталогах с удаленными их расширениями. Это может быть не самый безопасный способ сделать это, поэтому улучшения приветствуются:

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

Затем вы можете использовать эту функцию любым удобным для вас способом, например, распечатать все значения в списке. Вы можете сделать это так:

for f in GetFiletypes() | echo f | endfor

Обратите внимание, что это, вероятно, может быть сжато немного, это так же для удобства чтения. Я не буду объяснять каждую функцию и команду, используемые здесь, но вот все справочные страницы для них:

  • :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()
Вечнозеленое дерево
источник
1
Когда я печатаю set filetype<space><c d>, он показывает мне список, но HTML нет в списке. Java нет в списке. Как показать имена типов файлов в смысле типов файлов, которые соответствуют конфигурациям форматирования синтаксиса?
Джон Мейер
6
@JohnMeyer: я сделал ту же ошибку. Команда фактически :setfiletypeне имеет типичного пробела между «set» и «filetype». Вы можете найти больше информации с :help :setfiletypeи :help ftdetect.
Санскор
Я пробовал это, и это работает! Кстати, я могу использовать :setfiletype ht<Ctrl+D>для перечисления тип файла, начиная с ht, который фильтрует нежелательные результаты. :)
Pimgeek
19

Если ваша версия vim достаточно свежая (v7.4.2011 +), вы можете запросить известные типы файлов с помощью функции, которую мы теперь можем использовать, чтобы помочь определить автозаполнение вручную: getcompletion()

:echo getcompletion('', 'filetype')

Если вы хотите ограничить список типами файлов, начинающимися с a 'c', вы должны вызвать

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

и так далее.

Примечание: в отличие от решений, которые анализируют имена файлов и каталогов $VIMRUNTIME/{syntax,filetype}/, это решение также анализирует 'runtimepath'. Насколько я понимаю, он не видит новые типы файлов, определенные / зарегистрированные на лету set ft=foobar, ни после автокоманд.

Люк Эрмитт
источник
3

Вы также можете распечатать все типы файлов в терминале, выполнив следующие 2 команды:

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

Первая команда просто переходит к вашему пути выполнения vim (для меня это был / usr / share / vim / vim80 ).

Вторая команда выводит список всех имен типов файлов в двух папках, где vim хранит определения типов файлов.

Обновить

Предлагаемые улучшения для двух команд от muru, которые предлагают:

1.

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

2.

find syntax ftplugin -iname '*.vim' -exec basename -s .vim {} + | sort -u
Самир Алаймович
источник
3
Это слишком сложный трубопровод. Используя trпреобразование новых строк в ноль только для преобразования его в следующую команду, выполняйте подстановку, когда выполняется простая группировка команд. Я бы предложил что-то вроде:find syntax ftplugin -iname '*.vim' -exec basename -s .vim {} + | sort -u
Муру
Хороший, более краткий. Есть ли лучшее решение для определения значения VIMRUNTIME из терминала?
Самир Алаймович
1
vim -Nesc '!echo $VIMRUNTIME' -c qa, Думаю.
Муру
1
Хлоп. Эта вторая команда пугающая. Сожалею. Я не плохой ;) Для развлечения, вот альтернатива Bash внушению Муру, что использует только один внешней командой (предполагается , что printfэто встроено в него ): f=({ftplugin,syntax}/*.vim) && f=(${f[@]##*/}) && printf "%s\n" "${f[@]%%.*}" | sort -u. См. «Расширение параметров» на странице руководства Bash для объяснения иероглифов.
Слой
Это даст вам такие плагины типа файлов psuedo bash, которые «не являются реальными плагинами типов файлов ... и получат эффект типа файлов« sh »»
jeremysprofile
0

Попробуйте посмотреть в $ VIMRUNTIME / синтаксис. Используйте: echo $ VIMRUNTIME, чтобы узнать его значение. На моем компьютере $ VIMRUNTIME / синтаксис был / usr / share / vim / vim81 / синтаксис. В нем есть все файлы синтаксиса.

Если у вас есть vim с графическим интерфейсом, вы также можете использовать меню синтаксиса, чтобы получить все поддерживаемые типы файлов.

silversilva
источник