Hi Bram! On So, 22 Mai 2011, Bram Moolenaar wrote:
> It's true that using ";" after a "t" command is currently close to > useless. Changing this would be backwards incompatible, but I doubt > anyone would notice. I hardly use ";" anyway. Would there be any > plugin that breaks? I can't think of a reason why a plugin would rely on > ";" not moving. > > So I tend to think I would include such a patch. Ok, here is the patch. I made it so that only including the ';' in 'cpo' would change the behaviour. If you don't want to introduce a new 'cpo' setting, I am fine with simply changing the current implementation. The comment should explain how it works. regards, Christian -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php
# HG changeset patch # Parent 27bbd6d78ebf4afe77946b52802e004b819a42f6 diff --git a/runtime/doc/motion.txt b/runtime/doc/motion.txt --- a/runtime/doc/motion.txt +++ b/runtime/doc/motion.txt @@ -269,11 +269,11 @@ {char} can be entered like with the |f| command. *;* -; Repeat latest f, t, F or T [count] times. +; Repeat latest f, t, F or T [count] times. See |cpo-;| *,* , Repeat latest f, t, F or T in opposite direction - [count] times. + [count] times. See also |cpo-;| *gc* gc move forward to next CamelCase char [count] times. diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -2117,6 +2117,11 @@ *cpo->* > When appending to a register, put a line break before the appended text. + *cpo-;* + ; When using |,| or |;| to repeat the last |t| search + and the cursor is right in front of the searched + character, skip over it and jump to the following + occurence. If not included, the cursor wouldn't move. POSIX flags. These are not included in the Vi default value, except when $VIM_POSIX was set on startup. |posix| diff --git a/src/option.h b/src/option.h --- a/src/option.h +++ b/src/option.h @@ -169,10 +169,11 @@ #define CPO_SUBPERCENT '/' /* % in :s string uses previous one */ #define CPO_BACKSL '\\' /* \ is not special in [] */ #define CPO_CHDIR '.' /* don't chdir if buffer is modified */ +#define CPO_SCOLON ';' /* using ,/; will skip over char, if last t search landed in front of char */ /* default values for Vim, Vi and POSIX */ #define CPO_VIM "aABceFs" #define CPO_VI "aAbBcCdDeEfFgHiIjJkKlLmMnoOpPqrRsStuvwWxXyZ$!%*-+<>" -#define CPO_ALL "aAbBcCdDeEfFgHiIjJkKlLmMnoOpPqrRsStuvwWxXyZ$!%*-+<>#{|&/\\." +#define CPO_ALL "aAbBcCdDeEfFgHiIjJkKlLmMnoOpPqrRsStuvwWxXyZ$!%*-+<>#{|&/\\.;" /* characters for p_ww option: */ #define WW_ALL "bshl<>[],~" diff --git a/src/search.c b/src/search.c --- a/src/search.c +++ b/src/search.c @@ -1546,6 +1546,7 @@ int col; char_u *p; int len; + int stop = TRUE; #ifdef FEAT_MBYTE static char_u bytes[MB_MAXBYTES]; static int bytelen = 1; /* >1 for multi-byte char */ @@ -1580,6 +1581,11 @@ t_cmd = last_t_cmd; c = lastc; /* For multi-byte re-use last bytes[] and bytelen. */ + + /* force a move of at least one char, so ;/, will move the cursor, + * even if the cursor is right in front of char we are looking at */ + if (vim_strchr(p_cpo, CPO_SCOLON) != NULL && count == 1) + stop = FALSE; } if (dir == BACKWARD) @@ -1612,14 +1618,16 @@ } if (bytelen == 1) { - if (p[col] == c) + if (p[col] == c && stop) break; } else { - if (vim_memcmp(p + col, bytes, bytelen) == 0) + if (vim_memcmp(p + col, bytes, bytelen) == 0 && stop) break; } + if (!stop) + stop = TRUE; } } else @@ -1629,8 +1637,10 @@ { if ((col += dir) < 0 || col >= len) return FAIL; - if (p[col] == c) + if (p[col] == c && stop) break; + if (!stop) + stop = TRUE; } } }