aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt26
-rw-r--r--cmake/GenerateHelptags.cmake.in2
-rw-r--r--cmake/LuaHelpers.cmake2
-rw-r--r--cmake/RunLuacheck.cmake2
-rw-r--r--cmake/RunTests.cmake2
-rwxr-xr-xsrc/clint.py24
-rw-r--r--src/nvim/buffer_updates.c2
-rw-r--r--src/nvim/eval.c42
-rw-r--r--src/nvim/eval/encode.c4
-rw-r--r--src/nvim/eval/typval.c36
-rw-r--r--src/nvim/ex_getln.c2
-rw-r--r--src/nvim/fileio.c6
-rw-r--r--src/nvim/garray.h2
-rw-r--r--src/nvim/getchar.c34
-rw-r--r--src/nvim/getchar.h7
-rw-r--r--src/nvim/log.c5
-rw-r--r--src/nvim/lua/executor.c2
-rw-r--r--src/nvim/main.c2
-rw-r--r--src/nvim/memline.c15
-rw-r--r--src/nvim/message.c8
-rw-r--r--src/nvim/misc1.c2
-rw-r--r--src/nvim/ops.c14
-rw-r--r--src/nvim/regexp_nfa.c10
-rw-r--r--src/nvim/shada.c6
-rw-r--r--src/nvim/spellfile.c32
-rw-r--r--src/nvim/strings.c2
-rw-r--r--src/nvim/testdir/test_blockedit.vim13
-rw-r--r--src/nvim/testdir/test_functions.vim59
-rw-r--r--src/nvim/testdir/test_options.vim4
-rw-r--r--src/nvim/tui/terminfo.c4
-rw-r--r--src/nvim/undo.c4
-rw-r--r--third-party/CMakeLists.txt2
32 files changed, 246 insertions, 131 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 02b555d540..fa020bf55c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -96,8 +96,8 @@ endif()
# Set default build type.
if(NOT CMAKE_BUILD_TYPE)
- message(STATUS "CMAKE_BUILD_TYPE not given, defaulting to 'Debug'.")
- set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Choose the type of build." FORCE)
+ message(STATUS "CMAKE_BUILD_TYPE not given, defaulting to 'Debug'")
+ set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Choose the type of build" FORCE)
endif()
# Set available build types for CMake GUIs.
@@ -137,7 +137,7 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# Default to -O2 on release builds.
if(CMAKE_C_FLAGS_RELEASE MATCHES "-O3")
- message(STATUS "Replacing -O3 in CMAKE_C_FLAGS_RELEASE with -O2.")
+ message(STATUS "Replacing -O3 in CMAKE_C_FLAGS_RELEASE with -O2")
string(REPLACE "-O3" "-O2" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
endif()
@@ -205,12 +205,12 @@ main(void)
" HAS_ACCEPTABLE_FORTIFY)
if(NOT HAS_ACCEPTABLE_FORTIFY)
- message(STATUS "Unsupported _FORTIFY_SOURCE found, forcing _FORTIFY_SOURCE=1.")
+ message(STATUS "Unsupported _FORTIFY_SOURCE found, forcing _FORTIFY_SOURCE=1")
# Extract possible prefix to _FORTIFY_SOURCE (e.g. -Wp,-D_FORTIFY_SOURCE).
STRING(REGEX MATCH "[^\ ]+-D_FORTIFY_SOURCE" _FORTIFY_SOURCE_PREFIX "${CMAKE_C_FLAGS}")
STRING(REPLACE "-D_FORTIFY_SOURCE" "" _FORTIFY_SOURCE_PREFIX "${_FORTIFY_SOURCE_PREFIX}" )
if(NOT _FORTIFY_SOURCE_PREFIX STREQUAL "")
- message(STATUS "Detected _FORTIFY_SOURCE Prefix=${_FORTIFY_SOURCE_PREFIX}.")
+ message(STATUS "Detected _FORTIFY_SOURCE Prefix=${_FORTIFY_SOURCE_PREFIX}")
endif()
# -U in add_definitions doesn't end up in the correct spot, so we add it to
# the flags variable instead.
@@ -222,7 +222,7 @@ endif()
if(CMAKE_EXE_LINKER_FLAGS MATCHES "--sort-common" OR
CMAKE_SHARED_LINKER_FLAGS MATCHES "--sort-common" OR
CMAKE_MODULE_LINKER_FLAGS MATCHES "--sort-common")
- message(STATUS "Removing --sort-common from linker flags.")
+ message(STATUS "Removing --sort-common from linker flags")
string(REGEX REPLACE ",--sort-common(=[^,]+)?" "" CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
string(REGEX REPLACE ",--sort-common(=[^,]+)?" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
string(REGEX REPLACE ",--sort-common(=[^,]+)?" "" CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}")
@@ -309,10 +309,10 @@ if(CMAKE_C_COMPILER_ID STREQUAL "GNU")
endif()
endif()
-option(TRAVIS_CI_BUILD "Travis/QuickBuild CI. Extra flags will be set." OFF)
+option(TRAVIS_CI_BUILD "Travis/QuickBuild CI, extra flags will be set" OFF)
if(TRAVIS_CI_BUILD)
- message(STATUS "Travis/QuickBuild CI build enabled.")
+ message(STATUS "Travis/QuickBuild CI build enabled")
add_definitions(-Werror)
if(DEFINED ENV{BUILD_32BIT})
# Get some test coverage for unsigned char
@@ -433,11 +433,11 @@ option(CLANG_TSAN "Enable Clang thread sanitizer for nvim binary." OFF)
if((CLANG_ASAN_UBSAN AND CLANG_MSAN)
OR (CLANG_ASAN_UBSAN AND CLANG_TSAN)
OR (CLANG_MSAN AND CLANG_TSAN))
- message(FATAL_ERROR "Sanitizers cannot be enabled simultaneously.")
+ message(FATAL_ERROR "Sanitizers cannot be enabled simultaneously")
endif()
if((CLANG_ASAN_UBSAN OR CLANG_MSAN OR CLANG_TSAN) AND NOT CMAKE_C_COMPILER_ID MATCHES "Clang")
- message(FATAL_ERROR "Sanitizers are only supported for Clang.")
+ message(FATAL_ERROR "Sanitizers are only supported for Clang")
endif()
if(CMAKE_SYSTEM_NAME MATCHES "OpenBSD|FreeBSD|Windows") # see #5318
@@ -449,7 +449,7 @@ endif()
if(ENABLE_JEMALLOC)
if(CLANG_ASAN_UBSAN OR CLANG_MSAN OR CLANG_TSAN)
- message(STATUS "Sanitizers have been enabled; don't use jemalloc.")
+ message(STATUS "Sanitizers enabled; disabling jemalloc")
else()
find_package(JeMalloc REQUIRED)
include_directories(SYSTEM ${JEMALLOC_INCLUDE_DIRS})
@@ -505,10 +505,10 @@ else()
endif()
if(NOT LUA_PRG_WORKS)
- message(FATAL_ERROR "A suitable Lua interpreter was not found.")
+ message(FATAL_ERROR "Failed to find a Lua 5.1-compatible interpreter")
endif()
-message(STATUS "Using the Lua interpreter ${LUA_PRG}.")
+message(STATUS "Using Lua interpreter: ${LUA_PRG}")
# Setup busted.
find_program(BUSTED_PRG NAMES busted busted.bat)
diff --git a/cmake/GenerateHelptags.cmake.in b/cmake/GenerateHelptags.cmake.in
index 3ced2c0b17..db6f15b1be 100644
--- a/cmake/GenerateHelptags.cmake.in
+++ b/cmake/GenerateHelptags.cmake.in
@@ -8,7 +8,7 @@ else()
HELPTAGS_WORKING_DIRECTORY)
endif()
-message(STATUS "Generating helptags in ${HELPTAGS_WORKING_DIRECTORY}.")
+message(STATUS "Generating helptags in ${HELPTAGS_WORKING_DIRECTORY}")
if(EXISTS ${HELPTAGS_WORKING_DIRECTORY}/)
message(STATUS "${HELPTAGS_WORKING_DIRECTORY} already exists")
# If the doc directory already exists, helptags could fail due to duplicate
diff --git a/cmake/LuaHelpers.cmake b/cmake/LuaHelpers.cmake
index 3cba47412b..0239460f2b 100644
--- a/cmake/LuaHelpers.cmake
+++ b/cmake/LuaHelpers.cmake
@@ -17,7 +17,7 @@ endfunction()
function(check_lua_deps LUA_PRG_PATH MODULES RESULT_VAR)
# Check if the lua interpreter at the given path
# satisfies all Neovim dependencies
- message(STATUS "Checking Lua interpreter ${LUA_PRG_PATH}")
+ message(STATUS "Checking Lua interpreter: ${LUA_PRG_PATH}")
if(NOT EXISTS ${LUA_PRG_PATH})
message(STATUS
"[${LUA_PRG_PATH}] file not found")
diff --git a/cmake/RunLuacheck.cmake b/cmake/RunLuacheck.cmake
index 5129541cd8..4887e562a5 100644
--- a/cmake/RunLuacheck.cmake
+++ b/cmake/RunLuacheck.cmake
@@ -18,5 +18,5 @@ execute_process(
if(NOT res EQUAL 0)
message(STATUS "Output to stderr:\n${err}")
- message(FATAL_ERROR "Linting tests failed with error: ${res}.")
+ message(FATAL_ERROR "Linting tests failed with error: ${res}")
endif()
diff --git a/cmake/RunTests.cmake b/cmake/RunTests.cmake
index a51990e925..a764b19850 100644
--- a/cmake/RunTests.cmake
+++ b/cmake/RunTests.cmake
@@ -50,5 +50,5 @@ file(REMOVE_RECURSE ${WORKING_DIR}/Xtest-tmpdir)
if(NOT res EQUAL 0)
message(STATUS "Output to stderr:\n${err}")
- message(FATAL_ERROR "Running ${TEST_TYPE} tests failed with error: ${res}.")
+ message(FATAL_ERROR "${TEST_TYPE} tests failed with error: ${res}")
endif()
diff --git a/src/clint.py b/src/clint.py
index 9fd93ce143..34af5d15fd 100755
--- a/src/clint.py
+++ b/src/clint.py
@@ -49,6 +49,7 @@ from __future__ import unicode_literals
import codecs
import copy
+import fileinput
import getopt
import math # for log
import os
@@ -65,7 +66,7 @@ _USAGE = """
Syntax: clint.py [--verbose=#] [--output=vs7] [--filter=-x,+y,...]
[--counting=total|toplevel|detailed] [--root=subdir]
[--linelength=digits] [--record-errors=file]
- [--suppress-errors=file]
+ [--suppress-errors=file] [--stdin-filename=filename]
<file> [file] ...
The style guidelines this tries to follow are those in
@@ -167,6 +168,9 @@ Syntax: clint.py [--verbose=#] [--output=vs7] [--filter=-x,+y,...]
suppress-errors=file
Errors listed in the given file will not be reported.
+
+ stdin-filename=filename
+ Use specified filename when reading from stdin (file "-").
"""
# We categorize each error message we print. Here are the categories.
@@ -3456,10 +3460,12 @@ def ProcessFile(filename, vlevel, extra_check_functions=[]):
# is processed.
if filename == '-':
- lines = codecs.StreamReaderWriter(sys.stdin,
- codecs.getreader('utf8'),
- codecs.getwriter('utf8'),
- 'replace').read().split('\n')
+ stdin = sys.stdin.read()
+ if sys.version_info < (3, 0):
+ stdin = stdin.decode('utf8')
+ lines = stdin.split('\n')
+ if _cpplint_state.stdin_filename is not None:
+ filename = _cpplint_state.stdin_filename
else:
lines = codecs.open(
filename, 'r', 'utf8', 'replace').read().split('\n')
@@ -3540,7 +3546,9 @@ def ParseArguments(args):
'linelength=',
'extensions=',
'record-errors=',
- 'suppress-errors='])
+ 'suppress-errors=',
+ 'stdin-filename=',
+ ])
except getopt.GetoptError:
PrintUsage('Invalid arguments.')
@@ -3550,6 +3558,7 @@ def ParseArguments(args):
counting_style = ''
record_errors_file = None
suppress_errors_file = None
+ stdin_filename = None
for (opt, val) in opts:
if opt == '--help':
@@ -3586,6 +3595,8 @@ def ParseArguments(args):
record_errors_file = val
elif opt == '--suppress-errors':
suppress_errors_file = val
+ elif opt == '--stdin-filename':
+ stdin_filename = val
if not filenames:
PrintUsage('No files were specified.')
@@ -3596,6 +3607,7 @@ def ParseArguments(args):
_SetCountingStyle(counting_style)
_SuppressErrorsFrom(suppress_errors_file)
_RecordErrorsTo(record_errors_file)
+ _cpplint_state.stdin_filename = stdin_filename
return filenames
diff --git a/src/nvim/buffer_updates.c b/src/nvim/buffer_updates.c
index 18b53a0685..9d9c998a68 100644
--- a/src/nvim/buffer_updates.c
+++ b/src/nvim/buffer_updates.c
@@ -180,7 +180,7 @@ void buf_updates_send_changes(buf_T *buf,
// change notifications are so frequent that many dead channels will be
// cleared up quickly.
if (badchannelid != 0) {
- ELOG("Disabling buffer updates for dead channel %llu", badchannelid);
+ ELOG("Disabling buffer updates for dead channel %"PRIu64, badchannelid);
buf_updates_unregister(buf, badchannelid);
}
}
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index 2aab2d72a7..9c678168bb 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -1943,7 +1943,7 @@ static char_u *ex_let_one(char_u *arg, typval_T *const tv,
emsgf(_(e_letwrong), op);
} else if (endchars != NULL
&& vim_strchr(endchars, *skipwhite(arg + 1)) == NULL) {
- emsgf(_(e_letunexp));
+ EMSG(_(e_letunexp));
} else {
char_u *s;
@@ -2152,7 +2152,7 @@ static char_u *get_lval(char_u *const name, typval_T *const rettv,
if (rettv != NULL && (rettv->v_type != VAR_LIST
|| rettv->vval.v_list == NULL)) {
if (!quiet) {
- emsgf(_("E709: [:] requires a List value"));
+ EMSG(_("E709: [:] requires a List value"));
}
tv_clear(&var1);
return NULL;
@@ -2179,7 +2179,7 @@ static char_u *get_lval(char_u *const name, typval_T *const rettv,
if (*p != ']') {
if (!quiet) {
- emsgf(_(e_missbrac));
+ EMSG(_(e_missbrac));
}
tv_clear(&var1);
tv_clear(&var2);
@@ -3325,7 +3325,7 @@ static int eval1(char_u **arg, typval_T *rettv, int evaluate)
* Check for the ":".
*/
if ((*arg)[0] != ':') {
- emsgf(_("E109: Missing ':' after '?'"));
+ EMSG(_("E109: Missing ':' after '?'"));
if (evaluate && result) {
tv_clear(rettv);
}
@@ -4433,7 +4433,7 @@ eval_index(
/* Check for the ']'. */
if (**arg != ']') {
if (verbose) {
- emsgf(_(e_missbrac));
+ EMSG(_(e_missbrac));
}
tv_clear(&var1);
if (range) {
@@ -4545,7 +4545,7 @@ eval_index(
case VAR_DICT: {
if (range) {
if (verbose) {
- emsgf(_(e_dictrange));
+ EMSG(_(e_dictrange));
}
if (len == -1) {
tv_clear(&var1);
@@ -7795,7 +7795,7 @@ static void f_deepcopy(typval_T *argvars, typval_T *rettv, FunPtr fptr)
noref = tv_get_number_chk(&argvars[1], NULL);
}
if (noref < 0 || noref > 1) {
- emsgf(_(e_invarg));
+ EMSG(_(e_invarg));
} else {
var_item_copy(NULL, &argvars[0], rettv, true, (noref == 0
? get_copyID()
@@ -7835,7 +7835,7 @@ static void f_delete(typval_T *argvars, typval_T *rettv, FunPtr fptr)
// delete a directory recursively
rettv->vval.v_number = delete_recursive(name);
} else {
- EMSG2(_(e_invexpr2), flags);
+ emsgf(_(e_invexpr2), flags);
}
}
@@ -8963,7 +8963,7 @@ static void common_function(typval_T *argvars, typval_T *rettv,
} else if (trans_name != NULL
&& (is_funcref ? find_func(trans_name) == NULL
: !translated_function_exists((const char *)trans_name))) {
- EMSG2(_("E700: Unknown function: %s"), s);
+ emsgf(_("E700: Unknown function: %s"), s);
} else {
int dict_idx = 0;
int arg_idx = 0;
@@ -11190,7 +11190,7 @@ void get_user_input(const typval_T *const argvars,
char def[1] = { 0 };
if (argvars[0].v_type == VAR_DICT) {
if (argvars[1].v_type != VAR_UNKNOWN) {
- emsgf(_("E5050: {opts} must be the only argument"));
+ EMSG(_("E5050: {opts} must be the only argument"));
return;
}
dict_T *const dict = argvars[0].vval.v_dict;
@@ -11499,7 +11499,7 @@ static void dict_list(typval_T *const tv, typval_T *const rettv,
const DictListType what)
{
if (tv->v_type != VAR_DICT) {
- emsgf(_(e_dictreq));
+ EMSG(_(e_dictreq));
return;
}
if (tv->vval.v_dict == NULL) {
@@ -11929,7 +11929,7 @@ static void f_json_decode(typval_T *argvars, typval_T *rettv, FunPtr fptr)
}
}
if (json_decode_string(s, len, rettv) == FAIL) {
- emsgf(_("E474: Failed to parse %.*s"), (int) len, s);
+ emsgf(_("E474: Failed to parse %.*s"), (int)len, s);
rettv->v_type = VAR_NUMBER;
rettv->vval.v_number = 0;
}
@@ -12919,7 +12919,7 @@ static void f_nr2char(typval_T *argvars, typval_T *rettv, FunPtr fptr)
return;
}
if (num < 0) {
- emsgf(_("E5070: Character number must not be less than zero"));
+ EMSG(_("E5070: Character number must not be less than zero"));
return;
}
if (num > INT_MAX) {
@@ -13065,9 +13065,9 @@ static void f_range(typval_T *argvars, typval_T *rettv, FunPtr fptr)
return; // Type error; errmsg already given.
}
if (stride == 0) {
- emsgf(_("E726: Stride is zero"));
+ EMSG(_("E726: Stride is zero"));
} else if (stride > 0 ? end + 1 < start : end - 1 > start) {
- emsgf(_("E727: Start past end"));
+ EMSG(_("E727: Start past end"));
} else {
tv_list_alloc_ret(rettv, (end - start) / stride);
for (i = start; stride > 0 ? i <= end : i >= end; i += stride) {
@@ -13404,7 +13404,7 @@ static void f_remove(typval_T *argvars, typval_T *rettv, FunPtr fptr)
}
}
if (li == NULL) { // Didn't find "item2" after "item".
- emsgf(_(e_invrange));
+ EMSG(_(e_invrange));
} else {
tv_list_move_items(l, item, item2, tv_list_alloc_ret(rettv, cnt),
cnt);
@@ -14719,7 +14719,7 @@ static void set_qf_ll_list(win_T *wp, typval_T *args, typval_T *rettv)
} else if (title_arg->v_type == VAR_DICT) {
d = title_arg->vval.v_dict;
} else {
- emsgf(_(e_dictreq));
+ EMSG(_(e_dictreq));
return;
}
@@ -16217,7 +16217,7 @@ static void f_submatch(typval_T *argvars, typval_T *rettv, FunPtr fptr)
}
if (no < 0 || no >= NSUBEXP) {
- EMSGN(_("E935: invalid submatch number: %d"), no);
+ emsgf(_("E935: invalid submatch number: %d"), no);
return;
}
int retList = 0;
@@ -17581,7 +17581,7 @@ static void f_winrestview(typval_T *argvars, typval_T *rettv, FunPtr fptr)
if (argvars[0].v_type != VAR_DICT
|| (dict = argvars[0].vval.v_dict) == NULL) {
- emsgf(_(e_invarg));
+ EMSG(_(e_invarg));
} else {
dictitem_T *di;
if ((di = tv_dict_find(dict, S_LEN("lnum"))) != NULL) {
@@ -19367,7 +19367,7 @@ static bool var_check_fixed(const int flags, const char *name,
} else if (name_len == TV_CSTRING) {
name_len = strlen(name);
}
- emsgf(_("E795: Cannot delete variable %.*s"), (int)name_len, name);
+ EMSG3(_("E795: Cannot delete variable %.*s"), (int)name_len, name);
return true;
}
return false;
@@ -19976,7 +19976,7 @@ void ex_function(exarg_T *eap)
if (*p == '\n') {
line_arg = p + 1;
} else if (*p != NUL && *p != '"' && !eap->skip && !did_emsg) {
- emsgf(_(e_trailing));
+ EMSG(_(e_trailing));
}
/*
diff --git a/src/nvim/eval/encode.c b/src/nvim/eval/encode.c
index 9bae436e3d..2563e38258 100644
--- a/src/nvim/eval/encode.c
+++ b/src/nvim/eval/encode.c
@@ -609,14 +609,14 @@ static inline int convert_to_json_string(garray_T *const gap,
if (ch > 0x7F && shift == 1) {
emsgf(_("E474: String \"%.*s\" contains byte that does not start "
"any UTF-8 character"),
- utf_len - (i - shift), utf_buf + i - shift);
+ (int)(utf_len - (i - shift)), utf_buf + i - shift);
xfree(tofree);
return FAIL;
} else if ((SURROGATE_HI_START <= ch && ch <= SURROGATE_HI_END)
|| (SURROGATE_LO_START <= ch && ch <= SURROGATE_LO_END)) {
emsgf(_("E474: UTF-8 string contains code point which belongs "
"to a surrogate pair: %.*s"),
- utf_len - (i - shift), utf_buf + i - shift);
+ (int)(utf_len - (i - shift)), utf_buf + i - shift);
xfree(tofree);
return FAIL;
} else if (ENCODE_RAW(ch)) {
diff --git a/src/nvim/eval/typval.c b/src/nvim/eval/typval.c
index 55dcfcc198..6a93b20345 100644
--- a/src/nvim/eval/typval.c
+++ b/src/nvim/eval/typval.c
@@ -991,7 +991,7 @@ const char *tv_list_find_str(list_T *const l, const int n)
{
const listitem_T *const li = tv_list_find(l, n);
if (li == NULL) {
- emsgf(_(e_listidx), (int64_t)n);
+ EMSG2(_(e_listidx), (int64_t)n);
return NULL;
}
return tv_get_string(TV_LIST_ITEM_TV(li));
@@ -1532,7 +1532,7 @@ bool tv_dict_get_callback(dict_T *const d,
}
if (!tv_is_func(di->di_tv) && di->di_tv.v_type != VAR_STRING) {
- emsgf(_("E6000: Argument is not a function or function name"));
+ EMSG(_("E6000: Argument is not a function or function name"));
return false;
}
@@ -2298,7 +2298,7 @@ void tv_item_lock(typval_T *const tv, const int deep, const bool lock)
static int recurse = 0;
if (recurse >= DICT_MAXNEST) {
- emsgf(_("E743: variable nested too deep for (un)lock"));
+ EMSG(_("E743: variable nested too deep for (un)lock"));
return;
}
if (deep == 0) {
@@ -2546,28 +2546,28 @@ bool tv_check_str_or_nr(const typval_T *const tv)
return true;
}
case VAR_FLOAT: {
- emsgf(_("E805: Expected a Number or a String, Float found"));
+ EMSG(_("E805: Expected a Number or a String, Float found"));
return false;
}
case VAR_PARTIAL:
case VAR_FUNC: {
- emsgf(_("E703: Expected a Number or a String, Funcref found"));
+ EMSG(_("E703: Expected a Number or a String, Funcref found"));
return false;
}
case VAR_LIST: {
- emsgf(_("E745: Expected a Number or a String, List found"));
+ EMSG(_("E745: Expected a Number or a String, List found"));
return false;
}
case VAR_DICT: {
- emsgf(_("E728: Expected a Number or a String, Dictionary found"));
+ EMSG(_("E728: Expected a Number or a String, Dictionary found"));
return false;
}
case VAR_SPECIAL: {
- emsgf(_("E5300: Expected a Number or a String"));
+ EMSG(_("E5300: Expected a Number or a String"));
return false;
}
case VAR_UNKNOWN: {
- emsgf(_(e_intern2), "tv_check_str_or_nr(UNKNOWN)");
+ EMSG2(_(e_intern2), "tv_check_str_or_nr(UNKNOWN)");
return false;
}
}
@@ -2611,7 +2611,7 @@ bool tv_check_num(const typval_T *const tv)
case VAR_DICT:
case VAR_FLOAT:
case VAR_UNKNOWN: {
- emsgf(_(num_errors[tv->v_type]));
+ EMSG(_(num_errors[tv->v_type]));
return false;
}
}
@@ -2655,7 +2655,7 @@ bool tv_check_str(const typval_T *const tv)
case VAR_DICT:
case VAR_FLOAT:
case VAR_UNKNOWN: {
- emsgf(_(str_errors[tv->v_type]));
+ EMSG(_(str_errors[tv->v_type]));
return false;
}
}
@@ -2702,7 +2702,7 @@ varnumber_T tv_get_number_chk(const typval_T *const tv, bool *const ret_error)
case VAR_LIST:
case VAR_DICT:
case VAR_FLOAT: {
- emsgf(_(num_errors[tv->v_type]));
+ EMSG(_(num_errors[tv->v_type]));
break;
}
case VAR_NUMBER: {
@@ -2778,23 +2778,23 @@ float_T tv_get_float(const typval_T *const tv)
}
case VAR_PARTIAL:
case VAR_FUNC: {
- emsgf(_("E891: Using a Funcref as a Float"));
+ EMSG(_("E891: Using a Funcref as a Float"));
break;
}
case VAR_STRING: {
- emsgf(_("E892: Using a String as a Float"));
+ EMSG(_("E892: Using a String as a Float"));
break;
}
case VAR_LIST: {
- emsgf(_("E893: Using a List as a Float"));
+ EMSG(_("E893: Using a List as a Float"));
break;
}
case VAR_DICT: {
- emsgf(_("E894: Using a Dictionary as a Float"));
+ EMSG(_("E894: Using a Dictionary as a Float"));
break;
}
case VAR_SPECIAL: {
- emsgf(_("E907: Using a special value as a Float"));
+ EMSG(_("E907: Using a special value as a Float"));
break;
}
case VAR_UNKNOWN: {
@@ -2840,7 +2840,7 @@ const char *tv_get_string_buf_chk(const typval_T *const tv, char *const buf)
case VAR_DICT:
case VAR_FLOAT:
case VAR_UNKNOWN: {
- emsgf(_(str_errors[tv->v_type]));
+ EMSG(_(str_errors[tv->v_type]));
return false;
}
}
diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c
index 4d6720ef23..1ec00b1e25 100644
--- a/src/nvim/ex_getln.c
+++ b/src/nvim/ex_getln.c
@@ -2696,7 +2696,7 @@ static bool color_cmdline(CmdlineInfo *colored_ccline)
}
const list_T *const l = TV_LIST_ITEM_TV(li)->vval.v_list;
if (tv_list_len(l) != 3) {
- PRINT_ERRMSG(_("E5402: List item %i has incorrect length: %li /= 3"),
+ PRINT_ERRMSG(_("E5402: List item %i has incorrect length: %d /= 3"),
i, tv_list_len(l));
goto color_cmdline_error;
}
diff --git a/src/nvim/fileio.c b/src/nvim/fileio.c
index ae0b24f3c8..3ab7710de5 100644
--- a/src/nvim/fileio.c
+++ b/src/nvim/fileio.c
@@ -3686,7 +3686,7 @@ nofail:
} else if (errmsgarg != 0) {
emsgf(errmsg, os_strerror(errmsgarg));
} else {
- emsgf(errmsg);
+ EMSG(errmsg);
}
if (errmsg_allocated) {
xfree(errmsg);
@@ -6216,8 +6216,8 @@ static int do_autocmd_event(event_T event, char_u *pat, int nested, char_u *cmd,
/* refuse to add buffer-local ap if buffer number is invalid */
if (is_buflocal && (buflocal_nr == 0
|| buflist_findnr(buflocal_nr) == NULL)) {
- EMSGN(_("E680: <buffer=%d>: invalid buffer number "),
- buflocal_nr);
+ emsgf(_("E680: <buffer=%d>: invalid buffer number "),
+ buflocal_nr);
return FAIL;
}
diff --git a/src/nvim/garray.h b/src/nvim/garray.h
index 94e1b61671..58738df691 100644
--- a/src/nvim/garray.h
+++ b/src/nvim/garray.h
@@ -37,7 +37,7 @@ typedef struct growarray {
static inline void *ga_append_via_ptr(garray_T *gap, size_t item_size)
{
if ((int)item_size != gap->ga_itemsize) {
- WLOG("wrong item size (%d), should be %d", item_size, gap->ga_itemsize);
+ WLOG("wrong item size (%zu), should be %d", item_size, gap->ga_itemsize);
}
ga_grow(gap, 1);
return ((char *)gap->ga_data) + (item_size * (size_t)gap->ga_len++);
diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c
index 2eb2df399e..94702a9a3a 100644
--- a/src/nvim/getchar.c
+++ b/src/nvim/getchar.c
@@ -420,7 +420,7 @@ void typeahead_noflush(int c)
* typeahead buffer (used in case of an error). If "flush_typeahead" is true,
* flush all typeahead characters (used when interrupted by a CTRL-C).
*/
-void flush_buffers(int flush_typeahead)
+void flush_buffers(flush_buffers_T flush_typeahead)
{
init_typebuf();
@@ -428,22 +428,24 @@ void flush_buffers(int flush_typeahead)
while (read_readbuffers(TRUE) != NUL) {
}
- if (flush_typeahead) { /* remove all typeahead */
- /*
- * We have to get all characters, because we may delete the first part
- * of an escape sequence.
- * In an xterm we get one char at a time and we have to get them all.
- */
- while (inchar(typebuf.tb_buf, typebuf.tb_buflen - 1, 10L) != 0) {
+ if (flush_typeahead == FLUSH_MINIMAL) {
+ // remove mapped characters at the start only
+ typebuf.tb_off += typebuf.tb_maplen;
+ typebuf.tb_len -= typebuf.tb_maplen;
+ } else {
+ // remove typeahead
+ if (flush_typeahead == FLUSH_INPUT) {
+ // We have to get all characters, because we may delete the first
+ // part of an escape sequence. In an xterm we get one char at a
+ // time and we have to get them all.
+ while (inchar(typebuf.tb_buf, typebuf.tb_buflen - 1, 10L) != 0) {
+ }
}
typebuf.tb_off = MAXMAPLEN;
typebuf.tb_len = 0;
// Reset the flag that text received from a client or from feedkeys()
// was inserted in the typeahead buffer.
typebuf_was_filled = false;
- } else { // remove mapped characters at the start only
- typebuf.tb_off += typebuf.tb_maplen;
- typebuf.tb_len -= typebuf.tb_maplen;
}
typebuf.tb_maplen = 0;
typebuf.tb_silent = 0;
@@ -1538,6 +1540,7 @@ int plain_vgetc(void)
* Check if a character is available, such that vgetc() will not block.
* If the next character is a special character or multi-byte, the returned
* character is not valid!.
+ * Returns NUL if no character is available.
*/
int vpeekc(void)
{
@@ -1602,7 +1605,8 @@ vungetc ( /* unget one character (can only be done once!) */
/// KeyTyped is set to TRUE in the case the user typed the key.
/// KeyStuffed is TRUE if the character comes from the stuff buffer.
/// if "advance" is FALSE (vpeekc()):
-/// just look whether there is a character available.
+/// Just look whether there is a character available.
+/// Return NUL if not.
///
/// When `no_mapping` (global) is zero, checks for mappings in the current mode.
/// Only returns one byte (of a multi-byte character).
@@ -1709,7 +1713,7 @@ static int vgetorpeek(int advance)
} else {
c = Ctrl_C;
}
- flush_buffers(true); // flush all typeahead
+ flush_buffers(FLUSH_INPUT); // flush all typeahead
if (advance) {
/* Also record this character, it might be needed to
@@ -1970,8 +1974,8 @@ static int vgetorpeek(int advance)
redrawcmdline();
else
setcursor();
- flush_buffers(FALSE);
- mapdepth = 0; /* for next one */
+ flush_buffers(FLUSH_MINIMAL);
+ mapdepth = 0; // for next one
c = -1;
break;
}
diff --git a/src/nvim/getchar.h b/src/nvim/getchar.h
index 38a2e75663..4f548d975a 100644
--- a/src/nvim/getchar.h
+++ b/src/nvim/getchar.h
@@ -16,6 +16,13 @@ enum {
REMAP_SKIP = -3, ///< No remapping for first char.
} RemapValues;
+// Argument for flush_buffers().
+typedef enum {
+ FLUSH_MINIMAL,
+ FLUSH_TYPEAHEAD, // flush current typebuf contents
+ FLUSH_INPUT // flush typebuf and inchar() input
+} flush_buffers_T;
+
#define KEYLEN_PART_KEY -1 /* keylen value for incomplete key-code */
#define KEYLEN_PART_MAP -2 /* keylen value for incomplete mapping */
#define KEYLEN_REMOVED 9999 /* keylen value for removed sequence */
diff --git a/src/nvim/log.c b/src/nvim/log.c
index 719f0da340..4d912c452b 100644
--- a/src/nvim/log.c
+++ b/src/nvim/log.c
@@ -103,7 +103,7 @@ void log_unlock(void)
/// @param line_num source line number, or -1
bool logmsg(int log_level, const char *context, const char *func_name,
int line_num, bool eol, const char *fmt, ...)
- FUNC_ATTR_UNUSED
+ FUNC_ATTR_UNUSED FUNC_ATTR_PRINTF(6, 7)
{
if (log_level < MIN_LOG_LEVEL) {
return false;
@@ -245,7 +245,8 @@ end:
static bool do_log_to_file(FILE *log_file, int log_level, const char *context,
const char *func_name, int line_num, bool eol,
- const char* fmt, ...)
+ const char *fmt, ...)
+ FUNC_ATTR_PRINTF(7, 8)
{
va_list args;
va_start(args, fmt);
diff --git a/src/nvim/lua/executor.c b/src/nvim/lua/executor.c
index 02eabb9c89..a7bda9d037 100644
--- a/src/nvim/lua/executor.c
+++ b/src/nvim/lua/executor.c
@@ -291,7 +291,7 @@ static int nlua_print(lua_State *const lstate)
return 0;
nlua_print_error:
emsgf(_("E5114: Error while converting print argument #%i: %.*s"),
- curargidx, errmsg_len, errmsg);
+ curargidx, (int)errmsg_len, errmsg);
ga_clear(&msg_ga);
lua_pop(lstate, lua_gettop(lstate));
return 0;
diff --git a/src/nvim/main.c b/src/nvim/main.c
index 1db988b5f4..af54e62393 100644
--- a/src/nvim/main.c
+++ b/src/nvim/main.c
@@ -840,7 +840,7 @@ static void command_line_scan(mparm_T *parmp)
}
if (p == NULL) {
- emsgf(_(e_outofmem));
+ EMSG(_(e_outofmem));
}
Object md = DICTIONARY_OBJ(api_metadata());
diff --git a/src/nvim/memline.c b/src/nvim/memline.c
index ec0238e7c9..51f99db0de 100644
--- a/src/nvim/memline.c
+++ b/src/nvim/memline.c
@@ -49,6 +49,7 @@
#include "nvim/buffer.h"
#include "nvim/cursor.h"
#include "nvim/eval.h"
+#include "nvim/getchar.h"
#include "nvim/fileio.h"
#include "nvim/func_attr.h"
#include "nvim/main.h"
@@ -3358,12 +3359,16 @@ static char *findswapname(buf_T *buf, char **dirp, char *old_fname,
choice = do_swapexists(buf, (char_u *) fname);
if (choice == 0) {
- /* Show info about the existing swap file. */
- attention_message(buf, (char_u *) fname);
+ // Show info about the existing swap file.
+ attention_message(buf, (char_u *)fname);
- /* We don't want a 'q' typed at the more-prompt
- * interrupt loading a file. */
- got_int = FALSE;
+ // We don't want a 'q' typed at the more-prompt
+ // interrupt loading a file.
+ got_int = false;
+
+ // If vimrc has "simalt ~x" we don't want it to
+ // interfere with the prompt here.
+ flush_buffers(FLUSH_TYPEAHEAD);
}
if (swap_exists_action != SEA_NONE && choice == 0) {
diff --git a/src/nvim/message.c b/src/nvim/message.c
index fc7e96ac2c..1778e0048f 100644
--- a/src/nvim/message.c
+++ b/src/nvim/message.c
@@ -331,6 +331,7 @@ void trunc_string(char_u *s, char_u *buf, int room_in, int buflen)
*/
int smsg(char *s, ...)
+ FUNC_ATTR_PRINTF(1, 2)
{
va_list arglist;
@@ -341,6 +342,7 @@ int smsg(char *s, ...)
}
int smsg_attr(int attr, char *s, ...)
+ FUNC_ATTR_PRINTF(2, 3)
{
va_list arglist;
@@ -550,7 +552,7 @@ int emsg(const char_u *s_)
if (p_eb) {
beep_flush(); // also includes flush_buffers()
} else {
- flush_buffers(false); // flush internal buffers
+ flush_buffers(FLUSH_MINIMAL); // flush internal buffers
}
did_emsg = true; // flag for DoOneCmd()
}
@@ -581,6 +583,7 @@ void emsg_invreg(int name)
/// Print an error message with unknown number of arguments
bool emsgf(const char *const fmt, ...)
+ FUNC_ATTR_PRINTF(1, 2)
{
bool ret;
@@ -644,6 +647,7 @@ static void msg_emsgf_event(void **argv)
}
void msg_schedule_emsgf(const char *const fmt, ...)
+ FUNC_ATTR_PRINTF(1, 2)
{
va_list ap;
va_start(ap, fmt);
@@ -1672,7 +1676,7 @@ void msg_puts_attr_len(const char *const str, const ptrdiff_t len, int attr)
/// @param[in] attr Highlight attributes.
/// @param[in] fmt Format string.
void msg_printf_attr(const int attr, const char *const fmt, ...)
- FUNC_ATTR_NONNULL_ARG(2)
+ FUNC_ATTR_NONNULL_ARG(2) FUNC_ATTR_PRINTF(2, 3)
{
static char msgbuf[IOSIZE];
diff --git a/src/nvim/misc1.c b/src/nvim/misc1.c
index 2e7fe4d7a9..7e9d68a4b4 100644
--- a/src/nvim/misc1.c
+++ b/src/nvim/misc1.c
@@ -2548,7 +2548,7 @@ void msgmore(long n)
void beep_flush(void)
{
if (emsg_silent == 0) {
- flush_buffers(false);
+ flush_buffers(FLUSH_MINIMAL);
vim_beep(BO_ERROR);
}
}
diff --git a/src/nvim/ops.c b/src/nvim/ops.c
index e902127a40..5a6e56299d 100644
--- a/src/nvim/ops.c
+++ b/src/nvim/ops.c
@@ -2159,9 +2159,17 @@ void op_insert(oparg_T *oap, long count1)
* Subsequent calls to ml_get() flush the firstline data - take a
* copy of the required string.
*/
- firstline = ml_get(oap->start.lnum) + bd.textcol;
- if (oap->op_type == OP_APPEND)
- firstline += bd.textlen;
+ firstline = ml_get(oap->start.lnum);
+ const size_t len = STRLEN(firstline);
+ colnr_T add = bd.textcol;
+ if (oap->op_type == OP_APPEND) {
+ add += bd.textlen;
+ }
+ if ((size_t)add > len) {
+ firstline += len; // short line, point to the NUL
+ } else {
+ firstline += add;
+ }
ins_len = (long)STRLEN(firstline) - pre_textlen;
if (pre_textlen >= 0 && ins_len > 0) {
ins_text = vim_strnsave(firstline, (size_t)ins_len);
diff --git a/src/nvim/regexp_nfa.c b/src/nvim/regexp_nfa.c
index 65ddcf3b07..fe18cb4389 100644
--- a/src/nvim/regexp_nfa.c
+++ b/src/nvim/regexp_nfa.c
@@ -1384,8 +1384,8 @@ static int nfa_regatom(void)
re_has_z = REX_SET;
break;
default:
- EMSGN(_("E867: (NFA) Unknown operator '\\z%c'"),
- no_Magic(c));
+ emsgf(_("E867: (NFA) Unknown operator '\\z%c'"),
+ no_Magic(c));
return FAIL;
}
break;
@@ -1524,8 +1524,8 @@ static int nfa_regatom(void)
break;
}
}
- EMSGN(_("E867: (NFA) Unknown operator '\\%%%c'"),
- no_Magic(c));
+ emsgf(_("E867: (NFA) Unknown operator '\\%%%c'"),
+ no_Magic(c));
return FAIL;
}
break;
@@ -1937,7 +1937,7 @@ static int nfa_regpiece(void)
break;
}
if (i == 0) {
- EMSGN(_("E869: (NFA) Unknown operator '\\@%c'"), op);
+ emsgf(_("E869: (NFA) Unknown operator '\\@%c'"), op);
return FAIL;
}
EMIT(i);
diff --git a/src/nvim/shada.c b/src/nvim/shada.c
index f4454504a4..11da7195bf 100644
--- a/src/nvim/shada.c
+++ b/src/nvim/shada.c
@@ -884,7 +884,7 @@ static int shada_read_file(const char *const file, const int flags)
if (p_verbose > 0) {
verbose_enter();
- smsg(_("Reading ShaDa file \"%s\"%s%s%s"),
+ smsg(_("Reading ShaDa file \"%s\"%s%s%s%s"),
fname,
(flags & kShaDaWantInfo) ? _(" info") : "",
(flags & kShaDaWantMarks) ? _(" marks") : "",
@@ -2033,7 +2033,7 @@ static const char *shada_format_entry(const ShadaEntry entry)
{
static char ret[1024];
ret[0] = 0;
- vim_snprintf(S_LEN(ret), "[ ] ts=%" PRIu64 " ");
+ vim_snprintf(S_LEN(ret), "%s", "[ ] ts=%" PRIu64 " ");
// ^ Space for `can_free_entry`
switch (entry.type) {
case kSDItemMissing: {
@@ -2091,7 +2091,7 @@ static const char *shada_format_entry(const ShadaEntry entry)
entry.data.filemark.mark.lnum, \
entry.data.filemark.mark.col, \
entry.data.filemark.mark.coladd, \
- entry.data.filemark.additional_data, \
+ (void *)entry.data.filemark.additional_data, \
ad_len, \
ad); \
} while (0)
diff --git a/src/nvim/spellfile.c b/src/nvim/spellfile.c
index f52ae61534..8be8d24b9f 100644
--- a/src/nvim/spellfile.c
+++ b/src/nvim/spellfile.c
@@ -3096,8 +3096,8 @@ static int spell_read_dic(spellinfo_T *spin, char_u *fname, afffile_T *affile)
if (spin->si_verbose && spin->si_msg_count > 10000) {
spin->si_msg_count = 0;
vim_snprintf((char *)message, sizeof(message),
- _("line %6d, word %6d - %s"),
- lnum, spin->si_foldwcount + spin->si_keepwcount, w);
+ _("line %6d, word %6ld - %s"),
+ lnum, spin->si_foldwcount + spin->si_keepwcount, w);
msg_start();
msg_puts_long_attr(message, 0);
msg_clr_eos();
@@ -3570,7 +3570,7 @@ static int spell_read_wordfile(spellinfo_T *spin, char_u *fname)
if (spin->si_conv.vc_type != CONV_NONE) {
pc = string_convert(&spin->si_conv, rline, NULL);
if (pc == NULL) {
- smsg(_("Conversion failure for word in %s line %d: %s"),
+ smsg(_("Conversion failure for word in %s line %ld: %s"),
fname, lnum, rline);
continue;
}
@@ -3583,13 +3583,13 @@ static int spell_read_wordfile(spellinfo_T *spin, char_u *fname)
if (*line == '/') {
++line;
if (STRNCMP(line, "encoding=", 9) == 0) {
- if (spin->si_conv.vc_type != CONV_NONE)
- smsg(_("Duplicate /encoding= line ignored in %s line %d: %s"),
+ if (spin->si_conv.vc_type != CONV_NONE) {
+ smsg(_("Duplicate /encoding= line ignored in %s line %ld: %s"),
fname, lnum, line - 1);
- else if (did_word)
- smsg(_("/encoding= line after word ignored in %s line %d: %s"),
+ } else if (did_word) {
+ smsg(_("/encoding= line after word ignored in %s line %ld: %s"),
fname, lnum, line - 1);
- else {
+ } else {
char_u *enc;
// Setup for conversion to 'encoding'.
@@ -3607,13 +3607,13 @@ static int spell_read_wordfile(spellinfo_T *spin, char_u *fname)
}
if (STRNCMP(line, "regions=", 8) == 0) {
- if (spin->si_region_count > 1)
- smsg(_("Duplicate /regions= line ignored in %s line %d: %s"),
+ if (spin->si_region_count > 1) {
+ smsg(_("Duplicate /regions= line ignored in %s line %ld: %s"),
fname, lnum, line);
- else {
+ } else {
line += 8;
if (STRLEN(line) > MAXREGIONS * 2) {
- smsg(_("Too many regions in %s line %d: %s"),
+ smsg(_("Too many regions in %s line %ld: %s"),
fname, lnum, line);
} else {
spin->si_region_count = (int)STRLEN(line) / 2;
@@ -3626,7 +3626,7 @@ static int spell_read_wordfile(spellinfo_T *spin, char_u *fname)
continue;
}
- smsg(_("/ line ignored in %s line %d: %s"),
+ smsg(_("/ line ignored in %s line %ld: %s"),
fname, lnum, line - 1);
continue;
}
@@ -3652,13 +3652,13 @@ static int spell_read_wordfile(spellinfo_T *spin, char_u *fname)
l = *p - '0';
if (l == 0 || l > spin->si_region_count) {
- smsg(_("Invalid region nr in %s line %d: %s"),
+ smsg(_("Invalid region nr in %s line %ld: %s"),
fname, lnum, p);
break;
}
regionmask |= 1 << (l - 1);
} else {
- smsg(_("Unrecognized flags in %s line %d: %s"),
+ smsg(_("Unrecognized flags in %s line %ld: %s"),
fname, lnum, p);
break;
}
@@ -5136,7 +5136,7 @@ mkspell (
} else if (vim_strchr(path_tail(wfname), '_') != NULL) {
EMSG(_("E751: Output file name must not have region name"));
} else if (incount > MAXREGIONS) {
- EMSGN(_("E754: Only up to %ld regions supported"), MAXREGIONS);
+ emsgf(_("E754: Only up to %d regions supported"), MAXREGIONS);
} else {
// Check for overwriting before doing things that may take a lot of
// time.
diff --git a/src/nvim/strings.c b/src/nvim/strings.c
index 17c4a75a64..3b0a950ff2 100644
--- a/src/nvim/strings.c
+++ b/src/nvim/strings.c
@@ -693,6 +693,7 @@ static float_T tv_float(typval_T *const tvs, int *const idxp)
///
/// @see vim_vsnprintf().
int vim_snprintf_add(char *str, size_t str_m, char *fmt, ...)
+ FUNC_ATTR_PRINTF(3, 4)
{
const size_t len = strlen(str);
size_t space;
@@ -718,6 +719,7 @@ int vim_snprintf_add(char *str, size_t str_m, char *fmt, ...)
/// @return Number of bytes excluding NUL byte that would be written to the
/// string if str_m was greater or equal to the return value.
int vim_snprintf(char *str, size_t str_m, const char *fmt, ...)
+ FUNC_ATTR_PRINTF(3, 4)
{
va_list ap;
va_start(ap, fmt);
diff --git a/src/nvim/testdir/test_blockedit.vim b/src/nvim/testdir/test_blockedit.vim
index 4a8d59952e..527224ccd2 100644
--- a/src/nvim/testdir/test_blockedit.vim
+++ b/src/nvim/testdir/test_blockedit.vim
@@ -16,5 +16,18 @@ func Test_blockinsert_indent()
bwipe!
endfunc
+func Test_blockinsert_delete()
+ new
+ let _bs = &bs
+ set bs=2
+ call setline(1, ['case Arg is ', ' when Name_Async,', ' when Name_Num_Gangs,', 'end if;'])
+ exe "norm! ggjVj\<c-v>$o$A\<bs>\<esc>"
+ "call feedkeys("Vj\<c-v>$o$A\<bs>\<esc>", 'ti')
+ call assert_equal(["case Arg is ", " when Name_Async", " when Name_Num_Gangs,", "end if;"],
+ \ getline(1,'$'))
+ " reset to sane state
+ let &bs = _bs
+ bwipe!
+endfunc
" vim: shiftwidth=2 sts=2 expandtab
diff --git a/src/nvim/testdir/test_functions.vim b/src/nvim/testdir/test_functions.vim
index 8fde63b55f..b1138bfc96 100644
--- a/src/nvim/testdir/test_functions.vim
+++ b/src/nvim/testdir/test_functions.vim
@@ -189,6 +189,52 @@ func Test_strftime()
call assert_fails('call strftime("%Y", [])', 'E745:')
endfunc
+func Test_resolve()
+ if !has('unix')
+ return
+ endif
+
+ " Xlink1 -> Xlink2
+ " Xlink2 -> Xlink3
+ silent !ln -s -f Xlink2 Xlink1
+ silent !ln -s -f Xlink3 Xlink2
+ call assert_equal('Xlink3', resolve('Xlink1'))
+ call assert_equal('./Xlink3', resolve('./Xlink1'))
+ call assert_equal('Xlink3/', resolve('Xlink2/'))
+ " FIXME: these tests result in things like "Xlink2/" instead of "Xlink3/"?!
+ "call assert_equal('Xlink3/', resolve('Xlink1/'))
+ "call assert_equal('./Xlink3/', resolve('./Xlink1/'))
+ "call assert_equal(getcwd() . '/Xlink3/', resolve(getcwd() . '/Xlink1/'))
+ call assert_equal(getcwd() . '/Xlink3', resolve(getcwd() . '/Xlink1'))
+
+ " Test resolve() with a symlink cycle.
+ " Xlink1 -> Xlink2
+ " Xlink2 -> Xlink3
+ " Xlink3 -> Xlink1
+ silent !ln -s -f Xlink1 Xlink3
+ call assert_fails('call resolve("Xlink1")', 'E655:')
+ call assert_fails('call resolve("./Xlink1")', 'E655:')
+ call assert_fails('call resolve("Xlink2")', 'E655:')
+ call assert_fails('call resolve("Xlink3")', 'E655:')
+ call delete('Xlink1')
+ call delete('Xlink2')
+ call delete('Xlink3')
+
+ silent !ln -s -f Xdir//Xfile Xlink
+ call assert_equal('Xdir/Xfile', resolve('Xlink'))
+ call delete('Xlink')
+
+ silent !ln -s -f Xlink2/ Xlink1
+ call assert_equal('Xlink2', resolve('Xlink1'))
+ call assert_equal('Xlink2/', resolve('Xlink1/'))
+ call delete('Xlink1')
+
+ silent !ln -s -f ./Xlink2 Xlink1
+ call assert_equal('Xlink2', resolve('Xlink1'))
+ call assert_equal('./Xlink2', resolve('./Xlink1'))
+ call delete('Xlink1')
+endfunc
+
func Test_simplify()
call assert_equal('', simplify(''))
call assert_equal('/', simplify('/'))
@@ -818,6 +864,19 @@ func Test_filewritable()
bw!
endfunc
+func Test_Executable()
+ if has('win32')
+ call assert_equal(1, executable('notepad'))
+ call assert_equal(1, executable('notepad.exe'))
+ call assert_equal(0, executable('notepad.exe.exe'))
+ call assert_equal(1, executable('shell32.dll'))
+ call assert_equal(1, executable('win.ini'))
+ elseif has('unix')
+ call assert_equal(1, executable('cat'))
+ call assert_equal(0, executable('nodogshere'))
+ endif
+endfunc
+
func Test_hostname()
let hostname_vim = hostname()
if has('unix')
diff --git a/src/nvim/testdir/test_options.vim b/src/nvim/testdir/test_options.vim
index 66acb79206..7b640ee2ff 100644
--- a/src/nvim/testdir/test_options.vim
+++ b/src/nvim/testdir/test_options.vim
@@ -262,7 +262,7 @@ func Test_set_ttytype()
" in travis on some builds. Why? Catch both for now
try
set ttytype=
- call assert_report('set ttype= did not fail')
+ call assert_report('set ttytype= did not fail')
catch /E529\|E522/
endtry
@@ -270,7 +270,7 @@ func Test_set_ttytype()
" check for failure of finding the entry and for missing 'cm' entry.
try
set ttytype=xxx
- call assert_report('set ttype=xxx did not fail')
+ call assert_report('set ttytype=xxx did not fail')
catch /E522\|E437/
endtry
diff --git a/src/nvim/tui/terminfo.c b/src/nvim/tui/terminfo.c
index c3dc4124b9..ad86dd928b 100644
--- a/src/nvim/tui/terminfo.c
+++ b/src/nvim/tui/terminfo.c
@@ -144,7 +144,7 @@ void terminfo_info_msg(const unibi_term *const ut)
for (enum unibi_numeric i = unibi_numeric_begin_ + 1;
i < unibi_numeric_end_; i++) {
int n = unibi_get_num(ut, i); // -1 means "empty"
- msg_printf_attr(0, " %-25s %-10s = %hd\n", unibi_name_num(i),
+ msg_printf_attr(0, " %-25s %-10s = %d\n", unibi_name_num(i),
unibi_short_name_num(i), n);
}
@@ -173,7 +173,7 @@ void terminfo_info_msg(const unibi_term *const ut)
if (unibi_count_ext_num(ut)) {
msg_puts("Extended numeric capabilities:\n");
for (size_t i = 0; i < unibi_count_ext_num(ut); i++) {
- msg_printf_attr(0, " %-25s = %hd\n",
+ msg_printf_attr(0, " %-25s = %d\n",
unibi_get_ext_num_name(ut, i),
unibi_get_ext_num(ut, i));
}
diff --git a/src/nvim/undo.c b/src/nvim/undo.c
index 7dd101cb90..df0507ed41 100644
--- a/src/nvim/undo.c
+++ b/src/nvim/undo.c
@@ -2503,8 +2503,8 @@ void ex_undolist(exarg_T *eap)
while (uhp != NULL) {
if (uhp->uh_prev.ptr == NULL && uhp->uh_walk != nomark
&& uhp->uh_walk != mark) {
- vim_snprintf((char *)IObuff, IOSIZE, "%6ld %7ld ",
- uhp->uh_seq, changes);
+ vim_snprintf((char *)IObuff, IOSIZE, "%6ld %7d ",
+ uhp->uh_seq, changes);
u_add_time(IObuff + STRLEN(IObuff), IOSIZE - STRLEN(IObuff),
uhp->uh_time);
if (uhp->uh_save_nr > 0) {
diff --git a/third-party/CMakeLists.txt b/third-party/CMakeLists.txt
index b55b0cee69..4ca00b26cd 100644
--- a/third-party/CMakeLists.txt
+++ b/third-party/CMakeLists.txt
@@ -88,7 +88,7 @@ if(MINGW AND CMAKE_GENERATOR MATCHES "Ninja")
if(NOT MAKE_PRG)
message(FATAL_ERROR "GNU Make for mingw32 is required to build the dependecies.")
else()
- message(STATUS "Found GNU Make for mingw32 at ${MAKE_PRG}")
+ message(STATUS "Found GNU Make for mingw32: ${MAKE_PRG}")
endif()
endif()