summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile8
-rw-r--r--src/configure.in2
-rw-r--r--src/edit.c2
-rw-r--r--src/eval.c148
-rw-r--r--src/ex_cmds.c2
-rw-r--r--src/ex_cmds.h6
-rw-r--r--src/globals.h1
-rw-r--r--src/hardcopy.c7
-rw-r--r--src/option.c31
-rw-r--r--src/option.h5
-rw-r--r--src/proto/window.pro2
-rw-r--r--src/quickfix.c30
-rw-r--r--src/screen.c212
-rw-r--r--src/structs.h1
-rw-r--r--src/syntax.c8
-rw-r--r--src/version.h4
16 files changed, 327 insertions, 142 deletions
diff --git a/src/Makefile b/src/Makefile
index a4b7d207c0..1cdfd742d4 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -547,6 +547,10 @@ LINT_OPTIONS = -beprxzF
#PROFILE_CFLAGS = -DEXITFREE
#PROFILE_LIBS = -lccmalloc
+# MAC OS X platform
+#MAC_OSX_ARCH = -arch ppc
+MAC_OSX_ARCH = -arch i386 -arch ppc
+
#####################################################
### Specific systems, check if yours is listed! ### {{{
#####################################################
@@ -1197,11 +1201,11 @@ PHOTONGUI_BUNDLE =
# CARBON GUI
CARBONGUI_SRC = gui.c gui_mac.c
CARBONGUI_OBJ = objects/gui.o objects/gui_mac.o objects/pty.o
-CARBONGUI_DEFS = -DFEAT_GUI_MAC -arch ppc -fno-common -fpascal-strings \
+CARBONGUI_DEFS = -DFEAT_GUI_MAC $(MAC_OSX_ARCH) -fno-common -fpascal-strings \
-Wall -Wno-unknown-pragmas \
-mdynamic-no-pic -pipe
CARBONGUI_IPATH = -I. -Iproto
-CARBONGUI_LIBS_DIR =
+CARBONGUI_LIBS_DIR = $(MAC_OSX_ARCH)
CARBONGUI_LIBS1 = -framework Carbon
CARBONGUI_LIBS2 =
CARBONGUI_INSTALL = install_macosx
diff --git a/src/configure.in b/src/configure.in
index 4324101b81..913d3e9a40 100644
--- a/src/configure.in
+++ b/src/configure.in
@@ -106,7 +106,7 @@ if test "`(uname) 2>/dev/null`" = Darwin; then
MACOSX=yes
OS_EXTRA_SCR="os_macosx.c os_mac_conv.c";
OS_EXTRA_OBJ="objects/os_macosx.o objects/os_mac_conv.o"
- CPPFLAGS="$CPPFLAGS -DMACOS_X_UNIX -I/Developer/Headers/FlatCarbon -no-cpp-precomp"
+ CPPFLAGS="$CPPFLAGS -DMACOS_X_UNIX -I/Developer/Headers/FlatCarbon -no-cpp-precomp -arch i386 -arch ppc"
dnl If Carbon is found, assume we don't want X11
dnl unless it was specifically asked for (--with-x)
diff --git a/src/edit.c b/src/edit.c
index cb78cd62d9..b57b56707e 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -2845,7 +2845,7 @@ ins_compl_addfrommatch()
int c;
p = compl_shown_match->cp_str;
- if (STRLEN(p) <= len) /* the match is too short */
+ if ((int)STRLEN(p) <= len) /* the match is too short */
return;
p += len;
#ifdef FEAT_MBYTE
diff --git a/src/eval.c b/src/eval.c
index b0202cdb32..f857b8fc9d 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -621,7 +621,9 @@ static void f_synID __ARGS((typval_T *argvars, typval_T *rettv));
static void f_synIDattr __ARGS((typval_T *argvars, typval_T *rettv));
static void f_synIDtrans __ARGS((typval_T *argvars, typval_T *rettv));
static void f_system __ARGS((typval_T *argvars, typval_T *rettv));
+static void f_tabpagebuflist __ARGS((typval_T *argvars, typval_T *rettv));
static void f_tabpagenr __ARGS((typval_T *argvars, typval_T *rettv));
+static void f_tabpagewinnr __ARGS((typval_T *argvars, typval_T *rettv));
static void f_taglist __ARGS((typval_T *argvars, typval_T *rettv));
static void f_tagfiles __ARGS((typval_T *argvars, typval_T *rettv));
static void f_tempname __ARGS((typval_T *argvars, typval_T *rettv));
@@ -6984,7 +6986,9 @@ static struct fst
{"synIDattr", 2, 3, f_synIDattr},
{"synIDtrans", 1, 1, f_synIDtrans},
{"system", 1, 2, f_system},
+ {"tabpagebuflist", 0, 1, f_tabpagebuflist},
{"tabpagenr", 0, 1, f_tabpagenr},
+ {"tabpagewinnr", 1, 2, f_tabpagewinnr},
{"tagfiles", 0, 0, f_tagfiles},
{"taglist", 1, 1, f_taglist},
{"tempname", 0, 0, f_tempname},
@@ -14870,6 +14874,52 @@ done:
}
/*
+ * "tabpagebuflist()" function
+ */
+/* ARGSUSED */
+ static void
+f_tabpagebuflist(argvars, rettv)
+ typval_T *argvars;
+ typval_T *rettv;
+{
+#ifndef FEAT_WINDOWS
+ rettv->vval.v_number = 0;
+#else
+ tabpage_T *tp;
+ win_T *wp = NULL;
+ list_T *l;
+
+ if (argvars[0].v_type == VAR_UNKNOWN)
+ wp = firstwin;
+ else
+ {
+ tp = find_tabpage((int)get_tv_number(&argvars[0]));
+ if (tp != NULL)
+ wp = tp->tp_firstwin;
+ }
+ if (wp == NULL)
+ rettv->vval.v_number = 0;
+ else
+ {
+ l = list_alloc();
+ if (l == NULL)
+ rettv->vval.v_number = 0;
+ else
+ {
+ rettv->vval.v_list = l;
+ rettv->v_type = VAR_LIST;
+ ++l->lv_refcount;
+
+ for (; wp != NULL; wp = wp->w_next)
+ if (list_append_number(l, wp->w_buffer->b_fnum) == FAIL)
+ break;
+ }
+ }
+#endif
+}
+
+
+/*
* "tabpagenr()" function
*/
/* ARGSUSED */
@@ -14903,6 +14953,75 @@ f_tabpagenr(argvars, rettv)
rettv->vval.v_number = nr;
}
+
+#ifdef FEAT_WINDOWS
+static int get_winnr __ARGS((tabpage_T *tp, typval_T *argvar));
+
+/*
+ * Common code for tabpagewinnr() and winnr().
+ */
+ static int
+get_winnr(tp, argvar)
+ tabpage_T *tp;
+ typval_T *argvar;
+{
+ win_T *twin;
+ int nr = 1;
+ win_T *wp;
+ char_u *arg;
+
+ twin = (tp == curtab) ? curwin : tp->tp_curwin;
+ if (argvar->v_type != VAR_UNKNOWN)
+ {
+ arg = get_tv_string_chk(argvar);
+ if (arg == NULL)
+ nr = 0; /* type error; errmsg already given */
+ else if (STRCMP(arg, "$") == 0)
+ twin = (tp == curtab) ? lastwin : tp->tp_lastwin;
+ else if (STRCMP(arg, "#") == 0)
+ {
+ twin = (tp == curtab) ? prevwin : tp->tp_prevwin;
+ if (twin == NULL)
+ nr = 0;
+ }
+ else
+ {
+ EMSG2(_(e_invexpr2), arg);
+ nr = 0;
+ }
+ }
+
+ if (nr > 0)
+ for (wp = (tp == curtab) ? firstwin : tp->tp_firstwin;
+ wp != twin; wp = wp->w_next)
+ ++nr;
+ return nr;
+}
+#endif
+
+/*
+ * "tabpagewinnr()" function
+ */
+/* ARGSUSED */
+ static void
+f_tabpagewinnr(argvars, rettv)
+ typval_T *argvars;
+ typval_T *rettv;
+{
+ int nr = 1;
+#ifdef FEAT_WINDOWS
+ tabpage_T *tp;
+
+ tp = find_tabpage((int)get_tv_number(&argvars[0]));
+ if (tp == NULL)
+ nr = 0;
+ else
+ nr = get_winnr(tp, &argvars[1]);
+#endif
+ rettv->vval.v_number = nr;
+}
+
+
/*
* "tagfiles()" function
*/
@@ -15357,34 +15476,9 @@ f_winnr(argvars, rettv)
typval_T *rettv;
{
int nr = 1;
-#ifdef FEAT_WINDOWS
- win_T *wp;
- win_T *twin = curwin;
- char_u *arg;
- if (argvars[0].v_type != VAR_UNKNOWN)
- {
- arg = get_tv_string_chk(&argvars[0]);
- if (arg == NULL)
- nr = 0; /* type error; errmsg already given */
- else if (STRCMP(arg, "$") == 0)
- twin = lastwin;
- else if (STRCMP(arg, "#") == 0)
- {
- twin = prevwin;
- if (prevwin == NULL)
- nr = 0;
- }
- else
- {
- EMSG2(_(e_invexpr2), arg);
- nr = 0;
- }
- }
-
- if (nr > 0)
- for (wp = firstwin; wp != twin; wp = wp->w_next)
- ++nr;
+#ifdef FEAT_WINDOWS
+ nr = get_winnr(curtab, &argvars[0]);
#endif
rettv->vval.v_number = nr;
}
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index c6cdc5a502..5e4d59840e 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -3425,7 +3425,7 @@ do_ecmd(fnum, ffname, sfname, eap, newlnum, flags)
* autocommands. This allows for the autocommands to position the
* cursor.
*/
- win_init(curwin);
+ curwin_init();
#ifdef FEAT_FOLDING
/* It's like all lines in the buffer changed. Need to update
diff --git a/src/ex_cmds.h b/src/ex_cmds.h
index 9ab8b885ad..49e86a4583 100644
--- a/src/ex_cmds.h
+++ b/src/ex_cmds.h
@@ -881,11 +881,11 @@ EX(CMD_tab, "tab", ex_tab,
RANGE|NOTADR|COUNT|TRLBAR),
EX(CMD_tabclose, "tabclose", ex_tabclose,
RANGE|NOTADR|COUNT|BANG|TRLBAR|CMDWIN),
-EX(CMD_tabedit, "tabedit", ex_tabedit,
+EX(CMD_tabedit, "tabedit", ex_splitview,
BANG|FILE1|RANGE|NOTADR|EDITCMD|ARGOPT|TRLBAR),
-EX(CMD_tabfind, "tabfind", ex_tabedit,
+EX(CMD_tabfind, "tabfind", ex_splitview,
BANG|FILE1|RANGE|NOTADR|EDITCMD|ARGOPT|NEEDARG|TRLBAR),
-EX(CMD_tabnew, "tabnew", ex_tabedit,
+EX(CMD_tabnew, "tabnew", ex_splitview,
BANG|FILE1|RANGE|NOTADR|EDITCMD|ARGOPT|TRLBAR),
EX(CMD_tabonly, "tabonly", ex_tabonly,
TRLBAR|CMDWIN),
diff --git a/src/globals.h b/src/globals.h
index 0cea5c28bf..23fdd6673d 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -495,6 +495,7 @@ EXTERN win_T *prevwin INIT(= NULL); /* previous window */
# define lastwin curwin
# define W_NEXT(wp) NULL
# define FOR_ALL_WINDOWS(wp) wp = curwin;
+# define FOR_ALL_TAB_WINDOWS(tp, wp) wp = curwin;
#endif
EXTERN win_T *curwin; /* currently active window */
diff --git a/src/hardcopy.c b/src/hardcopy.c
index 5cfeb8bbc4..61905b0a7a 100644
--- a/src/hardcopy.c
+++ b/src/hardcopy.c
@@ -475,6 +475,7 @@ prt_header(psettings, pagenum, lnum)
if (*p_header != NUL)
{
linenr_T tmp_lnum, tmp_topline, tmp_botline;
+ int use_sandbox = FALSE;
/*
* Need to (temporarily) set current line number and first/last line
@@ -490,8 +491,12 @@ prt_header(psettings, pagenum, lnum)
curwin->w_botline = lnum + 63;
printer_page_num = pagenum;
+# ifdef FEAT_EVAL
+ use_sandbox = was_set_insecurely((char_u *)"printheader");
+# endif
build_stl_str_hl(curwin, tbuf, (size_t)(width + IOSIZE),
- p_header, ' ', width, NULL);
+ p_header, use_sandbox,
+ ' ', width, NULL);
/* Reset line numbers */
curwin->w_cursor.lnum = tmp_lnum;
diff --git a/src/option.c b/src/option.c
index e955f7f03e..601a97aa24 100644
--- a/src/option.c
+++ b/src/option.c
@@ -1142,7 +1142,7 @@ static struct vimoption
{(char_u *)FALSE, (char_u *)0L}},
{"highlight", "hl", P_STRING|P_VI_DEF|P_RCLR|P_COMMA|P_NODUP,
(char_u *)&p_hl, PV_NONE,
- {(char_u *)"8:SpecialKey,@:NonText,d:Directory,e:ErrorMsg,i:IncSearch,l:Search,m:MoreMsg,M:ModeMsg,n:LineNr,r:Question,s:StatusLine,S:StatusLineNC,c:VertSplit,t:Title,v:Visual,V:VisualNOS,w:WarningMsg,W:WildMenu,f:Folded,F:FoldColumn,A:DiffAdd,C:DiffChange,D:DiffDelete,T:DiffText,>:SignColumn,B:SpellBad,P:SpellCap,R:SpellRare,L:SpellLocal,+:Pmenu,=:PmenuSel,x:PmenuSbar,X:PmenuThumb,*:TabPage,#:TabPageSel,_:TabPageFill",
+ {(char_u *)"8:SpecialKey,@:NonText,d:Directory,e:ErrorMsg,i:IncSearch,l:Search,m:MoreMsg,M:ModeMsg,n:LineNr,r:Question,s:StatusLine,S:StatusLineNC,c:VertSplit,t:Title,v:Visual,V:VisualNOS,w:WarningMsg,W:WildMenu,f:Folded,F:FoldColumn,A:DiffAdd,C:DiffChange,D:DiffDelete,T:DiffText,>:SignColumn,B:SpellBad,P:SpellCap,R:SpellRare,L:SpellLocal,+:Pmenu,=:PmenuSel,x:PmenuSbar,X:PmenuThumb,*:TabLine,#:TabLineSel,_:TabLineFill",
(char_u *)0L}},
{"history", "hi", P_NUM|P_VIM,
(char_u *)&p_hi, PV_NONE,
@@ -2046,6 +2046,13 @@ static struct vimoption
{"showmode", "smd", P_BOOL|P_VIM,
(char_u *)&p_smd, PV_NONE,
{(char_u *)FALSE, (char_u *)TRUE}},
+ {"showtabline", "stal", P_NUM|P_VI_DEF|P_RALL,
+#ifdef FEAT_WINDOWS
+ (char_u *)&p_stal, PV_NONE,
+#else
+ (char_u *)NULL, PV_NONE,
+#endif
+ {(char_u *)1L, (char_u *)0L}},
{"sidescroll", "ss", P_NUM|P_VI_DEF,
(char_u *)&p_ss, PV_NONE,
{(char_u *)0L, (char_u *)0L}},
@@ -2181,13 +2188,13 @@ static struct vimoption
{(char_u *)0L, (char_u *)0L}
#endif
},
- {"tabline", "tal", P_NUM|P_VI_DEF|P_RALL,
-#ifdef FEAT_WINDOWS
+ {"tabline", "tal", P_STRING|P_VI_DEF|P_RALL,
+#ifdef FEAT_STL_OPT
(char_u *)&p_tal, PV_NONE,
#else
(char_u *)NULL, PV_NONE,
#endif
- {(char_u *)1L, (char_u *)0L}},
+ {(char_u *)"", (char_u *)0L}},
{"tabstop", "ts", P_NUM|P_VI_DEF|P_RBUF,
(char_u *)&p_ts, PV_TS,
{(char_u *)8L, (char_u *)0L}},
@@ -3181,8 +3188,10 @@ set_option_default(opt_idx, opt_flags, compatible)
*(int *)varp;
}
- /* the default value is not insecure */
- options[opt_idx].flags &= ~P_INSECURE;
+ /* The default value is not insecure. But if there are local values
+ * we can't be sure. */
+ if (options[opt_idx].indir == PV_NONE)
+ options[opt_idx].flags &= ~P_INSECURE;
}
#ifdef FEAT_EVAL
@@ -3351,12 +3360,12 @@ set_init_2()
static char_u *
term_bg_default()
{
- char_u *p;
-
#if defined(MSDOS) || defined(OS2) || defined(WIN3264)
/* DOS console nearly always black */
return (char_u *)"dark";
#else
+ char_u *p;
+
if (STRCMP(T_NAME, "linux") == 0
|| STRCMP(T_NAME, "screen.linux") == 0
|| STRCMP(T_NAME, "cygwin") == 0
@@ -4462,14 +4471,14 @@ did_set_option(opt_idx, opt_flags, new_value)
/* When an option is set in the sandbox, from a modeline or in secure mode
* set the P_INSECURE flag. Otherwise, if a new value is stored reset the
- * flag. */
+ * flag. But not when there are local values. */
if (secure
#ifdef HAVE_SANDBOX
|| sandbox != 0
#endif
|| (opt_flags & OPT_MODELINE))
options[opt_idx].flags |= P_INSECURE;
- else if (new_value)
+ else if (new_value && options[opt_idx].indir == PV_NONE)
options[opt_idx].flags &= ~P_INSECURE;
}
@@ -7284,7 +7293,7 @@ set_num_option(opt_idx, varp, value, errbuf, errbuflen, opt_flags)
}
/* (re)set tab page line */
- else if (pp == &p_tal)
+ else if (pp == &p_stal)
{
shell_new_rows(); /* recompute window positions and heights */
}
diff --git a/src/option.h b/src/option.h
index d3c01ecd1a..4dac4cc338 100644
--- a/src/option.h
+++ b/src/option.h
@@ -577,7 +577,7 @@ EXTERN char_u *p_lispwords; /* 'lispwords' */
#endif
#ifdef FEAT_WINDOWS
EXTERN long p_ls; /* 'laststatus' */
-EXTERN long p_tal; /* 'tabline' */
+EXTERN long p_stal; /* 'showtabline' */
#endif
EXTERN char_u *p_lcs; /* 'listchars' */
@@ -716,6 +716,9 @@ EXTERN int p_scs; /* 'smartcase' */
EXTERN int p_sta; /* 'smarttab' */
#ifdef FEAT_WINDOWS
EXTERN int p_sb; /* 'splitbelow' */
+# if defined(FEAT_STL_OPT)
+EXTERN char_u *p_tal; /* 'tabline' */
+# endif
#endif
#ifdef FEAT_SYN_HL
EXTERN char_u *p_sps; /* 'spellsuggest' */
diff --git a/src/proto/window.pro b/src/proto/window.pro
index 7fa357270b..cda7b060d5 100644
--- a/src/proto/window.pro
+++ b/src/proto/window.pro
@@ -11,7 +11,7 @@ void win_close __ARGS((win_T *win, int free_buf));
void win_close_othertab __ARGS((win_T *win, int free_buf, tabpage_T *tp));
void win_free_all __ARGS((void));
void close_others __ARGS((int message, int forceit));
-void win_init __ARGS((win_T *wp));
+void curwin_init __ARGS((void));
int win_alloc_first __ARGS((void));
void win_init_size __ARGS((void));
int win_new_tabpage __ARGS((void));
diff --git a/src/quickfix.c b/src/quickfix.c
index 7243e1bdf3..2ffce40a81 100644
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -2887,11 +2887,14 @@ ex_vimgrep(eap)
int found_match;
buf_T *first_match_buf = NULL;
time_t seconds = 0;
+ int save_mls;
#if defined(FEAT_AUTOCMD) && defined(FEAT_SYN_HL)
char_u *save_ei = NULL;
- aco_save_T aco;
#endif
-#ifdef FEAT_AUTOCMD
+#ifndef FEAT_AUTOCMD
+ buf_T *save_curbuf;
+#else
+ aco_save_T aco;
char_u *au_name = NULL;
int flags = 0;
colnr_T col;
@@ -2999,11 +3002,15 @@ ex_vimgrep(eap)
* indent scripts, a great speed improvement. */
save_ei = au_event_disable(",Filetype");
#endif
+ /* Don't use modelines here, it's useless. */
+ save_mls = p_mls;
+ p_mls = 0;
/* Load file into a buffer, so that 'fileencoding' is detected,
* autocommands applied, etc. */
buf = load_dummy_buffer(fnames[fi]);
+ p_mls = save_mls;
#if defined(FEAT_AUTOCMD) && defined(FEAT_SYN_HL)
au_event_restore(save_ei);
#endif
@@ -3089,19 +3096,30 @@ ex_vimgrep(eap)
}
}
-#if defined(FEAT_AUTOCMD) && defined(FEAT_SYN_HL)
if (buf != NULL)
{
/* The buffer is still loaded, the Filetype autocommands
- * need to be done now, in that buffer. And then the
- * modelines need to be done (again). */
+ * need to be done now, in that buffer. And the modelines
+ * need to be done (again). */
+#if defined(FEAT_AUTOCMD)
aucmd_prepbuf(&aco, buf);
+#else
+ save_curbuf = curbuf;
+ curbuf = buf;
+ curwin->w_buffer = curbuf;
+#endif
+#if defined(FEAT_AUTOCMD) && defined(FEAT_SYN_HL)
apply_autocmds(EVENT_FILETYPE, buf->b_p_ft,
buf->b_fname, TRUE, buf);
+#endif
do_modelines(FALSE);
+#if defined(FEAT_AUTOCMD)
aucmd_restbuf(&aco);
- }
+#else
+ curbuf = save_curbuf;
+ curwin->w_buffer = curbuf;
#endif
+ }
}
}
}
diff --git a/src/screen.c b/src/screen.c
index f36ac81a45..d6b9b7d55f 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -168,7 +168,7 @@ static int win_do_lines __ARGS((win_T *wp, int row, int line_count, int mayclear
static void win_rest_invalid __ARGS((win_T *wp));
static void msg_pos_mode __ARGS((void));
#if defined(FEAT_WINDOWS)
-static void draw_tabpage __ARGS((void));
+static void draw_tabline __ARGS((void));
#endif
#if defined(FEAT_WINDOWS) || defined(FEAT_WILDMENU) || defined(FEAT_STL_OPT)
static int fillchar_status __ARGS((int *attr, int is_curwin));
@@ -420,7 +420,7 @@ update_screen(type)
#ifdef FEAT_LINEBREAK
/* Force redraw when width of 'number' column changes. */
if (curwin->w_redr_type < NOT_VALID
- && curwin->w_nrwidth != number_width(curwin))
+ && curwin->w_nrwidth != (curwin->w_p_nu ? number_width(curwin) : 0))
curwin->w_redr_type = NOT_VALID;
#endif
@@ -477,7 +477,7 @@ update_screen(type)
#ifdef FEAT_WINDOWS
/* Redraw the tab pages line if needed. */
if (redraw_tabline || type >= NOT_VALID)
- draw_tabpage();
+ draw_tabline();
#endif
/*
@@ -707,7 +707,7 @@ updateWindow(wp)
#ifdef FEAT_WINDOWS
/* When the screen was cleared redraw the tab pages line. */
if (redraw_tabline)
- draw_tabpage();
+ draw_tabline();
if (wp->w_redr_status
# ifdef FEAT_CMDL_INFO
@@ -845,11 +845,11 @@ win_update(wp)
#ifdef FEAT_LINEBREAK
/* Force redraw when width of 'number' column changes. */
- i = number_width(curwin);
- if (curwin->w_nrwidth != i)
+ i = wp->w_p_nu ? number_width(wp) : 0;
+ if (wp->w_nrwidth != i)
{
type = NOT_VALID;
- curwin->w_nrwidth = i;
+ wp->w_nrwidth = i;
}
else
#endif
@@ -4965,7 +4965,7 @@ redraw_statuslines()
if (wp->w_redr_status)
win_redr_status(wp);
if (redraw_tabline)
- draw_tabpage();
+ draw_tabline();
}
#endif
@@ -5543,7 +5543,8 @@ get_keymap_str(wp, buf, len)
#if defined(FEAT_STL_OPT) || defined(PROTO)
/*
- * Redraw the status line or ruler of window wp.
+ * Redraw the status line or ruler of window "wp".
+ * When "wp" is NULL redraw the tab pages line from 'tabline'.
*/
static void
win_redr_custom(wp, draw_ruler)
@@ -5562,56 +5563,88 @@ win_redr_custom(wp, draw_ruler)
char_u buf[MAXPATHL];
char_u *p;
struct stl_hlrec hl[STL_MAX_ITEM];
+ int use_sandbox = FALSE;
/* setup environment for the task at hand */
- row = W_WINROW(wp) + wp->w_height;
- fillchar = fillchar_status(&attr, wp == curwin);
- maxwidth = W_WIDTH(wp);
- if (*wp->w_p_stl != NUL)
- p = wp->w_p_stl;
+ if (wp == NULL)
+ {
+ /* Use 'tabline'. Always at the first line of the screen. */
+ p = p_tal;
+ row = 0;
+ fillchar = t_colors < 8 ? '_' : ' ';
+ attr = hl_attr(HLF_TPF);
+ maxwidth = Columns;
+# ifdef FEAT_EVAL
+ use_sandbox = was_set_insecurely((char_u *)"tabline");
+# endif
+ }
else
- p = p_stl;
- if (draw_ruler)
{
- p = p_ruf;
- /* advance past any leading group spec - implicit in ru_col */
- if (*p == '%')
+ row = W_WINROW(wp) + wp->w_height;
+ fillchar = fillchar_status(&attr, wp == curwin);
+ maxwidth = W_WIDTH(wp);
+
+ if (draw_ruler)
{
- if (*++p == '-')
- p++;
- if (atoi((char *) p))
- while (VIM_ISDIGIT(*p))
+ p = p_ruf;
+ /* advance past any leading group spec - implicit in ru_col */
+ if (*p == '%')
+ {
+ if (*++p == '-')
p++;
- if (*p++ != '(')
- p = p_ruf;
- }
+ if (atoi((char *) p))
+ while (VIM_ISDIGIT(*p))
+ p++;
+ if (*p++ != '(')
+ p = p_ruf;
+ }
#ifdef FEAT_VERTSPLIT
- col = ru_col - (Columns - W_WIDTH(wp));
- if (col < (W_WIDTH(wp) + 1) / 2)
- col = (W_WIDTH(wp) + 1) / 2;
+ col = ru_col - (Columns - W_WIDTH(wp));
+ if (col < (W_WIDTH(wp) + 1) / 2)
+ col = (W_WIDTH(wp) + 1) / 2;
#else
- col = ru_col;
- if (col > (Columns + 1) / 2)
- col = (Columns + 1) / 2;
+ col = ru_col;
+ if (col > (Columns + 1) / 2)
+ col = (Columns + 1) / 2;
#endif
- maxwidth = W_WIDTH(wp) - col;
+ maxwidth = W_WIDTH(wp) - col;
#ifdef FEAT_WINDOWS
- if (!wp->w_status_height)
+ if (!wp->w_status_height)
#endif
+ {
+ row = Rows - 1;
+ --maxwidth; /* writing in last column may cause scrolling */
+ fillchar = ' ';
+ attr = 0;
+ }
+
+# ifdef FEAT_EVAL
+ use_sandbox = was_set_insecurely((char_u *)"rulerformat");
+# endif
+ }
+ else
{
- row = Rows - 1;
- --maxwidth; /* writing in last column may cause scrolling */
- fillchar = ' ';
- attr = 0;
+ if (*wp->w_p_stl != NUL)
+ p = wp->w_p_stl;
+ else
+ p = p_stl;
+# ifdef FEAT_EVAL
+ use_sandbox = was_set_insecurely((char_u *)"statusline");
+# endif
}
+
+#ifdef FEAT_VERTSPLIT
+ col += W_WINCOL(wp);
+#endif
}
+
if (maxwidth <= 0)
return;
-#ifdef FEAT_VERTSPLIT
- col += W_WINCOL(wp);
-#endif
- width = build_stl_str_hl(wp, buf, sizeof(buf), p, fillchar, maxwidth, hl);
+ width = build_stl_str_hl(wp == NULL ? curwin : wp,
+ buf, sizeof(buf),
+ p, use_sandbox,
+ fillchar, maxwidth, hl);
len = STRLEN(buf);
while (width < maxwidth && len < sizeof(buf) - 1)
@@ -6822,7 +6855,7 @@ screenalloc(clear)
new_TabPageIdxs = (char_u *)lalloc((long_u)(Columns * sizeof(char_u)), FALSE);
#endif
- FOR_ALL_WINDOWS(wp)
+ FOR_ALL_TAB_WINDOWS(tp, wp)
{
if (win_alloc_lines(wp) == FAIL)
{
@@ -8456,14 +8489,13 @@ unshowmode(force)
* Draw the tab pages line at the top of the Vim window.
*/
static void
-draw_tabpage()
+draw_tabline()
{
int tabcount = 0;
tabpage_T *tp;
int tabwidth;
int col = 0;
int scol = 0;
- int had_current = FALSE;
int attr;
win_T *wp;
win_T *cwp;
@@ -8475,12 +8507,27 @@ draw_tabpage()
int attr_nosel = hl_attr(HLF_TP);
int attr_fill = hl_attr(HLF_TPF);
char_u *p;
+ int room;
+ int use_sep_chars = (t_colors < 8
+#ifdef FEAT_GUI
+ && !gui.in_use
+#endif
+ );
redraw_tabline = FALSE;
if (tabpageline_height() < 1)
return;
+#if defined(FEAT_STL_OPT)
+ /* Use the 'tabline' option if it's set. */
+ if (*p_tal != NUL)
+ {
+ win_redr_custom(NULL, FALSE);
+ return;
+ }
+#endif
+
for (tp = first_tabpage; tp != NULL; tp = tp->tp_next)
++tabcount;
@@ -8495,17 +8542,9 @@ draw_tabpage()
scol = col;
if (tp->tp_topframe == topframe)
- {
- c = '/';
- had_current = TRUE;
attr = attr_sel;
- }
- else if (!had_current)
- c = '/';
- else
- c = '\\';
- if (t_colors < 8)
- screen_putchar(c, 0, col++, attr);
+ if (use_sep_chars && col > 0)
+ screen_putchar('|', 0, col++, attr);
if (tp->tp_topframe != topframe)
attr = attr_nosel;
@@ -8531,32 +8570,49 @@ draw_tabpage()
{
if (wincount > 1)
{
- vim_snprintf((char *)NameBuff, MAXPATHL, "#%d", wincount);
+ vim_snprintf((char *)NameBuff, MAXPATHL, "%d", wincount);
len = STRLEN(NameBuff);
- screen_puts_len(NameBuff, len, 0, col, attr);
+ screen_puts_len(NameBuff, len, 0, col,
+#if defined(FEAT_SYN_HL)
+ hl_combine_attr(attr, hl_attr(HLF_T))
+#else
+ attr
+#endif
+ );
col += len;
}
if (modified)
- screen_puts_len((char_u *)"+", 2, 0, col++, attr);
+ screen_puts_len((char_u *)"+", 1, 0, col++, attr);
screen_putchar(' ', 0, col++, attr);
}
- if (buf_spname(cwp->w_buffer) != NULL)
- STRCPY(NameBuff, buf_spname(cwp->w_buffer));
- else
- home_replace(cwp->w_buffer, cwp->w_buffer->b_fname, NameBuff,
- MAXPATHL, TRUE);
- trans_characters(NameBuff, MAXPATHL);
- len = STRLEN(NameBuff);
- p = NameBuff;
- if (len > scol - col + tabwidth - 1) /* TODO: multi-byte chars */
+ room = scol - col + tabwidth - 1;
+ if (room > 0)
{
- p += len - (scol - col + tabwidth - 1);
- len = scol - col + tabwidth - 1;
- }
- if (len > 0)
- {
- screen_puts_len(p, len, 0, col, attr);
+ if (buf_spname(cwp->w_buffer) != NULL)
+ STRCPY(NameBuff, buf_spname(cwp->w_buffer));
+ else
+ home_replace(cwp->w_buffer, cwp->w_buffer->b_fname, NameBuff,
+ MAXPATHL, TRUE);
+ trans_characters(NameBuff, MAXPATHL);
+ len = vim_strsize(NameBuff);
+ p = NameBuff;
+#ifdef FEAT_MBYTE
+ if (has_mbyte)
+ while (len > room)
+ {
+ len -= ptr2cells(p);
+ mb_ptr_adv(p);
+ }
+ else
+#endif
+ if (len > room)
+ {
+ p += len - room;
+ len = room;
+ }
+
+ screen_puts_len(p, STRLEN(p), 0, col, attr);
col += len;
}
screen_putchar(' ', 0, col++, attr);
@@ -8568,11 +8624,8 @@ draw_tabpage()
TabPageIdxs[scol++] = tabcount;
}
- if (t_colors < 8)
- {
- screen_putchar('\\', 0, col++, attr);
+ if (use_sep_chars)
c = '_';
- }
else
c = ' ';
screen_fill(0, 1, col, (int)Columns, c, c, attr_fill);
@@ -8902,7 +8955,7 @@ win_redr_ruler(wp, always)
#if defined(FEAT_LINEBREAK) || defined(PROTO)
/*
* Return the width of the 'number' column.
- * Zero when 'number' isn't set.
+ * Caller may need to check if 'number' is set.
* Otherwise it depends on 'numberwidth' and the line count.
*/
int
@@ -8912,9 +8965,6 @@ number_width(wp)
int n;
linenr_T lnum;
- if (!wp->w_p_nu)
- return 0;
-
lnum = wp->w_buffer->b_ml.ml_line_count;
if (lnum == wp->w_nrwidth_line_count)
return wp->w_nrwidth_width;
diff --git a/src/structs.h b/src/structs.h
index fac17856db..e5f59f236b 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -1578,6 +1578,7 @@ struct tabpage_S
buf_T *(tp_diffbuf[DB_COUNT]);
int tp_diff_invalid; /* list of diffs is outdated */
#endif
+ frame_T *tp_snapshot; /* window layout snapshot */
};
/*
diff --git a/src/syntax.c b/src/syntax.c
index 2574f3d476..45601539db 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -6079,8 +6079,8 @@ static char *(highlight_init_both[]) =
"DiffText term=reverse cterm=bold ctermbg=Red gui=bold guibg=Red",
"PmenuThumb cterm=reverse gui=reverse",
"PmenuSbar ctermbg=Grey guibg=Grey",
- "TabPageSel term=bold cterm=bold gui=bold",
- "TabPageFill term=reverse cterm=reverse gui=reverse",
+ "TabLineSel term=bold cterm=bold gui=bold",
+ "TabLineFill term=reverse cterm=reverse gui=reverse",
NULL
};
@@ -6109,7 +6109,7 @@ static char *(highlight_init_light[]) =
"DiffAdd term=bold ctermbg=LightBlue guibg=LightBlue",
"DiffChange term=bold ctermbg=LightMagenta guibg=LightMagenta",
"DiffDelete term=bold ctermfg=Blue ctermbg=LightCyan gui=bold guifg=Blue guibg=LightCyan",
- "TabPage term=underline cterm=underline ctermbg=LightGrey gui=underline guibg=LightGrey",
+ "TabLine term=underline cterm=underline ctermbg=LightGrey gui=underline guibg=LightGrey",
NULL
};
@@ -6138,7 +6138,7 @@ static char *(highlight_init_dark[]) =
"DiffAdd term=bold ctermbg=DarkBlue guibg=DarkBlue",
"DiffChange term=bold ctermbg=DarkMagenta guibg=DarkMagenta",
"DiffDelete term=bold ctermfg=Blue ctermbg=DarkCyan gui=bold guifg=Blue guibg=DarkCyan",
- "TabPage term=underline cterm=underline ctermbg=DarkGrey gui=underline guibg=DarkGrey",
+ "TabLine term=underline cterm=underline ctermbg=DarkGrey gui=underline guibg=DarkGrey",
NULL
};
diff --git a/src/version.h b/src/version.h
index e09294a0bd..94588104bf 100644
--- a/src/version.h
+++ b/src/version.h
@@ -36,5 +36,5 @@
#define VIM_VERSION_NODOT "vim70aa"
#define VIM_VERSION_SHORT "7.0aa"
#define VIM_VERSION_MEDIUM "7.0aa ALPHA"
-#define VIM_VERSION_LONG "VIM - Vi IMproved 7.0aa ALPHA (2006 Feb 18)"
-#define VIM_VERSION_LONG_DATE "VIM - Vi IMproved 7.0aa ALPHA (2006 Feb 18, compiled "
+#define VIM_VERSION_LONG "VIM - Vi IMproved 7.0aa ALPHA (2006 Feb 20)"
+#define VIM_VERSION_LONG_DATE "VIM - Vi IMproved 7.0aa ALPHA (2006 Feb 20, compiled "