diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/buffer.c | 88 | ||||
-rw-r--r-- | src/nvim/ex_docmd.c | 61 | ||||
-rw-r--r-- | src/nvim/getchar.c | 28 | ||||
-rw-r--r-- | src/nvim/message.c | 2 | ||||
-rw-r--r-- | src/nvim/ops.c | 32 | ||||
-rw-r--r-- | src/nvim/screen.c | 4 | ||||
-rw-r--r-- | src/nvim/sign.c | 6 | ||||
-rw-r--r-- | src/nvim/testdir/test_writefile.vim | 7 |
8 files changed, 86 insertions, 142 deletions
diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c index 078d4fe782..0c14656b33 100644 --- a/src/nvim/buffer.c +++ b/src/nvim/buffer.c @@ -5256,92 +5256,28 @@ bool find_win_for_buf(buf_T *buf, win_T **wp, tabpage_T **tp) return false; } -static int sign_compare(const void *a1, const void *a2) -{ - const signlist_T *s1 = *(const signlist_T **)a1; - const signlist_T *s2 = *(const signlist_T **)a2; - - // Sort by line number, priority and id - - if (s1->lnum > s2->lnum) { - return 1; - } - if (s1->lnum < s2->lnum) { - return -1; - } - if (s1->priority > s2->priority) { - return -1; - } - if (s1->priority < s2->priority) { - return 1; - } - if (s1->id > s2->id) { - return -1; - } - if (s1->id < s2->id) { - return 1; - } - - return 0; -} - int buf_signcols(buf_T *buf) { if (buf->b_signcols_max == -1) { signlist_T *sign; // a sign in the signlist - signlist_T **signs_array; - signlist_T **prev_sign; - int nr_signs = 0, i = 0, same; - - // Count the number of signs - for (sign = buf->b_signlist; sign != NULL; sign = sign->next) { - nr_signs++; - } - - // Make an array of all the signs - signs_array = xcalloc((size_t)nr_signs, sizeof(*sign)); - for (sign = buf->b_signlist; sign != NULL; sign = sign->next) { - signs_array[i] = sign; - i++; - } - - // Sort the array - qsort(signs_array, (size_t)nr_signs, sizeof(signlist_T *), - sign_compare); - - // Find the maximum amount of signs existing in a single line buf->b_signcols_max = 0; + int linesum = 0; + linenr_T curline = 0; - same = 1; - for (i = 1; i < nr_signs; i++) { - if (signs_array[i - 1]->lnum != signs_array[i]->lnum) { - if (buf->b_signcols_max < same) { - buf->b_signcols_max = same; - } - same = 1; - } else { - same++; + FOR_ALL_SIGNS_IN_BUF(buf, sign) { + if (sign->lnum > curline) { + if (linesum > buf->b_signcols_max) { + buf->b_signcols_max = linesum; } + curline = sign->lnum; + linesum = 0; + } + linesum++; } - - if (nr_signs > 0 && buf->b_signcols_max < same) { - buf->b_signcols_max = same; - } - - // Recreate the linked list with the sorted order of the array - buf->b_signlist = NULL; - prev_sign = &buf->b_signlist; - - for (i = 0; i < nr_signs; i++) { - sign = signs_array[i]; - sign->next = NULL; - *prev_sign = sign; - - prev_sign = &sign->next; + if (linesum > buf->b_signcols_max) { + buf->b_signcols_max = linesum; } - xfree(signs_array); - // Check if we need to redraw if (buf->b_signcols_max != buf->b_signcols) { buf->b_signcols = buf->b_signcols_max; diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index 9e056d449b..ec4b16fbb0 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -1948,28 +1948,26 @@ static char_u * do_one_cmd(char_u **cmdlinep, * Check for '|' to separate commands and '"' to start comments. * Don't do this for ":read !cmd" and ":write !cmd". */ - if ((ea.argt & TRLBAR) && !ea.usefilter) + if ((ea.argt & TRLBAR) && !ea.usefilter) { separate_nextcmd(&ea); - - /* - * Check for <newline> to end a shell command. - * Also do this for ":read !cmd", ":write !cmd" and ":global". - * Any others? - */ - else if (ea.cmdidx == CMD_bang - || ea.cmdidx == CMD_global - || ea.cmdidx == CMD_vglobal - || ea.usefilter) { - for (p = ea.arg; *p; ++p) { - /* Remove one backslash before a newline, so that it's possible to - * pass a newline to the shell and also a newline that is preceded - * with a backslash. This makes it impossible to end a shell - * command in a backslash, but that doesn't appear useful. - * Halving the number of backslashes is incompatible with previous - * versions. */ - if (*p == '\\' && p[1] == '\n') + } else if (ea.cmdidx == CMD_bang + || ea.cmdidx == CMD_terminal + || ea.cmdidx == CMD_global + || ea.cmdidx == CMD_vglobal + || ea.usefilter) { + // Check for <newline> to end a shell command. + // Also do this for ":read !cmd", ":write !cmd" and ":global". + // Any others? + for (p = ea.arg; *p; p++) { + // Remove one backslash before a newline, so that it's possible to + // pass a newline to the shell and also a newline that is preceded + // with a backslash. This makes it impossible to end a shell + // command in a backslash, but that doesn't appear useful. + // Halving the number of backslashes is incompatible with previous + // versions. + if (*p == '\\' && p[1] == '\n') { STRMOVE(p, p + 1); - else if (*p == '\n') { + } else if (*p == '\n') { ea.nextcmd = p + 1; *p = NUL; break; @@ -4122,13 +4120,14 @@ int expand_filename(exarg_T *eap, char_u **cmdlinep, char_u **errormsgp) if (!eap->usefilter && !escaped && eap->cmdidx != CMD_bang - && eap->cmdidx != CMD_make - && eap->cmdidx != CMD_lmake && eap->cmdidx != CMD_grep - && eap->cmdidx != CMD_lgrep && eap->cmdidx != CMD_grepadd - && eap->cmdidx != CMD_lgrepadd && eap->cmdidx != CMD_hardcopy + && eap->cmdidx != CMD_lgrep + && eap->cmdidx != CMD_lgrepadd + && eap->cmdidx != CMD_lmake + && eap->cmdidx != CMD_make + && eap->cmdidx != CMD_terminal && !(eap->argt & NOSPC) ) { char_u *l; @@ -4150,8 +4149,10 @@ int expand_filename(exarg_T *eap, char_u **cmdlinep, char_u **errormsgp) } } - /* For a shell command a '!' must be escaped. */ - if ((eap->usefilter || eap->cmdidx == CMD_bang) + // For a shell command a '!' must be escaped. + if ((eap->usefilter + || eap->cmdidx == CMD_bang + || eap->cmdidx == CMD_terminal) && vim_strpbrk(repl, (char_u *)"!") != NULL) { char_u *l; @@ -8399,7 +8400,7 @@ static void ex_pedit(exarg_T *eap) g_do_tagpreview = p_pvh; prepare_tagpreview(true); - keep_help_flag = curwin_save->w_buffer->b_help; + keep_help_flag = bt_help(curwin_save->w_buffer); do_exedit(eap, NULL); keep_help_flag = FALSE; if (curwin != curwin_save && win_valid(curwin_save)) { @@ -9046,7 +9047,7 @@ makeopens( for (wp = tab_firstwin; wp != NULL; wp = wp->w_next) { if (ses_do_win(wp) && wp->w_buffer->b_ffname != NULL - && !wp->w_buffer->b_help + && !bt_help(wp->w_buffer) && !bt_nofile(wp->w_buffer) ) { if (fputs(need_tabnew ? "tabedit " : "edit ", fd) < 0 @@ -9337,7 +9338,7 @@ static int ses_do_win(win_T *wp) || (!wp->w_buffer->terminal && bt_nofile(wp->w_buffer))) { return ssop_flags & SSOP_BLANK; } - if (wp->w_buffer->b_help) { + if (bt_help(wp->w_buffer)) { return ssop_flags & SSOP_HELP; } return true; @@ -9477,7 +9478,7 @@ put_view( */ if ((*flagp & SSOP_FOLDS) && wp->w_buffer->b_ffname != NULL - && (*wp->w_buffer->b_p_bt == NUL || wp->w_buffer->b_help) + && (*wp->w_buffer->b_p_bt == NUL || bt_help(wp->w_buffer)) ) { if (put_folds(fd, wp) == FAIL) return FAIL; diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c index ef522242c6..7e4a0e1321 100644 --- a/src/nvim/getchar.c +++ b/src/nvim/getchar.c @@ -1422,8 +1422,8 @@ int vgetc(void) } - /* a keypad or special function key was not mapped, use it like - * its ASCII equivalent */ + // a keypad or special function key was not mapped, use it like + // its ASCII equivalent switch (c) { case K_KPLUS: c = '+'; break; case K_KMINUS: c = '-'; break; @@ -1475,25 +1475,25 @@ int vgetc(void) case K_XRIGHT: c = K_RIGHT; break; } - /* For a multi-byte character get all the bytes and return the - * converted character. - * Note: This will loop until enough bytes are received! - */ - if (has_mbyte && (n = MB_BYTE2LEN_CHECK(c)) > 1) { + // For a multi-byte character get all the bytes and return the + // converted character. + // Note: This will loop until enough bytes are received! + if ((n = MB_BYTE2LEN_CHECK(c)) > 1) { no_mapping++; buf[0] = (char_u)c; for (i = 1; i < n; i++) { buf[i] = (char_u)vgetorpeek(true); if (buf[i] == K_SPECIAL ) { - /* Must be a K_SPECIAL - KS_SPECIAL - KE_FILLER sequence, - * which represents a K_SPECIAL (0x80), - * or a CSI - KS_EXTRA - KE_CSI sequence, which represents - * a CSI (0x9B), - * of a K_SPECIAL - KS_EXTRA - KE_CSI, which is CSI too. */ - c = vgetorpeek(TRUE); - if (vgetorpeek(TRUE) == (int)KE_CSI && c == KS_EXTRA) + // Must be a K_SPECIAL - KS_SPECIAL - KE_FILLER sequence, + // which represents a K_SPECIAL (0x80), + // or a CSI - KS_EXTRA - KE_CSI sequence, which represents + // a CSI (0x9B), + // of a K_SPECIAL - KS_EXTRA - KE_CSI, which is CSI too. + c = vgetorpeek(true); + if (vgetorpeek(true) == (int)KE_CSI && c == KS_EXTRA) { buf[i] = CSI; + } } } no_mapping--; diff --git a/src/nvim/message.c b/src/nvim/message.c index 7498091ade..882fce504b 100644 --- a/src/nvim/message.c +++ b/src/nvim/message.c @@ -2053,7 +2053,7 @@ int msg_scrollsize(void) /* * Scroll the screen up one line for displaying the next message line. */ -static void msg_scroll_up(void) +void msg_scroll_up(void) { if (!msg_did_scroll) { ui_call_win_scroll_over_start(); diff --git a/src/nvim/ops.c b/src/nvim/ops.c index 9b68b713ad..2a3b7beb8e 100644 --- a/src/nvim/ops.c +++ b/src/nvim/ops.c @@ -983,25 +983,29 @@ do_execreg( EMSG(_(e_nolastcmd)); return FAIL; } - XFREE_CLEAR(new_last_cmdline); // don't keep the cmdline containing @: + // don't keep the cmdline containing @: + XFREE_CLEAR(new_last_cmdline); // Escape all control characters with a CTRL-V p = vim_strsave_escaped_ext( last_cmdline, - (char_u *) - "\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037", - Ctrl_V, FALSE); - /* When in Visual mode "'<,'>" will be prepended to the command. - * Remove it when it's already there. */ - if (VIsual_active && STRNCMP(p, "'<,'>", 5) == 0) - retval = put_in_typebuf(p + 5, TRUE, TRUE, silent); - else - retval = put_in_typebuf(p, TRUE, TRUE, silent); + (char_u *)"\001\002\003\004\005\006\007" + "\010\011\012\013\014\015\016\017" + "\020\021\022\023\024\025\026\027" + "\030\031\032\033\034\035\036\037", + Ctrl_V, false); + // When in Visual mode "'<,'>" will be prepended to the command. + // Remove it when it's already there. + if (VIsual_active && STRNCMP(p, "'<,'>", 5) == 0) { + retval = put_in_typebuf(p + 5, true, true, silent); + } else { + retval = put_in_typebuf(p, true, true, silent); + } xfree(p); } else if (regname == '=') { p = get_expr_line(); if (p == NULL) return FAIL; - retval = put_in_typebuf(p, TRUE, colon, silent); + retval = put_in_typebuf(p, true, colon, silent); xfree(p); } else if (regname == '.') { /* use last inserted text */ p = get_last_insert_save(); @@ -1009,7 +1013,7 @@ do_execreg( EMSG(_(e_noinstext)); return FAIL; } - retval = put_in_typebuf(p, FALSE, colon, silent); + retval = put_in_typebuf(p, false, colon, silent); xfree(p); } else { yankreg_T *reg = get_yank_register(regname, YREG_PASTE); @@ -1075,8 +1079,8 @@ static void put_reedit_in_typebuf(int silent) */ static int put_in_typebuf( char_u *s, - int esc, - int colon, /* add ':' before the line */ + bool esc, + bool colon, // add ':' before the line int silent ) { diff --git a/src/nvim/screen.c b/src/nvim/screen.c index fe9fba7af6..a20c91845d 100644 --- a/src/nvim/screen.c +++ b/src/nvim/screen.c @@ -4765,12 +4765,12 @@ win_redr_status_matches ( row = cmdline_row - 1; if (row >= 0) { - if (wild_menu_showing == 0) { + if (wild_menu_showing == 0 || wild_menu_showing == WM_LIST) { if (msg_scrolled > 0) { /* Put the wildmenu just above the command line. If there is * no room, scroll the screen one line up. */ if (cmdline_row == Rows - 1) { - grid_del_lines(&default_grid, 0, 1, (int)Rows, 0, (int)Columns); + msg_scroll_up(); msg_scrolled++; } else { cmdline_row++; diff --git a/src/nvim/sign.c b/src/nvim/sign.c index ac26fd0137..8c85fbdaa7 100644 --- a/src/nvim/sign.c +++ b/src/nvim/sign.c @@ -231,9 +231,11 @@ static void insert_sign_by_lnum_prio( { signlist_T *sign; - // keep signs sorted by lnum and by priority: insert new sign at + // keep signs sorted by lnum, priority and id: insert new sign at // the proper position in the list for this lnum. - while (prev != NULL && prev->lnum == lnum && prev->priority <= prio) { + while (prev != NULL && prev->lnum == lnum + && (prev->priority < prio + || (prev->priority == prio && prev->id <= id))) { prev = prev->prev; } if (prev == NULL) { diff --git a/src/nvim/testdir/test_writefile.vim b/src/nvim/testdir/test_writefile.vim index b4585a72ef..aeee6ad88b 100644 --- a/src/nvim/testdir/test_writefile.vim +++ b/src/nvim/testdir/test_writefile.vim @@ -38,7 +38,7 @@ func Test_writefile_fails_conversion() endif " Without a backup file the write won't happen if there is a conversion " error. - set nobackup nowritebackup + set nobackup nowritebackup backupdir=. backupskip= new let contents = ["line one", "line two"] call writefile(contents, 'Xfile') @@ -49,7 +49,7 @@ func Test_writefile_fails_conversion() call delete('Xfile') bwipe! - set backup& writebackup& + set backup& writebackup& backupdir&vim backupskip&vim endfunc func Test_writefile_fails_conversion2() @@ -58,7 +58,7 @@ func Test_writefile_fails_conversion2() endif " With a backup file the write happens even if there is a conversion error, " but then the backup file must remain - set nobackup writebackup + set nobackup writebackup backupdir=. backupskip= let contents = ["line one", "line two"] call writefile(contents, 'Xfile_conversion_err') edit Xfile_conversion_err @@ -71,6 +71,7 @@ func Test_writefile_fails_conversion2() call delete('Xfile_conversion_err') call delete('Xfile_conversion_err~') bwipe! + set backup& writebackup& backupdir&vim backupskip&vim endfunc func SetFlag(timer) |