It's really great and now it's smooth to use.I really should get rid of j/k-style navigation,though:-|
Bram Moolenaar <b...@moolenaar.net> 于2018年9月13日周四 上午5:16写道: > > Patch 8.1.0374 > Problem: Moving the cursor is slow when 'relativenumber' is set. > Solution: Only redraw the number column, not all lines. > Files: src/screen.c, src/move.c > > > *** ../vim-8.1.0373/src/screen.c 2018-09-12 21:52:14.323799725 +0200 > --- src/screen.c 2018-09-12 23:09:41.244578629 +0200 > *************** > *** 132,138 **** > static void fill_foldcolumn(char_u *p, win_T *wp, int closed, linenr_T > lnum); > static void copy_text_attr(int off, char_u *buf, int len, int attr); > #endif > ! static int win_line(win_T *, linenr_T, int, int, int nochange); > static int char_needs_redraw(int off_from, int off_to, int cols); > static void draw_vsep_win(win_T *wp, int row); > #ifdef FEAT_STL_OPT > --- 132,138 ---- > static void fill_foldcolumn(char_u *p, win_T *wp, int closed, linenr_T > lnum); > static void copy_text_attr(int off, char_u *buf, int len, int attr); > #endif > ! static int win_line(win_T *, linenr_T, int, int, int nochange, int > number_only); > static int char_needs_redraw(int off_from, int off_to, int cols); > static void draw_vsep_win(win_T *wp, int row); > #ifdef FEAT_STL_OPT > *************** > *** 971,977 **** > start_search_hl(); > prepare_search_hl(wp, lnum); > # endif > ! win_line(wp, lnum, row, row + wp->w_lines[j].wl_size, > FALSE); > # if defined(FEAT_SEARCH_EXTRA) > end_search_hl(); > # endif > --- 971,978 ---- > start_search_hl(); > prepare_search_hl(wp, lnum); > # endif > ! win_line(wp, lnum, row, row + wp->w_lines[j].wl_size, > ! FALSE, > FALSE); > # if defined(FEAT_SEARCH_EXTRA) > end_search_hl(); > # endif > *************** > *** 1881,1887 **** > /* > * Update a line when it is in an area that needs updating, when it > * has changes or w_lines[idx] is invalid. > ! * bot_start may be halfway a wrapped line after using > * win_del_lines(), check if the current line includes it. > * When syntax folding is being used, the saved syntax states will > * already have been updated, we can't see where the syntax state > is > --- 1882,1888 ---- > /* > * Update a line when it is in an area that needs updating, when it > * has changes or w_lines[idx] is invalid. > ! * "bot_start" may be halfway a wrapped line after using > * win_del_lines(), check if the current line includes it. > * When syntax folding is being used, the saved syntax states will > * already have been updated, we can't see where the syntax state > is > *************** > *** 2140,2146 **** > /* > * Display one line. > */ > ! row = win_line(wp, lnum, srow, wp->w_height, mod_top == 0); > > #ifdef FEAT_FOLDING > wp->w_lines[idx].wl_folded = FALSE; > --- 2141,2148 ---- > /* > * Display one line. > */ > ! row = win_line(wp, lnum, srow, wp->w_height, > ! mod_top == 0, > FALSE); > > #ifdef FEAT_FOLDING > wp->w_lines[idx].wl_folded = FALSE; > *************** > *** 2177,2183 **** > } > else > { > ! /* This line does not need updating, advance to the next one */ > row += wp->w_lines[idx++].wl_size; > if (row > wp->w_height) /* past end of screen */ > break; > --- 2179,2192 ---- > } > else > { > ! if (wp->w_p_rnu) > ! { > ! // 'relativenumber' set: The text doesn't need to be > drawn, but > ! // the number column nearly always does. > ! (void)win_line(wp, lnum, srow, wp->w_height, TRUE, TRUE); > ! } > ! > ! // This line does not need to be drawn, advance to the next > one. > row += wp->w_lines[idx++].wl_size; > if (row > wp->w_height) /* past end of screen */ > break; > *************** > *** 3058,3064 **** > linenr_T lnum, > int startrow, > int endrow, > ! int nochange UNUSED) /* not updating for > changed text */ > { > int col = 0; /* visual column on screen > */ > unsigned off; /* offset in > ScreenLines/ScreenAttrs */ > --- 3067,3074 ---- > linenr_T lnum, > int startrow, > int endrow, > ! int nochange UNUSED, // not updating for > changed text > ! int number_only) // only update the number > column > { > int col = 0; /* visual column on screen > */ > unsigned off; /* offset in > ScreenLines/ScreenAttrs */ > *************** > *** 3253,3464 **** > row = startrow; > screen_row = row + W_WINROW(wp); > > ! /* > ! * To speed up the loop below, set extra_check when there is > linebreak, > ! * trailing white space and/or syntax processing to be done. > ! */ > #ifdef FEAT_LINEBREAK > ! extra_check = wp->w_p_lbr; > #else > ! extra_check = 0; > #endif > #ifdef FEAT_SYN_HL > ! if (syntax_present(wp) && !wp->w_s->b_syn_error > # ifdef SYN_TIME_LIMIT > ! && !wp->w_s->b_syn_slow > # endif > ! ) > ! { > ! /* Prepare for syntax highlighting in this line. When there is an > ! * error, stop syntax highlighting. */ > ! save_did_emsg = did_emsg; > ! did_emsg = FALSE; > ! syntax_start(wp, lnum); > ! if (did_emsg) > ! wp->w_s->b_syn_error = TRUE; > ! else > { > ! did_emsg = save_did_emsg; > #ifdef SYN_TIME_LIMIT > ! if (!wp->w_s->b_syn_slow) > #endif > ! { > ! has_syntax = TRUE; > ! extra_check = TRUE; > } > } > - } > > ! /* Check for columns to display for 'colorcolumn'. */ > ! color_cols = wp->w_p_cc_cols; > ! if (color_cols != NULL) > ! draw_color_col = advance_color_col(VCOL_HLC, &color_cols); > #endif > > #ifdef FEAT_TERMINAL > ! if (term_show_buffer(wp->w_buffer)) > ! { > ! extra_check = TRUE; > ! get_term_attr = TRUE; > ! term_attr = term_get_attr(wp->w_buffer, lnum, -1); > ! } > #endif > > #ifdef FEAT_SPELL > ! if (wp->w_p_spell > ! && *wp->w_s->b_p_spl != NUL > ! && wp->w_s->b_langp.ga_len > 0 > ! && *(char **)(wp->w_s->b_langp.ga_data) != NULL) > ! { > ! /* Prepare for spell checking. */ > ! has_spell = TRUE; > ! extra_check = TRUE; > ! > ! /* Get the start of the next line, so that words that wrap to the > next > ! * line are found too: "et<line-break>al.". > ! * Trick: skip a few chars for C/shell/Vim comments */ > ! nextline[SPWORDLEN] = NUL; > ! if (lnum < wp->w_buffer->b_ml.ml_line_count) > { > ! line = ml_get_buf(wp->w_buffer, lnum + 1, FALSE); > ! spell_cat_line(nextline + SPWORDLEN, line, SPWORDLEN); > ! } > ! > ! /* When a word wrapped from the previous line the start of the > current > ! * line is valid. */ > ! if (lnum == checked_lnum) > ! cur_checked_col = checked_col; > ! checked_lnum = 0; > > ! /* When there was a sentence end in the previous line may require a > ! * word starting with capital in this line. In line 1 always check > ! * the first word. */ > ! if (lnum != capcol_lnum) > ! cap_col = -1; > ! if (lnum == 1) > ! cap_col = 0; > ! capcol_lnum = 0; > ! } > #endif > > ! /* > ! * handle visual active in this window > ! */ > ! fromcol = -10; > ! tocol = MAXCOL; > ! if (VIsual_active && wp->w_buffer == curwin->w_buffer) > ! { > ! /* Visual is after > curwin->w_cursor */ > ! if (LTOREQ_POS(curwin->w_cursor, VIsual)) > ! { > ! top = &curwin->w_cursor; > ! bot = &VIsual; > ! } > ! else /* Visual is before > curwin->w_cursor */ > ! { > ! top = &VIsual; > ! bot = &curwin->w_cursor; > ! } > ! lnum_in_visual_area = (lnum >= top->lnum && lnum <= bot->lnum); > ! if (VIsual_mode == Ctrl_V) /* block mode */ > { > ! if (lnum_in_visual_area) > { > ! fromcol = wp->w_old_cursor_fcol; > ! tocol = wp->w_old_cursor_lcol; > } > ! } > ! else /* non-block mode */ > ! { > ! if (lnum > top->lnum && lnum <= bot->lnum) > ! fromcol = 0; > ! else if (lnum == top->lnum) > { > ! if (VIsual_mode == 'V') /* linewise */ > ! fromcol = 0; > ! else > { > ! getvvcol(wp, top, (colnr_T *)&fromcol, NULL, NULL); > ! if (gchar_pos(top) == NUL) > ! tocol = fromcol + 1; > } > } > ! if (VIsual_mode != 'V' && lnum == bot->lnum) > { > ! if (*p_sel == 'e' && bot->col == 0 > ! #ifdef FEAT_VIRTUALEDIT > ! && bot->coladd == 0 > ! #endif > ! ) > { > ! fromcol = -10; > ! tocol = MAXCOL; > } > ! else if (bot->col == MAXCOL) > ! tocol = MAXCOL; > ! else > { > ! pos = *bot; > ! if (*p_sel == 'e') > ! getvvcol(wp, &pos, (colnr_T *)&tocol, NULL, NULL); > else > { > ! getvvcol(wp, &pos, NULL, NULL, (colnr_T *)&tocol); > ! ++tocol; > } > } > } > - } > > ! /* Check if the character under the cursor should not be inverted > */ > ! if (!highlight_match && lnum == curwin->w_cursor.lnum && wp == > curwin > #ifdef FEAT_GUI > ! && !gui.in_use > #endif > ! ) > ! noinvcur = TRUE; > > ! /* if inverting in this line set area_highlighting */ > ! if (fromcol >= 0) > ! { > ! area_highlighting = TRUE; > ! attr = HL_ATTR(HLF_V); > #if defined(FEAT_CLIPBOARD) && defined(FEAT_X11) > ! if ((clip_star.available && !clip_star.owned > ! && > clip_isautosel_star()) > ! || (clip_plus.available && !clip_plus.owned > ! && > clip_isautosel_plus())) > ! attr = HL_ATTR(HLF_VNC); > #endif > } > - } > > ! /* > ! * handle 'incsearch' and ":s///c" highlighting > ! */ > ! else if (highlight_match > ! && wp == curwin > ! && lnum >= curwin->w_cursor.lnum > ! && lnum <= curwin->w_cursor.lnum + search_match_lines) > ! { > ! if (lnum == curwin->w_cursor.lnum) > ! getvcol(curwin, &(curwin->w_cursor), > ! (colnr_T *)&fromcol, NULL, > NULL); > ! else > ! fromcol = 0; > ! if (lnum == curwin->w_cursor.lnum + search_match_lines) > ! { > ! pos.lnum = lnum; > ! pos.col = search_match_endcol; > ! getvcol(curwin, &pos, (colnr_T *)&tocol, NULL, NULL); > } > - else > - tocol = MAXCOL; > - /* do at least one character; happens when past end of line */ > - if (fromcol == tocol) > - tocol = fromcol + 1; > - area_highlighting = TRUE; > - attr = HL_ATTR(HLF_I); > } > > #ifdef FEAT_DIFF > --- 3263,3477 ---- > row = startrow; > screen_row = row + W_WINROW(wp); > > ! if (!number_only) > ! { > ! /* > ! * To speed up the loop below, set extra_check when there is > linebreak, > ! * trailing white space and/or syntax processing to be done. > ! */ > #ifdef FEAT_LINEBREAK > ! extra_check = wp->w_p_lbr; > #else > ! extra_check = 0; > #endif > #ifdef FEAT_SYN_HL > ! if (syntax_present(wp) && !wp->w_s->b_syn_error > # ifdef SYN_TIME_LIMIT > ! && !wp->w_s->b_syn_slow > # endif > ! ) > { > ! /* Prepare for syntax highlighting in this line. When there > is an > ! * error, stop syntax highlighting. */ > ! save_did_emsg = did_emsg; > ! did_emsg = FALSE; > ! syntax_start(wp, lnum); > ! if (did_emsg) > ! wp->w_s->b_syn_error = TRUE; > ! else > ! { > ! did_emsg = save_did_emsg; > #ifdef SYN_TIME_LIMIT > ! if (!wp->w_s->b_syn_slow) > #endif > ! { > ! has_syntax = TRUE; > ! extra_check = TRUE; > ! } > } > } > > ! /* Check for columns to display for 'colorcolumn'. */ > ! color_cols = wp->w_p_cc_cols; > ! if (color_cols != NULL) > ! draw_color_col = advance_color_col(VCOL_HLC, &color_cols); > #endif > > #ifdef FEAT_TERMINAL > ! if (term_show_buffer(wp->w_buffer)) > ! { > ! extra_check = TRUE; > ! get_term_attr = TRUE; > ! term_attr = term_get_attr(wp->w_buffer, lnum, -1); > ! } > #endif > > #ifdef FEAT_SPELL > ! if (wp->w_p_spell > ! && *wp->w_s->b_p_spl != NUL > ! && wp->w_s->b_langp.ga_len > 0 > ! && *(char **)(wp->w_s->b_langp.ga_data) != NULL) > { > ! /* Prepare for spell checking. */ > ! has_spell = TRUE; > ! extra_check = TRUE; > > ! /* Get the start of the next line, so that words that wrap to > the next > ! * line are found too: "et<line-break>al.". > ! * Trick: skip a few chars for C/shell/Vim comments */ > ! nextline[SPWORDLEN] = NUL; > ! if (lnum < wp->w_buffer->b_ml.ml_line_count) > ! { > ! line = ml_get_buf(wp->w_buffer, lnum + 1, FALSE); > ! spell_cat_line(nextline + SPWORDLEN, line, SPWORDLEN); > ! } > ! > ! /* When a word wrapped from the previous line the start of the > current > ! * line is valid. */ > ! if (lnum == checked_lnum) > ! cur_checked_col = checked_col; > ! checked_lnum = 0; > ! > ! /* When there was a sentence end in the previous line may > require a > ! * word starting with capital in this line. In line 1 always > check > ! * the first word. */ > ! if (lnum != capcol_lnum) > ! cap_col = -1; > ! if (lnum == 1) > ! cap_col = 0; > ! capcol_lnum = 0; > ! } > #endif > > ! /* > ! * handle visual active in this window > ! */ > ! fromcol = -10; > ! tocol = MAXCOL; > ! if (VIsual_active && wp->w_buffer == curwin->w_buffer) > { > ! /* Visual is after > curwin->w_cursor */ > ! if (LTOREQ_POS(curwin->w_cursor, VIsual)) > { > ! top = &curwin->w_cursor; > ! bot = &VIsual; > } > ! else /* Visual is before > curwin->w_cursor */ > { > ! top = &VIsual; > ! bot = &curwin->w_cursor; > ! } > ! lnum_in_visual_area = (lnum >= top->lnum && lnum <= bot->lnum); > ! if (VIsual_mode == Ctrl_V) /* block mode */ > ! { > ! if (lnum_in_visual_area) > { > ! fromcol = wp->w_old_cursor_fcol; > ! tocol = wp->w_old_cursor_lcol; > } > } > ! else /* non-block mode */ > { > ! if (lnum > top->lnum && lnum <= bot->lnum) > ! fromcol = 0; > ! else if (lnum == top->lnum) > { > ! if (VIsual_mode == 'V') /* linewise */ > ! fromcol = 0; > ! else > ! { > ! getvvcol(wp, top, (colnr_T *)&fromcol, NULL, NULL); > ! if (gchar_pos(top) == NUL) > ! tocol = fromcol + 1; > ! } > } > ! if (VIsual_mode != 'V' && lnum == bot->lnum) > { > ! if (*p_sel == 'e' && bot->col == 0 > ! #ifdef FEAT_VIRTUALEDIT > ! && bot->coladd == 0 > ! #endif > ! ) > ! { > ! fromcol = -10; > ! tocol = MAXCOL; > ! } > ! else if (bot->col == MAXCOL) > ! tocol = MAXCOL; > else > { > ! pos = *bot; > ! if (*p_sel == 'e') > ! getvvcol(wp, &pos, (colnr_T *)&tocol, NULL, > NULL); > ! else > ! { > ! getvvcol(wp, &pos, NULL, NULL, (colnr_T > *)&tocol); > ! ++tocol; > ! } > } > } > } > > ! /* Check if the character under the cursor should not be > inverted */ > ! if (!highlight_match && lnum == curwin->w_cursor.lnum && wp == > curwin > #ifdef FEAT_GUI > ! && !gui.in_use > #endif > ! ) > ! noinvcur = TRUE; > > ! /* if inverting in this line set area_highlighting */ > ! if (fromcol >= 0) > ! { > ! area_highlighting = TRUE; > ! attr = HL_ATTR(HLF_V); > #if defined(FEAT_CLIPBOARD) && defined(FEAT_X11) > ! if ((clip_star.available && !clip_star.owned > ! && > clip_isautosel_star()) > ! || (clip_plus.available && !clip_plus.owned > ! && > clip_isautosel_plus())) > ! attr = HL_ATTR(HLF_VNC); > #endif > + } > } > > ! /* > ! * handle 'incsearch' and ":s///c" highlighting > ! */ > ! else if (highlight_match > ! && wp == curwin > ! && lnum >= curwin->w_cursor.lnum > ! && lnum <= curwin->w_cursor.lnum + search_match_lines) > ! { > ! if (lnum == curwin->w_cursor.lnum) > ! getvcol(curwin, &(curwin->w_cursor), > ! (colnr_T *)&fromcol, > NULL, NULL); > ! else > ! fromcol = 0; > ! if (lnum == curwin->w_cursor.lnum + search_match_lines) > ! { > ! pos.lnum = lnum; > ! pos.col = search_match_endcol; > ! getvcol(curwin, &pos, (colnr_T *)&tocol, NULL, NULL); > ! } > ! else > ! tocol = MAXCOL; > ! /* do at least one character; happens when past end of line */ > ! if (fromcol == tocol) > ! tocol = fromcol + 1; > ! area_highlighting = TRUE; > ! attr = HL_ATTR(HLF_I); > } > } > > #ifdef FEAT_DIFF > *************** > *** 3504,3510 **** > ptr = line; > > #ifdef FEAT_SPELL > ! if (has_spell) > { > /* For checking first word with a capital skip white space. */ > if (cap_col == 0) > --- 3517,3523 ---- > ptr = line; > > #ifdef FEAT_SPELL > ! if (has_spell && !number_only) > { > /* For checking first word with a capital skip white space. */ > if (cap_col == 0) > *************** > *** 3564,3570 **** > v = wp->w_skipcol; > else > v = wp->w_leftcol; > ! if (v > 0) > { > #ifdef FEAT_MBYTE > char_u *prev_ptr = ptr; > --- 3577,3583 ---- > v = wp->w_skipcol; > else > v = wp->w_leftcol; > ! if (v > 0 && !number_only) > { > #ifdef FEAT_MBYTE > char_u *prev_ptr = ptr; > *************** > *** 3707,3713 **** > */ > cur = wp->w_match_head; > shl_flag = FALSE; > ! while (cur != NULL || shl_flag == FALSE) > { > if (shl_flag == FALSE) > { > --- 3720,3726 ---- > */ > cur = wp->w_match_head; > shl_flag = FALSE; > ! while ((cur != NULL || shl_flag == FALSE) && !number_only) > { > if (shl_flag == FALSE) > { > *************** > *** 4068,4080 **** > } > } > > ! /* When still displaying '$' of change command, stop at cursor */ > ! if (dollar_vcol >= 0 && wp == curwin > && lnum == wp->w_cursor.lnum && vcol >= > (long)wp->w_virtcol > #ifdef FEAT_DIFF > && filler_todo <= 0 > #endif > ) > { > screen_line(screen_row, wp->w_wincol, col, -(int)wp->w_width, > > HAS_RIGHTLEFT(wp->w_p_rl)); > --- 4081,4096 ---- > } > } > > ! // When still displaying '$' of change command, stop at cursor. > ! // When only displaying the (relative) line number and that's done, > ! // stop here. > ! if ((dollar_vcol >= 0 && wp == curwin > && lnum == wp->w_cursor.lnum && vcol >= > (long)wp->w_virtcol > #ifdef FEAT_DIFF > && filler_todo <= 0 > #endif > ) > + || (number_only && draw_state > WL_NR)) > { > screen_line(screen_row, wp->w_wincol, col, -(int)wp->w_width, > > HAS_RIGHTLEFT(wp->w_p_rl)); > *** ../vim-8.1.0373/src/move.c 2018-09-12 22:27:12.151940716 +0200 > --- src/move.c 2018-09-12 23:08:43.721012117 +0200 > *************** > *** 145,165 **** > # endif > ) > { > #ifdef FEAT_SYN_HL > ! if (!wp->w_p_rnu && wp->w_redr_type <= VALID && last_cursorline != > 0) > { > ! // "last_cursorline" may be set for another window, worst case > we > ! // redraw too much. This is optimized for moving the cursor > around > ! // in the same window. > ! redrawWinline(wp, last_cursorline, FALSE); > ! redrawWinline(wp, wp->w_cursor.lnum, FALSE); > ! redraw_win_later(wp, VALID); > } > - else > - #endif > - redraw_win_later(wp, SOME_VALID); > - #ifdef FEAT_SYN_HL > - last_cursorline = wp->w_cursor.lnum; > #endif > } > } > --- 145,169 ---- > # endif > ) > { > + if (wp->w_p_rnu) > + // win_line() will redraw the number column only. > + redraw_win_later(wp, VALID); > #ifdef FEAT_SYN_HL > ! if (wp->w_p_cul) > { > ! if (wp->w_redr_type <= VALID && last_cursorline != 0) > ! { > ! // "last_cursorline" may be set for another window, worst > case > ! // we redraw too much. This is optimized for moving the > cursor > ! // around in the same window. > ! redrawWinline(wp, last_cursorline, FALSE); > ! redrawWinline(wp, wp->w_cursor.lnum, FALSE); > ! redraw_win_later(wp, VALID); > ! } > ! else > ! redraw_win_later(wp, SOME_VALID); > ! last_cursorline = wp->w_cursor.lnum; > } > #endif > } > } > *** ../vim-8.1.0373/src/version.c 2018-09-12 22:27:12.151940716 +0200 > --- src/version.c 2018-09-12 23:06:23.110026307 +0200 > *************** > *** 796,797 **** > --- 796,799 ---- > { /* Add new patch number below this line */ > + /**/ > + 374, > /**/ > > -- > The 50-50-90 rule: Anytime you have a 50-50 chance of getting > something right, there's a 90% probability you'll get it wrong. > > /// Bram Moolenaar -- b...@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 > /// > > -- > -- > You received this message from the "vim_dev" maillist. > Do not top-post! Type your reply below the text you are replying to. > For more information, visit http://www.vim.org/maillist.php > > --- > You received this message because you are subscribed to the Google Groups > "vim_dev" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to vim_dev+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups "vim_dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to vim_dev+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.