【发布时间】:2009-05-27 00:38:43
【问题描述】:
在 C 等编程模式下使用 paredit 时,键入 ( 会在我尝试调用函数时在括号前插入一个空格,从而留下:
foo ()
有没有办法在不更改 paredit 源的情况下禁用空格插入?
【问题讨论】:
标签: emacs parentheses paredit
在 C 等编程模式下使用 paredit 时,键入 ( 会在我尝试调用函数时在括号前插入一个空格,从而留下:
foo ()
有没有办法在不更改 paredit 源的情况下禁用空格插入?
【问题讨论】:
标签: emacs parentheses 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,所以差异很小。似乎没有控制此类行为的设置。
【讨论】:
c-mode 中的魅力一样。谢谢! :)
(defvar-local my-paredit-no-insert-space nil) 并使用(and ... my-paredit-no-insert-space) 代替(and ... (memq major-mode '(c-mode lisp-mode)))),然后将my-paredit-no-insert-space 从c-mode-common-hook 设置为t。这样两个偏好不同的人可以使用paredit-space-for-delimiter-p的相同新定义
If you want something more mode specific, you can add some conditions to that and statement - 我确实不想在某些模式下覆盖它,但我不明白我可以将条件添加到哪个“if”语句。你能澄清一下吗?
见paredit-space-for-delimiter-predicates
【讨论】:
嗯,Paredit 非常适合编辑由 S 表达式构建的语言。如果您只是喜欢它自动插入右括号的方式,请使用功能skeleton-pair。
(setq skeleton-pair t)
(global-set-key "(" 'skeleton-pair-insert-maybe)
【讨论】: