diff options
Diffstat (limited to 'src/quickfix.c')
-rw-r--r-- | src/quickfix.c | 139 |
1 files changed, 92 insertions, 47 deletions
diff --git a/src/quickfix.c b/src/quickfix.c index 7136b7eff..f9278a2f0 100644 --- a/src/quickfix.c +++ b/src/quickfix.c @@ -954,19 +954,21 @@ qf_add_entry(qi, prevp, dir, fname, mesg, lnum, col, vis_col, pattern, nr, type, } /* - * Allocate a new location list for window 'wp' + * Allocate a new location list */ - static int -ll_new_list(wp) - win_T *wp; + static qf_info_T * +ll_new_list() { - if ((wp->w_llist = (qf_info_T *)alloc((unsigned)sizeof(qf_info_T))) == NULL) - return FAIL; + qf_info_T *qi; - vim_memset(wp->w_llist, 0, (size_t)(sizeof(qf_info_T))); - wp->w_llist->qf_refcount++; + qi = (qf_info_T *)alloc((unsigned)sizeof(qf_info_T)); + if (qi != NULL) + { + vim_memset(qi, 0, (size_t)(sizeof(qf_info_T))); + qi->qf_refcount++; + } - return OK; + return qi; } /* @@ -988,8 +990,7 @@ ll_get_or_alloc_list(wp) ll_free_all(&wp->w_llist_ref); if (wp->w_llist == NULL) - if (ll_new_list(wp) == FAIL) /* new location list */ - return NULL; + wp->w_llist = ll_new_list(); /* new location list */ return wp->w_llist; } @@ -1018,7 +1019,8 @@ copy_loclist(from, to) if (qi == NULL) /* no location list to copy */ return; - if (ll_new_list(to) == FAIL) /* allocate a new location list */ + /* allocate a new location list */ + if ((to->w_llist = ll_new_list()) == NULL) return; to->w_llist->qf_listcount = qi->qf_listcount; @@ -1331,13 +1333,12 @@ qf_guess_filepath(filename) * else go to entry "errornr" */ void -qf_jump(winptr, dir, errornr, forceit) - win_T *winptr; +qf_jump(qi, dir, errornr, forceit) + qf_info_T *qi; int dir; int errornr; int forceit; { - qf_info_T *qi = &ql_info; qf_info_T *ll_ref; qfline_T *qf_ptr; qfline_T *old_qf_ptr; @@ -1367,8 +1368,8 @@ qf_jump(winptr, dir, errornr, forceit) int ok = OK; int usable_win; - if (winptr != NULL) - qi = GET_LOC_LIST(winptr); + if (qi == NULL) + qi = &ql_info; if (qi->qf_curlist >= qi->qf_listcount || qi->qf_lists[qi->qf_curlist].qf_count == 0) @@ -1494,6 +1495,14 @@ qf_jump(winptr, dir, errornr, forceit) if (curwin->w_height < p_hh) win_setheight((int)p_hh); + + if (qi != &ql_info) /* not a quickfix list */ + { + /* The new window should use the supplied location list */ + qf_free_all(curwin); + curwin->w_llist = qi; + qi->qf_refcount++; + } } if (!p_im) @@ -2583,7 +2592,7 @@ ex_make(eap) char_u *cmd; unsigned len; win_T *wp = NULL; - qf_info_T *qi; + qf_info_T *qi = &ql_info; #ifdef FEAT_AUTOCMD char_u *au_name = NULL; @@ -2667,7 +2676,7 @@ ex_make(eap) (eap->cmdidx != CMD_grepadd && eap->cmdidx != CMD_lgrepadd)) > 0 && !eap->forceit) - qf_jump(wp, 0, 0, FALSE); /* display first error */ + qf_jump(qi, 0, 0, FALSE); /* display first error */ mch_remove(fname); vim_free(fname); @@ -2745,11 +2754,12 @@ get_mef_name() ex_cc(eap) exarg_T *eap; { - win_T *wp = NULL; - qf_info_T *qi; + qf_info_T *qi = &ql_info; - if (eap->cmdidx == CMD_ll || eap->cmdidx == CMD_lrewind - || eap->cmdidx == CMD_lfirst || eap->cmdidx == CMD_llast) + if (eap->cmdidx == CMD_ll + || eap->cmdidx == CMD_lrewind + || eap->cmdidx == CMD_lfirst + || eap->cmdidx == CMD_llast) { qi = GET_LOC_LIST(curwin); if (qi == NULL) @@ -2757,10 +2767,9 @@ ex_cc(eap) EMSG(_(e_loclist)); return; } - wp = curwin; } - qf_jump(wp, 0, + qf_jump(qi, 0, eap->addr_count > 0 ? (int)eap->line2 : (eap->cmdidx == CMD_cc || eap->cmdidx == CMD_ll) @@ -2780,12 +2789,14 @@ ex_cc(eap) ex_cnext(eap) exarg_T *eap; { - win_T *wp = NULL; - qf_info_T *qi; + qf_info_T *qi = &ql_info; - if (eap->cmdidx == CMD_lnext || eap->cmdidx == CMD_lNext - || eap->cmdidx == CMD_lprevious || eap->cmdidx == CMD_lnfile - || eap->cmdidx == CMD_lNfile || eap->cmdidx == CMD_lpfile) + if (eap->cmdidx == CMD_lnext + || eap->cmdidx == CMD_lNext + || eap->cmdidx == CMD_lprevious + || eap->cmdidx == CMD_lnfile + || eap->cmdidx == CMD_lNfile + || eap->cmdidx == CMD_lpfile) { qi = GET_LOC_LIST(curwin); if (qi == NULL) @@ -2793,10 +2804,9 @@ ex_cnext(eap) EMSG(_(e_loclist)); return; } - wp = curwin; } - qf_jump(wp, (eap->cmdidx == CMD_cnext || eap->cmdidx == CMD_lnext) + qf_jump(qi, (eap->cmdidx == CMD_cnext || eap->cmdidx == CMD_lnext) ? FORWARD : (eap->cmdidx == CMD_cnfile || eap->cmdidx == CMD_lnfile) ? FORWARD_FILE @@ -2816,7 +2826,7 @@ ex_cfile(eap) exarg_T *eap; { win_T *wp = NULL; - qf_info_T *qi; + qf_info_T *qi = &ql_info; if (eap->cmdidx == CMD_lfile || eap->cmdidx == CMD_lgetfile || eap->cmdidx == CMD_laddfile) @@ -2844,7 +2854,7 @@ ex_cfile(eap) && eap->cmdidx != CMD_laddfile)) > 0 && (eap->cmdidx == CMD_cfile || eap->cmdidx == CMD_lfile)) - qf_jump(wp, 0, 0, eap->forceit); /* display first error */ + qf_jump(qi, 0, 0, eap->forceit); /* display first error */ } /* @@ -2865,7 +2875,6 @@ ex_vimgrep(eap) int fi; qf_info_T *qi = &ql_info; qfline_T *prevp = NULL; - win_T *wp = NULL; long lnum; buf_T *buf; int duplicate_name = FALSE; @@ -2899,13 +2908,14 @@ ex_vimgrep(eap) } #endif - if (eap->cmdidx == CMD_grep || eap->cmdidx == CMD_lvimgrep - || eap->cmdidx == CMD_lgrepadd || eap->cmdidx == CMD_lvimgrepadd) + if (eap->cmdidx == CMD_grep + || eap->cmdidx == CMD_lvimgrep + || eap->cmdidx == CMD_lgrepadd + || eap->cmdidx == CMD_lvimgrepadd) { qi = ll_get_or_alloc_list(curwin); if (qi == NULL) return; - wp = curwin; } /* Get the search pattern: either white-separated or enclosed in // */ @@ -3105,7 +3115,7 @@ ex_vimgrep(eap) if (qi->qf_lists[qi->qf_curlist].qf_count > 0) { if ((flags & VGR_NOJUMP) == 0) - qf_jump(wp, 0, 0, eap->forceit); + qf_jump(qi, 0, 0, eap->forceit); } else EMSG2(_(e_nomatch2), s); @@ -3376,14 +3386,14 @@ set_errorlist(wp, list, action) if (d == NULL) continue; - filename = get_dict_string(d, (char_u *)"filename"); + filename = get_dict_string(d, (char_u *)"filename", TRUE); lnum = get_dict_number(d, (char_u *)"lnum"); col = get_dict_number(d, (char_u *)"col"); vcol = get_dict_number(d, (char_u *)"vcol"); nr = get_dict_number(d, (char_u *)"nr"); - type = get_dict_string(d, (char_u *)"type"); - pattern = get_dict_string(d, (char_u *)"pattern"); - text = get_dict_string(d, (char_u *)"text"); + type = get_dict_string(d, (char_u *)"type", TRUE); + pattern = get_dict_string(d, (char_u *)"pattern", TRUE); + text = get_dict_string(d, (char_u *)"text", TRUE); if (text == NULL) text = vim_strsave((char_u *)""); @@ -3484,14 +3494,12 @@ ex_cexpr(eap) { typval_T *tv; qf_info_T *qi = &ql_info; - win_T *wp = NULL; if (eap->cmdidx == CMD_lexpr || eap->cmdidx == CMD_laddexpr) { qi = ll_get_or_alloc_list(curwin); if (qi == NULL) return; - wp = curwin; } /* Evaluate the expression. When the result is a string or a list we can @@ -3507,7 +3515,7 @@ ex_cexpr(eap) || eap->cmdidx == CMD_lexpr), (linenr_T)0, (linenr_T)0) > 0 && (eap->cmdidx == CMD_cexpr || eap->cmdidx == CMD_lexpr)) - qf_jump(wp, 0, 0, eap->forceit); /* display first error */ + qf_jump(qi, 0, 0, eap->forceit); /* display first error */ } else EMSG(_("E777: String or List expected")); @@ -3536,6 +3544,8 @@ ex_helpgrep(eap) char_u *lang; #endif qf_info_T *qi = &ql_info; + int new_qi = FALSE; + win_T *wp; /* Make 'cpoptions' empty, the 'l' flag should not be used here. */ save_cpo = p_cpo; @@ -3546,6 +3556,27 @@ ex_helpgrep(eap) lang = check_help_lang(eap->arg); #endif + if (eap->cmdidx == CMD_lhelpgrep) + { + /* Find an existing help window */ + FOR_ALL_WINDOWS(wp) + if (wp->w_buffer != NULL && wp->w_buffer->b_help) + break; + + 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; + new_qi = TRUE; + } + } + regmatch.regprog = vim_regcomp(eap->arg, RE_MAGIC + RE_STRING); regmatch.rm_ic = FALSE; if (regmatch.regprog != NULL) @@ -3635,9 +3666,23 @@ ex_helpgrep(eap) /* Jump to first match. */ if (qi->qf_lists[qi->qf_curlist].qf_count > 0) - qf_jump(NULL, 0, 0, FALSE); + qf_jump(qi, 0, 0, FALSE); else EMSG2(_(e_nomatch2), eap->arg); + + if (eap->cmdidx == CMD_lhelpgrep) + { + /* If the help window is not opened or if it already points to the + * correct location list, then free the new location list + */ + if (!curwin->w_buffer->b_help || curwin->w_llist == qi) + { + if (new_qi) + ll_free_all(&qi); + } + else if (curwin->w_llist == NULL) + curwin->w_llist = qi; + } } #endif /* FEAT_QUICKFIX */ |