在大多数emacs模式中,当在块的末尾键入右括号时,括号会自动拉回到其相应开口行的缩进级别。例如,输入以下内容后:
int main(int argc, char* argv[]) {
// stuff
}
闭合支撑被拉回到左侧:
int main(int argc, char* argv[]) {
// stuff
} // <---- pulled back with no additional input
但是,在使用网络模式时,情况并非如此,至少在默认设置下如此。在有一些额外的输入之前,闭合支架不会被拉回到正确的压痕。按住标签或在光标位于右大括号线上时输入。在添加任何块内容之前添加结束括号的编码风格不能很好地工作,这在使用emacs中的C编码时效果很好(具体来说,我的意思是键入&#34; {enter enter} C -p&#34)。在这个序列中,没有什么可以触发闭合括号来拉回一个缩进级别,所以我的代码看起来像这样:
class Header extends React.Component {
render() {
return (
<div></div>
);
}
}
除非我按顺序添加标签按钮(&#34; {enter enter}标签C-p&#34;)。
我知道它只是一把钥匙,我可以改变我的习惯,但有没有办法改变emacs&#39;行为反而?我没有看到任何相关变量在网络模式documentation中发生变化,但我遗失了什么?
编辑:在学习了很多关于emacs的知识之后,我意识到我所寻找的实际上是cc模式的一个特定功能。在cc模式中,}绑定到c-electric-brace。来自消息来源:
(defun c-electric-brace (arg)
"Insert a brace.
If `c-electric-flag' is non-nil, the brace is not inside a literal and a
numeric ARG hasn't been supplied, the command performs several electric
actions:
\(a) If the auto-newline feature is turned on (indicated by \"/la\" on
the mode line) newlines are inserted before and after the brace as
directed by the settings in `c-hanging-braces-alist'.
\(b) Any auto-newlines are indented. The original line is also
reindented unless `c-syntactic-indentation' is nil.
\(c) If auto-newline is turned on, various newline cleanups based on the
settings of `c-cleanup-list' are done."
因此,为了在网络模式下获得此功能,我需要学习一些lisp并提交PR。这就是我要做的事情,如果/当我完成时,我会在这里提交答案。与此同时,我仍然喜欢任何了解此事的人的意见。
答案 0 :(得分:0)
使用defun
中的web-mode.el
尝试:
(local-set-key (kbd "RET") 'newline-and-indent)
答案 1 :(得分:0)
所以我最终提交了一个具有此功能的PR,但维护者显然有相同的想法并将其合并到自己身上。它自v14.0.36起生效(提交3e74b74)。
正如我在编辑中提到的那样,c-electric-brace是一个关键的绑定,所以效果立竿见影。在可能容易启用/禁用的情况下,这更难实现,因此在web模式下,它被添加为命令后挂钩。因此,如果启用show-paren-mode,则在闪烁匹配的括号/括号/括号后发生。因此有一个短暂的延迟。
当web-mode-enable-auto-indentation
设置为t
时,默认启用此效果。这是相关的代码(合并后的添加,而不是我的):
(when (and web-mode-enable-auto-indentation
(member this-command '(self-insert-command))
(member (get-text-property (point) 'part-side) '(javascript jsx))
(looking-back "^[ \t]+[]})]"))
(indent-according-to-mode)
;;(message "%S" (point))
(when (and web-mode-change-end (> web-mode-change-end (point-max)))
(message "post-command: enlarge web-mode-change-end")
(setq web-mode-change-end (point-max))
)
)