web-dev-qa-db-ja.com

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

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

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

15
Andrew Ferrier

中央構成

ローカル例外を一元的に構成しても問題がない場合は、そのような自動コマンドを~/.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することをお勧めします。

19
Ingo Karkat

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構成ファイルにカスタムコマンドを追加します。

4
suspectus

Vimのプラグインを使用して、インデントを検出することで、より一般的な方法で問題を解決できます。

私が選んだプラグインは DetectIndent です。プラグインのすべてのフォークをテストして、自分のニーズに合ったものを見つけるのに少し時間がかかりました。オリジナルのものは本当に近かったのですが、完全ではなかったので、私は 自分のフォーク を作りました。

デバッグには、:set verbose=1を実行し、:DetectIndentを使用してプラグインを再実行すると非常に役立ちます。

1
ypid

まだ言及されていない1つの可能な解決策は、1つ上のレベルに移動し、プロジェクト固有のシェルスクリプトを実装して、vim環境を起動することです。

これにより、-Sコマンドラインオプションを使用してvim固有の設定を渡すことができます。利点は、端末やcscopeの設定など、環境の他の側面も構成できることです。

たとえば、fooというC++プロジェクトがあり、ファイル~/.vim/projects/foo.vimの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
0
Caetano Sauer