فهرست منبع

Extend org-edit-special to editing LaTeX fragments

* lisp/org-src.el (org-src--contents-area): Handle `latex-fragment'.
(org-edit-latex-fragment): New function.
* lisp/org.el (org-edit-special): Use new function.
TEC 5 سال پیش
والد
کامیت
f5c47d857c
3فایلهای تغییر یافته به همراه54 افزوده شده و 0 حذف شده
  1. 7 0
      etc/ORG-NEWS
  2. 46 0
      lisp/org-src.el
  3. 1 0
      lisp/org.el

+ 7 - 0
etc/ORG-NEWS

@@ -459,6 +459,13 @@ By default, Haskell blocks are interpreted. By adding =:compile yes=
 to a Haskell source block, it will be compiled, executed and the
 results will be displayed.
 
+*** Support for ~org-edit-special~ with LaTeX fragments.
+
+Calling ~org-edit-special~ on an inline LaTeX fragment calls a new
+function, ~org-edit-latex-fragment~. This functions in a comparable
+manner to editing inline source blocks, bringing up a minibuffer set
+to LaTeX mode. The math-mode deliminators are read only.
+
 * Version 9.3
 
 ** Incompatible changes

+ 46 - 0
lisp/org-src.el

@@ -363,6 +363,12 @@ where BEG and END are buffer positions and CONTENTS is a string."
 	     (end (progn (goto-char (org-element-property :end datum))
 			 (search-backward "}" (line-beginning-position) t))))
 	 (list beg end (buffer-substring-no-properties beg end))))
+      ((eq type 'latex-fragment)
+       (let ((beg (org-element-property :begin datum))
+	     (end (org-with-point-at (org-element-property :end datum)
+		    (skip-chars-backward " \t")
+		    (point))))
+	 (list beg end (buffer-substring-no-properties beg end))))
       ((org-element-property :contents-begin datum)
        (let ((beg (org-element-property :contents-begin datum))
 	     (end (org-element-property :contents-end datum)))
@@ -959,6 +965,46 @@ Throw an error when not at such a table."
     (table-recognize)
     t))
 
+(defun org-edit-latex-fragment ()
+  "Edit LaTeX fragment at point."
+  (interactive)
+  (let ((context (org-element-context)))
+    (unless (and (eq 'latex-fragment (org-element-type context))
+		 (org-src--on-datum-p context))
+      (user-error "Not on a LaTeX fragment"))
+    (let* ((contents
+	    (buffer-substring-no-properties
+	     (org-element-property :begin context)
+	     (- (org-element-property :end context)
+		(org-element-property :post-blank context))))
+	   (delim-length (if (string-match "\\`\\$[^$]" contents)) 1 2))
+      ;; Make the LaTeX deliminators read-only.
+      (add-text-properties 0 delim-length
+			   (list 'read-only "Cannot edit LaTeX deliminator"
+				 'front-sticky t
+				 'rear-nonsticky t)
+			   contents)
+      (let ((l (length contents)))
+	(add-text-properties (- l delim-length) l
+			     (list 'read-only "Cannot edit LaTeX deliminator"
+				   'front-sticky nil
+				   'rear-nonsticky nil)
+			     contents))
+      (org-src--edit-element
+       context
+       (org-src--construct-edit-buffer-name (buffer-name) "LaTeX fragment")
+       (org-src-get-lang-mode "latex")
+       (lambda ()
+	 ;; Blank lines break things, replace with a single newline.
+	 (while (re-search-forward "\n[ \t]*\n" nil t) (replace-match "\n"))
+	 ;; If within a table a newline would disrupt the structure,
+	 ;; so remove newlines.
+	 (goto-char (point-min))
+	 (when (org-element-lineage context '(table-cell))
+	   (while (search-forward "\n" nil t) (replace-match " "))))
+       contents))
+    t))
+
 (defun org-edit-latex-environment ()
   "Edit LaTeX environment at point.
 \\<org-src-mode-map>

+ 1 - 0
lisp/org.el

@@ -17347,6 +17347,7 @@ Otherwise, return a user error."
 	 (pcase (org-element-type context)
 	   (`footnote-reference (org-edit-footnote-reference))
 	   (`inline-src-block (org-edit-inline-src-code))
+	   (`latex-fragment (org-edit-latex-fragment))
 	   (`timestamp (if (eq 'inactive (org-element-property :type context))
 			   (call-interactively #'org-time-stamp-inactive)
 			 (call-interactively #'org-time-stamp)))