From: Frank Terbeck <ft@bewatermyfriend.org>
To: zsh-workers@zsh.org
Subject: PATCH: (2/4) vcs_info: Add functions to add/remove static hooks
Date: Wed, 30 Mar 2011 22:37:14 +0200 [thread overview]
Message-ID: <1301517436-11451-3-git-send-email-ft@bewatermyfriend.org> (raw)
In-Reply-To: <1301517436-11451-1-git-send-email-ft@bewatermyfriend.org>
---
Doc/Zsh/contrib.yo | 28 +++++++++++++++++++++-
Functions/VCS_Info/.distfiles | 2 +
Functions/VCS_Info/vcs_info | 2 +
Functions/VCS_Info/vcs_info_hookadd | 22 +++++++++++++++++
Functions/VCS_Info/vcs_info_hookdel | 45 +++++++++++++++++++++++++++++++++++
5 files changed, 98 insertions(+), 1 deletions(-)
create mode 100644 Functions/VCS_Info/vcs_info_hookadd
create mode 100644 Functions/VCS_Info/vcs_info_hookdel
diff --git a/Doc/Zsh/contrib.yo b/Doc/Zsh/contrib.yo
index 81167bf..5c82c5d 100644
--- a/Doc/Zsh/contrib.yo
+++ b/Doc/Zsh/contrib.yo
@@ -1117,6 +1117,24 @@ tt(Variable description) below). If an argument is given, that string will be
used instead of tt(default) in the tt(user-context) field of the style
context.
)
+findex(vcs_info_hookadd)
+item(tt(vcs_info_hookadd))(
+Statically registers a number of functions to a given hook. The hook needs
+to be given as the first argument; what follows is a list of hook-function
+names to register to the hook. The `tt(+vi-)' prefix needs to be left out
+here. See tt(Hooks in vcs_info) below for details.
+)
+findex(vcs_info_hookdel)
+item(tt(vcs_info_hookdel))(
+Remove hook-functions from a given hook. The hook needs to be given as the
+first non-option argument; what follows is a list of hook-function
+names to un-register from the hook. If `tt(-a)' is used as the first
+argument, tt(all) occurances of the functions are unregistered. Otherwise
+only the last occurance is removed (if a function was registered to a hook
+more than once) . The `tt(+vi-)' prefix needs to be left out here. See
+tt(Hooks in vcs_info) below for details.
+)
+findex(vcs_info_lastmsg)
item(tt(vcs_info_lastmsg))(
Outputs the last var(${vcs_info_msg_*_}) value.
Takes into account the value of the tt(use-prompt-escapes) style in
@@ -1129,6 +1147,7 @@ Prints a list of all
supported version control systems. Useful to find out possible contexts
(and which of them are enabled) or values for the var(disable) style.
)
+findex(vcs_info_setsys)
item(tt(vcs_info_setsys))(
Initializes var(vcs_info)'s internal list of
available backends. With this function, you can add support for new VCSs
@@ -1176,13 +1195,20 @@ avoid namespace problems, all registered function names are prepended by
a `+vi-', so the actual functions called for the `foo' hook are
`tt(+vi-bar)' and `tt(+vi-baz)'.
+If you would like to register a function to a hook regardless of the
+current context, you may use the var(vcs_info_hookadd) function. To remove
+a function that was added like that, the var(vcs_info_hookdel) function
+can be used.
+
If something seems weird, you can enable the `debug' boolean style in
the proper context and the hook-calling code will print what it tried
to execute and whether the function in question existed.
When you register more than one function to a hook, all functions are
executed one after another until one function returns non-zero or until
-all functions have been called.
+all functions have been called. Context-sensitive hook functions are
+executed tt(before) statically registered ones (the ones added by
+var(vcs_info_hookadd)).
You may pass data between functions via an associative array, tt(user_data).
For example:
diff --git a/Functions/VCS_Info/.distfiles b/Functions/VCS_Info/.distfiles
index 988e7ad..b6e55d2 100644
--- a/Functions/VCS_Info/.distfiles
+++ b/Functions/VCS_Info/.distfiles
@@ -1,6 +1,8 @@
DISTFILES_SRC='
.distfiles
vcs_info
+vcs_info_hookadd
+vcs_info_hookdel
VCS_INFO_adjust
VCS_INFO_bydir_detect
VCS_INFO_check_com
diff --git a/Functions/VCS_Info/vcs_info b/Functions/VCS_Info/vcs_info
index 6ce1cd7..385a451 100644
--- a/Functions/VCS_Info/vcs_info
+++ b/Functions/VCS_Info/vcs_info
@@ -26,6 +26,8 @@ static_functions=(
VCS_INFO_reposub
VCS_INFO_set
+ vcs_info_hookadd
+ vcs_info_hookdel
vcs_info_lastmsg
vcs_info_printsys
vcs_info_setsys
diff --git a/Functions/VCS_Info/vcs_info_hookadd b/Functions/VCS_Info/vcs_info_hookadd
new file mode 100644
index 0000000..867f7e2
--- /dev/null
+++ b/Functions/VCS_Info/vcs_info_hookadd
@@ -0,0 +1,22 @@
+## vim:ft=zsh
+## Written by Frank Terbeck <ft@bewatermyfriend.org>
+## Distributed under the same BSD-ish license as zsh itself.
+
+emulate -L zsh
+setopt extendedglob
+
+if (( ${#argv} < 2 )); then
+ print 'usage: vcs_info_hookadd <HOOK> <FUNCTION(s)...>'
+ return 1
+fi
+
+local hook func context
+local -a old
+
+hook=$1
+shift
+context=":vcs_info-static_hooks:${hook}"
+
+zstyle -a "${context}" hooks old
+zstyle "${context}" hooks "${old[@]}" "$@"
+return $?
diff --git a/Functions/VCS_Info/vcs_info_hookdel b/Functions/VCS_Info/vcs_info_hookdel
new file mode 100644
index 0000000..e09a057
--- /dev/null
+++ b/Functions/VCS_Info/vcs_info_hookdel
@@ -0,0 +1,45 @@
+## vim:ft=zsh
+## Written by Frank Terbeck <ft@bewatermyfriend.org>
+## Distributed under the same BSD-ish license as zsh itself.
+
+emulate -L zsh
+setopt extendedglob
+
+local -i all
+
+if [[ "x$1" == 'x-a' ]]; then
+ all=1
+ shift
+else
+ all=0
+fi
+
+if (( ${#argv} < 2 )); then
+ print 'usage: vcs_info_hookdel [-a] <HOOK> <FUNCTION(s)...>'
+ return 1
+fi
+
+local hook func context
+local -a old
+
+hook=$1
+shift
+context=":vcs_info-static_hooks:${hook}"
+
+zstyle -a "${context}" hooks old || return 0
+for func in "$@"; do
+ if [[ -n ${(M)old:#$func} ]]; then
+ old[(Re)$func]=()
+ else
+ printf 'Not statically registered to `%s'\'': "%s"\n' \
+ "${hook}" "${func}"
+ continue
+ fi
+ if (( all )); then
+ while [[ -n ${(M)old:#$func} ]]; do
+ old[(Re)$func]=()
+ done
+ fi
+done
+zstyle "${context}" hooks "${old[@]}"
+return $?
--
1.7.4.1.140.g89781
next prev parent reply other threads:[~2011-03-30 20:53 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-03-30 20:37 PATCH: (0/4) Frank Terbeck
2011-03-30 20:37 ` PATCH: (1/4) vcs_info: Support registering hooks independent of the context Frank Terbeck
2011-03-30 20:37 ` Frank Terbeck [this message]
2011-03-30 20:37 ` PATCH: (3/4) vcs_info: Add `no-vcs' hook Frank Terbeck
2011-03-30 20:37 ` PATCH: (4/4) vcs_info: nvcsformats style should be used if the system is disabled Frank Terbeck
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1301517436-11451-3-git-send-email-ft@bewatermyfriend.org \
--to=ft@bewatermyfriend.org \
--cc=zsh-workers@zsh.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).