summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2010-08-11 12:48:19 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2010-08-11 12:48:19 +0000
commit80eee3a4a336a0a91d73be5cd752d5f788661d4b (patch)
tree0c9223f272a769653385e5a080e4a0f20459df06
parent0bb608abc417f5dea96d2fc7e65ac125b5153f83 (diff)
downloadzsh-80eee3a4a336a0a91d73be5cd752d5f788661d4b.tar.gz
zsh-80eee3a4a336a0a91d73be5cd752d5f788661d4b.zip
28122 (Frank) / 28139: add ZLE_STATE
-rw-r--r--ChangeLog7
-rw-r--r--Doc/Zsh/zle.yo11
-rw-r--r--Src/Zle/zle_params.c60
3 files changed, 77 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 3d84a1919..b16698d5b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2010-08-11 Peter Stephenson <pws@csr.com>
+
+ * 28139: based on Frank Terbeck: 28122: Src/Zle/zle_params.c,
+ Doc/Zsh/zle.yo: add ZLE_STATE variable.
+
2010-08-10 Clint Adams <clint@zsh.org>
* unposted: Functions/Newuser/zsh-newuser-install: tweak
@@ -13513,5 +13518,5 @@
*****************************************************
* This is used by the shell to define $ZSH_PATCHLEVEL
-* $Revision: 1.5054 $
+* $Revision: 1.5055 $
*****************************************************
diff --git a/Doc/Zsh/zle.yo b/Doc/Zsh/zle.yo
index 0e2fea5bd..722232835 100644
--- a/Doc/Zsh/zle.yo
+++ b/Doc/Zsh/zle.yo
@@ -854,6 +854,17 @@ executed; the second argument that followed tt(zle -C) when the widget was
defined. This is the name of a builtin completion widget. For widgets
defined with tt(zle -N) this is set to the empty string. Read-only.
)
+vindex(ZLE_STATE)
+item(tt(ZLE_STATE) (scalar))(
+Contains a set of space-separated words that describe the current tt(zle)
+state.
+
+Currently, the only state shown is the insert mode as set by the
+tt(overwrite-mode) or tt(vi-replace) widgets. The string contains
+`tt(insert)' if characters to be inserted on the command line move existing
+characters to the right, `tt(overwrite)' if characters to be inserted
+overwrite existing characters.
+)
enditem()
subsect(Special Widgets)
diff --git a/Src/Zle/zle_params.c b/Src/Zle/zle_params.c
index 2883c0fbd..1a23d3c67 100644
--- a/Src/Zle/zle_params.c
+++ b/Src/Zle/zle_params.c
@@ -76,6 +76,8 @@ static const struct gsu_scalar widgetfunc_gsu =
{ get_widgetfunc, nullstrsetfn, zleunsetfn };
static const struct gsu_scalar widgetstyle_gsu =
{ get_widgetstyle, nullstrsetfn, zleunsetfn };
+static const struct gsu_scalar zle_state_gsu =
+{ get_zle_state, nullstrsetfn, zleunsetfn };
static const struct gsu_integer bufferlines_gsu =
{ get_bufferlines, NULL, zleunsetfn };
@@ -134,6 +136,7 @@ static struct zleparam {
{ "WIDGET", PM_SCALAR | PM_READONLY, GSU(widget_gsu), NULL },
{ "WIDGETFUNC", PM_SCALAR | PM_READONLY, GSU(widgetfunc_gsu), NULL },
{ "WIDGETSTYLE", PM_SCALAR | PM_READONLY, GSU(widgetstyle_gsu), NULL },
+ { "ZLE_STATE", PM_SCALAR | PM_READONLY, GSU(zle_state_gsu), NULL },
{ NULL, 0, NULL, NULL }
};
@@ -695,3 +698,60 @@ get_context(UNUSED(Param pm))
break;
}
}
+
+/**/
+static char *
+get_zle_state(UNUSED(Param pm))
+{
+ char *zle_state = NULL, *ptr = NULL;
+ int itp, istate, len = 0;
+
+ /*
+ * When additional substrings are added, they should be kept in
+ * alphabetical order, so the user can easily match against this
+ * parameter: if [[ $ZLE_STATE == *bar*foo*zonk* ]]; then ...; fi
+ */
+ for (itp = 0; itp < 2; itp++) {
+ char *str;
+ /*
+ * Currently there is only one state: insert or overwrite.
+ * This loop is to make it easy to add others.
+ */
+ for (istate = 0; istate < 1; istate++) {
+ int slen;
+ switch (istate) {
+ case 0:
+ if (insmode) {
+ str = "insert";
+ } else {
+ str = "overwrite";
+ }
+ break;
+
+ default:
+ str = "";
+ }
+ slen = strlen(str);
+ if (itp == 0) {
+ /* Accumulating length */
+ if (istate)
+ len++; /* for space */
+ len += slen;
+ } else {
+ /* Accumulating string */
+ if (istate)
+ *ptr++ = ' ';
+ memcpy(ptr, str, slen);
+ ptr += slen;
+ }
+ }
+ if (itp == 0) {
+ len++; /* terminating NULL */
+ ptr = zle_state = (char *)zhalloc(len);
+ } else {
+ *ptr = '\0';
+ }
+ }
+
+ return zle_state;
+}