私が取り組んでいるプログラミングプロジェクトでは、他のすべての人が4のタブサイズを使用しているので、set tabstop=4
の~/.vimrc
に最も簡単だと思います。ただし、編集するすべてのファイル(このプロジェクトのファイルのみ)にこれが影響するのではなく、特定のディレクトリ(およびそのサブディレクトリ)内のすべてのファイルについて考えてみましょう。
ファイルのディレクトリプレフィックスに基づいて条件付きで簡単に変数を設定できる方法はありますか?
ローカル例外を一元的に構成しても問題がない場合は、そのような自動コマンドを~/.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
することをお勧めします。
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の設定など、環境の他の側面も構成できることです。
たとえば、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