diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/edit.c | 40 | ||||
-rw-r--r-- | src/nvim/ex_docmd.c | 60 | ||||
-rw-r--r-- | src/nvim/globals.h | 6 | ||||
-rw-r--r-- | src/nvim/main.c | 8 | ||||
-rw-r--r-- | src/nvim/syntax.c | 19 | ||||
-rw-r--r-- | src/nvim/version.c | 30 |
6 files changed, 104 insertions, 59 deletions
diff --git a/src/nvim/edit.c b/src/nvim/edit.c index 213df4f65a..d3b556f669 100644 --- a/src/nvim/edit.c +++ b/src/nvim/edit.c @@ -2464,6 +2464,14 @@ void ins_compl_show_pum(void) /* Need to build the popup menu list. */ compl_match_arraysize = 0; compl = compl_first_match; + /* + * If it's user complete function and refresh_always, + * not use "compl_leader" as prefix filter. + */ + if (ins_compl_need_restart()){ + xfree(compl_leader); + compl_leader = NULL; + } if (compl_leader != NULL) lead_len = (int)STRLEN(compl_leader); do { @@ -2932,11 +2940,9 @@ static void ins_compl_new_leader(void) else { spell_bad_len = 0; /* need to redetect bad word */ /* - * Matches were cleared, need to search for them now. First display - * the changed text before the cursor. Set "compl_restarting" to - * avoid that the first match is inserted. + * Matches were cleared, need to search for them now. + * Set "compl_restarting" to avoid that the first match is inserted. */ - update_screen(0); compl_restarting = TRUE; if (ins_complete(Ctrl_N) == FAIL) compl_cont_status = 0; @@ -2948,8 +2954,9 @@ static void ins_compl_new_leader(void) /* Show the popup menu with a different set of matches. */ ins_compl_show_pum(); - /* Don't let Enter select the original text when there is no popup menu. */ - if (compl_match_array == NULL) + /* Don't let Enter select the original text when there is no popup menu. + * Don't let Enter select when use user function and refresh_always is set */ + if (compl_match_array == NULL || ins_compl_need_restart()) compl_enter_selects = FALSE; } @@ -2980,27 +2987,18 @@ static void ins_compl_addleader(int c) (*mb_char2bytes)(c, buf); buf[cc] = NUL; ins_char_bytes(buf, cc); - if (compl_opt_refresh_always) - AppendToRedobuff(buf); } else { ins_char(c); - if (compl_opt_refresh_always) - AppendCharToRedobuff(c); } /* If we didn't complete finding matches we must search again. */ if (ins_compl_need_restart()) ins_compl_restart(); - /* When 'always' is set, don't reset compl_leader. While completing, - * cursor doesn't point original position, changing compl_leader would - * break redo. */ - if (!compl_opt_refresh_always) { - xfree(compl_leader); - compl_leader = vim_strnsave(get_cursor_line_ptr() + compl_col, - (int)(curwin->w_cursor.col - compl_col)); - ins_compl_new_leader(); - } + xfree(compl_leader); + compl_leader = vim_strnsave(get_cursor_line_ptr() + compl_col, + (int)(curwin->w_cursor.col - compl_col)); + ins_compl_new_leader(); } /* @@ -3009,6 +3007,10 @@ static void ins_compl_addleader(int c) */ static void ins_compl_restart(void) { + /* update screen before restart. + * so if complete is blocked, + * will stay to the last popup menu and reduce flicker */ + update_screen(0); ins_compl_free(); compl_started = FALSE; compl_matches = 0; diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index d6976bcb8f..c785b1c1b9 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -9222,9 +9222,9 @@ char_u *get_behave_arg(expand_T *xp, int idx) return NULL; } -static int filetype_detect = FALSE; -static int filetype_plugin = FALSE; -static int filetype_indent = FALSE; +static TriState filetype_detect = kNone; +static TriState filetype_plugin = kNone; +static TriState filetype_indent = kNone; /* * ":filetype [plugin] [indent] {on,off,detect}" @@ -9238,27 +9238,27 @@ static int filetype_indent = FALSE; static void ex_filetype(exarg_T *eap) { char_u *arg = eap->arg; - int plugin = FALSE; - int indent = FALSE; + bool plugin = false; + bool indent = false; if (*eap->arg == NUL) { /* Print current status. */ smsg("filetype detection:%s plugin:%s indent:%s", - filetype_detect ? "ON" : "OFF", - filetype_plugin ? (filetype_detect ? "ON" : "(on)") : "OFF", - filetype_indent ? (filetype_detect ? "ON" : "(on)") : "OFF"); + filetype_detect == kTrue ? "ON" : "OFF", + filetype_plugin == kTrue ? (filetype_detect == kTrue ? "ON" : "(on)") : "OFF", // NOLINT(whitespace/line_length) + filetype_indent == kTrue ? (filetype_detect == kTrue ? "ON" : "(on)") : "OFF"); // NOLINT(whitespace/line_length) return; } /* Accept "plugin" and "indent" in any order. */ for (;; ) { if (STRNCMP(arg, "plugin", 6) == 0) { - plugin = TRUE; + plugin = true; arg = skipwhite(arg + 6); continue; } if (STRNCMP(arg, "indent", 6) == 0) { - indent = TRUE; + indent = true; arg = skipwhite(arg + 6); continue; } @@ -9266,15 +9266,15 @@ static void ex_filetype(exarg_T *eap) } if (STRCMP(arg, "on") == 0 || STRCMP(arg, "detect") == 0) { if (*arg == 'o' || !filetype_detect) { - source_runtime((char_u *)FILETYPE_FILE, TRUE); - filetype_detect = TRUE; + source_runtime((char_u *)FILETYPE_FILE, true); + filetype_detect = kTrue; if (plugin) { - source_runtime((char_u *)FTPLUGIN_FILE, TRUE); - filetype_plugin = TRUE; + source_runtime((char_u *)FTPLUGIN_FILE, true); + filetype_plugin = kTrue; } if (indent) { - source_runtime((char_u *)INDENT_FILE, TRUE); - filetype_indent = TRUE; + source_runtime((char_u *)INDENT_FILE, true); + filetype_indent = kTrue; } } if (*arg == 'd') { @@ -9284,21 +9284,37 @@ static void ex_filetype(exarg_T *eap) } else if (STRCMP(arg, "off") == 0) { if (plugin || indent) { if (plugin) { - source_runtime((char_u *)FTPLUGOF_FILE, TRUE); - filetype_plugin = FALSE; + source_runtime((char_u *)FTPLUGOF_FILE, true); + filetype_plugin = kFalse; } if (indent) { - source_runtime((char_u *)INDOFF_FILE, TRUE); - filetype_indent = FALSE; + source_runtime((char_u *)INDOFF_FILE, true); + filetype_indent = kFalse; } } else { - source_runtime((char_u *)FTOFF_FILE, TRUE); - filetype_detect = FALSE; + source_runtime((char_u *)FTOFF_FILE, true); + filetype_detect = kFalse; } } else EMSG2(_(e_invarg2), arg); } +/// Do ":filetype plugin indent on" if user did not already do some +/// permutation thereof. +void filetype_maybe_enable(void) +{ + if (filetype_detect == kNone + && filetype_plugin == kNone + && filetype_indent == kNone) { + source_runtime((char_u *)FILETYPE_FILE, true); + filetype_detect = kTrue; + source_runtime((char_u *)FTPLUGIN_FILE, true); + filetype_plugin = kTrue; + source_runtime((char_u *)INDENT_FILE, true); + filetype_indent = kTrue; + } +} + /* * ":setfiletype {name}" */ diff --git a/src/nvim/globals.h b/src/nvim/globals.h index 697a4a765a..69e65c3208 100644 --- a/src/nvim/globals.h +++ b/src/nvim/globals.h @@ -100,6 +100,12 @@ # define VIMRC_FILE ".nvimrc" #endif +typedef enum { + kNone = -1, + kFalse = 0, + kTrue = 1, +} TriState; + /* Values for "starting" */ #define NO_SCREEN 2 /* no screen updating yet */ #define NO_BUFFERS 1 /* not all buffers loaded yet */ diff --git a/src/nvim/main.c b/src/nvim/main.c index a8c2cebbbd..d3cdfe3edf 100644 --- a/src/nvim/main.c +++ b/src/nvim/main.c @@ -332,6 +332,14 @@ int main(int argc, char **argv) /* Source startup scripts. */ source_startup_scripts(¶ms); + // If using the runtime (-u is not NONE), enable syntax & filetype plugins. + if (params.use_vimrc != NULL && strcmp(params.use_vimrc, "NONE") != 0) { + // Does ":filetype plugin indent on". + filetype_maybe_enable(); + // Sources syntax/syntax.vim, which calls `:filetype on`. + syn_maybe_on(); + } + /* * Read all the plugin files. * Only when compiled with +eval, since most plugins need it. diff --git a/src/nvim/syntax.c b/src/nvim/syntax.c index baf5d4784d..b7d8a19de9 100644 --- a/src/nvim/syntax.c +++ b/src/nvim/syntax.c @@ -41,6 +41,8 @@ #include "nvim/os/os.h" #include "nvim/os/time.h" +static bool did_syntax_onoff = false; + // Structure that stores information about a highlight group. // The ID of a highlight group is also called group ID. It is the index in // the highlight_ga array PLUS ONE. @@ -3286,17 +3288,28 @@ static void syn_cmd_off(exarg_T *eap, int syncing) } static void syn_cmd_onoff(exarg_T *eap, char *name) + FUNC_ATTR_NONNULL_ALL { - char buf[100]; - + did_syntax_onoff = true; eap->nextcmd = check_nextcmd(eap->arg); if (!eap->skip) { - strcpy(buf, "so "); + char buf[100]; + strncpy(buf, "so ", 3); vim_snprintf(buf + 3, sizeof(buf) - 3, SYNTAX_FNAME, name); do_cmdline_cmd(buf); } } +void syn_maybe_on(void) +{ + if (!did_syntax_onoff) { + exarg_T ea; + ea.arg = (char_u *)""; + ea.skip = false; + syn_cmd_onoff(&ea, "syntax"); + } +} + /* * Handle ":syntax [list]" command: list current syntax words. */ diff --git a/src/nvim/version.c b/src/nvim/version.c index 4b00349270..f332e55ca4 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -391,7 +391,7 @@ static int included_patches[] = { // 900 NA // 899 NA 898, - // 897, + // 897 NA // 896, // 895, // 894 NA @@ -415,20 +415,20 @@ static int included_patches[] = { // 876 NA // 875 NA // 874 NA - // 873, + // 873 NA // 872 NA // 871, // 870, // 869 NA // 868, // 867 NA - // 866, - // 865, + // 866 NA + // 865 NA // 864 NA // 863 NA // 862 NA // 861 NA - // 860, + // 860 NA // 859, 858, // 857, @@ -449,8 +449,8 @@ static int included_patches[] = { // 842 NA // 841 NA // 840 NA - // 839, - // 838, + // 839 NA + // 838 NA // 837 NA 836, // 835, @@ -461,13 +461,13 @@ static int included_patches[] = { // 830, // 829 NA 828, - // 827, + // 827 NA 826, 825, // 824 NA 823, // 822, - // 821, + // 821 NA 820, // 819, // 818, @@ -476,7 +476,7 @@ static int included_patches[] = { 815, 814, 813, - // 812, + // 812 NA 811, 810, 809, @@ -484,7 +484,7 @@ static int included_patches[] = { 807, 806, 805, - // 804, + // 804 NA 803, 802, 801, @@ -521,7 +521,7 @@ static int included_patches[] = { // 770 NA 769, 768, - // 767, + // 767 NA // 766 NA 765, 764, @@ -536,7 +536,7 @@ static int included_patches[] = { 755, 754, 753, - // 752, + // 752 NA // 751 NA // 750 NA 749, @@ -563,7 +563,7 @@ static int included_patches[] = { // 728 NA // 727 NA // 726 NA - // 725, + // 725 NA // 724 NA 723, 722, @@ -604,7 +604,7 @@ static int included_patches[] = { // 687 NA 686, 685, - // 684, + // 684 NA // 683 NA 682, // 681 NA |