From dff39cf654213122d2a926a77f14d9357d95f2ab Mon Sep 17 00:00:00 2001 From: Gregory Heytings Date: Thu, 4 Nov 2021 08:47:26 +0000 Subject: [PATCH] Make bidi reordering characters visible * lisp/progmodes/prog-mode.el (bidi-reordering-characters-visible): New minor mode. (bidi-reordering-characters-visible--fontify, bidi-reordering-characters-visible--toggle): New helper functions. (prog-mode): Enable the new minor mode. --- lisp/progmodes/prog-mode.el | 38 ++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/lisp/progmodes/prog-mode.el b/lisp/progmodes/prog-mode.el index db350a5f70..471f64ce28 100644 --- a/lisp/progmodes/prog-mode.el +++ b/lisp/progmodes/prog-mode.el @@ -293,6 +293,41 @@ turn-on-prettify-symbols-mode (define-globalized-minor-mode global-prettify-symbols-mode prettify-symbols-mode turn-on-prettify-symbols-mode) +(defun bidi-reordering-characters-visible--fontify () + "Fontify bidi reordering characters with `font-lock-warning-face'." + (font-lock-add-keywords + nil + '(("[\N{left-to-right embedding}\N{right-to-left embedding}\ +\N{left-to-right override}\N{right-to-left override}\ +\N{left-to-right isolate}\N{right-to-left isolate}\ +\N{first strong isolate}\N{pop directional formatting}\ +\N{pop directional isolate}]" . (0 'font-lock-warning-face t))))) + +(defun bidi-reordering-characters-visible--toggle () + "Toggle the visibility of bidi reordering characters." + (let ((v bidi-reordering-characters-visible) + (bdt buffer-display-table)) + (aset bdt ?\N{left-to-right embedding} (if v [?→] nil)) + (aset bdt ?\N{right-to-left embedding} (if v [?←] nil)) + (aset bdt ?\N{left-to-right override} (if v [?→] nil)) + (aset bdt ?\N{right-to-left override} (if v [?←] nil)) + (aset bdt ?\N{left-to-right isolate} (if v [?→] nil)) + (aset bdt ?\N{right-to-left isolate} (if v [?←] nil)) + (aset bdt ?\N{first strong isolate} (if v [?↓] nil)) + (aset bdt ?\N{pop directional formatting} (if v [?↑] nil)) + (aset bdt ?\N{pop directional isolate} (if v [?↑] nil)))) + +;;;###autoload +(define-minor-mode bidi-reordering-characters-visible + "Make the bidi reordering characters visible." + :init-value nil + (setq buffer-display-table (or buffer-display-table + standard-display-table + (make-display-table))) + (bidi-reordering-characters-visible--toggle) + (add-hook 'font-lock-mode-hook + #'bidi-reordering-characters-visible--fontify)) + ;;;###autoload (define-derived-mode prog-mode fundamental-mode "Prog" "Major mode for editing programming language source code." @@ -300,7 +335,8 @@ prog-mode (setq-local parse-sexp-ignore-comments t) (add-hook 'context-menu-functions 'prog-context-menu 10 t) ;; Any programming language is always written left to right. - (setq bidi-paragraph-direction 'left-to-right)) + (setq bidi-paragraph-direction 'left-to-right) + (bidi-reordering-characters-visible)) (provide 'prog-mode) -- 2.33.0