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.
This commit is contained in:
Carsten Dominik 2009-02-13 22:59:37 +01:00
parent 29ff144600
commit 1f1574c9a2
2 changed files with 59 additions and 0 deletions

View File

@ -1,6 +1,13 @@
2009-02-13 Carsten Dominik <carsten.dominik@gmail.com>
* 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'
for selecting files with any (and even without) extension.

View File

@ -13266,6 +13266,43 @@ COMMANDS is a list of alternating OLDDEF NEWDEF command names."
'delete-backward-char 'org-delete-backward-char)
(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 ()
"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"))
@ -13301,6 +13338,7 @@ or `org-table-delete-column', depending on context.
See the individual commands for more information."
(interactive)
(cond
((run-hook-with-args-until-success 'org-shiftmetaleft-hook))
((org-at-table-p) (call-interactively 'org-table-delete-column))
((org-on-heading-p) (call-interactively 'org-promote-subtree))
((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."
(interactive)
(cond
((run-hook-with-args-until-success 'org-shiftmetaright-hook))
((org-at-table-p) (call-interactively 'org-table-insert-column))
((org-on-heading-p) (call-interactively 'org-demote-subtree))
((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."
(interactive "P")
(cond
((run-hook-with-args-until-success 'org-shiftmetaup-hook))
((org-at-table-p) (call-interactively 'org-table-kill-row))
((org-on-heading-p) (call-interactively 'org-move-subtree-up))
((org-at-item-p) (call-interactively 'org-move-item-up))
(t (org-modifier-cursor-error))))
(defun org-shiftmetadown (&optional arg)
"Move subtree down or insert table row.
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."
(interactive "P")
(cond
((run-hook-with-args-until-success 'org-shiftmetadown-hook))
((org-at-table-p) (call-interactively 'org-table-insert-row))
((org-on-heading-p) (call-interactively 'org-move-subtree-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."
(interactive "P")
(cond
((run-hook-with-args-until-success 'org-metaleft-hook))
((org-at-table-p) (org-call-with-arg 'org-table-move-column 'left))
((or (org-on-heading-p) (org-region-active-p))
(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."
(interactive "P")
(cond
((run-hook-with-args-until-success 'org-metaright-hook))
((org-at-table-p) (call-interactively 'org-table-move-column))
((or (org-on-heading-p) (org-region-active-p))
(call-interactively 'org-do-demote))
@ -13374,6 +13418,7 @@ Calls `org-move-subtree-up' or `org-table-move-row' or
for more information."
(interactive "P")
(cond
((run-hook-with-args-until-success 'org-metaup-hook))
((org-at-table-p) (org-call-with-arg 'org-table-move-row 'up))
((org-on-heading-p) (call-interactively 'org-move-subtree-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."
(interactive "P")
(cond
((run-hook-with-args-until-success 'org-metadown-hook))
((org-at-table-p) (call-interactively 'org-table-move-row))
((org-on-heading-p) (call-interactively 'org-move-subtree-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))
(t (call-interactively 'ffap))))
(defun org-ctrl-c-ctrl-c (&optional arg)
"Set tags in headline, or update according to changed information at point.
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
into the current line, aligned to `org-tags-column'. When called
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))
(fboundp org-finish-function))
(funcall org-finish-function))
((run-hook-with-args-until-success 'org-ctrl-c-ctrl-c-hook))
((org-at-property-p)
(call-interactively 'org-property-action))
((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."
(interactive "P")
(cond
((run-hook-with-args-until-success 'org-metareturn-hook))
((org-at-table-p)
(call-interactively 'org-table-wrap-region))
(t (call-interactively 'org-insert-heading))))