6

Я ищу способ определить тип файла в vim и установить подсветку синтаксиса на основе типа файла. Единственный улов - я не могу использовать расширение файла для определения типа файла.Определить тип файла в vim без допустимого расширения файла

Это мой сценарий: Я использую vimdiff или gvimdiff как мой P4DIFF инструмент, который показывает изменения между файлами в моей локальной копии и те, с сервера неволей. Волей-неволей, кажется, приносит в файлах с неволей сервера в каталог/TMP и использует PID назвать файл, например:

/tmp/tmp.24673.23 

Это было для исходного файла C++.

Наиболее часто встречающиеся типы файлов, с которыми я сталкиваюсь в репозитории perforce, являются источниками и заголовочными файлами C/C++, Makefile, скриптами python, perl-скриптами, ruby-скриптами и tcl-скриптами.

  • Я посмотрел в использовании modeline, но большинство из источников в нашем дереве не имеет эту информацию, встроенную в файле.

  • This post упоминает о возможном подходе к поиску и идентификации волшебного узора. Я не мог найти какой-либо последовательной магии, с которой я мог бы получить высокий уровень успеха.

  • Пробовал использовать двоичный код file на моем линке, чтобы узнать, какие результаты я получу. Кажется, для идентификации C/C++ источники хорошо, но не выполняется для Makefiles и даже скрипты Python (которые не имеют hashbang)

Одна хорошая вещь в том, что, в том числе 2-х файлов, которые сравниваются, файл справа от моей локальной копии и, следовательно, имеет правильное имя файла с расширением, поэтому подсветка синтаксиса включена правильно для файла справа.

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

Любые альтернативные решения этой проблемы также приветствуются.

ответ

6

Это была интересная головоломка. :)

aug SmartDiffType 
    au! 
    au VimEnter * :if &diff && len(&ft) | call setwinvar(2/winnr(),'&ft',&ft) | elseif &diff | let &ft=getwinvar(2/winnr(),'&ft') | endif 
aug END 

Примечание:

  • Из 4-х строк выше, вы только потребностиau VimEnter линии, но это, как правило, хорошая практика, чтобы положить автокоманды в некоторой автокоманде группы со сбросом (au!) наверху.
  • автокоманды на VimEnter, потому что в противном случае diff или окна не должным образом еще
  • vimdiff intialized, возможно, были вызваны со старым файлом справа или слева от раскола, поэтому мы рассмотрим оба случай.
  • 2/winnr() является математика трюк, чтобы переключаться между 1 и 2 (2/2 = 1, 2/1 = 2)
+0

Очень приятно. Мне нравится трюк '2/winnr() !! –

+0

Прохладный! Это работает очень хорошо ... Просто переместил if-endif в функцию и заменил команду вызовом функции. :) – Tuxdude

3

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

:windo let &ft = getwinvar(1, '&ft') 

Это установит filetype к значению верхней левой позиции окна для все окна.

Для получения дополнительной справки смотрите:

:h :windo 
:h 'ft' 
:h getwinvar(
+0

Спасибо, это работает. Мне пришлось использовать 'windo let & ft = getwinvar (2, '& ft')', так как в правом окне был правильный тип файла. Есть ли способ добавить его в '.vimrc', так что для каждого vimdiff он делает это автоматически? Простое добавление команды 'windo' в .vimrc не помогло. Я предполагаю, что это может быть позже. – Tuxdude

+0

Хотя я уверен, что такой «autocmd» может быть создан, мне кажется, что самым простым решением было бы создать пользовательскую команду: 'command! -bar -nargs = 0 SameFiletype exe 'windo set ft ='. & ft' Добавьте это в свой файл '~/.vimrc'. В следующий раз, когда возникает ситуация, перейдите в буфер с правильным типом файла и выполните ': SameFiletype' –

+0

Спасибо, это звучит как разумный подход :) – Tuxdude

 Смежные вопросы

  • Нет связанных вопросов^_^