更改Paredit格式化

10

在使用paredit编辑C等编程模式时,当我尝试调用函数时,键入左括号将会在括号前插入一个空格,导致最终结果为:

foo ()
有没有一种方法可以禁用插入空格而不改变paredit的源代码?
3个回答

12

据我所了解,paredit的工作原理是检查语法表以查看您是否在单词/符号等后插入一对括号,此时它将强制插入一个空格。 您需要覆盖该功能-这可以通过多种方式完成:建议、重新定义确定空格的函数、更改语法表等。

我建议尝试以下简单方法:

(defun paredit-space-for-delimiter-p (endp delimiter)
  (and (not (if endp (eobp) (bobp)))
       (memq (char-syntax (if endp (char-after) (char-before)))
             (list ?\"  ;; REMOVED ?w ?_
                   (let ((matching (matching-paren delimiter)))
                     (and matching (char-syntax matching)))))))

显然,这将适用于您使用paredit的所有地方。如果您想要更具模式特定性,可以向该and语句添加一些条件(例如(and ... (memq major-mode '(c-mode lisp-mode))))。

所以...我想我确实改变了“源”,但您可以使用一段defadvice实现同样的效果...它都是elisp,因此差异很小。似乎没有设置来控制此类行为。


2
我很久以前就想要这个了,因为我发现autopair.el非常慢。现在,在c-mode中Paredit表现得非常好。谢谢! :) - Vicky Chijwani
为了特定于模式,我们也可以编写(defvar-local my-paredit-no-insert-space nil)并使用(and ... my-paredit-no-insert-space)而不是(and ... (memq major-mode '(c-mode lisp-mode)))),然后从c-mode-common-hookmy-paredit-no-insert-space设置为t。这样,两个具有不同偏好的人可以使用相同的paredit-space-for-delimiter-p新定义。 - Jisang Yoo
如果你想要更具体的模式,你可以在那个“and”语句中添加一些条件。我确实不想覆盖某些模式,但我不明白我可以在哪个“if”语句中添加条件。你能否请澄清一下? - Max

6
请查看 paredit-space-for-delimiter-predicates

这可能与此相关,可能需要调整模式名称,甚至删除“dolist”并简单添加“lambda()”到您的模式挂钩(如果仅有一个模式):https://gist.github.com/remvee/879305 - dimsuz

4

嗯,Paredit非常适合编辑由S表达式构成的语言。如果你只是喜欢它自动插入右括号的功能,请使用特性skeleton-pair

(setq skeleton-pair t)
(global-set-key "(" 'skeleton-pair-insert-maybe)

好的,你说得对。我忘记了骨架匹配。我太习惯于使用Paredit来处理Emacs Lisp了。我需要为我的非Lisp语言设置它。 - Jeremy Grozavescu
3
实际上,paredit 模式在非基于 s 表达式的语言中也非常有用,可以强制匹配定界符的有效性;它不仅仅是关于插入。 - user61051

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