Как заставить Vim понять, что файлы *.md содержат код Markdown, а не код Modula-2?

Когда я редактирую README.md, содержащий код Markdown в Vim и выполняю команду :set filetype?, я вижу filetype=markdown. Синтаксис Markdown подсвечивается правильно.

Но когда я редактирую foo.md, содержащий код Markdown в Vim и выполняю команду :set filetype?, я вижу filetype=modula2. Синтаксис Markdown не подсвечивается правильно.

Что я должен добавить в свой файл ~/.vimrc, чтобы Vim понял, что foo.md или любой файл с именем расширения, как .md, является файлом markdown, а не файлом modula2?

Ответ 1

Причина проблемы

Чтобы понять, какой script установил этот тип файла, я выполнил следующую команду после редактирования foo.md.

:verbose set filetype?

Я нашел следующий вывод.

  filetype=modula2
        Last set from /usr/share/vim/vim74/filetype.vim

В/usr/share/vim/vim74/filetype.vim, я нашел следующие строки.

au BufNewFile,BufRead *.markdown,*.mdown,*.mkd,*.mkdn,*.mdwn,README.md  setf markdown
au BufNewFile,BufRead *.m2,*.DEF,*.MOD,*.md,*.mi setf modula2

Эти строки показывают, что при редактировании README.md тип файла имеет значение markdown, но при редактировании любого другого файла с расширением имени .md тип файла имеет значение modula2. Другими словами, файлы *.md распознаются как исходный код Modula-2, но для README.md делается исключение для его распознавания как код Markdown, возможно, из-за растущей популярности файлов README.md в GitHub.

Решение

Добавьте следующий оператор в ~/.vimrc в set filetype=markdown для всех файлов .md.

autocmd BufNewFile,BufRead *.md set filetype=markdown

В этом заявлении говорится, что при запуске редактирования нового файла, который не существует или при запуске редактирования нового буфера, после прочтения файла в буфер, если файл соответствует шаблону *.md, тогда set filetype=markdown.

Update

В обновленной версии Vim, которая у меня есть, я обнаружил, что этот вопрос больше не существует.

$ vim --version | head -n 2
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Mar 31 2015 23:36:07)
Included patches: 1-488, 576
$ grep -E "markdown|modula2" /usr/share/vim/vim74/filetype.vim 
au BufNewFile,BufRead *.markdown,*.mdown,*.mkd,*.mkdn,*.mdwn,*.md  setf markdown
au BufNewFile,BufRead *.m2,*.DEF,*.MOD,*.mi     setf modula2

Патч ftp://ftp.vim.org/pub/vim/patches/7.4/7.4.860, похоже, сделал это изменение. Тем не менее, я немного смущен тем, как эти изменения, которые, как представляется, доступны в патче 860, доступны в моей версии Vim, которая включает только патчи 1-448, 576.

Ответ 2

Другой ответ правильный, но неполный. Чтобы это было одинаково работать с командой Save As… :sav, необходимо расширить автокоманду с помощью BufFilePre:

autocmd BufNewFile,BufFilePre,BufRead *.md set filetype=markdown

Также может быть интересно указать вкус Markdown, например Pandoc:

autocmd BufNewFile,BufFilePre,BufRead *.md set filetype=markdown.pandoc

Обратите внимание, что Vim в настоящее время позволяет указать только один вкус.