在Emacs中自动关闭大括号?

在Emacs中自动关闭大括号?,emacs,typing,Emacs,Typing,我见过一个名为(从post中发现)的Vim插件,它在键入“(”、“{”等时自动添加右大括号 例如,当我键入以下内容时(|是光标): 我想为我自动插入结束语): int main(|) 有人知道emacs的类似功能吗?这次谷歌让我失望了!是的。你可以将电子行为与这个简单的宏结合起来,以获得最大的舒适度: (defun electric-pair () "If at end of line, insert character pair without surrounding spaces.

我见过一个名为(从post中发现)的Vim插件,它在键入“(”、“{”等时自动添加右大括号

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

我想为我自动插入结束语

int main(|)
有人知道emacs的类似功能吗?这次谷歌让我失望了!

是的。你可以将电子行为与这个简单的宏结合起来,以获得最大的舒适度:

(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!
;;来自my.emacs
(添加钩子'cperl模式钩子
(lambda()
(setq cperl有毛无
abbrev模式t;;自动关键字扩展
cperl不加区分地突出显示变量t
cperl自动换行t
冒号t后的cperl自动换行符
cperl regexp扫描无
cperl电子束
cperl电力线路馈线t
cperl electric parens nil);;还有。显示了所有可用的命令。恰好比另一个答案中建议的电气模式更喜欢它。虽然paredit仅适用于(),因此它可能无法满足您的需要

但是,老实说,括号周围有很多包。维基上都有。解决问题的方式有:

cmarcelo已经使用了骨架模式。他还演示了如果删除开头括号,如何删除平衡括号,以及如何处理意外键入结尾括号的情况。(顺便说一句,这两种行为都复制了TextMate)

更新:


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

我将重新整理这个线程并提供另一个选择。最近有一个新项目开始,它处理自动插入对、包装区域、围绕平衡表达式导航功能列表太长,无法在这里给出,因此我将链接到您可以阅读详细自述的地方


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

如果我需要更多的东西,该怎么办?许多编辑器都有自动关闭的功能,例如html标记,此外在它们之间插入空行并进行适当的缩进。我如何在emacs中实现这一点?@jesper列出的一些模式可能已经满足了您的要求。当然,更通用的模式是yasnippet()可以做你想做的。它不是一个真正的括号平衡模式,所以我不会把它添加到答案中,但它可以做你想做的。从Emacs 24.4开始。
autopair
的作者建议使用
电对模式
电对模式
已在Emacs 24中构建,可供
(电气对模式1)
。electric模式不关闭单引号和大括号。是否启用?只需M-x自定义组“electric”并查找“electric pair pairs”。但请注意,无论您的主模式如何设置此选项都可能是不明智的——例如在文本模式下——其他主模式通常提供自定义,即Python单引号工作s如预期(添加结尾的一个)).autopair不关闭单引号和大括号。是否启用该功能?@VineetKaushik这取决于您使用autopair的模式。它在Python模式下对我来说很好。也许您使用的模式不考虑它们成对。您可以提供有关您所做操作的更多详细信息吗?还值得注意的是:默认情况下,smartparens始终插入ts是一对,这可能会让人恼火。但它也允许一种替代行为,当它仅基于启发式插入一对时。有关详细信息,请参阅smartparens包中分发的。
;; 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!