diff options
Diffstat (limited to 'lisp/org')
34 files changed, 2536 insertions, 658 deletions
diff --git a/lisp/org/ChangeLog b/lisp/org/ChangeLog index 6d714a502c8..a569d6a1144 100644 --- a/lisp/org/ChangeLog +++ b/lisp/org/ChangeLog @@ -1,3 +1,425 @@ +2009-01-25 Carsten Dominik <carsten.dominik@gmail.com> + + * org-exp.el (org-export-as-html): Turn \par into a paragraph. + + * org.el (org-agenda-tags-todo-honor-ignore-options): Declare + variable. + + * org-table.el (org-table-insert-hline): Fix typo in fuction call + to `backward-char'. + + * org-exp.el (org-export-as-html): Remove the initial space from + colon examples. + + * org.el (org-scan-tags): Call + `org-agenda-check-for-timestamp-as-reason-to-ignore-todo-item'. + + * org-agenda.el (org-agenda-todo-list, org-agenda-match-view): New + customization groups. + (org-agenda-tags-todo-honor-ignore-options): New option. + (org-agenda-check-for-timestamp-as-reason-to-ignore-todo-item): + New function. + (org-agenda-get-todos): Use + `org-agenda-check-for-timestamp-as-reason-to-ignore-todo-item'. + +2009-01-25 Carsten Dominik <carsten.dominik@gmail.com> + + * org-exp.el (org-export-format-source-code-or-example): Escape + HTML characters also in examples that anre not treated with + htmlize. Also, just switch to EXAMPLE processing if we do not + have a good version of htmlize. + + * org-rmail.el: Fix copyright notice. + + * org.el (org-activate-footnote-links): Improve footnote link + highlighting. + + * org-footnote.el (org-footnote-normalize): Fix finding the end of + a footnote definition at the end of the file. + + * org-table.el (org-table-get-specials): Add an imagined hline at + the end of the table. This can be useful for references that want + to go to the end of the table. Also fix bug when computing last + row constants, in tables that do not start right at the right + margin. + (org-table-eval-formula): Match and replace remove references. + (org-table-formula-substitute-names): Make sure that names inside + a "remote" call are left alone, the will be replaced later when + the remote call is handled. + (org-table-convert-refs-to-rc): Do not convert things that might + look like a reference, but are really part of an ID or namei n a + remote reference. + (org-table-get-remote-range): New function. + +2009-01-25 Carsten Dominik <carsten.dominik@gmail.com> + + * org-faces.el (org-clock-overlay): Fix bug in face definition. + + * org-clock.el (org-clock-put-overlay): Use new face instead of + `secondary-selection'. + + * org-faces.el (org-clock-overlay): New face. + +2009-01-25 Carsten Dominik <carsten.dominik@gmail.com> + + * org-exp.el (org-get-current-options): Include the option for + publishing time stamps. + + * org.el (org-toggle-heading): Renamed from + `org-toggel-region-headings'. + No longer needs a region defined, but will use it if there is one. + (org-ctrl-c-star): Simplified, relying more on the internal + workings of `org-toggle-heading'. + (org-toggle-item): Renamed from `org-toggle-region-items'. + No longer needs a region defined, but will use it if there is one. + (org-ctrl-c-minus): Simplified, relying more on the inernal + workings of `org-toggle-item'. + + * org-export-latex.el (org-export-latex-preprocess): Fix bug in + environment detection. Also, do real changes only in unprotected + places. + +2009-01-25 Carsten Dominik <carsten.dominik@gmail.com> + + * org-export-latex.el (org-export-latex-quotation-marks): Use + `org-if-unprotected-1'. + (org-export-latex-set-initial-vars): Check for class definition in + property. + + * org-macs.el (org-if-unprotected-1): New macro. + +2009-01-25 Carsten Dominik <carsten.dominik@gmail.com> + + * org-compat.el (org-count-lines): New function. + + * org-exp.el (org-export-format-source-code-or-example): Handle + switches related to text areas. + + * org.el (org-activate-footnote-links): Don't allow match inside a + link. + + * org-footnote.el (org-footnote-re): Don't allow match inside a link. + + * org-export-latex.el (org-export-latex-links): Keep a relative + path relative also after export. + + * org-exp.el (org-export-html-scripts): Fix HTML snippet. + + * org.el (org-make-tags-matcher): Never use IDO for completing the + tags matcher match string. + (org-completing-read): Also remove the special biding for "?". + + * org-attach.el (org-attach-allow-inheritance): New option. + (org-attach-inherited): New variable. + (org-attach-dir): Handle properties related to the attachment + directory. + (org-attach-check-absolute-path): New function. + (org-attach-set-directory, org-attach-set-inherit): New commands. + (org-attach): Accommodate the new commands in the dispatcher. + +2009-01-25 Carsten Dominik <carsten.dominik@gmail.com> + + * org-compat.el (org-fit-window-to-buffer): Fix bug with using + `window-full-width-p'. + + * org-exp.el (org-export-as-html): Only check for images files + that really can be inlined + + * org.el (org-image-file-name-regexp, org-file-image-p): Allow the + list of extensions to be a parameter. + + * org-exp.el (org-export-html-inline-image-extensions): New + variable. + + * org-agenda.el (org-prepare-agenda): Use + `org-agenda-block-separator'. + (org-agenda-block-separator): New option. + +2009-01-25 Carsten Dominik <carsten.dominik@gmail.com> + + * org-export-latex.el (org-export-latex-tables): Call + `org-table-clean-before-export' with the new optional argument. + + * org-exp.el (org-table-clean-before-export): New optional + parameter MAYBE-QUOTED, allows for quoted characters like \# in + first column. + +2009-01-25 Carsten Dominik <carsten.dominik@gmail.com> + + * org-plot.el (org-plot/gnuplot): Fix text-ind parameter for + histograms. + + * org-colview.el (org-colview-construct-allowed-dates): Better + error catching when a date/time property does not have allowed + values defined. + + * org-colview-xemacs.el (org-colview-construct-allowed-dates): + Better error catching when a date/time property does not have + allowed values defined. + +2009-01-25 Carsten Dominik <carsten.dominik@gmail.com> + + * org.el (org-map-entries): Restore point and restriction after + `org-map-entries'. + +2009-01-25 Carsten Dominik <carsten.dominik@gmail.com> + + * org.el (org-time=, org-time<, org-time<=, org-time>) + (org-time>=, org-time<>): Make sure both values are dates. + +2009-01-25 Carsten Dominik <carsten.dominik@gmail.com> + + * org-archive.el (org-extract-archive-heading): Allow %s for file + name also in achive location heading. + +2009-01-25 Carsten Dominik <carsten.dominik@gmail.com> + + * org-archive.el (org-add-archive-files): Uniquify the list before + returning it. + +2009-01-25 Carsten Dominik <carsten.dominik@gmail.com> + + * org-compat.el (org-fit-window-to-buffer): Use + `window-full-width-p'. + + * org-export-latex.el (org-export-latex-fixed-width): Enforce the + space after the colon in short examples. + + * org-exp.el (org-export-protect-colon-examples): Rewritten, to + enforce a space after the colon. However, we also allow lines + that are *only* a colon. + (org-export-as-html): Enforce the space after the colon in short + examples. + (org-export-preprocess-string): Do the colon example protection + earlier. + (org-export-remove-timestamps): Do not check for protection at the + end of the line. + +2009-01-25 Carsten Dominik <carsten.dominik@gmail.com> + + * org.el (org-format-latex-options): Add new matcher for single + letters between dollars. + (org-get-header): Function removed. + (org-heading-components): New function. + + * org-exp.el (org-export-define-heading-targets): Record ID's also + as alternative targets. + (org-export-as-html): Interpret "id:" links to other files by + preserving the relative path. + + * org-jsinfo.el (org-infojs-handle-options): Catch the case if v + is nil. + + * org-exp.el (org-export-normalize-links): Protect the main link, + to avoid special character processing. + + * org-export-latex.el (org-export-latex-special-keyword-regexp): + New variable. + (org-export-latex-special-string-regexps): Variable removed. + (org-export-latex-keywords): Use the new regexp. + + * org-exp.el (org-export-handle-include-files): Fetch switches and + put them into the BEGIN statement. + + * org-timer.el (org-timer-mode-line-string): New variable. + + * org-clock.el (org-clock-mode-line-map): Renamed from + `org-clock-mode-map'. + (org-clock-mode-line-timer): Renamed from `org-mode-line-timer'. + (org-clock-update-mode-line): Renamed from `org-update-mode-line'. + (org-clock-put-overlay): Renamed from `org-put-clock-overlay'. + (org-clock-remove-overlays): Renamed from + `org-remove-clock-overlays'. + + * org-timer.el (org-timer-pause-or-continue): Implement stopping + and mode line display. + (org-timer-stop): New command. + (org-timer-seconds): Return correct time when timer is paused. + (org-timer-mode-line-timer): New variable. + (org-timer-set-mode-line, org-timer-update-mode-line): New + functions. + + * org.el (org-insert-heading): Handle new value `auto' for + `org-blank-before-new-entry'. + (org-org-menu): Add new items for timer functions. + + * org-list.el (org-insert-item): Handle new value `auto' for + `org-blank-before-new-entry'. + + * org.el (org-blank-before-new-entry): New value `auto', made + default. + +2009-01-25 Carsten Dominik <carsten.dominik@gmail.com> + + * org-exp.el (org-export-normalize-links): If the link is also + used as the description, protect the description. + +2009-01-25 Carsten Dominik <carsten.dominik@gmail.com> + + * org.el (org-closest-date): Fix bug with yearly repeats, in + combination with preference of the past as it is used for deadline + and scheduling search. + + * org-exp.el (org-html-handle-time-stamps): No longer check for + the `org-export-with-timestamps' option, because the preprocesser + has taken care of this already. + + * org.el (org-entry-properties): Catch the case when this is + called in a non-org-mode file. + + * org-export-latex.el (org-export-latex-remove-from-headlines): + Variable made obsolete, also LaTeX export now uses the standard + variables. + (org-export-as-latex): Add the timestamps parameter to the + preprocessor parameter list. + (org-export-latex-content): Export the remaining keywords without + considering to remove them. + (org-export-latex-keywords-maybe): Make the REMOVE-LIST optional. + Use bold font instead of tt font for the keywords. + (org-export-latex-fontify-headline): Format headlines, assuming + that all keywords still present should be published. + (org-export-latex-keywords): Remove argument TIMESTAMPS and just + publish what ever remains of the time stamps. + (org-export-latex-list-parameters): New option. + (org-export-latex-lists): Pass additional parameters to the list + converter. + + * org-exp.el (org-export-preprocess-string): Remove clock lines + and timestamps already in the preprocesor. + (org-export-remove-timestamps, org-export-remove-clock-lines): New + functions. + (org-export-as-ascii, org-export-as-html): Add the timestamps + parameter to the preprocessor parameter list. + + * org-list.el (org-list-parse-list): Parse for checkboxes. + (org-list-to-generic): Introduce and handle new parameters :cbon + and :cboff. + (org-list-to-latex, org-list-to-html, org-list-to-texinfo): Add + optional parameter PARAMS. + + * org-export-latex.el (org-export-latex-special-chars): Fix + problems with interpreting dollar signs. + (org-inside-latex-math-p): New function. + (org-export-latex-preprocess): Protect all the math fragments. + + * org.el (org-latex-regexps): Allow a dash after a dollar. + + * org-w3m.el (org-w3m-copy-for-org-mode): Always deactivate the + mark after copying. + + * org-agenda.el (org-run-agenda-series): Have series options set + when finalizing the agenda. + + * org-exp.el (org-export-format-source-code-or-example): Protect + the converted examples. + + * org.el (org-set-regexps-and-options): Fix the regexp + `org-complex-heading-regexp'. + +2009-01-25 Carsten Dominik <carsten.dominik@gmail.com> + + * org.el (org-edit-src-get-label-format): New function. + (org-coderef-label-format): New option. + (org-edit-src-code, org-edit-src-find-region-and-lang): Parse for + a label format specification and make sure it is used in the edit + buffer. + (org-edit-src-get-label-format): New function. + (org-store-link): Handle new coderef formats. + (org-link-search): Handle new coderef formats. + + * org-footnote.el (org-footnote-create-definition) + (org-footnote-goto-local-insertion-point): Make footnote insertion + work correctly when the "Footnotes" headline is the last line in + the buffer. + + * org.el (org-goto-marker-or-bmk): Expose context after jumping to + the location. + +2009-01-25 Carsten Dominik <carsten.dominik@gmail.com> + + * org-w3m.el (org-w3m): New customization group. + (org-w3m-deactivate-mark): New option. + (org-w3m-copy-for-org-mode): Deactivate region, unless the user + option say not to. + +2009-01-25 Carsten Dominik <carsten.dominik@gmail.com> + + * org.el (org-set-font-lock-defaults): Trigger footnote + fontification. + (org-activate-footnote-links): New function. + (org-activate-links): New entry `footnote'. + + * org-faces.el (org-footnote): New face. + +2009-01-25 Carsten Dominik <carsten.dominik@gmail.com> + + * org-macs.el (org-re): Handle the [:word:] class. + + * org-exp.el (org-export-preprocess-string): Call + `org-export-protect-colon-examples'. + (org-export-protect-colon-examples): Renamed from + `org-export-protect-examples', and scope limited to lines starting + with a colon. + +2009-01-25 Carsten Dominik <carsten.dominik@gmail.com> + + * org-exp.el (org-export-preprocess-string): Move the preprocess + hook to after turning on Org-mode. + (org-export-preprocess-after-include-files-hook) + (org-export-preprocess-after-tree-selection-hook) + (org-export-preprocess-before-backend-specifics-hook) + (org-export-preprocess-final-hook): New hooks. + (org-export-preprocess-string): Run the new hooks. + + * org.el (org-ctrl-c-minus): Fix indentation for new items. + + * org-footnote.el: New file. + + * org.el (org-footnote): Require footnote code. + (org-startup-options): Add new footnote options. + (org-mode-map): New keybindig for footnotes. + (org-ctrl-c-ctrl-c): Add function at footnotes. + (org-org-menu): New menu entries for footnotes. + + * org-export-latex.el (org-export-as-latex): Pass footnote + variable to preprocessor. + (org-export-latex-preprocess): Treat multiple references to a + footnote. + + * org-exp.el (org-export-preprocess-string): Call + `org-footnote-normalize'. + (org-export-as-ascii, org-export-as-html): Pass footnote variable + to preprocessor. + (org-export-as-html): Treat multiple references to a footnote. + +2009-01-25 Carsten Dominik <carsten.dominik@gmail.com> + + * org-export-latex.el (org-export-latex-links): Handle coderef + links. + + * org.el (org-bracket-link-analytic-regexp++): New variable. + (org-make-link-regexps): Initialize + `org-bracket-link-analytic-regexp++'. + (org-store-link): Implement special case in edit-src buffer. + (org-insert-link): No use of ide to insert stored links. + (org-link-search): Implement special case for coderefs. + + * org-exp.el (org-export-html-scripts): New constant. + (org-export-html-style-default): Add a new style for highlighted + code. + (org-export-code-refs): New variable. + (org-export-preprocess-string): Initialize `org-export-code-refs'. + Call `org-export-replace-src-segments-and-examples' + No longer call `org-export-protect-examples'. + (org-export-target-internal-links): Take care of coderef targets. + (org-export-last-code-line-counter-value): New variable. + (org-export-replace-src-segments-and-examples): Renamed from + `org-export-replace-src-segments', and modified. + (org-export-format-source-code-or-example): Renamed from + `org-export-format-source-code'. + (org-export-number-lines): New function. + (org-export-as-ascii, org-export-as-html): Handle coderef links. + 2009-01-23 Glenn Morris <rgm@gnu.org> * org-rmail.el (rmail-narrow-to-non-pruned-header): diff --git a/lisp/org/org-agenda.el b/lisp/org/org-agenda.el index d7a94d71e2b..698c6244ac4 100644 --- a/lisp/org/org-agenda.el +++ b/lisp/org/org-agenda.el @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.16 +;; Version: 6.19a ;; ;; This file is part of GNU Emacs. ;; @@ -81,6 +81,15 @@ This is done by leaving out unnecessary lines." :group 'org-agenda :type 'boolean) +(defcustom org-agenda-block-separator ?= + "The separator between blocks in the agenda. +If this is a string, it will be used as the separator, with a newline added. +If it is a character, it will be repeated to fill the window width." + :group 'org-agenda + :type '(choice + (character) + (string))) + (defgroup org-agenda-export nil "Options concerning exporting agenda views in Org-mode." :tag "Org Agenda Export" @@ -400,6 +409,18 @@ this one will be used." "Options concerning skipping parts of agenda files." :tag "Org Agenda Skip" :group 'org-agenda) +(defgroup org-agenda-daily/weekly nil + "Options concerning the daily/weekly agenda." + :tag "Org Agenda Daily/Weekly" + :group 'org-agenda) +(defgroup org-agenda-todo-list nil + "Options concerning the global todo list agenda view." + :tag "Org Agenda Todo List" + :group 'org-agenda) +(defgroup org-agenda-match-view nil + "Options concerning the general tags/property/todo match agenda view." + :tag "Org Agenda Match View" + :group 'org-agenda) (defvar org-agenda-archives-mode nil "Non-nil means, the agenda will include archived items. @@ -419,7 +440,7 @@ When nil, these trees are also scanned by agenda commands." When nil, the sublevels of a TODO entry are not checked, resulting in potentially much shorter TODO lists." :group 'org-agenda-skip - :group 'org-todo + :group 'org-agenda-todo-list :type 'boolean) (defcustom org-agenda-todo-ignore-with-date nil @@ -430,7 +451,7 @@ When this is set, it also covers deadlines and scheduled items, the settings of `org-agenda-todo-ignore-scheduled' and `org-agenda-todo-ignore-deadlines' will be ignored." :group 'org-agenda-skip - :group 'org-todo + :group 'org-agenda-todo-list :type 'boolean) (defcustom org-agenda-todo-ignore-scheduled nil @@ -439,7 +460,7 @@ The idea behind this is that by scheduling it, you have already taken care of this item. See also `org-agenda-todo-ignore-with-date'." :group 'org-agenda-skip - :group 'org-todo + :group 'org-agenda-todo-list :type 'boolean) (defcustom org-agenda-todo-ignore-deadlines nil @@ -448,7 +469,22 @@ Near means closer than `org-deadline-warning-days' days. The idea behind this is that such items will appear in the agenda anyway. See also `org-agenda-todo-ignore-with-date'." :group 'org-agenda-skip - :group 'org-todo + :group 'org-agenda-todo-list + :type 'boolean) + +(defcustom org-agenda-tags-todo-honor-ignore-options nil + "Non-nil means, honor todo-list ...ignore options also in tags-todo search. +The variables + `org-agenda-todo-ignore-with-date', + `org-agenda-todo-ignore-scheduled' + `org-agenda-todo-ignore-deadlines' +make the global TODO list skip entries that have time stamps of certain +kinds. If this option is set, the same options will also apply for the +tags-todo search, which is the general tags/property matcher +restricted to unfinished TODO entries only." + :group 'org-agenda-skip + :group 'org-agenda-todo-list + :group 'org-agenda-match-view :type 'boolean) (defcustom org-agenda-skip-scheduled-if-done nil @@ -458,6 +494,7 @@ it applies only to the actual date of the scheduling. Warnings about an item with a past scheduling dates are always turned off when the item is DONE." :group 'org-agenda-skip + :group 'org-agenda-daily/weekly :type 'boolean) (defcustom org-agenda-skip-deadline-if-done nil @@ -467,11 +504,13 @@ This is relevant for the daily/weekly agenda. And it applied only to the actually date of the deadline. Warnings about approaching and past-due deadlines are always turned off when the item is DONE." :group 'org-agenda-skip + :group 'org-agenda-daily/weekly :type 'boolean) (defcustom org-agenda-skip-timestamp-if-done nil "Non-nil means don't select item by timestamp or -range if it is DONE." :group 'org-agenda-skip + :group 'org-agenda-daily/weekly :type 'boolean) (defcustom org-timeline-show-empty-dates 3 @@ -550,11 +589,6 @@ option will be ignored.." :group 'org-agenda-windows :type 'boolean) -(defgroup org-agenda-daily/weekly nil - "Options concerning the daily/weekly agenda." - :tag "Org Agenda Daily/Weekly" - :group 'org-agenda) - (defcustom org-agenda-ndays 7 "Number of days to include in overview display. Should be 1 or 7." @@ -631,7 +665,8 @@ and timeline buffers." (defcustom org-agenda-include-all-todo nil "Set means weekly/daily agenda will always contain all TODO entries. The TODO entries will be listed at the top of the agenda, before -the entries for specific days." +the entries for specific days. +This option is deprecated, it is better to define a block agenda instead." :group 'org-agenda-daily/weekly :type 'boolean) @@ -991,7 +1026,6 @@ or a list like `(:background \"Red\")'." (list (character :tag "Priority" :value ?A) (sexp :tag "face"))))) - (defgroup org-agenda-column-view nil "Options concerning column view in the agenda." :tag "Org Agenda Column View" @@ -1057,7 +1091,8 @@ works you probably want to add it to `org-agenda-custom-commands' for good." (defvar org-agenda-show-log nil) (defvar org-agenda-redo-command nil) (defvar org-agenda-query-string nil) -(defvar org-agenda-mode-hook nil) +(defvar org-agenda-mode-hook nil + "Hook for org-agenda-mode, run after the mode is turned on.") (defvar org-agenda-type nil) (defvar org-agenda-force-single-file nil) @@ -1712,7 +1747,7 @@ s Search for keywords C Configure custom agenda commands (widen) (setq org-agenda-redo-command redo) (goto-char (point-min))) - (org-finalize-agenda)) + (org-let (nth 1 series) '(org-finalize-agenda))) ;;;###autoload (defmacro org-batch-agenda (cmd-key &rest parameters) @@ -2040,7 +2075,11 @@ VALUE defaults to t." (setq buffer-read-only nil) (goto-char (point-max)) (unless (or (bobp) org-agenda-compact-blocks) - (insert "\n" (make-string (window-width) ?=) "\n")) + (insert "\n" + (if (stringp org-agenda-block-separator) + org-agenda-block-separator + (make-string (window-width) org-agenda-block-separator)) + "\n")) (narrow-to-region (point) (point-max))) (org-agenda-reset-markers) (setq org-agenda-contributing-files nil) @@ -3234,13 +3273,7 @@ the documentation of `org-diary'." (save-match-data (beginning-of-line) (setq beg (point) end (progn (outline-next-heading) (point))) - (when (or (and org-agenda-todo-ignore-with-date (goto-char beg) - (re-search-forward org-ts-regexp end t)) - (and org-agenda-todo-ignore-scheduled (goto-char beg) - (re-search-forward org-scheduled-time-regexp end t)) - (and org-agenda-todo-ignore-deadlines (goto-char beg) - (re-search-forward org-deadline-time-regexp end t) - (org-deadline-close (match-string 1)))) + (when (org-agenda-check-for-timestamp-as-reason-to-ignore-todo-item end) (goto-char (1+ beg)) (or org-agenda-todo-list-sublevels (org-end-of-subtree 'invisible)) (throw :skip nil))) @@ -3263,6 +3296,22 @@ the documentation of `org-diary'." (org-end-of-subtree 'invisible)))) (nreverse ee))) +;;;###autoload +(defun org-agenda-check-for-timestamp-as-reason-to-ignore-todo-item (&optional end) + "Do we have a reason to ignore this todo entry because it has a time stamp?" + (when (or org-agenda-todo-ignore-with-date + org-agenda-todo-ignore-scheduled + org-agenda-todo-ignore-deadlines) + (setq end (or end (save-excursion (outline-next-heading) (point)))) + (save-excursion + (or (and org-agenda-todo-ignore-with-date + (re-search-forward org-ts-regexp end t)) + (and org-agenda-todo-ignore-scheduled + (re-search-forward org-scheduled-time-regexp end t)) + (and org-agenda-todo-ignore-deadlines + (re-search-forward org-deadline-time-regexp end t) + (org-deadline-close (match-string 1))))))) + (defconst org-agenda-no-heading-message "No heading for this item in buffer or region.") diff --git a/lisp/org/org-archive.el b/lisp/org/org-archive.el index 530a052e21b..baddac4abe7 100644 --- a/lisp/org/org-archive.el +++ b/lisp/org/org-archive.el @@ -5,7 +5,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.16 +;; Version: 6.19a ;; ;; This file is part of GNU Emacs. ;; @@ -102,18 +102,19 @@ information." (t org-archive-location (match-string 1))))))) (defun org-add-archive-files (files) - "Splice the archive files into the list f files. + "Splice the archive files into the list of files. This implies visiting all these files and finding out what the archive file is." - (apply - 'append - (mapcar - (lambda (f) - (if (not (file-exists-p f)) - nil - (with-current-buffer (org-get-agenda-file-buffer f) - (cons f (org-all-archive-files))))) - files))) + (org-uniquify + (apply + 'append + (mapcar + (lambda (f) + (if (not (file-exists-p f)) + nil + (with-current-buffer (org-get-agenda-file-buffer f) + (cons f (org-all-archive-files))))) + files)))) (defun org-all-archive-files () "Get a list of all archive files used in the current buffer." @@ -150,7 +151,8 @@ if LOCATION is not given, the value of `org-archive-location' is used." if LOCATION is not given, the value of `org-archive-location' is used." (setq location (or location org-archive-location)) (if (string-match "\\(.*\\)::\\(.*\\)" location) - (match-string 2 location))) + (format (match-string 2 location) + (file-name-nondirectory buffer-file-name)))) (defun org-archive-subtree (&optional find-done) "Move the current subtree to the archive. @@ -304,7 +306,8 @@ this heading." (message "Subtree archived %s" (if (eq this-buffer buffer) (concat "under heading: " heading) - (concat "in file: " (abbreviate-file-name afile))))))) + (concat "in file: " (abbreviate-file-name afile)))))) + (org-reveal)) (defun org-archive-to-archive-sibling () "Archive the current heading by moving it under the archive sibling. @@ -355,7 +358,8 @@ sibling does not exist, it will be created at the end of the subtree." (outline-up-heading 1 t) (hide-subtree) (org-cycle-show-empty-lines 'folded) - (goto-char pos)))) + (goto-char pos))) + (org-reveal)) (defun org-archive-all-done (&optional tag) "Archive sublevels of the current tree without open TODO items. diff --git a/lisp/org/org-attach.el b/lisp/org/org-attach.el index d2685b52827..9ee6af64efe 100644 --- a/lisp/org/org-attach.el +++ b/lisp/org/org-attach.el @@ -4,7 +4,7 @@ ;; Author: John Wiegley <johnw@newartisans.com> ;; Keywords: org data task -;; Version: 6.16 +;; Version: 6.19a ;; This file is part of GNU Emacs. ;; @@ -64,7 +64,9 @@ where the Org file lives." (defcustom org-attach-file-list-property "Attachments" "The property used to keep a list of attachment belonging to this entry. -This is not really needed, so you may set this to nil if you don't want it." +This is not really needed, so you may set this to nil if you don't want it. +Also, for entries where children inherit the directory, the list of +attachments is not kept in this property." :group 'org-attach :type '(choice (const :tag "None" nil) @@ -89,6 +91,15 @@ ln create a hard link. Note that this is not supported :group 'org-attach :type 'boolean) +(defcustom org-attach-allow-inheritance t + "Non-nil means, allow attachment directories be inherited." + :group 'org-attach + :type 'boolean) + + +(defvar org-attach-inherited nil + "Indicates if the last access to the attachment directory was inherited.") + ;;;###autoload (defun org-attach () "The dispatcher for attachment commands. @@ -124,7 +135,10 @@ F Like \"f\", but force using dired in Emacs. d Delete one attachment, you will be prompted for a file name. D Delete all of a task's attachments. A safer way is - to open the directory in dired and delete from there."))) + to open the directory in dired and delete from there. + +s Set a specific attachment directory for this entry. +i Make children of the current entry inherit its attachment directory."))) (org-fit-window-to-buffer (get-buffer-window "*Org Attach*")) (message "Select command: [acmlzoOfFdD]") (setq c (read-char-exclusive)) @@ -147,29 +161,81 @@ D Delete all of a task's attachments. A safer way is 'org-attach-delete-one)) ((eq c ?D) (call-interactively 'org-attach-delete-all)) ((eq c ?q) (message "Abort")) + ((memq c '(?s ?\C-s)) (call-interactively + 'org-attach-set-directory)) + ((memq c '(?i ?\C-i)) (call-interactively + 'org-attach-set-inherit)) (t (error "No such attachment command %c" c)))))) (defun org-attach-dir (&optional create-if-not-exists-p) "Return the directory associated with the current entry. +This first checks for a local property ATTACH_DIR, and then for an inherited +property ATTACH_DIR_INHERIT. If neither exists, the default mechanism +using the entry ID will be invoked to access the unique directory for the +current entry. If the directory does not exist and CREATE-IF-NOT-EXISTS-P is non-nil, -the directory and the corresponding ID will be created." - (when (and (not (buffer-file-name (buffer-base-buffer))) - (not (file-name-absolute-p org-attach-directory))) - (error "Need absolute `org-attach-directory' to attach in buffers without filename.")) - (let ((uuid (org-id-get (point) create-if-not-exists-p))) - (when (or uuid create-if-not-exists-p) - (unless uuid - (error "ID retrieval/creation failed")) - (let ((attach-dir (expand-file-name - (format "%s/%s" - (substring uuid 0 2) - (substring uuid 2)) - (expand-file-name org-attach-directory)))) - (if (and create-if-not-exists-p - (not (file-directory-p attach-dir))) - (make-directory attach-dir t)) - (and (file-exists-p attach-dir) - attach-dir))))) +the directory and (if necessary) the corresponding ID will be created." + (let (attach-dir uuid inherit) + (setq org-attach-inherited (org-entry-get nil "ATTACH_DIR_INHERIT")) + (cond + ((setq attach-dir (org-entry-get nil "ATTACH_DIR")) + (org-attach-check-absolute-path attach-dir)) + ((and org-attach-allow-inheritance + (setq inherit (org-entry-get nil "ATTACH_DIR_INHERIT" t))) + (setq attach-dir + (save-excursion + (save-restriction + (widen) + (goto-char org-entry-property-inherited-from) + (let (org-attach-allow-inheritance) + (org-attach-dir create-if-not-exists-p))))) + (org-attach-check-absolute-path attach-dir) + (setq org-attach-inherited t)) + (t ; use the ID + (org-attach-check-absolute-path nil) + (setq uuid (org-id-get (point) create-if-not-exists-p)) + (when (or uuid create-if-not-exists-p) + (unless uuid (error "ID retrieval/creation failed")) + (setq attach-dir (expand-file-name + (format "%s/%s" + (substring uuid 0 2) + (substring uuid 2)) + (expand-file-name org-attach-directory)))))) + (when attach-dir + (if (and create-if-not-exists-p + (not (file-directory-p attach-dir))) + (make-directory attach-dir t)) + (and (file-exists-p attach-dir) + attach-dir)))) + +(defun org-attach-check-absolute-path (dir) + "Check if we have enough information to root the atachment directory. +When DIR is given, check also if it is already absolute. Otherwise, +assume that it will be relative, and check if `org-attach-directory' is +absolute, or if at least the current buffer has a file name. +Throw an error if we cannot root the directory." + (or (and dir (file-name-absolute-p dir)) + (file-name-absolute-p org-attach-directory) + (buffer-file-name (buffer-base-buffer)) + (error "Need absolute `org-attach-directory' to attach in buffers without filename."))) + +(defun org-attach-set-directory () + "Set the ATTACH_DIR property of the current entry. +The property defines the directory that is used for attachments +of the entry." + (interactive) + (let ((dir (org-entry-get nil "ATTACH_DIR"))) + (setq dir (read-directory-name "Attachment directory: " dir)) + (org-entry-put nil "ATTACH_DIR" dir))) + +(defun org-attach-set-inherit () + "Set the ATTACH_DIR_INHERIT property of the current entry. +The property defines the directory that is used for attachments +of the entry and any children that do not explicitly define (by setting +the ATTACH_DIR property) their own attachment directory." + (interactive) + (org-entry-put nil "ATTACH_DIR_INHERIT" "t") + (message "Children will inherit attachment directory")) (defun org-attach-commit () "Commit changes to git if `org-attach-directory' is properly initialized. @@ -200,7 +266,7 @@ METHOD may be `cp', `mv', or `ln', default taken from `org-attach-method'." (interactive "fFile to keep as an attachment: \nP") (setq method (or method org-attach-method)) (let ((basename (file-name-nondirectory file))) - (when org-attach-file-list-property + (when (and org-attach-file-list-property (not org-attach-inherited)) (org-entry-add-to-multivalued-property (point) org-attach-file-list-property basename)) (let* ((attach-dir (org-attach-dir t)) @@ -234,7 +300,7 @@ On some systems, this apparently does copy the file instead." "Create a new attachment FILE for the current task. The attachment is created as an Emacs buffer." (interactive "sCreate attachment named: ") - (when org-attach-file-list-property + (when (and org-attach-file-list-property (not org-attach-inherited)) (org-entry-add-to-multivalued-property (point) org-attach-file-list-property file)) (let ((attach-dir (org-attach-dir t))) @@ -263,7 +329,7 @@ The attachment is created as an Emacs buffer." This actually deletes the entire attachment directory. A safer way is to open the directory in dired and delete from there." (interactive "P") - (when org-attach-file-list-property + (when (and org-attach-file-list-property (not org-attach-inherited)) (org-entry-delete (point) org-attach-file-list-property)) (let ((attach-dir (org-attach-dir))) (when @@ -280,7 +346,7 @@ A safer way is to open the directory in dired and delete from there." This can be used after files have been added externally." (interactive) (org-attach-commit) - (when org-attach-file-list-property + (when (and org-attach-file-list-property (not org-attach-inherited)) (org-entry-delete (point) org-attach-file-list-property)) (let ((attach-dir (org-attach-dir))) (when attach-dir diff --git a/lisp/org/org-bbdb.el b/lisp/org/org-bbdb.el index 18ca2b448b9..b925151743f 100644 --- a/lisp/org/org-bbdb.el +++ b/lisp/org/org-bbdb.el @@ -7,7 +7,7 @@ ;; Thomas Baumann <thomas dot baumann at ch dot tum dot de> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.16 +;; Version: 6.19a ;; ;; This file is part of GNU Emacs. ;; diff --git a/lisp/org/org-bibtex.el b/lisp/org/org-bibtex.el index b95b22918ee..0df5d4a05ac 100644 --- a/lisp/org/org-bibtex.el +++ b/lisp/org/org-bibtex.el @@ -5,7 +5,7 @@ ;; Author: Bastien Guerry <bzg at altern dot org> ;; Carsten Dominik <carsten dot dominik at gmail dot com> ;; Keywords: org, wp, remember -;; Version: 6.16 +;; Version: 6.19a ;; ;; This file is part of GNU Emacs. ;; diff --git a/lisp/org/org-clock.el b/lisp/org/org-clock.el index 575a0ea76d0..21f2dab4fee 100644 --- a/lisp/org/org-clock.el +++ b/lisp/org/org-clock.el @@ -5,7 +5,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.16 +;; Version: 6.19a ;; ;; This file is part of GNU Emacs. ;; @@ -140,7 +140,7 @@ load." (defvar org-mode-line-string "") (put 'org-mode-line-string 'risky-local-variable t) -(defvar org-mode-line-timer nil) +(defvar org-clock-mode-line-timer nil) (defvar org-clock-heading "") (defvar org-clock-heading-for-remember "") (defvar org-clock-start-time "") @@ -156,8 +156,8 @@ of a different task.") (defvar org-clock-interrupted-task (make-marker) "Marker pointing to the task that has been interrupted by the current clock.") -(defvar org-clock-mode-map (make-sparse-keymap)) -(define-key org-clock-mode-map [mode-line mouse-2] 'org-clock-goto) +(defvar org-clock-mode-line-map (make-sparse-keymap)) +(define-key org-clock-mode-line-map [mode-line mouse-2] 'org-clock-goto) (defun org-clock-history-push (&optional pos buffer) "Push a marker to the clock history." @@ -241,7 +241,7 @@ of a different task.") (insert (format "[%c] %-15s %s\n" i cat task)) (cons i marker))))) -(defun org-update-mode-line () +(defun org-clock-update-mode-line () (let* ((delta (- (time-to-seconds (current-time)) (time-to-seconds org-clock-start-time))) (h (floor delta 3600)) @@ -256,7 +256,7 @@ of a different task.") (org-propertize (substring clock-string 0 org-clock-string-limit) 'help-echo (concat help-text ": " org-clock-heading)) (org-propertize clock-string 'help-echo help-text))) - 'local-map org-clock-mode-map + 'local-map org-clock-mode-line-map 'mouse-face (if (featurep 'xemacs) 'highlight 'mode-line-highlight))) (force-mode-line-update))) @@ -363,9 +363,9 @@ the clocking selection, associated with the letter `d'." (or (memq 'org-mode-line-string global-mode-string) (setq global-mode-string (append global-mode-string '(org-mode-line-string)))) - (org-update-mode-line) - (setq org-mode-line-timer - (run-with-timer 60 60 'org-update-mode-line)) + (org-clock-update-mode-line) + (setq org-clock-mode-line-timer + (run-with-timer 60 60 'org-clock-update-mode-line)) (message "Clock started at %s" ts))))))) (defun org-clock-find-position () @@ -463,9 +463,9 @@ If there is no running clock, throw an error, unless FAIL-QUIETLY is set." (when org-log-note-clock-out (org-add-log-setup 'clock-out nil nil nil (concat "# Task: " (org-get-heading t) "\n\n"))) - (when org-mode-line-timer - (cancel-timer org-mode-line-timer) - (setq org-mode-line-timer nil)) + (when org-clock-mode-line-timer + (cancel-timer org-clock-mode-line-timer) + (setq org-clock-mode-line-timer nil)) (setq global-mode-string (delq 'org-mode-line-string global-mode-string)) (force-mode-line-update) @@ -562,7 +562,7 @@ Puts the resulting times in minutes as a text property on each headline." If TOTAL-ONLY is non-nil, only show the total time for the entire file in the echo area." (interactive) - (org-remove-clock-overlays) + (org-clock-remove-overlays) (let (time h m p) (org-clock-sum) (unless total-only @@ -574,19 +574,19 @@ in the echo area." (point) :org-clock-minutes))) (goto-char p) (when (setq time (get-text-property p :org-clock-minutes)) - (org-put-clock-overlay time (funcall outline-level)))) + (org-clock-put-overlay time (funcall outline-level)))) (setq h (/ org-clock-file-total-minutes 60) m (- org-clock-file-total-minutes (* 60 h))) ;; Arrange to remove the overlays upon next change. (when org-remove-highlights-with-change - (org-add-hook 'before-change-functions 'org-remove-clock-overlays + (org-add-hook 'before-change-functions 'org-clock-remove-overlays nil 'local)))) (message (concat "Total file time: " org-time-clocksum-format " (%d hours and %d minutes)") h m h m))) (defvar org-clock-overlays nil) (make-variable-buffer-local 'org-clock-overlays) -(defun org-put-clock-overlay (time &optional level) +(defun org-clock-put-overlay (time &optional level) "Put an overlays on the current line, displaying TIME. If LEVEL is given, prefix time with a corresponding number of stars. This creates a new overlay and stores it in `org-clock-overlays', so that it @@ -605,7 +605,7 @@ will be easy to remove." (org-add-props (format fmt (make-string l ?*) h m (make-string (- 16 l) ?\ )) - '(face secondary-selection)) + (list 'face 'org-clock-overlay)) "")) (if (not (featurep 'xemacs)) (org-overlay-put ov 'display tx) @@ -613,7 +613,7 @@ will be easy to remove." (org-overlay-put ov 'end-glyph (make-glyph tx))) (push ov org-clock-overlays))) -(defun org-remove-clock-overlays (&optional beg end noremove) +(defun org-clock-remove-overlays (&optional beg end noremove) "Remove the occur highlights from the buffer. BEG and END are ignored. If NOREMOVE is nil, remove this function from the `before-change-functions' in the current buffer." @@ -623,7 +623,7 @@ from the `before-change-functions' in the current buffer." (setq org-clock-overlays nil) (unless noremove (remove-hook 'before-change-functions - 'org-remove-clock-overlays 'local)))) + 'org-clock-remove-overlays 'local)))) (defvar state) ;; dynamically scoped into this function (defun org-clock-out-if-current () @@ -671,7 +671,7 @@ will be updated. If not, a new clocktable will be inserted. When called with a prefix argument, move to the first clock table in the buffer and update it." (interactive "P") - (org-remove-clock-overlays) + (org-clock-remove-overlays) (when arg (org-find-dblock "clocktable") (org-show-entry)) diff --git a/lisp/org/org-colview.el b/lisp/org/org-colview.el index 28caefad800..8f7b56b431b 100644 --- a/lisp/org/org-colview.el +++ b/lisp/org/org-colview.el @@ -5,7 +5,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.16 +;; Version: 6.19a ;; ;; This file is part of GNU Emacs. ;; @@ -594,7 +594,7 @@ an integer, select that value." This respects the format of the time stamp in S, active or non-active, and also including time or not. S must be just a time stamp, no text around it." - (when (string-match (concat "^" org-ts-regexp3 "$") s) + (when (and s (string-match (concat "^" org-ts-regexp3 "$") s)) (let* ((time (org-parse-time-string s 'nodefaults)) (active (equal (string-to-char s) ?<)) (fmt (funcall (if (nth 1 time) 'cdr 'car) org-time-stamp-formats)) @@ -1067,10 +1067,12 @@ PARAMS is a property list of parameters: :width enforce same column widths with <N> specifiers. :id the :ID: property of the entry where the columns view - should be built, as a string. When `local', call locally. + should be built. When the symbol `local', call locally. When `global' call column view with the cursor at the beginning of the buffer (usually this means that the whole buffer switches - to column view). + to column view). When \"file:path/to/file.org\", invoke column + view at the start of that file. Otherwise, the ID is located + using `org-id-find'. :hlines When t, insert a hline before each item. When a number, insert a hline before each level <= that number. :vlines When t, make each column a colgroup to enforce vertical lines. @@ -1083,20 +1085,38 @@ PARAMS is a property list of parameters: (maxlevel (plist-get params :maxlevel)) (content-lines (org-split-string (plist-get params :content) "\n")) (skip-empty-rows (plist-get params :skip-empty-rows)) - tbl id idpos nfields tmp recalc line) - (save-excursion - (save-restriction - (when (setq id (plist-get params :id)) - (cond ((not id) nil) - ((eq id 'global) (goto-char (point-min))) - ((eq id 'local) nil) - ((setq idpos (org-find-entry-with-id id)) - (goto-char idpos)) - (t (error "Cannot find entry with :ID: %s" id)))) - (org-columns) - (setq tbl (org-columns-capture-view maxlevel skip-empty-rows)) - (setq nfields (length (car tbl))) - (org-columns-quit))) + tbl id idpos nfields tmp recalc line + id-as-string view-file view-pos) + (when (setq id (plist-get params :id)) + (setq id-as-string (cond ((numberp id) (number-to-string id)) + ((symbolp id) (symbol-name id)) + ((stringp id) id) + (t ""))) + (cond ((not id) nil) + ((eq id 'global) (setq view-pos (point-min))) + ((eq id 'local)) + ((string-match "^file:\\(.*\\)" id-as-string) + (setq view-file (match-string 1 id-as-string) + view-pos 1) + (unless (file-exists-p view-file) + (error "No such file: \"%s\"" id-as-string))) + ((setq idpos (org-find-entry-with-id id)) + (setq view-pos idpos)) + ((setq idpos (org-id-find id)) + (setq view-file (car idpos)) + (setq view-pos (cdr idpos))) + (t (error "Cannot find entry with :ID: %s" id)))) + (with-current-buffer (if view-file + (get-file-buffer view-file) + (current-buffer)) + (save-excursion + (save-restriction + (widen) + (goto-char (or view-pos (point))) + (org-columns) + (setq tbl (org-columns-capture-view maxlevel skip-empty-rows)) + (setq nfields (length (car tbl))) + (org-columns-quit)))) (goto-char pos) (move-marker pos nil) (when tbl @@ -1108,7 +1128,9 @@ PARAMS is a property list of parameters: (if (string-match "\\` *\\(\\*+\\)" (caar tbl)) (if (and (not (eq (car tmp) 'hline)) (or (eq hlines t) - (and (numberp hlines) (<= (- (match-end 1) (match-beginning 1)) hlines)))) + (and (numberp hlines) + (<= (- (match-end 1) (match-beginning 1)) + hlines)))) (push 'hline tmp))) (push (pop tbl) tmp))) (setq tbl (nreverse tmp))) diff --git a/lisp/org/org-compat.el b/lisp/org/org-compat.el index bd9e86bfabb..0703d72301f 100644 --- a/lisp/org/org-compat.el +++ b/lisp/org/org-compat.el @@ -5,7 +5,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.16 +;; Version: 6.19a ;; ;; This file is part of GNU Emacs. ;; @@ -157,7 +157,9 @@ WINDOW defaults to the selected window. MAX-HEIGHT and MIN-HEIGHT are passed through to `fit-window-to-buffer'. If SHRINK-ONLY is set, call `shrink-window-if-larger-than-buffer' instead, the hight limit are ignored in this case." - (cond ((> (frame-width) (window-width window)) + (cond ((if (fboundp 'window-full-width-p) + (not (window-full-width-p window)) + (> (frame-width) (window-width window))) ;; do nothing if another window would suffer ) ((and (fboundp 'fit-window-to-buffer) (not shrink-only)) @@ -287,6 +289,15 @@ that can be added." (org-no-properties (substring string (or from 0) to)) (substring-no-properties string from to))) +(defun org-count-lines (s) + "How many lines in string S?" + (let ((start 0) (n 1)) + (while (string-match "\n" s start) + (setq start (match-end 0) n (1+ n))) + (if (and (> (length s) 0) (= (aref s (1- (length s))) ?\n)) + (setq n (1- n))) + n)) + (provide 'org-compat) ;; arch-tag: a0a0579f-e68c-4bdf-9e55-93768b846bbe diff --git a/lisp/org/org-exp.el b/lisp/org/org-exp.el index 8bb77c926c8..0a888746c8c 100644 --- a/lisp/org/org-exp.el +++ b/lisp/org/org-exp.el @@ -5,7 +5,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.16 +;; Version: 6.19a ;; ;; This file is part of GNU Emacs. ;; @@ -34,6 +34,7 @@ (declare-function org-agenda-skip "org-agenda" ()) (declare-function org-infojs-options-inbuffer-template "org-jsinfo" ()) (declare-function htmlize-region "ext:htmlize" (beg end)) +(declare-function org-id-find-id-file "org-id" (id)) (defvar htmlize-buffer-places) ; from htmlize.el (defgroup org-export nil @@ -298,6 +299,24 @@ drawer names to export." "Hook for preprocessing an export buffer. Pretty much the first thing when exporting is running this hook.") +(defvar org-export-preprocess-after-include-files-hook nil + "Hook for preprocessing an export buffer. +This is run after the contents of included files have been inserted.") + +(defvar org-export-preprocess-after-tree-selection-hook nil + "Hook for preprocessing an export buffer. +This is run after selection of trees to be exported has happened. +This selection includes tags-based selection, as well as removal +of commented and archived trees.") + +(defvar org-export-preprocess-before-backend-specifics-hook nil + "Hook run before backend-specific functions are called during preprocessing.") + +(defvar org-export-preprocess-final-hook nil + "Hook for preprocessing an export buffer. +This is run as the last thing in the preprocessing buffer, just before +returning the buffer string to the backend.") + (defgroup org-export-translation nil "Options for translating special ascii sequences for the export backends." :tag "Org Export Translation" @@ -381,7 +400,7 @@ This option can also be set with the +OPTIONS line, e.g. \"-:nil\"." (defcustom org-export-with-TeX-macros t "Non-nil means, interpret simple TeX-like macros when exporting. For example, HTML export converts \\alpha to α and \\AA to Å. -No only real TeX macros will work here, but the standard HTML entities +Not only real TeX macros will work here, but the standard HTML entities for math can be used as macro names as well. For a list of supported names in HTML export, see the constant `org-html-entities'. Not all export backends support this. @@ -522,6 +541,31 @@ Org-mode file." :group 'org-export-html :type '(string :tag "File or URL")) +(defconst org-export-html-scripts +"<script type=\"text/javascript\"> +<!--/*--><![CDATA[/*><!--*/ + function CodeHighlightOn(elem, id) + { + var target = document.getElementById(id); + if(null != target) { + elem.cacheClassElem = elem.className; + elem.cacheClassTarget = target.className; + target.className = \"code-highlighted\"; + elem.className = \"code-highlighted\"; + } + } + function CodeHighlightOff(elem, id) + { + var target = document.getElementById(id); + if(elem.cacheClassElem) + elem.className = elem.cacheClassElem; + if(elem.cacheClassTarget) + target.className = elem.cacheClassTarget; + } +/*]]>*/--> +</script>" +"Basic javascript that is needed by HTML files produced by Org-mode.") + (defconst org-export-html-style-default "<style type=\"text/css\"> <!--/*--><![CDATA[/*><!--*/ @@ -547,6 +591,8 @@ Org-mode file." dt { font-weight: bold; } div.figure { padding: 0.5em; } div.figure p { text-align: center; } + .linenr { font-size:smaller } + .code-highlighted {background-color:#ffff00;} .org-info-js_info-navigation { border-style:none; } #org-info-js_console-label { font-size:10px; font-weight:bold; white-space:nowrap; } @@ -647,6 +693,12 @@ be linked only." (const :tag "Always" t) (const :tag "When there is no description" maybe))) +(defcustom org-export-html-inline-image-extensions + '("png" "jpeg" "jpg" "gif") + "Extensions of image files that can be inlined into HTML." + :group 'org-export-html + :type '(repeat (string :tag "Extension"))) + ;; FIXME: rename (defcustom org-export-html-expand t "Non-nil means, for HTML export, treat @<...> as HTML tag. @@ -1422,6 +1474,8 @@ translations. There is currently no way for users to extend this.") (defvar org-export-target-aliases nil "Alist of targets with invisible aliases.") +(defvar org-export-code-refs nil + "Alist of code references and line numbers") (defun org-export-preprocess-string (string &rest parameters) "Cleanup STRING so that that the true exported has a more consistent source. @@ -1442,13 +1496,12 @@ on this string to produce the exported version." target-alist rtn) (setq org-export-target-aliases nil) + (setq org-export-code-refs nil) (with-current-buffer (get-buffer-create " org-mode-tmp") (erase-buffer) (insert string) (setq case-fold-search t) - ;; Call the hook - (run-hooks 'org-export-preprocess-hook) ;; Remove license-to-kill stuff ;; The caller marks some stuff for killing, stuff that has been @@ -1457,17 +1510,36 @@ on this string to produce the exported version." (let ((org-inhibit-startup t)) (org-mode)) (setq case-fold-search t) + + ;; Call the hook + (run-hooks 'org-export-preprocess-hook) + (untabify (point-min) (point-max)) - ;; Handle include files + ;; Handle include files, and call a hook (org-export-handle-include-files) + (run-hooks 'org-export-preprocess-after-include-files-hook) - ;; Get rid of excluded trees + ;; Get rid of archived trees + (org-export-remove-archived-trees archived-trees) + + ;; Remove comment environment and comment subtrees + (org-export-remove-comment-blocks-and-subtrees) + + ;; Get rid of excluded trees, and call a hook (org-export-handle-export-tags (plist-get parameters :select-tags) (plist-get parameters :exclude-tags)) + (run-hooks 'org-export-preprocess-after-tree-selection-hook) ;; Handle source code snippets - (org-export-replace-src-segments) + (org-export-replace-src-segments-and-examples backend) + + ;; Protect short examples marked by a leading colon + (org-export-protect-colon-examples) + + ;; Normalize footnotes + (when (plist-get parameters :footnotes) + (org-footnote-normalize nil t)) ;; Find all headings and compute the targets for them (setq target-alist (org-export-define-heading-targets target-alist)) @@ -1487,9 +1559,6 @@ on this string to produce the exported version." (goto-char (point-min)) (insert (plist-get parameters :add-text) "\n")) - ;; Get rid of archived trees - (org-export-remove-archived-trees archived-trees) - ;; Remove todo-keywords before exporting, if the user has requested so (org-export-remove-headline-metadata parameters) @@ -1497,10 +1566,8 @@ on this string to produce the exported version." ;; but mark them as targets that should be invisible (setq target-alist (org-export-handle-invisible-targets target-alist)) - ;; Protect examples - (org-export-protect-examples (if asciip 'indent nil)) - - ;; Protect backend specific stuff, throw away the others. + ;; Select and protect backend specific stuff, throw away stuff + ;; that is specific for other backends (org-export-select-backend-specific-text backend) ;; Protect quoted subtrees @@ -1512,13 +1579,15 @@ on this string to produce the exported version." ;; Blockquotes and verse (org-export-mark-blockquote-and-verse) + ;; Remove timestamps, if the user has requested so + (org-export-remove-clock-lines) + (unless (plist-get parameters :timestamps) + (org-export-remove-timestamps)) + ;; Attach captions to the correct object (setq target-alist (org-export-attach-captions-and-attributes backend target-alist)) - ;; Remove comment environment and comment subtrees - (org-export-remove-comment-blocks-and-subtrees) - ;; Find matches for radio targets and turn them into internal links (org-export-mark-radio-links) @@ -1542,22 +1611,28 @@ on this string to produce the exported version." (when org-export-table-remove-special-lines (org-export-remove-special-table-lines)) - ;; Specific LaTeX stuff + ;; Another hook + (run-hooks 'org-export-preprocess-before-backend-specifics-hook) + + ;; LaTeX-specific preprocessing (when latexp (require 'org-export-latex nil) (org-export-latex-preprocess)) - ;; Specific ASCII stuff + ;; ASCII-specific preprocessing (when asciip (org-export-ascii-preprocess)) - ;; Specific HTML stuff + ;; HTML-specific preprocessing (when htmlp (org-export-html-preprocess parameters)) ;; Remove or replace comments (org-export-handle-comments (plist-get parameters :comments)) + ;; Run the final hook + (run-hooks 'org-export-preprocess-final-hook) + (setq rtn (buffer-string))) (kill-buffer " org-mode-tmp") rtn)) @@ -1578,16 +1653,24 @@ The new targets are added to TARGET-ALIST, which is also returned." (org-init-section-numbers) (let ((re (concat "^" org-outline-regexp "\\| [ \t]*:ID:[ \t]*\\([^ \t\r\n]+\\)")) - level target) + level target last-section-target a) (while (re-search-forward re nil t) (if (match-end 1) - (push (cons (org-match-string-no-properties 1) - target) target-alist) + (progn + (push (cons (org-match-string-no-properties 1) + target) target-alist) + (setq a (or (assoc last-section-target org-export-target-aliases) + (progn + (push (list last-section-target) + org-export-target-aliases) + (car org-export-target-aliases)))) + (push (caar target-alist) (cdr a))) (setq level (org-reduced-level (save-excursion (goto-char (point-at-bol)) (org-outline-level)))) (setq target (org-solidify-link-text (format "sec-%s" (org-section-number level)))) + (setq last-section-target target) (push (cons target target) target-alist) (add-text-properties (point-at-bol) (point-at-eol) @@ -1632,12 +1715,15 @@ the current file." (desc (match-end 2)) (link (org-link-unescape (match-string 1))) (slink (org-solidify-link-text link)) - found props pos + found props pos cref (target (cond ((cdr (assoc slink target-alist))) ((and (string-match "^id:" link) (cdr (assoc (substring link 3) target-alist)))) + ((string-match "^(\\(.*\\))$" link) + (setq cref (match-string 1 link)) + (concat "coderef:" cref)) ((string-match org-link-types-re link) nil) ((or (file-name-absolute-p link) (string-match "^\\." link)) @@ -1767,9 +1853,27 @@ from the buffer." (when (or (not todo) (not tags) (not pri)) (goto-char (point-min)) (while (re-search-forward re nil t) - (setq rpl (mapconcat (lambda (i) (if (match-end i) (match-string i) "")) - elts " ")) - (replace-match rpl t t))))) + (org-if-unprotected + (setq rpl (mapconcat (lambda (i) (if (match-end i) (match-string i) "")) + elts " ")) + (replace-match rpl t t)))))) + +(defun org-export-remove-timestamps () + "Remove timestamps and keywords for export." + (while (re-search-forward org-maybe-keyword-time-regexp nil t) + (backward-char 1) + (org-if-unprotected + (replace-match "") + (beginning-of-line 1) + (if (looking-at "[- \t]*\\(=>[- \t0-9:]*\\)?[ \t]*\n") + (replace-match ""))))) + +(defun org-export-remove-clock-lines () + "Remove timestamps and keywords for export." + (let ((re (concat "^[ \t]*" org-clock-string ".*\n?"))) + (while (re-search-forward re nil t) + (org-if-unprotected + (replace-match ""))))) (defun org-export-protect-quoted-subtrees () "Mark quoted subtrees with the protection property." @@ -1789,24 +1893,25 @@ from the buffer." '(org-protected t)) (goto-char (1+ (match-end 4))))) -(defun org-export-protect-examples (&optional indent) - "Protect code that should be exported as monospaced examples." - (goto-char (point-min)) - (while (re-search-forward "^#\\+BEGIN_EXAMPLE[ \t]*\n" nil t) - (goto-char (match-end 0)) - (while (and (not (looking-at "#\\+END_EXAMPLE")) (not (eobp))) - (insert (if indent ": " ":")) - (beginning-of-line 2))) +(defun org-export-protect-colon-examples () + "Protect lines starting with a colon." (goto-char (point-min)) - (while (re-search-forward "^[ \t]*:.*\\(\n[ \t]*:.*\\)*" nil t) - (add-text-properties (match-beginning 0) (match-end 0) - '(org-protected t)))) + (let ((re "^[ \t]*:\\([ \t]\\|$\\)") beg end) + (while (re-search-forward re nil t) + (beginning-of-line 1) + (setq beg (point)) + (while (looking-at re) + (end-of-line 1) + (or (eobp) (forward-char 1))) + (add-text-properties beg (if (bolp) (1- (point)) (point)) + '(org-protected t))))) (defun org-export-select-backend-specific-text (backend) (let ((formatters '((html "HTML" "BEGIN_HTML" "END_HTML") (ascii "ASCII" "BEGIN_ASCII" "END_ASCII") (latex "LaTeX" "BEGIN_LaTeX" "END_LaTeX"))) + (case-fold-search t) fmt) (while formatters @@ -1969,10 +2074,15 @@ When it is nil, all comments will be removed." (org-translate-link (org-link-expand-abbrev (match-string 1))))) (s (concat - "[[" xx "]" + "[[" (org-add-props (copy-sequence xx) + nil 'org-protected t) + "]" (if (match-end 3) (match-string 2) - (concat "[" xx "]")) + (concat "[" (org-add-props + (copy-sequence xx) + '(org-protected t)) + "]")) "]"))) (put-text-property 0 (length s) 'face 'org-link s) (replace-match s t t)))))) @@ -1993,8 +2103,10 @@ This is to make sure that the line-processing export backends can work correctly." (goto-char (point-min)) (while (re-search-forward org-emph-re nil t) - (if (not (= (char-after (match-beginning 3)) - (char-after (match-beginning 4)))) + (if (and (not (= (char-after (match-beginning 3)) + (char-after (match-beginning 4)))) + (save-excursion (goto-char (match-beginning 0)) + (save-match-data (not (org-at-table-p))))) (org-if-unprotected (subst-char-in-region (match-beginning 0) (match-end 0) ?\n ?\ t) @@ -2149,7 +2261,7 @@ TYPE must be a string, any of: (defun org-export-handle-include-files () "Include the contents of include files, with proper formatting." (let ((case-fold-search t) - params file markup lang start end prefix prefix1) + params file markup lang start end prefix prefix1 switches) (goto-char (point-min)) (while (re-search-forward "^#\\+INCLUDE:?[ \t]+\\(.*\\)" nil t) (setq params (read (concat "(" (match-string 1) ")")) @@ -2157,7 +2269,9 @@ TYPE must be a string, any of: prefix1 (org-get-and-remove-property 'params :prefix1) file (org-symname-or-string (pop params)) markup (org-symname-or-string (pop params)) - lang (org-symname-or-string (pop params))) + lang (and (member markup '("src" "SRC")) + (org-symname-or-string (pop params))) + switches (mapconcat '(lambda (x) (format "%s" x)) params " ")) (delete-region (match-beginning 0) (match-end 0)) (if (or (not file) (not (file-exists-p file)) @@ -2165,9 +2279,11 @@ TYPE must be a string, any of: (insert (format "CANNOT INCLUDE FILE %s" file)) (when markup (if (equal (downcase markup) "src") - (setq start (format "#+begin_src %s\n" (or lang "fundamental")) + (setq start (format "#+begin_src %s %s\n" + (or lang "fundamental") + (or switches "")) end "#+end_src") - (setq start (format "#+begin_%s\n" markup) + (setq start (format "#+begin_%s %s\n" markup switches) end (format "#+end_%s" markup)))) (insert (or start "")) (insert (org-get-file-contents (expand-file-name file) prefix prefix1)) @@ -2207,70 +2323,207 @@ in the list) and remove property and value from the list in LISTVAR." (if s (symbol-name s) s) s)) -;;; Fontification of code -;; Currently only for the HTML backend, but who knows.... -(defun org-export-replace-src-segments () +;;; Fontification and line numbers for code examples + +(defvar org-export-last-code-line-counter-value 0) + +(defun org-export-replace-src-segments-and-examples (backend) "Replace source code segments with special code for export." + (setq org-export-last-code-line-counter-value 0) (let ((case-fold-search t) - lang code trans) + lang code trans opts) (goto-char (point-min)) (while (re-search-forward - "^#\\+BEGIN_SRC:?[ \t]+\\([^ \t\n]+\\)[ \t]*\n\\([^\000]+?\n\\)#\\+END_SRC.*" + "\\(^#\\+BEGIN_SRC:?[ \t]+\\([^ \t\n]+\\)\\(.*\\)\n\\([^\000]+?\n\\)#\\+END_SRC.*\\)\\|\\(^#\\+BEGIN_EXAMPLE:?\\(?:[ \t]+\\(.*\\)\\)?\n\\([^\000]+?\n\\)#\\+END_EXAMPLE.*\\)" nil t) - (setq lang (match-string 1) code (match-string 2) - trans (org-export-format-source-code lang code)) + (if (match-end 1) + ;; src segments + (setq lang (match-string 2) + opts (match-string 3) + code (match-string 4)) + (setq lang nil + opts (match-string 6) + code (match-string 7))) + + (setq trans (org-export-format-source-code-or-example + backend lang code opts)) (replace-match trans t t)))) -(defvar htmlp) ;; dynamically scoped from org-exp.el +(defvar htmlp) ;; dynamically scoped +(defvar latexp) ;; dynamically scoped -(defun org-export-format-source-code (lang code) +(defun org-export-format-source-code-or-example (backend + lang code &optional opts) "Format CODE from language LANG and return it formatted for export. -Currently, this only does something for HTML export, for all other -backends, it converts the segment into an EXAMPLE segment." +If LANG is nil, do not add any fontification. +OPTS contains formatting optons, like `-n' for triggering numbering lines, +and `+n' for continuing previous numering. +Code formatting according to language currently only works for HTML. +Numbering lines works for all three major backends (html, latex, and ascii)." (save-match-data - (cond - (htmlp - ;; We are exporting to HTML - (require 'htmlize nil t) - (if (not (fboundp 'htmlize-region-for-paste)) - (progn + (let (num cont rtn named rpllbl keepp textareap cols rows fmt) + (setq opts (or opts "") + num (string-match "[-+]n\\>" opts) + cont (string-match "\\+n\\>" opts) + rpllbl (string-match "-r\\>" opts) + keepp (string-match "-k\\>" opts) + textareap (string-match "-t\\>" opts) + cols (if (string-match "-w[ \t]+\\([0-9]+\\)" opts) + (string-to-number (match-string 1 opts)) + 80) + rows (if (string-match "-h[ \t]+\\([0-9]+\\)" opts) + (string-to-number (match-string 1 opts)) + (org-count-lines code)) + fmt (if (string-match "-l[ \t]+\"\\([^\"\n]+\\)\"" opts) + (match-string 1 opts))) + (when (and textareap (eq backend 'html)) + ;; we cannot use numbering or highlighting. + (setq num nil cont nil lang nil)) + (if keepp (setq rpllbl 'keep)) + (setq rtn code) + (when (equal lang "org") + (setq rtn (with-temp-buffer + (insert rtn) + ;; Free up the protected lines + (goto-char (point-min)) + (while (re-search-forward "^," nil t) + (replace-match "") + (end-of-line 1)) + (buffer-string)))) + ;; Now backend-specific coding + (cond + ((eq backend 'html) + ;; We are exporting to HTML + (when lang + (require 'htmlize nil t) + (when (not (fboundp 'htmlize-region-for-paste)) ;; we do not have htmlize.el, or an old version of it + (setq lang nil) (message - "htmlize.el 1.34 or later is needed for source code formatting") - (concat "#+BEGIN_EXAMPLE\n" code - (if (string-match "\n\\'" code) "" "\n") - "#+END_EXAMPLE\n")) - ;; ok, we are good to go - (let* ((mode (and lang (intern (concat lang "-mode")))) - (org-inhibit-startup t) - (org-startup-folded nil) - (htmltext - (with-temp-buffer - (insert code) - ;; Free up the protected stuff - (goto-char (point-min)) - (while (re-search-forward "^," nil t) - (replace-match "") - (end-of-line 1)) - (if (functionp mode) - (funcall mode) - (fundamental-mode)) - (font-lock-fontify-buffer) - (org-export-htmlize-region-for-paste - (point-min) (point-max))))) - (if (string-match "<pre\\([^>]*\\)>\n?" htmltext) - (setq htmltext (replace-match - (format "<pre class=\"src src-%s\">\n" lang) - t t htmltext))) - (concat "\n#+BEGIN_HTML\n" htmltext "\n#+END_HTML\n\n")))) - (t - ;; This is not HTML, so just make it an example. - (when (equal lang "org") - (while (string-match "^," code) - (setq code (replace-match "" t t code)))) - (concat "#+BEGIN_EXAMPLE\n" code - (if (string-match "\n\\'" code) "" "\n") - "#+END_EXAMPLE\n"))))) + "htmlize.el 1.34 or later is needed for source code formatting"))) + + (if lang + (let* ((mode (and lang (intern (concat lang "-mode")))) + (org-inhibit-startup t) + (org-startup-folded nil)) + (setq rtn + (with-temp-buffer + (insert rtn) + (if (functionp mode) + (funcall mode) + (fundamental-mode)) + (font-lock-fontify-buffer) + (org-export-htmlize-region-for-paste + (point-min) (point-max)))) + (if (string-match "<pre\\([^>]*\\)>\n?" rtn) + (setq rtn (replace-match + (format "<pre class=\"src src-%s\">\n" lang) + t t rtn)))) + (if textareap + (setq rtn (concat + (format "<p>\n<textarea cols=\"%d\" rows=\"%d\" overflow-x:scroll >\n" + cols rows) + rtn "</textarea>\n</p>\n")) + (with-temp-buffer + (insert rtn) + (goto-char (point-min)) + (while (re-search-forward "[<>&]" nil t) + (replace-match (cdr (assq (char-before) + '((?&."&")(?<."<")(?>.">")))) + t t)) + (setq rtn (buffer-string))) + (setq rtn (concat "<pre class=\"example\">\n" rtn "</pre>\n")))) + (unless textareap + (setq rtn (org-export-number-lines rtn 'html 1 1 num + cont rpllbl fmt))) + (concat "\n#+BEGIN_HTML\n" (org-add-props rtn '(org-protected t)) "\n#+END_HTML\n\n")) + ((eq backend 'latex) + (setq rtn (org-export-number-lines rtn 'latex 0 0 num cont rpllbl fmt)) + (concat "\n#+BEGIN_LaTeX\n" + (org-add-props (concat "\\begin{verbatim}\n" rtn "\n\\end{verbatim}\n") + '(org-protected t)) + "#+END_LaTeX\n\n")) + ((eq backend 'ascii) + ;; This is not HTML or LaTeX, so just make it an example. + (setq rtn (org-export-number-lines rtn 'ascii 0 0 num cont rpllbl fmt)) + (concat "#+BEGIN_ASCII\n" + (org-add-props + (concat + (mapconcat + (lambda (l) (concat " " l)) + (org-split-string rtn "\n") + "\n") + "\n") + '(org-protected t)) + "#+END_ASCII\n")))))) + +(defun org-export-number-lines (text backend + &optional skip1 skip2 number cont + replace-labels label-format) + (if (and (not number) (not (eq replace-labels 'keep))) + (setq replace-labels nil)) ;; must use names if no numbers + (setq skip1 (or skip1 0) skip2 (or skip2 0)) + (if (not cont) (setq org-export-last-code-line-counter-value 0)) + (with-temp-buffer + (insert text) + (goto-char (point-max)) + (skip-chars-backward " \t\n\r") + (delete-region (point) (point-max)) + (beginning-of-line (- 1 skip2)) + (let* ((last (org-current-line)) + (n org-export-last-code-line-counter-value) + (nmax (+ n (- last skip1))) + (fmt (format "%%%dd: " (length (number-to-string nmax)))) + (fm + (cond + ((eq backend 'html) (format "<span class=\"linenr\">%s</span>" + fmt)) + ((eq backend 'ascii) fmt) + ((eq backend 'latex) fmt) + (t ""))) + (label-format (or label-format org-coderef-label-format)) + (label-pre (if (string-match "%s" label-format) + (substring label-format 0 (match-beginning 0)) + label-format)) + (label-post (if (string-match "%s" label-format) + (substring label-format (match-end 0)) + "")) + (lbl-re + (concat + ".*?\\S-.*?\\([ \t]*\\(" + (regexp-quote label-pre) + "\\([-a-zA-Z0-9_]+\\)" + (regexp-quote label-post) + "\\)\\)")) + ref) + + (goto-line (1+ skip1)) + (while (and (re-search-forward "^" nil t) (not (eobp)) (< n nmax)) + (if number + (insert (format fm (incf n))) + (forward-char 1)) + (when (and (not (eq replace-labels 'keep)) + (looking-at lbl-re)) + (setq ref (match-string 3)) + (if replace-labels + (progn + (delete-region (match-beginning 1) (match-end 1)) + (push (cons ref n) org-export-code-refs)) + (goto-char (match-beginning 2)) + (delete-region (match-beginning 2) (match-end 2)) + (insert "(" ref ")") + (push (cons ref (concat "(" ref ")")) org-export-code-refs)) + (when (eq backend 'html) + (save-excursion + (beginning-of-line 1) + (insert (format "<span id=\"coderef-%s\" class=\"coderef-off\">" + ref)) + (end-of-line 1) + (insert "</span>"))))) + (setq org-export-last-code-line-counter-value n) + (goto-char (point-max)) + (newline) + (buffer-string)))) ;;; ASCII export @@ -2351,6 +2604,8 @@ underlined headlines. The default is 3." :drawers (plist-get opt-plist :drawers) :tags (plist-get opt-plist :tags) :priority (plist-get opt-plist :priority) + :footnotes (plist-get opt-plist :footnotes) + :timestamps (plist-get opt-plist :timestamps) :todo-keywords (plist-get opt-plist :todo-keywords) :verbatim-multiline t :select-tags (plist-get opt-plist :select-tags) @@ -2360,7 +2615,7 @@ underlined headlines. The default is 3." :add-text (plist-get opt-plist :text)) "\n")) thetoc have-headings first-heading-pos - table-open table-buffer) + table-open table-buffer link desc) (let ((inhibit-read-only t)) (org-unmodified @@ -2473,9 +2728,19 @@ underlined headlines. The default is 3." (setq line (org-html-expand-for-ascii line)) ;; Replace links with the description when possible (while (string-match org-bracket-link-regexp line) - (setq line (replace-match - (if (match-end 3) "[\\3]" "[\\1]") - t nil line))) + (setq link (match-string 1 line) + desc (match-string (if (match-end 3) 3 1) line)) + (if (and (> (length link) 8) + (equal (substring link 0 8) "coderef:")) + (setq line (replace-match + (format (org-export-get-coderef-format (substring link 8) desc) + (cdr (assoc + (substring link 8) + org-export-code-refs))) + t t line)) + (setq line (replace-match + (if (match-end 3) "[\\3]" "[\\1]") + t nil line)))) (when custom-times (setq line (org-translate-time line))) (cond @@ -2719,7 +2984,8 @@ Does include HTML export options as well as TODO and CATEGORY stuff." #+EMAIL: %s #+DATE: %s #+LANGUAGE: %s -#+OPTIONS: H:%d num:%s toc:%s \\n:%s @:%s ::%s |:%s ^:%s -:%s f:%s *:%s TeX:%s LaTeX:%s skip:%s d:%s todo:%s pri:%s tags:%s +#+OPTIONS: H:%d num:%s toc:%s \\n:%s @:%s ::%s |:%s ^:%s -:%s f:%s *:%s <:%s +#+OPTIONS: TeX:%s LaTeX:%s skip:%s d:%s todo:%s pri:%s tags:%s %s #+EXPORT_SELECT_TAGS: %s #+EXPORT_EXCLUDE_TAGS: %s @@ -2750,6 +3016,7 @@ Does include HTML export options as well as TODO and CATEGORY stuff." org-export-with-special-strings org-export-with-footnotes org-export-with-emphasize + org-export-with-timestamps org-export-with-TeX-macros org-export-with-LaTeX-fragments org-export-skip-text-before-1st-heading @@ -2933,7 +3200,8 @@ PUB-DIR is set, use this as the publishing directory." (style (concat (if (plist-get opt-plist :style-include-default) org-export-html-style-default) (plist-get opt-plist :style) - (plist-get opt-plist :style-extra))) + (plist-get opt-plist :style-extra) + "\n" org-export-html-scripts)) (html-extension (plist-get opt-plist :html-extension)) (link-validate (plist-get opt-plist :link-validation-function)) valid thetoc have-headings first-heading-pos @@ -3032,6 +3300,8 @@ PUB-DIR is set, use this as the publishing directory." :todo-keywords (plist-get opt-plist :todo-keywords) :tags (plist-get opt-plist :tags) :priority (plist-get opt-plist :priority) + :footnotes (plist-get opt-plist :footnotes) + :timestamps (plist-get opt-plist :timestamps) :archived-trees (plist-get opt-plist :archived-trees) :select-tags (plist-get opt-plist :select-tags) @@ -3046,7 +3316,8 @@ PUB-DIR is set, use this as the publishing directory." ind item-type starter didclose rpl path attr desc descp desc1 desc2 link snumber fnc item-tag - footnotes + footnotes footref-seen + id-file ) (let ((inhibit-read-only t)) @@ -3214,12 +3485,12 @@ lang=\"%s\" xml:lang=\"%s\"> ;; Fixed-width, verbatim lines (examples) (when (and org-export-with-fixed-width - (string-match "^[ \t]*:\\(.*\\)" line)) + (string-match "^[ \t]*:\\(\\([ \t]\\|$\\)\\(.*\\)\\)" line)) (when (not infixed) (setq infixed t) (org-close-par-maybe) (insert "<pre class=\"example\">\n")) - (insert (org-html-protect (match-string 1 line)) "\n") + (insert (org-html-protect (match-string 3 line)) "\n") (when (or (not lines) (not (string-match "^[ \t]*\\(:.*\\)" (car lines)))) @@ -3236,7 +3507,6 @@ lang=\"%s\" xml:lang=\"%s\"> (replace-match "\\2\n")) (insert line "\n") (while (and lines - (not (string-match "^[ \t]*:" (car lines))) (or (= (length (car lines)) 0) (get-text-property 0 'org-protected (car lines)))) (insert (pop lines) "\n")) @@ -3308,7 +3578,7 @@ lang=\"%s\" xml:lang=\"%s\"> ;; Format the links (setq start 0) - (while (string-match org-bracket-link-analytic-regexp line start) + (while (string-match org-bracket-link-analytic-regexp++ line start) (setq start (match-beginning 0)) (setq path (save-match-data (org-link-unescape (match-string 3 line)))) @@ -3326,7 +3596,8 @@ lang=\"%s\" xml:lang=\"%s\"> descp (and desc1 (not (equal desc1 desc2))) desc (or desc1 desc2)) ;; Make an image out of the description if that is so wanted - (when (and descp (org-file-image-p desc)) + (when (and descp (org-file-image-p + desc org-export-html-inline-image-extensions)) (save-match-data (if (string-match "^file:" desc) (setq desc (substring desc (match-end 0))))) @@ -3344,11 +3615,24 @@ lang=\"%s\" xml:lang=\"%s\"> "\"" attr ">" (org-export-html-format-desc desc) "</a>"))) + ((and (equal type "id") + (setq id-file (org-id-find-id-file path))) + ;; This is an id: link to another file (if it was the same file, + ;; it would have become an internal link...) + (setq id-file (file-relative-name + id-file (file-name-directory org-current-export-file))) + (setq id-file (concat (file-name-sans-extension id-file) + "." html-extension)) + (setq rpl (concat "<a href=\"" id-file "#" path "\"" + attr ">" + (org-export-html-format-desc desc) + "</a>"))) ((member type '("http" "https")) ;; standard URL, just check if we need to inline an image (if (and (or (eq t org-export-html-inline-images) (and org-export-html-inline-images (not descp))) - (org-file-image-p path)) + (org-file-image-p + path org-export-html-inline-image-extensions)) (setq rpl (org-export-html-format-image (concat type ":" path))) (setq link (concat type ":" path)) @@ -3366,6 +3650,13 @@ lang=\"%s\" xml:lang=\"%s\"> (org-export-html-format-desc desc) "</a>"))) + ((string= type "coderef") + + (setq rpl (format "<a href=\"#coderef-%s\" class=\"coderef\" onmouseover=\"CodeHighlightOn(this, 'coderef-%s');\" onmouseout=\"CodeHighlightOff(this, 'coderef-%s');\">%s</a>" + path path path + (format (org-export-get-coderef-format path (and descp desc)) + (cdr (assoc path org-export-code-refs)))))) + ((functionp (setq fnc (nth 2 (assoc type org-link-protocols)))) ;; The link protocol has a function for format the link (setq rpl @@ -3385,7 +3676,9 @@ lang=\"%s\" xml:lang=\"%s\"> (if (functionp link-validate) (funcall link-validate filename current-dir) t)) - (setq file-is-image-p (org-file-image-p filename)) + (setq file-is-image-p + (org-file-image-p + filename org-export-html-inline-image-extensions)) (setq thefile (if abs-p (expand-file-name filename) filename)) (when (and org-export-html-link-org-files-as-html (string-match "\\.org$" thefile)) @@ -3441,12 +3734,18 @@ lang=\"%s\" xml:lang=\"%s\"> (while (string-match "\\([^* \t].*?\\)\\[\\([0-9]+\\)\\]" line start) (if (get-text-property (match-beginning 2) 'org-protected line) (setq start (match-end 2)) - (let ((n (match-string 2 line))) + (let ((n (match-string 2 line)) extra a) + (if (setq a (assoc n footref-seen)) + (progn + (setcdr a (1+ (cdr a))) + (setq extra (format ".%d" (cdr a)))) + (setq extra "") + (push (cons n 1) footref-seen)) (setq line (replace-match (format - "%s<sup><a class=\"footref\" name=\"fnr.%s\" href=\"#fn.%s\">%s</a></sup>" - (match-string 1 line) n n n) + "%s<sup><a class=\"footref\" name=\"fnr.%s%s\" href=\"#fn.%s\">%s</a></sup>" + (match-string 1 line) n extra n n) t t line)))))) (cond @@ -3585,6 +3884,17 @@ lang=\"%s\" xml:lang=\"%s\"> (org-export-preserve-breaks (setq line (concat line "<br/>")))) + ;; Check if a paragraph should be started + (let ((start 0)) + (while (and org-par-open + (string-match "\\\\par\\>" line start)) + ;; Leave a space in the </p> so that the footnote matcher + ;; does not see this. + (if (not (get-text-property (match-beginning 0) + 'org-protected line)) + (setq line (replace-match "</p ><p >" t t line))) + (setq start (match-end 0)))) + (insert line "\n"))))) ;; Properly close all local lists and other lists @@ -3693,6 +4003,15 @@ lang=\"%s\" xml:lang=\"%s\"> (kill-buffer (current-buffer))) (current-buffer))))) +(defun org-export-get-coderef-format (path desc) + (save-match-data + (if (and desc (string-match + (regexp-quote (concat "(" path ")")) + desc)) + (replace-match "%s" t t desc) + "%s"))) + + (defun org-export-html-format-href (s) "Make sure the S is valid as a href reference in an XHTML document." (save-match-data @@ -3881,14 +4200,18 @@ lang=\"%s\" xml:lang=\"%s\"> (push html-table-tag html)) (concat (mapconcat 'identity html "\n") "\n"))) -(defun org-table-clean-before-export (lines) +(defun org-table-clean-before-export (lines &optional maybe-quoted) "Check if the table has a marking column. If yes remove the column and the special lines." (setq org-table-colgroup-info nil) (if (memq nil (mapcar (lambda (x) (or (string-match "^[ \t]*|-" x) - (string-match "^[ \t]*| *\\([#!$*_^ /]\\) *|" x))) + (string-match + (if maybe-quoted + "^[ \t]*| *\\\\?\\([\#!$*_^ /]\\) *|" + "^[ \t]*| *\\([\#!$*_^ /]\\) *|") + x))) lines)) (progn (setq org-table-clean-did-remove-column nil) @@ -4007,22 +4330,16 @@ But it has the disadvantage, that Org-mode's HTML conversions cannot be used." (catch 'exit (let (r b) (while (string-match org-maybe-keyword-time-regexp s) - (if (and (match-end 1) (equal (match-string 1 s) org-clock-string)) - ;; never export CLOCK - (throw 'exit "")) (or b (setq b (substring s 0 (match-beginning 0)))) - (if (not org-export-with-timestamps) - (setq r (concat r (substring s 0 (match-beginning 0))) - s (substring s (match-end 0))) - (setq r (concat - r (substring s 0 (match-beginning 0)) - (if (match-end 1) - (format "@<span class=\"timestamp-kwd\">%s @</span>" - (match-string 1 s))) - (format " @<span class=\"timestamp\">%s@</span>" - (substring - (org-translate-time (match-string 3 s)) 1 -1))) - s (substring s (match-end 0))))) + (setq r (concat + r (substring s 0 (match-beginning 0)) + (if (match-end 1) + (format "@<span class=\"timestamp-kwd\">%s @</span>" + (match-string 1 s))) + (format " @<span class=\"timestamp\">%s@</span>" + (substring + (org-translate-time (match-string 3 s)) 1 -1))) + s (substring s (match-end 0)))) ;; Line break if line started and ended with time stamp stuff (if (not r) s diff --git a/lisp/org/org-export-latex.el b/lisp/org/org-export-latex.el index 4a1cc89a27f..2da0648537f 100644 --- a/lisp/org/org-export-latex.el +++ b/lisp/org/org-export-latex.el @@ -4,7 +4,7 @@ ;; ;; Emacs Lisp Archive Entry ;; Filename: org-export-latex.el -;; Version: 6.16 +;; Version: 6.19a ;; Author: Bastien Guerry <bzg AT altern DOT org> ;; Maintainer: Bastien Guerry <bzg AT altern DOT org> ;; Keywords: org, wp, tex @@ -62,12 +62,11 @@ (defvar org-export-latex-add-level 0) (defvar org-export-latex-sectioning "") (defvar org-export-latex-sectioning-depth 0) -(defvar org-export-latex-special-string-regexps - '(org-ts-regexp - org-scheduled-string - org-deadline-string - org-clock-string) - "A list of regexps to convert as special keywords.") +(defvar org-export-latex-special-keyword-regexp + (concat "\\<\\(" org-scheduled-string "\\|" + org-deadline-string "\\|" + org-closed-string"\\)") + "Regexp matching special time planning keywords plus the time after it.") (defvar latexp) ; dynamically scoped from org.el (defvar re-quote) ; dynamically scoped from org.el @@ -221,12 +220,25 @@ inserted headline and is mandatory." (symbol :tag "Convert as descriptive list" description) (string :tag "Use a section string" :value "\\subparagraph{%s}"))) +(defcustom org-export-latex-list-parameters + '(:cbon "\\texttt{[ ]}" :cboff "\\texttt{[ ]}") + "Parameters for the LaTeX list exporter. +These parameters will be passed on to `org-list-to-latex', which in turn +will pass them (combined with the LaTeX default list parameters) to +`org-list-to-generic'." + :group 'org-export-latex + :type 'plist) + (defcustom org-export-latex-remove-from-headlines - '(:todo t :priority t :tags t) - "A plist of keywords to remove from headlines. + '(:todo nil :priority nil :tags nil) + "A plist of keywords to remove from headlines. OBSOLETE. Non-nil means remove this keyword type from the headline. -Don't remove the keys, just change their values." +Don't remove the keys, just change their values. + +Obsolete, this variable is no longer used. Use the separate +variables `org-export-with-todo-keywords', `org-export-with-priority', +and `org-export-with-tags' instead." :type 'plist :group 'org-export-latex) @@ -235,6 +247,16 @@ Don't remove the keys, just change their values." :group 'org-export-latex :type 'string) +(defcustom org-export-latex-inline-image-extensions + '("pdf" "jpeg" "jpg" "png") + "Extensions of image files that can be inlined into LaTeX. +Note that this depends on the way the LaTeX file is processed. +The default setting (pdf and jpg) assumes that pdflatex is doing the +processing. If you are using latex and dvips or something similar, +only postscript files can be included." + :group 'org-export-html + :type '(repeat (string :tag "Extension"))) + (defcustom org-export-latex-coding-system nil "Coding system for the exported LaTex file." :group 'org-export-latex @@ -430,6 +452,8 @@ when PUB-DIR is set, use this as the publishing directory." :comments nil :tags (plist-get opt-plist :tags) :priority (plist-get opt-plist :priority) + :footnotes (plist-get opt-plist :footnotes) + :timestamps (plist-get opt-plist :timestamps) :todo-keywords (plist-get opt-plist :todo-keywords) :add-text (if (eq to-buffer 'string) nil text) :skip-before-1st-heading skip @@ -664,12 +688,22 @@ LEVEL indicates the default depth for export." (org-combine-plists (org-default-export-plist) ext-plist (org-infile-export-plist)) org-export-latex-class - (save-excursion - (goto-char (point-min)) - (if (and (re-search-forward "^#\\+LaTeX_CLASS:[ \t]*\\([a-zA-Z]+\\)" nil t) - (assoc (match-string 1) org-export-latex-classes)) - (match-string 1) - org-export-latex-default-class)) + (or (and (org-region-active-p) + (save-excursion + (goto-char (region-beginning)) + (and (looking-at org-complex-heading-regexp) + (org-entry-get nil "LaTeX_CLASS" 'selective)))) + (save-excursion + (save-restriction + (widen) + (goto-char (point-min)) + (and (re-search-forward "^#\\+LaTeX_CLASS:[ \t]*\\([a-zA-Z]+\\)" nil t) + (match-string 1)))) + org-export-latex-default-class) + org-export-latex-class + (or (car (assoc org-export-latex-class org-export-latex-classes)) + (error "No definition for class `%s' in `org-export-latex-classes'" + org-export-latex-class)) org-export-latex-header (cadr (assoc org-export-latex-class org-export-latex-classes)) org-export-latex-sectioning @@ -778,8 +812,7 @@ links, keywords, lists, tables, fixed-width" (unless (memq 'links exclude-list) (org-export-latex-links)) (unless (memq 'keywords exclude-list) - (org-export-latex-keywords - (plist-get org-export-latex-options-plist :timestamps))) + (org-export-latex-keywords)) (unless (memq 'lists exclude-list) (org-export-latex-lists)) (unless (memq 'tables exclude-list) @@ -806,7 +839,7 @@ links, keywords, lists, tables, fixed-width" (match-end 0) '(org-protected t))) (buffer-string)))) -(defun org-export-latex-keywords-maybe (remove-list) +(defun org-export-latex-keywords-maybe (&optional remove-list) "Maybe remove keywords depending on rules in REMOVE-LIST." (goto-char (point-min)) (let ((re-todo (mapconcat 'identity org-export-latex-todo-keywords-1 "\\|")) @@ -815,12 +848,12 @@ links, keywords, lists, tables, fixed-width" (when (re-search-forward (concat "^\\(" re-todo "\\)") nil t) (if (plist-get remove-list :todo) (replace-match "") - (replace-match (format "\\texttt{%s}" (match-string 1)) t t))) + (replace-match (format "\\textbf{%s}" (match-string 1)) t t))) ;; convert priority string (when (re-search-forward "\\[\\\\#.\\]" nil t) (if (plist-get remove-list :priority) (replace-match "") - (replace-match (format "\\texttt{%s}" (match-string 0)) t t))) + (replace-match (format "\\textbf{%s}" (match-string 0)) t t))) ;; convert tags (when (re-search-forward "\\(:[a-zA-Z0-9_@]+\\)+:" nil t) (if (or (not org-export-with-tags) @@ -828,7 +861,7 @@ links, keywords, lists, tables, fixed-width" (replace-match "") (replace-match (org-export-latex-protect-string - (format "\\texttt{%s}" + (format "\\textbf{%s}" (save-match-data (replace-regexp-in-string "_" "\\\\_" (match-string 0))))) @@ -843,12 +876,10 @@ links, keywords, lists, tables, fixed-width" (goto-char (point-min)) (when (plist-get org-export-latex-options-plist :emphasize) (org-export-latex-fontify)) - (org-export-latex-keywords-maybe - org-export-latex-remove-from-headlines) + (org-export-latex-keywords-maybe) (org-export-latex-special-chars (plist-get org-export-latex-options-plist :sub-superscript)) (org-export-latex-links) -; (org-trim (buffer-substring-no-properties (point-min) (point-max))))) (org-trim (buffer-string)))) (defun org-export-latex-quotation-marks () @@ -865,7 +896,7 @@ links, keywords, lists, tables, fixed-width" (while (re-search-forward (car l) nil t) (let ((rpl (concat (match-string 1) (cadr l)))) (org-export-latex-protect-string rpl) - (org-if-unprotected + (org-if-unprotected-1 (replace-match rpl t t))))) quote-rpl))) (defun org-export-latex-special-chars (sub-superscript) @@ -877,15 +908,11 @@ See the `org-export-latex.el' code for a complete conversion table." (goto-char (point-min)) (while (re-search-forward c nil t) ;; Put the point where to check for org-protected -; (unless (or (get-text-property (match-beginning 2) 'org-protected); -; (org-at-table-p)) (unless (get-text-property (match-beginning 2) 'org-protected) (cond ((member (match-string 2) '("\\$" "$")) (if (equal (match-string 2) "\\$") - (replace-match (concat (match-string 1) "$" - (match-string 3)) t t) - (replace-match (concat (match-string 1) "\\$" - (match-string 3)) t t))) + nil + (replace-match "\\$" t t))) ((member (match-string 2) '("&" "%" "#")) (if (equal (match-string 1) "\\") (replace-match (match-string 2) t t) @@ -903,12 +930,12 @@ See the `org-export-latex.el' code for a complete conversion table." (org-export-latex-protect-string (concat (match-string 1) "\\~{}")) t t)))) ((member (match-string 2) '("{" "}")) - (unless (save-match-data (org-inside-LaTeX-fragment-p)) + (unless (save-match-data (org-inside-latex-math-p)) (if (equal (match-string 1) "\\") (replace-match (match-string 2) t t) (replace-match (concat (match-string 1) "\\" (match-string 2)) t t))))) - (unless (save-match-data (org-inside-LaTeX-fragment-p)) + (unless (save-match-data (org-inside-latex-math-p)) (cond ((equal (match-string 2) "\\") (replace-match (or (save-match-data (org-export-latex-treat-backslash-char @@ -922,7 +949,8 @@ See the `org-export-latex.el' code for a complete conversion table." (match-string 2) (match-string 1) (match-string 3))) "") t t))))))) - '("^\\([^\n$]*?\\|^\\)\\(\\\\?\\$\\)\\([^\n$]*\\)$" + '(;"^\\([^\n$]*?\\|^\\)\\(\\\\?\\$\\)\\([^\n$]*\\)$" + "\\(\\(\\\\?\\$\\)\\)" "\\([a-za-z0-9]+\\|[ \t\n]\\|\\b\\|\\\\\\)\\(_\\|\\^\\)\\([a-za-z0-9]+\\|[ \t\n]\\|[:punct:]\\|{[a-za-z0-9]+}\\|([a-za-z0-9]+)\\)" "\\(.\\|^\\)\\(\\\\\\)\\([ \t\n]\\|[a-zA-Z&#%{}\"]+\\)" "\\(.\\|^\\)\\(&\\)" @@ -936,6 +964,9 @@ See the `org-export-latex.el' code for a complete conversion table." ;; (?\> . "\\textgreater{}") ))) +(defun org-inside-latex-math-p () + (get-text-property (point) 'org-latex-math)) + (defun org-export-latex-treat-sub-super-char (subsup char string-before string-after) "Convert the \"_\" and \"^\" characters to LaTeX. @@ -948,7 +979,7 @@ Convert CHAR depending on STRING-BEFORE and STRING-AFTER." (string-match "\\S-+" string-after)) (cond ((eq 'org-link (get-text-property 0 'face char)) (concat string-before "\\" char string-after)) - ((save-match-data (org-inside-LaTeX-fragment-p)) + ((save-match-data (org-inside-latex-math-p)) (if subsup (cond ((eq 1 (length string-after)) (concat string-before char string-after)) @@ -996,32 +1027,29 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER." (t (org-export-latex-protect-string (concat string-before "\\textbackslash{}" string-after))))) -(defun org-export-latex-keywords (timestamps) - "Convert special keywords to LaTeX. -Regexps are those from `org-export-latex-special-string-regexps'. -If TIMESTAMPS, convert timestamps, otherwise delete them." - (let ((rg org-export-latex-special-string-regexps) r) - (while (setq r (pop rg)) - (goto-char (point-min)) - (while (re-search-forward (eval r) nil t) - (if (not timestamps) - (replace-match (format "\\\\texttt{%s}" (match-string 0)) t) - (replace-match "")))))) +(defun org-export-latex-keywords () + "Convert special keywords to LaTeX." + (goto-char (point-min)) + (let ((re (concat org-export-latex-special-keyword-regexp + ".*" ; including the time stamp.... + ))) + (while (re-search-forward re nil t) + (replace-match (format "\\\\texttt{%s}" (match-string 0)) t)))) (defun org-export-latex-fixed-width (opt) "When OPT is non-nil convert fixed-width sections to LaTeX." (goto-char (point-min)) - (while (re-search-forward "^[ \t]*:" nil t) + (while (re-search-forward "^[ \t]*:\\([ \t]\\|$\\)" nil t) (if opt (progn (goto-char (match-beginning 0)) (insert "\\begin{verbatim}\n") - (while (looking-at "^\\([ \t]*\\):\\(.*\\)$") + (while (looking-at "^\\([ \t]*\\):\\(\\([ \t]\\|$\\).*\\)$") (replace-match (concat (match-string 1) (match-string 2)) t t) (forward-line)) (insert "\\end{verbatim}\n\n")) (progn (goto-char (match-beginning 0)) - (while (looking-at "^\\([ \t]*\\):\\(.*\\)$") + (while (looking-at "^\\([ \t]*\\):\\(\\([ \t]\\|$\\).*\\)$") (replace-match (concat "%" (match-string 1) (match-string 2)) t t) (forward-line)))))) @@ -1061,7 +1089,7 @@ If TIMESTAMPS, convert timestamps, otherwise delete them." (setq lines (split-string raw-table "\n" t)) (apply 'delete-region (list beg end)) (when org-export-table-remove-special-lines - (setq lines (org-table-clean-before-export lines))) + (setq lines (org-table-clean-before-export lines 'maybe-quoted))) ;; make a formatting string to reflect aligment (setq olines lines) (while (and (not line-fmt) (setq line (pop olines))) @@ -1142,8 +1170,16 @@ If TIMESTAMPS, convert timestamps, otherwise delete them." ;; The match goes one char after the *string* (let ((emph (assoc (match-string 3) org-export-latex-emphasis-alist)) + (beg (match-beginning 0)) + (end (match-end 0)) rpl) - (unless (get-text-property (1- (point)) 'org-protected) + (unless (or (get-text-property (1- (point)) 'org-protected) + (save-excursion + (goto-char (match-beginning 1)) + (save-match-data + (and (org-at-table-p) + (string-match + "[|\n]" (buffer-substring beg end)))))) (setq rpl (concat (match-string 1) (format (org-export-latex-protect-char-in-string '("\\" "{" "}") (cadr emph)) @@ -1159,7 +1195,7 @@ If TIMESTAMPS, convert timestamps, otherwise delete them." ;; or send some warnings. "Convert links to LaTeX." (goto-char (point-min)) - (while (re-search-forward org-bracket-link-analytic-regexp nil t) + (while (re-search-forward org-bracket-link-analytic-regexp++ nil t) (org-if-unprotected (goto-char (match-beginning 0)) (let* ((re-radio org-export-latex-all-targets-re) @@ -1171,6 +1207,7 @@ If TIMESTAMPS, convert timestamps, otherwise delete them." (if (or (file-name-absolute-p raw-path) (string-match "^\\.\\.?/" raw-path)) "file"))) + (coderefp (equal type "coderef")) (caption (org-find-text-property-in-string 'org-caption raw-path)) (attr (org-find-text-property-in-string 'org-attributes raw-path)) (label (org-find-text-property-in-string 'org-label raw-path)) @@ -1178,6 +1215,8 @@ If TIMESTAMPS, convert timestamps, otherwise delete them." imgp radiop ;; define the path of the link (path (cond + ((member type '("coderef")) + raw-path) ((member type '("http" "https" "ftp")) (concat type ":" raw-path)) ((and re-radio (string-match re-radio raw-path)) @@ -1185,9 +1224,10 @@ If TIMESTAMPS, convert timestamps, otherwise delete them." ((equal type "mailto") (concat type ":" raw-path)) ((equal type "file") - (if (and (or (org-file-image-p (expand-file-name raw-path)) - (string-match "\\.\\(pdf\\|jpg\\|ps\\|eps\\)$" - raw-path)) + (if (and (org-file-image-p + (expand-file-name + raw-path) + org-export-latex-inline-image-extensions) (equal desc full-raw-path)) (setq imgp t) (progn (when (string-match "\\(.+\\)::.+" raw-path) @@ -1205,12 +1245,18 @@ If TIMESTAMPS, convert timestamps, otherwise delete them." (if floatp "\\begin{figure}[htb]\n") (format "\\centerline{\\includegraphics[%s]{%s}}\n" (or attr org-export-latex-image-default-option) - (expand-file-name raw-path)) + (if (file-name-absolute-p raw-path) + (expand-file-name raw-path) + raw-path)) (if floatp (format "\\caption{%s%s}\n" (if label (concat "\\label{" label "}") "") (or caption ""))) (if floatp "\\end{figure}\n")))) + (coderefp + (insert (format + (org-export-get-coderef-format path desc) + (cdr (assoc path org-export-code-refs))))) (radiop (insert (format "\\hyperref[%s]{%s}" (org-solidify-link-text raw-path) desc))) ((not type) @@ -1232,20 +1278,37 @@ If TIMESTAMPS, convert timestamps, otherwise delete them." ;; Preserve latex environments (goto-char (point-min)) - (while (re-search-forward "^[ \t]*\\begin{\\([a-zA-Z]+\\)}" nil t) + (while (re-search-forward "^[ \t]*\\\\begin{\\([a-zA-Z]+\\)}" nil t) (let* ((start (progn (beginning-of-line) (point))) (end (or (and (re-search-forward - (concat "^[ \t]*\\end{" (match-string 1) "}" nil t) - (point-at-eol))) + (concat "^[ \t]*\\\\end{" (match-string 1) "}") nil t) + (point-at-eol)) (point-max)))) (add-text-properties start end '(org-protected t)))) + ;; Preserve math snippets + + (let* ((matchers (plist-get org-format-latex-options :matchers)) + (re-list org-latex-regexps) + beg end re e m n block off) + ;; Check the different regular expressions + (while (setq e (pop re-list)) + (setq m (car e) re (nth 1 e) n (nth 2 e) + block (if (nth 3 e) "\n\n" "")) + (setq off (if (member m '("$" "$1")) 1 0)) + (when (and (member m matchers) (not (equal m "begin"))) + (goto-char (point-min)) + (while (re-search-forward re nil t) + (setq beg (+ (match-beginning 0) off) end (- (match-end 0) 0)) + (add-text-properties beg end '(org-protected t org-latex-math t)))))) + ;; Convert LaTeX to \LaTeX{} (goto-char (point-min)) (let ((case-fold-search nil) rpl) (while (re-search-forward "\\([^+_]\\)LaTeX" nil t) - (replace-match (org-export-latex-protect-string - (concat (match-string 1) "\\LaTeX{}")) t t))) + (org-if-unprotected + (replace-match (org-export-latex-protect-string + (concat (match-string 1) "\\LaTeX{}")) t t)))) ;; Convert blockquotes (goto-char (point-min)) @@ -1266,7 +1329,8 @@ If TIMESTAMPS, convert timestamps, otherwise delete them." ;; Convert horizontal rules (goto-char (point-min)) (while (re-search-forward "^----+.$" nil t) - (replace-match (org-export-latex-protect-string "\\hrule") t t)) + (org-if-unprotected + (replace-match (org-export-latex-protect-string "\\hrule") t t))) ;; Protect LaTeX commands like \command[...]{...} or \command{...} (goto-char (point-min)) @@ -1285,65 +1349,73 @@ If TIMESTAMPS, convert timestamps, otherwise delete them." (while (re-search-forward (concat "<<<?" org-export-latex-all-targets-re ">>>?\\((INVISIBLE)\\)?") nil t) - (replace-match - (org-export-latex-protect-string - (format "\\label{%s}%s" (save-match-data (org-solidify-link-text - (match-string 1))) - (if (match-string 2) "" (match-string 1)))) t t)) + (org-if-unprotected + (replace-match + (org-export-latex-protect-string + (format "\\label{%s}%s" (save-match-data (org-solidify-link-text + (match-string 1))) + (if (match-string 2) "" (match-string 1)))) t t))) ;; Delete @<...> constructs ;; Thanks to Daniel Clemente for this regexp (goto-char (point-min)) (while (re-search-forward "@<\\(?:[^\"\n]\\|\".*\"\\)*?>" nil t) - (replace-match "")) + (org-if-unprotected + (replace-match ""))) ;; When converting to LaTeX, replace footnotes ;; FIXME: don't protect footnotes from conversion (when (plist-get org-export-latex-options-plist :footnotes) (goto-char (point-min)) - (while (re-search-forward "\\[[0-9]+\\]" nil t) - (when (save-match-data - (save-excursion (beginning-of-line) - (looking-at "[^:|#]"))) - (let ((foot-beg (match-beginning 0)) - (foot-end (match-end 0)) - (foot-prefix (match-string 0)) - footnote footnote-rpl) - (save-excursion - (when (search-forward foot-prefix nil t) - (replace-match "") - (let ((end (save-excursion - (if (re-search-forward "^$\\|^#.*$\\|\\[[0-9]+\\]" nil t) - (match-beginning 0) (point-max))))) - (setq footnote (concat (org-trim (buffer-substring (point) end)) - " ")) ; prevent last } being part of a link - (delete-region (point) end)) - (goto-char foot-beg) - (delete-region foot-beg foot-end) - (unless (null footnote) - (setq footnote-rpl (format "\\footnote{%s}" footnote)) - (add-text-properties 0 10 '(org-protected t) footnote-rpl) - (add-text-properties (1- (length footnote-rpl)) - (length footnote-rpl) - '(org-protected t) footnote-rpl) - (insert footnote-rpl))))))) - - ;; Replace footnote section tag for LaTeX + (while (re-search-forward "\\[\\([0-9]+\\)\\]" nil t) + (org-if-unprotected + (when (save-match-data + (save-excursion (beginning-of-line) + (looking-at "[^:|#]"))) + (let ((foot-beg (match-beginning 0)) + (foot-end (match-end 0)) + (foot-prefix (match-string 0)) + footnote footnote-rpl) + (save-excursion + (if (not (re-search-forward (concat "^" (regexp-quote foot-prefix)) + nil t)) + (replace-match "$^{\\1}$") + (replace-match "") + (let ((end (save-excursion + (if (re-search-forward "^$\\|^#.*$\\|\\[[0-9]+\\]" nil t) + (match-beginning 0) (point-max))))) + (setq footnote (concat (org-trim (buffer-substring (point) end)) + " ")) ; prevent last } being part of a link + (delete-region (point) end)) + (goto-char foot-beg) + (delete-region foot-beg foot-end) + (unless (null footnote) + (setq footnote-rpl (format "\\footnote{%s}" footnote)) + (add-text-properties 0 10 '(org-protected t) footnote-rpl) + (add-text-properties (1- (length footnote-rpl)) + (length footnote-rpl) + '(org-protected t) footnote-rpl) + (insert footnote-rpl))) + ))))) + + ;; Remove footnote section tag for LaTeX (goto-char (point-min)) (while (re-search-forward (concat "^" footnote-section-tag-regexp) nil t) - (replace-match "")))) + (org-if-unprotected + (replace-match ""))))) ;;; List handling: (defun org-export-latex-lists () - "Replace plain text lists in current buffer into LaTeX lists." - "Convert lists to LaTeX." + "Convert plain text lists in current buffer into LaTeX lists." (goto-char (point-min)) (while (re-search-forward org-list-beginning-re nil t) (org-if-unprotected (beginning-of-line) - (insert (org-list-to-latex (org-list-parse-list t)) "\n")))) + (insert (org-list-to-latex (org-list-parse-list t) + org-export-latex-list-parameters)) + "\n"))) (defconst org-latex-entities '("\\!" diff --git a/lisp/org/org-faces.el b/lisp/org/org-faces.el index 31200839dcf..e94d1dbf0fa 100644 --- a/lisp/org/org-faces.el +++ b/lisp/org/org-faces.el @@ -5,7 +5,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.16 +;; Version: 6.19a ;; ;; This file is part of GNU Emacs. ;; @@ -239,6 +239,13 @@ column view defines special faces for each outline level. See the file "Face for links." :group 'org-faces) +(defface org-footnote + '((((class color) (background light)) (:foreground "Purple" :underline t)) + (((class color) (background dark)) (:foreground "Cyan" :underline t)) + (t (:underline t))) + "Face for links." + :group 'org-faces) + (defface org-ellipsis '((((class color) (background light)) (:foreground "DarkGoldenrod" :underline t)) (((class color) (background dark)) (:foreground "LightGoldenrod" :underline t)) @@ -389,6 +396,22 @@ changes." :group 'org-faces :version "22.1") +(defface org-clock-overlay ;; copied from secondary-selection + (org-compatible-face nil + '((((class color) (min-colors 88) (background light)) + :background "yellow1") + (((class color) (min-colors 88) (background dark)) + :background "SkyBlue4") + (((class color) (min-colors 16) (background light)) + :background "yellow") + (((class color) (min-colors 16) (background dark)) + :background "SkyBlue4") + (((class color) (min-colors 8)) + :background "cyan" :foreground "black") + (t :inverse-video t))) + "Basic face for displaying the secondary selection." + :group 'org-faces) + (defface org-agenda-structure ;; originally copied from font-lock-function-name-face (org-compatible-face nil '((((class color) (min-colors 88) (background light)) (:foreground "Blue1")) diff --git a/lisp/org/org-footnote.el b/lisp/org/org-footnote.el new file mode 100644 index 00000000000..05ebce54c0b --- /dev/null +++ b/lisp/org/org-footnote.el @@ -0,0 +1,504 @@ +;;; org-footnote.el --- Footnote support in Org and elsewhere +;; +;; Copyright (C) 2009 Free Software Foundation, Inc. +;; +;; Author: Carsten Dominik <carsten at orgmode dot org> +;; Keywords: outlines, hypermedia, calendar, wp +;; Homepage: http://orgmode.org +;; Version: 6.19a +;; +;; 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 footnotes in Org-mode. +;; The code can also be used in arbitrary text modes to provide +;; footnotes. Compared to Steven L Baur's footnote.el it provides +;; better support for resuming editing. It is less configurable than +;; Steve's code, though. + +;;; Code: + +(eval-when-compile + (require 'cl)) +(require 'org-macs) +(require 'org-compat) + +(declare-function org-in-regexp "org" (re &optional nlines visually)) +(declare-function org-mark-ring-push "org" (&optional pos buffer)) +(declare-function outline-next-heading "outline") +(declare-function org-trim "org" (s)) +(declare-function org-show-context "org" (&optional key)) +(declare-function org-back-to-heading "org" (&optional invisible-ok)) +(declare-function org-end-of-subtree "org" (&optional invisible-ok to-heading)) + +(defconst org-footnote-re + (concat "[^][\n]" ; to make sure it is not at the beginning of a line + "\\[" + "\\(?:" + "\\([0-9]+\\)" + "\\|" + (org-re "\\(fn:\\([-_[:word:]]+?\\)?\\)\\(?::\\([^\]]*?\\)\\)?") + "\\)" + "\\]") + "Regular expression for matching footnotes.") + +(defconst org-footnote-definition-re + (org-re "^\\(\\[\\([0-9]+\\|fn:[-_[:word:]]+\\)\\]\\)") + "Regular expression matching the definition of a footnote.") + +(defcustom org-footnote-section "Footnotes" + "Outline heading containing footnote definitions before export. +This can be nil, to place footnotes locally at the end of the current +outline node. If can also be the name of a special outline heading +under which footnotes should be put. +This variable defines the place where Org puts the definition +automatically, i.e. when creating the footnote, and when sorting the notes. +However, by hand you may place definitions *anywhere*. +If this is a string, during export, all subtrees starting with this +heading will be removed after extracting footnote definitions." + :group 'org-footnotes + :type '(choice + (string :tag "Collect fotnotes under heading") + (const :tag "Define footnotes locally" nil))) + +(defcustom org-footnote-tag-for-non-org-mode-files "Footnotes:" + "Tag marking the beginning of footnote section. +The Org-mode footnote engine can be used in arbitrary text files as well +as in Org-mode. Outside Org-mode, new footnotes are always placed at +the end of the file. When you normalize the notes, any line containing +only this tag will be removed, a new one will be inserted at the end +of the file, followed by the collected and normalized footnotes." + :group 'org-footnotes + :type 'string) + +(defcustom org-footnote-define-inline nil + "Non-nil means, define footnotes inline, at reference location. +When nil, footnotes will be defined in a special section near +the end of the document. When t, the [fn:label:definition] notation +will be used to define the footnote at the reference position." + :group 'org-footnote + :type 'boolean) + +(defcustom org-footnote-auto-label t + "Non-nil means, define automatically new labels for footnotes. +Possible values are: + +nil prompt the user for each label +t create unique labels of the form [fn:1], [fn:2], ... +confirm like t, but let the user edit the created value. In particular, + the label can be removed from the minibuffer, to create + an anonymous footnote. +plain Automatically create plain number labels like [1]" + :group 'org-footnote + :type '(choice + (const :tag "Frompt for label" nil) + (const :tag "Create automatic [fn:N]" t) + (const :tag "Offer automatic [fn:N] for editing" confirm) + (const :tag "Create automatic [N]" plain))) + +(defcustom org-footnote-fill-after-inline-note-extraction nil + "Non-nil means, fill paragraphs after extracting footnotes. +When extracting inline footnotes, the lengths of lines can change a lot. +When this option is set, paragraphs from which an inline footnote has been +extracted will be filled again." + :group 'org-footnote + :type 'boolean) + +(defun org-footnote-at-reference-p () + "Is the cursor at a footnote reference? +If yes, return the beginning position, the label, and the definition, if local." + (when (org-in-regexp org-footnote-re 15) + (list (match-beginning 0) + (or (match-string 1) + (if (equal (match-string 2) "fn:") nil (match-string 2))) + (match-string 4)))) + +(defun org-footnote-at-definition-p () + "Is the cursor at a footnote definition. +This matches only pure definitions like [1] or [fn:name] at the beginning +of a line. It does not a references like [fn:name:definition], where the +footnote text is included and defined locally. +The return value will be nil if not at a foornote definition, and a list +with start and label of the footnote if there is a definition at point." + (save-excursion + (end-of-line 1) + (let ((lim (save-excursion (re-search-backward "^\\*+ \\|^[ \t]*$" nil t)))) + (when (re-search-backward org-footnote-definition-re lim t) + (list (match-beginning 0) (match-string 2)))))) + +(defun org-footnote-goto-definition (label) + "Find the definition of the footnote with label LABEL." + (interactive "sLabel: ") + (org-mark-ring-push) + (setq label (org-footnote-normalize-label label)) + (let ((re (format "^\\[%s\\]\\|.\\[%s:" label label)) + pos) + (save-excursion + (setq pos (or (re-search-forward re nil t) + (and (goto-char (point-min)) + (re-search-forward re nil t)) + (and (progn (widen) t) + (goto-char (point-min)) + (re-search-forward re nil t))))) + (if (not pos) + (error "Cannot find definition of footnote %s" label) + (goto-char pos) + (org-show-context 'link-search) + (message "Edit definition and go back with `C-c &' or, if unique, with `C-c C-c'.")))) + +(defun org-footnote-goto-next-reference (label) + "Find the definition of the footnote with label LABEL." + (interactive "sLabel: ") + (org-mark-ring-push) + (setq label (org-footnote-normalize-label label)) + (let ((re (format ".\\[%s[]:]" label)) + (p0 (point)) pos) + (save-excursion + (setq pos (or (re-search-forward re nil t) + (and (goto-char (point-min)) + (re-search-forward re nil t)) + (and (progn (widen) t) + (goto-char p0) + (re-search-forward re nil t)) + (and (goto-char (point-min)) + (re-search-forward re nil t))))) + (if pos + (progn + (goto-char pos) + (org-show-context 'link-search)) + (error "Cannot find reference of footnote %s" label)))) + +(defun org-footnote-normalize-label (label) + (if (numberp label) (setq label (number-to-string label))) + (if (not (string-match "^[0-9]+$\\|^$\\|^fn:" label)) + (setq label (concat "fn:" label))) + label) + +(defun org-footnote-all-labels () + "Return list with all defined foot labels used in the buffer." + (let (rtn l) + (save-excursion + (save-restriction + (widen) + (goto-char (point-min)) + (while (re-search-forward org-footnote-definition-re nil t) + (setq l (org-match-string-no-properties 2)) + (and l (add-to-list 'rtn l))) + (goto-char (point-min)) + (while (re-search-forward org-footnote-re nil t) + (setq l (or (org-match-string-no-properties 1) + (org-match-string-no-properties 2))) + (and l (not (equal l "fn:")) (add-to-list 'rtn l))))) + rtn)) + +(defun org-footnote-unique-label (&optional current) + "Return a new unique footnote label. +The returns the firsts fn:N labels that is currently not used." + (unless current (setq current (org-footnote-all-labels))) + (let ((fmt (if (eq org-footnote-auto-label 'plain) "%d" "fn:%d")) + (cnt 1)) + (while (member (format fmt cnt) current) + (incf cnt)) + (format fmt cnt))) + +(defvar org-footnote-label-history nil + "History of footnote labels entered in current buffer.") +(make-variable-buffer-local 'org-footnote-label-history) + +(defun org-footnote-new () + "Insert a new footnote. +This command prompts for a label. If this is a label referencing an +existing label, only insert the label. If the footnote label is empty +or new, let the user edit the definition of the footnote." + (interactive) + (let* ((labels (org-footnote-all-labels)) + (propose (org-footnote-unique-label labels)) + (label + (if (member org-footnote-auto-label '(t plain)) + propose + (completing-read + "Label (leave empty for anonymous): " + (mapcar 'list labels) nil nil + (if (eq org-footnote-auto-label 'confirm) propose nil) + 'org-footnote-label-history)))) + (setq label (org-footnote-normalize-label label)) + (cond + ((equal label "") + (insert "[fn:: ]") + (backward-char 1)) + ((member label labels) + (insert "[" label "]") + (message "New reference to existing note")) + (org-footnote-define-inline + (insert "[" label ": ]") + (backward-char 1)) + (t + (insert "[" label "]") + (org-footnote-create-definition label))))) + +(defun org-footnote-create-definition (label) + "Start the definition of a footnote with label LABEL." + (interactive "sLabel: ") + (setq label (org-footnote-normalize-label label)) + (let (re p) + (cond + ((org-mode-p) + (if (not org-footnote-section) + ;; No section, put footnote into the current outline node + nil + ;; Try to find or make the special node + (setq re (concat "^\\*+[ \t]+" org-footnote-section "[ \t]*$")) + (unless (or (re-search-forward re nil t) + (and (progn (widen) t) + (re-search-forward re nil t))) + (goto-char (point-max)) + (insert "\n\n* " org-footnote-section "\n"))) + ;; Now go to the end of this entry and insert there. + (org-footnote-goto-local-insertion-point)) + (t + (setq re (concat "^" org-footnote-tag-for-non-org-mode-files "[ \t]*$")) + (unless (re-search-forward re nil t) + (goto-char (point-max)) + (skip-chars-backward " \t\r\n") + (insert "\n\n") + (delete-region (point) (point-max)) + (insert org-footnote-tag-for-non-org-mode-files "\n")) + (goto-char (point-max)) + (skip-chars-backward " \t\r\n"))) + (insert "\n\n") + (insert "[" label "] ") + (message "Edit definition and go back with `C-c &' or, if unique, with `C-c C-c'."))) + +;;;###autoload +(defun org-footnote-action (&optional special) + "Do the right thing for footnotes. +When at a foornote reference, jump to the definition. When at a definition, +jump to the refernces. When neither at definition or reference, +create a new footnote, interactively. +With prefix arg SPECIAL, offer additional commands in a menu." + (interactive "P") + (let (tmp c) + (cond + (special + (message "Footnotes: [s]ort | convert to [n]umeric | [d]elete") + (setq c (read-char-exclusive)) + (cond + ((equal c ?s) + (org-footnote-normalize 'sort)) + ((equal c ?n) + (org-footnote-normalize)) + ((equal c ?d) + (org-footnote-delete)) + (t (error "No such footnote command %c" c)))) + ((setq tmp (org-footnote-at-reference-p)) + (if (nth 1 tmp) + (org-footnote-goto-definition (nth 1 tmp)) + (goto-char (match-beginning 4)))) + ((setq tmp (org-footnote-at-definition-p)) + (org-footnote-goto-next-reference (nth 1 tmp))) + (t (org-footnote-new))))) + +;;;###autoload +(defun org-footnote-normalize (&optional sort-only for-preprocessor) + "Collect the footnotes in various formats and normalize them. +This find the different sorts of footnotes allowed in Org, and +normalizes them to the usual [N] format that is understood by the +Org-mode exporters. +When SORT-ONLY is set, only sort the footnote definitions into the +referenced sequence." + ;; This is based on Paul's function, but rewritten. + (let ((count 0) ref def idef ref-table liste beg beg1 marker a before + ins-point) + (save-excursion + ;; Now find footnote references, and extract the definitions + (goto-char (point-min)) + (while (re-search-forward org-footnote-re nil t) + (org-if-unprotected + (setq def (match-string 4) + idef def + ref (or (match-string 1) (match-string 2)) + before (char-to-string (char-after (match-beginning 0)))) + (if (equal ref "fn:") (setq ref nil)) + (if (and ref (setq a (assoc ref ref-table))) + (progn + (setq marker (nth 1 a)) + (unless (nth 2 a) (setf (caddr a) def))) + (setq marker (number-to-string (incf count)))) + (save-match-data + (if def + (setq def (org-trim def)) + (save-excursion + (goto-char (point-min)) + (if (not (re-search-forward (concat "^\\[" (regexp-quote ref) + "\\]") nil t)) + (setq def nil) + (setq beg (match-beginning 0)) + (setq beg1 (match-end 0)) + (re-search-forward + (org-re "^[ \t]*$\\|^\\*+ \\|^\\[\\([0-9]+\\|fn:[-_[:word:]]+\\)\\]") + nil 'move) + (setq def (buffer-substring beg1 (or (match-beginning 0) + (point-max)))) + (goto-char beg) + (skip-chars-backward " \t\n\t") + (delete-region (1+ (point)) (match-beginning 0)))))) + (unless sort-only + (replace-match (concat before "[" marker "]")) + (and idef + org-footnote-fill-after-inline-note-extraction + (fill-paragraph))) + (if (not a) (push (list ref marker def) ref-table)))) + + ;; First find and remove the footnote section + (goto-char (point-min)) + (cond + ((org-mode-p) + (if (and org-footnote-section + (re-search-forward + (concat "^\\*[ \t]+" (regexp-quote org-footnote-section) + "[ \t]*$") + nil t)) + (if (or for-preprocessor (not org-footnote-section)) + (replace-match "") + (org-back-to-heading t) + (forward-line 1) + (setq ins-point (point)) + (delete-region (point) (org-end-of-subtree t))) + (goto-char (point-max)) + (unless for-preprocessor + (when org-footnote-section + (or (bolp) (insert "\n")) + (insert "* " org-footnote-section "\n") + (setq ins-point (point)))))) + (t + (if (re-search-forward + (concat "^" + (regexp-quote org-footnote-tag-for-non-org-mode-files) + "[ \t]*$") + nil t) + (replace-match "")) + (goto-char (point-max)) + (skip-chars-backward " \t\n\r") + (delete-region (point) (point-max)) + (insert "\n\n" org-footnote-tag-for-non-org-mode-files "\n") + (setq ins-point (point)))) + + ;; Insert the footnotes again + (goto-char (or ins-point (point-max))) + (setq ref-table (reverse ref-table)) + (when sort-only + ;; remove anonymous fotnotes from the list + (setq ref-table + (delq nil (mapcar + (lambda (x) (and (car x) + (not (equal (car x) "fn:")) + x)) + ref-table)))) + ;; Make sure each footnote has a description, or an error message. + (setq ref-table + (mapcar + (lambda (x) + (if (not (nth 2 x)) + (setcar (cddr x) + (format "FOOTNOTE DEFINITION NOT FOUND: %s" (car x))) + (setcar (cddr x) (org-trim (nth 2 x)))) + x) + ref-table)) + + (if (or (not (org-mode-p)) ; not an Org file + org-footnote-section ; we do not use a footnote section + (not sort-only) ; this is normalization + for-preprocessor) ; the is the preprocessor + ;; Insert the footnotes together in one place + (progn + (setq def + (mapconcat + (lambda (x) + (format "[%s] %s" (nth (if sort-only 0 1) x) + (org-trim (nth 2 x)))) + ref-table "\n\n")) + (if ref-table (insert "\n" def "\n\n"))) + ;; Insert each footnote near the first reference + ;; Happens only in Org files with no special footnote section, + ;; and only when doing sorting + (mapc 'org-insert-footnote-reference-near-definition + ref-table))))) + +(defun org-insert-footnote-reference-near-definition (entry) + "Find first reference of footnote ENTRY and insert the definition there. +ENTRY is (fn-label num-mark definition)." + (when (car entry) + (let ((pos (point))) + (goto-char (point-min)) + (when (re-search-forward (format ".\\[%s[]:]" (regexp-quote (car entry))) + nil t) + (org-footnote-goto-local-insertion-point) + (insert (format "\n\n[%s] %s" (car entry) (nth 2 entry))))))) + +(defun org-footnote-goto-local-insertion-point () + "Find insertion point for footnote, just before next outline heading." + (outline-next-heading) + (or (bolp) (newline)) + (beginning-of-line 0) + (while (and (not (bobp)) (= (char-after) ?#)) + (beginning-of-line 0)) + (if (looking-at "#\\+TBLFM:") (beginning-of-line 2)) + (end-of-line 1) + (skip-chars-backward "\n\r\t ")) + +(defun org-footnote-delete (&optional label) + "Delete the footnote at point. +This will remove the definition (even multiple definitions if they exist) +and all references of a footnote label." + (catch 'done + (let (x label l beg def-re (nref 0) (ndef 0)) + (unless label + (when (setq x (org-footnote-at-reference-p)) + (setq label (nth 1 x)) + (when (or (not label) (equal "fn:" label)) + (delete-region (1+ (match-beginning 0)) (match-end 0)) + (message "Anonymous footnote removed") + (throw 'done t))) + (when (and (not label) (setq x (org-footnote-at-definition-p))) + (setq label (nth 1 x))) + (unless label (error "Don't know which footnote to remove"))) + (save-excursion + (save-restriction + (goto-char (point-min)) + (while (re-search-forward org-footnote-re nil t) + (setq l (or (match-string 1) (match-string 2))) + (when (equal l label) + (delete-region (1+ (match-beginning 0)) (match-end 0)) + (incf nref))) + (goto-char (point-min)) + (setq def-re (concat "^\\[" (regexp-quote label) "\\]")) + (while (re-search-forward def-re nil t) + (setq beg (match-beginning 0)) + (if (re-search-forward "^\\[\\|^[ \t]*$\\|^\\*+ " nil t) + (goto-char (match-beginning 0)) + (goto-char (point-max))) + (delete-region beg (point)) + (incf ndef)))) + (message "%d definition(s) of and %d reference(s) of footnote %s removed" + ndef nref label)))) + +(provide 'org-footnote) + +;; arch-tag: 1b5954df-fb5d-4da5-8709-78d944dbfc37 + +;;; org-footnote.el ends here diff --git a/lisp/org/org-gnus.el b/lisp/org/org-gnus.el index b7b43f9b60b..b77ae9c05a7 100644 --- a/lisp/org/org-gnus.el +++ b/lisp/org/org-gnus.el @@ -6,7 +6,7 @@ ;; Tassilo Horn <tassilo at member dot fsf dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.16 +;; Version: 6.19a ;; ;; This file is part of GNU Emacs. ;; @@ -111,12 +111,12 @@ If `org-store-link' was called with a prefix arg the meaning of (gnus-group-name)) (t "???"))) desc link) - (unless group (error "Not on a group")) - (org-store-link-props :type "gnus" :group group) - (setq desc (org-gnus-group-link group) - link desc) - (org-add-link-props :link link :description desc) - link)) + (when group + (org-store-link-props :type "gnus" :group group) + (setq desc (org-gnus-group-link group) + link desc) + (org-add-link-props :link link :description desc) + link))) ((memq major-mode '(gnus-summary-mode gnus-article-mode)) (and (eq major-mode 'gnus-summary-mode) (gnus-summary-show-article)) diff --git a/lisp/org/org-id.el b/lisp/org/org-id.el index 40a67dfe2d7..0623c6071a8 100644 --- a/lisp/org/org-id.el +++ b/lisp/org/org-id.el @@ -1,10 +1,11 @@ ;;; org-id.el --- Global identifiers for Org-mode entries +;; ;; Copyright (C) 2008, 2009 Free Software Foundation, Inc. ;; ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.16 +;; Version: 6.19a ;; ;; This file is part of GNU Emacs. ;; @@ -262,6 +263,9 @@ Move the cursor to that entry in that buffer." The return value is a cons cell (file-name . position), or nil if there is no entry with that ID. With optional argument MARKERP, return the position as a new marker." + (cond + ((symbolp id) (setq id (symbol-name id))) + ((numberp id) (setq id (number-to-string id)))) (let ((file (org-id-find-id-file id)) org-agenda-new-buffers where) (when file @@ -521,6 +525,7 @@ When CHECK is given, prepare detailed information about duplicate IDs." ;; Finding entries with specified id +;;;###autoload (defun org-id-find-id-file (id) "Query the id database for the file in which this ID is located." (unless org-id-locations (org-id-locations-load)) diff --git a/lisp/org/org-info.el b/lisp/org/org-info.el index e211d88d167..110e921ae5e 100644 --- a/lisp/org/org-info.el +++ b/lisp/org/org-info.el @@ -5,7 +5,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.16 +;; Version: 6.19a ;; ;; This file is part of GNU Emacs. ;; diff --git a/lisp/org/org-irc.el b/lisp/org/org-irc.el index 170f9346f0f..596f6a9d8e7 100644 --- a/lisp/org/org-irc.el +++ b/lisp/org/org-irc.el @@ -1,10 +1,10 @@ ;;; org-irc.el --- Store links to IRC sessions ;; -;; Copyright (C) 2008, 2009 Free Software Foundation, Inc. +;; Copyright (C) 2008, 2009 Free Software Foundation, Inc. ;; ;; Author: Philip Jackson <emacs@shellarchive.co.uk> ;; Keywords: erc, irc, link, org -;; Version: 6.16 +;; Version: 6.19a ;; ;; This file is part of GNU Emacs. ;; diff --git a/lisp/org/org-jsinfo.el b/lisp/org/org-jsinfo.el index 15011c71ff7..c13629976dc 100644 --- a/lisp/org/org-jsinfo.el +++ b/lisp/org/org-jsinfo.el @@ -5,7 +5,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.16 +;; Version: 6.19a ;; ;; This file is part of GNU Emacs. ;; @@ -140,7 +140,7 @@ Option settings will replace the %MANAGER-OPTIONS cookie." default (cdr (assoc opt org-infojs-options))) (and (symbolp default) (not (memq default '(t nil))) (setq default (plist-get exp-plist default))) - (if (string-match (format " %s:\\(\\S-+\\)" opt) v) + (if (and v (string-match (format " %s:\\(\\S-+\\)" opt) v)) (setq val (match-string 1 v)) (setq val default)) (cond diff --git a/lisp/org/org-list.el b/lisp/org/org-list.el index 0cefa5cf89f..41d2e26fd7e 100644 --- a/lisp/org/org-list.el +++ b/lisp/org/org-list.el @@ -6,7 +6,7 @@ ;; Bastien Guerry <bzg AT altern DOT org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.16 +;; Version: 6.19a ;; ;; This file is part of GNU Emacs. ;; @@ -46,6 +46,7 @@ (declare-function org-trim "org" (s)) (declare-function org-get-indentation "org" (&optional line)) (declare-function org-timer-item "org-timer" (&optional arg)) +(declare-function org-combine-plists "org" (&rest plists)) (defgroup org-plain-lists nil "Options concerning plain lists in Org-mode." @@ -188,13 +189,20 @@ Return t when things worked, nil when we are not in an item." (save-match-data (and (looking-at "[ \t]*\\(.*?\\) ::") (match-string 1))))) + (empty-line-p (save-excursion + (goto-char (match-beginning 0)) + (and (not (bobp)) + (or (beginning-of-line 0) t) + (save-match-data + (looking-at "[ \t]*$"))))) (timerp (and descp (save-match-data (string-match "^[-+*][ \t]+[0-9]+:[0-9]+:[0-9]+$" descp)))) (eow (save-excursion (beginning-of-line 1) (looking-at "[ \t]*") (match-end 0))) - (blank (cdr (assq 'plain-list-item org-blank-before-new-entry))) + (blank-a (cdr (assq 'plain-list-item org-blank-before-new-entry))) + (blank (if (eq blank-a 'auto) empty-line-p blank-a)) pos) (if descp (setq checkbox nil)) (if timerp @@ -894,9 +902,12 @@ sublevels as a list of strings." (goto-char end)))) (nextindent (match-string 1)) (item (org-trim item)) - (item (if (string-match "^\\[.+\\]" item) - (replace-match "\\\\texttt{\\&}" - t nil item) item))) + (item (if (string-match "^\\[\\([xX ]\\)\\]" item) + (replace-match (if (equal (match-string 1 item) " ") + "[CBOFF]" + "[CBON]") + t nil item) + item))) (push item output) (when (> (length nextindent) (length indent1)) @@ -1010,7 +1021,10 @@ Valid parameters PARAMS are :istart String to start a list item :iend String to end a list item :isep String to separate items -:lsep String to separate sublists" +:lsep String to separate sublists + +:cboff String to insert for an unchecked checkbox +:cbon String to insert for a checked checkbox" (interactive) (let* ((p params) sublist (splicep (plist-get p :splice)) @@ -1027,7 +1041,9 @@ Valid parameters PARAMS are (istart (plist-get p :istart)) (iend (plist-get p :iend)) (isep (plist-get p :isep)) - (lsep (plist-get p :lsep))) + (lsep (plist-get p :lsep)) + (cbon (plist-get p :cbon)) + (cboff (plist-get p :cboff))) (let ((wrapper (cond ((eq (car list) 'ordered) (concat ostart "\n%s" oend "\n")) @@ -1043,6 +1059,10 @@ Valid parameters PARAMS are (setq term (org-trim (format (concat dtstart "%s" dtend) (match-string 1 sublist)))) (setq sublist (substring sublist (1+ (length term))))) + (if (string-match "\\[CBON\\]" sublist) + (setq sublist (replace-match cbon t t sublist))) + (if (string-match "\\[CBOFF\\]" sublist) + (setq sublist (replace-match cboff t t sublist))) (setq rtn (concat rtn istart term ddstart sublist ddend iend isep))) (t (setq rtn (concat rtn ;; previous list @@ -1052,38 +1072,56 @@ Valid parameters PARAMS are ))))) (format wrapper rtn)))) -(defun org-list-to-latex (list) - "Convert LIST into a LaTeX list." +(defun org-list-to-latex (list &optional params) + "Convert LIST into a LaTeX list. +LIST is as returnd by `org-list-parse-list'. PARAMS is a property list +with overruling parameters for `org-list-to-generic'." (org-list-to-generic - list '(:splicep nil :ostart "\\begin{enumerate}" :oend "\\end{enumerate}" - :ustart "\\begin{itemize}" :uend "\\end{itemize}" - :dstart "\\begin{description}" :dend "\\end{description}" - :dtstart "[" :dtend "]" - :ddstart "" :ddend "" - :istart "\\item " :iend "" - :isep "\n" :lsep "\n"))) - -(defun org-list-to-html (list) - "Convert LIST into a HTML list." + list + (org-combine-plists + '(:splicep nil :ostart "\\begin{enumerate}" :oend "\\end{enumerate}" + :ustart "\\begin{itemize}" :uend "\\end{itemize}" + :dstart "\\begin{description}" :dend "\\end{description}" + :dtstart "[" :dtend "]" + :ddstart "" :ddend "" + :istart "\\item " :iend "" + :isep "\n" :lsep "\n" + :cbon "\\texttt{[X]}" :cboff "\\texttt{[ ]}") + params))) + +(defun org-list-to-html (list &optional params) + "Convert LIST into a HTML list. +LIST is as returnd by `org-list-parse-list'. PARAMS is a property list +with overruling parameters for `org-list-to-generic'." (org-list-to-generic - list '(:splicep nil :ostart "<ol>" :oend "</ol>" - :ustart "<ul>" :uend "</ul>" - :dstart "<dl>" :dend "</dl>" - :dtstart "<dt>" :dtend "</dt>" - :ddstart "<dd>" :ddend "</dd>" - :istart "<li>" :iend "</li>" - :isep "\n" :lsep "\n"))) - -(defun org-list-to-texinfo (list) - "Convert LIST into a Texinfo list." + list + (org-combine-plists + '(:splicep nil :ostart "<ol>" :oend "</ol>" + :ustart "<ul>" :uend "</ul>" + :dstart "<dl>" :dend "</dl>" + :dtstart "<dt>" :dtend "</dt>" + :ddstart "<dd>" :ddend "</dd>" + :istart "<li>" :iend "</li>" + :isep "\n" :lsep "\n" + :cbon "<code>[X]</code>" :cboff "<code>[ ]</code>") + params))) + +(defun org-list-to-texinfo (list &optional params) + "Convert LIST into a Texinfo list. +LIST is as returnd by `org-list-parse-list'. PARAMS is a property list +with overruling parameters for `org-list-to-generic'." (org-list-to-generic - list '(:splicep nil :ostart "@itemize @minus" :oend "@end itemize" - :ustart "@enumerate" :uend "@end enumerate" - :dstart "@table" :dend "@end table" - :dtstart "@item " :dtend "\n" - :ddstart "" :ddend "" - :istart "@item\n" :iend "" - :isep "\n" :lsep "\n"))) + list + (org-combine-plists + '(:splicep nil :ostart "@itemize @minus" :oend "@end itemize" + :ustart "@enumerate" :uend "@end enumerate" + :dstart "@table" :dend "@end table" + :dtstart "@item " :dtend "\n" + :ddstart "" :ddend "" + :istart "@item\n" :iend "" + :isep "\n" :lsep "\n" + :cbon "@code{[X]}" :cboff "@code{[ ]}") + params))) (provide 'org-list) diff --git a/lisp/org/org-mac-message.el b/lisp/org/org-mac-message.el index 88aa2bcc5e0..b65bc20eae8 100644 --- a/lisp/org/org-mac-message.el +++ b/lisp/org/org-mac-message.el @@ -3,7 +3,7 @@ ;; Copyright (C) 2008, 2009 Free Software Foundation, Inc. ;; Author: John Wiegley <johnw@gnu.org> -;; Version: 6.16 +;; Version: 6.19a ;; Keywords: outlines, hypermedia, calendar, wp ;; This file is part of GNU Emacs. diff --git a/lisp/org/org-macs.el b/lisp/org/org-macs.el index 692b48aa80d..6772e98ecf8 100644 --- a/lisp/org/org-macs.el +++ b/lisp/org/org-macs.el @@ -5,7 +5,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.16 +;; Version: 6.19a ;; ;; This file is part of GNU Emacs. ;; @@ -48,6 +48,8 @@ (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))) ss)) @@ -102,6 +104,11 @@ 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-with-remote-undo (_buffer &rest _body) "Execute BODY while recording undo information in two buffers." `(let ((_cline (org-current-line)) @@ -188,6 +195,9 @@ 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-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) diff --git a/lisp/org/org-mew.el b/lisp/org/org-mew.el index 6daae57a3f0..20a0f08fdcd 100644 --- a/lisp/org/org-mew.el +++ b/lisp/org/org-mew.el @@ -5,7 +5,7 @@ ;; Author: Tokuya Kameshima <kames at fa2 dot so-net dot ne dot jp> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.16 +;; Version: 6.19a ;; This file is part of GNU Emacs. diff --git a/lisp/org/org-mhe.el b/lisp/org/org-mhe.el index 70040ca2275..21a4b6afcd2 100644 --- a/lisp/org/org-mhe.el +++ b/lisp/org/org-mhe.el @@ -5,7 +5,7 @@ ;; Author: Thomas Baumann <thomas dot baumann at ch dot tum dot de> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.16 +;; Version: 6.19a ;; ;; This file is part of GNU Emacs. ;; diff --git a/lisp/org/org-mouse.el b/lisp/org/org-mouse.el index 1ae9f041a59..f4dae16dd6b 100644 --- a/lisp/org/org-mouse.el +++ b/lisp/org/org-mouse.el @@ -4,7 +4,7 @@ ;; ;; Author: Piotr Zielinski <piotr dot zielinski at gmail dot com> ;; Maintainer: Carsten Dominik <carsten at orgmode dot org> -;; Version: 6.16 +;; Version: 6.19a ;; ;; This file is part of GNU Emacs. ;; @@ -219,12 +219,11 @@ this function is called. Otherwise, the current major mode menu is used." (funcall org-mouse-context-menu-function event) (if (fboundp 'mouse-menu-major-mode-map) (popup-menu (mouse-menu-major-mode-map) event prefix) - (with-no-warnings ; don't warn about fallback, obsolete since 23.1 - (mouse-major-mode-menu event prefix))))) + (org-no-warnings ; don't warn about fallback, obsolete since 23.1 + (mouse-major-mode-menu event prefix))))) (setq this-command 'mouse-save-then-kill) (mouse-save-then-kill event))) - (defun org-mouse-line-position () "Returns `:beginning' or `:middle' or `:end', depending on the point position. diff --git a/lisp/org/org-plot.el b/lisp/org/org-plot.el index 7a7dc14dc55..a0a79a82c39 100644 --- a/lisp/org/org-plot.el +++ b/lisp/org/org-plot.el @@ -5,7 +5,7 @@ ;; Author: Eric Schulte <schulte dot eric at gmail dot com> ;; Keywords: tables, plotting ;; Homepage: http://orgmode.org -;; Version: 6.16 +;; Version: 6.19a ;; ;; This file is part of GNU Emacs. ;; @@ -316,12 +316,14 @@ line directly before or after the table." (mapcar (lambda (row) (nth ind row)) table)))) 0) (plist-put params :timeind t) ;; check for text ind column - (if (> (length - (delq 0 (mapcar - (lambda (el) - (if (string-match org-table-number-regexp el) - 0 1)) - (mapcar (lambda (row) (nth ind row)) table)))) 0) + + (if (or (string= (plist-get params :with) "hist") + (> (length + (delq 0 (mapcar + (lambda (el) + (if (string-match org-table-number-regexp el) + 0 1)) + (mapcar (lambda (row) (nth ind row)) table)))) 0)) (plist-put params :textind t))))) ;; write script (with-temp-buffer diff --git a/lisp/org/org-publish.el b/lisp/org/org-publish.el index ba5fe0a8d99..149975fac22 100644 --- a/lisp/org/org-publish.el +++ b/lisp/org/org-publish.el @@ -4,7 +4,7 @@ ;; Author: David O'Toole <dto@gnu.org> ;; Maintainer: Bastien Guerry <bzg AT altern DOT org> ;; Keywords: hypermedia, outlines, wp -;; Version: 6.16 +;; Version: 6.19a ;; This file is part of GNU Emacs. ;; diff --git a/lisp/org/org-remember.el b/lisp/org/org-remember.el index d6662b46482..047209f1091 100644 --- a/lisp/org/org-remember.el +++ b/lisp/org/org-remember.el @@ -5,7 +5,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.16 +;; Version: 6.19a ;; ;; This file is part of GNU Emacs. ;; diff --git a/lisp/org/org-rmail.el b/lisp/org/org-rmail.el index c1fdf01ad4c..45990f0f4dc 100644 --- a/lisp/org/org-rmail.el +++ b/lisp/org/org-rmail.el @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.16 +;; Version: 6.19a ;; ;; This file is part of GNU Emacs. ;; diff --git a/lisp/org/org-table.el b/lisp/org/org-table.el index 7d1c7383f98..13f1879b1a7 100644 --- a/lisp/org/org-table.el +++ b/lisp/org/org-table.el @@ -5,7 +5,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.16 +;; Version: 6.19a ;; ;; This file is part of GNU Emacs. ;; @@ -1222,6 +1222,9 @@ With prefix ABOVE, insert above the current line." (interactive "P") (if (not (org-at-table-p)) (error "Not at a table")) + (when (eobp) (insert "\n") (backward-char 1)) + (if (not (string-match "|[ \t]*$" (org-current-line-string))) + (org-table-align)) (let ((line (org-table-clean-line (buffer-substring (point-at-bol) (point-at-eol)))) (col (current-column))) @@ -1729,7 +1732,7 @@ When NAMED is non-nil, look for a named equation." ref) (int-to-string (org-table-current-column)))) (dummy (and (or nameass refass) (not named) - (not (y-or-n-p "Replace field formula with column formula? " )) + (not (y-or-n-p "Replace existing field formula with column formula? " )) (error "Abort"))) (name (or name ref)) (org-table-may-need-update nil) @@ -1906,6 +1909,7 @@ For all numbers larger than LIMIT, shift them by DELTA." (if (match-end 1) (push l hlines) (push l dlines)) (beginning-of-line 2) (setq l (1+ l))) + (push 'hline types) ;; add an imaginary extra hline to the end (setq org-table-current-line-types (apply 'vector (nreverse types)) last-dline (car dlines) org-table-dlines (apply 'vector (cons nil (nreverse dlines))) @@ -1914,7 +1918,7 @@ For all numbers larger than LIMIT, shift them by DELTA." (let* ((l last-dline) (fields (org-split-string (buffer-substring (point-at-bol) (point-at-eol)) - "|")) + "[ \t]*|[ \t]*")) (nfields (length fields)) al al2) (loop for i from 1 to nfields do @@ -2149,6 +2153,16 @@ not overwrite the stored one." (if (and lispp literal) (setq lispp 'literal)) ;; Check for old vertical references (setq form (org-table-rewrite-old-row-references form)) + ;; Insert remote references + (while (string-match "\\<remote([ \t]*\\([-_a-zA-Z0-9]+\\)[ \t]*,[ \t]*\\([^\n)]+\\))" form) + (setq form + (replace-match + (save-match-data + (org-table-make-reference + (org-table-get-remote-range + (match-string 1 form) (match-string 2 form)) + keep-empty numbers lispp)) + t t form))) ;; Insert complex ranges (while (and (string-match org-table-range-regexp form) (> (length (match-string 0 form)) 1)) @@ -2525,12 +2539,14 @@ known that the table will be realigned a little later anyway." (setq f (replace-match (concat "$" (cdr a)) t t f))) ;; Parameters and constants (setq start 0) - (while (setq start (string-match "\\$\\([a-zA-Z][_a-zA-Z0-9]*\\)" f start)) - (setq start (1+ start)) - (if (setq a (save-match-data - (org-table-get-constant (match-string 1 f)))) - (setq f (replace-match - (concat (if pp "(") a (if pp ")")) t t f)))) + (while (setq start (string-match "\\$\\([a-zA-Z][_a-zA-Z0-9]*\\)\\|\\(\\<remote([^)]*)\\)" f start)) + (if (match-end 2) + (setq start (match-end 2)) + (setq start (1+ start)) + (if (setq a (save-match-data + (org-table-get-constant (match-string 1 f)))) + (setq f (replace-match + (concat (if pp "(") a (if pp ")")) t t f))))) (if org-table-formula-debug (put-text-property 0 (length f) :orig-formula f1 f)) f)) @@ -2673,7 +2689,7 @@ Parameters get priority." Works for single references, but also for entire formulas and even the full TBLFM line." (let ((start 0)) - (while (string-match "\\<\\([a-zA-Z]+\\)\\([0-9]+\\>\\|&\\)\\|\\(;[^\r\n:]+\\)" s start) + (while (string-match "\\<\\([a-zA-Z]+\\)\\([0-9]+\\>\\|&\\)\\|\\(;[^\r\n:]+\\|\\<remote([^)]*)\\)" s start) (cond ((match-end 3) ;; format match, just advance @@ -4065,6 +4081,60 @@ provide ORGTBL directives for the generated table." (params (org-combine-plists params2 params))) (orgtbl-to-generic table params))) +(defun org-table-get-remote-range (name-or-id form) + "Get a field value or a list of values in a range from table at ID. + +NAME-OR-ID may be the name of a table in the current file as set by +a \"#+TBLNAME:\" directive. The first table following this line +will then be used. Alternatively, it may be an ID referring to +any entry, also in a different file. In this case, the first table +in that netry will be referenced. +FORM is a field or range descriptor like \"@2$3\" or or \"B3\" or +\"@I$2..@II$2\". All the references must be absolute, not relative. + +The return value is either a single string for a single field, or a +list of the fields in the rectangle ." + (save-match-data + (let ((id-loc nil) + org-table-column-names org-table-column-name-regexp + org-table-local-parameters org-table-named-field-locations + org-table-current-line-types org-table-current-begin-line + org-table-current-begin-pos org-table-dlines + org-table-hlines org-table-last-alignment + org-table-last-column-widths org-table-last-alignment + org-table-last-column-widths tbeg + buffer loc) + (save-excursion + (save-restriction + (widen) + (save-excursion + (goto-char (point-min)) + (if (re-search-forward + (concat "^#\\+TBLNAME:[ \t]*" (regexp-quote name-or-id) "[ \t]*$") + nil t) + (setq buffer (current-buffer) loc (match-beginning 0)) + (setq id-loc (org-id-find name-or-id 'marker) + buffer (marker-buffer id-loc) + loc (marker-position id-loc)) + (move-marker id-loc nil))) + (switch-to-buffer buffer) + (save-excursion + (save-restriction + (widen) + (goto-char loc) + (forward-char 1) + (unless (and (re-search-forward "^\\(\\*+ \\)\\|[ \t]*|" nil t) + (not (match-beginning 1))) + (error "Cannot find a table at NAME or ID %s" name-or-id)) + (setq tbeg (point-at-bol)) + (org-table-get-specials) + (setq form (org-table-formula-substitute-names form)) + (if (and (string-match org-table-range-regexp form) + (> (length (match-string 0 form)) 1)) + (save-match-data + (org-table-get-range (match-string 0 form) tbeg 1)) + form)))))))) + (provide 'org-table) ;; arch-tag: 4d21cfdd-0268-440a-84b0-09237a0fe0ef diff --git a/lisp/org/org-timer.el b/lisp/org/org-timer.el index 2c56ca9b9b3..3320f77d297 100644 --- a/lisp/org/org-timer.el +++ b/lisp/org/org-timer.el @@ -1,11 +1,11 @@ -;;; org-clock.el --- The time clocking code for Org-mode +;;; org-timer.el --- The relative timer code for Org-mode ;; Copyright (C) 2008, 2009 Free Software Foundation, Inc. ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.16 +;; Version: 6.19a ;; ;; This file is part of GNU Emacs. ;; @@ -32,6 +32,9 @@ (defvar org-timer-start-time nil "t=0 for the running timer.") +(defvar org-timer-pause-time nil + "Time when the timer was paused.") + (defconst org-timer-re "\\([-+]?[0-9]+\\):\\([0-9]\\{2\\}\\):\\([0-9]\\{2\\}\\)" "Regular expression used to match timer stamps.") @@ -75,10 +78,41 @@ the region 0:00:00." (- (time-to-seconds (current-time)) (org-timer-hms-to-secs s))))) + (org-timer-set-mode-line 'on) (message "Timer start time set to %s, current value is %s" (format-time-string "%T" org-timer-start-time) (org-timer-secs-to-hms (or delta 0)))))) +(defun org-timer-pause-or-continue (&optional stop) + "Pause or continue the relative timer. With prefix arg, stop it entirely." + (interactive "P") + (cond + (stop (org-timer-stop)) + ((not org-timer-start-time) (error "No timer is running")) + (org-timer-pause-time + ;; timer is paused, continue + (setq org-timer-start-time + (seconds-to-time + (- + (time-to-seconds (current-time)) + (- (time-to-seconds org-timer-pause-time) + (time-to-seconds org-timer-start-time)))) + org-timer-pause-time nil) + (org-timer-set-mode-line 'on) + (message "Timer continues at %s" (org-timer-value-string))) + (t + ;; pause timer + (setq org-timer-pause-time (current-time)) + (org-timer-set-mode-line 'pause) + (message "Timer paused at %s" (org-timer-value-string))))) + +(defun org-timer-stop () + "Stop the relative timer." + (interactive) + (setq org-timer-start-time nil + org-timer-pause-time nil) + (org-timer-set-mode-line 'off)) + ;;;###autoload (defun org-timer (&optional restart) "Insert a H:MM:SS string from the timer into the buffer. @@ -90,12 +124,14 @@ that was not started at the correct moment." (interactive "P") (if (equal restart '(4)) (org-timer-start)) (or org-timer-start-time (org-timer-start)) - (insert (format - org-timer-format - (org-timer-secs-to-hms - (floor - (- (time-to-seconds (current-time)) - (time-to-seconds org-timer-start-time))))))) + (insert (org-timer-value-string))) + +(defun org-timer-value-string () + (format org-timer-format (org-timer-secs-to-hms (floor (org-timer-seconds))))) + +(defun org-timer-seconds () + (- (time-to-seconds (or org-timer-pause-time (current-time))) + (time-to-seconds org-timer-start-time))) ;;;###autoload (defun org-timer-change-times-in-region (beg end delta) @@ -176,6 +212,47 @@ If the integer is negative, the string will start with \"-\"." h (/ m 60) m (- m (* 60 h))) (format "%s%d:%02d:%02d" sign h m s))) +(defvar org-timer-mode-line-timer nil) +(defvar org-timer-mode-line-string nil) + +(defun org-timer-set-mode-line (value) + "Set the mode-line dispay of the relative timer. +VALUE can be `on', `off', or `pause'." + (or global-mode-string (setq global-mode-string '(""))) + (or (memq 'org-timer-mode-line-string global-mode-string) + (setq global-mode-string + (append global-mode-string '(org-timer-mode-line-string)))) + (cond + ((equal value 'off) + (when org-timer-mode-line-timer + (cancel-timer org-timer-mode-line-timer) + (setq org-timer-mode-line-timer nil)) + (setq global-mode-string + (delq 'org-timer-mode-line-string global-mode-string)) + (force-mode-line-update)) + ((equal value 'pause) + (when org-timer-mode-line-timer + (cancel-timer org-timer-mode-line-timer) + (setq org-timer-mode-line-timer nil))) + ((equal value 'on) + (or global-mode-string (setq global-mode-string '(""))) + (or (memq 'org-timer-mode-line-string global-mode-string) + (setq global-mode-string + (append global-mode-string '(org-timer-mode-line-string)))) + (org-timer-update-mode-line) + (when org-timer-mode-line-timer + (cancel-timer org-timer-mode-line-timer)) + (setq org-timer-mode-line-timer + (run-with-timer 1 1 'org-timer-update-mode-line))))) + +(defun org-timer-update-mode-line () + "Update the timer time in the mode line." + (if org-timer-pause-time + nil + (setq org-timer-mode-line-string + (concat " <" (substring (org-timer-value-string) 0 -1) ">")) + (force-mode-line-update))) + ;; arch-tag: 97538f8c-3871-4509-8f23-1e7b3ff3d107 ;;; org-timer.el ends here diff --git a/lisp/org/org-vm.el b/lisp/org/org-vm.el index fb94b0f22b9..24af56b2321 100644 --- a/lisp/org/org-vm.el +++ b/lisp/org/org-vm.el @@ -5,7 +5,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.16 +;; Version: 6.19a ;; ;; This file is part of GNU Emacs. ;; diff --git a/lisp/org/org-w3m.el b/lisp/org/org-w3m.el index 5486ad86ac3..f1d2350b0ba 100644 --- a/lisp/org/org-w3m.el +++ b/lisp/org/org-w3m.el @@ -5,7 +5,7 @@ ;; Author: Andy Stewart <lazycat dot manatee at gmail dot com> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.16 +;; Version: 6.19a ;; ;; This file is part of GNU Emacs. ;; @@ -49,93 +49,97 @@ This will encode `link-title' and `link-location' with `org-make-link-string', and insert the transformed test into the kill ring, so that it can be yanked into an Org-mode buffer with links working correctly." (interactive) - (let ((regionp (org-region-active-p)) - transform-start transform-end - return-content - link-location link-title - temp-position out-bound) - (setq transform-start (if regionp (region-beginning) (point-min)) - transform-end (if regionp (region-end) (point-max))) + (let* ((regionp (org-region-active-p)) + (transform-start (point-min)) + (transform-end (point-max)) + return-content + link-location link-title + temp-position out-bound) + (when regionp + (setq transform-start (region-beginning)) + (setq transform-end (region-end)) + ;; Deactivate mark if current mark is activate. + (if (fboundp 'deactivate-mark) (deactivate-mark))) (message "Transforming links...") (save-excursion (goto-char transform-start) - (while (and (not out-bound) ; still inside region to copy - (not (org-w3m-no-next-link-p))) ; no next link current buffer - ;; store current point before jump next anchor - (setq temp-position (point)) - ;; move to next anchor when current point is not at anchor - (or (w3m-anchor (point)) (org-w3m-get-next-link-start)) - (if (<= (point) transform-end) ; if point is inside transform bound - (progn - ;; get content between two links. - (if (> (point) temp-position) - (setq return-content (concat return-content - (buffer-substring - temp-position (point))))) - ;; get link location at current point. - (setq link-location (w3m-anchor (point))) - ;; get link title at current point. - (setq link-title (buffer-substring (point) - (org-w3m-get-anchor-end))) - ;; concat `org-mode' style url to `return-content'. - (setq return-content (concat return-content - (org-make-link-string - link-location link-title)))) - (goto-char temp-position) ; reset point before jump next anchor - (setq out-bound t) ; for break out `while' loop - )) + (while (and (not out-bound) ; still inside region to copy + (not (org-w3m-no-next-link-p))) ; no next link current buffer + ;; store current point before jump next anchor + (setq temp-position (point)) + ;; move to next anchor when current point is not at anchor + (or (w3m-anchor (point)) (org-w3m-get-next-link-start)) + (if (<= (point) transform-end) ; if point is inside transform bound + (progn + ;; get content between two links. + (if (> (point) temp-position) + (setq return-content (concat return-content + (buffer-substring + temp-position (point))))) + ;; get link location at current point. + (setq link-location (w3m-anchor (point))) + ;; get link title at current point. + (setq link-title (buffer-substring (point) + (org-w3m-get-anchor-end))) + ;; concat `org-mode' style url to `return-content'. + (setq return-content (concat return-content + (org-make-link-string + link-location link-title)))) + (goto-char temp-position) ; reset point before jump next anchor + (setq out-bound t) ; for break out `while' loop + )) ;; add the rest until end of the region to be copied (if (< (point) transform-end) - (setq return-content - (concat return-content - (buffer-substring (point) transform-end)))) + (setq return-content + (concat return-content + (buffer-substring (point) transform-end)))) (kill-new return-content) (message "Transforming links...done, use C-y to insert text into Org-mode file") (message "Copy with link transformation complete.")))) (defun org-w3m-get-anchor-start () - "Move to and return `point' for the start of the current anchor." + "Move cursor to the start of current anchor. Return point." ;; get start position of anchor or current point (goto-char (or (previous-single-property-change (point) 'w3m-anchor-sequence) - (point)))) + (point)))) (defun org-w3m-get-anchor-end () - "Move and return `point' after the end of current anchor." + "Move cursor to the end of current anchor. Return point." ;; get end position of anchor or point (goto-char (or (next-single-property-change (point) 'w3m-anchor-sequence) (point)))) (defun org-w3m-get-next-link-start () - "Move and return `point' for that start of the current link." + "Move cursor to the start of next link. Return point." (catch 'reach (while (next-single-property-change (point) 'w3m-anchor-sequence) ;; jump to next anchor (goto-char (next-single-property-change (point) 'w3m-anchor-sequence)) (when (w3m-anchor (point)) - ;; return point when current is valid link - (throw 'reach nil)))) + ;; return point when current is valid link + (throw 'reach nil)))) (point)) (defun org-w3m-get-prev-link-start () - "Move and return `point' for that end of the current link." + "Move cursor to the start of prevoius link. Return point." (catch 'reach (while (previous-single-property-change (point) 'w3m-anchor-sequence) ;; jump to previous anchor (goto-char (previous-single-property-change (point) 'w3m-anchor-sequence)) (when (w3m-anchor (point)) - ;; return point when current is valid link - (throw 'reach nil)))) + ;; return point when current is valid link + (throw 'reach nil)))) (point)) (defun org-w3m-no-next-link-p () - "Return t if no next link after cursor. -Otherwise, return nil." + "Whether there is no next link after the cursor. +Return t if there is no next link; otherwise, return nil." (save-excursion (equal (point) (org-w3m-get-next-link-start)))) (defun org-w3m-no-prev-link-p () - "Return t if no previous link after cursor. -Otherwise, return nil." + "Whether there is no previous link after the cursor. +Return t if there is no previous link; otherwise, return nil." (save-excursion (equal (point) (org-w3m-get-prev-link-start)))) @@ -143,11 +147,11 @@ Otherwise, return nil." (defvar w3m-mode-map) (defvar w3m-minor-mode-map) (when (and (boundp 'w3m-mode-map) - (keymapp w3m-mode-map)) + (keymapp w3m-mode-map)) (define-key w3m-mode-map "\C-c\C-x\M-w" 'org-w3m-copy-for-org-mode) (define-key w3m-mode-map "\C-c\C-x\C-w" 'org-w3m-copy-for-org-mode)) (when (and (boundp 'w3m-minor-mode-map) - (keymapp w3m-minor-mode-map)) + (keymapp w3m-minor-mode-map)) (define-key w3m-minor-mode-map "\C-c\C-x\M-w" 'org-w3m-copy-for-org-mode) (define-key w3m-minor-mode-map "\C-c\C-x\C-w" 'org-w3m-copy-for-org-mode)) (add-hook diff --git a/lisp/org/org-wl.el b/lisp/org/org-wl.el index 11992dea16f..6e82fadced2 100644 --- a/lisp/org/org-wl.el +++ b/lisp/org/org-wl.el @@ -5,7 +5,7 @@ ;; Author: Tokuya Kameshima <kames at fa2 dot so-net dot ne dot jp> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.16 +;; Version: 6.19a ;; ;; This file is part of GNU Emacs. ;; diff --git a/lisp/org/org.el b/lisp/org/org.el index b397a0604e8..97ba3924bd5 100644 --- a/lisp/org/org.el +++ b/lisp/org/org.el @@ -5,7 +5,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.16 +;; Version: 6.19a ;; ;; This file is part of GNU Emacs. ;; @@ -87,12 +87,13 @@ (require 'org-compat) (require 'org-faces) (require 'org-list) +(require 'org-footnote) ;;;; Customization variables ;;; Version -(defconst org-version "6.16" +(defconst org-version "6.19a" "The version number of the file org.el.") (defun org-version (&optional here) @@ -688,15 +689,21 @@ for the duration of the command." :group 'org-structure :type 'boolean) -(defcustom org-blank-before-new-entry '((heading . nil) - (plain-list-item . nil)) +(defcustom org-blank-before-new-entry '((heading . auto) + (plain-list-item . auto)) "Should `org-insert-heading' leave a blank line before new heading/item? The value is an alist, with `heading' and `plain-list-item' as car, and a boolean flag as cdr." :group 'org-edit-structure :type '(list - (cons (const heading) (boolean)) - (cons (const plain-list-item) (boolean)))) + (cons (const heading) + (choice (const :tag "Never" nil) + (const :tag "Always" t) + (const :tag "Auto" auto))) + (cons (const plain-list-item) + (choice (const :tag "Never" nil) + (const :tag "Always" t) + (const :tag "Auto" auto))))) (defcustom org-insert-heading-hook nil "Hook being run after inserting a new heading." @@ -728,6 +735,23 @@ there are kept outside the narrowed region." (const :tag "from `lang' element") (const :tag "from `style' element"))))) +(defcustom org-coderef-label-format "(ref:%s)" + "The default coderef format. +This format string will be used to search for coderef labels in literal +examples (EXAMPLE and SRC blocks). The format can be overwritten +an individual literal example with the -f option, like + +#+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." @@ -887,7 +911,7 @@ adaptive Use relative path for files in the current directory and sub- (const noabbrev) (const adaptive))) -(defcustom org-activate-links '(bracket angle plain radio tag date) +(defcustom org-activate-links '(bracket angle plain radio tag date footnote) "Types of links that should be activated in Org-mode files. This is a list of symbols, each leading to the activation of a certain link type. In principle, it does not hurt to turn on most link types - there may @@ -900,15 +924,18 @@ plain Plain links in normal text, no whitespace, like http://google.com. radio Text that is matched by a radio target, see manual for details. tag Tag settings in a headline (link to tag search). date Time stamps (link to calendar). +footnote Footnote labels. Changing this variable requires a restart of Emacs to become effective." :group 'org-link - :type '(set (const :tag "Double bracket links (new style)" bracket) + :type '(set :greedy t + (const :tag "Double bracket links (new style)" bracket) (const :tag "Angular bracket links (old style)" angular) (const :tag "Plain text links" plain) (const :tag "Radio target matches" radio) (const :tag "Tags" tag) - (const :tag "Timestamps" date))) + (const :tag "Timestamps" date) + (const :tag "Footnotes" footnote))) (defcustom org-make-link-description-function nil "Function to use to generate link descriptions from links. If @@ -2208,7 +2235,7 @@ default is the character `k' because we use the same key in the agenda." (defcustom org-format-latex-options '(:foreground default :background default :scale 1.0 :html-foreground "Black" :html-background "Transparent" :html-scale 1.0 - :matchers ("begin" "$" "$$" "\\(" "\\[")) + :matchers ("begin" "$1" "$" "$$" "\\(" "\\[")) "Options for creating images from LaTeX fragments. This is a property list with the following properties: :foreground the foreground color for images embedded in Emacs, e.g. \"Black\". @@ -2221,6 +2248,7 @@ This is a property list with the following properties: :matchers a list indicating which matchers should be used to find LaTeX fragments. Valid members of this list are: \"begin\" find environments + \"$1\" find single characters surrounded by $.$ \"$\" find math expressions surrounded by $...$ \"$$\" find math expressions surrounded by $$....$$ \"\\(\" find math expressions surrounded by \\(...\\) @@ -2418,7 +2446,10 @@ Use customize to modify this, or restart Emacs after changing it." :group 'org) (defcustom org-completion-use-ido nil - "Non-nil means, use ido completion wherever possible." + "Non-nil means, use ido completion wherever possible. +Note that `ido-mode' must be active for this variable to be relevant. +If you decide to turn this variable on, you might well want to turn off +`org-outline-path-complete-in-steps'." :group 'org-completion :type 'boolean) @@ -2455,6 +2486,7 @@ Normal means, no org-mode-specific context." (declare-function iswitchb-read-buffer (prompt &optional default require-match start matches-set)) (defvar iswitchb-temp-buflist) (declare-function org-gnus-follow-link "org-gnus" (&optional group article)) +(defvar org-agenda-tags-todo-honor-ignore-options) (declare-function org-agenda-skip "org-agenda" ()) (declare-function org-format-agenda-item "org-agenda" (extra txt &optional category tags dotime noprefix remove-re)) @@ -2466,6 +2498,9 @@ Normal means, no org-mode-specific context." (declare-function org-agenda-save-markers-for-cut-and-paste "org-agenda" (beg end)) (declare-function org-agenda-copy-local-variable "org-agenda" (var)) +(declare-function org-agenda-check-for-timestamp-as-reason-to-ignore-todo-item + "org-agenda" (&optional end)) + (declare-function parse-time-string "parse-time" (string)) (declare-function remember "remember" (&optional initial)) (declare-function remember-buffer-desc "remember" ()) @@ -2620,7 +2655,8 @@ If TABLE-TYPE is non-nil, also check for table.el-type tables." (org-autoload "org-agenda" '(org-agenda org-agenda-list org-search-view org-todo-list org-tags-view org-agenda-list-stuck-projects - org-diary org-agenda-to-appt))) + org-diary org-agenda-to-appt + org-agenda-check-for-timestamp-as-reason-to-ignore-todo-item))) ;; Autoload org-remember @@ -2634,7 +2670,7 @@ If TABLE-TYPE is non-nil, also check for table.el-type tables." (declare-function org-clock-save-markers-for-cut-and-paste "org-clock" (beg end)) -(declare-function org-update-mode-line "org-clock" ()) +(declare-function org-clock-update-mode-line "org-clock" ()) (defvar org-clock-start-time) (defvar org-clock-marker (make-marker) "Marker recording the last clock-in.") @@ -2644,7 +2680,7 @@ If TABLE-TYPE is non-nil, also check for table.el-type tables." "org-clock" '(org-clock-in org-clock-out org-clock-cancel org-clock-goto org-clock-sum org-clock-display - org-remove-clock-overlays org-clock-report + org-clock-remove-overlays org-clock-report org-clocktable-shift org-dblock-write:clocktable org-get-clocktable))) @@ -2671,7 +2707,7 @@ Otherwise, return nil." (setq org-clock-start-time (apply 'encode-time (org-parse-time-string (match-string 1)))) - (org-update-mode-line))) + (org-clock-update-mode-line))) (t (and (match-end 4) (delete-region (match-beginning 4) (match-end 4))) (end-of-line 1) @@ -2739,7 +2775,9 @@ Org-mode Agenda. The archived entries will be filed as subtrees of the specified headline. When the headline is omitted, the subtrees are simply -filed away at the end of the file, as top-level entries. +filed away at the end of the file, as top-level entries. Also in +the heading you can use %s to represent the file name, this can be +useful when using the same archive for a number of different files. Here are a few examples: \"%s_archive::\" @@ -2753,6 +2791,10 @@ Here are a few examples: \"~/org/archive.org::\" Archive in file ~/org/archive.org (absolute path), as top-level trees. +\"~/org/archive.org::From %s\" + Archive in file ~/org/archive.org (absolute path), und headlines + \"From FILENAME\" where file name is the current file name. + \"basement::** Finished Tasks\" Archive in file ./basement (relative path), as level 3 trees below the level 2 heading \"** Finished Tasks\". @@ -2989,6 +3031,13 @@ After a match, the following groups carry important information: ("logrepeat" org-log-repeat state) ("lognoterepeat" org-log-repeat note) ("nologrepeat" org-log-repeat nil) + ("fninline" org-footnote-define-inline t) + ("nofninline" org-footnote-define-inline nil) + ("fnlocal" org-footnote-section nil) + ("fnauto" org-footnote-auto-label t) + ("fnprompt" org-footnote-auto-label nil) + ("fnconfirm" org-footnote-auto-label confirm) + ("fnplain" org-footnote-auto-label plain) ("constcgs" constants-unit-system cgs) ("constSI" constants-unit-system SI)) "Variable associated with STARTUP options for org-mode. @@ -3202,7 +3251,7 @@ means to push this value onto the list in the variable.") (mapconcat 'regexp-quote org-todo-keywords-1 "\\|") "\\)\\>\\)?[ \t]*\\(.*\\)") org-complex-heading-regexp - (concat "^\\(\\*+\\)\\(?:[ \t]+\\(" + (concat "^\\(\\*+\\)[ \t]+\\(?:\\(" (mapconcat 'regexp-quote org-todo-keywords-1 "\\|") "\\)\\>\\)?\\(?:[ \t]*\\(\\[#.\\]\\)\\)?[ \t]*\\(.*?\\)" "\\(?:[ \t]+\\(:[[:alnum:]_@:]+:\\)\\)?[ \t]*$") @@ -3358,7 +3407,8 @@ This variable is set by `org-before-change-function'. "Every change indicates that a table might need an update." (setq org-table-may-need-update t)) (defvar org-mode-map) -(defvar org-mode-hook nil) +(defvar org-mode-hook nil + "Mode hook for Org-mode, run after the mode was turned on.") (defvar org-inhibit-startup nil) ; Dynamically-scoped param. (defvar org-agenda-keep-modes nil) ; Dynamically-scoped param. (defvar org-table-buffer-is-an nil) @@ -3534,6 +3584,8 @@ Here is what the match groups contain after a match: 3: path 4: [desc] 5: desc") +(defvar org-bracket-link-analytic-regexp++ nil + "Like org-bracket-link-analytic-regexp, but include coderef internal type.") (defvar org-any-link-re nil "Regular expression matching any link.") @@ -3580,6 +3632,14 @@ This should be called after the variable `org-link-types' has changed." "\\]" "\\(\\[" "\\([^]]+\\)" "\\]\\)?" "\\]") + org-bracket-link-analytic-regexp++ + (concat + "\\[\\[" + "\\(\\(" (mapconcat 'identity (cons "coderef" org-link-types) "\\|") "\\):\\)?" + "\\([^]]+\\)" + "\\]" + "\\(\\[" "\\([^]]+\\)" "\\]\\)?" + "\\]") org-any-link-re (concat "\\(" org-bracket-link-regexp "\\)\\|\\(" org-angle-link-re "\\)\\|\\(" @@ -3728,6 +3788,22 @@ will be prompted for." )) t))) +(defun org-activate-footnote-links (limit) + "Run through the buffer and add overlays to links." + (if (re-search-forward "\\(^\\|[^][]\\)\\(\\[\\([0-9]+\\]\\|fn:[^ \t\r\n:]+?[]:]\\)\\)" + limit t) + (progn + (add-text-properties (match-beginning 2) (match-end 2) + (list 'mouse-face 'highlight + 'rear-nonsticky org-nonsticky-props + 'keymap org-mouse-map + 'help-echo + (if (= (point-at-bol) (match-beginning 2)) + "Footnote definition" + "Footnote reference") + )) + t))) + (defun org-activate-bracket-links (limit) "Run through the buffer and add overlays to bracketed links." (if (re-search-forward org-bracket-link-regexp limit t) @@ -3982,6 +4058,8 @@ between words." (if (memq 'bracket lk) '(org-activate-bracket-links (0 'org-link t))) (if (memq 'radio lk) '(org-activate-target-links (0 'org-link t))) (if (memq 'date lk) '(org-activate-dates (0 'org-date t))) + (if (memq 'footnote lk) '(org-activate-footnote-links + (2 'org-footnote t))) '("^&?%%(.*\\|<%%([^>\n]*?>" (0 'org-sexp-date t)) '(org-hide-wide-columns (0 nil append)) ;; TODO lines @@ -4771,6 +4849,13 @@ frame is not changed." ;;; Inserting headlines +(defun org-previous-line-empty-p () + (save-excursion + (and (not (bobp)) + (or (beginning-of-line 0) t) + (save-match-data + (looking-at "[ \t]*$"))))) + (defun org-insert-heading (&optional force-heading) "Insert a new heading or item with same depth at point. If point is in a plain list and FORCE-HEADING is nil, create a new list item. @@ -4781,13 +4866,16 @@ but create the new headline after the current line." (if (= (buffer-size) 0) (insert "\n* ") (when (or force-heading (not (org-insert-item))) - (let* ((head (save-excursion + (let* ((empty-line-p nil) + (head (save-excursion (condition-case nil (progn (org-back-to-heading) + (setq empty-line-p (org-previous-line-empty-p)) (match-string 0)) (error "*")))) - (blank (cdr (assq 'heading org-blank-before-new-entry))) + (blank-a (cdr (assq 'heading org-blank-before-new-entry))) + (blank (if (eq blank-a 'auto) empty-line-p blank-a)) pos hide-previous previous-pos) (cond ((and (org-on-heading-p) (bolp) @@ -4820,6 +4908,8 @@ but create the new headline after the current line." (org-insert-heading-respect-content (org-end-of-subtree nil t) (or (bolp) (newline)) + (or (org-previous-line-empty-p) + (and blank (newline))) (open-line 1)) ((org-on-heading-p) (when hide-previous @@ -4862,6 +4952,25 @@ but create the new headline after the current line." "\\*+[ \t]+\\([^\r\n]*\\)")) (match-string 1) ""))) +(defun org-heading-components () + "Return the components of the current heading. +This is a list with the following elements: +- the level as an integer +- the reduced level, different if `org-odd-levels-only' is set. +- the TODO keyword, or nil +- the priority character, like ?A, or nil if no priority is given +- the headline text itself, or the tags string if no headline text +- the tags string, or nil." + (save-excursion + (org-back-to-heading t) + (if (looking-at org-complex-heading-regexp) + (list (length (match-string 1)) + (org-reduced-level (length (match-string 1))) + (org-match-string-no-properties 2) + (and (match-end 3) (aref (match-string 3) 2)) + (org-match-string-no-properties 4) + (org-match-string-no-properties 5))))) + (defun org-insert-heading-after-current () "Insert a new heading with same level as current, after current subtree." (interactive) @@ -4970,6 +5079,8 @@ in the region." ((equal (char-after) ?\ ) (forward-char 1)))))) (defun org-reduced-level (l) + "Compute the effective level of a heading. +This takes into account the setting of `org-odd-levels-only'." (if org-odd-levels-only (1+ (floor (/ l 2))) l)) (defun org-get-valid-level (level &optional change) @@ -5686,13 +5797,14 @@ exit by killing the buffer with \\[org-edit-src-exit]." "Edit, then exit with C-c ' (C-c and single quote)")) (info (org-edit-src-find-region-and-lang)) (org-mode-p (eq major-mode 'org-mode)) - beg end lang lang-f single) + beg end lang lang-f single lfmt) (if (not info) nil (setq beg (nth 0 info) end (nth 1 info) lang (nth 2 info) single (nth 3 info) + lfmt (nth 4 info) lang-f (intern (concat lang "-mode"))) (unless (functionp lang-f) (error "No such language mode: %s" lang-f)) @@ -5708,6 +5820,8 @@ exit by killing the buffer with \\[org-edit-src-exit]." (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 + (set (make-local-variable 'org-coderef-label-format) lfmt)) (when org-mode-p (goto-char (point-min)) (while (re-search-forward "^," nil t) @@ -5798,7 +5912,7 @@ the language, a switch telling of the content should be in a single line." ("^#\\+ascii:" "\n" "ascii" single-line) ))) (pos (point)) - re re1 re2 single beg end lang) + re re1 re2 single beg end lang lfmt match-re1) (catch 'exit (while (setq entry (pop re-list)) (setq re1 (car entry) re2 (nth 1 entry) lang (nth 2 entry) @@ -5807,19 +5921,27 @@ the language, a switch telling of the content should be in a single line." (if (or (looking-at re1) (re-search-backward re1 nil t)) (progn - (setq beg (match-end 0) lang (org-edit-src-get-lang lang)) + (setq match-re1 (match-string 0)) + (setq beg (match-end 0) + lang (org-edit-src-get-lang lang) + lfmt (org-edit-src-get-label-format match-re1)) (if (and (re-search-forward re2 nil t) (>= (match-end 0) pos)) - (throw 'exit (list beg (match-beginning 0) lang single)))) + (throw 'exit (list beg (match-beginning 0) + lang single lfmt)))) (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)) - (throw 'exit - (list (match-end 0) end - (org-edit-src-get-lang lang) single))))))))))) + (progn + (setq lfmt (org-edit-src-get-label-format + (match-string 0))) + (throw 'exit + (list (match-end 0) end + (org-edit-src-get-lang lang) + single lfmt)))))))))))) (defun org-edit-src-get-lang (lang) "Extract the src language." @@ -5835,6 +5957,12 @@ the language, a switch telling of the content should be in a single line." (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)))) + (defun org-edit-src-exit () "Exit special edit and protect problematic lines." (interactive) @@ -6215,6 +6343,25 @@ For file links, arg negates `org-context-in-file-links'." (setq link (plist-get org-store-link-plist :link) desc (or (plist-get org-store-link-plist :description) link))) + ((equal (buffer-name) "*Org Edit Src Example*") + (let (label gc) + (while (or (not label) + (save-excursion + (save-restriction + (widen) + (goto-char (point-min)) + (re-search-forward + (regexp-quote (format org-coderef-label-format label)) + nil t)))) + (when label (message "Label exists already") (sit-for 2)) + (setq label (read-string "Code line label: " label))) + (end-of-line 1) + (setq link (format org-coderef-label-format label)) + (setq gc (- 79 (length link))) + (if (< (current-column) gc) (org-move-to-column gc t) (insert " ")) + (insert link) + (setq link (concat "(" label ")") desc nil))) + ((eq major-mode 'calendar-mode) (let ((cd (calendar-cursor-to-date))) (setq link @@ -6494,30 +6641,6 @@ This is the list that is used before handing over to the browser.") "Exclusive or." (if a (not b) b)) -(defun org-get-header (header) - "Find a header field in the current buffer." - (save-excursion - (goto-char (point-min)) - (let ((case-fold-search t) s) - (cond - ((eq header 'from) - (if (re-search-forward "^From:\\s-+\\(.*\\)" nil t) - (setq s (match-string 1))) - (while (string-match "\"" s) - (setq s (replace-match "" t t s))) - (if (string-match "[<(].*" s) - (setq s (replace-match "" t t s)))) - ((eq header 'message-id) - (if (re-search-forward "^message-id:\\s-+\\(.*\\)" nil t) - (setq s (match-string 1)))) - ((eq header 'subject) - (if (re-search-forward "^subject:\\s-+\\(.*\\)" nil t) - (setq s (match-string 1))))) - (if (string-match "\\`[ \t\]+" s) (setq s (replace-match "" t t s))) - (if (string-match "[ \t\]+\\'" s) (setq s (replace-match "" t t s))) - s))) - - (defun org-fixup-message-id-for-http (s) "Replace special characters in a message id, so it can be used in an http query." (while (string-match "<" s) @@ -6627,23 +6750,25 @@ used as the link location instead of reading one interactively." (reverse org-stored-links) "\n")))) (let ((cw (selected-window))) (select-window (get-buffer-window "*Org Links*")) - (org-fit-window-to-buffer) (setq truncate-lines t) + (org-fit-window-to-buffer) (select-window cw)) ;; Fake a link history, containing the stored links. (setq tmphist (append (mapcar 'car org-stored-links) org-insert-link-history)) (unwind-protect - (setq link (org-completing-read - "Link: " - (append - (mapcar (lambda (x) (list (concat (car x) ":"))) - (append org-link-abbrev-alist-local org-link-abbrev-alist)) - (mapcar (lambda (x) (list (concat x ":"))) - org-link-types)) - nil nil nil - 'tmphist - (or (car (car org-stored-links))))) + (setq link + (let ((org-completion-use-ido nil)) + (org-completing-read + "Link: " + (append + (mapcar (lambda (x) (list (concat (car x) ":"))) + (append org-link-abbrev-alist-local org-link-abbrev-alist)) + (mapcar (lambda (x) (list (concat x ":"))) + org-link-types)) + nil nil nil + 'tmphist + (or (car (car org-stored-links)))))) (set-window-configuration wcf) (kill-buffer "*Org Links*")) (setq entry (assoc link org-stored-links)) @@ -6710,6 +6835,7 @@ used as the link location instead of reading one interactively." (let ((minibuffer-local-completion-map (copy-keymap minibuffer-local-completion-map))) (org-defkey minibuffer-local-completion-map " " 'self-insert-command) + (org-defkey minibuffer-local-completion-map "?" 'self-insert-command) (apply 'org-ido-completing-read args))) (defun org-ido-completing-read (&rest args) @@ -6873,8 +6999,11 @@ application the system uses for this file type." (move-marker org-open-link-marker (point)) (setq org-window-config-before-follow-link (current-window-configuration)) (org-remove-occur-highlights nil nil t) - (if (org-at-timestamp-p t) - (org-follow-timestamp-link) + (cond + ((org-at-timestamp-p t) (org-follow-timestamp-link)) + ((or (org-footnote-at-reference-p) (org-footnote-at-definition-p)) + (org-footnote-action)) + (t (let (type path link line search (pos (point))) (catch 'match (save-excursion @@ -7020,7 +7149,7 @@ application the system uses for this file type." (error "Abort")))) (t - (browse-url-at-point))))) + (browse-url-at-point)))))) (move-marker org-open-link-marker nil) (run-hook-with-args 'org-follow-link-hook)) @@ -7105,6 +7234,19 @@ in all files. If AVOID-POS is given, ignore matches near that position." pos (match-beginning 0)))) ;; There is an exact target for this (goto-char pos)) + ((and (string-match "^(\\(.*\\))$" s0) + (save-excursion + (goto-char (point-min)) + (and + (re-search-forward + (concat "[^[]" (regexp-quote + (format org-coderef-label-format + (match-string 1 s0)))) + nil t) + (setq type 'dedicated + pos (1+ (match-beginning 0)))))) + ;; There is a coderef target for this + (goto-char pos)) ((string-match "^/\\(.*\\)/$" s) ;; A regular expression (cond @@ -9128,6 +9270,7 @@ this case the return value is a list of all return values from these calls. MATCHER is a Lisp form to be evaluated, testing if a given set of tags qualifies a headline for inclusion. When TODO-ONLY is non-nil, only lines with a TODO keyword are included in the output." + (require 'org-agenda) (let* ((re (concat "[\n\r]" outline-regexp " *\\(\\<\\(" (mapconcat 'regexp-quote org-todo-keywords-1 "\\|") (org-re @@ -9190,7 +9333,10 @@ only lines with a TODO keyword are included in the output." ;; selective inheritance, remove uninherited ones (setcdr (car tags-alist) (org-remove-uniherited-tags (cdar tags-alist)))) - (when (and (or (not todo-only) (member todo org-not-done-keywords)) + (when (and (or (not todo-only) + (and (member todo org-not-done-keywords) + (or (not org-agenda-tags-todo-honor-ignore-options) + (not (org-agenda-check-for-timestamp-as-reason-to-ignore-todo-item))))) (let ((case-fold-search t)) (eval matcher)) (or (not (member org-archive-tag tags-list)) @@ -9309,7 +9455,7 @@ also TODO lines." ;; Get a new match request, with completion (let ((org-last-tags-completion-table (org-global-tags-completion-table))) - (setq match (org-ido-completing-read + (setq match (org-completing-read "Match: " 'org-tags-completion-function nil nil nil 'org-tags-history)))) @@ -9439,16 +9585,16 @@ also TODO lines." (defun org-string>= (a b) (not (string< a b))) (defun org-string> (a b) (and (not (string= a b)) (not (string< a b)))) (defun org-string<> (a b) (not (string= a b))) -(defun org-time= (a b) (= (org-2ft a) (org-2ft b))) -(defun org-time< (a b) (< (org-2ft a) (org-2ft b))) -(defun org-time<= (a b) (<= (org-2ft a) (org-2ft b))) -(defun org-time> (a b) (> (org-2ft a) (org-2ft b))) -(defun org-time>= (a b) (>= (org-2ft a) (org-2ft b))) -(defun org-time<> (a b) (org<> (org-2ft a) (org-2ft b))) +(defun org-time= (a b) (setq a (org-2ft a) b (org-2ft b)) (and (> a 0) (> b 0) (= a b))) +(defun org-time< (a b) (setq a (org-2ft a) b (org-2ft b)) (and (> a 0) (> b 0) (< a b))) +(defun org-time<= (a b) (setq a (org-2ft a) b (org-2ft b)) (and (> a 0) (> b 0) (<= a b))) +(defun org-time> (a b) (setq a (org-2ft a) b (org-2ft b)) (and (> a 0) (> b 0) (> a b))) +(defun org-time>= (a b) (setq a (org-2ft a) b (org-2ft b)) (and (> a 0) (> b 0) (>= a b))) +(defun org-time<> (a b) (setq a (org-2ft a) b (org-2ft b)) (and (> a 0) (> b 0) (org<> a b))) (defun org-2ft (s) "Convert S to a floating point time. If S is already a number, just return it. If it is a string, parse -it as a time string and apply `float-time' to it. f S is nil, just return 0." +it as a time string and apply `float-time' to it. If S is nil, just return 0." (cond ((numberp s) s) ((stringp s) @@ -10030,39 +10176,41 @@ the scanner. The following items can be given here: ((eq match nil) (setq matcher t)) (t (setq matcher (if match (cdr (org-make-tags-matcher match)) t)))) - (when (eq scope 'tree) - (org-back-to-heading t) - (org-narrow-to-subtree) - (setq scope nil)) + (save-excursion + (save-restriction + (when (eq scope 'tree) + (org-back-to-heading t) + (org-narrow-to-subtree) + (setq scope nil)) - (if (not scope) - (progn - (org-prepare-agenda-buffers - (list (buffer-file-name (current-buffer)))) - (org-scan-tags func matcher)) - ;; Get the right scope - (setq pos (point)) - (cond - ((and scope (listp scope) (symbolp (car scope))) - (setq scope (eval scope))) - ((eq scope 'agenda) - (setq scope (org-agenda-files t))) - ((eq scope 'agenda-with-archives) - (setq scope (org-agenda-files t)) - (setq scope (org-add-archive-files scope))) - ((eq scope 'file) - (setq scope (list (buffer-file-name)))) - ((eq scope 'file-with-archives) - (setq scope (org-add-archive-files (list (buffer-file-name)))))) - (org-prepare-agenda-buffers scope) - (while (setq file (pop scope)) - (with-current-buffer (org-find-base-buffer-visiting file) - (save-excursion - (save-restriction - (widen) - (goto-char (point-min)) - (setq res (append res (org-scan-tags func matcher))))))) - res))) + (if (not scope) + (progn + (org-prepare-agenda-buffers + (list (buffer-file-name (current-buffer)))) + (setq res (org-scan-tags func matcher))) + ;; Get the right scope + (setq pos (point)) + (cond + ((and scope (listp scope) (symbolp (car scope))) + (setq scope (eval scope))) + ((eq scope 'agenda) + (setq scope (org-agenda-files t))) + ((eq scope 'agenda-with-archives) + (setq scope (org-agenda-files t)) + (setq scope (org-add-archive-files scope))) + ((eq scope 'file) + (setq scope (list (buffer-file-name)))) + ((eq scope 'file-with-archives) + (setq scope (org-add-archive-files (list (buffer-file-name)))))) + (org-prepare-agenda-buffers scope) + (while (setq file (pop scope)) + (with-current-buffer (org-find-base-buffer-visiting file) + (save-excursion + (save-restriction + (widen) + (goto-char (point-min)) + (setq res (append res (org-scan-tags func matcher)))))))))) + res)) ;;;; Properties @@ -10177,7 +10325,9 @@ If WHICH is nil or `all', get all properties. If WHICH is (excluded '("TODO" "TAGS" "ALLTAGS" "PRIORITY")) beg end range props sum-props key value string clocksum) (save-excursion - (when (condition-case nil (org-back-to-heading t) (error nil)) + (when (condition-case nil + (and (org-mode-p) (org-back-to-heading t)) + (error nil)) (setq beg (point)) (setq sum-props (get-text-property (point) 'org-summaries)) (setq clocksum (get-text-property (point) :org-clock-minutes)) @@ -11517,7 +11667,7 @@ When SHOW-ALL is nil, only return the current occurrence of a time stamp." ;; Make the proper lists from the dates (catch 'exit (let ((a1 '(("d" . day) ("w" . week) ("m" . month) ("y" . year))) - dn dw sday cday n1 n2 + dn dw sday cday n1 n2 n0 d m y y1 y2 date1 date2 nmonths nm ny m2) (setq start (org-date-to-gregorian start) @@ -11566,6 +11716,8 @@ When SHOW-ALL is nil, only return the current occurrence of a time stamp." (setq m2 (+ m dn) y2 y) (if (> m2 12) (setq y2 (1+ y2) m2 (- m2 12))) (setq n2 (calendar-absolute-from-gregorian (list m2 d y2)))))) + ;; Make sure n1 is the earlier date + (setq n0 n1 n1 (min n1 n2) n2 (max n0 n2)) (if show-all (cond ((eq prefer 'past) n1) @@ -12330,7 +12482,8 @@ The images can be removed again with \\[org-ctrl-c-ctrl-c]." '(("begin" "^[ \t]*\\(\\\\begin{\\([a-zA-Z0-9\\*]+\\)[^\000]+?\\\\end{\\2}\\)" 1 t) ;; ("$" "\\([ (]\\|^\\)\\(\\(\\([$]\\)\\([^ \r\n,.$].*?\\(\n.*?\\)\\{0,5\\}[^ \r\n,.$]\\)\\4\\)\\)\\([ .,?;:'\")]\\|$\\)" 2 nil) ;; \000 in the following regex is needed for org-inside-LaTeX-fragment-p - ("$" "\\([^$]\\)\\(\\(\\$\\([^ \r\n,;.$][^$\n\r]*?\\(\n[^$\n\r]*?\\)\\{0,2\\}[^ \r\n,.$]\\)\\$\\)\\)\\([ .,?;:'\")\000]\\|$\\)" 2 nil) + ("$1" "\\([^$]\\)\\(\\$[^ \r\n,;.$]\\$\\)\\([- .,?;:'\")\000]\\|$\\)" 2 nil) + ("$" "\\([^$]\\)\\(\\(\\$\\([^ \r\n,;.$][^$\n\r]*?\\(\n[^$\n\r]*?\\)\\{0,2\\}[^ \r\n,.$]\\)\\$\\)\\)\\([- .,?;:'\")\000]\\|$\\)" 2 nil) ("\\(" "\\\\([^\000]*?\\\\)" 0 nil) ("\\[" "\\\\\\[[^\000]*?\\\\\\]" 0 t) ("$$" "\\$\\$[^\000]*?\\$\\$" 0 t)) @@ -12451,7 +12604,6 @@ The images can be removed again with \\[org-ctrl-c-ctrl-c]." "Return string to be used as color value for an RGB component." (format "%g" (/ value 65535.0))) - ;;;; Key bindings ;; Make `C-c C-x' a prefix key @@ -12592,6 +12744,7 @@ The images can be removed again with \\[org-ctrl-c-ctrl-c]." (org-defkey org-mode-map "\C-c\C-e" 'org-export) (org-defkey org-mode-map "\C-c:" 'org-toggle-fixed-width-section) (org-defkey org-mode-map "\C-c\C-x\C-f" 'org-emphasize) +(org-defkey org-mode-map "\C-c\C-xf" 'org-footnote-action) (org-defkey org-mode-map "\C-c\C-x\C-k" 'org-mark-entry-for-agenda-action) (org-defkey org-mode-map "\C-c\C-x\C-w" 'org-cut-special) @@ -12614,6 +12767,7 @@ The images can be removed again with \\[org-ctrl-c-ctrl-c]." (org-defkey org-mode-map "\C-c\C-x." 'org-timer) (org-defkey org-mode-map "\C-c\C-x-" 'org-timer-item) (org-defkey org-mode-map "\C-c\C-x0" 'org-timer-start) +(org-defkey org-mode-map "\C-c\C-x," 'org-timer-pause-or-continue) (define-key org-mode-map "\C-c\C-x\C-c" 'org-columns) @@ -13004,6 +13158,9 @@ This command does many different things, depending on context: - If the cursor is on a #+TBLFM line, re-apply the formulas to the entire table. +- If the cursor is at a footnote reference or definition, jump to + the corresponding definition or references, respectively. + - If the cursor is a the beginning of a dynamic block, update it. - If the cursor is inside a table created by the table.el package, @@ -13027,7 +13184,7 @@ This command does many different things, depending on context: ((or (and (boundp 'org-clock-overlays) org-clock-overlays) org-occur-highlights org-latex-fragment-image-overlays) - (and (boundp 'org-clock-overlays) (org-remove-clock-overlays)) + (and (boundp 'org-clock-overlays) (org-clock-remove-overlays)) (org-remove-occur-highlights) (org-remove-latex-fragment-image-overlays) (message "Temporary highlights/overlays removed from current buffer")) @@ -13049,6 +13206,9 @@ This command does many different things, depending on context: (call-interactively 'org-table-recalculate) (org-table-maybe-recalculate-line)) (call-interactively 'org-table-align)) + ((or (org-footnote-at-reference-p) + (org-footnote-at-definition-p)) + (call-interactively 'org-footnote-action)) ((org-at-item-checkbox-p) (call-interactively 'org-toggle-checkbox)) ((org-at-item-p) @@ -13115,62 +13275,47 @@ context. See the individual commands for more information." (defun org-ctrl-c-star () "Compute table, or change heading status of lines. -Calls `org-table-recalculate' or `org-toggle-region-headings', -depending on context. This will also turn a plain list item or a normal -line into a subheading." +Calls `org-table-recalculate' or `org-toggle-heading', +depending on context." (interactive) (cond ((org-at-table-p) (call-interactively 'org-table-recalculate)) - ((org-region-active-p) + (t ;; Convert all lines in region to list items - (call-interactively 'org-toggle-region-headings)) - ((org-on-heading-p) - (org-toggle-region-headings (point-at-bol) - (min (1+ (point-at-eol)) (point-max)))) - ((org-at-item-p) - ;; Convert to heading - (let ((level (save-match-data - (save-excursion - (condition-case nil - (progn - (org-back-to-heading t) - (funcall outline-level)) - (error 0)))))) - (replace-match - (concat (make-string (org-get-valid-level level 1) ?*) " ") t t))) - (t (org-toggle-region-headings (point-at-bol) - (min (1+ (point-at-eol)) (point-max)))))) + (call-interactively 'org-toggle-heading)))) (defun org-ctrl-c-minus () "Insert separator line in table or modify bullet status of line. Also turns a plain line or a region of lines into list items. -Calls `org-table-insert-hline', `org-toggle-region-items', or +Calls `org-table-insert-hline', `org-toggle-item', or `org-cycle-list-bullet', depending on context." (interactive) (cond ((org-at-table-p) (call-interactively 'org-table-insert-hline)) - ((org-on-heading-p) - ;; Convert to item - (save-excursion - (beginning-of-line 1) - (if (looking-at "\\*+ ") - (replace-match (concat (make-string (- (match-end 0) (point) 1) ?\ ) "- "))))) ((org-region-active-p) - ;; Convert all lines in region to list items - (call-interactively 'org-toggle-region-items)) + (call-interactively 'org-toggle-item)) ((org-in-item-p) (call-interactively 'org-cycle-list-bullet)) - (t (org-toggle-region-items (point-at-bol) - (min (1+ (point-at-eol)) (point-max)))))) - -(defun org-toggle-region-items (beg end) - "Convert all lines in region to list items. -If the first line is already an item, convert all list items in the region -to normal lines." - (interactive "r") - (let (l2 l) + (t + (call-interactively 'org-toggle-item)))) + +(defun org-toggle-item () + "Convert headings or normal lines to items, items to normal lines. +If there is no active region, only the current line is considered. + +If the first line in the region is a headline, convert all headlines to items. + +If the first line in the region is an item, convert all items to normal lines. + +If the first line is normal text, add an item bullet to each line." + (interactive) + (let (l2 l beg end) + (if (org-region-active-p) + (setq beg (region-beginning) end (region-end)) + (setq beg (point-at-bol) + end (min (1+ (point-at-eol)) (point-max)))) (save-excursion (goto-char end) (setq l2 (org-current-line)) @@ -13185,18 +13330,41 @@ to normal lines." (delete-region (match-beginning 2) (match-end 2)) (and (looking-at "[ \t]+") (replace-match ""))) (beginning-of-line 2)) - (while (< (setq l (1+ l)) l2) - (unless (org-at-item-p) - (if (looking-at "\\([ \t]*\\)\\(\\S-\\)") - (replace-match "\\1- \\2"))) - (beginning-of-line 2)))))) - -(defun org-toggle-region-headings (beg end) - "Convert all lines in region to list items. -If the first line is already an item, convert all list items in the region -to normal lines." - (interactive "r") - (let (l2 l) + (if (org-on-heading-p) + ;; Headings, convert to items + (while (< (setq l (1+ l)) l2) + (if (looking-at org-outline-regexp) + (replace-match "- " t t)) + (beginning-of-line 2)) + ;; normal lines, turn them into items + (while (< (setq l (1+ l)) l2) + (unless (org-at-item-p) + (if (looking-at "\\([ \t]*\\)\\(\\S-\\)") + (replace-match "\\1- \\2"))) + (beginning-of-line 2))))))) + +(defun org-toggle-heading (&optional nstars) + "Convert headings to normal text, or items or text to headings. +If there is no active region, only the current line is considered. + +If the first line is a heading, remove the stars from all headlines +in the region. + +If the first line is a plain list item, turn all plain list items into +headings. + +If the first line is a normal line, turn each and every line in the region +into a heading. + +When converting a line into a heading, the number of stars is chosen +such that the lines become children of the current entry. However, when +a prefix argument is given, its value determines the number of stars to add." + (interactive "P") + (let (l2 l itemp beg end) + (if (org-region-active-p) + (setq beg (region-beginning) end (region-end)) + (setq beg (point-at-bol) + end (min (1+ (point-at-eol)) (point-max)))) (save-excursion (goto-char end) (setq l2 (org-current-line)) @@ -13209,15 +13377,22 @@ to normal lines." (when (org-on-heading-p t) (and (looking-at outline-regexp) (replace-match ""))) (beginning-of-line 2)) - (let* ((stars (save-excursion - (re-search-backward org-complex-heading-regexp nil t) - (or (match-string 1) "*"))) - (add-stars (if org-odd-levels-only "**" "*")) - (rpl (concat stars add-stars " \\2"))) + (setq itemp (org-at-item-p)) + (let* ((stars + (if nstars + (make-string (prefix-numeric-value current-prefix-arg) + ?*) + (save-excursion + (re-search-backward org-complex-heading-regexp nil t) + (or (match-string 1) "*")))) + (add-stars (if nstars "" (if org-odd-levels-only "**" "*"))) + (rpl (concat stars add-stars " "))) (while (< (setq l (1+ l)) l2) - (unless (org-on-heading-p) - (if (looking-at "\\([ \t]*\\)\\(\\S-\\)") - (replace-match rpl))) + (if itemp + (and (org-at-item-p) (replace-match rpl t t)) + (unless (org-on-heading-p) + (if (looking-at "\\([ \t]*\\)\\(\\S-\\)") + (replace-match (concat rpl (match-string 2)))))) (beginning-of-line 2))))))) (defun org-meta-return (&optional arg) @@ -13332,7 +13507,10 @@ See the individual commands for more information." ["Convert to odd/even levels" org-convert-to-oddeven-levels t]) ("Editing" ["Emphasis..." org-emphasize t] - ["Edit Source Example" org-edit-special t]) + ["Edit Source Example" org-edit-special t] + "--" + ["Footnote new/jump" org-footnote-action t] + ["Footnote extra" (org-footnote-action t) :active t :keys "C-u C-c C-x f"]) ("Archive" ["Toggle ARCHIVE tag" org-toggle-archive-tag t] ; ["Check and Tag Children" (org-toggle-archive-tag (4)) @@ -13390,9 +13568,11 @@ See the individual commands for more information." ["Goto Calendar" org-goto-calendar t] ["Date from Calendar" org-date-from-calendar t] "--" - ["Start/restart timer" org-timer-start t] - ["Insert timer string" org-timer t] - ["Insert timer item" org-timer-item t]) + ["Start/Restart Timer" org-timer-start t] + ["Pause/Continue Timer" org-timer-pause-or-continue t] + ["Stop Timer" org-timer-pause-or-continue :active t :keys "C-u C-c C-x ,"] + ["Insert Timer String" org-timer t] + ["Insert Timer Item" org-timer-item t]) ("Logging work" ["Clock in" org-clock-in t] ["Clock out" org-clock-out t] @@ -13560,7 +13740,8 @@ With optional NODE, go directly to that node." (switch-to-buffer (marker-buffer marker)) (if (or (> marker (point-max)) (< marker (point-min))) (widen)) - (goto-char marker)) + (goto-char marker) + (org-show-context 'org-goto)) (if bookmark (bookmark-jump bookmark) (error "Cannot find location")))) @@ -14006,13 +14187,15 @@ not an indirect buffer." (or (buffer-base-buffer buf) buf) nil))) -(defun org-image-file-name-regexp () - "Return regexp matching the file names of images." - (if (fboundp 'image-file-name-regexp) +(defun org-image-file-name-regexp (&optional extensions) + "Return regexp matching the file names of images. +If EXTENSIONS is given, only match these." + (if (and (not extensions) (fboundp 'image-file-name-regexp)) (image-file-name-regexp) (let ((image-file-name-extensions - '("png" "jpeg" "jpg" "gif" "tiff" "tif" - "xbm" "xpm" "pbm" "pgm" "ppm"))) + (or extensions + '("png" "jpeg" "jpg" "gif" "tiff" "tif" + "xbm" "xpm" "pbm" "pgm" "ppm")))) (concat "\\." (regexp-opt (nconc (mapcar 'upcase image-file-name-extensions) @@ -14020,10 +14203,10 @@ not an indirect buffer." t) "\\'")))) -(defun org-file-image-p (file) +(defun org-file-image-p (file &optional extensions) "Return non-nil if FILE is an image." (save-match-data - (string-match (org-image-file-name-regexp) file))) + (string-match (org-image-file-name-regexp extensions) file))) (defun org-get-cursor-date () "Return the date at cursor in as a time. |