是否只为特定目录树中的文件设置vim选项?


15

有在哪里其他人使用的4 TABSIZE,编程项目,我的工作,所以我觉得它最直接地set tabstop=4在我的~/.vimrc。但是,我宁愿不影响我编辑的每个文件-仅影响该项目的文件-假设某个目录(及其子目录)中的每个文件。

有没有一种方法可以轻松地根据文件的目录前缀有条件地设置变量?


Answers:


19

中央配置

如果可以集中配置本地异常,则可以将此类autocmds放入您的~/.vimrc

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

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

具有内置功能的本地配置

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

:set exrc

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

通过插件进行本地配置

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

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


1
第三种解决方案(插件)非常出色,而且正是我所寻找的那种。我试图避免将配置集中放置,所以您说对了,第一个并不理想。感谢您的全面答复。
安德鲁·费里尔

大!我也使用localrc插件;这真的很有用。
Ingo Karkat

万一其他人遇到autocmd方法不起作用的问题,请确保您的路径中没有任何符号链接-我必须先放置没有符号链接的完整路径,然后才能对我有用(在OS X 10.9上)
Dolan Antenucci 2014年

4

您可以使用source(so)命令将vim配置为读取更多命令。将此添加到您的~/.vimrc-它会搜索当前目录,如果未找到.vimrc_proj文件,则在父目录中搜索.vimrc_proj。

if filereadable(".vimrc_proj")
    so .vimrc_proj
else
    if filereadable("../.vimrc_proj")
         so .vimrc_proj
    endif
endif

然后在.vimrc_proj配置文件中添加任何自定义命令以适合您的项目。


我认为这仅在打开文件时位于项目目录中才有效,对吗?这不能处理当前目录与其他目录完全不同的地方。
安德鲁·费里尔

正确,这是一种局限性
嫌疑犯

1

您可以使用Vim插件通过尝试检测缩进以更一般的方式解决问题。

我选择的插件是DetectIndent。我花了一些时间测试插件的所有分支,以找到适合我需求的插件。原始的确实很近,但是距离不太远,所以我自己做了叉子

对于调试,:set verbose=1使用再次运行插件非常有帮助:DetectIndent


我认为您可能将这个答案放在了错误的问题上?它似乎不相关。
安德鲁·费里尔

@AndrewFerrier这个答案很合适,只是对问题提出了不同的态度。您可以使用插件来检测每个文件的正确标签大小,而不必为特定文件设置标签大小。
gronostaj

@gronostaj我的问题不是真的关于设置选项卡的大小,而是关于每个目录树的配置-选项卡的大小只是一个例子。但我知道您现在所得到的,这是一个有用的提示。谢谢。
安德鲁·费里尔

0

尚未提到的一种可能的解决方案是上一层并实现特定于项目的shell脚本以启动vim环境。

这允许使用-S命令行选项传递特定于vim的设置。优点是它还允许配置环境的其他方面,例如终端或cscope设置。

例如,假设我有一个名为的C ++项目foo,我想为此文件加载vim设置~/.vim/projects/foo.vim。如果从某些快速启动工具或桌面快捷方式调用命令,我也想设置一个cscope索引并启动一个终端窗口。要打开我的环境,我有以下脚本,称为vim-foo

#!/bin/bash

# Script to setup the VIM development environment of my "foo" project
# Includes building ctags and cscope databases.

VIM_CONFIG=$HOME/.vim/projects/foo.vim
BASE_DIR=$HOME/work/foo

function setup_cscope()
{
    CSCOPE_FILES=$BASE_DIR/cscope.files

    created_files=false

    # check if global cscope.files exist
    if [ ! -f $CSCOPE_FILES ]; then
        echo "Creating cscope.files"
        find $BASE_DIR/src -name '*.cpp' -o -name '*.h' >> $CSCOPE_FILES
        created_files=true
    fi

    # create cscope database
    if [ $created_files ] || \ 
        [ ! -f $BASE_DIR/cscope.in.out ] || \
        [ ! -f $BASE_DIR/cscope.po.out ] || \
        [ ! -f $BASE_DIR/cscope.out ]; then
            echo "Creating cscope database"
            cscope -b -q -i $CSCOPE_FILES
            for f in in.out po.out out; do
                mv cscope.$f $BASE_DIR/
            done
    fi

    export CSCOPE_DB=$BASE_DIR/cscope.out
}

# setup everything and finally launch vim
setup_cscope
cd $BASE_DIR
if [[ $TERM == "rxvt-unicode" ]]; then
    vim -S $VIM_CONFIG
else
    urxvt -e vim -S $VIM_CONFIG
fi
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.