ファイルの種類によってVimのインデント動作を変更する


379

ファイルの種類に基づいてVimのインデント動作を変更する最も簡単な方法を誰かに簡単に説明してもらえますか?たとえば、Pythonファイルを開く場合は2つのスペースでインデントする必要がありますが、Powershellスクリプトを開く場合は4つのスペースを使用する必要があります。


9
ところで、PythonのPEP8規約では、タブストップは4スペース、タブは4スペースにする必要があるとされています。REF: stackoverflow.com/questions/120926/...
cgseller

回答:


304

.vimvimが特定のファイルタイプに切り替わるたびに実行されるファイルを追加できます。

たとえば、次の~/.vim/after/ftplugin/html.vim 内容のファイルがあります。

setlocal shiftwidth=2
setlocal tabstop=2

これにより、vimはインデントに2文字の幅のタブを使用します(このnoexpandtabオプションは、構成の他の場所でグローバルに設定されています)。

これについては、http//vimdoc.sourceforge.net/htmldoc/usr_05.html#05.4で説明されています。ファイルタイププラグインのセクションまでスクロールします。


229
~/.vim/after/ftplugin/html.vim代わりにそれを入れるべきです。しかし、他の人が以下で指摘しているように、単にに追加autocmd FileType html setlocal shiftwidth=2 tabstop=2する方がはるかに優れています.vimrc
アリストテレスPagaltzis 2008年

10
おっと、実際には、その/ is /にファイルがあります。答えを直します。しかし、私は同意しません。異なるファイルタイプのコマンドを別々のファイルに分離すると、特に多くのファイルタイプの要件がある場合や、一部のファイルタイプに多くのオプションがある場合は、すべてがはるかに簡単になると思います。
SpoonMeiser 2008年

3
実際、ftpluginsにafterディレクトリを使用する理由はそれほど多くありません。Vimは、構文ファイルの最初のファイルだけでなく、runtimepathにあるすべてのファイルをロードします。
graywh 2009年

36
参考:JavaScriptファイルタイプにjsを使用しないでください。代わりにJavaScriptを使用してください。(autocmd FileType javascript setlocal shiftwidth=2 tabstop=2
キッド2013

13
あなたfiletype plugin onもあなたのvimrc に追加する必要があります。
gatoatigrado 2014年

191

オプションを設定するには、ftpluginsまたはautocommandsを使用します。

ftplugin

~/.vim/ftplugin/python.vim:

setlocal shiftwidth=2 softtabstop=2 expandtab

そして、それらをオンにすることを忘れないでください~/.vimrc

filetype plugin indent on

:h ftplugin詳細について)

自動コマンド

~/.vimrc

autocmd FileType python setlocal shiftwidth=2 softtabstop=2 expandtab

あなたはそれらの短いバージョンと長いコマンドや設定のいずれかを置き換えることができます:
autocmdau
setlocalsetl
shiftwidthsw
tabstopts
softtabstopsts
expandtabet

との違いを学ぶこともお勧めtabstopsofttabstopます。多くの人が知らないsofttabstop


1
ありがとう!また、 'ts'と 'sts'について少しだけ感謝します。この違いとその使用方法について話し合うことをお勧めする特定のページはありますか?
jvriesem 2013

11
@jvriesemそれほど重要ではありません。「ts」はタブ文字の表示方法です。'sts'は、タブキーが押されたときに挿入する「スペース」の数です。'sw'は、インデントレベルごとに使用する「スペース」の数です。'et'は、スペースとタブのどちらを使用するかです。「sta」を使用すると、行の先頭でタブを押すときに「sw」「スペース」を挿入できます。
graywh 2013

10
完全な形式を使用する方が、末尾の節文よりもわかりやすくする方が良いのではないかと思います。
アイスウォーター2014

23
sw以下のために短いsoftwidthsts短いためであるsofttabstopet短いためであるexpandtabsetlのために短いですsetlocal、とauの略ですautocmd。短い形式の代わりに長い形式を使用できます。
Flimm

13
私は信じているswように展開をshiftwidthではなくsoftwidth
johncip

83

を編集し、~/.vimrcインデントごとに異なるファイルタイプを追加します。たとえばhtml/rb、2つのスペースにはjs/coffeeインデント、4つのスペースにはファイルインデントが必要です。

" by default, the indent is 2 spaces. 
set shiftwidth=2
set softtabstop=2
set tabstop=2

" for html/rb files, 2 spaces
autocmd Filetype html setlocal ts=2 sw=2 expandtab
autocmd Filetype ruby setlocal ts=2 sw=2 expandtab

" for js/coffee/jade files, 4 spaces
autocmd Filetype javascript setlocal ts=4 sw=4 sts=0 expandtab
autocmd Filetype coffeescript setlocal ts=4 sw=4 sts=0 expandtab
autocmd Filetype jade setlocal ts=4 sw=4 sts=0 expandtab

参照:ファイルタイプによるVim空白の設定


vimrcのコメントは単一です":)
sdkks 2017年

@sdkks私はそうは思いません。二重引用符はコメント、一重引用符は'私のすべてのLinuxのvimでエラーになります。(7.3 +、8.0 ...)
Siwei Shen申思维

うん。私のコメントでは、シングルを使用する"、つまり別のシングルで閉じないようにしてい"ます。なぜ私はそれをコメントしたのかわからない。
sdkks

わかりました、あなたを誤解しました。I単一引用符手段かかわら'左ではなく"右なし" @。
Siweiシェン申思维

60

〜/ .vimrcにファイルサフィックスに基づいてautocmdコマンドを配置します

autocmd BufRead,BufNewFile   *.c,*.h,*.java set noic cin noexpandtab
autocmd BufRead,BufNewFile   *.pl syntax on

あなたが探しているコマンドはおそらくts =とsw =です


18
これの利点は何FileTypeですか?
Casey Chow

3
試合を逆にする方法はありますか?
SystemParadox

7
(.htmlファイルは実際にはHTMLではなく、テンプレート言語を使用したテンプレートHTMLファイルであるため)ファイルタイプをHTMLファイルで機能させるのに問題がありました。ファイルタイプはhtmlとして認識しないようですが、このメソッドは認識します。
Mark Hildreth 2013年

3
@digitxp-利点は、使用される拡張機能が定義された「FileType」と一致しない場合です。たとえば、私のインストールでは、*。mdはModula2のファイルタイプを意味しますが、私はそれをマークダウンに使用しています。(a)デフォルトのFileType設定を変更する(b)カスタム構成でファイルタイプの設定を変更する、または(c)この設定を使用して1の.vimrcファイルで必要なものをすばやく取得する(c)。
pdwalker 14

ここで指摘する価値があります。私のドキュメントをすばやく読んだ方が正しいとすると、この方法でファイルタイプごとに複数のコマンドを追加でき、指定された順序で実行されることが保証されます。
underscore_d

23

私は通常expandtabsetで作業しますが、makefileにとってそれは悪いことです。私は最近追加しました:

:autocmd FileType make set noexpandtab

私の.vimrcファイルの最後に置くと、Makefile、Makefile、および* .mkがMakefileとして認識され、タブは展開されません。おそらく、これを拡張できます。


より良いオプションは:filetypeプラグインを有効にすることです。Vimのデフォルトには:setl noetが含まれているため、vimrcにそのaucmdは必要ありません。
graywh 2009年

OK。そのメリットを説明できますか、それを行うために何が必要ですか?filetypeプラグインがautocmdより優れているのはなぜですか?いつautocmdを使用する必要がありますか?使用されていない?
ジョナサンレフラー、

5
Vimに付属のファイルタイププラグインは、たとえば、メイクファイルの「setlocal noexpandtab」などの便利な機能を提供します。シフト幅などの個人的なものに対するオートコマンドとftpluginsは関係ありません-それは、vim構成を構築するために選択する方法です。
graywh 2009

17

個人的には、.vimrcで次の設定を使用します。

autocmd FileType python set tabstop=8|set shiftwidth=2|set expandtab
autocmd FileType ruby set tabstop=8|set shiftwidth=2|set expandtab

22
多くの言語は、特定の企業がそうであるように、長い間慣習を確立しています。前者の例としてNodeJSを取り上げます。タブは2つのスペースにする必要があります。頭痛、そしてばかげていますが、重要です。
ポール・ハーゼン

3
すべての状況でタブを同じにする必要があるのはなぜですか?構成ファイルの場合、8個のスペースタブが問題なく機能しますが、インデントが多いコードの場合、2個の管理がはるかに簡単です。そして、固定された規則があります:node.jsには2つのスペースタブが必要で、Pythonは実際には4つのスペースタブ以外では構文的に無効です。
felixphew

1
@felixphew Pythonは、全体を通して同じである限り、任意の数のスペース(またはタブ)でも完全に正しいです。
James

@DJMcMayhemそうですね-私は「強くお勧めします」と言っておくべきでした。
felixphew 2016年

1
Nelloに+1。タブ文字には、8文字の倍数で次の位置にジャンプすることを意味するという長い間確立された伝統があります。それは、人々が「私の言語で見栄えのよい次のインデント」にタブを使用したかったこと、および一部のテキストエディターが「タブ文字の追加」と「インデント用のスペースの追加」の違いを気にしていないためです。エディターを微調整し、タブが意図したとおりに表示されないこの混乱を解消しました。ソースコードはテキストで、テキストの標準は8文字のタブです。
フロリアンF

6

こう:これは、私たちのほとんどが知られているが、とにかく(私は私の最初の時間を困惑された)される可能性があります:set et:set1が行う必要があり、expandtabsは)すでにファイル内の既存のタブを変更しません:retab。例えば:

:set et
:retab

ファイル内のタブは十分なスペースに置き換えられます。タブを元に戻すには、次のようにします。

:set noet
:retab

4

今日、あなたはeditorconfigを試すことができます、それにvimプラグインもあります。これにより、vimでインデントのサイズを変更できるだけでなく、他の多くのエディターで一貫したコーディングスタイルを維持できます。

以下は、簡単なeditorconfigです。ご覧のとおり、pythonファイルにはインデント用のスペースが4つあり、pugテンプレートファイルには2つしかありません。

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

# 2 space indentation for pug templates
[*.pug]
indent_size = 2

3

Vimのインデントは、インデントプラグインを使用して、または設定を使用して手動で設定できますが、Pythonファイルを開くと、関連する設定を自動的に設定するVindectと呼ばれるpythonスクリプトを使用することをお勧めします。このヒントを使用して、Vindectをさらに効果的に使用してください。さまざまなインデントスタイル(タブとスペース、スペースの数)を使用して他の人が作成したpythonファイルの編集を始めたとき、それは信じられないほどイライラさせられました。しかし、Vindectとこのインデントファイル

また、お勧めします:


2

を使用autocmdする場合は、それらをグループ化することをお勧めします。グループ化がファイルタイプの検出に関連している場合は、次のようになる可能性があります。

augroup filetype_c
    autocmd!
    :autocmd FileType c setlocal tabstop=2 shiftwidth=2 softtabstop=2 expandtab
    :autocmd FileType c nnoremap <buffer> <localleader>c I/*<space><esc><s-a><space>*/<esc>
augroup end

グループ化.vimrcは、ファイルタイプに複数のルールが関連付けられている場合に特に、整理された状態を維持するのに役立ちます。上記の例では、.cファイルに固有のコメントショートカットが定義されています。

への最初の呼び出しautocmd!は、vimに、そのグループ内で以前に定義された自動コマンドを削除するように指示します。これにより、.vimrc再度ソースが提供された場合に定義が重複するのを防ぎます。詳細については、:help augroupを参照してください。


1

私はCで作成したユーティリティを使用しますautotab。それはあなたがロードするファイルの最初の数千行を分析し、Vimのパラメータの値を決定しshiftwidthtabstopそしてexpandtab

これは、たとえばを使用してコンパイルされますgcc -O autotab.c -o autotab。Vimと統合するための手順は、上部のコメントヘッダーにあります。

Autotabはかなり賢いですが、特にさまざまなインデントスタイルを使用して一貫性のない方法で維持されているため、時々混乱する可能性があります。

ファイルがタブ、またはタブとスペースの組み合わせをインデントに使用していることが明らかな場合、Autotabは、コメントなど、連続する行にまたがる内部要素の配置などの要素を考慮して、どのタブサイズが使用されているかを判断します。

これは、さまざまなプログラミング言語で機能し、インデントのインクリメントに従わない「帯域外」要素(Cプリプロセスディレクティブ、Cステートメントラベルなど)を許容します。

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