2009-06-07 10:27:07 -04:00
|
|
|
;;; org-src.el --- Source code examples in Org
|
|
|
|
;;
|
2014-01-07 08:18:17 -05:00
|
|
|
;; Copyright (C) 2004-2014 Free Software Foundation, Inc.
|
2009-06-07 10:27:07 -04:00
|
|
|
;;
|
|
|
|
;; Author: Carsten Dominik <carsten at orgmode dot org>
|
2013-10-08 02:07:21 -04:00
|
|
|
;; Bastien Guerry <bzg@gnu.org>
|
2009-10-27 14:11:09 -04:00
|
|
|
;; Dan Davison <davison at stats dot ox dot ac dot uk>
|
2009-06-07 10:27:07 -04:00
|
|
|
;; Keywords: outlines, hypermedia, calendar, wp
|
|
|
|
;; Homepage: http://orgmode.org
|
|
|
|
;;
|
|
|
|
;; This file is part of GNU Emacs.
|
|
|
|
;;
|
|
|
|
;; GNU Emacs is free software: you can redistribute it and/or modify
|
|
|
|
;; it under the terms of the GNU General Public License as published by
|
|
|
|
;; the Free Software Foundation, either version 3 of the License, or
|
|
|
|
;; (at your option) any later version.
|
|
|
|
|
|
|
|
;; GNU Emacs is distributed in the hope that it will be useful,
|
|
|
|
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
;; GNU General Public License for more details.
|
|
|
|
|
|
|
|
;; You should have received a copy of the GNU General Public License
|
|
|
|
;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
;;
|
|
|
|
;;; Commentary:
|
|
|
|
|
|
|
|
;; This file contains the code dealing with source code examples in Org-mode.
|
|
|
|
|
|
|
|
;;; Code:
|
|
|
|
|
|
|
|
(require 'org-macs)
|
|
|
|
(require 'org-compat)
|
2010-08-17 17:45:47 -04:00
|
|
|
(require 'ob-keys)
|
2010-08-17 22:37:19 -04:00
|
|
|
(require 'ob-comint)
|
2009-10-29 11:34:33 -04:00
|
|
|
(eval-when-compile
|
|
|
|
(require 'cl))
|
2009-06-07 10:27:07 -04:00
|
|
|
|
2009-06-07 11:07:07 -04:00
|
|
|
(declare-function org-do-remove-indentation "org" (&optional n))
|
2010-02-26 04:08:27 -05:00
|
|
|
(declare-function org-at-table.el-p "org" ())
|
2012-12-19 19:16:01 -05:00
|
|
|
(declare-function org-in-src-block-p "org" (&optional inside))
|
2012-12-29 03:23:11 -05:00
|
|
|
(declare-function org-in-block-p "org" (names))
|
2009-06-11 16:18:47 -04:00
|
|
|
(declare-function org-get-indentation "org" (&optional line))
|
2009-10-29 11:34:33 -04:00
|
|
|
(declare-function org-switch-to-buffer-other-window "org" (&rest args))
|
2012-03-16 14:24:24 -04:00
|
|
|
(declare-function org-pop-to-buffer-same-window
|
2011-07-18 13:25:10 -04:00
|
|
|
"org-compat" (&optional buffer-or-name norecord label))
|
2012-03-20 08:04:55 -04:00
|
|
|
(declare-function org-base-buffer "org" (buffer))
|
2009-06-07 11:07:07 -04:00
|
|
|
|
2009-06-07 10:27:07 -04:00
|
|
|
(defcustom org-edit-src-region-extra nil
|
|
|
|
"Additional regexps to identify regions for editing with `org-edit-src-code'.
|
|
|
|
For examples see the function `org-edit-src-find-region-and-lang'.
|
|
|
|
The regular expression identifying the begin marker should end with a newline,
|
|
|
|
and the regexp marking the end line should start with a newline, to make sure
|
|
|
|
there are kept outside the narrowed region."
|
|
|
|
:group 'org-edit-structure
|
|
|
|
:type '(repeat
|
|
|
|
(list
|
|
|
|
(regexp :tag "begin regexp")
|
|
|
|
(regexp :tag "end regexp")
|
|
|
|
(choice :tag "language"
|
|
|
|
(string :tag "specify")
|
|
|
|
(integer :tag "from match group")
|
|
|
|
(const :tag "from `lang' element")
|
|
|
|
(const :tag "from `style' element")))))
|
|
|
|
|
2013-04-16 04:38:01 -04:00
|
|
|
(defcustom org-edit-src-turn-on-auto-save nil
|
|
|
|
"Non-nil means turn `auto-save-mode' on when editing a source block.
|
|
|
|
This will save the content of the source code editing buffer into
|
|
|
|
a newly created file, not the base buffer for this source block.
|
|
|
|
|
2013-11-17 03:12:41 -05:00
|
|
|
If you want to regularly save the base buffer instead of the source
|
2013-04-16 04:38:01 -04:00
|
|
|
code editing buffer, see `org-edit-src-auto-save-idle-delay' instead."
|
|
|
|
:group 'org-edit-structure
|
|
|
|
:version "24.4"
|
|
|
|
:package-version '(Org . "8.0")
|
|
|
|
:type 'boolean)
|
|
|
|
|
2013-03-02 09:04:43 -05:00
|
|
|
(defcustom org-edit-src-auto-save-idle-delay 0
|
2013-04-16 04:38:01 -04:00
|
|
|
"Delay before saving a source code buffer back into its base buffer.
|
2013-02-16 05:35:39 -05:00
|
|
|
When a positive integer N, save after N seconds of idle time.
|
2013-04-16 04:38:01 -04:00
|
|
|
When 0 (the default), don't auto-save.
|
|
|
|
|
|
|
|
If you want to save the source code buffer itself, don't use this.
|
|
|
|
Check `org-edit-src-turn-on-auto-save' instead."
|
2013-02-16 05:35:39 -05:00
|
|
|
:group 'org-edit-structure
|
2013-02-26 12:21:28 -05:00
|
|
|
:version "24.4"
|
|
|
|
:package-version '(Org . "8.0")
|
2013-02-16 05:35:39 -05:00
|
|
|
:type 'integer)
|
|
|
|
|
2009-06-07 10:27:07 -04:00
|
|
|
(defcustom org-coderef-label-format "(ref:%s)"
|
|
|
|
"The default coderef format.
|
|
|
|
This format string will be used to search for coderef labels in literal
|
2009-07-23 15:48:43 -04:00
|
|
|
examples (EXAMPLE and SRC blocks). The format can be overwritten in
|
2010-04-30 22:53:53 -04:00
|
|
|
an individual literal example with the -l option, like
|
2009-06-07 10:27:07 -04:00
|
|
|
|
|
|
|
#+BEGIN_SRC pascal +n -r -l \"((%s))\"
|
|
|
|
...
|
|
|
|
#+END_SRC
|
|
|
|
|
|
|
|
If you want to use this for HTML export, make sure that the format does
|
|
|
|
not introduce special font-locking, and avoid the HTML special
|
|
|
|
characters `<', `>', and `&'. The reason for this restriction is that
|
|
|
|
the labels are searched for only after htmlize has done its job."
|
|
|
|
:group 'org-edit-structure ; FIXME this is not in the right group
|
|
|
|
:type 'string)
|
|
|
|
|
|
|
|
(defcustom org-edit-fixed-width-region-mode 'artist-mode
|
|
|
|
"The mode that should be used to edit fixed-width regions.
|
|
|
|
These are the regions where each line starts with a colon."
|
|
|
|
:group 'org-edit-structure
|
|
|
|
:type '(choice
|
|
|
|
(const artist-mode)
|
|
|
|
(const picture-mode)
|
|
|
|
(const fundamental-mode)
|
|
|
|
(function :tag "Other (specify)")))
|
|
|
|
|
2009-10-07 23:49:37 -04:00
|
|
|
(defcustom org-src-preserve-indentation nil
|
2010-07-17 14:53:36 -04:00
|
|
|
"If non-nil preserve leading whitespace characters on export.
|
|
|
|
If non-nil leading whitespace characters in source code blocks
|
|
|
|
are preserved on export, and when switching between the org
|
|
|
|
buffer and the language mode edit buffer. If this variable is nil
|
|
|
|
then, after editing with \\[org-edit-src-code], the
|
2009-11-01 02:43:50 -05:00
|
|
|
minimum (across-lines) number of leading whitespace characters
|
|
|
|
are removed from all lines, and the code block is uniformly
|
|
|
|
indented according to the value of `org-edit-src-content-indentation'."
|
2009-10-07 23:49:37 -04:00
|
|
|
:group 'org-edit-structure
|
|
|
|
:type 'boolean)
|
|
|
|
|
2009-06-08 03:39:19 -04:00
|
|
|
(defcustom org-edit-src-content-indentation 2
|
2009-10-07 23:56:37 -04:00
|
|
|
"Indentation for the content of a source code block.
|
2009-06-08 03:39:19 -04:00
|
|
|
This should be the number of spaces added to the indentation of the #+begin
|
|
|
|
line in order to compute the indentation of the block content after
|
2010-07-17 14:53:36 -04:00
|
|
|
editing it with \\[org-edit-src-code]. Has no effect if
|
2009-10-07 23:49:37 -04:00
|
|
|
`org-src-preserve-indentation' is non-nil."
|
2009-06-08 03:39:19 -04:00
|
|
|
:group 'org-edit-structure
|
|
|
|
:type 'integer)
|
|
|
|
|
2010-09-21 10:02:22 -04:00
|
|
|
(defvar org-src-strip-leading-and-trailing-blank-lines nil
|
2012-07-11 12:36:22 -04:00
|
|
|
"If non-nil, blank lines are removed when exiting the code edit buffer.")
|
2010-09-21 10:02:22 -04:00
|
|
|
|
2009-06-07 10:27:07 -04:00
|
|
|
(defcustom org-edit-src-persistent-message t
|
|
|
|
"Non-nil means show persistent exit help message while editing src examples.
|
|
|
|
The message is shown in the header-line, which will be created in the
|
2011-02-01 06:42:28 -05:00
|
|
|
first line of the window showing the editing buffer."
|
2009-06-07 10:27:07 -04:00
|
|
|
:group 'org-edit-structure
|
|
|
|
:type 'boolean)
|
|
|
|
|
2009-10-27 14:11:09 -04:00
|
|
|
(defcustom org-src-window-setup 'reorganize-frame
|
|
|
|
"How the source code edit buffer should be displayed.
|
|
|
|
Possible values for this option are:
|
|
|
|
|
2009-10-27 15:36:24 -04:00
|
|
|
current-window Show edit buffer in the current window, keeping all other
|
|
|
|
windows.
|
2009-10-27 14:11:09 -04:00
|
|
|
other-window Use `switch-to-buffer-other-window' to display edit buffer.
|
|
|
|
reorganize-frame Show only two windows on the current frame, the current
|
2012-08-11 13:10:44 -04:00
|
|
|
window and the edit buffer. When exiting the edit buffer,
|
2009-10-27 15:36:24 -04:00
|
|
|
return to one window.
|
2009-10-27 14:11:09 -04:00
|
|
|
other-frame Use `switch-to-buffer-other-frame' to display edit buffer.
|
|
|
|
Also, when exiting the edit buffer, kill that frame."
|
|
|
|
:group 'org-edit-structure
|
|
|
|
:type '(choice
|
|
|
|
(const current-window)
|
|
|
|
(const other-frame)
|
|
|
|
(const other-window)
|
|
|
|
(const reorganize-frame)))
|
|
|
|
|
2009-06-08 02:52:25 -04:00
|
|
|
(defvar org-src-mode-hook nil
|
|
|
|
"Hook run after Org switched a source code snippet to its Emacs mode.
|
|
|
|
This hook will run
|
|
|
|
|
|
|
|
- when editing a source code snippet with \"C-c '\".
|
|
|
|
- When formatting a source code snippet for export with htmlize.
|
|
|
|
|
|
|
|
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.")
|
|
|
|
|
2009-08-23 13:31:47 -04:00
|
|
|
(defcustom org-src-lang-modes
|
2009-09-16 12:54:43 -04:00
|
|
|
'(("ocaml" . tuareg) ("elisp" . emacs-lisp) ("ditaa" . artist)
|
2010-10-29 21:18:28 -04:00
|
|
|
("asymptote" . asy) ("dot" . fundamental) ("sqlite" . sql)
|
2013-07-13 10:30:04 -04:00
|
|
|
("calc" . fundamental) ("C" . c) ("cpp" . c++) ("C++" . c++)
|
2012-01-20 12:26:59 -05:00
|
|
|
("screen" . shell-script))
|
2009-08-23 13:31:47 -04:00
|
|
|
"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"))))
|
|
|
|
|
2009-06-07 10:27:07 -04:00
|
|
|
;;; Editing source examples
|
|
|
|
|
2009-06-09 13:23:59 -04:00
|
|
|
(defvar org-src-mode-map (make-sparse-keymap))
|
|
|
|
(define-key org-src-mode-map "\C-c'" 'org-edit-src-exit)
|
2013-02-16 15:33:28 -05:00
|
|
|
(define-key org-src-mode-map "\C-c\C-k" 'org-edit-src-abort)
|
2012-03-19 16:38:12 -04:00
|
|
|
(define-key org-src-mode-map "\C-x\C-s" 'org-edit-src-save)
|
2010-08-17 17:45:47 -04:00
|
|
|
|
2009-06-07 10:27:07 -04:00
|
|
|
(defvar org-edit-src-force-single-line nil)
|
|
|
|
(defvar org-edit-src-from-org-mode nil)
|
2010-06-05 07:39:48 -04:00
|
|
|
(defvar org-edit-src-allow-write-back-p t)
|
2009-06-07 10:27:07 -04:00
|
|
|
(defvar org-edit-src-picture nil)
|
|
|
|
(defvar org-edit-src-beg-marker nil)
|
|
|
|
(defvar org-edit-src-end-marker nil)
|
|
|
|
(defvar org-edit-src-overlay nil)
|
2009-10-07 23:49:37 -04:00
|
|
|
(defvar org-edit-src-block-indentation nil)
|
2009-11-03 20:36:08 -05:00
|
|
|
(defvar org-edit-src-saved-temp-window-config nil)
|
2009-06-07 10:27:07 -04:00
|
|
|
|
2013-02-16 05:35:39 -05:00
|
|
|
(defcustom org-src-ask-before-returning-to-edit-buffer t
|
2009-10-14 18:43:25 -04:00
|
|
|
"If nil, when org-edit-src code is used on a block that already
|
2012-07-11 12:36:22 -04:00
|
|
|
has an active edit buffer, it will switch to that edit buffer
|
|
|
|
immediately; otherwise it will ask whether you want to return to
|
2013-02-16 05:35:39 -05:00
|
|
|
the existing edit buffer."
|
|
|
|
:group 'org-edit-structure
|
2013-02-26 12:21:28 -05:00
|
|
|
:version "24.4"
|
|
|
|
:package-version '(Org . "8.0")
|
2013-02-16 05:35:39 -05:00
|
|
|
:type 'boolean)
|
2009-10-14 18:43:25 -04:00
|
|
|
|
2010-08-17 22:37:19 -04:00
|
|
|
(defvar org-src-babel-info nil)
|
|
|
|
|
2009-06-09 13:23:59 -04:00
|
|
|
(define-minor-mode org-src-mode
|
|
|
|
"Minor mode for language major mode buffers generated by org.
|
|
|
|
This minor mode is turned on in two situations:
|
|
|
|
- when editing a source code snippet with \"C-c '\".
|
|
|
|
- When formatting a source code snippet for export with htmlize.
|
|
|
|
There is a mode hook, and keybindings for `org-edit-src-exit' and
|
|
|
|
`org-edit-src-save'")
|
2009-06-07 10:27:07 -04:00
|
|
|
|
2013-02-16 05:35:39 -05:00
|
|
|
(defvar org-edit-src-code-timer nil)
|
2011-02-01 06:42:28 -05:00
|
|
|
(defun org-edit-src-code (&optional context code edit-buffer-name)
|
2012-12-14 04:10:40 -05:00
|
|
|
"Edit the source CODE block at point.
|
|
|
|
The code is copied to a separate buffer and the appropriate mode
|
|
|
|
is turned on. When done, exit with \\[org-edit-src-exit]. This will
|
|
|
|
remove the original code in the Org buffer, and replace it with the
|
|
|
|
edited version. An optional argument CONTEXT is used by \\[org-edit-src-save]
|
|
|
|
when calling this function. See `org-src-window-setup' to configure
|
|
|
|
the display of windows containing the Org buffer and the code buffer."
|
2009-06-07 10:27:07 -04:00
|
|
|
(interactive)
|
2013-01-08 09:57:10 -05:00
|
|
|
(if (not (or (org-in-block-p '("src" "example" "latex" "html"))
|
|
|
|
(org-at-table.el-p)))
|
2012-12-23 11:54:42 -05:00
|
|
|
(user-error "Not in a source code or example block")
|
2012-12-14 04:10:40 -05:00
|
|
|
(unless (eq context 'save)
|
|
|
|
(setq org-edit-src-saved-temp-window-config (current-window-configuration)))
|
|
|
|
(let* ((mark (and (org-region-active-p) (mark)))
|
|
|
|
(case-fold-search t)
|
|
|
|
(info
|
|
|
|
;; If the src region consists in no lines, we insert a blank
|
|
|
|
;; line.
|
|
|
|
(let* ((temp (org-edit-src-find-region-and-lang))
|
|
|
|
(beg (nth 0 temp))
|
|
|
|
(end (nth 1 temp)))
|
|
|
|
(if (>= end beg) temp
|
|
|
|
(goto-char beg)
|
|
|
|
(insert "\n")
|
|
|
|
(org-edit-src-find-region-and-lang))))
|
|
|
|
(full-info (org-babel-get-src-block-info 'light))
|
|
|
|
(org-mode-p (derived-mode-p 'org-mode)) ;; derived-mode-p is reflexive
|
|
|
|
(beg (make-marker))
|
|
|
|
;; Move marker with inserted text for case when src block is
|
|
|
|
;; just one empty line, i.e. beg == end.
|
|
|
|
(end (copy-marker (make-marker) t))
|
|
|
|
(allow-write-back-p (null code))
|
|
|
|
block-nindent total-nindent ovl lang lang-f single lfmt buffer msg
|
|
|
|
begline markline markcol line col transmitted-variables)
|
2009-06-07 10:27:07 -04:00
|
|
|
(setq beg (move-marker beg (nth 0 info))
|
|
|
|
end (move-marker end (nth 1 info))
|
2010-04-22 18:16:13 -04:00
|
|
|
msg (if allow-write-back-p
|
|
|
|
(substitute-command-keys
|
2013-02-16 15:33:28 -05:00
|
|
|
"Edit, then exit with C-c ' (C-c and single quote) -- C-c C-k to abort")
|
|
|
|
"Exit with C-c ' (C-c and single quote) -- C-c C-k to abort")
|
2010-04-22 17:37:35 -04:00
|
|
|
code (or code (buffer-substring-no-properties beg end))
|
2009-08-23 13:31:47 -04:00
|
|
|
lang (or (cdr (assoc (nth 2 info) org-src-lang-modes))
|
2012-12-14 04:10:40 -05:00
|
|
|
(nth 2 info))
|
2009-08-23 13:31:47 -04:00
|
|
|
lang (if (symbolp lang) (symbol-name lang) lang)
|
2009-06-07 10:27:07 -04:00
|
|
|
single (nth 3 info)
|
2009-10-07 23:49:37 -04:00
|
|
|
block-nindent (nth 5 info)
|
2009-06-07 10:27:07 -04:00
|
|
|
lang-f (intern (concat lang "-mode"))
|
2010-12-03 13:24:38 -05:00
|
|
|
begline (save-excursion (goto-char beg) (org-current-line))
|
|
|
|
transmitted-variables
|
|
|
|
`((org-edit-src-content-indentation
|
|
|
|
,org-edit-src-content-indentation)
|
|
|
|
(org-edit-src-force-single-line ,single)
|
|
|
|
(org-edit-src-from-org-mode ,org-mode-p)
|
|
|
|
(org-edit-src-allow-write-back-p ,allow-write-back-p)
|
|
|
|
(org-src-preserve-indentation ,org-src-preserve-indentation)
|
|
|
|
(org-src-babel-info ,(org-babel-get-src-block-info 'light))
|
|
|
|
(org-coderef-label-format
|
|
|
|
,(or (nth 4 info) org-coderef-label-format))
|
|
|
|
(org-edit-src-beg-marker ,beg)
|
|
|
|
(org-edit-src-end-marker ,end)
|
|
|
|
(org-edit-src-block-indentation ,block-nindent)))
|
2010-11-19 18:31:19 -05:00
|
|
|
(if (and mark (>= mark beg) (<= mark (1+ end)))
|
|
|
|
(save-excursion (goto-char (min mark end))
|
2010-09-05 19:49:11 -04:00
|
|
|
(setq markline (org-current-line)
|
|
|
|
markcol (current-column))))
|
2010-02-26 04:08:27 -05:00
|
|
|
(if (equal lang-f 'table.el-mode)
|
|
|
|
(setq lang-f (lambda ()
|
|
|
|
(text-mode)
|
|
|
|
(if (org-bound-and-true-p flyspell-mode)
|
|
|
|
(flyspell-mode -1))
|
|
|
|
(table-recognize)
|
|
|
|
(org-set-local 'org-edit-src-content-indentation 0))))
|
2009-06-07 10:27:07 -04:00
|
|
|
(unless (functionp lang-f)
|
|
|
|
(error "No such language mode: %s" lang-f))
|
2010-09-30 05:39:49 -04:00
|
|
|
(save-excursion
|
|
|
|
(if (> (point) end) (goto-char end))
|
|
|
|
(setq line (org-current-line)
|
|
|
|
col (current-column)))
|
2009-06-07 10:27:07 -04:00
|
|
|
(if (and (setq buffer (org-edit-src-find-buffer beg end))
|
2012-09-27 17:45:34 -04:00
|
|
|
(or (eq context 'save)
|
|
|
|
(if org-src-ask-before-returning-to-edit-buffer
|
|
|
|
(y-or-n-p "Return to existing edit buffer ([n] will revert changes)? ") t)))
|
2009-10-27 14:11:09 -04:00
|
|
|
(org-src-switch-to-buffer buffer 'return)
|
2009-06-07 10:27:07 -04:00
|
|
|
(when buffer
|
|
|
|
(with-current-buffer buffer
|
|
|
|
(if (boundp 'org-edit-src-overlay)
|
2010-04-18 10:37:42 -04:00
|
|
|
(delete-overlay org-edit-src-overlay)))
|
2009-06-07 10:27:07 -04:00
|
|
|
(kill-buffer buffer))
|
2009-08-24 08:47:58 -04:00
|
|
|
(setq buffer (generate-new-buffer
|
2010-04-22 17:37:35 -04:00
|
|
|
(or edit-buffer-name
|
|
|
|
(org-src-construct-edit-buffer-name (buffer-name) lang))))
|
2010-04-18 10:37:42 -04:00
|
|
|
(setq ovl (make-overlay beg end))
|
|
|
|
(overlay-put ovl 'edit-buffer buffer)
|
|
|
|
(overlay-put ovl 'help-echo "Click with mouse-1 to switch to buffer editing this segment")
|
|
|
|
(overlay-put ovl 'face 'secondary-selection)
|
|
|
|
(overlay-put ovl
|
2010-04-22 17:37:35 -04:00
|
|
|
'keymap
|
|
|
|
(let ((map (make-sparse-keymap)))
|
|
|
|
(define-key map [mouse-1] 'org-edit-src-continue)
|
|
|
|
map))
|
2010-04-18 10:37:42 -04:00
|
|
|
(overlay-put ovl :read-only "Leave me alone")
|
2010-12-03 13:24:38 -05:00
|
|
|
(setq transmitted-variables
|
|
|
|
(append transmitted-variables `((org-edit-src-overlay ,ovl))))
|
2009-10-27 14:11:09 -04:00
|
|
|
(org-src-switch-to-buffer buffer 'edit)
|
2009-10-06 12:42:24 -04:00
|
|
|
(if (eq single 'macro-definition)
|
|
|
|
(setq code (replace-regexp-in-string "\\\\n" "\n" code t t)))
|
2009-06-07 10:27:07 -04:00
|
|
|
(insert code)
|
|
|
|
(remove-text-properties (point-min) (point-max)
|
|
|
|
'(display nil invisible nil intangible nil))
|
2010-12-03 13:24:38 -05:00
|
|
|
(unless (cadr (assq 'org-src-preserve-indentation transmitted-variables))
|
2009-10-07 23:49:37 -04:00
|
|
|
(setq total-nindent (or (org-do-remove-indentation) 0)))
|
2009-06-07 10:27:07 -04:00
|
|
|
(let ((org-inhibit-startup t))
|
2010-09-08 00:38:05 -04:00
|
|
|
(condition-case e
|
|
|
|
(funcall lang-f)
|
|
|
|
(error
|
2014-02-09 08:54:12 -05:00
|
|
|
(message "Language mode `%s' fails with: %S" lang-f (nth 1 e)))))
|
2010-12-03 13:24:38 -05:00
|
|
|
(dolist (pair transmitted-variables)
|
|
|
|
(org-set-local (car pair) (cadr pair)))
|
2012-09-30 11:20:27 -04:00
|
|
|
;; Remove protecting commas from visible part of buffer.
|
|
|
|
(org-unescape-code-in-region (point-min) (point-max))
|
2010-09-05 19:49:11 -04:00
|
|
|
(when markline
|
|
|
|
(org-goto-line (1+ (- markline begline)))
|
|
|
|
(org-move-to-column
|
2010-12-03 13:24:38 -05:00
|
|
|
(if org-src-preserve-indentation markcol
|
|
|
|
(max 0 (- markcol total-nindent))))
|
2010-09-05 19:49:11 -04:00
|
|
|
(push-mark (point) 'no-message t)
|
|
|
|
(setq deactivate-mark nil))
|
2009-08-27 04:24:09 -04:00
|
|
|
(org-goto-line (1+ (- line begline)))
|
2009-10-07 23:55:15 -04:00
|
|
|
(org-move-to-column
|
2010-12-03 13:24:38 -05:00
|
|
|
(if org-src-preserve-indentation col (max 0 (- col total-nindent))))
|
2009-08-24 08:47:58 -04:00
|
|
|
(org-src-mode)
|
|
|
|
(set-buffer-modified-p nil)
|
2013-04-07 16:43:02 -04:00
|
|
|
(setq buffer-file-name nil)
|
2013-04-16 04:38:01 -04:00
|
|
|
(when org-edit-src-turn-on-auto-save
|
2013-04-07 16:43:02 -04:00
|
|
|
(setq buffer-auto-save-file-name
|
|
|
|
(concat (make-temp-name "org-src-")
|
|
|
|
(format-time-string "-%Y-%d-%m") ".txt")))
|
2009-06-07 10:27:07 -04:00
|
|
|
(and org-edit-src-persistent-message
|
2011-04-02 13:46:08 -04:00
|
|
|
(org-set-local 'header-line-format msg))
|
|
|
|
(let ((edit-prep-func (intern (concat "org-babel-edit-prep:" lang))))
|
|
|
|
(when (fboundp edit-prep-func)
|
2013-02-16 05:35:39 -05:00
|
|
|
(funcall edit-prep-func full-info)))
|
|
|
|
(or org-edit-src-code-timer
|
|
|
|
(setq org-edit-src-code-timer
|
|
|
|
(unless (zerop org-edit-src-auto-save-idle-delay)
|
|
|
|
(run-with-idle-timer
|
|
|
|
org-edit-src-auto-save-idle-delay t
|
|
|
|
(lambda ()
|
|
|
|
(cond
|
|
|
|
((and (string-match "\*Org Src" (buffer-name))
|
|
|
|
(buffer-modified-p))
|
|
|
|
(org-edit-src-save))
|
|
|
|
((not
|
|
|
|
(delq nil (mapcar
|
|
|
|
(lambda (b)
|
|
|
|
(string-match "\*Org Src" (buffer-name b)))
|
|
|
|
(buffer-list))))
|
|
|
|
(cancel-timer org-edit-src-code-timer)
|
|
|
|
(setq org-edit-src-code-timer)))))))))
|
2013-03-02 09:04:43 -05:00
|
|
|
t)))
|
2009-06-07 10:27:07 -04:00
|
|
|
|
|
|
|
(defun org-edit-src-continue (e)
|
2012-07-11 12:36:22 -04:00
|
|
|
"Continue editing source blocks." ;; Fixme: be more accurate
|
2009-06-07 10:27:07 -04:00
|
|
|
(interactive "e")
|
|
|
|
(mouse-set-point e)
|
|
|
|
(let ((buf (get-char-property (point) 'edit-buffer)))
|
2009-10-27 14:11:09 -04:00
|
|
|
(if buf (org-src-switch-to-buffer buf 'continue)
|
2009-06-07 10:27:07 -04:00
|
|
|
(error "Something is wrong here"))))
|
|
|
|
|
2009-10-27 14:11:09 -04:00
|
|
|
(defun org-src-switch-to-buffer (buffer context)
|
|
|
|
(case org-src-window-setup
|
|
|
|
('current-window
|
2011-07-18 13:25:10 -04:00
|
|
|
(org-pop-to-buffer-same-window buffer))
|
2009-10-27 14:11:09 -04:00
|
|
|
('other-window
|
|
|
|
(switch-to-buffer-other-window buffer))
|
|
|
|
('other-frame
|
|
|
|
(case context
|
|
|
|
('exit
|
|
|
|
(let ((frame (selected-frame)))
|
|
|
|
(switch-to-buffer-other-frame buffer)
|
|
|
|
(delete-frame frame)))
|
|
|
|
('save
|
|
|
|
(kill-buffer (current-buffer))
|
2011-07-18 13:25:10 -04:00
|
|
|
(org-pop-to-buffer-same-window buffer))
|
2009-10-27 14:11:09 -04:00
|
|
|
(t
|
|
|
|
(switch-to-buffer-other-frame buffer))))
|
|
|
|
('reorganize-frame
|
|
|
|
(if (eq context 'edit) (delete-other-windows))
|
|
|
|
(org-switch-to-buffer-other-window buffer)
|
|
|
|
(if (eq context 'exit) (delete-other-windows)))
|
2010-08-17 16:46:51 -04:00
|
|
|
('switch-invisibly
|
|
|
|
(set-buffer buffer))
|
2009-10-27 14:11:09 -04:00
|
|
|
(t
|
|
|
|
(message "Invalid value %s for org-src-window-setup"
|
|
|
|
(symbol-name org-src-window-setup))
|
2011-07-18 13:25:10 -04:00
|
|
|
(org-pop-to-buffer-same-window buffer))))
|
2009-10-27 14:11:09 -04:00
|
|
|
|
2009-09-06 01:53:21 -04:00
|
|
|
(defun org-src-construct-edit-buffer-name (org-buffer-name lang)
|
2010-07-17 14:53:36 -04:00
|
|
|
"Construct the buffer name for a source editing buffer."
|
2009-09-06 01:53:21 -04:00
|
|
|
(concat "*Org Src " org-buffer-name "[ " lang " ]*"))
|
|
|
|
|
2012-03-16 14:24:24 -04:00
|
|
|
(defun org-src-edit-buffer-p (&optional buffer)
|
|
|
|
"Test whether BUFFER (or the current buffer if BUFFER is nil)
|
|
|
|
is a source block editing buffer."
|
|
|
|
(let ((buffer (org-base-buffer (or buffer (current-buffer)))))
|
|
|
|
(and (buffer-name buffer)
|
|
|
|
(string-match "\\`*Org Src " (buffer-name buffer))
|
|
|
|
(local-variable-p 'org-edit-src-beg-marker buffer)
|
|
|
|
(local-variable-p 'org-edit-src-end-marker buffer))))
|
|
|
|
|
2009-06-07 10:27:07 -04:00
|
|
|
(defun org-edit-src-find-buffer (beg end)
|
|
|
|
"Find a source editing buffer that is already editing the region BEG to END."
|
|
|
|
(catch 'exit
|
2009-08-03 11:30:30 -04:00
|
|
|
(mapc
|
2009-06-07 10:27:07 -04:00
|
|
|
(lambda (b)
|
|
|
|
(with-current-buffer b
|
2009-09-09 09:06:42 -04:00
|
|
|
(if (and (string-match "\\`*Org Src " (buffer-name))
|
2009-06-07 10:27:07 -04:00
|
|
|
(local-variable-p 'org-edit-src-beg-marker (current-buffer))
|
|
|
|
(local-variable-p 'org-edit-src-end-marker (current-buffer))
|
|
|
|
(equal beg org-edit-src-beg-marker)
|
|
|
|
(equal end org-edit-src-end-marker))
|
|
|
|
(throw 'exit (current-buffer)))))
|
|
|
|
(buffer-list))
|
|
|
|
nil))
|
|
|
|
|
|
|
|
(defun org-edit-fixed-width-region ()
|
|
|
|
"Edit the fixed-width ascii drawing at point.
|
|
|
|
This must be a region where each line starts with a colon followed by
|
|
|
|
a space character.
|
|
|
|
An new buffer is created and the fixed-width region is copied into it,
|
|
|
|
and the buffer is switched into `artist-mode' for editing. When done,
|
|
|
|
exit with \\[org-edit-src-exit]. The edited text will then replace
|
|
|
|
the fragment in the Org-mode buffer."
|
|
|
|
(interactive)
|
|
|
|
(let ((line (org-current-line))
|
2009-10-07 23:55:15 -04:00
|
|
|
(col (current-column))
|
2009-06-07 10:27:07 -04:00
|
|
|
(case-fold-search t)
|
|
|
|
(msg (substitute-command-keys
|
2013-02-16 15:33:28 -05:00
|
|
|
"Edit, then exit with C-c ' (C-c and single quote) -- C-c C-k to abort"))
|
Use (derived-mode-p 'org-mode) instead of (eq major-mode 'org-mode).
* org.el (org-show-hierarchy-above, org-cycle)
(org-global-cycle, org-files-list, org-store-link)
(org-link-search, org-open-file, org-display-outline-path)
(org-refile-get-location, org-update-all-dblocks)
(org-change-tag-in-region, org-entry-properties)
(org-save-all-org-buffers, org-revert-all-org-buffers)
(org-buffer-list, org-cdlatex-mode)
(org-install-agenda-files-menu, org-end-of-subtree)
(org-speedbar-set-agenda-restriction): Use (derived-mode-p
'org-mode) instead of (eq major-mode 'org-mode).
* org-timer.el (org-timer-set-timer): Ditto.
* org-table.el (orgtbl-mode, org-table-align, orgtbl-mode): Ditto.
* org-src.el (org-edit-src-exit, org-edit-src-code)
(org-edit-fixed-width-region, org-edit-src-exit): Ditto.
* org-remember.el (org-remember-handler): Ditto.
* org-mouse.el (dnd-open-file, org-mouse-insert-item): Ditto.
* org-macs.el (org-get-limited-outline-regexp): Ditto.
* org-lparse.el (org-replace-region-by): Ditto.
* org-latex.el (org-latex-to-pdf-process)
(org-replace-region-by-latex): Ditto.
* org-indent.el (org-indent-indent-buffer): Ditto.
* org-id.el (org-id-store-link, org-id-update-id-locations)
(org-id-store-link): Ditto.
* org-html.el (org-export-html-preprocess)
(org-replace-region-by-html): Ditto.
* org-footnote.el (org-footnote-normalize)
(org-footnote-goto-definition)
(org-footnote-create-definition, org-footnote-normalize): Ditto.
* org-docbook.el (org-replace-region-by-docbook): Ditto.
* org-ctags.el (find-tag): Ditto.
* org-colview.el (org-columns-redo)
(org-columns-display-here, org-columns-edit-value)
(org-columns-redo): Ditto.
* org-colview-xemacs.el (org-columns-redo)
(org-columns-display-here, org-columns-edit-value)
(org-columns-redo): Ditto.
* org-capture.el (org-capture-insert-template-here)
(org-capture, org-capture-finalize)
(org-capture-set-target-location)
(org-capture-insert-template-here): Ditto.
* org-ascii.el (org-replace-region-by-ascii): Ditto.
* org-archive.el (org-archive-subtree): Ditto.
* org-agenda.el (org-agenda)
(org-agenda-get-restriction-and-command)
(org-agenda-get-some-entry-text, org-search-view)
(org-tags-view, org-agenda-get-day-entries)
(org-agenda-format-item, org-agenda-goto, org-agenda-kill)
(org-agenda-archive-with, org-agenda-switch-to): Ditto.
2012-04-20 14:03:45 -04:00
|
|
|
(org-mode-p (derived-mode-p 'org-mode))
|
2009-06-07 10:27:07 -04:00
|
|
|
(beg (make-marker))
|
|
|
|
(end (make-marker))
|
2009-10-07 23:49:37 -04:00
|
|
|
(preserve-indentation org-src-preserve-indentation)
|
|
|
|
block-nindent ovl beg1 end1 code begline buffer)
|
2009-06-07 10:27:07 -04:00
|
|
|
(beginning-of-line 1)
|
|
|
|
(if (looking-at "[ \t]*[^:\n \t]")
|
|
|
|
nil
|
|
|
|
(if (looking-at "[ \t]*\\(\n\\|\\'\\)")
|
|
|
|
(setq beg1 (point) end1 beg1)
|
|
|
|
(save-excursion
|
2009-06-07 17:10:36 -04:00
|
|
|
(if (re-search-backward "^[ \t]*[^: \t]" nil 'move)
|
2009-06-07 10:27:07 -04:00
|
|
|
(setq beg1 (point-at-bol 2))
|
|
|
|
(setq beg1 (point))))
|
|
|
|
(save-excursion
|
2009-06-07 17:10:36 -04:00
|
|
|
(if (re-search-forward "^[ \t]*[^: \t]" nil 'move)
|
2009-06-07 10:27:07 -04:00
|
|
|
(setq end1 (1- (match-beginning 0)))
|
|
|
|
(setq end1 (point))))
|
2009-08-27 04:24:09 -04:00
|
|
|
(org-goto-line line))
|
2009-06-07 10:27:07 -04:00
|
|
|
(setq beg (move-marker beg beg1)
|
|
|
|
end (move-marker end end1)
|
|
|
|
code (buffer-substring-no-properties beg end)
|
|
|
|
begline (save-excursion (goto-char beg) (org-current-line)))
|
|
|
|
(if (and (setq buffer (org-edit-src-find-buffer beg end))
|
2012-07-11 12:36:22 -04:00
|
|
|
(y-or-n-p "Return to existing edit buffer ([n] will revert changes)? "))
|
2011-07-18 13:25:10 -04:00
|
|
|
(org-pop-to-buffer-same-window buffer)
|
2009-06-07 10:27:07 -04:00
|
|
|
(when buffer
|
|
|
|
(with-current-buffer buffer
|
|
|
|
(if (boundp 'org-edit-src-overlay)
|
2010-04-18 10:37:42 -04:00
|
|
|
(delete-overlay org-edit-src-overlay)))
|
2009-06-07 10:27:07 -04:00
|
|
|
(kill-buffer buffer))
|
2009-09-06 01:53:21 -04:00
|
|
|
(setq buffer (generate-new-buffer
|
|
|
|
(org-src-construct-edit-buffer-name
|
|
|
|
(buffer-name) "Fixed Width")))
|
2010-04-18 10:37:42 -04:00
|
|
|
(setq ovl (make-overlay beg end))
|
|
|
|
(overlay-put ovl 'face 'secondary-selection)
|
|
|
|
(overlay-put ovl 'edit-buffer buffer)
|
|
|
|
(overlay-put ovl 'help-echo "Click with mouse-1 to switch to buffer editing this segment")
|
|
|
|
(overlay-put ovl 'face 'secondary-selection)
|
|
|
|
(overlay-put ovl
|
2012-08-11 13:10:44 -04:00
|
|
|
'keymap
|
|
|
|
(let ((map (make-sparse-keymap)))
|
|
|
|
(define-key map [mouse-1] 'org-edit-src-continue)
|
|
|
|
map))
|
2010-04-18 10:37:42 -04:00
|
|
|
(overlay-put ovl :read-only "Leave me alone")
|
2011-07-18 13:25:10 -04:00
|
|
|
(org-pop-to-buffer-same-window buffer)
|
2009-06-07 10:27:07 -04:00
|
|
|
(insert code)
|
|
|
|
(remove-text-properties (point-min) (point-max)
|
|
|
|
'(display nil invisible nil intangible nil))
|
2009-10-07 23:49:37 -04:00
|
|
|
(setq block-nindent (or (org-do-remove-indentation) 0))
|
2009-06-07 10:27:07 -04:00
|
|
|
(cond
|
|
|
|
((eq org-edit-fixed-width-region-mode 'artist-mode)
|
|
|
|
(fundamental-mode)
|
|
|
|
(artist-mode 1))
|
2010-04-22 17:37:35 -04:00
|
|
|
(t (funcall org-edit-fixed-width-region-mode)))
|
2009-06-07 10:27:07 -04:00
|
|
|
(set (make-local-variable 'org-edit-src-force-single-line) nil)
|
|
|
|
(set (make-local-variable 'org-edit-src-from-org-mode) org-mode-p)
|
|
|
|
(set (make-local-variable 'org-edit-src-picture) t)
|
|
|
|
(goto-char (point-min))
|
|
|
|
(while (re-search-forward "^[ \t]*: ?" nil t)
|
|
|
|
(replace-match ""))
|
2009-08-27 04:24:09 -04:00
|
|
|
(org-goto-line (1+ (- line begline)))
|
2009-10-07 23:55:15 -04:00
|
|
|
(org-move-to-column (max 0 (- col block-nindent 2)))
|
2009-06-07 10:27:07 -04:00
|
|
|
(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)
|
2009-10-07 23:49:37 -04:00
|
|
|
(org-set-local 'org-edit-src-block-indentation block-nindent)
|
|
|
|
(org-set-local 'org-edit-src-content-indentation 0)
|
|
|
|
(org-set-local 'org-src-preserve-indentation nil)
|
2009-08-31 12:41:06 -04:00
|
|
|
(org-src-mode)
|
|
|
|
(set-buffer-modified-p nil)
|
2009-06-07 10:27:07 -04:00
|
|
|
(and org-edit-src-persistent-message
|
|
|
|
(org-set-local 'header-line-format msg)))
|
|
|
|
(message "%s" msg)
|
|
|
|
t)))
|
|
|
|
|
|
|
|
(defun org-edit-src-find-region-and-lang ()
|
|
|
|
"Find the region and language for a local edit.
|
|
|
|
Return a list with beginning and end of the region, a string representing
|
2009-10-07 23:56:37 -04:00
|
|
|
the language, a switch telling if the content should be in a single line."
|
2009-06-07 10:27:07 -04:00
|
|
|
(let ((re-list
|
|
|
|
(append
|
|
|
|
org-edit-src-region-extra
|
|
|
|
'(
|
|
|
|
("<src\\>[^<]*>[ \t]*\n?" "\n?[ \t]*</src>" lang)
|
|
|
|
("<literal\\>[^<]*>[ \t]*\n?" "\n?[ \t]*</literal>" style)
|
|
|
|
("<example>[ \t]*\n?" "\n?[ \t]*</example>" "fundamental")
|
|
|
|
("<lisp>[ \t]*\n?" "\n?[ \t]*</lisp>" "emacs-lisp")
|
|
|
|
("<perl>[ \t]*\n?" "\n?[ \t]*</perl>" "perl")
|
|
|
|
("<python>[ \t]*\n?" "\n?[ \t]*</python>" "python")
|
|
|
|
("<ruby>[ \t]*\n?" "\n?[ \t]*</ruby>" "ruby")
|
|
|
|
("^[ \t]*#\\+begin_src\\( \\([^ \t\n]+\\)\\)?.*\n" "\n[ \t]*#\\+end_src" 2)
|
|
|
|
("^[ \t]*#\\+begin_example.*\n" "\n[ \t]*#\\+end_example" "fundamental")
|
|
|
|
("^[ \t]*#\\+html:" "\n" "html" single-line)
|
|
|
|
("^[ \t]*#\\+begin_html.*\n" "\n[ \t]*#\\+end_html" "html")
|
|
|
|
("^[ \t]*#\\+latex:" "\n" "latex" single-line)
|
|
|
|
("^[ \t]*#\\+begin_latex.*\n" "\n[ \t]*#\\+end_latex" "latex")
|
|
|
|
("^[ \t]*#\\+ascii:" "\n" "fundamental" single-line)
|
|
|
|
("^[ \t]*#\\+begin_ascii.*\n" "\n[ \t]*#\\+end_ascii" "fundamental")
|
2009-10-06 12:42:24 -04:00
|
|
|
("^[ \t]*#\\+macro:[ \t]+\\S-+\\( \\|$\\)"
|
|
|
|
"\n" "fundamental" macro-definition)
|
2009-06-07 10:27:07 -04:00
|
|
|
)))
|
|
|
|
(pos (point))
|
2009-06-07 11:07:07 -04:00
|
|
|
re1 re2 single beg end lang lfmt match-re1 ind entry)
|
2009-06-07 10:27:07 -04:00
|
|
|
(catch 'exit
|
|
|
|
(while (setq entry (pop re-list))
|
|
|
|
(setq re1 (car entry) re2 (nth 1 entry) lang (nth 2 entry)
|
|
|
|
single (nth 3 entry))
|
|
|
|
(save-excursion
|
|
|
|
(if (or (looking-at re1)
|
|
|
|
(re-search-backward re1 nil t))
|
|
|
|
(progn
|
|
|
|
(setq match-re1 (match-string 0))
|
|
|
|
(setq beg (match-end 0)
|
|
|
|
lang (org-edit-src-get-lang lang)
|
2009-06-07 17:10:36 -04:00
|
|
|
lfmt (org-edit-src-get-label-format match-re1)
|
|
|
|
ind (org-edit-src-get-indentation (match-beginning 0)))
|
2009-06-07 10:27:07 -04:00
|
|
|
(if (and (re-search-forward re2 nil t)
|
|
|
|
(>= (match-end 0) pos))
|
|
|
|
(throw 'exit (list beg (match-beginning 0)
|
2009-06-07 17:10:36 -04:00
|
|
|
lang single lfmt ind))))
|
2009-06-07 10:27:07 -04:00
|
|
|
(if (or (looking-at re2)
|
|
|
|
(re-search-forward re2 nil t))
|
|
|
|
(progn
|
|
|
|
(setq end (match-beginning 0))
|
|
|
|
(if (and (re-search-backward re1 nil t)
|
|
|
|
(<= (match-beginning 0) pos))
|
|
|
|
(progn
|
|
|
|
(setq lfmt (org-edit-src-get-label-format
|
2009-06-07 17:10:36 -04:00
|
|
|
(match-string 0))
|
|
|
|
ind (org-edit-src-get-indentation
|
|
|
|
(match-beginning 0)))
|
2009-06-07 10:27:07 -04:00
|
|
|
(throw 'exit
|
|
|
|
(list (match-end 0) end
|
|
|
|
(org-edit-src-get-lang lang)
|
2014-03-12 13:56:24 -04:00
|
|
|
single lfmt ind)))))))))
|
|
|
|
(when (org-at-table.el-p)
|
|
|
|
(re-search-backward "^[\t]*[^ \t|\\+]" nil t)
|
|
|
|
(setq beg (1+ (point-at-eol)))
|
|
|
|
(goto-char beg)
|
|
|
|
(or (re-search-forward "^[\t]*[^ \t|\\+]" nil t)
|
|
|
|
(progn (goto-char (point-max)) (newline)))
|
|
|
|
(setq end (1- (point-at-bol)))
|
|
|
|
(throw 'exit (list beg end 'table.el nil nil 0))))))
|
2009-06-07 10:27:07 -04:00
|
|
|
|
|
|
|
(defun org-edit-src-get-lang (lang)
|
|
|
|
"Extract the src language."
|
|
|
|
(let ((m (match-string 0)))
|
|
|
|
(cond
|
|
|
|
((stringp lang) lang)
|
|
|
|
((integerp lang) (match-string lang))
|
|
|
|
((and (eq lang 'lang)
|
|
|
|
(string-match "\\<lang=\"\\([^ \t\n\"]+\\)\"" m))
|
|
|
|
(match-string 1 m))
|
|
|
|
((and (eq lang 'style)
|
|
|
|
(string-match "\\<style=\"\\([^ \t\n\"]+\\)\"" m))
|
|
|
|
(match-string 1 m))
|
|
|
|
(t "fundamental"))))
|
|
|
|
|
|
|
|
(defun org-edit-src-get-label-format (s)
|
|
|
|
"Extract the label format."
|
|
|
|
(save-match-data
|
|
|
|
(if (string-match "-l[ \t]+\\\\?\"\\([^\t\r\n\"]+\\)\\\\?\"" s)
|
|
|
|
(match-string 1 s))))
|
|
|
|
|
2009-06-07 17:10:36 -04:00
|
|
|
(defun org-edit-src-get-indentation (pos)
|
2010-07-17 14:53:36 -04:00
|
|
|
"Count leading whitespace characters on line."
|
2009-06-07 17:10:36 -04:00
|
|
|
(save-match-data
|
|
|
|
(goto-char pos)
|
|
|
|
(org-get-indentation)))
|
|
|
|
|
2012-09-30 11:20:27 -04:00
|
|
|
(defun org-escape-code-in-region (beg end)
|
|
|
|
"Escape lines between BEG and END.
|
|
|
|
Escaping happens when a line starts with \"*\", \"#+\", \",*\" or
|
|
|
|
\",#+\" by appending a comma to it."
|
2012-09-28 14:47:14 -04:00
|
|
|
(interactive "r")
|
2012-09-30 11:20:27 -04:00
|
|
|
(save-excursion
|
|
|
|
(goto-char beg)
|
|
|
|
(while (re-search-forward "^[ \t]*,?\\(\\*\\|#\\+\\)" end t)
|
|
|
|
(replace-match ",\\1" nil nil nil 1))))
|
|
|
|
|
|
|
|
(defun org-escape-code-in-string (s)
|
|
|
|
"Escape lines in string S.
|
|
|
|
Escaping happens when a line starts with \"*\", \"#+\", \",*\" or
|
|
|
|
\",#+\" by appending a comma to it."
|
|
|
|
(replace-regexp-in-string "^[ \t]*,?\\(\\*\\|#\\+\\)" ",\\1" s nil nil 1))
|
|
|
|
|
|
|
|
(defun org-unescape-code-in-region (beg end)
|
|
|
|
"Un-escape lines between BEG and END.
|
|
|
|
Un-escaping happens by removing the first comma on lines starting
|
|
|
|
with \",*\", \",#+\", \",,*\" and \",,#+\"."
|
|
|
|
(interactive "r")
|
|
|
|
(save-excursion
|
|
|
|
(goto-char beg)
|
|
|
|
(while (re-search-forward "^[ \t]*,?\\(,\\)\\(?:\\*\\|#\\+\\)" end t)
|
|
|
|
(replace-match "" nil nil nil 1))))
|
|
|
|
|
|
|
|
(defun org-unescape-code-in-string (s)
|
|
|
|
"Un-escape lines in string S.
|
|
|
|
Un-escaping happens by removing the first comma on lines starting
|
|
|
|
with \",*\", \",#+\", \",,*\" and \",,#+\"."
|
|
|
|
(replace-regexp-in-string
|
|
|
|
"^[ \t]*,?\\(,\\)\\(?:\\*\\|#\\+\\)" "" s nil nil 1))
|
2012-09-28 14:47:14 -04:00
|
|
|
|
2009-10-27 14:11:09 -04:00
|
|
|
(defun org-edit-src-exit (&optional context)
|
2009-06-07 10:27:07 -04:00
|
|
|
"Exit special edit and protect problematic lines."
|
|
|
|
(interactive)
|
2010-04-22 17:37:35 -04:00
|
|
|
(unless (org-bound-and-true-p org-edit-src-from-org-mode)
|
2010-07-17 14:53:36 -04:00
|
|
|
(error "This is not a sub-editing buffer, something is wrong"))
|
2010-02-09 16:10:06 -05:00
|
|
|
(widen)
|
2012-12-29 05:20:10 -05:00
|
|
|
(let* ((fixed-width-p (string-match "Fixed Width" (buffer-name)))
|
|
|
|
(beg org-edit-src-beg-marker)
|
2009-10-06 12:42:24 -04:00
|
|
|
(end org-edit-src-end-marker)
|
|
|
|
(ovl org-edit-src-overlay)
|
2012-09-27 17:45:34 -04:00
|
|
|
(bufstr (buffer-string))
|
2009-10-06 12:42:24 -04:00
|
|
|
(buffer (current-buffer))
|
|
|
|
(single (org-bound-and-true-p org-edit-src-force-single-line))
|
|
|
|
(macro (eq single 'macro-definition))
|
2009-10-07 23:49:37 -04:00
|
|
|
(total-nindent (+ (or org-edit-src-block-indentation 0)
|
|
|
|
org-edit-src-content-indentation))
|
|
|
|
(preserve-indentation org-src-preserve-indentation)
|
2010-04-22 17:37:35 -04:00
|
|
|
(allow-write-back-p (org-bound-and-true-p org-edit-src-allow-write-back-p))
|
2009-10-12 12:13:08 -04:00
|
|
|
(delta 0) code line col indent)
|
2010-04-22 17:37:35 -04:00
|
|
|
(when allow-write-back-p
|
|
|
|
(unless preserve-indentation (untabify (point-min) (point-max)))
|
2010-09-21 10:02:22 -04:00
|
|
|
(if org-src-strip-leading-and-trailing-blank-lines
|
|
|
|
(save-excursion
|
|
|
|
(goto-char (point-min))
|
|
|
|
(if (looking-at "[ \t\n]*\n") (replace-match ""))
|
|
|
|
(unless macro
|
|
|
|
(if (re-search-forward "\n[ \t\n]*\\'" nil t) (replace-match ""))))))
|
2009-06-09 14:19:13 -04:00
|
|
|
(setq line (if (org-bound-and-true-p org-edit-src-force-single-line)
|
|
|
|
1
|
2009-10-07 23:55:15 -04:00
|
|
|
(org-current-line))
|
|
|
|
col (current-column))
|
2010-04-22 17:37:35 -04:00
|
|
|
(when allow-write-back-p
|
|
|
|
(when single
|
|
|
|
(goto-char (point-min))
|
|
|
|
(if (re-search-forward "\\s-+\\'" nil t) (replace-match ""))
|
|
|
|
(goto-char (point-min))
|
|
|
|
(let ((cnt 0))
|
|
|
|
(while (re-search-forward "\n" nil t)
|
|
|
|
(setq cnt (1+ cnt))
|
|
|
|
(replace-match (if macro "\\n" " ") t t))
|
|
|
|
(when (and macro (> cnt 0))
|
|
|
|
(goto-char (point-max)) (insert "\\n")))
|
|
|
|
(goto-char (point-min))
|
|
|
|
(if (looking-at "\\s-*") (replace-match " ")))
|
2012-12-29 05:20:10 -05:00
|
|
|
(when (and (org-bound-and-true-p org-edit-src-from-org-mode)
|
|
|
|
(not fixed-width-p))
|
2012-09-30 11:20:27 -04:00
|
|
|
(org-escape-code-in-region (point-min) (point-max))
|
|
|
|
(setq delta (+ delta
|
|
|
|
(save-excursion
|
|
|
|
(org-goto-line line)
|
|
|
|
(if (looking-at "[ \t]*\\(,,\\)?\\(\\*\\|#+\\)") 1
|
|
|
|
0)))))
|
2010-04-22 17:37:35 -04:00
|
|
|
(when (org-bound-and-true-p org-edit-src-picture)
|
|
|
|
(setq preserve-indentation nil)
|
|
|
|
(untabify (point-min) (point-max))
|
|
|
|
(goto-char (point-min))
|
|
|
|
(while (re-search-forward "^" nil t)
|
|
|
|
(replace-match ": ")))
|
|
|
|
(unless (or single preserve-indentation (= total-nindent 0))
|
|
|
|
(setq indent (make-string total-nindent ?\ ))
|
|
|
|
(goto-char (point-min))
|
2014-03-14 04:59:28 -04:00
|
|
|
(while (re-search-forward "\\(^\\).+" nil t)
|
|
|
|
(replace-match indent nil nil nil 1)))
|
2010-04-22 17:37:35 -04:00
|
|
|
(if (org-bound-and-true-p org-edit-src-picture)
|
|
|
|
(setq total-nindent (+ total-nindent 2)))
|
|
|
|
(setq code (buffer-string))
|
2012-09-27 17:45:34 -04:00
|
|
|
(when (eq context 'save)
|
|
|
|
(erase-buffer)
|
|
|
|
(insert bufstr))
|
2010-04-22 17:37:35 -04:00
|
|
|
(set-buffer-modified-p nil))
|
2009-10-27 14:11:09 -04:00
|
|
|
(org-src-switch-to-buffer (marker-buffer beg) (or context 'exit))
|
2012-09-27 17:45:34 -04:00
|
|
|
(if (eq context 'save) (save-buffer)
|
2013-02-16 04:35:08 -05:00
|
|
|
(with-current-buffer buffer
|
|
|
|
(set-buffer-modified-p nil))
|
2012-09-27 17:45:34 -04:00
|
|
|
(kill-buffer buffer))
|
2009-06-09 14:19:13 -04:00
|
|
|
(goto-char beg)
|
2010-04-22 17:37:35 -04:00
|
|
|
(when allow-write-back-p
|
2013-08-28 11:50:53 -04:00
|
|
|
(undo-boundary)
|
|
|
|
(delete-region beg (max beg end))
|
|
|
|
(unless (string-match "\\`[ \t]*\\'" code)
|
|
|
|
(insert code))
|
|
|
|
;; Make sure the overlay stays in place
|
2013-09-24 17:34:39 -04:00
|
|
|
(when (eq context 'save) (move-overlay ovl beg (point)))
|
2013-08-28 11:50:53 -04:00
|
|
|
(goto-char beg)
|
|
|
|
(if single (just-one-space)))
|
2010-03-23 11:18:04 -04:00
|
|
|
(if (memq t (mapcar (lambda (overlay)
|
2010-04-18 10:37:42 -04:00
|
|
|
(eq (overlay-get overlay 'invisible)
|
2010-03-23 11:18:04 -04:00
|
|
|
'org-hide-block))
|
2010-04-20 06:17:06 -04:00
|
|
|
(overlays-at (point))))
|
2010-03-23 11:18:04 -04:00
|
|
|
;; Block is hidden; put point at start of block
|
|
|
|
(beginning-of-line 0)
|
|
|
|
;; Block is visible, put point where it was in the code buffer
|
2013-02-15 16:59:13 -05:00
|
|
|
(when allow-write-back-p
|
|
|
|
(org-goto-line (1- (+ (org-current-line) line)))
|
|
|
|
(org-move-to-column (if preserve-indentation col (+ col total-nindent delta)))))
|
2012-09-27 17:45:34 -04:00
|
|
|
(unless (eq context 'save)
|
|
|
|
(move-marker beg nil)
|
|
|
|
(move-marker end nil)))
|
2013-02-16 05:35:39 -05:00
|
|
|
(when org-edit-src-code-timer
|
|
|
|
(cancel-timer org-edit-src-code-timer)
|
|
|
|
(setq org-edit-src-code-timer nil))
|
2009-11-07 20:45:50 -05:00
|
|
|
(unless (eq context 'save)
|
|
|
|
(when org-edit-src-saved-temp-window-config
|
|
|
|
(set-window-configuration org-edit-src-saved-temp-window-config)
|
|
|
|
(setq org-edit-src-saved-temp-window-config nil))))
|
2009-06-07 10:27:07 -04:00
|
|
|
|
2013-02-15 16:59:13 -05:00
|
|
|
(defun org-edit-src-abort ()
|
|
|
|
"Abort editing of the src code and return to the Org buffer."
|
|
|
|
(interactive)
|
|
|
|
(let (org-edit-src-allow-write-back-p)
|
|
|
|
(org-edit-src-exit 'exit)))
|
|
|
|
|
2012-03-19 16:38:12 -04:00
|
|
|
(defmacro org-src-in-org-buffer (&rest body)
|
|
|
|
`(let ((p (point)) (m (mark)) (ul buffer-undo-list) msg)
|
|
|
|
(save-window-excursion
|
|
|
|
(org-edit-src-exit 'save)
|
|
|
|
,@body
|
|
|
|
(setq msg (current-message))
|
|
|
|
(if (eq org-src-window-setup 'other-frame)
|
|
|
|
(let ((org-src-window-setup 'current-window))
|
|
|
|
(org-edit-src-code 'save))
|
|
|
|
(org-edit-src-code 'save)))
|
|
|
|
(setq buffer-undo-list ul)
|
|
|
|
(push-mark m 'nomessage)
|
|
|
|
(goto-char (min p (point-max)))
|
|
|
|
(message (or msg ""))))
|
|
|
|
(def-edebug-spec org-src-in-org-buffer (body))
|
|
|
|
|
2009-06-07 10:27:07 -04:00
|
|
|
(defun org-edit-src-save ()
|
|
|
|
"Save parent buffer with current state source-code buffer."
|
|
|
|
(interactive)
|
2013-02-16 04:35:08 -05:00
|
|
|
(if (string-match "Fixed Width" (buffer-name))
|
2013-02-16 15:33:28 -05:00
|
|
|
(user-error "Use C-c ' to save and exit, C-c C-k to abort editing")
|
2013-02-16 04:35:08 -05:00
|
|
|
(org-src-in-org-buffer (save-buffer))))
|
2012-03-19 16:38:12 -04:00
|
|
|
|
2013-03-02 12:10:39 -05:00
|
|
|
(declare-function org-babel-tangle "ob-tangle" (&optional arg target-file lang))
|
2012-03-19 16:38:12 -04:00
|
|
|
|
|
|
|
(defun org-src-tangle (arg)
|
|
|
|
"Tangle the parent buffer."
|
|
|
|
(interactive)
|
|
|
|
(org-src-in-org-buffer (org-babel-tangle arg)))
|
2009-06-07 10:27:07 -04:00
|
|
|
|
2009-08-24 08:47:58 -04:00
|
|
|
(defun org-src-mode-configure-edit-buffer ()
|
2010-04-22 17:37:35 -04:00
|
|
|
(when (org-bound-and-true-p org-edit-src-from-org-mode)
|
2009-08-24 08:47:58 -04:00
|
|
|
(org-add-hook 'kill-buffer-hook
|
2011-06-14 15:01:04 -04:00
|
|
|
#'(lambda () (delete-overlay org-edit-src-overlay)) nil 'local)
|
2010-04-22 17:37:35 -04:00
|
|
|
(if (org-bound-and-true-p org-edit-src-allow-write-back-p)
|
|
|
|
(progn
|
|
|
|
(setq buffer-offer-save t)
|
|
|
|
(setq buffer-file-name
|
|
|
|
(concat (buffer-file-name (marker-buffer org-edit-src-beg-marker))
|
|
|
|
"[" (buffer-name) "]"))
|
2010-05-24 09:20:23 -04:00
|
|
|
(if (featurep 'xemacs)
|
|
|
|
(progn
|
|
|
|
(make-variable-buffer-local 'write-contents-hooks) ; needed only for 21.4
|
|
|
|
(setq write-contents-hooks '(org-edit-src-save)))
|
|
|
|
(setq write-contents-functions '(org-edit-src-save))))
|
2010-04-22 17:37:35 -04:00
|
|
|
(setq buffer-read-only t))))
|
2009-08-24 08:47:58 -04:00
|
|
|
|
|
|
|
(org-add-hook 'org-src-mode-hook 'org-src-mode-configure-edit-buffer)
|
|
|
|
|
2010-08-16 20:55:24 -04:00
|
|
|
|
|
|
|
(defun org-src-associate-babel-session (info)
|
|
|
|
"Associate edit buffer with comint session."
|
|
|
|
(interactive)
|
|
|
|
(let ((session (cdr (assoc :session (nth 2 info)))))
|
|
|
|
(and session (not (string= session "none"))
|
|
|
|
(org-babel-comint-buffer-livep session)
|
Backport changes from Emacs revs 115081 and 115082
2013-11-12 Stefan Monnier <monnier@iro.umontreal.ca>
Address some byte-compiler warnings.
* ob-abc.el (org-babel-expand-body:abc): Use dolist.
(org-babel-execute:abc): Fix regexp quoting.
* ob-calc.el (org--var-syms): Rename from `var-syms'.
* ob-lilypond.el (ly-compile-lilyfile): Remove redundant let-binding.
* ob-table.el (sbe): Move debug declaration.
* org-clock.el (org--msg-extra): Rename from `msg-extra'.
* org.el (org-version): Avoid var name starting with _.
(org-inhibit-startup, org-called-with-limited-levels)
(org-link-search-inhibit-query, org-time-was-given)
(org-end-time-was-given, org-def, org-defdecode, org-with-time):
* org-colview.el (org-agenda-overriding-columns-format):
* org-agenda.el (org-agenda-multi, org-depend-tag-blocked)
(org-agenda-show-log-scoped):
* ob-python.el (py-which-bufname, python-shell-buffer-name):
* ob-haskell.el (org-export-copy-to-kill-ring):
* ob-exp.el (org-link-search-inhibit-query):
* ob-R.el (ess-eval-visibly-p):
* ob-core.el (org-src-window-setup): Declare before use.
(org-babel-expand-noweb-references): Remove unused `blocks-in-buffer'.
* ox-odt.el (org-odt-hfy-face-to-css):
* org-src.el (org-src-associate-babel-session, org-src-get-lang-mode):
* org-bibtex.el (org-bibtex-get, org-bibtex-ask, org-bibtex)
(org-bibtex-check):
* ob-tangle.el (org-babel-tangle, org-babel-spec-to-string)
(org-babel-tangle-single-block, org-babel-tangle-comment-links):
* ob-table.el (sbe):
* ob-sqlite.el (org-babel-sqlite-expand-vars):
* ob-sql.el (org-babel-sql-expand-vars):
* ob-shen.el (org-babel-execute:shen):
* ob-sh.el (org-babel-execute:sh, org-babel-sh-evaluate):
* ob-scala.el (org-babel-scala-evaluate):
* ob-ruby.el (org-babel-ruby-table-or-string)
(org-babel-ruby-evaluate):
* ob-python.el (org-babel-python-table-or-string)
(org-babel-python-evaluate-external-process)
(org-babel-python-evaluate-session):
* ob-picolisp.el (org-babel-execute:picolisp):
* ob-perl.el (org-babel-perl-evaluate):
* ob-maxima.el (org-babel-execute:maxima):
* ob-lisp.el (org-babel-execute:lisp):
* ob-java.el (org-babel-execute:java):
* ob-io.el (org-babel-io-evaluate):
* ob-haskell.el (org-babel-execute:haskell):
* ob-fortran.el (org-babel-execute:fortran):
* ob-exp.el (org-babel-exp-code):
* ob-emacs-lisp.el (org-babel-execute:emacs-lisp):
* ob-ditaa.el (org-babel-execute:ditaa):
* ob-core.el (org-babel-execute-src-block, org-babel-sha1-hash)
(org-babel-parse-header-arguments, org-babel-reassemble-table)
(org-babel-goto-src-block-head, org-babel-mark-block)
(org-babel-expand-noweb-references, org-babel-script-escape)
(org-babel-process-file-name):
* ob-clojure.el (org-babel-execute:clojure):
* ob-calc.el (org-babel-execute:calc):
* ob-awk.el (org-babel-execute:awk):
* ob-abc.el (org-babel-execute:abc):
* ob-R.el (org-babel-expand-body:R):
* ob-C.el (org-babel-C-execute): Avoid deprecated ((lambda) ...).
2013-11-12 Glenn Morris <rgm@gnu.org>
* ox-html.el (org-html-scripts): Add 2013 to copyright years.
(org-html-infojs-template): Copyright holder to FSF.
2013-11-12 14:57:31 -05:00
|
|
|
(let ((f (intern (format "org-babel-%s-associate-session"
|
|
|
|
(nth 0 info)))))
|
|
|
|
(and (fboundp f) (funcall f session))))))
|
2010-08-16 20:55:24 -04:00
|
|
|
|
|
|
|
(defun org-src-babel-configure-edit-buffer ()
|
|
|
|
(when org-src-babel-info
|
|
|
|
(org-src-associate-babel-session org-src-babel-info)))
|
|
|
|
|
|
|
|
(org-add-hook 'org-src-mode-hook 'org-src-babel-configure-edit-buffer)
|
2010-08-17 22:37:19 -04:00
|
|
|
(defmacro org-src-do-at-code-block (&rest body)
|
|
|
|
"Execute a command from an edit buffer in the Org-mode buffer."
|
|
|
|
`(let ((beg-marker org-edit-src-beg-marker))
|
|
|
|
(if beg-marker
|
|
|
|
(with-current-buffer (marker-buffer beg-marker)
|
|
|
|
(goto-char (marker-position beg-marker))
|
|
|
|
,@body))))
|
Provide edebug specifications for macros
* org-macs.el (org-with-gensyms, org-called-interactively-p)
(with-silent-modifications, org-bound-and-true-p)
(org-unmodified, org-re, org-preserve-lc)
(org-without-partial-completion, org-with-point-at)
(org-no-warnings, org-if-unprotected, org-if-unprotected-1)
(org-if-unprotected-at, org-with-remote-undo)
(org-no-read-only, org-save-outline-visibility)
(org-with-wide-buffer, org-with-limited-levels)
(org-eval-in-environment): Provide edebug specifications.
* org-src.el (org-src-do-at-code-block): Dto.
* org-publish.el (org-publish-with-aux-preprocess-maybe): Dto.
* org-compat.el (org-xemacs-without-invisibility): Dto.
* org-clock.el (org-with-clock-position, org-with-clock): Dto.
* org-agenda.el (org-agenda-with-point-at-orig-entry)
(org-batch-agenda, org-batch-agenda-csv)
(org-batch-store-agenda-views): Dto.
* ob.el (org-babel-do-in-edit-buffer)
(org-babel-map-src-blocks, org-babel-map-inline-src-blocks): Dto.
* ob-tangle.el (org-babel-with-temp-filebuffer): Dto.
* ob-table.el (sbe): Dto.
* ob-exp.el (org-babel-exp-in-export-file): Dto.
* ob-comint.el (org-babel-comint-in-buffer)
(org-babel-comint-with-output): Dto.
2011-08-11 02:57:25 -04:00
|
|
|
(def-edebug-spec org-src-do-at-code-block (body))
|
2010-08-17 22:37:19 -04:00
|
|
|
|
|
|
|
(defun org-src-do-key-sequence-at-code-block (&optional key)
|
|
|
|
"Execute key sequence at code block in the source Org buffer.
|
|
|
|
The command bound to KEY in the Org-babel key map is executed
|
|
|
|
remotely with point temporarily at the start of the code block in
|
|
|
|
the Org buffer.
|
|
|
|
|
|
|
|
This command is not bound to a key by default, to avoid conflicts
|
2012-07-11 12:36:22 -04:00
|
|
|
with language major mode bindings. To bind it to C-c @ in all
|
2010-08-17 22:37:19 -04:00
|
|
|
language major modes, you could use
|
|
|
|
|
|
|
|
(add-hook 'org-src-mode-hook
|
|
|
|
(lambda () (define-key org-src-mode-map \"\\C-c@\"
|
|
|
|
'org-src-do-key-sequence-at-code-block)))
|
|
|
|
|
|
|
|
In that case, for example, C-c @ t issued in code edit buffers
|
|
|
|
would tangle the current Org code block, C-c @ e would execute
|
|
|
|
the block and C-c @ h would display the other available
|
|
|
|
Org-babel commands."
|
|
|
|
(interactive "kOrg-babel key: ")
|
|
|
|
(if (equal key (kbd "C-g")) (keyboard-quit)
|
|
|
|
(org-edit-src-save)
|
|
|
|
(org-src-do-at-code-block
|
|
|
|
(call-interactively
|
|
|
|
(lookup-key org-babel-map key)))))
|
|
|
|
|
2010-09-21 10:17:01 -04:00
|
|
|
(defcustom org-src-tab-acts-natively nil
|
2010-09-02 14:57:03 -04:00
|
|
|
"If non-nil, the effect of TAB in a code block is as if it were
|
2010-09-21 10:17:01 -04:00
|
|
|
issued in the language major mode buffer."
|
|
|
|
:type 'boolean
|
2012-03-19 16:38:12 -04:00
|
|
|
:version "24.1"
|
2010-09-21 10:17:01 -04:00
|
|
|
:group 'org-babel)
|
2010-09-02 14:57:03 -04:00
|
|
|
|
|
|
|
(defun org-src-native-tab-command-maybe ()
|
|
|
|
"Perform language-specific TAB action.
|
2013-04-03 11:40:10 -04:00
|
|
|
Alter code block according to what TAB does in the language major mode."
|
2010-09-02 14:57:03 -04:00
|
|
|
(and org-src-tab-acts-natively
|
2013-04-03 11:40:10 -04:00
|
|
|
(org-in-src-block-p)
|
2012-12-12 03:09:04 -05:00
|
|
|
(not (equal this-command 'org-shifttab))
|
2010-09-21 10:02:22 -04:00
|
|
|
(let ((org-src-strip-leading-and-trailing-blank-lines nil))
|
|
|
|
(org-babel-do-key-sequence-in-edit-buffer (kbd "TAB")))))
|
2010-09-02 14:57:03 -04:00
|
|
|
|
|
|
|
(add-hook 'org-tab-first-hook 'org-src-native-tab-command-maybe)
|
|
|
|
|
2010-09-02 11:12:58 -04:00
|
|
|
(defun org-src-font-lock-fontify-block (lang start end)
|
|
|
|
"Fontify code block.
|
|
|
|
This function is called by emacs automatic fontification, as long
|
2012-07-11 12:36:22 -04:00
|
|
|
as `org-src-fontify-natively' is non-nil. For manual
|
2010-09-02 11:12:58 -04:00
|
|
|
fontification of code blocks see `org-src-fontify-block' and
|
|
|
|
`org-src-fontify-buffer'"
|
2010-12-22 06:50:42 -05:00
|
|
|
(let ((lang-mode (org-src-get-lang-mode lang)))
|
|
|
|
(if (fboundp lang-mode)
|
|
|
|
(let ((string (buffer-substring-no-properties start end))
|
|
|
|
(modified (buffer-modified-p))
|
|
|
|
(org-buffer (current-buffer)) pos next)
|
|
|
|
(remove-text-properties start end '(face nil))
|
|
|
|
(with-current-buffer
|
|
|
|
(get-buffer-create
|
|
|
|
(concat " org-src-fontification:" (symbol-name lang-mode)))
|
|
|
|
(delete-region (point-min) (point-max))
|
2012-09-29 01:21:12 -04:00
|
|
|
(insert string " ") ;; so there's a final property change
|
2010-12-22 06:50:42 -05:00
|
|
|
(unless (eq major-mode lang-mode) (funcall lang-mode))
|
|
|
|
(font-lock-fontify-buffer)
|
|
|
|
(setq pos (point-min))
|
|
|
|
(while (setq next (next-single-property-change pos 'face))
|
|
|
|
(put-text-property
|
2012-09-27 17:40:28 -04:00
|
|
|
(+ start (1- pos)) (1- (+ start next)) 'face
|
2010-12-22 06:50:42 -05:00
|
|
|
(get-text-property pos 'face) org-buffer)
|
|
|
|
(setq pos next)))
|
|
|
|
(add-text-properties
|
|
|
|
start end
|
|
|
|
'(font-lock-fontified t fontified t font-lock-multiline t))
|
|
|
|
(set-buffer-modified-p modified)))))
|
2010-09-02 11:12:58 -04:00
|
|
|
|
|
|
|
(defun org-src-fontify-block ()
|
|
|
|
"Fontify code block at point."
|
|
|
|
(interactive)
|
|
|
|
(save-excursion
|
|
|
|
(let ((org-src-fontify-natively t)
|
|
|
|
(info (org-edit-src-find-region-and-lang)))
|
|
|
|
(font-lock-fontify-region (nth 0 info) (nth 1 info)))))
|
|
|
|
|
|
|
|
(defun org-src-fontify-buffer ()
|
2012-07-11 12:36:22 -04:00
|
|
|
"Fontify all code blocks in the current buffer."
|
2010-09-02 11:12:58 -04:00
|
|
|
(interactive)
|
|
|
|
(org-babel-map-src-blocks nil
|
|
|
|
(org-src-fontify-block)))
|
|
|
|
|
|
|
|
(defun org-src-get-lang-mode (lang)
|
|
|
|
"Return major mode that should be used for LANG.
|
|
|
|
LANG is a string, and the returned major mode is a symbol."
|
|
|
|
(intern
|
|
|
|
(concat
|
Backport changes from Emacs revs 115081 and 115082
2013-11-12 Stefan Monnier <monnier@iro.umontreal.ca>
Address some byte-compiler warnings.
* ob-abc.el (org-babel-expand-body:abc): Use dolist.
(org-babel-execute:abc): Fix regexp quoting.
* ob-calc.el (org--var-syms): Rename from `var-syms'.
* ob-lilypond.el (ly-compile-lilyfile): Remove redundant let-binding.
* ob-table.el (sbe): Move debug declaration.
* org-clock.el (org--msg-extra): Rename from `msg-extra'.
* org.el (org-version): Avoid var name starting with _.
(org-inhibit-startup, org-called-with-limited-levels)
(org-link-search-inhibit-query, org-time-was-given)
(org-end-time-was-given, org-def, org-defdecode, org-with-time):
* org-colview.el (org-agenda-overriding-columns-format):
* org-agenda.el (org-agenda-multi, org-depend-tag-blocked)
(org-agenda-show-log-scoped):
* ob-python.el (py-which-bufname, python-shell-buffer-name):
* ob-haskell.el (org-export-copy-to-kill-ring):
* ob-exp.el (org-link-search-inhibit-query):
* ob-R.el (ess-eval-visibly-p):
* ob-core.el (org-src-window-setup): Declare before use.
(org-babel-expand-noweb-references): Remove unused `blocks-in-buffer'.
* ox-odt.el (org-odt-hfy-face-to-css):
* org-src.el (org-src-associate-babel-session, org-src-get-lang-mode):
* org-bibtex.el (org-bibtex-get, org-bibtex-ask, org-bibtex)
(org-bibtex-check):
* ob-tangle.el (org-babel-tangle, org-babel-spec-to-string)
(org-babel-tangle-single-block, org-babel-tangle-comment-links):
* ob-table.el (sbe):
* ob-sqlite.el (org-babel-sqlite-expand-vars):
* ob-sql.el (org-babel-sql-expand-vars):
* ob-shen.el (org-babel-execute:shen):
* ob-sh.el (org-babel-execute:sh, org-babel-sh-evaluate):
* ob-scala.el (org-babel-scala-evaluate):
* ob-ruby.el (org-babel-ruby-table-or-string)
(org-babel-ruby-evaluate):
* ob-python.el (org-babel-python-table-or-string)
(org-babel-python-evaluate-external-process)
(org-babel-python-evaluate-session):
* ob-picolisp.el (org-babel-execute:picolisp):
* ob-perl.el (org-babel-perl-evaluate):
* ob-maxima.el (org-babel-execute:maxima):
* ob-lisp.el (org-babel-execute:lisp):
* ob-java.el (org-babel-execute:java):
* ob-io.el (org-babel-io-evaluate):
* ob-haskell.el (org-babel-execute:haskell):
* ob-fortran.el (org-babel-execute:fortran):
* ob-exp.el (org-babel-exp-code):
* ob-emacs-lisp.el (org-babel-execute:emacs-lisp):
* ob-ditaa.el (org-babel-execute:ditaa):
* ob-core.el (org-babel-execute-src-block, org-babel-sha1-hash)
(org-babel-parse-header-arguments, org-babel-reassemble-table)
(org-babel-goto-src-block-head, org-babel-mark-block)
(org-babel-expand-noweb-references, org-babel-script-escape)
(org-babel-process-file-name):
* ob-clojure.el (org-babel-execute:clojure):
* ob-calc.el (org-babel-execute:calc):
* ob-awk.el (org-babel-execute:awk):
* ob-abc.el (org-babel-execute:abc):
* ob-R.el (org-babel-expand-body:R):
* ob-C.el (org-babel-C-execute): Avoid deprecated ((lambda) ...).
2013-11-12 Glenn Morris <rgm@gnu.org>
* ox-html.el (org-html-scripts): Add 2013 to copyright years.
(org-html-infojs-template): Copyright holder to FSF.
2013-11-12 14:57:31 -05:00
|
|
|
(let ((l (or (cdr (assoc lang org-src-lang-modes)) lang)))
|
|
|
|
(if (symbolp l) (symbol-name l) l))
|
|
|
|
"-mode")))
|
2010-08-16 20:55:24 -04:00
|
|
|
|
2009-06-07 10:27:07 -04:00
|
|
|
(provide 'org-src)
|
|
|
|
|
|
|
|
;;; org-src.el ends here
|