在使用paredit编辑C等编程模式时,当我尝试调用函数时,键入左括号将会在括号前插入一个空格,导致最终结果为:
foo ()
有没有一种方法可以禁用插入空格而不改变paredit的源代码?在使用paredit编辑C等编程模式时,当我尝试调用函数时,键入左括号将会在括号前插入一个空格,导致最终结果为:
foo ()
有没有一种方法可以禁用插入空格而不改变paredit的源代码?据我所了解,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,因此差异很小。似乎没有设置来控制此类行为。
paredit-space-for-delimiter-predicates
。嗯,Paredit非常适合编辑由S表达式构成的语言。如果你只是喜欢它自动插入右括号的功能,请使用特性skeleton-pair。
(setq skeleton-pair t)
(global-set-key "(" 'skeleton-pair-insert-maybe)
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-hook
将my-paredit-no-insert-space
设置为t
。这样,两个具有不同偏好的人可以使用相同的paredit-space-for-delimiter-p
新定义。 - Jisang Yoo