summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2014-04-01 17:49:44 +0200
committerBram Moolenaar <Bram@vim.org>2014-04-01 17:49:44 +0200
commitfd3fe98b78edb10f2d439b0c6d56e6d70eecb92d (patch)
treeddac03ff4e8559f59c4c3bd56cd63105a4ce35eb
parentefa304d760640e5c575bef97d689f7c360b20779 (diff)
downloadvim-git-7.4.232.tar.gz
updated for version 7.4.232v7.4.232
Problem: ":%s/\n//" uses a lot of memory. (Aidan Marlin) Solution: Turn this into a join command. (Christian Brabandt)
-rw-r--r--src/ex_cmds.c25
-rw-r--r--src/ex_docmd.c3
-rw-r--r--src/proto/ex_docmd.pro1
-rw-r--r--src/version.c2
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,