diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/ex_docmd.c | 48 | ||||
-rw-r--r-- | src/nvim/globals.h | 6 | ||||
-rw-r--r-- | src/nvim/main.c | 9 | ||||
-rw-r--r-- | src/nvim/syntax.c | 21 |
4 files changed, 45 insertions, 39 deletions
diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index 4664ca7785..c785b1c1b9 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -9222,15 +9222,9 @@ char_u *get_behave_arg(expand_T *xp, int idx) return NULL; } -typedef enum { - ft_UNSET, - ft_DISABLED, - ft_ENABLED -} ft_flag_state; - -static ft_flag_state filetype_detect = ft_UNSET; -static ft_flag_state filetype_plugin = ft_UNSET; -static ft_flag_state filetype_indent = ft_UNSET; +static TriState filetype_detect = kNone; +static TriState filetype_plugin = kNone; +static TriState filetype_indent = kNone; /* * ":filetype [plugin] [indent] {on,off,detect}" @@ -9244,15 +9238,15 @@ static ft_flag_state filetype_indent = ft_UNSET; 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 == ft_ENABLED ? "ON" : "OFF", - filetype_plugin == ft_ENABLED ? (filetype_detect == ft_ENABLED ? "ON" : "(on)") : "OFF", // NOLINT - filetype_indent == ft_ENABLED ? (filetype_detect == ft_ENABLED ? "ON" : "(on)") : "OFF"); // NOLINT + 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; } @@ -9273,14 +9267,14 @@ 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 = ft_ENABLED; + filetype_detect = kTrue; if (plugin) { source_runtime((char_u *)FTPLUGIN_FILE, true); - filetype_plugin = ft_ENABLED; + filetype_plugin = kTrue; } if (indent) { source_runtime((char_u *)INDENT_FILE, true); - filetype_indent = ft_ENABLED; + filetype_indent = kTrue; } } if (*arg == 'd') { @@ -9291,15 +9285,15 @@ static void ex_filetype(exarg_T *eap) if (plugin || indent) { if (plugin) { source_runtime((char_u *)FTPLUGOF_FILE, true); - filetype_plugin = ft_DISABLED; + filetype_plugin = kFalse; } if (indent) { source_runtime((char_u *)INDOFF_FILE, true); - filetype_indent = ft_DISABLED; + filetype_indent = kFalse; } } else { source_runtime((char_u *)FTOFF_FILE, true); - filetype_detect = ft_DISABLED; + filetype_detect = kFalse; } } else EMSG2(_(e_invarg2), arg); @@ -9307,17 +9301,17 @@ static void ex_filetype(exarg_T *eap) /// Do ":filetype plugin indent on" if user did not already do some /// permutation thereof. -void maybe_enable_filetype(void) +void filetype_maybe_enable(void) { - if (filetype_detect == ft_UNSET - && filetype_plugin == ft_UNSET - && filetype_indent == ft_UNSET) { + if (filetype_detect == kNone + && filetype_plugin == kNone + && filetype_indent == kNone) { source_runtime((char_u *)FILETYPE_FILE, true); - filetype_detect = ft_ENABLED; + filetype_detect = kTrue; source_runtime((char_u *)FTPLUGIN_FILE, true); - filetype_plugin = ft_ENABLED; + filetype_plugin = kTrue; source_runtime((char_u *)INDENT_FILE, true); - filetype_indent = ft_ENABLED; + filetype_indent = kTrue; } } 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 2070125b2e..d3cdfe3edf 100644 --- a/src/nvim/main.c +++ b/src/nvim/main.c @@ -334,11 +334,10 @@ int main(int argc, char **argv) // If using the runtime (-u is not NONE), enable syntax & filetype plugins. if (params.use_vimrc != NULL && strcmp(params.use_vimrc, "NONE") != 0) { - // Do ":filetype plugin indent on". - maybe_enable_filetype(); - // Enable syntax (sources syntax/syntax.vim, which calls `:filetype on`). - do_cmdline_cmd("if !exists('syntax_off') | syntax on |" - "else | unlet syntax_off | endif"); + // Does ":filetype plugin indent on". + filetype_maybe_enable(); + // Sources syntax/syntax.vim, which calls `:filetype on`. + syn_maybe_on(); } /* diff --git a/src/nvim/syntax.c b/src/nvim/syntax.c index ce19320331..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. @@ -3288,19 +3290,24 @@ static void syn_cmd_off(exarg_T *eap, int syncing) static void syn_cmd_onoff(exarg_T *eap, char *name) FUNC_ATTR_NONNULL_ALL { + did_syntax_onoff = true; eap->nextcmd = check_nextcmd(eap->arg); if (!eap->skip) { - syn_cmd(name); + char buf[100]; + strncpy(buf, "so ", 3); + vim_snprintf(buf + 3, sizeof(buf) - 3, SYNTAX_FNAME, name); + do_cmdline_cmd(buf); } } -void syn_cmd(char *name) - FUNC_ATTR_NONNULL_ALL +void syn_maybe_on(void) { - char buf[100]; - strncpy(buf, "so ", 3); - vim_snprintf(buf + 3, sizeof(buf) - 3, SYNTAX_FNAME, name); - do_cmdline_cmd(buf); + if (!did_syntax_onoff) { + exarg_T ea; + ea.arg = (char_u *)""; + ea.skip = false; + syn_cmd_onoff(&ea, "syntax"); + } } /* |