From 88ec194df83009eb89a15f3f6e9c25f3de27d576 Mon Sep 17 00:00:00 2001 From: Jimmy Yuen Ho Wong Date: Sun, 2 Nov 2025 21:15:40 +0000 Subject: [PATCH 1/6] rename diff-hl-inline-popup to diff-hl-show-hunk-inline --- diff-hl-inline-popup.el | 256 ++++++++++++++++++++-------------------- diff-hl-show-hunk.el | 6 +- 2 files changed, 131 insertions(+), 131 deletions(-) diff --git a/diff-hl-inline-popup.el b/diff-hl-inline-popup.el index 0f202aff..01c8b99c 100644 --- a/diff-hl-inline-popup.el +++ b/diff-hl-inline-popup.el @@ -1,4 +1,4 @@ -;;; diff-hl-inline-popup.el --- inline popup using phantom overlays -*- lexical-binding: t -*- +;;; diff-hl-show-hunk-inline.el --- inline popup using phantom overlays -*- lexical-binding: t -*- ;; Copyright (C) 2020-2021 Free Software Foundation, Inc. @@ -26,33 +26,33 @@ (require 'subr-x) -(defvar diff-hl-inline-popup--current-popup nil "The overlay of the current inline popup.") -(defvar diff-hl-inline-popup--current-lines nil "A list of the lines to show in the popup.") -(defvar diff-hl-inline-popup--current-index nil "First line showed in popup.") -(defvar diff-hl-inline-popup--invokinkg-command nil "Command that invoked the popup.") -(defvar diff-hl-inline-popup--current-footer nil "String to be displayed in the footer.") -(defvar diff-hl-inline-popup--current-header nil "String to be displayed in the header.") -(defvar diff-hl-inline-popup--height nil "Height of the popup.") -(defvar diff-hl-inline-popup--current-custom-keymap nil "Keymap to be added to the keymap of the inline popup.") -(defvar diff-hl-inline-popup--close-hook nil "Function to be called when the popup closes.") - -(make-variable-buffer-local 'diff-hl-inline-popup--current-popup) -(make-variable-buffer-local 'diff-hl-inline-popup--current-lines) -(make-variable-buffer-local 'diff-hl-inline-popup--current-index) -(make-variable-buffer-local 'diff-hl-inline-popup--current-header) -(make-variable-buffer-local 'diff-hl-inline-popup--current-footer) -(make-variable-buffer-local 'diff-hl-inline-popup--invokinkg-command) -(make-variable-buffer-local 'diff-hl-inline-popup--current-custom-keymap) -(make-variable-buffer-local 'diff-hl-inline-popup--height) -(make-variable-buffer-local 'diff-hl-inline-popup--close-hook) - -(defun diff-hl-inline-popup--splice (list offset length) +(defvar diff-hl-show-hunk-inline--current-popup nil "The overlay of the current inline popup.") +(defvar diff-hl-show-hunk-inline--current-lines nil "A list of the lines to show in the popup.") +(defvar diff-hl-show-hunk-inline--current-index nil "First line showed in popup.") +(defvar diff-hl-show-hunk-inline--invokinkg-command nil "Command that invoked the popup.") +(defvar diff-hl-show-hunk-inline--current-footer nil "String to be displayed in the footer.") +(defvar diff-hl-show-hunk-inline--current-header nil "String to be displayed in the header.") +(defvar diff-hl-show-hunk-inline--height nil "Height of the popup.") +(defvar diff-hl-show-hunk-inline--current-custom-keymap nil "Keymap to be added to the keymap of the inline popup.") +(defvar diff-hl-show-hunk-inline--close-hook nil "Function to be called when the popup closes.") + +(make-variable-buffer-local 'diff-hl-show-hunk-inline--current-popup) +(make-variable-buffer-local 'diff-hl-show-hunk-inline--current-lines) +(make-variable-buffer-local 'diff-hl-show-hunk-inline--current-index) +(make-variable-buffer-local 'diff-hl-show-hunk-inline--current-header) +(make-variable-buffer-local 'diff-hl-show-hunk-inline--current-footer) +(make-variable-buffer-local 'diff-hl-show-hunk-inline--invokinkg-command) +(make-variable-buffer-local 'diff-hl-show-hunk-inline--current-custom-keymap) +(make-variable-buffer-local 'diff-hl-show-hunk-inline--height) +(make-variable-buffer-local 'diff-hl-show-hunk-inline--close-hook) + +(defun diff-hl-show-hunk-inline--splice (list offset length) "Compute a sublist of LIST starting at OFFSET, of LENGTH." (butlast (nthcdr offset list) (- (length list) length offset))) -(defun diff-hl-inline-popup--ensure-enough-lines (pos content-height) +(defun diff-hl-show-hunk-inline--ensure-enough-lines (pos content-height) "Ensure there is enough lines below POS to show the inline popup. CONTENT-HEIGHT specifies the height of the popup." (let* ((line (line-number-at-pos pos)) @@ -62,40 +62,40 @@ CONTENT-HEIGHT specifies the height of the popup." (when (< 0 overflow) (run-with-timer 0.1 nil #'scroll-up overflow)))) -(defun diff-hl-inline-popup--compute-content-height (&optional content-size) +(defun diff-hl-show-hunk-inline--compute-content-height (&optional content-size) "Compute the height of the inline popup. Default for CONTENT-SIZE is the size of the current lines" - (let ((content-size (or content-size (length diff-hl-inline-popup--current-lines))) + (let ((content-size (or content-size (length diff-hl-show-hunk-inline--current-lines))) (max-size (- (/(window-height) 2) 3))) (min content-size max-size))) -(defun diff-hl-inline-popup--compute-content-lines (lines index window-size) +(defun diff-hl-show-hunk-inline--compute-content-lines (lines index window-size) "Compute the lines to show in the popup. Compute it from LINES starting at INDEX with a WINDOW-SIZE." (let* ((len (length lines)) (window-size (min window-size len)) (index (min index (- len window-size)))) - (diff-hl-inline-popup--splice lines index window-size))) + (diff-hl-show-hunk-inline--splice lines index window-size))) -(defun diff-hl-inline-popup--compute-header (width &optional header) +(defun diff-hl-show-hunk-inline--compute-header (width &optional header) "Compute the header of the popup. Compute it from some WIDTH, and some optional HEADER text." - (let* ((scroll-indicator (if (eq diff-hl-inline-popup--current-index 0) " " " ⬆ ")) + (let* ((scroll-indicator (if (eq diff-hl-show-hunk-inline--current-index 0) " " " ⬆ ")) (header (or header "")) (new-width (- width (length header) (length scroll-indicator))) (header (if (< new-width 0) "" header)) (new-width (- width (length header) (length scroll-indicator))) - (line (propertize (concat (diff-hl-inline-popup--separator new-width) + (line (propertize (concat (diff-hl-show-hunk-inline--separator new-width) header scroll-indicator ) 'face '(:underline t)))) (concat line "\n") )) -(defun diff-hl-inline-popup--compute-footer (width &optional footer) +(defun diff-hl-show-hunk-inline--compute-footer (width &optional footer) "Compute the header of the popup. Compute it from some WIDTH, and some optional FOOTER text." - (let* ((scroll-indicator (if (>= diff-hl-inline-popup--current-index - (- (length diff-hl-inline-popup--current-lines) - diff-hl-inline-popup--height)) + (let* ((scroll-indicator (if (>= diff-hl-show-hunk-inline--current-index + (- (length diff-hl-show-hunk-inline--current-lines) + diff-hl-show-hunk-inline--height)) " " " ⬇ ")) (footer (or footer "")) @@ -104,19 +104,19 @@ Compute it from some WIDTH, and some optional FOOTER text." (new-width (- width (length footer) (length scroll-indicator))) (blank-line (if (display-graphic-p) "" - (concat "\n" (propertize (diff-hl-inline-popup--separator width) + (concat "\n" (propertize (diff-hl-show-hunk-inline--separator width) 'face '(:underline t))))) - (line (propertize (concat (diff-hl-inline-popup--separator new-width) + (line (propertize (concat (diff-hl-show-hunk-inline--separator new-width) footer scroll-indicator) 'face '(:overline t)))) (concat blank-line "\n" line))) -(defun diff-hl-inline-popup--separator (width &optional sep) +(defun diff-hl-show-hunk-inline--separator (width &optional sep) "Return the horizontal separator with character SEP and a WIDTH." (let ((sep (or sep ?\s))) (make-string width sep))) -(defun diff-hl-inline-popup--available-width () +(defun diff-hl-show-hunk-inline--available-width () "Compute the available width in chars." (let ((magic-adjust 3)) (if (not (display-graphic-p)) @@ -132,158 +132,158 @@ Compute it from some WIDTH, and some optional FOOTER text." ;; https://emacs.stackexchange.com/questions/5495/how-can-i-determine-the-width-of-characters-on-the-screen width)))) -(defun diff-hl-inline-popup--compute-popup-str (lines index window-size header footer) +(defun diff-hl-show-hunk-inline--compute-popup-str (lines index window-size header footer) "Compute the string that represents the popup. There are some content LINES starting at INDEX, with a WINDOW-SIZE. HEADER and FOOTER are showed at start and end." - (let* ((width (diff-hl-inline-popup--available-width)) - (content-lines (diff-hl-inline-popup--compute-content-lines lines index window-size)) - (header (diff-hl-inline-popup--compute-header width header)) - (footer (diff-hl-inline-popup--compute-footer width footer))) + (let* ((width (diff-hl-show-hunk-inline--available-width)) + (content-lines (diff-hl-show-hunk-inline--compute-content-lines lines index window-size)) + (header (diff-hl-show-hunk-inline--compute-header width header)) + (footer (diff-hl-show-hunk-inline--compute-footer width footer))) (concat header (string-join content-lines "\n") footer "\n"))) -(defun diff-hl-inline-popup-scroll-to (index) +(defun diff-hl-show-hunk-inline-scroll-to (index) "Scroll the inline popup to make visible the line at position INDEX." - (when diff-hl-inline-popup--current-popup - (setq diff-hl-inline-popup--current-index (max 0 (min index (- (length diff-hl-inline-popup--current-lines) diff-hl-inline-popup--height)))) - (let* ((str (diff-hl-inline-popup--compute-popup-str - diff-hl-inline-popup--current-lines - diff-hl-inline-popup--current-index - diff-hl-inline-popup--height - diff-hl-inline-popup--current-header - diff-hl-inline-popup--current-footer))) + (when diff-hl-show-hunk-inline--current-popup + (setq diff-hl-show-hunk-inline--current-index (max 0 (min index (- (length diff-hl-show-hunk-inline--current-lines) diff-hl-show-hunk-inline--height)))) + (let* ((str (diff-hl-show-hunk-inline--compute-popup-str + diff-hl-show-hunk-inline--current-lines + diff-hl-show-hunk-inline--current-index + diff-hl-show-hunk-inline--height + diff-hl-show-hunk-inline--current-header + diff-hl-show-hunk-inline--current-footer))) ;; https://debbugs.gnu.org/38563, `company--replacement-string'. (add-face-text-property 0 (length str) 'default t str) (put-text-property 0 1 'cursor 0 str) - (overlay-put diff-hl-inline-popup--current-popup 'before-string str)))) + (overlay-put diff-hl-show-hunk-inline--current-popup 'before-string str)))) -(defun diff-hl-inline-popup--popup-down() +(defun diff-hl-show-hunk-inline--popup-down() "Scrolls one line down." (interactive) - (diff-hl-inline-popup-scroll-to (1+ diff-hl-inline-popup--current-index) )) + (diff-hl-show-hunk-inline-scroll-to (1+ diff-hl-show-hunk-inline--current-index) )) -(defun diff-hl-inline-popup--popup-up() +(defun diff-hl-show-hunk-inline--popup-up() "Scrolls one line up." (interactive) - (diff-hl-inline-popup-scroll-to (1- diff-hl-inline-popup--current-index) )) + (diff-hl-show-hunk-inline-scroll-to (1- diff-hl-show-hunk-inline--current-index) )) -(defun diff-hl-inline-popup--popup-pagedown() +(defun diff-hl-show-hunk-inline--popup-pagedown() "Scrolls one page down." (interactive) - (diff-hl-inline-popup-scroll-to (+ diff-hl-inline-popup--current-index diff-hl-inline-popup--height) )) + (diff-hl-show-hunk-inline-scroll-to (+ diff-hl-show-hunk-inline--current-index diff-hl-show-hunk-inline--height) )) -(defun diff-hl-inline-popup--popup-pageup() +(defun diff-hl-show-hunk-inline--popup-pageup() "Scrolls one page up." (interactive) - (diff-hl-inline-popup-scroll-to (- diff-hl-inline-popup--current-index diff-hl-inline-popup--height) )) + (diff-hl-show-hunk-inline-scroll-to (- diff-hl-show-hunk-inline--current-index diff-hl-show-hunk-inline--height) )) -(defvar diff-hl-inline-popup-transient-mode-map +(defvar diff-hl-show-hunk-inline-transient-mode-map (let ((map (make-sparse-keymap))) - (define-key map (kbd "") #'diff-hl-inline-popup--popup-pageup) - (define-key map (kbd "M-v") #'diff-hl-inline-popup--popup-pageup) - (define-key map (kbd "") #'diff-hl-inline-popup--popup-pagedown) - (define-key map (kbd "C-v") #'diff-hl-inline-popup--popup-pagedown) - (define-key map (kbd "") #'diff-hl-inline-popup--popup-up) - (define-key map (kbd "C-p") #'diff-hl-inline-popup--popup-up) - (define-key map (kbd "") #'diff-hl-inline-popup--popup-down) - (define-key map (kbd "C-n") #'diff-hl-inline-popup--popup-down) - (define-key map (kbd "C-g") #'diff-hl-inline-popup-hide) - (define-key map [escape] #'diff-hl-inline-popup-hide) - (define-key map (kbd "q") #'diff-hl-inline-popup-hide) + (define-key map (kbd "") #'diff-hl-show-hunk-inline--popup-pageup) + (define-key map (kbd "M-v") #'diff-hl-show-hunk-inline--popup-pageup) + (define-key map (kbd "") #'diff-hl-show-hunk-inline--popup-pagedown) + (define-key map (kbd "C-v") #'diff-hl-show-hunk-inline--popup-pagedown) + (define-key map (kbd "") #'diff-hl-show-hunk-inline--popup-up) + (define-key map (kbd "C-p") #'diff-hl-show-hunk-inline--popup-up) + (define-key map (kbd "") #'diff-hl-show-hunk-inline--popup-down) + (define-key map (kbd "C-n") #'diff-hl-show-hunk-inline--popup-down) + (define-key map (kbd "C-g") #'diff-hl-show-hunk-inline-hide) + (define-key map [escape] #'diff-hl-show-hunk-inline-hide) + (define-key map (kbd "q") #'diff-hl-show-hunk-inline-hide) ;;http://ergoemacs.org/emacs/emacs_mouse_wheel_config.html - (define-key map (kbd "") #'diff-hl-inline-popup--popup-up) - (define-key map (kbd "") #'diff-hl-inline-popup--popup-up) - (define-key map (kbd "") #'diff-hl-inline-popup--popup-down) - (define-key map (kbd "") #'diff-hl-inline-popup--popup-down) + (define-key map (kbd "") #'diff-hl-show-hunk-inline--popup-up) + (define-key map (kbd "") #'diff-hl-show-hunk-inline--popup-up) + (define-key map (kbd "") #'diff-hl-show-hunk-inline--popup-down) + (define-key map (kbd "") #'diff-hl-show-hunk-inline--popup-down) map) - "Keymap for command `diff-hl-inline-popup-transient-mode'. + "Keymap for command `diff-hl-show-hunk-inline-transient-mode'. Capture all the vertical movement of the point, and converts it to scroll in the popup") -(defun diff-hl-inline-popup--ignorable-command-p (command) +(defun diff-hl-show-hunk-inline--ignorable-command-p (command) "Decide if COMMAND is a command allowed while showing an inline popup." ;; https://emacs.stackexchange.com/questions/653/how-can-i-find-out-in-which-keymap-a-key-is-bound - (let ((keys (where-is-internal command (list diff-hl-inline-popup--current-custom-keymap - diff-hl-inline-popup-transient-mode-map ) t)) - (invoking (eq command diff-hl-inline-popup--invokinkg-command))) + (let ((keys (where-is-internal command (list diff-hl-show-hunk-inline--current-custom-keymap + diff-hl-show-hunk-inline-transient-mode-map ) t)) + (invoking (eq command diff-hl-show-hunk-inline--invokinkg-command))) (or keys invoking))) -(defun diff-hl-inline-popup--post-command-hook () +(defun diff-hl-show-hunk-inline--post-command-hook () "Called each time a command is executed." (let ((allowed-command (or - (string-match-p "diff-hl-inline-popup-" (symbol-name this-command)) - (diff-hl-inline-popup--ignorable-command-p this-command)))) + (string-match-p "diff-hl-show-hunk-inline-" (symbol-name this-command)) + (diff-hl-show-hunk-inline--ignorable-command-p this-command)))) (unless allowed-command - (diff-hl-inline-popup-hide)))) + (diff-hl-show-hunk-inline-hide)))) -(define-minor-mode diff-hl-inline-popup-transient-mode +(define-minor-mode diff-hl-show-hunk-inline-transient-mode "Temporal minor mode to control an inline popup" :global nil - (remove-hook 'post-command-hook #'diff-hl-inline-popup--post-command-hook t) - (set-keymap-parent diff-hl-inline-popup-transient-mode-map nil) + (remove-hook 'post-command-hook #'diff-hl-show-hunk-inline--post-command-hook t) + (set-keymap-parent diff-hl-show-hunk-inline-transient-mode-map nil) - (when diff-hl-inline-popup-transient-mode - (set-keymap-parent diff-hl-inline-popup-transient-mode-map - diff-hl-inline-popup--current-custom-keymap) - (add-hook 'post-command-hook #'diff-hl-inline-popup--post-command-hook 0 t))) + (when diff-hl-show-hunk-inline-transient-mode + (set-keymap-parent diff-hl-show-hunk-inline-transient-mode-map + diff-hl-show-hunk-inline--current-custom-keymap) + (add-hook 'post-command-hook #'diff-hl-show-hunk-inline--post-command-hook 0 t))) ;;;###autoload -(defun diff-hl-inline-popup-hide() +(defun diff-hl-show-hunk-inline-hide() "Hide the current inline popup." (interactive) - (when diff-hl-inline-popup-transient-mode - (diff-hl-inline-popup-transient-mode -1)) - (when diff-hl-inline-popup--close-hook - (funcall diff-hl-inline-popup--close-hook) - (setq diff-hl-inline-popup--close-hook nil)) - (when diff-hl-inline-popup--current-popup - (delete-overlay diff-hl-inline-popup--current-popup) - (setq diff-hl-inline-popup--current-popup nil))) + (when diff-hl-show-hunk-inline-transient-mode + (diff-hl-show-hunk-inline-transient-mode -1)) + (when diff-hl-show-hunk-inline--close-hook + (funcall diff-hl-show-hunk-inline--close-hook) + (setq diff-hl-show-hunk-inline--close-hook nil)) + (when diff-hl-show-hunk-inline--current-popup + (delete-overlay diff-hl-show-hunk-inline--current-popup) + (setq diff-hl-show-hunk-inline--current-popup nil))) ;;;###autoload -(defun diff-hl-inline-popup-show (lines &optional header footer keymap close-hook point height) +(defun diff-hl-show-hunk-inline-show (lines &optional header footer keymap close-hook point height) "Create a phantom overlay to show the inline popup, with some content LINES, and a HEADER and a FOOTER, at POINT. KEYMAP is added to the current keymaps. CLOSE-HOOK is called when the popup is closed." - (when diff-hl-inline-popup--current-popup - (delete-overlay diff-hl-inline-popup--current-popup) - (setq diff-hl-inline-popup--current-popup nil)) + (when diff-hl-show-hunk-inline--current-popup + (delete-overlay diff-hl-show-hunk-inline--current-popup) + (setq diff-hl-show-hunk-inline--current-popup nil)) - (when (< (diff-hl-inline-popup--compute-content-height 99) 2) + (when (< (diff-hl-show-hunk-inline--compute-content-height 99) 2) (user-error "There is no enough vertical space to show the inline popup")) (let* ((the-point (or point (line-end-position))) (the-buffer (current-buffer)) (overlay (make-overlay the-point the-point the-buffer))) (overlay-put overlay 'phantom t) - (overlay-put overlay 'diff-hl-inline-popup t) - (setq diff-hl-inline-popup--current-popup overlay) + (overlay-put overlay 'diff-hl-show-hunk-inline t) + (setq diff-hl-show-hunk-inline--current-popup overlay) - (setq diff-hl-inline-popup--current-lines + (setq diff-hl-show-hunk-inline--current-lines (mapcar (lambda (s) (replace-regexp-in-string "\n" " " s)) lines)) - (setq diff-hl-inline-popup--current-header header) - (setq diff-hl-inline-popup--current-footer footer) - (setq diff-hl-inline-popup--invokinkg-command this-command) - (setq diff-hl-inline-popup--current-custom-keymap keymap) - (setq diff-hl-inline-popup--close-hook close-hook) - (setq diff-hl-inline-popup--height (diff-hl-inline-popup--compute-content-height height)) - (setq diff-hl-inline-popup--height (min diff-hl-inline-popup--height - (length diff-hl-inline-popup--current-lines))) - ;; (diff-hl-inline-popup--ensure-enough-lines point diff-hl-inline-popup--height) - (diff-hl-inline-popup-transient-mode 1) - (diff-hl-inline-popup-scroll-to 0) + (setq diff-hl-show-hunk-inline--current-header header) + (setq diff-hl-show-hunk-inline--current-footer footer) + (setq diff-hl-show-hunk-inline--invokinkg-command this-command) + (setq diff-hl-show-hunk-inline--current-custom-keymap keymap) + (setq diff-hl-show-hunk-inline--close-hook close-hook) + (setq diff-hl-show-hunk-inline--height (diff-hl-show-hunk-inline--compute-content-height height)) + (setq diff-hl-show-hunk-inline--height (min diff-hl-show-hunk-inline--height + (length diff-hl-show-hunk-inline--current-lines))) + ;; (diff-hl-show-hunk-inline--ensure-enough-lines point diff-hl-show-hunk-inline--height) + (diff-hl-show-hunk-inline-transient-mode 1) + (diff-hl-show-hunk-inline-scroll-to 0) overlay)) -(defun diff-hl-inline-popup--hide-all () +(defun diff-hl-show-hunk-inline--hide-all () "Testing purposes, use in case some inline popups get stuck in a buffer." (interactive) - (when diff-hl-inline-popup-transient-mode - (diff-hl-inline-popup-transient-mode -1)) - (setq diff-hl-inline-popup--current-popup nil) + (when diff-hl-show-hunk-inline-transient-mode + (diff-hl-show-hunk-inline-transient-mode -1)) + (setq diff-hl-show-hunk-inline--current-popup nil) (let* ((all-overlays (overlays-in (point-min) (point-max))) - (overlays (cl-remove-if-not (lambda (o)(overlay-get o 'diff-hl-inline-popup)) all-overlays))) + (overlays (cl-remove-if-not (lambda (o)(overlay-get o 'diff-hl-show-hunk-inline)) all-overlays))) (dolist (o overlays) (delete-overlay o)))) -(provide 'diff-hl-inline-popup) -;;; diff-hl-inline-popup ends here +(provide 'diff-hl-show-hunk-inline) +;;; diff-hl-show-hunk-inline ends here diff --git a/diff-hl-show-hunk.el b/diff-hl-show-hunk.el index 5a722f54..95eced85 100644 --- a/diff-hl-show-hunk.el +++ b/diff-hl-show-hunk.el @@ -36,7 +36,7 @@ ;;; Code: -(require 'diff-hl-inline-popup) +(require 'diff-hl-show-hunk-inline) (require 'diff-hl) (defvar diff-hl-show-hunk-mouse-mode-map @@ -272,7 +272,7 @@ BUFFER is a buffer with the hunk." (lambda () (overlay-put invisible-overlay 'invisible nil) (delete-overlay invisible-overlay) - (diff-hl-inline-popup-hide))))) + (diff-hl-show-hunk-inline-hide))))) (diff-hl-show-hunk--goto-hunk-overlay overlay) (let ((height (when smart-lines @@ -281,7 +281,7 @@ BUFFER is a buffer with the hunk." (footer "(q)Quit (p)Previous (n)Next (r)Revert (c)Copy original")) (unless diff-hl-show-staged-changes (setq footer (concat footer " (S)Stage"))) - (diff-hl-inline-popup-show + (diff-hl-show-hunk-inline-show propertized-lines (if (and (boundp 'diff-hl-reference-revision) diff-hl-reference-revision) (concat "Diff with " diff-hl-reference-revision) From 053c577f733ca50f20025694f0b12a856103aa4e Mon Sep 17 00:00:00 2001 From: Jimmy Yuen Ho Wong Date: Sun, 2 Nov 2025 21:19:02 +0000 Subject: [PATCH 2/6] fix spelling --- diff-hl-inline-popup.el | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/diff-hl-inline-popup.el b/diff-hl-inline-popup.el index 01c8b99c..0af92bc8 100644 --- a/diff-hl-inline-popup.el +++ b/diff-hl-inline-popup.el @@ -29,7 +29,7 @@ (defvar diff-hl-show-hunk-inline--current-popup nil "The overlay of the current inline popup.") (defvar diff-hl-show-hunk-inline--current-lines nil "A list of the lines to show in the popup.") (defvar diff-hl-show-hunk-inline--current-index nil "First line showed in popup.") -(defvar diff-hl-show-hunk-inline--invokinkg-command nil "Command that invoked the popup.") +(defvar diff-hl-show-hunk-inline--invoking-command nil "Command that invoked the popup.") (defvar diff-hl-show-hunk-inline--current-footer nil "String to be displayed in the footer.") (defvar diff-hl-show-hunk-inline--current-header nil "String to be displayed in the header.") (defvar diff-hl-show-hunk-inline--height nil "Height of the popup.") @@ -41,7 +41,7 @@ (make-variable-buffer-local 'diff-hl-show-hunk-inline--current-index) (make-variable-buffer-local 'diff-hl-show-hunk-inline--current-header) (make-variable-buffer-local 'diff-hl-show-hunk-inline--current-footer) -(make-variable-buffer-local 'diff-hl-show-hunk-inline--invokinkg-command) +(make-variable-buffer-local 'diff-hl-show-hunk-inline--invoking-command) (make-variable-buffer-local 'diff-hl-show-hunk-inline--current-custom-keymap) (make-variable-buffer-local 'diff-hl-show-hunk-inline--height) (make-variable-buffer-local 'diff-hl-show-hunk-inline--close-hook) @@ -205,7 +205,7 @@ to scroll in the popup") ;; https://emacs.stackexchange.com/questions/653/how-can-i-find-out-in-which-keymap-a-key-is-bound (let ((keys (where-is-internal command (list diff-hl-show-hunk-inline--current-custom-keymap diff-hl-show-hunk-inline-transient-mode-map ) t)) - (invoking (eq command diff-hl-show-hunk-inline--invokinkg-command))) + (invoking (eq command diff-hl-show-hunk-inline--invoking-command))) (or keys invoking))) (defun diff-hl-show-hunk-inline--post-command-hook () @@ -263,12 +263,12 @@ is closed." (mapcar (lambda (s) (replace-regexp-in-string "\n" " " s)) lines)) (setq diff-hl-show-hunk-inline--current-header header) (setq diff-hl-show-hunk-inline--current-footer footer) - (setq diff-hl-show-hunk-inline--invokinkg-command this-command) + (setq diff-hl-show-hunk-inline--invoking-command this-command) (setq diff-hl-show-hunk-inline--current-custom-keymap keymap) (setq diff-hl-show-hunk-inline--close-hook close-hook) (setq diff-hl-show-hunk-inline--height (diff-hl-show-hunk-inline--compute-content-height height)) (setq diff-hl-show-hunk-inline--height (min diff-hl-show-hunk-inline--height - (length diff-hl-show-hunk-inline--current-lines))) + (length diff-hl-show-hunk-inline--current-lines))) ;; (diff-hl-show-hunk-inline--ensure-enough-lines point diff-hl-show-hunk-inline--height) (diff-hl-show-hunk-inline-transient-mode 1) (diff-hl-show-hunk-inline-scroll-to 0) From 1acd4e9fa27df029524741bf5286d82fb4a64282 Mon Sep 17 00:00:00 2001 From: Jimmy Yuen Ho Wong Date: Sun, 2 Nov 2025 21:19:37 +0000 Subject: [PATCH 3/6] rename diff-hl-show-hunk-inline-popup to diff-hl-show-hunk-inline --- diff-hl-show-hunk.el | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/diff-hl-show-hunk.el b/diff-hl-show-hunk.el index 95eced85..8a320ea4 100644 --- a/diff-hl-show-hunk.el +++ b/diff-hl-show-hunk.el @@ -22,9 +22,9 @@ ;;; Commentary: ;; `diff-hl-show-hunk' shows a popup with the modification hunk at point. -;; `diff-hl-show-hunk-function' points to the backend used to show the -;; hunk. Its default value is `diff-hl-show-hunk-inline-popup', that -;; shows diffs inline using overlay. There is another built-in backend: +;; `diff-hl-show-hunk-function' points to the backend used to show the hunk. +;; Its default value is `diff-hl-show-hunk-inline', that shows diffs inline +;; using overlay. There is another built-in backend: ;; `diff-hl-show-hunk-posframe' (based on posframe). ;; ;; `diff-hl-show-hunk-mouse-mode' adds interaction on clicking in the @@ -73,24 +73,24 @@ (defconst diff-hl-show-hunk-boundary "^@@.*@@") (defconst diff-hl-show-hunk--no-lines-removed-message (list "<>")) -(defcustom diff-hl-show-hunk-inline-popup-hide-hunk nil +(defcustom diff-hl-show-hunk-inline-hide-hunk nil "If t, inline-popup is shown over the hunk, hiding it." :type 'boolean) -(defcustom diff-hl-show-hunk-inline-popup-smart-lines t +(defcustom diff-hl-show-hunk-inline-smart-lines t "If t, inline-popup tries to show only the deleted lines of the hunk. The added lines are shown when scrolling the popup. If the hunk consist only on added lines, then `diff-hl-show-hunk--no-lines-removed-message' it is shown." :type 'boolean) -(defcustom diff-hl-show-hunk-function 'diff-hl-show-hunk-inline-popup +(defcustom diff-hl-show-hunk-function 'diff-hl-show-hunk-inline "The function used to render the hunk. The function receives as first parameter a buffer with the contents of the hunk, and as second parameter the line number corresponding to the clicked line in the original buffer." :type '(choice - (const :tag "Show inline" diff-hl-show-hunk-inline-popup) + (const :tag "Show inline" diff-hl-show-hunk-inline) (const :tag "Show using posframe" diff-hl-show-hunk-posframe))) (defvar diff-hl-show-hunk--hide-function nil @@ -232,7 +232,7 @@ Returns a list with the buffer and the line number of the clicked line." (defvar diff-hl-show-hunk--hide-function) ;;;###autoload -(defun diff-hl-show-hunk-inline-popup (buffer &optional _ignored-line) +(defun diff-hl-show-hunk-inline (buffer &optional _ignored-line) "Implementation to show the hunk in a inline popup. BUFFER is a buffer with the hunk." ;; prevent diff-hl-inline-popup-hide from being called twice @@ -240,7 +240,7 @@ BUFFER is a buffer with the hunk." (diff-hl-inline-popup-hide)) (setq diff-hl-show-hunk--hide-function #'diff-hl-inline-popup-hide) (let* ((lines (split-string (with-current-buffer buffer (buffer-string)) "[\n\r]+" )) - (smart-lines diff-hl-show-hunk-inline-popup-smart-lines) + (smart-lines diff-hl-show-hunk-inline-smart-lines) (original-lines-number (cl-count-if (lambda (s) (string-prefix-p "-" s)) lines)) (lines (if (string= (car (last lines)) "" ) (butlast lines) lines)) (lines (if (and (eq original-lines-number 0) smart-lines) @@ -261,7 +261,7 @@ BUFFER is a buffer with the hunk." ;; Save point in case the hunk is hidden, so next/previous works as expected ;; If the hunk is delete type, then don't hide the hunk ;; (because the hunk is located in a non deleted line) - (when (and diff-hl-show-hunk-inline-popup-hide-hunk + (when (and diff-hl-show-hunk-inline-hide-hunk (not (eq type 'delete))) (let* ((invisible-overlay (make-overlay (overlay-start overlay) (overlay-end overlay)))) From 4391f6701d9488267215a6ffc84ee26f4dcb7b5a Mon Sep 17 00:00:00 2001 From: Jimmy Yuen Ho Wong Date: Sun, 2 Nov 2025 21:21:08 +0000 Subject: [PATCH 4/6] rename diff-hl-inline-popup.el to diff-hl-show-hunk-inline.el --- diff-hl-inline-popup.el => diff-hl-show-hunk-inline.el | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename diff-hl-inline-popup.el => diff-hl-show-hunk-inline.el (100%) diff --git a/diff-hl-inline-popup.el b/diff-hl-show-hunk-inline.el similarity index 100% rename from diff-hl-inline-popup.el rename to diff-hl-show-hunk-inline.el From 6df8c6aadd022dc9e140831d3549b95b003a1c4e Mon Sep 17 00:00:00 2001 From: Jimmy Yuen Ho Wong Date: Sun, 2 Nov 2025 21:40:09 +0000 Subject: [PATCH 5/6] move show-hink-inline related code to prevent circular dependency --- diff-hl-show-hunk-inline.el | 73 +++++++++++++++++++++++++++++++++++ diff-hl-show-hunk.el | 76 ------------------------------------- 2 files changed, 73 insertions(+), 76 deletions(-) diff --git a/diff-hl-show-hunk-inline.el b/diff-hl-show-hunk-inline.el index 0af92bc8..4bb27990 100644 --- a/diff-hl-show-hunk-inline.el +++ b/diff-hl-show-hunk-inline.el @@ -46,6 +46,17 @@ (make-variable-buffer-local 'diff-hl-show-hunk-inline--height) (make-variable-buffer-local 'diff-hl-show-hunk-inline--close-hook) +(defcustom diff-hl-show-hunk-inline-hide-hunk nil + "If t, inline-popup is shown over the hunk, hiding it." + :type 'boolean) + +(defcustom diff-hl-show-hunk-inline-smart-lines t + "If t, inline-popup tries to show only the deleted lines of the +hunk. The added lines are shown when scrolling the popup. If +the hunk consist only on added lines, then +`diff-hl-show-hunk--no-lines-removed-message' it is shown." + :type 'boolean) + (defun diff-hl-show-hunk-inline--splice (list offset length) "Compute a sublist of LIST starting at OFFSET, of LENGTH." (butlast @@ -285,5 +296,67 @@ is closed." (dolist (o overlays) (delete-overlay o)))) +;;;###autoload +(defun diff-hl-show-hunk-inline (buffer &optional _ignored-line) + "Implementation to show the hunk in a inline popup. +BUFFER is a buffer with the hunk." + ;; prevent diff-hl-show-hunk-inline-hide from being called twice + (let ((diff-hl-show-hunk-inline--close-hook nil)) + (diff-hl-show-hunk-inline-hide)) + (setq diff-hl-show-hunk--hide-function #'diff-hl-show-hunk-inline-hide) + (let* ((lines (split-string (with-current-buffer buffer (buffer-string)) "[\n\r]+" )) + (smart-lines diff-hl-show-hunk-inline-smart-lines) + (original-lines-number (cl-count-if (lambda (s) (string-prefix-p "-" s)) lines)) + (lines (if (string= (car (last lines)) "" ) (butlast lines) lines)) + (lines (if (and (eq original-lines-number 0) smart-lines) + diff-hl-show-hunk--no-lines-removed-message + lines)) + (overlay diff-hl-show-hunk--original-overlay) + (type (overlay-get overlay 'diff-hl-hunk-type)) + (point (if (eq type 'delete) (overlay-start overlay) (overlay-end overlay))) + (propertize-line (lambda (l) + (propertize l 'face + (cond ((string-prefix-p "+" l) + 'diff-added) + ((string-prefix-p "-" l) + 'diff-removed))))) + (propertized-lines (mapcar propertize-line lines))) + + (save-excursion + ;; Save point in case the hunk is hidden, so next/previous works as expected + ;; If the hunk is delete type, then don't hide the hunk + ;; (because the hunk is located in a non deleted line) + (when (and diff-hl-show-hunk-inline-hide-hunk + (not (eq type 'delete))) + (let* ((invisible-overlay (make-overlay (overlay-start overlay) + (overlay-end overlay)))) + ;; Make new overlay, since the diff-hl overlay can be changed by diff-hl-flydiff + (overlay-put invisible-overlay 'invisible t) + ;; Change default hide popup function, to make the overlay visible + (setq diff-hl-show-hunk--hide-function + (lambda () + (overlay-put invisible-overlay 'invisible nil) + (delete-overlay invisible-overlay) + (diff-hl-show-hunk-inline-hide))))) + (diff-hl-show-hunk--goto-hunk-overlay overlay) + (let ((height + (when smart-lines + (when (not (eq 0 original-lines-number)) + original-lines-number))) + (footer "(q)Quit (p)Previous (n)Next (r)Revert (c)Copy original")) + (unless diff-hl-show-staged-changes + (setq footer (concat footer " (S)Stage"))) + (diff-hl-show-hunk-inline-show + propertized-lines + (if (and (boundp 'diff-hl-reference-revision) diff-hl-reference-revision) + (concat "Diff with " diff-hl-reference-revision) + "Diff with HEAD") + footer + diff-hl-show-hunk-map + #'diff-hl-show-hunk-hide + point + height)) + ))) + (provide 'diff-hl-show-hunk-inline) ;;; diff-hl-show-hunk-inline ends here diff --git a/diff-hl-show-hunk.el b/diff-hl-show-hunk.el index 8a320ea4..bc1ed4da 100644 --- a/diff-hl-show-hunk.el +++ b/diff-hl-show-hunk.el @@ -36,7 +36,6 @@ ;;; Code: -(require 'diff-hl-show-hunk-inline) (require 'diff-hl) (defvar diff-hl-show-hunk-mouse-mode-map @@ -73,17 +72,6 @@ (defconst diff-hl-show-hunk-boundary "^@@.*@@") (defconst diff-hl-show-hunk--no-lines-removed-message (list "<>")) -(defcustom diff-hl-show-hunk-inline-hide-hunk nil - "If t, inline-popup is shown over the hunk, hiding it." - :type 'boolean) - -(defcustom diff-hl-show-hunk-inline-smart-lines t - "If t, inline-popup tries to show only the deleted lines of the -hunk. The added lines are shown when scrolling the popup. If -the hunk consist only on added lines, then -`diff-hl-show-hunk--no-lines-removed-message' it is shown." - :type 'boolean) - (defcustom diff-hl-show-hunk-function 'diff-hl-show-hunk-inline "The function used to render the hunk. The function receives as first parameter a buffer with the @@ -229,70 +217,6 @@ Returns a list with the buffer and the line number of the clicked line." (define-key map (kbd "S") #'diff-hl-show-hunk-stage-hunk) map)) -(defvar diff-hl-show-hunk--hide-function) - -;;;###autoload -(defun diff-hl-show-hunk-inline (buffer &optional _ignored-line) - "Implementation to show the hunk in a inline popup. -BUFFER is a buffer with the hunk." - ;; prevent diff-hl-inline-popup-hide from being called twice - (let ((diff-hl-inline-popup--close-hook nil)) - (diff-hl-inline-popup-hide)) - (setq diff-hl-show-hunk--hide-function #'diff-hl-inline-popup-hide) - (let* ((lines (split-string (with-current-buffer buffer (buffer-string)) "[\n\r]+" )) - (smart-lines diff-hl-show-hunk-inline-smart-lines) - (original-lines-number (cl-count-if (lambda (s) (string-prefix-p "-" s)) lines)) - (lines (if (string= (car (last lines)) "" ) (butlast lines) lines)) - (lines (if (and (eq original-lines-number 0) smart-lines) - diff-hl-show-hunk--no-lines-removed-message - lines)) - (overlay diff-hl-show-hunk--original-overlay) - (type (overlay-get overlay 'diff-hl-hunk-type)) - (point (if (eq type 'delete) (overlay-start overlay) (overlay-end overlay))) - (propertize-line (lambda (l) - (propertize l 'face - (cond ((string-prefix-p "+" l) - 'diff-added) - ((string-prefix-p "-" l) - 'diff-removed))))) - (propertized-lines (mapcar propertize-line lines))) - - (save-excursion - ;; Save point in case the hunk is hidden, so next/previous works as expected - ;; If the hunk is delete type, then don't hide the hunk - ;; (because the hunk is located in a non deleted line) - (when (and diff-hl-show-hunk-inline-hide-hunk - (not (eq type 'delete))) - (let* ((invisible-overlay (make-overlay (overlay-start overlay) - (overlay-end overlay)))) - ;; Make new overlay, since the diff-hl overlay can be changed by diff-hl-flydiff - (overlay-put invisible-overlay 'invisible t) - ;; Change default hide popup function, to make the overlay visible - (setq diff-hl-show-hunk--hide-function - (lambda () - (overlay-put invisible-overlay 'invisible nil) - (delete-overlay invisible-overlay) - (diff-hl-show-hunk-inline-hide))))) - (diff-hl-show-hunk--goto-hunk-overlay overlay) - (let ((height - (when smart-lines - (when (not (eq 0 original-lines-number)) - original-lines-number))) - (footer "(q)Quit (p)Previous (n)Next (r)Revert (c)Copy original")) - (unless diff-hl-show-staged-changes - (setq footer (concat footer " (S)Stage"))) - (diff-hl-show-hunk-inline-show - propertized-lines - (if (and (boundp 'diff-hl-reference-revision) diff-hl-reference-revision) - (concat "Diff with " diff-hl-reference-revision) - "Diff with HEAD") - footer - diff-hl-show-hunk-map - #'diff-hl-show-hunk-hide - point - height)) - ))) - (defun diff-hl-show-hunk-copy-original-text () "Extracts all the lines from BUFFER starting with '-' to the kill ring." (interactive) From 7c57e8c740a9063c7e528a475faf39dcedc4b4ad Mon Sep 17 00:00:00 2001 From: Jimmy Yuen Ho Wong Date: Sun, 2 Nov 2025 22:03:30 +0000 Subject: [PATCH 6/6] define obsolete aliases for old diff-hl-inline-popup names --- diff-hl-show-hunk-inline.el | 38 +++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/diff-hl-show-hunk-inline.el b/diff-hl-show-hunk-inline.el index 4bb27990..ae2704d4 100644 --- a/diff-hl-show-hunk-inline.el +++ b/diff-hl-show-hunk-inline.el @@ -358,5 +358,43 @@ BUFFER is a buffer with the hunk." height)) ))) +(define-obsolete-variable-alias 'diff-hl-inline-popup--current-popup 'diff-hl-show-hunk-inline--current-popup "0.11.0") +(define-obsolete-variable-alias 'diff-hl-inline-popup--current-lines 'diff-hl-show-hunk-inline--current-lines "0.11.0") +(define-obsolete-variable-alias 'diff-hl-inline-popup--current-index 'diff-hl-show-hunk-inline--current-index "0.11.0") +(define-obsolete-variable-alias 'diff-hl-inline-popup--invoking-command 'diff-hl-show-hunk-inline--invoking-command "0.11.0") +(define-obsolete-variable-alias 'diff-hl-inline-popup--current-footer 'diff-hl-show-hunk-inline--current-footer "0.11.0") +(define-obsolete-variable-alias 'diff-hl-inline-popup--current-header 'diff-hl-show-hunk-inline--current-header "0.11.0") +(define-obsolete-variable-alias 'diff-hl-inline-popup--height 'diff-hl-show-hunk-inline--height "0.11.0") +(define-obsolete-variable-alias 'diff-hl-inline-popup--current-custom-keymap 'diff-hl-show-hunk-inline--current-custom-keymap "0.11.0") +(define-obsolete-variable-alias 'diff-hl-inline-popup--close-hook 'diff-hl-show-hunk-inline--close-hook "0.11.0") +(define-obsolete-variable-alias 'diff-hl-show-hunk-inline-popup-hide-hunk 'diff-hl-show-hunk-inline-hide-hunk "0.11.0") +(define-obsolete-variable-alias 'diff-hl-show-hunk-inline-popup-smart-lines 'diff-hl-show-hunk-inline-smart-lines "0.11.0") +(define-obsolete-variable-alias 'diff-hl-inline-popup-transient-mode-map 'diff-hl-show-hunk-inline-transient-mode-map "0.11.0") + +(define-obsolete-function-alias 'diff-hl-inline-popup--splice 'diff-hl-show-hunk-inline--splice "0.11.0") +(define-obsolete-function-alias 'diff-hl-inline-popup--ensure-enough-lines 'diff-hl-show-hunk-inline--ensure-enough-lines "0.11.0") +(define-obsolete-function-alias 'diff-hl-inline-popup--compute-content-height 'diff-hl-show-hunk-inline--compute-content-height "0.11.0") +(define-obsolete-function-alias 'diff-hl-inline-popup--compute-content-lines 'diff-hl-show-hunk-inline--compute-content-lines "0.11.0") +(define-obsolete-function-alias 'diff-hl-inline-popup--compute-header 'diff-hl-show-hunk-inline--compute-header "0.11.0") +(define-obsolete-function-alias 'diff-hl-inline-popup--compute-footer 'diff-hl-show-hunk-inline--compute-footer "0.11.0") +(define-obsolete-function-alias 'diff-hl-inline-popup--separator 'diff-hl-show-hunk-inline--separator "0.11.0") +(define-obsolete-function-alias 'diff-hl-inline-popup--available-width 'diff-hl-show-hunk-inline--available-width "0.11.0") +(define-obsolete-function-alias 'diff-hl-inline-popup--compute-popup-str 'diff-hl-show-hunk-inline--compute-popup-str "0.11.0") +(define-obsolete-function-alias 'diff-hl-inline-popup-scroll-to 'diff-hl-show-hunk-inline-scroll-to "0.11.0") +(define-obsolete-function-alias 'diff-hl-inline-popup--popup-down 'diff-hl-show-hunk-inline--popup-down "0.11.0") +(define-obsolete-function-alias 'diff-hl-inline-popup--popup-up 'diff-hl-show-hunk-inline--popup-up "0.11.0") +(define-obsolete-function-alias 'diff-hl-inline-popup--popup-pagedown 'diff-hl-show-hunk-inline--popup-pagedown "0.11.0") +(define-obsolete-function-alias 'diff-hl-inline-popup--popup-pageup 'diff-hl-show-hunk-inline--popup-pageup "0.11.0") +(define-obsolete-function-alias 'diff-hl-inline-popup--ignorable-command-p 'diff-hl-show-hunk-inline--ignorable-command-p "0.11.0") +(define-obsolete-function-alias 'diff-hl-inline-popup--post-command-hook 'diff-hl-show-hunk-inline--post-command-hook "0.11.0") +(define-obsolete-function-alias 'diff-hl-inline-popup-transient-mode 'diff-hl-show-hunk-inline-transient-mode "0.11.0") +(define-obsolete-function-alias 'diff-hl-inline-popup-hide 'diff-hl-show-hunk-inline-hide "0.11.0") +(define-obsolete-function-alias 'diff-hl-inline-popup-show 'diff-hl-show-hunk-inline-show "0.11.0") +(define-obsolete-function-alias 'diff-hl-inline-popup--hide-all 'diff-hl-show-hunk-inline--hide-all "0.11.0") + +(define-obsolete-function-alias 'diff-hl-show-hunk-inline-popup 'diff-hl-show-hunk-inline "0.11.0") + +(provide 'diff-hl-inline-popup) + (provide 'diff-hl-show-hunk-inline) ;;; diff-hl-show-hunk-inline ends here