updated for version 7.0220
diff --git a/runtime/doc/map.txt b/runtime/doc/map.txt
index 7a194cc..228b9a9 100644
--- a/runtime/doc/map.txt
+++ b/runtime/doc/map.txt
@@ -1,4 +1,4 @@
-*map.txt* For Vim version 7.0aa. Last change: 2006 Mar 06
+*map.txt* For Vim version 7.0aa. Last change: 2006 Mar 10
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -145,6 +145,9 @@
1.2 SPECIAL ARGUMENTS *:map-arguments*
+"<buffer>", "<silent>", "<script>", "<expr>" and "<unique>" can be used in any
+order. They must appear right after the command, before any other arguments.
+
*:map-local* *:map-<buffer>* *E224* *E225*
If the first argument to one of these commands is "<buffer>" it will apply to
mappings locally to the current buffer only. Example: >
@@ -194,8 +197,35 @@
If you want to map a key and then have it do what it was originally mapped to,
have a look at |maparg()|.
-"<buffer>", "<silent>", "<script>" and "<unique>" can be used in any order.
-They must appear right after the command, before any other arguments.
+ *:map-<expr>* *:map-expression*
+If the first argument to one of these commands is "<expr>" and it is used to
+define a new mapping or abbreviation, the argument is an expression. The
+expression is evaluated to obtain the {rhs} that is used. Example: >
+ :inoremap <expr> . InsertDot()
+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.
+
+Be very careful about side effects! The expression is evaluated while
+obtaining characters, if you change buffer text, move the cursor, edit another
+file, etc. you may very well make command disfunctional.
+
+Here is an example that inserts a list number that increases: >
+ let counter = 0
+ inoremap <expr> <C-L> ListItem()
+ inoremap <expr> <C-R> ListReset()
+
+ func ListItem()
+ let g:counter += 1
+ return g:counter . '. '
+ endfunc
+
+ func ListReset()
+ let g:counter = 0
+ return ''
+ endfunc
+
+CTRL-L inserts the next number, CTRL-E resets the count. CTRL-E returns an
+empty string, so that nothing is inserted.
1.3 MAPPING AND MODES *:map-modes*
diff --git a/runtime/optwin.vim b/runtime/optwin.vim
index 8a8cf6f..7dff513 100644
--- a/runtime/optwin.vim
+++ b/runtime/optwin.vim
@@ -1,7 +1,7 @@
" These commands create the option window.
"
" Maintainer: Bram Moolenaar <Bram@vim.org>
-" Last Change: 2006 Mar 05
+" Last Change: 2006 Mar 10
" If there already is an option window, jump to that one.
if bufwinnr("option-window") > 0
@@ -1163,6 +1163,8 @@
call <SID>OptionG("ccv", &ccv)
call append("$", "delcombine\tDelete combining (composing) characters on their own")
call <SID>BinOptionG("deco", &deco)
+ call append("$", "maxcombine\tMaximum number of combining (composing) characters displayed")
+ call <SID>OptionG("mco", &mco)
if has("xim") && has("gui_gtk")
call append("$", "imactivatekey\tkey that activates the X input method")
call <SID>OptionG("imak", &imak)
diff --git a/src/getchar.c b/src/getchar.c
index 5064c8d..5aa1b25 100644
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -1792,8 +1792,8 @@
int local_State;
int mlen;
int max_mlen;
-#ifdef FEAT_CMDL_INFO
int i;
+#ifdef FEAT_CMDL_INFO
int new_wcol, new_wrow;
#endif
#ifdef FEAT_GUI
@@ -2309,6 +2309,17 @@
}
#endif
+#ifdef FEAT_EVAL
+ /*
+ * Handle ":map <expr>": evaluate the {rhs} as an
+ * expression.
+ */
+ if (mp->m_expr)
+ s = eval_to_string(mp->m_str, NULL, FALSE);
+ else
+#endif
+ s = mp->m_str;
+
/*
* Insert the 'to' part in the typebuf.tb_buf.
* If 'from' field is the same as the start of the
@@ -2317,13 +2328,23 @@
* If m_noremap is set, don't remap the whole 'to'
* part.
*/
- if (ins_typebuf(mp->m_str,
- mp->m_noremap != REMAP_YES
+ if (s == NULL)
+ i = FAIL;
+ else
+ {
+ i = ins_typebuf(s,
+ mp->m_noremap != REMAP_YES
? mp->m_noremap
- : STRNCMP(mp->m_str, mp->m_keys,
+ : STRNCMP(s, mp->m_keys,
(size_t)keylen) != 0
? REMAP_YES : REMAP_SKIP,
- 0, TRUE, cmd_silent || mp->m_silent) == FAIL)
+ 0, TRUE, cmd_silent || mp->m_silent);
+#ifdef FEAT_EVAL
+ if (mp->m_expr)
+ vim_free(s);
+#endif
+ }
+ if (i == FAIL)
{
c = -1;
break;
@@ -2955,6 +2976,9 @@
mapblock_T **map_table;
int unique = FALSE;
int silent = FALSE;
+#ifdef FEAT_EVAL
+ int expr = FALSE;
+#endif
int noremap;
keys = arg;
@@ -2967,7 +2991,7 @@
else
noremap = REMAP_YES;
- /* Accept <buffer>, <silent>, <script> and <unique> in any order. */
+ /* Accept <buffer>, <silent>, <expr> <script> and <unique> in any order. */
for (;;)
{
#ifdef FEAT_LOCALMAP
@@ -3003,6 +3027,16 @@
noremap = REMAP_SCRIPT;
continue;
}
+
+ /*
+ * Check for "<expr>": {rhs} is an expression.
+ */
+ if (STRNCMP(keys, "<expr>", 6) == 0)
+ {
+ keys = skipwhite(keys + 6);
+ expr = TRUE;
+ continue;
+ }
#endif
/*
* Check for "<unique>": don't overwrite an existing mapping.
@@ -3328,6 +3362,7 @@
mp->m_silent = silent;
mp->m_mode = mode;
#ifdef FEAT_EVAL
+ mp->m_expr = expr;
mp->m_script_ID = current_SID;
#endif
did_it = TRUE;
@@ -3413,6 +3448,7 @@
mp->m_silent = silent;
mp->m_mode = mode;
#ifdef FEAT_EVAL
+ mp->m_expr = expr;
mp->m_script_ID = current_SID;
#endif
@@ -3835,11 +3871,18 @@
arg = skipwhite(arg + 8);
continue;
}
+#ifdef FEAT_EVAL
if (STRNCMP(arg, "<script>", 8) == 0)
{
arg = skipwhite(arg + 8);
continue;
}
+ if (STRNCMP(arg, "<expr>", 6) == 0)
+ {
+ arg = skipwhite(arg + 6);
+ continue;
+ }
+#endif
break;
}
xp->xp_pattern = arg;
@@ -3879,7 +3922,7 @@
{
count = 0;
- for (i = 0; i < 4; ++i)
+ for (i = 0; i < 5; ++i)
{
if (i == 0)
p = (char_u *)"<silent>";
@@ -3888,9 +3931,11 @@
#ifdef FEAT_EVAL
else if (i == 2)
p = (char_u *)"<script>";
+ else if (i == 3)
+ p = (char_u *)"<expr>";
#endif
#ifdef FEAT_LOCALMAP
- else if (i == 3 && !expand_buffer)
+ else if (i == 4 && !expand_buffer)
p = (char_u *)"<buffer>";
#endif
else
@@ -4002,6 +4047,7 @@
int len;
int scol; /* starting column of the abbr. */
int j;
+ char_u *s;
#ifdef FEAT_MBYTE
char_u tb[MB_MAXBYTES + 4];
#else
@@ -4148,10 +4194,23 @@
/* insert the last typed char */
(void)ins_typebuf(tb, 1, 0, TRUE, mp->m_silent);
}
+#ifdef FEAT_EVAL
+ if (mp->m_expr)
+ s = eval_to_string(mp->m_str, NULL, FALSE);
+ else
+#endif
+ s = mp->m_str;
+ if (s != NULL)
+ {
/* insert the to string */
- (void)ins_typebuf(mp->m_str, mp->m_noremap, 0, TRUE, mp->m_silent);
+ (void)ins_typebuf(s, mp->m_noremap, 0, TRUE, mp->m_silent);
/* no abbrev. for these chars */
- typebuf.tb_no_abbr_cnt += (int)STRLEN(mp->m_str) + j + 1;
+ typebuf.tb_no_abbr_cnt += (int)STRLEN(s) + j + 1;
+#ifdef FEAT_EVAL
+ if (mp->m_expr)
+ vim_free(s);
+#endif
+ }
tb[0] = Ctrl_H;
tb[1] = NUL;
@@ -4310,6 +4369,13 @@
return FAIL;
if (mp->m_silent && fputs(" <silent>", fd) < 0)
return FAIL;
+#ifdef FEAT_EVAL
+ if (mp->m_noremap == REMAP_SCRIPT
+ && fputs("<script>", fd) < 0)
+ return FAIL;
+ if (mp->m_expr && fputs(" <expr>", fd) < 0)
+ return FAIL;
+#endif
if ( putc(' ', fd) < 0
|| put_escstr(fd, mp->m_keys, 0) == FAIL
diff --git a/src/vim.h b/src/vim.h
index 0a08cd6..e2514cf 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -1127,6 +1127,8 @@
EVENT_CURSORMOVEDI, /* cursor was moved in Insert mode */
EVENT_TABLEAVE, /* before leaving a tab page */
EVENT_TABENTER, /* after entering a tab page */
+ EVENT_SHELLCMDPOST, /* after ":!cmd" */
+ EVENT_SHELLFILTERPOST, /* after ":1,2!cmd", ":w !cmd", ":r !cmd". */
NUM_EVENTS /* MUST be the last one */
};