summaryrefslogtreecommitdiff
path: root/lisp/org/org-src.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/org/org-src.el')
-rw-r--r--lisp/org/org-src.el62
1 files changed, 47 insertions, 15 deletions
diff --git a/lisp/org/org-src.el b/lisp/org/org-src.el
index 4be14e859d0..b7536b21152 100644
--- a/lisp/org/org-src.el
+++ b/lisp/org/org-src.el
@@ -7,7 +7,7 @@
;; Bastien Guerry <bzg AT altern DOT org>
;; Keywords: outlines, hypermedia, calendar, wp
;; Homepage: http://orgmode.org
-;; Version: 6.29c
+;; Version: 6.30c
;;
;; This file is part of GNU Emacs.
;;
@@ -109,11 +109,25 @@ You may want to use this hook for example to turn off `outline-minor-mode'
or similar things which you want to have when editing a source code file,
but which mess up the display of a snippet in Org exported files.")
+(defcustom org-src-lang-modes
+ '(("ocaml" . tuareg) ("elisp" . emacs-lisp) ("ditaa" . artist))
+ "Alist mapping languages to their major mode.
+The key is the language name, the value is the string that should
+be inserted as the name of the major mode. For many languages this is
+simple, but for language where this is not the case, this variable
+provides a way to simplify things on the user side.
+For example, there is no ocaml-mode in Emacs, but the mode to use is
+`tuareg-mode'."
+ :group 'org-edit-structure
+ :type '(repeat
+ (cons
+ (string "Language name")
+ (symbol "Major mode"))))
+
;;; Editing source examples
(defvar org-src-mode-map (make-sparse-keymap))
(define-key org-src-mode-map "\C-c'" 'org-edit-src-exit)
-(define-key org-src-mode-map "\C-x\C-s" 'org-edit-src-save)
(defvar org-edit-src-force-single-line nil)
(defvar org-edit-src-from-org-mode nil)
(defvar org-edit-src-picture nil)
@@ -151,7 +165,9 @@ the edited version."
(setq beg (move-marker beg (nth 0 info))
end (move-marker end (nth 1 info))
code (buffer-substring-no-properties beg end)
- lang (nth 2 info)
+ lang (or (cdr (assoc (nth 2 info) org-src-lang-modes))
+ (nth 2 info))
+ lang (if (symbolp lang) (symbol-name lang) lang)
single (nth 3 info)
lfmt (nth 4 info)
nindent (nth 5 info)
@@ -159,7 +175,7 @@ the edited version."
begline (save-excursion (goto-char beg) (org-current-line)))
(unless (functionp lang-f)
(error "No such language mode: %s" lang-f))
- (goto-line line)
+ (org-goto-line line)
(if (and (setq buffer (org-edit-src-find-buffer beg end))
(y-or-n-p "Return to existing edit buffer? [n] will revert changes: "))
(switch-to-buffer buffer)
@@ -168,7 +184,8 @@ the edited version."
(if (boundp 'org-edit-src-overlay)
(org-delete-overlay org-edit-src-overlay)))
(kill-buffer buffer))
- (setq buffer (generate-new-buffer "*Org Edit Src Example*"))
+ (setq buffer (generate-new-buffer
+ (concat "*Org Src " (file-name-nondirectory buffer-file-name) "[" lang "]*")))
(setq ovl (org-make-overlay beg end))
(org-overlay-put ovl 'face 'secondary-selection)
(org-overlay-put ovl 'edit-buffer buffer)
@@ -186,8 +203,7 @@ the edited version."
'(display nil invisible nil intangible nil))
(org-do-remove-indentation)
(let ((org-inhibit-startup t))
- (funcall lang-f)
- (org-src-mode))
+ (funcall lang-f))
(set (make-local-variable 'org-edit-src-force-single-line) single)
(set (make-local-variable 'org-edit-src-from-org-mode) org-mode-p)
(when lfmt
@@ -196,11 +212,13 @@ the edited version."
(goto-char (point-min))
(while (re-search-forward "^," nil t)
(replace-match "")))
- (goto-line (1+ (- line begline)))
+ (org-goto-line (1+ (- line begline)))
(org-set-local 'org-edit-src-beg-marker beg)
(org-set-local 'org-edit-src-end-marker end)
(org-set-local 'org-edit-src-overlay ovl)
(org-set-local 'org-edit-src-nindent nindent)
+ (org-src-mode)
+ (set-buffer-modified-p nil)
(and org-edit-src-persistent-message
(org-set-local 'header-line-format msg)))
(message "%s" msg)
@@ -258,7 +276,7 @@ the fragment in the Org-mode buffer."
(if (re-search-forward "^[ \t]*[^: \t]" nil 'move)
(setq end1 (1- (match-beginning 0)))
(setq end1 (point))))
- (goto-line line))
+ (org-goto-line line))
(setq beg (move-marker beg beg1)
end (move-marker end end1)
code (buffer-substring-no-properties beg end)
@@ -299,12 +317,13 @@ the fragment in the Org-mode buffer."
(goto-char (point-min))
(while (re-search-forward "^[ \t]*: ?" nil t)
(replace-match ""))
- (goto-line (1+ (- line begline)))
- (org-src-mode)
+ (org-goto-line (1+ (- line begline)))
(org-set-local 'org-edit-src-beg-marker beg)
(org-set-local 'org-edit-src-end-marker end)
(org-set-local 'org-edit-src-overlay ovl)
(org-set-local 'org-edit-src-nindent nindent)
+ (org-src-mode)
+ (set-buffer-modified-p nil)
(and org-edit-src-persistent-message
(org-set-local 'header-line-format msg)))
(message "%s" msg)
@@ -400,8 +419,8 @@ the language, a switch telling of the content should be in a single line."
(defun org-edit-src-exit ()
"Exit special edit and protect problematic lines."
(interactive)
- (unless (string-match "\\`*Org Edit " (buffer-name (current-buffer)))
- (error "This is not an sub-editing buffer, something is wrong..."))
+ (unless org-edit-src-from-org-mode
+ (error "This is not a sub-editing buffer, something is wrong..."))
(let ((beg org-edit-src-beg-marker)
(end org-edit-src-end-marker)
(ovl org-edit-src-overlay)
@@ -441,14 +460,14 @@ the language, a switch telling of the content should be in a single line."
(while (re-search-forward "^" nil t)
(replace-match nindent)))
(setq code (buffer-string))
+ (set-buffer-modified-p nil)
(switch-to-buffer (marker-buffer beg))
(kill-buffer buffer)
(goto-char beg)
- (org-delete-overlay ovl)
(delete-region beg end)
(insert code)
(goto-char beg)
- (goto-line (1- (+ (org-current-line) line)))
+ (org-goto-line (1- (+ (org-current-line) line)))
(move-marker beg nil)
(move-marker end nil)))
@@ -464,6 +483,19 @@ the language, a switch telling of the content should be in a single line."
(goto-char (min p (point-max)))
(message (or msg ""))))
+(defun org-src-mode-configure-edit-buffer ()
+ (when org-edit-src-from-org-mode
+ (setq buffer-offer-save t)
+ (setq buffer-file-name
+ (concat (buffer-file-name (marker-buffer org-edit-src-beg-marker))
+ "[" (buffer-name) "]"))
+ (set (if (featurep 'xemacs) 'write-contents-hooks 'write-contents-functions)
+ '(org-edit-src-save))
+ (org-add-hook 'kill-buffer-hook
+ '(lambda () (org-delete-overlay org-edit-src-overlay)) nil 'local)))
+
+(org-add-hook 'org-src-mode-hook 'org-src-mode-configure-edit-buffer)
+
(provide 'org-src)
;; arch-tag: 6a1fc84f-dec7-47be-a416-64be56bea5d8