Emacs-创建自定义突出显示括号功能

法律家

我正在寻找帮助,请进一步修改库中以下已修改的摘录highlight-parentheseshttps : //github.com/nschum/highlight-parentheses.el [Fn 1.]

目标:该目标是使用类似mapcardolist自动替换INSERT-FACE-HERE不同的变量面对my-parens-faces 每次 while 做一个循环视觉效果将是基于嵌套级别的括号的彩虹色。

我将使用post-command-hook和与相似的函数删除叠加层remove-overlays,然后使用parens下面函数添加新的叠加层我不会移动任何叠加层-只是创建和删除。最终版本将为面部使用变量,并针对特定的覆盖层进行删除,但这是其外观的一个示例:(add-hook 'post-command-hook (lambda () (remove-overlays) (parens)))

每次while执行循环时,我都想从变量中插入一张不同的面孔my-parens-faces-依次进行排序,例如dolist例如:

  • while 做循环#1: (:foreground "black" :background "cyan")

  • while 正在执行循环2: (:foreground "blue" :background "purple")

  • while 正在执行循环3: (:foreground "green" :background "blue")

  • while 正在执行循环4: (:foreground "yellow" :background "purple")

  • while 正在执行循环5: (:foreground "orange" :background "yellow")

  • while 正在执行循环6: (:foreground "red" :background "green")

  • while 正在执行循环7: (:foreground "pink" :background "brown")

  • while 正在执行循环8: (:foreground "blue" :background "beige")

(defun parens ()
  (let* (pos1 pos2)
    (save-excursion
      (condition-case err
        (while (setq pos1 (cadr (syntax-ppss pos1)))
          (overlay-put (make-overlay pos1 (1+ pos1)) 'face 'INSERT-FACE-HERE)
          (when (setq pos2 (scan-sexps pos1 1))
            (overlay-put (make-overlay (1- pos2) pos2) 'face 'INSERT-FACE-HERE)))
        (error nil)) )))

(defvar my-parens-faces '(
  (:foreground "black" :background "cyan")
  (:foreground "blue" :background "purple")
  (:foreground "green" :background "blue")
  (:foreground "yellow" :background "purple")
  (:foreground "orange" :background "yellow")
  (:foreground "red" :background "green")
  (:foreground "pink" :background "brown")
  (:foreground "blue" :background "beige")))

[脚注1:参考亮点,括号中的库必须回答这个问题,但被列入参照,以便正确的属性给笔者发(即尼古拉·舒马赫)谁启发的parens。在这个问题上的功能]

法律家
(defvar parens-mode-command-exclusions '(mwheel-scroll scroll-up scroll-down)
  "List of functions that are excluded from triggering the function `parens'.")

(defvar parens-mode-syntax-table
  (let ((st (make-syntax-table)))
    st)
  "Syntax table used while executing the function `parens'.")

(defgroup parens nil
  "Faces for highlighting parentheses in `parens-mode'."
  :group 'parens)

(defface parens-one-face
  '((t (:foreground "magenta")))
  "Face for `parens-one-face'."
  :group 'parens)

(defface parens-two-face
  '((t (:foreground "red")))
  "Face for `parens-two-face'."
  :group 'parens)

(defface parens-three-face
  '((t (:foreground "yellow")))
  "Face for `parens-three-face'."
  :group 'parens)

(defface parens-four-face
  '((t (:foreground "green")))
  "Face for `parens-four-face'."
  :group 'parens)

(defface parens-five-face
  '((t (:foreground "cyan")))
  "Face for `parens-five-face'."
  :group 'parens)

(defface parens-six-face
  '((t (:foreground "orange")))
  "Face for `parens-six-face'."
  :group 'parens)

(defface parens-seven-face
  '((t (:foreground "purple")))
  "Face for `parens-seven-face'."
  :group 'parens)

(defface parens-eight-face
  '((t (:foreground "blue")))
  "Face for `parens-eight-face'."
  :group 'parens)

(defface parens-nine-face
  '((t (:foreground "brown")))
  "Face for `parens-nine-face'."
  :group 'parens)

(defface parens-ten-face
  '((t (:foreground "white")))
  "Face for `parens-ten-face'."
  :group 'parens)

(defvar parens-overlays-exist-p nil
"Simple test to see whether the parens overlays have been placed.")
(make-variable-buffer-local 'parens-overlays-exist-p)

(defun parens ()
"Portions of this function were borrowed from the library
`highlight-parentheses` written by Nikolaj Schumacher.
https://github.com/nschum/highlight-parentheses.el"
  (unless (memq this-command parens-mode-command-exclusions)
    (with-syntax-table parens-mode-syntax-table
      (let* (
          (pt (point))
          (pos1 (if
                  (or
                    (= pt (point-min))
                    (eq (preceding-char) 40) ;; open-parentheses
                    (eq (preceding-char) 91) ;; open-squre-bracket
                    (eq (preceding-char) 123)) ;; open-wavy-bracket
              pt
              (1- pt)))
          pos2
          selected-face
          (i 0) )
        (remove-parens-overlays)
        (save-excursion
          (condition-case nil
            (while (setq pos1 (cadr (syntax-ppss pos1)))
              (if (= i 10)
                (setq i 1)
                (setq i (1+ i)))
              (cond
                ((= i 1)
                  (setq selected-face 'parens-one-face))
                ((= i 2)
                  (setq selected-face 'parens-two-face))
                ((= i 3)
                  (setq selected-face 'parens-three-face))
                ((= i 4)
                  (setq selected-face 'parens-four-face))
                ((= i 5)
                  (setq selected-face 'parens-five-face))
                ((= i 6)
                  (setq selected-face 'parens-six-face))
                ((= i 7)
                  (setq selected-face 'parens-seven-face))
                ((= i 8)
                  (setq selected-face 'parens-eight-face))
                ((= i 9)
                  (setq selected-face 'parens-nine-face))
                ((= i 10)
                  (setq selected-face 'parens-ten-face)) )
              (overlay-put (make-overlay pos1 (1+ pos1)) 'face selected-face)
              (when (setq pos2 (scan-sexps pos1 1))
                (overlay-put (make-overlay (1- pos2) pos2) 'face selected-face)))
            (error nil) ))
        (setq parens-overlays-exist-p t)))))

(defun remove-parens-overlays ()
  (when parens-overlays-exist-p
    (dolist (face '(
        parens-one-face
        parens-two-face
        parens-three-face
        parens-four-face
        parens-five-face
        parens-six-face
        parens-seven-face
        parens-eight-face
        parens-nine-face
        parens-ten-face))
      (remove-overlays nil nil 'face face)) 
    (setq parens-overlays-exist-p nil)))

(defun turn-off-parens-mode ()
  (parens-mode -1))

(define-minor-mode parens-mode
"A minor-mode for highlighting parentheses."
  :init-value nil
  :lighter " ‹›"
  :keymap nil
  :global nil
  :group 'parens
  (cond
    (parens-mode
      (add-hook 'post-command-hook 'parens t t)
      (add-hook 'change-major-mode-hook 'turn-off-parens-mode nil t)
      (when (called-interactively-p 'any)
        (message "Turned ON `parens-mode`.")))
    (t
      (remove-hook 'post-command-hook 'parens t)
      (remove-hook 'change-major-mode-hook 'turn-off-parens-mode t)
      (remove-parens-overlays)
      (when (called-interactively-p 'any)
        (message "Turned OFF `parens-mode`.")))))

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

定义面孔以在Emacs中突出显示语法

来自分类Dev

如何设置emacs进行Clojure,邪恶,提示,括号突出显示?

来自分类Dev

在emacs中突出显示一对大括号的匹配内容

来自分类Dev

Emacs电对模式中的自定义对

来自分类Dev

使用“侧边栏”自定义emacs

来自分类Dev

Emacs自定义Shell命令

来自分类Dev

在emacs中突出显示行

来自分类Dev

Emacs区域语法突出显示

来自分类Dev

具有Java语法突出显示功能的Emacs组织模式?

来自分类Dev

在emacs中突出显示整个c / cpp宏定义?

来自分类Dev

如何在Emacs中加速自定义模式行面部更改功能

来自分类Dev

在括号内时显示括号-Emacs

来自分类Dev

创建emacs模式:定义缩进

来自分类Dev

如何在Emacs启动时显示自定义议程视图?

来自分类Dev

与Vim互补的Emacs功能?

来自分类Dev

Emacs:非代码文件的语法突出显示

来自分类Dev

Emacs:突出显示2个或更多空行

来自分类Dev

禁用emacs中烦人的注释突出显示

来自分类Dev

如何使emacs24突出显示PHP

来自分类Dev

emacs字体自定义,以减轻眼睛疲劳

来自分类Dev

emacs中的自定义文件层次结构

来自分类Dev

Emacs:如何选择好的自定义键绑定?

来自分类Dev

Emacs:如何使自定义意识到新代码?

来自分类Dev

ghci:Emacs haskell模式下的自定义提示

来自分类Dev

如何在Emacs中自定义** pylint-options **

来自分类Dev

emacs主模式定义

来自分类Dev

创建Emacs TAGS文件

来自分类Dev

在emacs中禁用括号匹配

来自分类Dev

Emacs Clojure-移动括号