如何在Vim中根据文件类型加载设置?

4

假设我有两组设置,一组用于写作,一组用于编程。我如何修改我的.vimrc文件,使得第一组设置在处理.md 后缀的文件时被加载,而第二组设置在处理html/js/css后缀的文件时被加载?

2个回答

6
尽管基于FileType的:autocmd是您的~/.vimrc(由@andrewdotn建议)的一种快速简便的方式,但Vim有一个适当的抽象:filetype插件。将设置和缓冲区本地映射放入~/.vim/after/ftplugin/{filetype}.vim中。(这需要您使用:filetype plugin on;使用after目录允许您覆盖任何由$VIMRUNTIME/ftplugin/{filetype}.vim执行的默认filetype设置。)

5

使用自动命令。例如,这是我~/.vimrc文件的设置:

autocmd BufRead,BufNewFile *.js,*.html
      \ setlocal indentkeys=!^F,o
autocmd BufRead,BufNewFile *.md
      \ setlocal filetype=markdown | syntax clear

使用setlocal而不是set,以便仅影响与文件名模式匹配的缓冲区。否则,对于像shiftwidth这样的选项更改将在每次加载*.foo文件时影响所有缓冲区。 \行续字符,它允许您将单个命令拆分成多行以增加可读性。 |字符是bar,用于在一行中链接多个命令。
有关更多信息,请参见vim文档中的autocmd.txt

@andewdotn 非常感谢!我有一个问题:这些设置需要设置为setlocal吗?它们可以只是设置为set吗?抱歉我不太熟悉vimscript。需要在条件块中包装那些设置吗? - alexchenco
我通常会看到这样的设置:使用 set 命令来设置 expandtab - alexchenco
如果您不使用 setlocal,则该设置将应用于所有缓冲区,如果您打开了多个文件,则会非常令人讨厌。请参阅:he :setlocal。您不需要将其包装在块或任何内容中;只有当文件名与模式匹配时,相应的设置才会被应用。 - andrewdotn
谢谢。我的意思是,根据你的示例,我现在不明白setlocal如何与autocmd BufRead,BufNewFile“连接”起来。它似乎被“嵌套”在里面了?你能否扩展示例以包括一个或多个设置? - alexchenco
哦,我明白了——行首的“\”是一种行继续字符。从技术上讲,这与在一行上写autocmd BufRead,BufNewFile *.js,*.html setlocal indentkeys=!^F,o是相同的,只是使用行首的“\”更易读和更习惯。请注意,vimscript语法实际上是在eval.html中定义的。 - andrewdotn
@andrewdotn,你能否在你的回答中包含这个反斜杠的解释,以便未来的访问者参考? - Conner

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