1. ホーム
  2. vim

[解決済み] コマンドやローカル vimrc ファイルで複数の vim 設定を切り替えるには?

2023-04-13 14:53:42

質問

私はいくつかのグループで仕事をしていますが、それぞれのグループがC言語のタブ、インデント、スペーシングの基準を独自に持っています。

ファイルを編集するときに、それぞれのために別々の選択可能な VIM 設定を持つ方法はありますか。

  • 私は次のようなことをします。 set group=1 でコンフィギュレーションを選択します。
  • 作業ディレクトリにあるローカルな .vimrc を使って、自動的に設定を行います。

どのように解決するのですか?

まとめ

いくつかの方法があり、そのほとんどが提案されているのですが、おまけで2つほどまとめておこうと思います。

  • ディレクトリごとの vimrc - Vim を正しいディレクトリで起動しなければならないという欠点があります: プロジェクトが ~/project1 にあり、あなたが ~/project1/.vim.custom を実行し cd ~ ; vim project1/file.c を実行すると、カスタム設定が見つからなくなります。
  • モデリン - 非常に効果的ですが、すべてのファイルに追加する必要があるという欠点があります (そして、新しいファイルに追加することを忘れないでください)。
  • ディレクトリ固有の自動コマンド - これは非常に効果的です。
  • ファイル内の特定のヘッダーをスキャンする (下記参照) - これは、過去に異なる会社や明確な名前のプロジェクトで作業していたときに最も使用した方法です。
  • ファイルが開かれたときにチェックされるディレクトリごとの vimrc (下記参照)。 特にプロジェクトのコードがすべて 1 つの場所にある場合、もう 1 つのかなり簡単な実装です。

ヘッダをスキャンする

多くの組織では、すべてのソースファイルの先頭に標準的なヘッダ (著作権表示やプロジェクト名など) があります。 このような場合、Vim が自動的にファイルの最初の (たとえば) 10 行をスキャンし、キーワードを探すことができます。 もしそれが見つかったら、設定を変更することができます。 私はこれを私が使っているフォーム(他のたくさんのことをする)よりも単純になるように修正しましたが、そのために ~/.vim/after/filetype.vim (を作成し(まだ持っていない場合)、このようなものを追加してください。

au FileType * call <SID>ConfigureFiletypes(expand("<amatch>"))

" List of file types to customise
let s:GROUPNAMETypes = ['c', 'cpp', 'vhdl', 'c.doxygen']

func! <SID>CheckForGROUPNAMECode()
    " Check if any of the first ten lines contain "GROUPNAME".

    " Read the first ten lines into a variable
    let header = getline(1)
    for i in range(2, 10)
        let header = header . getline(i)
    endfor

    if header =~ '\<GROUPNAME\>'
        " Change the status line to make it clear which
        " group we're using
        setlocal statusline=%<%f\ (GROUPNAME)\ %h%m%r%=%-14.(%l,%c%V%)\ %P
        " Do other customisation here
        setlocal et
        " etc
    endif
endfunc

func! <SID>ConfigureFiletypes(filetype)
    if index(s:GROUPNAMETypes, a:filetype) != -1
        call <SID>CheckForGROUPNAMECode()
    endif
endfunc

あらゆるタイプのファイルを開き、ファイルタイプが設定されるたびに ( au FileType * の行) に ConfigureFiletypes 関数が呼び出されます。 これは、ファイルタイプが現在のグループ(GROUPNAME)に関連付けられたファイルタイプのリスト(この場合は 'c'、'cpp'、'vhdl' または 'c.doxygen' )に含まれているかどうかをチェックします。 その場合、CheckForGROUPNAMECode()を呼び出し、ファイルの最初の10行を読み、それらがGROUPNAMEを含んでいれば、いくつかのカスタマイズを行います。 expandtabsなどの設定と同様に、これはステータスバーを変更してグループ名を明確に表示し、一目で動作していることが分かるようにします。

開くときに設定されているか確認する

JS Bangs の提案と同じように、カスタム設定ファイルを持つことは有用です。 しかし、vimrc で読み込むのではなく、次のようなものを考えてみてください。.c ファイルが開かれたときに、.c ファイルと同じディレクトリに .vim.custom があるかどうかをチェックします。

au BufNewFile,BufRead *.c call CheckForCustomConfiguration()

function! CheckForCustomConfiguration()
    " Check for .vim.custom in the directory containing the newly opened file
    let custom_config_file = expand('%:p:h') . '/.vim.custom'
    if filereadable(custom_config_file)
        exe 'source' custom_config_file
    endif
endfunction