В различных средах IDE ввод с открытыми фигурными скобками приводит к появлению подходящей пары фигурных скобок. Обычно фигурные скобки вставляются каким-либо контекстно-зависимым способом. Внутри строкового литерала между фигурными скобками нет вставляемого символа новой строки. За пределами строкового литерала есть символ новой строки, и все сразу отступает.
{
_cursor_
}
Когда я продолжаю печатать на курсоре, весь новый код имеет правильный отступ.
В Emacs, однако, по умолчанию в моем cc-режиме (csharp-mode, java-mode и т. Д.) Команда open-curly выполняет команду self-insert, которая просто вставляет открытую скобку без отступа. С-электрическая скобка работает в тесном кудрявом виде, что делает отступ только для близкого вьющегося, а не полного объема. В результате, когда я вписываю внутри фигурной области видимости, все отступы неверны, и мне приходится вручную заново создавать отступ для фигурной области при ее закрытии.
Есть ли простой способ заставить Emacs вести себя как популярные IDE, которые я использовал? Я написал кое-что для Emacs Lisp, но оно не очень общее, и я хочу знать, что я ошибаюсь.
Я знаю о функции скелет-пара-вставка-возможно. Он вставляет согласованные пары независимо от : фигурные скобки, скобки, кавычки, угловые скобки, квадратные скобки. Но эта функция не делает никакого контекстно-зависимого отступа и не дает мне пустую строку. Есть ли способ заставить его отступить или ... есть другая функция, которую я должен привязать к open-curly, чтобы получить то, что я хочу?
PS: мой Emacs Lisp выглядит так:
; The default binding for "open curly" was skeleton-pair-insert-maybe. It
; inserts a pair of braces and then does not insert a newline, and does not
; indent. I want the braces to get newlines and appropriate indenting. I
; think there is a way to get this to happen appropriately just within emacs,
; but I could not figure out how to do it. So I wrote this alternative. The
; key thing is to determine if the point is within a string. In cc-mode, this
; is at least sometimes done by looking at the font face. Then, if not in a
; literal string, do the appropriate magic. This seems to work.
(defun cheeso-insert-open-brace ()
"if point is not within a quoted string literal, insert an open brace, two newlines, and a close brace; indent everything and leave point on the empty line. If point is within a string literal, just insert a pair or braces, and leave point between them."
(interactive)
(if
; are we inside a string?
(c-got-face-at (point) c-literal-faces)
; if so, then just insert a pair of braces and put the point between them
(progn
(self-insert-command 1)
(insert "}")
(backward-char)
)
; not inside a literal string.
; therefore, insert paired braces with an intervening newline, and indent everything appropriately.
(progn
(self-insert-command 1)
(c-indent-command)
(newline)
(insert "}")
(c-indent-command)
(previous-line)
(newline-and-indent)
; point ends up on an empty line, within the braces, properly indented
)
)
)