特定のディレクトリツリー内のファイルに対してのみvimオプションを設定しますか?


15

私が取り組んでいるプログラミングプロジェクトには、他の全員が4のタブサイズを使用しset tabstop=4ているものがあり~/.vimrcます。ただし、編集するすべてのファイル(このプロジェクトのファイルのみ)に影響を与えたくありません。特定のディレクトリ(およびそのサブディレクトリ)内のすべてのファイルについて考えてみましょう。

ファイルのディレクトリプレフィックスに基づいて変数を簡単に条件付きで設定できる方法はありますか?


回答:


19

中央構成

ローカルの例外を中央で設定しても問題ない場合は、そのようなautocmdを次の場所に配置できます~/.vimrc

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

一方、プロジェクトとともに特定の構成を保存したい場合(そして、これをmodelinesを介してすべてのファイルに埋め込みたくない場合)、次の2つのオプションがあります。

組み込み機能を備えたローカル設定

常にプロジェクトのルートディレクトリからVimを起動する場合、ビルトイン

:set exrc

.vimrc現在のディレクトリからのファイルの読み取りを有効にします。:set ts=4 sw=4そこにコマンドを配置できます。

プラグインによるローカル設定

それ以外の場合は、プラグインの助けが必要です。vim.orgにはいくつかあります。localrcプラグインをお勧めします。これにより、ローカルのファイルタイプ固有の構成も可能になります。

ファイルシステムから設定を読み取ることはセキュリティに影響することに注意してください。あなたがしたいことがあり:set secureます。


1
3番目のソリューション(プラグイン)は優れており、まさに私が探していた種類のものです。私は設定を中央に置くことを避けようとしているので、最初のものは理想的ではないことは正しいです。包括的な回答をありがとう。
アンドリューフェリエ

すごい!また、localrcプラグインも使用します。本当に便利です。
インゴカルカット

autocmdメソッドが機能しないという問題に他の誰かが遭遇した場合は、パスにシンボリックリンクがないことを確認してください-シンボリックリンクのないフルパスを使用する前に、それが動作するようにしなければなりませんでした(OS X 10.9)
ドーランアンテヌッチ14

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私の質問は実際にはタブサイズの設定ではなく、ディレクトリツリーごとの構成に関するものでした。タブサイズは単なる例にすぎません。しかし、私はあなたが今何を得ているかを見て、それは役に立つヒントです。ありがとう。
アンドリューフェリエ

0

まだ言及されていない解決策の1つは、1レベル上に移動して、プロジェクト固有のシェルスクリプトを実装して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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.