From 83e9058179405f44f95f493320121313d307d56e Mon Sep 17 00:00:00 2001 From: Philippe Vaucher Date: Sat, 2 Mar 2019 20:03:41 +0100 Subject: [PATCH] Customize tabulated-list sort indicators This allows the user to customize the sorting indicators displayed near the current column. * etc/NEWS: Mention changes * doc/lispref/modes.texi: Add documentation for 'tabulated-list-gui-sort-indicator-asc', 'tabulated-list-gui-sort-indicator-desc', 'tabulated-list-tty-sort-indicator-asc' and 'tabulated-list-tty-sort-indicator-desc'. * lisp/emacs-lisp/tabulated-list.el (tabulated-list): New group. (tabulated-list-gui-sort-indicator-asc) (tabulated-list-gui-sort-indicator-desc) (tabulated-list-tty-sort-indicator-asc) (tabulated-list-tty-sort-indicator-desc): New defcustom. (tabulated-list-glyphless-char-display): Remove. (tabulated-list-make-glyphless-char-display-table): New function. --- doc/lispref/modes.texi | 16 ++++++++ etc/NEWS | 9 +++++ lisp/emacs-lisp/tabulated-list.el | 62 ++++++++++++++++++++++++++----- 3 files changed, 77 insertions(+), 10 deletions(-) diff --git a/doc/lispref/modes.texi b/doc/lispref/modes.texi index 22592a57b0..d30bd9854e 100644 --- a/doc/lispref/modes.texi +++ b/doc/lispref/modes.texi @@ -1015,6 +1015,22 @@ list-processes}). The listing command should create or switch to a buffer, turn on the derived mode, specify the tabulated data, and finally call @code{tabulated-list-print} to populate the buffer. address@hidden tabulated-list-gui-sort-indicator-asc +Indicator for column sorted in ascending order, for GUI frames. address@hidden defopt + address@hidden tabulated-list-gui-sort-indicator-desc +Indicator for column sorted in descending order, for GUI frames. address@hidden defopt + address@hidden tabulated-list-tty-sort-indicator-asc +Indicator for column sorted in ascending order, for text-mode frames. address@hidden defopt + address@hidden tabulated-list-tty-sort-indicator-desc +Indicator for column sorted in ascending order, for text-mode frames. address@hidden defopt + @defvar tabulated-list-format This buffer-local variable specifies the format of the Tabulated List data. Its value should be a vector. Each element of the vector diff --git a/etc/NEWS b/etc/NEWS index 3e347b5318..6119acdf15 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -279,6 +279,15 @@ matches strings where the pattern appears as a subsequence. Put simply, makes "foo" complete to both "barfoo" and "frodo". Add 'flex' to 'completion-styles' or 'completion-category-overrides' to use it. ++++ +** New user options for tabulated list sort indicators. +The user can customize which sorting indicator character to display +near the current column in Tabulated Lists (see variables +'tabulated-list-gui-sort-indicator-asc', +'tabulated-list-gui-sort-indicator-desc', +'tabulated-list-tty-sort-indicator-asc' and +'tabulated-list-tty-sort-indicator-desc') + * Editing Changes in Emacs 27.1 diff --git a/lisp/emacs-lisp/tabulated-list.el b/lisp/emacs-lisp/tabulated-list.el index 12d0151d67..9021f825b2 100644 --- a/lisp/emacs-lisp/tabulated-list.el +++ b/lisp/emacs-lisp/tabulated-list.el @@ -36,10 +36,45 @@ ;;; Code: +(defgroup tabulated-list nil + "Tabulated-list customization group.") + +(defcustom tabulated-list-gui-sort-indicator-asc ?▼ + "Indicator for column sorted in ascending order, for GUI frames. See + `tabulated-list-tty-sort-indicator-asc' for indicator used on + text-mode frames." + :group 'tabulated-list + :type 'character + :version "27.1") + +(defcustom tabulated-list-gui-sort-indicator-desc ?▲ + "Indicator for column sorted in descending order, for GUI frames. See + `tabulated-list-tty-sort-indicator-desc' for indicator used on + text-mode frames." + :group 'tabulated-list + :type 'character + :version "27.1") + +(defcustom tabulated-list-tty-sort-indicator-asc ?v + "Indicator for column sorted in ascending order, for text-mode + frames. See `tabulated-list-gui-sort-indicator-asc' for indicator + used on GUI frames." + :group 'tabulated-list + :type 'character + :version "27.1") + +(defcustom tabulated-list-tty-sort-indicator-desc ?^ + "Indicator for column sorted in ascending order, for text-mode + frames. See `tabulated-list-gui-sort-indicator-asc' for indicator + used on GUI frames." + :group 'tabulated-list + :type 'character + :version "27.1") + ;; The reason `tabulated-list-format' and other variables are ;; permanent-local is to make it convenient to switch to a different ;; major mode, switch back, and have the original Tabulated List data -;; still valid. See, for example, ebuff-menu.el. +;; still valid. See, for example, ebuff-menu.el. (defvar-local tabulated-list-format nil "The format of the current Tabulated List mode buffer. @@ -174,14 +209,21 @@ If ADVANCE is non-nil, move forward by one line afterwards." map) "Local keymap for `tabulated-list-mode' sort buttons.") -(defvar tabulated-list-glyphless-char-display +(defun tabulated-list-make-glyphless-char-display-table () + "Make the `glyphless-char-display' table used in Tabulated List +buffers for text-mode frames. This table is used for displaying the +sorting indicators, see variables +`tabulated-list-tty-sort-indicator-asc' and +`tabulated-list-tty-sort-indicator-desc' for more information." (let ((table (make-char-table 'glyphless-char-display nil))) (set-char-table-parent table glyphless-char-display) - ;; Some text terminals can't display the Unicode arrows; be safe. - (aset table 9650 (cons nil "^")) - (aset table 9660 (cons nil "v")) - table) - "The `glyphless-char-display' table in Tabulated List buffers.") + (aset table + tabulated-list-gui-sort-indicator-desc + (cons nil (char-to-string tabulated-list-tty-sort-indicator-desc))) + (aset table + tabulated-list-gui-sort-indicator-asc + (cons nil (char-to-string tabulated-list-tty-sort-indicator-asc))) + table)) (defvar tabulated-list--header-string nil "Holds the header if `tabulated-list-use-header-line' is nil. @@ -231,8 +273,8 @@ Populated by `tabulated-list-init-header'.") (concat label (cond ((> (+ 2 (length label)) width) "") - ((cdr tabulated-list-sort-key) " ▲") - (t " ▼"))) + ((cdr tabulated-list-sort-key) (format " %c" tabulated-list-gui-sort-indicator-desc)) + (t (format " %c" tabulated-list-gui-sort-indicator-asc)))) 'face 'bold 'tabulated-list-column-name label button-props)) @@ -655,7 +697,7 @@ as the ewoc pretty-printer." (setq-local truncate-lines t) (setq-local buffer-undo-list t) (setq-local revert-buffer-function #'tabulated-list-revert) - (setq-local glyphless-char-display tabulated-list-glyphless-char-display) + (setq-local glyphless-char-display (tabulated-list-make-glyphless-char-display-table)) ;; Avoid messing up the entries' display just because the first ;; column of the first entry happens to begin with a R2L letter. (setq bidi-paragraph-direction 'left-to-right) -- 2.17.1