summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2009-09-30 13:17:02 +0000
committerBram Moolenaar <Bram@vim.org>2009-09-30 13:17:02 +0000
commitda9591ecfd31fab84e9fbca393b198e4de2de880 (patch)
tree00528af3b2273cc6fd6e33db83d99c883701a3dc
parentbecf428bc0ac7f7c5c1cc9e3213c025655c0beea (diff)
updated for version 7.2-266v7.2.266
-rw-r--r--runtime/doc/map.txt4
-rw-r--r--src/eval.c25
-rw-r--r--src/getchar.c12
-rw-r--r--src/ops.c17
-rw-r--r--src/proto/eval.pro1
-rw-r--r--src/version.c2
6 files changed, 40 insertions, 21 deletions
diff --git a/runtime/doc/map.txt b/runtime/doc/map.txt
index 607295779e..e7b93787c9 100644
--- a/runtime/doc/map.txt
+++ b/runtime/doc/map.txt
@@ -224,6 +224,10 @@ expression is evaluated to obtain the {rhs} that is used. Example: >
The result of the InsertDot() function will be inserted. It could check the
text before the cursor and start omni completion when some condition is met.
+For abbreviations |v:char| is set to the character that was typed to trigger
+the abbreviation. You can use this to decide how to expand the {lhs}. You
+can't change v:char and you should not insert it.
+
Be very careful about side effects! The expression is evaluated while
obtaining characters, you may very well make the command dysfunctional.
For this reason the following is blocked:
diff --git a/src/eval.c b/src/eval.c
index f94178d664..a48e152937 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -18101,6 +18101,31 @@ get_vim_var_list(idx)
}
/*
+ * Set v:char to character "c".
+ */
+ void
+set_vim_var_char(c)
+ int c;
+{
+#ifdef FEAT_MBYTE
+ char_u buf[MB_MAXBYTES];
+#else
+ char_u buf[2];
+#endif
+
+#ifdef FEAT_MBYTE
+ if (has_mbyte)
+ buf[(*mb_char2bytes)(c, buf)] = NUL;
+ else
+#endif
+ {
+ buf[0] = c;
+ buf[1] = NUL;
+ }
+ set_vim_var_string(VV_CHAR, buf, -1);
+}
+
+/*
* Set v:count to "count" and v:count1 to "count1".
* When "set_prevcount" is TRUE first set v:prevcount from v:count.
*/
diff --git a/src/getchar.c b/src/getchar.c
index e81f7cb563..b39ff74a36 100644
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -129,7 +129,7 @@ static void map_free __ARGS((mapblock_T **));
static void validate_maphash __ARGS((void));
static void showmap __ARGS((mapblock_T *mp, int local));
#ifdef FEAT_EVAL
-static char_u *eval_map_expr __ARGS((char_u *str));
+static char_u *eval_map_expr __ARGS((char_u *str, int c));
#endif
/*
@@ -2446,7 +2446,7 @@ vgetorpeek(advance)
if (tabuf.typebuf_valid)
{
vgetc_busy = 0;
- s = eval_map_expr(mp->m_str);
+ s = eval_map_expr(mp->m_str, NUL);
vgetc_busy = save_vgetc_busy;
}
else
@@ -4367,9 +4367,9 @@ check_abbr(c, ptr, col, mincol)
* abbreviation, but is not inserted into the input stream.
*/
j = 0;
- /* special key code, split up */
if (c != Ctrl_RSB)
{
+ /* special key code, split up */
if (IS_SPECIAL(c) || c == K_SPECIAL)
{
tb[j++] = K_SPECIAL;
@@ -4398,7 +4398,7 @@ check_abbr(c, ptr, col, mincol)
}
#ifdef FEAT_EVAL
if (mp->m_expr)
- s = eval_map_expr(mp->m_str);
+ s = eval_map_expr(mp->m_str, c);
else
#endif
s = mp->m_str;
@@ -4434,8 +4434,9 @@ check_abbr(c, ptr, col, mincol)
* special characters.
*/
static char_u *
-eval_map_expr(str)
+eval_map_expr(str, c)
char_u *str;
+ int c; /* NUL or typed character for abbreviation */
{
char_u *res;
char_u *p;
@@ -4452,6 +4453,7 @@ eval_map_expr(str)
#ifdef FEAT_EX_EXTRA
++ex_normal_lock;
#endif
+ set_vim_var_char(c); /* set v:char to the typed character */
save_cursor = curwin->w_cursor;
p = eval_to_string(str, NULL, FALSE);
--textlock;
diff --git a/src/ops.c b/src/ops.c
index f75613def2..b21f4c2509 100644
--- a/src/ops.c
+++ b/src/ops.c
@@ -4473,11 +4473,6 @@ fex_format(lnum, count, c)
int use_sandbox = was_set_insecurely((char_u *)"formatexpr",
OPT_LOCAL);
int r;
-#ifdef FEAT_MBYTE
- char_u buf[MB_MAXBYTES];
-#else
- char_u buf[2];
-#endif
/*
* Set v:lnum to the first line number and v:count to the number of lines.
@@ -4485,17 +4480,7 @@ fex_format(lnum, count, c)
*/
set_vim_var_nr(VV_LNUM, lnum);
set_vim_var_nr(VV_COUNT, count);
-
-#ifdef FEAT_MBYTE
- if (has_mbyte)
- buf[(*mb_char2bytes)(c, buf)] = NUL;
- else
-#endif
- {
- buf[0] = c;
- buf[1] = NUL;
- }
- set_vim_var_string(VV_CHAR, buf, -1);
+ set_vim_var_char(c);
/*
* Evaluate the function.
diff --git a/src/proto/eval.pro b/src/proto/eval.pro
index 362b9d90fe..d520046769 100644
--- a/src/proto/eval.pro
+++ b/src/proto/eval.pro
@@ -61,6 +61,7 @@ void set_vim_var_nr __ARGS((int idx, long val));
long get_vim_var_nr __ARGS((int idx));
char_u *get_vim_var_str __ARGS((int idx));
list_T *get_vim_var_list __ARGS((int idx));
+void set_vim_var_char __ARGS((int c));
void set_vcount __ARGS((long count, long count1, int set_prevcount));
void set_vim_var_string __ARGS((int idx, char_u *val, int len));
void set_vim_var_list __ARGS((int idx, list_T *val));
diff --git a/src/version.c b/src/version.c
index 3102a6fec1..1a7e765271 100644
--- a/src/version.c
+++ b/src/version.c
@@ -677,6 +677,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 266,
+/**/
265,
/**/
264,