diff --git a/7.1.058 b/7.1.058 new file mode 100644 index 0000000..f4e3864 --- /dev/null +++ b/7.1.058 @@ -0,0 +1,397 @@ +To: vim-dev@vim.org +Subject: patch 7.1.058 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.1.058 +Problem: When 'rightleft' is set the completion menu is positioned wrong. + (Baha-Eddine MOKADEM) +Solution: Fix the completion menu. (Martin Toft) +Files: src/popupmnu.c, src/proto/search.pro, src/search.c + + +*** ../vim-7.1.057/src/popupmnu.c Thu Jun 28 21:23:52 2007 +--- src/popupmnu.c Wed Aug 1 15:43:06 2007 +*************** +*** 75,81 **** + + row = curwin->w_cline_row + W_WINROW(curwin); + height = curwin->w_cline_height; +- col = curwin->w_wcol + W_WINCOL(curwin) - curwin->w_leftcol; + + if (firstwin->w_p_pvw) + top_clear = firstwin->w_height; +--- 75,80 ---- +*************** +*** 167,172 **** +--- 166,180 ---- + pum_base_width = max_width; + pum_kind_width = kind_width; + ++ /* Calculate column */ ++ #ifdef FEAT_RIGHTLEFT ++ if (curwin->w_p_rl) ++ col = W_WINCOL(curwin) + W_WIDTH(curwin) - curwin->w_wcol - ++ curwin->w_leftcol - 1; ++ else ++ #endif ++ col = W_WINCOL(curwin) + curwin->w_wcol - curwin->w_leftcol; ++ + /* if there are more items than room we need a scrollbar */ + if (pum_height < size) + { +*************** +*** 179,189 **** + if (def_width < max_width) + def_width = max_width; + +! if (col < Columns - PUM_DEF_WIDTH || col < Columns - max_width) + { + /* align pum column with "col" */ + pum_col = col; +! pum_width = Columns - pum_col - pum_scrollbar; + if (pum_width > max_width + kind_width + extra_width + 1 + && pum_width > PUM_DEF_WIDTH) + { +--- 187,209 ---- + if (def_width < max_width) + def_width = max_width; + +! if (((col < Columns - PUM_DEF_WIDTH || col < Columns - max_width) +! #ifdef FEAT_RIGHTLEFT +! && !curwin->w_p_rl) +! || (curwin->w_p_rl && (col > PUM_DEF_WIDTH || col > max_width) +! #endif +! )) + { + /* align pum column with "col" */ + pum_col = col; +! +! #ifdef FEAT_RIGHTLEFT +! if (curwin->w_p_rl) +! pum_width = pum_col - pum_scrollbar + 1; +! else +! #endif +! pum_width = Columns - pum_col - pum_scrollbar; +! + if (pum_width > max_width + kind_width + extra_width + 1 + && pum_width > PUM_DEF_WIDTH) + { +*************** +*** 195,208 **** + else if (Columns < def_width) + { + /* not enough room, will use what we have */ +! pum_col = 0; + pum_width = Columns - 1; + } + else + { + if (max_width > PUM_DEF_WIDTH) + max_width = PUM_DEF_WIDTH; /* truncate */ +! pum_col = Columns - max_width; + pum_width = max_width - pum_scrollbar; + } + +--- 215,238 ---- + else if (Columns < def_width) + { + /* not enough room, will use what we have */ +! #ifdef FEAT_RIGHTLEFT +! if (curwin->w_p_rl) +! pum_col = Columns - 1; +! else +! #endif +! pum_col = 0; + pum_width = Columns - 1; + } + else + { + if (max_width > PUM_DEF_WIDTH) + max_width = PUM_DEF_WIDTH; /* truncate */ +! #ifdef FEAT_RIGHTLEFT +! if (curwin->w_p_rl) +! pum_col = max_width - 1; +! else +! #endif +! pum_col = Columns - max_width; + pum_width = max_width - pum_scrollbar; + } + +*************** +*** 255,262 **** + attr = (idx == pum_selected) ? attr_select : attr_norm; + + /* prepend a space if there is room */ +! if (pum_col > 0) +! screen_putchar(' ', row, pum_col - 1, attr); + + /* Display each entry, use two spaces for a Tab. + * Do this 3 times: For the main text, kind and extra info */ +--- 285,300 ---- + attr = (idx == pum_selected) ? attr_select : attr_norm; + + /* prepend a space if there is room */ +! #ifdef FEAT_RIGHTLEFT +! if (curwin->w_p_rl) +! { +! if (pum_col < W_WINCOL(curwin) + W_WIDTH(curwin) - 1) +! screen_putchar(' ', row, pum_col + 1, attr); +! } +! else +! #endif +! if (pum_col > 0) +! screen_putchar(' ', row, pum_col - 1, attr); + + /* Display each entry, use two spaces for a Tab. + * Do this 3 times: For the main text, kind and extra info */ +*************** +*** 282,307 **** + { + /* Display the text that fits or comes before a Tab. + * First convert it to printable characters. */ +! char_u *st; +! int saved = *p; + + *p = NUL; + st = transstr(s); + *p = saved; +! if (st != NULL) + { +! screen_puts_len(st, (int)STRLEN(st), row, col, + attr); +! vim_free(st); + } +- col += width; + + if (*p != TAB) + break; + + /* Display two spaces for a Tab. */ +! screen_puts_len((char_u *)" ", 2, row, col, attr); +! col += 2; + totwidth += 2; + s = NULL; /* start text at next char */ + width = 0; +--- 320,386 ---- + { + /* Display the text that fits or comes before a Tab. + * First convert it to printable characters. */ +! char_u *st; +! int saved = *p; + + *p = NUL; + st = transstr(s); + *p = saved; +! #ifdef FEAT_RIGHTLEFT +! if (curwin->w_p_rl) + { +! if (st != NULL) +! { +! char_u *rt = reverse_text(st); +! char_u *rt_saved = rt; +! int len, j; +! +! if (rt != NULL) +! { +! len = STRLEN(rt); +! if (len > pum_width) +! { +! for (j = pum_width; j < len; ++j) +! mb_ptr_adv(rt); +! len = pum_width; +! } +! screen_puts_len(rt, len, row, +! col - len + 1, attr); +! vim_free(rt_saved); +! } +! vim_free(st); +! } +! col -= width; +! } +! else +! #endif +! { +! if (st != NULL) +! { +! screen_puts_len(st, (int)STRLEN(st), row, col, + attr); +! vim_free(st); +! } +! col += width; + } + + if (*p != TAB) + break; + + /* Display two spaces for a Tab. */ +! #ifdef FEAT_RIGHTLEFT +! if (curwin->w_p_rl) +! { +! screen_puts_len((char_u *)" ", 2, row, col - 1, +! attr); +! col -= 2; +! } +! else +! #endif +! { +! screen_puts_len((char_u *)" ", 2, row, col, attr); +! col += 2; +! } + totwidth += 2; + s = NULL; /* start text at next char */ + width = 0; +*************** +*** 322,338 **** + && pum_array[idx].pum_extra == NULL) + || pum_base_width + n >= pum_width) + break; +! screen_fill(row, row + 1, col, pum_col + pum_base_width + n, + ' ', ' ', attr); +! col = pum_col + pum_base_width + n; + totwidth = pum_base_width + n; + } + +! screen_fill(row, row + 1, col, pum_col + pum_width, ' ', ' ', attr); + if (pum_scrollbar > 0) +! screen_putchar(' ', row, pum_col + pum_width, +! i >= thumb_pos && i < thumb_pos + thumb_heigth + ? attr_thumb : attr_scroll); + + ++row; + } +--- 401,444 ---- + && pum_array[idx].pum_extra == NULL) + || pum_base_width + n >= pum_width) + break; +! #ifdef FEAT_RIGHTLEFT +! if (curwin->w_p_rl) +! { +! screen_fill(row, row + 1, pum_col - pum_base_width - n + 1, +! col + 1, ' ', ' ', attr); +! col = pum_col - pum_base_width - n + 1; +! } +! else +! #endif +! { +! screen_fill(row, row + 1, col, pum_col + pum_base_width + n, + ' ', ' ', attr); +! col = pum_col + pum_base_width + n; +! } + totwidth = pum_base_width + n; + } + +! #ifdef FEAT_RIGHTLEFT +! if (curwin->w_p_rl) +! screen_fill(row, row + 1, pum_col - pum_width + 1, col + 1, ' ', +! ' ', attr); +! else +! #endif +! screen_fill(row, row + 1, col, pum_col + pum_width, ' ', ' ', +! attr); + if (pum_scrollbar > 0) +! { +! #ifdef FEAT_RIGHTLEFT +! if (curwin->w_p_rl) +! screen_putchar(' ', row, pum_col - pum_width, +! i >= thumb_pos && i < thumb_pos + thumb_heigth + ? attr_thumb : attr_scroll); ++ else ++ #endif ++ screen_putchar(' ', row, pum_col + pum_width, ++ i >= thumb_pos && i < thumb_pos + thumb_heigth ++ ? attr_thumb : attr_scroll); ++ } + + ++row; + } +*** ../vim-7.1.057/src/proto/search.pro Sat May 5 20:20:36 2007 +--- src/proto/search.pro Wed Aug 1 12:41:25 2007 +*************** +*** 1,6 **** +--- 1,7 ---- + /* search.c */ + int search_regcomp __ARGS((char_u *pat, int pat_save, int pat_use, int options, regmmatch_T *regmatch)); + char_u *get_search_pat __ARGS((void)); ++ char_u *reverse_text __ARGS((char_u *s)); + void save_search_patterns __ARGS((void)); + void restore_search_patterns __ARGS((void)); + void free_search_patterns __ARGS((void)); +*** ../vim-7.1.057/src/search.c Tue Jul 10 13:27:46 2007 +--- src/search.c Wed Aug 1 12:39:22 2007 +*************** +*** 101,107 **** + static char_u *mr_pattern = NULL; /* pattern used by search_regcomp() */ + #ifdef FEAT_RIGHTLEFT + static int mr_pattern_alloced = FALSE; /* mr_pattern was allocated */ +- static char_u *reverse_text __ARGS((char_u *s)); + #endif + + #ifdef FEAT_FIND_ID +--- 101,106 ---- +*************** +*** 228,239 **** + return mr_pattern; + } + +! #ifdef FEAT_RIGHTLEFT + /* + * Reverse text into allocated memory. + * Returns the allocated string, NULL when out of memory. + */ +! static char_u * + reverse_text(s) + char_u *s; + { +--- 227,238 ---- + return mr_pattern; + } + +! #if defined(FEAT_RIGHTLEFT) || defined(PROTO) + /* + * Reverse text into allocated memory. + * Returns the allocated string, NULL when out of memory. + */ +! char_u * + reverse_text(s) + char_u *s; + { +*************** +*** 1898,1904 **** + } + + #ifdef FEAT_RIGHTLEFT +! /* This is just guessing: when 'rightleft' is set, search for a maching + * paren/brace in the other direction. */ + if (curwin->w_p_rl && vim_strchr((char_u *)"()[]{}<>", initc) != NULL) + backwards = !backwards; +--- 1897,1903 ---- + } + + #ifdef FEAT_RIGHTLEFT +! /* This is just guessing: when 'rightleft' is set, search for a matching + * paren/brace in the other direction. */ + if (curwin->w_p_rl && vim_strchr((char_u *)"()[]{}<>", initc) != NULL) + backwards = !backwards; +*** ../vim-7.1.057/src/version.c Wed Aug 8 21:41:19 2007 +--- src/version.c Wed Aug 8 22:44:49 2007 +*************** +*** 668,669 **** +--- 668,671 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 58, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +99. The hum of a cooling fan and the click of keys is comforting to you. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ download, build and distribute -- http://www.A-A-P.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org ///