summaryrefslogtreecommitdiff
path: root/data/vim/patches/8.1.1068
diff options
context:
space:
mode:
Diffstat (limited to 'data/vim/patches/8.1.1068')
-rw-r--r--data/vim/patches/8.1.1068588
1 files changed, 588 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.1068 b/data/vim/patches/8.1.1068
new file mode 100644
index 000000000..48a5c99db
--- /dev/null
+++ b/data/vim/patches/8.1.1068
@@ -0,0 +1,588 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.1068
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.1068
+Problem: Cannot get all the information about current completion.
+Solution: Add complete_info(). (Shougo, Hirohito Higashi, closes #4106)
+Files: runtime/doc/eval.txt, runtime/doc/insert.txt,
+ runtime/doc/usr_41.txt, src/edit.c, src/evalfunc.c,
+ src/proto/edit.pro, src/testdir/test_popup.vim
+
+
+*** ../vim-8.1.1067/runtime/doc/eval.txt 2019-03-26 22:50:19.147698161 +0100
+--- runtime/doc/eval.txt 2019-03-29 12:09:44.357635376 +0100
+***************
+*** 2242,2254 ****
+ complete({startcol}, {matches}) none set Insert mode completion
+ complete_add({expr}) Number add completion match
+ complete_check() Number check for key typed during completion
+ confirm({msg} [, {choices} [, {default} [, {type}]]])
+ Number number of choice picked by user
+ copy({expr}) any make a shallow copy of {expr}
+ cos({expr}) Float cosine of {expr}
+ cosh({expr}) Float hyperbolic cosine of {expr}
+! count({list}, {expr} [, {ic} [, {start}]])
+! Number count how many {expr} are in {list}
+ cscope_connection([{num}, {dbpath} [, {prepend}]])
+ Number checks existence of cscope connection
+ cursor({lnum}, {col} [, {off}])
+--- 2267,2280 ----
+ complete({startcol}, {matches}) none set Insert mode completion
+ complete_add({expr}) Number add completion match
+ complete_check() Number check for key typed during completion
++ complete_info([{what}]) Dict get current completion information
+ confirm({msg} [, {choices} [, {default} [, {type}]]])
+ Number number of choice picked by user
+ copy({expr}) any make a shallow copy of {expr}
+ cos({expr}) Float cosine of {expr}
+ cosh({expr}) Float hyperbolic cosine of {expr}
+! count({comp}, {expr} [, {ic} [, {start}]])
+! Number count how many {expr} are in {comp}
+ cscope_connection([{num}, {dbpath} [, {prepend}]])
+ Number checks existence of cscope connection
+ cursor({lnum}, {col} [, {off}])
+***************
+*** 3512,3520 ****
+ Only to be used by the function specified with the
+ 'completefunc' option.
+
+ *confirm()*
+ confirm({msg} [, {choices} [, {default} [, {type}]]])
+! Confirm() offers the user a dialog, from which a choice can be
+ made. It returns the number of the choice. For the first
+ choice this is 1.
+ Note: confirm() is only supported when compiled with dialog
+--- 3539,3596 ----
+ Only to be used by the function specified with the
+ 'completefunc' option.
+
++ *complete_info()*
++ complete_info([{what}])
++ Returns a Dictionary with information about Insert mode
++ completion. See |ins-completion|.
++ The items are:
++ mode Current completion mode name string.
++ See |completion_info_mode| for the values.
++ pum_visible |TRUE| if popup menu is visible.
++ See |pumvisible()|.
++ items List of completion matches. Each item is a
++ dictionary containing the entries "word",
++ "abbr", "menu", "kind", "info" and "user_data".
++ See |complete-items|.
++ selected Selected item index. First index is zero.
++ Index is -1 if no item is selected (showing
++ typed text only)
++ inserted Inserted string. [NOT IMPLEMENT YET]
++
++ *complete_info_mode*
++ mode values are:
++ "" Not in completion mode
++ "keyword" Keyword completion |i_CTRL-X_CTRL-N|
++ "ctrl_x" Just pressed CTRL-X |i_CTRL-X|
++ "whole_line" Whole lines |i_CTRL-X_CTRL-L|
++ "files" File names |i_CTRL-X_CTRL-F|
++ "tags" Tags |i_CTRL-X_CTRL-]|
++ "path_defines" Definition completion |i_CTRL-X_CTRL-D|
++ "path_patterns" Include completion |i_CTRL-X_CTRL-I|
++ "dictionary" Dictionary |i_CTRL-X_CTRL-K|
++ "thesaurus" Thesaurus |i_CTRL-X_CTRL-T|
++ "cmdline" Vim Command line |i_CTRL-X_CTRL-V|
++ "function" User defined completion |i_CTRL-X_CTRL-U|
++ "omni" Omni completion |i_CTRL-X_CTRL-O|
++ "spell" Spelling suggestions |i_CTRL-X_s|
++ "eval" |complete()| completion
++ "unknown" Other internal modes
++
++ If the optional {what} list argument is supplied, then only
++ the items listed in {what} are returned. Unsupported items in
++ {what} are silently ignored.
++
++ Examples: >
++ " Get all items
++ call complete_info()
++ " Get only 'mode'
++ call complete_info(['mode'])
++ " Get only 'mode' and 'pum_visible'
++ call complete_info(['mode', 'pum_visible'])
++ <
+ *confirm()*
+ confirm({msg} [, {choices} [, {default} [, {type}]]])
+! confirm() offers the user a dialog, from which a choice can be
+ made. It returns the number of the choice. For the first
+ choice this is 1.
+ Note: confirm() is only supported when compiled with dialog
+*** ../vim-8.1.1067/runtime/doc/insert.txt 2019-01-11 13:02:20.101567912 +0100
+--- runtime/doc/insert.txt 2019-03-29 11:55:56.275979508 +0100
+***************
+*** 642,647 ****
+--- 642,648 ----
+ not a valid CTRL-X mode command. Valid keys are the CTRL-X command itself,
+ CTRL-N (next), and CTRL-P (previous).
+
++ To get the current completion information, |complete_info()| can be used.
+ Also see the 'infercase' option if you want to adjust the case of the match.
+
+ *complete_CTRL-E*
+***************
+*** 1051,1063 ****
+ number between zero and the cursor column "col('.')". This involves looking
+ at the characters just before the cursor and including those characters that
+ could be part of the completed item. The text between this column and the
+! cursor column will be replaced with the matches.
+
+! Special return values:
+! -1 If no completion can be done, the completion will be cancelled with an
+! error message.
+! -2 To cancel silently and stay in completion mode.
+! -3 To cancel silently and leave completion mode.
+
+ On the second invocation the arguments are:
+ a:findstart 0
+--- 1052,1064 ----
+ number between zero and the cursor column "col('.')". This involves looking
+ at the characters just before the cursor and including those characters that
+ could be part of the completed item. The text between this column and the
+! cursor column will be replaced with the matches. If the returned value is
+! larger than the cursor column, the cursor column is used.
+
+! Negative return values:
+! -2 To cancel silently and stay in completion mode.
+! -3 To cancel silently and leave completion mode.
+! Another negative value: completion starts at the cursor column
+
+ On the second invocation the arguments are:
+ a:findstart 0
+*** ../vim-8.1.1067/runtime/doc/usr_41.txt 2019-01-11 13:42:31.680331155 +0100
+--- runtime/doc/usr_41.txt 2019-03-29 11:55:56.275979508 +0100
+***************
+*** 829,834 ****
+--- 834,840 ----
+ complete() set found matches
+ complete_add() add to found matches
+ complete_check() check if completion should be aborted
++ complete_info() get current completion information
+ pumvisible() check if the popup menu is displayed
+
+ Folding: *folding-functions*
+*** ../vim-8.1.1067/src/edit.c 2019-03-26 22:46:01.885928372 +0100
+--- src/edit.c 2019-03-29 12:12:58.388217318 +0100
+***************
+*** 15,21 ****
+
+ #ifdef FEAT_INS_EXPAND
+ /*
+! * definitions used for CTRL-X submode
+ */
+ # define CTRL_X_WANT_IDENT 0x100
+
+--- 15,23 ----
+
+ #ifdef FEAT_INS_EXPAND
+ /*
+! * Definitions used for CTRL-X submode.
+! * Note: If you change CTRL-X submode, you must also maintain ctrl_x_msgs[] and
+! * ctrl_x_mode_names[].
+ */
+ # define CTRL_X_WANT_IDENT 0x100
+
+***************
+*** 40,57 ****
+ # define CTRL_X_MSG(i) ctrl_x_msgs[(i) & ~CTRL_X_WANT_IDENT]
+ # define CTRL_X_MODE_LINE_OR_EVAL(m) ((m) == CTRL_X_WHOLE_LINE || (m) == CTRL_X_EVAL)
+
+! /* Message for CTRL-X mode, index is ctrl_x_mode. */
+ static char *ctrl_x_msgs[] =
+ {
+! N_(" Keyword completion (^N^P)"), /* CTRL_X_NORMAL, ^P/^N compl. */
+ N_(" ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"),
+! NULL, /* CTRL_X_SCROLL: depends on state */
+ N_(" Whole line completion (^L^N^P)"),
+ N_(" File name completion (^F^N^P)"),
+ N_(" Tag completion (^]^N^P)"),
+ N_(" Path pattern completion (^N^P)"),
+ N_(" Definition completion (^D^N^P)"),
+! NULL, /* CTRL_X_FINISHED */
+ N_(" Dictionary completion (^K^N^P)"),
+ N_(" Thesaurus completion (^T^N^P)"),
+ N_(" Command-line completion (^V^N^P)"),
+--- 42,59 ----
+ # define CTRL_X_MSG(i) ctrl_x_msgs[(i) & ~CTRL_X_WANT_IDENT]
+ # define CTRL_X_MODE_LINE_OR_EVAL(m) ((m) == CTRL_X_WHOLE_LINE || (m) == CTRL_X_EVAL)
+
+! // Message for CTRL-X mode, index is ctrl_x_mode.
+ static char *ctrl_x_msgs[] =
+ {
+! N_(" Keyword completion (^N^P)"), // CTRL_X_NORMAL, ^P/^N compl.
+ N_(" ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)"),
+! NULL, // CTRL_X_SCROLL: depends on state
+ N_(" Whole line completion (^L^N^P)"),
+ N_(" File name completion (^F^N^P)"),
+ N_(" Tag completion (^]^N^P)"),
+ N_(" Path pattern completion (^N^P)"),
+ N_(" Definition completion (^D^N^P)"),
+! NULL, // CTRL_X_FINISHED
+ N_(" Dictionary completion (^K^N^P)"),
+ N_(" Thesaurus completion (^T^N^P)"),
+ N_(" Command-line completion (^V^N^P)"),
+***************
+*** 59,67 ****
+ N_(" Omni completion (^O^N^P)"),
+ N_(" Spelling suggestion (s^N^P)"),
+ N_(" Keyword Local completion (^N^P)"),
+! NULL, /* CTRL_X_EVAL doesn't use msg. */
+ };
+
+ static char e_hitend[] = N_("Hit end of paragraph");
+ # ifdef FEAT_COMPL_FUNC
+ static char e_complwin[] = N_("E839: Completion function changed window");
+--- 61,90 ----
+ N_(" Omni completion (^O^N^P)"),
+ N_(" Spelling suggestion (s^N^P)"),
+ N_(" Keyword Local completion (^N^P)"),
+! NULL, // CTRL_X_EVAL doesn't use msg.
+ };
+
++ static char *ctrl_x_mode_names[] = {
++ "keyword",
++ "ctrl_x",
++ "unknown", // CTRL_X_SCROLL
++ "whole_line",
++ "files",
++ "tags",
++ "path_patterns",
++ "path_defines",
++ "unknown", // CTRL_X_FINISHED
++ "dictionary",
++ "thesaurus",
++ "cmdline",
++ "function",
++ "omni",
++ "spell",
++ NULL, // CTRL_X_LOCAL_MSG only used in "ctrl_x_msgs"
++ "eval"
++ };
++
++
+ static char e_hitend[] = N_("Hit end of paragraph");
+ # ifdef FEAT_COMPL_FUNC
+ static char e_complwin[] = N_("E839: Completion function changed window");
+***************
+*** 163,168 ****
+--- 186,192 ----
+ static char_u *find_line_end(char_u *ptr);
+ static void ins_compl_free(void);
+ static void ins_compl_clear(void);
++ static char_u *ins_compl_mode(void);
+ static int ins_compl_bs(void);
+ static int ins_compl_need_restart(void);
+ static void ins_compl_new_leader(void);
+***************
+*** 3525,3530 ****
+--- 3549,3656 ----
+ return compl_started;
+ }
+
++
++ /*
++ * Get complete information
++ */
++ void
++ get_complete_info(list_T *what_list, dict_T *retdict)
++ {
++ int ret = OK;
++ listitem_T *item;
++ #define CI_WHAT_MODE 0x01
++ #define CI_WHAT_PUM_VISIBLE 0x02
++ #define CI_WHAT_ITEMS 0x04
++ #define CI_WHAT_SELECTED 0x08
++ #define CI_WHAT_INSERTED 0x10
++ #define CI_WHAT_ALL 0xff
++ int what_flag;
++
++ if (what_list == NULL)
++ what_flag = CI_WHAT_ALL;
++ else
++ {
++ what_flag = 0;
++ for (item = what_list->lv_first; item != NULL; item = item->li_next)
++ {
++ char_u *what = tv_get_string(&item->li_tv);
++
++ if (STRCMP(what, "mode") == 0)
++ what_flag |= CI_WHAT_MODE;
++ else if (STRCMP(what, "pum_visible") == 0)
++ what_flag |= CI_WHAT_PUM_VISIBLE;
++ else if (STRCMP(what, "items") == 0)
++ what_flag |= CI_WHAT_ITEMS;
++ else if (STRCMP(what, "selected") == 0)
++ what_flag |= CI_WHAT_SELECTED;
++ else if (STRCMP(what, "inserted") == 0)
++ what_flag |= CI_WHAT_INSERTED;
++ }
++ }
++
++ if (ret == OK && (what_flag & CI_WHAT_MODE))
++ ret = dict_add_string(retdict, "mode", ins_compl_mode());
++
++ if (ret == OK && (what_flag & CI_WHAT_PUM_VISIBLE))
++ ret = dict_add_number(retdict, "pum_visible", pum_visible());
++
++ if (ret == OK && (what_flag & CI_WHAT_ITEMS))
++ {
++ list_T *li;
++ dict_T *di;
++ compl_T *match;
++
++ li = list_alloc();
++ if (li == NULL)
++ return;
++ ret = dict_add_list(retdict, "items", li);
++ if (ret == OK && compl_first_match != NULL)
++ {
++ match = compl_first_match;
++ do
++ {
++ if (!(match->cp_flags & ORIGINAL_TEXT))
++ {
++ di = dict_alloc();
++ if (di == NULL)
++ return;
++ ret = list_append_dict(li, di);
++ if (ret != OK)
++ return;
++ dict_add_string(di, "word", match->cp_str);
++ dict_add_string(di, "abbr", match->cp_text[CPT_ABBR]);
++ dict_add_string(di, "menu", match->cp_text[CPT_MENU]);
++ dict_add_string(di, "kind", match->cp_text[CPT_KIND]);
++ dict_add_string(di, "info", match->cp_text[CPT_INFO]);
++ dict_add_string(di, "user_data",
++ match->cp_text[CPT_USER_DATA]);
++ }
++ match = match->cp_next;
++ }
++ while (match != NULL && match != compl_first_match);
++ }
++ }
++
++ if (ret == OK && (what_flag & CI_WHAT_SELECTED))
++ ret = dict_add_number(retdict, "selected", (compl_curr_match != NULL) ?
++ compl_curr_match->cp_number - 1 : -1);
++
++ // TODO
++ // if (ret == OK && (what_flag & CI_WHAT_INSERTED))
++ }
++
++ /*
++ * Return Insert completion mode name string
++ */
++ static char_u *
++ ins_compl_mode(void)
++ {
++ if (ctrl_x_mode == CTRL_X_NOT_DEFINED_YET || compl_started)
++ return (char_u *)ctrl_x_mode_names[ctrl_x_mode & ~CTRL_X_WANT_IDENT];
++
++ return (char_u *)"";
++ }
++
+ /*
+ * Delete one character before the cursor and show the subset of the matches
+ * that match the word that is now before the cursor.
+*** ../vim-8.1.1067/src/evalfunc.c 2019-03-26 22:50:19.151698126 +0100
+--- src/evalfunc.c 2019-03-29 12:15:43.859016653 +0100
+***************
+*** 113,118 ****
+--- 113,119 ----
+ static void f_complete(typval_T *argvars, typval_T *rettv);
+ static void f_complete_add(typval_T *argvars, typval_T *rettv);
+ static void f_complete_check(typval_T *argvars, typval_T *rettv);
++ static void f_complete_info(typval_T *argvars, typval_T *rettv);
+ #endif
+ static void f_confirm(typval_T *argvars, typval_T *rettv);
+ static void f_copy(typval_T *argvars, typval_T *rettv);
+***************
+*** 593,598 ****
+--- 594,600 ----
+ {"complete", 2, 2, f_complete},
+ {"complete_add", 1, 1, f_complete_add},
+ {"complete_check", 0, 0, f_complete_check},
++ {"complete_info", 0, 1, f_complete_info},
+ #endif
+ {"confirm", 1, 4, f_confirm},
+ {"copy", 1, 1, f_copy},
+***************
+*** 2600,2605 ****
+--- 2602,2630 ----
+ rettv->vval.v_number = compl_interrupted;
+ RedrawingDisabled = saved;
+ }
++
++ /*
++ * "complete_info()" function
++ */
++ static void
++ f_complete_info(typval_T *argvars, typval_T *rettv)
++ {
++ list_T *what_list = NULL;
++
++ if (rettv_dict_alloc(rettv) != OK)
++ return;
++
++ if (argvars[0].v_type != VAR_UNKNOWN)
++ {
++ if (argvars[0].v_type != VAR_LIST)
++ {
++ emsg(_(e_listreq));
++ return;
++ }
++ what_list = argvars[0].vval.v_list;
++ }
++ get_complete_info(what_list, rettv->vval.v_dict);
++ }
+ #endif
+
+ /*
+*** ../vim-8.1.1067/src/proto/edit.pro 2019-01-31 13:47:51.126632619 +0100
+--- src/proto/edit.pro 2019-03-29 12:13:26.104015732 +0100
+***************
+*** 18,23 ****
+--- 18,24 ----
+ char_u *find_word_start(char_u *ptr);
+ char_u *find_word_end(char_u *ptr);
+ int ins_compl_active(void);
++ void get_complete_info(list_T *what_list, dict_T *retdict);
+ int ins_compl_add_tv(typval_T *tv, int dir);
+ void ins_compl_check_keys(int frequency, int in_compl_func);
+ int get_literal(void);
+*** ../vim-8.1.1067/src/testdir/test_popup.vim 2019-01-06 13:10:46.332499076 +0100
+--- src/testdir/test_popup.vim 2019-03-29 11:55:56.279979474 +0100
+***************
+*** 896,899 ****
+--- 896,1000 ----
+ endtry
+ endfunc
+
++ func Test_popup_complete_info_01()
++ new
++ inoremap <buffer><F5> <C-R>=complete_info().mode<CR>
++ func s:complTestEval() abort
++ call complete(1, ['aa', 'ab'])
++ return ''
++ endfunc
++ inoremap <buffer><F6> <C-R>=s:complTestEval()<CR>
++ call writefile([
++ \ 'dummy dummy.txt 1',
++ \], 'Xdummy.txt')
++ setlocal tags=Xdummy.txt
++ setlocal dictionary=Xdummy.txt
++ setlocal thesaurus=Xdummy.txt
++ setlocal omnifunc=syntaxcomplete#Complete
++ setlocal completefunc=syntaxcomplete#Complete
++ setlocal spell
++ for [keys, mode_name] in [
++ \ ["", ''],
++ \ ["\<C-X>", 'ctrl_x'],
++ \ ["\<C-X>\<C-N>", 'keyword'],
++ \ ["\<C-X>\<C-P>", 'keyword'],
++ \ ["\<C-X>\<C-L>", 'whole_line'],
++ \ ["\<C-X>\<C-F>", 'files'],
++ \ ["\<C-X>\<C-]>", 'tags'],
++ \ ["\<C-X>\<C-D>", 'path_defines'],
++ \ ["\<C-X>\<C-I>", 'path_patterns'],
++ \ ["\<C-X>\<C-K>", 'dictionary'],
++ \ ["\<C-X>\<C-T>", 'thesaurus'],
++ \ ["\<C-X>\<C-V>", 'cmdline'],
++ \ ["\<C-X>\<C-U>", 'function'],
++ \ ["\<C-X>\<C-O>", 'omni'],
++ \ ["\<C-X>s", 'spell'],
++ \ ["\<F6>", 'eval'],
++ \]
++ call feedkeys("i" . keys . "\<F5>\<Esc>", 'tx')
++ call assert_equal(mode_name, getline('.'))
++ %d
++ endfor
++ call delete('Xdummy.txt')
++ bwipe!
++ endfunc
++
++ func UserDefinedComplete(findstart, base)
++ if a:findstart
++ return 0
++ else
++ return [
++ \ { 'word': 'Jan', 'menu': 'January' },
++ \ { 'word': 'Feb', 'menu': 'February' },
++ \ { 'word': 'Mar', 'menu': 'March' },
++ \ { 'word': 'Apr', 'menu': 'April' },
++ \ { 'word': 'May', 'menu': 'May' },
++ \ ]
++ endif
++ endfunc
++
++ func GetCompleteInfo()
++ if empty(g:compl_what)
++ let g:compl_info = complete_info()
++ else
++ let g:compl_info = complete_info(g:compl_what)
++ endif
++ return ''
++ endfunc
++
++ func Test_popup_complete_info_02()
++ new
++ inoremap <buffer><F5> <C-R>=GetCompleteInfo()<CR>
++ setlocal completefunc=UserDefinedComplete
++
++ let d = {
++ \ 'mode': 'function',
++ \ 'pum_visible': 1,
++ \ 'items': [
++ \ {'word': 'Jan', 'menu': 'January', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''},
++ \ {'word': 'Feb', 'menu': 'February', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''},
++ \ {'word': 'Mar', 'menu': 'March', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''},
++ \ {'word': 'Apr', 'menu': 'April', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''},
++ \ {'word': 'May', 'menu': 'May', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}
++ \ ],
++ \ 'selected': 0,
++ \ }
++
++ let g:compl_what = []
++ call feedkeys("i\<C-X>\<C-U>\<F5>", 'tx')
++ call assert_equal(d, g:compl_info)
++
++ let g:compl_what = ['mode', 'pum_visible', 'selected']
++ call remove(d, 'items')
++ call feedkeys("i\<C-X>\<C-U>\<F5>", 'tx')
++ call assert_equal(d, g:compl_info)
++
++ let g:compl_what = ['mode']
++ call remove(d, 'selected')
++ call remove(d, 'pum_visible')
++ call feedkeys("i\<C-X>\<C-U>\<F5>", 'tx')
++ call assert_equal(d, g:compl_info)
++ bwipe!
++ endfunc
++
+ " vim: shiftwidth=2 sts=2 expandtab
+*** ../vim-8.1.1067/src/version.c 2019-03-29 10:54:17.711209062 +0100
+--- src/version.c 2019-03-29 11:57:29.903220370 +0100
+***************
+*** 777,778 ****
+--- 777,780 ----
+ { /* Add new patch number below this line */
++ /**/
++ 1068,
+ /**/
+
+--
+Drink wet cement and get really stoned.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///