【问题标题】:Automatically closing braces in Emacs?在 Emacs 中自动关闭大括号?
【发布时间】:2010-11-04 15:47:15
【问题描述】:

我见过一个名为 AutoClose 的 Vim 插件(从 this 帖子中发现),它会在键入 '('、'{' 等时自动添加右大括号。

例如;当我输入以下内容时(| 是光标):

int main(|

我希望自动为我插入结束 )

int main(|)

有谁知道 emacs 的类似功能 - 这次 Google 让我失望了!

【问题讨论】:

    标签: emacs typing


    【解决方案1】:

    我将删除此线程并提供另一种选择。最近启动了一个新项目,该项目处理自动插入对、区域包装、围绕平衡表达式的导航等等。功能列表太长无法在此提供,所以我将链接到smartparens github repo,您可以在其中阅读详细的自述文件。

    它是上述 AutoPair 的超集,并提供了 paredit 的大部分核心功能(并扩展到各种不同的对,而不仅仅是那些被 emacs 语法表识别的对)。

    【讨论】:

    • 另外值得注意的是:默认情况下,smartparens 总是插入一对,这可能会很烦人。但它也允许另一种行为,即它仅基于启发式插入一对。有关详细信息,请参阅 smartparens 包中分发的this file
    【解决方案2】:

    cmarcelo 有written a wonderful post about this 使用骨架模式。他还展示了如果删除左括号,如何删除平衡括号,以及如何处理不小心键入右括号的情况。 (顺便说一下,这两种行为都复制了 TextMate)。

    更新:

    自从我发布这个答案后,我发现Autopair 对于这个用例来说是一个非常完美的系统。我一直在使用它并且很喜欢它。

    【讨论】:

    • 自动配对不会关闭单引号和花括号。无论如何要启用它?
    • @VineetKaushik 这取决于您使用自动配对的模式。它在 Python 模式下对我来说很好用。也许您正在使用一种不将它们视为对的模式。你能提供更多关于你在做什么的细节吗?
    【解决方案3】:

    还有'pareditcheat sheet 显示所有可用的命令。碰巧比另一个答案中建议的电动模式更喜欢它。虽然 paredit 仅适用于 (),但它可能无法满足您的需求。

    但是,老实说,括号周围有一堆包。维基有他们所有listed here。解决您的问题的模式是:

    【讨论】:

    • 如果我需要更多内容怎么办...许多编辑器都有自动关闭的功能,例如html 标签,并在它们之间插入空行并进行适当的缩进。如何在 emacs 中实现这一点?
    • @jesper 列出的某些模式可能已经满足您的需求。当然更通用的模式,yasn-p (emacswiki.org/emacs/Yasnippet) 可以做你想做的事。这不是真正的括号平衡模式,因此我不会将其添加到答案中,但它可以满足您的要求。
    • 从 Emacs 24.4 开始。 autopair的作者建议改用electric-pair-mode
    【解决方案4】:

    是的,this mode is called electric。您可以将电气行为与这个简单的宏结合起来以获得最大的舒适度:

    (defun electric-pair ()
      "If at end of line, insert character pair without surrounding spaces.
       Otherwise, just insert the typed character."
      (interactive)
      (if (eolp) (let (parens-require-spaces) (insert-pair)) 
        (self-insert-command 1)))
    

    然后通过在您喜欢的编程模式中将适当的字符绑定到它来启用它。例如,对于 PythonMode:

    (add-hook 'python-mode-hook
              (lambda ()
                (define-key python-mode-map "\"" 'electric-pair)
                (define-key python-mode-map "\'" 'electric-pair)
                (define-key python-mode-map "(" 'electric-pair)
                (define-key python-mode-map "[" 'electric-pair)
                (define-key python-mode-map "{" 'electric-pair)))
    

    CPerl 模式以内置方式提供此功能:

    ;; from my .emacs
    (add-hook 'cperl-mode-hook
      (lambda ()
        (setq cperl-hairy nil
          abbrev-mode t     ;; automatic keyword expansion
          cperl-highlight-variables-indiscriminately t
          cperl-auto-newline t
          cperl-auto-newline-after-colon t
          cperl-regexp-scan nil
          cperl-electric-keywords t 
          cperl-electric-linefeed t  
          cperl-electric-parens nil) ;; <------ electric parens!
    

    其他模式可以提供类似的东西。

    【讨论】:

    • electric-pair-mode 已内置在 emacs 24 中,可供(electric-pair-mode 1) 使用。 link.
    • 电动模式不会关闭单引号和花括号。无论如何要启用它?
    • 只需 M-x 自定义组 'electricity' 并查找 'electric-pair-pairs'。但是请注意,无论您的主要模式如何设置它都可能是不明智的——例如在文本模式下——其他主要模式通常提供自定义,即。 Python 单引号按预期工作(添加结尾的))。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 2014-05-15
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多