私が取り組んでいるプログラミングプロジェクトには、他の全員が4のタブサイズを使用しset tabstop=4
ているものがあり~/.vimrc
ます。ただし、編集するすべてのファイル(このプロジェクトのファイルのみ)に影響を与えたくありません。特定のディレクトリ(およびそのサブディレクトリ)内のすべてのファイルについて考えてみましょう。
ファイルのディレクトリプレフィックスに基づいて変数を簡単に条件付きで設定できる方法はありますか?
私が取り組んでいるプログラミングプロジェクトには、他の全員が4のタブサイズを使用しset tabstop=4
ているものがあり~/.vimrc
ます。ただし、編集するすべてのファイル(このプロジェクトのファイルのみ)に影響を与えたくありません。特定のディレクトリ(およびそのサブディレクトリ)内のすべてのファイルについて考えてみましょう。
ファイルのディレクトリプレフィックスに基づいて変数を簡単に条件付きで設定できる方法はありますか?
回答:
ローカルの例外を中央で設定しても問題ない場合は、そのような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
ます。
autocmd
メソッドが機能しないという問題に他の誰かが遭遇した場合は、パスにシンボリックリンクがないことを確認してください-シンボリックリンクのないフルパスを使用する前に、それが動作するようにしなければなりませんでした(OS X 10.9)
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
、プロジェクトに合わせてカスタムファイルを構成ファイルに追加します。
Vimのプラグインを使用して、インデントを検出しようとすることにより、より一般的な方法で問題を解決できます。
私が選んだプラグインはDetectIndentです。プラグインのすべてのフォークをテストして、自分のニーズに合ったものを見つけるのに時間がかかりました。元のものは本当に近くでしたが、完全ではありませんでしたので、私は自分のフォークを作りました。
デバッグするには:set verbose=1
、次のコマンドでプラグインを再度実行すると非常に役立ちます。:DetectIndent
まだ言及されていない解決策の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