From f9354f99d1d27212659cbee0420b35e883373a5d Mon Sep 17 00:00:00 2001 From: Gregory Heytings Date: Wed, 3 Nov 2021 19:22:07 +0000 Subject: [PATCH] Make bidi reordering characters visible * lisp/progmodes/prog-mode.el (bidi-reordering-characters-visible, bidi-reordering-characters-fontify, bidi-reordering-characters-toggle-visibility): New functions. --- lisp/progmodes/prog-mode.el | 41 ++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/lisp/progmodes/prog-mode.el b/lisp/progmodes/prog-mode.el index db350a5f70..7fcdc7b5e3 100644 --- a/lisp/progmodes/prog-mode.el +++ b/lisp/progmodes/prog-mode.el @@ -293,6 +293,44 @@ turn-on-prettify-symbols-mode (define-globalized-minor-mode global-prettify-symbols-mode prettify-symbols-mode turn-on-prettify-symbols-mode) +(defvar-local bidi-reordering-characters-visible nil + "Internal variable used by `bidi-reordering-characters-visible'.") + +(defun bidi-reordering-characters-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 () + "Display bidi reordering characters as arrows." + (setq buffer-display-table (or buffer-display-table + standard-display-table + (make-display-table))) + (bidi-reordering-character-toggle-visibility) + (add-hook 'font-lock-mode-hook #'bidi-reordering-characters-fontify)) + +;;;###autoload +(defun bidi-reordering-character-toggle-visibility () + "Toggle the visibility of bidi reordering characters." + (interactive) + (setq bidi-reordering-characters-visible + (not bidi-reordering-characters-visible)) + (let ((v bidi-reordering-characters-visible)) + (aset buffer-display-table ?\N{LEFT-TO-RIGHT EMBEDDING} (if v [?→] nil)) + (aset buffer-display-table ?\N{RIGHT-TO-LEFT EMBEDDING} (if v [?←] nil)) + (aset buffer-display-table ?\N{LEFT-TO-RIGHT OVERRIDE} (if v [?→] nil)) + (aset buffer-display-table ?\N{RIGHT-TO-LEFT OVERRIDE} (if v [?←] nil)) + (aset buffer-display-table ?\N{LEFT-TO-RIGHT ISOLATE} (if v [?→] nil)) + (aset buffer-display-table ?\N{RIGHT-TO-LEFT ISOLATE} (if v [?←] nil)) + (aset buffer-display-table ?\N{FIRST STRONG ISOLATE} (if v [?↓] nil)) + (aset buffer-display-table ?\N{POP DIRECTIONAL FORMATTING} (if v [?↑] nil)) + (aset buffer-display-table ?\N{POP DIRECTIONAL ISOLATE} (if v [?↑] nil)))) + ;;;###autoload (define-derived-mode prog-mode fundamental-mode "Prog" "Major mode for editing programming language source code." @@ -300,7 +338,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