28

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

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

int main(|

我希望)自动为我插入关闭:

int main(|)

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

4

4 回答 4

16

是的,这种模式叫做电动。您可以将电气行为与这个简单的宏结合起来以获得最大的舒适度:

(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!

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

于 2009-06-21T12:21:17.543 回答
16

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

但是,老实说,括号周围有一堆包。wiki 将它们全部列在这里。解决您的问题的模式是:

于 2009-06-21T14:37:40.840 回答
6

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

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

于 2012-12-27T01:19:33.323 回答
5

cmarcelo使用骨架模式写了一篇关于此的精彩文章。他还展示了如果删除左括号,如何删除平衡括号,以及如何处理不小心键入右括号的情况。(顺便说一下,这两种行为都复制了 TextMate)。

更新:

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

于 2009-06-21T18:59:25.440 回答