我分为几个小组,每个小组都有自己的C语言制表符/缩进/间距标准。
在编辑文件时,有没有一种方法可以为每种方法分别提供单独的可选VIM配置:
- 我喜欢
set group=1
选择配置 - 工作目录中的本地.vimrc用于自动设置配置
我分为几个小组,每个小组都有自己的C语言制表符/缩进/间距标准。
在编辑文件时,有没有一种方法可以为每种方法分别提供单独的可选VIM配置:
set group=1
选择配置Answers:
有几种方法可以做到这一点,其中大多数已被建议,但我想我将它们总结为另外两个方法:
~/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的建议非常相似,拥有自定义配置文件可能会很有用。但是,不要将其加载到vimrc中,请考虑类似这样的事情,它将检查何时在与.c文件相同的目录中为.vim.custom打开.c文件。
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
我有这样的$HOME/.vimrc
:
if filereadable(".vim.custom")
so .vim.custom
endif
这使我可以.vim.custom
在每个目录中放置一个文件,以加载特定于该目录的命令和选项。如果您正在处理具有深层目录结构的多个项目,则可能需要更复杂的内容(例如,走到目录树直到.vim.custom
找到a),但是相同的基本思想将起作用。
更新:
我现在要执行类似的操作,以便.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
。
exrc
应该是正确的答案。其他所有内容似乎都很古怪而复杂。
exrc
非常好,但是即使我与正在编辑的文件不在同一个工作目录中,我也希望能获得正确的文件,我对此表示赞赏。
您还可以将自动命令放在.vimrc
其中,以每个路径为基础设置特定选项。
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
“此插件在当前打开的文件的文件系统树中搜索本地vimrc文件。默认情况下,它将搜索从文件目录到根目录的所有“ .lvimrc”文件,并以相反的顺序加载它们。可通过全局变量自定义文件名和已加载文件的数量。”
假设您的开发人员不会对此有所抱怨,您可以随时在注释中的每个文件中添加vim设置。
/*
* vim:ts=4:sw=4:expandtab:...
*/
int main(int argc, char **argv)
{
...
我为此目的创建了一个开源工具。忘记标题,扫描,配置和本地vimrc文件。
尝试游泳。
swim
是用于切换vimrc文件和创建方便的别名的快速工具。这是一个简短的用法列表。请参阅Github存储库以获取演练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设置进行非模糊的每个项目控制。
默认情况下,它确实会在加载.lvimrc文件之前进行确认,但是有一个设置可以自动加载.lvimrc文件。某些人可能将其视为安全漏洞,但它的作用与广告宣传一致。
我选择.gitignore .lvimrc文件。或者,您可以以共享设置的形式(选项卡/空间扩展,制表符,其他项目特定的设置)来检查它们。
.lvimrc
文件添加到.gitignore
?关键是每个使用vim并安装了插件的人都将获得相同的设置。
这是詹姆士
function! ConditionalLoad()
let cwd = getcwd()
if getcwd() =~ $HOME . "/src/mobile"
so $HOME/.vim.mobile
endif
endfunction
autocmd VimEnter * call ConditionalLoad()
我会经常启动vi而没有要跳转到的特定文件,因此这可以根据当前工作目录有条件地加载配置。缺点是该配置不是基于文件而是基于工作目录。
~/.vimrc
,更改/src/mobile
为我的Symfony项目目录(在我的情况下为/www/symfony
),并进行了修改.vim.mobile
,.vim.symfony
然后将新的.vimrc配置放入~/.vim.symfony
文件中
我分为几个小组,每个小组都有自己的C语言制表符/缩进/间距标准。
我同时使用各种开源软件。创建单独的.vimrc
文件并重新配置格式标准是不切实际的。十多年前,我终于对处理编辑器配置感到厌倦,并编写了一个程序autotab
来处理它。
当autotab
设置了Vim的建议,每次加载一个文件到Vim中,autotab
调用它,Vim的设置输出autotab
传递给:set
命令。
autotab
从文件中读取数千行,对其进行分析并确定设置的expandtab
,tabstop
和shiftwidth
参数。
它确定文件是使用硬制表符还是仅使用空格进行缩进,并确定缩进大小。如果文件带有制表符缩进,则它会根据使用各种制表符尺寸呈现文件样本并根据启发式方法(例如内部元素的行间对齐)来判断出正确的制表符尺寸。
它运作良好,以至于我几年前停止调整算法。如果感到困惑,通常是因为文件存在格式问题,例如同时使用多种约定。
它也是文件类型的“不可知论”,并且可以与多种不同的语言一起很好地工作。我不仅在C上使用它,而且还在shell脚本,Lisp,Makefiles,HTML以及您拥有的东西上使用它。
请注意,它不会处理其他特定于项目的格式设置参数,例如C文件中的格式,语句中的case
标签是否switch
缩进,包装的函数参数列表是否简单缩进或与参数列表的开头括号。Vim确实具有此类设置,因此可以合理地扩展程序以分析样式并输出这些参数。
在寻找几乎相同的问题时,我还找到了Sauce插件:http : //www.vim.org/scripts/script.php? script_id=3992
它声称:
Sauce是用于多个vimrc文件的轻量级管理器,可用于为不同的环境加载不同的设置。简而言之,您可以维护许多不同的vim设置文件,并且仅在需要时加载所需的文件。
我发现特别有趣的是,它将所有配置都保留在其数据目录中,而不是期望用户在整个文件系统上散布点文件。尽管这常常是个人品味的体现。
我还没有测试。
你可以用垫木切换配置(任何点文件,不仅.vimrc
)
安装stow
:
$ apt install stow
为每种配置创建多个目录:
~$ ls -d ~/dotfiles/vim*
vim-all vim-webdev vim-go
.vimrc
在其中放入不同的:
$ find ~/dotfiles -name .vimrc
/home/username/vim-golang/.vimrc
/home/username/vim-webdev/.vimrc
/home/username/vim-all/.vimrc
现在,您可以使用以下命令实例化vim-golang配置(应在dotfiles目录中运行):
~$ cd ~/dotfiles
dotfiles$ stow -v vim-golang
LINK: .vimrc => dotfiles/vim-golang/.vimrc
现在已链接:
$ cd ~ && ls -l .vimrc
.vimrc -> dotfiles/vim-golang/.vimrc
如果您需要切换配置,只需重新配置即可stow
:
~$ cd dotfiles
dotfiles$ stow -v -D vim-golang
UNLINK: .vimrc
dotfiles$ stow -v vim-webdev
LINK: .vimrc => dotfiles/vim-webdev/.vimrc
$ cd ~ && ls -l .vimrc
.vimrc -> dotfiles/vim-webdev/.vimrc
在这里阅读更多内容:使用GNU存放管理点文件
优点:非常简单,没有vim插件依赖性,不仅可以用于管理所有点文件.vimrc
。
缺点:配置彼此独立,您需要分别管理/更新每个配置(如果您不频繁地切换/更新配置-这不会成为问题)。