From: Adam Porter <adam@alphapapa.net>
To: emacs-devel@gnu.org
Subject: Re: [PATCH] tab-line-alternate-colors
Date: Thu, 17 Dec 2020 21:55:26 -0600 [thread overview]
Message-ID: <87y2hvlqdt.fsf@alphapapa.net> (raw)
In-Reply-To: 878s9xii5z.fsf@mail.linkov.net
[-- Attachment #1: Type: text/plain, Size: 1147 bytes --]
Juri Linkov <juri@linkov.net> writes:
>>> Thanks, everything looks right. The only thing I'm unsure about is
>>> the default value. I don't know how important is to highlight the
>>> distinction between file and non-file buffers. But it's a matter of
>>> taste, so I can't argue against or for a specific default value.
>>
>> I don't know how important it is, either. :) But I think it's very
>> helpful for distinguishing buffers, especially in the smaller text of
>> the tab-line. It seems to me that it does no harm, and it seems more
>> useful than not, so it seems that it might as well be the default.
>
> The problem is that it's not self-evident to the users why some tabs
> are displayed in italic, and other tabs are not.
You're right, but I would say that many things in Emacs aren't
self-evident but are useful. :) Of course, I'll defer to your or the
other maintainers' judgment if this seems like a bad idea.
> But if no one opposed to this change, then etc/NEWS should explain
> the difference of tab styles for the new default value.
This new patch includes such a news entry.
Thanks for your guidance with this work.
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: patch --]
[-- Type: text/x-diff, Size: 6079 bytes --]
From d92420dc655368dcac7eaa6742001bdd1b3f122c Mon Sep 17 00:00:00 2001
From: Adam Porter <adam@alphapapa.net>
Date: Sun, 13 Dec 2020 05:54:28 +0000
Subject: [PATCH] * lisp/tab-line.el: New options, faces, and functions
* lisp/tab-line.el:
(tab-line-tab-face-functions): New option.
(tab-line-tab-inactive-alternate): New face.
(tab-line-tab-special): New face.
(tab-line-tab-face-inactive-alternating): New function.
(tab-line-tab-face-special): New function.
(tab-line-format-template): Use them.
* etc/NEWS: Update.
With thanks to Juri Linkov and Eli Zaretskii for their guidance.
---
etc/NEWS | 12 +++++++++++
lisp/tab-line.el | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++------
2 files changed, 71 insertions(+), 6 deletions(-)
diff --git a/etc/NEWS b/etc/NEWS
index 909473f..2233139 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -371,6 +371,18 @@ value of 'tab-bar-show'.
If your mouse or trackpad supports it, you can now scroll tabs when
the mouse pointer is in the tab line by scrolling left or right.
+---
+*** New tab-line faces and options
+The face 'tab-line-tab-special' is used for tabs whose buffers are
+special, i.e. not file-backed. The face
+'tab-line-tab-inactive-alternate' is used to display inactive tabs
+with an alternating background color, making them easier to
+distinguish between, especially if the face 'tab-line-tab' is
+configured to not display with a box; this alternate face is only
+applied when the option 'tab-line-tab-face-functions' is
+so-configured. That option may also be used to customize tab-line
+faces in other ways.
+
** New bindings in occur-mode, 'next-error-no-select' bound to 'n' and
'previous-error-no-select' bound to 'p'.
diff --git a/lisp/tab-line.el b/lisp/tab-line.el
index 46bf89f..c944471 100644
--- a/lisp/tab-line.el
+++ b/lisp/tab-line.el
@@ -27,6 +27,7 @@
;;; Code:
+(require 'cl-lib)
(require 'seq) ; tab-line.el is not pre-loaded so it's safe to use it here
\f
@@ -35,6 +36,18 @@ tab-line
:group 'convenience
:version "27.1")
+(defcustom tab-line-tab-face-functions '(tab-line-tab-face-special)
+ "Functions called to modify tab faces.
+Each function is called with five arguments: the tab, a list of
+all tabs, the face returned by the previously called modifier,
+whether the tab is a buffer, and whether the tab is selected."
+ :type '(repeat
+ (choice (function-item tab-line-tab-face-special)
+ (function-item tab-line-tab-face-inactive-alternating)
+ (function :tag "Custom function")))
+ :group 'tab-line
+ :version "28.1")
+
(defgroup tab-line-faces '((tab-line custom-face)) ; tab-line is defined in faces.el
"Faces used in the tab line."
:group 'tab-line
@@ -63,6 +76,25 @@ tab-line-tab-inactive
:version "27.1"
:group 'tab-line-faces)
+(defface tab-line-tab-inactive-alternate
+ `((t (:inherit tab-line-tab-inactive :background "grey65")))
+ "Alternate face for inactive tab-line tabs.
+Applied to alternating tabs when option
+`tab-line-tab-face-functions' includes function
+`tab-line-tab-face-inactive-alternating'."
+ :version "28.1"
+ :group 'tab-line-faces)
+
+(defface tab-line-tab-special
+ '((default (:weight bold))
+ (((supports :slant italic))
+ (:slant italic :weight normal)))
+ "Face for special (i.e. non-file-backed) tabs.
+Applied when option `tab-line-tab-face-functions' includes
+function `tab-line-tab-face-special'."
+ :version "28.1"
+ :group 'tab-line-faces)
+
(defface tab-line-tab-current
'((default
:inherit tab-line-tab)
@@ -412,7 +444,14 @@ tab-line-format-template
(cdr (assq 'selected tab))))
(name (if buffer-p
(funcall tab-line-tab-name-function tab tabs)
- (cdr (assq 'name tab)))))
+ (cdr (assq 'name tab))))
+ (face (if selected-p
+ (if (eq (selected-window) (old-selected-window))
+ 'tab-line-tab-current
+ 'tab-line-tab)
+ 'tab-line-tab-inactive)))
+ (dolist (fn tab-line-tab-face-functions)
+ (setf face (funcall fn tab tabs face buffer-p selected-p)))
(concat
separator
(apply 'propertize
@@ -425,11 +464,7 @@ tab-line-format-template
`(
tab ,tab
,@(if selected-p '(selected t))
- face ,(if selected-p
- (if (eq (selected-window) (old-selected-window))
- 'tab-line-tab-current
- 'tab-line-tab)
- 'tab-line-tab-inactive)
+ face ,face
mouse-face tab-line-highlight)))))
tabs))
(hscroll-data (tab-line-auto-hscroll strings hscroll)))
@@ -453,6 +488,24 @@ tab-line-format-template
tab-line-new-button)
(list tab-line-new-button)))))
+(defun tab-line-tab-face-inactive-alternating (tab tabs face _buffer-p selected-p)
+ "Return FACE for TAB in TABS with alternation.
+When TAB is an inactive buffer and is even-numbered, make FACE
+inherit from `tab-line-tab-inactive-alternate'. For use in
+`tab-line-tab-face-functions'."
+ (when (and (not selected-p) (cl-evenp (cl-position tab tabs)))
+ (setf face `(:inherit (tab-line-tab-inactive-alternate ,face))))
+ face)
+
+(defun tab-line-tab-face-special (tab _tabs face buffer-p _selected-p)
+ "Return FACE for TAB according to whether it's special.
+When TAB is a non-file-backed buffer, make FACE inherit from
+`tab-line-tab-special'. For use in
+`tab-line-tab-face-functions'."
+ (when (and buffer-p (not (buffer-file-name tab)))
+ (setf face `(:inherit (tab-line-tab-special ,face))))
+ face)
+
(defvar tab-line-auto-hscroll)
(defun tab-line-format ()
--
2.7.4
next prev parent reply other threads:[~2020-12-18 3:55 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-12-13 6:04 [PATCH] tab-line-alternate-colors Adam Porter
2020-12-13 6:17 ` Adam Porter
2020-12-13 8:45 ` Juri Linkov
2020-12-13 10:06 ` Adam Porter
2020-12-13 11:13 ` Adam Porter
2020-12-13 15:21 ` Eli Zaretskii
2020-12-14 2:17 ` Adam Porter
2020-12-14 15:34 ` Eli Zaretskii
2020-12-16 2:58 ` Adam Porter
2020-12-16 15:41 ` Eli Zaretskii
2020-12-13 21:25 ` Juri Linkov
2020-12-14 4:33 ` Adam Porter
2020-12-14 9:10 ` Juri Linkov
2020-12-14 10:05 ` Adam Porter
2020-12-14 19:37 ` Juri Linkov
2020-12-16 3:24 ` Adam Porter
2020-12-16 3:55 ` Adam Porter
2020-12-16 9:03 ` Juri Linkov
2020-12-16 10:26 ` Adam Porter
2020-12-16 20:46 ` Juri Linkov
2020-12-18 3:55 ` Adam Porter [this message]
2020-12-23 21:07 ` Juri Linkov
2020-12-24 11:26 ` Adam Porter
2020-12-14 9:14 ` Adam Porter
2020-12-14 19:33 ` Juri Linkov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87y2hvlqdt.fsf@alphapapa.net \
--to=adam@alphapapa.net \
--cc=emacs-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).