diff --git a/ORGWEBPAGE/Changes.org b/ORGWEBPAGE/Changes.org index 0314719da..814ae5e66 100644 --- a/ORGWEBPAGE/Changes.org +++ b/ORGWEBPAGE/Changes.org @@ -21,8 +21,8 @@ thanks for all the great ideas. ** Overview + - Use cursor position in agenda for remember, scheduling and deadlines - New API for mapping a function over all or selected entries - - Remember templates can now use the cursor date in the agenda - Remember templates can be filed to beginning/end of a file - Visiting a filed remember buffer immediately - BBDB anniversaries are now links @@ -31,7 +31,48 @@ thanks for all the great ideas. - Direct, single key access to allowed values in column view - New hook to hack exported iCalendar files +** Incompatible changes + +*** `C-c C-x C-k' now calls `org-mark-entry-for-agenda-action' + It used to call =org-cut-special=, but that is also at bound + to the key =C-c C-x C-w=. ** Details + +*** Making use of the cursor position in the agenda + + The date at the cursor in the agenda (and also in the + calendar) can now be used to schedule entries, or to set the + date in a remember template correctly. It is also designed + to make it easier to move an entry to a date picked in the + agenda. Thanks to Thomas Baumann for starting the thread + that led to this development. + +**** Calling remember with the cursor date in the agenda + + If you want to use the date at the agenda cursor in a + remember template, start remember from the agenda with the + keys =k r=. While the template is being filled in, the + default date for all time stamps, and also for all + interactive escapes like =%^t= is now the date at the cursor + in the agenda. The exact same command can also be used from + the calendar if you prefer that. + +**** Picking a date for scheduling/deadline in the agenda + + You may now pick the date for scheduling an item or for + setting a deadline in the agenda, where you have the best + overview over free time slots. This is a two step process. + + 1. First you pick the entry that should be acted upon. In + the agenda, you use the keys =k m=. In an org-mode file, + this is on =C-c C-x C-k=. + + 2. Then you find the agenda date you want to apply. When the + cursor is anywhere in the block belonging to that date, + press =k s= to schedule, or =k d= to put a deadline. The + agenda is not updated immediately, press =r= if you want + it to show the affected entry in the right place. + *** New API for mapping a function over all or selected entries Org has sophisticated mapping capabilities to find all @@ -87,12 +128,9 @@ keyword =WAITING=, in all agenda files. *** Changes in Remember templates **** Remember templates can now use the cursor date in the agenda - Two new escapes in remember templates, %v and %V, act like %t - and %T. The only difference is that if the remember process - is started from the agenda or from the calendar, the date at - the cursor becomes the default for the date inserted, or (in - interactive use like %^V), the default date for the date/time - prompt. Thanks to Thomas Baumann for this idea. + + Thanks to Thomas Baumann for starting up a thread + that let to this idea. **** Filing remember templates to the beginning or end of a file You may now set the heading part of a remember template diff --git a/ORGWEBPAGE/index.org b/ORGWEBPAGE/index.org index c1ff67090..d12c85ab7 100644 --- a/ORGWEBPAGE/index.org +++ b/ORGWEBPAGE/index.org @@ -49,8 +49,9 @@ has been posted [[http://www.philfam.co.uk/pete/GTD/org-mode/update-org.sh][here **** Get the development version -You can check out the latest Org development version by using git. -More information on this page: http://repo.or.cz/w/org-mode.git +You can check out the latest Org development version (along with every +release we ever had) by using git. More information on this page: +http://repo.or.cz/w/org-mode.git * Documentation ** Manual and Reference card @@ -64,6 +65,11 @@ More information on this page: http://repo.or.cz/w/org-mode.git produced by Takeshi Okano. - The [[file:faq.org][FAQ]] is not very up-to-date, but may still answer some of your questions. Please have a look before posting to emacs-orgmode@gnu.org. + - The Org manual is a GNU Manual released under the GFDL. If you + want to redistribute Org with a distribution that does not allow + the GFDL to be used, and if you see no other way to resolve this + licensing conflict, you must use the special [[file:org_dual_license.texi][dual-license version]] + of the manual. * Links diff --git a/doc/org.texi b/doc/org.texi index 57a3f294b..9f5c6b0ff 100644 --- a/doc/org.texi +++ b/doc/org.texi @@ -42,9 +42,9 @@ Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, with the Front-Cover texts being ``A GNU Manual,'' -and with the Back-Cover Texts as in (a) below. A copy of the -license is included in the section entitled ``GNU Free Documentation -License. +and with the Back-Cover Texts as in (a) below. You should have received a +copy of the ``GNU Free Documentation License'' with GNU Emacs. If not, see +@url{http://www.gnu.org/licenses/}. (a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify this GNU Manual, like GNU software. Copies published by the Free @@ -4502,6 +4502,15 @@ Insert @samp{SCHEDULED} keyword along with a stamp. The insertion will happen in the line directly following the headline. Any CLOSED timestamp will be removed. When called with a prefix argument, remove the scheduling date from the entry. +@c +@kindex C-c C-x C-k +@kindex k a +@kindex k s +@item C-c C-x C-k +Mark the current entry for agenda action. After you have marked the entry +like this, you can open the agenda or the calendar to find an appropriate +date. With the cursor on the selected date, press @kbd{k s} or @kbd{k d} to +schedule the marked item. @end table @node Repeated tasks, , Inserting deadline/schedule, Deadlines and scheduling @@ -4797,6 +4806,11 @@ stored: Just call @code{org-remember} with a prefix argument. If you use two prefix arguments, Org jumps to the location where the last remember note was stored. +You can also call @code{org-remember} in a special way from the agenda, +using the @kbd{k r} key combination. With this access, any time stamps +inserted by the selected remember template (see below) will default to +the cursor date in the agenda, rather than to the current date. + @node Remember templates, Storing notes, Setting up Remember, Remember @section Remember templates @cindex templates, for remember @@ -4870,8 +4884,6 @@ insertion of content: %t @r{time stamp, date only} %T @r{time stamp with date and time} %u, %U @r{like the above, but inactive time stamps} -%v, %V @r{like %t,%T, but when called from agenda or calendar, use the} - @r{cursor date as the default date.} %^t @r{like @code{%t}, but prompt for date. Similarly @code{%^T}, @code{%^u}, @code{%^U}} @r{You may define a prompt like @code{%^@{Birthday@}t}} %n @r{user name (taken from @code{user-full-name})} @@ -5853,6 +5865,21 @@ Schedule this item @item C-c C-d Set a deadline for this item. @c +@kindex k +@item k +Agenda actions, to set dates for selected items to the cursor date. +This command also works in the calendar! The command prompts for an +additonal key: +@example +m @r{Mark the entry at point for action. You can also make entries} + @r{in Org files with @kbd{C-c C-x C-k}.} +d @r{Set the deadline of the marked entry to the date at point.} +s @r{Schedule the marked entry at the date at point.} +r @r{Call @code{org-remember} with the cursor date as default date.} +@end example +Press @kbd{r} afterwards to refresh the agenda and see the effect of the +command. +@c @kindex S-@key{right} @item S-@key{right} Change the time stamp associated with the current line by one day into the @@ -9377,6 +9404,9 @@ let me know. @item @i{Thomas Baumann} wrote @file{org-bbdb.el} and @file{org-mhe.el}. @item +@i{Christophe Bataillon} created the great unicorn logo that we use on the +Org-mode website. +@item @i{Alex Bochannek} provided a patch for rounding time stamps. @item @i{Charles Cave}'s suggestion sparked the implementation of templates @@ -9512,11 +9542,12 @@ keyword. system. @item @i{John Wiegley} wrote @file{emacs-wiki.el}, @file{planner.el}, and -@file{muse.el}, which have similar goals as Org. Initially the development -of Org was fully independent because I was not aware of the existence of -these packages. But with time I have accasionally looked at John's code and -learned a lot from it. John has also contributed a number of great ideas and -patches directly to Org, including the file @code{org-mac-message.el}' +@file{muse.el}, which have similar goals as Org. Initially the +development of Org was fully independent because I was not aware of the +existence of these packages. But with time I have accasionally looked +at John's code and learned a lot from it. John has also contributed a +number of great ideas and patches directly to Org, including the file +@code{org-mac-message.el}' @item @i{Carsten Wimmer} suggested some changes and helped fix a bug in linking to Gnus. diff --git a/lisp/ChangeLog b/lisp/ChangeLog index b783fbdf9..c9f55d110 100755 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,18 +1,28 @@ +2008-06-16 Carsten Dominik + + * org.el (org-calendar-agenda-action-key): New option. + (org-get-cursor-date): New function. + (org-mark-entry-for-agenda-action): New command. + (org-overriding-default-time): New variable. + (org-read-date): Respect `org-overriding-default-time'. + + * org-remember.el (org-remember-apply-template): Respect the + ovverriding default time. + + * org-agenda.el (org-agenda-action-marker): New variable. + (org-agenda-action): New command. + (org-agenda-do-action): New function. + 2008-06-15 Carsten Dominik * org.el (org-schedule, org-deadline): Protect scheduled and deadline tasks against changes that accidently remove the - repeater. - - * org-remember.el (org-remember-apply-template): Access the - default time stored by `org-store-link'. - - * org.el (org-store-link-set-default-date): New function. + repeater. Also show a message with the new date when done. 2008-06-15 Carsten Dominik * org.el (org-beginning-of-line): Cater for the case when there - are toags but no headline text. + are tags but no headline text. (org-align-tags-here): Convert to tabs only when indent-tabs-mode it set. diff --git a/lisp/org-agenda.el b/lisp/org-agenda.el index d73892eef..05d7c247b 100644 --- a/lisp/org-agenda.el +++ b/lisp/org-agenda.el @@ -1087,6 +1087,8 @@ The following commands are available: (org-defkey org-agenda-mode-map "y" 'org-agenda-year-view) (org-defkey org-agenda-mode-map "\C-c\C-z" 'org-agenda-add-note) (org-defkey org-agenda-mode-map "z" 'org-agenda-add-note) +(org-defkey org-agenda-mode-map "k" 'org-agenda-action) +(org-defkey org-agenda-mode-map "\C-c\C-x\C-k" 'org-agenda-action) (org-defkey org-agenda-mode-map [(shift right)] 'org-agenda-date-later) (org-defkey org-agenda-mode-map [(shift left)] 'org-agenda-date-earlier) (org-defkey org-agenda-mode-map [?\C-c ?\C-x (right)] 'org-agenda-date-later) @@ -1193,6 +1195,11 @@ The following commands are available: ["Schedule" org-agenda-schedule t] ["Set Deadline" org-agenda-deadline t] "--" + ["Mark item" org-agenda-action :active t :keys "k m"] + ["Show mark item" org-agenda-action :active t :keys "k v"] + ["Schedule marked item" org-agenda-action :active t :keys "k s"] + ["Set Deadline for marked item" org-agenda-action :active t :keys "k d"] + "--" ["Change Date +1 day" org-agenda-date-later (org-agenda-check-type nil 'agenda 'timeline)] ["Change Date -1 day" org-agenda-date-earlier (org-agenda-check-type nil 'agenda 'timeline)] ["Change Date to ..." org-agenda-date-prompt (org-agenda-check-type nil 'agenda 'timeline)]) @@ -4166,12 +4173,12 @@ written as 2-digit years." (setq org-agenda-ndays 7) (org-agenda-change-time-span 'week iso-week)) (defun org-agenda-month-view (&optional month) - "Switch to daily view for agenda. + "Switch to monthly view for agenda. With argument MONTH, switch to that month." (interactive "P") (org-agenda-change-time-span 'month month)) (defun org-agenda-year-view (&optional year) - "Switch to daily view for agenda. + "Switch to yearly view for agenda. With argument YEAR, switch to that year. If MONTH has more then 2 digits, only the last two encode the month. Any digits before this encode a year. So 200712 means @@ -4922,6 +4929,69 @@ be used to request time specification in the time stamp." (org-agenda-show-new-time marker ts "S")) (message "Deadline for this item set to %s" ts))) +(defun org-agenda-action () + "Select entry for agenda action, or execute an agenda action. +This command prompts for another letter. Valid inputs are: + +m Mark the entry at point for an agenda action +s Schedule the marked entry to the date at the cursor +d Set the deadline of the marked entry to the date at the cursor +r Call `org-remember' with cursor date as the default date +SPC Show marked entry in other window +TAB Visit marked entry in other window + +The cursor may be at a date in the calendar, or in the Org agenda." + (interactive) + (let (pos ans) + (message "Select action: [m]ark | [s]chedule [d]eadline [r]emember [ ]show") + (setq ans (read-char-exclusive)) + (cond + ((equal ans ?m) + ;; Mark this entry + (if (eq major-mode 'org-agenda-mode) + (let ((m (or (get-text-property (point) 'org-hd-marker) + (get-text-property (point) 'org-marker)))) + (if m + (progn + (move-marker org-agenda-action-marker + (marker-position m) (marker-buffer m)) + (message "Entry marked for action; press `k' at desired date in agenda or calendar")) + (error "Don't know which entry to mark"))) + (error "This command works only in the agenda"))) + ((equal ans ?s) + (org-agenda-do-action '(org-schedule nil org-overriding-default-time))) + ((equal ans ?d) + (org-agenda-do-action '(org-deadline nil org-overriding-default-time))) + ((equal ans ?r) + (org-agenda-do-action '(org-remember) t)) + ((equal ans ?\ ) + (let ((cw (selected-window))) + (org-switch-to-buffer-other-window + (marker-buffer org-agenda-action-marker)) + (goto-char org-agenda-action-marker) + (org-show-context 'agenda) + (select-window cw))) + ((equal ans ?\C-i) + (org-switch-to-buffer-other-window + (marker-buffer org-agenda-action-marker)) + (goto-char org-agenda-action-marker) + (org-show-context 'agenda)) + (t (error "Invalid agenda action %c" ans))))) + +(defun org-agenda-do-action (form &optional current-buffer) + "Evaluate FORM at the entry pointed to by `org-agenda-action-marker'." + (let ((org-overriding-default-time (org-get-cursor-date))) + (if current-buffer + (eval form) + (if (not (marker-buffer org-agenda-action-marker)) + (error "No entry has bee selected for agenda action") + (with-current-buffer (marker-buffer org-agenda-action-marker) + (save-excursion + (save-restriction + (widen) + (goto-char org-agenda-action-marker) + (eval form)))))))) + (defun org-agenda-clock-in (&optional arg) "Start the clock on the currently selected item." (interactive "P") @@ -5184,3 +5254,5 @@ belonging to the \"Work\" category." ;; arch-tag: 77f7565d-7c4b-44af-a2df-9f6f7070cff1 ;;; org-agenda.el ends here + + diff --git a/lisp/org-remember.el b/lisp/org-remember.el index 271946325..0f29dd775 100644 --- a/lisp/org-remember.el +++ b/lisp/org-remember.el @@ -123,14 +123,16 @@ Furthermore, the following %-escapes will be replaced with content: %t time stamp, date only %T time stamp with date and time %u, %U like the above, but inactive time stamps - %v, %V like %t,%T, but use agenda/calendar date as default. - %^t like %t, but prompt for date. Similarly %^T, %^u, %^U, %^v %^V - You may define a prompt like %^{Please specify birthday}t + %^t like %t, but prompt for date. Similarly %^T, %^u, %^U. + 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. - %c content of the clipboard, or current kill ring head + %c current kill ring head + %x content of the X clipboard + %^C Interactive selection of which kill or clip to use + %^L Like %^C, but insert as link %^g prompt for tags, with completion on tags in target file %^G prompt for tags, with completion all tags in all agenda files %:keyword specific information for certain link types, see below @@ -313,9 +315,9 @@ This function should be placed into `remember-mode-hook' and in fact requires to be run from that hook to function properly." (if org-remember-templates (let* ((entry (org-select-remember-template use-char)) + (ct (or org-overriding-default-time (org-current-time))) (tpl (car entry)) (plist-p (if org-store-link-plist t nil)) - (default-time (plist-get org-store-link-plist :default-time)) (file (if (and (nth 1 entry) (stringp (nth 1 entry)) (string-match "\\S-" (nth 1 entry))) (nth 1 entry) @@ -325,10 +327,8 @@ to be run from that hook to function properly." (v-x (or (org-get-x-clipboard 'PRIMARY) (org-get-x-clipboard 'CLIPBOARD) (org-get-x-clipboard 'SECONDARY))) - (v-t (format-time-string (car org-time-stamp-formats) (org-current-time))) - (v-T (format-time-string (cdr org-time-stamp-formats) (org-current-time))) - (v-v (format-time-string (car org-time-stamp-formats) (or default-time (org-current-time)))) - (v-V (format-time-string (cdr org-time-stamp-formats) (or default-time (org-current-time)))) + (v-t (format-time-string (car org-time-stamp-formats) ct)) + (v-T (format-time-string (cdr org-time-stamp-formats) ct)) (v-u (concat "[" (substring v-t 1 -1) "]")) (v-U (concat "[" (substring v-T 1 -1) "]")) ;; `initial' and `annotation' are bound in `remember' @@ -371,7 +371,7 @@ to be run from that hook to function properly." (or (cdr org-remember-previous-location) "???")))) (insert tpl) (goto-char (point-min)) ;; Simple %-escapes - (while (re-search-forward "%\\([tTuUvVaiAcx]\\)" nil t) + (while (re-search-forward "%\\([tTuUaiAcx]\\)" nil t) (when (and initial (equal (match-string 0) "%i")) (save-match-data (let* ((lead (buffer-substring @@ -425,7 +425,7 @@ to be run from that hook to function properly." (org-set-local 'org-remember-default-headline headline)) ;; Interactive template entries (goto-char (point-min)) - (while (re-search-forward "%^\\({\\([^}]*\\)}\\)?\\([gGuUtTvVCL]\\)?" nil t) + (while (re-search-forward "%^\\({\\([^}]*\\)}\\)?\\([gGtTuUCL]\\)?" nil t) (setq char (if (match-end 3) (match-string 3)) prompt (if (match-end 2) (match-string 2))) (goto-char (match-beginning 0)) @@ -471,12 +471,10 @@ to be run from that hook to function properly." '(clipboards . 1) (car clipboards)))))) (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 - (if (equal (upcase char) "V") - default-time - nil))) + prompt)) (org-insert-time-stamp time org-time-was-given (member char '("u" "U")) nil nil (list org-end-time-was-given))) diff --git a/lisp/org.el b/lisp/org.el index 722ecebf0..9de124db1 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -2000,9 +2000,19 @@ forth between agenda and calendar." :group 'org-agenda :type 'sexp) +(defcustom org-calendar-agenda-action-key [?k] + "The key to be installed in `calendar-mode-map' for agenda-action. +The command `org-agenda-action' will be bound to this key. The +default is the character `k' because we use the same key in the agenda." + :group 'org-agenda + :type 'sexp) + (eval-after-load "calendar" - '(org-defkey calendar-mode-map org-calendar-to-agenda-key - 'org-calendar-goto-agenda)) + '(progn + (org-defkey calendar-mode-map org-calendar-to-agenda-key + 'org-calendar-goto-agenda) + (org-defkey calendar-mode-map org-calendar-agenda-action-key + 'org-agenda-action))) (defgroup org-latex nil "Options for embedding LaTeX code into Org-mode." @@ -6524,7 +6534,6 @@ For file links, arg negates `org-context-in-file-links'." (interactive "P") (org-load-modules-maybe) (setq org-store-link-plist nil) ; reset - (org-store-link-set-default-date) (let (link cpltxt desc description search txt) (cond @@ -6659,24 +6668,6 @@ For file links, arg negates `org-context-in-file-links'." (setq org-store-link-plist (plist-put org-store-link-plist key value))))) -(defun org-store-link-set-default-date () - "Store the date at the cursor so that remember templates can access it. -This works in the calendar, and in the Org Agenda. It is a no-op in -any other modes." - (let (date day defd) - (cond - ((eq major-mode 'calendar-mode) - (setq date (calendar-cursor-to-date) - defd (encode-time 0 0 0 (nth 1 date) (nth 0 date) (nth 2 date)))) - ((eq major-mode 'org-agenda-mode) - (setq day (get-text-property (point) 'day)) - (if day - (setq date (calendar-gregorian-from-absolute day) - defd (encode-time 0 0 0 (nth 1 date) (nth 0 date) - (nth 2 date)))))) - (when defd - (org-store-link-props :default-time defd)))) - (defun org-email-link-description (&optional fmt) "Return the description part of an email link. This takes information from `org-store-link-plist' and formats it @@ -8704,9 +8695,11 @@ of `org-todo-keywords-1'." (message "%d TODO entries found" (org-occur (concat "^" outline-regexp " *" kwd-re ))))) -(defun org-deadline (&optional remove) +(defun org-deadline (&optional remove time) "Insert the \"DEADLINE:\" string with a timestamp to make a deadline. -With argument REMOVE, remove any deadline from the item." +With argument REMOVE, remove any deadline from the item. +When TIME is set, it should be an internal time specification, and the +scheduling will use the corresponding date." (interactive "P") (if remove (progn @@ -8714,11 +8707,14 @@ With argument REMOVE, remove any deadline from the item." (message "Item no longer has a deadline.")) (if (org-get-repeat) (error "Cannot change deadline on task with repeater, please do that by hand") - (org-add-planning-info 'deadline nil 'closed)))) + (org-add-planning-info 'deadline time 'closed) + (message "Deadline on %s" org-last-inserted-timestamp)))) -(defun org-schedule (&optional remove) +(defun org-schedule (&optional remove time) "Insert the SCHEDULED: string with a timestamp to schedule a TODO item. -With argument REMOVE, remove any scheduling date from the item." +With argument REMOVE, remove any scheduling date from the item. +When TIME is set, it should be an internal time specification, and the +scheduling will use the corresponding date." (interactive "P") (if remove (progn @@ -8726,7 +8722,8 @@ With argument REMOVE, remove any scheduling date from the item." (message "Item is no longer scheduled.")) (if (org-get-repeat) (error "Cannot reschedule task with repeater, please do that by hand") - (org-add-planning-info 'scheduled nil 'closed)))) + (org-add-planning-info 'scheduled time 'closed) + (message "Scheduled to %s" org-last-inserted-timestamp)))) (defun org-remove-timestamp-with-keyword (keyword) "Remove all time stamps with KEYWORD in the current entry." @@ -10600,6 +10597,8 @@ Return the position where this entry starts, or nil if there is no such entry." ;;;; Timestamps (defvar org-last-changed-timestamp nil) +(defvar org-last-inserted-timestamp nil + "The last time stamp inserted with `org-insert-time-stamp'.") (defvar org-time-was-given) ; dynamically scoped parameter (defvar org-end-time-was-given) ; dynamically scoped parameter (defvar org-ts-what) ; dynamically scoped parameter @@ -10689,6 +10688,7 @@ So these are more for recording a certain time/date." (defvar org-plain-time-of-day-regexp) ; defined below +(defvar org-overriding-default-time nil) ; dynamically scoped (defvar org-read-date-overlay nil) (defvar org-dcst nil) ; dynamically scoped @@ -10746,7 +10746,7 @@ user." (if (equal with-time '(16)) '(0 0) org-time-stamp-rounding-minutes)) (org-dcst org-display-custom-times) (ct (org-current-time)) - (def (or default-time ct)) + (def (or org-overriding-default-time default-time ct)) (defdecode (decode-time def)) (dummy (progn (when (< (nth 2 defdecode) org-extend-today-until) @@ -11110,7 +11110,7 @@ The command returns the inserted time stamp." (insert-before-markers extra) (forward-char 1)) (insert-before-markers (or post "")) - stamp)) + (setq org-last-inserted-timestamp stamp))) (defun org-toggle-time-stamp-overlays () "Toggle the use of custom time stamp formats." @@ -12488,7 +12488,7 @@ The images can be removed again with \\[org-ctrl-c-ctrl-c]." (org-defkey org-mode-map "\C-c:" 'org-toggle-fixed-width-section) (org-defkey org-mode-map "\C-c\C-x\C-f" 'org-emphasize) -(org-defkey org-mode-map "\C-c\C-x\C-k" 'org-cut-special) +(org-defkey org-mode-map "\C-c\C-x\C-k" 'org-mark-entry-for-agenda-action) (org-defkey org-mode-map "\C-c\C-x\C-w" 'org-cut-special) (org-defkey org-mode-map "\C-c\C-x\M-w" 'org-copy-special) (org-defkey org-mode-map "\C-c\C-x\C-y" 'org-paste-special) @@ -13856,6 +13856,37 @@ not an indirect buffer." (save-match-data (string-match (org-image-file-name-regexp) file))) +(defun org-get-cursor-date () + "Return the date at cursor in as a time. +This works in the calendar and in the agenda, anywhere else it just +returns the current time." + (let (date day defd) + (cond + ((eq major-mode 'calendar-mode) + (setq date (calendar-cursor-to-date) + defd (encode-time 0 0 0 (nth 1 date) (nth 0 date) (nth 2 date)))) + ((eq major-mode 'org-agenda-mode) + (setq day (get-text-property (point) 'day)) + (if day + (setq date (calendar-gregorian-from-absolute day) + defd (encode-time 0 0 0 (nth 1 date) (nth 0 date) + (nth 2 date)))))) + (or defd (current-time)))) + +(defvar org-agenda-action-marker (make-marker) + "Marker pointing to the entry for the next agenda action.") + +(defun org-mark-entry-for-agenda-action () + "Mark the current entry as target of an agenda action. +Agenda actions are actions executed from the agenda with the key `k', +which make use of the date at the cursor." + (interactive) + (move-marker org-agenda-action-marker + (save-excursion (org-back-to-heading t) (point)) + (current-buffer)) + (message + "Entry marked for action; press `k' at desired date in agenda or calendar")) + ;;; Paragraph filling stuff. ;; We want this to be just right, so use the full arsenal.