# symbol-overlay
**Repository Path**: wolray/symbol-overlay
## Basic Information
- **Project Name**: symbol-overlay
- **Description**: Highlight symbols with keymap-enabled overlays
- **Primary Language**: Emacs Lisp
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-09-10
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Symbol Overlay
Highlight symbols with overlays while providing a keymap for various operations about highlighted symbols. It was originally inspired by the package `highlight-symbol`. The fundamental difference is that in `symbol-overlay` every symbol is highlighted by the Emacs built-in function `overlay-put` rather than the `font-lock` mechanism used in `highlight-symbol`.
What's New!
---
### 20190306:
New commands `symbol-overlay-jump-first` (key "<") and `symbol-overlay-jump-last` (key ">") are now enabled.
### 20190305:
New customizable variable `symbol-overlay-displayed-window` is introduced to control the overlay behavior at `symbol-overlay-mode`. If it is non-nil, occurrences outside the displayed window will not be counted or highlighted.
### 20170826:
`symbol-overlay-toggle-in-scope` now affects both global and in-scope highlighting. `symbol-overlay-rename` now uses the original symbol name as the initial text in minibuffer. New command `symbol-overlay-count` for counting symbol at point. And other improvements.
### 20170426:
Minor-mode `symbol-overlay-mode` for auto-highlighting is now enabled.
### 20170423:
Toggling to isearch-mode is now enabled. Try `symbol-overlay-isearch-literally` via "s" to search the not-quoted symbol in isearch-mode.
### 20170420:
Toggling overlays to be showed in buffer or only in scope is now enabled. When symbol is highlighted in scope, all related operations is narrowed to the scope, too. Try `symbol-overlay-toggle-in-scope` via "t". This feature is applicable only for languages that support the lisp function `narrow-to-defun`. Otherwise you may specify `beginning-of-defun-function` and `end-of-defun-function` on your own.
### 20170417:
Auto-refresh is now enabled. Every time the highlighted text is changed or a new occurrence shows up, the buffer will refresh automatically.
Two new commands added: `symbol-overlay-save-symbol` for copying the current symbol, `symbol-overlay-echo-mark` for undoing a recent jump.
Advantages
---
### Fast
When highlighting symbols in a buffer of regular size and language, `overlay-put` behaves as fast as the traditional Highlighting method `font-lock`. However, for a buffer of major-mode with complicated keywords syntax, like haskell-mode, `font-lock` is quite slow even the buffer is less than 100 lines. Besides, when counting the number of highlighted occurrences, `highlight-symbol` will call the function `how-many` twice, which could also result in an unpleasant delay in a large buffer. Those problems don't exist in `symbol-overlay`.
### Convenient
When putting overlays on symbols, **an auto-activated overlay-inside keymap** will enable you to call various useful commands with **a single keystroke**.
### Powerful
- Toggle all overlays of symbol at point: `symbol-overlay-put`
- Jump between locations of symbol at point: `symbol-overlay-jump-next` & `symbol-overlay-jump-prev`
- Switch to the closest symbol highlighted nearby: `symbol-overlay-switch-forward` & `symbol-overlay-switch-backward`
- Minor mode for auto-highlighting symbol at point: `symbol-overlay-mode`
- Remove all highlighted symbols in the buffer: `symbol-overlay-remove-all`
- Copy symbol at point: `symbol-overlay-save-symbol`
- Toggle overlays to be showed in buffer or only in scope: `symbol-overlay-toggle-in-scope`
- Jump back to the position before a recent jump: `symbol-overlay-echo-mark`
- Jump to the definition of symbol at point: `symbol-overlay-jump-to-definition`
- Isearch symbol at point literally, without `regexp-quote` the symbol: `symbol-overlay-isearch-literally`
- Query replace symbol at point: `symbol-overlay-query-replace`
- Rename symbol at point on all its occurrences: `symbol-overlay-rename`
Usage
---
To use `symbol-overlay` in your Emacs, you need only to bind these keys:
(require 'symbol-overlay)
(global-set-key (kbd "M-i") 'symbol-overlay-put)
(global-set-key (kbd "M-n") 'symbol-overlay-switch-forward)
(global-set-key (kbd "M-p") 'symbol-overlay-switch-backward)
(global-set-key (kbd "") 'symbol-overlay-mode)
(global-set-key (kbd "") 'symbol-overlay-remove-all)
Default key-bindings defined in `symbol-overlay-map`:
"i" -> symbol-overlay-put
"n" -> symbol-overlay-jump-next
"p" -> symbol-overlay-jump-prev
"w" -> symbol-overlay-save-symbol
"t" -> symbol-overlay-toggle-in-scope
"e" -> symbol-overlay-echo-mark
"d" -> symbol-overlay-jump-to-definition
"s" -> symbol-overlay-isearch-literally
"q" -> symbol-overlay-query-replace
"r" -> symbol-overlay-rename
You can re-bind the commands to any keys you prefer by simply writing
(define-key symbol-overlay-map (kbd "your-prefer-key") 'any-command)
Or you may prefer to overwrite the keymap
(let ((map (make-sparse-keymap)))
(define-key map (kbd "key1") 'command-1)
(define-key map (kbd "key2") 'command-2)
(setq symbol-overlay-map map))
As a final example, you can define a handy set of keys using `transient`:
see the snippet posted [here](https://github.com/wolray/symbol-overlay/issues/59).