aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/doc/starting.txt3
-rw-r--r--runtime/doc/vim_diff.txt1
-rw-r--r--src/nvim/eval.c23
-rw-r--r--test/functional/ex_cmds/oldfiles_spec.lua49
4 files changed, 72 insertions, 4 deletions
diff --git a/runtime/doc/starting.txt b/runtime/doc/starting.txt
index 41b4d22cf1..6e72f0cf6b 100644
--- a/runtime/doc/starting.txt
+++ b/runtime/doc/starting.txt
@@ -1164,10 +1164,11 @@ running) you have additional options:
:wv[iminfo][!] [file] Deprecated alias to |:wshada| command.
*: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
afterwards with ":rshada!". Also see |v:oldfiles|.
The number can be used with |c_#<|.
+ Use ! to get a file selection prompt.
:bro[wse] o[ldfiles][!]
List file names as with |:oldfiles|, and then prompt
diff --git a/runtime/doc/vim_diff.txt b/runtime/doc/vim_diff.txt
index b0b6d6df6e..b8de17738a 100644
--- a/runtime/doc/vim_diff.txt
+++ b/runtime/doc/vim_diff.txt
@@ -106,6 +106,7 @@ Additional differences:
compatibility reasons.
- |:wviminfo| was renamed to |:wshada|, |:rviminfo| to |:rshada|. Old
commands are still kept.
+- |:oldfiles| supports !.
- When writing (|:wshada| without bang or at exit) it merges much more data,
and does this according to the timestamp. Vim merges only marks.
|shada-merging|
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index 045d513a4a..e1fa76c526 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -21208,9 +21208,9 @@ void last_set_msg(scid_T scriptID)
*/
void ex_oldfiles(exarg_T *eap)
{
- list_T *l = vimvars[VV_OLDFILES].vv_list;
+ list_T *l = get_vim_var_list(VV_OLDFILES);
listitem_T *li;
- int nr = 0;
+ long nr = 0;
if (l == NULL)
msg((char_u *)_("No old files"));
@@ -21218,7 +21218,7 @@ void ex_oldfiles(exarg_T *eap)
msg_start();
msg_scroll = TRUE;
for (li = l->lv_first; li != NULL && !got_int; li = li->li_next) {
- msg_outnum((long)++nr);
+ msg_outnum(++nr);
MSG_PUTS(": ");
msg_outtrans(get_tv_string(&li->li_tv));
msg_putchar('\n');
@@ -21228,6 +21228,23 @@ void ex_oldfiles(exarg_T *eap)
/* Assume "got_int" was set to truncate the listing. */
got_int = FALSE;
+ // File selection prompt on ":oldfiles!"
+ if (eap->forceit) {
+ quit_more = false;
+ nr = prompt_for_number(false);
+ msg_starthere();
+ if (nr > 0 && nr <= l->lv_len) {
+ char_u *p = list_find_str(l, nr);
+ if (p == NULL) {
+ return;
+ }
+ p = expand_env_save(p);
+ eap->arg = p;
+ eap->cmdidx = CMD_edit;
+ do_exedit(eap, NULL);
+ xfree(p);
+ }
+ }
}
}
diff --git a/test/functional/ex_cmds/oldfiles_spec.lua b/test/functional/ex_cmds/oldfiles_spec.lua
new file mode 100644
index 0000000000..fedf5babe8
--- /dev/null
+++ b/test/functional/ex_cmds/oldfiles_spec.lua
@@ -0,0 +1,49 @@
+local h = require('test.functional.helpers')
+
+local buf = h.curbufmeths
+local command = h.command
+local eq = h.eq
+local execute = h.execute
+local feed = h.feed
+local nvim = h.nvim
+
+local shada_file = 'test.shada'
+
+-- h.clear() uses "-i NONE", which is not useful for this test.
+local function clear()
+ if session then
+ session:exit(0)
+ end
+ h.set_session(h.spawn({h.nvim_prog,
+ '-u', 'NONE',
+ '--cmd', 'set noswapfile undodir=. directory=. viewdir=. backupdir=.',
+ '--embed'}))
+end
+
+describe(':oldfiles', function()
+ before_each(clear)
+
+ it('shows most recently used files', function()
+ command('edit testfile1')
+ command('edit testfile2')
+ command('wshada ' .. shada_file)
+ command('rshada! ' .. shada_file)
+ assert(string.find(nvim('command_output', 'oldfiles'), 'testfile2'))
+ os.remove(shada_file)
+ end)
+end)
+
+describe(':oldfiles!', function()
+ it('provides a file selection prompt and edits the chosen file', function()
+ command('edit testfile1')
+ command('edit testfile2')
+ local filename = buf.get_name()
+ command('wshada ' .. shada_file)
+ clear()
+ command('rshada! ' .. shada_file)
+ execute('oldfiles!')
+ feed('2<cr>')
+ eq(filename, buf.get_name())
+ os.remove(shada_file)
+ end)
+end)