Mercurial > vim
changeset 1692:c8c47cc9dab1 v7.2b.025
updated for version 7.2b-025
author | vimboss |
---|---|
date | Thu, 31 Jul 2008 20:04:27 +0000 |
parents | 4842e7421b52 |
children | b6ffc2045211 |
files | src/normal.c src/structs.h src/version.c |
diffstat | 3 files changed, 52 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/src/normal.c +++ b/src/normal.c @@ -581,6 +581,10 @@ normal_cmd(oap, toplevel) vim_memset(&ca, 0, sizeof(ca)); /* also resets ca.retval */ ca.oap = oap; + + /* Use a count remembered from before entering an operator. After typing + * "3d" we return from normal_cmd() and come back here, the "3" is + * remembered in "opcount". */ ca.opcount = opcount; #ifdef FEAT_SNIFF @@ -606,9 +610,24 @@ normal_cmd(oap, toplevel) } #endif + /* When not finishing an operator and no register name typed, reset the + * count. */ if (!finish_op && !oap->regname) ca.opcount = 0; +#ifdef FEAT_AUTOCMD + /* Restore counts from before receiving K_CURSORHOLD. This means after + * typing "3", handling K_CURSORHOLD and then typing "2" we get "32", not + * "3 * 2". */ + if (oap->prev_opcount > 0 || oap->prev_count0 > 0) + { + ca.opcount = oap->prev_opcount; + ca.count0 = oap->prev_count0; + oap->prev_opcount = 0; + oap->prev_count0 = 0; + } +#endif + #ifdef FEAT_VISUAL mapped_len = typebuf_maplen(); #endif @@ -744,16 +763,27 @@ getcount: } } - /* - * If we're in the middle of an operator (including after entering a yank - * buffer with '"') AND we had a count before the operator, then that - * count overrides the current value of ca.count0. - * What this means effectively, is that commands like "3dw" get turned - * into "d3w" which makes things fall into place pretty neatly. - * If you give a count before AND after the operator, they are multiplied. - */ - if (ca.opcount != 0) - { +#ifdef FEAT_AUTOCMD + if (c == K_CURSORHOLD) + { + /* Save the count values so that ca.opcount and ca.count0 are exactly + * the same when coming back here after handling K_CURSORHOLD. */ + oap->prev_opcount = ca.opcount; + oap->prev_count0 = ca.count0; + } + else +#endif + if (ca.opcount != 0) + { + /* + * If we're in the middle of an operator (including after entering a + * yank buffer with '"') AND we had a count before the operator, then + * that count overrides the current value of ca.count0. + * What this means effectively, is that commands like "3dw" get turned + * into "d3w" which makes things fall into place pretty neatly. + * If you give a count before AND after the operator, they are + * multiplied. + */ if (ca.count0) ca.count0 *= ca.opcount; else @@ -798,7 +828,7 @@ getcount: if (text_locked() && (nv_cmds[idx].cmd_flags & NV_NCW)) { - /* This command is not allowed wile editing a ccmdline: beep. */ + /* This command is not allowed while editing a ccmdline: beep. */ clearopbeep(oap); text_locked_msg(); goto normal_end; @@ -1274,7 +1304,11 @@ normal_end: #endif #ifdef FEAT_CMDL_INFO - if (oap->op_type == OP_NOP && oap->regname == 0) + if (oap->op_type == OP_NOP && oap->regname == 0 +# ifdef FEAT_AUTOCMD + && ca.cmdchar != K_CURSORHOLD +# endif + ) clear_showcmd(); #endif
--- a/src/structs.h +++ b/src/structs.h @@ -2076,6 +2076,10 @@ typedef struct oparg_S #endif colnr_T start_vcol; /* start col for block mode operator */ colnr_T end_vcol; /* end col for block mode operator */ +#ifdef FEAT_AUTOCMD + long prev_opcount; /* ca.opcount saved for K_CURSORHOLD */ + long prev_count0; /* ca.count0 saved for K_CURSORHOLD */ +#endif } oparg_T; /*