summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarsten Dominik <carsten.dominik@gmail.com>2009-02-13 22:59:37 +0100
committerCarsten Dominik <carsten.dominik@gmail.com>2009-02-13 22:59:37 +0100
commit1f1574c9a2a3562299d40ceaaceb804ab1ab4831 (patch)
tree275da3381faaf7dbbb1f89f2c26e93d564ca8085
parent29ff1446003593472769bb6ea846b23f66eec56c (diff)
downloadorg-mode-1f1574c9a2a3562299d40ceaaceb804ab1ab4831.tar.gz
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.
-rwxr-xr-xlisp/ChangeLog7
-rw-r--r--lisp/org.el52
2 files changed, 59 insertions, 0 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 294a566..49aa38a 100755
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -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.
diff --git a/lisp/org.el b/lisp/org.el
index e004ac3..e6fcd6a 100644
--- a/lisp/org.el
+++ b/lisp/org.el
@@ -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))))