自动关闭Emacs中的大括号?

时间:2009-06-21 12:13:41

标签: emacs typing

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

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

int main(|

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

int main(|)

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

4 个答案:

答案 0 :(得分:16)

是的,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!

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

答案 1 :(得分:15)

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

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

答案 2 :(得分:5)

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

更新

由于我发布了这个答案,我发现Autopair这个用例非常完美。我一直在使用它并喜欢它。

答案 3 :(得分:5)

我要去修这个帖子并提供另一种选择。最近开始的一个新项目涉及自动插入对,区域包裹,平衡表达式导航以及更多内容。功能列表太长,无法在此处提供,因此我只需链接到您可以阅读详细自述文件的smartparens github repo

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