summaryrefslogtreecommitdiff
path: root/data/vim/patches/8.1.0461
diff options
context:
space:
mode:
Diffstat (limited to 'data/vim/patches/8.1.0461')
-rw-r--r--data/vim/patches/8.1.04614568
1 files changed, 4568 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.0461 b/data/vim/patches/8.1.0461
new file mode 100644
index 000000000..bf1088431
--- /dev/null
+++ b/data/vim/patches/8.1.0461
@@ -0,0 +1,4568 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0461
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0461
+Problem: Quickfix code uses too many /* */ comments.
+Solution: Change to // comments. (Yegappan Lakshmanan)
+Files: src/quickfix.c
+
+
+*** ../vim-8.1.0460/src/quickfix.c 2018-10-07 14:38:43.714247899 +0200
+--- src/quickfix.c 2018-10-07 20:20:56.652633675 +0200
+***************
+*** 27,46 ****
+ typedef struct qfline_S qfline_T;
+ struct qfline_S
+ {
+! qfline_T *qf_next; /* pointer to next error in the list */
+! qfline_T *qf_prev; /* pointer to previous error in the list */
+! linenr_T qf_lnum; /* line number where the error occurred */
+! int qf_fnum; /* file number for the line */
+! int qf_col; /* column where the error occurred */
+! int qf_nr; /* error number */
+! char_u *qf_module; /* module name for this error */
+! char_u *qf_pattern; /* search pattern for the error */
+! char_u *qf_text; /* description of the error */
+! char_u qf_viscol; /* set to TRUE if qf_col is screen column */
+! char_u qf_cleared; /* set to TRUE if line has been deleted */
+! char_u qf_type; /* type of the error (mostly 'E'); 1 for
+! :helpgrep */
+! char_u qf_valid; /* valid error message detected */
+ };
+
+ /*
+--- 27,46 ----
+ typedef struct qfline_S qfline_T;
+ struct qfline_S
+ {
+! qfline_T *qf_next; // pointer to next error in the list
+! qfline_T *qf_prev; // pointer to previous error in the list
+! linenr_T qf_lnum; // line number where the error occurred
+! int qf_fnum; // file number for the line
+! int qf_col; // column where the error occurred
+! int qf_nr; // error number
+! char_u *qf_module; // module name for this error
+! char_u *qf_pattern; // search pattern for the error
+! char_u *qf_text; // description of the error
+! char_u qf_viscol; // set to TRUE if qf_col is screen column
+! char_u qf_cleared; // set to TRUE if line has been deleted
+! char_u qf_type; // type of the error (mostly 'E'); 1 for
+! // :helpgrep
+! char_u qf_valid; // valid error message detected
+ };
+
+ /*
+***************
+*** 60,75 ****
+ */
+ typedef struct qf_list_S
+ {
+! int_u qf_id; /* Unique identifier for this list */
+! qfline_T *qf_start; /* pointer to the first error */
+! qfline_T *qf_last; /* pointer to the last error */
+! qfline_T *qf_ptr; /* pointer to the current error */
+! int qf_count; /* number of errors (0 means empty list) */
+! int qf_index; /* current index in the error list */
+! int qf_nonevalid; /* TRUE if not a single valid entry found */
+! char_u *qf_title; /* title derived from the command that created
+! * the error list or set by setqflist */
+! typval_T *qf_ctx; /* context set by setqflist/setloclist */
+
+ struct dir_stack_T *qf_dir_stack;
+ char_u *qf_directory;
+--- 60,75 ----
+ */
+ typedef struct qf_list_S
+ {
+! int_u qf_id; // Unique identifier for this list
+! qfline_T *qf_start; // pointer to the first error
+! qfline_T *qf_last; // pointer to the last error
+! qfline_T *qf_ptr; // pointer to the current error
+! int qf_count; // number of errors (0 means empty list)
+! int qf_index; // current index in the error list
+! int qf_nonevalid; // TRUE if not a single valid entry found
+! char_u *qf_title; // title derived from the command that created
+! // the error list or set by setqflist
+! typval_T *qf_ctx; // context set by setqflist/setloclist
+
+ struct dir_stack_T *qf_dir_stack;
+ char_u *qf_directory;
+***************
+*** 87,108 ****
+ */
+ struct qf_info_S
+ {
+! /*
+! * Count of references to this list. Used only for location lists.
+! * When a location list window reference this list, qf_refcount
+! * will be 2. Otherwise, qf_refcount will be 1. When qf_refcount
+! * reaches 0, the list is freed.
+! */
+ int qf_refcount;
+! int qf_listcount; /* current number of lists */
+! int qf_curlist; /* current error list */
+ qf_list_T qf_lists[LISTCOUNT];
+ };
+
+! static qf_info_T ql_info; /* global quickfix list */
+! static int_u last_qf_id = 0; /* Last used quickfix list id */
+
+! #define FMT_PATTERNS 11 /* maximum number of % recognized */
+
+ /*
+ * Structure used to hold the info of one part of 'errorformat'
+--- 87,106 ----
+ */
+ struct qf_info_S
+ {
+! // Count of references to this list. Used only for location lists.
+! // When a location list window reference this list, qf_refcount
+! // will be 2. Otherwise, qf_refcount will be 1. When qf_refcount
+! // reaches 0, the list is freed.
+ int qf_refcount;
+! int qf_listcount; // current number of lists
+! int qf_curlist; // current error list
+ qf_list_T qf_lists[LISTCOUNT];
+ };
+
+! static qf_info_T ql_info; // global quickfix list
+! static int_u last_qf_id = 0; // Last used quickfix list id
+
+! #define FMT_PATTERNS 11 // maximum number of % recognized
+
+ /*
+ * Structure used to hold the info of one part of 'errorformat'
+***************
+*** 110,138 ****
+ typedef struct efm_S efm_T;
+ struct efm_S
+ {
+! regprog_T *prog; /* pre-formatted part of 'errorformat' */
+! efm_T *next; /* pointer to next (NULL if last) */
+! char_u addr[FMT_PATTERNS]; /* indices of used % patterns */
+! char_u prefix; /* prefix of this format line: */
+! /* 'D' enter directory */
+! /* 'X' leave directory */
+! /* 'A' start of multi-line message */
+! /* 'E' error message */
+! /* 'W' warning message */
+! /* 'I' informational message */
+! /* 'C' continuation line */
+! /* 'Z' end of multi-line message */
+! /* 'G' general, unspecific message */
+! /* 'P' push file (partial) message */
+! /* 'Q' pop/quit file (partial) message */
+! /* 'O' overread (partial) message */
+! char_u flags; /* additional flags given in prefix */
+! /* '-' do not include this line */
+! /* '+' include whole line in message */
+! int conthere; /* %> used */
+ };
+
+! static efm_T *fmt_start = NULL; /* cached across qf_parse_line() calls */
+
+ static void qf_new_list(qf_info_T *qi, char_u *qf_title);
+ static int qf_add_entry(qf_info_T *qi, int qf_idx, char_u *dir, char_u *fname, char_u *module, int bufnum, char_u *mesg, long lnum, int col, int vis_col, char_u *pattern, int nr, int type, int valid);
+--- 108,136 ----
+ typedef struct efm_S efm_T;
+ struct efm_S
+ {
+! regprog_T *prog; // pre-formatted part of 'errorformat'
+! efm_T *next; // pointer to next (NULL if last)
+! char_u addr[FMT_PATTERNS]; // indices of used % patterns
+! char_u prefix; // prefix of this format line:
+! // 'D' enter directory
+! // 'X' leave directory
+! // 'A' start of multi-line message
+! // 'E' error message
+! // 'W' warning message
+! // 'I' informational message
+! // 'C' continuation line
+! // 'Z' end of multi-line message
+! // 'G' general, unspecific message
+! // 'P' push file (partial) message
+! // 'Q' pop/quit file (partial) message
+! // 'O' overread (partial) message
+! char_u flags; // additional flags given in prefix
+! // '-' do not include this line
+! // '+' include whole line in message
+! int conthere; // %> used
+ };
+
+! static efm_T *fmt_start = NULL; // cached across qf_parse_line() calls
+
+ static void qf_new_list(qf_info_T *qi, char_u *qf_title);
+ static int qf_add_entry(qf_info_T *qi, int qf_idx, char_u *dir, char_u *fname, char_u *module, int bufnum, char_u *mesg, long lnum, int col, int vis_col, char_u *pattern, int nr, int type, int valid);
+***************
+*** 153,161 ****
+ static void unload_dummy_buffer(buf_T *buf, char_u *dirname_start);
+ static qf_info_T *ll_get_or_alloc_list(win_T *);
+
+! /* Quickfix window check helper macro */
+ #define IS_QF_WINDOW(wp) (bt_quickfix(wp->w_buffer) && wp->w_llist_ref == NULL)
+! /* Location list window check helper macro */
+ #define IS_LL_WINDOW(wp) (bt_quickfix(wp->w_buffer) && wp->w_llist_ref != NULL)
+
+ // Quickfix and location list stack check helper macros
+--- 151,159 ----
+ static void unload_dummy_buffer(buf_T *buf, char_u *dirname_start);
+ static qf_info_T *ll_get_or_alloc_list(win_T *);
+
+! // Quickfix window check helper macro
+ #define IS_QF_WINDOW(wp) (bt_quickfix(wp->w_buffer) && wp->w_llist_ref == NULL)
+! // Location list window check helper macro
+ #define IS_LL_WINDOW(wp) (bt_quickfix(wp->w_buffer) && wp->w_llist_ref != NULL)
+
+ // Quickfix and location list stack check helper macros
+***************
+*** 189,195 ****
+ char *pattern;
+ } fmt_pat[FMT_PATTERNS] =
+ {
+! {'f', ".\\+"}, /* only used when at end */
+ {'n', "\\d\\+"},
+ {'l', "\\d\\+"},
+ {'c', "\\d\\+"},
+--- 187,193 ----
+ char *pattern;
+ } fmt_pat[FMT_PATTERNS] =
+ {
+! {'f', ".\\+"}, // only used when at end
+ {'n', "\\d\\+"},
+ {'l', "\\d\\+"},
+ {'c', "\\d\\+"},
+***************
+*** 221,227 ****
+
+ if (efminfo->addr[idx])
+ {
+! /* Each errorformat pattern can occur only once */
+ sprintf((char *)errmsg,
+ _("E372: Too many %%%c in format string"), *efmpat);
+ EMSG(errmsg);
+--- 219,225 ----
+
+ if (efminfo->addr[idx])
+ {
+! // Each errorformat pattern can occur only once
+ sprintf((char *)errmsg,
+ _("E372: Too many %%%c in format string"), *efmpat);
+ EMSG(errmsg);
+***************
+*** 243,251 ****
+ #ifdef BACKSLASH_IN_FILENAME
+ if (*efmpat == 'f')
+ {
+! /* Also match "c:" in the file name, even when
+! * checking for a colon next: "%f:".
+! * "\%(\a:\)\=" */
+ STRCPY(regpat, "\\%(\\a:\\)\\=");
+ regpat += 10;
+ }
+--- 241,249 ----
+ #ifdef BACKSLASH_IN_FILENAME
+ if (*efmpat == 'f')
+ {
+! // Also match "c:" in the file name, even when
+! // checking for a colon next: "%f:".
+! // "\%(\a:\)\="
+ STRCPY(regpat, "\\%(\\a:\\)\\=");
+ regpat += 10;
+ }
+***************
+*** 254,271 ****
+ {
+ if (efmpat[1] != '\\' && efmpat[1] != '%')
+ {
+! /* A file name may contain spaces, but this isn't
+! * in "\f". For "%f:%l:%m" there may be a ":" in
+! * the file name. Use ".\{-1,}x" instead (x is
+! * the next character), the requirement that :999:
+! * follows should work. */
+ STRCPY(regpat, ".\\{-1,}");
+ regpat += 7;
+ }
+ else
+ {
+! /* File name followed by '\\' or '%': include as
+! * many file name chars as possible. */
+ STRCPY(regpat, "\\f\\+");
+ regpat += 4;
+ }
+--- 252,269 ----
+ {
+ if (efmpat[1] != '\\' && efmpat[1] != '%')
+ {
+! // A file name may contain spaces, but this isn't
+! // in "\f". For "%f:%l:%m" there may be a ":" in
+! // the file name. Use ".\{-1,}x" instead (x is
+! // the next character), the requirement that :999:
+! // follows should work.
+ STRCPY(regpat, ".\\{-1,}");
+ regpat += 7;
+ }
+ else
+ {
+! // File name followed by '\\' or '%': include as
+! // many file name chars as possible.
+ STRCPY(regpat, "\\f\\+");
+ regpat += 4;
+ }
+***************
+*** 298,313 ****
+
+ if (*efmp == '[' || *efmp == '\\')
+ {
+! if ((*regpat++ = *efmp) == '[') /* %*[^a-z0-9] etc. */
+ {
+ if (efmp[1] == '^')
+ *regpat++ = *++efmp;
+ if (efmp < efm + len)
+ {
+! *regpat++ = *++efmp; /* could be ']' */
+ while (efmp < efm + len
+ && (*regpat++ = *++efmp) != ']')
+! /* skip */;
+ if (efmp == efm + len)
+ {
+ EMSG(_("E374: Missing ] in format string"));
+--- 296,311 ----
+
+ if (*efmp == '[' || *efmp == '\\')
+ {
+! if ((*regpat++ = *efmp) == '[') // %*[^a-z0-9] etc.
+ {
+ if (efmp[1] == '^')
+ *regpat++ = *++efmp;
+ if (efmp < efm + len)
+ {
+! *regpat++ = *++efmp; // could be ']'
+ while (efmp < efm + len
+ && (*regpat++ = *++efmp) != ']')
+! // skip ;
+ if (efmp == efm + len)
+ {
+ EMSG(_("E374: Missing ] in format string"));
+***************
+*** 315,328 ****
+ }
+ }
+ }
+! else if (efmp < efm + len) /* %*\D, %*\s etc. */
+ *regpat++ = *++efmp;
+ *regpat++ = '\\';
+ *regpat++ = '+';
+ }
+ else
+ {
+! /* TODO: scanf()-like: %*ud, %*3c, %*f, ... ? */
+ sprintf((char *)errmsg,
+ _("E375: Unsupported %%%c in format string"), *efmp);
+ EMSG(errmsg);
+--- 313,326 ----
+ }
+ }
+ }
+! else if (efmp < efm + len) // %*\D, %*\s etc.
+ *regpat++ = *++efmp;
+ *regpat++ = '\\';
+ *regpat++ = '+';
+ }
+ else
+ {
+! // TODO: scanf()-like: %*ud, %*3c, %*f, ... ?
+ sprintf((char *)errmsg,
+ _("E375: Unsupported %%%c in format string"), *efmp);
+ EMSG(errmsg);
+***************
+*** 374,382 ****
+ int round;
+ int idx = 0;
+
+! /*
+! * Build a regexp pattern for a 'errorformat' option part
+! */
+ ptr = regpat;
+ *ptr++ = '^';
+ round = 0;
+--- 372,378 ----
+ int round;
+ int idx = 0;
+
+! // Build a regexp pattern for a 'errorformat' option part
+ ptr = regpat;
+ *ptr++ = '^';
+ round = 0;
+***************
+*** 404,420 ****
+ return FAIL;
+ }
+ else if (vim_strchr((char_u *)"%\\.^$~[", *efmp) != NULL)
+! *ptr++ = *efmp; /* regexp magic characters */
+ else if (*efmp == '#')
+ *ptr++ = '*';
+ else if (*efmp == '>')
+ fmt_ptr->conthere = TRUE;
+! else if (efmp == efm + 1) /* analyse prefix */
+ {
+! /*
+! * prefix is allowed only at the beginning of the errorformat
+! * option part
+! */
+ efmp = efm_analyze_prefix(efmp, fmt_ptr, errmsg);
+ if (efmp == NULL)
+ return FAIL;
+--- 400,414 ----
+ return FAIL;
+ }
+ else if (vim_strchr((char_u *)"%\\.^$~[", *efmp) != NULL)
+! *ptr++ = *efmp; // regexp magic characters
+ else if (*efmp == '#')
+ *ptr++ = '*';
+ else if (*efmp == '>')
+ fmt_ptr->conthere = TRUE;
+! else if (efmp == efm + 1) // analyse prefix
+ {
+! // prefix is allowed only at the beginning of the errorformat
+! // option part
+ efmp = efm_analyze_prefix(efmp, fmt_ptr, errmsg);
+ if (efmp == NULL)
+ return FAIL;
+***************
+*** 427,438 ****
+ return FAIL;
+ }
+ }
+! else /* copy normal character */
+ {
+ if (*efmp == '\\' && efmp + 1 < efm + len)
+ ++efmp;
+ else if (vim_strchr((char_u *)".*^$~[", *efmp) != NULL)
+! *ptr++ = '\\'; /* escape regexp atoms */
+ if (*efmp)
+ *ptr++ = *efmp;
+ }
+--- 421,432 ----
+ return FAIL;
+ }
+ }
+! else // copy normal character
+ {
+ if (*efmp == '\\' && efmp + 1 < efm + len)
+ ++efmp;
+ else if (vim_strchr((char_u *)".*^$~[", *efmp) != NULL)
+! *ptr++ = '\\'; // escape regexp atoms
+ if (*efmp)
+ *ptr++ = *efmp;
+ }
+***************
+*** 474,482 ****
+ for (i = FMT_PATTERNS; i > 0; )
+ sz += (int)STRLEN(fmt_pat[--i].pattern);
+ #ifdef BACKSLASH_IN_FILENAME
+! sz += 12; /* "%f" can become twelve chars longer (see efm_to_regpat) */
+ #else
+! sz += 2; /* "%f" can become two chars longer */
+ #endif
+
+ return sz;
+--- 468,476 ----
+ for (i = FMT_PATTERNS; i > 0; )
+ sz += (int)STRLEN(fmt_pat[--i].pattern);
+ #ifdef BACKSLASH_IN_FILENAME
+! sz += 12; // "%f" can become twelve chars longer (see efm_to_regpat)
+ #else
+! sz += 2; // "%f" can become two chars longer
+ #endif
+
+ return sz;
+***************
+*** 519,566 ****
+ if (errmsg == NULL)
+ goto parse_efm_end;
+
+! /*
+! * Each part of the format string is copied and modified from errorformat
+! * to regex prog. Only a few % characters are allowed.
+! */
+!
+! /*
+! * Get some space to modify the format string into.
+! */
+ sz = efm_regpat_bufsz(efm);
+ if ((fmtstr = alloc(sz)) == NULL)
+ goto parse_efm_error;
+
+ while (efm[0] != NUL)
+ {
+! /*
+! * Allocate a new eformat structure and put it at the end of the list
+! */
+ fmt_ptr = (efm_T *)alloc_clear((unsigned)sizeof(efm_T));
+ if (fmt_ptr == NULL)
+ goto parse_efm_error;
+! if (fmt_first == NULL) /* first one */
+ fmt_first = fmt_ptr;
+ else
+ fmt_last->next = fmt_ptr;
+ fmt_last = fmt_ptr;
+
+! /*
+! * Isolate one part in the 'errorformat' option
+! */
+ len = efm_option_part_len(efm);
+
+ if (efm_to_regpat(efm, len, fmt_ptr, fmtstr, errmsg) == FAIL)
+ goto parse_efm_error;
+ if ((fmt_ptr->prog = vim_regcomp(fmtstr, RE_MAGIC + RE_STRING)) == NULL)
+ goto parse_efm_error;
+! /*
+! * Advance to next part
+! */
+! efm = skip_to_option_part(efm + len); /* skip comma and spaces */
+ }
+
+! if (fmt_first == NULL) /* nothing found */
+ EMSG(_("E378: 'errorformat' contains no pattern"));
+
+ goto parse_efm_end;
+--- 513,550 ----
+ if (errmsg == NULL)
+ goto parse_efm_end;
+
+! // Each part of the format string is copied and modified from errorformat
+! // to regex prog. Only a few % characters are allowed.
+!
+! // Get some space to modify the format string into.
+ sz = efm_regpat_bufsz(efm);
+ if ((fmtstr = alloc(sz)) == NULL)
+ goto parse_efm_error;
+
+ while (efm[0] != NUL)
+ {
+! // Allocate a new eformat structure and put it at the end of the list
+ fmt_ptr = (efm_T *)alloc_clear((unsigned)sizeof(efm_T));
+ if (fmt_ptr == NULL)
+ goto parse_efm_error;
+! if (fmt_first == NULL) // first one
+ fmt_first = fmt_ptr;
+ else
+ fmt_last->next = fmt_ptr;
+ fmt_last = fmt_ptr;
+
+! // Isolate one part in the 'errorformat' option
+ len = efm_option_part_len(efm);
+
+ if (efm_to_regpat(efm, len, fmt_ptr, fmtstr, errmsg) == FAIL)
+ goto parse_efm_error;
+ if ((fmt_ptr->prog = vim_regcomp(fmtstr, RE_MAGIC + RE_STRING)) == NULL)
+ goto parse_efm_error;
+! // Advance to next part
+! efm = skip_to_option_part(efm + len); // skip comma and spaces
+ }
+
+! if (fmt_first == NULL) // nothing found
+ EMSG(_("E378: 'errorformat' contains no pattern"));
+
+ goto parse_efm_end;
+***************
+*** 611,620 ****
+ {
+ char_u *p;
+
+! /*
+! * If the line exceeds LINE_MAXLEN exclude the last
+! * byte since it's not a NL character.
+! */
+ state->linelen = newsz > LINE_MAXLEN ? LINE_MAXLEN - 1 : newsz;
+ if (state->growbuf == NULL)
+ {
+--- 595,602 ----
+ {
+ char_u *p;
+
+! // If the line exceeds LINE_MAXLEN exclude the last
+! // byte since it's not a NL character.
+ state->linelen = newsz > LINE_MAXLEN ? LINE_MAXLEN - 1 : newsz;
+ if (state->growbuf == NULL)
+ {
+***************
+*** 639,650 ****
+ static int
+ qf_get_next_str_line(qfstate_T *state)
+ {
+! /* Get the next line from the supplied string */
+ char_u *p_str = state->p_str;
+ char_u *p;
+ int len;
+
+! if (*p_str == NUL) /* Reached the end of the string */
+ return QF_END_OF_INPUT;
+
+ p = vim_strchr(p_str, '\n');
+--- 621,632 ----
+ static int
+ qf_get_next_str_line(qfstate_T *state)
+ {
+! // Get the next line from the supplied string
+ char_u *p_str = state->p_str;
+ char_u *p;
+ int len;
+
+! if (*p_str == NUL) // Reached the end of the string
+ return QF_END_OF_INPUT;
+
+ p = vim_strchr(p_str, '\n');
+***************
+*** 666,675 ****
+ }
+ vim_strncpy(state->linebuf, p_str, state->linelen);
+
+! /*
+! * Increment using len in order to discard the rest of the
+! * line if it exceeds LINE_MAXLEN.
+! */
+ p_str += len;
+ state->p_str = p_str;
+
+--- 648,655 ----
+ }
+ vim_strncpy(state->linebuf, p_str, state->linelen);
+
+! // Increment using len in order to discard the rest of the
+! // line if it exceeds LINE_MAXLEN.
+ p_str += len;
+ state->p_str = p_str;
+
+***************
+*** 688,696 ****
+ while (p_li != NULL
+ && (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 == NULL) /* End of the list */
+ {
+ state->p_li = NULL;
+ return QF_END_OF_INPUT;
+--- 668,676 ----
+ while (p_li != NULL
+ && (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 == NULL) // End of the list
+ {
+ state->p_li = NULL;
+ return QF_END_OF_INPUT;
+***************
+*** 711,717 ****
+
+ vim_strncpy(state->linebuf, p_li->li_tv.vval.v_string, state->linelen);
+
+! state->p_li = p_li->li_next; /* next item */
+ return QF_OK;
+ }
+
+--- 691,697 ----
+
+ vim_strncpy(state->linebuf, p_li->li_tv.vval.v_string, state->linelen);
+
+! state->p_li = p_li->li_next; // next item
+ return QF_OK;
+ }
+
+***************
+*** 724,730 ****
+ char_u *p_buf = NULL;
+ int len;
+
+! /* Get the next line from the supplied buffer */
+ if (state->buflnum > state->lnumlast)
+ return QF_END_OF_INPUT;
+
+--- 704,710 ----
+ char_u *p_buf = NULL;
+ int len;
+
+! // Get the next line from the supplied buffer
+ if (state->buflnum > state->lnumlast)
+ return QF_END_OF_INPUT;
+
+***************
+*** 764,773 ****
+ state->linelen = (int)STRLEN(IObuff);
+ if (state->linelen == IOSIZE - 1 && !(IObuff[state->linelen - 1] == '\n'))
+ {
+! /*
+! * The current line exceeds IObuff, continue reading using
+! * growbuf until EOL or LINE_MAXLEN bytes is read.
+! */
+ if (state->growbuf == NULL)
+ {
+ state->growbufsiz = 2 * (IOSIZE - 1);
+--- 744,751 ----
+ state->linelen = (int)STRLEN(IObuff);
+ if (state->linelen == IOSIZE - 1 && !(IObuff[state->linelen - 1] == '\n'))
+ {
+! // The current line exceeds IObuff, continue reading using
+! // growbuf until EOL or LINE_MAXLEN bytes is read.
+ if (state->growbuf == NULL)
+ {
+ state->growbufsiz = 2 * (IOSIZE - 1);
+***************
+*** 776,782 ****
+ return QF_NOMEM;
+ }
+
+! /* Copy the read part of the line, excluding null-terminator */
+ memcpy(state->growbuf, IObuff, IOSIZE - 1);
+ growbuflen = state->linelen;
+
+--- 754,760 ----
+ return QF_NOMEM;
+ }
+
+! // Copy the read part of the line, excluding null-terminator
+ memcpy(state->growbuf, IObuff, IOSIZE - 1);
+ growbuflen = state->linelen;
+
+***************
+*** 806,816 ****
+
+ while (discard)
+ {
+! /*
+! * The current line is longer than LINE_MAXLEN, continue
+! * reading but discard everything until EOL or EOF is
+! * reached.
+! */
+ if (fgets((char *)IObuff, IOSIZE, state->fd) == NULL
+ || (int)STRLEN(IObuff) < IOSIZE - 1
+ || IObuff[IOSIZE - 1] == '\n')
+--- 784,792 ----
+
+ while (discard)
+ {
+! // The current line is longer than LINE_MAXLEN, continue
+! // reading but discard everything until EOL or EOF is
+! // reached.
+ if (fgets((char *)IObuff, IOSIZE, state->fd) == NULL
+ || (int)STRLEN(IObuff) < IOSIZE - 1
+ || IObuff[IOSIZE - 1] == '\n')
+***************
+*** 824,830 ****
+ state->linebuf = IObuff;
+
+ #ifdef FEAT_MBYTE
+! /* Convert a line if it contains a non-ASCII character. */
+ if (state->vc.vc_type != CONV_NONE && has_non_ascii(state->linebuf))
+ {
+ char_u *line;
+--- 800,806 ----
+ state->linebuf = IObuff;
+
+ #ifdef FEAT_MBYTE
+! // Convert a line if it contains a non-ASCII character.
+ if (state->vc.vc_type != CONV_NONE && has_non_ascii(state->linebuf))
+ {
+ char_u *line;
+***************
+*** 864,887 ****
+ if (state->tv != NULL)
+ {
+ if (state->tv->v_type == VAR_STRING)
+! /* Get the next line from the supplied string */
+ status = qf_get_next_str_line(state);
+ else if (state->tv->v_type == VAR_LIST)
+! /* Get the next line from the supplied list */
+ status = qf_get_next_list_line(state);
+ }
+ else
+! /* Get the next line from the supplied buffer */
+ status = qf_get_next_buf_line(state);
+ }
+ else
+! /* Get the next line from the supplied file */
+ status = qf_get_next_file_line(state);
+
+ if (status != QF_OK)
+ return status;
+
+! /* remove newline/CR from the line */
+ if (state->linelen > 0 && state->linebuf[state->linelen - 1] == '\n')
+ {
+ state->linebuf[state->linelen - 1] = NUL;
+--- 840,863 ----
+ if (state->tv != NULL)
+ {
+ if (state->tv->v_type == VAR_STRING)
+! // Get the next line from the supplied string
+ status = qf_get_next_str_line(state);
+ else if (state->tv->v_type == VAR_LIST)
+! // Get the next line from the supplied list
+ status = qf_get_next_list_line(state);
+ }
+ else
+! // Get the next line from the supplied buffer
+ status = qf_get_next_buf_line(state);
+ }
+ else
+! // Get the next line from the supplied file
+ status = qf_get_next_file_line(state);
+
+ if (status != QF_OK)
+ return status;
+
+! // remove newline/CR from the line
+ if (state->linelen > 0 && state->linebuf[state->linelen - 1] == '\n')
+ {
+ state->linebuf[state->linelen - 1] = NUL;
+***************
+*** 924,939 ****
+ if (rmp->startp[midx] == NULL || rmp->endp[midx] == NULL)
+ return QF_FAIL;
+
+! /* Expand ~/file and $HOME/file to full path. */
+ c = *rmp->endp[midx];
+ *rmp->endp[midx] = NUL;
+ expand_env(rmp->startp[midx], fields->namebuf, CMDBUFFSIZE);
+ *rmp->endp[midx] = c;
+
+! /*
+! * For separate filename patterns (%O, %P and %Q), the specified file
+! * should exist.
+! */
+ if (vim_strchr((char_u *)"OPQ", prefix) != NULL
+ && mch_getperm(fields->namebuf) == -1)
+ return QF_FAIL;
+--- 900,913 ----
+ if (rmp->startp[midx] == NULL || rmp->endp[midx] == NULL)
+ return QF_FAIL;
+
+! // Expand ~/file and $HOME/file to full path.
+ c = *rmp->endp[midx];
+ *rmp->endp[midx] = NUL;
+ expand_env(rmp->startp[midx], fields->namebuf, CMDBUFFSIZE);
+ *rmp->endp[midx] = c;
+
+! // For separate filename patterns (%O, %P and %Q), the specified file
+! // should exist.
+ if (vim_strchr((char_u *)"OPQ", prefix) != NULL
+ && mch_getperm(fields->namebuf) == -1)
+ return QF_FAIL;
+***************
+*** 1004,1010 ****
+
+ if (linelen >= fields->errmsglen)
+ {
+! /* linelen + null terminator */
+ if ((p = vim_realloc(fields->errmsg, linelen + 1)) == NULL)
+ return QF_NOMEM;
+ fields->errmsg = p;
+--- 978,984 ----
+
+ if (linelen >= fields->errmsglen)
+ {
+! // linelen + null terminator
+ if ((p = vim_realloc(fields->errmsg, linelen + 1)) == NULL)
+ return QF_NOMEM;
+ fields->errmsg = p;
+***************
+*** 1029,1035 ****
+ len = (int)(rmp->endp[midx] - rmp->startp[midx]);
+ if (len >= fields->errmsglen)
+ {
+! /* len + null terminator */
+ if ((p = vim_realloc(fields->errmsg, len + 1)) == NULL)
+ return QF_NOMEM;
+ fields->errmsg = p;
+--- 1003,1009 ----
+ len = (int)(rmp->endp[midx] - rmp->startp[midx]);
+ if (len >= fields->errmsglen)
+ {
+! // len + null terminator
+ if ((p = vim_realloc(fields->errmsg, len + 1)) == NULL)
+ return QF_NOMEM;
+ fields->errmsg = p;
+***************
+*** 1181,1207 ****
+ fields->type = idx;
+ else
+ fields->type = 0;
+! /*
+! * Extract error message data from matched line.
+! * We check for an actual submatch, because "\[" and "\]" in
+! * the 'errorformat' may cause the wrong submatch to be used.
+! */
+ for (i = 0; i < FMT_PATTERNS; i++)
+ {
+ status = QF_OK;
+ midx = (int)fmt_ptr->addr[i];
+! if (i == 0 && midx > 0) /* %f */
+ status = qf_parse_fmt_f(regmatch, midx, fields, idx);
+ else if (i == 5)
+ {
+! if (fmt_ptr->flags == '+' && !qf_multiscan) /* %+ */
+ status = qf_parse_fmt_plus(linebuf, linelen, fields);
+! else if (midx > 0) /* %m */
+ status = qf_parse_fmt_m(regmatch, midx, fields);
+ }
+! else if (i == 6 && midx > 0) /* %r */
+ status = qf_parse_fmt_r(regmatch, midx, tail);
+! else if (midx > 0) /* others */
+ status = (qf_parse_fmt[i])(regmatch, midx, fields);
+
+ if (status != QF_OK)
+--- 1155,1180 ----
+ fields->type = idx;
+ else
+ fields->type = 0;
+!
+! // Extract error message data from matched line.
+! // We check for an actual submatch, because "\[" and "\]" in
+! // the 'errorformat' may cause the wrong submatch to be used.
+ for (i = 0; i < FMT_PATTERNS; i++)
+ {
+ status = QF_OK;
+ midx = (int)fmt_ptr->addr[i];
+! if (i == 0 && midx > 0) // %f
+ status = qf_parse_fmt_f(regmatch, midx, fields, idx);
+ else if (i == 5)
+ {
+! if (fmt_ptr->flags == '+' && !qf_multiscan) // %+
+ status = qf_parse_fmt_plus(linebuf, linelen, fields);
+! else if (midx > 0) // %m
+ status = qf_parse_fmt_m(regmatch, midx, fields);
+ }
+! else if (i == 6 && midx > 0) // %r
+ status = qf_parse_fmt_r(regmatch, midx, tail);
+! else if (midx > 0) // others
+ status = (qf_parse_fmt[i])(regmatch, midx, fields);
+
+ if (status != QF_OK)
+***************
+*** 1247,1253 ****
+ fields->type = 0;
+ *tail = NULL;
+
+! /* Always ignore case when looking for a matching error. */
+ regmatch.rm_ic = TRUE;
+ regmatch.regprog = fmt_ptr->prog;
+ r = vim_regexec(&regmatch, linebuf, (colnr_T)0);
+--- 1220,1226 ----
+ fields->type = 0;
+ *tail = NULL;
+
+! // Always ignore case when looking for a matching error.
+ regmatch.rm_ic = TRUE;
+ regmatch.regprog = fmt_ptr->prog;
+ r = vim_regexec(&regmatch, linebuf, (colnr_T)0);
+***************
+*** 1267,1273 ****
+ static int
+ qf_parse_dir_pfx(int idx, qffields_T *fields, qf_list_T *qfl)
+ {
+! if (idx == 'D') /* enter directory */
+ {
+ if (*fields->namebuf == NUL)
+ {
+--- 1240,1246 ----
+ static int
+ qf_parse_dir_pfx(int idx, qffields_T *fields, qf_list_T *qfl)
+ {
+! if (idx == 'D') // enter directory
+ {
+ if (*fields->namebuf == NUL)
+ {
+***************
+*** 1279,1285 ****
+ if (qfl->qf_directory == NULL)
+ return QF_FAIL;
+ }
+! else if (idx == 'X') /* leave directory */
+ qfl->qf_directory = qf_pop_dir(&qfl->qf_dir_stack);
+
+ return QF_OK;
+--- 1252,1258 ----
+ if (qfl->qf_directory == NULL)
+ return QF_FAIL;
+ }
+! else if (idx == 'X') // leave directory
+ qfl->qf_directory = qf_pop_dir(&qfl->qf_dir_stack);
+
+ return QF_OK;
+***************
+*** 1324,1341 ****
+ {
+ char_u *p;
+
+! fields->namebuf[0] = NUL; /* no match found, remove file name */
+! fields->lnum = 0; /* don't jump to this line */
+ fields->valid = FALSE;
+ if (linelen >= fields->errmsglen)
+ {
+! /* linelen + null terminator */
+ if ((p = vim_realloc(fields->errmsg, linelen + 1)) == NULL)
+ return QF_NOMEM;
+ fields->errmsg = p;
+ fields->errmsglen = linelen + 1;
+ }
+! /* copy whole line to error message */
+ vim_strncpy(fields->errmsg, linebuf, linelen);
+
+ return QF_OK;
+--- 1297,1314 ----
+ {
+ char_u *p;
+
+! fields->namebuf[0] = NUL; // no match found, remove file name
+! fields->lnum = 0; // don't jump to this line
+ fields->valid = FALSE;
+ if (linelen >= fields->errmsglen)
+ {
+! // linelen + null terminator
+ if ((p = vim_realloc(fields->errmsg, linelen + 1)) == NULL)
+ return QF_NOMEM;
+ fields->errmsg = p;
+ fields->errmsglen = linelen + 1;
+ }
+! // copy whole line to error message
+ vim_strncpy(fields->errmsg, linebuf, linelen);
+
+ return QF_OK;
+***************
+*** 1376,1382 ****
+ if (qfprev->qf_nr == -1)
+ qfprev->qf_nr = fields->enr;
+ if (vim_isprintc(fields->type) && !qfprev->qf_type)
+! /* only printable chars allowed */
+ qfprev->qf_type = fields->type;
+
+ if (!qfprev->qf_lnum)
+--- 1349,1355 ----
+ if (qfprev->qf_nr == -1)
+ qfprev->qf_nr = fields->enr;
+ if (vim_isprintc(fields->type) && !qfprev->qf_type)
+! // only printable chars allowed
+ qfprev->qf_type = fields->type;
+
+ if (!qfprev->qf_lnum)
+***************
+*** 1419,1438 ****
+ int status;
+
+ restofline:
+! /* If there was no %> item start at the first pattern */
+ if (fmt_start == NULL)
+ fmt_ptr = fmt_first;
+ else
+ {
+! /* Otherwise start from the last used pattern */
+ fmt_ptr = fmt_start;
+ fmt_start = NULL;
+ }
+
+! /*
+! * Try to match each part of 'errorformat' until we find a complete
+! * match or no match.
+! */
+ fields->valid = TRUE;
+ for ( ; fmt_ptr != NULL; fmt_ptr = fmt_ptr->next)
+ {
+--- 1392,1409 ----
+ int status;
+
+ restofline:
+! // If there was no %> item start at the first pattern
+ if (fmt_start == NULL)
+ fmt_ptr = fmt_first;
+ else
+ {
+! // Otherwise start from the last used pattern
+ fmt_ptr = fmt_start;
+ fmt_start = NULL;
+ }
+
+! // Try to match each part of 'errorformat' until we find a complete
+! // match or no match.
+ fields->valid = TRUE;
+ for ( ; fmt_ptr != NULL; fmt_ptr = fmt_ptr->next)
+ {
+***************
+*** 1450,1456 ****
+ {
+ if (fmt_ptr != NULL)
+ {
+! /* 'D' and 'X' directory specifiers */
+ status = qf_parse_dir_pfx(idx, fields, qfl);
+ if (status != QF_OK)
+ return status;
+--- 1421,1427 ----
+ {
+ if (fmt_ptr != NULL)
+ {
+! // 'D' and 'X' directory specifiers
+ status = qf_parse_dir_pfx(idx, fields, qfl);
+ if (status != QF_OK)
+ return status;
+***************
+*** 1465,1495 ****
+ }
+ else if (fmt_ptr != NULL)
+ {
+! /* honor %> item */
+ if (fmt_ptr->conthere)
+ fmt_start = fmt_ptr;
+
+ if (vim_strchr((char_u *)"AEWI", idx) != NULL)
+ {
+! qfl->qf_multiline = TRUE; /* start of a multi-line message */
+! qfl->qf_multiignore = FALSE;/* reset continuation */
+ }
+ else if (vim_strchr((char_u *)"CZ", idx) != NULL)
+! { /* continuation of multi-line msg */
+ status = qf_parse_multiline_pfx(qi, qf_idx, idx, qfl, fields);
+ if (status != QF_OK)
+ return status;
+ }
+ else if (vim_strchr((char_u *)"OPQ", idx) != NULL)
+! { /* global file names */
+ status = qf_parse_file_pfx(idx, fields, qfl, tail);
+ if (status == QF_MULTISCAN)
+ goto restofline;
+ }
+! if (fmt_ptr->flags == '-') /* generally exclude this line */
+ {
+ if (qfl->qf_multiline)
+! /* also exclude continuation lines */
+ qfl->qf_multiignore = TRUE;
+ return QF_IGNORE_LINE;
+ }
+--- 1436,1466 ----
+ }
+ else if (fmt_ptr != NULL)
+ {
+! // honor %> item
+ if (fmt_ptr->conthere)
+ fmt_start = fmt_ptr;
+
+ if (vim_strchr((char_u *)"AEWI", idx) != NULL)
+ {
+! qfl->qf_multiline = TRUE; // start of a multi-line message
+! qfl->qf_multiignore = FALSE;// reset continuation
+ }
+ else if (vim_strchr((char_u *)"CZ", idx) != NULL)
+! { // continuation of multi-line msg
+ status = qf_parse_multiline_pfx(qi, qf_idx, idx, qfl, fields);
+ if (status != QF_OK)
+ return status;
+ }
+ else if (vim_strchr((char_u *)"OPQ", idx) != NULL)
+! { // global file names
+ status = qf_parse_file_pfx(idx, fields, qfl, tail);
+ if (status == QF_MULTISCAN)
+ goto restofline;
+ }
+! if (fmt_ptr->flags == '-') // generally exclude this line
+ {
+ if (qfl->qf_multiline)
+! // also exclude continuation lines
+ qfl->qf_multiignore = TRUE;
+ return QF_IGNORE_LINE;
+ }
+***************
+*** 1624,1632 ****
+ buf_T *buf,
+ typval_T *tv,
+ char_u *errorformat,
+! int newlist, /* TRUE: start a new error list */
+! linenr_T lnumfirst, /* first line number to use */
+! linenr_T lnumlast, /* last line number to use */
+ char_u *qf_title,
+ char_u *enc)
+ {
+--- 1595,1603 ----
+ buf_T *buf,
+ typval_T *tv,
+ char_u *errorformat,
+! int newlist, // TRUE: start a new error list
+! linenr_T lnumfirst, // first line number to use
+! linenr_T lnumlast, // last line number to use
+ char_u *qf_title,
+ char_u *enc)
+ {
+***************
+*** 1638,1647 ****
+ static efm_T *fmt_first = NULL;
+ char_u *efm;
+ static char_u *last_efm = NULL;
+! int retval = -1; /* default: return error flag */
+ int status;
+
+! /* Do not used the cached buffer, it may have been wiped out. */
+ VIM_CLEAR(qf_last_bufname);
+
+ vim_memset(&state, 0, sizeof(state));
+--- 1609,1618 ----
+ static efm_T *fmt_first = NULL;
+ char_u *efm;
+ static char_u *last_efm = NULL;
+! int retval = -1; // default: return error flag
+ int status;
+
+! // Do not used the cached buffer, it may have been wiped out.
+ VIM_CLEAR(qf_last_bufname);
+
+ vim_memset(&state, 0, sizeof(state));
+***************
+*** 1653,1665 ****
+
+ if (newlist || qf_idx == qi->qf_listcount)
+ {
+! /* make place for a new list */
+ qf_new_list(qi, qf_title);
+ qf_idx = qi->qf_curlist;
+ }
+ else
+ {
+! /* Adding to existing list, use last entry. */
+ adding = TRUE;
+ if (!qf_list_empty(qi, qf_idx))
+ old_last = qi->qf_lists[qf_idx].qf_last;
+--- 1624,1636 ----
+
+ if (newlist || qf_idx == qi->qf_listcount)
+ {
+! // make place for a new list
+ qf_new_list(qi, qf_title);
+ qf_idx = qi->qf_curlist;
+ }
+ else
+ {
+! // Adding to existing list, use last entry.
+ adding = TRUE;
+ if (!qf_list_empty(qi, qf_idx))
+ old_last = qi->qf_lists[qf_idx].qf_last;
+***************
+*** 1667,1714 ****
+
+ qfl = &qi->qf_lists[qf_idx];
+
+! /* Use the local value of 'errorformat' if it's set. */
+ if (errorformat == p_efm && tv == NULL && *buf->b_p_efm != NUL)
+ efm = buf->b_p_efm;
+ else
+ efm = errorformat;
+
+! /*
+! * If the errorformat didn't change between calls, then reuse the
+! * previously parsed values.
+! */
+ if (last_efm == NULL || (STRCMP(last_efm, efm) != 0))
+ {
+! /* free the previously parsed data */
+ VIM_CLEAR(last_efm);
+ free_efm_list(&fmt_first);
+
+! /* parse the current 'efm' */
+ fmt_first = parse_efm_option(efm);
+ if (fmt_first != NULL)
+ last_efm = vim_strsave(efm);
+ }
+
+! if (fmt_first == NULL) /* nothing found */
+ goto error2;
+
+! /*
+! * got_int is reset here, because it was probably set when killing the
+! * ":make" command, but we still want to read the errorfile then.
+! */
+ got_int = FALSE;
+
+! /*
+! * Read the lines in the error file one by one.
+! * Try to recognize one of the error formats in each line.
+! */
+ while (!got_int)
+ {
+! /* Get the next line from a file/buffer/list/string */
+ status = qf_get_nextline(&state);
+! if (status == QF_NOMEM) /* memory alloc failure */
+ goto qf_init_end;
+! if (status == QF_END_OF_INPUT) /* end of input */
+ break;
+
+ status = qf_parse_line(qi, qf_idx, state.linebuf, state.linelen,
+--- 1638,1679 ----
+
+ qfl = &qi->qf_lists[qf_idx];
+
+! // Use the local value of 'errorformat' if it's set.
+ if (errorformat == p_efm && tv == NULL && *buf->b_p_efm != NUL)
+ efm = buf->b_p_efm;
+ else
+ efm = errorformat;
+
+! // If the errorformat didn't change between calls, then reuse the
+! // previously parsed values.
+ if (last_efm == NULL || (STRCMP(last_efm, efm) != 0))
+ {
+! // free the previously parsed data
+ VIM_CLEAR(last_efm);
+ free_efm_list(&fmt_first);
+
+! // parse the current 'efm'
+ fmt_first = parse_efm_option(efm);
+ if (fmt_first != NULL)
+ last_efm = vim_strsave(efm);
+ }
+
+! if (fmt_first == NULL) // nothing found
+ goto error2;
+
+! // got_int is reset here, because it was probably set when killing the
+! // ":make" command, but we still want to read the errorfile then.
+ got_int = FALSE;
+
+! // Read the lines in the error file one by one.
+! // Try to recognize one of the error formats in each line.
+ while (!got_int)
+ {
+! // Get the next line from a file/buffer/list/string
+ status = qf_get_nextline(&state);
+! if (status == QF_NOMEM) // memory alloc failure
+ goto qf_init_end;
+! if (status == QF_END_OF_INPUT) // end of input
+ break;
+
+ status = qf_parse_line(qi, qf_idx, state.linebuf, state.linelen,
+***************
+*** 1744,1750 ****
+ {
+ if (qfl->qf_index == 0)
+ {
+! /* no valid entry found */
+ qfl->qf_ptr = qfl->qf_start;
+ qfl->qf_index = 1;
+ qfl->qf_nonevalid = TRUE;
+--- 1709,1715 ----
+ {
+ if (qfl->qf_index == 0)
+ {
+! // no valid entry found
+ qfl->qf_ptr = qfl->qf_start;
+ qfl->qf_index = 1;
+ qfl->qf_nonevalid = TRUE;
+***************
+*** 1755,1761 ****
+ if (qfl->qf_ptr == NULL)
+ qfl->qf_ptr = qfl->qf_start;
+ }
+! /* return number of matches */
+ retval = qfl->qf_count;
+ goto qf_init_end;
+ }
+--- 1720,1726 ----
+ if (qfl->qf_ptr == NULL)
+ qfl->qf_ptr = qfl->qf_start;
+ }
+! // return number of matches
+ retval = qfl->qf_count;
+ goto qf_init_end;
+ }
+***************
+*** 1763,1769 ****
+ error2:
+ if (!adding)
+ {
+! /* Error when creating a new list. Free the new list */
+ qf_free(&qi->qf_lists[qi->qf_curlist]);
+ qi->qf_listcount--;
+ if (qi->qf_curlist > 0)
+--- 1728,1734 ----
+ error2:
+ if (!adding)
+ {
+! // Error when creating a new list. Free the new list
+ qf_free(&qi->qf_lists[qi->qf_curlist]);
+ qi->qf_listcount--;
+ if (qi->qf_curlist > 0)
+***************
+*** 1787,1793 ****
+ qf_init(win_T *wp,
+ char_u *efile,
+ char_u *errorformat,
+! int newlist, /* TRUE: start a new error list */
+ char_u *qf_title,
+ char_u *enc)
+ {
+--- 1752,1758 ----
+ qf_init(win_T *wp,
+ char_u *efile,
+ char_u *errorformat,
+! int newlist, // TRUE: start a new error list
+ char_u *qf_title,
+ char_u *enc)
+ {
+***************
+*** 1848,1865 ****
+ {
+ int i;
+
+! /*
+! * If the current entry is not the last entry, delete entries beyond
+! * the current entry. This makes it possible to browse in a tree-like
+! * way with ":grep'.
+! */
+ while (qi->qf_listcount > qi->qf_curlist + 1)
+ qf_free(&qi->qf_lists[--qi->qf_listcount]);
+
+! /*
+! * When the stack is full, remove to oldest entry
+! * Otherwise, add a new entry.
+! */
+ if (qi->qf_listcount == LISTCOUNT)
+ {
+ qf_free(&qi->qf_lists[0]);
+--- 1813,1826 ----
+ {
+ int i;
+
+! // If the current entry is not the last entry, delete entries beyond
+! // the current entry. This makes it possible to browse in a tree-like
+! // way with ":grep'.
+ while (qi->qf_listcount > qi->qf_curlist + 1)
+ qf_free(&qi->qf_lists[--qi->qf_listcount]);
+
+! // When the stack is full, remove to oldest entry
+! // Otherwise, add a new entry.
+ if (qi->qf_listcount == LISTCOUNT)
+ {
+ qf_free(&qi->qf_lists[0]);
+***************
+*** 1886,1897 ****
+ qi = *pqi;
+ if (qi == NULL)
+ return;
+! *pqi = NULL; /* Remove reference to this list */
+
+ qi->qf_refcount--;
+ if (qi->qf_refcount < 1)
+ {
+! /* No references to this location list */
+ for (i = 0; i < qi->qf_listcount; ++i)
+ qf_free(&qi->qf_lists[i]);
+ vim_free(qi);
+--- 1847,1858 ----
+ qi = *pqi;
+ if (qi == NULL)
+ return;
+! *pqi = NULL; // Remove reference to this list
+
+ qi->qf_refcount--;
+ if (qi->qf_refcount < 1)
+ {
+! // No references to this location list
+ for (i = 0; i < qi->qf_listcount; ++i)
+ qf_free(&qi->qf_lists[i]);
+ vim_free(qi);
+***************
+*** 1909,1920 ****
+
+ if (wp != NULL)
+ {
+! /* location list */
+ ll_free_all(&wp->w_llist);
+ ll_free_all(&wp->w_llist_ref);
+ }
+ else
+! /* quickfix list */
+ for (i = 0; i < qi->qf_listcount; ++i)
+ qf_free(&qi->qf_lists[i]);
+ }
+--- 1870,1881 ----
+
+ if (wp != NULL)
+ {
+! // location list
+ ll_free_all(&wp->w_llist);
+ ll_free_all(&wp->w_llist_ref);
+ }
+ else
+! // quickfix list
+ for (i = 0; i < qi->qf_listcount; ++i)
+ qf_free(&qi->qf_lists[i]);
+ }
+***************
+*** 1925,1948 ****
+ */
+ static int
+ qf_add_entry(
+! qf_info_T *qi, /* quickfix list */
+! int qf_idx, /* list index */
+! char_u *dir, /* optional directory name */
+! char_u *fname, /* file name or NULL */
+! char_u *module, /* module name or NULL */
+! int bufnum, /* buffer number or zero */
+! char_u *mesg, /* message */
+! long lnum, /* line number */
+! int col, /* column */
+! int vis_col, /* using visual column */
+! char_u *pattern, /* search pattern */
+! int nr, /* error number */
+! int type, /* type character */
+! int valid) /* valid entry */
+ {
+ qf_list_T *qfl = &qi->qf_lists[qf_idx];
+ qfline_T *qfp;
+! qfline_T **lastp; /* pointer to qf_last or NULL */
+
+ if ((qfp = (qfline_T *)alloc((unsigned)sizeof(qfline_T))) == NULL)
+ return FAIL;
+--- 1886,1909 ----
+ */
+ static int
+ qf_add_entry(
+! qf_info_T *qi, // quickfix list
+! int qf_idx, // list index
+! char_u *dir, // optional directory name
+! char_u *fname, // file name or NULL
+! char_u *module, // module name or NULL
+! int bufnum, // buffer number or zero
+! char_u *mesg, // message
+! long lnum, // line number
+! int col, // column
+! int vis_col, // using visual column
+! char_u *pattern, // search pattern
+! int nr, // error number
+! int type, // type character
+! int valid) // valid entry
+ {
+ qf_list_T *qfl = &qi->qf_lists[qf_idx];
+ qfline_T *qfp;
+! qfline_T **lastp; // pointer to qf_last or NULL
+
+ if ((qfp = (qfline_T *)alloc((unsigned)sizeof(qfline_T))) == NULL)
+ return FAIL;
+***************
+*** 1983,1995 ****
+ return FAIL;
+ }
+ qfp->qf_nr = nr;
+! if (type != 1 && !vim_isprintc(type)) /* only printable chars allowed */
+ type = 0;
+ qfp->qf_type = type;
+ qfp->qf_valid = valid;
+
+ lastp = &qfl->qf_last;
+! if (qf_list_empty(qi, qf_idx)) /* first element in the list */
+ {
+ qfl->qf_start = qfp;
+ qfl->qf_ptr = qfp;
+--- 1944,1956 ----
+ return FAIL;
+ }
+ qfp->qf_nr = nr;
+! if (type != 1 && !vim_isprintc(type)) // only printable chars allowed
+ type = 0;
+ qfp->qf_type = type;
+ qfp->qf_valid = valid;
+
+ lastp = &qfl->qf_last;
+! if (qf_list_empty(qi, qf_idx)) // first element in the list
+ {
+ qfl->qf_start = qfp;
+ qfl->qf_ptr = qfp;
+***************
+*** 2005,2012 ****
+ qfp->qf_cleared = FALSE;
+ *lastp = qfp;
+ ++qfl->qf_count;
+! if (qfl->qf_index == 0 && qfp->qf_valid)
+! /* first valid entry */
+ {
+ qfl->qf_index = qfl->qf_count;
+ qfl->qf_ptr = qfp;
+--- 1966,1972 ----
+ qfp->qf_cleared = FALSE;
+ *lastp = qfp;
+ ++qfl->qf_count;
+! if (qfl->qf_index == 0 && qfp->qf_valid) // first valid entry
+ {
+ qfl->qf_index = qfl->qf_count;
+ qfl->qf_ptr = qfp;
+***************
+*** 2037,2053 ****
+ ll_get_or_alloc_list(win_T *wp)
+ {
+ if (IS_LL_WINDOW(wp))
+! /* For a location list window, use the referenced location list */
+ return wp->w_llist_ref;
+
+! /*
+! * For a non-location list window, w_llist_ref should not point to a
+! * location list.
+! */
+ ll_free_all(&wp->w_llist_ref);
+
+ if (wp->w_llist == NULL)
+! wp->w_llist = ll_new_list(); /* new location list */
+ return wp->w_llist;
+ }
+
+--- 1997,2011 ----
+ ll_get_or_alloc_list(win_T *wp)
+ {
+ if (IS_LL_WINDOW(wp))
+! // For a location list window, use the referenced location list
+ return wp->w_llist_ref;
+
+! // For a non-location list window, w_llist_ref should not point to a
+! // location list.
+ ll_free_all(&wp->w_llist_ref);
+
+ if (wp->w_llist == NULL)
+! wp->w_llist = ll_new_list(); // new location list
+ return wp->w_llist;
+ }
+
+***************
+*** 2195,2201 ****
+ buf_T *buf;
+ char_u *bufname;
+
+! if (fname == NULL || *fname == NUL) /* no file name */
+ return 0;
+
+ #ifdef VMS
+--- 2153,2159 ----
+ buf_T *buf;
+ char_u *bufname;
+
+! if (fname == NULL || *fname == NUL) // no file name
+ return 0;
+
+ #ifdef VMS
+***************
+*** 2209,2220 ****
+ if (directory != NULL && !vim_isAbsName(fname)
+ && (ptr = concat_fnames(directory, fname, TRUE)) != NULL)
+ {
+! /*
+! * Here we check if the file really exists.
+! * This should normally be true, but if make works without
+! * "leaving directory"-messages we might have missed a
+! * directory change.
+! */
+ if (mch_getperm(ptr) < 0)
+ {
+ vim_free(ptr);
+--- 2167,2176 ----
+ if (directory != NULL && !vim_isAbsName(fname)
+ && (ptr = concat_fnames(directory, fname, TRUE)) != NULL)
+ {
+! // Here we check if the file really exists.
+! // This should normally be true, but if make works without
+! // "leaving directory"-messages we might have missed a
+! // directory change.
+ if (mch_getperm(ptr) < 0)
+ {
+ vim_free(ptr);
+***************
+*** 2224,2230 ****
+ else
+ ptr = vim_strsave(fname);
+ }
+! /* Use concatenated directory name and file name */
+ bufname = ptr;
+ }
+ else
+--- 2180,2186 ----
+ else
+ ptr = vim_strsave(fname);
+ }
+! // Use concatenated directory name and file name
+ bufname = ptr;
+ }
+ else
+***************
+*** 2264,2270 ****
+ struct dir_stack_T *ds_new;
+ struct dir_stack_T *ds_ptr;
+
+! /* allocate new stack element and hook it in */
+ ds_new = (struct dir_stack_T *)alloc((unsigned)sizeof(struct dir_stack_T));
+ if (ds_new == NULL)
+ return NULL;
+--- 2220,2226 ----
+ struct dir_stack_T *ds_new;
+ struct dir_stack_T *ds_ptr;
+
+! // allocate new stack element and hook it in
+ ds_new = (struct dir_stack_T *)alloc((unsigned)sizeof(struct dir_stack_T));
+ if (ds_new == NULL)
+ return NULL;
+***************
+*** 2272,2288 ****
+ ds_new->next = *stackptr;
+ *stackptr = ds_new;
+
+! /* store directory on the stack */
+ if (vim_isAbsName(dirbuf)
+ || (*stackptr)->next == NULL
+ || (*stackptr && is_file_stack))
+ (*stackptr)->dirname = vim_strsave(dirbuf);
+ else
+ {
+! /* Okay we don't have an absolute path.
+! * dirbuf must be a subdir of one of the directories on the stack.
+! * Let's search...
+! */
+ ds_new = (*stackptr)->next;
+ (*stackptr)->dirname = NULL;
+ while (ds_new)
+--- 2228,2243 ----
+ ds_new->next = *stackptr;
+ *stackptr = ds_new;
+
+! // store directory on the stack
+ if (vim_isAbsName(dirbuf)
+ || (*stackptr)->next == NULL
+ || (*stackptr && is_file_stack))
+ (*stackptr)->dirname = vim_strsave(dirbuf);
+ else
+ {
+! // Okay we don't have an absolute path.
+! // dirbuf must be a subdir of one of the directories on the stack.
+! // Let's search...
+ ds_new = (*stackptr)->next;
+ (*stackptr)->dirname = NULL;
+ while (ds_new)
+***************
+*** 2296,2302 ****
+ ds_new = ds_new->next;
+ }
+
+! /* clean up all dirs we already left */
+ while ((*stackptr)->next != ds_new)
+ {
+ ds_ptr = (*stackptr)->next;
+--- 2251,2257 ----
+ ds_new = ds_new->next;
+ }
+
+! // clean up all dirs we already left
+ while ((*stackptr)->next != ds_new)
+ {
+ ds_ptr = (*stackptr)->next;
+***************
+*** 2305,2311 ****
+ vim_free(ds_ptr);
+ }
+
+! /* Nothing found -> it must be on top level */
+ if (ds_new == NULL)
+ {
+ vim_free((*stackptr)->dirname);
+--- 2260,2266 ----
+ vim_free(ds_ptr);
+ }
+
+! // Nothing found -> it must be on top level
+ if (ds_new == NULL)
+ {
+ vim_free((*stackptr)->dirname);
+***************
+*** 2333,2342 ****
+ {
+ struct dir_stack_T *ds_ptr;
+
+! /* TODO: Should we check if dirbuf is the directory on top of the stack?
+! * What to do if it isn't? */
+
+! /* pop top element and free it */
+ if (*stackptr != NULL)
+ {
+ ds_ptr = *stackptr;
+--- 2288,2297 ----
+ {
+ struct dir_stack_T *ds_ptr;
+
+! // TODO: Should we check if dirbuf is the directory on top of the stack?
+! // What to do if it isn't?
+
+! // pop top element and free it
+ if (*stackptr != NULL)
+ {
+ ds_ptr = *stackptr;
+***************
+*** 2345,2351 ****
+ vim_free(ds_ptr);
+ }
+
+! /* return NEW top element as current dir or NULL if stack is empty*/
+ return *stackptr ? (*stackptr)->dirname : NULL;
+ }
+
+--- 2300,2306 ----
+ vim_free(ds_ptr);
+ }
+
+! // return NEW top element as current dir or NULL if stack is empty
+ return *stackptr ? (*stackptr)->dirname : NULL;
+ }
+
+***************
+*** 2392,2398 ****
+ struct dir_stack_T *ds_tmp;
+ char_u *fullname;
+
+! /* no dirs on the stack - there's nothing we can do */
+ if (qfl->qf_dir_stack == NULL)
+ return NULL;
+
+--- 2347,2353 ----
+ struct dir_stack_T *ds_tmp;
+ char_u *fullname;
+
+! // no dirs on the stack - there's nothing we can do
+ if (qfl->qf_dir_stack == NULL)
+ return NULL;
+
+***************
+*** 2403,2411 ****
+ vim_free(fullname);
+ fullname = concat_fnames(ds_ptr->dirname, filename, TRUE);
+
+! /* If concat_fnames failed, just go on. The worst thing that can happen
+! * is that we delete the entire stack.
+! */
+ if ((fullname != NULL) && (mch_getperm(fullname) >= 0))
+ break;
+
+--- 2358,2365 ----
+ vim_free(fullname);
+ fullname = concat_fnames(ds_ptr->dirname, filename, TRUE);
+
+! // If concat_fnames failed, just go on. The worst thing that can happen
+! // is that we delete the entire stack.
+ if ((fullname != NULL) && (mch_getperm(fullname) >= 0))
+ break;
+
+***************
+*** 2414,2420 ****
+
+ vim_free(fullname);
+
+! /* clean up all dirs we already left */
+ while (qfl->qf_dir_stack->next != ds_ptr)
+ {
+ ds_tmp = qfl->qf_dir_stack->next;
+--- 2368,2374 ----
+
+ vim_free(fullname);
+
+! // clean up all dirs we already left
+ while (qfl->qf_dir_stack->next != ds_ptr)
+ {
+ ds_tmp = qfl->qf_dir_stack->next;
+***************
+*** 2437,2443 ****
+
+ if (wp != NULL)
+ {
+! qi = GET_LOC_LIST(wp); /* Location list */
+ if (qi == NULL)
+ return FALSE;
+ }
+--- 2391,2397 ----
+
+ if (wp != NULL)
+ {
+! qi = GET_LOC_LIST(wp); // Location list
+ if (qi == NULL)
+ return FALSE;
+ }
+***************
+*** 2461,2473 ****
+ qfline_T *qfp;
+ int i;
+
+! /* 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 == NULL || qfp == qf_ptr)
+ break;
+
+! if (i == qfl->qf_count) /* Entry is not found */
+ return FALSE;
+
+ return TRUE;
+--- 2415,2427 ----
+ qfline_T *qfp;
+ int i;
+
+! // 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 == NULL || qfp == qf_ptr)
+ break;
+
+! if (i == qfl->qf_count) // Entry is not found
+ return FALSE;
+
+ return TRUE;
+***************
+*** 2667,2682 ****
+ win_enter(wp, TRUE);
+ else
+ {
+! /*
+! * Split off help window; put it at far top if no position
+! * specified, the current window is vertically split and narrow.
+! */
+ flags = WSP_HELP;
+ if (cmdmod.split == 0 && curwin->w_width != Columns
+ && curwin->w_width < 80)
+ flags |= WSP_TOP;
+ if (IS_LL_STACK(qi))
+! flags |= WSP_NEWLOC; /* don't copy the location list */
+
+ if (win_split(0, flags) == FAIL)
+ return FAIL;
+--- 2621,2634 ----
+ win_enter(wp, TRUE);
+ else
+ {
+! // Split off help window; put it at far top if no position
+! // specified, the current window is vertically split and narrow.
+ flags = WSP_HELP;
+ if (cmdmod.split == 0 && curwin->w_width != Columns
+ && curwin->w_width < 80)
+ flags |= WSP_TOP;
+ if (IS_LL_STACK(qi))
+! flags |= WSP_NEWLOC; // don't copy the location list
+
+ if (win_split(0, flags) == FAIL)
+ return FAIL;
+***************
+*** 2688,2701 ****
+
+ if (IS_LL_STACK(qi)) // not a quickfix list
+ {
+! /* The new window should use the supplied location list */
+ curwin->w_llist = qi;
+ qi->qf_refcount++;
+ }
+ }
+
+ if (!p_im)
+! restart_edit = 0; /* don't want insert mode in help file */
+
+ return OK;
+ }
+--- 2640,2653 ----
+
+ if (IS_LL_STACK(qi)) // not a quickfix list
+ {
+! // The new window should use the supplied location list
+ curwin->w_llist = qi;
+ qi->qf_refcount++;
+ }
+ }
+
+ if (!p_im)
+! restart_edit = 0; // don't want insert mode in help file
+
+ return OK;
+ }
+***************
+*** 2764,2777 ****
+ if (ll_ref != NULL)
+ flags |= WSP_NEWLOC;
+ if (win_split(0, flags) == FAIL)
+! return FAIL; /* not enough room for window */
+! p_swb = empty_option; /* don't split again */
+ swb_flags = 0;
+ RESET_BINDING(curwin);
+ if (ll_ref != NULL)
+ {
+! /* The new window should use the location list from the
+! * location list window */
+ curwin->w_llist = ll_ref;
+ ll_ref->qf_refcount++;
+ }
+--- 2716,2729 ----
+ if (ll_ref != NULL)
+ flags |= WSP_NEWLOC;
+ if (win_split(0, flags) == FAIL)
+! return FAIL; // not enough room for window
+! p_swb = empty_option; // don't split again
+ swb_flags = 0;
+ RESET_BINDING(curwin);
+ if (ll_ref != NULL)
+ {
+! // The new window should use the location list from the
+! // location list window
+ curwin->w_llist = ll_ref;
+ ll_ref->qf_refcount++;
+ }
+***************
+*** 2791,2819 ****
+
+ if (win == NULL)
+ {
+! /* Find the window showing the selected file */
+ FOR_ALL_WINDOWS(win)
+ if (win->w_buffer->b_fnum == qf_fnum)
+ break;
+ if (win == NULL)
+ {
+! /* Find a previous usable window */
+ win = curwin;
+ do
+ {
+ if (bt_normal(win->w_buffer))
+ break;
+ if (win->w_prev == NULL)
+! win = lastwin; /* wrap around the top */
+ else
+! win = win->w_prev; /* go to previous window */
+ } while (win != curwin);
+ }
+ }
+ win_goto(win);
+
+! /* If the location list for the window is not set, then set it
+! * to the location list from the location window */
+ if (win->w_llist == NULL)
+ {
+ win->w_llist = ll_ref;
+--- 2743,2771 ----
+
+ if (win == NULL)
+ {
+! // Find the window showing the selected file
+ FOR_ALL_WINDOWS(win)
+ if (win->w_buffer->b_fnum == qf_fnum)
+ break;
+ if (win == NULL)
+ {
+! // Find a previous usable window
+ win = curwin;
+ do
+ {
+ if (bt_normal(win->w_buffer))
+ break;
+ if (win->w_prev == NULL)
+! win = lastwin; // wrap around the top
+ else
+! win = win->w_prev; // go to previous window
+ } while (win != curwin);
+ }
+ }
+ win_goto(win);
+
+! // If the location list for the window is not set, then set it
+! // to the location list from the location window
+ if (win->w_llist == NULL)
+ {
+ win->w_llist = ll_ref;
+***************
+*** 2841,2854 ****
+ if (win->w_buffer->b_fnum == qf_fnum)
+ break;
+ if (win->w_prev == NULL)
+! win = lastwin; /* wrap around the top */
+ else
+! win = win->w_prev; /* go to previous window */
+
+ if (IS_QF_WINDOW(win))
+ {
+! /* Didn't find it, go to the window before the quickfix
+! * window. */
+ if (altwin != NULL)
+ win = altwin;
+ else if (curwin->w_prev != NULL)
+--- 2793,2806 ----
+ if (win->w_buffer->b_fnum == qf_fnum)
+ break;
+ if (win->w_prev == NULL)
+! win = lastwin; // wrap around the top
+ else
+! win = win->w_prev; // go to previous window
+
+ if (IS_QF_WINDOW(win))
+ {
+! // Didn't find it, go to the window before the quickfix
+! // window.
+ if (altwin != NULL)
+ win = altwin;
+ else if (curwin->w_prev != NULL)
+***************
+*** 2858,2864 ****
+ break;
+ }
+
+! /* Remember a usable window. */
+ if (altwin == NULL && !win->w_p_pvw && bt_normal(win->w_buffer))
+ altwin = win;
+ }
+--- 2810,2816 ----
+ break;
+ }
+
+! // Remember a usable window.
+ if (altwin == NULL && !win->w_p_pvw && bt_normal(win->w_buffer))
+ altwin = win;
+ }
+***************
+*** 2885,2891 ****
+ ll_ref = curwin->w_llist_ref;
+ if (ll_ref != NULL)
+ {
+! /* Find a non-quickfix window with this location list */
+ usable_win_ptr = qf_find_win_with_loclist(ll_ref);
+ if (usable_win_ptr != NULL)
+ usable_win = 1;
+--- 2837,2843 ----
+ ll_ref = curwin->w_llist_ref;
+ if (ll_ref != NULL)
+ {
+! // Find a non-quickfix window with this location list
+ usable_win_ptr = qf_find_win_with_loclist(ll_ref);
+ if (usable_win_ptr != NULL)
+ usable_win = 1;
+***************
+*** 2893,2926 ****
+
+ if (!usable_win)
+ {
+! /* Locate a window showing a normal buffer */
+ win = qf_find_win_with_normal_buf();
+ if (win != NULL)
+ usable_win = 1;
+ }
+
+! /*
+! * If no usable window is found and 'switchbuf' contains "usetab"
+! * then search in other tabs.
+! */
+ if (!usable_win && (swb_flags & SWB_USETAB))
+ usable_win = qf_goto_tabwin_with_file(qf_fnum);
+
+! /*
+! * If there is only one window and it is the quickfix window, create a
+! * new one above the quickfix window.
+! */
+ if ((ONE_WINDOW && bt_quickfix(curbuf)) || !usable_win)
+ {
+ if (qf_open_new_file_win(ll_ref) != OK)
+ return FAIL;
+! *opened_window = TRUE; /* close it when fail */
+ }
+ else
+ {
+! if (curwin->w_llist_ref != NULL) /* In a location window */
+ qf_goto_win_with_ll_file(usable_win_ptr, qf_fnum, ll_ref);
+! else /* In a quickfix window */
+ qf_goto_win_with_qfl_file(qf_fnum);
+ }
+
+--- 2845,2874 ----
+
+ if (!usable_win)
+ {
+! // Locate a window showing a normal buffer
+ win = qf_find_win_with_normal_buf();
+ if (win != NULL)
+ usable_win = 1;
+ }
+
+! // If no usable window is found and 'switchbuf' contains "usetab"
+! // then search in other tabs.
+ if (!usable_win && (swb_flags & SWB_USETAB))
+ usable_win = qf_goto_tabwin_with_file(qf_fnum);
+
+! // If there is only one window and it is the quickfix window, create a
+! // new one above the quickfix window.
+ if ((ONE_WINDOW && bt_quickfix(curbuf)) || !usable_win)
+ {
+ if (qf_open_new_file_win(ll_ref) != OK)
+ return FAIL;
+! *opened_window = TRUE; // close it when fail
+ }
+ else
+ {
+! if (curwin->w_llist_ref != NULL) // In a location window
+ qf_goto_win_with_ll_file(usable_win_ptr, qf_fnum, ll_ref);
+! else // In a quickfix window
+ qf_goto_win_with_qfl_file(qf_fnum);
+ }
+
+***************
+*** 2946,2953 ****
+
+ if (qf_ptr->qf_type == 1)
+ {
+! /* Open help file (do_ecmd() will set b_help flag, readfile() will
+! * set b_p_ro flag). */
+ if (!can_abandon(curbuf, forceit))
+ {
+ no_write_message();
+--- 2894,2901 ----
+
+ if (qf_ptr->qf_type == 1)
+ {
+! // Open help file (do_ecmd() will set b_help flag, readfile() will
+! // set b_p_ro flag).
+ if (!can_abandon(curbuf, forceit))
+ {
+ no_write_message();
+***************
+*** 2968,2977 ****
+
+ if (IS_LL_STACK(qi))
+ {
+! /*
+! * Location list. Check whether the associated window is still
+! * present and the list is still valid.
+! */
+ if (!win_valid_any_tab(oldwin))
+ {
+ EMSG(_("E924: Current window was closed"));
+--- 2916,2923 ----
+
+ if (IS_LL_STACK(qi))
+ {
+! // Location list. Check whether the associated window is still
+! // present and the list is still valid.
+ if (!win_valid_any_tab(oldwin))
+ {
+ EMSG(_("E924: Current window was closed"));
+***************
+*** 3016,3024 ****
+
+ if (qf_pattern == NULL)
+ {
+! /*
+! * Go to line with error, unless qf_lnum is 0.
+! */
+ i = qf_lnum;
+ if (i > 0)
+ {
+--- 2962,2968 ----
+
+ if (qf_pattern == NULL)
+ {
+! // Go to line with error, unless qf_lnum is 0.
+ i = qf_lnum;
+ if (i > 0)
+ {
+***************
+*** 3034,3045 ****
+ #endif
+ if (qf_viscol == TRUE)
+ {
+! /*
+! * Check each character from the beginning of the error
+! * line up to the error column. For each tab character
+! * found, reduce the error column value by the length of
+! * a tab character.
+! */
+ line = ml_get_curline();
+ screen_col = 0;
+ for (char_col = 0; char_col < curwin->w_cursor.col; ++char_col)
+--- 2978,2987 ----
+ #endif
+ if (qf_viscol == TRUE)
+ {
+! // Check each character from the beginning of the error
+! // line up to the error column. For each tab character
+! // found, reduce the error column value by the length of
+! // a tab character.
+ line = ml_get_curline();
+ screen_col = 0;
+ for (char_col = 0; char_col < curwin->w_cursor.col; ++char_col)
+***************
+*** 3065,3071 ****
+ {
+ pos_T save_cursor;
+
+! /* Move the cursor to the first line in the buffer */
+ save_cursor = curwin->w_cursor;
+ curwin->w_cursor.lnum = 0;
+ if (!do_search(NULL, '/', qf_pattern, (long)1,
+--- 3007,3013 ----
+ {
+ pos_T save_cursor;
+
+! // Move the cursor to the first line in the buffer
+ save_cursor = curwin->w_cursor;
+ curwin->w_cursor.lnum = 0;
+ if (!do_search(NULL, '/', qf_pattern, (long)1,
+***************
+*** 3088,3108 ****
+ linenr_T i;
+ int len;
+
+! /* Update the screen before showing the message, unless the screen
+! * scrolled up. */
+ if (!msg_scrolled)
+ update_topline_redraw();
+ sprintf((char *)IObuff, _("(%d of %d)%s%s: "), qf_index,
+ qi->qf_lists[qi->qf_curlist].qf_count,
+ qf_ptr->qf_cleared ? _(" (line deleted)") : "",
+ (char *)qf_types(qf_ptr->qf_type, qf_ptr->qf_nr));
+! /* Add the message, skipping leading whitespace and newlines. */
+ len = (int)STRLEN(IObuff);
+ qf_fmt_text(skipwhite(qf_ptr->qf_text), IObuff + len, IOSIZE - len);
+
+! /* Output the message. Overwrite to avoid scrolling when the 'O'
+! * flag is present in 'shortmess'; But when not jumping, print the
+! * whole message. */
+ i = msg_scroll;
+ if (curbuf == old_curbuf && curwin->w_cursor.lnum == old_lnum)
+ msg_scroll = TRUE;
+--- 3030,3050 ----
+ linenr_T i;
+ int len;
+
+! // Update the screen before showing the message, unless the screen
+! // scrolled up.
+ if (!msg_scrolled)
+ update_topline_redraw();
+ sprintf((char *)IObuff, _("(%d of %d)%s%s: "), qf_index,
+ qi->qf_lists[qi->qf_curlist].qf_count,
+ qf_ptr->qf_cleared ? _(" (line deleted)") : "",
+ (char *)qf_types(qf_ptr->qf_type, qf_ptr->qf_nr));
+! // Add the message, skipping leading whitespace and newlines.
+ len = (int)STRLEN(IObuff);
+ qf_fmt_text(skipwhite(qf_ptr->qf_text), IObuff + len, IOSIZE - len);
+
+! // Output the message. Overwrite to avoid scrolling when the 'O'
+! // flag is present in 'shortmess'; But when not jumping, print the
+! // whole message.
+ i = msg_scroll;
+ if (curbuf == old_curbuf && curwin->w_cursor.lnum == old_lnum)
+ msg_scroll = TRUE;
+***************
+*** 3304,3312 ****
+ }
+ }
+
+! /*
+! * Highlight attributes used for displaying entries from the quickfix list.
+! */
+ static int qfFileAttr;
+ static int qfSepAttr;
+ static int qfLineAttr;
+--- 3246,3252 ----
+ }
+ }
+
+! // Highlight attributes used for displaying entries from the quickfix list.
+ static int qfFileAttr;
+ static int qfSepAttr;
+ static int qfLineAttr;
+***************
+*** 3333,3339 ****
+ && (buf = buflist_findnr(qfp->qf_fnum)) != NULL)
+ {
+ fname = buf->b_fname;
+! if (qfp->qf_type == 1) /* :helpgrep */
+ fname = gettail(fname);
+ }
+ if (fname == NULL)
+--- 3273,3279 ----
+ && (buf = buflist_findnr(qfp->qf_fnum)) != NULL)
+ {
+ fname = buf->b_fname;
+! if (qfp->qf_type == 1) // :helpgrep
+ fname = gettail(fname);
+ }
+ if (fname == NULL)
+***************
+*** 3382,3395 ****
+ }
+ msg_puts((char_u *)" ");
+
+! /* Remove newlines and leading whitespace from the text. For an
+! * unrecognized line keep the indent, the compiler may mark a word
+! * with ^^^^. */
+ qf_fmt_text((fname != NULL || qfp->qf_lnum != 0)
+ ? skipwhite(qfp->qf_text) : qfp->qf_text,
+ IObuff, IOSIZE);
+ msg_prt_line(IObuff, FALSE);
+! out_flush(); /* show one line at a time */
+ }
+
+ /*
+--- 3322,3335 ----
+ }
+ msg_puts((char_u *)" ");
+
+! // Remove newlines and leading whitespace from the text. For an
+! // unrecognized line keep the indent, the compiler may mark a word
+! // with ^^^^.
+ qf_fmt_text((fname != NULL || qfp->qf_lnum != 0)
+ ? skipwhite(qfp->qf_text) : qfp->qf_text,
+ IObuff, IOSIZE);
+ msg_prt_line(IObuff, FALSE);
+! out_flush(); // show one line at a time
+ }
+
+ /*
+***************
+*** 3406,3413 ****
+ int idx2 = -1;
+ char_u *arg = eap->arg;
+ int plus = FALSE;
+! int all = eap->forceit; /* if not :cl!, only show
+! recognised errors */
+ qf_info_T *qi = &ql_info;
+
+ if (is_loclist_cmd(eap->cmdidx))
+--- 3346,3353 ----
+ int idx2 = -1;
+ char_u *arg = eap->arg;
+ int plus = FALSE;
+! int all = eap->forceit; // if not :cl!, only show
+! // recognised errors
+ qf_info_T *qi = &ql_info;
+
+ if (is_loclist_cmd(eap->cmdidx))
+***************
+*** 3451,3463 ****
+ idx2 = (-idx2 > i) ? 0 : idx2 + i + 1;
+ }
+
+! /* Shorten all the file names, so that it is easy to read */
+ shorten_fnames(FALSE);
+
+! /*
+! * Get the attributes for the different quickfix highlight items. Note
+! * that this depends on syntax items defined in the qf.vim syntax file
+! */
+ qfFileAttr = syn_name2attr((char_u *)"qfFileName");
+ if (qfFileAttr == 0)
+ qfFileAttr = HL_ATTR(HLF_D);
+--- 3391,3401 ----
+ idx2 = (-idx2 > i) ? 0 : idx2 + i + 1;
+ }
+
+! // Shorten all the file names, so that it is easy to read
+ shorten_fnames(FALSE);
+
+! // Get the attributes for the different quickfix highlight items. Note
+! // that this depends on syntax items defined in the qf.vim syntax file
+ qfFileAttr = syn_name2attr((char_u *)"qfFileName");
+ if (qfFileAttr == 0)
+ qfFileAttr = HL_ATTR(HLF_D);
+***************
+*** 3638,3646 ****
+ stop = (qfp == qfpnext);
+ vim_free(qfp);
+ if (stop)
+! /* Somehow qf_count may have an incorrect value, set it to 1
+! * to avoid crashing when it's wrong.
+! * TODO: Avoid qf_count being incorrect. */
+ qfl->qf_count = 1;
+ }
+ qfl->qf_start = qfpnext;
+--- 3576,3584 ----
+ stop = (qfp == qfpnext);
+ vim_free(qfp);
+ if (stop)
+! // Somehow qf_count may have an incorrect value, set it to 1
+! // to avoid crashing when it's wrong.
+! // TODO: Avoid qf_count being incorrect.
+ qfl->qf_count = 1;
+ }
+ qfl->qf_start = qfpnext;
+***************
+*** 3828,3841 ****
+ return;
+ }
+
+! /* Look for an existing quickfix window. */
+ win = qf_find_win(qi);
+
+! /*
+! * If a quickfix window is open but we have no errors to display,
+! * close the window. If a quickfix window is not open, then open
+! * it if we have errors; otherwise, leave it closed.
+! */
+ if (qf_stack_empty(qi)
+ || qi->qf_lists[qi->qf_curlist].qf_nonevalid
+ || qf_list_empty(qi, qi->qf_curlist))
+--- 3766,3777 ----
+ return;
+ }
+
+! // Look for an existing quickfix window.
+ win = qf_find_win(qi);
+
+! // If a quickfix window is open but we have no errors to display,
+! // close the window. If a quickfix window is not open, then open
+! // it if we have errors; otherwise, leave it closed.
+ if (qf_stack_empty(qi)
+ || qi->qf_lists[qi->qf_curlist].qf_nonevalid
+ || qf_list_empty(qi, qi->qf_curlist))
+***************
+*** 3864,3870 ****
+ return;
+ }
+
+! /* Find existing quickfix window and close it. */
+ win = qf_find_win(qi);
+ if (win != NULL)
+ win_close(win, FALSE);
+--- 3800,3806 ----
+ return;
+ }
+
+! // Find existing quickfix window and close it.
+ win = qf_find_win(qi);
+ if (win != NULL)
+ win_close(win, FALSE);
+***************
+*** 4052,4060 ****
+ curwin->w_cursor.coladd = 0;
+ #endif
+ curwin->w_curswant = 0;
+! update_topline(); /* scroll to show the line */
+ redraw_later(VALID);
+! curwin->w_redr_status = TRUE; /* update ruler */
+ curwin = old_curwin;
+ curbuf = curwin->w_buffer;
+ }
+--- 3988,3996 ----
+ curwin->w_cursor.coladd = 0;
+ #endif
+ curwin->w_curswant = 0;
+! update_topline(); // scroll to show the line
+ redraw_later(VALID);
+! curwin->w_redr_status = TRUE; // update ruler
+ curwin = old_curwin;
+ curbuf = curwin->w_buffer;
+ }
+***************
+*** 4093,4099 ****
+ qf_info_T *qi = &ql_info;
+
+ if (IS_LL_WINDOW(wp))
+! /* In the location list window, use the referenced location list */
+ qi = wp->w_llist_ref;
+
+ return qi->qf_lists[qi->qf_curlist].qf_index;
+--- 4029,4035 ----
+ qf_info_T *qi = &ql_info;
+
+ if (IS_LL_WINDOW(wp))
+! // In the location list window, use the referenced location list
+ qi = wp->w_llist_ref;
+
+ return qi->qf_lists[qi->qf_curlist].qf_index;
+***************
+*** 4106,4120 ****
+ static int
+ qf_win_pos_update(
+ qf_info_T *qi,
+! int old_qf_index) /* previous qf_index or zero */
+ {
+ win_T *win;
+ int qf_index = qi->qf_lists[qi->qf_curlist].qf_index;
+
+! /*
+! * Put the cursor on the current error in the quickfix window, so that
+! * it's viewable.
+! */
+ win = qf_find_win(qi);
+ if (win != NULL
+ && qf_index <= win->w_buffer->b_ml.ml_line_count
+--- 4042,4054 ----
+ static int
+ qf_win_pos_update(
+ qf_info_T *qi,
+! int old_qf_index) // previous qf_index or zero
+ {
+ win_T *win;
+ int qf_index = qi->qf_lists[qi->qf_curlist].qf_index;
+
+! // Put the cursor on the current error in the quickfix window, so that
+! // it's viewable.
+ win = qf_find_win(qi);
+ if (win != NULL
+ && qf_index <= win->w_buffer->b_ml.ml_line_count
+***************
+*** 4142,4153 ****
+ static int
+ is_qf_win(win_T *win, qf_info_T *qi)
+ {
+! /*
+! * A window displaying the quickfix buffer will have the w_llist_ref field
+! * set to NULL.
+! * A window displaying a location list buffer will have the w_llist_ref
+! * pointing to the location list.
+! */
+ if (bt_quickfix(win->w_buffer))
+ if ((IS_QF_STACK(qi) && win->w_llist_ref == NULL)
+ || (IS_LL_STACK(qi) && win->w_llist_ref == qi))
+--- 4076,4085 ----
+ static int
+ is_qf_win(win_T *win, qf_info_T *qi)
+ {
+! // A window displaying the quickfix buffer will have the w_llist_ref field
+! // set to NULL.
+! // A window displaying a location list buffer will have the w_llist_ref
+! // pointing to the location list.
+ if (bt_quickfix(win->w_buffer))
+ if ((IS_QF_STACK(qi) && win->w_llist_ref == NULL)
+ || (IS_LL_STACK(qi) && win->w_llist_ref == qi))
+***************
+*** 4216,4229 ****
+ win_T *win;
+ aco_save_T aco;
+
+! /* Check if a buffer for the quickfix list exists. Update it. */
+ buf = qf_find_buf(qi);
+ if (buf != NULL)
+ {
+ linenr_T old_line_count = buf->b_ml.ml_line_count;
+
+ if (old_last == NULL)
+! /* set curwin/curbuf to buf and save a few things */
+ aucmd_prepbuf(&aco, buf);
+
+ qf_update_win_titlevar(qi);
+--- 4148,4161 ----
+ win_T *win;
+ aco_save_T aco;
+
+! // Check if a buffer for the quickfix list exists. Update it.
+ buf = qf_find_buf(qi);
+ if (buf != NULL)
+ {
+ linenr_T old_line_count = buf->b_ml.ml_line_count;
+
+ if (old_last == NULL)
+! // set curwin/curbuf to buf and save a few things
+ aucmd_prepbuf(&aco, buf);
+
+ qf_update_win_titlevar(qi);
+***************
+*** 4235,4246 ****
+ {
+ (void)qf_win_pos_update(qi, 0);
+
+! /* restore curwin/curbuf and a few other things */
+ aucmd_restbuf(&aco);
+ }
+
+! /* Only redraw when added lines are visible. This avoids flickering
+! * when the added lines are not visible. */
+ if ((win = qf_find_win(qi)) != NULL && old_line_count < win->w_botline)
+ redraw_buf_later(buf, NOT_VALID);
+ }
+--- 4167,4178 ----
+ {
+ (void)qf_win_pos_update(qi, 0);
+
+! // restore curwin/curbuf and a few other things
+ aucmd_restbuf(&aco);
+ }
+
+! // Only redraw when added lines are visible. This avoids flickering
+! // when the added lines are not visible.
+ if ((win = qf_find_win(qi)) != NULL && old_line_count < win->w_botline)
+ redraw_buf_later(buf, NOT_VALID);
+ }
+***************
+*** 4264,4274 ****
+ && (errbuf = buflist_findnr(qfp->qf_fnum)) != NULL
+ && errbuf->b_fname != NULL)
+ {
+! if (qfp->qf_type == 1) /* :helpgrep */
+ STRCPY(IObuff, gettail(errbuf->b_fname));
+ else
+ {
+! /* shorten the file name if not done already */
+ if (errbuf->b_sfname == NULL
+ || mch_isFullName(errbuf->b_sfname))
+ {
+--- 4196,4206 ----
+ && (errbuf = buflist_findnr(qfp->qf_fnum)) != NULL
+ && errbuf->b_fname != NULL)
+ {
+! if (qfp->qf_type == 1) // :helpgrep
+ STRCPY(IObuff, gettail(errbuf->b_fname));
+ else
+ {
+! // shorten the file name if not done already
+ if (errbuf->b_sfname == NULL
+ || mch_isFullName(errbuf->b_sfname))
+ {
+***************
+*** 4307,4315 ****
+ IObuff[len++] = '|';
+ IObuff[len++] = ' ';
+
+! /* Remove newlines and leading whitespace from the text.
+! * For an unrecognized line keep the indent, the compiler may
+! * mark a word with ^^^^. */
+ qf_fmt_text(len > 3 ? skipwhite(qfp->qf_text) : qfp->qf_text,
+ IObuff + len, IOSIZE - len);
+
+--- 4239,4247 ----
+ IObuff[len++] = '|';
+ IObuff[len++] = ' ';
+
+! // Remove newlines and leading whitespace from the text.
+! // For an unrecognized line keep the indent, the compiler may
+! // mark a word with ^^^^.
+ qf_fmt_text(len > 3 ? skipwhite(qfp->qf_text) : qfp->qf_text,
+ IObuff + len, IOSIZE - len);
+
+***************
+*** 4342,4360 ****
+ return;
+ }
+
+! /* delete all existing lines */
+ while ((curbuf->b_ml.ml_flags & ML_EMPTY) == 0)
+ (void)ml_delete((linenr_T)1, FALSE);
+ }
+
+! /* Check if there is anything to display */
+ if (!qf_stack_empty(qi))
+ {
+ char_u dirname[MAXPATHL];
+
+ *dirname = NUL;
+
+! /* Add one line for each error */
+ if (old_last == NULL)
+ {
+ qfp = qi->qf_lists[qi->qf_curlist].qf_start;
+--- 4274,4292 ----
+ return;
+ }
+
+! // delete all existing lines
+ while ((curbuf->b_ml.ml_flags & ML_EMPTY) == 0)
+ (void)ml_delete((linenr_T)1, FALSE);
+ }
+
+! // Check if there is anything to display
+ if (!qf_stack_empty(qi))
+ {
+ char_u dirname[MAXPATHL];
+
+ *dirname = NUL;
+
+! // Add one line for each error
+ if (old_last == NULL)
+ {
+ qfp = qi->qf_lists[qi->qf_curlist].qf_start;
+***************
+*** 4377,4399 ****
+ }
+
+ if (old_last == NULL)
+! /* Delete the empty line which is now at the end */
+ (void)ml_delete(lnum + 1, FALSE);
+ }
+
+! /* correct cursor position */
+ check_lnums(TRUE);
+
+ if (old_last == NULL)
+ {
+! /* Set the 'filetype' to "qf" each time after filling the buffer.
+! * This resembles reading a file into a buffer, it's more logical when
+! * using autocommands. */
+ ++curbuf_lock;
+ set_option_value((char_u *)"ft", 0L, (char_u *)"qf", OPT_LOCAL);
+ curbuf->b_p_ma = FALSE;
+
+! keep_filetype = TRUE; /* don't detect 'filetype' */
+ apply_autocmds(EVENT_BUFREADPOST, (char_u *)"quickfix", NULL,
+ FALSE, curbuf);
+ apply_autocmds(EVENT_BUFWINENTER, (char_u *)"quickfix", NULL,
+--- 4309,4331 ----
+ }
+
+ if (old_last == NULL)
+! // Delete the empty line which is now at the end
+ (void)ml_delete(lnum + 1, FALSE);
+ }
+
+! // correct cursor position
+ check_lnums(TRUE);
+
+ if (old_last == NULL)
+ {
+! // Set the 'filetype' to "qf" each time after filling the buffer.
+! // This resembles reading a file into a buffer, it's more logical when
+! // using autocommands.
+ ++curbuf_lock;
+ set_option_value((char_u *)"ft", 0L, (char_u *)"qf", OPT_LOCAL);
+ curbuf->b_p_ma = FALSE;
+
+! keep_filetype = TRUE; // don't detect 'filetype'
+ apply_autocmds(EVENT_BUFREADPOST, (char_u *)"quickfix", NULL,
+ FALSE, curbuf);
+ apply_autocmds(EVENT_BUFWINENTER, (char_u *)"quickfix", NULL,
+***************
+*** 4401,4411 ****
+ keep_filetype = FALSE;
+ --curbuf_lock;
+
+! /* make sure it will be redrawn */
+ redraw_curbuf_later(NOT_VALID);
+ }
+
+! /* Restore KeyTyped, setting 'filetype' may reset it. */
+ KeyTyped = old_KeyTyped;
+ }
+
+--- 4333,4343 ----
+ keep_filetype = FALSE;
+ --curbuf_lock;
+
+! // make sure it will be redrawn
+ redraw_curbuf_later(NOT_VALID);
+ }
+
+! // Restore KeyTyped, setting 'filetype' may reset it.
+ KeyTyped = old_KeyTyped;
+ }
+
+***************
+*** 4694,4700 ****
+
+ if (is_loclist_cmd(eap->cmdidx))
+ {
+! /* Location list */
+ qi = GET_LOC_LIST(curwin);
+ if (qi == NULL)
+ return 0;
+--- 4626,4632 ----
+
+ if (is_loclist_cmd(eap->cmdidx))
+ {
+! // Location list
+ qi = GET_LOC_LIST(curwin);
+ if (qi == NULL)
+ return 0;
+***************
+*** 4707,4716 ****
+ if (qfp->qf_valid)
+ {
+ if (eap->cmdidx == CMD_cdo || eap->cmdidx == CMD_ldo)
+! sz++; /* Count all valid entries */
+ else if (qfp->qf_fnum > 0 && qfp->qf_fnum != prev_fnum)
+ {
+! /* Count the number of files */
+ sz++;
+ prev_fnum = qfp->qf_fnum;
+ }
+--- 4639,4648 ----
+ if (qfp->qf_valid)
+ {
+ if (eap->cmdidx == CMD_cdo || eap->cmdidx == CMD_ldo)
+! sz++; // Count all valid entries
+ else if (qfp->qf_fnum > 0 && qfp->qf_fnum != prev_fnum)
+ {
+! // Count the number of files
+ sz++;
+ prev_fnum = qfp->qf_fnum;
+ }
+***************
+*** 4731,4737 ****
+
+ if (is_loclist_cmd(eap->cmdidx))
+ {
+! /* Location list */
+ qi = GET_LOC_LIST(curwin);
+ if (qi == NULL)
+ return 0;
+--- 4663,4669 ----
+
+ if (is_loclist_cmd(eap->cmdidx))
+ {
+! // Location list
+ qi = GET_LOC_LIST(curwin);
+ if (qi == NULL)
+ return 0;
+***************
+*** 4755,4761 ****
+
+ if (is_loclist_cmd(eap->cmdidx))
+ {
+! /* Location list */
+ qi = GET_LOC_LIST(curwin);
+ if (qi == NULL)
+ return 1;
+--- 4687,4693 ----
+
+ if (is_loclist_cmd(eap->cmdidx))
+ {
+! // Location list
+ qi = GET_LOC_LIST(curwin);
+ if (qi == NULL)
+ return 1;
+***************
+*** 4764,4770 ****
+ qfl = &qi->qf_lists[qi->qf_curlist];
+ qfp = qfl->qf_start;
+
+! /* check if the list has valid errors */
+ if (qfl->qf_count <= 0 || qfl->qf_nonevalid)
+ return 1;
+
+--- 4696,4702 ----
+ qfl = &qi->qf_lists[qi->qf_curlist];
+ qfp = qfl->qf_start;
+
+! // check if the list has valid errors
+ if (qfl->qf_count <= 0 || qfl->qf_nonevalid)
+ return 1;
+
+***************
+*** 4776,4782 ****
+ {
+ if (qfp->qf_fnum > 0 && qfp->qf_fnum != prev_fnum)
+ {
+! /* Count the number of files */
+ eidx++;
+ prev_fnum = qfp->qf_fnum;
+ }
+--- 4708,4714 ----
+ {
+ if (qfp->qf_fnum > 0 && qfp->qf_fnum != prev_fnum)
+ {
+! // Count the number of files
+ eidx++;
+ prev_fnum = qfp->qf_fnum;
+ }
+***************
+*** 4802,4808 ****
+ int i, eidx;
+ int prev_fnum = 0;
+
+! /* check if the list has valid errors */
+ if (qfl->qf_count <= 0 || qfl->qf_nonevalid)
+ return 1;
+
+--- 4734,4740 ----
+ int i, eidx;
+ int prev_fnum = 0;
+
+! // check if the list has valid errors
+ if (qfl->qf_count <= 0 || qfl->qf_nonevalid)
+ return 1;
+
+***************
+*** 4815,4821 ****
+ {
+ if (qfp->qf_fnum > 0 && qfp->qf_fnum != prev_fnum)
+ {
+! /* Count the number of files */
+ eidx++;
+ prev_fnum = qfp->qf_fnum;
+ }
+--- 4747,4753 ----
+ {
+ if (qfp->qf_fnum > 0 && qfp->qf_fnum != prev_fnum)
+ {
+! // Count the number of files
+ eidx++;
+ prev_fnum = qfp->qf_fnum;
+ }
+***************
+*** 4873,4881 ****
+ }
+ }
+
+! /* For cdo and ldo commands, jump to the nth valid error.
+! * For cfdo and lfdo commands, jump to the nth valid file entry.
+! */
+ if (eap->cmdidx == CMD_cdo || eap->cmdidx == CMD_ldo
+ || eap->cmdidx == CMD_cfdo || eap->cmdidx == CMD_lfdo)
+ errornr = qf_get_nth_valid_entry(&qi->qf_lists[qi->qf_curlist],
+--- 4805,4812 ----
+ }
+ }
+
+! // For cdo and ldo commands, jump to the nth valid error.
+! // For cfdo and lfdo commands, jump to the nth valid file entry.
+ if (eap->cmdidx == CMD_cdo || eap->cmdidx == CMD_ldo
+ || eap->cmdidx == CMD_cfdo || eap->cmdidx == CMD_lfdo)
+ errornr = qf_get_nth_valid_entry(&qi->qf_lists[qi->qf_curlist],
+***************
+*** 4949,4955 ****
+ win_T *wp = NULL;
+ qf_info_T *qi = &ql_info;
+ char_u *au_name = NULL;
+! int_u save_qfid = 0; /* init for gcc */
+ int res;
+
+ switch (eap->cmdidx)
+--- 4880,4886 ----
+ win_T *wp = NULL;
+ qf_info_T *qi = &ql_info;
+ char_u *au_name = NULL;
+! int_u save_qfid = 0; // init for gcc
+ int res;
+
+ switch (eap->cmdidx)
+***************
+*** 4986,5001 ****
+ if (is_loclist_cmd(eap->cmdidx))
+ wp = curwin;
+
+! /*
+! * This function is used by the :cfile, :cgetfile and :caddfile
+! * commands.
+! * :cfile always creates a new quickfix list and jumps to the
+! * first error.
+! * :cgetfile creates a new quickfix list but doesn't jump to the
+! * first error.
+! * :caddfile adds to an existing quickfix list. If there is no
+! * quickfix list then a new list is created.
+! */
+ res = qf_init(wp, p_ef, p_efm, (eap->cmdidx != CMD_caddfile
+ && eap->cmdidx != CMD_laddfile),
+ qf_cmdtitle(*eap->cmdlinep), enc);
+--- 4917,4930 ----
+ if (is_loclist_cmd(eap->cmdidx))
+ wp = curwin;
+
+! // This function is used by the :cfile, :cgetfile and :caddfile
+! // commands.
+! // :cfile always creates a new quickfix list and jumps to the
+! // first error.
+! // :cgetfile creates a new quickfix list but doesn't jump to the
+! // first error.
+! // :caddfile adds to an existing quickfix list. If there is no
+! // quickfix list then a new list is created.
+ res = qf_init(wp, p_ef, p_efm, (eap->cmdidx != CMD_caddfile
+ && eap->cmdidx != CMD_laddfile),
+ qf_cmdtitle(*eap->cmdlinep), enc);
+***************
+*** 5045,5056 ****
+ static void
+ vgr_init_regmatch(regmmatch_T *regmatch, char_u *s)
+ {
+! /* Get the search pattern: either white-separated or enclosed in // */
+ regmatch->regprog = NULL;
+
+ if (s == NULL || *s == NUL)
+ {
+! /* Pattern is empty, use last search pattern. */
+ if (last_search_pat() == NULL)
+ {
+ EMSG(_(e_noprevre));
+--- 4974,4985 ----
+ static void
+ vgr_init_regmatch(regmmatch_T *regmatch, char_u *s)
+ {
+! // Get the search pattern: either white-separated or enclosed in //
+ regmatch->regprog = NULL;
+
+ if (s == NULL || *s == NUL)
+ {
+! // Pattern is empty, use last search pattern.
+ if (last_search_pat() == NULL)
+ {
+ EMSG(_(e_noprevre));
+***************
+*** 5083,5090 ****
+ vim_free(p);
+ }
+ msg_clr_eos();
+! msg_didout = FALSE; /* overwrite this message */
+! msg_nowait = TRUE; /* don't wait for this message */
+ msg_col = 0;
+ out_flush();
+ }
+--- 5012,5019 ----
+ vim_free(p);
+ }
+ msg_clr_eos();
+! msg_didout = FALSE; // overwrite this message
+! msg_nowait = TRUE; // don't wait for this message
+ msg_col = 0;
+ out_flush();
+ }
+***************
+*** 5105,5120 ****
+ buf_T *buf;
+
+ #if defined(FEAT_SYN_HL)
+! /* Don't do Filetype autocommands to avoid loading syntax and
+! * indent scripts, a great speed improvement. */
+ save_ei = au_event_disable(",Filetype");
+ #endif
+! /* Don't use modelines here, it's useless. */
+ save_mls = p_mls;
+ p_mls = 0;
+
+! /* Load file into a buffer, so that 'fileencoding' is detected,
+! * autocommands applied, etc. */
+ buf = load_dummy_buffer(fname, dirname_start, dirname_now);
+
+ p_mls = save_mls;
+--- 5034,5049 ----
+ buf_T *buf;
+
+ #if defined(FEAT_SYN_HL)
+! // Don't do Filetype autocommands to avoid loading syntax and
+! // indent scripts, a great speed improvement.
+ save_ei = au_event_disable(",Filetype");
+ #endif
+! // Don't use modelines here, it's useless.
+ save_mls = p_mls;
+ p_mls = 0;
+
+! // Load file into a buffer, so that 'fileencoding' is detected,
+! // autocommands applied, etc.
+ buf = load_dummy_buffer(fname, dirname_start, dirname_now);
+
+ p_mls = save_mls;
+***************
+*** 5137,5154 ****
+ int_u qfid,
+ char_u *title)
+ {
+! /* Verify that the quickfix/location list was not freed by an autocmd */
+ if (!qflist_valid(wp, qfid))
+ {
+ if (wp != NULL)
+ {
+! /* An autocmd has freed the location list. */
+ EMSG(_(e_loc_list_changed));
+ return FALSE;
+ }
+ else
+ {
+! /* Quickfix list is not found, create a new one. */
+ qf_new_list(qi, title);
+ return TRUE;
+ }
+--- 5066,5083 ----
+ int_u qfid,
+ char_u *title)
+ {
+! // Verify that the quickfix/location list was not freed by an autocmd
+ if (!qflist_valid(wp, qfid))
+ {
+ if (wp != NULL)
+ {
+! // An autocmd has freed the location list.
+ EMSG(_(e_loc_list_changed));
+ return FALSE;
+ }
+ else
+ {
+! // Quickfix list is not found, create a new one.
+ qf_new_list(qi, title);
+ return TRUE;
+ }
+***************
+*** 5184,5195 ****
+ while (vim_regexec_multi(regmatch, curwin, buf, lnum,
+ col, NULL, NULL) > 0)
+ {
+! /* Pass the buffer number so that it gets used even for a
+! * dummy buffer, unless duplicate_name is set, then the
+! * buffer will be wiped out below. */
+ if (qf_add_entry(qi,
+ qi->qf_curlist,
+! NULL, /* dir */
+ fname,
+ NULL,
+ duplicate_name ? 0 : buf->b_fnum,
+--- 5113,5124 ----
+ while (vim_regexec_multi(regmatch, curwin, buf, lnum,
+ col, NULL, NULL) > 0)
+ {
+! // Pass the buffer number so that it gets used even for a
+! // dummy buffer, unless duplicate_name is set, then the
+! // buffer will be wiped out below.
+ if (qf_add_entry(qi,
+ qi->qf_curlist,
+! NULL, // dir
+ fname,
+ NULL,
+ duplicate_name ? 0 : buf->b_fnum,
+***************
+*** 5197,5207 ****
+ regmatch->startpos[0].lnum + lnum, FALSE),
+ regmatch->startpos[0].lnum + lnum,
+ regmatch->startpos[0].col + 1,
+! FALSE, /* vis_col */
+! NULL, /* search pattern */
+! 0, /* nr */
+! 0, /* type */
+! TRUE /* valid */
+ ) == FAIL)
+ {
+ got_int = TRUE;
+--- 5126,5136 ----
+ regmatch->startpos[0].lnum + lnum, FALSE),
+ regmatch->startpos[0].lnum + lnum,
+ regmatch->startpos[0].col + 1,
+! FALSE, // vis_col
+! NULL, // search pattern
+! 0, // nr
+! 0, // type
+! TRUE // valid
+ ) == FAIL)
+ {
+ got_int = TRUE;
+***************
+*** 5242,5252 ****
+ buf = curbuf;
+ qf_jump(qi, 0, 0, forceit);
+ if (buf != curbuf)
+! /* If we jumped to another buffer redrawing will already be
+! * taken care of. */
+ *redraw_for_dummy = FALSE;
+
+! /* Jump to the directory used after loading the buffer. */
+ if (curbuf == first_match_buf && target_dir != NULL)
+ {
+ exarg_T ea;
+--- 5171,5181 ----
+ buf = curbuf;
+ qf_jump(qi, 0, 0, forceit);
+ if (buf != curbuf)
+! // If we jumped to another buffer redrawing will already be
+! // taken care of.
+ *redraw_for_dummy = FALSE;
+
+! // Jump to the directory used after loading the buffer.
+ if (curbuf == first_match_buf && target_dir != NULL)
+ {
+ exarg_T ea;
+***************
+*** 5315,5321 ****
+ else
+ tomatch = MAXLNUM;
+
+! /* Get the search pattern: either white-separated or enclosed in // */
+ regmatch.regprog = NULL;
+ title = vim_strsave(qf_cmdtitle(*eap->cmdlinep));
+ p = skip_vimgrep_pat(eap->arg, &s, &flags);
+--- 5244,5250 ----
+ else
+ tomatch = MAXLNUM;
+
+! // Get the search pattern: either white-separated or enclosed in //
+ regmatch.regprog = NULL;
+ title = vim_strsave(qf_cmdtitle(*eap->cmdlinep));
+ p = skip_vimgrep_pat(eap->arg, &s, &flags);
+***************
+*** 5340,5349 ****
+ && eap->cmdidx != CMD_vimgrepadd
+ && eap->cmdidx != CMD_lvimgrepadd)
+ || qf_stack_empty(qi))
+! /* make place for a new list */
+ qf_new_list(qi, title != NULL ? title : qf_cmdtitle(*eap->cmdlinep));
+
+! /* parse the list of arguments */
+ if (get_arglist_exp(p, &fcount, &fnames, TRUE) == FAIL)
+ goto theend;
+ if (fcount == 0)
+--- 5269,5278 ----
+ && eap->cmdidx != CMD_vimgrepadd
+ && eap->cmdidx != CMD_lvimgrepadd)
+ || qf_stack_empty(qi))
+! // make place for a new list
+ qf_new_list(qi, title != NULL ? title : qf_cmdtitle(*eap->cmdlinep));
+
+! // parse the list of arguments
+ if (get_arglist_exp(p, &fcount, &fnames, TRUE) == FAIL)
+ goto theend;
+ if (fcount == 0)
+***************
+*** 5360,5371 ****
+ goto theend;
+ }
+
+! /* Remember the current directory, because a BufRead autocommand that does
+! * ":lcd %:p:h" changes the meaning of short path names. */
+ mch_dirname(dirname_start, MAXPATHL);
+
+! /* Remember the current quickfix list identifier, so that we can check for
+! * autocommands changing the current quickfix list. */
+ save_qfid = qi->qf_lists[qi->qf_curlist].qf_id;
+
+ seconds = (time_t)0;
+--- 5289,5300 ----
+ goto theend;
+ }
+
+! // Remember the current directory, because a BufRead autocommand that does
+! // ":lcd %:p:h" changes the meaning of short path names.
+ mch_dirname(dirname_start, MAXPATHL);
+
+! // Remember the current quickfix list identifier, so that we can check for
+! // autocommands changing the current quickfix list.
+ save_qfid = qi->qf_lists[qi->qf_curlist].qf_id;
+
+ seconds = (time_t)0;
+***************
+*** 5374,5381 ****
+ fname = shorten_fname1(fnames[fi]);
+ if (time(NULL) > seconds)
+ {
+! /* Display the file name every second or so, show the user we are
+! * working on it. */
+ seconds = time(NULL);
+ vgr_display_fname(fname);
+ }
+--- 5303,5310 ----
+ fname = shorten_fname1(fnames[fi]);
+ if (time(NULL) > seconds)
+ {
+! // Display the file name every second or so, show the user we are
+! // working on it.
+ seconds = time(NULL);
+ vgr_display_fname(fname);
+ }
+***************
+*** 5383,5389 ****
+ buf = buflist_findname_exp(fnames[fi]);
+ if (buf == NULL || buf->b_ml.ml_mfp == NULL)
+ {
+! /* Remember that a buffer with this name already exists. */
+ duplicate_name = (buf != NULL);
+ using_dummy = TRUE;
+ redraw_for_dummy = TRUE;
+--- 5312,5318 ----
+ buf = buflist_findname_exp(fnames[fi]);
+ if (buf == NULL || buf->b_ml.ml_mfp == NULL)
+ {
+! // Remember that a buffer with this name already exists.
+ duplicate_name = (buf != NULL);
+ using_dummy = TRUE;
+ redraw_for_dummy = TRUE;
+***************
+*** 5391,5401 ****
+ buf = vgr_load_dummy_buf(fname, dirname_start, dirname_now);
+ }
+ else
+! /* Use existing, loaded buffer. */
+ using_dummy = FALSE;
+
+! /* Check whether the quickfix list is still valid. When loading a
+! * buffer above, autocommands might have changed the quickfix list. */
+ if (!vgr_qflist_valid(wp, qi, save_qfid, qf_cmdtitle(*eap->cmdlinep)))
+ {
+ FreeWild(fcount, fnames);
+--- 5320,5330 ----
+ buf = vgr_load_dummy_buf(fname, dirname_start, dirname_now);
+ }
+ else
+! // Use existing, loaded buffer.
+ using_dummy = FALSE;
+
+! // Check whether the quickfix list is still valid. When loading a
+! // buffer above, autocommands might have changed the quickfix list.
+ if (!vgr_qflist_valid(wp, qi, save_qfid, qf_cmdtitle(*eap->cmdlinep)))
+ {
+ FreeWild(fcount, fnames);
+***************
+*** 5410,5417 ****
+ }
+ else
+ {
+! /* Try for a match in all lines of the buffer.
+! * For ":1vimgrep" look for first match only. */
+ found_match = vgr_match_buflines(qi, fname, buf, &regmatch,
+ tomatch, duplicate_name, flags);
+
+--- 5339,5346 ----
+ }
+ else
+ {
+! // Try for a match in all lines of the buffer.
+! // For ":1vimgrep" look for first match only.
+ found_match = vgr_match_buflines(qi, fname, buf, &regmatch,
+ tomatch, duplicate_name, flags);
+
+***************
+*** 5421,5442 ****
+ first_match_buf = buf;
+ if (duplicate_name)
+ {
+! /* Never keep a dummy buffer if there is another buffer
+! * with the same name. */
+ wipe_dummy_buffer(buf, dirname_start);
+ buf = NULL;
+ }
+ else if (!cmdmod.hide
+! || buf->b_p_bh[0] == 'u' /* "unload" */
+! || buf->b_p_bh[0] == 'w' /* "wipe" */
+! || buf->b_p_bh[0] == 'd') /* "delete" */
+ {
+! /* When no match was found we don't need to remember the
+! * buffer, wipe it out. If there was a match and it
+! * wasn't the first one or we won't jump there: only
+! * unload the buffer.
+! * Ignore 'hidden' here, because it may lead to having too
+! * many swap files. */
+ if (!found_match)
+ {
+ wipe_dummy_buffer(buf, dirname_start);
+--- 5350,5371 ----
+ first_match_buf = buf;
+ if (duplicate_name)
+ {
+! // Never keep a dummy buffer if there is another buffer
+! // with the same name.
+ wipe_dummy_buffer(buf, dirname_start);
+ buf = NULL;
+ }
+ else if (!cmdmod.hide
+! || buf->b_p_bh[0] == 'u' // "unload"
+! || buf->b_p_bh[0] == 'w' // "wipe"
+! || buf->b_p_bh[0] == 'd') // "delete"
+ {
+! // When no match was found we don't need to remember the
+! // buffer, wipe it out. If there was a match and it
+! // wasn't the first one or we won't jump there: only
+! // unload the buffer.
+! // Ignore 'hidden' here, because it may lead to having too
+! // many swap files.
+ if (!found_match)
+ {
+ wipe_dummy_buffer(buf, dirname_start);
+***************
+*** 5445,5451 ****
+ else if (buf != first_match_buf || (flags & VGR_NOJUMP))
+ {
+ unload_dummy_buffer(buf, dirname_start);
+! /* Keeping the buffer, remove the dummy flag. */
+ buf->b_flags &= ~BF_DUMMY;
+ buf = NULL;
+ }
+--- 5374,5380 ----
+ else if (buf != first_match_buf || (flags & VGR_NOJUMP))
+ {
+ unload_dummy_buffer(buf, dirname_start);
+! // Keeping the buffer, remove the dummy flag.
+ buf->b_flags &= ~BF_DUMMY;
+ buf = NULL;
+ }
+***************
+*** 5453,5472 ****
+
+ if (buf != NULL)
+ {
+! /* Keeping the buffer, remove the dummy flag. */
+ buf->b_flags &= ~BF_DUMMY;
+
+! /* If the buffer is still loaded we need to use the
+! * directory we jumped to below. */
+ if (buf == first_match_buf
+ && target_dir == NULL
+ && STRCMP(dirname_start, dirname_now) != 0)
+ target_dir = vim_strsave(dirname_now);
+
+! /* The buffer is still loaded, the Filetype autocommands
+! * need to be done now, in that buffer. And the modelines
+! * need to be done (again). But not the window-local
+! * options! */
+ aucmd_prepbuf(&aco, buf);
+ #if defined(FEAT_SYN_HL)
+ apply_autocmds(EVENT_FILETYPE, buf->b_p_ft,
+--- 5382,5401 ----
+
+ if (buf != NULL)
+ {
+! // Keeping the buffer, remove the dummy flag.
+ buf->b_flags &= ~BF_DUMMY;
+
+! // If the buffer is still loaded we need to use the
+! // directory we jumped to below.
+ if (buf == first_match_buf
+ && target_dir == NULL
+ && STRCMP(dirname_start, dirname_now) != 0)
+ target_dir = vim_strsave(dirname_now);
+
+! // The buffer is still loaded, the Filetype autocommands
+! // need to be done now, in that buffer. And the modelines
+! // need to be done (again). But not the window-local
+! // options!
+ aucmd_prepbuf(&aco, buf);
+ #if defined(FEAT_SYN_HL)
+ apply_autocmds(EVENT_FILETYPE, buf->b_p_ft,
+***************
+*** 5491,5500 ****
+ if (au_name != NULL)
+ apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name,
+ curbuf->b_fname, TRUE, curbuf);
+! /*
+! * The QuickFixCmdPost autocmd may free the quickfix list. Check the list
+! * is still valid.
+! */
+ if (!qflist_valid(wp, save_qfid))
+ goto theend;
+
+--- 5420,5427 ----
+ if (au_name != NULL)
+ apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name,
+ curbuf->b_fname, TRUE, curbuf);
+! // The QuickFixCmdPost autocmd may free the quickfix list. Check the list
+! // is still valid.
+ if (!qflist_valid(wp, save_qfid))
+ goto theend;
+
+***************
+*** 5511,5518 ****
+ else
+ EMSG2(_(e_nomatch2), s);
+
+! /* If we loaded a dummy buffer into the current window, the autocommands
+! * may have messed up things, need to redraw and recompute folds. */
+ if (redraw_for_dummy)
+ {
+ #ifdef FEAT_FOLDING
+--- 5438,5445 ----
+ else
+ EMSG2(_(e_nomatch2), s);
+
+! // If we loaded a dummy buffer into the current window, the autocommands
+! // may have messed up things, need to redraw and recompute folds.
+ if (redraw_for_dummy)
+ {
+ #ifdef FEAT_FOLDING
+***************
+*** 5544,5551 ****
+ mch_dirname(dirname_now, MAXPATHL);
+ if (STRCMP(dirname_start, dirname_now) != 0)
+ {
+! /* If the directory has changed, change it back by building up an
+! * appropriate ex command and executing it. */
+ exarg_T ea;
+
+ ea.arg = dirname_start;
+--- 5471,5478 ----
+ mch_dirname(dirname_now, MAXPATHL);
+ if (STRCMP(dirname_start, dirname_now) != 0)
+ {
+! // If the directory has changed, change it back by building up an
+! // appropriate ex command and executing it.
+ exarg_T ea;
+
+ ea.arg = dirname_start;
+***************
+*** 5571,5578 ****
+ static buf_T *
+ load_dummy_buffer(
+ char_u *fname,
+! char_u *dirname_start, /* in: old directory */
+! char_u *resulting_dir) /* out: new directory */
+ {
+ buf_T *newbuf;
+ bufref_T newbufref;
+--- 5498,5505 ----
+ static buf_T *
+ load_dummy_buffer(
+ char_u *fname,
+! char_u *dirname_start, // in: old directory
+! char_u *resulting_dir) // out: new directory
+ {
+ buf_T *newbuf;
+ bufref_T newbufref;
+***************
+*** 5581,5612 ****
+ aco_save_T aco;
+ int readfile_result;
+
+! /* Allocate a buffer without putting it in the buffer list. */
+ newbuf = buflist_new(NULL, NULL, (linenr_T)1, BLN_DUMMY);
+ if (newbuf == NULL)
+ return NULL;
+ set_bufref(&newbufref, newbuf);
+
+! /* Init the options. */
+ buf_copy_options(newbuf, BCO_ENTER | BCO_NOHELP);
+
+! /* need to open the memfile before putting the buffer in a window */
+ if (ml_open(newbuf) == OK)
+ {
+! /* Make sure this buffer isn't wiped out by autocommands. */
+ ++newbuf->b_locked;
+
+! /* set curwin/curbuf to buf and save a few things */
+ aucmd_prepbuf(&aco, newbuf);
+
+! /* Need to set the filename for autocommands. */
+ (void)setfname(curbuf, fname, NULL, FALSE);
+
+! /* Create swap file now to avoid the ATTENTION message. */
+ check_need_swap(TRUE);
+
+! /* Remove the "dummy" flag, otherwise autocommands may not
+! * work. */
+ curbuf->b_flags &= ~BF_DUMMY;
+
+ newbuf_to_wipe.br_buf = NULL;
+--- 5508,5539 ----
+ aco_save_T aco;
+ int readfile_result;
+
+! // Allocate a buffer without putting it in the buffer list.
+ newbuf = buflist_new(NULL, NULL, (linenr_T)1, BLN_DUMMY);
+ if (newbuf == NULL)
+ return NULL;
+ set_bufref(&newbufref, newbuf);
+
+! // Init the options.
+ buf_copy_options(newbuf, BCO_ENTER | BCO_NOHELP);
+
+! // need to open the memfile before putting the buffer in a window
+ if (ml_open(newbuf) == OK)
+ {
+! // Make sure this buffer isn't wiped out by autocommands.
+ ++newbuf->b_locked;
+
+! // set curwin/curbuf to buf and save a few things
+ aucmd_prepbuf(&aco, newbuf);
+
+! // Need to set the filename for autocommands.
+ (void)setfname(curbuf, fname, NULL, FALSE);
+
+! // Create swap file now to avoid the ATTENTION message.
+ check_need_swap(TRUE);
+
+! // Remove the "dummy" flag, otherwise autocommands may not
+! // work.
+ curbuf->b_flags &= ~BF_DUMMY;
+
+ newbuf_to_wipe.br_buf = NULL;
+***************
+*** 5621,5650 ****
+ failed = FALSE;
+ if (curbuf != newbuf)
+ {
+! /* Bloody autocommands changed the buffer! Can happen when
+! * using netrw and editing a remote file. Use the current
+! * buffer instead, delete the dummy one after restoring the
+! * window stuff. */
+ set_bufref(&newbuf_to_wipe, newbuf);
+ newbuf = curbuf;
+ }
+ }
+
+! /* restore curwin/curbuf and a few other things */
+ aucmd_restbuf(&aco);
+ if (newbuf_to_wipe.br_buf != NULL && bufref_valid(&newbuf_to_wipe))
+ wipe_buffer(newbuf_to_wipe.br_buf, FALSE);
+
+! /* Add back the "dummy" flag, otherwise buflist_findname_stat() won't
+! * skip it. */
+ newbuf->b_flags |= BF_DUMMY;
+ }
+
+! /*
+! * When autocommands/'autochdir' option changed directory: go back.
+! * Let the caller know what the resulting dir was first, in case it is
+! * important.
+! */
+ mch_dirname(resulting_dir, MAXPATHL);
+ restore_start_dir(dirname_start);
+
+--- 5548,5575 ----
+ failed = FALSE;
+ if (curbuf != newbuf)
+ {
+! // Bloody autocommands changed the buffer! Can happen when
+! // using netrw and editing a remote file. Use the current
+! // buffer instead, delete the dummy one after restoring the
+! // window stuff.
+ set_bufref(&newbuf_to_wipe, newbuf);
+ newbuf = curbuf;
+ }
+ }
+
+! // restore curwin/curbuf and a few other things
+ aucmd_restbuf(&aco);
+ if (newbuf_to_wipe.br_buf != NULL && bufref_valid(&newbuf_to_wipe))
+ wipe_buffer(newbuf_to_wipe.br_buf, FALSE);
+
+! // Add back the "dummy" flag, otherwise buflist_findname_stat() won't
+! // skip it.
+ newbuf->b_flags |= BF_DUMMY;
+ }
+
+! // When autocommands/'autochdir' option changed directory: go back.
+! // Let the caller know what the resulting dir was first, in case it is
+! // important.
+ mch_dirname(resulting_dir, MAXPATHL);
+ restore_start_dir(dirname_start);
+
+***************
+*** 5666,5690 ****
+ static void
+ wipe_dummy_buffer(buf_T *buf, char_u *dirname_start)
+ {
+! if (curbuf != buf) /* safety check */
+ {
+ #if defined(FEAT_EVAL)
+ cleanup_T cs;
+
+! /* Reset the error/interrupt/exception state here so that aborting()
+! * returns FALSE when wiping out the buffer. Otherwise it doesn't
+! * work when got_int is set. */
+ enter_cleanup(&cs);
+ #endif
+
+ wipe_buffer(buf, FALSE);
+
+ #if defined(FEAT_EVAL)
+! /* Restore the error/interrupt/exception state if not discarded by a
+! * new aborting error, interrupt, or uncaught exception. */
+ leave_cleanup(&cs);
+ #endif
+! /* When autocommands/'autochdir' option changed directory: go back. */
+ restore_start_dir(dirname_start);
+ }
+ }
+--- 5591,5615 ----
+ static void
+ wipe_dummy_buffer(buf_T *buf, char_u *dirname_start)
+ {
+! if (curbuf != buf) // safety check
+ {
+ #if defined(FEAT_EVAL)
+ cleanup_T cs;
+
+! // Reset the error/interrupt/exception state here so that aborting()
+! // returns FALSE when wiping out the buffer. Otherwise it doesn't
+! // work when got_int is set.
+ enter_cleanup(&cs);
+ #endif
+
+ wipe_buffer(buf, FALSE);
+
+ #if defined(FEAT_EVAL)
+! // Restore the error/interrupt/exception state if not discarded by a
+! // new aborting error, interrupt, or uncaught exception.
+ leave_cleanup(&cs);
+ #endif
+! // When autocommands/'autochdir' option changed directory: go back.
+ restore_start_dir(dirname_start);
+ }
+ }
+***************
+*** 5697,5707 ****
+ static void
+ unload_dummy_buffer(buf_T *buf, char_u *dirname_start)
+ {
+! if (curbuf != buf) /* safety check */
+ {
+ close_buffer(NULL, buf, DOBUF_UNLOAD, FALSE);
+
+! /* When autocommands/'autochdir' option changed directory: go back. */
+ restore_start_dir(dirname_start);
+ }
+ }
+--- 5622,5632 ----
+ static void
+ unload_dummy_buffer(buf_T *buf, char_u *dirname_start)
+ {
+! if (curbuf != buf) // safety check
+ {
+ close_buffer(NULL, buf, DOBUF_UNLOAD, FALSE);
+
+! // When autocommands/'autochdir' option changed directory: go back.
+ restore_start_dir(dirname_start);
+ }
+ }
+***************
+*** 5741,5747 ****
+ qfp = qi->qf_lists[qf_idx].qf_start;
+ for (i = 1; !got_int && i <= qi->qf_lists[qf_idx].qf_count; ++i)
+ {
+! /* Handle entries with a non-existing buffer number. */
+ bufnum = qfp->qf_fnum;
+ if (bufnum != 0 && (buflist_findnr(bufnum) == NULL))
+ bufnum = 0;
+--- 5666,5672 ----
+ qfp = qi->qf_lists[qf_idx].qf_start;
+ for (i = 1; !got_int && i <= qi->qf_lists[qf_idx].qf_count; ++i)
+ {
+! // Handle entries with a non-existing buffer number.
+ bufnum = qfp->qf_fnum;
+ if (bufnum != 0 && (buflist_findnr(bufnum) == NULL))
+ bufnum = 0;
+***************
+*** 5772,5780 ****
+ return OK;
+ }
+
+! /*
+! * Flags used by getqflist()/getloclist() to determine which fields to return.
+! */
+ enum {
+ QF_GETLIST_NONE = 0x0,
+ QF_GETLIST_TITLE = 0x1,
+--- 5697,5703 ----
+ return OK;
+ }
+
+! // Flags used by getqflist()/getloclist() to determine which fields to return.
+ enum {
+ QF_GETLIST_NONE = 0x0,
+ QF_GETLIST_TITLE = 0x1,
+***************
+*** 5803,5814 ****
+ dictitem_T *efm_di;
+ list_T *l;
+
+! /* Only a List value is supported */
+ if (di->di_tv.v_type == VAR_LIST && di->di_tv.vval.v_list != NULL)
+ {
+! /* If errorformat is supplied then use it, otherwise use the 'efm'
+! * option setting
+! */
+ if ((efm_di = dict_find(what, (char_u *)"efm", -1)) != NULL)
+ {
+ if (efm_di->di_tv.v_type != VAR_STRING ||
+--- 5726,5736 ----
+ dictitem_T *efm_di;
+ list_T *l;
+
+! // Only a List value is supported
+ if (di->di_tv.v_type == VAR_LIST && di->di_tv.vval.v_list != NULL)
+ {
+! // If errorformat is supplied then use it, otherwise use the 'efm'
+! // option setting
+ if ((efm_di = dict_find(what, (char_u *)"efm", -1)) != NULL)
+ {
+ if (efm_di->di_tv.v_type != VAR_STRING ||
+***************
+*** 5847,5854 ****
+ {
+ win_T *win;
+
+! /* The quickfix window can be opened even if the quickfix list is not set
+! * using ":copen". This is not true for location lists. */
+ if (qi == NULL)
+ return 0;
+ win = qf_find_win(qi);
+--- 5769,5776 ----
+ {
+ win_T *win;
+
+! // The quickfix window can be opened even if the quickfix list is not set
+! // using ":copen". This is not true for location lists.
+ if (qi == NULL)
+ return 0;
+ win = qf_find_win(qi);
+***************
+*** 5922,5934 ****
+ int qf_idx;
+ dictitem_T *di;
+
+! qf_idx = qi->qf_curlist; /* default is the current list */
+ if ((di = dict_find(what, (char_u *)"nr", -1)) != NULL)
+ {
+! /* Use the specified quickfix/location list */
+ if (di->di_tv.v_type == VAR_NUMBER)
+ {
+! /* for zero use the current list */
+ if (di->di_tv.vval.v_number != 0)
+ {
+ qf_idx = di->di_tv.vval.v_number - 1;
+--- 5844,5856 ----
+ int qf_idx;
+ dictitem_T *di;
+
+! qf_idx = qi->qf_curlist; // default is the current list
+ if ((di = dict_find(what, (char_u *)"nr", -1)) != NULL)
+ {
+! // Use the specified quickfix/location list
+ if (di->di_tv.v_type == VAR_NUMBER)
+ {
+! // for zero use the current list
+ if (di->di_tv.vval.v_number != 0)
+ {
+ qf_idx = di->di_tv.vval.v_number - 1;
+***************
+*** 5939,5945 ****
+ else if (di->di_tv.v_type == VAR_STRING
+ && di->di_tv.vval.v_string != NULL
+ && STRCMP(di->di_tv.vval.v_string, "$") == 0)
+! /* Get the last quickfix list number */
+ qf_idx = qi->qf_listcount - 1;
+ else
+ qf_idx = INVALID_QFIDX;
+--- 5861,5867 ----
+ else if (di->di_tv.v_type == VAR_STRING
+ && di->di_tv.vval.v_string != NULL
+ && STRCMP(di->di_tv.vval.v_string, "$") == 0)
+! // Get the last quickfix list number
+ qf_idx = qi->qf_listcount - 1;
+ else
+ qf_idx = INVALID_QFIDX;
+***************
+*** 5947,5958 ****
+
+ if ((di = dict_find(what, (char_u *)"id", -1)) != NULL)
+ {
+! /* Look for a list with the specified id */
+ if (di->di_tv.v_type == VAR_NUMBER)
+ {
+! /*
+! * For zero, use the current list or the list specified by 'nr'
+! */
+ if (di->di_tv.vval.v_number != 0)
+ qf_idx = qf_id2nr(qi, di->di_tv.vval.v_number);
+ }
+--- 5869,5878 ----
+
+ if ((di = dict_find(what, (char_u *)"id", -1)) != NULL)
+ {
+! // Look for a list with the specified id
+ if (di->di_tv.v_type == VAR_NUMBER)
+ {
+! // For zero, use the current list or the list specified by 'nr'
+ if (di->di_tv.vval.v_number != 0)
+ qf_idx = qf_id2nr(qi, di->di_tv.vval.v_number);
+ }
+***************
+*** 6085,6091 ****
+ {
+ int idx = qi->qf_lists[qf_idx].qf_index;
+ if (qf_list_empty(qi, qf_idx))
+! /* For empty lists, qf_index is set to 1 */
+ idx = 0;
+ return dict_add_number(retdict, "idx", idx);
+ }
+--- 6005,6011 ----
+ {
+ int idx = qi->qf_lists[qf_idx].qf_index;
+ if (qf_list_empty(qi, qf_idx))
+! // For empty lists, qf_index is set to 1
+ idx = 0;
+ return dict_add_number(retdict, "idx", idx);
+ }
+***************
+*** 6116,6122 ****
+ if (!qf_stack_empty(qi))
+ qf_idx = qf_getprop_qfidx(qi, what);
+
+! /* List is not present or is empty */
+ if (qf_stack_empty(qi) || qf_idx == INVALID_QFIDX)
+ return qf_getprop_defaults(qi, flags, retdict);
+
+--- 6036,6042 ----
+ if (!qf_stack_empty(qi))
+ qf_idx = qf_getprop_qfidx(qi, what);
+
+! // List is not present or is empty
+ if (qf_stack_empty(qi) || qf_idx == INVALID_QFIDX)
+ return qf_getprop_defaults(qi, flags, retdict);
+
+***************
+*** 6243,6255 ****
+
+ if (action == ' ' || qf_idx == qi->qf_listcount)
+ {
+! /* make place for a new list */
+ qf_new_list(qi, title);
+ qf_idx = qi->qf_curlist;
+ qfl = &qi->qf_lists[qf_idx];
+ }
+ else if (action == 'a' && !qf_list_empty(qi, qf_idx))
+! /* Adding to existing list, use last entry. */
+ old_last = qfl->qf_last;
+ else if (action == 'r')
+ {
+--- 6163,6175 ----
+
+ if (action == ' ' || qf_idx == qi->qf_listcount)
+ {
+! // make place for a new list
+ qf_new_list(qi, title);
+ qf_idx = qi->qf_curlist;
+ qfl = &qi->qf_lists[qf_idx];
+ }
+ else if (action == 'a' && !qf_list_empty(qi, qf_idx))
+! // Adding to existing list, use last entry.
+ old_last = qfl->qf_last;
+ else if (action == 'r')
+ {
+***************
+*** 6260,6266 ****
+ for (li = list->lv_first; li != NULL; li = li->li_next)
+ {
+ if (li->li_tv.v_type != VAR_DICT)
+! continue; /* Skip non-dict items */
+
+ d = li->li_tv.vval.v_dict;
+ if (d == NULL)
+--- 6180,6186 ----
+ for (li = list->lv_first; li != NULL; li = li->li_next)
+ {
+ if (li->li_tv.v_type != VAR_DICT)
+! continue; // Skip non-dict items
+
+ d = li->li_tv.vval.v_dict;
+ if (d == NULL)
+***************
+*** 6272,6278 ****
+ }
+
+ if (qfl->qf_index == 0)
+! /* no valid entry */
+ qfl->qf_nonevalid = TRUE;
+ else
+ qfl->qf_nonevalid = FALSE;
+--- 6192,6198 ----
+ }
+
+ if (qfl->qf_index == 0)
+! // no valid entry
+ qfl->qf_nonevalid = TRUE;
+ else
+ qfl->qf_nonevalid = FALSE;
+***************
+*** 6283,6289 ****
+ qfl->qf_index = 1;
+ }
+
+! /* Don't update the cursor in quickfix window when appending entries */
+ qf_update_buffer(qi, old_last);
+
+ return retval;
+--- 6203,6209 ----
+ qfl->qf_index = 1;
+ }
+
+! // Don't update the cursor in quickfix window when appending entries
+ qf_update_buffer(qi, old_last);
+
+ return retval;
+***************
+*** 6300,6330 ****
+ int *newlist)
+ {
+ dictitem_T *di;
+! int qf_idx = qi->qf_curlist; /* default is the current list */
+
+ if ((di = dict_find(what, (char_u *)"nr", -1)) != NULL)
+ {
+! /* Use the specified quickfix/location list */
+ if (di->di_tv.v_type == VAR_NUMBER)
+ {
+! /* for zero use the current list */
+ if (di->di_tv.vval.v_number != 0)
+ qf_idx = di->di_tv.vval.v_number - 1;
+
+ if ((action == ' ' || action == 'a') && qf_idx == qi->qf_listcount)
+ {
+! /*
+! * When creating a new list, accept qf_idx pointing to the next
+! * non-available list and add the new list at the end of the
+! * stack.
+! */
+ *newlist = TRUE;
+ qf_idx = qf_stack_empty(qi) ? 0 : qi->qf_listcount - 1;
+ }
+ else if (qf_idx < 0 || qf_idx >= qi->qf_listcount)
+ return INVALID_QFIDX;
+ else if (action != ' ')
+! *newlist = FALSE; /* use the specified list */
+ }
+ else if (di->di_tv.v_type == VAR_STRING
+ && di->di_tv.vval.v_string != NULL
+--- 6220,6248 ----
+ int *newlist)
+ {
+ dictitem_T *di;
+! int qf_idx = qi->qf_curlist; // default is the current list
+
+ if ((di = dict_find(what, (char_u *)"nr", -1)) != NULL)
+ {
+! // Use the specified quickfix/location list
+ if (di->di_tv.v_type == VAR_NUMBER)
+ {
+! // for zero use the current list
+ if (di->di_tv.vval.v_number != 0)
+ qf_idx = di->di_tv.vval.v_number - 1;
+
+ if ((action == ' ' || action == 'a') && qf_idx == qi->qf_listcount)
+ {
+! // When creating a new list, accept qf_idx pointing to the next
+! // non-available list and add the new list at the end of the
+! // stack.
+ *newlist = TRUE;
+ qf_idx = qf_stack_empty(qi) ? 0 : qi->qf_listcount - 1;
+ }
+ else if (qf_idx < 0 || qf_idx >= qi->qf_listcount)
+ return INVALID_QFIDX;
+ else if (action != ' ')
+! *newlist = FALSE; // use the specified list
+ }
+ else if (di->di_tv.v_type == VAR_STRING
+ && di->di_tv.vval.v_string != NULL
+***************
+*** 6343,6349 ****
+
+ if (!*newlist && (di = dict_find(what, (char_u *)"id", -1)) != NULL)
+ {
+! /* Use the quickfix/location list with the specified id */
+ if (di->di_tv.v_type != VAR_NUMBER)
+ return INVALID_QFIDX;
+
+--- 6261,6267 ----
+
+ if (!*newlist && (di = dict_find(what, (char_u *)"id", -1)) != NULL)
+ {
+! // Use the quickfix/location list with the specified id
+ if (di->di_tv.v_type != VAR_NUMBER)
+ return INVALID_QFIDX;
+
+***************
+*** 6406,6412 ****
+ dictitem_T *efm_di;
+ int retval = FAIL;
+
+! /* Use the user supplied errorformat settings (if present) */
+ if ((efm_di = dict_find(what, (char_u *)"efm", -1)) != NULL)
+ {
+ if (efm_di->di_tv.v_type != VAR_STRING ||
+--- 6324,6330 ----
+ dictitem_T *efm_di;
+ int retval = FAIL;
+
+! // Use the user supplied errorformat settings (if present)
+ if ((efm_di = dict_find(what, (char_u *)"efm", -1)) != NULL)
+ {
+ if (efm_di->di_tv.v_type != VAR_STRING ||
+***************
+*** 6415,6421 ****
+ errorformat = efm_di->di_tv.vval.v_string;
+ }
+
+! /* Only a List value is supported */
+ if (di->di_tv.v_type != VAR_LIST || di->di_tv.vval.v_list == NULL)
+ return FAIL;
+
+--- 6333,6339 ----
+ errorformat = efm_di->di_tv.vval.v_string;
+ }
+
+! // Only a List value is supported
+ if (di->di_tv.v_type != VAR_LIST || di->di_tv.vval.v_list == NULL)
+ return FAIL;
+
+***************
+*** 6462,6468 ****
+ newlist = TRUE;
+
+ qf_idx = qf_setprop_get_qfidx(qi, what, action, &newlist);
+! if (qf_idx == INVALID_QFIDX) /* List not found */
+ return FAIL;
+
+ if (newlist)
+--- 6380,6386 ----
+ newlist = TRUE;
+
+ qf_idx = qf_setprop_get_qfidx(qi, what, action, &newlist);
+! if (qf_idx == INVALID_QFIDX) // List not found
+ return FAIL;
+
+ if (newlist)
+***************
+*** 6516,6522 ****
+
+ if (qfwin != NULL)
+ {
+! /* If the quickfix/location list window is open, then clear it */
+ if (qi->qf_curlist < qi->qf_listcount)
+ qf_free(&qi->qf_lists[qi->qf_curlist]);
+ qf_update_buffer(qi, NULL);
+--- 6434,6440 ----
+
+ if (qfwin != NULL)
+ {
+! // If the quickfix/location list window is open, then clear it
+ if (qi->qf_curlist < qi->qf_listcount)
+ qf_free(&qi->qf_lists[qi->qf_curlist]);
+ qf_update_buffer(qi, NULL);
+***************
+*** 6524,6532 ****
+
+ if (wp != NULL && IS_LL_WINDOW(wp))
+ {
+! /* If in the location list window, then use the non-location list
+! * window with this location list (if present)
+! */
+ llwin = find_win_with_ll(qi);
+ if (llwin != NULL)
+ wp = llwin;
+--- 6442,6449 ----
+
+ if (wp != NULL && IS_LL_WINDOW(wp))
+ {
+! // If in the location list window, then use the non-location list
+! // window with this location list (if present)
+ llwin = find_win_with_ll(qi);
+ if (llwin != NULL)
+ wp = llwin;
+***************
+*** 6535,6551 ****
+ qf_free_all(wp);
+ if (wp == NULL)
+ {
+! /* quickfix list */
+ qi->qf_curlist = 0;
+ qi->qf_listcount = 0;
+ }
+ else if (IS_LL_WINDOW(orig_wp))
+ {
+! /* If the location list window is open, then create a new empty
+! * location list */
+ qf_info_T *new_ll = ll_new_list();
+
+! /* first free the list reference in the location list window */
+ ll_free_all(&orig_wp->w_llist_ref);
+
+ orig_wp->w_llist_ref = new_ll;
+--- 6452,6468 ----
+ qf_free_all(wp);
+ if (wp == NULL)
+ {
+! // quickfix list
+ qi->qf_curlist = 0;
+ qi->qf_listcount = 0;
+ }
+ else if (IS_LL_WINDOW(orig_wp))
+ {
+! // If the location list window is open, then create a new empty
+! // location list
+ qf_info_T *new_ll = ll_new_list();
+
+! // first free the list reference in the location list window
+ ll_free_all(&orig_wp->w_llist_ref);
+
+ orig_wp->w_llist_ref = new_ll;
+***************
+*** 6582,6588 ****
+
+ if (action == 'f')
+ {
+! /* Free the entire quickfix or location list stack */
+ qf_free_stack(wp, qi);
+ }
+ else if (what != NULL)
+--- 6499,6505 ----
+
+ if (action == 'f')
+ {
+! // Free the entire quickfix or location list stack
+ qf_free_stack(wp, qi);
+ }
+ else if (what != NULL)
+***************
+*** 6643,6652 ****
+ }
+ if (IS_LL_WINDOW(win) && (win->w_llist_ref->qf_refcount == 1))
+ {
+! /* In a location list window and none of the other windows is
+! * referring to this location list. Mark the location list
+! * context as still in use.
+! */
+ abort = mark_quickfix_ctx(win->w_llist_ref, copyID);
+ if (abort)
+ return abort;
+--- 6560,6568 ----
+ }
+ if (IS_LL_WINDOW(win) && (win->w_llist_ref->qf_refcount == 1))
+ {
+! // In a location list window and none of the other windows is
+! // referring to this location list. Mark the location list
+! // context as still in use.
+ abort = mark_quickfix_ctx(win->w_llist_ref, copyID);
+ if (abort)
+ return abort;
+***************
+*** 6694,6700 ****
+ #endif
+ }
+
+! /* Must come after autocommands. */
+ if (is_loclist_cmd(eap->cmdidx))
+ {
+ qi = ll_get_or_alloc_list(curwin);
+--- 6610,6616 ----
+ #endif
+ }
+
+! // Must come after autocommands.
+ if (is_loclist_cmd(eap->cmdidx))
+ {
+ qi = ll_get_or_alloc_list(curwin);
+***************
+*** 6807,6814 ****
+ wp = curwin;
+ }
+
+! /* Evaluate the expression. When the result is a string or a list we can
+! * use it to fill the errorlist. */
+ tv = eval_expr(eap->arg, NULL);
+ if (tv != NULL)
+ {
+--- 6723,6730 ----
+ wp = curwin;
+ }
+
+! // Evaluate the expression. When the result is a string or a list we can
+! // use it to fill the errorlist.
+ tv = eval_expr(eap->arg, NULL);
+ if (tv != NULL)
+ {
+***************
+*** 6854,6874 ****
+ win_T *wp;
+ qf_info_T *qi;
+
+! /* If the current window is a help window, then use it */
+ if (bt_help(curwin->w_buffer))
+ wp = curwin;
+ else
+! /* Find an existing help window */
+ wp = qf_find_help_win();
+
+! if (wp == NULL) /* Help window not found */
+ qi = NULL;
+ else
+ qi = wp->w_llist;
+
+ if (qi == NULL)
+ {
+! /* Allocate a new location list for help text matches */
+ if ((qi = ll_new_list()) == NULL)
+ return NULL;
+ *new_ll = TRUE;
+--- 6770,6790 ----
+ win_T *wp;
+ qf_info_T *qi;
+
+! // If the current window is a help window, then use it
+ if (bt_help(curwin->w_buffer))
+ wp = curwin;
+ else
+! // Find an existing help window
+ wp = qf_find_help_win();
+
+! if (wp == NULL) // Help window not found
+ qi = NULL;
+ else
+ qi = wp->w_llist;
+
+ if (qi == NULL)
+ {
+! // Allocate a new location list for help text matches
+ if ((qi = ll_new_list()) == NULL)
+ return NULL;
+ *new_ll = TRUE;
+***************
+*** 6901,6908 ****
+ {
+ char_u *line = IObuff;
+ #ifdef FEAT_MBYTE
+! /* Convert a line if 'encoding' is not utf-8 and
+! * the line contains a non-ASCII character. */
+ if (p_vc->vc_type != CONV_NONE
+ && has_non_ascii(IObuff))
+ {
+--- 6817,6824 ----
+ {
+ char_u *line = IObuff;
+ #ifdef FEAT_MBYTE
+! // Convert a line if 'encoding' is not utf-8 and
+! // the line contains a non-ASCII character.
+ if (p_vc->vc_type != CONV_NONE
+ && has_non_ascii(IObuff))
+ {
+***************
+*** 6916,6940 ****
+ {
+ int l = (int)STRLEN(line);
+
+! /* remove trailing CR, LF, spaces, etc. */
+ while (l > 0 && line[l - 1] <= ' ')
+ line[--l] = NUL;
+
+ if (qf_add_entry(qi,
+ qi->qf_curlist,
+! NULL, /* dir */
+ fname,
+ NULL,
+ 0,
+ line,
+ lnum,
+ (int)(p_regmatch->startp[0] - line)
+! + 1, /* col */
+! FALSE, /* vis_col */
+! NULL, /* search pattern */
+! 0, /* nr */
+! 1, /* type */
+! TRUE /* valid */
+ ) == FAIL)
+ {
+ got_int = TRUE;
+--- 6832,6856 ----
+ {
+ int l = (int)STRLEN(line);
+
+! // remove trailing CR, LF, spaces, etc.
+ while (l > 0 && line[l - 1] <= ' ')
+ line[--l] = NUL;
+
+ if (qf_add_entry(qi,
+ qi->qf_curlist,
+! NULL, // dir
+ fname,
+ NULL,
+ 0,
+ line,
+ lnum,
+ (int)(p_regmatch->startp[0] - line)
+! + 1, // col
+! FALSE, // vis_col
+! NULL, // search pattern
+! 0, // nr
+! 1, // type
+! TRUE // valid
+ ) == FAIL)
+ {
+ got_int = TRUE;
+***************
+*** 6976,6982 ****
+ char_u **fnames;
+ int fi;
+
+! /* Find all "*.txt" and "*.??x" files in the "doc" directory. */
+ add_pathsep(dirname);
+ STRCAT(dirname, "doc/*.\\(txt\\|??x\\)");
+ if (gen_expand_wildcards(1, &dirname, &fcount,
+--- 6892,6898 ----
+ char_u **fnames;
+ int fi;
+
+! // Find all "*.txt" and "*.??x" files in the "doc" directory.
+ add_pathsep(dirname);
+ STRCAT(dirname, "doc/*.\\(txt\\|??x\\)");
+ if (gen_expand_wildcards(1, &dirname, &fcount,
+***************
+*** 6986,6992 ****
+ for (fi = 0; fi < fcount && !got_int; ++fi)
+ {
+ #ifdef FEAT_MULTI_LANG
+! /* Skip files for a different language. */
+ if (lang != NULL
+ && STRNICMP(lang, fnames[fi]
+ + STRLEN(fnames[fi]) - 3, 2) != 0
+--- 6902,6908 ----
+ for (fi = 0; fi < fcount && !got_int; ++fi)
+ {
+ #ifdef FEAT_MULTI_LANG
+! // Skip files for a different language.
+ if (lang != NULL
+ && STRNICMP(lang, fnames[fi]
+ + STRLEN(fnames[fi]) - 3, 2) != 0
+***************
+*** 7020,7034 ****
+ #ifdef FEAT_MBYTE
+ vimconv_T vc;
+
+! /* Help files are in utf-8 or latin1, convert lines when 'encoding'
+! * differs. */
+ vc.vc_type = CONV_NONE;
+ if (!enc_utf8)
+ convert_setup(&vc, (char_u *)"utf-8", p_enc);
+ #endif
+
+
+! /* Go through all the directories in 'runtimepath' */
+ p = p_rtp;
+ while (*p != NUL && !got_int)
+ {
+--- 6936,6950 ----
+ #ifdef FEAT_MBYTE
+ vimconv_T vc;
+
+! // Help files are in utf-8 or latin1, convert lines when 'encoding'
+! // differs.
+ vc.vc_type = CONV_NONE;
+ if (!enc_utf8)
+ convert_setup(&vc, (char_u *)"utf-8", p_enc);
+ #endif
+
+
+! // Go through all the directories in 'runtimepath'
+ p = p_rtp;
+ while (*p != NUL && !got_int)
+ {
+***************
+*** 7124,7134 ****
+ apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name,
+ curbuf->b_fname, TRUE, curbuf);
+ if (!new_qi && IS_LL_STACK(qi) && qf_find_buf(qi) == NULL)
+! /* autocommands made "qi" invalid */
+ return;
+ }
+
+! /* Jump to first match. */
+ if (!qf_list_empty(qi, qi->qf_curlist))
+ qf_jump(qi, 0, 0, FALSE);
+ else
+--- 7040,7050 ----
+ apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name,
+ curbuf->b_fname, TRUE, curbuf);
+ if (!new_qi && IS_LL_STACK(qi) && qf_find_buf(qi) == NULL)
+! // autocommands made "qi" invalid
+ return;
+ }
+
+! // Jump to first match.
+ if (!qf_list_empty(qi, qi->qf_curlist))
+ qf_jump(qi, 0, 0, FALSE);
+ else
+*** ../vim-8.1.0460/src/version.c 2018-10-07 20:14:53.091279680 +0200
+--- src/version.c 2018-10-07 20:25:44.858426041 +0200
+***************
+*** 794,795 ****
+--- 794,797 ----
+ { /* Add new patch number below this line */
++ /**/
++ 461,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+169. You hire a housekeeper for your home page.
+
+ /// Bram Moolenaar -- Bram@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 ///