| To: vim-dev@vim.org |
| Subject: patch 7.1.058 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| 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 |
| |
| |
| |
| |
| |
| *** 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; |
| } |
| |
| |
| |
| *** 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)); |
| |
| |
| |
| *** 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; |
| |
| |
| |
| *** 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 /// |