diff options
44 files changed, 1886 insertions, 759 deletions
diff --git a/lisp/org/ChangeLog b/lisp/org/ChangeLog index 133e35c5613..5c03fd40730 100644 --- a/lisp/org/ChangeLog +++ b/lisp/org/ChangeLog @@ -1,3 +1,404 @@ +2009-09-02 Carsten Dominik <carsten.dominik@gmail.com> + + * org-protocol.el (org-protocol-store-link) + (org-protocol-remember, org-protocol-open-source): Add autoloads. + + * org-compat.el (org-float-time): New function. + + * org.el (org-clock-update-time-maybe) + (org-sort-entries-or-items, org-do-sort) + (org-evaluate-time-range, org-time-string-to-seconds) + (org-closed-in-range): Use `org-float-time'. + + * org-timer.el (org-timer-start, org-timer-pause-or-continue) + (org-timer-seconds): Use `org-float-time'. + + * org-clock.el (org-clock-get-clocked-time, org-clock-out) + (org-clock-sum, org-dblock-write:clocktable) + (org-clocktable-steps): Use `org-float-time'. + + * org-agenda.el (org-agenda-last-marker-time) + (org-agenda-new-marker, org-diary): Use `org-float-time'. + + * org-compat.el (w32-focus-frame): Declare the w32-focus-frame + function. + + * org-exp.el (org-get-file-contents): Only protect lines that + really need it. + + * org-html.el (require): Require cl for compilation. + + * org.el: Avoid using `default-major-mode'. + + * org-plot.el (require): Require CL only at compile time. + + * org-exp.el (require): Require CL only at compile time. + + * org-agenda.el (org-agenda-quit): When the agenda window is + dedicated, remove other windows before exiting, so that the frame + really will be killed. + + * org-exp.el (org-export-handle-include-files): Reset START and + END for each loop cycle. + +2009-09-02 Carsten Dominik <carsten.dominik@gmail.com> + + * org.el (org-eval-in-calendar): Use + `org-select-frame-set-input-focus'. + + * org-compat.el (org-select-frame-set-input-focus): New function. + + * org.el (org-update-statistics-cookies): New function. + (org-mode-map): Bind `C-c #' to `org-update-statistics-cookies'. + +2009-09-02 Carsten Dominik <carsten.dominik@gmail.com> + + * org-src.el (org-edit-fixed-width-region): Set org-src-mode only + after the local variables are set. + + * org-latex.el (org-export-latex-protect-amp): New function. + (org-export-latex-links): Protect link ampersands in tables. + + * org-exp.el (org-export-select-backend-specific-text): Match in + two steps, to avoid regexp problems. + + * org.el (org-offer-links-in-entry): Improve working with many and + duplicate links. + + * org-agenda.el (org-agenda-show-1): Make more consistent with + normal cycling. + (org-agenda-cycle-show): Make more consistent with normal cycling. + + * org-gnus.el (org-gnus-store-link): Restore the linking to a + website. + +2009-09-02 Bastien Guerry <bzg@altern.org> + + * org-latex.el (org-export-latex-first-lines): Bugfix. + +2009-09-02 Carsten Dominik <carsten.dominik@gmail.com> + + * org-clock.el (org-clock-modify-effort-estimate): Emit message + about new effort. + + * org.el (org-set-effort): New function. + (org-mode-map): New key for effort setting command. + + * org-agenda.el (org-agenda): Keep window setup when calling + agenda from within agenda window. + (org-agenda-mode-map): New keys for effort setting commands. + (org-agenda-menu): Add effort setting commands to menu. + (org-agenda-set-property, org-agenda-set-effort): New functions. + + * org-latex.el (org-export-latex-tables): Fix + `org-table-last-alignment' and `org-table-last-column-widths' if + the first column has been removed. + +2009-09-02 Carsten Dominik <carsten.dominik@gmail.com> + + * org.el (org-remove-timestamp-with-keyword): Only remove in + entry, not in subtree. + + * org-src.el (org-src-lang-modes): Add abbreviation elisp for + emacs lisp. + + * org.el (org-open-at-point): When on headline, offer all strings + in entry. + + * org-remember.el (org-remember-templates): Documentation fix. + + * org.el (org-move-subtree-down): Use `org-get-next-sibling' and + `org-get-last-sibling' instead of the outline versions of these + functions. + (org-get-last-sibling): New function. + (org-refile): Use `org-get-next-sibling' instead of the outline + version of this function. + (org-clean-visibility-after-subtree-move): Use + `org-get-next-sibling' and `org-get-last-sibling' instead of the + outline versions of these functions. + +2009-09-02 Carsten Dominik <carsten.dominik@gmail.com> + + * org-agenda.el (org-prepare-agenda): When creating a new frame + for the agenda, make the window dedicated. + + * org-agenda.el (org-agenda-mode-map): New keys for time motion. + + * org-table.el (org-table-align): Change the order of reinsertion + and deletion, to avoid problems with overlays following the table. + + * org.el (org-parse-time-string): Better error message. + (org-show-subtree): Use org-end-of-subtree. + + * org-macs.el (org-goto-line): New defsubst. + + * org.el (org-open-file, org-change-tag-in-region) + (org-fast-tag-show-exit): Don't use `goto-line'. + + * org-table.el (org-table-align, org-table-insert-column) + (org-table-delete-column, org-table-move-column) + (org-table-sort-lines, org-table-copy-region) + (org-table-paste-rectangle, org-table-wrap-region) + (org-table-get-specials, org-table-rotate-recalc-marks) + (org-table-get-range, org-table-recalculate) + (org-table-edit-formulas, org-table-fedit-convert-buffer) + (org-table-show-reference, org-table-highlight-rectangle): Don't + use `goto-line'. + + * org-src.el (org-edit-src-code, org-edit-fixed-width-region) + (org-edit-src-exit): Don't use `goto-line'. + + * org-macs.el (org-preserve-lc): Don't use `goto-line'. + + * org-list.el (org-renumber-ordered-list, org-fix-bullet-type): + Don't use `goto-line'. + + * org-exp.el (org-export-number-lines): Don't use `goto-line'. + + * org-colview.el (org-columns, org-columns-redo) + (org-agenda-columns): Don't use `goto-line'. + + * org-colview-xemacs.el (org-columns, org-agenda-columns): Don't + use `goto-line'. + + * org-agenda.el (org-agenda-mode): Force visual line motion off. + (org-agenda-add-entry-text-maxlines): Improve docstring. + (org-agenda-start-with-entry-text-mode): New option. + (org-agenda-entry-text-maxlines): New option. + (org-agenda-entry-text-mode): New variable. + (org-agenda-mode): Set initial value of + `org-agenda-entry-text-mode'. + (org-agenda-mode-map): Add the `E' key. + (org-agenda-menu): Add entry text mode to the menu. + (org-agenda-get-some-entry-text): Fix line count bug. + (org-finalize-agenda): Apply entry text mode if appropriate. + (org-agenda-entry-text-show-here): New function. + (org-agenda-entry-text-show): New function. + (org-agenda-entry-text-hide): New function. + (org-agenda-view-mode-dispatch): Add entry text mode to the view + key menu. + (org-agenda-entry-text-mode): New command. + (org-agenda-set-mode-name): Add entry text mode to the mode line + string. + (org-agenda-undo, org-agenda-get-restriction-and-command) + (org-agenda-get-some-entry-text, org-agenda-redo): Don't use + `goto-line'. + +2009-09-02 Bernt Hansen <bernt@norang.ca> + + * org-clock.el (org-notify): Bugfix. + +2009-09-02 Carsten Dominik <carsten.dominik@gmail.com> + + * org-agenda.el (org-agenda-open-link): Handle multiple links and + check for after-string. + + * org-gnus.el (org-gnus-store-link): Simplify. + + * org.el (org-latex-regexps): Don't add extra empty lines for + display formulas. + +2009-09-02 Carsten Dominik <carsten.dominik@gmail.com> + + * org-agenda.el (org-agenda-get-some-entry-text): New function. + (org-agenda-add-entry-text): Use + `org-agenda-get-some-entry-text'. + + * org.el (org-cycle-separator-lines): Update docstring. + (org-cycle-show-empty-lines): Handle negative values for + `org-cycle-show-empty-lines'. + + * org-exp.el (org-export-protect-sub-super): New function. + (org-export-normalize-links): Protect the url of plain links from + supscript and superscript processing. + + * org-remember.el (org-remember-escaped-%): New function. + (org-remember-apply-template): Use `org-remember-escaped-%' to + detect escaped % signs. + +2009-09-02 Bastien Guerry <bzg@altern.org> + + * org-timer.el (org-timer-set-timer): Use `org-notify' and play a + sound when showing the notification. + + * org-clock.el (org-notify): New function. + (org-clock-notify-once-if-expired): Use `org-notify'. + + * org-gnus.el (org-gnus-store-link): Handle `gnus-summary-mode' + and `gnus-article-mode' separately. + (gnus-summary-article-header): Fix the declare-function. + +2009-09-02 Carsten Dominik <carsten.dominik@gmail.com> + + * org-exp.el (org-export-format-source-code-or-example): Translate + language. + + * org-src.el (org-src-lang-modes): New variable + (org-edit-src-code): Translate language. + + * org-exp.el (org-export-format-source-code-or-example): Deal wit + the new structure of the `org-export-latex-listings-langs' + variable. + + * org-latex.el (org-export-latex-listings-langs): Change structure + of the variable from plist to alist. + +2009-09-02 Carsten Dominik <carsten.dominik@gmail.com> + + * org.el (org-in-commented-line): New function. + +2009-09-02 Carsten Dominik <carsten.dominik@gmail.com> + + * org.el (org-hide-block-toggle): Make folded blocks searchable. + +2009-09-02 Friedrich Delgado Friedrichs <friedel@nomaden.org> (tiny change) + + * org.el (org-flag-drawer): More useful error. + +2009-09-02 Carsten Dominik <carsten.dominik@gmail.com> + + * org-remember.el (org-remember-apply-template): Use + org-icompleting-read. + + * org-publish.el (org-publish): Use org-icompleting-read. + + * org-colview.el (org-columns-edit-value, org-columns-new) + (org-insert-columns-dblock): Use org-icompleting-read. + + * org-colview-xemacs.el (org-columns-edit-value) + (org-columns-new, org-insert-columns-dblock): Use + org-icompleting-read. + + * org-attach.el (org-attach-delete-one, org-attach-open): Use + org-icompleting-read. + +2009-09-02 Carsten Dominik <carsten.dominik@gmail.com> + + * org.el (org-hierarchical-todo-statistics): Improve docstring. + (org-version): Return the version text. + (org-org-menu): Add a menu entry for the new bug reporter. + (org-submit-bug-report): New command. + + * org-list.el (org-hierarchical-checkbox-statistics): Improve + docstring. + + * org.el (org-emphasis-regexp-components): Add "`" to set of + pre-emphasis characters. + + * org-latex.el (org-export-latex-classes): Always include the soul + package. + (org-export-latex-emphasis-alist): Use \st for strikethough. + + * org-exp-blocks.el (org-export-blocks-preprocess): Use + `indent-code-rigidly' to indent. + + * org-agenda.el (org-agenda-get-restriction-and-command): Remove + properties only if MATCH really is a string. + +2009-09-02 Carsten Dominik <carsten.dominik@gmail.com> + + * org-latex.el (org-export-latex-packages-alist): Fix + customization type. + + * org.el (org-create-formula-image): Also use + `org-export-latex-packages-alist'. + + * org-html.el (org-export-as-html): Fix bug in footnote regexp. + (org-export-as-html): Format footnotes correctly. + +2009-09-02 Carsten Dominik <carsten.dominik@gmail.com> + + * org.el (org-fast-tag-selection): Avoid text properties on tags + in the alist. + + * org-agenda.el (org-agenda-get-restriction-and-command): Avoid + text properties on the match element. + +2009-09-02 Carsten Dominik <carsten.dominik@gmail.com> + + * org.el (org-set-regexps-and-options): Make sure the list of done + keywords is not invalid. + + * org-exp.el (org-export-interpolate-newlines): New function. + +2009-09-02 Carsten Dominik <carsten.dominik@gmail.com> + + * org.el (org-format-latex): Avoid nested overlays. + + * org-latex.el (org-export-latex-listings-langs): Add a few more + languages. + + * org-exp.el (org-export-preprocess-apply-macros): Make sure to + ignore newlines and space before the first macro argument. + + * org-latex.el (org-export-latex-tables): Remove save-excursion + around `org-table-align'. + +2009-09-02 Carsten Dominik <carsten.dominik@gmail.com> + + * org.el (org-export-html-special-string-regexps): Definition + moved into org.el + + * org-exp.el (org-export-preprocess-apply-macros): Allow newlines + in macro calls. + +2009-09-02 Carsten Dominik <carsten.dominik@gmail.com> + + * org-latex.el (org-export-latex-listings) + (org-export-latex-listings-langs): New options. + + * org-exp.el (org-export-format-source-code-or-example): Use + listing package if requested by the user. + +2009-09-02 Bastien Guerry <bzg@altern.org> + + * org.el (org-iswitchb): Fix bug when aborting the `org-iswitchb' + command before actually switching to a buffer. + +2009-09-02 Carsten Dominik <carsten.dominik@gmail.com> + + * org-exp.el (org-get-file-contents): Only quote org lines when + the markup is src or example. + + * org-agenda.el (org-agenda-skip-scheduled-if-deadline-is-shown): + New option + (org-agenda-get-day-entries): Remember deadline results and pass + them on into the function getting the scheduling information. + (org-agenda-get-scheduled): Accept deadline results as parameters + and maybe skip some entries. + (org-agenda-skip-scheduled-if-deadline-is-shown): New option. + + * org.el (org-insert-heading): When respecting content, do not + convert current line to headline. + + * org-clock.el (org-clock-save-markers-for-cut-and-paste): Also + cheeeeeck the hd marker + (org-clock-in): Also set the hd marker. + (org-clock-out): Also set the hd marker. + (org-clock-cancel): Reset markers. + + * org.el (org-clock-hd-marker): New marker. + + * org-faces.el (org-agenda-clocking): New face. + + * org-agenda.el (org-agenda-mark-clocking-task): New function. + (org-finalize-agenda): call `org-agenda-mark-clocking-task'. + + * org.el (org-modules): Add org-track.el. + + * org-agenda.el (org-agenda-bulk-marked-p): New function. + (org-agenda-bulk-mark, org-agenda-bulk-unmark): Use + `org-agenda-bulk-marked-p'. + (org-agenda-bulk-toggle): New command. + +2009-09-02 Carsten Dominik <carsten.dominik@gmail.com> + + * org.el (org-move-subtree-down): Hide subtree if it was folded, + not just the body. + + * org-remember.el (org-remember-finalize): Avoid buffer-modified + messages. + 2009-08-28 Stefan Monnier <monnier@iro.umontreal.ca> * org-html.el (org-export-as-html): diff --git a/lisp/org/org-agenda.el b/lisp/org/org-agenda.el index 29f708b8af2..c776e33c38d 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.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; @@ -128,7 +128,11 @@ This is only relevant when `org-agenda-add-entry-text' is part of `org-agenda-before-write-hook', which it is by default. When this is 0, nothing will happen. When it is greater than 0, it specifies the maximum number of lines that will be added for each entry -that is listed in the agenda view." +that is listed in the agenda view. + +Note that this variable is not used during display, only when exporting +the agenda. For agenda display, see org-agenda-entry-text-mode and the +variable `org-agenda-entry-text-maxlines'." :group 'org-agenda :type 'integer) @@ -555,6 +559,23 @@ is DONE." :group 'org-agenda-daily/weekly :type 'boolean) +(defcustom org-agenda-skip-scheduled-if-deadline-is-shown nil + "Non-nil means skip scheduling line if same entry shows because of deadline. +In the agenda of today, an entry can show up multiple times because +it is both scheduled and has a nearby deadline, and maybe a plain time +stamp as well. +When this variable is t, then only the deadline is shown and the fact that +the entry is scheduled today or was scheduled previously is not shown. +When this variable is nil, the entry will be shown several times. When +the variable is the symbol `not-today', then skip scheduled previously, +but not scheduled today." + :group 'org-agenda-skip + :group 'org-agenda-daily/weekly + :type '(choice + (const :tag "Never" nil) + (const :tag "Always" t) + (const :tag "Not when scheduled today" not-today))) + (defcustom org-agenda-skip-deadline-if-done nil "Non-nil means don't show deadlines when the corresponding item is done. When nil, the deadline is still shown and should give you a happy feeling. @@ -634,6 +655,20 @@ Needs to be set before org.el is loaded." :group 'org-agenda-startup :type 'boolean) +(defcustom org-agenda-start-with-entry-text-mode nil + "The initial value of entry-text-mode in a newly created agenda window." + :group 'org-agenda-startup + :type 'boolean) + +(defcustom org-agenda-entry-text-maxlines 5 + "Number of text lines to be added when `E' is presed in the agenda. + +Note that this variable only used during agenda display. Add add entry text +when exporting the agenda, configure the variable +`org-agenda-add-entry-ext-maxlines'." + :group 'org-agenda + :type 'integer) + (defvar org-agenda-include-inactive-timestamps nil "Non-nil means, include inactive time stamps in agenda and timeline.") @@ -1228,6 +1263,7 @@ works you probably want to add it to `org-agenda-custom-commands' for good." (defvar org-agenda-menu) ; defined later in this file. (defvar org-agenda-restrict) ; defined later in this file. (defvar org-agenda-follow-mode nil) +(defvar org-agenda-entry-text-mode nil) (defvar org-agenda-clockreport-mode nil) (defvar org-agenda-show-log nil) (defvar org-agenda-redo-command nil) @@ -1256,6 +1292,7 @@ The following commands are available: (use-local-map org-agenda-mode-map) (easy-menu-add org-agenda-menu) (if org-startup-truncated (setq truncate-lines t)) + (org-set-local 'line-move-visual nil) (org-add-hook 'post-command-hook 'org-agenda-post-command-hook nil 'local) (org-add-hook 'pre-command-hook 'org-unhighlight nil 'local) ;; Make sure properties are removed when copying text @@ -1266,6 +1303,7 @@ The following commands are available: buffer-substring-filters))) (unless org-agenda-keep-modes (setq org-agenda-follow-mode org-agenda-start-with-follow-mode + org-agenda-entry-text-mode org-agenda-start-with-entry-text-mode org-agenda-clockreport-mode org-agenda-start-with-clockreport-mode org-agenda-show-log org-agenda-start-with-log-mode)) @@ -1292,25 +1330,24 @@ The following commands are available: (org-defkey org-agenda-mode-map [(tab)] 'org-agenda-goto) (org-defkey org-agenda-mode-map "\C-m" 'org-agenda-switch-to) (org-defkey org-agenda-mode-map "\C-k" 'org-agenda-kill) -(org-defkey org-agenda-mode-map "\C-c$" 'org-agenda-archive) -(org-defkey org-agenda-mode-map "\C-c\C-x\C-s" 'org-agenda-archive) (org-defkey org-agenda-mode-map "\C-c\C-w" 'org-agenda-refile) (org-defkey org-agenda-mode-map "m" 'org-agenda-bulk-mark) (org-defkey org-agenda-mode-map "u" 'org-agenda-bulk-unmark) (org-defkey org-agenda-mode-map "U" 'org-agenda-bulk-remove-all-marks) (org-defkey org-agenda-mode-map "B" 'org-agenda-bulk-action) (org-defkey org-agenda-mode-map "\C-c\C-x!" 'org-reload) +(org-defkey org-agenda-mode-map "\C-c$" 'org-agenda-archive) +(org-defkey org-agenda-mode-map "\C-c\C-x\C-s" 'org-agenda-archive) (org-defkey org-agenda-mode-map "$" 'org-agenda-archive) (org-defkey org-agenda-mode-map "A" 'org-agenda-archive-to-archive-sibling) (org-defkey org-agenda-mode-map "\C-c\C-o" 'org-agenda-open-link) (org-defkey org-agenda-mode-map " " 'org-agenda-show) -(org-defkey org-agenda-mode-map "\C-c\C-t" 'org-agenda-todo) (org-defkey org-agenda-mode-map [(control shift right)] 'org-agenda-todo-nextset) (org-defkey org-agenda-mode-map [(control shift left)] 'org-agenda-todo-previousset) (org-defkey org-agenda-mode-map "\C-c\C-xb" 'org-agenda-tree-to-indirect-buffer) -(org-defkey org-agenda-mode-map "b" 'org-agenda-tree-to-indirect-buffer) (org-defkey org-agenda-mode-map "o" 'delete-other-windows) (org-defkey org-agenda-mode-map "L" 'org-agenda-recenter) +(org-defkey org-agenda-mode-map "\C-c\C-t" 'org-agenda-todo) (org-defkey org-agenda-mode-map "t" 'org-agenda-todo) (org-defkey org-agenda-mode-map "a" 'org-agenda-toggle-archive-tag) (org-defkey org-agenda-mode-map ":" 'org-agenda-set-tags) @@ -1336,15 +1373,20 @@ The following commands are available: (while l (org-defkey org-agenda-mode-map (int-to-string (pop l)) 'digit-argument))) -(org-defkey org-agenda-mode-map "f" 'org-agenda-follow-mode) +(org-defkey org-agenda-mode-map "F" 'org-agenda-follow-mode) (org-defkey org-agenda-mode-map "R" 'org-agenda-clockreport-mode) +(org-defkey org-agenda-mode-map "E" 'org-agenda-entry-text-mode) (org-defkey org-agenda-mode-map "l" 'org-agenda-log-mode) (org-defkey org-agenda-mode-map "v" 'org-agenda-view-mode-dispatch) (org-defkey org-agenda-mode-map "D" 'org-agenda-toggle-diary) (org-defkey org-agenda-mode-map "G" 'org-agenda-toggle-time-grid) (org-defkey org-agenda-mode-map "r" 'org-agenda-redo) (org-defkey org-agenda-mode-map "g" 'org-agenda-redo) -(org-defkey org-agenda-mode-map "e" 'org-agenda-execute) +(org-defkey org-agenda-mode-map "e" 'org-agenda-set-effort) +(org-defkey org-agenda-mode-map "\C-c\C-xe" 'org-agenda-set-effort) +(org-defkey org-agenda-mode-map "\C-c\C-x\C-e" + 'org-clock-modify-effort-estimate) +(org-defkey org-agenda-mode-map "\C-c\C-xp" 'org-agenda-set-property) (org-defkey org-agenda-mode-map "q" 'org-agenda-quit) (org-defkey org-agenda-mode-map "x" 'org-agenda-exit) (org-defkey org-agenda-mode-map "\C-x\C-w" 'org-write-agenda) @@ -1380,8 +1422,8 @@ The following commands are available: (org-defkey org-agenda-mode-map [(shift down)] 'org-agenda-priority-down) (org-defkey org-agenda-mode-map [?\C-c ?\C-x (up)] 'org-agenda-priority-up) (org-defkey org-agenda-mode-map [?\C-c ?\C-x (down)] 'org-agenda-priority-down) -(org-defkey org-agenda-mode-map [(right)] 'org-agenda-later) -(org-defkey org-agenda-mode-map [(left)] 'org-agenda-earlier) +(org-defkey org-agenda-mode-map "f" 'org-agenda-later) +(org-defkey org-agenda-mode-map "b" 'org-agenda-earlier) (org-defkey org-agenda-mode-map "\C-c\C-x\C-c" 'org-agenda-columns) (org-defkey org-agenda-mode-map "\C-c\C-x>" 'org-agenda-remove-restriction-lock) @@ -1454,11 +1496,15 @@ The following commands are available: ["Change Time + min" org-agenda-date-later :active (org-agenda-check-type nil 'agenda 'timeline) :keys "C-u C-u S-right"] ["Change Time - min" org-agenda-date-earlier :active (org-agenda-check-type nil 'agenda 'timeline) :keys "C-u C-u S-left"] ["Change Date to ..." org-agenda-date-prompt (org-agenda-check-type nil 'agenda 'timeline)]) - ("Clock" + ("Clock and Effort" ["Clock in" org-agenda-clock-in t] ["Clock out" org-agenda-clock-out t] ["Clock cancel" org-agenda-clock-cancel t] - ["Goto running clock" org-clock-goto t]) + ["Goto running clock" org-clock-goto t] + "--" + ["Set Effort" org-agenda-set-effort t] + ["Change clocked effort" org-clock-modify-effort-estimate + (org-clock-is-active)]) ("Priority" ["Set Priority" org-agenda-priority t] ["Increase Priority" org-agenda-priority-up t] @@ -1502,6 +1548,9 @@ The following commands are available: ["Show clock report" org-agenda-clockreport-mode :style toggle :selected org-agenda-clockreport-mode :active (org-agenda-check-type nil 'agenda)] + ["Show some entry text" org-agenda-entry-text-mode + :style toggle :selected org-agenda-entry-text-mode + :active t] "--" ["Show Logbook entries" org-agenda-log-mode :style toggle :selected org-agenda-show-log @@ -1568,7 +1617,7 @@ that have been changed along." (not (car pending-undo-list))) (pop pending-undo-list)) (undo-more 1)))))) - (goto-line line) + (org-goto-line line) (message "`%s' undone (buffer %s)" cmd (buffer-name rembuf)))) (defun org-verify-change-for-undo (l1 l2) @@ -1622,6 +1671,10 @@ Pressing `<' twice means to restrict to the current subtree or region (interactive "P") (catch 'exit (let* ((prefix-descriptions nil) + (org-agenda-window-setup (if (equal (buffer-name) + org-agenda-buffer-name) + 'current-window + org-agenda-window-setup)) (org-agenda-custom-commands-orig org-agenda-custom-commands) (org-agenda-custom-commands ;; normalize different versions @@ -1778,7 +1831,7 @@ s Search for keywords C Configure custom agenda commands (while t (setq custom1 custom) (when (eq rmheader t) - (goto-line 1) + (org-goto-line 1) (re-search-forward ":" nil t) (delete-region (match-end 0) (point-at-eol)) (forward-char 1) @@ -1789,7 +1842,8 @@ s Search for keywords C Configure custom agenda commands (delete-region (point) (point-max)) (while (setq entry (pop custom1)) (setq key (car entry) desc (nth 1 entry) - type (nth 2 entry) match (nth 3 entry)) + type (nth 2 entry) + match (nth 3 entry)) (if (> (length key) 1) (add-to-list 'prefixes (string-to-char key)) (insert @@ -1815,6 +1869,7 @@ s Search for keywords C Configure custom agenda commands (t "???")) (cond ((stringp match) + (setq match (copy-sequence match)) (org-add-props match nil 'face 'org-warning)) (match (format "set of %d commands" (length match))) @@ -2212,78 +2267,86 @@ This will add a maximum of `org-agenda-add-entry-text-maxlines' lines of the entry text following headings shown in the agenda. Drawers will be excluded, also the line with scheduling/deadline info." (when (> org-agenda-add-entry-text-maxlines 0) - (let (m txt drawer-re kwd-time-re ind) + (let (m txt) (goto-char (point-min)) (while (not (eobp)) (if (not (setq m (get-text-property (point) 'org-hd-marker))) (beginning-of-line 2) - (save-excursion - (with-current-buffer (marker-buffer m) - (if (not (org-mode-p)) - (setq txt "") - (save-excursion - (save-restriction - (widen) - (goto-char m) - (beginning-of-line 2) - (setq txt (buffer-substring - (point) - (progn (outline-next-heading) (point))) - drawer-re org-drawer-regexp - kwd-time-re (concat "^[ \t]*" org-keyword-time-regexp - ".*\n?")) - (with-temp-buffer - (insert txt) - (when org-agenda-add-entry-text-descriptive-links - (goto-char (point-min)) - (while (org-activate-bracket-links (point-max)) - (add-text-properties (match-beginning 0) (match-end 0) - '(face org-link)))) - (goto-char (point-min)) - (while (re-search-forward org-bracket-link-regexp (point-max) t) - (set-text-properties (match-beginning 0) (match-end 0) - nil)) - (goto-char (point-min)) - (while (re-search-forward drawer-re nil t) - (delete-region - (match-beginning 0) - (progn (re-search-forward - "^[ \t]*:END:.*\n?" nil 'move) - (point)))) - (goto-char (point-min)) - (while (re-search-forward kwd-time-re nil t) - (replace-match "")) - (if (re-search-forward "[ \t\n]+\\'" nil t) - (replace-match "")) - (goto-char (point-min)) - ;; find min indentation - (goto-char (point-min)) - (untabify (point-min) (point-max)) - (setq ind (org-get-indentation)) - (while (not (eobp)) - (unless (looking-at "[ \t]*$") - (setq ind (min ind (org-get-indentation)))) - (beginning-of-line 2)) - (goto-char (point-min)) - (while (not (eobp)) - (unless (looking-at "[ \t]*$") - (move-to-column ind) - (delete-region (point-at-bol) (point))) - (beginning-of-line 2)) - (goto-char (point-min)) - (while (and (not (eobp)) (re-search-forward "^" nil t)) - (replace-match " > ")) - (goto-char (point-min)) - (while (looking-at "[ \t]*\n") (replace-match "")) - (goto-char (point-max)) - (when (> (org-current-line) - (1+ org-agenda-add-entry-text-maxlines)) - (goto-line (1+ org-agenda-add-entry-text-maxlines)) - (backward-char 1)) - (setq txt (buffer-substring (point-min) (point))))))))) + (setq txt (org-agenda-get-some-entry-text + m org-agenda-add-entry-text-maxlines)) (end-of-line 1) (if (string-match "\\S-" txt) (insert "\n" txt))))))) +(defun org-agenda-get-some-entry-text (marker n-lines) + "Extract entry text from MARKER, at most N-LINES lines. +This will ignore drawers etc, just get the text." + (let (txt drawer-re kwd-time-re ind) + (save-excursion + (with-current-buffer (marker-buffer marker) + (if (not (org-mode-p)) + (setq txt "") + (save-excursion + (save-restriction + (widen) + (goto-char marker) + (beginning-of-line 2) + (setq txt (buffer-substring + (point) + (progn (outline-next-heading) (point))) + drawer-re org-drawer-regexp + kwd-time-re (concat "^[ \t]*" org-keyword-time-regexp + ".*\n?")) + (with-temp-buffer + (insert txt) + (when org-agenda-add-entry-text-descriptive-links + (goto-char (point-min)) + (while (org-activate-bracket-links (point-max)) + (add-text-properties (match-beginning 0) (match-end 0) + '(face org-link)))) + (goto-char (point-min)) + (while (re-search-forward org-bracket-link-regexp (point-max) t) + (set-text-properties (match-beginning 0) (match-end 0) + nil)) + (goto-char (point-min)) + (while (re-search-forward drawer-re nil t) + (delete-region + (match-beginning 0) + (progn (re-search-forward + "^[ \t]*:END:.*\n?" nil 'move) + (point)))) + (goto-char (point-min)) + (while (re-search-forward kwd-time-re nil t) + (replace-match "")) + (if (re-search-forward "[ \t\n]+\\'" nil t) + (replace-match "")) + (goto-char (point-min)) + ;; find min indentation + (goto-char (point-min)) + (untabify (point-min) (point-max)) + (setq ind (org-get-indentation)) + (while (not (eobp)) + (unless (looking-at "[ \t]*$") + (setq ind (min ind (org-get-indentation)))) + (beginning-of-line 2)) + (goto-char (point-min)) + (while (not (eobp)) + (unless (looking-at "[ \t]*$") + (move-to-column ind) + (delete-region (point-at-bol) (point))) + (beginning-of-line 2)) + (goto-char (point-min)) + (while (and (not (eobp)) (re-search-forward "^" nil t)) + (replace-match " > ")) + (goto-char (point-min)) + (while (looking-at "[ \t]*\n") (replace-match "")) + (goto-char (point-max)) + (when (> (org-current-line) + n-lines) + (org-goto-line (1+ n-lines)) + (backward-char 1)) + (setq txt (buffer-substring (point-min) (point))))))))) + txt)) + (defun org-agenda-collect-markers () "Collect the markers pointing to entries in the agenda buffer." (let (m markers) @@ -2386,7 +2449,8 @@ bind it in the options section.") ((equal org-agenda-window-setup 'other-window) (org-switch-to-buffer-other-window abuf)) ((equal org-agenda-window-setup 'other-frame) - (switch-to-buffer-other-frame abuf)) + (switch-to-buffer-other-frame abuf) + (set-window-dedicated-p (selected-window) t)) ((equal org-agenda-window-setup 'reorganize-frame) (delete-other-windows) (org-switch-to-buffer-other-window abuf)))) @@ -2420,12 +2484,36 @@ bind it in the options section.") (org-agenda-fontify-priorities)) (when (and org-agenda-dim-blocked-tasks org-blocker-hook) (org-agenda-dim-blocked-tasks)) + (org-agenda-mark-clocking-task) + (when org-agenda-entry-text-mode + (org-agenda-entry-text-hide) + (org-agenda-entry-text-show)) (run-hooks 'org-finalize-agenda-hook) (setq org-agenda-type (get-text-property (point) 'org-agenda-type)) (when (get 'org-agenda-filter :preset-filter) (org-agenda-filter-apply org-agenda-filter)) ))) +(defun org-agenda-mark-clocking-task () + "Mark the current clock entry in the agenda if it is present." + (mapc (lambda (o) + (if (eq (org-overlay-get o 'type) 'org-agenda-clocking) + (org-delete-overlay o))) + (org-overlays-in (point-min) (point-max))) + (when (marker-buffer org-clock-hd-marker) + (save-excursion + (goto-char (point-min)) + (let (s ov) + (while (setq s (next-single-property-change (point) 'org-hd-marker)) + (goto-char s) + (when (equal (get-text-property (point) 'org-hd-marker) + org-clock-hd-marker) + (setq ov (org-make-overlay (point-at-bol) (1+ (point-at-eol)))) + (org-overlay-put ov 'type 'org-agenda-clocking) + (org-overlay-put ov 'face 'org-agenda-clocking) + (org-overlay-put ov 'help-echo + "The clock is running in this item"))))))) + (defun org-agenda-fontify-priorities () "Make highest priority lines bold, and lowest italic." (interactive) @@ -2530,7 +2618,7 @@ continue from there." (defvar org-agenda-markers nil "List of all currently active markers created by `org-agenda'.") -(defvar org-agenda-last-marker-time (time-to-seconds (current-time)) +(defvar org-agenda-last-marker-time (org-float-time) "Creation time of the last agenda marker.") (defun org-agenda-new-marker (&optional pos) @@ -2538,7 +2626,7 @@ continue from there." Org-mode keeps a list of these markers and resets them when they are no longer in use." (let ((m (copy-marker (or pos (point))))) - (setq org-agenda-last-marker-time (time-to-seconds (current-time))) + (setq org-agenda-last-marker-time (org-float-time)) (push m org-agenda-markers) m)) @@ -2552,6 +2640,43 @@ no longer in use." (mapc (lambda (m) (org-check-and-save-marker m beg end)) org-agenda-markers)) +;;; Entry text mode + +(defun org-agenda-entry-text-show-here () + "Add some text from te entry as context to the current line." + (let (m txt o) + (setq m (get-text-property (point) 'org-hd-marker)) + (unless (marker-buffer m) + (error "No marker points to an entry here")) + (setq txt (concat "\n" (org-no-properties + (org-agenda-get-some-entry-text + m org-agenda-entry-text-maxlines)))) + (when (string-match "\\S-" txt) + (setq o (org-make-overlay (point-at-bol) (point-at-eol))) + (org-overlay-put o 'evaporate t) + (org-overlay-put o 'org-overlay-type 'agenda-entry-content) + (org-overlay-put o 'after-string txt)))) + +(defun org-agenda-entry-text-show () + "Add entry context for all agenda lines." + (interactive) + (save-excursion + (goto-char (point-max)) + (beginning-of-line 1) + (while (not (bobp)) + (when (get-text-property (point) 'org-hd-marker) + (org-agenda-entry-text-show-here)) + (beginning-of-line 0)))) + +(defun org-agenda-entry-text-hide () + "Remove any shown entry context." + (delq nil + (mapcar (lambda (o) + (if (eq (org-overlay-get o 'org-overlay-type) + 'agenda-entry-content) + (progn (org-delete-overlay o) t))) + (org-overlays-in (point-min) (point-max))))) + ;;; Agenda timeline (defvar org-agenda-only-exact-dates nil) ; dynamically scoped @@ -3115,7 +3240,7 @@ for a keyword. A numeric prefix directly selects the Nth keyword in rtn rtnall files file pos) (when (equal arg '(4)) (setq org-select-this-todo-keyword - (org-ido-completing-read "Keyword (or KWD1|K2D2|...): " + (org-icompleting-read "Keyword (or KWD1|K2D2|...): " (mapcar 'list kwds) nil nil))) (and (equal 0 arg) (setq org-select-this-todo-keyword nil)) (org-set-local 'org-last-arg arg) @@ -3547,7 +3672,7 @@ So the example above may also be written as The function expects the lisp variables `entry' and `date' to be provided by the caller, because this is how the calendar works. Don't use this function from a program - use `org-agenda-get-day-entries' instead." - (when (> (- (time-to-seconds (current-time)) + (when (> (- (org-float-time) org-agenda-last-marker-time) 5) (org-agenda-reset-markers)) @@ -3582,7 +3707,7 @@ the documentation of `org-diary'." (buffer (if (file-exists-p file) (org-get-agenda-file-buffer file) (error "No such file %s" file))) - arg results rtn) + arg results rtn deadline-results) (if (not buffer) ;; If file does not exist, make sure an error message ends up in diary (list (format "ORG-AGENDA-ERROR: No such org-file %s" file)) @@ -3612,13 +3737,14 @@ the documentation of `org-diary'." (setq rtn (org-agenda-get-sexps)) (setq results (append results rtn))) ((eq arg :scheduled) - (setq rtn (org-agenda-get-scheduled)) + (setq rtn (org-agenda-get-scheduled deadline-results)) (setq results (append results rtn))) ((eq arg :closed) (setq rtn (org-agenda-get-progress)) (setq results (append results rtn))) ((eq arg :deadline) (setq rtn (org-agenda-get-deadlines)) + (setq deadline-results (copy-sequence rtn)) (setq results (append results rtn)))))))) results)))) @@ -4021,7 +4147,7 @@ FRACTION is what fraction of the head-warning time has passed." (while (setq f (pop faces)) (if (>= fraction (car f)) (throw 'exit (cdr f))))))) -(defun org-agenda-get-scheduled () +(defun org-agenda-get-scheduled (&optional deadline-results) "Return the scheduled information for agenda display." (let* ((props (list 'org-not-done-regexp org-not-done-regexp 'org-todo-regexp org-todo-regexp @@ -4035,6 +4161,12 @@ FRACTION is what fraction of the head-warning time has passed." (regexp org-scheduled-time-regexp) (todayp (org-agenda-todayp date)) ; DATE bound by calendar (d1 (calendar-absolute-from-gregorian date)) ; DATE bound by calendar + mm + (deadline-position-alist + (mapcar (lambda (a) (and (setq mm (get-text-property + 0 'org-hd-marker a)) + (cons (marker-position mm) a))) + deadline-results)) d2 diff pos pos1 category tags donep ee txt head pastschedp todo-state face timestr s) (goto-char (point-min)) @@ -4067,6 +4199,12 @@ FRACTION is what fraction of the head-warning time has passed." (setq txt org-agenda-no-heading-message) (goto-char (match-end 0)) (setq pos1 (match-beginning 0)) + (if (and + (or (eq t org-agenda-skip-scheduled-if-deadline-is-shown) + (and org-agenda-skip-scheduled-if-deadline-is-shown + pastschedp)) + (setq mm (assoc pos1 deadline-position-alist))) + (throw :skip nil)) (setq tags (org-get-tags-at)) (setq head (buffer-substring-no-properties (point) @@ -4273,7 +4411,7 @@ Any match of REMOVE-RE will be removed from TXT." (error nil))) (when effort (setq neffort (org-hh:mm-string-to-minutes effort) - effort (setq effort (concat "[" effort"]" ))))) + effort (setq effort (concat "[" effort "]" ))))) (when remove-re (while (string-match remove-re txt) @@ -4662,6 +4800,7 @@ If ERROR is non-nil, throw an error, otherwise just return nil." (interactive) (if org-agenda-columns-active (org-columns-quit) + (if (window-dedicated-p) (delete-other-windows)) (let ((buf (current-buffer))) (and (not (eq org-agenda-window-setup 'current-window)) (not (one-window-p)) @@ -4713,7 +4852,7 @@ When this is the global TODO list, a prefix argument will be interpreted." (put 'org-agenda-filter :preset-filter preset) (and (or filter preset) (org-agenda-filter-apply filter)) (and cols (interactive-p) (org-agenda-columns)) - (goto-line line) + (org-goto-line line) (recenter window-line))) @@ -4772,7 +4911,7 @@ to switch to narrowing." (org-set-local 'org-global-tags-completion-table (org-global-tags-completion-table))) (let ((completion-ignore-case t)) - (setq tag (org-ido-completing-read + (setq tag (org-icompleting-read "Tag: " org-global-tags-completion-table)))) (cond ((equal char ?/) @@ -4905,10 +5044,9 @@ Negative selection means, regexp must not match for selection of an entry." (defun org-agenda-manipulate-query (char) (cond ((memq org-agenda-type '(timeline agenda)) - (if (y-or-n-p "Re-display with inactive time stamps included? ") - (let ((org-agenda-include-inactive-timestamps t)) - (org-agenda-redo)) - (error "Abort"))) + (let ((org-agenda-include-inactive-timestamps t)) + (org-agenda-redo)) + (message "Display now includes inactive timestamps as well")) ((eq org-agenda-type 'search) (org-add-to-string 'org-agenda-query-string @@ -4999,7 +5137,7 @@ With prefix ARG, go backward that many times the current span." "Call one of the view mode commands." (interactive) (message "View: [d]ay [w]eek [m]onth [y]ear [l]og [L]og-all [a]rch-trees [A]rch-files - clock[R]eport time[G]rid include[D]iary") + clock[R]eport time[G]rid [[]inactive [E]ntryText include[D]iary") (let ((a (read-char-exclusive))) (case a (?d (call-interactively 'org-agenda-day-view)) @@ -5007,11 +5145,17 @@ With prefix ARG, go backward that many times the current span." (?m (call-interactively 'org-agenda-month-view)) (?y (call-interactively 'org-agenda-year-view)) (?l (call-interactively 'org-agenda-log-mode)) + ((?F ?f) (call-interactively 'org-agenda-follow-mode)) (?a (call-interactively 'org-agenda-archives-mode)) (?A (org-agenda-archives-mode 'files)) - (?R (call-interactively 'org-agenda-clockreport-mode)) + ((?R ?r) (call-interactively 'org-agenda-clockreport-mode)) + ((?E ?e) (call-interactively 'org-agenda-entry-text-mode)) (?G (call-interactively 'org-agenda-toggle-time-grid)) (?D (call-interactively 'org-agenda-toggle-diary)) + (?\[ (let ((org-agenda-include-inactive-timestamps t)) + (org-agenda-check-type t 'timeline 'agenda) + (org-agenda-redo)) + (message "Display now includes inactive timestamps as well")) (?q (message "Abort")) (otherwise (error "Invalid key" ))))) @@ -5171,6 +5315,22 @@ so that the date SD will be in that range." (message "Follow mode is %s" (if org-agenda-follow-mode "on" "off"))) +(defun org-agenda-entry-text-mode (&optional arg) + "Toggle entry text mode in an agenda buffer." + (interactive "P") + (if (integerp arg) + (setq org-agenda-entry-text-mode t) + (setq org-agenda-entry-text-mode (not org-agenda-entry-text-mode))) + (org-agenda-entry-text-hide) + (and org-agenda-entry-text-mode + (let ((org-agenda-entry-text-maxlines + (if (integerp arg) arg org-agenda-entry-text-maxlines))) + (org-agenda-entry-text-show))) + (org-agenda-set-mode-name) + (message "Entry text mode is %s. Maximum number of lines is %d" + (if org-agenda-entry-text-mode "on" "off") + (if (integerp arg) arg org-agenda-entry-text-maxlines))) + (defun org-agenda-clockreport-mode () "Toggle clocktable mode in an agenda buffer." (interactive) @@ -5244,6 +5404,7 @@ When called with a prefix argument, include all archive files as well." (if (equal org-agenda-ndays 1) " Day" "") (if (equal org-agenda-ndays 7) " Week" "") (if org-agenda-follow-mode " Follow" "") + (if org-agenda-entry-text-mode " ETxt" "") (if org-agenda-include-diary " Diary" "") (if org-agenda-use-time-grid " Grid" "") (if (consp org-agenda-show-log) " LogAll" @@ -5411,33 +5572,39 @@ If this information is not given, the function uses the tree at point." (defun org-agenda-refile (&optional goto rfloc) "Refile the item at point." (interactive "P") + (if (equal goto '(16)) + (org-refile-goto-last-stored) + (let* ((marker (or (get-text-property (point) 'org-hd-marker) + (org-agenda-error))) + (buffer (marker-buffer marker)) + (pos (marker-position marker)) + (rfloc (or rfloc + (org-refile-get-location + (if goto "Goto: " "Refile to: ") buffer + org-refile-allow-creating-parent-nodes)))) + (with-current-buffer buffer + (save-excursion + (save-restriction + (widen) + (goto-char marker) + (org-remove-subtree-entries-from-agenda) + (org-refile goto buffer rfloc))))))) + +(defun org-agenda-open-link (&optional arg) + "Follow the link in the current line, if any. +This looks for a link in the displayed lin in the agenda. It also looks +at the text of the entry itself." + (interactive "P") (let* ((marker (or (get-text-property (point) 'org-hd-marker) - (org-agenda-error))) - (buffer (marker-buffer marker)) - (pos (marker-position marker)) - (rfloc (or rfloc - (org-refile-get-location - (if goto "Goto: " "Refile to: ") buffer - org-refile-allow-creating-parent-nodes)))) + (get-text-property (point) 'org-marker))) + (buffer (and marker (marker-buffer marker)))) + (unless buffer (error "Don't know where to look for links")) (with-current-buffer buffer (save-excursion (save-restriction (widen) (goto-char marker) - (org-remove-subtree-entries-from-agenda) - (org-refile goto buffer rfloc)))))) - - - - -(defun org-agenda-open-link () - "Follow the link in the current line, if any." - (interactive) - (org-agenda-copy-local-variable 'org-link-abbrev-alist-local) - (save-excursion - (save-restriction - (narrow-to-region (point-at-bol) (point-at-eol)) - (org-open-at-point)))) + (org-offer-links-in-entry arg)))))) (defun org-agenda-copy-local-variable (var) "Get a variable from a referenced buffer and install it here." @@ -5487,8 +5654,8 @@ The prefix arg causes further revieling: 0 hide the subtree 1 just show the entry according to defaults. -2 show the text below the heading -3 show the entire subtree +2 show the children view +3 show the subtree view 4 show the entire subtree and any LOGBOOK drawers 5 show the entire subtree and any drawers With prefix argument FULL-ENTRY, make the entire entry visible @@ -5500,21 +5667,25 @@ if it was hidden in the outline." (cond ((= more 0) (hide-subtree) - (message "Remote: hide subtree")) + (save-excursion + (org-back-to-heading) + (run-hook-with-args 'org-cycle-hook 'folded)) + (message "Remote: FOLDED")) ((and (interactive-p) (= more 1)) (message "Remote: show with default settings")) ((= more 2) (show-entry) + (show-children) (save-excursion (org-back-to-heading) - (org-cycle-hide-drawers 'children)) - (message "Remote: show entry")) + (run-hook-with-args 'org-cycle-hook 'children)) + (message "Remote: CHILDREN")) ((= more 3) (show-subtree) (save-excursion (org-back-to-heading) - (org-cycle-hide-drawers 'subtree)) - (message "Remote: show subtree")) + (run-hook-with-args 'org-cycle-hook 'subtree)) + (message "Remote: SUBTREE")) ((= more 4) (let* ((org-drawers (delete "LOGBOOK" (copy-sequence org-drawers))) (org-drawer-regexp @@ -5525,10 +5696,10 @@ if it was hidden in the outline." (save-excursion (org-back-to-heading) (org-cycle-hide-drawers 'subtree))) - (message "Remote: show subtree and LOGBOOK")) + (message "Remote: SUBTREE AND LOGBOOK")) ((> more 4) (show-subtree) - (message "Remote: show subtree and LOGBOOK"))) + (message "Remote: SUBTREE AND ALL DRAWERS"))) (select-window win))) (defun org-recenter-heading (n) @@ -5537,20 +5708,27 @@ if it was hidden in the outline." (recenter n))) (defvar org-agenda-cycle-counter nil) -(defun org-agenda-cycle-show (n) +(defun org-agenda-cycle-show (&optional n) "Show the current entry in another window, with default settings. Default settings are taken from `org-show-hierarchy-above' and siblings. -When use repeadedly in immediate succession, the remote entry will cycle +When use repeatedly in immediate succession, the remote entry will cycle through visibility -entry -> subtree -> subtree with logbook" - (interactive "p") - (when (and (= n 1) - (not (eq last-command this-command))) - (setq org-agenda-cycle-counter 0)) - (setq org-agenda-cycle-counter (1+ org-agenda-cycle-counter)) - (if (> org-agenda-cycle-counter 4) - (setq org-agenda-cycle-counter 0)) +children -> subtree -> folded + +When called with a numeric prefix arg, that arg will be passed through to +`org-agenda-show-1'. For the interpretation of that argument, see the +docstring of `org-agenda-show-1'." + (interactive "P") + (if (integerp n) + (setq org-agenda-cycle-counter n) + (if (not (eq last-command this-command)) + (setq org-agenda-cycle-counter 1) + (if (equal org-agenda-cycle-counter 0) + (setq org-agenda-cycle-counter 2) + (setq org-agenda-cycle-counter (1+ org-agenda-cycle-counter)) + (if (> org-agenda-cycle-counter 3) + (setq org-agenda-cycle-counter 0))))) (org-agenda-show-1 org-agenda-cycle-counter)) (defun org-agenda-recenter (arg) @@ -5821,6 +5999,53 @@ the same tree node, and the headline of the tree node in the Org-mode file." (org-agenda-change-all-lines newhead hdmarker) (beginning-of-line 1))))) +(defun org-agenda-set-property () + "Set a property for the current headline." + (interactive) + (org-agenda-check-no-diary) + (org-agenda-show) ;;; FIXME This is a stupid hack and should not be needed + (let* ((hdmarker (or (get-text-property (point) 'org-hd-marker) + (org-agenda-error))) + (buffer (marker-buffer hdmarker)) + (pos (marker-position hdmarker)) + (inhibit-read-only t) + newhead) + (org-with-remote-undo buffer + (with-current-buffer buffer + (widen) + (goto-char pos) + (save-excursion + (org-show-context 'agenda)) + (save-excursion + (and (outline-next-heading) + (org-flag-heading nil))) ; show the next heading + (goto-char pos) + (call-interactively 'org-set-property))))) + +(defun org-agenda-set-effort () + "Set the effort property for the current headline." + (interactive) + (org-agenda-check-no-diary) + (org-agenda-show) ;;; FIXME This is a stupid hack and should not be needed + (let* ((hdmarker (or (get-text-property (point) 'org-hd-marker) + (org-agenda-error))) + (buffer (marker-buffer hdmarker)) + (pos (marker-position hdmarker)) + (inhibit-read-only t) + newhead) + (org-with-remote-undo buffer + (with-current-buffer buffer + (widen) + (goto-char pos) + (save-excursion + (org-show-context 'agenda)) + (save-excursion + (and (outline-next-heading) + (org-flag-heading nil))) ; show the next heading + (goto-char pos) + (call-interactively 'org-set-effort) + (end-of-line 1))))) + (defun org-agenda-toggle-archive-tag () "Toggle the archive tag for the current entry." (interactive) @@ -6273,14 +6498,17 @@ This is a command that has to be installed in `calendar-mode-map'." (defvar org-agenda-bulk-marked-entries nil "List of markers that refer to marked entries in the agenda.") +(defun org-agenda-bulk-marked-p () + (eq (get-char-property (point-at-bol) 'type) + 'org-marked-entry-overlay)) + (defun org-agenda-bulk-mark () "Mark the entry at point for future bulk action." (interactive) (org-agenda-check-no-diary) (let* ((m (get-text-property (point) 'org-hd-marker)) ov) - (unless (eq (get-char-property (point-at-bol) 'type) - 'org-marked-entry-overlay) + (unless (org-agenda-bulk-marked-p) (unless m (error "Nothing to mark at point")) (push m org-agenda-bulk-marked-entries) (setq ov (org-make-overlay (point-at-bol) (+ 2 (point-at-bol)))) @@ -6295,8 +6523,7 @@ This is a command that has to be installed in `calendar-mode-map'." (defun org-agenda-bulk-unmark () "Unmark the entry at point for future bulk action." (interactive) - (when (eq (get-char-property (point-at-bol) 'type) - 'org-marked-entry-overlay) + (when (org-agenda-bulk-marked-p) (org-agenda-bulk-remove-overlays (point-at-bol) (+ 2 (point-at-bol))) (setq org-agenda-bulk-marked-entries @@ -6306,6 +6533,12 @@ This is a command that has to be installed in `calendar-mode-map'." (message "%d entries marked for bulk action" (length org-agenda-bulk-marked-entries))) +(defun org-agenda-bulk-toggle () + "Toggle marking the entry at point for bulk action." + (interactive) + (if (org-agenda-bulk-marked-p) + (org-agenda-bulk-unmark) + (org-agenda-bulk-mark))) (defun org-agenda-bulk-remove-overlays (&optional beg end) "Remove the mark overlays between BEG and END in the agenda buffer. @@ -6357,7 +6590,7 @@ This will remove the markers, and the overlays." (setq cmd (list 'org-agenda-refile nil (list 'quote rfloc)))) ((equal action ?t) - (setq state (org-ido-completing-read + (setq state (org-icompleting-read "Todo state: " (with-current-buffer (marker-buffer (car entries)) (mapcar 'list org-todo-keywords-1)))) @@ -6366,7 +6599,7 @@ This will remove the markers, and the overlays." (org-agenda-todo ,state)))) ((memq action '(?- ?+)) - (setq tag (org-ido-completing-read + (setq tag (org-icompleting-read (format "Tag to %s: " (if (eq action ?+) "add" "remove")) (with-current-buffer (marker-buffer (car entries)) (delq nil diff --git a/lisp/org/org-archive.el b/lisp/org/org-archive.el index 26d3278183c..7a5692480ef 100644 --- a/lisp/org/org-archive.el +++ b/lisp/org/org-archive.el @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; diff --git a/lisp/org/org-ascii.el b/lisp/org/org-ascii.el index 4ace1db5c7c..a055b838794 100644 --- a/lisp/org/org-ascii.el +++ b/lisp/org/org-ascii.el @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; @@ -266,11 +266,13 @@ publishing directory." ;; File header (unless body-only - (if title (org-insert-centered title ?=)) - (insert "\n") + (when (and title (not (string= "" title))) + (org-insert-centered title ?=) + (insert "\n")) + (if (and (or author email) org-export-author-info) - (insert (concat (nth 1 lang-words) ": " (or author "") + (insert(concat (nth 1 lang-words) ": " (or author "") (if email (concat " <" email ">") "") "\n"))) @@ -283,7 +285,8 @@ publishing directory." (if (and date org-export-time-stamp-file) (insert (concat (nth 2 lang-words) ": " date"\n"))) - (insert "\n\n")) + (unless (= (point) (point-min)) + (insert "\n\n"))) (if (and org-export-with-toc (not body-only)) (progn diff --git a/lisp/org/org-attach.el b/lisp/org/org-attach.el index 05228c22c0f..a9c80cfe4d8 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.29c +;; Version: 6.30c ;; This file is part of GNU Emacs. ;; @@ -314,7 +314,7 @@ The attachment is created as an Emacs buffer." (let* ((attach-dir (org-attach-dir t)) (files (org-attach-file-list attach-dir)) (file (or file - (org-ido-completing-read + (org-icompleting-read "Delete attachment: " (mapcar (lambda (f) (list (file-name-nondirectory f))) @@ -389,7 +389,7 @@ If IN-EMACS is non-nil, force opening in Emacs." (files (org-attach-file-list attach-dir)) (file (if (= (length files) 1) (car files) - (org-ido-completing-read "Open attachment: " + (org-icompleting-read "Open attachment: " (mapcar 'list files) nil t)))) (org-open-file (expand-file-name file attach-dir) in-emacs))) diff --git a/lisp/org/org-bbdb.el b/lisp/org/org-bbdb.el index 8b2470d82bf..2c2e9ce81a9 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.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; diff --git a/lisp/org/org-bibtex.el b/lisp/org/org-bibtex.el index 6bdc1ce1236..5e9fbe3cf76 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.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; diff --git a/lisp/org/org-clock.el b/lisp/org/org-clock.el index 4b96dae101b..064d5269523 100644 --- a/lisp/org/org-clock.el +++ b/lisp/org/org-clock.el @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; @@ -277,6 +277,7 @@ of a different task.") (defun org-clock-save-markers-for-cut-and-paste (beg end) "Save relative positions of markers in region." (org-check-and-save-marker org-clock-marker beg end) + (org-check-and-save-marker org-clock-hd-marker beg end) (org-check-and-save-marker org-clock-default-task beg end) (org-check-and-save-marker org-clock-interrupted-task beg end) (mapc (lambda (m) (org-check-and-save-marker m beg end)) @@ -389,8 +390,8 @@ If not, show simply the clocked time like 01:50." The time returned includes the the time spent on this task in previous clocking intervals." (let ((currently-clocked-time - (floor (- (time-to-seconds (current-time)) - (time-to-seconds org-clock-start-time)) 60))) + (floor (- (org-float-time) + (org-float-time org-clock-start-time)) 60))) (+ currently-clocked-time (or org-clock-total-time 0)))) (defun org-clock-modify-effort-estimate (&optional value) @@ -424,7 +425,8 @@ the mode line." (setq value (max 0 value) org-clock-effort (org-minutes-to-hh:mm-string value)) (org-entry-put org-clock-marker "Effort" org-clock-effort) - (org-clock-update-mode-line)))) + (org-clock-update-mode-line) + (message "Effort is now %s" org-clock-effort)))) (defvar org-clock-notification-was-shown nil "Shows if we have shown notification already.") @@ -438,12 +440,16 @@ Notification is shown only once." (if (>= clocked-time effort-in-minutes) (unless org-clock-notification-was-shown (setq org-clock-notification-was-shown t) - (org-clock-play-sound) - (org-show-notification + (org-notify (format "Task '%s' should be finished by now. (%s)" - org-clock-heading org-clock-effort))) + org-clock-heading org-clock-effort) t)) (setq org-clock-notification-was-shown nil))))) +(defun org-notify (notification &optional play-sound) + "Send a NOTIFICATION and maybe PLAY-SOUND." + (org-show-notification notification) + (if play-sound (org-clock-play-sound))) + (defun org-show-notification (notification) "Show notification. Use `org-show-notification-handler' if defined, @@ -592,6 +598,9 @@ the clocking selection, associated with the letter `d'." (setq ts (org-insert-time-stamp org-clock-start-time 'with-hm 'inactive)))) (move-marker org-clock-marker (point) (buffer-base-buffer)) + (move-marker org-clock-hd-marker + (save-excursion (org-back-to-heading t) (point)) + (buffer-base-buffer)) (or global-mode-string (setq global-mode-string '(""))) (or (memq 'org-mode-line-string global-mode-string) (setq global-mode-string @@ -751,8 +760,8 @@ If there is no running clock, throw an error, unless FAIL-QUIETLY is set." (delete-region (point) (point-at-eol)) (insert "--") (setq te (org-insert-time-stamp (current-time) 'with-hm 'inactive)) - (setq s (- (time-to-seconds (apply 'encode-time (org-parse-time-string te))) - (time-to-seconds (apply 'encode-time (org-parse-time-string ts)))) + (setq s (- (org-float-time (apply 'encode-time (org-parse-time-string te))) + (org-float-time (apply 'encode-time (org-parse-time-string ts)))) h (floor (/ s 3600)) s (- s (* 3600 h)) m (floor (/ s 60)) @@ -765,6 +774,7 @@ If there is no running clock, throw an error, unless FAIL-QUIETLY is set." (and (looking-at "\n") (> (point-max) (1+ (point))) (delete-char 1))) (move-marker org-clock-marker nil) + (move-marker org-clock-hd-marker nil) (when org-log-note-clock-out (org-add-log-setup 'clock-out nil nil nil nil (concat "# Task: " (org-get-heading t) "\n\n"))) @@ -802,6 +812,8 @@ If there is no running clock, throw an error, unless FAIL-QUIETLY is set." (set-buffer (marker-buffer org-clock-marker)) (goto-char org-clock-marker) (delete-region (1- (point-at-bol)) (point-at-eol))) + (move-marker 'org-clock-marker nil) + (move-marker 'org-clock-hd-marker nil) (setq global-mode-string (delq 'org-mode-line-string global-mode-string)) (force-mode-line-update) @@ -856,8 +868,8 @@ TSTART and TEND can mark a time range to be considered." time) (if (stringp tstart) (setq tstart (org-time-string-to-seconds tstart))) (if (stringp tend) (setq tend (org-time-string-to-seconds tend))) - (if (consp tstart) (setq tstart (time-to-seconds tstart))) - (if (consp tend) (setq tend (time-to-seconds tend))) + (if (consp tstart) (setq tstart (org-float-time tstart))) + (if (consp tend) (setq tend (org-float-time tend))) (remove-text-properties (point-min) (point-max) '(:org-clock-minutes t)) (save-excursion (goto-char (point-max)) @@ -867,9 +879,9 @@ TSTART and TEND can mark a time range to be considered." ;; Two time stamps (setq ts (match-string 2) te (match-string 3) - ts (time-to-seconds + ts (org-float-time (apply 'encode-time (org-parse-time-string ts))) - te (time-to-seconds + te (org-float-time (apply 'encode-time (org-parse-time-string te))) ts (if tstart (max ts tstart) ts) te (if tend (min te tend) te) @@ -1210,9 +1222,9 @@ the currently selected interval size." (when (and te (listp te)) (setq te (format "%4d-%02d-%02d" (nth 2 te) (car te) (nth 1 te)))) ;; Now the times are strings we can parse. - (if ts (setq ts (time-to-seconds + (if ts (setq ts (org-float-time (apply 'encode-time (org-parse-time-string ts))))) - (if te (setq te (time-to-seconds + (if te (setq te (org-float-time (apply 'encode-time (org-parse-time-string te))))) (move-marker ins (point)) (setq ipos (point)) @@ -1390,9 +1402,9 @@ the currently selected interval size." (when block (setq cc (org-clock-special-range block nil t) ts (car cc) te (nth 1 cc) range-text (nth 2 cc))) - (if ts (setq ts (time-to-seconds + (if ts (setq ts (org-float-time (apply 'encode-time (org-parse-time-string ts))))) - (if te (setq te (time-to-seconds + (if te (setq te (org-float-time (apply 'encode-time (org-parse-time-string te))))) (setq p1 (plist-put p1 :header "")) (setq p1 (plist-put p1 :step nil)) diff --git a/lisp/org/org-colview.el b/lisp/org/org-colview.el index c89de339fab..73e6bed121a 100644 --- a/lisp/org/org-colview.el +++ b/lisp/org/org-colview.el @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; @@ -446,7 +446,7 @@ Where possible, use the standard interface for changing this line." (t (setq allowed (org-property-get-allowed-values pom key 'table)) (if allowed - (setq nval (org-ido-completing-read "Value: " allowed nil t)) + (setq nval (org-icompleting-read "Value: " allowed nil t)) (setq nval (read-string "Edit: " value))) (setq nval (org-trim nval)) (when (not (equal nval value)) @@ -694,7 +694,7 @@ around it." truncate-lines)) (setq truncate-lines t) (mapc (lambda (x) - (goto-line (car x)) + (org-goto-line (car x)) (org-columns-display-here (cdr x))) cache))))) @@ -721,7 +721,7 @@ interactive function org-columns-new.") (interactive) (let ((editp (and prop (assoc prop org-columns-current-fmt-compiled))) cell) - (setq prop (org-ido-completing-read + (setq prop (org-icompleting-read "Property: " (mapcar 'list (org-buffer-property-keys t nil t)) nil nil prop)) (setq title (read-string (concat "Column title [" prop "]: ") (or title prop))) @@ -729,7 +729,7 @@ interactive function org-columns-new.") (if (string-match "\\S-" width) (setq width (string-to-number width)) (setq width nil)) - (setq fmt (org-ido-completing-read + (setq fmt (org-icompleting-read "Summary [none]: " (mapcar (lambda (x) (list (symbol-name (cadr x)))) org-columns-compile-map) @@ -959,7 +959,7 @@ Don't set this, this is meant for dynamic scoping.") (call-interactively 'org-columns) (org-agenda-redo) (call-interactively 'org-agenda-columns))) - (goto-line line) + (org-goto-line line) (move-to-column col)) (message "Recomputing columns...done")) @@ -1228,7 +1228,7 @@ and tailing newline characters." "Create a dynamic block capturing a column view table." (interactive) (let ((defaults '(:name "columnview" :hlines 1)) - (id (org-ido-completing-read + (id (org-icompleting-read "Capture columns (local, global, entry with :ID: property) [local]: " (append '(("global") ("local")) (mapcar 'list (org-property-values "ID")))))) @@ -1303,7 +1303,7 @@ and tailing newline characters." (org-bound-and-true-p flyspell-mode)) (flyspell-mode 0)) (mapc (lambda (x) - (goto-line (car x)) + (org-goto-line (car x)) (org-columns-display-here (cdr x))) cache) (when org-agenda-columns-show-summaries diff --git a/lisp/org/org-compat.el b/lisp/org/org-compat.el index c52c5af9b6e..2f4112ce354 100644 --- a/lisp/org/org-compat.el +++ b/lisp/org/org-compat.el @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; @@ -36,7 +36,8 @@ (require 'org-macs) -(declare-function find-library-name "find-func" (library)) +(declare-function find-library-name "find-func" (library)) +(declare-function w32-focus-frame "w32-win" (frame)) (defconst org-xemacs-p (featurep 'xemacs)) ; not used by org.el itself (defconst org-format-transports-properties-p @@ -332,6 +333,35 @@ that can be added." string) (apply 'kill-new string args)) +(defun org-select-frame-set-input-focus (frame) + "Select FRAME, raise it, and set input focus, if possible." + (cond ((featurep 'xemacs) + (if (fboundp 'select-frame-set-input-focus) + (select-frame-set-input-focus frame) + (raise-frame frame) + (select-frame frame) + (focus-frame frame))) + ;; `select-frame-set-input-focus' defined in Emacs 21 will not + ;; set the input focus. + ((>= emacs-major-version 22) + (select-frame-set-input-focus frame)) + (t + (raise-frame frame) + (select-frame frame) + (cond ((memq window-system '(x ns mac)) + (x-focus-frame frame)) + ((eq window-system 'w32) + (w32-focus-frame frame))) + (when focus-follows-mouse + (set-mouse-position frame (1- (frame-width frame)) 0))))) + +(defun org-float-time (&optional time) + "Convert time value TIME to a floating point number. +TIME defaults to the current time." + (if (featurep 'xemacs) + (time-to-seconds (or time (current-time))) + (float-time time))) + (provide 'org-compat) ;; arch-tag: a0a0579f-e68c-4bdf-9e55-93768b846bbe diff --git a/lisp/org/org-docbook.el b/lisp/org/org-docbook.el index 38af0803434..172319e5b06 100644 --- a/lisp/org/org-docbook.el +++ b/lisp/org/org-docbook.el @@ -4,12 +4,11 @@ ;; ;; Emacs Lisp Archive Entry ;; Filename: org-docbook.el -;; Version: 6.29c +;; Version: 6.30c ;; Author: Baoqiu Cui <cbaoqiu AT yahoo DOT com> ;; Maintainer: Baoqiu Cui <cbaoqiu AT yahoo DOT com> ;; Keywords: org, wp, docbook ;; Description: Converts an org-mode buffer into DocBook -;; $Id: org-docbook.el,v 1.3 2009/08/08 12:18:56 cdominik Exp $ ;; URL: ;; This file is part of GNU Emacs. @@ -1402,5 +1401,4 @@ that need to be preserved in later phase of DocBook exporting." (provide 'org-docbook) -;; arch-tag: a24a127c-d365-4c2a-9e9b-f7dcb0ebfdc3 ;;; org-docbook.el ends here diff --git a/lisp/org/org-exp-blocks.el b/lisp/org/org-exp-blocks.el index e8cf4392de4..8df0ac1476f 100644 --- a/lisp/org/org-exp-blocks.el +++ b/lisp/org/org-exp-blocks.el @@ -203,9 +203,8 @@ specified in BLOCKS which default to the value of "" (apply func (save-match-data (org-remove-indentation (match-string 4))) (split-string (match-string 3) " ")))) t t) - ;; indent the replaced match - (indent-region (match-beginning 0) (match-end 0) indentation) - )) + ;; indent block + (indent-code-rigidly (match-beginning 0) (match-end 0) indentation))) (setf start (save-match-data (match-end 0)))) (mapcar (lambda (type) (interblock start (point-max) type)) @@ -370,7 +369,7 @@ with their values as determined by R." (defun org-export-interblocks-format-R (start end) "This is run over parts of the org-file which are between R -blocks. It's main use is to expand the \R{stuff} chunks for +blocks. Its main use is to expand the \R{stuff} chunks for export." (save-excursion (goto-char start) @@ -437,5 +436,4 @@ export." (provide 'org-exp-blocks) -;; arch-tag: 1c365fe9-8808-4f72-bb15-0b00f36d8024 ;;; org-exp-blocks.el ends here diff --git a/lisp/org/org-exp.el b/lisp/org/org-exp.el index 53264d30d47..3e12e6af10e 100644 --- a/lisp/org/org-exp.el +++ b/lisp/org/org-exp.el @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; @@ -29,7 +29,7 @@ (require 'org) (require 'org-agenda) (require 'org-exp-blocks) -(eval-and-compile +(eval-when-compile (require 'cl)) (declare-function org-export-latex-preprocess "org-latex" (parameters)) @@ -574,6 +574,7 @@ much faster." (:priority "pri" org-export-with-priority) (:TeX-macros "TeX" org-export-with-TeX-macros) (:LaTeX-fragments "LaTeX" org-export-with-LaTeX-fragments) + (:latex-listings nil org-export-latex-listings) (:skip-before-1st-heading "skip" org-export-skip-text-before-1st-heading) (:fixed-width ":" org-export-with-fixed-width) (:timestamps "<" org-export-with-timestamps) @@ -741,9 +742,14 @@ modified) list.") (setq p (plist-put p (intern (concat ":macro-" (downcase (match-string 1 val)))) - (match-string 2 val))))) + (org-export-interpolate-newlines (match-string 2 val)))))) p)))) +(defun org-export-interpolate-newlines (s) + (while (string-match "\\\\n" s) + (setq s (replace-match "\n" t t s))) + s) + (defvar org-export-allow-BIND-local nil) (defun org-export-confirm-letbind () "Can we use #+BIND values during export? @@ -1695,7 +1701,7 @@ from the buffer." (ascii "ASCII" "BEGIN_ASCII" "END_ASCII") (latex "LaTeX" "BEGIN_LaTeX" "END_LaTeX"))) (case-fold-search t) - fmt) + fmt beg beg-content end end-content) (while formatters (setq fmt (pop formatters)) @@ -1709,16 +1715,17 @@ from the buffer." (point-at-bol) (min (1+ (point-at-eol)) (point-max)) '(org-protected t)))) (goto-char (point-min)) - (while (re-search-forward - (concat "^[ \t]*#\\+" (caddr fmt) - "\\>.*\\(\\(\n.*\\)*?\n\\)[ \t]*#\\+" (cadddr fmt) - "\\>.*\n?") nil t) - (if (eq (car fmt) backend) - ;; yes, keep this - (add-text-properties (match-beginning 1) (1+ (match-end 1)) - '(org-protected t)) - ;; No, this is for a different backend, kill it - (delete-region (match-beginning 0) (match-end 0))))))) + (while (re-search-forward (concat "^[ \t]*#\\+" (caddr fmt) "\\>.*\n?") + nil t) + (setq beg (match-beginning 0) beg-content (match-end 0)) + (when (re-search-forward (concat "^[ \t]*#\\+" (cadddr fmt) "\\>.*\n?") + nil t) + (setq end (match-end 0) end-content (match-beginning 0)) + (if (eq (car fmt) backend) + ;; yes, keep this + (add-text-properties beg-content end-content '(org-protected t)) + ;; No, this is for a different backend, kill it + (delete-region beg end))))))) (defun org-export-mark-blockquote-verse-center () "Mark block quote and verse environments with special cookies. @@ -1834,12 +1841,18 @@ When it is nil, all comments will be removed." (while (re-search-forward "^[ \t]*|" nil t) (beginning-of-line 1) (if (or (looking-at "[ \t]*| *[!_^] *|") - (and (looking-at ".*?| *<[0-9]+> *|") - (not (looking-at ".*?| *[^ <|]")))) + (and (looking-at "[ \t]*|\\( *\\(<[0-9]+>\\|<[rl]>\\|<[rl][0-9]+>\\)? *|\\)+[ \t]*$") + (not (looking-at ".*?| *[^ <|\n]")))) (delete-region (max (point-min) (1- (point-at-bol))) (point-at-eol)) (end-of-line 1)))) +(defun org-export-protect-sub-super (s) + (save-match-data + (while (string-match "\\([^\\\\]\\)\\([_^]\\)" s) + (setq s (replace-match "\\1\\\\\\2" nil nil s))) + s)) + (defun org-export-normalize-links () "Convert all links to bracket links, and expand link abbreviations." (let ((re-plain-link (concat "\\([^[<]\\)" org-plain-link-re)) @@ -1849,8 +1862,11 @@ When it is nil, all comments will be removed." (while (re-search-forward re-plain-link nil t) (goto-char (1- (match-end 0))) (org-if-unprotected-at (1+ (match-beginning 0)) - (let* ((s (concat (match-string 1) "[[" (match-string 2) - ":" (match-string 3) "]]"))) + (let* ((s (concat (match-string 1) + "[[" (match-string 2) ":" (match-string 3) + "][" (match-string 2) ":" (org-export-protect-sub-super + (match-string 3)) + "]]"))) ;; added 'org-link face to links (put-text-property 0 (length s) 'face 'org-link s) (replace-match s t t)))) @@ -1858,8 +1874,11 @@ When it is nil, all comments will be removed." (while (re-search-forward re-angle-link nil t) (goto-char (1- (match-end 0))) (org-if-unprotected - (let* ((s (concat (match-string 1) "[[" (match-string 2) - ":" (match-string 3) "]]"))) + (let* ((s (concat (match-string 1) + "[[" (match-string 2) ":" (match-string 3) + "][" (match-string 2) ":" (org-export-protect-sub-super + (match-string 3)) + "]]"))) (put-text-property 0 (length s) 'face 'org-link s) (replace-match s t t)))) (goto-char (point-min)) @@ -2056,7 +2075,7 @@ TYPE must be a string, any of: (goto-char (point-min)) (let (sy val key args args2 s n) (while (re-search-forward - "{{{\\([a-zA-Z][-a-zA-Z0-9_]*\\)\\((\\(.*?\\))\\)?}}}" + "{{{\\([a-zA-Z][-a-zA-Z0-9_]*\\)\\(([ \t\n]*\\([^\000]*?\\))\\)?}}}" nil t) (setq key (downcase (match-string 1)) args (match-string 3)) @@ -2066,7 +2085,8 @@ TYPE must be a string, any of: (intern (concat ":" key))))) (save-match-data (when args - (setq args (org-split-string args ",[ \t]*") args2 nil) + (setq args (org-split-string args ",[ \t\n]*") args2 nil) + (setq args (mapcar 'org-trim args)) (while args (while (string-match "\\\\\\'" (car args)) ;; repair bad splits @@ -2111,7 +2131,8 @@ TYPE must be a string, any of: markup (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 " ")) + switches (mapconcat '(lambda (x) (format "%s" x)) params " ") + start nil end nil) (delete-region (match-beginning 0) (match-end 0)) (if (or (not file) (not (file-exists-p file)) @@ -2126,7 +2147,8 @@ TYPE must be a string, any of: (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 markup)) + (insert (org-get-file-contents (expand-file-name file) + prefix prefix1 markup)) (or (bolp) (newline)) (insert (or end "")))))) @@ -2136,6 +2158,7 @@ If PREFIX is a string, prepend it to each line. If PREFIX1 is a string, prepend it to the first line instead of PREFIX. If MARKUP, don't protect org-like lines, the exporter will take care of the block they are in." + (if (stringp markup) (setq markup (downcase markup))) (with-temp-buffer (insert-file-contents file) (when (or prefix prefix1) @@ -2145,9 +2168,9 @@ take care of the block they are in." (setq prefix1 nil) (beginning-of-line 2))) (buffer-string) - (unless markup + (when (member markup '("src" "example")) (goto-char (point-min)) - (while (re-search-forward "^\\(\\*\\|[ \t]*#\\)" nil t) + (while (re-search-forward "^\\([*#]\\|[ \t]*#\\+\\)" nil t) (goto-char (match-beginning 0)) (insert ",") (end-of-line 1))) @@ -2203,6 +2226,8 @@ in the list) and remove property and value from the list in LISTVAR." (defvar htmlp) ;; dynamically scoped (defvar latexp) ;; dynamically scoped (defvar org-export-latex-verbatim-wrap) ;; defined in org-latex.el +(defvar org-export-latex-listings) ;; defined in org-latex.el +(defvar org-export-latex-listings-langs) ;; defined in org-latex.el (defun org-export-format-source-code-or-example (backend lang code &optional opts indent) @@ -2268,7 +2293,15 @@ INDENT was the original indentation of the block." "htmlize.el 1.34 or later is needed for source code formatting"))) (if lang - (let* ((mode (and lang (intern (concat lang "-mode")))) + (let* ((lang-m (when lang + (or (cdr (assoc lang org-src-lang-modes)) + lang))) + (mode (and lang-m (intern + (concat + (if (symbolp lang-m) + (symbol-name lang-m) + lang-m) + "-mode")))) (org-inhibit-startup t) (org-startup-folded nil)) (setq rtn @@ -2309,8 +2342,24 @@ INDENT was the original indentation of the block." ((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 (car org-export-latex-verbatim-wrap) - rtn (cdr org-export-latex-verbatim-wrap)) + (org-add-props + (if org-export-latex-listings + (concat + (if lang + (let* + ((lang-sym (intern lang)) + (lstlang + (or (cadr + (assq + lang-sym + org-export-latex-listings-langs)) + lang))) + (format "\\lstset{language=%s}\n" lstlang)) + "") + "\\begin{lstlisting}\n" + rtn "\\end{lstlisting}\n") + (concat (car org-export-latex-verbatim-wrap) + rtn (cdr org-export-latex-verbatim-wrap))) '(org-protected t)) "#+END_LaTeX\n\n")) ((eq backend 'ascii) @@ -2367,7 +2416,7 @@ INDENT was the original indentation of the block." "\\)\\)")) ref) - (goto-line (1+ skip1)) + (org-goto-line (1+ skip1)) (while (and (re-search-forward "^" nil t) (not (eobp)) (< n nmax)) (if number (insert (format fm (incf n))) diff --git a/lisp/org/org-faces.el b/lisp/org/org-faces.el index 3674f0a4e74..d529348d4d4 100644 --- a/lisp/org/org-faces.el +++ b/lisp/org/org-faces.el @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; @@ -498,6 +498,11 @@ changes." (when (fboundp 'set-face-attribute) (set-face-attribute 'org-agenda-date-today nil :weight 'bold :italic 't))) +(unless (facep 'org-agenda-clocking) + (copy-face 'secondary-selection 'org-agenda-clocking) + (set-face-doc-string 'org-agenda-clocking + "Face marking the current clock item in the agenda.")) + (unless (facep 'org-agenda-date-weekend) (copy-face 'org-agenda-date 'org-agenda-date-weekend) (set-face-doc-string 'org-agenda-date-weekend diff --git a/lisp/org/org-feed.el b/lisp/org/org-feed.el index 4562d252faf..bef0a533358 100644 --- a/lisp/org/org-feed.el +++ b/lisp/org/org-feed.el @@ -5,7 +5,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; diff --git a/lisp/org/org-footnote.el b/lisp/org/org-footnote.el index 7da75b1989b..416eaaf45ec 100644 --- a/lisp/org/org-footnote.el +++ b/lisp/org/org-footnote.el @@ -5,7 +5,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; @@ -38,6 +38,7 @@ (require 'org-macs) (require 'org-compat) +(declare-function org-in-commented-line "org" ()) (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") @@ -363,42 +364,44 @@ referenced sequence." ;; 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 (if idef t nil)) ref-table)))) - + (unless (org-in-commented-line) + (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 (if idef t nil)) + ref-table))))) + ;; First find and remove the footnote section (goto-char (point-min)) (cond diff --git a/lisp/org/org-gnus.el b/lisp/org/org-gnus.el index dbc4ee7db4c..5c5bc6c07d4 100644 --- a/lisp/org/org-gnus.el +++ b/lisp/org/org-gnus.el @@ -7,7 +7,7 @@ ;; Tassilo Horn <tassilo at member dot fsf dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; @@ -51,8 +51,7 @@ negates this setting for the duration of the command." :type 'boolean) ;; Declare external functions and variables -(declare-function gnus-article-show-summary "gnus-art" ()) -(declare-function gnus-summary-last-subject "gnus-sum" ()) +(declare-function gnus-summary-article-header "gnus-sum" (&optional number)) (declare-function message-fetch-field "message" (header &optional not-all)) (declare-function message-narrow-to-head-1 "message" nil) @@ -123,37 +122,29 @@ If `org-store-link' was called with a prefix arg the meaning of link))) ((memq major-mode '(gnus-summary-mode gnus-article-mode)) - (and (eq major-mode 'gnus-summary-mode) (gnus-summary-show-article)) (let* ((group gnus-newsgroup-name) - (header (with-current-buffer gnus-article-buffer - (gnus-summary-toggle-header 1) - (goto-char (point-min)) - ;; mbox files may contain a first line starting with - ;; "From" followed by a space, which cannot be parsed as - ;; header line, so we skip it. - (when (looking-at "From ") - (beginning-of-line 2)) - (mail-header-extract-no-properties))) - (from (mail-header 'from header)) - (message-id (org-remove-angle-brackets - (mail-header 'message-id header))) - (date (mail-header 'date header)) - (to (mail-header 'to header)) - (newsgroups (mail-header 'newsgroups header)) - (x-no-archive (mail-header 'x-no-archive header)) - (subject (if (eq major-mode 'gnus-article-mode) - (save-restriction - (require 'message) - (message-narrow-to-head-1) - (message-fetch-field "subject")) - (gnus-summary-subject-string))) - desc link) + (header (with-current-buffer gnus-summary-buffer + (gnus-summary-article-header))) + (from (mail-header-from header)) + (message-id (org-remove-angle-brackets (mail-header-id header))) + (date (mail-header-date header)) + (subject (mail-header-subject header)) + (to (cdr (assq 'To (mail-header-extra header)))) + newsgroups x-no-archive desc link) + ;; Fetching an article is an expensive operation; newsgroup and + ;; x-no-archive are only needed for web links. + (when (org-xor current-prefix-arg org-gnus-prefer-web-links) + ;; Make sure the original article buffer is up-to-date + (save-window-excursion (gnus-summary-select-article)) + (setq to (or to (gnus-fetch-original-field "To")) + newsgroups (gnus-fetch-original-field "Newsgroups") + x-no-archive (gnus-fetch-original-field "x-no-archive"))) (org-store-link-props :type "gnus" :from from :subject subject :message-id message-id :group group :to to) (setq desc (org-email-link-description) - link (org-gnus-article-link group newsgroups message-id x-no-archive)) + link (org-gnus-article-link + group newsgroups message-id x-no-archive)) (org-add-link-props :link link :description desc) - (gnus-summary-toggle-header -1) link)))) (defun org-gnus-open (path) diff --git a/lisp/org/org-html.el b/lisp/org/org-html.el index 3170f3ae07c..a92fa998adb 100644 --- a/lisp/org/org-html.el +++ b/lisp/org/org-html.el @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; @@ -27,6 +27,7 @@ ;;; Commentary: (require 'org-exp) +(eval-when-compile (require 'cl)) (declare-function org-id-find-id-file "org-id" (id)) (declare-function htmlize-region "ext:htmlize" (beg end)) @@ -1161,7 +1162,7 @@ lang=\"%s\" xml:lang=\"%s\"> ;; Does this contain a reference to a footnote? (when org-export-with-footnotes (setq start 0) - (while (string-match "\\([^* \t].*\\)?\\[\\([0-9]+\\)\\]" line start) + (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)) extra a) @@ -1174,10 +1175,10 @@ lang=\"%s\" xml:lang=\"%s\"> (setq line (replace-match (format - (concat (if (match-string 1 line) "%s" "") + (concat "%s" (format org-export-html-footnote-format "<a class=\"footref\" name=\"fnr.%s%s\" href=\"#fn.%s\">%s</a>")) - (match-string 1 line) n extra n n) + (or (match-string 1 line) "") n extra n n) t t line)))))) (cond @@ -1331,10 +1332,11 @@ lang=\"%s\" xml:lang=\"%s\"> (let ((n (match-string 1 line))) (setq org-par-open t line (replace-match - (concat "<p class=\"footnote\">" - (format org-export-html-footnote-format - "<a class=\"footnum\" name=\"fn.%s\" href=\"#fnr.%s\">%s</a>" - n n n) t t line)))))) + (format + (concat "<p class=\"footnote\">" + (format org-export-html-footnote-format + "<a class=\"footnum\" name=\"fn.%s\" href=\"#fnr.%s\">%s</a>")) + n n n) t t line))))) ;; Check if the line break needs to be conserved (cond ((string-match "\\\\\\\\[ \t]*$" line) @@ -1419,7 +1421,8 @@ lang=\"%s\" xml:lang=\"%s\"> (unless (plist-get opt-plist :buffer-will-be-killed) (normal-mode) - (if (eq major-mode (default-value 'major-mode)) (html-mode))) + (if (eq major-mode (default-value 'major-mode)) + (html-mode))) ;; insert the table of contents (goto-char (point-min)) @@ -1641,7 +1644,7 @@ lang=\"%s\" xml:lang=\"%s\"> (push (mapconcat (lambda (x) (setq gr (pop org-table-colgroup-info)) - (format "%s<col align=\"%s\"></col>%s" + (format "%s<col align=\"%s\" />%s" (if (memq gr '(:start :startend)) (prog1 (if colgropen "</colgroup>\n<colgroup>" "<colgroup>") @@ -1883,13 +1886,6 @@ If there are links in the string, don't modify these." (setq start (+ start (length wd)))))))) s) -(defconst org-export-html-special-string-regexps - '(("\\\\-" . "­") - ("---\\([^-]\\)" . "—\\1") - ("--\\([^-]\\)" . "–\\1") - ("\\.\\.\\." . "…")) - "Regular expressions for special string conversion.") - (defun org-export-html-convert-special-strings (string) "Convert special characters in STRING to HTML." (let ((all org-export-html-special-string-regexps) diff --git a/lisp/org/org-icalendar.el b/lisp/org/org-icalendar.el index 2ea7483078f..d3804e6cfb6 100644 --- a/lisp/org/org-icalendar.el +++ b/lisp/org/org-icalendar.el @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; diff --git a/lisp/org/org-id.el b/lisp/org/org-id.el index 70f2243ce16..41da48f2272 100644 --- a/lisp/org/org-id.el +++ b/lisp/org/org-id.el @@ -5,7 +5,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; @@ -563,7 +563,7 @@ optional argument MARKERP, return the position as a new marker." ;; so we do have to add it to `org-store-link-functions'. (defun org-id-store-link () - "Store a link to the current entry, using it's ID." + "Store a link to the current entry, using its ID." (interactive) (let* ((link (org-make-link "id:" (org-id-get-create))) (desc (save-excursion @@ -601,9 +601,8 @@ optional argument MARKERP, return the position as a new marker." (provide 'org-id) -;; arch-tag: e5abaca4-e16f-4b25-832a-540cfb63a712 ;;; org-id.el ends here - +;; arch-tag: e5abaca4-e16f-4b25-832a-540cfb63a712 diff --git a/lisp/org/org-indent.el b/lisp/org/org-indent.el index 50b6f4856e6..ec6d2ff73f2 100644 --- a/lisp/org/org-indent.el +++ b/lisp/org/org-indent.el @@ -1,11 +1,10 @@ -;;; org-indent.el --- Dynamic indentation for Org-mode - -;; Copyright (C) 2008, 2009 Free Software Foundation, Inc. +;;; org-indent.el --- Dynamic indentation for Org-mode +;; 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.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; @@ -278,5 +277,4 @@ Point is assumed to be at the beginning of a headline." (provide 'org-indent) -;; arch-tag: 981f57e3-d747-49d1-8e63-ed460682cee6 ;;; org-indent.el ends here diff --git a/lisp/org/org-info.el b/lisp/org/org-info.el index 8599404020a..3b5cfb148ea 100644 --- a/lisp/org/org-info.el +++ b/lisp/org/org-info.el @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; diff --git a/lisp/org/org-inlinetask.el b/lisp/org/org-inlinetask.el index ebee4268c92..e01e20c802d 100644 --- a/lisp/org/org-inlinetask.el +++ b/lisp/org/org-inlinetask.el @@ -5,11 +5,12 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.29c +;; Version: 6.30c ;; 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. @@ -195,5 +196,4 @@ Either remove headline and meta data, or do special formatting." (provide 'org-inlinetask) -;; arch-tag: b76736bc-9f4a-43cd-977c-ecfd6689846a ;;; org-inlinetask.el ends here diff --git a/lisp/org/org-irc.el b/lisp/org/org-irc.el index ac40ec606bd..f415bd1cc0f 100644 --- a/lisp/org/org-irc.el +++ b/lisp/org/org-irc.el @@ -4,7 +4,7 @@ ;; ;; Author: Philip Jackson <emacs@shellarchive.co.uk> ;; Keywords: erc, irc, link, org -;; Version: 6.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; diff --git a/lisp/org/org-jsinfo.el b/lisp/org/org-jsinfo.el index b5632fc85d0..55f2251f560 100644 --- a/lisp/org/org-jsinfo.el +++ b/lisp/org/org-jsinfo.el @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; diff --git a/lisp/org/org-latex.el b/lisp/org/org-latex.el index 896a0073190..48a7ac2878b 100644 --- a/lisp/org/org-latex.el +++ b/lisp/org/org-latex.el @@ -4,7 +4,7 @@ ;; ;; Emacs Lisp Archive Entry ;; Filename: org-latex.el -;; Version: 6.29c +;; Version: 6.30c ;; Author: Bastien Guerry <bzg AT altern DOT org> ;; Maintainer: Carsten Dominik <carsten.dominik AT gmail DOT com> ;; Keywords: org, wp, tex @@ -93,6 +93,7 @@ \\usepackage[T1]{fontenc} \\usepackage{graphicx} \\usepackage{longtable} +\\usepackage{soul} \\usepackage{hyperref}" ("\\section{%s}" . "\\section*{%s}") ("\\subsection{%s}" . "\\subsection*{%s}") @@ -105,6 +106,7 @@ \\usepackage[T1]{fontenc} \\usepackage{graphicx} \\usepackage{longtable} +\\usepackage{soul} \\usepackage{hyperref}" ("\\part{%s}" . "\\part*{%s}") ("\\chapter{%s}" . "\\chapter*{%s}") @@ -117,6 +119,7 @@ \\usepackage[T1]{fontenc} \\usepackage{graphicx} \\usepackage{longtable} +\\usepackage{soul} \\usepackage{hyperref}" ("\\part{%s}" . "\\part*{%s}") ("\\chapter{%s}" . "\\chapter*{%s}") @@ -166,7 +169,7 @@ to represent the section title." '(("*" "\\textbf{%s}" nil) ("/" "\\emph{%s}" nil) ("_" "\\underline{%s}" nil) - ("+" "\\texttt{%s}" nil) + ("+" "\\st{%s}" nil) ("=" "\\verb" t) ("~" "\\verb" t)) "Alist of LaTeX expressions to convert emphasis fontifiers. @@ -245,9 +248,12 @@ When nil, grouping causes only separation lines between groups." (defcustom org-export-latex-packages-alist nil "Alist of packages to be inserted in the header. -Each cell is of the forma \( \"option\" . \"package\" \)." +Each cell is of the format \( \"option\" . \"package\" \)." :group 'org-export-latex - :type 'alist) + :type '(repeat + (list + (string :tag "option") + (string :tag "package")))) (defcustom org-export-latex-low-levels 'itemize "How to convert sections below the current level of sectioning. @@ -297,6 +303,43 @@ Defaults to \\begin{verbatim} and \\end{verbatim}." :type '(cons (string :tag "Open") (string :tag "Close"))) +(defcustom org-export-latex-listings nil + "Non-nil means, export source code using the listings package. +This package will fontify source code, possibly even with color. +If you want to use this, you also need to make LaTeX use the +listings package, and if you want to have color, the color +package. Just add these to `org-export-latex-packages-alist', +for example using customize, or with something like + + (require 'org-latex) + (add-to-list 'org-export-latex-packages-alist '(\"\" \"listings\")) + (add-to-list 'org-export-latex-packages-alist '(\"\" \"color\"))" + :group 'org-export-latex + :type 'boolean) + +(defcustom org-export-latex-listings-langs + '((emacs-lisp "Lisp") (lisp "Lisp") + (c "C") (cc "C++") + (fortran "fortran") + (perl "Perl") (cperl "Perl") (python "Python") (ruby "Ruby") + (html "HTML") (xml "XML") + (tex "TeX") (latex "TeX") + (shell-script "bash") + (gnuplot "Gnuplot") + (ocaml "Caml") (caml "Caml") + (sql "SQL")) + "Alist mapping languages to their listing language counterpart. +The key is a symbol, the major mode symbol without the \"-mode\". +The value is the string that should be inserted as the language parameter +for the listings package. If the mode name and the listings name are +the same, the language does not need an entry in this list - but it does not +hurt if it is present." + :group 'org-export-latex + :type '(repeat + (list + (symbol :tag "Major mode ") + (string :tag "Listings language")))) + (defcustom org-export-latex-remove-from-headlines '(:todo nil :priority nil :tags nil) "A plist of keywords to remove from headlines. OBSOLETE. @@ -960,10 +1003,11 @@ If BEG is non-nil, it is the beginning of the region. If END is non-nil, it is the end of the region." (save-excursion (goto-char (or beg (point-min))) - (let* ((pt (point)) - (end (if (re-search-forward "^\\*+ " end t) - (goto-char (match-beginning 0)) - (goto-char end)))) + (let* ((pt (point))) + (or end + (and (re-search-forward "^\\*+ " end t) + (setq end (match-beginning 0))) + (setq end (point-max))) (prog1 (org-export-latex-content (org-export-preprocess-string @@ -1276,16 +1320,19 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER." (defvar org-table-last-alignment) ; defined in org-table.el +(defvar org-table-last-column-widths) ; defined in org-table.el (declare-function orgtbl-to-latex "org-table" (table params) t) (defun org-export-latex-tables (insert) "Convert tables to LaTeX and INSERT it." (goto-char (point-min)) (while (re-search-forward "^\\([ \t]*\\)|" nil t) - ;; FIXME really need to save-excursion? - (save-excursion (org-table-align)) + (org-table-align) (let* ((beg (org-table-begin)) (end (org-table-end)) (raw-table (buffer-substring beg end)) + (org-table-last-alignment (copy-sequence org-table-last-alignment)) + (org-table-last-column-widths (copy-sequence + org-table-last-column-widths)) fnum fields line lines olines gr colgropen line-fmt align caption label attr floatp longtblp) (if org-export-latex-tables-verbatim @@ -1310,6 +1357,9 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER." (apply 'delete-region (list beg end)) (when org-export-table-remove-special-lines (setq lines (org-table-clean-before-export lines 'maybe-quoted))) + (when org-table-clean-did-remove-column + (pop org-table-last-alignment) + (pop org-table-last-column-widths)) ;; make a formatting string to reflect aligment (setq olines lines) (while (and (not line-fmt) (setq line (pop olines))) @@ -1521,10 +1571,24 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER." ((not type) (insert (format "\\hyperref[%s]{%s}" (org-remove-initial-hash - (org-solidify-link-text raw-path)) desc))) - (path (insert (format "\\href{%s}{%s}" path desc))) + (org-solidify-link-text raw-path)) + desc))) + (path + (when (org-at-table-p) + ;; There is a strange problem when we have a link in a table, + ;; ampersands then cause a problem. I think this must be + ;; a LaTeX issue, but we here implement a work-around anyway. + (setq path (org-export-latex-protect-amp path) + desc (org-export-latex-protect-amp desc))) + (insert (format "\\href{%s}{%s}" path desc))) (t (insert "\\texttt{" desc "}"))))))) +(defun org-export-latex-protect-amp (s) + (while (string-match "\\([^\\\\]\\)\\(&\\)" s) + (setq s (replace-match (concat (match-string 1 s) "\\" (match-string 2 s)) + t t s))) + s) + (defun org-remove-initial-hash (s) (if (string-match "\\`#" s) (substring s 1) diff --git a/lisp/org/org-list.el b/lisp/org/org-list.el index 6c775f7d5d0..cef5fe458a4 100644 --- a/lisp/org/org-list.el +++ b/lisp/org/org-list.el @@ -7,7 +7,7 @@ ;; Bastien Guerry <bzg AT altern DOT org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; @@ -149,7 +149,9 @@ toggle a checkbox with \\[org-ctrl-c-ctrl-c]." (defcustom org-hierarchical-checkbox-statistics t "Non-nil means, checkbox statistics counts only the state of direct children. -When nil, all boxes below the cookie are counted." +When nil, all boxes below the cookie are counted. +This can be set to nil on a per-node basis using a COCKIE_DATA property +with the word \"recursive\" in the value." :group 'org-plain-lists :type 'boolean) @@ -834,7 +836,7 @@ with something like \"1.\" or \"2)\"." (goto-char (match-beginning 2)) (insert (setq new (format fmt (setq n (1+ n))))) (org-shift-item-indentation (- (length new) (length old)))))) - (goto-line line) + (org-goto-line line) (org-move-to-column col))) (defun org-fix-bullet-type (&optional force-bullet) @@ -872,7 +874,7 @@ Also, fix the indentation." (setq oldbullet (match-string 0)) (unless (equal bullet oldbullet) (replace-match bullet)) (org-shift-item-indentation (- (length bullet) (length oldbullet)))))) - (goto-line line) + (org-goto-line line) (org-move-to-column col) (if (string-match "[0-9]" bullet) (org-renumber-ordered-list 1)))) diff --git a/lisp/org/org-mac-message.el b/lisp/org/org-mac-message.el index ff33dc7de14..87fe77a7b70 100644 --- a/lisp/org/org-mac-message.el +++ b/lisp/org/org-mac-message.el @@ -5,7 +5,7 @@ ;; Author: John Wiegley <johnw@gnu.org> ;; Christopher Suckling <suckling at gmail dot com> -;; Version: 6.29c +;; Version: 6.30c ;; 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 4e15566f4f6..0bc3d059eb4 100644 --- a/lisp/org/org-macs.el +++ b/lisp/org/org-macs.el @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; @@ -71,7 +71,7 @@ Also, do not record undo information." (_col (current-column))) (unwind-protect (progn ,@body) - (goto-line _line) + (org-goto-line _line) (org-move-to-column _col)))) (defmacro org-without-partial-completion (&rest body) @@ -173,7 +173,7 @@ We use a macro so that the test can happen at compilation time." (defsubst org-check-external-command (cmd &optional use no-error) "Check if external progam CMD for USE exists, error if not. -When the program does exist, return it's path. +When the program does exist, return its path. When it does not exist and NO-ERROR is set, return nil. Otherwise, throw an error. The optional argument USE can describe what this program is needed for, so that the error message can be more informative." @@ -219,6 +219,12 @@ we turn off invisibility temporarily. Use this in a `let' form." ;; works also in narrowed buffer, because we start at 1, not point-min (+ (if (bolp) 1 0) (count-lines 1 (point))))) +(defsubst org-goto-line (N) + (save-restriction + (widen) + (goto-char (point-min)) + (forward-line (1- N)))) + (defsubst org-current-line-string (&optional to-here) (buffer-substring (point-at-bol) (if to-here (point) (point-at-eol)))) diff --git a/lisp/org/org-mew.el b/lisp/org/org-mew.el index 9fe84fece87..6840703fcde 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.29c +;; Version: 6.30c ;; This file is part of GNU Emacs. diff --git a/lisp/org/org-mhe.el b/lisp/org/org-mhe.el index ba408ef7c4f..8b90f3f93e8 100644 --- a/lisp/org/org-mhe.el +++ b/lisp/org/org-mhe.el @@ -6,7 +6,7 @@ ;; Author: Thomas Baumann <thomas dot baumann at ch dot tum dot de> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; diff --git a/lisp/org/org-mouse.el b/lisp/org/org-mouse.el index c911db9ad61..fd69589395d 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.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; diff --git a/lisp/org/org-plot.el b/lisp/org/org-plot.el index 3f40eafb8cd..684a515e96d 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.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; @@ -33,7 +33,7 @@ (require 'org) (require 'org-exp) (require 'org-table) -(eval-and-compile +(eval-when-compile (require 'cl)) (declare-function gnuplot-delchar-or-maybe-eof "ext:gnuplot" (arg)) diff --git a/lisp/org/org-protocol.el b/lisp/org/org-protocol.el index 4de3ab89a44..61e29882b4f 100644 --- a/lisp/org/org-protocol.el +++ b/lisp/org/org-protocol.el @@ -1,7 +1,7 @@ ;;; org-protocol.el --- Intercept calls from emacsclient to trigger custom actions. ;; ;; Copyright (C) 2008, 2009 -;; Free Software Foundation, Inc. +;; Free Software Foundation, Inc. ;; ;; Author: Bastien Guerry <bzg AT altern DOT org> ;; Author: Daniel M German <dmg AT uvic DOT org> @@ -9,7 +9,7 @@ ;; Author: Ross Patterson <me AT rpatterson DOT net> ;; Maintainer: Sebastian Rose <sebastian_rose AT gmx DOT de> ;; Keywords: org, emacsclient, wp -;; Version: 6.29c +;; Version: 6.30c ;; This file is part of GNU Emacs. ;; @@ -393,6 +393,7 @@ function transforms it into a flat list." ;;; Standard protocol handlers: +;;;###autoload (defun org-protocol-store-link (fname) "Process an org-protocol://store-link:// style url and store a browser URL as an org link. Also pushes the links URL to the @@ -422,7 +423,7 @@ The sub-protocol used to reach this function is set in uri)) nil) - +;;;###autoload (defun org-protocol-remember (info) "Process an org-protocol://remember:// style url. @@ -470,7 +471,7 @@ Now template ?b will be used." (message "Org-mode not loaded.")) nil) - +;;;###autoload (defun org-protocol-open-source (fname) "Process an org-protocol://open-source:// style url. @@ -634,6 +635,4 @@ project-plist is the CDR of an element in `org-publish-project-alist', reuse (provide 'org-protocol) -;; arch-tag: b5c5c2ac-77cf-4a94-a649-2163dff95846 - ;;; org-protocol.el ends here diff --git a/lisp/org/org-publish.el b/lisp/org/org-publish.el index e6b0218b178..bac86366916 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: Carsten Dominik <carsten DOT dominik AT gmail DOT com> ;; Keywords: hypermedia, outlines, wp -;; Version: 6.29c +;; Version: 6.30c ;; This file is part of GNU Emacs. ;; @@ -632,7 +632,7 @@ Default for INDEX-FILENAME is 'sitemap.org'." "Publish PROJECT." (interactive (list - (assoc (org-ido-completing-read + (assoc (org-icompleting-read "Publish project: " org-publish-project-alist nil t) org-publish-project-alist) diff --git a/lisp/org/org-remember.el b/lisp/org/org-remember.el index 4bc1bf67d84..d3f83993daa 100644 --- a/lisp/org/org-remember.el +++ b/lisp/org/org-remember.el @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; @@ -130,8 +130,8 @@ Furthermore, the following %-escapes will be replaced with content: You may define a prompt like %^{Please specify birthday %n user name (taken from `user-full-name') %a annotation, normally the link created with org-store-link - %i initial content, the region active. If %i is indented, - the entire inserted text will be indented as well. + %i initial content, copied from the active region. If %i is + indented, the entire inserted text will be indented as well. %c current kill ring head %x content of the X clipboard %^C Interactive selection of which kill or clip to use @@ -256,6 +256,18 @@ is set." :group 'org-remember :type 'boolean) +(defcustom org-remember-warn-about-backups t + "Non-nil means warn about backup files in `org-remember-backup-directory'. + +Set this to nil if you find that you don't need the warning. + +If you cancel remember calls frequently and know when they +contain useful information (because you know that you made an +error or emacs crashed, for example) nil is more useful. In the +opposite case, the default, t, is more useful." + :group 'org-remember + :type 'boolean) + (defvar annotation) ; from remember.el, dynamically scoped in `remember-mode' (defvar initial) ; from remember.el, dynamically scoped in `remember-mode' @@ -468,49 +480,53 @@ to be run from that hook to function properly." ;; Simple %-escapes (while (re-search-forward "%\\([tTuUaiAcxkKI]\\)" nil t) - (when (and initial (equal (match-string 0) "%i")) - (save-match-data - (let* ((lead (buffer-substring - (point-at-bol) (match-beginning 0)))) - (setq v-i (mapconcat 'identity - (org-split-string initial "\n") - (concat "\n" lead)))))) - (replace-match - (or (eval (intern (concat "v-" (match-string 1)))) "") - t t)) + (unless (org-remember-escaped-%) + (when (and initial (equal (match-string 0) "%i")) + (save-match-data + (let* ((lead (buffer-substring + (point-at-bol) (match-beginning 0)))) + (setq v-i (mapconcat 'identity + (org-split-string initial "\n") + (concat "\n" lead)))))) + (replace-match + (or (eval (intern (concat "v-" (match-string 1)))) "") + t t))) ;; %[] Insert contents of a file. (goto-char (point-min)) (while (re-search-forward "%\\[\\(.+\\)\\]" nil t) - (let ((start (match-beginning 0)) - (end (match-end 0)) - (filename (expand-file-name (match-string 1)))) - (goto-char start) - (delete-region start end) - (condition-case error - (insert-file-contents filename) - (error (insert (format "%%![Couldn't insert %s: %s]" - filename error)))))) + (unless (org-remember-escaped-%) + (let ((start (match-beginning 0)) + (end (match-end 0)) + (filename (expand-file-name (match-string 1)))) + (goto-char start) + (delete-region start end) + (condition-case error + (insert-file-contents filename) + (error (insert (format "%%![Couldn't insert %s: %s]" + filename error))))))) ;; %() embedded elisp (goto-char (point-min)) (while (re-search-forward "%\\((.+)\\)" nil t) - (goto-char (match-beginning 0)) - (let ((template-start (point))) - (forward-char 1) - (let ((result - (condition-case error - (eval (read (current-buffer))) - (error (format "%%![Error: %s]" error))))) - (delete-region template-start (point)) - (insert result)))) + (unless (org-remember-escaped-%) + (goto-char (match-beginning 0)) + (let ((template-start (point))) + (forward-char 1) + (let ((result + (condition-case error + (eval (read (current-buffer))) + (error (format "%%![Error: %s]" error))))) + (delete-region template-start (point)) + (insert result))))) ;; From the property list (when plist-p (goto-char (point-min)) (while (re-search-forward "%\\(:[-a-zA-Z]+\\)" nil t) + (unless (org-remember-escaped-%) (and (setq x (or (plist-get org-store-link-plist (intern (match-string 1))) "")) - (replace-match x t t)))) + (replace-match x t t))))) ;; Turn on org-mode in the remember buffer, set local variables (let ((org-inhibit-startup t)) (org-mode) (org-remember-mode 1)) @@ -521,87 +537,89 @@ to be run from that hook to function properly." ;; Interactive template entries (goto-char (point-min)) (while (re-search-forward "%^\\({\\([^}]*\\)}\\)?\\([gGtTuUCLp]\\)?" nil t) - (setq char (if (match-end 3) (match-string 3)) - prompt (if (match-end 2) (match-string 2))) - (goto-char (match-beginning 0)) - (replace-match "") - (setq completions nil default nil) - (when prompt - (setq completions (org-split-string prompt "|") - prompt (pop completions) - default (car completions) - histvar (intern (concat - "org-remember-template-prompt-history::" - (or prompt ""))) - completions (mapcar 'list completions))) - (cond - ((member char '("G" "g")) - (let* ((org-last-tags-completion-table - (org-global-tags-completion-table - (if (equal char "G") (org-agenda-files) (and file (list file))))) - (org-add-colon-after-tag-completion t) - (ins (org-ido-completing-read - (if prompt (concat prompt ": ") "Tags: ") - 'org-tags-completion-function nil nil nil - 'org-tags-history))) - (setq ins (mapconcat 'identity - (org-split-string ins (org-re "[^[:alnum:]_@]+")) - ":")) - (when (string-match "\\S-" ins) - (or (equal (char-before) ?:) (insert ":")) - (insert ins) - (or (equal (char-after) ?:) (insert ":"))))) - ((equal char "C") - (cond ((= (length clipboards) 1) (insert (car clipboards))) - ((> (length clipboards) 1) - (insert (read-string "Clipboard/kill value: " - (car clipboards) '(clipboards . 1) - (car clipboards)))))) - ((equal char "L") - (cond ((= (length clipboards) 1) - (org-insert-link 0 (car clipboards))) - ((> (length clipboards) 1) - (org-insert-link 0 (read-string "Clipboard/kill value: " - (car clipboards) - '(clipboards . 1) - (car clipboards)))))) - ((equal char "p") - (let* - ((prop (org-substring-no-properties prompt)) - (pall (concat prop "_ALL")) - (allowed - (with-current-buffer - (get-buffer (file-name-nondirectory file)) - (or (cdr (assoc pall org-file-properties)) - (cdr (assoc pall org-global-properties)) - (cdr (assoc pall org-global-properties-fixed))))) - (existing (with-current-buffer - (get-buffer (file-name-nondirectory file)) - (mapcar 'list (org-property-values prop)))) - (propprompt (concat "Value for " prop ": ")) - (val (if allowed - (org-completing-read - propprompt - (mapcar 'list (org-split-string allowed "[ \t]+")) - nil 'req-match) - (org-completing-read-no-ido propprompt existing nil nil - "" nil "")))) - (org-set-property prop val))) - (char - ;; These are the date/time related ones - (setq org-time-was-given (equal (upcase char) char)) - (setq time (org-read-date (equal (upcase char) "U") t nil - prompt)) - (org-insert-time-stamp time org-time-was-given - (member char '("u" "U")) - nil nil (list org-end-time-was-given))) - (t - (let (org-completion-use-ido) - (insert (org-completing-read-no-ido - (concat (if prompt prompt "Enter string") - (if default (concat " [" default "]")) - ": ") - completions nil nil nil histvar default)))))) + (unless (org-remember-escaped-%) + (setq char (if (match-end 3) (match-string 3)) + prompt (if (match-end 2) (match-string 2))) + (goto-char (match-beginning 0)) + (replace-match "") + (setq completions nil default nil) + (when prompt + (setq completions (org-split-string prompt "|") + prompt (pop completions) + default (car completions) + histvar (intern (concat + "org-remember-template-prompt-history::" + (or prompt ""))) + completions (mapcar 'list completions))) + (cond + ((member char '("G" "g")) + (let* ((org-last-tags-completion-table + (org-global-tags-completion-table + (if (equal char "G") (org-agenda-files) (and file (list file))))) + (org-add-colon-after-tag-completion t) + (ins (org-icompleting-read + (if prompt (concat prompt ": ") "Tags: ") + 'org-tags-completion-function nil nil nil + 'org-tags-history))) + (setq ins (mapconcat 'identity + (org-split-string ins (org-re "[^[:alnum:]_@]+")) + ":")) + (when (string-match "\\S-" ins) + (or (equal (char-before) ?:) (insert ":")) + (insert ins) + (or (equal (char-after) ?:) (insert ":"))))) + ((equal char "C") + (cond ((= (length clipboards) 1) (insert (car clipboards))) + ((> (length clipboards) 1) + (insert (read-string "Clipboard/kill value: " + (car clipboards) '(clipboards . 1) + (car clipboards)))))) + ((equal char "L") + (cond ((= (length clipboards) 1) + (org-insert-link 0 (car clipboards))) + ((> (length clipboards) 1) + (org-insert-link 0 (read-string "Clipboard/kill value: " + (car clipboards) + '(clipboards . 1) + (car clipboards)))))) + ((equal char "p") + (let* + ((prop (org-substring-no-properties prompt)) + (pall (concat prop "_ALL")) + (allowed + (with-current-buffer + (get-buffer (file-name-nondirectory file)) + (or (cdr (assoc pall org-file-properties)) + (cdr (assoc pall org-global-properties)) + (cdr (assoc pall org-global-properties-fixed))))) + (existing (with-current-buffer + (get-buffer (file-name-nondirectory file)) + (mapcar 'list (org-property-values prop)))) + (propprompt (concat "Value for " prop ": ")) + (val (if allowed + (org-completing-read + propprompt + (mapcar 'list (org-split-string allowed "[ \t]+")) + nil 'req-match) + (org-completing-read-no-i propprompt existing nil nil + "" nil "")))) + (org-set-property prop val))) + (char + ;; These are the date/time related ones + (setq org-time-was-given (equal (upcase char) char)) + (setq time (org-read-date (equal (upcase char) "U") t nil + prompt)) + (org-insert-time-stamp time org-time-was-given + (member char '("u" "U")) + nil nil (list org-end-time-was-given))) + (t + (let (org-completion-use-ido) + (insert (org-completing-read-no-i + (concat (if prompt prompt "Enter string") + (if default (concat " [" default "]")) + ": ") + completions nil nil nil histvar default))))))) + (goto-char (point-min)) (if (re-search-forward "%\\?" nil t) (replace-match "") @@ -629,6 +647,14 @@ to be run from that hook to function properly." (replace-match "") (add-hook 'post-command-hook 'org-remember-finish-immediately 'append))) +(defun org-remember-escaped-% () + (if (equal (char-before (match-beginning 0)) ?\\) + (progn + (delete-region (1- (match-beginning 0)) (match-beginning 0)) + t) + nil)) + + (defun org-remember-finish-immediately () "File remember note immediately. This should be run in `post-command-hook' and will remove itself @@ -1050,7 +1076,8 @@ See also the variable `org-reverse-note-order'." (directory-files org-remember-backup-directory nil "^remember-.*[0-9]$")))) - (when (> n 0) + (when (and org-remember-warn-about-backups + (> n 0)) (message "%d backup files (unfinished remember calls) in %s" n org-remember-backup-directory)))))))))) diff --git a/lisp/org/org-src.el b/lisp/org/org-src.el index 4be14e859d0..b7536b21152 100644 --- a/lisp/org/org-src.el +++ b/lisp/org/org-src.el @@ -7,7 +7,7 @@ ;; Bastien Guerry <bzg AT altern DOT org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; @@ -109,11 +109,25 @@ You may want to use this hook for example to turn off `outline-minor-mode' or similar things which you want to have when editing a source code file, but which mess up the display of a snippet in Org exported files.") +(defcustom org-src-lang-modes + '(("ocaml" . tuareg) ("elisp" . emacs-lisp) ("ditaa" . artist)) + "Alist mapping languages to their major mode. +The key is the language name, the value is the string that should +be inserted as the name of the major mode. For many languages this is +simple, but for language where this is not the case, this variable +provides a way to simplify things on the user side. +For example, there is no ocaml-mode in Emacs, but the mode to use is +`tuareg-mode'." + :group 'org-edit-structure + :type '(repeat + (cons + (string "Language name") + (symbol "Major mode")))) + ;;; Editing source examples (defvar org-src-mode-map (make-sparse-keymap)) (define-key org-src-mode-map "\C-c'" 'org-edit-src-exit) -(define-key org-src-mode-map "\C-x\C-s" 'org-edit-src-save) (defvar org-edit-src-force-single-line nil) (defvar org-edit-src-from-org-mode nil) (defvar org-edit-src-picture nil) @@ -151,7 +165,9 @@ the edited version." (setq beg (move-marker beg (nth 0 info)) end (move-marker end (nth 1 info)) code (buffer-substring-no-properties beg end) - lang (nth 2 info) + lang (or (cdr (assoc (nth 2 info) org-src-lang-modes)) + (nth 2 info)) + lang (if (symbolp lang) (symbol-name lang) lang) single (nth 3 info) lfmt (nth 4 info) nindent (nth 5 info) @@ -159,7 +175,7 @@ the edited version." begline (save-excursion (goto-char beg) (org-current-line))) (unless (functionp lang-f) (error "No such language mode: %s" lang-f)) - (goto-line line) + (org-goto-line line) (if (and (setq buffer (org-edit-src-find-buffer beg end)) (y-or-n-p "Return to existing edit buffer? [n] will revert changes: ")) (switch-to-buffer buffer) @@ -168,7 +184,8 @@ the edited version." (if (boundp 'org-edit-src-overlay) (org-delete-overlay org-edit-src-overlay))) (kill-buffer buffer)) - (setq buffer (generate-new-buffer "*Org Edit Src Example*")) + (setq buffer (generate-new-buffer + (concat "*Org Src " (file-name-nondirectory buffer-file-name) "[" lang "]*"))) (setq ovl (org-make-overlay beg end)) (org-overlay-put ovl 'face 'secondary-selection) (org-overlay-put ovl 'edit-buffer buffer) @@ -186,8 +203,7 @@ the edited version." '(display nil invisible nil intangible nil)) (org-do-remove-indentation) (let ((org-inhibit-startup t)) - (funcall lang-f) - (org-src-mode)) + (funcall lang-f)) (set (make-local-variable 'org-edit-src-force-single-line) single) (set (make-local-variable 'org-edit-src-from-org-mode) org-mode-p) (when lfmt @@ -196,11 +212,13 @@ the edited version." (goto-char (point-min)) (while (re-search-forward "^," nil t) (replace-match ""))) - (goto-line (1+ (- line begline))) + (org-goto-line (1+ (- line begline))) (org-set-local 'org-edit-src-beg-marker beg) (org-set-local 'org-edit-src-end-marker end) (org-set-local 'org-edit-src-overlay ovl) (org-set-local 'org-edit-src-nindent nindent) + (org-src-mode) + (set-buffer-modified-p nil) (and org-edit-src-persistent-message (org-set-local 'header-line-format msg))) (message "%s" msg) @@ -258,7 +276,7 @@ the fragment in the Org-mode buffer." (if (re-search-forward "^[ \t]*[^: \t]" nil 'move) (setq end1 (1- (match-beginning 0))) (setq end1 (point)))) - (goto-line line)) + (org-goto-line line)) (setq beg (move-marker beg beg1) end (move-marker end end1) code (buffer-substring-no-properties beg end) @@ -299,12 +317,13 @@ the fragment in the Org-mode buffer." (goto-char (point-min)) (while (re-search-forward "^[ \t]*: ?" nil t) (replace-match "")) - (goto-line (1+ (- line begline))) - (org-src-mode) + (org-goto-line (1+ (- line begline))) (org-set-local 'org-edit-src-beg-marker beg) (org-set-local 'org-edit-src-end-marker end) (org-set-local 'org-edit-src-overlay ovl) (org-set-local 'org-edit-src-nindent nindent) + (org-src-mode) + (set-buffer-modified-p nil) (and org-edit-src-persistent-message (org-set-local 'header-line-format msg))) (message "%s" msg) @@ -400,8 +419,8 @@ the language, a switch telling of the content should be in a single line." (defun org-edit-src-exit () "Exit special edit and protect problematic lines." (interactive) - (unless (string-match "\\`*Org Edit " (buffer-name (current-buffer))) - (error "This is not an sub-editing buffer, something is wrong...")) + (unless org-edit-src-from-org-mode + (error "This is not a sub-editing buffer, something is wrong...")) (let ((beg org-edit-src-beg-marker) (end org-edit-src-end-marker) (ovl org-edit-src-overlay) @@ -441,14 +460,14 @@ the language, a switch telling of the content should be in a single line." (while (re-search-forward "^" nil t) (replace-match nindent))) (setq code (buffer-string)) + (set-buffer-modified-p nil) (switch-to-buffer (marker-buffer beg)) (kill-buffer buffer) (goto-char beg) - (org-delete-overlay ovl) (delete-region beg end) (insert code) (goto-char beg) - (goto-line (1- (+ (org-current-line) line))) + (org-goto-line (1- (+ (org-current-line) line))) (move-marker beg nil) (move-marker end nil))) @@ -464,6 +483,19 @@ the language, a switch telling of the content should be in a single line." (goto-char (min p (point-max))) (message (or msg "")))) +(defun org-src-mode-configure-edit-buffer () + (when org-edit-src-from-org-mode + (setq buffer-offer-save t) + (setq buffer-file-name + (concat (buffer-file-name (marker-buffer org-edit-src-beg-marker)) + "[" (buffer-name) "]")) + (set (if (featurep 'xemacs) 'write-contents-hooks 'write-contents-functions) + '(org-edit-src-save)) + (org-add-hook 'kill-buffer-hook + '(lambda () (org-delete-overlay org-edit-src-overlay)) nil 'local))) + +(org-add-hook 'org-src-mode-hook 'org-src-mode-configure-edit-buffer) + (provide 'org-src) ;; arch-tag: 6a1fc84f-dec7-47be-a416-64be56bea5d8 diff --git a/lisp/org/org-table.el b/lisp/org/org-table.el index f09d51917c0..cbee75c1f1e 100644 --- a/lisp/org/org-table.el +++ b/lisp/org/org-table.el @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; @@ -719,9 +719,6 @@ When nil, simply write \"#ERROR\" in corrupted fields.") (append (pop fields) emptystrings)) hfmt)) lines "")) - ;; Replace the old one - (delete-region beg end) - (move-marker end nil) (if (equal (char-before) ?\n) ;; This hack is for org-indent, to force redisplay of the ;; line prefix of the first line. Apparently the redisplay @@ -734,14 +731,17 @@ When nil, simply write \"#ERROR\" in corrupted fields.") (insert "\n"))) (move-marker org-table-aligned-begin-marker (point)) (insert new) + ;; Replace the old one + (delete-region (point) end) + (move-marker end nil) (move-marker org-table-aligned-end-marker (point)) (when (and orgtbl-mode (not (org-mode-p))) (goto-char org-table-aligned-begin-marker) (while (org-hide-wide-columns org-table-aligned-end-marker))) ;; Try to move to the old location - (goto-line winstartline) + (org-goto-line winstartline) (setq winstart (point-at-bol)) - (goto-line linepos) + (org-goto-line linepos) (set-window-start (selected-window) winstart 'noforce) (org-table-goto-column colpos) (and org-table-overlay-coordinates (org-table-overlay-coordinates)) @@ -1127,7 +1127,7 @@ However, when FORCE is non-nil, create new columns if necessary." (insert "| ")) (beginning-of-line 2)) (move-marker end nil) - (goto-line linepos) + (org-goto-line linepos) (org-table-goto-column colpos) (org-table-align) (org-table-fix-formulas "$" nil (1- col) 1) @@ -1174,7 +1174,7 @@ However, when FORCE is non-nil, create new columns if necessary." (replace-match "|"))) (beginning-of-line 2)) (move-marker end nil) - (goto-line linepos) + (org-goto-line linepos) (org-table-goto-column colpos) (org-table-align) (org-table-fix-formulas "$" (list (cons (number-to-string col) "INVALID")) @@ -1218,7 +1218,7 @@ However, when FORCE is non-nil, create new columns if necessary." (replace-match "|\\2|\\1|"))) (beginning-of-line 2)) (move-marker end nil) - (goto-line linepos) + (org-goto-line linepos) (org-table-goto-column colpos) (org-table-align) (org-table-fix-formulas @@ -1424,7 +1424,7 @@ should be done in reverse order." (move-marker beg nil) (move-marker end nil) (insert (mapconcat 'cdr lns "\n") "\n") - (goto-line thisline) + (org-goto-line thisline) (org-table-goto-column thiscol) (message "%d lines sorted, based on column %d" (length lns) column))) @@ -1462,7 +1462,7 @@ with `org-table-paste-rectangle'." (while t (catch 'nextline (if (> l1 l2) (throw 'exit t)) - (goto-line l1) + (org-goto-line l1) (if (org-at-table-hline-p) (throw 'nextline (setq l1 (1+ l1)))) (setq cols nil ic1 c1 ic2 c2) (while (< ic1 (1+ ic2)) @@ -1500,7 +1500,7 @@ lines." (org-table-get-field nil field) (setq c (1+ c))) (beginning-of-line 2)) - (goto-line line) + (org-goto-line line) (org-table-goto-column col) (org-table-align))) @@ -1590,7 +1590,7 @@ blank, and the content is appended to the field above." (setq org-table-clip (mapcar 'list (org-wrap (mapconcat 'car org-table-clip " ") nil nlines))) - (goto-line cline) + (org-goto-line cline) (org-table-goto-column ccol) (org-table-paste-rectangle)) ;; No region, split the current field at point @@ -1994,7 +1994,7 @@ For all numbers larger than LIMIT, shift them by DELTA." last-dline (car dlines) org-table-dlines (apply 'vector (cons nil (nreverse dlines))) org-table-hlines (apply 'vector (cons nil (nreverse hlines)))) - (goto-line last-dline) + (org-goto-line last-dline) (let* ((l last-dline) (fields (org-split-string (buffer-substring (point-at-bol) (point-at-eol)) @@ -2070,7 +2070,7 @@ of the new mark." (if (and newchar (not forcenew)) (error "Invalid NEWCHAR `%s' in `org-table-rotate-recalc-marks'" newchar)) - (if l1 (goto-line l1)) + (if l1 (org-goto-line l1)) (save-excursion (beginning-of-line 1) (unless (looking-at org-table-dataline-regexp) @@ -2091,13 +2091,13 @@ of the new mark." " # "))) (if (and l1 l2) (progn - (goto-line l1) + (org-goto-line l1) (while (progn (beginning-of-line 2) (not (= (org-current-line) l2))) (and (looking-at org-table-dataline-regexp) (org-table-get-field 1 (concat " " new " ")))) - (goto-line l1))) + (org-goto-line l1))) (if (not (= epos (point-at-eol))) (org-table-align)) - (goto-line l) + (org-goto-line l) (and (interactive-p) (message "%s" (cdr (assoc new org-recalc-marks)))))) (defun org-table-maybe-recalculate-line () @@ -2360,7 +2360,7 @@ HIGHLIGHT means, just highlight the range." (if (or (not rangep) (and (= r1 r2) (= c1 c2))) ;; just one field (progn - (goto-line r1) + (org-goto-line r1) (while (not (looking-at org-table-dataline-regexp)) (beginning-of-line 2)) (prog1 (org-trim (org-table-get-field c1)) @@ -2369,12 +2369,12 @@ HIGHLIGHT means, just highlight the range." ;; First sort the numbers to get a regular ractangle (if (< r2 r1) (setq tmp r1 r1 r2 r2 tmp)) (if (< c2 c1) (setq tmp c1 c1 c2 c2 tmp)) - (goto-line r1) + (org-goto-line r1) (while (not (looking-at org-table-dataline-regexp)) (beginning-of-line 2)) (org-table-goto-column c1) (setq beg (point)) - (goto-line r2) + (org-goto-line r2) (while (not (looking-at org-table-dataline-regexp)) (beginning-of-line 0)) (org-table-goto-column c2) @@ -2550,7 +2550,7 @@ known that the table will be realigned a little later anyway." (string-to-number (match-string 2 name))))) (when (and a (or all (equal (nth 1 a) thisline))) (message "Re-applying formula to field: %s" name) - (goto-line (nth 1 a)) + (org-goto-line (nth 1 a)) (org-table-goto-column (nth 2 a)) (push (append a (list (cdr eq))) eqlname1) (org-table-put-field-property :org-untouchable t))) @@ -2566,7 +2566,7 @@ known that the table will be realigned a little later anyway." (setq org-last-recalc-line (org-current-line)) (setq eql eqlnum) (while (setq entry (pop eql)) - (goto-line org-last-recalc-line) + (org-goto-line org-last-recalc-line) (org-table-goto-column (string-to-number (car entry)) nil 'force) (unless (get-text-property (point) :org-untouchable) (org-table-eval-formula nil (cdr entry) @@ -2575,12 +2575,12 @@ known that the table will be realigned a little later anyway." ;; Now evaluate the field formulas (while (setq eq (pop eqlname1)) (message "Re-applying formula to field: %s" (car eq)) - (goto-line (nth 1 eq)) + (org-goto-line (nth 1 eq)) (org-table-goto-column (nth 2 eq)) (org-table-eval-formula nil (nth 3 eq) 'noalign 'nocst 'nostore 'noanalysis)) - (goto-line thisline) + (org-goto-line thisline) (org-table-goto-column thiscol) (remove-text-properties (point-min) (point-max) '(org-untouchable t)) (or noalign (and org-table-may-need-update (org-table-align)) @@ -2588,7 +2588,7 @@ known that the table will be realigned a little later anyway." ;; back to initial position (message "Re-applying formulas...done") - (goto-line thisline) + (org-goto-line thisline) (org-table-goto-column thiscol) (or noalign (and org-table-may-need-update (org-table-align)) (and all (message "Re-applying formulas...done")))))) @@ -2744,7 +2744,7 @@ Parameters get priority." (insert s)) (if (eq org-table-use-standard-references t) (org-table-fedit-toggle-ref-type)) - (goto-line startline) + (org-goto-line startline) (message "Edit formulas and finish with `C-c C-c'. See menu for more commands."))) (defun org-table-fedit-post-command () @@ -2839,7 +2839,7 @@ For example: 28 -> AB." (insert (funcall function (buffer-substring (point) (point-at-eol)))) (delete-region (point) (point-at-eol)) (or (eobp) (forward-char 1))) - (goto-line line))) + (org-goto-line line))) (defun org-table-fedit-toggle-ref-type () "Convert all references in the buffer from B3 to @3$2 and back." @@ -3080,12 +3080,12 @@ With prefix ARG, apply the new formulas to the table." (cond ((string-match "^\\$[a-zA-Z][a-zA-Z0-9]*" dest) (setq e (assoc name org-table-named-field-locations)) - (goto-line (nth 1 e)) + (org-goto-line (nth 1 e)) (org-table-goto-column (nth 2 e))) ((string-match "^@\\([0-9]+\\)\\$\\([0-9]+\\)" dest) (let ((l (string-to-number (match-string 1 dest))) (c (string-to-number (match-string 2 dest)))) - (goto-line (aref org-table-dlines l)) + (org-goto-line (aref org-table-dlines l)) (org-table-goto-column c))) (t (org-table-goto-column (string-to-number name)))) (move-marker pos (point)) @@ -3099,7 +3099,7 @@ With prefix ARG, apply the new formulas to the table." (org-table-get-range match nil nil 'highlight)) (error nil))) ((setq e (assoc var org-table-named-field-locations)) - (goto-line (nth 1 e)) + (org-goto-line (nth 1 e)) (org-table-goto-column (nth 2 e)) (org-table-highlight-rectangle (point) (point)) (message "Named field, column %d of line %d" (nth 2 e) (nth 1 e))) @@ -3224,7 +3224,7 @@ Use COMMAND to do the motion, repeat if necessary to end up in a data line." (setq l2 (org-current-line) c2 (org-table-current-column)) (if (> c1 c2) (setq tmp c1 c1 c2 c2 tmp)) - (goto-line l1) + (org-goto-line l1) (beginning-of-line 1) (loop for line from l1 to l2 do (when (looking-at org-table-dataline-regexp) diff --git a/lisp/org/org-timer.el b/lisp/org/org-timer.el index 385f09b8954..847d5140973 100644 --- a/lisp/org/org-timer.el +++ b/lisp/org/org-timer.el @@ -5,7 +5,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; @@ -78,9 +78,7 @@ the region 0:00:00." (setq delta (org-timer-hms-to-secs (org-timer-fix-incomplete s))))) (setq org-timer-start-time (seconds-to-time - (- - (time-to-seconds (current-time)) - (org-timer-hms-to-secs s))))) + (- (org-float-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) @@ -97,9 +95,9 @@ the region 0:00:00." (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-float-time) + (- (org-float-time org-timer-pause-time) + (org-float-time org-timer-start-time)))) org-timer-pause-time nil) (org-timer-set-mode-line 'on) (message "Timer continues at %s" (org-timer-value-string))) @@ -133,8 +131,8 @@ that was not started at the correct moment." (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))) + (- (org-float-time (or org-timer-pause-time (current-time))) + (org-float-time org-timer-start-time))) ;;;###autoload (defun org-timer-change-times-in-region (beg end delta) @@ -317,8 +315,8 @@ VALUE can be `on', `off', or `pause'." (if (not (or (eval timer) timer-set)) (setq timer-set t timer - (run-with-timer secs nil 'org-show-notification - (format "%s: time out" hl)) + (run-with-timer + secs nil 'org-notify (format "%s: time out" hl) t) org-timer-last-timer timer))) '(org-timer-timer1 org-timer-timer2 diff --git a/lisp/org/org-vm.el b/lisp/org/org-vm.el index 283ac74639b..6feb64732a4 100644 --- a/lisp/org/org-vm.el +++ b/lisp/org/org-vm.el @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; diff --git a/lisp/org/org-w3m.el b/lisp/org/org-w3m.el index 773e8bc9630..5f0bf265849 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.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; diff --git a/lisp/org/org-wl.el b/lisp/org/org-wl.el index 60be81e75c3..24a772a7aa2 100644 --- a/lisp/org/org-wl.el +++ b/lisp/org/org-wl.el @@ -6,7 +6,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.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; diff --git a/lisp/org/org-xoxo.el b/lisp/org/org-xoxo.el index d55993f8065..61904c26542 100644 --- a/lisp/org/org-xoxo.el +++ b/lisp/org/org-xoxo.el @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; diff --git a/lisp/org/org.el b/lisp/org/org.el index 16f72b94534..82838bbb570 100644 --- a/lisp/org/org.el +++ b/lisp/org/org.el @@ -6,7 +6,7 @@ ;; Author: Carsten Dominik <carsten at orgmode dot org> ;; Keywords: outlines, hypermedia, calendar, wp ;; Homepage: http://orgmode.org -;; Version: 6.29c +;; Version: 6.30c ;; ;; This file is part of GNU Emacs. ;; @@ -95,17 +95,36 @@ ;;; Version -(defconst org-version "6.29c" +(defconst org-version "6.30c" "The version number of the file org.el.") (defun org-version (&optional here) "Show the org-mode version in the echo area. With prefix arg HERE, insert it at point." (interactive "P") - (let ((version (format "Org-mode version %s" org-version))) + (let* ((version org-version) + (git-version) + (dir (concat (file-name-directory (locate-library "org")) "../" ))) + (if (and (file-exists-p (expand-file-name ".git" dir)) + (executable-find "git")) + (let ((pwd (substring (pwd) 10))) + (cd dir) + (if (eql 0 (shell-command "git describe --abbrev=4 HEAD")) + (save-excursion + (set-buffer "*Shell Command Output*") + (goto-char (point-min)) + (re-search-forward "[^\n]+") + (setq git-version (match-string 0)) + (subst-char-in-string ?- ?. git-version t) + (shell-command "git diff-index --name-only HEAD --") + (unless (eql 1 (point-max)) + (setq git-version (concat git-version ".dirty"))) + (setq version (concat version " (" git-version ")"))) + (cd pwd)))) + (setq version (format "Org-mode version %s" version)) + (if here (insert version)) (message version) - (if here - (insert version)))) + version)) ;;; Compatibility constants @@ -207,6 +226,7 @@ to add the symbol `xyz', and the package must have a call to (const :tag "C special-blocks: Turn blocks into LaTeX envs and HTML divs" org-special-blocks) (const :tag "C sqlinsert: Convert Org-mode tables to SQL insertions" orgtbl-sqlinsert) (const :tag "C toc: Table of contents for Org-mode buffer" org-toc) + (const :tag "C track: Keep up with Org development" org-track) (repeat :tag "External packages" :inline t (symbol :tag "Package")))) (defcustom org-support-shift-select nil @@ -652,6 +672,9 @@ So the default 2 means, at least 2 empty lines after the end of a subtree are needed to produce free space between a collapsed subtree and the following headline. +If the number is negative, and the number of empty lines is at least -N, +all empty lines are shown. + Special case: when 0, never leave empty lines in collapsed view." :group 'org-cycle :type 'integer) @@ -1751,7 +1774,9 @@ current entry each time a todo state is changed." (defcustom org-hierarchical-todo-statistics t "Non-nil means, TODO statistics covers just direct children. When nil, all entries in the subtree are considered. -This has only an effect if `org-provide-todo-statistics' is set." +This has only an effect if `org-provide-todo-statistics' is set. +To set this to nil for only a single subtree, use a COOKIE_DATA +property and include the word \"recursive\" into the value." :group 'org-todo :type 'boolean) @@ -2848,7 +2873,17 @@ This is needed for font-lock setup.") "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'." +`org-outline-path-complete-in-steps'. +See also `org-completion-use-iswitchb'." + :group 'org-completion + :type 'boolean) + +(defcustom org-completion-use-iswitchb nil + "Non-nil means, use iswitchb completion wherever possible. +Note that `iswitchb-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'. +Note that thi variable has only an effect if `org-completion-use-ido' is nil." :group 'org-completion :type 'boolean) @@ -3085,6 +3120,8 @@ If TABLE-TYPE is non-nil, also check for table.el-type tables." (defvar org-clock-start-time) (defvar org-clock-marker (make-marker) "Marker recording the last clock-in.") +(defvar org-clock-hd-marker (make-marker) + "Marker recording the last clock-in, but the headline position.") (defun org-clock-is-active () "Return non-nil if clock is currently running. The return value is actually the clock marker." @@ -3128,9 +3165,9 @@ Otherwise, return nil." (end-of-line 1) (setq ts (match-string 1) te (match-string 3)) - (setq s (- (time-to-seconds + (setq s (- (org-float-time (apply 'encode-time (org-parse-time-string te))) - (time-to-seconds + (org-float-time (apply 'encode-time (org-parse-time-string ts)))) neg (< s 0) s (abs s) @@ -3694,7 +3731,8 @@ means to push this value onto the list in the variable.") ;; Compute the regular expressions and other local variables (if (not org-done-keywords) - (setq org-done-keywords (list (org-last org-todo-keywords-1)))) + (setq org-done-keywords (and org-todo-keywords-1 + (list (org-last org-todo-keywords-1))))) (setq org-ds-keyword-length (+ 2 (max (length org-deadline-string) (length org-scheduled-string) (length org-clock-string) @@ -4448,7 +4486,15 @@ will be prompted for." "Regular expression for highlighting export special stuff.") (defvar org-match-substring-regexp) (defvar org-match-substring-with-braces-regexp) -(defvar org-export-html-special-string-regexps) + +;; This should be with the exporter code, but we also use if for font-locking +(defconst org-export-html-special-string-regexps + '(("\\\\-" . "­") + ("---\\([^-]\\)" . "—\\1") + ("--\\([^-]\\)" . "–\\1") + ("\\.\\.\\." . "…")) + "Regular expressions for special string conversion.") + (defun org-compute-latex-and-specials-regexp () "Compute regular expression for stuff treated specially by exporters." @@ -4764,7 +4810,7 @@ If KWD is a number, get the corresponding match group." (defun org-cycle (&optional arg) "TAB-action and visibility cycling for Org-mode. -This is the command invoked in Org-moe by the TAB key. It's main purpose +This is the command invoked in Org-mode by the TAB key. Its main purpose is outine visibility cycling, but it also invokes other actions in special contexts. @@ -4972,7 +5018,7 @@ in special contexts. (skip-chars-forward " \t\n") (beginning-of-line 1) ; in case this is an item ) - (setq eos (1- (point)))) + (setq eos (if (eobp) (point) (1- (point))))) ;; Find out what to do next and set `this-command' (cond ((= eos eoh) @@ -5157,13 +5203,13 @@ This function is the default value of the hook `org-cycle-hook'." ;; First, find a reasonable region to look at: ;; Start two siblings above, end three below (let* ((beg (save-excursion - (and (outline-get-last-sibling) - (outline-get-last-sibling)) + (and (org-get-last-sibling) + (org-get-last-sibling)) (point))) (end (save-excursion - (and (outline-get-next-sibling) - (outline-get-next-sibling) - (outline-get-next-sibling)) + (and (org-get-next-sibling) + (org-get-next-sibling) + (org-get-next-sibling)) (if (org-at-heading-p) (point-at-eol) (point)))) @@ -5187,16 +5233,16 @@ The region to be covered depends on STATE when called through `org-cycle-hook'. Lisp program can use t for STATE to get the entire buffer covered. Note that an empty line is only shown if there are at least `org-cycle-separator-lines' empty lines before the headline." - (when (> org-cycle-separator-lines 0) + (when (not (= org-cycle-separator-lines 0)) (save-excursion - (let* ((n org-cycle-separator-lines) + (let* ((n (abs org-cycle-separator-lines)) (re (cond ((= n 1) "\\(\n[ \t]*\n\\*+\\) ") ((= n 2) "^[ \t]*\\(\n[ \t]*\n\\*+\\) ") (t (let ((ns (number-to-string (- n 2)))) (concat "^\\(?:[ \t]*\n\\)\\{" ns "," ns "\\}" "[ \t]*\\(\n[ \t]*\n\\*+\\) "))))) - beg end) + beg end b e) (cond ((memq state '(overview contents t)) (setq beg (point-min) end (point-max))) @@ -5207,9 +5253,15 @@ are at least `org-cycle-separator-lines' empty lines before the headline." (when beg (goto-char beg) (while (re-search-forward re end t) - (if (not (get-char-property (match-end 1) 'invisible)) - (outline-flag-region - (match-beginning 1) (match-end 1) nil))))))) + (unless (get-char-property (match-end 1) 'invisible) + (setq e (match-end 1)) + (if (< org-cycle-separator-lines 0) + (setq b (save-excursion + (goto-char (match-beginning 0)) + (org-back-over-empty-lines) + (point))) + (setq b (match-beginning 1))) + (outline-flag-region b e nil))))))) ;; Never hide empty lines at the end of the file. (save-excursion (goto-char (point-max)) @@ -5250,7 +5302,7 @@ are at least `org-cycle-separator-lines' empty lines before the headline." "^[ \t]*:END:" (save-excursion (outline-next-heading) (point)) t) (outline-flag-region b (point-at-eol) flag) - (error ":END: line missing")))))) + (error ":END: line missing at position %s" b)))))) (defun org-subtree-end-visible-p () "Is the end of the current subtree visible?" @@ -5323,24 +5375,34 @@ the range." (beginning-of-line) (if (re-search-forward org-block-regexp nil t) (let ((start (- (match-beginning 4) 1)) ;; beginning of body - (end (match-end 0)) - ov) ;; end of entire body + (end (match-end 0)) ;; end of entire body + ov) (if (memq t (mapcar (lambda (overlay) (eq (org-overlay-get overlay 'invisible) 'org-hide-block)) (org-overlays-at start))) - (if (or (not force) (eq force 'off)) - (mapc (lambda (ov) - (when (member ov org-hide-block-overlays) - (setq org-hide-block-overlays - (delq ov org-hide-block-overlays))) - (when (eq (org-overlay-get ov 'invisible) - 'org-hide-block) - (org-delete-overlay ov))) - (org-overlays-at start))) - (setq ov (org-make-overlay start end)) + (if (or (not force) (eq force 'off)) + (mapc (lambda (ov) + (when (member ov org-hide-block-overlays) + (setq org-hide-block-overlays + (delq ov org-hide-block-overlays))) + (when (eq (org-overlay-get ov 'invisible) + 'org-hide-block) + (org-delete-overlay ov))) + (org-overlays-at start))) + (setq ov (org-make-overlay start end)) (org-overlay-put ov 'invisible 'org-hide-block) - (push ov org-hide-block-overlays))) + ;; make the block accessible to isearch + (org-overlay-put + ov 'isearch-open-invisible + (lambda (ov) + (when (member ov org-hide-block-overlays) + (setq org-hide-block-overlays + (delq ov org-hide-block-overlays))) + (when (eq (org-overlay-get ov 'invisible) + 'org-hide-block) + (org-delete-overlay ov)))) + (push ov org-hide-block-overlays))) (error "Not looking at a source block")))) ;; org-tab-after-check-for-cycling-hook @@ -5662,6 +5724,7 @@ but create the new headline after the current line." ;; insert before the current line (open-line (if blank 2 1))) ((and (bolp) + (not org-insert-heading-respect-content) (or (bobp) (save-excursion (backward-char 1) (not (org-invisible-p))))) @@ -6036,8 +6099,8 @@ is signaled in this case." "Move the current subtree down past ARG headlines of the same level." (interactive "p") (setq arg (prefix-numeric-value arg)) - (let ((movfunc (if (> arg 0) 'outline-get-next-sibling - 'outline-get-last-sibling)) + (let ((movfunc (if (> arg 0) 'org-get-next-sibling + 'org-get-last-sibling)) (ins-point (make-marker)) (cnt (abs arg)) beg beg0 end txt folded ne-beg ne-end ne-ins ins-end) @@ -6539,13 +6602,13 @@ WITH-CASE, the sorting considers case as well." (and (= (downcase sorting-type) ?f) (setq getkey-func - (org-ido-completing-read "Sort using function: " + (org-icompleting-read "Sort using function: " obarray 'fboundp t nil nil)) (setq getkey-func (intern getkey-func))) (and (= (downcase sorting-type) ?r) (setq property - (org-ido-completing-read "Property: " + (org-icompleting-read "Property: " (mapcar 'list (org-buffer-property-keys t)) nil t)))) @@ -6594,7 +6657,7 @@ WITH-CASE, the sorting considers case as well." (re-search-forward org-ts-regexp-both (point-at-eol) t)) (org-time-string-to-seconds (match-string 0)) - (time-to-seconds now))) + (org-float-time now))) ((= dcst ?f) (if getkey-func (progn @@ -6618,24 +6681,24 @@ WITH-CASE, the sorting considers case as well." (if (or (re-search-forward org-ts-regexp end t) (re-search-forward org-ts-regexp-both end t)) (org-time-string-to-seconds (match-string 0)) - (time-to-seconds now)))) + (org-float-time now)))) ((= dcst ?c) (let ((end (save-excursion (outline-next-heading) (point)))) (if (re-search-forward (concat "^[ \t]*\\[" org-ts-regexp1 "\\]") end t) (org-time-string-to-seconds (match-string 0)) - (time-to-seconds now)))) + (org-float-time now)))) ((= dcst ?s) (let ((end (save-excursion (outline-next-heading) (point)))) (if (re-search-forward org-scheduled-time-regexp end t) (org-time-string-to-seconds (match-string 1)) - (time-to-seconds now)))) + (org-float-time now)))) ((= dcst ?d) (let ((end (save-excursion (outline-next-heading) (point)))) (if (re-search-forward org-deadline-time-regexp end t) (org-time-string-to-seconds (match-string 1)) - (time-to-seconds now)))) + (org-float-time now)))) ((= dcst ?p) (if (re-search-forward org-priority-regexp (point-at-eol) t) (string-to-char (match-string 2)) @@ -6694,7 +6757,7 @@ If WITH-CASE is non-nil, the sorting will be case-sensitive." (lambda (x) (if (or (string-match org-ts-regexp x) (string-match org-ts-regexp-both x)) - (time-to-seconds + (org-float-time (org-time-string-to-time (match-string 0 x))) 0)) comparefun (if (= dcst sorting-type) '< '>))) @@ -7516,7 +7579,8 @@ Use TAB to complete link prefixes, then RET for type-specific completion support (unwind-protect (progn (setq link - (let ((org-completion-use-ido nil)) + (let ((org-completion-use-ido nil) + (org-completion-use-iswitchb nil)) (org-completing-read "Link: " (append @@ -7626,14 +7690,23 @@ Use TAB to complete link prefixes, then RET for type-specific completion support (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))) + (apply 'org-icompleting-read args))) -(defun org-completing-read-no-ido (&rest args) - (let (org-completion-use-ido) +(defun org-completing-read-no-i (&rest args) + (let (org-completion-use-ido org-completion-use-iswitchb) (apply 'org-completing-read args))) -(defun org-ido-completing-read (&rest args) - "Completing-read using `ido-mode' speedups if available" +(defun org-iswitchb-completing-read (prompt choices &rest args) + "Use iswitch as a completing-read replacement to choose from choices. +PROMPT is a string to prompt with. CHOICES is a list of strings to choose +from." + (let ((iswitchb-make-buflist-hook + (lambda () + (setq iswitchb-temp-buflist choices)))) + (iswitchb-read-buffer prompt))) + +(defun org-icompleting-read (&rest args) + "Completing-read using `ido-mode' or `iswitchb' speedups if available" (if (and org-completion-use-ido (fboundp 'ido-completing-read) (boundp 'ido-mode) ido-mode @@ -7644,7 +7717,13 @@ Use TAB to complete link prefixes, then RET for type-specific completion support (mapcar (lambda (x) (car x)) (nth 1 args)) (nth 1 args)) (cddr args))) - (apply 'completing-read args))) + (if (and org-completion-use-iswitchb + (boundp 'iswitchb-mode) iswitchb-mode + (listp (second args))) + (apply 'org-iswitchb-completing-read (concat (car args)) + (mapcar (lambda (x) (car x)) (nth 1 args)) + (cddr args)) + (apply 'completing-read args)))) (defun org-extract-attributes (s) "Extract the attributes cookie from a string and set as text property." @@ -7783,10 +7862,10 @@ Org-mode syntax." (org-run-like-in-org-mode 'org-open-at-point)) ;;;###autoload -(defun org-open-link-from-string (s &optional arg) +(defun org-open-link-from-string (s &optional arg reference-buffer) "Open a link in the string S, as if it was in Org-mode." (interactive "sLink: \nP") - (let ((reference-buffer (current-buffer))) + (let ((reference-buffer (or reference-buffer (current-buffer)))) (with-temp-buffer (let ((org-inhibit-startup t)) (org-mode) @@ -7808,6 +7887,13 @@ application the system uses for this file type." (setq org-window-config-before-follow-link (current-window-configuration)) (org-remove-occur-highlights nil nil t) (cond + ((and (org-on-heading-p) + (not (org-in-regexp + (concat org-plain-link-re "\\|" + org-bracket-link-regexp "\\|" + org-angle-link-re "\\|" + "[ \t]:[^ \t\n]+:[ \t]*$")))) + (org-offer-links-in-entry in-emacs)) ((org-at-timestamp-p t) (org-follow-timestamp-link)) ((or (org-footnote-at-reference-p) (org-footnote-at-definition-p)) (org-footnote-action)) @@ -7862,110 +7948,161 @@ application the system uses for this file type." ;; switch back to reference buffer ;; needed when if called in a temporary buffer through ;; org-open-link-from-string - (and reference-buffer (switch-to-buffer reference-buffer)) - - ;; Remove any trailing spaces in path - (if (string-match " +\\'" path) - (setq path (replace-match "" t t path))) - (if (and org-link-translation-function - (fboundp org-link-translation-function)) - ;; Check if we need to translate the link - (let ((tmp (funcall org-link-translation-function type path))) - (setq type (car tmp) path (cdr tmp)))) - - (cond - - ((assoc type org-link-protocols) - (funcall (nth 1 (assoc type org-link-protocols)) path)) - - ((equal type "mailto") - (let ((cmd (car org-link-mailto-program)) - (args (cdr org-link-mailto-program)) args1 - (address path) (subject "") a) - (if (string-match "\\(.*\\)::\\(.*\\)" path) - (setq address (match-string 1 path) - subject (org-link-escape (match-string 2 path)))) - (while args - (cond - ((not (stringp (car args))) (push (pop args) args1)) - (t (setq a (pop args)) - (if (string-match "%a" a) - (setq a (replace-match address t t a))) - (if (string-match "%s" a) - (setq a (replace-match subject t t a))) - (push a args1)))) - (apply cmd (nreverse args1)))) - - ((member type '("http" "https" "ftp" "news")) - (browse-url (concat type ":" (org-link-escape - path org-link-escape-chars-browser)))) - - ((member type '("message")) - (browse-url (concat type ":" path))) - - ((string= type "tags") - (org-tags-view in-emacs path)) - ((string= type "thisfile") - (if in-emacs - (switch-to-buffer-other-window - (org-get-buffer-for-internal-link (current-buffer))) - (org-mark-ring-push)) - (let ((cmd `(org-link-search - ,path - ,(cond ((equal in-emacs '(4)) 'occur) - ((equal in-emacs '(16)) 'org-occur) - (t nil)) - ,pos))) - (condition-case nil (eval cmd) - (error (progn (widen) (eval cmd)))))) - - ((string= type "tree-match") - (org-occur (concat "\\[" (regexp-quote path) "\\]"))) - - ((string= type "file") - (if (string-match "::\\([0-9]+\\)\\'" path) - (setq line (string-to-number (match-string 1 path)) - path (substring path 0 (match-beginning 0))) - (if (string-match "::\\(.+\\)\\'" path) - (setq search (match-string 1 path) - path (substring path 0 (match-beginning 0))))) - (if (string-match "[*?{]" (file-name-nondirectory path)) - (dired path) - (org-open-file path in-emacs line search))) - - ((string= type "news") - (require 'org-gnus) - (org-gnus-follow-link path)) - - ((string= type "shell") - (let ((cmd path)) - (if (or (not org-confirm-shell-link-function) - (funcall org-confirm-shell-link-function - (format "Execute \"%s\" in shell? " - (org-add-props cmd nil - 'face 'org-warning)))) - (progn - (message "Executing %s" cmd) - (shell-command cmd)) - (error "Abort")))) - - ((string= type "elisp") - (let ((cmd path)) - (if (or (not org-confirm-elisp-link-function) - (funcall org-confirm-elisp-link-function - (format "Execute \"%s\" as elisp? " - (org-add-props cmd nil - 'face 'org-warning)))) - (message "%s => %s" cmd - (if (equal (string-to-char cmd) ?\() - (eval (read cmd)) - (call-interactively (read cmd)))) - (error "Abort")))) + (with-current-buffer (or reference-buffer (current-buffer)) + + ;; Remove any trailing spaces in path + (if (string-match " +\\'" path) + (setq path (replace-match "" t t path))) + (if (and org-link-translation-function + (fboundp org-link-translation-function)) + ;; Check if we need to translate the link + (let ((tmp (funcall org-link-translation-function type path))) + (setq type (car tmp) path (cdr tmp)))) + + (cond + + ((assoc type org-link-protocols) + (funcall (nth 1 (assoc type org-link-protocols)) path)) + + ((equal type "mailto") + (let ((cmd (car org-link-mailto-program)) + (args (cdr org-link-mailto-program)) args1 + (address path) (subject "") a) + (if (string-match "\\(.*\\)::\\(.*\\)" path) + (setq address (match-string 1 path) + subject (org-link-escape (match-string 2 path)))) + (while args + (cond + ((not (stringp (car args))) (push (pop args) args1)) + (t (setq a (pop args)) + (if (string-match "%a" a) + (setq a (replace-match address t t a))) + (if (string-match "%s" a) + (setq a (replace-match subject t t a))) + (push a args1)))) + (apply cmd (nreverse args1)))) + + ((member type '("http" "https" "ftp" "news")) + (browse-url (concat type ":" (org-link-escape + path org-link-escape-chars-browser)))) + + ((member type '("message")) + (browse-url (concat type ":" path))) + + ((string= type "tags") + (org-tags-view in-emacs path)) + ((string= type "thisfile") + (if in-emacs + (switch-to-buffer-other-window + (org-get-buffer-for-internal-link (current-buffer))) + (org-mark-ring-push)) + (let ((cmd `(org-link-search + ,path + ,(cond ((equal in-emacs '(4)) 'occur) + ((equal in-emacs '(16)) 'org-occur) + (t nil)) + ,pos))) + (condition-case nil (eval cmd) + (error (progn (widen) (eval cmd)))))) + + ((string= type "tree-match") + (org-occur (concat "\\[" (regexp-quote path) "\\]"))) + + ((string= type "file") + (if (string-match "::\\([0-9]+\\)\\'" path) + (setq line (string-to-number (match-string 1 path)) + path (substring path 0 (match-beginning 0))) + (if (string-match "::\\(.+\\)\\'" path) + (setq search (match-string 1 path) + path (substring path 0 (match-beginning 0))))) + (if (string-match "[*?{]" (file-name-nondirectory path)) + (dired path) + (org-open-file path in-emacs line search))) + + ((string= type "news") + (require 'org-gnus) + (org-gnus-follow-link path)) + + ((string= type "shell") + (let ((cmd path)) + (if (or (not org-confirm-shell-link-function) + (funcall org-confirm-shell-link-function + (format "Execute \"%s\" in shell? " + (org-add-props cmd nil + 'face 'org-warning)))) + (progn + (message "Executing %s" cmd) + (shell-command cmd)) + (error "Abort")))) + + ((string= type "elisp") + (let ((cmd path)) + (if (or (not org-confirm-elisp-link-function) + (funcall org-confirm-elisp-link-function + (format "Execute \"%s\" as elisp? " + (org-add-props cmd nil + 'face 'org-warning)))) + (message "%s => %s" cmd + (if (equal (string-to-char cmd) ?\() + (eval (read cmd)) + (call-interactively (read cmd)))) + (error "Abort")))) + + (t + (browse-url-at-point)))))) + (move-marker org-open-link-marker nil) + (run-hook-with-args 'org-follow-link-hook))) + +(defun org-offer-links-in-entry (&optional nth) + "Offer links in the curren entry and follow the selected link. +If there is only one link, follow it immediately as well. +If NTH is an integer immediately pick the NTH link found." + (let ((re (concat "\\(" org-bracket-link-regexp "\\)\\|" + "\\(" org-angle-link-re "\\)\\|" + "\\(" org-plain-link-re "\\)")) + (cnt ?0) + (in-emacs (if (integerp nth) nil nth)) + end + links link c) + (save-excursion + (org-back-to-heading t) + (setq end (save-excursion (outline-next-heading) (point))) + (while (re-search-forward re end t) + (push (match-string 0) links)) + (setq links (org-uniquify (reverse links)))) - (t - (browse-url-at-point)))))) - (move-marker org-open-link-marker nil) - (run-hook-with-args 'org-follow-link-hook)) + (cond + ((null links) (error "No links")) + ((equal (length links) 1) + (setq link (car links))) + ((and (integerp nth) (>= (length links) nth)) + (setq link (nth (1- nth) links))) + (t ; we have to select a link + (save-excursion + (save-window-excursion + (delete-other-windows) + (with-output-to-temp-buffer "*Select Link*" + (princ "Select link\n\n") + (mapc (lambda (l) + (if (not (string-match org-bracket-link-regexp l)) + (princ (format "[%c] %s\n" (incf cnt) + (org-remove-angle-brackets l))) + (if (match-end 3) + (princ (format "[%c] %s (%s)\n" (incf cnt) + (match-string 3 l) (match-string 1 l))) + (princ (format "[%c] %s\n" (incf cnt) + (match-string 1 l)))))) + links)) + (org-fit-window-to-buffer (get-buffer-window "*Select Link*")) + (message "Select link to open:") + (setq c (read-char-exclusive)) + (and (get-buffer "*Select Link*") (kill-buffer "*Select Link*")))) + (when (equal c ?q) (error "Abort")) + (setq nth (- c ?0)) + (unless (and (integerp nth) (>= (length links) nth)) + (error "Invalid link selection")) + (setq link (nth (1- nth) links)))) + (org-open-link-from-string link in-emacs (current-buffer)))) ;;;; Time estimates @@ -8349,7 +8486,7 @@ If the file does not exist, an error is thrown." (eq cmd 'emacs)) (funcall (cdr (assq 'file org-link-frame-setup)) file) (widen) - (if line (goto-line line) + (if line (org-goto-line line) (if search (org-link-search search)))) ((consp cmd) (let ((file (convert-standard-filename file))) @@ -8640,7 +8777,7 @@ See also `org-refile-use-outline-path' and `org-completion-use-ido'" (goto-char (if reversed (or (outline-next-heading) (point-max)) - (or (save-excursion (outline-get-next-sibling)) + (or (save-excursion (org-get-next-sibling)) (org-end-of-subtree t t) (point-max))))) (setq level 1) @@ -8681,7 +8818,7 @@ See also `org-refile-use-outline-path' and `org-completion-use-ido'" (cfunc (if (and org-refile-use-outline-path org-outline-path-complete-in-steps) 'org-olpath-completing-read - 'org-ido-completing-read)) + 'org-icompleting-read)) (extra (if org-refile-use-outline-path "/" "")) (filename (and cfn (expand-file-name cfn))) (tbl (mapcar @@ -8751,9 +8888,10 @@ See also `org-refile-use-outline-path' and `org-completion-use-ido'" (defun org-olpath-completing-read (prompt collection &rest args) "Read an outline path like a file name." (let ((thetable collection) - (org-completion-use-ido nil)) ; does not work with ido. + (org-completion-use-ido nil) ; does not work with ido. + (org-completion-use-iswitchb nil)) ; or iswitchb (apply - 'org-ido-completing-read prompt + 'org-icompleting-read prompt (lambda (string predicate &optional flag) (let (rtn r f (l (length string))) (cond @@ -8912,7 +9050,8 @@ This function can be used in a hook." "BEGIN_SRC" "END_SRC" "CATEGORY" "COLUMNS" "CAPTION" "LABEL" - "BIND")) + "BIND" + "MACRO")) (defcustom org-structure-template-alist '( @@ -9044,11 +9183,14 @@ At all other locations, this simply calls the value of (setq type :opt) (require 'org-exp) (append - (mapcar - (lambda (x) - (string-match "^#\\+\\(\\([A-Z_]+:?\\).*\\)" x) - (cons (match-string 2 x) (match-string 1 x))) - (org-split-string (org-get-current-options) "\n")) + (delq nil + (mapcar + (lambda (x) + (if (string-match + "^#\\+\\(\\([A-Z_]+:?\\).*\\)" x) + (cons (match-string 2 x) + (match-string 1 x)))) + (org-split-string (org-get-current-options) "\n"))) (mapcar 'list org-additional-option-like-keywords))) (startup (setq type :startup) @@ -9247,7 +9389,7 @@ For calling through lisp, arg is also interpreted in the following way: (or (not org-use-fast-todo-selection) (not org-todo-key-trigger))) ;; Read a state with completion - (org-ido-completing-read + (org-icompleting-read "State: " (mapcar (lambda(x) (list x)) org-todo-keywords-1) nil t)) @@ -9513,6 +9655,39 @@ changes because there are uncheckd boxes in this entry." (throw 'dont-block nil))))) t)) ; do not block +(defun org-update-statistics-cookies (all) + "Update the statistics cookie, either from TODO or from checkboxes. +This should be called with the cursor in a line with a statistics cookie." + (interactive "P") + (if all + (progn + (org-update-checkbox-count 'all) + (org-map-entries 'org-update-parent-todo-statistics)) + (if (not (org-on-heading-p)) + (org-update-checkbox-count) + (let ((pos (move-marker (make-marker) (point))) + end l1 l2) + (ignore-errors (org-back-to-heading t)) + (if (not (org-on-heading-p)) + (org-update-checkbox-count) + (setq l1 (org-outline-level)) + (setq end (save-excursion + (outline-next-heading) + (if (org-on-heading-p) (setq l2 (org-outline-level))) + (point))) + (if (and (save-excursion (re-search-forward + "^[ \t]*[-+*] \\[[- X]\\]" end t)) + (not (save-excursion (re-search-forward + ":COOKIE_DATA:.*\\<todo\\>" end t)))) + (org-update-checkbox-count) + (if (and l2 (> l2 l1)) + (progn + (goto-char end) + (org-update-parent-todo-statistics)) + (error "No data for statistics cookie")))) + (goto-char pos) + (move-marker pos nil))))) + (defvar org-entry-property-inherited-from) ;; defined below (defun org-update-parent-todo-statistics () "Update any statistics cookie in the parent of the current headline. @@ -9848,7 +10023,7 @@ of `org-todo-keywords-1'." (kwd-re (cond ((null arg) org-not-done-regexp) ((equal arg '(4)) - (let ((kwd (org-ido-completing-read "Keyword (or KWD1|KWD2|...): " + (let ((kwd (org-icompleting-read "Keyword (or KWD1|KWD2|...): " (mapcar 'list org-todo-keywords-1)))) (concat "\\(" (mapconcat 'identity (org-split-string kwd "|") "\\|") @@ -9913,7 +10088,7 @@ nil." (save-excursion (org-back-to-heading t) (setq beg (point)) - (org-end-of-subtree t t) + (outline-next-heading) (while (re-search-backward re beg t) (replace-match "") (if (and (string-match "\\S-" (buffer-substring (point-at-bol) (point))) @@ -10234,9 +10409,9 @@ a Show deadlines and scheduled items after a date." ((member ans '(?T ?m)) (call-interactively 'org-match-sparse-tree)) ((member ans '(?p ?P)) - (setq kwd (org-ido-completing-read "Property: " + (setq kwd (org-icompleting-read "Property: " (mapcar 'list (org-buffer-property-keys)))) - (setq value (org-ido-completing-read "Value: " + (setq value (org-icompleting-read "Value: " (mapcar 'list (org-property-values kwd)))) (unless (string-match "\\`{.*}\\'" value) (setq value (concat "\"" value "\""))) @@ -10684,7 +10859,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-completing-read-no-ido + (setq match (org-completing-read-no-i "Match: " 'org-tags-completion-function nil nil nil 'org-tags-history)))) @@ -11021,7 +11196,7 @@ With prefix ARG, realign all tags in headings in the current buffer." (let ((org-add-colon-after-tag-completion t)) (org-trim (org-without-partial-completion - (org-ido-completing-read "Tags: " 'org-tags-completion-function + (org-icompleting-read "Tags: " 'org-tags-completion-function nil nil current 'org-tags-history))))))) (while (string-match "[-+&]+" tags) ;; No boolean logic, just a list @@ -11069,7 +11244,7 @@ This works in the agenda, and also in an org-mode buffer." (if (org-mode-p) (org-get-buffer-tags) (org-global-tags-completion-table)))) - (org-ido-completing-read + (org-icompleting-read "Tag: " 'org-tags-completion-function nil nil nil 'org-tags-history)) (progn @@ -11083,7 +11258,7 @@ This works in the agenda, and also in an org-mode buffer." (goto-char beg) (setq l1 (org-current-line)) (loop for l from l1 to l2 do - (goto-line l) + (org-goto-line l) (setq m (get-text-property (point) 'org-hd-marker)) (when (or (and (org-mode-p) (org-on-heading-p)) (and agendap m)) @@ -11134,7 +11309,7 @@ This works in the agenda, and also in an org-mode buffer." (defun org-fast-tag-show-exit (flag) (save-excursion - (goto-line 3) + (org-goto-line 3) (if (re-search-forward "[ \t]+Next change exits" (point-at-eol) t) (replace-match "")) (when flag @@ -11225,7 +11400,7 @@ Returns the new tags string, or nil to not change the current settings." (insert "\n") (setq tbl (cdr tbl))))) (t - (setq tg (car e) c2 nil) + (setq tg (copy-sequence (car e)) c2 nil) (if (cdr e) (setq c (cdr e)) ;; automatically assign a character. @@ -11288,7 +11463,7 @@ Returns the new tags string, or nil to not change the current settings." (if exit-after-next (setq exit-after-next 'now))) ((= c ?\t) (condition-case nil - (setq tg (org-ido-completing-read + (setq tg (org-icompleting-read "Tag: " (or buffer-tags (with-current-buffer buf @@ -11541,6 +11716,35 @@ Being in this list makes sure that they are offered for completion.") (call-interactively 'org-compute-property-at-point)) (t (error "No such property action %c" c))))) +(defun org-set-effort (&optional value) + "Set the effort property of the current entry. +With numerical prefix arg, use the nth allowed value, 0 stands for the 10th +allowed value." + (interactive "P") + (if (equal value 0) (setq value 10)) + (let* ((completion-ignore-case t) + (prop org-effort-property) + (cur (org-entry-get nil prop)) + (allowed (org-property-get-allowed-values nil prop 'table)) + (existing (mapcar 'list (org-property-values prop))) + (val (cond + ((stringp value) value) + ((and allowed (integerp value)) + (or (car (nth (1- value) allowed)) + (car (org-last allowed)))) + (allowed + (org-completing-read "Value: " allowed nil 'req-match)) + (t + (let (org-completion-use-ido org-completion-use-iswitchb) + (org-completing-read + (concat "Value " (if (and cur (string-match "\\S-" cur)) + (concat "[" cur "]") "") + ": ") + existing nil nil "" nil cur)))))) + (unless (equal (org-entry-get nil prop) val) + (org-entry-put nil prop val)) + (message "%s is now %s" prop val))) + (defun org-at-property-p () "Is the cursor in a property line?" ;; FIXME: Does not check if we are actually in the drawer. @@ -11958,7 +12162,7 @@ in the current file." (interactive (let* ((completion-ignore-case t) (keys (org-buffer-property-keys nil t t)) - (prop0 (org-ido-completing-read "Property: " (mapcar 'list keys))) + (prop0 (org-icompleting-read "Property: " (mapcar 'list keys))) (prop (if (member prop0 keys) prop0 (or (cdr (assoc (downcase prop0) @@ -11970,9 +12174,9 @@ in the current file." (existing (mapcar 'list (org-property-values prop))) (val (if allowed (org-completing-read "Value: " allowed nil 'req-match) - (let (org-completion-use-ido) + (let (org-completion-use-ido org-completion-use-iswitchb) (org-completing-read - (concat "Value" (if (and cur (string-match "\\S-" cur)) + (concat "Value " (if (and cur (string-match "\\S-" cur)) (concat "[" cur "]") "") ": ") existing nil nil "" nil cur))))) @@ -11984,7 +12188,7 @@ in the current file." "In the current entry, delete PROPERTY." (interactive (let* ((completion-ignore-case t) - (prop (org-ido-completing-read + (prop (org-icompleting-read "Property: " (org-entry-properties nil 'standard)))) (list prop))) (message "Property %s %s" property @@ -11996,7 +12200,7 @@ in the current file." "Remove PROPERTY globally, from all entries." (interactive (let* ((completion-ignore-case t) - (prop (org-ido-completing-read + (prop (org-icompleting-read "Globally remove property: " (mapcar 'list (org-buffer-property-keys))))) (list prop))) @@ -12595,7 +12799,7 @@ Also, store the cursor date in variable org-ans2." (setq org-ans2 (format-time-string "%Y-%m-%d" time)))) (org-move-overlay org-date-ovl (1- (point)) (1+ (point)) (current-buffer)) (select-window sw) - (select-frame-set-input-focus sf))) + (org-select-frame-set-input-focus sf))) (defun org-calendar-select () "Return to `org-read-date' with the date currently selected. @@ -12826,8 +13030,8 @@ days in order to avoid rounding problems." (match-end (match-end 0)) (time1 (org-time-string-to-time ts1)) (time2 (org-time-string-to-time ts2)) - (t1 (time-to-seconds time1)) - (t2 (time-to-seconds time2)) + (t1 (org-float-time time1)) + (t2 (org-float-time time2)) (diff (abs (- t2 t1))) (negative (< (- t2 t1) 0)) ;; (ys (floor (* 365 24 60 60))) @@ -12883,7 +13087,7 @@ days in order to avoid rounding problems." (defun org-time-string-to-time (s) (apply 'encode-time (org-parse-time-string s))) (defun org-time-string-to-seconds (s) - (time-to-seconds (org-time-string-to-time s))) + (org-float-time (org-time-string-to-time s))) (defun org-time-string-to-absolute (s &optional daynr prefer show-all) "Convert a time stamp to an absolute day number. @@ -13071,7 +13275,7 @@ hour and minute fields will be nil if not given." (string-to-number (match-string 3 s)) (string-to-number (match-string 2 s)) nil nil nil) - (make-list 9 0))) + (error "Not a standard Org-mode time string: %s" s))) (defun org-timestamp-up (&optional arg) "Increase the date item at the cursor by one. @@ -13372,32 +13576,7 @@ changes from another. I believe the procedure must be like this: ;;;###autoload (defun org-iswitchb (&optional arg) - "Use `iswitchb-read-buffer' to prompt for an Org buffer to switch to. -With a prefix argument, restrict available to files. -With two prefix arguments, restrict available buffers to agenda files. - -Due to some yet unresolved reason, the global function -`iswitchb-mode' needs to be active for this function to work." - (interactive "P") - (require 'iswitchb) - (let ((enabled iswitchb-mode) blist) - (or enabled (iswitchb-mode 1)) - (setq blist (cond ((equal arg '(4)) (org-buffer-list 'files)) - ((equal arg '(16)) (org-buffer-list 'agenda)) - (t (org-buffer-list)))) - (unwind-protect - (let ((iswitchb-make-buflist-hook - (lambda () - (setq iswitchb-temp-buflist - (mapcar 'buffer-name blist))))) - (switch-to-buffer - (iswitchb-read-buffer - "Switch-to: " nil t)) - (or enabled (iswitchb-mode -1)))))) - -;;;###autoload -(defun org-ido-switchb (&optional arg) - "Use `org-ido-completing-read' to prompt for an Org buffer to switch to. + "Use `org-icompleting-read' to prompt for an Org buffer to switch to. With a prefix argument, restrict available to files. With two prefix arguments, restrict available buffers to agenda files." (interactive "P") @@ -13405,10 +13584,13 @@ With two prefix arguments, restrict available buffers to agenda files." ((equal arg '(16)) (org-buffer-list 'agenda)) (t (org-buffer-list))))) (switch-to-buffer - (org-ido-completing-read "Org buffer: " + (org-icompleting-read "Org buffer: " (mapcar 'list (mapcar 'buffer-name blist)) nil t)))) +;;;###autoload +(defalias 'org-ido-switchb 'org-iswitchb) + (defun org-buffer-list (&optional predicate exclude-tmp) "Return a list of Org buffers. PREDICATE can be `export', `files' or `agenda'. @@ -13508,9 +13690,8 @@ the buffer and restores the previous window configuration." (while (setq b (find-buffer-visiting f)) (kill-buffer b)) (with-temp-file f (insert (mapconcat 'identity list "\n") "\n"))) - (let ((org-mode-hook nil) - ;; FIXME: What is this for?? --Stef - (default-major-mode 'fundamental-mode)) + (let ((org-mode-hook nil) (org-inhibit-startup t) + (org-insert-mode-line-in-empty-file nil)) (setq org-agenda-files list) (customize-save-variable 'org-agenda-files org-agenda-files)))) @@ -13858,8 +14039,8 @@ The images can be removed again with \\[org-ctrl-c-ctrl-c]." ("$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)) + ("\\[" "\\\\\\[[^\000]*?\\\\\\]" 0 nil) + ("$$" "\\$\\$[^\000]*?\\$\\$" 0 nil)) "Regular expressions for matching embedded LaTeX.") (defun org-format-latex (prefix &optional dir overlays msg at forbuffer) @@ -13889,7 +14070,11 @@ The images can be removed again with \\[org-ctrl-c-ctrl-c]." (while (re-search-forward re nil t) (when (and (or (not at) (equal (cdr at) (match-beginning n))) (not (get-text-property (match-beginning n) - 'org-protected))) + 'org-protected)) + (or (not overlays) + (not (eq (get-char-property (match-beginning n) + 'org-overlay-type) + 'org-latex-overlay)))) (setq txt (match-string n) beg (match-beginning n) end (match-end n) cnt (1+ cnt) @@ -13913,7 +14098,13 @@ The images can be removed again with \\[org-ctrl-c-ctrl-c]." txt movefile opt forbuffer) (if overlays (progn + (mapc (lambda (o) + (if (eq (org-overlay-get o 'org-overlay-type) + 'org-latex-overlay) + (org-delete-overlay o))) + (org-overlays-in beg end)) (setq ov (org-make-overlay beg end)) + (org-overlay-put ov 'org-overlay-type 'org-latex-overlay) (if (featurep 'xemacs) (progn (org-overlay-put ov 'invisible t) @@ -13928,8 +14119,10 @@ The images can be removed again with \\[org-ctrl-c-ctrl-c]." (delete-region beg end) (insert link)))))))) +(defvar org-export-latex-packages-alist) ;; defined in org-latex.el ;; This function borrows from Ganesh Swami's latex2png.el (defun org-create-formula-image (string tofile options buffer) + (require 'org-latex) (let* ((tmpdir (if (featurep 'xemacs) (temp-directory) temporary-file-directory)) @@ -13951,6 +14144,15 @@ The images can be removed again with \\[org-ctrl-c-ctrl-c]." (if (eq bg 'default) (setq bg (org-dvipng-color :background))) (with-temp-file texfile (insert org-format-latex-header + (if org-export-latex-packages-alist + (concat "\n" + (mapconcat (lambda(p) + (if (equal "" (car p)) + (format "\\usepackage{%s}" (cadr p)) + (format "\\usepackage[%s]{%s}" + (car p) (cadr p)))) + org-export-latex-packages-alist "\n")) + "") "\n\\begin{document}\n" string "\n\\end{document}\n")) (let ((dir default-directory)) (condition-case nil @@ -14119,7 +14321,7 @@ The images can be removed again with \\[org-ctrl-c-ctrl-c]." (org-defkey org-mode-map "\C-c^" 'org-sort) (org-defkey org-mode-map "\C-c\C-c" 'org-ctrl-c-ctrl-c) (org-defkey org-mode-map "\C-c\C-k" 'org-kill-note-or-show-branches) -(org-defkey org-mode-map "\C-c#" 'org-update-checkbox-count) +(org-defkey org-mode-map "\C-c#" 'org-update-statistics-cookies) (org-defkey org-mode-map "\C-m" 'org-return) (org-defkey org-mode-map "\C-j" 'org-return-indent) (org-defkey org-mode-map "\C-c?" 'org-table-field-info) @@ -14157,6 +14359,7 @@ The images can be removed again with \\[org-ctrl-c-ctrl-c]." (org-defkey org-mode-map "\C-c\C-x\C-l" 'org-preview-latex-fragment) (org-defkey org-mode-map "\C-c\C-x\C-b" 'org-toggle-checkbox) (org-defkey org-mode-map "\C-c\C-xp" 'org-set-property) +(org-defkey org-mode-map "\C-c\C-xe" 'org-set-effort) (org-defkey org-mode-map "\C-c\C-xo" 'org-toggle-ordered-property) (org-defkey org-mode-map "\C-c\C-xi" 'org-insert-columns-dblock) (org-defkey org-mode-map [(control ?c) (control ?x) ?\;] 'org-timer-set-timer) @@ -14728,6 +14931,8 @@ This command does many different things, depending on context: - If a function in `org-ctrl-c-ctrl-c-hook' recognizes this location, this is what we do. +- If the cursor is on a statistics cookie, update it. + - If the cursor is in a headline, prompt for tags and insert them into the current line, aligned to `org-tags-column'. When called with prefix arg, realign all tags in the current buffer. @@ -14779,6 +14984,9 @@ This command does many different things, depending on context: ((org-at-property-p) (call-interactively 'org-property-action)) ((org-on-target-p) (call-interactively 'org-update-radio-target-regexp)) + ((and (org-in-regexp "\\[\\([0-9]*%\\|[0-9]*/[0-9]*\\)\\]") + (or (org-on-heading-p) (org-at-item-p))) + (call-interactively 'org-update-statistics-cookies)) ((org-on-heading-p) (call-interactively 'org-set-tags)) ((org-at-table.el-p) (require 'table) @@ -15261,6 +15469,7 @@ See the individual commands for more information." "--" ["Expand This Menu" org-create-customize-menu (fboundp 'customize-menu-create)]) + ["Send bug report" org-submit-bug-report t] "--" ("Refresh/Reload" ["Refresh setup current buffer" org-mode-restart t] @@ -15274,6 +15483,62 @@ With optional NODE, go directly to that node." (interactive) (info (format "(org)%s" (or node "")))) +;;;###autoload +(defun org-submit-bug-report () + "Submit a bug report on Org-mode via mail. + +Don't hesitate to report any problems or inaccurate documentation. + +If you don't have setup sending mail from (X)Emacs, please copy the +output buffer into your mail program, as it gives us important +information about your Org-mode version and configuration." + (interactive) + (require 'reporter) + (org-load-modules-maybe) + (org-require-autoloaded-modules) + (let ((reporter-prompt-for-summary-p "Bug report subject: ")) + (reporter-submit-bug-report + "emacs-orgmode@gnu.org" + (org-version) + (let (list) + (save-window-excursion + (switch-to-buffer (get-buffer-create "*Warn about privacy*")) + (delete-other-windows) + (erase-buffer) + (insert "You are about to submit a bug report to the Org-mode mailing list. + +We would like to add your full Org-mode and Outline configuration to the +bug report. This greatly simplifies the work of the maintainer and +other experts on the mailing list. + +HOWEVER, some variables you have customized may contain private +information. The names of customers, colleagues, or friends, might +appear in the form of file names, tags, todo states, or search strings. +If you answer yes to the prompt, you might want to check and remove +such private information before sending the email.") + (add-text-properties (point-min) (point-max) '(face org-warning)) + (when (yes-or-no-p "Include your Org-mode configuration ") + (mapatoms + (lambda (v) + (and (boundp v) + (string-match "\\`\\(org-\\|outline-\\)" (symbol-name v)) + (or (and (symbol-value v) + (string-match "\\(-hook\\|-function\\)\\'" (symbol-name v))) + (and + (get v 'custom-type) (get v 'standard-value) + (not (equal (symbol-value v) (eval (car (get v 'standard-value))))))) + (push v list))))) + (kill-buffer (get-buffer "*Warn about privacy*")) + list)) + nil nil + "Remember to cover the basics, that is, what you expected to happen and +what in fact did happen. You don't know how to make a good report? See + + http://orgmode.org/manual/Feedback.html#Feedback + +Your bug report will be posted to the Org-mode mailing list. +------------------------------------------------------------------------"))) + (defun org-install-agenda-files-menu () (let ((bl (buffer-list))) (save-excursion @@ -15392,6 +15657,10 @@ With prefix arg UNCOMPILED, load the uncompiled versions." (display-buffer buf) (sit-for 0)))) +(defun org-in-commented-line () + "Is point in a line starting with `#'?" + (equal (char-after (point-at-bol)) ?#)) + (defun org-goto-marker-or-bmk (marker &optional bookmark) "Go to MARKER, widen if necessary. When marker is not live, try BOOKMARK." (if (and marker (marker-buffer marker) @@ -16544,6 +16813,20 @@ This is like outline-next-sibling, but invisible headings are ok." nil (point)))) +(defun org-get-last-sibling () + "Move to previous heading of the same level, and return point. +If there is no such heading, return nil." + (let ((opoint (point)) + (level (funcall outline-level))) + (outline-previous-heading) + (when (and (/= (point) opoint) (outline-on-heading-p t)) + (while (and (> (funcall outline-level) level) + (not (bobp))) + (outline-previous-heading)) + (if (< (funcall outline-level) level) + nil + (point))))) + (defun org-end-of-subtree (&optional invisible-OK to-heading) ;; This contains an exact copy of the original function, but it uses ;; `org-back-to-heading', to make it work also in invisible @@ -16629,7 +16912,7 @@ Stop at the first and last subheadings of a superior heading." (outline-flag-region (point) (save-excursion - (outline-end-of-subtree) (outline-next-heading) (point)) + (org-end-of-subtree t t)) nil)) (defun org-show-entry () @@ -16854,14 +17137,14 @@ To get rid of the restriction, use \\[org-agenda-remove-restriction-lock]." Still experimental, may disappear in the future." (interactive) ;; Get the time interval from the user. - (let* ((time1 (time-to-seconds + (let* ((time1 (org-float-time (org-read-date nil 'to-time nil "Starting date: "))) - (time2 (time-to-seconds + (time2 (org-float-time (org-read-date nil 'to-time nil "End date:"))) ;; callback function (callback (lambda () (let ((time - (time-to-seconds + (org-float-time (apply 'encode-time (org-parse-time-string (match-string 1)))))) |