我之前是swiper和evil的search混着用,同时只能search和高亮一个单词(当然啦)。整理purcell的配置时发现了这个package,会用不同的颜色高亮我指定的各个symbol,用了两天发现读代码真的舒服不少。
自带有类似的功能,需求简单的话可以试试:
可以自己挨个试着玩玩,这个是 Emacs 自带的
key
binding
M-s h .
highlight-symbol-at-point
M-s h f
hi-lock-find-patterns
M-s h l
highlight-lines-matching-regexp
M-s h p
highlight-phrase
M-s h r
highlight-regexp
M-s h u
unhighlight-regexp
M-s h w
hi-lock-write-interactive-patterns
相关文档
基于自带的写了个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 就一直在用。两者功能基本相当,效率还不错。
symbol-overlay-toggle-in-scope
了解下?
可以在一个 highlight 的 symbol 上面输入 t
toggle scope为当前函数作用域。
1 个赞
guanghui.qu:
输入 t
toggle
大家对这样直接把字母键绑到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,但是如何解决 @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 个赞