A git blame plugin for emacs inspired by VS Code’s GitLens plugin and Vim plugin
Emacs 27.1 is required.
(use-package blamer
:ensure t
:defer 20
:custom
(blamer-idle-time 0.3)
(blamer-min-offset 70)
:custom-face
(blamer-face ((t :foreground "#7a88cf"
:background nil
:height 140
:italic t)))
:config
(global-blamer-mode 1))
(use-package blamer
:quelpa ((blamer :fetcher github :repo "artawower/blamer.el") :upgrade t)
:custom
(blamer-idle-time 0.3)
(blamer-min-offset 70)
:custom-face
(blamer-face ((t :foreground "#7a88cf"
:background nil
:height 140
:italic t)))
:config
(global-blamer-mode 1))
packages.el
(package! blamer)
;; or
(package! blamer :recipe (:host github :repo "artawower/blamer.el"))
config.el
(use-package blamer
:defer 20
:custom
(blamer-idle-time 0.3)
(blamer-min-offset 70)
:custom-face
(blamer-face ((t :foreground "#7a88cf"
:background nil
:height 140
:italic t)))
:config
(global-blamer-mode 1))
Current style for blame messages, now can be overlay
and overlay-right
.
(setq blamer-view 'overlay)
(setq blamer-author-formatter " ✎ %s ")
(setq blamer-datetime-formatter "[%s]")
(setq blamer-commit-formatter "● %s")
All formatters can be nil.
If your would like to wrap whole message, or add special prefix before blame text you can use
(setq blamer-entire-formatter "<%>")
(setq blamer-idle-time 0.5)
(setq blamer-min-offset 40)
(setq blamer-prettify-time-p t)
Will format time line (2 days ago/1 week ago/Yesterday etc)
(setq blamer-type 'both)
Can accept
'selected
- blamer will show commit info for every selected line.'visual
- blamer will show info only about one line.'both
- works with both states.
If more then 30 lines will selected, blamer will not try to execute git commands.
(setq blamer-max-lines 30)
(setq blamer-uncommitted-changes-message "NO COMMITTED")
If line has length more then this value, text will be truncated
(setq blamer-max-commit-message-length 10)
If you want to disable automatic background detection you can always use blamer face
(setq blamer-smart-background-p nil)
You can bind the mouse click event and pass custom handler. Where the handler is callback function with commit-info arg. commit-info consist of:
:commit-hash
- hash of clicked commit
:commit-author
- author name after formatting
:raw-commit-author
- raw author username if exist.
:commit-date
- date of commit. (string field)
:commit-time
- commit’s time. (string field)
:commit-message
- message of commit. If not exist will be get from
For example, if we want to open magit diff by left click, and browse remote by right click we can use this code (magit and forge have to be installed):
(defun blamer-callback-show-commit-diff (commit-info)
(interactive)
(let ((commit-hash (plist-get commit-info :commit-hash)))
(when commit-hash
(magit-show-commit commit-hash))))
(defun blamer-callback-open-remote (commit-info)
(interactive)
(let ((commit-hash (plist-get commit-info :commit-hash)))
(when commit-hash
(message commit-hash)
(forge-browse-commit commit-hash))))
(setq blamer-bindings '(("<mouse-3>" . blamer-callback-open-remote)
("<mouse-1>" . blamer-callback-show-commit-diff)))
Run before push
emacs -batch -l ert -l blamer.el -l test.el -f ert-run-tests-batch-and-exit
- [X] Get necessary information about current line under cursor
- [X] Get commit info by current hash (if necessary)
- [X] Get background color if hl-mode is exist and enabled (transparency)
- [X] Visualize information in special format
- [X] blamer-mode implementation
- [X] Write tests for regexps
- [X] IDLE time before showing
- [X] Special font for blame.
- [X] Truncate long commit line
- [X] Add pretty date format
- [X] Pretty author name
- [X] Add support for common line number changed (might be deleted from external source, or evil keys)
- [X] Add support for global mode
- [X] Add support for multi line selection
- [X] Canonical blamer format + templates.
- [ ] Clickable annotations