vimでネストされたインデントを実行する方法は?

vimでネストされたインデントを実行する方法は?

iabbrevvimで "autocomplete"句を持つif-fiステートメントを作成したいと思いますif-fi

 autocmd Filetype sh iabbrev if if<esc>ma<cr>ifi<esc>`ak

したがって、次ifが生成されます。

if
fi

そうですね。fi句の最後に入力する必要はありません。だから続けることができます。たとえば、

if pwd; then
    echo "bla bla"

fi

ここで、下にecho別のステートメントを入れ子にしたいのですが、今回はif次のように入力します。

if pwd; then
    echo "bla bla"

    if
fi
fi

2番目の(ネストされた)if-fiはインデントを中止します。結末はfi次のようになります。

if pwd; then
    echo "bla bla"

    if
    fi
fi

だから第二条if-fi含む最初。しかし、私はこれを達成する方法を知りません。私は持っています

:set autoindent
:set smartindent

したがって、vimはインデントレベルを覚えているため、<cr>単一のバックスペースキーを使用してネストから正しいインデントを取得できますif-fi。しかし、これを達成するためにどのキーマッピングを実行する必要があるのか​​わかりません。それでは、vimで正しいインデントレベルを生成する.vimrcためにどのキーマップを追加する必要がありますか?iabbrev

答え1

私はあなたが経験している正確な問題を再現できず、filetype=shインデントプラグインを有効にすると、私の問題と一致するように再感染するようですfiif

<CR>ただし、通常モードを使用して次の行に移動し、anを使用して部品をi挿入するので、省略形で問題を確認できます。fiまず、次の行がすでに空であると計算します。それ以外の場合は、すでに存在するfi行の前にのみ追加されます。新しい行を挿入しても、通常は新しい行を挿入すると自動インデントが実行されないため、問題が発生する可能性があります。 (<CR>挿入モードを使用するか、通常モードoコマンドを使用してください。)はい。

私の提案は、挿入モードを維持し、単一の通常<C-o>モードコマンドを実行してマーカーを設定し、その位置に移動することです。 (望むより:help i_CTRL-O.)

この略語はうまく機能します。

iabbrev if if<C-o>ma<CR>fi<C-o>`a

これは挿入モードで発生するため、実際に新しい行を挿入し、通常は<CR>新しい行を挿入するのにかかる時間を尊重します。autoindent

ファイル形式別に省略形を設定するには、通常はローカルバッファに設定する必要があるため、他の形式のファイルを編集する別のバッファがある場合、そのファイルには適用されません。<buffer>コマンドに修飾子を追加するだけです。

iabbrev <buffer> if if<C-o>ma<cr>fi<C-o>`a

autocmd FileTye sh必要に応じて に追加できます。を使用している場合は通常にautocmd保存しようとしているため、augroupvimrcファイルを再インポートすると、自動コマンドを繰り返さずにファイル形式が一致するたびに複数回実行されます。

私は通常Vim ftpluginメカニズムにこの問題を処理させることを好みます。これを行うには、というファイルを作成して~/.vim/after/ftplugin/sh.vimコマンドiabbrev <buffer> ...を直接追加するだけです。 (該当するセクションを追加しないでください。)Vimはそれを自動的に処理しますautocmdshこれにより、特定のファイル形式に関する多くの規則を取得する方がはるかに簡単になります。また、すべてのファイル形式固有のルールでvimrcを汚染するわけではありません。最後に、長い行をエスケープするために自動コマンドとマッピングを使用することを心配する必要はありません。

関連情報