(Cでコーディングするための)Allmanスタイルのフォーマットに従って中かっこを配置/配置/インデントする関数を作成しようとしています。
一般的に言えば、私はユーザーが機能をカスタマイズするために使用できるSmartparensのインターフェースのファンです。私はSmartparensインターフェースを使用して他の関数をたくさん書いたので、この時点でパッケージを切り替えないようにしてください。そうは言っても、私はパッケージにとらわれない実装を受け入れています(たとえば、defadvice
ここで関連性があるかもしれませんか?)。
目の前の問題に移ります。最終目標は何ですか?コーディングしていて、以下に示す状態になったとしましょう。パイプ記号はカーソルを表します。関数ヘッダーと開き括弧を入力しました{
。Smartparensが自動的に閉じ括弧を追加しました }
。この時点で、それを押してくださいRET
...
int main {|}
...次のようになります:
int main
{
|
}
この動作を引き起こす関数を書くことができましたが、それは最初のレベルのインデント(たとえば、上の例のメイン関数)でのみ機能します。それ以降のレベルのインデントでは機能しません(gifを参照)。
関連するコードは次のとおりです。関数はきれいではありませんが、うまくいくと思います...最後の行はSmartparensへのインターフェースです。
助言がありますか?
(defun my-create-newline-and-enter-sexp (&rest _ignored)
"Open a new brace or bracket expression, with relevant newlines and indent. "
(interactive)
(progn
(backward-char 2) (newline) (forward-char) (newline)
(indent-according-to-mode)
(previous-line 2) (indent-according-to-mode)
(next-line) (next-line) (indent-according-to-mode)))
(sp-local-pair 'c-mode "{" nil :post-handlers '((my-create-newline-and-enter-sexp "RET")))