Emacs类型覆盖skeleton-pair-insert-maybe

7
在Eclipse中编辑Java代码时,如果我输入一个开括号,就会得到一对括号。如果我然后“通过”第二个括号进行输入,它不会插入额外的括号。那么在emacs中该怎么做呢?
Eclipse编辑器足够智能,知道当我输入结束括号时,我只是在完成我开始的事情。光标移动到关闭括号之后。如果我然后输入分号,同样的事情发生了:它只是覆盖了分号,我不会得到两个分号。
在emacs中,在java-mode或csharp-mode中,如果我将开括号绑定到skeleton-pair-insert-maybe,我会得到一对开关括号,这很好。但是,如果我“通过”关闭括号进行输入,我会得到两个关闭括号。
有没有办法教emacs在紧接着的skeleton-pair-insert-maybe之后不插入关闭括号?如果可能的话,是否有类似的智能来避免分号加倍?
我在问括号,但同样适用于双引号、花括号、方括号等。任何使用skeleton-pair-insert-maybe插入的内容。
4个回答

4

这篇文章展示了如何做你想要的事情。作为奖励,它还展示了如何设置,如果在打开字符后立即按下退格键,则光标后面的关闭字符也会被删除。

更新:

自从我发布了这个答案,我发现了Autopair,它是一个非常完美的系统,适用于这种情况。我一直在使用它,并且很喜欢它。


简单易懂,正是我想要的。 - Cheeso
自动配对 = 完美。正是我想要的。 - yesudeep

2

总结我所做的事情,我查看了这篇文章,并从中获取了我所需的内容。最终结果更为简单,因为我没有他所要求的额外要求。

我使用了这两个新定义:

(defvar cheeso-skeleton-pair-alist
  '((?\) . ?\()
    (?\] . ?\[)
    (?" . ?")))


(defun cheeso-skeleton-pair-end (arg)
  "Skip the char if it is an ending, otherwise insert it."
  (interactive "*p")
  (let ((char last-command-char))
    (if (and (assq char cheeso-skeleton-pair-alist)
             (eq char (following-char)))
        (forward-char)
      (self-insert-command (prefix-numeric-value arg)))))

然后在我的java-mode-hook中,我这样绑定了close-paren和close-bracket:

(local-set-key (kbd ")") 'cheeso-skeleton-pair-end)
(local-set-key (kbd "]") 'cheeso-skeleton-pair-end)

1
我使用paredit-mode,它可以做到这些以及更多。

0

ParEdit听起来像是可以处理你需要的括号部分,但需要注意的是它是为Common Lisp和Scheme设计的。Steve Yegge提到了JDEE用于emacs Java开发, 但我无法从个人经验中对此发表意见,并且我找不到任何关于它讨论结构化编辑的文档。


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