如何让Vim理解*.md文件包含Markdown代码而不是Modula-2代码?

30
当我在Vim中编辑包含Markdown代码的README.md文件并执行:set filetype?命令时,我看到filetype=markdown。Markdown语法被正确地突出显示。
但是当我在Vim中编辑包含Markdown代码的foo.md文件并执行:set filetype?命令时,我看到filetype=modula2。Markdown语法没有被正确地突出显示。
我应该在我的~/.vimrc文件中添加什么内容,以使Vim理解foo.md或任何扩展名为.md的文件是Markdown文件而不是modula2文件?
2个回答

41

问题原因

为了确定是哪个脚本设置了这个文件类型,我在编辑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代码,可能是因为GitHub上README.md文件的日益普及。

解决方案

添加以下语句到~/.vimrc中,以便为所有的 .md 文件设置filetype=markdown

autocmd BufNewFile,BufRead *.md set filetype=markdown

这个命令声明了,当开始编辑一个不存在的新文件或开始编辑一个新缓冲区时,在将文件读入缓冲区后,如果文件与模式*.md匹配,则会设置filetype=markdown

更新

在我现在使用的 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处的补丁已经做出了这个变化。但是,我对于这些变化如何在包含补丁1-448、576的我的Vim版本中得到的还有些困惑。


1
如果您更喜欢更模块化的配置,那么autocmd行也可以放在~/.vim/ftdetect/markdown.vim中。 - ajmccluskey
有人应该告诉VIM开发人员从Modula-2规则中删除.md和.mi文件扩展名,因为这些文件扩展名是非标准的。标准的扩展名是.mod和.def(或.MOD和.DEF)。非标准的.md和.mi使用很可能是一些旧代码库中来自前苏联某个在线仓库发布的遗留代码的结果。但这并不能证明在像VIM这样的工具中使用这些非标准的文件扩展名是合理的。 - trijezdci
@trijezdci 这个问题在 Vim 中似乎已经被修复了。请查看我在“更新”部分下答案的更新。 - Susam Pal
包含此更改的提交实际上是在补丁7.4.479和7.4.480之间进行的运行时更新。我不知道为什么会省略这么多补丁(老实说,我认为这没有意义),但由于包括了7.4.576,您似乎也有来自该特定版本的运行时文件。 - Christian Brabandt
你应该将“问题原因”部分作为重复问题的答案添加进去。这是有用的信息。 - Ethan Furman

9

使用Markdown格式的更完整答案

另一个答案是正确的,但不完整。为了使其与“另存为...:sav”命令一样有效,需要使用BufFilePre扩展自动命令:

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

可能也很有趣,指定一个类似于Pandoc的Markdown风格:

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

请注意,目前Vim仅允许指定一种风格。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接