在Emacs中是否可能自动完成括号或引号?

7

我曾经使用过XCode和Netbeans,并注意到它们具有自动完成引号或括号的功能(我认为其他IDE通常也会这样做)。我不知道这个功能的名称,但在Emacs中有没有办法实现这一点?

例如,当我输入

printf("

我希望它可以自动输入。
printf("")

将光标放置在引号之间。
谢谢。

我以前用过这样的宏,但是现在我使用很多不同的编辑器(emacs、vs、eclipse、pn),所以我不能依赖这样的功能。相反,我内化了这种行为,几乎无法在打左侧字符时不自觉地插入相应的平衡字符。非程序员看到我这样做会觉得我很奇怪。 - Zano
6个回答

8
基本的变体将是AutoPairs。同样的效果,但稍微更为复杂的可以使用YASnippet实现。

似乎AutoPairs和Paredit是两个受欢迎的建议,但看起来AutoPairs是为了与YASnippet很好地集成,这对于进一步的代码完成非常好。 - beardc

3
如果您键入M-(,它将插入(和),并在中间留下点; 如果您接着键入M-),它将移动点穿过右括号。我一直在使用这个功能。
还有一个名为“paredit”的模式(可从http://mumble.net/~campbell/emacs/paredit.el获取),它也可以对引号进行此类操作,可能还有其他功能。

在我的配置中,M-) 绑定到 move-past-close-and-reindent,即它会打开一个新行。有没有可能只是移动到封闭的括号而不重新缩进呢? - phimuemue
M-- C-M-u 可能会达到你想要的效果。 - offby1

3

Paredit-mode默认插入匹配的闭合元素,因此在输入时,您将看到类似于printf()然后printf(""),光标将位于引号内。


2

我也想发表一下个人的看法。

(setq skeleton-pair t)
(defvar skeletons-alist
  '((?\( . ?\))
    (?\" . ?\")
    (?[  . ?])
    (?{  . ?})
    (?$  . ?$)))

(global-set-key (kbd "(") 'skeleton-pair-insert-maybe)
(global-set-key (kbd "[") 'skeleton-pair-insert-maybe)
(global-set-key (kbd "\"") 'skeleton-pair-insert-maybe)
(global-set-key (kbd "\'") 'skeleton-pair-insert-maybe)

下面的建议将启用退格键删除括号对:a(|)b -> ab
(defadvice delete-backward-char (before delete-empty-pair activate)
  (if (eq (cdr (assq (char-before) skeletons-alist)) (char-after))
      (and (char-after) (delete-char 1))))

下一个建议将使 backward-kill-word (对我来说是M-backspace)删除匹配的括号,即使它们被其他文本分开;非常方便。
(defadvice backward-kill-word (around delete-pair activate)
  (if (eq (char-syntax (char-before)) ?\()
      (progn
 (backward-char 1)
 (save-excursion
   (forward-sexp 1)
   (delete-char -1))
 (forward-char 1)
 (append-next-kill)
 (kill-backward-chars 1))
    ad-do-it))

我现在正在尝试转向使用paredit。


由于 Autopairs 似乎无法自动删除成对字符,因此这个反向删除成对字符的建议似乎是一个很好的补充。 - beardc

2

0

autopair小模式正好符合您的要求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接