2

私はEmacsが初めてです。

すべてのモードで機能する elisp 関数を作成しようとしています。insert-parentheses具体的には、次のキー シーケンスが自動インデントのみをサポートするダム エディターに対して行うのと同じ方法で、中かっこ (少し似ています) を挿入する関数を作成したいと考えています。

"{" <ret> "}" <up-arrow> <end> <ret> <tab>

このキー シーケンスは、Java と C# (bsd) スタイルのインデントの両方で機能します。ブレースを使用するすべての emacs モード、およびプレーン テキスト ファイルで動作させるには、これが必要です。emacs モードがなくてもブレースを使用する他のフォーマットがあります。

これが私の12回目かそこらの試みです:

(defun insert-braces-macro ()
  (interactive)
  (insert "{")
  (newline)
  (indent-relative t)
  (insert "}")
  (forward-line -1)
  (end-of-line)
  (newline)
  (indent-relative t)
  (indent-relative nil))

残念ながら、これはうまくいきません。indent-relativeJava スタイルでは正しくインデントされないため、正しい関数ではないと思います。

f |

次のように展開します。

f {
  |
}

Cモードでは:

somelongword another |

次のように展開されます。

somelongword another {
             |
}

しかしindent-according-to-mode、C っぽいモードではインデントが多すぎ (末尾の '}' がインデントされます)、Fundamental モードではまったくインデントされないため、正しくありません。

これを処理する正しい方法は何ですか?

4

2 に答える 2

1

これが私が長い間使ってきたものです:

(defun ins-c++-curly ()
  "Insert {}.
Treat it as a function body when from endline before )"
  (interactive)
  (if (looking-back "\\()\\|try\\|else\\|const\\|:\\)$")
      (progn
        (insert " {\n\n}")
        (indent-according-to-mode)
        (forward-line -1)
        (indent-according-to-mode))
    (insert "{}")
    (backward-char)))

この機能:

  1. 適切{}な場所、たとえば).
  2. {}それ以外の場合は、 1 文字分挿入して戻ります。配列と新しいスタイルの初期化に役立ちます。

これは、インデントを 4 つのスペースに設定した C++ と、2 つのスペースに設定した Java で機能します。

于 2013-09-22T06:29:49.277 に答える