Browse Source

Implement actions tied to cursor date in agenda.

Carsten Dominik 16 years ago
parent
commit
be026ff5ad
7 changed files with 259 additions and 73 deletions
  1. 45 7
      ORGWEBPAGE/Changes.org
  2. 8 2
      ORGWEBPAGE/index.org
  3. 41 10
      doc/org.texi
  4. 17 7
      lisp/ChangeLog
  5. 74 2
      lisp/org-agenda.el
  6. 13 15
      lisp/org-remember.el
  7. 61 30
      lisp/org.el

+ 45 - 7
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

+ 8 - 2
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
 

+ 41 - 10
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.

+ 17 - 7
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.
 

+ 74 - 2
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
+
+

+ 13 - 15
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)))

+ 61 - 30
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.