aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/nvim/ex_docmd.c48
-rw-r--r--src/nvim/globals.h6
-rw-r--r--src/nvim/main.c9
-rw-r--r--src/nvim/syntax.c21
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");
+ }
}
/*