コマンドまたはローカルvimrcファイルを使用して複数のvim構成を切り替える方法は?


85

私はいくつかのグループで働いており、それぞれがCで独自のタブ/インデント/間隔の標準を持っています。

ファイルを編集するときに、それぞれに個別に選択可能なVIM構成を設定する方法はありますか?

  • set group=1構成を選択するようなことをします
  • 作業ディレクトリにあるローカルの.vimrcを使用して、構成を自動的に設定します

これを確認してください:stackoverflow.com/a/14407951/1099240
Dmitry Frank

スーパーユーザーの2つの異なるvim構成切り替えるという質問も参照してください。
hotschke 2018

回答:


40

要約すれば

これを行うにはいくつかの方法があり、そのほとんどが提案されていますが、私はそれらを2つの追加の方法で要約すると思いました。

  • ディレクトリごとのvimrc - Vimは正しいディレクトリで起動しなければならないという欠点を持っている:あなたのプロジェクトがである場合~/project1、あなたが持っている~/project1/.vim.customと行うcd ~ ; vim project1/file.c、カスタム設定が見つかりません。
  • Modelines-非常に効果的ですが、すべてのファイルに追加する必要があるという欠点があります(そして、新しいファイルに追加することを忘れないでください)
  • ディレクトリ固有の自動コマンド-これは非常に効果的です
  • ファイル内の特定のヘッダーをスキャンします(以下を参照)-これは、さまざまな会社や明確に名前が付けられたプロジェクトで働いている過去に私が最も使用したものです
  • ファイルを開いたときにチェックされるディレクトリごとのvimrc(以下を参照)。特にプロジェクトコードがすべて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が含まれている場合は、いくつかのカスタマイズを行います。エキスパンドタブなどを設定するだけでなく、ステータスバーも変更され、グループ名が明確に表示されるため、一目で機能していることがわかります。

開くときに構成を確認する

JS Bangsの提案と同じように、カスタム構成ファイルがあると便利です。ただし、vimrcにロードする代わりに、次のようなものを検討してください。これにより、.cファイルと同じディレクトリにある.vim.customに対して.cファイルが開かれたときにチェックされます。

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

66

私はこれを持っています$HOME/.vimrc

if filereadable(".vim.custom")
    so .vim.custom
endif

これにより.vim.custom、すべてのディレクトリにファイルを配置して、そのディレクトリに固有のコマンドとオプションをロードできます。深いディレクトリ構造を持つ複数のプロジェクトで作業している場合は、より洗練されたものが必要になる場合があります(たとえば、.vim.customが見つかるまでディレクトリツリーを上に移動します)が、同じ基本的な考え方で機能します。

更新:

.vim現在のディレクトリが何であるかに関係なく、編集しているファイルと同じディレクトリからファイルを読み取るために、このようなことをします。

let b:thisdir=expand("%:p:h")
let b:vim=b:thisdir."/.vim"
if (filereadable(b:vim))
    execute "source ".b:vim
endif

1
これは素晴らしいです、私はこれを見たことがありません!
ジムミッチェナー

1
これは、リポジトリに存在するプロジェクトに最適なソリューションです。
bradreaves 2009

2
この'exrc'オプションでは、これと非常によく似たことがすでに許可されています。それがロードされます.vimrc/ .exrc/.gvimrc現在の作業ディレクトリにあります。
jamessan 2013

についてのコメントexrcは正しい答えでなければなりません。他のすべてはハッキーで複雑に見えます。
シルベノン2014年

使用するのexrcは良いことですが、編集しているファイルと同じ作業ディレクトリにいない場合でも、正しいファイルを取得できれば幸いです。
JSBձոգչ2014年

34

パスごとに特定のオプションを設定する自動コマンドをに入れることもでき.vimrcます。

au BufRead,BufNewFile /path/to/project1/* setl sw=4 et
au BufRead,BufNewFile /path/to/project2/* setl sw=3 noet

これは、リポジトリを制御していないために「.vim.custom」ファイルをそこに配置できない場合に最適です。私はそれがリポジトリをきれいに保つのが好きです。ありがとう。免責事項:パスがパターンに対応しない方法で変更され続ける場合は、リポジトリを変更できると仮定すると、「。vim.custom」バージョンの方がおそらく優れています。
lpapp 2014年

17

正しいことをしているプラ​​グイン:http//www.vim.org/scripts/script.php?script_id = 441

「このプラグインは、現在開いているファイルのファイルシステムツリーでローカルvimrcファイルを検索します。デフォルトでは、ファイルのディレクトリからルートディレクトリまでのすべての「.lvimrc」ファイルを検索し、それらを逆の順序でロードします。ロードされたファイルのファイル名と量は、グローバル変数を介してカスタマイズできます。」


3
また、githubバージョンは病原体の読み込みもサポートしています:-)
Graza 2012年

別の同様のプラグインはlocalrc.vimです。また、ファイルタイプ固有のディレクトリごとの設定も可能です。欠かせないものだと思います。vim.org/scripts/script.php?script_id=3393
Ingo Karkat 2012

12

仲間の開発者がそれについて文句を言わないと仮定すると、コメントの各ファイルにいつでもvim設定を追加できます。

/*
 * vim:ts=4:sw=4:expandtab:...
 */

int main(int argc, char **argv)
{
    ...

2
私は私のチームのほとんどで唯一の啓発された開発者なので、誰も気にする必要はありません。これは、ファイルごとのソリューションとして非常に優れています。
bradreaves 2009

1
目立たないように一番下に追加するのが好きですが、それはスタイルの問題だと思います。
nyuszika7h 2014年

5

私はこの目的のためにオープンソースのツールを作成しました。ヘッダー、スキャン、構成、ローカルvimrcファイルを忘れてください。

泳いでみてください。


泳ぐ

swimはvimrcファイルを切り替えて便利なエイリアスを作成するためのクイックツールです。これが短い使用法リストです。ウォークスルーGIFとダウンロード手順については、Githubリポジトリを参照してください。


使用法

swim add ~/dotfiles/myVimrc favorite    #Add new swim alias
swim ls                                 #Show available swim aliases
swim add https://raw.githubusercontent.com/dawsonbotsford/swim/master/exampleVimrcs/vimrcWikia.vim example
swim with favorite         #Set alias favorite as primary .vimrc
swim with main             #Set alias main as primary .vimrc

続きを読む

https://github.com/dawsonbotsford/swim


4

前のポスターで提案されたlocalvimrcプラグインを試した後、私はvim設定をプロジェクトごとに制御するのがとても好きです。

デフォルトでは、.lvimrcファイルをロードする前に確認を求めますが、.lvimrcファイルを自動的にロードする設定があります。これをセキュリティホールと見なす人もいるかもしれませんが、宣伝どおりに機能します。

.lvimrcファイルを.gitignoreすることを選択しました。または、共有設定(タブ/スペース拡張、タブストップ、その他のプロジェクト固有の設定)の形式でチェックインすることもできます。


1
このスクリプトは素晴らしいです:github.com/MarcWeber/vim-addon-local-vimrc。1)1回だけ要求し、ファイルハッシュをOKとしてマークするようになりました。2)ディレクトリツリーをルートから現在のディレクトリに移動し、優先度の高いファイルを最後に調達します。
CiroSantilli郝海东冠事病六四事件法轮功2014年

なぜ.lvimrcファイルをに追加するのです.gitignoreか?重要なのは、vimを使用し、プラグインをインストールしているすべての人が同じ設定を取得するということです。
nyuszika7h 2014年

2
@ nyuszika7h一部の設定は強制する必要がありますが、他の設定は純粋に個人的なものです。すべての人に適用する必要のある設定については、EditorConfigはエディターに依存しないため、さらに優れています。github.com
CiroSantilli郝海东冠事病六四天法轮功2015

1

そりで述べたように、そのプラグインの使用法は私が見て使用した最良のオプションです。jerseyboyは、ユーティリティがロードする前に(つまり、すべてのファイルを開いた後に)確認を求めることを推奨しているとコメントしました。これを回避するには、メイン.vimrcにローカル.lvimrcファイルのリストを設定します。

let g:localvimrc_whitelist='/development/kernel/.lvimrc'


1

これがjamessanのバリエーションです

function! ConditionalLoad()
    let cwd = getcwd()
    if getcwd() =~ $HOME . "/src/mobile"
        so $HOME/.vim.mobile
    endif
endfunction
autocmd VimEnter * call ConditionalLoad()

ジャンプ先の特定のファイルなしでviを頻繁に起動するため、現在の作業ディレクトリに基づいて条件付きで構成をロードできます。欠点は、構成がファイルに基づいて適用されるのではなく、作業ディレクトリから適用されることです。


まさに私が探していたもの。使い方の例として:私はこのコードを配置~/.vimrc変更し、/src/mobile私のsymfonyのディレクトリを投影し(私の場合にはそれがあったに/www/symfony)し、修正.vim.mobileするために.vim.symfony、その後の内側に新しいの.vimrcの設定を置い~/.vim.symfonyファイル
jmarceli

1

私はいくつかのグループで働いており、それぞれがCで独自のタブ/インデント/間隔の標準を持っています。

私はあらゆる種類のオープンソースを同時に使用しています。個別の.vimrcファイルを作成してフォーマット標準を再構成することは実用的ではありません。10年以上前、私はついにエディター構成の処理に飽きて、autotabそれを処理するために呼び出されるプログラムを作成しました。

ときautotabVimは示唆して設定されている、あなたがVimのにファイルをロードするたびに、autotabそれに呼び出され、Vimの設定出力はautotabに渡される:setコマンド。

autotab、ファイルから数千行を読み込み、それらを分析しての設定を決定しexpandtabtabstopそしてshiftwidthパラメータ。

ファイルがインデントにハードタブを使用するのか、スペースだけを使用するのかを判断し、インデントのサイズを判断します。ファイルがタブでインデントされている場合、さまざまなタブサイズを使用してファイルサンプルをレンダリングし、内部要素の行ごとの配置などのヒューリスティックに従って判断することに基づいて、適切なタブサイズを判断します。

それは私が何年も前にアルゴリズムを微調整するのをやめたほど十分に機能します。混乱した場合は、ほとんどの場合、ファイルに複数の規則を同時に使用するなどのフォーマットの問題があることが原因です。

また、ファイルタイプに「依存しない」ため、さまざまな言語で適切に機能します。私はそれをCだけでなく、シェルスクリプト、Lisp、Makefile、HTML、そしてあなたが持っているもので使用しています。

たとえば、Cファイルの場合、ステートメントcase内のラベルswitchがインデントされているかどうか、ラップされた関数の引数リストが単にインデントされているか、または引数リストの開始括弧。Vimにはそのような設定があるので、プログラムを拡張してスタイルを分析し、それらのパラメーターを出力することができます。


0

ほぼ同じ問題を探して、Sauceプラグインも見つけました:http//www.vim.org/scripts/script.php? script_id = 3992

それは主張します:

Sauceは、複数のvimrcファイル用の軽量マネージャーであり、さまざまな環境のさまざまな設定をロードするために使用できます。要するに、あなたはたくさんの異なるvim設定ファイルを維持し、あなたがそれらを必要とするときに必要なものだけをロードすることができます。

ユーザーがファイルシステム全体にドットファイルを振りかけることを期待するのではなく、すべての構成をデータディレクトリに保持することは特に興味深いと思います。しかし、これはしばしば個人的な好みのメッターです。

私はまだそれをテストしていません。


0

あなたは使用することができますストウを(だけではなく、任意のドットファイルを設定を切り換えます.vimrc

インストールstow

$ apt install stow

構成ごとに複数のディレクトリを作成します。

~$ ls -d ~/dotfiles/vim*
vim-all vim-webdev vim-go

.vimrcそれらに異なるを入れてください:

$ find ~/dotfiles -name .vimrc
/home/username/vim-golang/.vimrc
/home/username/vim-webdev/.vimrc
/home/username/vim-all/.vimrc

これで、次のコマンドを使用してvim-golang構成をインスタンス化できます(dotfilesディレクトリ内で実行する必要があります)。

~$ cd ~/dotfiles

dotfiles$ stow -v vim-golang
LINK: .vimrc => dotfiles/vim-golang/.vimrc

今それはリンクされています:

$ cd ~ && ls -l .vimrc 
.vimrc -> dotfiles/vim-golang/.vimrc

構成を切り替える必要がある場合は、次のようにやり直しstowてください。

~$ cd dotfiles

dotfiles$ stow -v -D vim-golang
UNLINK: .vimrc

dotfiles$ stow -v vim-webdev
LINK: .vimrc => dotfiles/vim-webdev/.vimrc

$ cd ~ && ls -l .vimrc 
.vimrc -> dotfiles/vim-webdev/.vimrc

詳細はこちら:GNUstowを使用したドットファイルの管理

長所:非常にシンプルで、vimプラグインの依存関係がなく、だけでなくすべてのドットファイルの管理に使用できます.vimrc

短所:構成は互いに独立しているため、それぞれを個別に管理/更新する必要があります(構成を頻繁に切り替え/更新しない場合は、問題にはなりません)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.