summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarsten Dominik <carsten.dominik@gmail.com>2008-06-16 16:26:30 +0200
committerCarsten Dominik <carsten.dominik@gmail.com>2008-06-16 16:26:30 +0200
commitbe026ff5ad8746814870e5f9eced0cbb5b5c4a6c (patch)
tree09d02b288710653a54dce46c172761250ee75c21
parente8202bf861ec7c905caee894c26d4257cd2117cf (diff)
downloadorg-mode-be026ff5ad8746814870e5f9eced0cbb5b5c4a6c.tar.gz
Implement actions tied to cursor date in agenda.
-rw-r--r--ORGWEBPAGE/Changes.org52
-rw-r--r--ORGWEBPAGE/index.org10
-rw-r--r--doc/org.texi51
-rwxr-xr-xlisp/ChangeLog24
-rw-r--r--lisp/org-agenda.el76
-rw-r--r--lisp/org-remember.el28
-rw-r--r--lisp/org.el91
7 files changed, 259 insertions, 73 deletions
diff --git a/ORGWEBPAGE/Changes.org b/ORGWEBPAGE/Changes.org
index 0314719..814ae5e 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 c1ff670..d12c85a 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 57a3f29..9f5c6b0 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 b783fbd..c9f55d1 100755
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,18 +1,28 @@
+2008-06-16 Carsten Dominik <dominik@science.uva.nl>
+
+ * 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 <dominik@science.uva.nl>
* 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 <dominik@science.uva.nl>
* 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 d73892e..05d7c24 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 2719463..0f29dd7 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 722eceb..9de124d 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.