]> code.delx.au - gnu-emacs/blobdiff - lisp/org/org-src.el
2009-09-02 Carsten Dominik <carsten.dominik@gmail.com>
[gnu-emacs] / lisp / org / org-src.el
index 4be14e859d036258cd9164fed1198bcbd4450984..b7536b211528ef0b2dd5eb18b9de33b64acefd0b 100644 (file)
@@ -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