diff options
author | James McCoy <jamessan@jamessan.com> | 2016-11-16 06:52:19 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-11-16 06:52:19 -0500 |
commit | 108d54bbd455635fc29541eb4bae4b9f3318aafb (patch) | |
tree | d5d829f41de3c7d151f62910f00c81bad873e47b /src | |
parent | c66ca17ca1a2f396252bc554198f9e73c7073385 (diff) | |
parent | 34317846d6fa9c2d3b23742abc455eafca0e92e4 (diff) | |
download | rneovim-108d54bbd455635fc29541eb4bae4b9f3318aafb.tar.gz rneovim-108d54bbd455635fc29541eb4bae4b9f3318aafb.tar.bz2 rneovim-108d54bbd455635fc29541eb4bae4b9f3318aafb.zip |
Merge pull request #5600 from jamessan/vim-7.4.1640
vim-patch:7.4.1640,7.4.1647,7.4.1650,7.4.1664
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/eval/encode.c | 4 | ||||
-rw-r--r-- | src/nvim/quickfix.c | 59 | ||||
-rw-r--r-- | src/nvim/undo.c | 2 | ||||
-rw-r--r-- | src/nvim/version.c | 10 |
4 files changed, 61 insertions, 14 deletions
diff --git a/src/nvim/eval/encode.c b/src/nvim/eval/encode.c index 670437ceda..f6c58d8562 100644 --- a/src/nvim/eval/encode.c +++ b/src/nvim/eval/encode.c @@ -836,7 +836,7 @@ char *encode_tv2json(typval_T *tv, size_t *len) msgpack_pack_double(packer, (double) (flt)) #define TYPVAL_ENCODE_CONV_FUNC(fun) \ - return conv_error(_("E951: Error while dumping %s, %s: " \ + return conv_error(_("E5004: Error while dumping %s, %s: " \ "attempt to dump function reference"), \ mpstack, objname) @@ -880,7 +880,7 @@ char *encode_tv2json(typval_T *tv, size_t *len) #define TYPVAL_ENCODE_CONV_LIST_BETWEEN_ITEMS() #define TYPVAL_ENCODE_CONV_RECURSE(val, conv_type) \ - return conv_error(_("E952: Unable to dump %s: " \ + return conv_error(_("E5005: Unable to dump %s: " \ "container references itself in %s"), \ mpstack, objname) diff --git a/src/nvim/quickfix.c b/src/nvim/quickfix.c index d6697902ef..f0d77f9e2b 100644 --- a/src/nvim/quickfix.c +++ b/src/nvim/quickfix.c @@ -482,9 +482,11 @@ qf_init_ext ( p_str += len; } else if (tv->v_type == VAR_LIST) { - /* Get the next line from the supplied list */ - while (p_li && p_li->li_tv.v_type != VAR_STRING) - p_li = p_li->li_next; /* Skip non-string items */ + // Get the next line from the supplied list + while (p_li && (p_li->li_tv.v_type != VAR_STRING + || p_li->li_tv.vval.v_string == NULL)) { + p_li = p_li->li_next; // Skip non-string items + } if (!p_li) /* End of the list */ break; @@ -910,7 +912,9 @@ static int qf_add_entry(qf_info_T *qi, qfline_T **prevp, char_u *dir, if (qi->qf_lists[qi->qf_curlist].qf_count == 0) { /* first element in the list */ qi->qf_lists[qi->qf_curlist].qf_start = qfp; - qfp->qf_prev = qfp; /* first element points to itself */ + qi->qf_lists[qi->qf_curlist].qf_ptr = qfp; + qi->qf_lists[qi->qf_curlist].qf_index = 0; + qfp->qf_prev = qfp; // first element points to itself } else { assert(*prevp); qfp->qf_prev = *prevp; @@ -1254,6 +1258,32 @@ static char_u *qf_guess_filepath(char_u *filename) } +/// When loading a file from the quickfix, the auto commands may modify it. +/// This may invalidate the current quickfix entry. This function checks +/// whether a entry is still present in the quickfix. +/// Similar to location list. +static bool is_qf_entry_present(qf_info_T *qi, qfline_T *qf_ptr) +{ + qf_list_T *qfl; + qfline_T *qfp; + int i; + + qfl = &qi->qf_lists[qi->qf_curlist]; + + // Search for the entry in the current list + for (i = 0, qfp = qfl->qf_start; i < qfl->qf_count; i++, qfp = qfp->qf_next) { + if (qfp == qf_ptr) { + break; + } + } + + if (i == qfl->qf_count) { // Entry is not found + return false; + } + + return true; +} + /* * jump to a quickfix line * if dir == FORWARD go "errornr" valid entries forward @@ -1585,14 +1615,29 @@ win_found: oldwin == curwin ? curwin : NULL); } } else { + int old_qf_curlist = qi->qf_curlist; + bool is_abort = false; + ok = buflist_getfile(qf_ptr->qf_fnum, (linenr_T)1, GETF_SETMARK | GETF_SWITCH, forceit); if (qi != &ql_info && !win_valid(oldwin)) { EMSG(_("E924: Current window was closed")); + is_abort = true; + opened_window = false; + } else if (old_qf_curlist != qi->qf_curlist + || !is_qf_entry_present(qi, qf_ptr)) { + if (qi == &ql_info) { + EMSG(_("E925: Current quickfix was changed")); + } else { + EMSG(_("E926: Current location list was changed")); + } + is_abort = true; + } + + if (is_abort) { ok = false; qi = NULL; qf_ptr = NULL; - opened_window = false; } } } @@ -3580,7 +3625,9 @@ int set_errorlist(win_T *wp, list_T *list, int action, char_u *title) else qi->qf_lists[qi->qf_curlist].qf_nonevalid = FALSE; qi->qf_lists[qi->qf_curlist].qf_ptr = qi->qf_lists[qi->qf_curlist].qf_start; - qi->qf_lists[qi->qf_curlist].qf_index = 1; + if (qi->qf_lists[qi->qf_curlist].qf_count > 0) { + qi->qf_lists[qi->qf_curlist].qf_index = 1; + } qf_update_buffer(qi); diff --git a/src/nvim/undo.c b/src/nvim/undo.c index d6428d63f7..4d56046bc1 100644 --- a/src/nvim/undo.c +++ b/src/nvim/undo.c @@ -691,7 +691,7 @@ char *u_get_undo_file_name(const char *const buf_ffname, const bool reading) int ret; char *failed_dir; if ((ret = os_mkdir_recurse(dir_name, 0755, &failed_dir)) != 0) { - EMSG3(_("E926: Unable to create directory \"%s\" for undo file: %s"), + EMSG3(_("E5003: Unable to create directory \"%s\" for undo file: %s"), failed_dir, os_strerror(ret)); xfree(failed_dir); } else { diff --git a/src/nvim/version.c b/src/nvim/version.c index 10dbf97158..8f3619f1e8 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -747,7 +747,7 @@ static int included_patches[] = { 1700, // 1699, // 1698 NA - // 1697, + 1697, // 1696, 1695, // 1694 NA @@ -780,7 +780,7 @@ static int included_patches[] = { // 1667 NA // 1666 NA // 1665 NA - // 1664, + 1664, 1663, // 1662 NA // 1661 NA @@ -794,17 +794,17 @@ static int included_patches[] = { // 1653 NA 1652, // 1651 NA - // 1650, + 1650, 1649, 1648, - // 1647, + 1647, // 1646 NA // 1645, // 1644, 1643, 1642, 1641, - // 1640, + 1640, // 1639, // 1638, // 1637 NA |