iabbrev
vimで "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
インデントプラグインを有効にすると、私の問題と一致するように再感染するようですfi
。if
<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
保存しようとしているため、augroup
vimrcファイルを再インポートすると、自動コマンドを繰り返さずにファイル形式が一致するたびに複数回実行されます。
私は通常Vim ftpluginメカニズムにこの問題を処理させることを好みます。これを行うには、というファイルを作成して~/.vim/after/ftplugin/sh.vim
コマンドiabbrev <buffer> ...
を直接追加するだけです。 (該当するセクションを追加しないでください。)Vimはそれを自動的に処理しますautocmd
。sh
これにより、特定のファイル形式に関する多くの規則を取得する方がはるかに簡単になります。また、すべてのファイル形式固有のルールでvimrcを汚染するわけではありません。最後に、長い行をエスケープするために自動コマンドとマッピングを使用することを心配する必要はありません。