summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/buffer.c27
-rw-r--r--src/ex_docmd.c118
-rw-r--r--src/os_mac.h4
-rw-r--r--src/proto/buffer.pro2
-rw-r--r--src/vim.h6
-rw-r--r--src/window.c258
6 files changed, 211 insertions, 204 deletions
diff --git a/src/buffer.c b/src/buffer.c
index 2b6fe2810..9af8d507d 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -3018,9 +3018,15 @@ maketitle()
if (*p_titlestring != NUL)
{
#ifdef FEAT_STL_OPT
+ int use_sandbox = FALSE;
+
+# ifdef FEAT_EVAL
+ use_sandbox = was_set_insecurely((char_u *)"titlestring");
+# endif
if (stl_syntax & STL_IN_TITLE)
build_stl_str_hl(curwin, t_str, sizeof(buf),
- p_titlestring, 0, maxlen, NULL);
+ p_titlestring, use_sandbox,
+ 0, maxlen, NULL);
else
#endif
t_str = p_titlestring;
@@ -3109,9 +3115,15 @@ maketitle()
if (*p_iconstring != NUL)
{
#ifdef FEAT_STL_OPT
+ int use_sandbox = FALSE;
+
+# ifdef FEAT_EVAL
+ use_sandbox = was_set_insecurely((char_u *)"iconstring");
+# endif
if (stl_syntax & STL_IN_ICON)
build_stl_str_hl(curwin, i_str, sizeof(buf),
- p_iconstring, 0, 0, NULL);
+ p_iconstring, use_sandbox,
+ 0, 0, NULL);
else
#endif
i_str = p_iconstring;
@@ -3190,9 +3202,12 @@ free_titles()
#if defined(FEAT_STL_OPT) || defined(PROTO)
/*
- * Build a string from the status line items in fmt.
+ * Build a string from the status line items in "fmt".
* Return length of string in screen cells.
*
+ * Normally works for window "wp", except when working for 'tabline' then it
+ * is "curwin".
+ *
* Items are drawn interspersed with the text that surrounds it
* Specials: %-<wid>(xxx%) => group, %= => middle marker, %< => truncation
* Item: %-<minwid>.<maxwid><itemch> All but <itemch> are optional
@@ -3201,11 +3216,12 @@ free_titles()
* or truncated if too long, fillchar is used for all whitespace.
*/
int
-build_stl_str_hl(wp, out, outlen, fmt, fillchar, maxwidth, hl)
+build_stl_str_hl(wp, out, outlen, fmt, use_sandbox, fillchar, maxwidth, hl)
win_T *wp;
char_u *out; /* buffer to write into */
size_t outlen; /* length of out[] */
char_u *fmt;
+ int use_sandbox; /* "fmt" was set insecurely, use sandbox */
int fillchar;
int maxwidth;
struct stl_hlrec *hl;
@@ -3501,8 +3517,7 @@ build_stl_str_hl(wp, out, outlen, fmt, fillchar, maxwidth, hl)
curwin = wp;
curbuf = wp->w_buffer;
- str = eval_to_string_safe(p, &t,
- was_set_insecurely((char_u *)"statusline"));
+ str = eval_to_string_safe(p, &t, use_sandbox);
curwin = o_curwin;
curbuf = o_curbuf;
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 1a8788684..1eefcd892 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -163,7 +163,6 @@ static void ex_tabs __ARGS((exarg_T *eap));
# define ex_resize ex_ni
# define ex_splitview ex_ni
# define ex_stag ex_ni
-# define ex_tabedit ex_ni
# define ex_tab ex_ni
# define ex_tabs ex_ni
# define ex_tabclose ex_ni
@@ -6305,7 +6304,8 @@ tabpage_close(forceit)
{
/* First close all the windows but the current one. If that worked then
* close the last window in this tab, that will close it. */
- close_others(TRUE, forceit);
+ if (lastwin != firstwin)
+ close_others(TRUE, forceit);
if (lastwin == firstwin)
ex_win_close(forceit, curwin, NULL);
# ifdef FEAT_GUI
@@ -6863,12 +6863,17 @@ ex_wrongmodifier(eap)
* :new [[+command] file] split window with no or new file
* :vnew [[+command] file] split vertically window with no or new file
* :sfind [+command] file split window with file in 'path'
+ *
+ * :tabedit open new Tab page with empty window
+ * :tabedit [+command] file open new Tab page and edit "file"
+ * :tabnew [[+command] file] just like :tabedit
+ * :tabfind [+command] file open new Tab page and find "file"
*/
void
ex_splitview(eap)
exarg_T *eap;
{
- win_T *old_curwin;
+ win_T *old_curwin = curwin;
# if defined(FEAT_SEARCHPATH) || defined(FEAT_BROWSE)
char_u *fname = NULL;
# endif
@@ -6884,7 +6889,6 @@ ex_splitview(eap)
}
# endif
- old_curwin = curwin;
# ifdef FEAT_GUI
need_mouse_correct = TRUE;
# endif
@@ -6904,7 +6908,7 @@ ex_splitview(eap)
# endif
# ifdef FEAT_SEARCHPATH
- if (eap->cmdidx == CMD_sfind)
+ if (eap->cmdidx == CMD_sfind || eap->cmdidx == CMD_tabfind)
{
fname = find_file_in_path(eap->arg, (int)STRLEN(eap->arg),
FNAME_MESS, TRUE, curbuf->b_ffname);
@@ -6946,7 +6950,26 @@ ex_splitview(eap)
cmdmod.browse = FALSE; /* Don't browse again in do_ecmd(). */
# endif
- if (win_split(eap->addr_count > 0 ? (int)eap->line2 : 0,
+ /*
+ * Either open new tab page or split the window.
+ */
+ if (eap->cmdidx == CMD_tabedit
+ || eap->cmdidx == CMD_tabfind
+ || eap->cmdidx == CMD_tabnew)
+ {
+ if (win_new_tabpage() != FAIL)
+ {
+ do_exedit(eap, NULL);
+
+ /* set the alternate buffer for the window we came from */
+ if (curwin != old_curwin
+ && win_valid(old_curwin)
+ && old_curwin->w_buffer != curbuf
+ && !cmdmod.keepalt)
+ old_curwin->w_alt_fnum = curbuf->b_fnum;
+ }
+ }
+ else if (win_split(eap->addr_count > 0 ? (int)eap->line2 : 0,
*eap->cmd == 'v' ? WSP_VERT : 0) != FAIL)
{
# ifdef FEAT_SCROLLBIND
@@ -6975,85 +6998,6 @@ theend:
}
/*
- * :tabedit open new Tab page with empty window
- * :tabedit [+command] file open new Tab page and edit "file"
- * :tabnew [[+command] file] just like :tabedit
- * :tabfind [+command] file open new Tab page and find "file"
- */
- void
-ex_tabedit(eap)
- exarg_T *eap;
-{
-# if defined(FEAT_SEARCHPATH) || defined(FEAT_BROWSE)
- char_u *fname = NULL;
-# endif
-# ifdef FEAT_BROWSE
- int browse_flag = cmdmod.browse;
-# endif
-
-# ifdef FEAT_GUI
- need_mouse_correct = TRUE;
-# endif
-
-# ifdef FEAT_SEARCHPATH
- if (eap->cmdidx == CMD_tabfind)
- {
- fname = find_file_in_path(eap->arg, (int)STRLEN(eap->arg),
- FNAME_MESS, TRUE, curbuf->b_ffname);
- if (fname == NULL)
- goto theend;
- eap->arg = fname;
- }
-# ifdef FEAT_BROWSE
- else
-# endif
-# endif
-# ifdef FEAT_BROWSE
- if (cmdmod.browse)
- {
- if (
-# ifdef FEAT_GUI
- !gui.in_use &&
-# endif
- au_has_group((char_u *)"FileExplorer"))
- {
- /* No browsing supported but we do have the file explorer:
- * Edit the directory. */
- if (*eap->arg == NUL || !mch_isdir(eap->arg))
- eap->arg = (char_u *)".";
- }
- else
- {
- fname = do_browse(0, (char_u *)_("Edit File in new tab page"),
- eap->arg, NULL, NULL, NULL, curbuf);
- if (fname == NULL)
- goto theend;
- eap->arg = fname;
- }
- }
- cmdmod.browse = FALSE; /* Don't browse again in do_ecmd(). */
-# endif
-
- if (win_new_tabpage() != FAIL)
- {
-# ifdef FEAT_SCROLLBIND
- curwin->w_p_scb = FALSE;
-# endif
- if (*eap->arg != NUL)
- do_exedit(eap, NULL);
- }
-
-# ifdef FEAT_BROWSE
- cmdmod.browse = browse_flag;
-# endif
-
-# if defined(FEAT_SEARCHPATH) || defined(FEAT_BROWSE)
-theend:
- vim_free(fname);
-# endif
-}
-
-/*
* :tab command
*/
void
@@ -7316,12 +7260,14 @@ do_exedit(eap, old_curwin)
}
if ((eap->cmdidx == CMD_new
+ || eap->cmdidx == CMD_tabnew
+ || eap->cmdidx == CMD_tabedit
#ifdef FEAT_VERTSPLIT
|| eap->cmdidx == CMD_vnew
#endif
) && *eap->arg == NUL)
{
- /* ":new" without argument: edit an new empty buffer */
+ /* ":new" or ":tabnew" without argument: edit an new empty buffer */
setpcmark();
(void)do_ecmd(0, NULL, NULL, eap, ECMD_ONE,
ECMD_HIDE + (eap->forceit ? ECMD_FORCEIT : 0));
diff --git a/src/os_mac.h b/src/os_mac.h
index 5e286594f..82d91a8e6 100644
--- a/src/os_mac.h
+++ b/src/os_mac.h
@@ -93,12 +93,12 @@
*/
/* Got problem trying to use shared library in 68k */
-#if !defined(__POWERPC__) && defined(FEAT_PYTHON)
+#if !defined(__POWERPC__) && !defined(__i386__) && defined(FEAT_PYTHON)
# undef FEAT_PYTHON
# warning Auto-disabling Python. Not yet supported in 68k.
#endif
-#if !defined(__POWERPC__) && !defined(__ppc__)
+#if !defined(__POWERPC__) && !defined(__ppc__) && !defined(__i386__)
# if !__option(enumsalwaysint)
# error "You must compile with enums always int!"
# endif
diff --git a/src/proto/buffer.pro b/src/proto/buffer.pro
index 1061e367f..07ec64c06 100644
--- a/src/proto/buffer.pro
+++ b/src/proto/buffer.pro
@@ -40,7 +40,7 @@ void col_print __ARGS((char_u *buf, int col, int vcol));
void maketitle __ARGS((void));
void resettitle __ARGS((void));
void free_titles __ARGS((void));
-int build_stl_str_hl __ARGS((win_T *wp, char_u *out, size_t outlen, char_u *fmt, int fillchar, int maxwidth, struct stl_hlrec *hl));
+int build_stl_str_hl __ARGS((win_T *wp, char_u *out, size_t outlen, char_u *fmt, int insecure, int fillchar, int maxwidth, struct stl_hlrec *hl));
void get_rel_pos __ARGS((win_T *wp, char_u *str));
int append_arg_number __ARGS((win_T *wp, char_u *buf, int add_file, int maxlen));
char_u *fix_fname __ARGS((char_u *fname));
diff --git a/src/vim.h b/src/vim.h
index ef86e81bb..e4e26df6c 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -138,7 +138,7 @@
# endif
#endif
#ifdef MACOS
-# if defined(__POWERPC__) || defined(__fourbyteints__) \
+# if defined(__POWERPC__) || defined(MACOS_X) || defined(__fourbyteints__) \
|| defined(__MRC__) || defined(__SC__) || defined(__APPLE_CC__)/* MPW Compilers */
# define SIZEOF_INT 4
# else
@@ -1109,8 +1109,8 @@ enum auto_event
EVENT_SPELLFILEMISSING, /* spell file missing */
EVENT_CURSORMOVED, /* cursor was moved */
EVENT_CURSORMOVEDI, /* cursor was moved in Insert mode */
- EVENT_TABLEAVEPRE, /* before leaving a tab page */
- EVENT_TABENTERPOST, /* after entering a tab page */
+ EVENT_TABLEAVE, /* before leaving a tab page */
+ EVENT_TABENTER, /* after entering a tab page */
NUM_EVENTS /* MUST be the last one */
};
diff --git a/src/window.c b/src/window.c
index b117fe32c..3419a01e0 100644
--- a/src/window.c
+++ b/src/window.c
@@ -16,6 +16,7 @@
static int path_is_url __ARGS((char_u *p));
#if defined(FEAT_WINDOWS) || defined(PROTO)
static int win_split_ins __ARGS((int size, int flags, win_T *newwin, int dir));
+static void win_init __ARGS((win_T *newp, win_T *oldp));
static void frame_comp_pos __ARGS((frame_T *topfrp, int *row, int *col));
static void frame_setheight __ARGS((frame_T *curfrp, int height));
#ifdef FEAT_VERTSPLIT
@@ -42,7 +43,7 @@ static int frame_minwidth __ARGS((frame_T *topfrp, win_T *next_curwin));
static void frame_fix_width __ARGS((win_T *wp));
#endif
#endif
-static int win_alloc_firstwin __ARGS((void));
+static int win_alloc_firstwin __ARGS((win_T *oldwin));
#if defined(FEAT_WINDOWS) || defined(PROTO)
static tabpage_T *alloc_tabpage __ARGS((void));
static void free_tabpage __ARGS((tabpage_T *tp));
@@ -67,7 +68,7 @@ static void last_status_rec __ARGS((frame_T *fr, int statusline));
static void make_snapshot __ARGS((void));
static void make_snapshot_rec __ARGS((frame_T *fr, frame_T **frp));
-static void clear_snapshot __ARGS((void));
+static void clear_snapshot __ARGS((tabpage_T *tp));
static void clear_snapshot_rec __ARGS((frame_T *fr));
static void restore_snapshot __ARGS((int close_curwin));
static int check_snapshot_rec __ARGS((frame_T *sn, frame_T *fr));
@@ -627,13 +628,13 @@ win_split(size, flags)
if (flags & WSP_HELP)
make_snapshot();
else
- clear_snapshot();
+ clear_snapshot(curtab);
return win_split_ins(size, flags, NULL, 0);
}
/*
- * When "newwin" is NULL: split a window in two.
+ * When "newwin" is NULL: split the current window in two.
* When "newwin" is not NULL: insert this window at the far
* top/left/right/bottom.
* return FAIL for failure, OK otherwise
@@ -807,55 +808,8 @@ win_split_ins(size, flags, newwin, dir)
if (wp == NULL)
return FAIL;
- /*
- * make the contents of the new window the same as the current one
- */
- wp->w_buffer = curbuf;
- curbuf->b_nwindows++;
- wp->w_cursor = curwin->w_cursor;
- wp->w_valid = 0;
- wp->w_curswant = curwin->w_curswant;
- wp->w_set_curswant = curwin->w_set_curswant;
- wp->w_topline = curwin->w_topline;
-#ifdef FEAT_DIFF
- wp->w_topfill = curwin->w_topfill;
-#endif
- wp->w_leftcol = curwin->w_leftcol;
- wp->w_pcmark = curwin->w_pcmark;
- wp->w_prev_pcmark = curwin->w_prev_pcmark;
- wp->w_alt_fnum = curwin->w_alt_fnum;
- wp->w_fraction = curwin->w_fraction;
- wp->w_prev_fraction_row = curwin->w_prev_fraction_row;
-#ifdef FEAT_JUMPLIST
- copy_jumplist(curwin, wp);
-#endif
-#ifdef FEAT_QUICKFIX
- copy_loclist(curwin, wp);
-#endif
- if (curwin->w_localdir != NULL)
- wp->w_localdir = vim_strsave(curwin->w_localdir);
-
- /* Use the same argument list. */
- wp->w_alist = curwin->w_alist;
- ++wp->w_alist->al_refcount;
- wp->w_arg_idx = curwin->w_arg_idx;
-
- /*
- * copy tagstack and options from existing window
- */
- for (i = 0; i < curwin->w_tagstacklen; i++)
- {
- wp->w_tagstack[i] = curwin->w_tagstack[i];
- if (wp->w_tagstack[i].tagname != NULL)
- wp->w_tagstack[i].tagname =
- vim_strsave(wp->w_tagstack[i].tagname);
- }
- wp->w_tagstackidx = curwin->w_tagstackidx;
- wp->w_tagstacklen = curwin->w_tagstacklen;
- win_copy_options(curwin, wp);
-#ifdef FEAT_FOLDING
- copyFoldingState(curwin, wp);
-#endif
+ /* make the contents of the new window the same as the current one */
+ win_init(wp, curwin);
}
/*
@@ -1099,6 +1053,66 @@ win_split_ins(size, flags, newwin, dir)
return OK;
}
+/*
+ * Initialize window "newp" from window "oldp".
+ * Used when splitting a window and when creating a new tab page.
+ * The windows will both edit the same buffer.
+ */
+ static void
+win_init(newp, oldp)
+ win_T *newp;
+ win_T *oldp;
+{
+ int i;
+
+ newp->w_buffer = oldp->w_buffer;
+ oldp->w_buffer->b_nwindows++;
+ newp->w_cursor = oldp->w_cursor;
+ newp->w_valid = 0;
+ newp->w_curswant = oldp->w_curswant;
+ newp->w_set_curswant = oldp->w_set_curswant;
+ newp->w_topline = oldp->w_topline;
+#ifdef FEAT_DIFF
+ newp->w_topfill = oldp->w_topfill;
+#endif
+ newp->w_leftcol = oldp->w_leftcol;
+ newp->w_pcmark = oldp->w_pcmark;
+ newp->w_prev_pcmark = oldp->w_prev_pcmark;
+ newp->w_alt_fnum = oldp->w_alt_fnum;
+ newp->w_fraction = oldp->w_fraction;
+ newp->w_prev_fraction_row = oldp->w_prev_fraction_row;
+#ifdef FEAT_JUMPLIST
+ copy_jumplist(oldp, newp);
+#endif
+#ifdef FEAT_QUICKFIX
+ copy_loclist(oldp, newp);
+#endif
+ if (oldp->w_localdir != NULL)
+ newp->w_localdir = vim_strsave(oldp->w_localdir);
+
+ /* Use the same argument list. */
+ newp->w_alist = oldp->w_alist;
+ ++newp->w_alist->al_refcount;
+ newp->w_arg_idx = oldp->w_arg_idx;
+
+ /*
+ * copy tagstack and options from existing window
+ */
+ for (i = 0; i < oldp->w_tagstacklen; i++)
+ {
+ newp->w_tagstack[i] = oldp->w_tagstack[i];
+ if (newp->w_tagstack[i].tagname != NULL)
+ newp->w_tagstack[i].tagname =
+ vim_strsave(newp->w_tagstack[i].tagname);
+ }
+ newp->w_tagstackidx = oldp->w_tagstackidx;
+ newp->w_tagstacklen = oldp->w_tagstacklen;
+ win_copy_options(oldp, newp);
+# ifdef FEAT_FOLDING
+ copyFoldingState(oldp, newp);
+# endif
+}
+
#endif /* FEAT_WINDOWS */
#if defined(FEAT_WINDOWS) || defined(PROTO)
@@ -1886,7 +1900,7 @@ win_close(win, free_buf)
if (win->w_buffer->b_help)
help_window = TRUE;
else
- clear_snapshot();
+ clear_snapshot(curtab);
#ifdef FEAT_AUTOCMD
if (win == curwin)
@@ -2813,35 +2827,33 @@ close_others(message, forceit)
#endif /* FEAT_WINDOWS */
/*
- * init the cursor in the window
- *
- * called when a new file is being edited
+ * Init the current window "curwin".
+ * Called when a new file is being edited.
*/
void
-win_init(wp)
- win_T *wp;
+curwin_init()
{
- redraw_win_later(wp, NOT_VALID);
- wp->w_lines_valid = 0;
- wp->w_cursor.lnum = 1;
- wp->w_curswant = wp->w_cursor.col = 0;
+ redraw_win_later(curwin, NOT_VALID);
+ curwin->w_lines_valid = 0;
+ curwin->w_cursor.lnum = 1;
+ curwin->w_curswant = curwin->w_cursor.col = 0;
#ifdef FEAT_VIRTUALEDIT
- wp->w_cursor.coladd = 0;
+ curwin->w_cursor.coladd = 0;
#endif
- wp->w_pcmark.lnum = 1; /* pcmark not cleared but set to line 1 */
- wp->w_pcmark.col = 0;
- wp->w_prev_pcmark.lnum = 0;
- wp->w_prev_pcmark.col = 0;
- wp->w_topline = 1;
+ curwin->w_pcmark.lnum = 1; /* pcmark not cleared but set to line 1 */
+ curwin->w_pcmark.col = 0;
+ curwin->w_prev_pcmark.lnum = 0;
+ curwin->w_prev_pcmark.col = 0;
+ curwin->w_topline = 1;
#ifdef FEAT_DIFF
- wp->w_topfill = 0;
+ curwin->w_topfill = 0;
#endif
- wp->w_botline = 2;
+ curwin->w_botline = 2;
#ifdef FEAT_FKMAP
if (curwin->w_p_rl)
- wp->w_farsi = W_CONV + W_R_L;
+ curwin->w_farsi = W_CONV + W_R_L;
else
- wp->w_farsi = W_CONV;
+ curwin->w_farsi = W_CONV;
#endif
}
@@ -2853,7 +2865,7 @@ win_init(wp)
int
win_alloc_first()
{
- if (win_alloc_firstwin() == FAIL)
+ if (win_alloc_firstwin(NULL) == FAIL)
return FAIL;
#ifdef FEAT_WINDOWS
@@ -2867,23 +2879,43 @@ win_alloc_first()
}
/*
- * Allocate one window and put an empty buffer in it.
- * Called to create the first window in a new tab page.
+ * Allocate the first window or the first window in a new tab page.
+ * When "oldwin" is NULL create an empty buffer for it.
+ * When "oldwin" is not NULL copy info from it to the new window (only with
+ * FEAT_WINDOWS).
* Return FAIL when something goes wrong (out of memory).
*/
static int
-win_alloc_firstwin()
+win_alloc_firstwin(oldwin)
+ win_T *oldwin;
{
curwin = win_alloc(NULL);
- curbuf = buflist_new(NULL, NULL, 1L, BLN_LISTED);
- if (curwin == NULL || curbuf == NULL)
- return FAIL;
- curwin->w_buffer = curbuf;
- curbuf->b_nwindows = 1; /* there is one window */
+ if (oldwin == NULL)
+ {
+ /* Very first window, need to create an empty buffer for it and
+ * initialize from scratch. */
+ curbuf = buflist_new(NULL, NULL, 1L, BLN_LISTED);
+ if (curwin == NULL || curbuf == NULL)
+ return FAIL;
+ curwin->w_buffer = curbuf;
+ curbuf->b_nwindows = 1; /* there is one window */
#ifdef FEAT_WINDOWS
- curwin->w_alist = &global_alist;
+ curwin->w_alist = &global_alist;
+#endif
+ curwin_init(); /* init current window */
+ }
+#ifdef FEAT_WINDOWS
+ else
+ {
+ /* First window in new tab page, initialize it from "oldwin". */
+ win_init(curwin, oldwin);
+
+# ifdef FEAT_SCROLLBIND
+ /* We don't want scroll-binding in the first window. */
+ curwin->w_p_scb = FALSE;
+# endif
+ }
#endif
- win_init(curwin); /* init current window */
topframe = (frame_T *)alloc_clear((unsigned)sizeof(frame_T));
if (topframe == NULL)
@@ -2944,11 +2976,13 @@ free_tabpage(tp)
# ifdef FEAT_DIFF
diff_clear(tp);
# endif
+ clear_snapshot(tp);
vim_free(tp);
}
/*
- * Create a new Tab page with one empty window.
+ * Create a new Tab page with one window.
+ * It will edit the current buffer, like after ":split".
* Put it just after the current Tab page.
* Return FAIL or OK.
*/
@@ -2963,7 +2997,7 @@ win_new_tabpage()
return FAIL;
/* Remember the current windows in this Tab page. */
- if (leave_tabpage(NULL) == FAIL)
+ if (leave_tabpage(curbuf) == FAIL)
{
vim_free(newtp);
return FAIL;
@@ -2971,11 +3005,8 @@ win_new_tabpage()
curtab = newtp;
/* Create a new empty window. */
- if (win_alloc_firstwin() == OK)
+ if (win_alloc_firstwin(tp->tp_curwin) == OK)
{
- /* copy options from previous to new curwin */
- win_copy_options(tp->tp_curwin, curwin);
-
/* Make the new Tab page the new topframe. */
newtp->tp_next = tp->tp_next;
tp->tp_next = newtp;
@@ -2985,6 +3016,10 @@ win_new_tabpage()
newtp->tp_topframe = topframe;
last_status(FALSE);
redraw_all_later(CLEAR);
+#ifdef FEAT_AUTOCMD
+ apply_autocmds(EVENT_TABENTER, NULL, NULL, FALSE, curbuf);
+ apply_autocmds(EVENT_WINENTER, NULL, NULL, FALSE, curbuf);
+#endif
return OK;
}
@@ -3082,7 +3117,7 @@ leave_tabpage(new_curbuf)
apply_autocmds(EVENT_WINLEAVE, NULL, NULL, FALSE, curbuf);
if (curtab != tp)
return FAIL;
- apply_autocmds(EVENT_TABLEAVEPRE, NULL, NULL, FALSE, curbuf);
+ apply_autocmds(EVENT_TABLEAVE, NULL, NULL, FALSE, curbuf);
if (curtab != tp)
return FAIL;
#endif
@@ -3104,6 +3139,7 @@ leave_tabpage(new_curbuf)
/*
* Start using tab page "tp".
+ * Only to be used after leave_tabpage() or freeing the current tab page.
*/
/*ARGSUSED*/
static void
@@ -3117,12 +3153,14 @@ enter_tabpage(tp, old_curbuf)
firstwin = tp->tp_firstwin;
lastwin = tp->tp_lastwin;
topframe = tp->tp_topframe;
+#ifdef FEAT_AUTOCMD
+ apply_autocmds(EVENT_TABENTER, NULL, NULL, FALSE, curbuf);
+#endif
+
win_enter_ext(tp->tp_curwin, FALSE, TRUE);
prevwin = tp->tp_prevwin;
#ifdef FEAT_AUTOCMD
- apply_autocmds(EVENT_TABENTERPOST, NULL, NULL, FALSE, curbuf);
- apply_autocmds(EVENT_WINENTER, NULL, NULL, FALSE, curbuf);
if (old_curbuf != curbuf)
apply_autocmds(EVENT_BUFENTER, NULL, NULL, FALSE, curbuf);
#endif
@@ -3169,6 +3207,14 @@ goto_tabpage(n)
tabpage_T *tp;
int i;
+ /* If there is only one it can't work. */
+ if (first_tabpage->tp_next == NULL)
+ {
+ if (n > 1)
+ beep_flush();
+ return;
+ }
+
if (n == 0)
{
/* No count, go to next tab page, wrap around end. */
@@ -5018,7 +5064,7 @@ last_status_rec(fr, statusline)
int
tabpageline_height()
{
- switch (p_tal)
+ switch (p_stal)
{
case 0: return 0;
case 1: return (first_tabpage->tp_next == NULL) ? 0 : 1;
@@ -5419,7 +5465,6 @@ check_lnums(do_curwin)
* fr_child
* fr_win (only valid for the old curwin, NULL otherwise)
*/
-static frame_T *snapshot = NULL;
/*
* Create a snapshot of the current frame sizes.
@@ -5427,8 +5472,8 @@ static frame_T *snapshot = NULL;
static void
make_snapshot()
{
- clear_snapshot();
- make_snapshot_rec(topframe, &snapshot);
+ clear_snapshot(curtab);
+ make_snapshot_rec(topframe, &curtab->tp_snapshot);
}
static void
@@ -5456,10 +5501,11 @@ make_snapshot_rec(fr, frp)
* Remove any existing snapshot.
*/
static void
-clear_snapshot()
+clear_snapshot(tp)
+ tabpage_T *tp;
{
- clear_snapshot_rec(snapshot);
- snapshot = NULL;
+ clear_snapshot_rec(tp->tp_snapshot);
+ tp->tp_snapshot = NULL;
}
static void
@@ -5485,20 +5531,20 @@ restore_snapshot(close_curwin)
{
win_T *wp;
- if (snapshot != NULL
+ if (curtab->tp_snapshot != NULL
# ifdef FEAT_VERTSPLIT
- && snapshot->fr_width == topframe->fr_width
+ && curtab->tp_snapshot->fr_width == topframe->fr_width
# endif
- && snapshot->fr_height == topframe->fr_height
- && check_snapshot_rec(snapshot, topframe) == OK)
+ && curtab->tp_snapshot->fr_height == topframe->fr_height
+ && check_snapshot_rec(curtab->tp_snapshot, topframe) == OK)
{
- wp = restore_snapshot_rec(snapshot, topframe);
+ wp = restore_snapshot_rec(curtab->tp_snapshot, topframe);
win_comp_pos();
if (wp != NULL && close_curwin)
win_goto(wp);
redraw_all_later(CLEAR);
}
- clear_snapshot();
+ clear_snapshot(curtab);
}
/*