* image-mode.el (image-mode): Add image-after-revert-hook to after-revert-hook.
[bpt/emacs.git] / lisp / org / org-macs.el
index c287012..562715f 100644 (file)
@@ -1,11 +1,12 @@
 ;;; org-macs.el --- Top-level definitions for Org-mode
 
-;; Copyright (C) 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+;; Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010
+;;   Free Software Foundation, Inc.
 
 ;; Author: Carsten Dominik <carsten at orgmode dot org>
 ;; Keywords: outlines, hypermedia, calendar, wp
 ;; Homepage: http://orgmode.org
-;; Version: 6.09a
+;; Version: 6.35i
 ;;
 ;; This file is part of GNU Emacs.
 ;;
 
 ;;; Code:
 
+(eval-and-compile
+  (unless (fboundp 'declare-function)
+    (defmacro declare-function (fn file &optional arglist fileonly))))
+
+(declare-function org-add-props "org-compat" (string plist &rest props))
+
 (defmacro org-bound-and-true-p (var)
   "Return the value of symbol VAR if it is bound, else nil."
   `(and (boundp (quote ,var)) ,var))
 
 (defmacro org-unmodified (&rest body)
-  "Execute body without changing `buffer-modified-p'."
+  "Execute body without changing `buffer-modified-p'.
+Also, do not record undo information."
   `(set-buffer-modified-p
-    (prog1 (buffer-modified-p) ,@body)))
+    (prog1 (buffer-modified-p)
+      (let ((buffer-undo-list t)
+           before-change-functions after-change-functions)
+       ,@body))))
 
 (defmacro org-re (s)
   "Replace posix classes in regular expression."
        (save-match-data
          (while (string-match "\\[:alnum:\\]" ss)
            (setq ss (replace-match "a-zA-Z0-9" t t ss)))
+         (while (string-match "\\[:word:\\]" ss)
+           (setq ss (replace-match "a-zA-Z0-9" t t ss)))
          (while (string-match "\\[:alpha:\\]" ss)
            (setq ss (replace-match "a-zA-Z" t t ss)))
+         (while (string-match "\\[:punct:\\]" ss)
+           (setq ss (replace-match "\001-@[-`{-~" t t ss)))
          ss))
     s))
 
@@ -58,7 +73,7 @@
         (_col (current-column)))
      (unwind-protect
         (progn ,@body)
-       (goto-line _line)
+       (org-goto-line _line)
        (org-move-to-column _col))))
 
 (defmacro org-without-partial-completion (&rest body)
           ,@body)
        (if pc-mode (partial-completion-mode 1)))))
 
-(eval-and-compile
-  (unless (fboundp 'declare-function)
-    (defmacro declare-function (fn file &optional arglist fileonly))))
-
 (defmacro org-maybe-intangible (props)
-  "Add '(intangigble t) to PROPS if Emacs version is earlier than Emacs 22.
+  "Add '(intangible t) to PROPS if Emacs version is earlier than Emacs 22.
 In emacs 21, invisible text is not avoided by the command loop, so the
 intangible property is needed to make sure point skips this text.
 In Emacs 22, this is not necessary.  The intangible text property has
@@ -93,6 +104,7 @@ We use a macro so that the test can happen at compilation time."
      (save-excursion
        (goto-char (or ,pom (point)))
        ,@body)))
+(put 'org-with-point-at 'lisp-indent-function 1)
 
 (defmacro org-no-warnings (&rest body)
   (cons (if (fboundp 'with-no-warnings) 'with-no-warnings 'progn) body))
@@ -102,6 +114,26 @@ We use a macro so that the test can happen at compilation time."
   `(unless (get-text-property (point) 'org-protected)
      ,@body))
 
+(defmacro org-if-unprotected-1 (&rest body)
+  "Execute BODY if there is no `org-protected' text property at point-1."
+  `(unless (get-text-property (1- (point)) 'org-protected)
+     ,@body))
+
+(defmacro org-if-unprotected-at (pos &rest body)
+  "Execute BODY if there is no `org-protected' text property at POS."
+  `(unless (get-text-property ,pos 'org-protected)
+     ,@body))
+(put 'org-if-unprotected-at 'lisp-indent-function 1)
+
+(defun org-re-search-forward-unprotected (&rest args)
+  "Like re-search-forward, but stop only in unprotected places."
+  (catch 'exit
+    (while t
+      (unless (apply 're-search-forward args)
+       (throw 'exit nil))
+      (unless (get-text-property (match-beginning 0) 'org-protected)
+       (throw 'exit (point))))))
+
 (defmacro org-with-remote-undo (_buffer &rest _body)
   "Execute BODY while recording undo information in two buffers."
   `(let ((_cline (org-current-line))
@@ -152,6 +184,18 @@ We use a macro so that the test can happen at compilation time."
        ((assoc key option) (cdr (assoc key option)))
        (t (cdr (assq 'default option)))))
 
+(defsubst org-check-external-command (cmd &optional use no-error)
+  "Check if external program CMD for USE exists, error if not.
+When the program does exist, return its path.
+When it does not exist and NO-ERROR is set, return nil.
+Otherwise, throw an error.  The optional argument USE can describe what this
+program is needed for, so that the error message can be more informative."
+  (or (executable-find cmd)
+      (if no-error
+         nil
+       (error "Can't find `%s'%s" cmd
+              (if use (format " (%s)" use) "")))))
+
 (defsubst org-inhibit-invisibility ()
   "Modified `buffer-invisibility-spec' for Emacs 21.
 Some ops with invisible text do not work correctly on Emacs 21.  For these
@@ -160,7 +204,7 @@ we turn off invisibility temporarily.  Use this in a `let' form."
 
 (defsubst org-set-local (var value)
   "Make VAR local in current buffer and set it to VALUE."
-  (set (make-variable-buffer-local var) value))
+  (set (make-local-variable var) value))
 
 (defsubst org-mode-p ()
   "Check if the current buffer is in Org-mode."
@@ -188,6 +232,15 @@ we turn off invisibility temporarily.  Use this in a `let' form."
     ;; works also in narrowed buffer, because we start at 1, not point-min
     (+ (if (bolp) 1 0) (count-lines 1 (point)))))
 
+(defsubst org-goto-line (N)
+  (save-restriction
+    (widen)
+    (goto-char (point-min))
+    (forward-line (1- N))))
+
+(defsubst org-current-line-string (&optional to-here)
+  (buffer-substring (point-at-bol) (if to-here (point) (point-at-eol))))
+
 (defsubst org-pos-in-match-range (pos n)
   (and (match-beginning n)
        (<= (match-beginning n) pos)
@@ -217,6 +270,31 @@ This is in contrast to merely setting it to 0."
       (setq plist (cddr plist)))
     p))
 
+
+(defun org-replace-match-keep-properties (newtext &optional fixedcase
+                                                 literal string)
+  "Like `replace-match', but add the text properties found original text."
+  (setq newtext (org-add-props newtext (text-properties-at
+                                       (match-beginning 0) string)))
+  (replace-match newtext fixedcase literal string))
+
+(defmacro org-with-limited-levels (&rest body)
+  "Execute BODY with limited number of outline levels."
+  `(let* ((outline-regexp (org-get-limited-outline-regexp)))
+     ,@body))
+
+(defvar org-odd-levels-only) ; defined in org.el
+(defvar org-inlinetask-min-level) ; defined in org-inlinetask.el
+(defun org-get-limited-outline-regexp ()
+  "Return outline-regexp with limited number of levels.
+The number of levels is controlled by "
+  (if (or (not (org-mode-p)) (not (featurep 'org-inlinetask)))
+
+      outline-regexp
+    (let* ((limit-level (1- org-inlinetask-min-level))
+          (nstars (if org-odd-levels-only (1- (* limit-level 2)) limit-level)))
+      (format "\\*\\{1,%d\\} " nstars))))
+
 (provide 'org-macs)
 
 ;; arch-tag: 7e6a73ce-aac9-4fc0-9b30-ce6f89dc6668