123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- ;; Then I don't really thing you would have to be able to customize
- ;; this, as there are only very few operations for which this makes
- ;; sense:
- ;; A**** Archive
- ;; T**** Mark TODO
- ;; D**** Mark DONE
- ;; N**** Cycle TODO to the next state
- ;; Can't really think of anything else.
- ;; I prefer configurable, because then people can use numbers. This is
- ;; the idea that the editor may have limited UI. I'm using a j2me based
- ;; editor called JPE at the moment:
- ;; http://my-communicator.com/s80/software/applications.php?fldAuto=556&faq=2
- ;; But other people may be using something like this:
- ;; http://www.getjar.com/products/3960/TextEditor
- ;; Or this which i'm currently playing with:
- ;; http://www.bermin.net/index.html
- ;; As for other things, it depends on what you want emacs to be able to
- ;; do with an externally changed org mode file. For me this is about
- ;; using org mode in an intelligent way with my mobile phone/pda. I can
- ;; imagine wanting to write functions like:
- ;; * move this huge piece of text and tables down a level
- ;; <* move this huge piece of text and tables up a level
- ;; M* ask to recategorise this heading when i open org mode
- ;; +* remind me about this when i open org mode so i can brain dump on it
- ;; in a real editor.
- ;; D* ask me to schedule this as an event when i open org mode.
- ;; O* open my mail client to send an email to this email address i just got
- ;; C* search bbdb for the contact details of the phone no on this line.
- ;; c* search ldap for the contact details of this name
- ;; B* open a web browser to this link i wanted to check out when i got back to my machine
- ;; R* remind me to look at TheseSearchTags headings when i get back to my machine.
- (defcustom org-fastup-action-alist
- '((?A org-archive t)
- (?T (org-todo 1) nil)
- (?D (org-todo (length org-todo-keywords)) nil)
- (?N org-todo nil)
- (?< org-promote-subtree t)
- (?> org-demote-subtree t)
- (?M org-set-tags nil)
- (?S org-schedule t))
- "List of fastupdate actions.
- Each entry in this list is a list of 3 items:
- - A character representing the fastupdate action
- - A function or form to be executed, with cursor at beginning of headline
- - A flag indicating if execution of this action should normally be confirmed."
- :group 'org-fastup
- :type '(repeat
- (list :value (?a nil t)
- (character :tag "Prefix char")
- (choice
- (const :tag "Archive this subtree" org-archive)
- (const :tag "Make TODO" (org-todo 1))
- (const :tag "Mark DONE" (org-todo (length org-todo-keywords)))
- (const :tag "Cycle TODO" org-todo)
- (const :tag "Promote subtree" org-promote-subtree)
- (const :tag "Demote subtree" org-demote-subtree)
- (const :tag "Set Tags" org-set-tags)
- (const :tag "Schedule" org-schedule)
- (const :tag "Set Deadline" org-schedule)
- (sexp))
- (boolean :tag "Confirm"))))
- (defun org-fastup-check-buffer ()
- "Check for and execute fastupdate actions.
- This first checks if there are any fastupdate actions in the buffer.
- If yes, the user is asked for a processing mode, with three possibilities
- with respect to confirming actions:
- Always confirm each action before executing it
- Never execute all actions without prior confirmation
- Maybe get only confirmation for actions that have been configured
- as requiring confirmation in `org-fastup-action-alist'.
- The command will then walk through the buffer, stop at each eaction
- and do the right thing there."
- (interactive)
- (show-all) ; make everything visible
- (let ((start (point-min))
- ;; FIXME: should I limit the regexp to match existing actions?
- ;; I think not, to catch typos
- (re "^\\([-a-zA-Z0-9!@#$%^&+?<>]\\)\\*+")
- s action confirm)
- (if (not (save-excursion
- (goto-char (point-min))
- (re-search-forward re nil t)))
- (if (interactive-p) (message "No fastupdate actions in this buffer"))
- (goto-char start)
- (message "Fastupdate: Confirm actions [A]lways [Maybe] [N]ever, or [Q]uit?")
- (setq reaction (read-char-exclusive))
- (cond
- ((memq reaction '(?q ?Q)) (error "Abort"))
- ((memq reaction '(?a ?A)) (setq cf 'always))
- ((memq reaction '(?m ?M)) (setq cf 'maybe))
- ((memq reaction '(?n ?N)) (setq cf 'never)))
- (while (re-search-forward re nil t)
- (goto-char (setq start (match-beginning 0)))
- (setq s (match-string 1)
- entry (assoc (string-to-char s) org-fastup-action-alist)
- action (nth 1 entry)
- confirm (nth 2 entry))
- (cond
- ((null action)
- (if (y-or-n-p "Unknown action. Remove fastupdate character? ")
- (delete-region start (1+ start))
- (goto-char (1+ start))))
- ((or (equal cf 'never)
- (and (eq cf 'maybe) (not confirm))
- (y-or-n-p (format "execute action [%s] " s)))
- (delete-region start (1+ start))
- ;; FIXME: wrap the following into condition-case and
- ;; handle any errors in some way.
- (if (symbolp action) (funcall action) (eval action))
- ;; FIXME: remove the sit-for
- (sit-for 2))
- (t
- (if (y-or-n-p "Action denied. Remove fastupdate character? ")
- ;; Remove the character, without action.
- (delete-region start (1+ start))
- ;; Just leave the character in and skip this location
- (goto-char (1+ start)))))))))
|