如何在Vim中为不同的文件类型设置不同的配色方案?

43
在{{Vim}}中,我想为每种文件类型使用不同的颜色方案。
例如,我想在{{Python}}和{{JavaScript}}文件中使用{{desert256}}颜色方案,并在{{HTML}}和{{CSS}}文件中使用{{jellybeans}}颜色方案。
我已经尝试将以下代码放入我的.vimrc中,但颜色方案的更改仅在第一次更改缓冲区时发生。
即。如果我打开一个新的Python文件,则使用Python的颜色方案,并且当我打开一个新的CSS *缓冲区*时,确实会将颜色方案更改为CSS的颜色方案。但是,切换回Python的缓冲区不会将颜色方案更改回来。
我已经使用autocmd WinEnter尝试使此规则在更改窗口(和缓冲区)时发生,但没有帮助:
autocmd WinEnter,FileType python,javascript colorscheme desert256
autocmd WinEnter,FileType *,html,css        colorscheme jellybeans  " This includes default filetype colorscheme.

我应该怎么修复这个问题?此外,一个额外的奖励是在不需要更改颜色方案时不更改它 - 即,从 Python 缓冲区切换到 JavaScript 缓冲区不会将颜色方案更改为“自身”。


编辑:

如果有人感兴趣,这是我的.vimrc仓库在github.com上。一旦找到解决方案,我会在这里更新它。


可能是重复问题:通过文件类型更改Vim缩进行为。解决方案相同--ftplugin,autocmd。 - user202729
4个回答

36

我一直在寻找同样的东西。虽然不是完美的,但这个在你的.vimrc中的内容运行得相当好。

autocmd BufEnter * colorscheme default
autocmd BufEnter *.php colorscheme Tomorrow-Night
autocmd BufEnter *.py colorscheme Tomorrow

(注意,如果你正在寻找一个不错的深色主题,Tomorrow-Night 看起来相当不错。非常类似于 Code Academy 使用的主题。)


2
这确实可以工作,但只是部分解决方案。例如,如果我使用solarized主题,它会切换到浅色调色板,而不是我的默认深色调色板。我猜想,如果我们将您的解决方案与调用自定义用户定义函数相结合,该函数应设置其他一些内容,然后调用colorscheme ..,我们可以达到一个好的解决方案。然而,我很久以前就放弃尝试了,所以我不会真正去尝试。:) 尽管如此,感谢您的解决方案! - Ory Band
1
@OryBand,你为什么放弃尝试做这个了? - Freedom_Ben

22
你需要的是文件类型插件,而不是autocmd。在vim中运行help:ftplugin以获取更多信息。
从vim帮助页面中可以了解到:
文件类型插件类似于全局插件,但它仅为当前缓冲区设置选项并定义映射。
要使用文件类型插件,请首先将filetype plugin on一行添加到您的vimrc文件中。然后在您的vim文件夹中创建ftplugin文件夹(在Unix上,它是~/.vim/,我不熟悉Windows)。然后为要自定义的每个文件类型创建一个脚本文件。这些文件必须按特定的方式命名。从vim帮助页面中可以了解到:
文件类型插件的通用名称为:
ftplugin/filetype.vim
ftplugin/filetype_name.vim
ftplugin/filetype/name.vim
因此,例如,如果我想为python文件创建一个脚本,则有三个选项:
1. 在ftplugin中创建名为 python.vim 的文件 2. 在ftplugin中创建名为 python_whatever.vim 的文件 3. 在ftplugin/python中创建名为 whatever.vim 的文件
这样,每次打开vim识别为python文件的文件时,都会加载该脚本。
所以,为了实现您想要的:
1. 为每个文件类型在ftplugin目录中创建名为filetype.vim的文件。 2. 在这些文件中,添加一行colorscheme name_of_colorscheme。 3. 在您的vimrc文件中添加filetype plugin on。 4. 要设置默认颜色方案,只需在vimrc文件中设置它。如果我记得正确,文件类型插件是在vimrc之后加载的。该OP指出他有避免使用ftplugin目录的充分理由。经过进一步挖掘,我找到了这个脚本。 它可以放置在全局vimrc中,并且似乎旨在解决与该OP相同的问题。

你确定这不能在我的.vimrc文件中完成吗?我使用Vundle插件来避免使用特定于插件的文件夹。 - Ory Band
还有,我刚试了一下。它不能正常工作。如果我先打开一个Python文件,然后再打开一个普通文件(例如我的.vimrc文件),语法就不会改变。:( - Ory Band
@Ory Band,我找到了一种不同的解决方案,可能是你想要的。链接已放在答案中。 - cledoux
谢谢,我已经尝试设置示例,但是没有注释或任何东西,我似乎无法使其工作。我会在那里发布这个评论。但是,这也不是我要寻找的。非常感谢您。您真是太好了。 - Ory Band
这对我非常有用,因为我的 .vimrc 配置比较复杂,而且 autocmd 在我设置状态栏颜色之后执行,所以它们会搞乱一切。所以在阅读了这篇文章之后,我做的是:cp ~/.vimrc ~/.vim/ftplugin/python.vim,并为 Python 文件更改了需要更改的一行代码,问题迎刃而解。谢谢。 - Jon Red

4

我有一个可能会对你有用的技巧。它远非完美,也不使用.vimrc文件,但对我来说很有效。它要求你输入不同的命令来编辑不同的文件。它使用-c参数在调用gvim时工作。该参数允许您在加载文件后运行vim命令。将以下内容添加到您的~/.bashrc文件中(我猜您正在使用bash):

alias gpy="gvim -c 'colorscheme desert'"
alias gcs="gvim -c 'colorscheme jellybeans'"

希望这有所帮助。

1
+1 是为了在命令行上设置它,这正是我真正想要的。 - Philip Kearns

3

使用BufWinEnter代替WinEnter,像这样:

autocmd BufWinEnter,FileType javascript colorscheme jellybeans

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