diff options
Diffstat (limited to 'src/nvim/memline.c')
-rw-r--r-- | src/nvim/memline.c | 141 |
1 files changed, 109 insertions, 32 deletions
diff --git a/src/nvim/memline.c b/src/nvim/memline.c index 4e35dd481f..b8891f6560 100644 --- a/src/nvim/memline.c +++ b/src/nvim/memline.c @@ -55,7 +55,6 @@ #include "nvim/memory.h" #include "nvim/message.h" #include "nvim/misc1.h" -#include "nvim/misc2.h" #include "nvim/option.h" #include "nvim/os_unix.h" #include "nvim/path.h" @@ -443,8 +442,9 @@ void ml_setname(buf_T *buf) #ifdef HAVE_FD_CLOEXEC { int fdflags = fcntl(mfp->mf_fd, F_GETFD); - if (fdflags >= 0 && (fdflags & FD_CLOEXEC) == 0) - fcntl(mfp->mf_fd, F_SETFD, fdflags | FD_CLOEXEC); + if (fdflags >= 0 && (fdflags & FD_CLOEXEC) == 0) { + (void)fcntl(mfp->mf_fd, F_SETFD, fdflags | FD_CLOEXEC); + } } #endif } @@ -1063,11 +1063,12 @@ void ml_recover(void) if (!cannot_open) { line_count = pp->pb_pointer[idx].pe_line_count; if (readfile(curbuf->b_ffname, NULL, lnum, - pp->pb_pointer[idx].pe_old_lnum - 1, - line_count, NULL, 0) == FAIL) - cannot_open = TRUE; - else + pp->pb_pointer[idx].pe_old_lnum - 1, line_count, + NULL, 0) != OK) { + cannot_open = true; + } else { lnum += line_count; + } } if (cannot_open) { ++error; @@ -1358,7 +1359,7 @@ recover_names ( if (*dirp == NUL && file_count + num_files == 0 && fname != NULL) { char_u *swapname = (char_u *)modname((char *)fname_res, ".swp", TRUE); if (swapname != NULL) { - if (os_file_exists(swapname)) { + if (os_path_exists(swapname)) { files = xmalloc(sizeof(char_u *)); files[0] = swapname; swapname = NULL; @@ -2340,14 +2341,13 @@ int ml_replace(linenr_T lnum, char_u *line, int copy) return OK; } -/* - * Delete line 'lnum' in the current buffer. - * - * Check: The caller of this function should probably also call - * deleted_lines() after this. - * - * return FAIL for failure, OK otherwise - */ +/// Delete line `lnum` in the current buffer. +/// +/// @note The caller of this function should probably also call +/// deleted_lines() after this. +/// +/// @param message Show "--No lines in buffer--" message. +/// @return FAIL for failure, OK otherwise int ml_delete(linenr_T lnum, int message) { ml_flush_line(curbuf); @@ -3164,9 +3164,10 @@ attention_message ( } /* Some of these messages are long to allow translation to * other languages. */ - MSG_PUTS(_( - "\n(1) Another program may be editing the same file. If this is the case,\n be careful not to end up with two different instances of the same\n file when making changes.")); - MSG_PUTS(_(" Quit, or continue with caution.\n")); + MSG_PUTS(_("\n(1) Another program may be editing the same file. If this is" + " the case,\n be careful not to end up with two different" + " instances of the same\n file when making changes." + " Quit, or continue with caution.\n")); MSG_PUTS(_("(2) An edit session for this file crashed.\n")); MSG_PUTS(_(" If this is the case, use \":recover\" or \"vim -r ")); msg_outtrans(buf->b_fname); @@ -3425,11 +3426,11 @@ static char *findswapname(buf_T *buf, char **dirp, char *old_fname, break; } - /* If the file was deleted this fname can be used. */ - if (!os_file_exists((char_u *) fname)) + // If the file was deleted this fname can be used. + if (!os_path_exists((char_u *)fname)) { break; - } else - { + } + } else { MSG_PUTS("\n"); if (msg_silent == 0) /* call wait_return() later */ @@ -3962,20 +3963,19 @@ long ml_find_line_or_offset(buf_T *buf, linenr_T lnum, long *offp) return size; } -/* - * Goto byte in buffer with offset 'cnt'. - */ +/// Goto byte in buffer with offset 'cnt'. void goto_byte(long cnt) { long boff = cnt; linenr_T lnum; - ml_flush_line(curbuf); /* cached line may be dirty */ + ml_flush_line(curbuf); // cached line may be dirty setpcmark(); - if (boff) - --boff; + if (boff) { + boff--; + } lnum = ml_find_line_or_offset(curbuf, (linenr_T)0, &boff); - if (lnum < 1) { /* past the end */ + if (lnum < 1) { // past the end curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count; curwin->w_curswant = MAXCOL; coladvance((colnr_T)MAXCOL); @@ -3987,7 +3987,84 @@ void goto_byte(long cnt) } check_cursor(); - /* Make sure the cursor is on the first byte of a multi-byte char. */ - if (has_mbyte) + // Make sure the cursor is on the first byte of a multi-byte char. + if (has_mbyte) { mb_adjust_cursor(); + } +} + +/// Increment the line pointer "lp" crossing line boundaries as necessary. +/// Return 1 when going to the next line. +/// Return 2 when moving forward onto a NUL at the end of the line). +/// Return -1 when at the end of file. +/// Return 0 otherwise. +int inc(pos_T *lp) +{ + char_u *p = ml_get_pos(lp); + + if (*p != NUL) { // still within line, move to next char (may be NUL) + if (has_mbyte) { + int l = (*mb_ptr2len)(p); + + lp->col += l; + return (p[l] != NUL) ? 0 : 2; + } + lp->col++; + lp->coladd = 0; + return (p[1] != NUL) ? 0 : 2; + } + if (lp->lnum != curbuf->b_ml.ml_line_count) { // there is a next line + lp->col = 0; + lp->lnum++; + lp->coladd = 0; + return 1; + } + return -1; +} + +/// Same as inc(), but skip NUL at the end of non-empty lines. +int incl(pos_T *lp) +{ + int r; + + if ((r = inc(lp)) >= 1 && lp->col) { + r = inc(lp); + } + return r; +} + +int dec(pos_T *lp) +{ + char_u *p; + + lp->coladd = 0; + if (lp->col > 0) { // still within line + lp->col--; + if (has_mbyte) { + p = ml_get(lp->lnum); + lp->col -= (*mb_head_off)(p, p + lp->col); + } + return 0; + } + if (lp->lnum > 1) { // there is a prior line + lp->lnum--; + p = ml_get(lp->lnum); + lp->col = (colnr_T)STRLEN(p); + if (has_mbyte) { + lp->col -= (*mb_head_off)(p, p + lp->col); + } + return 1; + } + return -1; // at start of file +} + +/// Same as dec(), but skip NUL at the end of non-empty lines. +int decl(pos_T *lp) +{ + int r; + + if ((r = dec(lp)) == 1 && lp->col) { + r = dec(lp); + } + return r; } |