Emacs:当光标为ON右括号时匹配括号

时间:2014-09-03 15:20:12

标签: emacs elisp

{以前曾经问过: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与括号匹配?

编辑:次要语法修复

4 个答案:

答案 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中的安装指南进行操作:

安装:

  • 将此文件放在' load-path和byte-compile中的目录中 它。你肯定可以忽略这些警告。
  • 将以下内容放入.emacs文件中: (GNU Emacs仅在窗口系统中支持mic-paren,但支持XEmacs 支持mic-paren也没有X)
   (when (or (featurep 'xemacs) window-system)
      (require 'mic-paren) ; loading
      (paren-activate)     ; activating
   ; set here any of the customizable variables of mic-paren:
   ; ...
   )
  • 重新启动您的Emacs。 mic-paren现已安装并激活!
  • 要列出可能的自定义设置,请输入C-h f paren-activate' or go to the customization group mic-paren-matching'。

编辑:

  • 关注Stefan关于(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。在那个答案中,我提供了对上述代码的完整解释,以及一个建议的变体。