aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--modules/text-config.el14
-rw-r--r--tests/test-text-config.el41
2 files changed, 55 insertions, 0 deletions
diff --git a/modules/text-config.el b/modules/text-config.el
index 5a946d52..14e06f3e 100644
--- a/modules/text-config.el
+++ b/modules/text-config.el
@@ -89,6 +89,20 @@ PAIR is a cons cell of (string . symbol)."
("#+end_src" . "λ")
("lambda" . "λ")))))
+(defun cj/prettify-compose-block-markers-p (start end match)
+ "Always compose the org src-block markers; defer to the default otherwise.
+`prettify-symbols-default-compose-p' uses a syntax heuristic on the
+characters around MATCH that fires inconsistently for `#+begin_src' /
+`#+end_src' across blocks in the same org buffer, an interaction with org's
+own src-block fontification: some markers compose to the lambda glyph and
+others stay literal. Force composition for the markers (matched
+case-insensitively, since the alist carries upcased variants too) and let
+everything else, such as `lambda', use the standard boundary check."
+ (or (member (downcase match) '("#+begin_src" "#+end_src"))
+ (prettify-symbols-default-compose-p start end match)))
+
+(setopt prettify-symbols-compose-predicate #'cj/prettify-compose-block-markers-p)
+
(add-hook 'prog-mode-hook #'turn-on-prettify-symbols-mode)
(add-hook 'org-mode-hook #'turn-on-prettify-symbols-mode)
diff --git a/tests/test-text-config.el b/tests/test-text-config.el
new file mode 100644
index 00000000..96935e1b
--- /dev/null
+++ b/tests/test-text-config.el
@@ -0,0 +1,41 @@
+;;; test-text-config.el --- Tests for text-config -*- lexical-binding: t; -*-
+
+;;; Commentary:
+;; Covers cj/prettify-compose-block-markers-p, the prettify-symbols compose
+;; predicate that forces org src-block markers (#+begin_src / #+end_src) to
+;; compose while deferring to the default predicate for everything else.
+
+;;; Code:
+
+(require 'ert)
+(add-to-list 'load-path (expand-file-name "modules" user-emacs-directory))
+(require 'text-config)
+
+(ert-deftest test-text-config-compose-markers-composes-begin-src ()
+ "Normal: the begin-src marker always composes.
+The bounds are arbitrary because the marker branch short-circuits before
+touching the buffer."
+ (should (cj/prettify-compose-block-markers-p 1 12 "#+begin_src")))
+
+(ert-deftest test-text-config-compose-markers-composes-end-and-upcased ()
+ "Boundary: the end marker and the upcased variants also compose."
+ (should (cj/prettify-compose-block-markers-p 1 10 "#+end_src"))
+ (should (cj/prettify-compose-block-markers-p 1 12 "#+BEGIN_SRC"))
+ (should (cj/prettify-compose-block-markers-p 1 10 "#+END_SRC")))
+
+(ert-deftest test-text-config-compose-markers-defers-for-non-markers ()
+ "Error: a non-marker match defers to the default predicate.
+The predicate must return exactly what `prettify-symbols-default-compose-p'
+returns for a symbol that is not a block marker, so `lambda' keeps the
+standard boundary check."
+ (with-temp-buffer
+ (insert "x lambda y")
+ (goto-char (point-min))
+ (re-search-forward "lambda")
+ (let ((start (match-beginning 0))
+ (end (match-end 0)))
+ (should (eq (cj/prettify-compose-block-markers-p start end "lambda")
+ (prettify-symbols-default-compose-p start end "lambda"))))))
+
+(provide 'test-text-config)
+;;; test-text-config.el ends here