| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.239 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.3.239 |
| Problem: Python corrects the cursor column without taking 'virtualedit' |
| into account. (lilydjwg) |
| Solution: Call check_cursor_col_win(). |
| Files: src/if_py_both.h, src/mbyte.c, src/misc2.c, src/normal.c, |
| src/proto/mbyte.pro, src/proto/misc2.pro |
| |
| |
| |
| |
| |
| *** 534,540 **** |
| { |
| long lnum; |
| long col; |
| - long len; |
| |
| if (!PyArg_Parse(val, "(ll)", &lnum, &col)) |
| return -1; |
| --- 534,539 ---- |
| |
| *** 549,566 **** |
| if (VimErrorCheck()) |
| return -1; |
| |
| - /* When column is out of range silently correct it. */ |
| - len = (long)STRLEN(ml_get_buf(this->win->w_buffer, lnum, FALSE)); |
| - if (col > len) |
| - col = len; |
| - |
| this->win->w_cursor.lnum = lnum; |
| this->win->w_cursor.col = col; |
| #ifdef FEAT_VIRTUALEDIT |
| this->win->w_cursor.coladd = 0; |
| #endif |
| ! update_screen(VALID); |
| |
| return 0; |
| } |
| else if (strcmp(name, "height") == 0) |
| --- 548,562 ---- |
| if (VimErrorCheck()) |
| return -1; |
| |
| this->win->w_cursor.lnum = lnum; |
| this->win->w_cursor.col = col; |
| #ifdef FEAT_VIRTUALEDIT |
| this->win->w_cursor.coladd = 0; |
| #endif |
| ! /* When column is out of range silently correct it. */ |
| ! check_cursor_col_win(this->win); |
| |
| + update_screen(VALID); |
| return 0; |
| } |
| else if (strcmp(name, "height") == 0) |
| |
| |
| |
| *** 3563,3569 **** |
| void |
| mb_adjust_cursor() |
| { |
| ! mb_adjustpos(&curwin->w_cursor); |
| } |
| |
| /* |
| --- 3563,3569 ---- |
| void |
| mb_adjust_cursor() |
| { |
| ! mb_adjustpos(curbuf, &curwin->w_cursor); |
| } |
| |
| /* |
| |
| *** 3571,3577 **** |
| * If it points to a tail byte it's moved backwards to the head byte. |
| */ |
| void |
| ! mb_adjustpos(lp) |
| pos_T *lp; |
| { |
| char_u *p; |
| --- 3571,3578 ---- |
| * If it points to a tail byte it's moved backwards to the head byte. |
| */ |
| void |
| ! mb_adjustpos(buf, lp) |
| ! buf_T *buf; |
| pos_T *lp; |
| { |
| char_u *p; |
| |
| *** 3582,3588 **** |
| #endif |
| ) |
| { |
| ! p = ml_get(lp->lnum); |
| lp->col -= (*mb_head_off)(p, p + lp->col); |
| #ifdef FEAT_VIRTUALEDIT |
| /* Reset "coladd" when the cursor would be on the right half of a |
| --- 3583,3589 ---- |
| #endif |
| ) |
| { |
| ! p = ml_get_buf(buf, lp->lnum, FALSE); |
| lp->col -= (*mb_head_off)(p, p + lp->col); |
| #ifdef FEAT_VIRTUALEDIT |
| /* Reset "coladd" when the cursor would be on the right half of a |
| |
| |
| |
| *** 333,339 **** |
| #ifdef FEAT_MBYTE |
| /* prevent from moving onto a trail byte */ |
| if (has_mbyte) |
| ! mb_adjustpos(pos); |
| #endif |
| |
| if (col < wcol) |
| --- 333,339 ---- |
| #ifdef FEAT_MBYTE |
| /* prevent from moving onto a trail byte */ |
| if (has_mbyte) |
| ! mb_adjustpos(curbuf, pos); |
| #endif |
| |
| if (col < wcol) |
| |
| *** 544,559 **** |
| void |
| check_cursor_col() |
| { |
| colnr_T len; |
| #ifdef FEAT_VIRTUALEDIT |
| ! colnr_T oldcol = curwin->w_cursor.col; |
| ! colnr_T oldcoladd = curwin->w_cursor.col + curwin->w_cursor.coladd; |
| #endif |
| |
| ! len = (colnr_T)STRLEN(ml_get_curline()); |
| if (len == 0) |
| ! curwin->w_cursor.col = 0; |
| ! else if (curwin->w_cursor.col >= len) |
| { |
| /* Allow cursor past end-of-line when: |
| * - in Insert mode or restarting Insert mode |
| --- 544,569 ---- |
| void |
| check_cursor_col() |
| { |
| + check_cursor_col_win(curwin); |
| + } |
| + |
| + /* |
| + * Make sure win->w_cursor.col is valid. |
| + */ |
| + void |
| + check_cursor_col_win(win) |
| + win_T *win; |
| + { |
| colnr_T len; |
| #ifdef FEAT_VIRTUALEDIT |
| ! colnr_T oldcol = win->w_cursor.col; |
| ! colnr_T oldcoladd = win->w_cursor.col + win->w_cursor.coladd; |
| #endif |
| |
| ! len = (colnr_T)STRLEN(ml_get_buf(win->w_buffer, win->w_cursor.lnum, FALSE)); |
| if (len == 0) |
| ! win->w_cursor.col = 0; |
| ! else if (win->w_cursor.col >= len) |
| { |
| /* Allow cursor past end-of-line when: |
| * - in Insert mode or restarting Insert mode |
| |
| *** 567,599 **** |
| || (ve_flags & VE_ONEMORE) |
| #endif |
| || virtual_active()) |
| ! curwin->w_cursor.col = len; |
| else |
| { |
| ! curwin->w_cursor.col = len - 1; |
| #ifdef FEAT_MBYTE |
| ! /* prevent cursor from moving on the trail byte */ |
| if (has_mbyte) |
| ! mb_adjust_cursor(); |
| #endif |
| } |
| } |
| ! else if (curwin->w_cursor.col < 0) |
| ! curwin->w_cursor.col = 0; |
| |
| #ifdef FEAT_VIRTUALEDIT |
| /* If virtual editing is on, we can leave the cursor on the old position, |
| * only we must set it to virtual. But don't do it when at the end of the |
| * line. */ |
| if (oldcol == MAXCOL) |
| ! curwin->w_cursor.coladd = 0; |
| else if (ve_flags == VE_ALL) |
| { |
| ! if (oldcoladd > curwin->w_cursor.col) |
| ! curwin->w_cursor.coladd = oldcoladd - curwin->w_cursor.col; |
| else |
| /* avoid weird number when there is a miscalculation or overflow */ |
| ! curwin->w_cursor.coladd = 0; |
| } |
| #endif |
| } |
| --- 577,609 ---- |
| || (ve_flags & VE_ONEMORE) |
| #endif |
| || virtual_active()) |
| ! win->w_cursor.col = len; |
| else |
| { |
| ! win->w_cursor.col = len - 1; |
| #ifdef FEAT_MBYTE |
| ! /* Move the cursor to the head byte. */ |
| if (has_mbyte) |
| ! mb_adjustpos(win->w_buffer, &win->w_cursor); |
| #endif |
| } |
| } |
| ! else if (win->w_cursor.col < 0) |
| ! win->w_cursor.col = 0; |
| |
| #ifdef FEAT_VIRTUALEDIT |
| /* If virtual editing is on, we can leave the cursor on the old position, |
| * only we must set it to virtual. But don't do it when at the end of the |
| * line. */ |
| if (oldcol == MAXCOL) |
| ! win->w_cursor.coladd = 0; |
| else if (ve_flags == VE_ALL) |
| { |
| ! if (oldcoladd > win->w_cursor.col) |
| ! win->w_cursor.coladd = oldcoladd - win->w_cursor.col; |
| else |
| /* avoid weird number when there is a miscalculation or overflow */ |
| ! win->w_cursor.coladd = 0; |
| } |
| #endif |
| } |
| |
| |
| |
| *** 8774,8780 **** |
| { |
| --pp->col; |
| #ifdef FEAT_MBYTE |
| ! mb_adjustpos(pp); |
| #endif |
| } |
| else if (pp->lnum > 1) |
| --- 8774,8780 ---- |
| { |
| --pp->col; |
| #ifdef FEAT_MBYTE |
| ! mb_adjustpos(curbuf, pp); |
| #endif |
| } |
| else if (pp->lnum > 1) |
| |
| |
| |
| *** 56,62 **** |
| int utf_valid_string __ARGS((char_u *s, char_u *end)); |
| int dbcs_screen_tail_off __ARGS((char_u *base, char_u *p)); |
| void mb_adjust_cursor __ARGS((void)); |
| ! void mb_adjustpos __ARGS((pos_T *lp)); |
| char_u *mb_prevptr __ARGS((char_u *line, char_u *p)); |
| int mb_charlen __ARGS((char_u *str)); |
| int mb_charlen_len __ARGS((char_u *str, int len)); |
| --- 56,62 ---- |
| int utf_valid_string __ARGS((char_u *s, char_u *end)); |
| int dbcs_screen_tail_off __ARGS((char_u *base, char_u *p)); |
| void mb_adjust_cursor __ARGS((void)); |
| ! void mb_adjustpos __ARGS((buf_T *buf, pos_T *lp)); |
| char_u *mb_prevptr __ARGS((char_u *line, char_u *p)); |
| int mb_charlen __ARGS((char_u *str)); |
| int mb_charlen_len __ARGS((char_u *str, int len)); |
| |
| |
| |
| *** 14,19 **** |
| --- 14,20 ---- |
| linenr_T get_cursor_rel_lnum __ARGS((win_T *wp, linenr_T lnum)); |
| void check_cursor_lnum __ARGS((void)); |
| void check_cursor_col __ARGS((void)); |
| + void check_cursor_col_win __ARGS((win_T *win)); |
| void check_cursor __ARGS((void)); |
| void adjust_cursor_col __ARGS((void)); |
| int leftcol_changed __ARGS((void)); |
| |
| |
| |
| *** 711,712 **** |
| --- 711,714 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 239, |
| /**/ |
| |
| -- |
| hundred-and-one symptoms of being an internet addict: |
| 256. You are able to write down over 250 symptoms of being an internet |
| addict, even though they only asked for 101. |
| |
| /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ |
| /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ |
| \\\ an exciting new programming language -- http://www.Zimbu.org /// |
| \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |