[推销package] symbol-overlay,同时高亮多个symbol

我之前是swiper和evil的search混着用,同时只能search和高亮一个单词(当然啦)。整理purcell的配置时发现了这个package,会用不同的颜色高亮我指定的各个symbol,用了两天发现读代码真的舒服不少。


自带有类似的功能,需求简单的话可以试试:

基于自带的写了个toggle highlight和clear all,支持当前选中region或symbol at point:

(defun jester/toggle-highlight-at-point ()
  "Toggle highlight at point (region or symbol)."
  (interactive)
  (require 'hi-lock)
  (let ((hi-regexp-list (mapcar #'car hi-lock-interactive-patterns))
        (hi-regexp-at-pt (jester/regexp-at-point))
        (hi-lock-auto-select-face t))
    (if (member hi-regexp-at-pt hi-regexp-list)
        (unhighlight-regexp hi-regexp-at-pt)
      (highlight-phrase hi-regexp-at-pt (hi-lock-read-face-name)))
    (deactivate-mark)))

(defun jester/clear-all-highlight ()
  "clear all highlight."
  (interactive)
  (let ((hi-regexp-list (mapcar #'car hi-lock-interactive-patterns)))
    (mapcar 'unhighlight-regexp hi-regexp-list)))

(defun jester/regexp-at-point ()
  "if region active, return the region,
otherwise return regexp like \"\\\\_<sym\\\\_>\" for the symbol at point."
  (if (region-active-p)
       (buffer-substring-no-properties
        (region-beginning) (region-end))
     (format "\\_<%s\\_>" (thing-at-point 'symbol t))))
16 个赞

之前用的 highlight-global,感觉这个更好用,果断换之。

1 个赞

话说大家都还在用highlight-symbol嘛……

我添加了一个跳转到 first 和 last的功能:

(defun symbol-overlay-switch-first ()
  (interactive)
  (let* ((symbol (symbol-overlay-get-symbol))
         (keyword (symbol-overlay-assoc symbol))
         (a-symbol (car keyword))
         (before (symbol-overlay-get-list a-symbol 'car))
         (count (length before)))
    (symbol-overlay-jump-call 'symbol-overlay-basic-jump (- count))))

(defun symbol-overlay-switch-last ()
  (interactive)
  (let* ((symbol (symbol-overlay-get-symbol))
         (keyword (symbol-overlay-assoc symbol))
         (a-symbol (car keyword))
         (after (symbol-overlay-get-list a-symbol 'cdr))
         (count (length after)))
    (symbol-overlay-jump-call 'symbol-overlay-basic-jump (- count 1))))

(define-key symbol-overlay-map (kbd "<") 'symbol-overlay-switch-first)
(define-key symbol-overlay-map (kbd ">") 'symbol-overlay-switch-last)

3 个赞

以前用了很久highlight-symbol,换symbol-overlay也很久了。从出来不久Centaur Emacs 就一直在用。两者功能基本相当,效率还不错。

右边的lisp代码中的 new

能让他只限定在第一个函数中高亮

而不让他在第二个函数高亮吗?

好主意,准备考虑加入到我配置。谢谢!

symbol-overlay-toggle-in-scope了解下?

可以在一个 highlight 的 symbol 上面输入 t toggle scope为当前函数作用域。

1 个赞

谢 谢 大家的帮助

大家对这样直接把字母键绑到highlight的区域的做法,都没意见么?想编辑这个symbol的时候就懵了啊……我查了一下把整个map清空了:

(setq symbol-overlay-map (make-sparse-keymap))

一般我会先清掉 overlay再编辑,所以问题不大。

啥意思?没看懂啊,你为什么会把整个 map 清空了?是用的 spacemacs? 用vanilla emacs 没问题哈

1 个赞

它会自动绑定几个键(当处于highlight区域时),比如t是toggle scope,这样就不能输入t了。我是希望highlight一直留在那里,和浏览编辑不冲突。

编辑的时候不要 enable 这个 mode 吧。或者绑定到其他键位,当然你清空也无妨了。

这是一个feature呀

keymap

If this property is non- nil , it specifies a keymap for a portion of the text. This keymap is used when the character after point is within the overlay, and takes precedence over most other keymaps. See Active Keymaps.

嗯,确实是个 feature,但是如何解决 @JJPandari 的问题呢?

晚上临时给doom-modeline 增加了一个 feature,支持在高亮显示symbol-overlay 的状态了,与anzu, iedit, evil-search 同等待遇了。有兴趣的可以看看,效果如下:

3 个赞

如果只是想高亮的时候输入字符的话,只要给keymap加一个prefix key就行了。

确实好用,准备用它换掉 highlight-symbol 了,我的配置:

;; symbol-overlay
;;;  a highlight-symbol replacement.
(use-package symbol-overlay
  :config
  (setq symbol-overlay-map (make-sparse-keymap))
  (setq my/symbol-overlay-keymap (make-sparse-keymap))
  (define-key my/symbol-overlay-keymap (kbd "h") 'symbol-overlay-put)
  (define-key my/symbol-overlay-keymap (kbd "n") 'symbol-overlay-jump-next)
  (define-key my/symbol-overlay-keymap (kbd "p") 'symbol-overlay-jump-prev)
  (define-key my/symbol-overlay-keymap (kbd "w") 'symbol-overlay-save-symbol)
  (define-key my/symbol-overlay-keymap (kbd "t") 'symbol-overlay-toggle-in-scope)
  (define-key my/symbol-overlay-keymap (kbd "e") 'symbol-overlay-echo-mark)
  (define-key my/symbol-overlay-keymap (kbd "d") 'symbol-overlay-jump-to-definition)
  (define-key my/symbol-overlay-keymap (kbd "s") 'symbol-overlay-isearch-literally)
  (define-key my/symbol-overlay-keymap (kbd "q") 'symbol-overlay-query-replace)
  (define-key my/symbol-overlay-keymap (kbd "r") 'symbol-overlay-rename)
  (global-set-key (kbd "C-c h") my/symbol-overlay-keymap))

配合 which-key 用起来还不错,toggle-in-scope 和 rename 是亮点。

个人超级不喜欢 vi 的 mode,因为实际投入到工作中的情况下(写代码),眼里只有光标 输入的地方,压根注意不到当前是在什么 mode 下,所以宁愿每次都按全键,毕竟是肌肉记 忆,多动手、少动脑。当光标放在一个高亮的 symbol 上按 “t” 没反应一下就被吓醒了, 还是配置回纯文本编辑的模式了。

1 个赞