diff options
-rw-r--r-- | runtime/doc/starting.txt | 3 | ||||
-rw-r--r-- | runtime/doc/vim_diff.txt | 1 | ||||
-rw-r--r-- | src/nvim/eval.c | 23 | ||||
-rw-r--r-- | test/functional/ex_cmds/oldfiles_spec.lua | 49 |
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) |