Browse Source

Hooks: New system to tap into context-sensitive keys

Org-mode has many context-sensitive keys.  A new hook system now
allows add-ons to add functionality to these keys for contexts that
are special for the add-on.

For example, if an add-on wants to use C-c C-c in a special context,
if must add a function to `org-ctrl-c-ctrl-c-hook' that will check for
the context and run its command when the context is present.
Carsten Dominik 16 years ago
parent
commit
1f1574c9a2
2 changed files with 59 additions and 0 deletions
  1. 7 0
      lisp/ChangeLog
  2. 52 0
      lisp/org.el

+ 7 - 0
lisp/ChangeLog

@@ -1,6 +1,13 @@
 2009-02-13  Carsten Dominik  <carsten.dominik@gmail.com>
 2009-02-13  Carsten Dominik  <carsten.dominik@gmail.com>
 
 
 	* org.el ("org-plot"): Help loading org-plot.
 	* org.el ("org-plot"): Help loading org-plot.
+	(org-metaleft-hook, org-metaright-hook, org-metaup-hook)
+	(org-metadown-hook, org-shiftmetaleft-hook)
+	(org-shiftmetaright-hook, org-shiftmetaup-hook)
+	(org-shiftmetadown-hook, org-metareturn-hook): New hooks.
+	(org-shiftmetaleft, org-shiftmetaright, org-shiftmetaup)
+	(org-shiftmetadown, org-metaleft, org-metaright, org-metaup)
+	(org-metadown, org-ctrl-c-ctrl-c): Call the appropriate hook.
 
 
 	* org-publish.el (org-publish-get-base-files): Allow symbol `any'
 	* org-publish.el (org-publish-get-base-files): Allow symbol `any'
 	for selecting files with any (and even without) extension.
 	for selecting files with any (and even without) extension.

+ 52 - 0
lisp/org.el

@@ -13266,6 +13266,43 @@ COMMANDS is a list of alternating OLDDEF NEWDEF command names."
 	     'delete-backward-char 'org-delete-backward-char)
 	     'delete-backward-char 'org-delete-backward-char)
   (org-defkey org-mode-map "|" 'org-force-self-insert))
   (org-defkey org-mode-map "|" 'org-force-self-insert))
 
 
+(defvar org-ctrl-c-ctrl-c-hook nil
+  "Hook for functions attaching themselves to  `C-c C-c'.
+This can be used to add additional functionality to the C-c C-c key which
+executes context-dependent commands.
+Each function will be called with no arguments.  The function must check
+if the context is appropriate for it to act.  If yes, it should do its
+thing and then return a non-nil value.  If the context is wrong,
+just do nothing.")
+
+(defvar org-metaleft-hook nil
+  "Hook for functions attaching themselves to `M-left'.
+See `org-ctrl-c-ctrl-c-hook' for more information.")
+(defvar org-metaright-hook nil
+  "Hook for functions attaching themselves to `M-right'.
+See `org-ctrl-c-ctrl-c-hook' for more information.")
+(defvar org-metaup-hook nil
+  "Hook for functions attaching themselves to `M-up'.
+See `org-ctrl-c-ctrl-c-hook' for more information.")
+(defvar org-metadown-hook nil
+  "Hook for functions attaching themselves to `M-down'.
+See `org-ctrl-c-ctrl-c-hook' for more information.")
+(defvar org-shiftmetaleft-hook nil
+  "Hook for functions attaching themselves to `M-S-left'.
+See `org-ctrl-c-ctrl-c-hook' for more information.")
+(defvar org-shiftmetaright-hook nil
+  "Hook for functions attaching themselves to `M-S-right'.
+See `org-ctrl-c-ctrl-c-hook' for more information.")
+(defvar org-shiftmetaup-hook nil
+  "Hook for functions attaching themselves to `M-S-up'.
+See `org-ctrl-c-ctrl-c-hook' for more information.")
+(defvar org-shiftmetadown-hook nil
+  "Hook for functions attaching themselves to `M-S-down'.
+See `org-ctrl-c-ctrl-c-hook' for more information.")
+(defvar org-metareturn-hook nil
+  "Hook for functions attaching themselves to `M-RET'.
+See `org-ctrl-c-ctrl-c-hook' for more information.")
+
 (defun org-modifier-cursor-error ()
 (defun org-modifier-cursor-error ()
   "Throw an error, a modified cursor command was applied in wrong context."
   "Throw an error, a modified cursor command was applied in wrong context."
   (error "This command is active in special context like tables, headlines or items"))
   (error "This command is active in special context like tables, headlines or items"))
@@ -13301,6 +13338,7 @@ or `org-table-delete-column', depending on context.
 See the individual commands for more information."
 See the individual commands for more information."
   (interactive)
   (interactive)
   (cond
   (cond
+   ((run-hook-with-args-until-success 'org-shiftmetaleft-hook))
    ((org-at-table-p) (call-interactively 'org-table-delete-column))
    ((org-at-table-p) (call-interactively 'org-table-delete-column))
    ((org-on-heading-p) (call-interactively 'org-promote-subtree))
    ((org-on-heading-p) (call-interactively 'org-promote-subtree))
    ((org-at-item-p) (call-interactively 'org-outdent-item))
    ((org-at-item-p) (call-interactively 'org-outdent-item))
@@ -13313,6 +13351,7 @@ or `org-table-insert-column', depending on context.
 See the individual commands for more information."
 See the individual commands for more information."
   (interactive)
   (interactive)
   (cond
   (cond
+   ((run-hook-with-args-until-success 'org-shiftmetaright-hook))
    ((org-at-table-p) (call-interactively 'org-table-insert-column))
    ((org-at-table-p) (call-interactively 'org-table-insert-column))
    ((org-on-heading-p) (call-interactively 'org-demote-subtree))
    ((org-on-heading-p) (call-interactively 'org-demote-subtree))
    ((org-at-item-p) (call-interactively 'org-indent-item))
    ((org-at-item-p) (call-interactively 'org-indent-item))
@@ -13325,10 +13364,12 @@ Calls `org-move-subtree-up' or `org-table-kill-row' or
 for more information."
 for more information."
   (interactive "P")
   (interactive "P")
   (cond
   (cond
+   ((run-hook-with-args-until-success 'org-shiftmetaup-hook))
    ((org-at-table-p) (call-interactively 'org-table-kill-row))
    ((org-at-table-p) (call-interactively 'org-table-kill-row))
    ((org-on-heading-p) (call-interactively 'org-move-subtree-up))
    ((org-on-heading-p) (call-interactively 'org-move-subtree-up))
    ((org-at-item-p) (call-interactively 'org-move-item-up))
    ((org-at-item-p) (call-interactively 'org-move-item-up))
    (t (org-modifier-cursor-error))))
    (t (org-modifier-cursor-error))))
+
 (defun org-shiftmetadown (&optional arg)
 (defun org-shiftmetadown (&optional arg)
   "Move subtree down or insert table row.
   "Move subtree down or insert table row.
 Calls `org-move-subtree-down' or `org-table-insert-row' or
 Calls `org-move-subtree-down' or `org-table-insert-row' or
@@ -13336,6 +13377,7 @@ Calls `org-move-subtree-down' or `org-table-insert-row' or
 commands for more information."
 commands for more information."
   (interactive "P")
   (interactive "P")
   (cond
   (cond
+   ((run-hook-with-args-until-success 'org-shiftmetadown-hook))
    ((org-at-table-p) (call-interactively 'org-table-insert-row))
    ((org-at-table-p) (call-interactively 'org-table-insert-row))
    ((org-on-heading-p) (call-interactively 'org-move-subtree-down))
    ((org-on-heading-p) (call-interactively 'org-move-subtree-down))
    ((org-at-item-p) (call-interactively 'org-move-item-down))
    ((org-at-item-p) (call-interactively 'org-move-item-down))
@@ -13348,6 +13390,7 @@ With no specific context, calls the Emacs default `backward-word'.
 See the individual commands for more information."
 See the individual commands for more information."
   (interactive "P")
   (interactive "P")
   (cond
   (cond
+   ((run-hook-with-args-until-success 'org-metaleft-hook))
    ((org-at-table-p) (org-call-with-arg 'org-table-move-column 'left))
    ((org-at-table-p) (org-call-with-arg 'org-table-move-column 'left))
    ((or (org-on-heading-p) (org-region-active-p))
    ((or (org-on-heading-p) (org-region-active-p))
     (call-interactively 'org-do-promote))
     (call-interactively 'org-do-promote))
@@ -13361,6 +13404,7 @@ With no specific context, calls the Emacs default `forward-word'.
 See the individual commands for more information."
 See the individual commands for more information."
   (interactive "P")
   (interactive "P")
   (cond
   (cond
+   ((run-hook-with-args-until-success 'org-metaright-hook))
    ((org-at-table-p) (call-interactively 'org-table-move-column))
    ((org-at-table-p) (call-interactively 'org-table-move-column))
    ((or (org-on-heading-p) (org-region-active-p))
    ((or (org-on-heading-p) (org-region-active-p))
     (call-interactively 'org-do-demote))
     (call-interactively 'org-do-demote))
@@ -13374,6 +13418,7 @@ Calls `org-move-subtree-up' or `org-table-move-row' or
 for more information."
 for more information."
   (interactive "P")
   (interactive "P")
   (cond
   (cond
+   ((run-hook-with-args-until-success 'org-metaup-hook))
    ((org-at-table-p) (org-call-with-arg 'org-table-move-row 'up))
    ((org-at-table-p) (org-call-with-arg 'org-table-move-row 'up))
    ((org-on-heading-p) (call-interactively 'org-move-subtree-up))
    ((org-on-heading-p) (call-interactively 'org-move-subtree-up))
    ((org-at-item-p) (call-interactively 'org-move-item-up))
    ((org-at-item-p) (call-interactively 'org-move-item-up))
@@ -13386,6 +13431,7 @@ Calls `org-move-subtree-down' or `org-table-move-row' or
 commands for more information."
 commands for more information."
   (interactive "P")
   (interactive "P")
   (cond
   (cond
+   ((run-hook-with-args-until-success 'org-metadown-hook))
    ((org-at-table-p) (call-interactively 'org-table-move-row))
    ((org-at-table-p) (call-interactively 'org-table-move-row))
    ((org-on-heading-p) (call-interactively 'org-move-subtree-down))
    ((org-on-heading-p) (call-interactively 'org-move-subtree-down))
    ((org-at-item-p) (call-interactively 'org-move-item-down))
    ((org-at-item-p) (call-interactively 'org-move-item-down))
@@ -13569,11 +13615,15 @@ When in an #+include line, visit the include file.  Otherwise call
    ((org-edit-fixed-width-region))
    ((org-edit-fixed-width-region))
    (t (call-interactively 'ffap))))
    (t (call-interactively 'ffap))))
 
 
+
 (defun org-ctrl-c-ctrl-c (&optional arg)
 (defun org-ctrl-c-ctrl-c (&optional arg)
   "Set tags in headline, or update according to changed information at point.
   "Set tags in headline, or update according to changed information at point.
 
 
 This command does many different things, depending on context:
 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 in a headline, prompt for tags and insert them
 - If the cursor is in a headline, prompt for tags and insert them
   into the current line, aligned to `org-tags-column'.  When called
   into the current line, aligned to `org-tags-column'.  When called
   with prefix arg, realign all tags in the current buffer.
   with prefix arg, realign all tags in the current buffer.
@@ -13621,6 +13671,7 @@ This command does many different things, depending on context:
      ((and (local-variable-p 'org-finish-function (current-buffer))
      ((and (local-variable-p 'org-finish-function (current-buffer))
 	   (fboundp org-finish-function))
 	   (fboundp org-finish-function))
       (funcall org-finish-function))
       (funcall org-finish-function))
+     ((run-hook-with-args-until-success 'org-ctrl-c-ctrl-c-hook))
      ((org-at-property-p)
      ((org-at-property-p)
       (call-interactively 'org-property-action))
       (call-interactively 'org-property-action))
      ((org-on-target-p) (call-interactively 'org-update-radio-target-regexp))
      ((org-on-target-p) (call-interactively 'org-update-radio-target-regexp))
@@ -13834,6 +13885,7 @@ Calls `org-insert-heading' or `org-table-wrap-region', depending on context.
 See the individual commands for more information."
 See the individual commands for more information."
   (interactive "P")
   (interactive "P")
   (cond
   (cond
+   ((run-hook-with-args-until-success 'org-metareturn-hook))
    ((org-at-table-p)
    ((org-at-table-p)
     (call-interactively 'org-table-wrap-region))
     (call-interactively 'org-table-wrap-region))
    (t (call-interactively 'org-insert-heading))))
    (t (call-interactively 'org-insert-heading))))