我在几个组中工作,每个组在C语言方面都有自己的标签/缩进/空格规范。
是否有一种方法可以为每个组拥有单独可选择的VIM配置,以便在编辑文件时:
- 我可以像
set group=1
这样做来选择配置 - 使用位于工作目录中的本地 .vimrc 自动设置配置
我在几个组中工作,每个组在C语言方面都有自己的标签/缩进/空格规范。
是否有一种方法可以为每个组拥有单独可选择的VIM配置,以便在编辑文件时:
set group=1
这样做来选择配置我在$HOME/.vimrc
文件中写了如下内容:
if filereadable(".vim.custom")
so .vim.custom
endif
这使我能够在每个目录中放置一个.vim.custom
文件,以加载特定于该目录的命令和选项。如果您正在处理具有深层目录结构的多个项目,则可能需要更复杂的东西(例如,向上遍历目录树,直到找到.vim.custom
),但是相同的基本思想将适用。
更新:
现在我会做类似以下的事情,从与我正在编辑的文件相同的目录中读取.vim
文件,而不管当前目录是什么。
let b:thisdir=expand("%:p:h")
let b:vim=b:thisdir."/.vim"
if (filereadable(b:vim))
execute "source ".b:vim
endif
'exrc'
选项已经允许进行非常类似的操作。它将在当前工作目录中加载.vimrc
/.exrc
/.gvimrc
文件。 - jamessanexrc
的评论应该是正确的答案。其他的东西似乎都太过于hacky和复杂了。 - silvenon.vim
文件,而你的小插件会读取它。我想如果你下载了恶意代码,那就什么都不保险了,但这似乎让它更容易实现。 - trysis有几种方法可以实现这一功能,其中大部分已经被提出,但我想用两种额外的方式来总结一下:
~/project1
中,并且您有~/project1/.vim.custom
文件,然后执行cd ~ ; vim project1/file.c
,则无法找到自定义设置。在许多组织中,每个源文件的顶部都有一个标准的头部(包括版权声明和项目名称等)。如果是这种情况,则可以让Vim自动扫描文件的前10行(例如)以查找关键字。如果找到了它,就可以更改您的设置。我对此进行了修改,使其比我使用的形式更简单,但是创建一个~/.vim/after/filetype.vim
(如果您还没有该文件),并添加类似于以下内容的内容:
au FileType * call <SID>ConfigureFiletypes(expand("<amatch>"))
" List of file types to customise
let s:GROUPNAMETypes = ['c', 'cpp', 'vhdl', 'c.doxygen']
func! <SID>CheckForGROUPNAMECode()
" Check if any of the first ten lines contain "GROUPNAME".
" Read the first ten lines into a variable
let header = getline(1)
for i in range(2, 10)
let header = header . getline(i)
endfor
if header =~ '\<GROUPNAME\>'
" Change the status line to make it clear which
" group we're using
setlocal statusline=%<%f\ (GROUPNAME)\ %h%m%r%=%-14.(%l,%c%V%)\ %P
" Do other customisation here
setlocal et
" etc
endif
endfunc
func! <SID>ConfigureFiletypes(filetype)
if index(s:GROUPNAMETypes, a:filetype) != -1
call <SID>CheckForGROUPNAMECode()
endif
endfunc
每当打开任何类型的文件并设置文件类型(au FileType *
行),都会调用 ConfigureFiletypes
函数。这将检查文件类型是否在当前组(GROUPNAME)关联的文件类型列表中,本例中为'c'、'cpp'、'vhdl'或'c.doxygen'。如果是,则调用 CheckForGROUPNAMECode()
,读取文件的前 10 行,如果它们包含 GROUPNAME,则进行一些自定义操作。除了设置 expandtabs 或其他内容之外,还将更改状态栏以清晰地显示组名,以便您一目了然地知道它已经生效。
与 JS Bangs 建议类似,拥有自定义配置文件可能会很有用。但是,考虑以下方法,它将在打开 .c 文件时检查是否存在与 .c 文件在同一目录下的 .vim.custom 文件。
au BufNewFile,BufRead *.c call CheckForCustomConfiguration()
function! CheckForCustomConfiguration()
" Check for .vim.custom in the directory containing the newly opened file
let custom_config_file = expand('%:p:h') . '/.vim.custom'
if filereadable(custom_config_file)
exe 'source' custom_config_file
endif
endfunction
您还可以在.vimrc
中放置autocommands,这些autocommands可以根据路径设置特定的选项。
au BufRead,BufNewFile /path/to/project1/* setl sw=4 et
au BufRead,BufNewFile /path/to/project2/* setl sw=3 noet
合适的插件: http://www.vim.org/scripts/script.php?script_id=441
这个插件会在当前打开的文件所在的目录下,向上搜索所有 ".lvimrc" 文件,并且按照相反的顺序加载。默认情况下,它会一直搜索到根目录。可以通过全局变量来自定义要加载的文件名和数量。
/*
* vim:ts=4:sw=4:expandtab:...
*/
int main(int argc, char **argv)
{
...
swim
是一个快速工具,用于切换 vimrc 文件和创建方便的别名。以下是简短的使用列表。请查看 Github repo 以获取演示 gif 和下载说明:
swim add ~/dotfiles/myVimrc favorite #Add new swim alias
swim ls #Show available swim aliases
swim add https://raw.githubusercontent.com/dawsonbotsford/swim/master/exampleVimrcs/vimrcWikia.vim example
swim with favorite #Set alias favorite as primary .vimrc
swim with main #Set alias main as primary .vimrc
在尝试了前面帖子中建议的localvimrc插件后,我非常喜欢在vim设置中具有非常方便的每个项目控制能力。它默认会在加载.lvirc文件之前询问确认,但也有设置可以自动加载.lvirc文件。某些人可能认为这是一个安全漏洞,但它确实如广告所述。
我选择将.lvirc文件加入到.gitignore中。或者,您可以将其作为共享设置(制表符/空格扩展、TabStop和其他项目特定的设置)一起检查。
.lvimrc
文件加入到 .gitignore
中?这样做的目的是,所有使用 vim 并安装了插件的人都可以获得相同的设置。 - alexiafunction! ConditionalLoad()
let cwd = getcwd()
if getcwd() =~ $HOME . "/src/mobile"
so $HOME/.vim.mobile
endif
endfunction
autocmd VimEnter * call ConditionalLoad()
~/.vimrc
中,将/src/mobile
更改为我的Symfony项目目录(在我的情况下是/www/symfony
),并将.vim.mobile
修改为.vim.symfony
,然后将新的.vimrc
配置放置在~/.vim.symfony
文件中。 - jmarceli正如sledge所提到的,该插件的使用是我见过和使用过的最佳选择。jerseyboy评论说,推荐的实用程序在加载之前需要确认(即在打开每个文件后)。为了避免这种情况,只需在您的主.vimrc
中设置本地.lvimrc
文件列表:
let g:localvimrc_whitelist='/development/kernel/.lvimrc'
switch
语句中的case
标签是否缩进,或者包装的函数参数列表是否仅缩进或与参数列表的开括号对齐。 Vim确实具有此类设置,因此可以合理地扩展该程序以分析样式并输出这些参数。