Перелічіть відомі файли


54

Як я можу отримати список назв файлових типів, про які зараз знає vim?

Я хочу бути в змозі зробити це так, що коли vim не автоматично виявляє тип файлу, я можу спробувати деякі з типів файлів, про які знає vim.

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


1
Ви можете переглянути список при спробі автозаповнення :setfiletype (тобто Tabпісля пробілу). Не впевнений, чи це повний список, чи як зафіксувати його до якогось буфера / файлу.
VanLaser

1
Використовуйте <c-d>замість того, <tab>щоб перелічити завершення.
Пітер Рінкер

Введіть літеру або декілька, щоб відфільтрувати список і показати записи, які починаються з цих літер.
Шамаоке

Відповіді:


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 немає у списку. Яви немає в списку. Як я показую назви файлів у значенні типів файлів, які відповідають конфігураціям форматування синтаксису?
Джон Мейєр

6
@JohnMeyer: Я зробив ту саму помилку. Команда насправді :setfiletypeне має типового проміжку між "set" та "filetype". Ви можете знайти більше інформації за допомогою :help :setfiletypeта :help ftdetect.
sanscore

Я спробував це, і це працює! btw, я можу використовувати :setfiletype ht<Ctrl+D>для переліку файлів, починаючи з ht, який фільтрує небажані результати. :)
pimgeek

18

Якщо ваша версія 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 зберігає визначення типу файлу.

Оновлення

Пропонував удосконалення двох команд Муру, які пропонують:

1.

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

2.

find syntax ftplugin -iname '*.vim' -exec basename -s .vim {} + | sort -u

3
Це є надто складним трубопроводом. Використовуючи trдля перетворення нових рядків у null, лише для перетворення його на наступну наступну команду, обробляйте підстановку, коли робиться проста група команд. Я б запропонував щось на кшталт:find syntax ftplugin -iname '*.vim' -exec basename -s .vim {} + | sort -u
muru

Приємно, спосіб більш лаконічний. Будь-яке краще рішення для пошуку значення VIMRUNTIME і з терміналу?
Самір Аламович

1
vim -Nesc '!echo $VIMRUNTIME' -c qa, Я думаю.
муру

Yikes. Ця друга команда лякає. Вибачте. Мені не подобається. ;) Для розваги, ось Bash альтернатива пропозицією Мури, що використовує тільки одну зовнішню команду (передбачається , що printfє вбудованої): f=({ftplugin,syntax}/*.vim) && f=(${f[@]##*/}) && printf "%s\n" "${f[@]%%.*}" | sort -u. Див. "Розширення параметрів" на сторінці "Баш" для пояснення ієрогліфів.
B Layer

Це дасть вам плагіни для файлових файлів psuedo на зразок bash, що "не є справжнім додатком для файлів ... та отримує ефект файлу" sh "'
jeremysprofile
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.