Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added command line completion for :diffget and :diffput #5409

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions runtime/doc/eval.txt
Expand Up @@ -5058,6 +5058,7 @@ getcompletion({pat}, {type} [, {filtered}]) *getcompletion()*
command Ex command (and arguments)
compiler compilers
cscope |:cscope| suboptions
diff_buffer |:diffget| and |:diffput| completion
dir directory names
environment environment variable names
event autocommand events
Expand Down
9 changes: 9 additions & 0 deletions src/buffer.c
Expand Up @@ -2702,6 +2702,15 @@ ExpandBufnames(
{
if (!buf->b_p_bl) // skip unlisted buffers
continue;
#ifdef FEAT_DIFF
if (options & BUF_DIFF_FILTER)
// Skip buffers not suitable for
// :diffget or :diffput completion.
if (buf == curbuf
|| !diff_mode_buf(curbuf) || !diff_mode_buf(buf))
continue;
#endif

p = buflist_match(&regmatch, buf, p_wic);
if (p != NULL)
{
Expand Down
14 changes: 13 additions & 1 deletion src/cmdexpand.c
Expand Up @@ -1582,7 +1582,15 @@ set_one_cmd_context(
xp->xp_context = EXPAND_BUFFERS;
xp->xp_pattern = arg;
break;

#ifdef FEAT_DIFF
case CMD_diffget:
case CMD_diffput:
// If current buffer is in diff mode, complete buffer names
// which are in diff mode, and different than current buffer.
xp->xp_context = EXPAND_DIFF_BUFFERS;
xp->xp_pattern = arg;
break;
#endif
case CMD_USER:
case CMD_USER_BUF:
if (compl != EXPAND_NOTHING)
Expand Down Expand Up @@ -2069,6 +2077,10 @@ ExpandFromContext(
return ExpandOldSetting(num_file, file);
if (xp->xp_context == EXPAND_BUFFERS)
return ExpandBufnames(pat, num_file, file, options);
#ifdef FEAT_DIFF
if (xp->xp_context == EXPAND_DIFF_BUFFERS)
return ExpandBufnames(pat, num_file, file, options | BUF_DIFF_FILTER);
#endif
if (xp->xp_context == EXPAND_TAGS
|| xp->xp_context == EXPAND_TAGS_LISTFILES)
return expand_tags(xp->xp_context == EXPAND_TAGS, pat, num_file, file);
Expand Down
40 changes: 40 additions & 0 deletions src/testdir/test_diffmode.vim
Expand Up @@ -242,6 +242,46 @@ func Test_diffput_two()
bwipe! b
endfunc

func Test_diffget_diffput_completion()
new Xdiff1 | diffthis
new Xdiff2 | diffthis
new Xdiff3 | diffthis
new Xdiff4

" :diffput and :diffget completes names of buffers which
" are in diff mode and which are different then current buffer.
b Xdiff1
call feedkeys(":diffput \<C-A>\<C-B>\"\<CR>", 'tx')
call assert_equal('"diffput Xdiff2 Xdiff3', @:)
call feedkeys(":diffget \<C-A>\<C-B>\"\<CR>", 'tx')
call assert_equal('"diffget Xdiff2 Xdiff3', @:)
call assert_equal(['Xdiff2', 'Xdiff3'], getcompletion('', 'diff_buffer'))

b Xdiff2
call feedkeys(":diffput \<C-A>\<C-B>\"\<CR>", 'tx')
call assert_equal('"diffput Xdiff1 Xdiff3', @:)
call feedkeys(":diffget \<C-A>\<C-B>\"\<CR>", 'tx')
call assert_equal('"diffget Xdiff1 Xdiff3', @:)
call assert_equal(['Xdiff1', 'Xdiff3'], getcompletion('', 'diff_buffer'))

b Xdiff3
call feedkeys(":diffput \<C-A>\<C-B>\"\<CR>", 'tx')
call assert_equal('"diffput Xdiff1 Xdiff2', @:)
call feedkeys(":diffget \<C-A>\<C-B>\"\<CR>", 'tx')
call assert_equal('"diffget Xdiff1 Xdiff2', @:)
call assert_equal(['Xdiff1', 'Xdiff2'], getcompletion('', 'diff_buffer'))

" No completion when in Xdiff4, it's not in diff mode.
b Xdiff4
call feedkeys(":diffput \<C-A>\<C-B>\"\<CR>", 'tx')
call assert_equal('"diffput ', @:)
call feedkeys(":diffget \<C-A>\<C-B>\"\<CR>", 'tx')
call assert_equal('"diffget ', @:)
call assert_equal([], getcompletion('', 'diff_buffer'))

%bwipe
endfunc

func Test_dp_do_buffer()
e! one
let bn1=bufnr('%')
Expand Down
1 change: 1 addition & 0 deletions src/usercmd.c
Expand Up @@ -57,6 +57,7 @@ static struct
{EXPAND_USER_DEFINED, "custom"},
{EXPAND_USER_LIST, "customlist"},
#endif
{EXPAND_DIFF_BUFFERS, "diff_buffer"},
{EXPAND_DIRECTORIES, "dir"},
{EXPAND_ENV_VARS, "environment"},
{EXPAND_EVENTS, "event"},
Expand Down
2 changes: 2 additions & 0 deletions src/vim.h
Expand Up @@ -801,6 +801,7 @@ extern int (*dyn_libintl_wputenv)(const wchar_t *envstring);
#define EXPAND_MESSAGES 46
#define EXPAND_MAPCLEAR 47
#define EXPAND_ARGLIST 48
#define EXPAND_DIFF_BUFFERS 49

// Values for exmode_active (0 is no exmode)
#define EXMODE_NORMAL 1
Expand Down Expand Up @@ -829,6 +830,7 @@ extern int (*dyn_libintl_wputenv)(const wchar_t *envstring);
#define WILD_IGNORE_COMPLETESLASH 0x400
#define WILD_NOERROR 0x800 // sets EW_NOERROR
#define WILD_BUFLASTUSED 0x1000
#define BUF_DIFF_FILTER 0x2000

// Flags for expand_wildcards()
#define EW_DIR 0x01 // include directory names
Expand Down