branch: elpa/eldoc-diffstat
commit 583a4959c00d845f74092f8d02efd9ce8db43375
Author: Johann Klähn <[email protected]>
Commit: Johann Klähn <[email protected]>
Initial import
---
eldoc-diffstat.el | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 106 insertions(+)
diff --git a/eldoc-diffstat.el b/eldoc-diffstat.el
new file mode 100644
index 0000000000..e4d372622e
--- /dev/null
+++ b/eldoc-diffstat.el
@@ -0,0 +1,106 @@
+;;; eldoc-diffstat.el --- Make git diffstat available via eldoc -*-
lexical-binding: t; -*-
+
+;; Copyright (C) 2024 Johann Klähn
+
+;; Author: Johann Klähn <[email protected]>
+;; Keywords: vc, docs
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; Adapted from
https://www.tsdh.org/posts/2022-07-20-using-eldoc-with-magit-async.html
+
+;;; Code:
+
+(require 'ansi-color)
+
+(defvar eldoc-diffstat--process nil)
+(defconst eldoc-diffstat--command
+ (list "git" "--no-pager" "show" "--color=always"
+ "--format=format:%an <%ae>, %aD" "--stat=80"))
+
+;;;###autoload
+(defun eldoc-diffstat-setup ()
+ "Configure eldoc buffer-locally to display diffstat for commit at point."
+ (interactive)
+ (add-hook 'eldoc-documentation-functions
+ #'eldoc-diffstat--docstring nil 'local))
+
+(defun eldoc-diffstat--docstring (callback &rest _ignored)
+ "Display diffstat for commit at point by calling CALLBACK.
+Intended for `eldoc-documentation-functions'."
+ (when-let* ((commit (or (when (fboundp 'magit-commit-at-point)
+ (magit-commit-at-point))
+ (and (derived-mode-p 'vc-annotate-mode)
+ (boundp 'vc-annotate-backend)
+ (eq vc-annotate-backend 'Git)
+ (fboundp 'vc-annotate-extract-revision-at-line)
+ (car (vc-annotate-extract-revision-at-line)))
+ (and (derived-mode-p 'log-view-mode)
+ (boundp 'log-view-vc-backend)
+ (eq log-view-vc-backend 'Git)
+ (log-view-current-tag)))))
+ (eldoc-diffstat--docstring-1 commit callback)))
+
+(defun eldoc-diffstat--docstring-1 (commit callback &rest _ignored)
+ "Display diffstat for COMMIT by calling CALLBACK."
+ ;; Clean up old process and its buffer.
+ (when (processp eldoc-diffstat--process)
+ (when (process-live-p eldoc-diffstat--process)
+ (let (confirm-kill-processes)
+ (kill-process eldoc-diffstat--process)))
+ (kill-buffer (process-buffer eldoc-diffstat--process)))
+
+ (setq
+ eldoc-diffstat--process
+ (make-process
+ :name "eldoc-diffstat"
+ :buffer (generate-new-buffer " *eldoc-diffstat*")
+ :noquery t
+ :command
+ (append eldoc-diffstat--command (list commit))
+ :sentinel
+ (apply-partially #'eldoc-diffstat--sentinel callback)))
+
+ ;; Signal that the doc string is computed asynchronously.
+ t)
+
+(defun eldoc-diffstat--sentinel (callback proc event)
+ "Display output of PROC by calling CALLBACK if EVENT indicates success."
+ (when (eq (process-status proc) 'exit)
+ (with-current-buffer (process-buffer proc)
+ (let ((ansi-color-apply-face-function
+ (lambda (beg end face)
+ (put-text-property beg end 'face face))))
+ (ansi-color-apply-on-region (point-min) (point-max)))
+
+ ;; Make first line bold.
+ (goto-char (point-min))
+ (put-text-property (point)
+ (line-end-position)
+ 'face 'bold)
+
+ ;; Move summary to the top and make it italic.
+ (forward-line)
+ (reverse-region (point) (point-max))
+ (put-text-property (point)
+ (line-end-position)
+ 'face 'italic)
+ (forward-line)
+ (reverse-region (point) (point-max))
+ (funcall callback (buffer-string)))))
+
+(provide 'eldoc-diffstat)
+;;; eldoc-diffstat.el ends here