summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Goaziou <n.goaziou@gmail.com>2013-02-10 00:07:48 +0100
committerNicolas Goaziou <n.goaziou@gmail.com>2013-02-16 22:19:37 +0100
commit5f095f59099e77eda5cf7cae64119f9f246c4c70 (patch)
tree7d145f5638a7f23f0ceab73ae74854b178d49704
parent3f95d811c231e6b991928ff12baa605706ac8716 (diff)
downloadorg-mode-5f095f59099e77eda5cf7cae64119f9f246c4c70.tar.gz
Fontify latex, entities and sub/superscript again
* lisp/org-faces.el (org-latex-and-related): Renamed from `org-latex-and-export-specials', which wasn't appropriate anymore. * lisp/org.el (org-highlight-latex-and-related, org-latex-and-related-regexp): New variables. (org-compute-latex-and-related-regexp, org-do-latex-and-related): New function, revived from a previous commit. (org-set-regexps-and-options, org-set-font-lock-defaults): Use new functions.
-rw-r--r--lisp/org-faces.el4
-rw-r--r--lisp/org.el64
2 files changed, 66 insertions, 2 deletions
diff --git a/lisp/org-faces.el b/lisp/org-faces.el
index de5a08c..30784ce 100644
--- a/lisp/org-faces.el
+++ b/lisp/org-faces.el
@@ -765,7 +765,7 @@ level org-n-level-faces"
:version "24.1"
:type 'boolean)
-(defface org-latex-and-export-specials
+(defface org-latex-and-related
(let ((font (cond ((assq :inherit custom-face-attributes)
'(:inherit underline))
(t '(:underline t)))))
@@ -778,7 +778,7 @@ level org-n-level-faces"
(((class color) (background dark))
(:foreground "burlywood"))
(t (,@font))))
- "Face used to highlight math latex and other special exporter stuff."
+ "Face used to highlight LaTeX data, entities and sub/superscript."
:group 'org-faces)
(org-copy-face 'mode-line 'org-mode-line-clock
diff --git a/lisp/org.el b/lisp/org.el
index 4c17368..ac702d4 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -3901,6 +3901,21 @@ org-level-* faces."
:group 'org-appearance
:type 'boolean)
+(defcustom org-highlight-latex-and-related nil
+ "Non-nil means highlight LaTeX related syntax in the buffer.
+When non nil, the value should be a list containing any of the
+following symbols:
+ `latex' Highlight LaTeX snippets and environments.
+ `script' Highlight subscript and superscript.
+ `entities' Highlight entities."
+ :group 'org-appearance
+ :type '(choice
+ (const :tag "No highlighting" nil)
+ (set :greedy t :tag "Highlight"
+ (const :tag "LaTeX snippets and environments" latex)
+ (const :tag "Subscript and superscript" script)
+ (const :tag "Entities" entities))))
+
(defcustom org-hide-emphasis-markers nil
"Non-nil mean font-lock should hide the emphasis marker characters."
:group 'org-appearance
@@ -4990,6 +5005,7 @@ but the stars and the body are.")
(mapcar (lambda (w) (substring w 0 -1))
(list org-scheduled-string org-deadline-string
org-clock-string org-closed-string)))
+ (org-compute-latex-and-related-regexp)
(org-set-font-lock-defaults))))
(defun org-file-contents (file &optional noerror)
@@ -5848,9 +5864,56 @@ by a #."
(goto-char e)
t)))
+(defvar org-latex-and-related-regexp nil
+ "Regular expression for highlighting LaTeX, entities and sub/superscript.")
(defvar org-match-substring-regexp)
(defvar org-match-substring-with-braces-regexp)
+(defun org-compute-latex-and-related-regexp ()
+ "Compute regular expression for LaTeX, entities and sub/superscript.
+Result depends on variable `org-highlight-latex-and-related'."
+ (org-set-local
+ 'org-latex-and-related-regexp
+ (let* ((re-sub
+ (cond ((not (memq 'script org-highlight-latex-and-related)) nil)
+ ((eq org-use-sub-superscripts '{})
+ (list org-match-substring-with-braces-regexp))
+ (org-use-sub-superscripts (list org-match-substring-regexp))))
+ (re-latex
+ (when (memq 'latex org-highlight-latex-and-related)
+ (let ((matchers (plist-get org-format-latex-options :matchers)))
+ (delq nil
+ (mapcar (lambda (x)
+ (and (member (car x) matchers) (nth 1 x)))
+ org-latex-regexps)))))
+ (re-entities
+ (when (memq 'entities org-highlight-latex-and-related)
+ (list "\\\\\\(there4\\|sup[123]\\|frac[13][24]\\|[a-zA-Z]+\\)\\($\\|{}\\|[^[:alpha:]]\\)"))))
+ (mapconcat 'identity (append re-latex re-entities re-sub) "\\|"))))
+
+(defun org-do-latex-and-related (limit)
+ "Highlight LaTeX snippets and environments, entities and sub/superscript.
+LIMIT bounds the search for syntax to highlight. Stop at first
+highlighted object, if any. Return t if some highlighting was
+done, nil otherwise."
+ (when org-highlight-latex-and-related
+ (catch 'found
+ (while (re-search-forward org-latex-and-related-regexp limit t)
+ (unless (memq (car-safe (get-text-property (1+ (match-beginning 0))
+ 'face))
+ '(org-code org-verbatim underline))
+ (let ((offset (if (memq (char-after (1+ (match-beginning 0)))
+ '(?_ ?^))
+ 1
+ 0)))
+ (font-lock-prepend-text-property
+ (+ offset (match-beginning 0)) (match-end 0)
+ 'face 'org-latex-and-related)
+ (add-text-properties (+ offset (match-beginning 0)) (match-end 0)
+ '(font-lock-multiline t)))
+ (throw 'found t)))
+ nil)))
+
(defun org-restart-font-lock ()
"Restart `font-lock-mode', to force refontification."
(when (and (boundp 'font-lock-mode) font-lock-mode)
@@ -6011,6 +6074,7 @@ needs to be inserted at a specific position in the font-lock sequence.")
"\\(.*:" org-archive-tag ":.*\\)")
'(1 'org-archived prepend))
;; Specials
+ '(org-do-latex-and-related)
'(org-fontify-entities)
'(org-raise-scripts)
;; Code