summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Makefile1
-rw-r--r--src/ex_cmds.h2
-rw-r--r--src/ex_docmd.c55
-rw-r--r--src/testdir/Make_all.mak1
-rw-r--r--src/testdir/test_hide.vim97
-rw-r--r--src/version.c2
6 files changed, 127 insertions, 31 deletions
diff --git a/src/Makefile b/src/Makefile
index 5c788cc20..c519a3080 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -2097,6 +2097,7 @@ test_arglist \
test_gui \
test_hardcopy \
test_help_tagjump \
+ test_hide \
test_history \
test_hlsearch \
test_increment \
diff --git a/src/ex_cmds.h b/src/ex_cmds.h
index 3f21d94f9..cb2fadcec 100644
--- a/src/ex_cmds.h
+++ b/src/ex_cmds.h
@@ -623,7 +623,7 @@ EX(CMD_highlight, "highlight", ex_highlight,
BANG|EXTRA|TRLBAR|SBOXOK|CMDWIN,
ADDR_LINES),
EX(CMD_hide, "hide", ex_hide,
- BANG|RANGE|NOTADR|COUNT|EXTRA|NOTRLCOM,
+ BANG|RANGE|NOTADR|COUNT|EXTRA|TRLBAR,
ADDR_WINDOWS),
EX(CMD_history, "history", ex_history,
EXTRA|TRLBAR|CMDWIN,
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 34c21e182..439467cf1 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -5632,15 +5632,16 @@ find_nextcmd(char_u *p)
#endif
/*
- * Check if *p is a separator between Ex commands.
- * Return NULL if it isn't, (p + 1) if it is.
+ * Check if *p is a separator between Ex commands, skipping over white space.
+ * Return NULL if it isn't, the following character if it is.
*/
char_u *
check_nextcmd(char_u *p)
{
- p = skipwhite(p);
- if (*p == '|' || *p == '\n')
- return (p + 1);
+ char_u *s = skipwhite(p);
+
+ if (*s == '|' || *s == '\n')
+ return (s + 1);
else
return NULL;
}
@@ -7572,38 +7573,32 @@ ex_all(exarg_T *eap)
static void
ex_hide(exarg_T *eap)
{
- if (*eap->arg != NUL && check_nextcmd(eap->arg) == NULL)
- eap->errmsg = e_invarg;
- else
- {
- /* ":hide" or ":hide | cmd": hide current window */
- eap->nextcmd = check_nextcmd(eap->arg);
+ /* ":hide" or ":hide | cmd": hide current window */
#ifdef FEAT_WINDOWS
- if (!eap->skip)
- {
+ if (!eap->skip)
+ {
# ifdef FEAT_GUI
- need_mouse_correct = TRUE;
+ need_mouse_correct = TRUE;
# endif
- if (eap->addr_count == 0)
- win_close(curwin, FALSE); /* don't free buffer */
- else
- {
- int winnr = 0;
- win_T *win;
+ if (eap->addr_count == 0)
+ win_close(curwin, FALSE); /* don't free buffer */
+ else
+ {
+ int winnr = 0;
+ win_T *win;
- FOR_ALL_WINDOWS(win)
- {
- winnr++;
- if (winnr == eap->line2)
- break;
- }
- if (win == NULL)
- win = lastwin;
- win_close(win, FALSE);
+ FOR_ALL_WINDOWS(win)
+ {
+ winnr++;
+ if (winnr == eap->line2)
+ break;
}
+ if (win == NULL)
+ win = lastwin;
+ win_close(win, FALSE);
}
-#endif
}
+#endif
}
/*
diff --git a/src/testdir/Make_all.mak b/src/testdir/Make_all.mak
index a8ea54318..1c0c7157e 100644
--- a/src/testdir/Make_all.mak
+++ b/src/testdir/Make_all.mak
@@ -156,6 +156,7 @@ NEW_TESTS = test_arglist.res \
test_gn.res \
test_gui.res \
test_hardcopy.res \
+ test_hide.res \
test_history.res \
test_hlsearch.res \
test_increment.res \
diff --git a/src/testdir/test_hide.vim b/src/testdir/test_hide.vim
new file mode 100644
index 000000000..128b8ff94
--- /dev/null
+++ b/src/testdir/test_hide.vim
@@ -0,0 +1,97 @@
+" Tests for :hide command/modifier and 'hidden' option
+
+function SetUp()
+ let s:save_hidden = &hidden
+ let s:save_bufhidden = &bufhidden
+ let s:save_autowrite = &autowrite
+ set nohidden
+ set bufhidden=
+ set noautowrite
+endfunc
+
+function TearDown()
+ let &hidden = s:save_hidden
+ let &bufhidden = s:save_bufhidden
+ let &autowrite = s:save_autowrite
+endfunc
+
+function Test_hide()
+ let orig_bname = bufname('')
+ let orig_winnr = winnr('$')
+
+ new Xf1
+ set modified
+ call assert_fails('edit Xf2')
+ bwipeout! Xf1
+
+ new Xf1
+ set modified
+ edit! Xf2
+ call assert_equal(['Xf2', 2], [bufname(''), winnr('$')])
+ call assert_equal([1, 0], [buflisted('Xf1'), bufloaded('Xf1')])
+ bwipeout! Xf1
+ bwipeout! Xf2
+
+ new Xf1
+ set modified
+ " :hide as a command
+ hide
+ call assert_equal([orig_bname, orig_winnr], [bufname(''), winnr('$')])
+ call assert_equal([1, 1], [buflisted('Xf1'), bufloaded('Xf1')])
+ bwipeout! Xf1
+
+ new Xf1
+ set modified
+ " :hide as a command with trailing comment
+ hide " comment
+ call assert_equal([orig_bname, orig_winnr], [bufname(''), winnr('$')])
+ call assert_equal([1, 1], [buflisted('Xf1'), bufloaded('Xf1')])
+ bwipeout! Xf1
+
+ new Xf1
+ set modified
+ " :hide as a command with bar
+ hide | new Xf2 " comment
+ call assert_equal(['Xf2', 2], [bufname(''), winnr('$')])
+ call assert_equal([1, 1], [buflisted('Xf1'), bufloaded('Xf1')])
+ bwipeout! Xf1
+ bwipeout! Xf2
+
+ new Xf1
+ set modified
+ " :hide as a modifier with trailing comment
+ hide edit Xf2 " comment
+ call assert_equal(['Xf2', 2], [bufname(''), winnr('$')])
+ call assert_equal([1, 1], [buflisted('Xf1'), bufloaded('Xf1')])
+ bwipeout! Xf1
+ bwipeout! Xf2
+
+ new Xf1
+ set modified
+ " To check that the bar is not recognized to separate commands
+ hide echo "one|two"
+ call assert_equal(['Xf1', 2], [bufname(''), winnr('$')])
+ call assert_equal([1, 1], [buflisted('Xf1'), bufloaded('Xf1')])
+ bwipeout! Xf1
+
+ " set hidden
+ new Xf1
+ set hidden
+ set modified
+ edit Xf2 " comment
+ call assert_equal(['Xf2', 2], [bufname(''), winnr('$')])
+ call assert_equal([1, 1], [buflisted('Xf1'), bufloaded('Xf1')])
+ bwipeout! Xf1
+ bwipeout! Xf2
+
+ " set hidden bufhidden=wipe
+ new Xf1
+ set bufhidden=wipe
+ set modified
+ hide edit! Xf2 " comment
+ call assert_equal(['Xf2', 2], [bufname(''), winnr('$')])
+ call assert_equal([0, 0], [buflisted('Xf1'), bufloaded('Xf1')])
+ bwipeout! Xf2
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/version.c b/src/version.c
index 8b30bae90..b1bf796de 100644
--- a/src/version.c
+++ b/src/version.c
@@ -765,6 +765,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 86,
+/**/
85,
/**/
84,