vim-patch:7.4.2231

Problem:    ":oldfiles" output is a very long list.
Solution:   Add a pattern argument. (Coot, closes vim/vim#575)

e11d61a3b1
This commit is contained in:
James McCoy
2017-04-28 21:04:17 -04:00
parent 0df1b6655b
commit dbdc2d40bb
5 changed files with 80 additions and 49 deletions

View File

@@ -1182,12 +1182,21 @@ running) you have additional options:
*:o* *:ol* *:oldfiles* *:o* *:ol* *:oldfiles*
:o[ldfiles] List the files that have marks stored in the ShaDa :o[ldfiles] List the files that have marks stored in the ShaDa
file. This list is read on startup and only changes file. This list is read on startup and only changes
afterwards with ":rshada!". Also see |v:oldfiles|. afterwards with `:rshada!`. Also see |v:oldfiles|.
The number can be used with |c_#<|. The number can be used with |c_#<|.
The output can be filtered with |:filter|, e.g.: > The output can be filtered with |:filter|, e.g.: >
filter /\.vim/ oldfiles filter /\.vim/ oldfiles
< The filtering happens on the file name. < The filtering happens on the file name.
:ol[dfiles] {pat}
:ol[dfiles] /{pat}/
Like `:oldfiles` but only files matching {pat} will
be included. {pat} is a Vim search pattern. Instead
of enclosing it in / any non-ID character (see
|'isident'|) can be used, so long as it does not
appear in {pat}. Without the enclosing character the
pattern cannot include the bar character.
:bro[wse] o[ldfiles][!] :bro[wse] o[ldfiles][!]
List file names as with |:oldfiles|, and then prompt List file names as with |:oldfiles|, and then prompt
for a number. When the number is valid that file from for a number. When the number is valid that file from

View File

@@ -21779,52 +21779,6 @@ void last_set_msg(scid_T scriptID)
} }
} }
/*
* List v:oldfiles in a nice way.
*/
void ex_oldfiles(exarg_T *eap)
{
list_T *l = get_vim_var_list(VV_OLDFILES);
listitem_T *li;
long nr = 0;
if (l == NULL)
msg((char_u *)_("No old files"));
else {
msg_start();
msg_scroll = TRUE;
for (li = l->lv_first; li != NULL && !got_int; li = li->li_next) {
msg_outnum(++nr);
MSG_PUTS(": ");
msg_outtrans((char_u *)tv_get_string(&li->li_tv));
msg_clr_eos();
msg_putchar('\n');
ui_flush(); /* output one line at a time */
os_breakcheck();
}
/* Assume "got_int" was set to truncate the listing. */
got_int = FALSE;
// File selection prompt on ":browse oldfiles"
if (cmdmod.browse) {
quit_more = false;
nr = prompt_for_number(false);
msg_starthere();
if (nr > 0 && nr <= l->lv_len) {
const char *const p = tv_list_find_str(l, nr - 1);
if (p == NULL) {
return;
}
char *const s = (char *)expand_env_save((char_u *)p);
eap->arg = (char_u *)s;
eap->cmdidx = CMD_edit;
do_exedit(eap, NULL);
xfree(s);
}
}
}
}
// reset v:option_new, v:option_old and v:option_type // reset v:option_new, v:option_old and v:option_type
void reset_v_option_vars(void) void reset_v_option_vars(void)
{ {

View File

@@ -6158,3 +6158,71 @@ void ex_substitute(exarg_T *eap)
ga_clear(&save_view); ga_clear(&save_view);
unblock_autocmds(); unblock_autocmds();
} }
/// List v:oldfiles in a nice way.
void ex_oldfiles(exarg_T *eap)
{
list_T *l = get_vim_var_list(VV_OLDFILES);
listitem_T *li;
long nr = 0;
if (l == NULL) {
msg((char_u *)_("No old files"));
} else {
char_u *reg_pat = NULL;
regmatch_T regmatch;
if (*eap->arg != NUL) {
if (skip_vimgrep_pat(eap->arg, &reg_pat, NULL) == NULL) {
EMSG(_(e_invalpat));
return;
}
regmatch.regprog = vim_regcomp(reg_pat, p_magic ? RE_MAGIC : 0);
if (regmatch.regprog == NULL) {
return;
}
}
msg_start();
msg_scroll = TRUE;
for (li = l->lv_first; li != NULL && !got_int; li = li->li_next) {
nr++;
const char *fname = tv_get_string(&li->li_tv);
if (reg_pat == NULL || *reg_pat == NUL
|| vim_regexec(&regmatch, (char_u *)fname, (colnr_T)0)) {
msg_outnum(nr);
MSG_PUTS(": ");
msg_outtrans((char_u *)tv_get_string(&li->li_tv));
msg_clr_eos();
msg_putchar('\n');
ui_flush(); // output one line at a time
os_breakcheck();
}
}
if (*eap->arg != NUL) {
vim_regfree(regmatch.regprog);
}
/* Assume "got_int" was set to truncate the listing. */
got_int = FALSE;
// File selection prompt on ":browse oldfiles"
if (cmdmod.browse) {
quit_more = false;
nr = prompt_for_number(false);
msg_starthere();
if (nr > 0 && nr <= l->lv_len) {
const char *const p = tv_list_find_str(l, nr - 1);
if (p == NULL) {
return;
}
char *const s = (char *)expand_env_save((char_u *)p);
eap->arg = (char_u *)s;
eap->cmdidx = CMD_edit;
cmdmod.browse = false;
do_exedit(eap, NULL);
xfree(s);
}
}
}
}

View File

@@ -1810,7 +1810,7 @@ return {
}, },
{ {
command='oldfiles', command='oldfiles',
flags=bit.bor(BANG, TRLBAR, SBOXOK, CMDWIN), flags=bit.bor(BANG, TRLBAR, NOTADR, EXTRA, SBOXOK, CMDWIN),
addr_type=ADDR_LINES, addr_type=ADDR_LINES,
func='ex_oldfiles', func='ex_oldfiles',
}, },

View File

@@ -213,7 +213,7 @@ static const int included_patches[] = {
// 2234 NA // 2234 NA
2233, 2233,
// 2232 NA // 2232 NA
// 2231, 2231,
2230, 2230,
// 2229, // 2229,
2228, 2228,