определить тип файла без расширения

Я хочу использовать pygmentize для выделения некоторых файлов сценариев (python/bash/...) без расширения. Но pygmentize требует, чтобы я указал лексер, используя -l. Он не определяет автоматически тип файла по содержимому.

У меня есть следующие варианты под рукой, но ни один из них не работает сейчас:

  1. используйте file -b --mime-type. Но эта команда выводит x-python и x-shellscript вместо python и bash и я не знаю правила
  2. используйте vim -e -c 'echo &ft|q' the_file. Для любого файла с расширением или без него в vim есть механизм определения типа файла. Но это не работает. Так как вывод идет в окно vim и исчезает после q.

Что я могу сделать?


Метод @Samborski отлично работает в обычном случае, но не работает в python subprocess.check_output, поскольку точки не выделены. Если вы используете nvim, вы можете использовать этот более простой способ:

HOME=_ nvim --headless -es file <<EOF
call writefile([&ft], "/dev/stdout")
EOF

person doraemon    schedule 15.01.2019    source источник
comment
Файлы Python, файлы bash и т. д. — это просто текстовые файлы, предназначенные для открытия разными интерпретаторами. Вы можете догадаться, какой интерпретатор использовать, проанализировав файл и найдя определенные структуры и ключевые слова, но в лучшем случае это будет предположение.   -  person TigerhawkT3    schedule 15.01.2019
comment
Конечно, это должно определяться содержимым файла. Мой вопрос в том, как. vim имеет много кода для обработки этого. file также может это сделать, но его вывод не является чем-то, что может быть напрямую использовано pygmentize   -  person doraemon    schedule 15.01.2019


Ответы (1)


Вы можете использовать vim следующим образом:

vim -c ':silent execute ":!echo " . &ft . " > /dev/stdout"' -c ':q!' the_file

Он просто создает команду для запуска в оболочке как конкатенацию строк.

person Karol Samborski    schedule 15.01.2019
comment
Этот работает, но вызывает мерцание экрана. Есть ли способ предотвратить это? - person doraemon; 15.01.2019
comment
Я обнаружил, что вспышка вызвана моими плагинами в .vim. Что, как я могу отключить эти плагины - person doraemon; 15.01.2019
comment
вы можете создать еще один файл .vimrc и использовать его вместо файла по умолчанию, указав флаг -u <vimrc> - person Karol Samborski; 15.01.2019
comment
Это .vim, а не .vimrc. Используя это, мне нужно будет изменить rtp в файле vimrc. Я только что нашел еще один лучший способ: использовать HOME=_ vim -c ... для подделки домашнего каталога, чтобы vim не смог найти мои собственные настройки. Не могли бы вы добавить эту часть к вашему ответу? Я приму твое. Спасибо - person doraemon; 15.01.2019
comment
Также доступен флаг --noplugin - person Karol Samborski; 15.01.2019
comment
--noplugin не будет загружать никаких плагинов, поэтому обнаружение файла не удастся. Мне нужно сохранить стандартные плагины, поставляемые с vim, но исключить мои личные в .vim - person doraemon; 16.01.2019
comment
@Amadan, -u NORC отключает только .vimrc, плагины в .vim/plugin и других папках в нем по-прежнему будут работать. - person doraemon; 16.01.2019
comment
.vim/plugin — это не место, на которое смотрит Vim. Именно менеджер пакетов, который вы запускаете из своего .vimrc (Vundle, NeoBundle, Pathogen, VimPlug...), сообщает Vim о .vim/plugin. Нет .vimrc = нет пользовательских плагинов. Однако. вы делаете хотите, чтобы подключаемые модули Vim по умолчанию запускались, потому что вам нужен filetype.vim, подключаемый модуль, отвечающий за определение типов файлов. - person Amadan; 16.01.2019