2009-09-10 137 views
14

我的日常工作涉及使用Perl进行编码。在家里我玩弄Python和Erlang。对于Perl,我想用两个空格缩进我的代码。而Python的标准是4.我也有一些键绑定来打开函数声明,我想用所有的编程语言。 gVim如何实现这一点?gVim和多种编程语言

在那里,有没有办法为每种编程语言或类似的东西维护一个配置文件?

回答

22

您应该能够通过利用文件类型与做......例如,添加到您的vimrc(和适当地修改为不同语言):

autocmd FileType python set tabstop=4|set shiftwidth=4|set expandtab 
+20

请勿覆盖默认设置。使用'setlocal'(或'setl')而不是'set'。您不希望最后一个autocmd的设置打破其他缓冲区。 – 2009-09-10 14:24:53

+0

@Maxim - 良好的捕获... :-) – 2009-09-10 20:59:45

+2

'set'命令接受多个选项。所以,写起来更容易:'set tabstop = 4 shiftwidth = 4 expandtab' – 2009-09-13 01:36:19

23

在$ HOME,使vim的/目录(或vimfiles /在Windows上),在其中创建ftplugin /目录,并在其中保留名为“perl.vim”或“python.vim”或“html.vim”或...

这些应该加载自动打开/创建给定文件类型的新文件,只要您不要忘记在.vimrc中添加:filetype plugin on(或windows下的_vimrc)

然后,vim选项应该定义为:setlocal(而不是:set,否则它们的定义将覆盖默认的全局设置)。

映射定义为:n/i/v(nore)map <buffer>以及缩写。命令是使用-b选项定义的。没有插件的帮助,菜单就无法在本地生成。

local, <buffer>-b对于防止副作用是重要的。

+0

如果您使用的是Windows,请参阅“:help dos-locations”。 – 2009-09-10 10:53:31

+0

+1我不知道可以为单个缓冲区定义命令! – 2009-09-17 01:17:02

3

以下是我的操作方法。以下是我的.vimrc的摘录,并且我保持每种语言的进一步配置,并在加载新缓冲区时加载这些配置。

" HTML 
autocmd BufNewFile,BufRead *.html,*.htm,*.xhtml source ~/.vimhtml 
" XML 
autocmd BufNewFile,BufRead *.xml,*.xmi source ~/.vimxml 
" Perl 
autocmd BufNewFile,BufRead *.pl,*.pm source ~/.vimperl 

请注意,虽然我源文件,我可以执行任何VIM命令或调用函数。例如加载一个新的Java文件,我这样做:

autocmd BufNewFile *.java call GeneratePackage() 

其中GeneratePackage()是VIM功能。

+0

autocmd FileType ...更好,因为您将文件类型检测(使用BufNewFile)与针对该类型文件执行的操作分开。 – joeforker 2009-09-10 12:57:13

7

除了rangerchris的回答,你可能会考虑使用模式线。模式行告诉编辑器如何配置本身:

#!/usr/bin/perl 
# vi: ts=4 sw=4 ht=4 et textwidth=76 : 

use strict; 
use warnings; 

print "hello world\n"; 

这模式行告诉vi来使用4级字符的标签和自动缩进,用空格代替标签,而当光标到达76个字符应该插入一个换行符。

您可以控制Vim的读取模式行有两个变量(在.vimrc最有可能的设置):

set modeline 
set modelines=5 

modeline变量告诉Vim寻找模式行,如果它被设置。 modelines变量告诉Vim从顶部和底部扫描多少行来寻找模式行(在这种情况下,如果它位于文件的第一行或最后五行,它将找到模式行)。

就像任何从不受信任的来源获取指令的系统一样,模式行可以是security threat,所以root用户不应该使用模式行,并且应该保留Vim副本最新。

模式线的真正好处是它们是每个文件。大多数Perl人都是四个空格作为缩进的人,但我是一个八字符标签的人。在处理其他人的代码时,我会使用反映其用法的模式行。剩下的时间我用我自己的。