From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: dick Newsgroups: gmane.emacs.bugs Subject: bug#54481: 29.0.50; [PATCH] Rewrite hl-line Date: Tue, 22 Mar 2022 10:12:44 -0400 Message-ID: <87a6di3wkj.fsf@dick> References: <877d8o8vuk.fsf@dick> <87lex2vfux.fsf@web.de> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="31426"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.14 (Gnus v5.14) Commercial/29.0.50 (gnu/linux) Cc: 54481@debbugs.gnu.org To: Michael Heerdegen Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Tue Mar 22 15:23:36 2022 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nWfQ7-00080e-P2 for geb-bug-gnu-emacs@m.gmane-mx.org; Tue, 22 Mar 2022 15:23:35 +0100 Original-Received: from localhost ([::1]:60930 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nWfQ6-0003K9-Nt for geb-bug-gnu-emacs@m.gmane-mx.org; Tue, 22 Mar 2022 10:23:34 -0400 Original-Received: from eggs.gnu.org ([209.51.188.92]:44478) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nWfMj-00081u-Mi for bug-gnu-emacs@gnu.org; Tue, 22 Mar 2022 10:20:05 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:47604) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1nWfMj-0006kl-CO for bug-gnu-emacs@gnu.org; Tue, 22 Mar 2022 10:20:05 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1nWfMj-0000Un-6G for bug-gnu-emacs@gnu.org; Tue, 22 Mar 2022 10:20:05 -0400 X-Loop: help-debbugs@gnu.org Resent-From: dick Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 22 Mar 2022 14:20:05 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 54481 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 54481-submit@debbugs.gnu.org id=B54481.16479587851770 (code B ref 54481); Tue, 22 Mar 2022 14:20:05 +0000 Original-Received: (at 54481) by debbugs.gnu.org; 22 Mar 2022 14:19:45 +0000 Original-Received: from localhost ([127.0.0.1]:41497 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nWfMO-0000SO-Kc for submit@debbugs.gnu.org; Tue, 22 Mar 2022 10:19:45 -0400 Original-Received: from mail-qt1-f176.google.com ([209.85.160.176]:35338) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1nWfFj-0006Rd-Ly for 54481@debbugs.gnu.org; Tue, 22 Mar 2022 10:12:52 -0400 Original-Received: by mail-qt1-f176.google.com with SMTP id v14so14514297qta.2 for <54481@debbugs.gnu.org>; Tue, 22 Mar 2022 07:12:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:in-reply-to:references:user-agent:date :message-id:mime-version; bh=datYeIO8fD5QI1jIuV4fo5c47e4JiKwwSrZGIBmRM4o=; b=ih7ciQQg+6O6oDaDe/vZhyANS7pGJunGEG9sJOkwS9N0YkouZ3HpqDIR1YMaxHaD/n AqATTTiVEUHoXltJ0g67TN5YH004WvIIArqdXBEB70TegaWn7hPoSGwuvxSUxJ5jtl0J J21dBiTuI+Gz5+4tky91YAsd8IdPjtYs3Wv8f74SgE9I0IX3sj99UNhsYrBqeZu5Oxvl MylOUKmF0+/IZLGSHJ1Byw2ONtD0MFgs/12E1BUUTeI8CcR1KGqkkmlbrjop2LYJRaFP bC+yw8Rz4JjEHon5++qfB1Tivf1mVzQ+4OYaej5XmjoZQ2DrosJ1BDRNZxuRtWh3YQTV Tliw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:in-reply-to:references :user-agent:date:message-id:mime-version; bh=datYeIO8fD5QI1jIuV4fo5c47e4JiKwwSrZGIBmRM4o=; b=uykWzC+n3kD6+wlPXP/A0QFBfGd+0awU45mIyaS8UthOUB8wBiKhGaN++NcTm76r1e 2KscTomkwbkIzNdqN4V+z7rZ4V+3Go/pKnWjypPQ3j+BhbPgSNGteSBTGAiz/lOYCL59 nzlK/g8BsqDR8FiRyeB4HeiThhNsc6AcUszDam8EHqVCO/JYPTD+GsHZArXW13k8u+iP cEc5EYaKHg0n0JkRPiRV41zcQNONfAF7KW7rD9ZYAFW4l1y8+tCDVasGI0VWrm640qFw Xbp8JQi1G7yZ7B4gG27rQv+HfEJpcLPOuDE/34qqNfcATF1XRTrkVPLnKAPkBU3oQ6fI C5xg== X-Gm-Message-State: AOAM533NnQGCBcTbHb1rnQggKmeOlKUXqiiZH5JJMFUbPK/DmunRZZTW HfpbLoramVIArs+QoOpenCM= X-Google-Smtp-Source: ABdhPJzEu0wWcMMaeHLnbSYkcubuq+LJsrmbN9F5dXNt3Q86Qtt5RWehjN6Vs7+o0FlmLisHENzsWQ== X-Received: by 2002:a05:622a:508:b0:2e1:deae:22bd with SMTP id l8-20020a05622a050800b002e1deae22bdmr19760163qtx.597.1647958366229; Tue, 22 Mar 2022 07:12:46 -0700 (PDT) Original-Received: from localhost (pool-96-232-253-158.nycmny.fios.verizon.net. [96.232.253.158]) by smtp.gmail.com with ESMTPSA id n131-20020a372789000000b0067bce1ac001sm9207502qkn.71.2022.03.22.07.12.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 22 Mar 2022 07:12:45 -0700 (PDT) In-Reply-To: <87lex2vfux.fsf@web.de> (Michael Heerdegen's message of "Tue, 22 Mar 2022 04:13:58 +0100") X-Mailman-Approved-At: Tue, 22 Mar 2022 10:19:41 -0400 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:228754 Archived-At: --=-=-= Content-Type: text/plain I seem to have broken hl-line-sticky-flag. Sorry about that. --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-I-broke-hl-line-sticky-flag.patch >From 27d1629000236f036988a0cbc768e71846880775 Mon Sep 17 00:00:00 2001 From: dickmao Date: Tue, 22 Mar 2022 09:58:09 -0400 Subject: [PATCH] I broke hl-line-sticky-flag Turns out `hl-line--buffer` (nee `hl-line-overlay-buffer`) wasn't cruft. It was the poor man's previous-buffer tracker, of which the rich man's version is some highly nontrivial inference from `window-prev-buffers`, the details of which I've yet to elicit. * lisp/hl-line.el (hl-line-overlay, hl-line-overlay-buffer): Correct replacement variable. (hl-line--overlay): Clearer doc. (hl-line--buffer): Nee hl-line-overlay-buffer (hl-line-sticky-flag): Custom initialization is unfathomable. (hl-line-mode, hl-line-unhighlight): Orthogonalize sticky. (hl-line-highlight): Remove highlight from previous buffer. * test/lisp/calendar/todo-mode-tests.el (todo-test-item-highlighting, todo-test-done-items-separator06-bol, todo-test-done-items-separator06-eol, todo-test-done-items-separator07): Fallout f36d929. * test/lisp/hl-line-tests.el (hl-line-sticky, hl-line-tests-verify): (hl-line-tests-sticky-across-frames, hl-line-tests-sticky): Test. --- lisp/hl-line.el | 33 +++++--- test/lisp/calendar/todo-mode-tests.el | 10 +-- test/lisp/hl-line-tests.el | 108 ++++++++++++++++++++------ 3 files changed, 113 insertions(+), 38 deletions(-) diff --git a/lisp/hl-line.el b/lisp/hl-line.el index 70ba0fcfc28..3faa2946115 100644 --- a/lisp/hl-line.el +++ b/lisp/hl-line.el @@ -24,17 +24,27 @@ ;;; Commentary: +;; Proper scuttling of unsticky overlays relies on `post-command-hook` +;; being called on a buffer switch and the stationarity of +;; `hl-line--buffer` across switches. One could easily imagine +;; programatically defeating unsticky overlays by bypassing +;; `post-command-hook`. + ;;; Code: -(make-obsolete-variable 'hl-line-overlay nil "29.1") +(make-obsolete-variable 'hl-line-overlay 'hl-line--overlay "29.1") (make-obsolete-variable 'global-hl-line-overlay nil "29.1") (make-obsolete-variable 'global-hl-line-overlays nil "29.1") (make-obsolete-variable 'global-hl-line-sticky-flag nil "29.1") -(make-obsolete-variable 'hl-line-overlay-buffer nil "29.1") +(make-obsolete-variable 'hl-line-overlay-buffer 'hl-line--buffer "29.1") (make-obsolete-variable 'hl-line-range-function nil "29.1") (defvar-local hl-line--overlay nil - "Keep state else scan entire buffer in `post-command-hook'.") + "The prevailing highlighting overlay per buffer.") + +(defvar hl-line--buffer nil + "Track last buffer in lieu of nontrivial inference from +`window-prev-buffers`.") ;; 1. define-minor-mode creates buffer-local hl-line--overlay ;; 2. overlay wiped by kill-all-local-variables @@ -68,6 +78,7 @@ hl-line-sticky-flag :type 'boolean :version "22.1" :group 'hl-line + :initialize #'custom-initialize-default :set (lambda (symbol value) (set-default symbol value) (unless value @@ -100,14 +111,12 @@ hl-line-mode (add-hook 'post-command-hook #'hl-line-highlight nil t)) (remove-hook 'post-command-hook #'hl-line-highlight t) (remove-hook 'change-major-mode-hook #'hl-line-unhighlight t) - (let (hl-line-sticky-flag) - (hl-line-unhighlight)))) + (hl-line-unhighlight))) (defun hl-line-unhighlight () - (unless hl-line-sticky-flag - (when hl-line--overlay - (delete-overlay hl-line--overlay) - (setq hl-line--overlay nil)))) + (when hl-line--overlay + (delete-overlay hl-line--overlay) + (setq hl-line--overlay nil))) (defun hl-line-highlight () (unless (minibufferp) @@ -120,6 +129,12 @@ hl-line-highlight (move-overlay hl-line--overlay (line-beginning-position) (line-beginning-position 2)) + (when (and (not (eq hl-line--buffer (current-buffer))) + (not hl-line-sticky-flag) + (buffer-live-p hl-line--buffer)) + (with-current-buffer hl-line--buffer + (hl-line-unhighlight))) + (setq hl-line--buffer (current-buffer)) (run-hooks 'hl-line-highlight-hook))) (defun hl-line-turn-on () diff --git a/test/lisp/calendar/todo-mode-tests.el b/test/lisp/calendar/todo-mode-tests.el index 8715a32b883..0102b62c10f 100644 --- a/test/lisp/calendar/todo-mode-tests.el +++ b/test/lisp/calendar/todo-mode-tests.el @@ -130,8 +130,8 @@ todo-test-item-highlighting (todo-toggle-item-highlighting) (let ((end (1- (todo-item-end))) (beg (todo-item-start))) - (should (eq (get-char-property beg 'face) 'hl-line-face)) - (should (eq (get-char-property end 'face) 'hl-line-face)) + (should (eq (get-char-property beg 'face) 'hl-line)) + (should (eq (get-char-property end 'face) 'hl-line)) (should (> (count-lines beg end) 1)) (should (eq (next-single-char-property-change beg 'face) (1+ end)))) (todo-toggle-item-highlighting))) ; Turn off highlighting (for test rerun). @@ -736,7 +736,7 @@ todo-test-done-items-separator06-bol (todo-test--done-items-separator) (call-interactively #'todo-toggle-item-highlighting) (ert-simulate-command '(todo-previous-item)) - (should (eq 'hl-line-face (get-char-property (point) 'face))))) + (should (eq 'hl-line (get-char-property (point) 'face))))) (ert-deftest todo-test-done-items-separator06-eol () ; bug#32343 "Test enabling item highlighting at EOL of done items separator. @@ -746,7 +746,7 @@ todo-test-done-items-separator06-eol (todo-toggle-item-highlighting) (forward-line -1) (ert-simulate-command '(todo-previous-item)) - (should (eq 'hl-line-face (get-char-property (point) 'face))))) + (should (eq 'hl-line (get-char-property (point) 'face))))) (ert-deftest todo-test-done-items-separator07 () ; bug#32343 "Test item highlighting when crossing done items separator. @@ -758,7 +758,7 @@ todo-test-done-items-separator07 (todo-next-item) ; Now on empty line above separator. (forward-line) ; Now on separator. (ert-simulate-command '(forward-line)) ; Now on first done item. - (should (eq 'hl-line-face (get-char-property (point) 'face))))) + (should (eq 'hl-line (get-char-property (point) 'face))))) (ert-deftest todo-test-current-file-in-edit-mode () ; bug#32437 "Test the value of todo-current-todo-file in todo-edit-mode." diff --git a/test/lisp/hl-line-tests.el b/test/lisp/hl-line-tests.el index 422d4ddae7d..6bff09135b2 100644 --- a/test/lisp/hl-line-tests.el +++ b/test/lisp/hl-line-tests.el @@ -21,30 +21,90 @@ (require 'ert) (require 'hl-line) -(ert-deftest hl-line-sticky () - (should hl-line-sticky-flag) - (with-temp-buffer - (let ((from-buffer (current-buffer))) - (hl-line-mode 1) - (save-excursion - (insert "foo")) - (hl-line-highlight) - (should (cl-some (apply-partially #'eq hl-line--overlay) - (overlays-at (point)))) - (switch-to-buffer (get-buffer-create "*scratch*")) - (hl-line-mode 1) - (save-excursion - (insert "bar")) - (hl-line-highlight) - (should (cl-some (apply-partially #'eq hl-line--overlay) - (overlays-at (point)))) - (should (buffer-local-value 'hl-line--overlay from-buffer)) - (should-not (eq (buffer-local-value 'hl-line--overlay from-buffer) - hl-line--overlay)) - (customize-set-variable 'hl-line-sticky-flag nil) - (should hl-line--overlay) - (should (buffer-live-p from-buffer)) - (should-not (buffer-local-value 'hl-line--overlay from-buffer))))) +(defsubst hl-line-tests-verify (_label on-p) + (eq on-p (cl-some (apply-partially #'eq hl-line--overlay) + (overlays-at (point))))) + +(ert-deftest hl-line-tests-sticky-across-frames () + (skip-unless (display-graphic-p)) + (customize-set-variable 'hl-line-sticky-flag t) + (call-interactively #'global-hl-line-mode) + (let ((first-frame (selected-frame)) + (first-buffer "foo") + (second-buffer "bar") + second-frame) + (unwind-protect + (progn + (switch-to-buffer first-buffer) + (save-excursion + (insert (buffer-name))) + (run-hooks 'post-command-hook) + (should (hl-line-tests-verify 111 t)) + (select-frame (setq second-frame (make-frame))) + (switch-to-buffer second-buffer) + (save-excursion + (insert (buffer-name))) + (run-hooks 'post-command-hook) + (should (hl-line-tests-verify 762 t)) + (with-current-buffer first-buffer + (should (hl-line-tests-verify 534 t))) + (call-interactively #'global-hl-line-mode) + (should (hl-line-tests-verify 125 nil)) + (with-current-buffer first-buffer + (should (hl-line-tests-verify 892 nil))) + + ;; now do unsticky + (customize-set-variable 'hl-line-sticky-flag nil) + (call-interactively #'global-hl-line-mode) + (run-hooks 'post-command-hook) + (should (hl-line-tests-verify 467 t)) + (with-current-buffer first-buffer + (should (hl-line-tests-verify 765 nil))) + (select-frame first-frame) + (should (equal (buffer-name) first-buffer)) + (run-hooks 'post-command-hook) + (should (hl-line-tests-verify 423 t)) + (with-current-buffer second-buffer + (should (hl-line-tests-verify 897 nil)))) + (let (kill-buffer-query-functions) + (ignore-errors (kill-buffer first-buffer)) + (ignore-errors (kill-buffer second-buffer)) + (ignore-errors (delete-frame second-frame)))))) + +(ert-deftest hl-line-tests-sticky () + (customize-set-variable 'hl-line-sticky-flag t) + (let ((first-buffer "foo") + (second-buffer "bar")) + (unwind-protect + (progn + (switch-to-buffer first-buffer) + (hl-line-mode 1) + (save-excursion + (insert (buffer-name))) + (run-hooks 'post-command-hook) + (should (hl-line-tests-verify 123 t)) + (switch-to-buffer second-buffer) + (hl-line-mode 1) + (save-excursion + (insert (buffer-name))) + (run-hooks 'post-command-hook) + (should (hl-line-tests-verify 56 t)) + (with-current-buffer first-buffer + (should (hl-line-tests-verify 67 t))) + + ;; now do unsticky + (customize-set-variable 'hl-line-sticky-flag nil) + (should (hl-line-tests-verify 234 t)) + (with-current-buffer first-buffer + (should (hl-line-tests-verify 231 nil))) + (switch-to-buffer first-buffer) + (run-hooks 'post-command-hook) + (should (hl-line-tests-verify 257 t)) + (with-current-buffer second-buffer + (should (hl-line-tests-verify 999 nil))))) + (let (kill-buffer-query-functions) + (ignore-errors (kill-buffer first-buffer)) + (ignore-errors (kill-buffer second-buffer))))) (provide 'hl-line-tests) -- 2.26.2 --=-=-=--