Mercurial > vim
diff src/ex_cmds.c @ 165:e943e5502fc9 v7.0050
updated for version 7.0050
author | vimboss |
---|---|
date | Sat, 12 Feb 2005 14:31:42 +0000 |
parents | 06bc859d1a32 |
children | 0e902b8f511f |
line wrap: on
line diff
--- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -3250,32 +3250,57 @@ ex_append(eap) char_u *theline; int did_undo = FALSE; linenr_T lnum = eap->line2; + int indent = 0; + char_u *p; + int vcol; + int empty = (curbuf->b_ml.ml_flags & ML_EMPTY); if (eap->cmdidx != CMD_append) --lnum; + /* when the buffer is empty append to line 0 and delete the dummy line */ + if (empty && lnum == 1) + lnum = 0; + State = INSERT; /* behave like in Insert mode */ if (curbuf->b_p_iminsert == B_IMODE_LMAP) State |= LANGMAP; + while (1) { msg_scroll = TRUE; need_wait_return = FALSE; + if (curbuf->b_p_ai && lnum > 0) + indent = get_indent_lnum(lnum); if (eap->getline == NULL) theline = getcmdline( #ifdef FEAT_EVAL eap->cstack->cs_looplevel > 0 ? -1 : #endif - NUL, 0L, 0); + NUL, 0L, indent); else theline = eap->getline( #ifdef FEAT_EVAL eap->cstack->cs_looplevel > 0 ? -1 : #endif - NUL, eap->cookie, 0); + NUL, eap->cookie, indent); lines_left = Rows - 1; - if (theline == NULL || (theline[0] == '.' && theline[1] == NUL) - || (!did_undo && u_save(lnum, lnum + 1) == FAIL)) + if (theline == NULL) + break; + + /* Look for the "." after automatic indent. */ + vcol = 0; + for (p = theline; indent > vcol; ++p) + { + if (*p == ' ') + ++vcol; + else if (*p == TAB) + vcol += 8 - vcol % 8; + else + break; + } + if ((p[0] == '.' && p[1] == NUL) + || (!did_undo && u_save(lnum, lnum + 1) == FAIL)) { vim_free(theline); break; @@ -3288,6 +3313,12 @@ ex_append(eap) vim_free(theline); ++lnum; msg_didout = TRUE; /* also scroll for empty line */ + + if (empty) + { + ml_delete(2L, FALSE); + empty = FALSE; + } } State = NORMAL; @@ -3341,14 +3372,22 @@ ex_z(eap) exarg_T *eap; { char_u *x; - int bigness = curwin->w_height - 3; - char_u kind; + int bigness; + char_u *kind; int numbered = FALSE; int minus = 0; linenr_T start, end, curs, i; int j; linenr_T lnum = eap->line2; + /* Vi compatible: ":z!" uses display height, without a count uses + * 'scroll' */ + if (eap->forceit) + bigness = curwin->w_height; + else if (firstwin == lastwin) + bigness = curwin->w_p_scr * 2; + else + bigness = curwin->w_height - 3; if (bigness < 1) bigness = 1; @@ -3359,8 +3398,11 @@ ex_z(eap) ++x; } - kind = *x; - if (kind == '-' || kind == '+' || kind == '=' || kind == '^' || kind == '.') + kind = x; + if (*kind == '-' || *kind == '+' || *kind == '=' + || *kind == '^' || *kind == '.') + ++x; + while (*x == '-' || *x == '+') ++x; if (*x != 0) @@ -3371,15 +3413,23 @@ ex_z(eap) return; } else + { bigness = atoi((char *)x); + p_window = bigness; + } } - switch (kind) + /* the number of '-' and '+' multiplies the distance */ + if (*kind == '-' || *kind == '+') + for (x = kind + 1; *x == *kind; ++x) + ; + + switch (*kind) { case '-': - start = lnum - bigness; - end = lnum; - curs = lnum; + start = lnum - bigness * (x - kind); + end = start + bigness; + curs = end; break; case '=': @@ -3403,7 +3453,9 @@ ex_z(eap) default: /* '+' */ start = lnum; - end = lnum + bigness; + if (*kind == '+') + start += bigness * (x - kind - 1); + end = start + bigness; curs = end; break; } @@ -3526,15 +3578,15 @@ do_sub(eap) int which_pat; char_u *cmd; int save_State; - linenr_T first_line = 0; /* first changed line */ - linenr_T last_line= 0; /* below last changed line AFTER the + linenr_T first_line = 0; /* first changed line */ + linenr_T last_line= 0; /* below last changed line AFTER the * change */ linenr_T old_line_count = curbuf->b_ml.ml_line_count; linenr_T line2; - long nmatch; /* number of lines in match */ - linenr_T sub_firstlnum; /* nr of first sub line */ - char_u *sub_firstline; /* allocated copy of first sub line */ - int endcolumn; /* put cursor in last column when done */ + long nmatch; /* number of lines in match */ + linenr_T sub_firstlnum; /* nr of first sub line */ + char_u *sub_firstline; /* allocated copy of first sub line */ + int endcolumn = FALSE; /* cursor in last column when done */ cmd = eap->arg; if (!global_busy)