このコードが与えられたら:
#!/bin/bash
_DATABASES=(
"secretX"
"secretmin"
"secretcopyijui"
"secretcroma"
"secretdemo"
"secretdicopy"
"secretflashcolo"
"secretmdat"
"secretneton"
"secretprintshar"
"secretrealjet"
"secretsolumax"
"secretunicopia"
"secretworddigit"
"secretducao"
"secrette"
"secrette_app"
"secretanopecanh"
"secretx_ead"
"secretx_site"
"secretdroppy"
"secret"
)
vimで実行すると、gg=G
コードは次のようになります。
#!/bin/bash
_DATABASES=(
"secretX"
"secretmin"
"secretcopyijui"
"secretcroma"
"secretdemo"
"secretdicopy"
"secretflashcolo"
"secretmdat"
"secretneton"
"secretprintshar"
"secretrealjet"
"secretsolumax"
"secretunicopia"
"secretworddigit"
"secretducao"
"secrette"
"secrette_app"
"secretanopecanh"
"secretx_ead"
"secretx_site"
"secretdroppy"
"secret"
)
なぜ?
小さい方の配列ではすべてがうまく機能しますが、20個以上の要素を持つ配列ではこれが発生します。
他の言語(JS、C ++、PHP)でテストしても同様の現象は発生しませんでした。
情報:
Wim 7.4.52
No.vimrc
ベストアンサー1
これ={motion}
演算子はさまざまな設定('equalprg'
、、、 )で定義できますが、これらの設定がすべて解除さ'indentexpr'
れる'lisp'
と、次のものを使用することに置き換えられます。Cインデント。それがここで起こっていることです。
CインデントはC言語に適用され、主にC中括弧と{ ... }
識別子(たとえばif
、else
などwhile
)に基づいて決定されます。
これらの多くはbash(および他の多くの言語)に非常に親しみやすいので、ほとんどの場合うまく機能します。
if
ただし、C言語では、変数の割り当てまたはORステートメントでwhile
論理式を囲むために括弧が使用されます。 Vimはこれらの書式を設定し(したがって一致する括弧のセットを追跡しようとしている)、どのくらい深く表示されるかについていくつかの制限を適用しようとしています。
Cでは、式に括弧が使用され、これらの式は通常短いため、これを追跡できるデフォルトの制限は20行です。
[ 'cinoptions'
]は多くのCインデントを制御でき、それを制御するオプションがあることがわかりました。これ)N
角かっこ式の行制限を調整するオプションを使用できます。
たとえば、100行に増やします。
:set cinoptions=)100
(または10個に減らすにはを使用してください:set cinoptions=)10
。)
これは何が起こっているのかを説明し、便利な回避策に変えることができるクイックハッキングです。ただし、ここで正しい解決策は次のように設定することです。'indentexpr'
作成中の言語に適しています。 (Cインデントは'indentexpr'
設定されていない場合にのみ適用されます。)
Vimは実際にシェルスクリプトのインデント用のプラグインを提供します。たぶんそれを有効にしていないかもしれません。あなたのコマンドに次のコマンドが含まれていることを確認してください.vimrc
。
filetype indent on
次に、シェルスクリプトが次のタイプとして認識されていることを確認してくださいsh
。
:set filetype?
filetype=sh
それ以外の場合は設定します(なぜそのようなことが起こらないのかを詳しく調べる必要があるかもしれません)。
:setf sh
'indentexpr'
設定されていることを再確認できます。
:set indentexpr?
indentexpr=GetShIndent()
これらの設定を有効にすると、=
シェルスクリプトは期待どおりに機能します。