diff options
-rw-r--r-- | src/ex_cmds.c | 25 | ||||
-rw-r--r-- | src/ex_docmd.c | 3 | ||||
-rw-r--r-- | src/proto/ex_docmd.pro | 1 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 29 insertions, 2 deletions
diff --git a/src/ex_cmds.c b/src/ex_cmds.c index f99f8830f..5321955cf 100644 --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -4420,6 +4420,31 @@ do_sub(eap) endcolumn = (curwin->w_curswant == MAXCOL); } + /* Recognize ":%s/\n//" and turn it into a join command, which is much + * more efficient. + * TODO: find a generic solution to make line-joining operations more + * efficient, avoid allocating a string that grows in size. + */ + if (STRCMP(pat, "\\n") == 0 && STRLEN(pat) == 2 + && *sub == NUL + && (*cmd == NUL || (cmd[1] == NUL && (*cmd == 'g' || *cmd == 'l' + || *cmd == 'p' || *cmd == '#')))) + { + curwin->w_cursor.lnum = eap->line1; + if (*cmd == 'l') + eap->flags = EXFLAG_LIST; + else if (*cmd == '#') + eap->flags = EXFLAG_NR; + else if (*cmd == 'p') + eap->flags = EXFLAG_PRINT; + + (void)do_join(eap->line2 - eap->line1 + 1, FALSE, TRUE, FALSE); + sub_nlines = sub_nsubs = eap->line2 - eap->line1 + 1; + (void)do_sub_msg(FALSE); + ex_may_print(eap); + return; + } + /* * Find trailing options. When '&' is used, keep old options. */ diff --git a/src/ex_docmd.c b/src/ex_docmd.c index a63f8f66b..f1aa60798 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -316,7 +316,6 @@ static void ex_winpos __ARGS((exarg_T *eap)); static void ex_operators __ARGS((exarg_T *eap)); static void ex_put __ARGS((exarg_T *eap)); static void ex_copymove __ARGS((exarg_T *eap)); -static void ex_may_print __ARGS((exarg_T *eap)); static void ex_submagic __ARGS((exarg_T *eap)); static void ex_join __ARGS((exarg_T *eap)); static void ex_at __ARGS((exarg_T *eap)); @@ -8683,7 +8682,7 @@ ex_copymove(eap) /* * Print the current line if flags were given to the Ex command. */ - static void + void ex_may_print(eap) exarg_T *eap; { diff --git a/src/proto/ex_docmd.pro b/src/proto/ex_docmd.pro index 816fd3fd5..ebc54c9de 100644 --- a/src/proto/ex_docmd.pro +++ b/src/proto/ex_docmd.pro @@ -54,4 +54,5 @@ int put_eol __ARGS((FILE *fd)); int put_line __ARGS((FILE *fd, char *s)); void dialog_msg __ARGS((char_u *buff, char *format, char_u *fname)); char_u *get_behave_arg __ARGS((expand_T *xp, int idx)); +void ex_may_print __ARGS((exarg_T *eap)); /* vim: set ft=c : */ diff --git a/src/version.c b/src/version.c index bd6ad3f43..1780946fc 100644 --- a/src/version.c +++ b/src/version.c @@ -735,6 +735,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 232, +/**/ 231, /**/ 230, |