Compare commits

...

14 Commits

Author SHA1 Message Date
Bram Moolenaar
dd310301ec updated for version 7.2-138 2009-03-11 15:37:53 +00:00
Bram Moolenaar
9d77dccb7f updated for version 7.2-137 2009-03-11 15:28:26 +00:00
Bram Moolenaar
8e8fe9b2b8 updated for version 7.2-136 2009-03-11 14:37:32 +00:00
Bram Moolenaar
60f39aecb1 updated for version 7.2-135 2009-03-11 14:10:38 +00:00
Bram Moolenaar
5d294d19b4 updated for version 7.2-134 2009-03-11 12:11:02 +00:00
Bram Moolenaar
21fa1ed4b5 updated for version 7.2-133 2009-03-11 11:47:18 +00:00
Bram Moolenaar
bf1b7a7efe updated for version 7.2-132 2009-03-05 02:15:53 +00:00
Bram Moolenaar
fab0623bcf updated for version 7.2-131 2009-03-04 03:13:35 +00:00
Bram Moolenaar
76243bd847 updated for version 7.2-130 2009-03-02 01:47:02 +00:00
Bram Moolenaar
e8bd5cea37 updated for version 7.2-129 2009-03-02 01:12:48 +00:00
Bram Moolenaar
c0b3565d55 updated for version 7.2-128 2009-03-01 01:45:35 +00:00
Bram Moolenaar
51306d2d8f updated for version 7.2-127 2009-02-24 03:38:04 +00:00
Bram Moolenaar
de0dfed701 updated for version 7.2-126 2009-02-24 03:30:14 +00:00
Bram Moolenaar
e4bfca808d updated for version 7.2-125 2009-02-24 03:12:40 +00:00
26 changed files with 468 additions and 167 deletions

61
src/auto/configure vendored
View File

@@ -11565,6 +11565,67 @@ _ACEOF
fi
{ $as_echo "$as_me:$LINENO: checking for working volatile" >&5
$as_echo_n "checking for working volatile... " >&6; }
if test "${ac_cv_c_volatile+set}" = set; then
$as_echo_n "(cached) " >&6
else
cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h. */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h. */
int
main ()
{
volatile int x;
int * volatile y = (int *) 0;
return !x && !y;
;
return 0;
}
_ACEOF
rm -f conftest.$ac_objext
if { (ac_try="$ac_compile"
case "(($ac_try" in
*\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
*) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
$as_echo "$ac_try_echo") >&5
(eval "$ac_compile") 2>conftest.er1
ac_status=$?
grep -v '^ *+' conftest.er1 >conftest.err
rm -f conftest.er1
cat conftest.err >&5
$as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
(exit $ac_status); } && {
test -z "$ac_c_werror_flag" ||
test ! -s conftest.err
} && test -s conftest.$ac_objext; then
ac_cv_c_volatile=yes
else
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5
ac_cv_c_volatile=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_volatile" >&5
$as_echo "$ac_cv_c_volatile" >&6; }
if test $ac_cv_c_volatile = no; then
cat >>confdefs.h <<\_ACEOF
#define volatile /**/
_ACEOF
fi
{ $as_echo "$as_me:$LINENO: checking for mode_t" >&5
$as_echo_n "checking for mode_t... " >&6; }
if test "${ac_cv_type_mode_t+set}" = set; then

View File

@@ -50,6 +50,9 @@
/* Define to empty if the keyword does not work. */
#undef const
/* Define to empty if the keyword does not work. */
#undef volatile
/* Define to `int' if <sys/types.h> doesn't define. */
#undef mode_t

View File

@@ -2148,6 +2148,7 @@ fi
dnl Checks for typedefs, structures, and compiler characteristics.
AC_PROG_GCC_TRADITIONAL
AC_C_CONST
AC_C_VOLATILE
AC_TYPE_MODE_T
AC_TYPE_OFF_T
AC_TYPE_PID_T

View File

@@ -1153,7 +1153,7 @@ ex_diffoff(eap)
for (wp = firstwin; wp != NULL; wp = wp->w_next)
{
if (wp == curwin || eap->forceit)
if (wp == curwin || (eap->forceit && wp->w_p_diff))
{
/* Set 'diff', 'scrollbind' off and 'wrap' on. */
wp->w_p_diff = FALSE;

View File

@@ -6541,6 +6541,7 @@ static sign_T *first_sign = NULL;
static int last_sign_typenr = MAX_TYPENR; /* is decremented */
static void sign_list_defined __ARGS((sign_T *sp));
static void sign_undefine __ARGS((sign_T *sp, sign_T *sp_prev));
/*
* ":sign" command
@@ -6749,24 +6750,8 @@ ex_sign(eap)
/* ":sign list {name}" */
sign_list_defined(sp);
else
{
/* ":sign undefine {name}" */
vim_free(sp->sn_name);
vim_free(sp->sn_icon);
#ifdef FEAT_SIGN_ICONS
if (sp->sn_image != NULL)
{
out_flush();
gui_mch_destroy_sign(sp->sn_image);
}
#endif
vim_free(sp->sn_text);
if (sp_prev == NULL)
first_sign = sp->sn_next;
else
sp_prev->sn_next = sp->sn_next;
vim_free(sp);
}
sign_undefine(sp, sp_prev);
}
}
else
@@ -7014,6 +6999,31 @@ sign_list_defined(sp)
}
}
/*
* Undefine a sign and free its memory.
*/
static void
sign_undefine(sp, sp_prev)
sign_T *sp;
sign_T *sp_prev;
{
vim_free(sp->sn_name);
vim_free(sp->sn_icon);
#ifdef FEAT_SIGN_ICONS
if (sp->sn_image != NULL)
{
out_flush();
gui_mch_destroy_sign(sp->sn_image);
}
#endif
vim_free(sp->sn_text);
if (sp_prev == NULL)
first_sign = sp->sn_next;
else
sp_prev->sn_next = sp->sn_next;
vim_free(sp);
}
/*
* Get highlighting attribute for sign "typenr".
* If "line" is TRUE: line highl, if FALSE: text highl.
@@ -7088,6 +7098,18 @@ sign_typenr2name(typenr)
return (char_u *)_("[Deleted]");
}
#if defined(EXITFREE) || defined(PROTO)
/*
* Undefine/free all signs.
*/
void
free_signs()
{
while (first_sign != NULL)
sign_undefine(first_sign, NULL);
}
#endif
#endif
#if defined(FEAT_GUI) || defined(FEAT_CLIENTSERVER) || defined(PROTO)

View File

@@ -5124,7 +5124,11 @@ uc_add_command(name, name_len, rep, argt, def, flags, compl, compl_arg, force)
}
vim_free(cmd->uc_rep);
cmd->uc_rep = 0;
cmd->uc_rep = NULL;
#if defined(FEAT_EVAL) && defined(FEAT_CMDL_COMPL)
vim_free(cmd->uc_compl_arg);
cmd->uc_compl_arg = NULL;
#endif
break;
}
@@ -5941,7 +5945,7 @@ do_ucmd(eap)
for (;;)
{
p = cmd->uc_rep; /* source */
q = buf; /* destinateion */
q = buf; /* destination */
totlen = 0;
for (;;)
@@ -7846,6 +7850,9 @@ free_cd_dir()
{
vim_free(prev_dir);
prev_dir = NULL;
vim_free(globaldir);
globaldir = NULL;
}
#endif
@@ -7868,6 +7875,10 @@ ex_cd(eap)
else
#endif
{
#ifdef FEAT_AUTOCMD
if (allbuf_locked())
return;
#endif
if (vim_strchr(p_cpo, CPO_CHDIR) != NULL && curbufIsChanged()
&& !eap->forceit)
{
@@ -8792,7 +8803,7 @@ ex_mkrc(eap)
else if (*dirnow != NUL
&& (ssop_flags & SSOP_CURDIR) && globaldir != NULL)
{
if (mch_chdir((char *)globaldir) == OK)
if (mch_chdir((char *)globaldir) == 0)
shorten_fnames(TRUE);
}

View File

@@ -2000,8 +2000,8 @@ text_locked_msg()
#if defined(FEAT_AUTOCMD) || defined(PROTO)
/*
* Check if "curbuf_lock" is set and return TRUE when it is and give an error
* message.
* Check if "curbuf_lock" or "allbuf_lock" is set and return TRUE when it is
* and give an error message.
*/
int
curbuf_locked()
@@ -2011,6 +2011,21 @@ curbuf_locked()
EMSG(_("E788: Not allowed to edit another buffer now"));
return TRUE;
}
return allbuf_locked();
}
/*
* Check if "allbuf_lock" is set and return TRUE when it is and give an error
* message.
*/
int
allbuf_locked()
{
if (allbuf_lock > 0)
{
EMSG(_("E811: Not allowed to change buffer information now"));
return TRUE;
}
return FALSE;
}
#endif
@@ -6047,9 +6062,7 @@ ex_window()
# endif
return K_IGNORE;
}
cmdwin_type = ccline.cmdfirstc;
if (cmdwin_type == NUL)
cmdwin_type = '-';
cmdwin_type = get_cmdline_type();
/* Create the command-line buffer empty. */
(void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE, NULL);
@@ -6073,7 +6086,7 @@ ex_window()
/* Showing the prompt may have set need_wait_return, reset it. */
need_wait_return = FALSE;
histtype = hist_char2type(ccline.cmdfirstc);
histtype = hist_char2type(cmdwin_type);
if (histtype == HIST_CMD || histtype == HIST_DEBUG)
{
if (p_wc == TAB)

View File

@@ -69,7 +69,7 @@ static int apply_autocmds_exarg __ARGS((event_T event, char_u *fname, char_u *fn
static int au_find_group __ARGS((char_u *name));
# define AUGROUP_DEFAULT -1 /* default autocmd group */
# define AUGROUP_ERROR -2 /* errornouse autocmd group */
# define AUGROUP_ERROR -2 /* erroneous autocmd group */
# define AUGROUP_ALL -3 /* all autocmd groups */
#endif
@@ -144,7 +144,9 @@ static int get_mac_fio_flags __ARGS((char_u *ptr));
# endif
#endif
static int move_lines __ARGS((buf_T *frombuf, buf_T *tobuf));
#ifdef FEAT_AUTOCMD
static char *e_auchangedbuf = N_("E812: Autocommands changed buffer or buffer name");
#endif
void
filemess(buf, name, s, attr)
@@ -295,6 +297,19 @@ readfile(fname, sfname, from, lines_to_skip, lines_to_read, eap, flags)
int conv_restlen = 0; /* nr of bytes in conv_rest[] */
#endif
#ifdef FEAT_AUTOCMD
/* Remember the initial values of curbuf, curbuf->b_ffname and
* curbuf->b_fname to detect whether they are altered as a result of
* executing nasty autocommands. Also check if "fname" and "sfname"
* point to one of these values. */
buf_T *old_curbuf = curbuf;
char_u *old_b_ffname = curbuf->b_ffname;
char_u *old_b_fname = curbuf->b_fname;
int using_b_ffname = (fname == curbuf->b_ffname)
|| (sfname == curbuf->b_ffname);
int using_b_fname = (fname == curbuf->b_fname)
|| (sfname == curbuf->b_fname);
#endif
write_no_eol_lnum = 0; /* in case it was set by the previous read */
/*
@@ -589,7 +604,21 @@ readfile(fname, sfname, from, lines_to_skip, lines_to_read, eap, flags)
#ifdef FEAT_QUICKFIX
if (!bt_dontwrite(curbuf))
#endif
{
check_need_swap(newfile);
#ifdef FEAT_AUTOCMD
/* SwapExists autocommand may mess things up */
if (curbuf != old_curbuf
|| (using_b_ffname
&& (old_b_ffname != curbuf->b_ffname))
|| (using_b_fname
&& (old_b_fname != curbuf->b_fname)))
{
EMSG(_(e_auchangedbuf));
return FAIL;
}
#endif
}
if (dir_of_file_exists(fname))
filemess(curbuf, sfname, (char_u *)_("[New File]"), 0);
else
@@ -668,6 +697,17 @@ readfile(fname, sfname, from, lines_to_skip, lines_to_read, eap, flags)
#endif
{
check_need_swap(newfile);
#ifdef FEAT_AUTOCMD
if (!read_stdin && (curbuf != old_curbuf
|| (using_b_ffname && (old_b_ffname != curbuf->b_ffname))
|| (using_b_fname && (old_b_fname != curbuf->b_fname))))
{
EMSG(_(e_auchangedbuf));
if (!read_buffer)
close(fd);
return FAIL;
}
#endif
#ifdef UNIX
/* Set swap file protection bits after creating it. */
if (swap_mode > 0 && curbuf->b_ml.ml_mfp->mf_fname != NULL)
@@ -698,7 +738,6 @@ readfile(fname, sfname, from, lines_to_skip, lines_to_read, eap, flags)
{
int m = msg_scroll;
int n = msg_scrolled;
buf_T *old_curbuf = curbuf;
/*
* The file must be closed again, the autocommands may want to change
@@ -740,8 +779,13 @@ readfile(fname, sfname, from, lines_to_skip, lines_to_read, eap, flags)
/*
* Don't allow the autocommands to change the current buffer.
* Try to re-open the file.
*
* Don't allow the autocommands to change the buffer name either
* (cd for example) if it invalidates fname or sfname.
*/
if (!read_stdin && (curbuf != old_curbuf
|| (using_b_ffname && (old_b_ffname != curbuf->b_ffname))
|| (using_b_fname && (old_b_fname != curbuf->b_fname))
|| (fd = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0)) < 0))
{
--no_wait_return;
@@ -5244,13 +5288,16 @@ buf_write_bytes(ip)
/* Convert with iconv(). */
if (ip->bw_restlen > 0)
{
char *fp;
/* Need to concatenate the remainder of the previous call and
* the bytes of the current call. Use the end of the
* conversion buffer for this. */
fromlen = len + ip->bw_restlen;
from = (char *)ip->bw_conv_buf + ip->bw_conv_buflen - fromlen;
mch_memmove((void *)from, ip->bw_rest, (size_t)ip->bw_restlen);
mch_memmove((void *)(from + ip->bw_restlen), buf, (size_t)len);
fp = (char *)ip->bw_conv_buf + ip->bw_conv_buflen - fromlen;
mch_memmove(fp, ip->bw_rest, (size_t)ip->bw_restlen);
mch_memmove(fp + ip->bw_restlen, buf, (size_t)len);
from = fp;
tolen = ip->bw_conv_buflen - fromlen;
}
else
@@ -6320,7 +6367,7 @@ check_timestamps(focus)
if (!stuff_empty() || global_busy || !typebuf_typed()
#ifdef FEAT_AUTOCMD
|| autocmd_busy || curbuf_lock > 0
|| autocmd_busy || curbuf_lock > 0 || allbuf_lock > 0
#endif
)
need_check_timestamps = TRUE; /* check later */
@@ -6522,8 +6569,10 @@ buf_check_timestamp(buf, focus)
set_vim_var_string(VV_FCS_REASON, (char_u *)reason, -1);
set_vim_var_string(VV_FCS_CHOICE, (char_u *)"", -1);
# endif
++allbuf_lock;
n = apply_autocmds(EVENT_FILECHANGEDSHELL,
buf->b_fname, buf->b_fname, FALSE, buf);
--allbuf_lock;
busy = FALSE;
if (n)
{

View File

@@ -482,8 +482,10 @@ EXTERN char *foreground_argument INIT(= NULL);
/*
* While executing external commands or in Ex mode, should not insert GUI
* events in the input buffer: Set hold_gui_events to non-zero.
*
* volatile because it is used in signal handler sig_sysmouse().
*/
EXTERN int hold_gui_events INIT(= 0);
EXTERN volatile int hold_gui_events INIT(= 0);
/*
* When resizing the shell is postponed, remember the new size, and call
@@ -597,7 +599,8 @@ EXTERN int exiting INIT(= FALSE);
EXTERN int really_exiting INIT(= FALSE);
/* TRUE when we are sure to exit, e.g., after
* a deadly signal */
EXTERN int full_screen INIT(= FALSE);
/* volatile because it is used in signal handler deathtrap(). */
EXTERN volatile int full_screen INIT(= FALSE);
/* TRUE when doing full-screen output
* otherwise only writing some messages */
@@ -616,6 +619,11 @@ EXTERN int textlock INIT(= 0);
EXTERN int curbuf_lock INIT(= 0);
/* non-zero when the current buffer can't be
* changed. Used for FileChangedRO. */
EXTERN int allbuf_lock INIT(= 0);
/* non-zero when no buffer name can be
* changed, no buffer can be deleted and
* current directory can't be changed.
* Used for SwapExists et al. */
#endif
#ifdef FEAT_EVAL
# define HAVE_SANDBOX
@@ -739,10 +747,12 @@ EXTERN JMP_BUF x_jump_env;
*/
EXTERN JMP_BUF lc_jump_env; /* argument to SETJMP() */
# ifdef SIGHASARG
EXTERN int lc_signal; /* catched signal number, 0 when no was signal
catched; used for mch_libcall() */
/* volatile because it is used in signal handlers. */
EXTERN volatile int lc_signal; /* caught signal number, 0 when no was signal
caught; used for mch_libcall() */
# endif
EXTERN int lc_active INIT(= FALSE); /* TRUE when lc_jump_env is valid. */
/* volatile because it is used in signal handler deathtrap(). */
EXTERN volatile int lc_active INIT(= FALSE); /* TRUE when lc_jump_env is valid. */
#endif
#if defined(FEAT_MBYTE) || defined(FEAT_POSTSCRIPT)
@@ -986,7 +996,8 @@ EXTERN int curscript INIT(= 0); /* index in scriptin[] */
EXTERN FILE *scriptout INIT(= NULL); /* stream to write script to */
EXTERN int read_cmd_fd INIT(= 0); /* fd to read commands from */
EXTERN int got_int INIT(= FALSE); /* set to TRUE when interrupt
/* volatile because it is used in signal handler catch_sigint(). */
EXTERN volatile int got_int INIT(= FALSE); /* set to TRUE when interrupt
signal occurred */
#ifdef USE_TERM_CONSOLE
EXTERN int term_console INIT(= FALSE); /* set to TRUE when console used */

View File

@@ -1587,6 +1587,8 @@ gui_mch_uninit()
XtCloseDisplay(gui.dpy);
gui.dpy = NULL;
vimShell = (Widget)0;
vim_free(gui_argv);
gui_argv = NULL;
}
/*
@@ -1761,6 +1763,8 @@ gui_mch_exit(rc)
* says that this isn't needed when exiting, so just skip it. */
XtCloseDisplay(gui.dpy);
#endif
vim_free(gui_argv);
gui_argv = NULL;
}
/*
@@ -3439,47 +3443,37 @@ gui_mch_register_sign(signfile)
char_u *signfile;
{
XpmAttributes attrs;
XImage *sign;
XImage *sign = NULL;
int status;
/*
* Setup the color substitution table.
*/
sign = NULL;
if (signfile[0] != NUL && signfile[0] != '-')
{
sign = (XImage *)alloc(sizeof(XImage));
if (sign != NULL)
XpmColorSymbol color[5] =
{
XpmColorSymbol color[5] =
{
{"none", NULL, 0},
{"iconColor1", NULL, 0},
{"bottomShadowColor", NULL, 0},
{"topShadowColor", NULL, 0},
{"selectColor", NULL, 0}
};
attrs.valuemask = XpmColorSymbols;
attrs.numsymbols = 2;
attrs.colorsymbols = color;
attrs.colorsymbols[0].pixel = gui.back_pixel;
attrs.colorsymbols[1].pixel = gui.norm_pixel;
status = XpmReadFileToImage(gui.dpy, (char *)signfile,
{"none", NULL, 0},
{"iconColor1", NULL, 0},
{"bottomShadowColor", NULL, 0},
{"topShadowColor", NULL, 0},
{"selectColor", NULL, 0}
};
attrs.valuemask = XpmColorSymbols;
attrs.numsymbols = 2;
attrs.colorsymbols = color;
attrs.colorsymbols[0].pixel = gui.back_pixel;
attrs.colorsymbols[1].pixel = gui.norm_pixel;
status = XpmReadFileToImage(gui.dpy, (char *)signfile,
&sign, NULL, &attrs);
if (status == 0)
{
/* Sign width is fixed at two columns now.
if (sign->width > gui.sign_width)
gui.sign_width = sign->width + 8; */
}
else
{
vim_free(sign);
sign = NULL;
EMSG(_(e_signdata));
}
if (status == 0)
{
/* Sign width is fixed at two columns now.
if (sign->width > gui.sign_width)
gui.sign_width = sign->width + 8; */
}
else
EMSG(_(e_signdata));
}
return (void *)sign;
@@ -3489,8 +3483,7 @@ gui_mch_register_sign(signfile)
gui_mch_destroy_sign(sign)
void *sign;
{
XFree(((XImage *)sign)->data);
vim_free(sign);
XDestroyImage((XImage*)sign);
}
#endif

View File

@@ -2553,7 +2553,6 @@ do_more_prompt(typed_char)
{
/* Jump to the choices of the dialog. */
retval = TRUE;
lines_left = Rows - 1;
}
else
#endif
@@ -2561,6 +2560,9 @@ do_more_prompt(typed_char)
got_int = TRUE;
quit_more = TRUE;
}
/* When there is some more output (wrapping line) display that
* without another prompt. */
lines_left = Rows - 1;
break;
#ifdef FEAT_CLIPBOARD

View File

@@ -1010,6 +1010,9 @@ free_all_mem()
# if defined(FEAT_PROFILE)
do_cmdline_cmd((char_u *)"profdel *");
# endif
# if defined(FEAT_KEYMAP)
do_cmdline_cmd((char_u *)"set keymap=");
#endif
# ifdef FEAT_TITLE
free_titles();
@@ -1034,6 +1037,9 @@ free_all_mem()
free_regexp_stuff();
free_tag_stuff();
free_cd_dir();
# ifdef FEAT_SIGNS
free_signs();
# endif
# ifdef FEAT_EVAL
set_expr_line(NULL);
# endif

150
src/ops.c
View File

@@ -72,11 +72,11 @@ static struct yankreg *y_previous = NULL; /* ptr to last written yankreg */
*/
struct block_def
{
int startspaces; /* 'extra' cols of first char */
int endspaces; /* 'extra' cols of first char */
int startspaces; /* 'extra' cols before first char */
int endspaces; /* 'extra' cols after last char */
int textlen; /* chars in block */
char_u *textstart; /* pointer to 1st char in block */
colnr_T textcol; /* cols of chars (at least part.) in block */
char_u *textstart; /* pointer to 1st char (partially) in block */
colnr_T textcol; /* index of chars (partially) in block */
colnr_T start_vcol; /* start col of 1st char wholly inside block */
colnr_T end_vcol; /* start col of 1st char wholly after block */
#ifdef FEAT_VISUALEXTRA
@@ -382,15 +382,14 @@ shift_block(oap, amount)
{
int left = (oap->op_type == OP_LSHIFT);
int oldstate = State;
int total, split;
char_u *newp, *oldp, *midp, *ptr;
int total;
char_u *newp, *oldp;
int oldcol = curwin->w_cursor.col;
int p_sw = (int)curbuf->b_p_sw;
int p_ts = (int)curbuf->b_p_ts;
struct block_def bd;
int internal = 0;
int incr;
colnr_T vcol, col = 0, ws_vcol;
colnr_T ws_vcol;
int i = 0, j = 0;
int len;
@@ -456,67 +455,89 @@ shift_block(oap, amount)
}
else /* left */
{
vcol = oap->start_vcol;
/* walk vcol past ws to be removed */
for (midp = oldp + bd.textcol;
vcol < (oap->start_vcol + total) && vim_iswhite(*midp); )
{
incr = lbr_chartabsize_adv(&midp, (colnr_T)vcol);
vcol += incr;
}
/* internal is the block-internal ws replacing a split TAB */
if (vcol > (oap->start_vcol + total))
{
/* we have to split the TAB *(midp-1) */
internal = vcol - (oap->start_vcol + total);
}
/* if 'expandtab' is not set, use TABs */
colnr_T destination_col; /* column to which text in block will
be shifted */
char_u *verbatim_copy_end; /* end of the part of the line which is
copied verbatim */
colnr_T verbatim_copy_width;/* the (displayed) width of this part
of line */
unsigned fill; /* nr of spaces that replace a TAB */
unsigned new_line_len; /* the length of the line after the
block shift */
size_t block_space_width;
size_t shift_amount;
char_u *non_white = bd.textstart;
colnr_T non_white_col;
split = bd.startspaces + internal;
if (split > 0)
{
if (!curbuf->b_p_et)
{
for (ptr = oldp, col = 0; ptr < oldp+bd.textcol; )
col += lbr_chartabsize_adv(&ptr, (colnr_T)col);
/*
* Firstly, let's find the first non-whitespace character that is
* displayed after the block's start column and the character's column
* number. Also, let's calculate the width of all the whitespace
* characters that are displayed in the block and precede the searched
* non-whitespace character.
*/
/* col+1 now equals the start col of the first char of the
* block (may be < oap.start_vcol if we're splitting a TAB) */
i = ((col % p_ts) + split) / p_ts; /* number of tabs */
}
if (i)
j = ((col % p_ts) + split) % p_ts; /* number of spp */
else
j = split;
/* If "bd.startspaces" is set, "bd.textstart" points to the character,
* the part of which is displayed at the block's beginning. Let's start
* searching from the next character. */
if (bd.startspaces)
mb_ptr_adv(non_white);
/* The character's column is in "bd.start_vcol". */
non_white_col = bd.start_vcol;
while (vim_iswhite(*non_white))
{
incr = lbr_chartabsize_adv(&non_white, non_white_col);
non_white_col += incr;
}
newp = alloc_check(bd.textcol + i + j + (unsigned)STRLEN(midp) + 1);
block_space_width = non_white_col - oap->start_vcol;
/* We will shift by "total" or "block_space_width", whichever is less.
*/
shift_amount = (block_space_width < total? block_space_width: total);
/* The column to which we will shift the text. */
destination_col = non_white_col - shift_amount;
/* Now let's find out how much of the beginning of the line we can
* reuse without modification. */
verbatim_copy_end = bd.textstart;
verbatim_copy_width = bd.start_vcol;
/* If "bd.startspaces" is set, "bd.textstart" points to the character
* preceding the block. We have to subtract its width to obtain its
* column number. */
if (bd.startspaces)
verbatim_copy_width -= bd.start_char_vcols;
while (verbatim_copy_width < destination_col)
{
incr = lbr_chartabsize(verbatim_copy_end, verbatim_copy_width);
if (verbatim_copy_width + incr > destination_col)
break;
verbatim_copy_width += incr;
mb_ptr_adv(verbatim_copy_end);
}
/* If "destination_col" is different from the width of the initial
* part of the line that will be copied, it means we encountered a tab
* character, which we will have to partly replace with spaces. */
fill = destination_col - verbatim_copy_width;
/* The replacement line will consist of:
* - the beginning of the original line up to "verbatim_copy_end",
* - "fill" number of spaces,
* - the rest of the line, pointed to by non_white. */
new_line_len = (unsigned)(verbatim_copy_end - oldp)
+ fill
+ (unsigned)STRLEN(non_white) + 1;
newp = alloc_check(new_line_len);
if (newp == NULL)
return;
vim_memset(newp, NUL, (size_t)(bd.textcol + i + j + STRLEN(midp) + 1));
/* copy first part we want to keep */
mch_memmove(newp, oldp, (size_t)bd.textcol);
/* Now copy any TABS and spp to ensure correct alignment! */
while (vim_iswhite(*midp))
{
if (*midp == TAB)
i++;
else /*space */
j++;
midp++;
}
/* We might have an extra TAB worth of spp now! */
if (j / p_ts && !curbuf->b_p_et)
{
i++;
j -= p_ts;
}
copy_chars(newp + bd.textcol, (size_t)i, TAB);
copy_spaces(newp + bd.textcol + i, (size_t)j);
/* the end */
STRMOVE(newp + STRLEN(newp), midp);
mch_memmove(newp, oldp, (size_t)(verbatim_copy_end - oldp));
copy_spaces(newp + (verbatim_copy_end - oldp), (size_t)fill);
STRMOVE(newp + (verbatim_copy_end - oldp) + fill, non_white);
}
/* replace the line */
ml_replace(curwin->w_cursor.lnum, newp, FALSE);
@@ -4851,7 +4872,8 @@ paragraph_start(lnum)
* - textlen includes the first/last char to be (partly) deleted
* - start/endspaces is the number of columns that are taken by the
* first/last deleted char minus the number of columns that have to be
* deleted. for yank and tilde:
* deleted.
* for yank and tilde:
* - textlen includes the first/last char to be wholly yanked
* - start/endspaces is the number of columns of the first/last yanked char
* that are to be yanked.

View File

@@ -5797,14 +5797,28 @@ did_set_string_option(opt_idx, varp, new_value_alloced, oldval, errbuf,
/* load or unload key mapping tables */
errmsg = keymap_init();
/* When successfully installed a new keymap switch on using it. */
if (*curbuf->b_p_keymap != NUL && errmsg == NULL)
if (errmsg == NULL)
{
curbuf->b_p_iminsert = B_IMODE_LMAP;
if (curbuf->b_p_imsearch != B_IMODE_USE_INSERT)
curbuf->b_p_imsearch = B_IMODE_LMAP;
set_iminsert_global();
set_imsearch_global();
if (*curbuf->b_p_keymap != NUL)
{
/* Installed a new keymap, switch on using it. */
curbuf->b_p_iminsert = B_IMODE_LMAP;
if (curbuf->b_p_imsearch != B_IMODE_USE_INSERT)
curbuf->b_p_imsearch = B_IMODE_LMAP;
}
else
{
/* Cleared the keymap, may reset 'iminsert' and 'imsearch'. */
if (curbuf->b_p_iminsert == B_IMODE_LMAP)
curbuf->b_p_iminsert = B_IMODE_NONE;
if (curbuf->b_p_imsearch == B_IMODE_LMAP)
curbuf->b_p_imsearch = B_IMODE_USE_INSERT;
}
if ((opt_flags & OPT_LOCAL) == 0)
{
set_iminsert_global();
set_imsearch_global();
}
# ifdef FEAT_WINDOWS
status_redraw_curbuf();
# endif

View File

@@ -181,7 +181,8 @@ static RETSIGTYPE catch_sigpwr __ARGS(SIGPROTOARG);
&& defined(FEAT_TITLE) && !defined(FEAT_GUI_GTK)
# define SET_SIG_ALARM
static RETSIGTYPE sig_alarm __ARGS(SIGPROTOARG);
static int sig_alarm_called;
/* volatile because it is used in signal handler sig_alarm(). */
static volatile int sig_alarm_called;
#endif
static RETSIGTYPE deathtrap __ARGS(SIGPROTOARG);
@@ -201,13 +202,16 @@ static int save_patterns __ARGS((int num_pat, char_u **pat, int *num_file, char_
# define SIG_ERR ((RETSIGTYPE (*)())-1)
#endif
static int do_resize = FALSE;
/* volatile because it is used in signal handler sig_winch(). */
static volatile int do_resize = FALSE;
#ifndef __EMX__
static char_u *extra_shell_arg = NULL;
static int show_shell_mess = TRUE;
#endif
static int deadly_signal = 0; /* The signal we caught */
static int in_mch_delay = FALSE; /* sleeping in mch_delay() */
/* volatile because it is used in signal handler deathtrap(). */
static volatile int deadly_signal = 0; /* The signal we caught */
/* volatile because it is used in signal handler deathtrap(). */
static volatile int in_mch_delay = FALSE; /* sleeping in mch_delay() */
static int curr_tmode = TMODE_COOK; /* contains current terminal mode */
@@ -802,7 +806,7 @@ init_signal_stack()
#endif
/*
* We need correct potatotypes for a signal function, otherwise mean compilers
* We need correct prototypes for a signal function, otherwise mean compilers
* will barf when the second argument to signal() is ``wrong''.
* Let me try it with a few tricky defines from my own osdef.h (jw).
*/
@@ -1068,13 +1072,18 @@ deathtrap SIGDEFARG(sigarg)
SIGRETURN;
}
#ifdef _REENTRANT
#if defined(_REENTRANT) && defined(SIGCONT)
/*
* On Solaris with multi-threading, suspending might not work immediately.
* Catch the SIGCONT signal, which will be used as an indication whether the
* suspending has been done or not.
*
* On Linux, signal is not always handled immediately either.
* See https://bugs.launchpad.net/bugs/291373
*
* volatile because it is used in in signal handler sigcont_handler().
*/
static int sigcont_received;
static volatile int sigcont_received;
static RETSIGTYPE sigcont_handler __ARGS(SIGPROTOARG);
/*
@@ -1118,15 +1127,28 @@ mch_suspend()
}
# endif
# ifdef _REENTRANT
# if defined(_REENTRANT) && defined(SIGCONT)
sigcont_received = FALSE;
# endif
kill(0, SIGTSTP); /* send ourselves a STOP signal */
# ifdef _REENTRANT
/* When we didn't suspend immediately in the kill(), do it now. Happens
* on multi-threaded Solaris. */
if (!sigcont_received)
pause();
# if defined(_REENTRANT) && defined(SIGCONT)
/*
* Wait for the SIGCONT signal to be handled. It generally happens
* immediately, but somehow not all the time. Do not call pause()
* because there would be race condition which would hang Vim if
* signal happened in between the test of sigcont_received and the
* call to pause(). If signal is not yet received, call sleep(0)
* to just yield CPU. Signal should then be received. If somehow
* it's still not received, sleep 1, 2, 3 ms. Don't bother waiting
* further if signal is not received after 1+2+3+4 ms (not expected
* to happen).
*/
{
long wait;
for (wait = 0; !sigcont_received && wait <= 3L; wait++)
/* Loop is not entered most of the time */
mch_delay(wait, FALSE);
}
# endif
# ifdef FEAT_TITLE
@@ -1175,7 +1197,7 @@ set_signals()
#ifdef SIGTSTP
signal(SIGTSTP, restricted ? SIG_IGN : SIG_DFL);
#endif
#ifdef _REENTRANT
#if defined(_REENTRANT) && defined(SIGCONT)
signal(SIGCONT, sigcont_handler);
#endif
@@ -1234,7 +1256,7 @@ catch_int_signal()
reset_signals()
{
catch_signals(SIG_DFL, SIG_DFL);
#ifdef _REENTRANT
#if defined(_REENTRANT) && defined(SIGCONT)
/* SIGCONT isn't in the list, because its default action is ignore */
signal(SIGCONT, SIG_DFL);
#endif
@@ -5899,7 +5921,9 @@ gpm_open()
* we are going to suspend or starting an external process
* so we shouldn't have problem with this
*/
# ifdef SIGTSTP
signal(SIGTSTP, restricted ? SIG_IGN : SIG_DFL);
# endif
return 1; /* succeed */
}
if (gpm_fd == -2)

View File

@@ -40,6 +40,7 @@ void global_exe __ARGS((char_u *cmd));
int read_viminfo_sub_string __ARGS((vir_T *virp, int force));
void write_viminfo_sub_string __ARGS((FILE *fp));
void free_old_sub __ARGS((void));
void free_signs __ARGS((void));
int prepare_tagpreview __ARGS((int undo_sync));
void ex_help __ARGS((exarg_T *eap));
char_u *check_help_lang __ARGS((char_u *arg));

View File

@@ -4,6 +4,7 @@ char_u *getcmdline_prompt __ARGS((int firstc, char_u *prompt, int attr, int xp_c
int text_locked __ARGS((void));
void text_locked_msg __ARGS((void));
int curbuf_locked __ARGS((void));
int allbuf_locked __ARGS((void));
char_u *getexline __ARGS((int c, void *dummy, int indent));
char_u *getexmodeline __ARGS((int promptc, void *dummy, int indent));
int cmdline_overstrike __ARGS((void));

View File

@@ -25,7 +25,8 @@ SCRIPTS = test1.out test3.out test4.out test5.out test6.out \
test43.out test44.out test45.out test46.out test47.out \
test48.out test51.out test53.out test54.out test55.out \
test56.out test57.out test58.out test59.out test60.out \
test61.out test62.out test63.out test64.out test65.out
test61.out test62.out test63.out test64.out test65.out \
test66.out
.SUFFIXES: .in .out
@@ -110,3 +111,4 @@ test62.out: test62.in
test63.out: test63.in
test64.out: test64.in
test65.out: test65.in
test66.out: test66.in

View File

@@ -26,7 +26,7 @@ SCRIPTS = test3.out test4.out test5.out test6.out test7.out \
test15.out test17.out test18.out test21.out test26.out \
test30.out test31.out test32.out test33.out test34.out \
test37.out test38.out test39.out test40.out test41.out \
test42.out test52.out test65.out
test42.out test52.out test65.out test66.out
SCRIPTS32 = test50.out

View File

@@ -45,7 +45,7 @@ SCRIPTS = test3.out test4.out test5.out test6.out test7.out \
test15.out test17.out test18.out test21.out test26.out \
test30.out test31.out test32.out test33.out test34.out \
test37.out test38.out test39.out test40.out test41.out \
test42.out test52.out test65.out
test42.out test52.out test65.out test66.out
SCRIPTS32 = test50.out

View File

@@ -25,7 +25,8 @@ SCRIPTS = test1.out test3.out test4.out test5.out test6.out \
test43.out test44.out test45.out test46.out test47.out \
test48.out test51.out test53.out test54.out test55.out \
test56.out test57.out test58.out test59.out test60.out \
test61.out test62.out test63.out test64.out test65.out
test61.out test62.out test63.out test64.out test65.out \
test66.out
.SUFFIXES: .in .out

View File

@@ -4,7 +4,7 @@
# Authors: Zoltan Arpadffy, <arpadffy@polarhome.com>
# Sandor Kopanyi, <sandor.kopanyi@mailbox.hu>
#
# Last change: 2008 Aug 19
# Last change: 2009 Mar 05
#
# This has been tested on VMS 6.2 to 8.3 on DEC Alpha, VAX and IA64.
# Edit the lines in the Configuration section below to select.
@@ -68,7 +68,8 @@ SCRIPT = test1.out test2.out test3.out test4.out test5.out \
test43.out test44.out test45.out test46.out \
test48.out test51.out test53.out test54.out test55.out \
test56.out test57.out test60.out \
test61.out test62.out test63.out test64.out test65.out
test61.out test62.out test63.out test64.out test65.out \
test66.out
.IFDEF WANT_GUI
SCRIPT_GUI = test16.out

View File

@@ -20,7 +20,7 @@ SCRIPTS = test1.out test2.out test3.out test4.out test5.out test6.out \
test48.out test49.out test51.out test52.out test53.out \
test54.out test55.out test56.out test57.out test58.out \
test59.out test60.out test61.out test62.out test63.out \
test64.out test65.out
test64.out test65.out test66.out
SCRIPTS_GUI = test16.out

25
src/testdir/test66.in Normal file
View File

@@ -0,0 +1,25 @@
Test for visual block shift and tab characters.
STARTTEST
:so small.vim
/^abcdefgh
4jI j<<11|D
7|a 
7|a 
7|a 4k13|4j<
:$-4,$w! test.out
:$-4,$s/\s\+//g
4kI j<<
7|a 
7|a 
7|a 4k13|4j3<
:$-4,$w >> test.out
:qa!
ENDTEST
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz

10
src/testdir/test66.ok Normal file
View File

@@ -0,0 +1,10 @@
abcdefghijklmnopqrstuvwxyz
abcdefghij
abc defghijklmnopqrstuvwxyz
abc defghijklmnopqrstuvwxyz
abc defghijklmnopqrstuvwxyz
abcdefghijklmnopqrstuvwxyz
abcdefghij
abc defghijklmnopqrstuvwxyz
abc defghijklmnopqrstuvwxyz
abc defghijklmnopqrstuvwxyz

View File

@@ -676,6 +676,34 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
138,
/**/
137,
/**/
136,
/**/
135,
/**/
134,
/**/
133,
/**/
132,
/**/
131,
/**/
130,
/**/
129,
/**/
128,
/**/
127,
/**/
126,
/**/
125,
/**/
124,
/**/