diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-08-17 14:38:55 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-08-17 14:38:55 +0200 |
commit | 4ad62155a1015751a6645aaecd94b02c94c8934b (patch) | |
tree | 72d2dab4221986c394ca9f444dfe86cfabe51cfe /src/buffer.c | |
parent | 69cbbecf548f390197259ca30cfe147c3e59ce5a (diff) |
patch 8.1.1869: code for the argument list is spread outv8.1.1869
Problem: Code for the argument list is spread out.
Solution: Put argument list code in arglist.c. (Yegappan Lakshmanan,
closes #4819)
Diffstat (limited to 'src/buffer.c')
-rw-r--r-- | src/buffer.c | 301 |
1 files changed, 0 insertions, 301 deletions
diff --git a/src/buffer.c b/src/buffer.c index 3251e37d6a..274dc67bba 100644 --- a/src/buffer.c +++ b/src/buffer.c @@ -4875,307 +4875,6 @@ fname_expand( } /* - * Get the file name for an argument list entry. - */ - char_u * -alist_name(aentry_T *aep) -{ - buf_T *bp; - - /* Use the name from the associated buffer if it exists. */ - bp = buflist_findnr(aep->ae_fnum); - if (bp == NULL || bp->b_fname == NULL) - return aep->ae_fname; - return bp->b_fname; -} - -/* - * do_arg_all(): Open up to 'count' windows, one for each argument. - */ - void -do_arg_all( - int count, - int forceit, /* hide buffers in current windows */ - int keep_tabs) /* keep current tabs, for ":tab drop file" */ -{ - int i; - win_T *wp, *wpnext; - char_u *opened; /* Array of weight for which args are open: - * 0: not opened - * 1: opened in other tab - * 2: opened in curtab - * 3: opened in curtab and curwin - */ - int opened_len; /* length of opened[] */ - int use_firstwin = FALSE; /* use first window for arglist */ - int split_ret = OK; - int p_ea_save; - alist_T *alist; /* argument list to be used */ - buf_T *buf; - tabpage_T *tpnext; - int had_tab = cmdmod.tab; - win_T *old_curwin, *last_curwin; - tabpage_T *old_curtab, *last_curtab; - win_T *new_curwin = NULL; - tabpage_T *new_curtab = NULL; - - if (ARGCOUNT <= 0) - { - /* Don't give an error message. We don't want it when the ":all" - * command is in the .vimrc. */ - return; - } - setpcmark(); - - opened_len = ARGCOUNT; - opened = alloc_clear(opened_len); - if (opened == NULL) - return; - - /* Autocommands may do anything to the argument list. Make sure it's not - * freed while we are working here by "locking" it. We still have to - * watch out for its size to be changed. */ - alist = curwin->w_alist; - ++alist->al_refcount; - - old_curwin = curwin; - old_curtab = curtab; - -# ifdef FEAT_GUI - need_mouse_correct = TRUE; -# endif - - /* - * Try closing all windows that are not in the argument list. - * Also close windows that are not full width; - * When 'hidden' or "forceit" set the buffer becomes hidden. - * Windows that have a changed buffer and can't be hidden won't be closed. - * When the ":tab" modifier was used do this for all tab pages. - */ - if (had_tab > 0) - goto_tabpage_tp(first_tabpage, TRUE, TRUE); - for (;;) - { - tpnext = curtab->tp_next; - for (wp = firstwin; wp != NULL; wp = wpnext) - { - wpnext = wp->w_next; - buf = wp->w_buffer; - if (buf->b_ffname == NULL - || (!keep_tabs && (buf->b_nwindows > 1 - || wp->w_width != Columns))) - i = opened_len; - else - { - /* check if the buffer in this window is in the arglist */ - for (i = 0; i < opened_len; ++i) - { - if (i < alist->al_ga.ga_len - && (AARGLIST(alist)[i].ae_fnum == buf->b_fnum - || fullpathcmp(alist_name(&AARGLIST(alist)[i]), - buf->b_ffname, TRUE, TRUE) & FPC_SAME)) - { - int weight = 1; - - if (old_curtab == curtab) - { - ++weight; - if (old_curwin == wp) - ++weight; - } - - if (weight > (int)opened[i]) - { - opened[i] = (char_u)weight; - if (i == 0) - { - if (new_curwin != NULL) - new_curwin->w_arg_idx = opened_len; - new_curwin = wp; - new_curtab = curtab; - } - } - else if (keep_tabs) - i = opened_len; - - if (wp->w_alist != alist) - { - /* Use the current argument list for all windows - * containing a file from it. */ - alist_unlink(wp->w_alist); - wp->w_alist = alist; - ++wp->w_alist->al_refcount; - } - break; - } - } - } - wp->w_arg_idx = i; - - if (i == opened_len && !keep_tabs)/* close this window */ - { - if (buf_hide(buf) || forceit || buf->b_nwindows > 1 - || !bufIsChanged(buf)) - { - /* If the buffer was changed, and we would like to hide it, - * try autowriting. */ - if (!buf_hide(buf) && buf->b_nwindows <= 1 - && bufIsChanged(buf)) - { - bufref_T bufref; - - set_bufref(&bufref, buf); - - (void)autowrite(buf, FALSE); - - /* check if autocommands removed the window */ - if (!win_valid(wp) || !bufref_valid(&bufref)) - { - wpnext = firstwin; /* start all over... */ - continue; - } - } - /* don't close last window */ - if (ONE_WINDOW - && (first_tabpage->tp_next == NULL || !had_tab)) - use_firstwin = TRUE; - else - { - win_close(wp, !buf_hide(buf) && !bufIsChanged(buf)); - - /* check if autocommands removed the next window */ - if (!win_valid(wpnext)) - wpnext = firstwin; /* start all over... */ - } - } - } - } - - /* Without the ":tab" modifier only do the current tab page. */ - if (had_tab == 0 || tpnext == NULL) - break; - - /* check if autocommands removed the next tab page */ - if (!valid_tabpage(tpnext)) - tpnext = first_tabpage; /* start all over...*/ - - goto_tabpage_tp(tpnext, TRUE, TRUE); - } - - /* - * Open a window for files in the argument list that don't have one. - * ARGCOUNT may change while doing this, because of autocommands. - */ - if (count > opened_len || count <= 0) - count = opened_len; - - /* Don't execute Win/Buf Enter/Leave autocommands here. */ - ++autocmd_no_enter; - ++autocmd_no_leave; - last_curwin = curwin; - last_curtab = curtab; - win_enter(lastwin, FALSE); - /* ":drop all" should re-use an empty window to avoid "--remote-tab" - * leaving an empty tab page when executed locally. */ - if (keep_tabs && BUFEMPTY() && curbuf->b_nwindows == 1 - && curbuf->b_ffname == NULL && !curbuf->b_changed) - use_firstwin = TRUE; - - for (i = 0; i < count && i < opened_len && !got_int; ++i) - { - if (alist == &global_alist && i == global_alist.al_ga.ga_len - 1) - arg_had_last = TRUE; - if (opened[i] > 0) - { - /* Move the already present window to below the current window */ - if (curwin->w_arg_idx != i) - { - for (wpnext = firstwin; wpnext != NULL; wpnext = wpnext->w_next) - { - if (wpnext->w_arg_idx == i) - { - if (keep_tabs) - { - new_curwin = wpnext; - new_curtab = curtab; - } - else if (wpnext->w_frame->fr_parent - != curwin->w_frame->fr_parent) - { - emsg(_("E249: window layout changed unexpectedly")); - i = count; - break; - } - else - win_move_after(wpnext, curwin); - break; - } - } - } - } - else if (split_ret == OK) - { - if (!use_firstwin) /* split current window */ - { - p_ea_save = p_ea; - p_ea = TRUE; /* use space from all windows */ - split_ret = win_split(0, WSP_ROOM | WSP_BELOW); - p_ea = p_ea_save; - if (split_ret == FAIL) - continue; - } - else /* first window: do autocmd for leaving this buffer */ - --autocmd_no_leave; - - /* - * edit file "i" - */ - curwin->w_arg_idx = i; - if (i == 0) - { - new_curwin = curwin; - new_curtab = curtab; - } - (void)do_ecmd(0, alist_name(&AARGLIST(alist)[i]), NULL, NULL, - ECMD_ONE, - ((buf_hide(curwin->w_buffer) - || bufIsChanged(curwin->w_buffer)) ? ECMD_HIDE : 0) - + ECMD_OLDBUF, curwin); - if (use_firstwin) - ++autocmd_no_leave; - use_firstwin = FALSE; - } - ui_breakcheck(); - - /* When ":tab" was used open a new tab for a new window repeatedly. */ - if (had_tab > 0 && tabpage_index(NULL) <= p_tpm) - cmdmod.tab = 9999; - } - - /* Remove the "lock" on the argument list. */ - alist_unlink(alist); - - --autocmd_no_enter; - - /* restore last referenced tabpage's curwin */ - if (last_curtab != new_curtab) - { - if (valid_tabpage(last_curtab)) - goto_tabpage_tp(last_curtab, TRUE, TRUE); - if (win_valid(last_curwin)) - win_enter(last_curwin, FALSE); - } - /* to window with first arg */ - if (valid_tabpage(new_curtab)) - goto_tabpage_tp(new_curtab, TRUE, TRUE); - if (win_valid(new_curwin)) - win_enter(new_curwin, FALSE); - - --autocmd_no_leave; - vim_free(opened); -} - -/* * Open a window for a number of buffers. */ void |