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 ///