在网络模式下 - 如何将结束括号和括号拉到开头线

时间:2017-01-01 18:59:00

标签: emacs indentation

在大多数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。这就是我要做的事情,如果/当我完成时,我会在这里提交答案。与此同时,我仍然喜欢任何了解此事的人的意见。

2 个答案:

答案 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))
  )
)