Mercurial > vim
diff src/edit.c @ 840:2c885fab04e3 v7.0e06
updated for version 7.0e06
author | vimboss |
---|---|
date | Sat, 22 Apr 2006 22:33:57 +0000 |
parents | 5a7843c57316 |
children | c2cae213194d |
line wrap: on
line diff
--- a/src/edit.c +++ b/src/edit.c @@ -178,7 +178,9 @@ static int spell_bad_len = 0; /* length #endif static void stop_insert __ARGS((pos_T *end_insert_pos, int esc)); static int echeck_abbr __ARGS((int)); +#if 0 static void replace_push_off __ARGS((int c)); +#endif static int replace_pop __ARGS((void)); static void replace_join __ARGS((int off)); static void replace_pop_ins __ARGS((void)); @@ -5823,7 +5825,7 @@ redo_literal(c) */ static void start_arrow(end_insert_pos) - pos_T *end_insert_pos; + pos_T *end_insert_pos; /* can be NULL */ { if (!arrow_used) /* something has been inserted */ { @@ -5912,11 +5914,13 @@ stop_arrow() } /* - * do a few things to stop inserting + * Do a few things to stop inserting. + * "end_insert_pos" is where insert ended. It is NULL when we already jumped + * to another window/buffer. */ static void stop_insert(end_insert_pos, esc) - pos_T *end_insert_pos; /* where insert ended */ + pos_T *end_insert_pos; int esc; /* called by ins_esc() */ { int cc; @@ -5941,7 +5945,7 @@ stop_insert(end_insert_pos, esc) else vim_free(ptr); - if (!arrow_used) + if (!arrow_used && end_insert_pos != NULL) { /* Auto-format now. It may seem strange to do this when stopping an * insertion (or moving the cursor), but it's required when appending @@ -5987,7 +5991,7 @@ stop_insert(end_insert_pos, esc) * of the line, and put the cursor back. * Do this when ESC was used or moving the cursor up/down. */ if (did_ai && (esc || (vim_strchr(p_cpo, CPO_INDENT) == NULL - && curwin->w_cursor.lnum != end_insert_pos->lnum))) + && curwin->w_cursor.lnum != end_insert_pos->lnum))) { pos_T tpos = curwin->w_cursor; @@ -6030,9 +6034,13 @@ stop_insert(end_insert_pos, esc) can_si_back = FALSE; #endif - /* set '[ and '] to the inserted text */ - curbuf->b_op_start = Insstart; - curbuf->b_op_end = *end_insert_pos; + /* Set '[ and '] to the inserted text. When end_insert_pos is NULL we are + * now in a different buffer. */ + if (end_insert_pos != NULL) + { + curbuf->b_op_start = Insstart; + curbuf->b_op_end = *end_insert_pos; + } } /* @@ -6563,6 +6571,7 @@ replace_push(c) ++replace_stack_nr; } +#if 0 /* * call replace_push(c) with replace_offset set to the first NUL. */ @@ -6580,6 +6589,7 @@ replace_push_off(c) replace_push(c); replace_offset = 0; } +#endif /* * Pop one item from the replace stack. @@ -8023,7 +8033,9 @@ ins_bs(c, mode, inserted_space_p) int ts; colnr_T vcol; colnr_T want_vcol; +#if 0 int extra = 0; +#endif *inserted_space_p = FALSE; if (p_sta && in_indent) @@ -8082,15 +8094,19 @@ ins_bs(c, mode, inserted_space_p) #endif { ins_str((char_u *)" "); - if ((State & REPLACE_FLAG) && extra <= 1) + if ((State & REPLACE_FLAG) /* && extra <= 1 */) { +#if 0 if (extra) replace_push_off(NUL); else +#endif replace_push(NUL); } +#if 0 if (extra == 2) extra = 1; +#endif } getvcol(curwin, &curwin->w_cursor, &vcol, NULL, NULL); } @@ -8205,6 +8221,7 @@ ins_mouse(c) int c; { pos_T tpos; + win_T *old_curwin = curwin; # ifdef FEAT_GUI /* When GUI is active, also move/paste when 'mouse' is empty */ @@ -8217,7 +8234,25 @@ ins_mouse(c) tpos = curwin->w_cursor; if (do_mouse(NULL, c, BACKWARD, 1L, 0)) { - start_arrow(&tpos); +#ifdef FEAT_WINDOWS + win_T *new_curwin = curwin; + + if (curwin != old_curwin && win_valid(old_curwin)) + { + /* Mouse took us to another window. We need to go back to the + * previous one to stop insert there properly. */ + curwin = old_curwin; + curbuf = curwin->w_buffer; + } +#endif + start_arrow(curwin == old_curwin ? &tpos : NULL); +#ifdef FEAT_WINDOWS + if (curwin != new_curwin && win_valid(new_curwin)) + { + curwin = new_curwin; + curbuf = curwin->w_buffer; + } +#endif # ifdef FEAT_CINDENT can_cindent = TRUE; # endif