aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/doc/starting.txt44
-rw-r--r--runtime/doc/vim_diff.txt9
-rwxr-xr-xscripts/gendeclarations.lua31
-rw-r--r--src/nvim/edit.c40
-rw-r--r--src/nvim/ex_docmd.c60
-rw-r--r--src/nvim/globals.h6
-rw-r--r--src/nvim/main.c8
-rw-r--r--src/nvim/syntax.c19
-rw-r--r--src/nvim/version.c30
-rw-r--r--test/functional/viml/completion_spec.lua43
10 files changed, 199 insertions, 91 deletions
diff --git a/runtime/doc/starting.txt b/runtime/doc/starting.txt
index ca02050cb8..be108d4633 100644
--- a/runtime/doc/starting.txt
+++ b/runtime/doc/starting.txt
@@ -315,9 +315,10 @@ argument.
When {vimrc} is equal to "NONE" (all uppercase), all
initializations from files and environment variables are
skipped, including reading the |ginit.vim| file when the GUI
- starts. Loading plugins is also skipped.
+ starts. Plugins and syntax highlighting are also skipped.
When {vimrc} is equal to "NORC" (all uppercase), this has the
- same effect as "NONE", but loading plugins is not skipped.
+ same effect as "NONE", but plugins and syntax highlighting are
+ not skipped.
*-i*
-i {shada} The file {shada} is used instead of the default ShaDa
@@ -391,7 +392,8 @@ accordingly. Vim proceeds in this order:
All following initializations until 4. are skipped. $MYVIMRC is not
set.
"vim -u NORC" can be used to skip these initializations without
- reading a file. "vim -u NONE" also skips loading plugins. |-u|
+ reading a file. "vim -u NONE" also skips plugins and syntax
+ highlighting. |-u|
If Vim was started in Ex mode with the "-s" argument, all following
initializations until 4. are skipped. Only the "-u" option is
@@ -424,7 +426,22 @@ accordingly. Vim proceeds in this order:
- The file ".exrc" (for Unix)
"_exrc" (for Win32)
-4. Load the plugin scripts. *load-plugins*
+4. Enable filetype and indent plugins.
+ This does the same as the commands: >
+ :runtime! filetype.vim
+ :runtime! ftplugin.vim
+ :runtime! indent.vim
+< This step is skipped if ":filetype ..." was called before now or if
+ the "-u NONE" command line argument was given.
+
+5. Enable syntax highlighting.
+ This does the same as the command: >
+ :runtime! syntax/syntax.vim
+< Note: This enables filetype detection even if ":filetype off" was
+ called before now.
+ This step is skipped if the "-u NONE" command line argument was given.
+
+6. Load the plugin scripts. *load-plugins*
This does the same as the command: >
:runtime! plugin/**/*.vim
< The result is that all directories in the 'runtimepath' option will be
@@ -440,31 +457,30 @@ accordingly. Vim proceeds in this order:
commands from the command line have not been executed yet. You can
use "--cmd 'set noloadplugins'" |--cmd|.
-5. Set 'shellpipe' and 'shellredir'
+7. Set 'shellpipe' and 'shellredir'
The 'shellpipe' and 'shellredir' options are set according to the
value of the 'shell' option, unless they have been set before.
This means that Vim will figure out the values of 'shellpipe' and
'shellredir' for you, unless you have set them yourself.
-6. Set 'updatecount' to zero, if "-n" command argument used
+8. Set 'updatecount' to zero, if "-n" command argument used
-7. Set binary options
+9. Set binary options
If the "-b" flag was given to Vim, the options for binary editing will
be set now. See |-b|.
-8. Perform GUI initializations
+10. Perform GUI initializations
Only when starting "gvim", the GUI initializations will be done. See
|gui-init|.
-9. Read the ShaDa file
- If the 'shada' option is not empty, the ShaDa file is read. See
- |shada-file|.
+11. Read the ShaDa file
+ See |shada-file|.
-10. Read the quickfix file
+12. Read the quickfix file
If the "-q" flag was given to Vim, the quickfix file is read. If this
fails, Vim exits.
-11. Open all windows
+13. Open all windows
When the |-o| flag was given, windows will be opened (but not
displayed yet).
When the |-p| flag was given, tab pages will be created (but not
@@ -473,7 +489,7 @@ accordingly. Vim proceeds in this order:
If the "-q" flag was given to Vim, the first error is jumped to.
Buffers for all windows will be loaded.
-12. Execute startup commands
+14. Execute startup commands
If a "-t" flag was given to Vim, the tag is jumped to.
The commands given with the |-c| and |+cmd| arguments are executed.
The starting flag is reset, has("vim_starting") will now return zero.
diff --git a/runtime/doc/vim_diff.txt b/runtime/doc/vim_diff.txt
index f76e901b9a..ac5efc6a1d 100644
--- a/runtime/doc/vim_diff.txt
+++ b/runtime/doc/vim_diff.txt
@@ -11,7 +11,7 @@ the "{Nvim}" tag. This document is a complete and centralized list of all
these differences.
1. Configuration |nvim-configuration|
-2. Option defaults |nvim-option-defaults|
+2. Defaults |nvim-defaults|
3. Changed features |nvim-features-changed|
4. New features |nvim-features-new|
5. Missing legacy features |nvim-features-missing|
@@ -28,7 +28,12 @@ these differences.
session information.
==============================================================================
-2. Option defaults *nvim-option-defaults*
+2. Defaults *nvim-defaults*
+
+- Syntax highlighting is enabled by default
+- Filetype-related plugins and scripts are enabled by default
+ Note: these defaults can be disabled with the "-u NONE" command line
+ argument. |-u|
- 'autoindent' is set by default
- 'autoread' is set by default
diff --git a/scripts/gendeclarations.lua b/scripts/gendeclarations.lua
index 4e74e4e301..637f4cdffa 100755
--- a/scripts/gendeclarations.lua
+++ b/scripts/gendeclarations.lua
@@ -239,23 +239,24 @@ end
non_static = non_static .. footer
static = static .. footer
-local F
-F = io.open(static_fname, 'w')
-F:write(static)
-F:close()
--- Before generating the non-static headers, check if the current file(if
--- exists) is different from the new one. If they are the same, we won't touch
--- the current version to avoid triggering an unnecessary rebuilds of modules
+-- Before generating the headers, check if the current file (if exists) is
+-- different from the new one. If they are the same, we won't touch the
+-- current version to avoid triggering an unnecessary rebuilds of modules
-- that depend on this one
-F = io.open(non_static_fname, 'r')
-if F ~= nil then
- if F:read('*a') == non_static then
- os.exit(0)
+local update_changed = function (fname, contents)
+ local F = io.open(fname, 'r')
+ if F ~= nil then
+ if F:read('*a') == contents then
+ return
+ end
+ io.close(F)
end
- io.close(F)
+
+ F = io.open(fname, 'w')
+ F:write(contents)
+ F:close()
end
-F = io.open(non_static_fname, 'w')
-F:write(non_static)
-F:close()
+update_changed(static_fname, static)
+update_changed(non_static_fname, non_static)
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(&params);
+ // 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
diff --git a/test/functional/viml/completion_spec.lua b/test/functional/viml/completion_spec.lua
index 12f542de7f..4bb9707cda 100644
--- a/test/functional/viml/completion_spec.lua
+++ b/test/functional/viml/completion_spec.lua
@@ -2,7 +2,7 @@
local helpers = require('test.functional.helpers')
local clear, feed = helpers.clear, helpers.feed
local eval, eq, neq = helpers.eval, helpers.eq, helpers.neq
-local execute, source = helpers.execute, helpers.source
+local execute, source, expect = helpers.execute, helpers.source, helpers.expect
describe('completion', function()
before_each(function()
@@ -100,4 +100,45 @@ describe('completion', function()
eq('', eval('getline(3)'))
end)
end)
+
+ describe("refresh:always", function()
+ before_each(function()
+ source([[
+ function! TestCompletion(findstart, base) abort
+ if a:findstart
+ let line = getline('.')
+ let start = col('.') - 1
+ while start > 0 && line[start - 1] =~ '\a'
+ let start -= 1
+ endwhile
+ return start
+ else
+ let ret = []
+ for m in split("January February March April May June July August September October November December")
+ if m =~ a:base " match by regex
+ call add(ret, m)
+ endif
+ endfor
+ return {'words':ret, 'refresh':'always'}
+ endif
+ endfunction
+
+ set completeopt=menuone,noselect
+ set completefunc=TestCompletion
+ ]])
+ end )
+
+ it('completes on each input char', function ()
+ feed('i<C-x><C-u>gu<Down><C-y>')
+ expect('August')
+ end)
+ it("repeats correctly after backspace #2674", function ()
+ feed('o<C-x><C-u>Ja<BS><C-n><C-n><Esc>')
+ feed('.')
+ expect([[
+
+ June
+ June]])
+ end)
+ end)
end)