Vim:ディレクトリ内のファイルに設定を適用します


103

現在のディレクトリにあるすべてのファイルにVim設定を指定するにはどうすればよいですか?

理想的な解決策は、Vimが〜/ .vimrcを検索する前に現在のディレクトリで.vimrcを検索して読み取り、そこに設定をツリー全体に適用することです。

プラグインを確認しましたが、プラグインをインストールする必要があるため、適用された設定は透過的ではありません。対照的に、ユーザーのvimrcまたは特定のvimの呼び出しに関係なく、モードライン設定はそのファイルに適用されるため、モードラインは透過的です。

私が試したものは

  • 作業ディレクトリに.vimrcを配置する
  • :so vimrc モードラインで。

セキュリティ上の理由から、どちらも機能しないと思います。vimrcの全機能は必要ありません。モードラインで受け入れられる設定にバインドされていれば十分です。私の目標は、ビマーがプロジェクトでコーディング標準を採用しやすくすることです。


回答:


42

私はプラグインの方法を支持しています。いくつかの理由で:

  • Modelinesは特に制限されています。変数を設定することはできません(「for-snippetの波括弧を改行にする必要があるか」などの他の(ft)プラグインを調整します)、またはそれらから関数を呼び出すことはできません(制限しませんコーディング標準に合わせて、現在のディレクトリに応じて使用するメイクファイルも設定します)
  • DRY:モードラインでは、すべてのファイルで設定を繰り返す必要があります。設定するものが多すぎたり、変更するチューニングが多すぎたりすると、すぐにメンテナンスが難しくなり、さらに、テンプレート拡張プラグインを使用する必要があります(プロジェクトに複数のビマーがいる場合は、これを検討する必要があります)。
  • すべての人がvimを使用して開発するわけではありません。他の人の編集者設定に煩わされたくないのですが、なぜ彼らの設定を寄生する必要があるのですか?
  • .vimrcの同じ行をコピーして貼り付けて維持するように依頼するよりも、同じプラグインをインストールするようにビマーに依頼する方が簡単です。
  • 設定は他のプロジェクトファイル(cvs / svn / git / whatever)に保存できます。
  • プロジェクトごとに構成ファイルを作成するのは本当に簡単です。プラグインを使用すると、プロジェクト全体のコーディング標準用のグローバル構成ファイルと、各サブプロジェクト用の特定の構成ファイル(使用するmakefile、呼び出す実行可能ファイル)があります。 、...)

ところで、sthのソリューションは、単一の構成ファイルを供給するために使用できます。これは、.vimrcを非グローバルオプションで寄生する必要があり、複数/共有構成ファイルを簡単にサポートしないことを除いて、プラグインアプローチと非常に似ています。


プラグインを正しく実行するには、パスに新しいファイルを保存する必要があることに気づきました
cmcginty

確かに。このプラグインファミリは、フレームワークを定義するだけです。プロジェクト固有の定義をファイルに書き込む必要があります-フレームワークは自動的にソースを提供します。
Luc Hermitte、2010年

1
Lucは自分のプラグインにリンクしています。これは質問でリンクされているものよりもはるかにうまく機能するようです。ありがとう。
データ

上手。わかりません。私は何年も私のものを使ってきたので、他の実装をよく見たことはありません。時々私は最終的に考慮に入れるバグレポートを受け取ります。ところで、私のバージョンは、テンプレートを展開する前にプロジェクト固有の変数を設定するために、mu-templateの前にトリガーされるように実装されています(これは、現在のプロジェクトのルートディレクトリを取得し、展開されたパス名から削除するのに非常に役立ちます)
Luc Hermitte

1
@JasonMcCarrell local_vimrcとMarkus "embear" Braunの私の実装は、ブラックリスト、ホワイトリストをサポートしています...インデントの方法を指定する必要があるだけなら、EditorConfig-vimプラグインがより良い選択かもしれません。
Luc Hermitte、2018年

91

このようなものを入れることができます $VIM/vimrc

autocmd BufNewFile,BufRead /path/to/files/* set nowrap tabstop=4 shiftwidth=4

1
これは再帰的ですが、*を使用する場合のみです。/ path / to / files /または/ path / to / filesに縮小しようとしても機能しません。
SystemParadox

これは、プロジェクトに「noexpandtab」で記述されたファイルのツリーと、すべてのファイル「expandtab」で記述された別のツリー(たとえば、CodeIgniter)がある場合に最適です。1つの構成ファイルを使用して、各ツリー内のファイルに適切なアクションを個別に設定できます。
user9645 2014年

2
奇妙なことに、私のパスにシンボリックリンクが含まれている場合、これは機能しませんでした。それが機能する前に、私はシンボリックリンクなしでフルパスを置かなければなりませんでした。
Dolan Antenucci 2014

この方法の代替として、「信頼されたvim」を使用することに関するjoseph07の回答を参照してください(分散.vimrcと集中型)。
Nathan Schulte

50

使用しないことを強くお勧めします set exrc

set secure* nixのもとでも、ファイルを所有していれば、vimはautocommands、shellなどを実行します。そのため、たまたまそのtarball内のファイルを編集した場合は、次の内容で送信しました.vimrc

autocmd BufEnter * :silent! !echo rm -rf ~/

あなたはおそらく私よりも面白くないでしょう。


6
これは、vimが読み込まれたときに自動的に実行されるプラグインにも当てはまります。
Luc Hermitte、2010

31

この質問は古いですが、かなり自然で永続的な懸念のようです。

私の解決策はかなり簡単です。.vimrcプロジェクトのルートディレクトリにファイルを配置します。.vimrcファイルの最初の行は通常、sources ~/.vimrcであり、次に、必要な特定の構成を追加します。私はエイリアスを付けてtvim='vim -u .vimrc'tvim個人のプロジェクトディレクトリで使用しています。「trusted vim」の「tvim」。つまり、.vimrcファイルのあるディレクトリで実行して何か問題が発生した場合、自分が信頼していると明示的に言ったので、私には責任はありません。また、特定の種類のプロジェクトで必要なものだけをソフトリンクできるように、これらのグループを保管してあります。


1
このアプローチは簡単で、私のニーズに完全に一致します。
Jinxed 2017

私はこれを試してみたときsource $HOME/.vimrc、私の地元から.vimrc、Vimはそれは私のシステム全体にインストールしたプラグイン(;この場合、病原体を見つけることができません文句を言いexecute pathogen#infect()、私が上にコマンド$HOME/.vimrcで失敗しますUnknown function ...)。どうすれば修正できますか?
Nathan Schulte

20

.vimrcを作業ディレクトリに配置することは実際にはサポートされており、デフォルトでは無効になっています。参照:h 'exrc'および:h startup設定の詳細については、'exrc'読んで有効になります.vimrc現在のディレクトリから。

これ:set secureを使用する際にもお勧めです。これにより、現在のディレクトリで:autocmd、シェル、書き込みコマンドがロックされます.vimrc

注目に値するもう1つのこと:h sessionは、プロジェクトの標準ビューと設定を使用してセッション()を設定することです。

そうは言っても、私はおそらくLuc Hermitte自身が詳述したプラグインオプションを使用します。


6
コメントはフェンでご覧ください。これは、深刻なセキュリティ上の影響をもたらす可能性があります。
データ

11

最近の「自動実行」機能によるセキュリティリスクを最小限に抑えるために、プラグイン(携帯用手荷物)ではなくvimの既存の機能を利用することをお勧めしますか?

例えば。

ローカルフォルダーのvimrcファイルの名前は(意図的に) "_gvimrc"です。これは、フェンのような人々が私たちの費用で自分を楽しませる希望を減らします。:-)

$ VIM / .vimrcファイルに、次のコードを挿入しました。

if filereadable("_gvimrc")
    source _gvimrc
endif

最後に。

「fileexists()」ではなく「filereadable()」を使用します。これは、複数の(10+)ファイルを同時に開くことで拷問された場合に、奇妙な点があります(理由は不明)。

もちろん、潜在的なトラブルメーカーをさらに難読化するために独自の一意のファイル名を与えることができます。「_mygvimrc」、「_ gobbledygook」などのように。1つの標準化された名前で解決し、それに応じて$ VIM / .vimrcでそれを調達する必要があります。このためにvi / vim内部に依存すると、移植性の問題が排除されます。ただし、後でvimを使用して$ VIM / .vimrcファイルを編集する場合に備えて、再帰的なソーシングを防ぐために、.vimrc(または_vimrc)という名前を付けないでください。

Windork XP ProからWindoze 98SE以降、現在はWindorkier 7(すでに5年以上)を使用しています。エクスプローラーで.txtファイルのリストにマークを付けてから、「複数のVimで編集」を使用すると、複数のvimウィンドウが同時に開きます。私の仕事では、これを1日に数回、毎日行っています。すべてのファイルは、ローカルの_gvimrcで設定したもので処理されました。


ここでは、これらのlocal_vimrcプラグイン(少なくとも私のもの)は移植可能であるため、プラグインの移植性に対する不信感は根拠がありません(これは、さまざまな異なるOS、さらにはWindows 95でも維持されていました)。セキュリティリスクに関する問題も誇張されています。この方法に従えば、作業を容易にするために何もインストールしません。
Luc

しかし、私に関する限り、最初の実際の問題は、あなたのアプローチでは、_gvimrcファイルを含む正確なディレクトリから作業する必要があるということです(これは、gvim固有のものを含むことを意図しているため、不適切な名前です)。プロジェクトが複数のディレクトリで構成されていて、共通の構成が必要な場合や、特定のディレクトリ(複数のモジュールの場合)が必要な場合は、すぐに制限がわかります。
Luc Hermitte、2012年

2番目の問題は、一度に1つのプロジェクトでしか作業できないことです。OTB、openjpeg、および両方のライブラリを統合するプロジェクトで作業する場合、このソリューションでは、それぞれに特定の設定を行うことができません。 3つのプロジェクト。
Luc Hermitte、2012年

これは、ローカルディレクトリから構文ファイルをデイジーチェーンでロードする場合にも機能します。
maharvey67

2

人々が数日ごとにファイルを追加していないと仮定すると、おそらく各ファイルの上部にモードラインを追加できます。実際、バージョン管理システムで許可されている場合は、チェックイン時に各ファイルにモードラインが必要であるというルールを適用できます。



2

「editorconfig」を使用します

適用したいコーディング標準の種類がインデントスタイル、タブサイズ、ファイル形式、文字セットに関連している場合は、この種類の設定を指定するためのクロスエディター標準である"editorconfig"を調べることをお勧めします。特定のプロジェクト、およびすべてのエディターがその構成に従うようにします。

「editorconfig」仕様により、プロジェクトは、プロジェクト内のファイル拡張子または名前に応じて異なる設定を要求できます。(したがって、TABを使用してMakefile、4つのスペースを使用してPythonスクリプト、インデントに2つのスペースを使用してシェルスクリプトを作成できます。)

Vimで「editorconfig」を使用するにはプラグインが必要です。公式ウェブサイトが提供していますが、個人的にはsgur / vim-editorconfigをお勧めしますは、純粋なVimscriptで記述されたます。これにより、外部の依存関係をあまり気にする必要がなくなります。

「editorconfig」はクロスエディターの互換性を目的としているため、その機能にはかなり制限があるため、一貫した空白、ファイル形式(DOSとUnix)、エンコーディング(Unicode utf-8など)が必要な場合は、「editorconfig " あなたのためです。



0

私は存在しているプラ​​グインを見て、それらのどれも実際には気に入らなかったので、vim-fugitiveを利用した単純な関数を書きました。これの利点は、プロジェクトのルートが常にリポジトリのルートであることを認識していることです。さらに、ファイルをハッシュして信頼テーブルを保持できます。以下を.vimrcファイルに入れてください。

function LoadRepoVimrc()
  let l:path = fugitive#repo().tree('.vimrc')
  if filereadable(l:path)
    let l:sha1 = fugitive#repo().git_chomp('hash-object',l:path)
    if !exists('g:SAFE_VIMRC') | let g:SAFE_VIMRC = {} | endif
    if has_key(g:SAFE_VIMRC,l:path) && g:SAFE_VIMRC[l:path] ==? l:sha1
      execute 'source '.fnameescape(l:path)
    elseif confirm("Trust ".l:path."?", "&Yes\n&No",2) == 1
      let g:SAFE_VIMRC[l:path] = l:sha1
      execute 'source '.fnameescape(l:path)
    else
      execute 'sandbox source '.fnameescape(l:path)
    endif
  endif
endfunction
autocmd User FugitiveBoot call LoadRepoVimrc()
set viminfo ^= !

場合は!オプションがオンに設定されているviminfo設定、その後、SAFE_VIMRC辞書には注意してください(実行の間保持されます^、それはアップ混乱しないようにオプションを付加するnオプションを)。

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