突出显示第一个不匹配的paren

时间:2013-11-05 22:22:52

标签: emacs

Rainbow-delimiters是一个很好的图书馆,用于展示匹配的parens。它有一个很好的特性,如果你有一个额外的正确的parens,它会以一些大声的颜色着色。

e.g。在( ))中,第二个)会显示红色。如果另一个方向也有效,我会很高兴。即,(( )显示第一个明亮的红色。有没有办法调整彩虹分隔符来执行此操作,或者其他一些我可以用来执行此操作的程序包?

2 个答案:

答案 0 :(得分:2)

实际问题是,确定哪个开头定界符是错误的并且必须突出显示是不明确的或相当困难的。请注意,在示例(()中,第一个或第二个括号可能是错误的。可能是第三个括号关闭第二个括号并且第一个括号的右括号丢失,或者可能是第一个与第三个匹配,第二个的关闭缺失。

如果rainbow-delimiters给出了此分隔符的错误,则jit-lock会出现scan-sexps突出显示(defadvice rainbow-delimiters-propertize-region (after hack-unmatching-open activate) "Also mark unmatching open delimiters. Fast fragile hack, not regarding type of delimiter." (save-excursion (goto-char start) (while (and (< (point) end) (re-search-forward "[[{(]" end t)) ;;< first opening delimiter within region (let ((pos (1- (point)))) ;; Note, syntax-ppss does shift position anyway. So, avoiding this does not make sense. (unless (save-excursion (rainbow-delimiters-char-ineligible-p pos)) (condition-case err (goto-char (scan-sexps pos 1)) (scan-error (rainbow-delimiters-apply-color (cdr (assoc (char-before) '((?\( . "paren") (?\[ . "bracket") (?\{ . "brace")))) -1 pos)))))))) 所提供区域中的第一个分隔分隔符。错误分隔符的猜测工作可能是错误的。但是,也许黑客比没有好。

scan-sexps

编辑:我在测试中包含了{{1}},并在文件末尾删除了深度测试。我有一种改善行为的印象。

答案 1 :(得分:0)

Tobias的建议似乎针对rainbow-delimiters的早期版本。我不确定最新版本是否有很大影响。

这是一个通过使用highlight-parenthesesrainbow-delimiters软件包非常接近解决上述问题的解决方案。您可以保存以下代码并使用以下代码进行测试:

emacs -Q -l ~/debug-rainbow-delimiters.el -f emacs-lisp-mode

(setq debug-on-error t)

(when (>= emacs-major-version 24)
  (require 'package)
  (add-to-list 'package-archives 
               '("melpa" . "http://melpa.milkbox.net/packages/") t)
  (package-initialize)
  )

(require 'highlight-parentheses)

(setq hl-paren-colors '("dodger blue"))

(set-face-attribute 'hl-paren-face nil
                    :foreground 'unspecified
                    :inherit 'show-paren-mismatch)

(require 'paren)
(require 'rainbow-delimiters)
(set-face-attribute 'rainbow-delimiters-unmatched-face nil
                    :foreground 'unspecified
                    :inherit 'show-paren-mismatch)

(defvar my-paren-colors '("dodger blue"))

(setq rainbow-delimiters-max-face-count 1)

(set-face-foreground 'rainbow-delimiters-depth-1-face (elt my-paren-colors 1))

;; Hook the above into various Lisp modes

(add-hook 'lisp-mode-hook 'highlight-parentheses)
(add-hook 'lisp-interaction-mode-hook 'highlight-parentheses)
(add-hook 'emacs-lisp-mode-hook 'highlight-parentheses-mode)
(add-hook 'clojure-mode-hook 'highlight-parentheses-mode)

(add-hook 'lisp-mode-hook 'rainbow-delimiters-mode)
(add-hook 'lisp-interaction-mode-hook 'rainbow-delimiters-mode)
(add-hook 'emacs-lisp-mode-hook 'rainbow-delimiters-mode)
(add-hook 'clojure-mode-hook 'rainbow-delimiters-mode)

;;; Custom

(custom-set-variables
   '(package-selected-packages
     '(highlight-parentheses rainbow-delimiters)))

解决方案并不完美-匹配取决于光标的位置。


enter image description here


enter image description here


您可以将其混淆:

enter image description here


也许最重要的是,它具有始终突出显示一个水平的括号的副作用:

enter image description here


我的个人评估是,这可能很有帮助),如果有一个更复杂的解决方案,那就太好了!