From 0ce403d069fea2ac5d299dd1422176a5acfa4eee Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 20 Aug 2024 00:01:12 -0400 Subject: [PATCH] refactor(ligatures): set-font-ligatures!: unsetting multiple modes This changes set-font-ligature such that unsetting multiple modes will properly manipulate multi-mode entries in ligature-composition-table. --- modules/ui/ligatures/autoload/ligatures.el | 32 ++++++++++++---------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/modules/ui/ligatures/autoload/ligatures.el b/modules/ui/ligatures/autoload/ligatures.el index 26ae08892..f23317a95 100644 --- a/modules/ui/ligatures/autoload/ligatures.el +++ b/modules/ui/ligatures/autoload/ligatures.el @@ -60,22 +60,24 @@ For example, the rule for emacs-lisp-mode is very simple: This will ligate \"->\" into the arrow of choice according to your font. -Font ligatures can be unset for emacs-lisp-mode with: +All font ligatures for emacs-lisp-mode can be unset with: (set-font-ligatures! \\='emacs-lisp-mode nil) -Note that this will keep all ligatures in `+ligatures-prog-mode-list' active, as -`emacs-lisp-mode' is derived from `prog-mode'." +However, ligatures for any parent modes (like `prog-mode') will still be in +effect, as `emacs-lisp-mode' is derived from `prog-mode'." (declare (indent defun)) - ;; NOTE: Doom enforces `ligature-composition-table' to have a single mode per - ;; key in the alist. This is less efficient than what ligature.el can do - ;; (i.e. use a list of modes, or `t' as a key), but holding this invariant - ;; allows resetting with `(set-font-ligatures! 'mode nil)` to work reliably. - (if (or (null ligatures) (equal ligatures '(nil))) - (dolist (mode (ensure-list modes)) - (delq! mode ligature-composition-table 'assq)) - (let ((package? (featurep 'ligature))) - (dolist (mode (ensure-list modes)) - (if package? - (ligature-set-ligatures mode ligatures) - (setf (alist-get mode +ligatures-alist) ligatures)))))) + (after! ligature + (if (or (null ligatures) (equal ligatures '(nil))) + (dolist (table ligature-composition-table) + (let ((modes (ensure-list modes)) + (tmodes (car table))) + (cond ((and (listp tmodes) (cl-intersection modes tmodes)) + (let ((tmodes (cl-nset-difference tmodes modes))) + (setq ligature-composition-table + (if tmodes + (cons tmodes (cdr table)) + (delete table ligature-composition-table))))) + ((memq tmodes modes) + (setq ligature-composition-table (delete table ligature-composition-table)))))) + (ligature-set-ligatures modes ligatures))))