{以前曾经问过:Emacs: highlight matching paren when cursor is on it, not after it但是没有一个答案令人满意}
我正在使用带有以下.emacs设置的mic-paren(虽然所有类似的emacs包都存在问题,所以它似乎是某种默认的emacs行为)
(paren-activate)
(setq paren-match-face 'highlight)
(setq paren-sexp-mode t)
突出显示两个括号之间的所有文本。当光标打开时,它可以很好地打开括号,但是从另一侧,我必须将光标放在右括号之后。当与粘液一起使用时,这会导致奇怪的行为(这需要将光标放在右括号上以显示一般使用信息等)。有没有办法改变这种行为,并在光标打开右括号时使emacs与括号匹配?
编辑:次要语法修复
答案 0 :(得分:3)
不了解mic-paren,但使用内置的show-paren-mode
,你可以在Emacs-24.4中得到你想要的东西:
(defun my-show-paren-any (orig-fun)
(or (funcall orig-fun)
(if (looking-at "\\s)")
(save-excursion (forward-char 1) (funcall orig-fun)))))
(add-function :around show-paren-data-function #'my-show-paren-any)
答案 1 :(得分:1)
以下适用于`mic-paren'。但是,它有一些余辉;-)。如果光标位于结束分隔符上或紧跟在其后面,则突出显示开始分隔符。
(defadvice mic-paren-highlight (around cursorOnClosing activate)
"Dirty hack to highlight sexps with closing delim below cursor"
(if (eq (char-syntax (following-char)) ?\) )
(let ((paren-priority 'close))
(save-excursion
(forward-char)
ad-do-it))
ad-do-it))
当然,为了完成这项工作,您需要正确安装mic-paren
。只需按照此处引用的mic-paren.el
中的安装指南进行操作:
安装:
(when (or (featurep 'xemacs) window-system)
(require 'mic-paren) ; loading
(paren-activate) ; activating
; set here any of the customizable variables of mic-paren:
; ...
)
C-h f paren-activate' or
go to the customization group
mic-paren-matching'。编辑:
(featurep 'xemacs)
答案 2 :(得分:1)
这里要记住的重要一点是,Emacs的观点是两个字符之间的,而不是 一个字符。要使show-paren
设施触发,该点必须立即在开口或关闭之外。观察到的不对称性是由块光标任意放置在该点之后(而不是之前)的字符引起的。
如果这会让您感到不安,那么解决方法就是使用行光标而不是块光标。
show-paren-mode
正在为下一个但只有一个版本进行增强,这样它也会立即触发一个paren内的点。
答案 3 :(得分:0)
以下建议可以满足您的需求。当块光标位于左括号“上”时,会突出显示右括号。当块光标在右括号“上”时,左括号高亮显示。
(advice-add show-paren-data-function
:around
(lambda (orig-fun)
(cond ((looking-at "\\s(")
(funcall orig-fun))
((looking-at "\\s)")
(save-excursion (forward-char 1) (funcall orig-fun))))))
参考我在 Emacs Stack Exchange 站点上的回答:https://emacs.stackexchange.com/a/63458/17507。在那个答案中,我提供了对上述代码的完整解释,以及一个建议的变体。