aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.ci/api-python.sh19
-rw-r--r--.ci/clang-asan.sh39
-rwxr-xr-x.ci/clint.sh (renamed from scripts/clint.sh)0
-rw-r--r--.ci/common.sh97
-rw-r--r--.ci/coverity.sh16
-rw-r--r--.ci/gcc-ia32.sh26
-rw-r--r--.ci/gcc-unittest.sh11
-rw-r--r--.travis.yml24
-rw-r--r--Makefile1
-rw-r--r--README.md2
-rw-r--r--config/CMakeLists.txt1
-rw-r--r--config/config.h.in1
-rw-r--r--runtime/doc/change.txt8
-rw-r--r--runtime/doc/eval.txt3
-rw-r--r--runtime/doc/options.txt14
-rw-r--r--runtime/doc/os_vms.txt1
-rw-r--r--runtime/doc/term.txt18
-rw-r--r--runtime/doc/todo.txt1
-rwxr-xr-xscripts/travis.sh182
-rw-r--r--src/nvim/api/buffer.c2
-rw-r--r--src/nvim/api/private/helpers.c14
-rw-r--r--src/nvim/api/vim.c79
-rw-r--r--src/nvim/arabic.c13
-rw-r--r--src/nvim/ascii.h9
-rw-r--r--src/nvim/buffer.c13
-rw-r--r--src/nvim/buffer_defs.h1
-rw-r--r--src/nvim/charset.c6
-rw-r--r--src/nvim/digraph.c2
-rw-r--r--src/nvim/edit.c30
-rw-r--r--src/nvim/eval.c125
-rw-r--r--src/nvim/ex_cmds.c74
-rw-r--r--src/nvim/ex_getln.c102
-rw-r--r--src/nvim/file_search.c1
-rw-r--r--src/nvim/fileio.c100
-rw-r--r--src/nvim/garray.c3
-rw-r--r--src/nvim/getchar.c8
-rw-r--r--src/nvim/globals.h3
-rw-r--r--src/nvim/hardcopy.c28
-rw-r--r--src/nvim/indent.c2
-rw-r--r--src/nvim/mark_defs.h3
-rw-r--r--src/nvim/menu.c14
-rw-r--r--src/nvim/ops.c8
-rw-r--r--src/nvim/option.c63
-rw-r--r--src/nvim/option_defs.h4
-rw-r--r--src/nvim/os/fs.c45
-rw-r--r--src/nvim/os/provider.c6
-rw-r--r--src/nvim/os_unix.c77
-rw-r--r--src/nvim/os_unix_defs.h4
-rw-r--r--src/nvim/path.c56
-rw-r--r--src/nvim/regexp.c26
-rw-r--r--src/nvim/regexp_nfa.c41
-rw-r--r--src/nvim/screen.c62
-rw-r--r--src/nvim/search.c57
-rw-r--r--src/nvim/spell.c51
-rw-r--r--src/nvim/syntax.c19
-rw-r--r--src/nvim/tag.c39
-rw-r--r--src/nvim/tempfile.c27
-rw-r--r--src/nvim/term.c532
-rw-r--r--src/nvim/testdir/Makefile2
-rw-r--r--src/nvim/testdir/test100.in8
-rw-r--r--src/nvim/testdir/test100.ok10
-rw-r--r--src/nvim/testdir/test107.in38
-rw-r--r--src/nvim/testdir/test107.ok4
-rw-r--r--src/nvim/testdir/test2.in29
-rw-r--r--src/nvim/testdir/test2.ok4
-rw-r--r--src/nvim/testdir/test69.in7
-rw-r--r--src/nvim/testdir/test69.ok4
-rw-r--r--src/nvim/testdir/test95.in14
-rw-r--r--src/nvim/testdir/test95.ok12
-rw-r--r--src/nvim/testdir/test97.in11
-rw-r--r--src/nvim/testdir/test97.ok3
-rw-r--r--src/nvim/undo.c5
-rw-r--r--src/nvim/version.c194
-rw-r--r--src/nvim/window.c24
-rw-r--r--test/legacy/test2-filename-recognition.vroom40
-rw-r--r--test/unit/os/fs_spec.moon43
-rw-r--r--test/unit/path_spec.moon59
-rw-r--r--third-party/CMakeLists.txt4
78 files changed, 1332 insertions, 1396 deletions
diff --git a/.ci/api-python.sh b/.ci/api-python.sh
new file mode 100644
index 0000000000..093f6b7166
--- /dev/null
+++ b/.ci/api-python.sh
@@ -0,0 +1,19 @@
+. "$CI_SCRIPTS/common.sh"
+
+set_environment /opt/neovim-deps
+
+sudo apt-get install expect valgrind
+
+$MAKE_CMD
+
+git clone --depth=1 -b master git://github.com/neovim/python-client
+cd python-client
+sudo pip install .
+sudo pip install nose
+test_cmd="nosetests --verbosity=2"
+nvim_cmd="valgrind -q --track-origins=yes --leak-check=yes --suppressions=$suppressions --log-file=$tmpdir/valgrind-%p.log ../build/bin/nvim -u NONE"
+if ! ../scripts/run-api-tests.exp "$test_cmd" "$nvim_cmd"; then
+ valgrind_check "$tmpdir"
+ exit 1
+fi
+valgrind_check "$tmpdir"
diff --git a/.ci/clang-asan.sh b/.ci/clang-asan.sh
new file mode 100644
index 0000000000..3217f754d6
--- /dev/null
+++ b/.ci/clang-asan.sh
@@ -0,0 +1,39 @@
+. "$CI_SCRIPTS/common.sh"
+
+install_vroom
+
+set_environment /opt/neovim-deps
+
+sudo pip install cpp-coveralls
+
+clang_version=3.4
+if [ ! -d /usr/local/clang-$clang_version ]; then
+ echo "Downloading clang $clang_version..."
+ sudo mkdir /usr/local/clang-$clang_version
+ wget -q -O - http://llvm.org/releases/$clang_version/clang+llvm-$clang_version-x86_64-unknown-ubuntu12.04.xz \
+ | sudo tar xJf - --strip-components=1 -C /usr/local/clang-$clang_version
+fi
+export CC=/usr/local/clang-$clang_version/bin/clang
+symbolizer=/usr/local/clang-$clang_version/bin/llvm-symbolizer
+
+export SANITIZE=1
+export ASAN_SYMBOLIZER_PATH=$symbolizer
+export ASAN_OPTIONS="detect_leaks=1:log_path=$tmpdir/asan"
+export TSAN_OPTIONS="external_symbolizer_path=$symbolizer:log_path=$tmpdir/tsan"
+
+export SKIP_UNITTEST=1
+export UBSAN_OPTIONS="log_path=$tmpdir/ubsan" # not sure if this works
+
+install_dir="$(pwd)/dist"
+$MAKE_CMD cmake CMAKE_EXTRA_FLAGS="-DTRAVIS_CI_BUILD=ON -DCMAKE_INSTALL_PREFIX=$install_dir -DUSE_GCOV=ON"
+$MAKE_CMD
+if ! $MAKE_CMD test; then
+ reset
+ asan_check "$tmpdir"
+ exit 1
+fi
+
+asan_check "$tmpdir"
+coveralls --encoding iso-8859-1 || echo 'coveralls upload failed.'
+
+$MAKE_CMD install
diff --git a/scripts/clint.sh b/.ci/clint.sh
index 55eb5c9394..55eb5c9394 100755
--- a/scripts/clint.sh
+++ b/.ci/clint.sh
diff --git a/.ci/common.sh b/.ci/common.sh
new file mode 100644
index 0000000000..a31b3063e9
--- /dev/null
+++ b/.ci/common.sh
@@ -0,0 +1,97 @@
+valgrind_check() {
+ (
+ cd $1
+ set -- valgrind-[*] valgrind-*
+ case $1$2 in
+ 'valgrind-[*]valgrind-*')
+ ;;
+ *)
+ shift
+ local err=''
+ for valgrind_log in "$@"; do
+ # Remove useless warning
+ sed -i "$valgrind_log" \
+ -e '/Warning: noted but unhandled ioctl/d' \
+ -e '/could cause spurious value errors to appear/d' \
+ -e '/See README_MISSING_SYSCALL_OR_IOCTL for guidance/d'
+ if [ "$(stat -c %s $valgrind_log)" != "0" ]; then
+ # if after removing the warning, the log still has errors, show its
+ # contents and set the flag so we exit with non-zero status
+ cat "$valgrind_log"
+ err=1
+ fi
+ done
+ if [ -n "$err" ]; then
+ echo "Runtime errors detected"
+ exit 1
+ fi
+ ;;
+ esac
+ )
+}
+
+asan_check() {
+ (
+ cd $1
+ set -- [*]san.[*] *san.*
+ case $1$2 in
+ '[*]san.[*]*san.*')
+ ;;
+ *)
+ shift
+ cat "$@"
+ echo "Runtime errors detected"
+ exit 1
+ ;;
+ esac
+ )
+}
+
+set_environment() {
+ local prefix="$1"
+ eval $($prefix/bin/luarocks path)
+ export PATH="$prefix/bin:$PATH"
+ export PKG_CONFIG_PATH="$prefix/lib/pkgconfig"
+ export USE_BUNDLED_DEPS=OFF
+}
+
+
+install_prebuilt_deps() {
+ # install prebuilt dependencies
+ if [ ! -d /opt/neovim-deps ]; then
+ cd /opt
+ sudo git clone --depth=1 git://github.com/neovim/deps neovim-deps
+ cd -
+ fi
+}
+
+install_vroom() {
+ (
+ sudo pip install neovim
+ git clone git://github.com/google/vroom
+ cd vroom
+ python setup.py build
+ sudo python setup.py install
+ )
+}
+
+tmpdir="$(pwd)/tmp"
+rm -rf "$tmpdir"
+mkdir -p "$tmpdir"
+suppressions="$(pwd)/.valgrind.supp"
+
+# Travis reports back that it has 32-cores via /proc/cpuinfo, but it's not
+# what we really have available. According to their documentation, it only has
+# 1.5 virtual cores.
+# See:
+# http://docs.travis-ci.com/user/speeding-up-the-build/#Paralellizing-your-build-on-one-VM
+# for more information.
+MAKE_CMD="make -j2"
+
+install_prebuilt_deps
+
+# Pins the version of the java package installed on the Travis VMs
+# and avoids a lengthy upgrade process for them.
+sudo apt-mark hold oracle-java7-installer oracle-java8-installer
+
+sudo apt-get update
diff --git a/.ci/coverity.sh b/.ci/coverity.sh
new file mode 100644
index 0000000000..0edaf2e088
--- /dev/null
+++ b/.ci/coverity.sh
@@ -0,0 +1,16 @@
+. "$CI_SCRIPTS/common.sh"
+
+# temporarily disable error checking, the coverity script exits with
+# status code 1 whenever it (1) fails OR (2) is not on the correct
+# branch.
+set +e
+curl -s https://scan.coverity.com/scripts/travisci_build_coverity_scan.sh |
+COVERITY_SCAN_PROJECT_NAME="neovim/neovim" \
+ COVERITY_SCAN_NOTIFICATION_EMAIL="coverity@aktau.be" \
+ COVERITY_SCAN_BRANCH_PATTERN="coverity-scan" \
+ COVERITY_SCAN_BUILD_COMMAND_PREPEND="$MAKE_CMD deps" \
+ COVERITY_SCAN_BUILD_COMMAND="$MAKE_CMD nvim" \
+ bash
+set -e
+
+exit 0
diff --git a/.ci/gcc-ia32.sh b/.ci/gcc-ia32.sh
new file mode 100644
index 0000000000..05b539021e
--- /dev/null
+++ b/.ci/gcc-ia32.sh
@@ -0,0 +1,26 @@
+. "$CI_SCRIPTS/common.sh"
+
+install_vroom
+
+set_environment /opt/neovim-deps/32
+
+# Need this to keep apt-get from removing gcc when installing libncurses
+# below.
+sudo apt-get install libc6-dev libc6-dev:i386
+
+# Do this separately so that things get configured correctly, otherwise
+# libncurses fails to install.
+sudo apt-get install gcc-multilib g++-multilib
+
+# Install the dev version to get the pkg-config and symlinks installed
+# correctly.
+sudo apt-get install libncurses5-dev:i386
+
+CMAKE_EXTRA_FLAGS="-DTRAVIS_CI_BUILD=ON -DBUSTED_OUTPUT_TYPE=color_terminal \
+ -DCMAKE_SYSTEM_PROCESSOR=i386 \
+ -DCMAKE_SYSTEM_LIBRARY_PATH=/lib32:/usr/lib32:/usr/local/lib32 \
+ -DFIND_LIBRARY_USE_LIB64_PATHS=OFF \
+ -DCMAKE_IGNORE_PATH=/lib:/usr/lib:/usr/local/lib \
+ -DCMAKE_TOOLCHAIN_FILE=cmake/i386-linux-gnu.toolchain.cmake"
+$MAKE_CMD CMAKE_EXTRA_FLAGS="${CMAKE_EXTRA_FLAGS}" unittest
+$MAKE_CMD test
diff --git a/.ci/gcc-unittest.sh b/.ci/gcc-unittest.sh
new file mode 100644
index 0000000000..a4e4a6f35f
--- /dev/null
+++ b/.ci/gcc-unittest.sh
@@ -0,0 +1,11 @@
+. "$CI_SCRIPTS/common.sh"
+
+set_environment /opt/neovim-deps
+
+sudo pip install cpp-coveralls
+
+export CC=gcc
+export SKIP_EXEC=1
+$MAKE_CMD CMAKE_EXTRA_FLAGS="-DTRAVIS_CI_BUILD=ON -DBUSTED_OUTPUT_TYPE=color_terminal -DUSE_GCOV=ON" unittest
+
+coveralls --encoding iso-8859-1 || echo 'coveralls upload failed.'
diff --git a/.travis.yml b/.travis.yml
index 703419200d..1965fb72b8 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,15 +1,25 @@
language: c
env:
global:
+ - PROJECT_ROOT="$(pwd)"
+ - CI_SCRIPTS="$PROJECT_ROOT/.ci"
# The next declaration is the encrypted COVERITY_SCAN_TOKEN, created
# via the "travis encrypt" command using the project repo's public key
- secure: "QEz92NyItkzQu52kCFD928jEwUYnA2OIgSyeNrp+Y3gm5rOmSZerY8hGiXyNZxocap9+qIPCapRRYU3ZYKWZPeucWMLN3aIjxAFdhugKbnmNYE1jFugb6b8N3SxiX/3206NHXlYaz0OZhh6OBAFmPUXamJC8OrWVgPNPo7wv4UQ="
matrix:
- - TRAVIS_BUILD_TYPE=clang/asan
- - TRAVIS_BUILD_TYPE=gcc/ia32
- - TRAVIS_BUILD_TYPE=gcc/unittest
- - TRAVIS_BUILD_TYPE=clint
- - TRAVIS_BUILD_TYPE=api/python
- - TRAVIS_BUILD_TYPE=coverity
+ - CI_TARGET=clang-asan
+ - CI_TARGET=gcc-ia32
+ - CI_TARGET=gcc-unittest
+ - CI_TARGET=clint
+ - CI_TARGET=api-python
+ - CI_TARGET=coverity
+before_install:
+ # Adds user to a dummy group.
+ # That allows to test changing the group of the file by `os_fchown`.
+ - sudo groupadd chown_test
+ - sudo usermod -a -G chown_test ${USER}
script:
- - ./scripts/travis.sh
+ # This will pass the environment variables down to a bash process which runs
+ # as $USER, while retaining the environment variables defined and belonging
+ # to secondary groups given above in usermod.
+ - sudo -E su ${USER} -c "sh -e \"${CI_SCRIPTS}/${CI_TARGET}.sh\""
diff --git a/Makefile b/Makefile
index 9cf4a58894..54708c7c1a 100644
--- a/Makefile
+++ b/Makefile
@@ -76,6 +76,7 @@ endif
test: | nvim
+$(SINGLE_MAKE) -C src/nvim/testdir $(MAKEOVERRIDES)
+ PATH="$$(pwd)/build/bin:$$PATH" vroom --neovim --crawl test
unittest: | nvim
+$(BUILD_CMD) -C build unittest
diff --git a/README.md b/README.md
index b65d22744a..cd09e7eef0 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,7 @@
[![Stories in Ready](https://badge.waffle.io/neovim/neovim.png?label=ready)](https://waffle.io/neovim/neovim)
[![Coverage Status](https://img.shields.io/coveralls/neovim/neovim.svg)](https://coveralls.io/r/neovim/neovim)
[![Coverity Scan Build](https://scan.coverity.com/projects/2227/badge.svg)](https://scan.coverity.com/projects/2227)
-[![Clang Scan Build](http://img.shields.io/badge/clang-analysis-blue.svg)](http://neovim.org/doc/build-reports/clang)
+[![Clang Scan Build](http://neovim.org/doc/build-reports/clang/badge.svg)](http://neovim.org/doc/build-reports/clang)
[![Bountysource](https://www.bountysource.com/badge/tracker?tracker_id=461131)](https://www.bountysource.com/trackers/461131-neovim?utm_source=461131&utm_medium=shield&utm_campaign=TRACKER_BADGE)
Neovim is a project that seeks to aggressively refactor Vim in order to:
diff --git a/config/CMakeLists.txt b/config/CMakeLists.txt
index 8e1b0239d4..330bd4bc37 100644
--- a/config/CMakeLists.txt
+++ b/config/CMakeLists.txt
@@ -38,7 +38,6 @@ check_include_files(unistd.h HAVE_UNISTD_H)
check_include_files(utime.h HAVE_UTIME_H)
# Functions
-check_function_exists(fchown HAVE_FCHOWN)
check_function_exists(fseeko HAVE_FSEEKO)
check_function_exists(fsync HAVE_FSYNC)
check_function_exists(getpwent HAVE_GETPWENT)
diff --git a/config/config.h.in b/config/config.h.in
index a85961858c..ba0945cf56 100644
--- a/config/config.h.in
+++ b/config/config.h.in
@@ -18,7 +18,6 @@
#cmakedefine HAVE__NSGETENVIRON
#cmakedefine HAVE_CRT_EXTERNS_H
#cmakedefine HAVE_DIRENT_H
-#cmakedefine HAVE_FCHOWN
#cmakedefine HAVE_FCNTL_H
#cmakedefine HAVE_FD_CLOEXEC
#cmakedefine HAVE_FSEEKO
diff --git a/runtime/doc/change.txt b/runtime/doc/change.txt
index de340ec8b5..66e69d4ffc 100644
--- a/runtime/doc/change.txt
+++ b/runtime/doc/change.txt
@@ -566,11 +566,9 @@ attack or other people reading your file). When Vim exits the directory and
all files in it are deleted. When Vim has the setuid bit set this may cause
problems, the temp file is owned by the setuid user but the filter command
probably runs as the original user.
-On MS-DOS and OS/2 the first of these directories that works is used: $TMP,
-$TEMP, c:\TMP, c:\TEMP.
-For Unix the list of directories is: $TMPDIR, /tmp, current-dir, $HOME.
-For MS-Windows the GetTempFileName() system function is used.
-For other systems the tmpnam() library function is used.
+Directory for temporary files is created in the first suitable directory of:
+For Unix: $TMPDIR, /tmp, current-dir, $HOME.
+For MS-Windows: $TMP, $TEMP, $USERPROFILE, current-dir.
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index cbd995da3d..cdad6a9d7e 100644
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -6212,8 +6212,7 @@ taglist({expr}) *taglist()*
tempname() *tempname()* *temp-file-name*
The result is a String, which is the name of a file that
- doesn't exist. It can be used for a temporary file. The name
- is different for at least 26 consecutive calls. Example: >
+ doesn't exist. It can be used for a temporary file. Example: >
:let tmpfile = tempname()
:exe "redir > " . tmpfile
< For Unix, the file will be in a private directory |tempfile|.
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index 2af731e790..d38fb84f10 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -3988,9 +3988,8 @@ A jump table for the options with a short description can be found at |Q_op|.
currently being edited. Only the last part of the name is used.
Overridden by the 'iconstring' option.
Only works if the terminal supports setting window icons (currently
- only X11 GUI and terminals with a non-empty 't_IS' option - these are
- Unix xterm and iris-ansi by default, where 't_IS' is taken from the
- builtin termcap).
+ only X11 GUI and terminals with a non-empty 't_IS' option - this is
+ Unix xterm by default, where 't_IS' is taken from the builtin termcap).
When Vim was compiled with HAVE_X11 defined, the original icon will be
restored if possible |X11|. See |X11-icon| for changing the icon on
X11.
@@ -7359,8 +7358,8 @@ A jump table for the options with a short description can be found at |Q_op|.
- VIM the server name |v:servername| or "VIM"
Only works if the terminal supports setting window titles
(currently Amiga console, Win32 console, all GUI versions and
- terminals with a non- empty 't_ts' option - these are Unix xterm and
- iris-ansi by default, where 't_ts' is taken from the builtin termcap).
+ terminals with a non- empty 't_ts' option - this is Unix xterm
+ by default, where 't_ts' is taken from the builtin termcap).
*X11*
When Vim was compiled with HAVE_X11 defined, the original title will
be restored if possible. The output of ":version" will include "+X11"
@@ -7491,10 +7490,7 @@ A jump table for the options with a short description can be found at |Q_op|.
xterm entries...).
*'ttyfast'* *'tf'* *'nottyfast'* *'notf'*
-'ttyfast' 'tf' boolean (default off, on when 'term' is xterm, hpterm,
- sun-cmd, screen, rxvt, dtterm or
- iris-ansi; also on when running Vim in
- a DOS console)
+'ttyfast' 'tf' boolean (default on)
global
{not in Vi}
Indicates a fast terminal connection. More characters will be sent to
diff --git a/runtime/doc/os_vms.txt b/runtime/doc/os_vms.txt
index 03b11ba87e..82f8ae8b5b 100644
--- a/runtime/doc/os_vms.txt
+++ b/runtime/doc/os_vms.txt
@@ -437,7 +437,6 @@ Terminal entry not found in termcap
builtin_pcansi
builtin_win32
builtin_xterm
- builtin_iris-ansi
builtin_debug
builtin_dumb
defaulting to 'vt320'
diff --git a/runtime/doc/term.txt b/runtime/doc/term.txt
index d2dd547061..f81a530499 100644
--- a/runtime/doc/term.txt
+++ b/runtime/doc/term.txt
@@ -453,8 +453,7 @@ allows title setting via sending strings. They are sent before and after the
title string, respectively. Similar 't_IS' and 't_IE' are used to set the
icon text. These are Vim-internal extensions of the Unix termcap, so they
cannot be obtained from an external termcap. However, the builtin termcap
-contains suitable entries for xterm and iris-ansi, so you don't need to set
-them here.
+contains suitable entries for xterm, so you don't need to set them here.
*hpterm*
If inversion or other highlighting does not work correctly, try setting the
't_xs' option to a non-empty string. This makes the 't_ce' code be used to
@@ -533,18 +532,9 @@ correct values.
One command can be used to set the screen size:
*:mod* *:mode* *E359* *E362*
-:mod[e] [mode]
-
-Without argument this only detects the screen size and redraws the screen.
-With MS-DOS it is possible to switch screen mode. [mode] can be one of these
-values:
- "bw40" 40 columns black&white
- "c40" 40 columns color
- "bw80" 80 columns black&white
- "c80" 80 columns color (most people use this)
- "mono" 80 columns monochrome
- "c4350" 43 or 50 lines EGA/VGA mode
- number mode number to use, depends on your video card
+:mod[e]
+
+Detects the screen size and redraws the screen.
==============================================================================
4. Slow and fast terminals *slow-fast-terminal*
diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt
index 21f24a7d33..59578cb3d9 100644
--- a/runtime/doc/todo.txt
+++ b/runtime/doc/todo.txt
@@ -2593,7 +2593,6 @@ Macintosh:
":noremap". Add "mapcmd({string}, {mode})? Use code from ":mkexrc".
9 incsearch is incorrect for "/that/<Return>/this/;//" (last search pattern
isn't updated).
-9 term_console is used before it is set (msdos, Amiga).
9 Get out-of-memory for ":g/^/,$s//@/" on 1000 lines, this is not handled
correctly. Get many error messages while redrawing the screen, which
cause another redraw, etc.
diff --git a/scripts/travis.sh b/scripts/travis.sh
deleted file mode 100755
index 0530605bce..0000000000
--- a/scripts/travis.sh
+++ /dev/null
@@ -1,182 +0,0 @@
-#!/bin/sh -e
-
-tmpdir="$(pwd)/tmp"
-rm -rf "$tmpdir"
-mkdir -p "$tmpdir"
-suppressions="$(pwd)/.valgrind.supp"
-
-valgrind_check() {
- (
- cd $1
- set -- valgrind-[*] valgrind-*
- case $1$2 in
- 'valgrind-[*]valgrind-*')
- ;;
- *)
- shift
- local err=''
- for valgrind_log in "$@"; do
- # Remove useless warning
- sed -i "$valgrind_log" \
- -e '/Warning: noted but unhandled ioctl/d' \
- -e '/could cause spurious value errors to appear/d' \
- -e '/See README_MISSING_SYSCALL_OR_IOCTL for guidance/d'
- if [ "$(stat -c %s $valgrind_log)" != "0" ]; then
- # if after removing the warning, the log still has errors, show its
- # contents and set the flag so we exit with non-zero status
- cat "$valgrind_log"
- err=1
- fi
- done
- if [ -n "$err" ]; then
- echo "Runtime errors detected"
- exit 1
- fi
- ;;
- esac
- )
-}
-
-asan_check() {
- (
- cd $1
- set -- [*]san.[*] *san.*
- case $1$2 in
- '[*]san.[*]*san.*')
- ;;
- *)
- shift
- cat "$@"
- echo "Runtime errors detected"
- exit 1
- ;;
- esac
- )
-}
-
-set_environment() {
- local prefix="$1"
- eval $($prefix/bin/luarocks path)
- export PATH="$prefix/bin:$PATH"
- export PKG_CONFIG_PATH="$prefix/lib/pkgconfig"
- export USE_BUNDLED_DEPS=OFF
-}
-
-# install prebuilt dependencies
-if [ ! -d /opt/neovim-deps ]; then
- cd /opt
- sudo git clone --depth=1 git://github.com/neovim/deps neovim-deps
- cd -
-fi
-
-# Travis reports back that it has 32-cores via /proc/cpuinfo, but it's not
-# what we really have available. According to their documentation, it only has
-# 1.5 virtual cores.
-# See:
-# http://docs.travis-ci.com/user/speeding-up-the-build/#Paralellizing-your-build-on-one-VM
-# for more information.
-MAKE_CMD="make -j2"
-
-if [ "$TRAVIS_BUILD_TYPE" = "coverity" ]; then
- # temporarily disable error checking, the coverity script exits with
- # status code 1 whenever it (1) fails OR (2) is not on the correct
- # branch.
- set +e
- curl -s https://scan.coverity.com/scripts/travisci_build_coverity_scan.sh |
- COVERITY_SCAN_PROJECT_NAME="neovim/neovim" \
- COVERITY_SCAN_NOTIFICATION_EMAIL="coverity@aktau.be" \
- COVERITY_SCAN_BRANCH_PATTERN="coverity-scan" \
- COVERITY_SCAN_BUILD_COMMAND_PREPEND="$MAKE_CMD deps" \
- COVERITY_SCAN_BUILD_COMMAND="$MAKE_CMD nvim" \
- bash
- set -e
- exit 0
-elif [ "$TRAVIS_BUILD_TYPE" = "clang/asan" ]; then
- clang_version=3.4
- if [ ! -d /usr/local/clang-$clang_version ]; then
- echo "Downloading clang $clang_version..."
- sudo mkdir /usr/local/clang-$clang_version
- wget -q -O - http://llvm.org/releases/$clang_version/clang+llvm-$clang_version-x86_64-unknown-ubuntu12.04.xz \
- | sudo tar xJf - --strip-components=1 -C /usr/local/clang-$clang_version
- export CC=/usr/local/clang-$clang_version/bin/clang
- else
- export CC=clang
- fi
- symbolizer=/usr/local/clang-$clang_version/bin/llvm-symbolizer
-
- sudo pip install cpp-coveralls
- set_environment /opt/neovim-deps
-
- export SANITIZE=1
- export ASAN_SYMBOLIZER_PATH=$symbolizer
- export ASAN_OPTIONS="detect_leaks=1:log_path=$tmpdir/asan"
- export TSAN_OPTIONS="external_symbolizer_path=$symbolizer:log_path=$tmpdir/tsan"
-
- export SKIP_UNITTEST=1
- export UBSAN_OPTIONS="log_path=$tmpdir/ubsan" # not sure if this works
-
- install_dir="$(pwd)/dist"
- $MAKE_CMD cmake CMAKE_EXTRA_FLAGS="-DTRAVIS_CI_BUILD=ON -DCMAKE_INSTALL_PREFIX=$install_dir -DUSE_GCOV=ON"
- $MAKE_CMD
- if ! $MAKE_CMD test; then
- reset
- asan_check "$tmpdir"
- exit 1
- fi
- asan_check "$tmpdir"
- coveralls --encoding iso-8859-1 || echo 'coveralls upload failed.'
- $MAKE_CMD install
-elif [ "$TRAVIS_BUILD_TYPE" = "gcc/unittest" ]; then
- sudo pip install cpp-coveralls
- export CC=gcc
- set_environment /opt/neovim-deps
- export SKIP_EXEC=1
- $MAKE_CMD CMAKE_EXTRA_FLAGS="-DTRAVIS_CI_BUILD=ON -DBUSTED_OUTPUT_TYPE=TAP -DUSE_GCOV=ON" unittest
- coveralls --encoding iso-8859-1 || echo 'coveralls upload failed.'
-elif [ "$TRAVIS_BUILD_TYPE" = "gcc/ia32" ]; then
- set_environment /opt/neovim-deps/32
-
- # Pins the version of the java package installed on the Travis VMs
- # and avoids a lengthy upgrade process for them.
- sudo apt-mark hold oracle-java7-installer oracle-java8-installer
-
- sudo apt-get update
-
- # Need this to keep apt-get from removing gcc when installing libncurses
- # below.
- sudo apt-get install libc6-dev libc6-dev:i386
-
- # Do this separately so that things get configured correctly, otherwise
- # libncurses fails to install.
- sudo apt-get install gcc-multilib g++-multilib
-
- # Install the dev version to get the pkg-config and symlinks installed
- # correctly.
- sudo apt-get install libncurses5-dev:i386
-
- CMAKE_EXTRA_FLAGS="-DTRAVIS_CI_BUILD=ON -DBUSTED_OUTPUT_TYPE=TAP \
- -DCMAKE_SYSTEM_PROCESSOR=i386 \
- -DCMAKE_SYSTEM_LIBRARY_PATH=/lib32:/usr/lib32:/usr/local/lib32 \
- -DFIND_LIBRARY_USE_LIB64_PATHS=OFF \
- -DCMAKE_IGNORE_PATH=/lib:/usr/lib:/usr/local/lib \
- -DCMAKE_TOOLCHAIN_FILE=cmake/i386-linux-gnu.toolchain.cmake"
- $MAKE_CMD CMAKE_EXTRA_FLAGS="${CMAKE_EXTRA_FLAGS}" unittest
- $MAKE_CMD test
-elif [ "$TRAVIS_BUILD_TYPE" = "clint" ]; then
- ./scripts/clint.sh
-elif [ "$TRAVIS_BUILD_TYPE" = "api/python" ]; then
- set_environment /opt/neovim-deps
- $MAKE_CMD
- sudo apt-get install expect valgrind
- git clone --depth=1 -b master git://github.com/neovim/python-client
- cd python-client
- sudo pip install .
- sudo pip install nose
- test_cmd="nosetests --verbosity=2"
- nvim_cmd="valgrind -q --track-origins=yes --leak-check=yes --suppressions=$suppressions --log-file=$tmpdir/valgrind-%p.log ../build/bin/nvim -u NONE"
- if ! ../scripts/run-api-tests.exp "$test_cmd" "$nvim_cmd"; then
- valgrind_check "$tmpdir"
- exit 1
- fi
- valgrind_check "$tmpdir"
-fi
diff --git a/src/nvim/api/buffer.c b/src/nvim/api/buffer.c
index 21bfc5ede0..a268e04559 100644
--- a/src/nvim/api/buffer.c
+++ b/src/nvim/api/buffer.c
@@ -490,7 +490,7 @@ static void switch_to_win_for_buf(buf_T *buf,
win_T *wp;
tabpage_T *tp;
- if (find_win_for_buf(buf, &wp, &tp) == FAIL
+ if (!find_win_for_buf(buf, &wp, &tp)
|| switch_win(save_curwinp, save_curtabp, wp, tp, true) == FAIL)
switch_buffer(save_curbufp, buf);
}
diff --git a/src/nvim/api/private/helpers.c b/src/nvim/api/private/helpers.c
index 354a74d19a..f6fb46e1d1 100644
--- a/src/nvim/api/private/helpers.c
+++ b/src/nvim/api/private/helpers.c
@@ -343,6 +343,20 @@ String cstr_to_string(const char *str)
};
}
+/// Creates a String using the given C string. Unlike
+/// cstr_to_string this function DOES NOT copy the C string.
+///
+/// @param str the C string to use
+/// @return The resulting String, or an empty String if
+/// str was NULL
+String cstr_as_string(char *str) FUNC_ATTR_PURE
+{
+ if (str == NULL) {
+ return (String) STRING_INIT;
+ }
+ return (String) {.data = str, .size = strlen(str)};
+}
+
bool object_to_vim(Object obj, typval_T *tv, Error *err)
{
tv->v_type = VAR_UNKNOWN;
diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c
index 6c793cbc54..a2c50b4c81 100644
--- a/src/nvim/api/vim.c
+++ b/src/nvim/api/vim.c
@@ -54,55 +54,52 @@ void vim_command(String str, Error *err)
/// Pass input keys to Neovim
///
/// @param keys to be typed
-/// @param replace_tcodes If true replace special keys such as <CR> or <Leader>
-/// for compatibility with Vim --remote-send expressions
-/// @param remap If True remap keys
-/// @param typed Handle keys as if typed; otherwise they are handled as
-/// if coming from a mapping. This matters for undo,
-/// opening folds, etc.
-void vim_feedkeys(String keys, Boolean replace_tcodes, Boolean remap,
- Boolean typed, Error *err)
+/// @param mode specifies the mapping options
+/// @see feedkeys()
+void vim_feedkeys(String keys, String mode)
{
- char *ptr = NULL;
- char *cpo_save = (char *)p_cpo;
-
- if (replace_tcodes) {
- // Set 'cpoptions' the way we want it.
- // B set - backslashes are *not* treated specially
- // k set - keycodes are *not* reverse-engineered
- // < unset - <Key> sequences *are* interpreted
- // The last but one parameter of replace_termcodes() is TRUE so that the
- // <lt> sequence is recognised - needed for a real backslash.
- p_cpo = (char_u *)"Bk";
- replace_termcodes((char_u *)keys.data, (char_u **)&ptr, false, true, true);
- p_cpo = (char_u *)cpo_save;
- } else {
- ptr = keys.data;
+ bool remap = true;
+ bool typed = false;
+
+ if (keys.size == 0) {
+ return;
}
- if (ptr == NULL) {
- set_api_error("Failed to eval expression", err);
- } else {
- // Add the string to the input stream.
- // Can't use add_to_input_buf() here, we now have K_SPECIAL bytes.
- //
- // First clear typed characters from the typeahead buffer, there could
- // be half a mapping there. Then append to the existing string, so
- // that multiple commands from a client are concatenated.
- if (typebuf.tb_maplen < typebuf.tb_len) {
- del_typebuf(typebuf.tb_len - typebuf.tb_maplen, typebuf.tb_maplen);
+ for (size_t i = 0; i < mode.size; ++i) {
+ switch (mode.data[i]) {
+ case 'n': remap = false; break;
+ case 'm': remap = true; break;
+ case 't': typed = true; break;
}
- (void)ins_typebuf((char_u *)ptr, (remap ? REMAP_YES : REMAP_NONE),
- typebuf.tb_len, !typed, false);
+ }
+
+ /* Need to escape K_SPECIAL and CSI before putting the string in the
+ * typeahead buffer. */
+ char *keys_esc = (char *)vim_strsave_escape_csi((char_u *)keys.data);
+ ins_typebuf((char_u *)keys_esc, (remap ? REMAP_YES : REMAP_NONE),
+ typebuf.tb_len, !typed, false);
+ free(keys_esc);
- // Let input_available() know we inserted text in the typeahead
- // buffer. */
+ if (vgetc_busy)
typebuf_was_filled = true;
+}
- if (replace_tcodes) {
- free(ptr);
- }
+/// Replace any terminal codes with the internal representation
+///
+/// @see replace_termcodes
+/// @see cpoptions
+String vim_replace_termcodes(String str, Boolean from_part, Boolean do_lt,
+ Boolean special)
+{
+ if (str.size == 0) {
+ // Empty string
+ return str;
}
+
+ char *ptr = NULL;
+ replace_termcodes((char_u *)str.data, (char_u **)&ptr,
+ from_part, do_lt, special);
+ return cstr_as_string(ptr);
}
/// Evaluates the expression str using the vim internal expression
diff --git a/src/nvim/arabic.c b/src/nvim/arabic.c
index e39ee8012b..7880c66e1e 100644
--- a/src/nvim/arabic.c
+++ b/src/nvim/arabic.c
@@ -1361,24 +1361,19 @@ static int half_shape(int c)
int arabic_shape(int c, int *ccp, int *c1p, int prev_c, int prev_c1,
int next_c)
{
- int curr_c;
- int shape_c;
- int curr_laa;
- int prev_laa;
-
/* Deal only with Arabic character, pass back all others */
if (!A_is_ok(c)) {
return c;
}
/* half-shape current and previous character */
- shape_c = half_shape(prev_c);
+ int shape_c = half_shape(prev_c);
/* Save away current character */
- curr_c = c;
+ int curr_c = c;
- curr_laa = A_firstc_laa(c, *c1p);
- prev_laa = A_firstc_laa(prev_c, prev_c1);
+ int curr_laa = A_firstc_laa(c, *c1p);
+ int prev_laa = A_firstc_laa(prev_c, prev_c1);
if (curr_laa) {
if (A_is_valid(prev_c) && !A_is_f(shape_c) && !A_is_s(shape_c) &&
diff --git a/src/nvim/ascii.h b/src/nvim/ascii.h
index 258b798e5b..d9d9eac04d 100644
--- a/src/nvim/ascii.h
+++ b/src/nvim/ascii.h
@@ -8,14 +8,7 @@
#ifndef NVIM_ASCII_H
#define NVIM_ASCII_H
-/*
- * Definitions of various common control characters.
- * For EBCDIC we have to use different values.
- */
-
-
-/* IF_EB(ASCII_constant, EBCDIC_constant) */
-#define IF_EB(a, b) a
+// Definitions of various common control characters.
#define CharOrd(x) ((x) < 'a' ? (x) - 'A' : (x) - 'a')
#define CharOrdLow(x) ((x) - 'a')
diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c
index f3128c7f6f..77bed67d5f 100644
--- a/src/nvim/buffer.c
+++ b/src/nvim/buffer.c
@@ -1530,6 +1530,7 @@ void free_buf_options(buf_T *buf, int free_p_ff)
clear_string_option(&buf->b_p_qe);
buf->b_p_ar = -1;
buf->b_p_ul = NO_LOCAL_UNDOLEVEL;
+ clear_string_option(&buf->b_p_lw);
}
/*
@@ -4255,7 +4256,7 @@ char_u *buf_spname(buf_T *buf)
* For location list window, w_llist_ref points to the location list.
* For quickfix window, w_llist_ref is NULL.
*/
- if (find_win_for_buf(buf, &win, &tp) == OK && win->w_llist_ref != NULL)
+ if (find_win_for_buf(buf, &win, &tp) && win->w_llist_ref != NULL)
return (char_u *)_(msg_loclist);
else
return (char_u *)_(msg_qflist);
@@ -4274,17 +4275,17 @@ char_u *buf_spname(buf_T *buf)
/*
* Find a window for buffer "buf".
- * If found OK is returned and "wp" and "tp" are set to the window and tabpage.
- * If not found FAIL is returned.
+ * If found true is returned and "wp" and "tp" are set to the window and tabpage.
+ * If not found false is returned.
*/
-int find_win_for_buf(buf_T *buf, win_T **wp, tabpage_T **tp)
+bool find_win_for_buf(buf_T *buf, win_T **wp, tabpage_T **tp)
{
FOR_ALL_TAB_WINDOWS(*tp, *wp) {
if ((*wp)->w_buffer == buf) {
- return OK;
+ return true;
}
}
- return FAIL;
+ return false;
}
/*
diff --git a/src/nvim/buffer_defs.h b/src/nvim/buffer_defs.h
index e827642d8a..9f5d7b86eb 100644
--- a/src/nvim/buffer_defs.h
+++ b/src/nvim/buffer_defs.h
@@ -677,6 +677,7 @@ struct file_buffer {
char_u *b_p_tsr; /* 'thesaurus' local value */
long b_p_ul; /* 'undolevels' local value */
int b_p_udf; /* 'undofile' */
+ char_u *b_p_lw; // 'lispwords' local value
/* end of buffer options */
diff --git a/src/nvim/charset.c b/src/nvim/charset.c
index 3e1e7c1870..baf6895b4c 100644
--- a/src/nvim/charset.c
+++ b/src/nvim/charset.c
@@ -89,9 +89,6 @@ int buf_init_chartab(buf_T *buf, int global)
// Set the default size for printable characters:
// From <Space> to '~' is 1 (printable), others are 2 (not printable).
// This also inits all 'isident' and 'isfname' flags to FALSE.
- //
- // EBCDIC: all chars below ' ' are not printable, all others are
- // printable.
c = 0;
while (c < ' ') {
@@ -583,11 +580,8 @@ void transchar_nonprint(char_u *buf, int c)
buf[2] = NUL;
} else {
// 0x80 - 0x9f and 0xff
- // TODO: EBCDIC I don't know what to do with this chars, so I display
- // them as '~?' for now
buf[0] = '~';
buf[1] = (c - 0x80) ^ 0x40;
- // 0xff displayed as ~?
buf[2] = NUL;
}
}
diff --git a/src/nvim/digraph.c b/src/nvim/digraph.c
index 8edb12526c..f41a16bc1b 100644
--- a/src/nvim/digraph.c
+++ b/src/nvim/digraph.c
@@ -835,6 +835,8 @@ static digr_T digraphdefault[] =
{ 'W', '=', 0x20a9 },
{ '=', 'e', 0x20ac }, // euro
{ 'E', 'u', 0x20ac }, // euro
+ { '=', 'R', 0x20bd }, // rouble
+ { '=', 'P', 0x20bd }, // rouble
{ 'o', 'C', 0x2103 },
{ 'c', 'o', 0x2105 },
{ 'o', 'F', 0x2109 },
diff --git a/src/nvim/edit.c b/src/nvim/edit.c
index 22687d8203..93e127394b 100644
--- a/src/nvim/edit.c
+++ b/src/nvim/edit.c
@@ -3151,7 +3151,9 @@ static int ins_compl_prep(int c)
ins_compl_free();
compl_started = FALSE;
compl_matches = 0;
- msg_clr_cmdline(); /* necessary for "noshowmode" */
+ if (!shortmess(SHM_COMPLETIONMENU)) {
+ msg_clr_cmdline(); // necessary for "noshowmode"
+ }
ctrl_x_mode = 0;
compl_enter_selects = FALSE;
if (edit_submode != NULL) {
@@ -4379,7 +4381,9 @@ static int ins_complete(int c)
if (col == -3) {
ctrl_x_mode = 0;
edit_submode = NULL;
- msg_clr_cmdline();
+ if (!shortmess(SHM_COMPLETIONMENU)) {
+ msg_clr_cmdline();
+ }
return FAIL;
}
@@ -4598,13 +4602,17 @@ static int ins_complete(int c)
/* Show a message about what (completion) mode we're in. */
showmode();
- if (edit_submode_extra != NULL) {
- if (!p_smd)
- msg_attr(edit_submode_extra,
- edit_submode_highl < HLF_COUNT
- ? hl_attr(edit_submode_highl) : 0);
- } else
- msg_clr_cmdline(); /* necessary for "noshowmode" */
+ if (!shortmess(SHM_COMPLETIONMENU)) {
+ if (edit_submode_extra != NULL) {
+ if (!p_smd) {
+ msg_attr(edit_submode_extra,
+ edit_submode_highl < HLF_COUNT
+ ? hl_attr(edit_submode_highl) : 0);
+ }
+ } else {
+ msg_clr_cmdline(); // necessary for "noshowmode"
+ }
+ }
/* Show the popup menu, unless we got interrupted. */
if (!compl_interrupted) {
@@ -6073,8 +6081,8 @@ stuff_inserted (
/* a trailing "0" is inserted as "<C-V>048", "^" as "<C-V>^" */
if (last)
stuffReadbuff((char_u *)(last == '0'
- ? IF_EB("\026\060\064\070", CTRL_V_STR "xf0")
- : IF_EB("\026^", CTRL_V_STR "^")));
+ ? "\026\060\064\070"
+ : "\026^"));
} while (--count > 0);
if (last)
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index fd2c3a6dd8..1cef91785c 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -83,7 +83,7 @@
#include "nvim/os/time.h"
#include "nvim/os/channel.h"
#include "nvim/api/private/helpers.h"
-#include "nvim/api/private/defs.h"
+#include "nvim/api/vim.h"
#include "nvim/os/msgpack_rpc_helpers.h"
#include "nvim/os/dl.h"
#include "nvim/os/provider.h"
@@ -193,6 +193,9 @@ static int current_copyID = 0;
#define COPYID_INC 2
#define COPYID_MASK (~0x1)
+/// Abort conversion to string after a recursion error.
+static bool did_echo_string_emsg = false;
+
/*
* Array to hold the hashtab with variables local to each sourced script.
* Each item holds a variable (nameless) that points to the dict_T.
@@ -5322,6 +5325,9 @@ list_join_inner (
}
line_breakcheck();
+ if (did_echo_string_emsg) { // recursion error, bail out
+ break;
+ }
}
/* Allocate result buffer with its total size, avoid re-allocation and
@@ -5945,8 +5951,10 @@ static char_u *dict2string(typval_T *tv, int copyID)
if (s != NULL)
ga_concat(&ga, s);
free(tofree);
- if (s == NULL)
+ if (s == NULL || did_echo_string_emsg) {
break;
+ }
+ line_breakcheck();
}
}
if (todo > 0) {
@@ -6077,9 +6085,15 @@ static char_u *echo_string(typval_T *tv, char_u **tofree, char_u *numbuf, int co
char_u *r = NULL;
if (recurse >= DICT_MAXNEST) {
- EMSG(_("E724: variable nested too deep for displaying"));
+ if (!did_echo_string_emsg) {
+ // Only give this message once for a recursive call to avoid
+ // flooding the user with errors. And stop iterating over lists
+ // and dicts.
+ did_echo_string_emsg = true;
+ EMSG(_("E724: variable nested too deep for displaying"));
+ }
*tofree = NULL;
- return NULL;
+ return (char_u *)"{E724}";
}
++recurse;
@@ -6134,7 +6148,9 @@ static char_u *echo_string(typval_T *tv, char_u **tofree, char_u *numbuf, int co
*tofree = NULL;
}
- --recurse;
+ if (--recurse == 0) {
+ did_echo_string_emsg = false;
+ }
return r;
}
@@ -6392,7 +6408,7 @@ static struct fst {
{"getwinposy", 0, 0, f_getwinposy},
{"getwinvar", 2, 3, f_getwinvar},
{"glob", 1, 3, f_glob},
- {"globpath", 2, 3, f_globpath},
+ {"globpath", 2, 4, f_globpath},
{"has", 1, 1, f_has},
{"has_key", 2, 2, f_has_key},
{"haslocaldir", 0, 0, f_haslocaldir},
@@ -8283,11 +8299,8 @@ static void f_extend(typval_T *argvars, typval_T *rettv)
*/
static void f_feedkeys(typval_T *argvars, typval_T *rettv)
{
- int remap = TRUE;
- char_u *keys, *flags;
+ char_u *keys, *flags = NULL;
char_u nbuf[NUMBUFLEN];
- int typed = FALSE;
- char_u *keys_esc;
/* This is not allowed in the sandbox. If the commands would still be
* executed in the sandbox it would be OK, but it probably happens later,
@@ -8299,23 +8312,10 @@ static void f_feedkeys(typval_T *argvars, typval_T *rettv)
if (*keys != NUL) {
if (argvars[1].v_type != VAR_UNKNOWN) {
flags = get_tv_string_buf(&argvars[1], nbuf);
- for (; *flags != NUL; ++flags) {
- switch (*flags) {
- case 'n': remap = FALSE; break;
- case 'm': remap = TRUE; break;
- case 't': typed = TRUE; break;
- }
- }
}
- /* Need to escape K_SPECIAL and CSI before putting the string in the
- * typeahead buffer. */
- keys_esc = vim_strsave_escape_csi(keys);
- ins_typebuf(keys_esc, (remap ? REMAP_YES : REMAP_NONE),
- typebuf.tb_len, !typed, FALSE);
- free(keys_esc);
- if (vgetc_busy)
- typebuf_was_filled = TRUE;
+ vim_feedkeys(cstr_as_string((char *)keys),
+ cstr_as_string((char *)flags));
}
}
@@ -9608,27 +9608,50 @@ static void f_glob(typval_T *argvars, typval_T *rettv)
rettv->vval.v_string = NULL;
}
-/*
- * "globpath()" function
- */
+/// "globpath()" function
static void f_globpath(typval_T *argvars, typval_T *rettv)
{
- int flags = 0;
- char_u buf1[NUMBUFLEN];
- char_u *file = get_tv_string_buf_chk(&argvars[1], buf1);
- int error = FALSE;
+ int flags = 0; // Flags for globpath.
+ int error = false;
- /* When the optional second argument is non-zero, don't remove matches
- * for 'wildignore' and don't put matches for 'suffixes' at the end. */
- if (argvars[2].v_type != VAR_UNKNOWN
- && get_tv_number_chk(&argvars[2], &error))
- flags |= WILD_KEEP_ALL;
+ // Return a string, or a list if the optional third argument is non-zero.
rettv->v_type = VAR_STRING;
- if (file == NULL || error)
+
+ if (argvars[2].v_type != VAR_UNKNOWN) {
+ // When the optional second argument is non-zero, don't remove matches
+ // for 'wildignore' and don't put matches for 'suffixes' at the end.
+ if (get_tv_number_chk(&argvars[2], &error)) {
+ flags |= WILD_KEEP_ALL;
+ }
+
+ if (argvars[3].v_type != VAR_UNKNOWN
+ && get_tv_number_chk(&argvars[3], &error)) {
+ rettv->v_type = VAR_LIST;
+ rettv->vval.v_list = NULL;
+ }
+ }
+
+ char_u buf1[NUMBUFLEN];
+ char_u *file = get_tv_string_buf_chk(&argvars[1], buf1);
+ if (file != NULL && !error) {
+ garray_T ga;
+ ga_init(&ga, (int)sizeof(char_u *), 10);
+ globpath(get_tv_string(&argvars[0]), file, &ga, flags);
+
+ if (rettv->v_type == VAR_STRING) {
+ rettv->vval.v_string = ga_concat_strings_sep(&ga, "\n");
+ } else {
+ rettv_list_alloc(rettv);
+ for (int i = 0; i < ga.ga_len; i++) {
+ list_append_string(rettv->vval.v_list,
+ ((char_u **)(ga.ga_data))[i], -1);
+ }
+ }
+
+ ga_clear_strings(&ga);
+ } else {
rettv->vval.v_string = NULL;
- else
- rettv->vval.v_string = globpath(get_tv_string(&argvars[0]), file,
- flags);
+ }
}
/*
@@ -9745,9 +9768,6 @@ static void f_has(typval_T *argvars, typval_T *rettv)
#endif
"tag_binary",
"tag_old_static",
-#ifdef FEAT_TAG_ANYWHITE
- "tag_any_white",
-#endif
#ifdef TERMINFO
"terminfo",
#endif
@@ -18032,7 +18052,10 @@ call_user_func (
if (argvars[i].v_type == VAR_NUMBER)
msg_outnum((long)argvars[i].vval.v_number);
else {
+ // Do not want errors such as E724 here.
+ ++emsg_off;
s = tv2string(&argvars[i], &tofree, numbuf2, 0);
+ --emsg_off;
if (s != NULL) {
if (vim_strsize(s) > MSG_BUF_CLEN) {
trunc_string(s, buf, MSG_BUF_CLEN, MSG_BUF_LEN);
@@ -18114,10 +18137,12 @@ call_user_func (
char_u *tofree;
char_u *s;
- /* The value may be very long. Skip the middle part, so that we
- * have some idea how it starts and ends. smsg() would always
- * truncate it at the end. */
+ // The value may be very long. Skip the middle part, so that we
+ // have some idea how it starts and ends. smsg() would always
+ // truncate it at the end. Don't want errors such as E724 here.
+ ++emsg_off;
s = tv2string(fc->rettv, &tofree, numbuf2, 0);
+ --emsg_off;
if (s != NULL) {
if (vim_strsize(s) > MSG_BUF_CLEN) {
trunc_string(s, buf, MSG_BUF_CLEN, MSG_BUF_LEN);
@@ -19019,8 +19044,10 @@ char_u *do_string_sub(char_u *str, char_u *pat, char_u *sub, char_u *flags)
if (regmatch.startp[0] == regmatch.endp[0]) {
if (zero_width == regmatch.startp[0]) {
/* avoid getting stuck on a match with an empty string */
- *((char_u *)ga.ga_data + ga.ga_len) = *tail++;
- ++ga.ga_len;
+ int i = MB_PTR2LEN(tail);
+ memmove((char_u *)ga.ga_data + ga.ga_len, tail, (size_t)i);
+ ga.ga_len += i;
+ tail += i;
continue;
}
zero_width = regmatch.startp[0];
diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c
index 338a7bb4c1..5b6604fc93 100644
--- a/src/nvim/ex_cmds.c
+++ b/src/nvim/ex_cmds.c
@@ -1307,52 +1307,58 @@ do_shell (
apply_autocmds(EVENT_SHELLCMDPOST, NULL, NULL, FALSE, curbuf);
}
-/*
- * Create a shell command from a command string, input redirection file and
- * output redirection file.
- * Returns an allocated string with the shell command.
- */
-char_u *
-make_filter_cmd (
- char_u *cmd, /* command */
- char_u *itmp, /* NULL or name of input file */
- char_u *otmp /* NULL or name of output file */
-)
+/// Create a shell command from a command string, input redirection file and
+/// output redirection file.
+///
+/// @param cmd Command to execute.
+/// @param itmp NULL or the input file.
+/// @param otmp NULL or the output file.
+/// @returns an allocated string with the shell command.
+char_u *make_filter_cmd(char_u *cmd, char_u *itmp, char_u *otmp)
{
- size_t len = STRLEN(cmd) + 3; /* "()" + NUL */
+ bool is_fish_shell =
+#if defined(UNIX)
+ STRNCMP(invocation_path_tail(p_sh, NULL), "fish", 4) == 0;
+#else
+ false;
+#endif
+
+ size_t len = STRLEN(cmd) + 1; // At least enough space for cmd + NULL.
+
+ len += is_fish_shell ? sizeof("begin; ""; end") - 1
+ : sizeof("("")") - 1;
+
if (itmp != NULL)
- len += STRLEN(itmp) + 9; /* " { < " + " } " */
+ len += STRLEN(itmp) + sizeof(" { "" < "" } ") - 1;
if (otmp != NULL)
- len += STRLEN(otmp) + STRLEN(p_srr) + 2; /* " " */
+ len += STRLEN(otmp) + STRLEN(p_srr) + 2; // two extra spaces (" "),
char_u *buf = xmalloc(len);
#if defined(UNIX)
- /*
- * Put braces around the command (for concatenated commands) when
- * redirecting input and/or output.
- */
- if (itmp != NULL || otmp != NULL)
- vim_snprintf((char *)buf, len, "(%s)", (char *)cmd);
- else
+ // Put delimiters around the command (for concatenated commands) when
+ // redirecting input and/or output.
+ if (itmp != NULL || otmp != NULL) {
+ char *fmt = is_fish_shell ? "begin; %s; end"
+ : "(%s)";
+ vim_snprintf((char *)buf, len, fmt, (char *)cmd);
+ } else {
STRCPY(buf, cmd);
+ }
+
if (itmp != NULL) {
STRCAT(buf, " < ");
STRCAT(buf, itmp);
}
#else
- /*
- * for shells that don't understand braces around commands, at least allow
- * the use of commands in a pipe.
- */
+ // For shells that don't understand braces around commands, at least allow
+ // the use of commands in a pipe.
STRCPY(buf, cmd);
if (itmp != NULL) {
char_u *p;
- /*
- * If there is a pipe, we have to put the '<' in front of it.
- * Don't do this when 'shellquote' is not empty, otherwise the
- * redirection would be inside the quotes.
- */
+ // If there is a pipe, we have to put the '<' in front of it.
+ // Don't do this when 'shellquote' is not empty, otherwise the
+ // redirection would be inside the quotes.
if (*p_shq == NUL) {
p = vim_strchr(buf, '|');
if (p != NULL)
@@ -1363,7 +1369,7 @@ make_filter_cmd (
if (*p_shq == NUL) {
p = vim_strchr(cmd, '|');
if (p != NULL) {
- STRCAT(buf, " "); /* insert a space before the '|' for DOS */
+ STRCAT(buf, " "); // Insert a space before the '|' for DOS
STRCAT(buf, p);
}
}
@@ -1606,13 +1612,13 @@ void write_viminfo(char_u *file, int forceit)
fp_out = mch_fopen((char *)tempname, WRITEBIN);
}
-#if defined(UNIX) && defined(HAVE_FCHOWN)
+#ifdef UNIX
/*
* Make sure the owner can read/write it. This only works for
* root.
*/
if (fp_out != NULL) {
- fchown(fileno(fp_out), old_info.stat.st_uid, old_info.stat.st_gid);
+ os_fchown(fileno(fp_out), old_info.stat.st_uid, old_info.stat.st_gid);
}
#endif
}
@@ -1933,7 +1939,7 @@ void viminfo_writestring(FILE *fd, char_u *p)
* the string (e.g., variable name). Add something to the length for the
* '<', NL and trailing NUL. */
if (len > LSIZE / 2)
- fprintf(fd, IF_EB("\026%d\n<", CTRL_V_STR "%d\n<"), len + 3);
+ fprintf(fd, "\026%d\n<", len + 3);
while ((c = *p++) != NUL) {
if (c == Ctrl_V || c == '\n') {
diff --git a/src/nvim/ex_getln.c b/src/nvim/ex_getln.c
index bf5076bdc3..28048c933c 100644
--- a/src/nvim/ex_getln.c
+++ b/src/nvim/ex_getln.c
@@ -4051,45 +4051,38 @@ static int ExpandUserList(expand_T *xp, int *num_file, char_u ***file)
*/
static int ExpandRTDir(char_u *pat, int *num_file, char_u ***file, char *dirnames[])
{
- char_u *matches;
- char_u *s;
- char_u *e;
- garray_T ga;
- int i;
- int pat_len;
-
*num_file = 0;
*file = NULL;
- pat_len = (int)STRLEN(pat);
+ size_t pat_len = STRLEN(pat);
+
+ garray_T ga;
ga_init(&ga, (int)sizeof(char *), 10);
- for (i = 0; dirnames[i] != NULL; ++i) {
- s = xmalloc(STRLEN(dirnames[i]) + pat_len + 7);
- sprintf((char *)s, "%s/%s*.vim", dirnames[i], pat);
- matches = globpath(p_rtp, s, 0);
+ for (int i = 0; dirnames[i] != NULL; i++) {
+ size_t size = STRLEN(dirnames[i]) + pat_len + 7;
+ char_u *s = xmalloc(size);
+ snprintf((char *)s, size, "%s/%s*.vim", dirnames[i], pat);
+ globpath(p_rtp, s, &ga, 0);
free(s);
- if (matches == NULL)
- continue;
+ }
- for (s = matches; *s != NUL; s = e) {
- e = vim_strchr(s, '\n');
- if (e == NULL)
- e = s + STRLEN(s);
- ga_grow(&ga, 1);
- if (e - 4 > s && STRNICMP(e - 4, ".vim", 4) == 0) {
- for (s = e - 4; s > matches; mb_ptr_back(matches, s))
- if (*s == '\n' || vim_ispathsep(*s))
- break;
- ++s;
- ((char_u **)ga.ga_data)[ga.ga_len] =
- vim_strnsave(s, (int)(e - s - 4));
- ++ga.ga_len;
+ for (int i = 0; i < ga.ga_len; i++) {
+ char_u *match = ((char_u **)ga.ga_data)[i];
+ char_u *s = match;
+ char_u *e = s + STRLEN(s);
+ if (e - s > 4 && STRNICMP(e - 4, ".vim", 4) == 0) {
+ e -= 4;
+ for (s = e; s > match; mb_ptr_back(match, s)) {
+ if (vim_ispathsep(*s)) {
+ break;
+ }
}
- if (*e != NUL)
- ++e;
+ s++;
+ *e = NUL;
+ memmove(match, s, e - s + 1);
}
- free(matches);
}
+
if (GA_EMPTY(&ga))
return FAIL;
@@ -4103,60 +4096,43 @@ static int ExpandRTDir(char_u *pat, int *num_file, char_u ***file, char *dirname
}
-/*
- * Expand "file" for all comma-separated directories in "path".
- * Returns an allocated string with all matches concatenated, separated by
- * newlines. Returns NULL for an error or no matches.
- */
-char_u *globpath(char_u *path, char_u *file, int expand_options)
+/// Expand `file` for all comma-separated directories in `path`.
+/// Adds matches to `ga`.
+void globpath(char_u *path, char_u *file, garray_T *ga, int expand_options)
{
expand_T xpc;
- garray_T ga;
- int i;
- int len;
- int num_p;
- char_u **p;
- char_u *cur = NULL;
-
- char_u *buf = xmalloc(MAXPATHL);
-
ExpandInit(&xpc);
xpc.xp_context = EXPAND_FILES;
- ga_init(&ga, 1, 100);
+ char_u *buf = xmalloc(MAXPATHL);
- /* Loop over all entries in {path}. */
+ // Loop over all entries in {path}.
while (*path != NUL) {
- /* Copy one item of the path to buf[] and concatenate the file name. */
+ // Copy one item of the path to buf[] and concatenate the file name.
copy_option_part(&path, buf, MAXPATHL, ",");
if (STRLEN(buf) + STRLEN(file) + 2 < MAXPATHL) {
add_pathsep(buf);
- STRCAT(buf, file);
+ STRCAT(buf, file); // NOLINT
+
+ char_u **p;
+ int num_p;
if (ExpandFromContext(&xpc, buf, &num_p, &p,
WILD_SILENT|expand_options) != FAIL && num_p > 0) {
ExpandEscape(&xpc, buf, num_p, p, WILD_SILENT|expand_options);
- for (len = 0, i = 0; i < num_p; ++i)
- len += (int)STRLEN(p[i]) + 1;
-
- /* Concatenate new results to previous ones. */
- ga_grow(&ga, len);
- cur = (char_u *)ga.ga_data + ga.ga_len;
- for (i = 0; i < num_p; ++i) {
- STRCPY(cur, p[i]);
- cur += STRLEN(p[i]);
- *cur++ = '\n';
+
+ // Concatenate new results to previous ones.
+ ga_grow(ga, num_p);
+ for (int i = 0; i < num_p; i++) {
+ ((char_u **)ga->ga_data)[ga->ga_len] = vim_strsave(p[i]);
+ ga->ga_len++;
}
- ga.ga_len += len;
FreeWild(num_p, p);
}
}
}
- if (cur != NULL)
- *--cur = 0; /* Replace trailing newline with NUL */
free(buf);
- return (char_u *)ga.ga_data;
}
diff --git a/src/nvim/file_search.c b/src/nvim/file_search.c
index 845a99acad..c7e1f5cbbc 100644
--- a/src/nvim/file_search.c
+++ b/src/nvim/file_search.c
@@ -409,7 +409,6 @@ vim_findfile_init (
* The octet after a '**' is used as a (binary) counter.
* So '**3' is transposed to '**^C' ('^C' is ASCII value 3)
* or '**76' is transposed to '**N'( 'N' is ASCII value 76).
- * For EBCDIC you get different character values.
* If no restrict is given after '**' the default is used.
* Due to this technique the path looks awful if you print it as a
* string.
diff --git a/src/nvim/fileio.c b/src/nvim/fileio.c
index c072be424e..2e932e9695 100644
--- a/src/nvim/fileio.c
+++ b/src/nvim/fileio.c
@@ -2711,16 +2711,10 @@ buf_write (
* - it's a hard link
* - it's a symbolic link
* - we don't have write permission in the directory
- * - we can't set the owner/group of the new file
*/
if (file_info_old.stat.st_nlink > 1
|| !os_get_file_info_link((char *)fname, &file_info)
- || !os_file_info_id_equal(&file_info, &file_info_old)
-# ifndef HAVE_FCHOWN
- || file_info.stat.st_uid != file_info_old.stat.st_uid
- || file_info.stat.st_gid != file_info_old.stat.st_gid
-# endif
- ) {
+ || !os_file_info_id_equal(&file_info, &file_info_old)) {
backup_copy = TRUE;
} else
# endif
@@ -2744,9 +2738,7 @@ buf_write (
backup_copy = TRUE;
else {
# ifdef UNIX
-# ifdef HAVE_FCHOWN
- fchown(fd, file_info_old.stat.st_uid, file_info_old.stat.st_gid);
-# endif
+ os_fchown(fd, file_info_old.stat.st_uid, file_info_old.stat.st_gid);
if (!os_get_file_info((char *)IObuff, &file_info)
|| file_info.stat.st_uid != file_info_old.stat.st_uid
|| file_info.stat.st_gid != file_info_old.stat.st_gid
@@ -2909,10 +2901,7 @@ buf_write (
* others.
*/
if (file_info_new.stat.st_gid != file_info_old.stat.st_gid
-# ifdef HAVE_FCHOWN /* sequent-ptx lacks fchown() */
- && fchown(bfd, (uid_t)-1, file_info_old.stat.st_gid) != 0
-# endif
- ) {
+ && os_fchown(bfd, -1, file_info_old.stat.st_gid) != 0) {
os_setperm(backup, (perm & 0707) | ((perm & 07) << 3));
}
# ifdef HAVE_SELINUX
@@ -3424,19 +3413,16 @@ restore_backup:
/* When creating a new file, set its owner/group to that of the original
* file. Get the new device and inode number. */
if (backup != NULL && !backup_copy) {
-# ifdef HAVE_FCHOWN
-
/* don't change the owner when it's already OK, some systems remove
* permission or ACL stuff */
FileInfo file_info;
if (!os_get_file_info((char *)wfname, &file_info)
|| file_info.stat.st_uid != file_info_old.stat.st_uid
|| file_info.stat.st_gid != file_info_old.stat.st_gid) {
- fchown(fd, file_info_old.stat.st_uid, file_info_old.stat.st_gid);
+ os_fchown(fd, file_info_old.stat.st_uid, file_info_old.stat.st_gid);
if (perm >= 0) /* set permission again, may have changed */
(void)os_setperm(wfname, perm);
}
-# endif
buf_set_file_id(buf);
} else if (!buf->file_id_valid) {
// Set the file_id when creating a new file.
@@ -7183,45 +7169,8 @@ match_file_pat (
{
regmatch_T regmatch;
int result = FALSE;
-#ifdef FEAT_OSFILETYPE
- int no_pattern = FALSE; /* TRUE if check is filetype only */
- char_u *type_start;
- char_u c;
- int match = FALSE;
-#endif
regmatch.rm_ic = p_fic; /* ignore case if 'fileignorecase' is set */
-#ifdef FEAT_OSFILETYPE
- if (*pattern == '<') {
- /* There is a filetype condition specified with this pattern.
- * Check the filetype matches first. If not, don't bother with the
- * pattern (set regprog to NULL).
- * Always use magic for the regexp.
- */
-
- for (type_start = pattern + 1; (c = *pattern); pattern++) {
- if ((c == ';' || c == '>') && match == FALSE) {
- *pattern = NUL; /* Terminate the string */
- /* TODO: match with 'filetype' of buffer that "fname" comes
- * from. */
- match = mch_check_filetype(fname, type_start);
- *pattern = c; /* Restore the terminator */
- type_start = pattern + 1;
- }
- if (c == '>')
- break;
- }
-
- /* (c should never be NUL, but check anyway) */
- if (match == FALSE || c == NUL)
- regmatch.regprog = NULL; /* Doesn't match - don't check pat. */
- else if (*pattern == NUL) {
- regmatch.regprog = NULL; /* Vim will try to free regprog later */
- no_pattern = TRUE; /* Always matches - don't check pat. */
- } else
- regmatch.regprog = vim_regcomp(pattern + 1, RE_MAGIC);
- } else
-#endif
{
if (prog != NULL)
regmatch.regprog = prog;
@@ -7236,12 +7185,6 @@ match_file_pat (
* 3. the tail of the file name, when the pattern has no '/'.
*/
if (
-#ifdef FEAT_OSFILETYPE
- /* If the check is for a filetype only and we don't care
- * about the path then skip all the regexp stuff.
- */
- no_pattern ||
-#endif
(regmatch.regprog != NULL
&& ((allow_dirs
&& (vim_regexec(&regmatch, fname, (colnr_T)0)
@@ -7294,9 +7237,6 @@ int match_file_list(char_u *list, char_u *sfname, char_u *ffname)
* allow_dirs, otherwise FALSE is put there -- webb.
* Handle backslashes before special characters, like "\*" and "\ ".
*
- * If FEAT_OSFILETYPE defined then pass initial <type> through unchanged. Eg:
- * '<html>myfile' becomes '<html>^myfile$' -- leonard.
- *
* Returns NULL on failure.
*/
char_u *
@@ -7314,38 +7254,13 @@ file_pat_to_reg_pat (
int i;
int nested = 0;
int add_dollar = TRUE;
-#ifdef FEAT_OSFILETYPE
- int check_length = 0;
-#endif
if (allow_dirs != NULL)
*allow_dirs = FALSE;
if (pat_end == NULL)
pat_end = pat + STRLEN(pat);
-#ifdef FEAT_OSFILETYPE
- /* Find out how much of the string is the filetype check */
- if (*pat == '<') {
- /* Count chars until the next '>' */
- for (p = pat + 1; p < pat_end && *p != '>'; p++)
- ;
- if (p < pat_end) {
- /* Pattern is of the form <.*>.* */
- check_length = p - pat + 1;
- if (p + 1 >= pat_end) {
- /* The 'pattern' is a filetype check ONLY */
- reg_pat = xmemdupz(pat, (size_t)check_length);
- return reg_pat;
- }
- }
- /* else: there was no closing '>' - assume it was a normal pattern */
-
- }
- pat += check_length;
- size = 2 + (size_t)check_length;
-#else
size = 2; /* '^' at start, '$' at end */
-#endif
for (p = pat; p < pat_end; p++) {
switch (*p) {
@@ -7374,14 +7289,7 @@ file_pat_to_reg_pat (
}
reg_pat = xmalloc(size + 1);
-#ifdef FEAT_OSFILETYPE
- /* Copy the type check in to the start. */
- if (check_length)
- memmove(reg_pat, pat - check_length, (size_t)check_length);
- i = check_length;
-#else
i = 0;
-#endif
if (pat[0] == '*')
while (pat[0] == '*' && pat < pat_end - 1)
diff --git a/src/nvim/garray.c b/src/nvim/garray.c
index 033ea9baac..08a38493bf 100644
--- a/src/nvim/garray.c
+++ b/src/nvim/garray.c
@@ -133,6 +133,7 @@ void ga_remove_duplicate_strings(garray_T *gap)
/// strings with sep as separator.
///
/// @param gap
+/// @param sep
///
/// @returns the concatenated strings
char_u *ga_concat_strings_sep(const garray_T *gap, const char *sep)
@@ -159,7 +160,7 @@ char_u *ga_concat_strings_sep(const garray_T *gap, const char *sep)
s = xstpcpy(s, strings[i]);
s = xstpcpy(s, sep);
}
- s = xstpcpy(s, strings[nelem - 1]);
+ strcpy(s, strings[nelem - 1]);
return (char_u *) ret;
}
diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c
index 340b31d80a..e98bb2744c 100644
--- a/src/nvim/getchar.c
+++ b/src/nvim/getchar.c
@@ -543,9 +543,7 @@ AppendToRedobuffLit (
/* Put a string of normal characters in the redo buffer (that's
* faster). */
start = s;
- while (*s >= ' '
- && *s < DEL /* EBCDIC: all chars above space are normal */
- && (len < 0 || s - str < len))
+ while (*s >= ' ' && *s < DEL && (len < 0 || s - str < len))
++s;
/* Don't put '0' or '^' as last character, just in case a CTRL-D is
@@ -567,7 +565,7 @@ AppendToRedobuffLit (
if (c < ' ' || c == DEL || (*s == NUL && (c == '0' || c == '^')))
add_char_buff(&redobuff, Ctrl_V);
- /* CTRL-V '0' must be inserted as CTRL-V 048 (EBCDIC: xf0) */
+ /* CTRL-V '0' must be inserted as CTRL-V 048 */
if (*s == NUL && c == '0')
add_buff(&redobuff, (char_u *)"048", 3L);
else
@@ -4078,7 +4076,7 @@ int put_escstr(FILE *fd, char_u *strstart, int what)
*/
if (c == NL) {
if (what == 2) {
- if (fprintf(fd, IF_EB("\\\026\n", "\\" CTRL_V_STR "\n")) < 0)
+ if (fprintf(fd, "\\\026\n") < 0)
return FAIL;
} else {
if (fprintf(fd, "<NL>") < 0)
diff --git a/src/nvim/globals.h b/src/nvim/globals.h
index b496b7e576..ad65f7e6fd 100644
--- a/src/nvim/globals.h
+++ b/src/nvim/globals.h
@@ -905,9 +905,6 @@ EXTERN int read_cmd_fd INIT(= 0); /* fd to read commands from */
/* volatile because it is used in signal handler catch_sigint(). */
EXTERN volatile int got_int INIT(= FALSE); /* set to TRUE when interrupt
signal occurred */
-#ifdef USE_TERM_CONSOLE
-EXTERN int term_console INIT(= FALSE); /* set to TRUE when console used */
-#endif
EXTERN int termcap_active INIT(= FALSE); /* set by starttermcap() */
EXTERN int cur_tmode INIT(= TMODE_COOK); /* input terminal mode */
EXTERN int bangredo INIT(= FALSE); /* set to TRUE with ! command */
diff --git a/src/nvim/hardcopy.c b/src/nvim/hardcopy.c
index 64a5879d7d..b964aa7353 100644
--- a/src/nvim/hardcopy.c
+++ b/src/nvim/hardcopy.c
@@ -1502,9 +1502,7 @@ static void prt_flush_buffer(void)
prt_write_real(prt_text_run, 2);
prt_write_string("ul\n");
}
- /* Draw the text
- * Note: we write text out raw - EBCDIC conversion is handled in the
- * PostScript world via the font encoding vector. */
+ // Draw the text
if (prt_out_mbyte)
prt_write_string("<");
else
@@ -2803,7 +2801,7 @@ void mch_print_end(prt_settings_T *psettings)
/* Write CTRL-D to close serial communication link if used.
* NOTHING MUST BE WRITTEN AFTER THIS! */
- prt_write_file((char_u *)IF_EB("\004", "\067"));
+ prt_write_file((char_u *)"\004");
if (!prt_file_error && psettings->outfile == NULL
&& !got_int && !psettings->user_abort) {
@@ -3031,20 +3029,18 @@ int mch_print_text_out(char_u *p, int len)
if (ch < 32 || ch == '(' || ch == ')' || ch == '\\') {
/* Convert non-printing characters to either their escape or octal
* sequence, ensures PS sent over a serial line does not interfere
- * with the comms protocol. Note: For EBCDIC we need to write out
- * the escape sequences as ASCII codes!
- * Note 2: Char codes < 32 are identical in EBCDIC and ASCII AFAIK!
+ * with the comms protocol.
*/
- ga_append(&prt_ps_buffer, IF_EB('\\', 0134));
+ ga_append(&prt_ps_buffer, '\\');
switch (ch) {
- case BS: ga_append(&prt_ps_buffer, IF_EB('b', 0142)); break;
- case TAB: ga_append(&prt_ps_buffer, IF_EB('t', 0164)); break;
- case NL: ga_append(&prt_ps_buffer, IF_EB('n', 0156)); break;
- case FF: ga_append(&prt_ps_buffer, IF_EB('f', 0146)); break;
- case CAR: ga_append(&prt_ps_buffer, IF_EB('r', 0162)); break;
- case '(': ga_append(&prt_ps_buffer, IF_EB('(', 0050)); break;
- case ')': ga_append(&prt_ps_buffer, IF_EB(')', 0051)); break;
- case '\\': ga_append(&prt_ps_buffer, IF_EB('\\', 0134)); break;
+ case BS: ga_append(&prt_ps_buffer, 'b'); break;
+ case TAB: ga_append(&prt_ps_buffer, 't'); break;
+ case NL: ga_append(&prt_ps_buffer, 'n'); break;
+ case FF: ga_append(&prt_ps_buffer, 'f'); break;
+ case CAR: ga_append(&prt_ps_buffer, 'r'); break;
+ case '(': ga_append(&prt_ps_buffer, '('); break;
+ case ')': ga_append(&prt_ps_buffer, ')'); break;
+ case '\\': ga_append(&prt_ps_buffer, '\\'); break;
default:
sprintf((char *)ch_buff, "%03o", (unsigned int)ch);
diff --git a/src/nvim/indent.c b/src/nvim/indent.c
index ebc5955bae..d4c6b36177 100644
--- a/src/nvim/indent.c
+++ b/src/nvim/indent.c
@@ -690,7 +690,7 @@ static int lisp_match(char_u *p)
{
char_u buf[LSIZE];
int len;
- char_u *word = p_lispwords;
+ char_u *word = *curbuf->b_p_lw != NUL ? curbuf->b_p_lw : p_lispwords;
while (*word != NUL) {
(void)copy_option_part(&word, buf, LSIZE, ",");
diff --git a/src/nvim/mark_defs.h b/src/nvim/mark_defs.h
index c6f2e46bb0..67392234d3 100644
--- a/src/nvim/mark_defs.h
+++ b/src/nvim/mark_defs.h
@@ -8,9 +8,6 @@
* (a normal mark is a lnum/col pair, the same as a file position)
*/
-/* (Note: for EBCDIC there are more than 26, because there are gaps in the
- * alphabet coding. To minimize changes to the code, I decided to just
- * increase the number of possible marks. */
#define NMARKS ('z' - 'a' + 1) /* max. # of named marks */
#define JUMPLISTSIZE 100 /* max. # of marks in jump list */
#define TAGSTACKSIZE 20 /* max. # of tags in tag stack */
diff --git a/src/nvim/menu.c b/src/nvim/menu.c
index 9c81824cbb..1573aaae84 100644
--- a/src/nvim/menu.c
+++ b/src/nvim/menu.c
@@ -1185,21 +1185,7 @@ static char_u *menu_text(char_u *str, int *mnemonic, char_u **actext)
if (p[1] == NUL) /* trailing "&" */
break;
if (mnemonic != NULL && p[1] != '&')
-#if !defined(__MVS__) || defined(MOTIF390_MNEMONIC_FIXED)
*mnemonic = p[1];
-#else
- {
- /*
- * Well there is a bug in the Motif libraries on OS390 Unix.
- * The mnemonic keys needs to be converted to ASCII values
- * first.
- * This behavior has been seen in 2.8 and 2.9.
- */
- char c = p[1];
- __etoa_l(&c, 1);
- *mnemonic = c;
- }
-#endif
STRMOVE(p, p + 1);
p = p + 1;
}
diff --git a/src/nvim/ops.c b/src/nvim/ops.c
index 3008af94f3..0bf338947b 100644
--- a/src/nvim/ops.c
+++ b/src/nvim/ops.c
@@ -1147,10 +1147,7 @@ static void stuffescaped(char_u *arg, int literally)
* stuff K_SPECIAL to get the effect of a special key when "literally"
* is TRUE. */
start = arg;
- while ((*arg >= ' '
- && *arg < DEL /* EBCDIC: chars above space are normal */
- )
- || (*arg == K_SPECIAL && !literally))
+ while ((*arg >= ' ' && *arg < DEL) || (*arg == K_SPECIAL && !literally))
++arg;
if (arg > start)
stuffReadbuffLen(start, (long)(arg - start));
@@ -2508,6 +2505,9 @@ int op_yank(oparg_T *oap, int deleting, int mess)
free(y_current->y_array);
y_current = curr;
}
+ if (curwin->w_p_rnu) {
+ redraw_later(SOME_VALID); // cursor moved to start
+ }
if (mess) { /* Display message about yank? */
if (yanktype == MCHAR
&& !oap->block_mode
diff --git a/src/nvim/option.c b/src/nvim/option.c
index ebf2e8b4af..63ea2ee338 100644
--- a/src/nvim/option.c
+++ b/src/nvim/option.c
@@ -143,6 +143,7 @@
# define PV_KMAP OPT_BUF(BV_KMAP)
#define PV_KP OPT_BOTH(OPT_BUF(BV_KP))
# define PV_LISP OPT_BUF(BV_LISP)
+# define PV_LW OPT_BOTH(OPT_BUF(BV_LW))
#define PV_MA OPT_BUF(BV_MA)
#define PV_ML OPT_BUF(BV_ML)
#define PV_MOD OPT_BUF(BV_MOD)
@@ -965,10 +966,10 @@ static struct vimoption
{(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
{"initclipboard","icpb",P_STRING|P_VI_DEF|P_SECURE,
(char_u *)&p_icpb, PV_NONE,
- {(char_u *)NULL, (char_u *)0L} SCRIPTID_INIT},
+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
{"initpython","ipy",P_STRING|P_VI_DEF|P_SECURE,
(char_u *)&p_ipy, PV_NONE,
- {(char_u *)NULL, (char_u *)0L} SCRIPTID_INIT},
+ {(char_u *)"", (char_u *)0L} SCRIPTID_INIT},
{"insertmode", "im", P_BOOL|P_VI_DEF|P_VIM,
(char_u *)&p_im, PV_NONE,
{(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
@@ -1057,7 +1058,7 @@ static struct vimoption
(char_u *)&p_lisp, PV_LISP,
{(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
{"lispwords", "lw", P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
- (char_u *)&p_lispwords, PV_NONE,
+ (char_u *)&p_lispwords, PV_LW,
{(char_u *)LISPWORD_VALUE, (char_u *)0L}
SCRIPTID_INIT},
{"list", NULL, P_BOOL|P_VI_DEF|P_RWIN,
@@ -1596,7 +1597,7 @@ static struct vimoption
{(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
{"ttyfast", "tf", P_BOOL|P_NO_MKRC|P_VI_DEF,
(char_u *)&p_tf, PV_NONE,
- {(char_u *)FALSE, (char_u *)0L} SCRIPTID_INIT},
+ {(char_u *)TRUE, (char_u *)0L} SCRIPTID_INIT},
{"ttymouse", "ttym", P_STRING|P_NODEFAULT|P_NO_MKRC|P_VI_DEF,
#if defined(FEAT_MOUSE) && defined(UNIX)
(char_u *)&p_ttym, PV_NONE,
@@ -1933,26 +1934,15 @@ void set_init_1(void)
*/
opt_idx = findoption((char_u *)"maxmemtot");
if (opt_idx >= 0) {
-#ifndef HAVE_TOTAL_MEM
- if (options[opt_idx].def_val[VI_DEFAULT] == (char_u *)0L)
-#endif
{
-#ifdef HAVE_TOTAL_MEM
/* Use half of amount of memory available to Vim. */
/* If too much to fit in long_u, get long_u max */
uint64_t available_kib = os_get_total_mem_kib();
n = available_kib / 2 > ULONG_MAX ? ULONG_MAX
: (long_u)(available_kib /2);
-#else
- n = (0x7fffffff >> 11);
-#endif
options[opt_idx].def_val[VI_DEFAULT] = (char_u *)n;
opt_idx = findoption((char_u *)"maxmem");
if (opt_idx >= 0) {
-#ifndef HAVE_TOTAL_MEM
- if ((long)options[opt_idx].def_val[VI_DEFAULT] > (long)n
- || (long)options[opt_idx].def_val[VI_DEFAULT] == 0L)
-#endif
options[opt_idx].def_val[VI_DEFAULT] = (char_u *)n;
}
}
@@ -1995,7 +1985,7 @@ void set_init_1(void)
}
}
-#if defined(MSWIN) || defined(EBCDIC) || defined(MAC)
+#if defined(MSWIN) || defined(MAC)
/* Set print encoding on platforms that don't default to latin1 */
set_string_default("penc",
(char_u *)"hp-roman8"
@@ -2369,7 +2359,6 @@ void set_init_3(void)
* This is done after other initializations, where 'shell' might have been
* set, but only if they have not been set before.
*/
- char_u *p;
int idx_srr;
int do_srr;
int idx_sp;
@@ -2386,28 +2375,10 @@ void set_init_3(void)
else
do_sp = !(options[idx_sp].flags & P_WAS_SET);
- /*
- * Isolate the name of the shell:
- * - Skip beyond any path. E.g., "/usr/bin/csh -f" -> "csh -f".
- * - Remove any argument. E.g., "csh -f" -> "csh".
- * But don't allow a space in the path, so that this works:
- * "/usr/bin/csh --rcfile ~/.cshrc"
- * But don't do that for Windows, it's common to have a space in the path.
- */
- p = skiptowhite(p_sh);
- if (*p == NUL) {
- /* No white space, use the tail. */
- p = vim_strsave(path_tail(p_sh));
- } else {
- char_u *p1, *p2;
+ size_t len = 0;
+ char_u *p = (char_u *)invocation_path_tail(p_sh, &len);
+ p = vim_strnsave(p, len);
- /* Find the last path separator before the space. */
- p1 = p_sh;
- for (p2 = p_sh; p2 < p; mb_ptr_adv(p2))
- if (vim_ispathsep(*p2))
- p1 = p2 + 1;
- p = vim_strnsave(p1, (int)(p - p1));
- }
{
/*
* Default for p_sp is "| tee", for p_srr is ">".
@@ -2431,6 +2402,7 @@ void set_init_3(void)
|| fnamecmp(p, "zsh") == 0
|| fnamecmp(p, "zsh-beta") == 0
|| fnamecmp(p, "bash") == 0
+ || fnamecmp(p, "fish") == 0
) {
if (do_sp) {
p_sp = (char_u *)"2>&1| tee";
@@ -3569,6 +3541,7 @@ void check_buf_options(buf_T *buf)
check_string_option(&buf->b_p_tags);
check_string_option(&buf->b_p_dict);
check_string_option(&buf->b_p_tsr);
+ check_string_option(&buf->b_p_lw);
}
/*
@@ -6543,10 +6516,13 @@ void comp_col(void)
void unset_global_local_option(char *name, void *from)
{
struct vimoption *p;
- int opt_idx;
buf_T *buf = (buf_T *)from;
- opt_idx = findoption((uint8_t *)name);
+ int opt_idx = findoption((uint8_t *)name);
+ if (opt_idx < 0) {
+ EMSG2(_("E355: Unknown option: %s"), name);
+ return;
+ }
p = &(options[opt_idx]);
switch ((int)p->indir)
@@ -6594,6 +6570,9 @@ void unset_global_local_option(char *name, void *from)
case PV_UL:
buf->b_p_ul = NO_LOCAL_UNDOLEVEL;
break;
+ case PV_LW:
+ clear_string_option(&buf->b_p_lw);
+ break;
}
}
@@ -6623,6 +6602,7 @@ static char_u *get_varp_scope(struct vimoption *p, int opt_flags)
case PV_TSR: return (char_u *)&(curbuf->b_p_tsr);
case PV_STL: return (char_u *)&(curwin->w_p_stl);
case PV_UL: return (char_u *)&(curbuf->b_p_ul);
+ case PV_LW: return (char_u *)&(curbuf->b_p_lw);
}
return NULL; /* "cannot happen" */
}
@@ -6670,6 +6650,8 @@ static char_u *get_varp(struct vimoption *p)
? (char_u *)&(curwin->w_p_stl) : p->var;
case PV_UL: return curbuf->b_p_ul != NO_LOCAL_UNDOLEVEL
? (char_u *)&(curbuf->b_p_ul) : p->var;
+ case PV_LW: return *curbuf->b_p_lw != NUL
+ ? (char_u *)&(curbuf->b_p_lw) : p->var;
case PV_ARAB: return (char_u *)&(curwin->w_p_arab);
case PV_LIST: return (char_u *)&(curwin->w_p_list);
@@ -7022,6 +7004,7 @@ void buf_copy_options(buf_T *buf, int flags)
buf->b_p_tsr = empty_option;
buf->b_p_qe = vim_strsave(p_qe);
buf->b_p_udf = p_udf;
+ buf->b_p_lw = empty_option;
/*
* Don't copy the options set by ex_help(), use the saved values,
diff --git a/src/nvim/option_defs.h b/src/nvim/option_defs.h
index a22eec4136..d862ab2761 100644
--- a/src/nvim/option_defs.h
+++ b/src/nvim/option_defs.h
@@ -185,7 +185,8 @@
#define SHM_SEARCH 's' /* no search hit bottom messages */
#define SHM_ATTENTION 'A' /* no ATTENTION messages */
#define SHM_INTRO 'I' /* intro messages */
-#define SHM_ALL "rmfixlnwaWtToOsAI" /* all possible flags for 'shm' */
+#define SHM_COMPLETIONMENU 'c' // completion menu messages
+#define SHM_ALL "rmfixlnwaWtToOsAIc" /* all possible flags for 'shm' */
/* characters for p_go: */
#define GO_ASEL 'a' /* autoselect */
@@ -683,6 +684,7 @@ enum {
, BV_KMAP
, BV_KP
, BV_LISP
+ , BV_LW
, BV_MA
, BV_ML
, BV_MOD
diff --git a/src/nvim/os/fs.c b/src/nvim/os/fs.c
index 46aea2bf36..aca7005064 100644
--- a/src/nvim/os/fs.c
+++ b/src/nvim/os/fs.c
@@ -3,13 +3,6 @@
#include <assert.h>
-// TODO(hinidu): remove after implementing `os_mkdtemp` on top of libuv
-#ifdef WIN32
-# include <io.h>
-#else
-# include <stdlib.h>
-#endif
-
#include "nvim/os/os.h"
#include "nvim/ascii.h"
#include "nvim/memory.h"
@@ -217,6 +210,21 @@ int os_setperm(const char_u *name, int perm)
return FAIL;
}
+/// Changes the ownership of the file referred to by the open file descriptor.
+///
+/// @return `0` on success, a libuv error code on failure.
+///
+/// @note If the `owner` or `group` is specified as `-1`, then that ID is not
+/// changed.
+int os_fchown(int file_descriptor, uv_uid_t owner, uv_gid_t group)
+{
+ uv_fs_t request;
+ int result = uv_fs_fchown(uv_default_loop(), &request, file_descriptor,
+ owner, group, NULL);
+ uv_fs_req_cleanup(&request);
+ return result;
+}
+
/// Check if a file exists.
///
/// @return `true` if `name` exists.
@@ -293,18 +301,21 @@ int os_mkdir(const char *path, int32_t mode)
}
/// Create a unique temporary directory.
-/// TODO(hinidu): Implement on top of libuv. ref #850
///
-/// @param[in,out] template Template of the path to the directory with XXXXXX
-/// which would be replaced by random chars.
-/// @return Pointer to changed `template` for success, `NULL` for failure.
-char *os_mkdtemp(char *template)
+/// @param[in] template Template of the path to the directory with XXXXXX
+/// which would be replaced by random chars.
+/// @param[out] path Path to created directory for success, undefined for
+/// failure.
+/// @return `0` for success, non-zero for failure.
+int os_mkdtemp(const char *template, char *path)
{
-#ifdef WIN32
- return _mktemp(template) && os_mkdir(template, 0700) == 0 ? template : NULL;
-#else
- return mkdtemp(template);
-#endif
+ uv_fs_t request;
+ int result = uv_fs_mkdtemp(uv_default_loop(), &request, template, NULL);
+ if (result == kLibuvSuccess) {
+ strcpy(path, request.path);
+ }
+ uv_fs_req_cleanup(&request);
+ return result;
}
/// Remove a directory.
diff --git a/src/nvim/os/provider.c b/src/nvim/os/provider.c
index 99cc078e94..d94203f683 100644
--- a/src/nvim/os/provider.c
+++ b/src/nvim/os/provider.c
@@ -158,8 +158,10 @@ static uint64_t get_provider_for(char *method)
err:
// Ensure we won't try to restart the provider
- f->bootstrap_command = NULL;
- f->channel_id = 0;
+ if (f) {
+ f->bootstrap_command = NULL;
+ f->channel_id = 0;
+ }
return 0;
}
diff --git a/src/nvim/os_unix.c b/src/nvim/os_unix.c
index 9e7940bc2a..af17676ebf 100644
--- a/src/nvim/os_unix.c
+++ b/src/nvim/os_unix.c
@@ -16,15 +16,6 @@
* changed beyond recognition.
*/
-/*
- * Some systems have a prototype for select() that has (int *) instead of
- * (fd_set *), which is wrong. This define removes that prototype. We define
- * our own prototype below.
- * Don't use it for the Mac, it causes a warning for precompiled headers.
- * TODO: use a configure check for precompiled headers?
- */
-# define select select_declared_wrong
-
#include <errno.h>
#include <inttypes.h>
#include <stdbool.h>
@@ -307,40 +298,6 @@ int use_xterm_mouse(void)
return 0;
}
-int vim_is_iris(char_u *name)
-{
- if (name == NULL)
- return FALSE;
- return STRNICMP(name, "iris-ansi", 9) == 0
- || STRCMP(name, "builtin_iris-ansi") == 0;
-}
-
-int vim_is_vt300(char_u *name)
-{
- if (name == NULL)
- return FALSE; /* actually all ANSI comp. terminals should be here */
- /* catch VT100 - VT5xx */
- return (STRNICMP(name, "vt", 2) == 0
- && vim_strchr((char_u *)"12345", name[2]) != NULL)
- || STRCMP(name, "builtin_vt320") == 0;
-}
-
-/*
- * Return TRUE if "name" is a terminal for which 'ttyfast' should be set.
- * This should include all windowed terminal emulators.
- */
-int vim_is_fastterm(char_u *name)
-{
- if (name == NULL)
- return FALSE;
- if (vim_is_xterm(name) || vim_is_vt300(name) || vim_is_iris(name))
- return TRUE;
- return STRNICMP(name, "hpterm", 6) == 0
- || STRNICMP(name, "sun-cmd", 7) == 0
- || STRNICMP(name, "screen", 6) == 0
- || STRNICMP(name, "dtterm", 6) == 0;
-}
-
#if defined(USE_FNAME_CASE) || defined(PROTO)
/*
* Set the case of the file name, if it already exists. This will cause the
@@ -753,16 +710,16 @@ void mch_setmouse(int on)
if (ttym_flags == TTYM_URXVT) {
out_str_nf((char_u *)
(on
- ? IF_EB("\033[?1015h", ESC_STR "[?1015h")
- : IF_EB("\033[?1015l", ESC_STR "[?1015l")));
+ ? "\033[?1015h"
+ : "\033[?1015l"));
ison = on;
}
if (ttym_flags == TTYM_SGR) {
out_str_nf((char_u *)
(on
- ? IF_EB("\033[?1006h", ESC_STR "[?1006h")
- : IF_EB("\033[?1006l", ESC_STR "[?1006l")));
+ ? "\033[?1006h"
+ : "\033[?1006l"));
ison = on;
}
@@ -770,13 +727,13 @@ void mch_setmouse(int on)
if (on) /* enable mouse events, use mouse tracking if available */
out_str_nf((char_u *)
(xterm_mouse_vers > 1
- ? IF_EB("\033[?1002h", ESC_STR "[?1002h")
- : IF_EB("\033[?1000h", ESC_STR "[?1000h")));
+ ? "\033[?1002h"
+ : "\033[?1000h"));
else /* disable mouse events, could probably always send the same */
out_str_nf((char_u *)
(xterm_mouse_vers > 1
- ? IF_EB("\033[?1002l", ESC_STR "[?1002l")
- : IF_EB("\033[?1000l", ESC_STR "[?1000l")));
+ ? "\033[?1002l"
+ : "\033[?1000l"));
ison = on;
} else if (ttym_flags == TTYM_DEC) {
if (on) /* enable mouse events */
@@ -797,8 +754,8 @@ void check_mouse_termcode(void)
&& use_xterm_mouse() != 3
) {
set_mouse_termcode(KS_MOUSE, (char_u *)(term_is_8bit(T_NAME)
- ? IF_EB("\233M", CSI_STR "M")
- : IF_EB("\033[M", ESC_STR "[M")));
+ ? "\233M"
+ : "\033[M"));
if (*p_mouse != NUL) {
/* force mouse off and maybe on to send possibly new mouse
* activation sequence to the xterm, with(out) drag tracing. */
@@ -814,7 +771,7 @@ void check_mouse_termcode(void)
if (!use_xterm_mouse()
)
set_mouse_termcode(KS_NETTERM_MOUSE,
- (char_u *)IF_EB("\033}", ESC_STR "}"));
+ (char_u *)"\033}");
else
del_mouse_termcode(KS_NETTERM_MOUSE);
@@ -822,17 +779,15 @@ void check_mouse_termcode(void)
if (!use_xterm_mouse()
)
set_mouse_termcode(KS_DEC_MOUSE, (char_u *)(term_is_8bit(T_NAME)
- ? IF_EB("\233",
- CSI_STR) : IF_EB("\033[",
- ESC_STR "[")));
+ ? "\233" : "\033["));
else
del_mouse_termcode(KS_DEC_MOUSE);
/* same as the dec mouse */
if (use_xterm_mouse() == 3
) {
set_mouse_termcode(KS_URXVT_MOUSE, (char_u *)(term_is_8bit(T_NAME)
- ? IF_EB("\233", CSI_STR)
- : IF_EB("\033[", ESC_STR "[")));
+ ? "\233"
+ : "\033["));
if (*p_mouse != NUL) {
mch_setmouse(FALSE);
@@ -844,8 +799,8 @@ void check_mouse_termcode(void)
if (use_xterm_mouse() == 4
) {
set_mouse_termcode(KS_SGR_MOUSE, (char_u *)(term_is_8bit(T_NAME)
- ? IF_EB("\233<", CSI_STR "<")
- : IF_EB("\033[<", ESC_STR "[<")));
+ ? "\233<"
+ : "\033[<"));
if (*p_mouse != NUL) {
mch_setmouse(FALSE);
diff --git a/src/nvim/os_unix_defs.h b/src/nvim/os_unix_defs.h
index 0d79117bfd..2a44ec3412 100644
--- a/src/nvim/os_unix_defs.h
+++ b/src/nvim/os_unix_defs.h
@@ -24,10 +24,6 @@
# include <unistd.h>
#endif
-#ifdef HAVE_LIBC_H
-# include <libc.h> /* for NeXT */
-#endif
-
#ifdef HAVE_SYS_PARAM_H
# include <sys/param.h> /* defines BSD, if it's a BSD system */
#endif
diff --git a/src/nvim/path.c b/src/nvim/path.c
index ea6390a688..0c18ab7bd4 100644
--- a/src/nvim/path.c
+++ b/src/nvim/path.c
@@ -131,6 +131,35 @@ char_u *path_tail_with_sep(char_u *fname)
return tail;
}
+/// Finds the path tail (or executable) in an invocation.
+///
+/// @param[in] invocation A program invocation in the form:
+/// "path/to/exe [args]".
+/// @param[out] len Stores the length of the executable name.
+///
+/// @post if `len` is not null, stores the length of the executable name.
+///
+/// @return The position of the last path separator + 1.
+const char_u *invocation_path_tail(const char_u *invocation, size_t *len)
+ FUNC_ATTR_NONNULL_RET FUNC_ATTR_NONNULL_ARG(1)
+{
+ const char_u *tail = get_past_head((char_u *) invocation);
+ const char_u *p = tail;
+ while (*p != NUL && *p != ' ') {
+ bool was_sep = vim_ispathsep_nocolon(*p);
+ mb_ptr_adv(p);
+ if (was_sep) {
+ tail = p; // Now tail points one past the separator.
+ }
+ }
+
+ if (len != NULL) {
+ *len = (size_t)(p - tail);
+ }
+
+ return tail;
+}
+
/// Get the next path component of a path name.
///
/// @param fname A file path. (Must be != NULL.)
@@ -897,9 +926,6 @@ expand_in_path (
{
char_u *curdir;
garray_T path_ga;
- char_u *files = NULL;
- char_u *s; /* start */
- char_u *e; /* end */
char_u *paths = NULL;
curdir = xmalloc(MAXPATHL);
@@ -914,28 +940,8 @@ expand_in_path (
paths = ga_concat_strings(&path_ga);
ga_clear_strings(&path_ga);
- files = globpath(paths, pattern, (flags & EW_ICASE) ? WILD_ICASE : 0);
+ globpath(paths, pattern, gap, (flags & EW_ICASE) ? WILD_ICASE : 0);
free(paths);
- if (files == NULL)
- return 0;
-
- /* Copy each path in files into gap */
- s = e = files;
- while (*s != NUL) {
- while (*e != '\n' && *e != NUL)
- e++;
- if (*e == NUL) {
- addfile(gap, s, flags);
- break;
- } else {
- /* *e is '\n' */
- *e = NUL;
- addfile(gap, s, flags);
- e++;
- s = e;
- }
- }
- free(files);
return gap->ga_len;
}
@@ -1225,10 +1231,8 @@ addfile (
/*
* Append a slash or backslash after directory names if none is present.
*/
-#ifndef DONT_ADD_PATHSEP_TO_DIR
if (isdir && (flags & EW_ADDSLASH))
add_pathsep(p);
-#endif
GA_APPEND(char_u *, gap, p);
}
#endif /* !NO_EXPANDPATH */
diff --git a/src/nvim/regexp.c b/src/nvim/regexp.c
index fd1b6116f2..193c68860d 100644
--- a/src/nvim/regexp.c
+++ b/src/nvim/regexp.c
@@ -258,6 +258,7 @@
#define RE_MARK 207 /* mark cmp Match mark position */
#define RE_VISUAL 208 /* Match Visual area */
+#define RE_COMPOSING 209 // any composing characters
/*
* Magic characters have a special meaning, they don't match literally.
@@ -1256,12 +1257,6 @@ static regprog_T *bt_regcomp(char_u *expr, int re_flags)
if (reg(REG_NOPAREN, &flags) == NULL)
return NULL;
- /* Small enough for pointer-storage convention? */
-#ifdef SMALL_MALLOC /* 16 bit storage allocation */
- if (regsize >= 65536L - 256L)
- EMSG_RET_NULL(_("E339: Pattern too long"));
-#endif
-
/* Allocate space. */
bt_regprog_T *r = xmalloc(sizeof(bt_regprog_T) + regsize);
@@ -2030,6 +2025,10 @@ static char_u *regatom(int *flagp)
ret = regnode(RE_VISUAL);
break;
+ case 'C':
+ ret = regnode(RE_COMPOSING);
+ break;
+
/* \%[abc]: Emit as a list of branches, all ending at the last
* branch which matches nothing. */
case '[':
@@ -4105,10 +4104,12 @@ regmatch (
status = RA_NOMATCH;
}
}
- // Check for following composing character.
+ // Check for following composing character, unless %C
+ // follows (skips over all composing chars).
if (status != RA_NOMATCH && enc_utf8
&& UTF_COMPOSINGLIKE(reginput, reginput + len)
- && !ireg_icombine) {
+ && !ireg_icombine
+ && OP(next) != RE_COMPOSING) {
// raaron: This code makes a composing character get
// ignored, which is the correct behavior (sometimes)
// for voweled Hebrew texts.
@@ -4173,6 +4174,15 @@ regmatch (
status = RA_NOMATCH;
break;
+ case RE_COMPOSING:
+ if (enc_utf8) {
+ // Skip composing characters.
+ while (utf_iscomposing(utf_ptr2char(reginput))) {
+ mb_cptr_adv(reginput);
+ }
+ }
+ break;
+
case NOTHING:
break;
diff --git a/src/nvim/regexp_nfa.c b/src/nvim/regexp_nfa.c
index 21581d3823..2659eac762 100644
--- a/src/nvim/regexp_nfa.c
+++ b/src/nvim/regexp_nfa.c
@@ -85,6 +85,7 @@ enum {
NFA_COMPOSING, /* Next nodes in NFA are part of the
composing multibyte char */
NFA_END_COMPOSING, /* End of a composing char in the NFA */
+ NFA_ANY_COMPOSING, // \%C: Any composing characters.
NFA_OPT_CHARS, /* \%[abc] */
/* The following are used only in the postfix form, not in the NFA */
@@ -1350,6 +1351,10 @@ static int nfa_regatom(void)
EMIT(NFA_VISUAL);
break;
+ case 'C':
+ EMIT(NFA_ANY_COMPOSING);
+ break;
+
case '[':
{
int n;
@@ -2259,6 +2264,7 @@ static void nfa_set_code(int c)
case NFA_MARK_LT: STRCPY(code, "NFA_MARK_LT "); break;
case NFA_CURSOR: STRCPY(code, "NFA_CURSOR "); break;
case NFA_VISUAL: STRCPY(code, "NFA_VISUAL "); break;
+ case NFA_ANY_COMPOSING: STRCPY(code, "NFA_ANY_COMPOSING "); break;
case NFA_STAR: STRCPY(code, "NFA_STAR "); break;
case NFA_STAR_NONGREEDY: STRCPY(code, "NFA_STAR_NONGREEDY "); break;
@@ -2716,6 +2722,7 @@ static int nfa_max_width(nfa_state_T *startstate, int depth)
case NFA_NLOWER_IC:
case NFA_UPPER_IC:
case NFA_NUPPER_IC:
+ case NFA_ANY_COMPOSING:
/* possibly non-ascii */
if (has_mbyte)
len += 3;
@@ -3714,6 +3721,7 @@ static int match_follows(nfa_state_T *startstate, int depth)
continue;
case NFA_ANY:
+ case NFA_ANY_COMPOSING:
case NFA_IDENT:
case NFA_SIDENT:
case NFA_KWORD:
@@ -3943,7 +3951,7 @@ skip_add:
#endif
switch (state->c) {
case NFA_MATCH:
- nfa_match = TRUE;
+ //nfa_match = TRUE;
break;
case NFA_SPLIT:
@@ -4573,6 +4581,7 @@ static int failure_chance(nfa_state_T *state, int depth)
case NFA_MATCH:
case NFA_MCLOSE:
+ case NFA_ANY_COMPOSING:
/* empty match works always */
return 0;
@@ -4951,6 +4960,11 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, regsubs_T *subm
switch (t->state->c) {
case NFA_MATCH:
{
+ // If the match ends before a composing characters and
+ // ireg_icombine is not set, that is not really a match.
+ if (enc_utf8 && !ireg_icombine && utf_iscomposing(curc)) {
+ break;
+ }
nfa_match = TRUE;
copy_sub(&submatch->norm, &t->subs.norm);
if (nfa_has_zsubexpr)
@@ -5430,6 +5444,18 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, regsubs_T *subm
}
break;
+ case NFA_ANY_COMPOSING:
+ // On a composing character skip over it. Otherwise do
+ // nothing. Always matches.
+ if (enc_utf8 && utf_iscomposing(curc)) {
+ add_off = clen;
+ } else {
+ add_here = TRUE;
+ add_off = 0;
+ }
+ add_state = t->state->out;
+ break;
+
/*
* Character classes like \a for alpha, \d for digit etc.
*/
@@ -5769,12 +5795,13 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, regsubs_T *subm
if (!result && ireg_ic)
result = vim_tolower(c) == vim_tolower(curc);
- /* If there is a composing character which is not being
- * ignored there can be no match. Match with composing
- * character uses NFA_COMPOSING above. */
- if (result && enc_utf8 && !ireg_icombine
- && clen != utf_char2len(curc))
- result = FALSE;
+
+ // If ireg_icombine is not set only skip over the character
+ // itself. When it is set skip over composing characters.
+ if (result && enc_utf8 && !ireg_icombine) {
+ clen = utf_char2len(curc);
+ }
+
ADD_STATE_IF_MATCH(t->state);
break;
}
diff --git a/src/nvim/screen.c b/src/nvim/screen.c
index 0d0d068b36..03c59bf584 100644
--- a/src/nvim/screen.c
+++ b/src/nvim/screen.c
@@ -41,7 +41,7 @@
*
* The part of the buffer that is displayed in a window is set with:
* - w_topline (first buffer line in window)
- * - w_topfill (filler line above the first line)
+ * - w_topfill (filler lines above the first line)
* - w_leftcol (leftmost window cell in window),
* - w_skipcol (skipped window cells of first line)
*
@@ -7341,7 +7341,8 @@ int showmode(void)
attr = hl_attr(HLF_CM); /* Highlight mode */
if (do_mode) {
MSG_PUTS_ATTR("--", attr);
- if (edit_submode != NULL) { /* CTRL-X in Insert mode */
+ // CTRL-X in Insert mode
+ if (edit_submode != NULL && !shortmess(SHM_COMPLETIONMENU)) {
/* These messages can get long, avoid a wrap in a narrow
* window. Prefer showing edit_submode_extra. */
length = (Rows - msg_row) * Columns - 3;
@@ -7726,22 +7727,6 @@ void showruler(int always)
static void win_redr_ruler(win_T *wp, int always)
{
-#define RULER_BUF_LEN 70
- char_u buffer[RULER_BUF_LEN];
- int row;
- int fillchar;
- int attr;
- int empty_line = FALSE;
- colnr_T virtcol;
- int i;
- size_t len;
- int o;
- int this_ru_col;
- int off = 0;
- int width = Columns;
-# define WITH_OFF(x) x
-# define WITH_WIDTH(x) x
-
/* If 'ruler' off or redrawing disabled, don't do anything */
if (!p_ru)
return;
@@ -7777,6 +7762,7 @@ static void win_redr_ruler(win_T *wp, int always)
/*
* Check if not in Insert mode and the line is empty (will show "0-1").
*/
+ int empty_line = FALSE;
if (!(State & INSERT)
&& *ml_get_buf(wp->w_buffer, wp->w_cursor.lnum, FALSE) == NUL)
empty_line = TRUE;
@@ -7796,6 +7782,13 @@ static void win_redr_ruler(win_T *wp, int always)
|| wp->w_topfill != wp->w_ru_topfill
|| empty_line != wp->w_ru_empty) {
cursor_off();
+
+ int width;
+ int row;
+ int fillchar;
+ int attr;
+ int off;
+
if (wp->w_status_height) {
row = wp->w_winrow + wp->w_height;
fillchar = fillchar_status(&attr, wp == curwin);
@@ -7810,13 +7803,16 @@ static void win_redr_ruler(win_T *wp, int always)
}
/* In list mode virtcol needs to be recomputed */
- virtcol = wp->w_virtcol;
+ colnr_T virtcol = wp->w_virtcol;
if (wp->w_p_list && lcs_tab1 == NUL) {
wp->w_p_list = FALSE;
getvvcol(wp, &wp->w_cursor, NULL, &virtcol, NULL);
wp->w_p_list = TRUE;
}
+#define RULER_BUF_LEN 70
+ char_u buffer[RULER_BUF_LEN];
+
/*
* Some sprintfs return the length, some return a pointer.
* To avoid portability problems we use strlen() here.
@@ -7824,7 +7820,7 @@ static void win_redr_ruler(win_T *wp, int always)
vim_snprintf((char *)buffer, RULER_BUF_LEN, "%" PRId64 ",",
(wp->w_buffer->b_ml.ml_flags & ML_EMPTY) ? (int64_t)0L
: (int64_t)wp->w_cursor.lnum);
- len = STRLEN(buffer);
+ size_t len = STRLEN(buffer);
col_print(buffer + len, RULER_BUF_LEN - len,
empty_line ? 0 : (int)wp->w_cursor.col + 1,
(int)virtcol + 1);
@@ -7834,20 +7830,20 @@ static void win_redr_ruler(win_T *wp, int always)
* On the last line, don't print in the last column (scrolls the
* screen up on some terminals).
*/
- i = (int)STRLEN(buffer);
+ int i = (int)STRLEN(buffer);
get_rel_pos(wp, buffer + i + 1, RULER_BUF_LEN - i - 1);
- o = i + vim_strsize(buffer + i + 1);
+ int o = i + vim_strsize(buffer + i + 1);
if (wp->w_status_height == 0) /* can't use last char of screen */
++o;
- this_ru_col = ru_col - (Columns - width);
+ int this_ru_col = ru_col - (Columns - width);
if (this_ru_col < 0)
this_ru_col = 0;
/* Never use more than half the window/screen width, leave the other
* half for the filename. */
- if (this_ru_col < (WITH_WIDTH(width) + 1) / 2)
- this_ru_col = (WITH_WIDTH(width) + 1) / 2;
- if (this_ru_col + o < WITH_WIDTH(width)) {
- while (this_ru_col + o < WITH_WIDTH(width)) {
+ if (this_ru_col < (width + 1) / 2)
+ this_ru_col = (width + 1) / 2;
+ if (this_ru_col + o < width) {
+ while (this_ru_col + o < width) {
if (has_mbyte)
i += (*mb_char2bytes)(fillchar, buffer + i);
else
@@ -7861,19 +7857,19 @@ static void win_redr_ruler(win_T *wp, int always)
o = 0;
for (i = 0; buffer[i] != NUL; i += (*mb_ptr2len)(buffer + i)) {
o += (*mb_ptr2cells)(buffer + i);
- if (this_ru_col + o > WITH_WIDTH(width)) {
+ if (this_ru_col + o > width) {
buffer[i] = NUL;
break;
}
}
- } else if (this_ru_col + (int)STRLEN(buffer) > WITH_WIDTH(width))
- buffer[WITH_WIDTH(width) - this_ru_col] = NUL;
+ } else if (this_ru_col + (int)STRLEN(buffer) > width)
+ buffer[width - this_ru_col] = NUL;
- screen_puts(buffer, row, this_ru_col + WITH_OFF(off), attr);
+ screen_puts(buffer, row, this_ru_col + off, attr);
i = redraw_cmdline;
screen_fill(row, row + 1,
- this_ru_col + WITH_OFF(off) + (int)STRLEN(buffer),
- (int)(WITH_OFF(off) + WITH_WIDTH(width)),
+ this_ru_col + off + (int)STRLEN(buffer),
+ (int)(off + width),
fillchar, fillchar, attr);
/* don't redraw the cmdline because of showing the ruler */
redraw_cmdline = i;
diff --git a/src/nvim/search.c b/src/nvim/search.c
index 5c92ef71a9..b0a782a515 100644
--- a/src/nvim/search.c
+++ b/src/nvim/search.c
@@ -3015,21 +3015,21 @@ current_block (
}
curwin->w_cursor = *end_pos;
- /*
- * Try to exclude the '(', '{', ')', '}', etc. when "include" is FALSE.
- * If the ending '}' is only preceded by indent, skip that indent.
- * But only if the resulting area is not smaller than what we started with.
- */
+ // Try to exclude the '(', '{', ')', '}', etc. when "include" is FALSE.
+ // If the ending '}', ')' or ']' is only preceded by indent, skip that
+ // indent. But only if the resulting area is not smaller than what we
+ // started with.
while (!include) {
incl(&start_pos);
sol = (curwin->w_cursor.col == 0);
decl(&curwin->w_cursor);
- if (what == '{')
- while (inindent(1)) {
- sol = TRUE;
- if (decl(&curwin->w_cursor) != 0)
- break;
+ while (inindent(1)) {
+ sol = TRUE;
+ if (decl(&curwin->w_cursor) != 0) {
+ break;
}
+ }
+
/*
* In Visual mode, when the resulting area is not bigger than what we
* started with, extend it to the next block, and then exclude again.
@@ -3762,16 +3762,8 @@ current_search (
int forward /* move forward or backwards */
)
{
- pos_T start_pos; /* position before the pattern */
- pos_T orig_pos; /* position of the cursor at beginning */
- pos_T pos; /* position after the pattern */
- int i;
- int dir;
- int result; /* result of various function calls */
bool old_p_ws = p_ws;
- int flags = 0;
pos_T save_VIsual = VIsual;
- int one_char;
/* wrapping should not occur */
p_ws = false;
@@ -3780,11 +3772,11 @@ current_search (
if (VIsual_active && *p_sel == 'e' && lt(VIsual, curwin->w_cursor))
dec_cursor();
- if (VIsual_active) {
- orig_pos = curwin->w_cursor;
+ pos_T orig_pos; /* position of the cursor at beginning */
+ pos_T pos; /* position after the pattern */
- pos = curwin->w_cursor;
- start_pos = VIsual;
+ if (VIsual_active) {
+ orig_pos = pos = curwin->w_cursor;
/* make sure, searching further will extend the match */
if (VIsual_active) {
@@ -3794,10 +3786,10 @@ current_search (
decl(&pos);
}
} else
- orig_pos = pos = start_pos = curwin->w_cursor;
+ orig_pos = pos = curwin->w_cursor;
/* Is the pattern is zero-width? */
- one_char = is_one_char(spats[last_idx].pat);
+ int one_char = is_one_char(spats[last_idx].pat);
if (one_char == -1) {
p_ws = old_p_ws;
return FAIL; /* pattern not found */
@@ -3808,17 +3800,14 @@ current_search (
* so that a match at the current cursor position will be correctly
* captured.
*/
- for (i = 0; i < 2; i++) {
- if (forward)
- dir = i;
- else
- dir = !i;
+ for (int i = 0; i < 2; i++) {
+ int dir = forward ? i : !i;
+ int flags = 0;
- flags = 0;
if (!dir && !one_char)
flags = SEARCH_END;
- result = searchit(curwin, curbuf, &pos, (dir ? FORWARD : BACKWARD),
+ int result = searchit(curwin, curbuf, &pos, (dir ? FORWARD : BACKWARD),
spats[last_idx].pat, (long) (i ? count : 1),
SEARCH_KEEP | flags, RE_SEARCH, 0, NULL);
@@ -3845,13 +3834,13 @@ current_search (
p_ws = old_p_ws;
}
- start_pos = pos;
- flags = forward ? SEARCH_END : 0;
+ int flags = forward ? SEARCH_END : 0;
+ pos_T start_pos = pos;
/* move to match, except for zero-width matches, in which case, we are
* already on the next match */
if (!one_char)
- result = searchit(curwin, curbuf, &pos, (forward ? FORWARD : BACKWARD),
+ searchit(curwin, curbuf, &pos, (forward ? FORWARD : BACKWARD),
spats[last_idx].pat, 0L, flags | SEARCH_KEEP, RE_SEARCH, 0, NULL);
if (!VIsual_active)
diff --git a/src/nvim/spell.c b/src/nvim/spell.c
index ceb8b57f39..d277d71d99 100644
--- a/src/nvim/spell.c
+++ b/src/nvim/spell.c
@@ -1261,28 +1261,12 @@ spell_check (
// For a match mip->mi_result is updated.
static void find_word(matchinf_T *mip, int mode)
{
- idx_T arridx = 0;
- int endlen[MAXWLEN]; // length at possible word endings
- idx_T endidx[MAXWLEN]; // possible word endings
- int endidxcnt = 0;
- int len;
int wlen = 0;
int flen;
- int c;
char_u *ptr;
- idx_T lo;
- idx_T hi;
- idx_T m;
- char_u *s;
- char_u *p;
- int res = SP_BAD;
slang_T *slang = mip->mi_lp->lp_slang;
- unsigned flags;
char_u *byts;
idx_T *idxs;
- bool word_ends;
- bool prefix_found;
- int nobreak_result;
if (mode == FIND_KEEPWORD || mode == FIND_KEEPCOMPOUND) {
// Check for word with matching case in keep-case tree.
@@ -1316,6 +1300,13 @@ static void find_word(matchinf_T *mip, int mode)
if (byts == NULL)
return; // array is empty
+ idx_T arridx = 0;
+ int endlen[MAXWLEN]; // length at possible word endings
+ idx_T endidx[MAXWLEN]; // possible word endings
+ int endidxcnt = 0;
+ int len;
+ int c;
+
// Repeat advancing in the tree until:
// - there is a byte that doesn't match,
// - we reach the end of the tree,
@@ -1356,10 +1347,10 @@ static void find_word(matchinf_T *mip, int mode)
c = ptr[wlen];
if (c == TAB) // <Tab> is handled like <Space>
c = ' ';
- lo = arridx;
- hi = arridx + len - 1;
+ idx_T lo = arridx;
+ idx_T hi = arridx + len - 1;
while (lo < hi) {
- m = (lo + hi) / 2;
+ idx_T m = (lo + hi) / 2;
if (byts[m] > c)
hi = m - 1;
else if (byts[m] < c)
@@ -1393,6 +1384,9 @@ static void find_word(matchinf_T *mip, int mode)
}
}
+ char_u *p;
+ bool word_ends;
+
// Verify that one of the possible endings is valid. Try the longest
// first.
while (endidxcnt > 0) {
@@ -1410,7 +1404,7 @@ static void find_word(matchinf_T *mip, int mode)
word_ends = true;
// The prefix flag is before compound flags. Once a valid prefix flag
// has been found we try compound flags.
- prefix_found = false;
+ bool prefix_found = false;
if (mode != FIND_KEEPWORD && has_mbyte) {
// Compute byte length in original word, length may change
@@ -1418,7 +1412,7 @@ static void find_word(matchinf_T *mip, int mode)
// case-folded word is equal to the keep-case word.
p = mip->mi_word;
if (STRNCMP(ptr, p, wlen) != 0) {
- for (s = ptr; s < ptr + wlen; mb_ptr_adv(s))
+ for (char_u *s = ptr; s < ptr + wlen; mb_ptr_adv(s))
mb_ptr_adv(p);
wlen = (int)(p - mip->mi_word);
}
@@ -1428,10 +1422,9 @@ static void find_word(matchinf_T *mip, int mode)
// prefix ID.
// Repeat this if there are more flags/region alternatives until there
// is a match.
- res = SP_BAD;
for (len = byts[arridx - 1]; len > 0 && byts[arridx] == 0;
--len, ++arridx) {
- flags = idxs[arridx];
+ uint32_t flags = idxs[arridx];
// For the fold-case tree check that the case of the checked word
// matches with what the word in the tree requires.
@@ -1527,7 +1520,7 @@ static void find_word(matchinf_T *mip, int mode)
mip->mi_compoff) != 0) {
// case folding may have changed the length
p = mip->mi_word;
- for (s = ptr; s < ptr + mip->mi_compoff; mb_ptr_adv(s))
+ for (char_u *s = ptr; s < ptr + mip->mi_compoff; mb_ptr_adv(s))
mb_ptr_adv(p);
} else
p = mip->mi_word + mip->mi_compoff;
@@ -1577,7 +1570,7 @@ static void find_word(matchinf_T *mip, int mode)
else if (flags & WF_NEEDCOMP)
continue;
- nobreak_result = SP_OK;
+ int nobreak_result = SP_OK;
if (!word_ends) {
int save_result = mip->mi_result;
@@ -1601,7 +1594,7 @@ static void find_word(matchinf_T *mip, int mode)
// the case-folded word is equal to the keep-case word.
p = mip->mi_fword;
if (STRNCMP(ptr, p, wlen) != 0) {
- for (s = ptr; s < ptr + wlen; mb_ptr_adv(s))
+ for (char_u *s = ptr; s < ptr + wlen; mb_ptr_adv(s))
mb_ptr_adv(p);
mip->mi_compoff = (int)(p - mip->mi_fword);
}
@@ -1661,6 +1654,7 @@ static void find_word(matchinf_T *mip, int mode)
}
}
+ int res = SP_BAD;
if (flags & WF_BANNED)
res = SP_BANNED;
else if (flags & WF_REGION) {
@@ -3767,7 +3761,6 @@ char_u *did_set_spelllang(win_T *wp)
&& !ASCII_ISALPHA(p[3])) {
STRLCPY(region_cp, p + 1, 3);
memmove(p, p + 3, len - (p - lang) - 2);
- len -= 3;
region = region_cp;
} else
dont_use_region = true;
@@ -3780,8 +3773,7 @@ char_u *did_set_spelllang(win_T *wp)
filename = false;
if (len > 3 && lang[len - 3] == '_') {
region = lang + len - 2;
- len -= 3;
- lang[len] = NUL;
+ lang[len - 3] = NUL;
} else
dont_use_region = true;
@@ -8009,7 +8001,6 @@ static void init_spellfile(void)
}
// Init the chartab used for spelling for ASCII.
-// EBCDIC is not supported!
static void clear_spell_chartab(spelltab_T *sp)
{
int i;
diff --git a/src/nvim/syntax.c b/src/nvim/syntax.c
index 7dd3453d16..5f6e09925e 100644
--- a/src/nvim/syntax.c
+++ b/src/nvim/syntax.c
@@ -5684,22 +5684,19 @@ static int syn_compare_syntime(const void *v1, const void *v2)
*/
static void syntime_report(void)
{
- synpat_T *spp;
- proftime_T tm;
- int len;
- int total_count = 0;
- garray_T ga;
- time_entry_T *p;
-
if (!syntax_present(curwin)) {
MSG(_(msg_no_items));
return;
}
+ garray_T ga;
ga_init(&ga, sizeof(time_entry_T), 50);
+
proftime_T total_total = profile_zero();
+ int total_count = 0;
+ time_entry_T *p;
for (int idx = 0; idx < curwin->w_s->b_syn_patterns.ga_len; ++idx) {
- spp = &(SYN_ITEMS(curwin->w_s)[idx]);
+ synpat_T *spp = &(SYN_ITEMS(curwin->w_s)[idx]);
if (spp->sp_time.count > 0) {
p = GA_APPEND_VIA_PTR(time_entry_T, &ga);
p->total = spp->sp_time.total;
@@ -5708,7 +5705,7 @@ static void syntime_report(void)
p->match = spp->sp_time.match;
total_count += spp->sp_time.count;
p->slowest = spp->sp_time.slowest;
- tm = profile_divide(spp->sp_time.total, spp->sp_time.count);
+ proftime_T tm = profile_divide(spp->sp_time.total, spp->sp_time.count);
p->average = tm;
p->id = spp->sp_syn.id;
p->pattern = spp->sp_pattern;
@@ -5723,7 +5720,6 @@ static void syntime_report(void)
" TOTAL COUNT MATCH SLOWEST AVERAGE NAME PATTERN"));
MSG_PUTS("\n");
for (int idx = 0; idx < ga.ga_len && !got_int; ++idx) {
- spp = &(SYN_ITEMS(curwin->w_s)[idx]);
p = ((time_entry_T *)ga.ga_data) + idx;
MSG_PUTS(profile_msg(p->total));
@@ -5745,6 +5741,7 @@ static void syntime_report(void)
MSG_PUTS(" ");
msg_advance(69);
+ int len;
if (Columns < 80)
len = 20; /* will wrap anyway */
else
@@ -6690,6 +6687,8 @@ static int hl_has_settings(int idx, int check_link)
{
return HL_TABLE()[idx].sg_term_attr != 0
|| HL_TABLE()[idx].sg_cterm_attr != 0
+ || HL_TABLE()[idx].sg_cterm_fg != 0
+ || HL_TABLE()[idx].sg_cterm_bg != 0
|| (check_link && (HL_TABLE()[idx].sg_set & SG_LINK));
}
diff --git a/src/nvim/tag.c b/src/nvim/tag.c
index 5c675247dc..a123e9b902 100644
--- a/src/nvim/tag.c
+++ b/src/nvim/tag.c
@@ -1516,13 +1516,8 @@ parse_line:
if (orgpat.headlen
) {
tagp.tagname = lbuf;
-#ifdef FEAT_TAG_ANYWHITE
- tagp.tagname_end = skiptowhite(lbuf);
- if (*tagp.tagname_end == NUL)
-#else
tagp.tagname_end = vim_strchr(lbuf, TAB);
if (tagp.tagname_end == NULL)
-#endif
{
if (vim_strchr(lbuf, NL) == NULL) {
/* Truncated line, ignore it. Has been reported for
@@ -1557,17 +1552,9 @@ parse_line:
for (p = lbuf; p < tagp.tagname_end; ++p) {
if (*p == ':') {
if (tagp.fname == NULL)
-#ifdef FEAT_TAG_ANYWHITE
- tagp.fname = skipwhite(tagp.tagname_end);
-#else
tagp.fname = tagp.tagname_end + 1;
-#endif
if ( fnamencmp(lbuf, tagp.fname, p - lbuf) == 0
-#ifdef FEAT_TAG_ANYWHITE
- && vim_iswhite(tagp.fname[p - lbuf])
-#else
&& tagp.fname[p - lbuf] == TAB
-#endif
) {
/* found one */
tagp.tagname = p + 1;
@@ -1675,20 +1662,10 @@ parse_line:
* Can be a matching tag, isolate the file name and command.
*/
if (tagp.fname == NULL)
-#ifdef FEAT_TAG_ANYWHITE
- tagp.fname = skipwhite(tagp.tagname_end);
-#else
tagp.fname = tagp.tagname_end + 1;
-#endif
-#ifdef FEAT_TAG_ANYWHITE
- tagp.fname_end = skiptowhite(tagp.fname);
- tagp.command = skipwhite(tagp.fname_end);
- if (*tagp.command == NUL)
-#else
tagp.fname_end = vim_strchr(tagp.fname, TAB);
tagp.command = tagp.fname_end + 1;
if (tagp.fname_end == NULL)
-#endif
i = FAIL;
else
i = OK;
@@ -2152,39 +2129,23 @@ parse_tag_line (
/* Isolate the tagname, from lbuf up to the first white */
tagp->tagname = lbuf;
-#ifdef FEAT_TAG_ANYWHITE
- p = skiptowhite(lbuf);
-#else
p = vim_strchr(lbuf, TAB);
if (p == NULL)
return FAIL;
-#endif
tagp->tagname_end = p;
/* Isolate file name, from first to second white space */
-#ifdef FEAT_TAG_ANYWHITE
- p = skipwhite(p);
-#else
if (*p != NUL)
++p;
-#endif
tagp->fname = p;
-#ifdef FEAT_TAG_ANYWHITE
- p = skiptowhite(p);
-#else
p = vim_strchr(p, TAB);
if (p == NULL)
return FAIL;
-#endif
tagp->fname_end = p;
/* find start of search command, after second white space */
-#ifdef FEAT_TAG_ANYWHITE
- p = skipwhite(p);
-#else
if (*p != NUL)
++p;
-#endif
if (*p == NUL)
return FAIL;
tagp->command = p;
diff --git a/src/nvim/tempfile.c b/src/nvim/tempfile.c
index c25da77717..33d6f0f37d 100644
--- a/src/nvim/tempfile.c
+++ b/src/nvim/tempfile.c
@@ -28,26 +28,29 @@ static void vim_maketempdir(void)
{
static const char *temp_dirs[] = TEMP_DIR_NAMES;
// Try the entries in `TEMP_DIR_NAMES` to create the temp directory.
- char_u itmp[TEMP_FILE_PATH_MAXLEN];
+ char_u template[TEMP_FILE_PATH_MAXLEN];
+ char_u path[TEMP_FILE_PATH_MAXLEN];
for (size_t i = 0; i < sizeof(temp_dirs) / sizeof(char *); ++i) {
// Expand environment variables, leave room for "/nvimXXXXXX/999999999"
- expand_env((char_u *)temp_dirs[i], itmp, TEMP_FILE_PATH_MAXLEN - 22);
- if (!os_isdir(itmp)) { // directory doesn't exist
+ expand_env((char_u *)temp_dirs[i], template, TEMP_FILE_PATH_MAXLEN - 22);
+ if (!os_isdir(template)) { // directory doesn't exist
continue;
}
- add_pathsep(itmp);
+ add_pathsep(template);
// Concatenate with temporary directory name pattern
- STRCAT(itmp, "nvimXXXXXX");
- if (!os_mkdtemp((char *)itmp)) {
+ STRCAT(template, "nvimXXXXXX");
+
+ if (os_mkdtemp((const char *)template, (char *)path) != 0) {
continue;
}
- if (vim_settempdir(itmp)) {
+
+ if (vim_settempdir(path)) {
// Successfully created and set temporary directory so stop trying.
break;
} else {
- // Couldn't set `vim_tempdir` to itmp so remove created directory.
- os_rmdir((char *)itmp);
+ // Couldn't set `vim_tempdir` to `path` so remove created directory.
+ os_rmdir((char *)path);
}
}
}
@@ -128,8 +131,8 @@ char_u *vim_tempname(void)
// There is no need to check if the file exists, because we own the directory
// and nobody else creates a file in it.
- char_u itmp[TEMP_FILE_PATH_MAXLEN];
- snprintf((char *)itmp, TEMP_FILE_PATH_MAXLEN,
+ char_u template[TEMP_FILE_PATH_MAXLEN];
+ snprintf((char *)template, TEMP_FILE_PATH_MAXLEN,
"%s%" PRIu32, tempdir, temp_count++);
- return vim_strsave(itmp);
+ return vim_strsave(template);
}
diff --git a/src/nvim/term.c b/src/nvim/term.c
index 98db1fb9fa..36e433d624 100644
--- a/src/nvim/term.c
+++ b/src/nvim/term.c
@@ -265,13 +265,6 @@ static struct builtin_term builtin_termcaps[] =
# else
{(int)KS_CDL, "\033[%dM"},
# endif
-#ifdef BEOS_PR_OR_BETTER
-# ifdef TERMINFO
- {(int)KS_CS, "\033[%i%p1%d;%p2%dr"},
-# else
- {(int)KS_CS, "\033[%i%d;%dr"}, /* scroll region */
-# endif
-#endif
{(int)KS_CL, "\033[H\033[2J"},
#ifdef notyet
{(int)KS_VI, "[VI]"}, /* cursor invisible, VT320: CSI ? 25 l */
@@ -309,9 +302,6 @@ static struct builtin_term builtin_termcaps[] =
# else
{(int)KS_CRI, "\033[%dC"},
# endif
-#if defined(BEOS_DR8)
- {(int)KS_DB, ""}, /* hack! see screen.c */
-#endif
{K_UP, "\033[A"},
{K_DOWN, "\033[B"},
@@ -324,34 +314,34 @@ static struct builtin_term builtin_termcaps[] =
* standard ANSI terminal, default for unix
*/
{(int)KS_NAME, "ansi"},
- {(int)KS_CE, IF_EB("\033[K", ESC_STR "[K")},
- {(int)KS_AL, IF_EB("\033[L", ESC_STR "[L")},
+ {(int)KS_CE, "\033[K"},
+ {(int)KS_AL, "\033[L"},
# ifdef TERMINFO
- {(int)KS_CAL, IF_EB("\033[%p1%dL", ESC_STR "[%p1%dL")},
+ {(int)KS_CAL, "\033[%p1%dL"},
# else
- {(int)KS_CAL, IF_EB("\033[%dL", ESC_STR "[%dL")},
+ {(int)KS_CAL, "\033[%dL"},
# endif
- {(int)KS_DL, IF_EB("\033[M", ESC_STR "[M")},
+ {(int)KS_DL, "\033[M"},
# ifdef TERMINFO
- {(int)KS_CDL, IF_EB("\033[%p1%dM", ESC_STR "[%p1%dM")},
+ {(int)KS_CDL, "\033[%p1%dM"},
# else
- {(int)KS_CDL, IF_EB("\033[%dM", ESC_STR "[%dM")},
+ {(int)KS_CDL, "\033[%dM"},
# endif
- {(int)KS_CL, IF_EB("\033[H\033[2J", ESC_STR "[H" ESC_STR_nc "[2J")},
- {(int)KS_ME, IF_EB("\033[0m", ESC_STR "[0m")},
- {(int)KS_MR, IF_EB("\033[7m", ESC_STR "[7m")},
+ {(int)KS_CL, "\033[H\033[2J"},
+ {(int)KS_ME, "\033[0m"},
+ {(int)KS_MR, "\033[7m"},
{(int)KS_MS, "y"},
{(int)KS_UT, "y"}, /* guessed */
{(int)KS_LE, "\b"},
# ifdef TERMINFO
- {(int)KS_CM, IF_EB("\033[%i%p1%d;%p2%dH", ESC_STR "[%i%p1%d;%p2%dH")},
+ {(int)KS_CM, "\033[%i%p1%d;%p2%dH"},
# else
- {(int)KS_CM, IF_EB("\033[%i%d;%dH", ESC_STR "[%i%d;%dH")},
+ {(int)KS_CM, "\033[%i%d;%dH"},
# endif
# ifdef TERMINFO
- {(int)KS_CRI, IF_EB("\033[%p1%dC", ESC_STR "[%p1%dC")},
+ {(int)KS_CRI, "\033[%p1%dC"},
# else
- {(int)KS_CRI, IF_EB("\033[%dC", ESC_STR "[%dC")},
+ {(int)KS_CRI, "\033[%dC"},
# endif
# endif
@@ -566,83 +556,82 @@ static struct builtin_term builtin_termcaps[] =
* - keyboard languages (CSI ? 26 n)
*/
{(int)KS_NAME, "vt320"},
- {(int)KS_CE, IF_EB("\033[K", ESC_STR "[K")},
- {(int)KS_AL, IF_EB("\033[L", ESC_STR "[L")},
+ {(int)KS_CE, "\033[K"},
+ {(int)KS_AL, "\033[L"},
# ifdef TERMINFO
- {(int)KS_CAL, IF_EB("\033[%p1%dL", ESC_STR "[%p1%dL")},
+ {(int)KS_CAL, "\033[%p1%dL"},
# else
- {(int)KS_CAL, IF_EB("\033[%dL", ESC_STR "[%dL")},
+ {(int)KS_CAL, "\033[%dL"},
# endif
- {(int)KS_DL, IF_EB("\033[M", ESC_STR "[M")},
+ {(int)KS_DL, "\033[M"},
# ifdef TERMINFO
- {(int)KS_CDL, IF_EB("\033[%p1%dM", ESC_STR "[%p1%dM")},
+ {(int)KS_CDL, "\033[%p1%dM"},
# else
- {(int)KS_CDL, IF_EB("\033[%dM", ESC_STR "[%dM")},
+ {(int)KS_CDL, "\033[%dM"},
# endif
- {(int)KS_CL, IF_EB("\033[H\033[2J", ESC_STR "[H" ESC_STR_nc "[2J")},
- {(int)KS_CD, IF_EB("\033[J", ESC_STR "[J")},
+ {(int)KS_CL, "\033[H\033[2J"},
+ {(int)KS_CD, "\033[J"},
{(int)KS_CCO, "8"}, /* allow 8 colors */
- {(int)KS_ME, IF_EB("\033[0m", ESC_STR "[0m")},
- {(int)KS_MR, IF_EB("\033[7m", ESC_STR "[7m")},
- {(int)KS_MD, IF_EB("\033[1m", ESC_STR "[1m")}, /* bold mode */
- {(int)KS_SE, IF_EB("\033[22m", ESC_STR "[22m")}, /* normal mode */
- {(int)KS_UE, IF_EB("\033[24m", ESC_STR "[24m")}, /* exit underscore mode */
- {(int)KS_US, IF_EB("\033[4m", ESC_STR "[4m")}, /* underscore mode */
- {(int)KS_CZH, IF_EB("\033[34;43m", ESC_STR "[34;43m")}, /* italic mode: blue text on yellow */
- {(int)KS_CZR, IF_EB("\033[0m", ESC_STR "[0m")}, /* italic mode end */
- {(int)KS_CAB, IF_EB("\033[4%dm", ESC_STR "[4%dm")}, /* set background color (ANSI) */
- {(int)KS_CAF, IF_EB("\033[3%dm", ESC_STR "[3%dm")}, /* set foreground color (ANSI) */
- {(int)KS_CSB, IF_EB("\033[102;%dm", ESC_STR "[102;%dm")}, /* set screen background color */
- {(int)KS_CSF, IF_EB("\033[101;%dm", ESC_STR "[101;%dm")}, /* set screen foreground color */
+ {(int)KS_ME, "\033[0m"},
+ {(int)KS_MR, "\033[7m"},
+ {(int)KS_MD, "\033[1m"}, /* bold mode */
+ {(int)KS_SE, "\033[22m"}, /* normal mode */
+ {(int)KS_UE, "\033[24m"}, /* exit underscore mode */
+ {(int)KS_US, "\033[4m"}, /* underscore mode */
+ {(int)KS_CZH, "\033[34;43m"}, /* italic mode: blue text on yellow */
+ {(int)KS_CZR, "\033[0m"}, /* italic mode end */
+ {(int)KS_CAB, "\033[4%dm"}, /* set background color (ANSI) */
+ {(int)KS_CAF, "\033[3%dm"}, /* set foreground color (ANSI) */
+ {(int)KS_CSB, "\033[102;%dm"}, /* set screen background color */
+ {(int)KS_CSF, "\033[101;%dm"}, /* set screen foreground color */
{(int)KS_MS, "y"},
{(int)KS_UT, "y"},
{(int)KS_LE, "\b"},
# ifdef TERMINFO
- {(int)KS_CM, IF_EB("\033[%i%p1%d;%p2%dH",
- ESC_STR "[%i%p1%d;%p2%dH")},
+ {(int)KS_CM, "\033[%i%p1%d;%p2%dH"},
# else
- {(int)KS_CM, IF_EB("\033[%i%d;%dH", ESC_STR "[%i%d;%dH")},
+ {(int)KS_CM, "\033[%i%d;%dH"},
# endif
# ifdef TERMINFO
- {(int)KS_CRI, IF_EB("\033[%p1%dC", ESC_STR "[%p1%dC")},
+ {(int)KS_CRI, "\033[%p1%dC"},
# else
- {(int)KS_CRI, IF_EB("\033[%dC", ESC_STR "[%dC")},
+ {(int)KS_CRI, "\033[%dC"},
# endif
- {K_UP, IF_EB("\033[A", ESC_STR "[A")},
- {K_DOWN, IF_EB("\033[B", ESC_STR "[B")},
- {K_RIGHT, IF_EB("\033[C", ESC_STR "[C")},
- {K_LEFT, IF_EB("\033[D", ESC_STR "[D")},
- {K_F1, IF_EB("\033[11~", ESC_STR "[11~")},
- {K_F2, IF_EB("\033[12~", ESC_STR "[12~")},
- {K_F3, IF_EB("\033[13~", ESC_STR "[13~")},
- {K_F4, IF_EB("\033[14~", ESC_STR "[14~")},
- {K_F5, IF_EB("\033[15~", ESC_STR "[15~")},
- {K_F6, IF_EB("\033[17~", ESC_STR "[17~")},
- {K_F7, IF_EB("\033[18~", ESC_STR "[18~")},
- {K_F8, IF_EB("\033[19~", ESC_STR "[19~")},
- {K_F9, IF_EB("\033[20~", ESC_STR "[20~")},
- {K_F10, IF_EB("\033[21~", ESC_STR "[21~")},
- {K_F11, IF_EB("\033[23~", ESC_STR "[23~")},
- {K_F12, IF_EB("\033[24~", ESC_STR "[24~")},
- {K_F13, IF_EB("\033[25~", ESC_STR "[25~")},
- {K_F14, IF_EB("\033[26~", ESC_STR "[26~")},
- {K_F15, IF_EB("\033[28~", ESC_STR "[28~")}, /* Help */
- {K_F16, IF_EB("\033[29~", ESC_STR "[29~")}, /* Select */
- {K_F17, IF_EB("\033[31~", ESC_STR "[31~")},
- {K_F18, IF_EB("\033[32~", ESC_STR "[32~")},
- {K_F19, IF_EB("\033[33~", ESC_STR "[33~")},
- {K_F20, IF_EB("\033[34~", ESC_STR "[34~")},
- {K_INS, IF_EB("\033[2~", ESC_STR "[2~")},
- {K_DEL, IF_EB("\033[3~", ESC_STR "[3~")},
- {K_HOME, IF_EB("\033[1~", ESC_STR "[1~")},
- {K_END, IF_EB("\033[4~", ESC_STR "[4~")},
- {K_PAGEUP, IF_EB("\033[5~", ESC_STR "[5~")},
- {K_PAGEDOWN, IF_EB("\033[6~", ESC_STR "[6~")},
- {K_KPLUS, IF_EB("\033Ok", ESC_STR "Ok")}, /* keypad plus */
- {K_KMINUS, IF_EB("\033Om", ESC_STR "Om")}, /* keypad minus */
- {K_KDIVIDE, IF_EB("\033Oo", ESC_STR "Oo")}, /* keypad / */
- {K_KMULTIPLY, IF_EB("\033Oj", ESC_STR "Oj")}, /* keypad * */
- {K_KENTER, IF_EB("\033OM", ESC_STR "OM")}, /* keypad Enter */
+ {K_UP, "\033[A"},
+ {K_DOWN, "\033[B"},
+ {K_RIGHT, "\033[C"},
+ {K_LEFT, "\033[D"},
+ {K_F1, "\033[11~"},
+ {K_F2, "\033[12~"},
+ {K_F3, "\033[13~"},
+ {K_F4, "\033[14~"},
+ {K_F5, "\033[15~"},
+ {K_F6, "\033[17~"},
+ {K_F7, "\033[18~"},
+ {K_F8, "\033[19~"},
+ {K_F9, "\033[20~"},
+ {K_F10, "\033[21~"},
+ {K_F11, "\033[23~"},
+ {K_F12, "\033[24~"},
+ {K_F13, "\033[25~"},
+ {K_F14, "\033[26~"},
+ {K_F15, "\033[28~"}, /* Help */
+ {K_F16, "\033[29~"}, /* Select */
+ {K_F17, "\033[31~"},
+ {K_F18, "\033[32~"},
+ {K_F19, "\033[33~"},
+ {K_F20, "\033[34~"},
+ {K_INS, "\033[2~"},
+ {K_DEL, "\033[3~"},
+ {K_HOME, "\033[1~"},
+ {K_END, "\033[4~"},
+ {K_PAGEUP, "\033[5~"},
+ {K_PAGEDOWN, "\033[6~"},
+ {K_KPLUS, "\033Ok"}, /* keypad plus */
+ {K_KMINUS, "\033Om"}, /* keypad minus */
+ {K_KDIVIDE, "\033Oo"}, /* keypad / */
+ {K_KMULTIPLY, "\033Oj"}, /* keypad * */
+ {K_KENTER, "\033OM"}, /* keypad Enter */
{K_BS, "\x7f"}, /* for some reason 0177 doesn't work */
# endif
@@ -651,169 +640,21 @@ static struct builtin_term builtin_termcaps[] =
* Ordinary vt52
*/
{(int)KS_NAME, "vt52"},
- {(int)KS_CE, IF_EB("\033K", ESC_STR "K")},
- {(int)KS_CD, IF_EB("\033J", ESC_STR "J")},
- {(int)KS_CM, IF_EB("\033Y%+ %+ ", ESC_STR "Y%+ %+ ")},
+ {(int)KS_CE, "\033K"},
+ {(int)KS_CD, "\033J"},
+ {(int)KS_CM, "\033Y%+ %+ "},
{(int)KS_LE, "\b"},
- {(int)KS_AL, IF_EB("\033T", ESC_STR "T")},
- {(int)KS_DL, IF_EB("\033U", ESC_STR "U")},
- {(int)KS_CL, IF_EB("\033H\033J", ESC_STR "H" ESC_STR_nc "J")},
- {(int)KS_ME, IF_EB("\033SO", ESC_STR "SO")},
- {(int)KS_MR, IF_EB("\033S2", ESC_STR "S2")},
+ {(int)KS_AL, "\033T"},
+ {(int)KS_DL, "\033U"},
+ {(int)KS_CL, "\033H\033J"},
+ {(int)KS_ME, "\033SO"},
+ {(int)KS_MR, "\033S2"},
{(int)KS_MS, "y"},
# endif
# if defined(UNIX) || defined(ALL_BUILTIN_TCAPS) || defined(SOME_BUILTIN_TCAPS)
{(int)KS_NAME, "xterm"},
- {(int)KS_CE, IF_EB("\033[K", ESC_STR "[K")},
- {(int)KS_AL, IF_EB("\033[L", ESC_STR "[L")},
-# ifdef TERMINFO
- {(int)KS_CAL, IF_EB("\033[%p1%dL", ESC_STR "[%p1%dL")},
-# else
- {(int)KS_CAL, IF_EB("\033[%dL", ESC_STR "[%dL")},
-# endif
- {(int)KS_DL, IF_EB("\033[M", ESC_STR "[M")},
-# ifdef TERMINFO
- {(int)KS_CDL, IF_EB("\033[%p1%dM", ESC_STR "[%p1%dM")},
-# else
- {(int)KS_CDL, IF_EB("\033[%dM", ESC_STR "[%dM")},
-# endif
-# ifdef TERMINFO
- {(int)KS_CS, IF_EB("\033[%i%p1%d;%p2%dr",
- ESC_STR "[%i%p1%d;%p2%dr")},
-# else
- {(int)KS_CS, IF_EB("\033[%i%d;%dr", ESC_STR "[%i%d;%dr")},
-# endif
- {(int)KS_CL, IF_EB("\033[H\033[2J", ESC_STR "[H" ESC_STR_nc "[2J")},
- {(int)KS_CD, IF_EB("\033[J", ESC_STR "[J")},
- {(int)KS_ME, IF_EB("\033[m", ESC_STR "[m")},
- {(int)KS_MR, IF_EB("\033[7m", ESC_STR "[7m")},
- {(int)KS_MD, IF_EB("\033[1m", ESC_STR "[1m")},
- {(int)KS_UE, IF_EB("\033[m", ESC_STR "[m")},
- {(int)KS_US, IF_EB("\033[4m", ESC_STR "[4m")},
- {(int)KS_MS, "y"},
- {(int)KS_UT, "y"},
- {(int)KS_LE, "\b"},
-# ifdef TERMINFO
- {(int)KS_CM, IF_EB("\033[%i%p1%d;%p2%dH",
- ESC_STR "[%i%p1%d;%p2%dH")},
-# else
- {(int)KS_CM, IF_EB("\033[%i%d;%dH", ESC_STR "[%i%d;%dH")},
-# endif
- {(int)KS_SR, IF_EB("\033M", ESC_STR "M")},
-# ifdef TERMINFO
- {(int)KS_CRI, IF_EB("\033[%p1%dC", ESC_STR "[%p1%dC")},
-# else
- {(int)KS_CRI, IF_EB("\033[%dC", ESC_STR "[%dC")},
-# endif
- {(int)KS_KS, IF_EB("\033[?1h\033=", ESC_STR "[?1h" ESC_STR_nc "=")},
- {(int)KS_KE, IF_EB("\033[?1l\033>", ESC_STR "[?1l" ESC_STR_nc ">")},
- {(int)KS_CIS, IF_EB("\033]1;", ESC_STR "]1;")},
- {(int)KS_CIE, "\007"},
- {(int)KS_TS, IF_EB("\033]2;", ESC_STR "]2;")},
- {(int)KS_FS, "\007"},
-# ifdef TERMINFO
- {(int)KS_CWS, IF_EB("\033[8;%p1%d;%p2%dt",
- ESC_STR "[8;%p1%d;%p2%dt")},
- {(int)KS_CWP, IF_EB("\033[3;%p1%d;%p2%dt",
- ESC_STR "[3;%p1%d;%p2%dt")},
-# else
- {(int)KS_CWS, IF_EB("\033[8;%d;%dt", ESC_STR "[8;%d;%dt")},
- {(int)KS_CWP, IF_EB("\033[3;%d;%dt", ESC_STR "[3;%d;%dt")},
-# endif
- {(int)KS_CRV, IF_EB("\033[>c", ESC_STR "[>c")},
- {(int)KS_U7, IF_EB("\033[6n", ESC_STR "[6n")},
-
- {K_UP, IF_EB("\033O*A", ESC_STR "O*A")},
- {K_DOWN, IF_EB("\033O*B", ESC_STR "O*B")},
- {K_RIGHT, IF_EB("\033O*C", ESC_STR "O*C")},
- {K_LEFT, IF_EB("\033O*D", ESC_STR "O*D")},
- /* An extra set of cursor keys for vt100 mode */
- {K_XUP, IF_EB("\033[1;*A", ESC_STR "[1;*A")},
- {K_XDOWN, IF_EB("\033[1;*B", ESC_STR "[1;*B")},
- {K_XRIGHT, IF_EB("\033[1;*C", ESC_STR "[1;*C")},
- {K_XLEFT, IF_EB("\033[1;*D", ESC_STR "[1;*D")},
- /* An extra set of function keys for vt100 mode */
- {K_XF1, IF_EB("\033O*P", ESC_STR "O*P")},
- {K_XF2, IF_EB("\033O*Q", ESC_STR "O*Q")},
- {K_XF3, IF_EB("\033O*R", ESC_STR "O*R")},
- {K_XF4, IF_EB("\033O*S", ESC_STR "O*S")},
- {K_F1, IF_EB("\033[11;*~", ESC_STR "[11;*~")},
- {K_F2, IF_EB("\033[12;*~", ESC_STR "[12;*~")},
- {K_F3, IF_EB("\033[13;*~", ESC_STR "[13;*~")},
- {K_F4, IF_EB("\033[14;*~", ESC_STR "[14;*~")},
- {K_F5, IF_EB("\033[15;*~", ESC_STR "[15;*~")},
- {K_F6, IF_EB("\033[17;*~", ESC_STR "[17;*~")},
- {K_F7, IF_EB("\033[18;*~", ESC_STR "[18;*~")},
- {K_F8, IF_EB("\033[19;*~", ESC_STR "[19;*~")},
- {K_F9, IF_EB("\033[20;*~", ESC_STR "[20;*~")},
- {K_F10, IF_EB("\033[21;*~", ESC_STR "[21;*~")},
- {K_F11, IF_EB("\033[23;*~", ESC_STR "[23;*~")},
- {K_F12, IF_EB("\033[24;*~", ESC_STR "[24;*~")},
- {K_S_TAB, IF_EB("\033[Z", ESC_STR "[Z")},
- {K_HELP, IF_EB("\033[28;*~", ESC_STR "[28;*~")},
- {K_UNDO, IF_EB("\033[26;*~", ESC_STR "[26;*~")},
- {K_INS, IF_EB("\033[2;*~", ESC_STR "[2;*~")},
- {K_HOME, IF_EB("\033[1;*H", ESC_STR "[1;*H")},
- /* {K_S_HOME, IF_EB("\033O2H", ESC_STR "O2H")}, */
- /* {K_C_HOME, IF_EB("\033O5H", ESC_STR "O5H")}, */
- {K_KHOME, IF_EB("\033[1;*~", ESC_STR "[1;*~")},
- {K_XHOME, IF_EB("\033O*H", ESC_STR "O*H")}, /* other Home */
- {K_ZHOME, IF_EB("\033[7;*~", ESC_STR "[7;*~")}, /* other Home */
- {K_END, IF_EB("\033[1;*F", ESC_STR "[1;*F")},
- /* {K_S_END, IF_EB("\033O2F", ESC_STR "O2F")}, */
- /* {K_C_END, IF_EB("\033O5F", ESC_STR "O5F")}, */
- {K_KEND, IF_EB("\033[4;*~", ESC_STR "[4;*~")},
- {K_XEND, IF_EB("\033O*F", ESC_STR "O*F")}, /* other End */
- {K_ZEND, IF_EB("\033[8;*~", ESC_STR "[8;*~")},
- {K_PAGEUP, IF_EB("\033[5;*~", ESC_STR "[5;*~")},
- {K_PAGEDOWN, IF_EB("\033[6;*~", ESC_STR "[6;*~")},
- {K_KPLUS, IF_EB("\033O*k", ESC_STR "O*k")}, /* keypad plus */
- {K_KMINUS, IF_EB("\033O*m", ESC_STR "O*m")}, /* keypad minus */
- {K_KDIVIDE, IF_EB("\033O*o", ESC_STR "O*o")}, /* keypad / */
- {K_KMULTIPLY, IF_EB("\033O*j", ESC_STR "O*j")}, /* keypad * */
- {K_KENTER, IF_EB("\033O*M", ESC_STR "O*M")}, /* keypad Enter */
- {K_KPOINT, IF_EB("\033O*n", ESC_STR "O*n")}, /* keypad . */
- {K_KDEL, IF_EB("\033[3;*~", ESC_STR "[3;*~")}, /* keypad Del */
-
- {BT_EXTRA_KEYS, ""},
- {TERMCAP2KEY('k', '0'), IF_EB("\033[10;*~", ESC_STR "[10;*~")}, /* F0 */
- {TERMCAP2KEY('F', '3'), IF_EB("\033[25;*~", ESC_STR "[25;*~")}, /* F13 */
- /* F14 and F15 are missing, because they send the same codes as the undo
- * and help key, although they don't work on all keyboards. */
- {TERMCAP2KEY('F', '6'), IF_EB("\033[29;*~", ESC_STR "[29;*~")}, /* F16 */
- {TERMCAP2KEY('F', '7'), IF_EB("\033[31;*~", ESC_STR "[31;*~")}, /* F17 */
- {TERMCAP2KEY('F', '8'), IF_EB("\033[32;*~", ESC_STR "[32;*~")}, /* F18 */
- {TERMCAP2KEY('F', '9'), IF_EB("\033[33;*~", ESC_STR "[33;*~")}, /* F19 */
- {TERMCAP2KEY('F', 'A'), IF_EB("\033[34;*~", ESC_STR "[34;*~")}, /* F20 */
-
- {TERMCAP2KEY('F', 'B'), IF_EB("\033[42;*~", ESC_STR "[42;*~")}, /* F21 */
- {TERMCAP2KEY('F', 'C'), IF_EB("\033[43;*~", ESC_STR "[43;*~")}, /* F22 */
- {TERMCAP2KEY('F', 'D'), IF_EB("\033[44;*~", ESC_STR "[44;*~")}, /* F23 */
- {TERMCAP2KEY('F', 'E'), IF_EB("\033[45;*~", ESC_STR "[45;*~")}, /* F24 */
- {TERMCAP2KEY('F', 'F'), IF_EB("\033[46;*~", ESC_STR "[46;*~")}, /* F25 */
- {TERMCAP2KEY('F', 'G'), IF_EB("\033[47;*~", ESC_STR "[47;*~")}, /* F26 */
- {TERMCAP2KEY('F', 'H'), IF_EB("\033[48;*~", ESC_STR "[48;*~")}, /* F27 */
- {TERMCAP2KEY('F', 'I'), IF_EB("\033[49;*~", ESC_STR "[49;*~")}, /* F28 */
- {TERMCAP2KEY('F', 'J'), IF_EB("\033[50;*~", ESC_STR "[50;*~")}, /* F29 */
- {TERMCAP2KEY('F', 'K'), IF_EB("\033[51;*~", ESC_STR "[51;*~")}, /* F30 */
-
- {TERMCAP2KEY('F', 'L'), IF_EB("\033[52;*~", ESC_STR "[52;*~")}, /* F31 */
- {TERMCAP2KEY('F', 'M'), IF_EB("\033[53;*~", ESC_STR "[53;*~")}, /* F32 */
- {TERMCAP2KEY('F', 'N'), IF_EB("\033[54;*~", ESC_STR "[54;*~")}, /* F33 */
- {TERMCAP2KEY('F', 'O'), IF_EB("\033[55;*~", ESC_STR "[55;*~")}, /* F34 */
- {TERMCAP2KEY('F', 'P'), IF_EB("\033[56;*~", ESC_STR "[56;*~")}, /* F35 */
- {TERMCAP2KEY('F', 'Q'), IF_EB("\033[57;*~", ESC_STR "[57;*~")}, /* F36 */
- {TERMCAP2KEY('F', 'R'), IF_EB("\033[58;*~", ESC_STR "[58;*~")}, /* F37 */
-# endif
-
-# if defined(UNIX) || defined(ALL_BUILTIN_TCAPS)
- /*
- * iris-ansi for Silicon Graphics machines.
- */
- {(int)KS_NAME, "iris-ansi"},
{(int)KS_CE, "\033[K"},
- {(int)KS_CD, "\033[J"},
{(int)KS_AL, "\033[L"},
# ifdef TERMINFO
{(int)KS_CAL, "\033[%p1%dL"},
@@ -826,34 +667,20 @@ static struct builtin_term builtin_termcaps[] =
# else
{(int)KS_CDL, "\033[%dM"},
# endif
+# ifdef TERMINFO
+ {(int)KS_CS, "\033[%i%p1%d;%p2%dr"},
+# else
+ {(int)KS_CS, "\033[%i%d;%dr"},
+# endif
{(int)KS_CL, "\033[H\033[2J"},
- {(int)KS_VE, "\033[9/y\033[12/y"}, /* These aren't documented */
- {(int)KS_VS, "\033[10/y\033[=1h\033[=2l"}, /* These aren't documented */
- {(int)KS_TI, "\033[=6h"},
- {(int)KS_TE, "\033[=6l"},
- {(int)KS_SE, "\033[21;27m"},
- {(int)KS_SO, "\033[1;7m"},
+ {(int)KS_CD, "\033[J"},
{(int)KS_ME, "\033[m"},
{(int)KS_MR, "\033[7m"},
{(int)KS_MD, "\033[1m"},
- {(int)KS_CCO, "8"}, /* allow 8 colors */
- {(int)KS_CZH, "\033[3m"}, /* italic mode on */
- {(int)KS_CZR, "\033[23m"}, /* italic mode off */
- {(int)KS_US, "\033[4m"}, /* underline on */
- {(int)KS_UE, "\033[24m"}, /* underline off */
-# ifdef TERMINFO
- {(int)KS_CAB, "\033[4%p1%dm"}, /* set background color (ANSI) */
- {(int)KS_CAF, "\033[3%p1%dm"}, /* set foreground color (ANSI) */
- {(int)KS_CSB, "\033[102;%p1%dm"}, /* set screen background color */
- {(int)KS_CSF, "\033[101;%p1%dm"}, /* set screen foreground color */
-# else
- {(int)KS_CAB, "\033[4%dm"}, /* set background color (ANSI) */
- {(int)KS_CAF, "\033[3%dm"}, /* set foreground color (ANSI) */
- {(int)KS_CSB, "\033[102;%dm"}, /* set screen background color */
- {(int)KS_CSF, "\033[101;%dm"}, /* set screen foreground color */
-# endif
- {(int)KS_MS, "y"}, /* guessed */
- {(int)KS_UT, "y"}, /* guessed */
+ {(int)KS_UE, "\033[m"},
+ {(int)KS_US, "\033[4m"},
+ {(int)KS_MS, "y"},
+ {(int)KS_UT, "y"},
{(int)KS_LE, "\b"},
# ifdef TERMINFO
{(int)KS_CM, "\033[%i%p1%d;%p2%dH"},
@@ -866,54 +693,103 @@ static struct builtin_term builtin_termcaps[] =
# else
{(int)KS_CRI, "\033[%dC"},
# endif
- {(int)KS_CIS, "\033P3.y"},
- {(int)KS_CIE, "\234"}, /* ST "String Terminator" */
- {(int)KS_TS, "\033P1.y"},
- {(int)KS_FS, "\234"}, /* ST "String Terminator" */
+ {(int)KS_KS, "\033[?1h\033="},
+ {(int)KS_KE, "\033[?1l\033>"},
+ {(int)KS_CIS, "\033]1;"},
+ {(int)KS_CIE, "\007"},
+ {(int)KS_TS, "\033]2;"},
+ {(int)KS_FS, "\007"},
# ifdef TERMINFO
- {(int)KS_CWS, "\033[203;%p1%d;%p2%d/y"},
- {(int)KS_CWP, "\033[205;%p1%d;%p2%d/y"},
+ {(int)KS_CWS, "\033[8;%p1%d;%p2%dt"},
+ {(int)KS_CWP, "\033[3;%p1%d;%p2%dt"},
# else
- {(int)KS_CWS, "\033[203;%d;%d/y"},
- {(int)KS_CWP, "\033[205;%d;%d/y"},
+ {(int)KS_CWS, "\033[8;%d;%dt"},
+ {(int)KS_CWP, "\033[3;%d;%dt"},
# endif
- {K_UP, "\033[A"},
- {K_DOWN, "\033[B"},
- {K_LEFT, "\033[D"},
- {K_RIGHT, "\033[C"},
- {K_S_UP, "\033[161q"},
- {K_S_DOWN, "\033[164q"},
- {K_S_LEFT, "\033[158q"},
- {K_S_RIGHT, "\033[167q"},
- {K_F1, "\033[001q"},
- {K_F2, "\033[002q"},
- {K_F3, "\033[003q"},
- {K_F4, "\033[004q"},
- {K_F5, "\033[005q"},
- {K_F6, "\033[006q"},
- {K_F7, "\033[007q"},
- {K_F8, "\033[008q"},
- {K_F9, "\033[009q"},
- {K_F10, "\033[010q"},
- {K_F11, "\033[011q"},
- {K_F12, "\033[012q"},
- {K_S_F1, "\033[013q"},
- {K_S_F2, "\033[014q"},
- {K_S_F3, "\033[015q"},
- {K_S_F4, "\033[016q"},
- {K_S_F5, "\033[017q"},
- {K_S_F6, "\033[018q"},
- {K_S_F7, "\033[019q"},
- {K_S_F8, "\033[020q"},
- {K_S_F9, "\033[021q"},
- {K_S_F10, "\033[022q"},
- {K_S_F11, "\033[023q"},
- {K_S_F12, "\033[024q"},
- {K_INS, "\033[139q"},
- {K_HOME, "\033[H"},
- {K_END, "\033[146q"},
- {K_PAGEUP, "\033[150q"},
- {K_PAGEDOWN, "\033[154q"},
+ {(int)KS_CRV, "\033[>c"},
+ {(int)KS_U7, "\033[6n"},
+
+ {K_UP, "\033O*A"},
+ {K_DOWN, "\033O*B"},
+ {K_RIGHT, "\033O*C"},
+ {K_LEFT, "\033O*D"},
+ /* An extra set of cursor keys for vt100 mode */
+ {K_XUP, "\033[1;*A"},
+ {K_XDOWN, "\033[1;*B"},
+ {K_XRIGHT, "\033[1;*C"},
+ {K_XLEFT, "\033[1;*D"},
+ /* An extra set of function keys for vt100 mode */
+ {K_XF1, "\033O*P"},
+ {K_XF2, "\033O*Q"},
+ {K_XF3, "\033O*R"},
+ {K_XF4, "\033O*S"},
+ {K_F1, "\033[11;*~"},
+ {K_F2, "\033[12;*~"},
+ {K_F3, "\033[13;*~"},
+ {K_F4, "\033[14;*~"},
+ {K_F5, "\033[15;*~"},
+ {K_F6, "\033[17;*~"},
+ {K_F7, "\033[18;*~"},
+ {K_F8, "\033[19;*~"},
+ {K_F9, "\033[20;*~"},
+ {K_F10, "\033[21;*~"},
+ {K_F11, "\033[23;*~"},
+ {K_F12, "\033[24;*~"},
+ {K_S_TAB, "\033[Z"},
+ {K_HELP, "\033[28;*~"},
+ {K_UNDO, "\033[26;*~"},
+ {K_INS, "\033[2;*~"},
+ {K_HOME, "\033[1;*H"},
+ /* {K_S_HOME, "\033O2H"}, */
+ /* {K_C_HOME, "\033O5H"}, */
+ {K_KHOME, "\033[1;*~"},
+ {K_XHOME, "\033O*H"}, /* other Home */
+ {K_ZHOME, "\033[7;*~"}, /* other Home */
+ {K_END, "\033[1;*F"},
+ /* {K_S_END, "\033O2F"}, */
+ /* {K_C_END, "\033O5F"}, */
+ {K_KEND, "\033[4;*~"},
+ {K_XEND, "\033O*F"}, /* other End */
+ {K_ZEND, "\033[8;*~"},
+ {K_PAGEUP, "\033[5;*~"},
+ {K_PAGEDOWN, "\033[6;*~"},
+ {K_KPLUS, "\033O*k"}, /* keypad plus */
+ {K_KMINUS, "\033O*m"}, /* keypad minus */
+ {K_KDIVIDE, "\033O*o"}, /* keypad / */
+ {K_KMULTIPLY, "\033O*j"}, /* keypad * */
+ {K_KENTER, "\033O*M"}, /* keypad Enter */
+ {K_KPOINT, "\033O*n"}, /* keypad . */
+ {K_KDEL, "\033[3;*~"}, /* keypad Del */
+
+ {BT_EXTRA_KEYS, ""},
+ {TERMCAP2KEY('k', '0'), "\033[10;*~"}, /* F0 */
+ {TERMCAP2KEY('F', '3'), "\033[25;*~"}, /* F13 */
+ /* F14 and F15 are missing, because they send the same codes as the undo
+ * and help key, although they don't work on all keyboards. */
+ {TERMCAP2KEY('F', '6'), "\033[29;*~"}, /* F16 */
+ {TERMCAP2KEY('F', '7'), "\033[31;*~"}, /* F17 */
+ {TERMCAP2KEY('F', '8'), "\033[32;*~"}, /* F18 */
+ {TERMCAP2KEY('F', '9'), "\033[33;*~"}, /* F19 */
+ {TERMCAP2KEY('F', 'A'), "\033[34;*~"}, /* F20 */
+
+ {TERMCAP2KEY('F', 'B'), "\033[42;*~"}, /* F21 */
+ {TERMCAP2KEY('F', 'C'), "\033[43;*~"}, /* F22 */
+ {TERMCAP2KEY('F', 'D'), "\033[44;*~"}, /* F23 */
+ {TERMCAP2KEY('F', 'E'), "\033[45;*~"}, /* F24 */
+ {TERMCAP2KEY('F', 'F'), "\033[46;*~"}, /* F25 */
+ {TERMCAP2KEY('F', 'G'), "\033[47;*~"}, /* F26 */
+ {TERMCAP2KEY('F', 'H'), "\033[48;*~"}, /* F27 */
+ {TERMCAP2KEY('F', 'I'), "\033[49;*~"}, /* F28 */
+ {TERMCAP2KEY('F', 'J'), "\033[50;*~"}, /* F29 */
+ {TERMCAP2KEY('F', 'K'), "\033[51;*~"}, /* F30 */
+
+ {TERMCAP2KEY('F', 'L'), "\033[52;*~"}, /* F31 */
+ {TERMCAP2KEY('F', 'M'), "\033[53;*~"}, /* F32 */
+ {TERMCAP2KEY('F', 'N'), "\033[54;*~"}, /* F33 */
+ {TERMCAP2KEY('F', 'O'), "\033[55;*~"}, /* F34 */
+ {TERMCAP2KEY('F', 'P'), "\033[56;*~"}, /* F35 */
+ {TERMCAP2KEY('F', 'Q'), "\033[57;*~"}, /* F36 */
+ {TERMCAP2KEY('F', 'R'), "\033[58;*~"}, /* F37 */
# endif
# if defined(DEBUG) || defined(ALL_BUILTIN_TCAPS)
@@ -1100,10 +976,9 @@ static struct builtin_term builtin_termcaps[] =
{(int)KS_NAME, "dumb"},
{(int)KS_CL, "\014"},
#ifdef TERMINFO
- {(int)KS_CM, IF_EB("\033[%i%p1%d;%p2%dH",
- ESC_STR "[%i%p1%d;%p2%dH")},
+ {(int)KS_CM, "\033[%i%p1%d;%p2%dH"},
#else
- {(int)KS_CM, IF_EB("\033[%i%d;%dH", ESC_STR "[%i%d;%dH")},
+ {(int)KS_CM, "\033[%i%d;%dH"},
#endif
/*
@@ -1148,9 +1023,7 @@ static struct builtin_term *find_builtin_term(char_u *term)
while (p->bt_string != NULL) {
if (p->bt_entry == (int)KS_NAME) {
#ifdef UNIX
- if (STRCMP(p->bt_string, "iris-ansi") == 0 && vim_is_iris(term))
- return p;
- else if (STRCMP(p->bt_string, "xterm") == 0 && vim_is_xterm(term))
+ if (STRCMP(p->bt_string, "xterm") == 0 && vim_is_xterm(term))
return p;
else
#endif
@@ -1545,31 +1418,6 @@ int set_termname(char_u *term)
set_mouse_termcode(KS_MOUSE, (char_u *)"\233M");
# endif
-
-#ifdef USE_TERM_CONSOLE
- /* DEFAULT_TERM indicates that it is the machine console. */
- if (STRCMP(term, DEFAULT_TERM) != 0)
- term_console = FALSE;
- else {
- term_console = TRUE;
- }
-#endif
-
-#if defined(UNIX)
- /*
- * 'ttyfast' is default on for xterm, iris-ansi and a few others.
- */
- if (vim_is_fastterm(term))
- p_tf = TRUE;
-#endif
-#ifdef USE_TERM_CONSOLE
- /*
- * 'ttyfast' is default on consoles
- */
- if (term_console)
- p_tf = TRUE;
-#endif
-
ttest(TRUE); /* make sure we have a valid set of terminal codes */
full_screen = TRUE; /* we can use termcap codes from now on */
@@ -2164,7 +2012,7 @@ static void term_color(char_u *s, int n)
#endif
sprintf(buf,
fmt,
- i == 2 ? IF_EB("\033[", ESC_STR "[") : "\233",
+ i == 2 ? "\033[" : "\233",
s[i] == '3' ? (n >= 16 ? "38;5;" : "9")
: (n >= 16 ? "48;5;" : "10"));
OUT_STR(tgoto(buf, 0, n >= 16 ? n : n - 8));
diff --git a/src/nvim/testdir/Makefile b/src/nvim/testdir/Makefile
index c93706fce2..21f2928593 100644
--- a/src/nvim/testdir/Makefile
+++ b/src/nvim/testdir/Makefile
@@ -29,7 +29,7 @@ SCRIPTS := test_autoformat_join.out \
test91.out test92.out test93.out test94.out test95.out \
test96.out test97.out test98.out test99.out test100.out \
test101.out test102.out test103.out test104.out test105.out \
- test106.out
+ test106.out test107.out
SCRIPTS_GUI := test16.out
diff --git a/src/nvim/testdir/test100.in b/src/nvim/testdir/test100.in
index e42331946c..f9f5f9119f 100644
--- a/src/nvim/testdir/test100.in
+++ b/src/nvim/testdir/test100.in
@@ -37,6 +37,14 @@ STARTTEST
:call UndoLevel()
:%w >> test.out
:"sleep 10
+:"
+:" Testing 'lispwords'
+:"
+:setglobal lispwords=foo,bar,baz
+:setlocal lispwords-=foo | setlocal lispwords+=quux
+:redir >> test.out | echon "\nTesting 'lispwords' local value" | setglobal lispwords? | setlocal lispwords? | echo &lispwords . "\n" | redir end
+:setlocal lispwords<
+:redir >> test.out | echon "\nTesting 'lispwords' value reset" | setglobal lispwords? | setlocal lispwords? | echo &lispwords . "\n" | redir end
:qa!
ENDTEST
diff --git a/src/nvim/testdir/test100.ok b/src/nvim/testdir/test100.ok
index 95b318461c..477106b8f2 100644
--- a/src/nvim/testdir/test100.ok
+++ b/src/nvim/testdir/test100.ok
@@ -39,3 +39,13 @@ THREE: expecting global undolevels: 50, local undolevels: -123456 (default)
undolevels=50 global
undolevels=-123456 local
+
+Testing 'lispwords' local value
+ lispwords=foo,bar,baz
+ lispwords=bar,baz,quux
+bar,baz,quux
+
+Testing 'lispwords' value reset
+ lispwords=foo,bar,baz
+ lispwords=foo,bar,baz
+foo,bar,baz
diff --git a/src/nvim/testdir/test107.in b/src/nvim/testdir/test107.in
new file mode 100644
index 0000000000..9143380f18
--- /dev/null
+++ b/src/nvim/testdir/test107.in
@@ -0,0 +1,38 @@
+Tests for adjusting window and contents vim: set ft=vim :
+
+STARTTEST
+:so small.vim
+:new
+:call setline(1, range(1,256))
+:let r=[]
+:func! GetScreenStr(row)
+: let str = ""
+: for c in range(1,3)
+: let str .= nr2char(screenchar(a:row, c))
+: endfor
+: return str
+:endfunc
+:
+:exe ":norm! \<C-W>t\<C-W>=1Gzt\<C-W>w\<C-W>+"
+:let s3=GetScreenStr(1)
+:wincmd p
+:call add(r, [line("w0"), s3])
+:
+:exe ":norm! \<C-W>t\<C-W>=50Gzt\<C-W>w\<C-W>+"
+:let s3=GetScreenStr(1)
+:wincmd p
+:call add(r, [line("w0"), s3])
+:
+:exe ":norm! \<C-W>t\<C-W>=59Gzt\<C-W>w\<C-W>+"
+:let s3=GetScreenStr(1)
+::wincmd p
+:call add(r, [line("w0"), s3])
+:
+:bwipeout!
+:$put=r
+:call garbagecollect(1)
+:"
+:/^start:/,$wq! test.out
+ENDTEST
+
+start:
diff --git a/src/nvim/testdir/test107.ok b/src/nvim/testdir/test107.ok
new file mode 100644
index 0000000000..3e0eda1fe7
--- /dev/null
+++ b/src/nvim/testdir/test107.ok
@@ -0,0 +1,4 @@
+start:
+[1, '1 ']
+[50, '50 ']
+[59, '59 ']
diff --git a/src/nvim/testdir/test2.in b/src/nvim/testdir/test2.in
deleted file mode 100644
index b7b5a51066..0000000000
--- a/src/nvim/testdir/test2.in
+++ /dev/null
@@ -1,29 +0,0 @@
-
-This is a test if a URL is recognized by "gf", with the cursor before and
-after the "://". Also test ":\\".
-
-STARTTEST
-:so small.vim
-/^first
-/tmp
-:call append(0, expand("<cfile>"))
-/^second
-/URL
-:call append(1, expand("<cfile>"))
-:if has("ebcdic")
-: set isf=@,240-249,/,.,-,_,+,,,$,:,~,\
-:else
-: set isf=@,48-57,/,.,-,_,+,,,$,:,~,\
-:endif
-/^third
-/name
-:call append(2, expand("<cfile>"))
-/^fourth
-/URL
-:call append(3, expand("<cfile>"))
-5GdG:wq! test.out
-ENDTEST
-first test for URL://machine.name/tmp/vimtest2a and other text
-second test for URL://machine.name/tmp/vimtest2b. And other text
-third test for URL:\\machine.name\vimtest2c and other text
-fourth test for URL:\\machine.name\tmp\vimtest2d, and other text
diff --git a/src/nvim/testdir/test2.ok b/src/nvim/testdir/test2.ok
deleted file mode 100644
index 32978825f8..0000000000
--- a/src/nvim/testdir/test2.ok
+++ /dev/null
@@ -1,4 +0,0 @@
-URL://machine.name/tmp/vimtest2a
-URL://machine.name/tmp/vimtest2b
-URL:\\machine.name\vimtest2c
-URL:\\machine.name\tmp\vimtest2d
diff --git a/src/nvim/testdir/test69.in b/src/nvim/testdir/test69.in
index 75317b4954..674dc32812 100644
--- a/src/nvim/testdir/test69.in
+++ b/src/nvim/testdir/test69.in
@@ -180,6 +180,13 @@ byteidx
byteidxcomp
STARTTEST
+/^substitute
+:let y = substitute('123', '\zs', 'a', 'g') | put =y
+ENDTEST
+
+substitute
+
+STARTTEST
:g/^STARTTEST/.,/^ENDTEST/d
:1;/^Results/,$wq! test.out
ENDTEST
diff --git a/src/nvim/testdir/test69.ok b/src/nvim/testdir/test69.ok
index 41cd9d02c3..af8befb0c7 100644
--- a/src/nvim/testdir/test69.ok
+++ b/src/nvim/testdir/test69.ok
@@ -160,3 +160,7 @@ byteidxcomp
[0, 1, 3, 4, -1]
[0, 1, 2, 4, 5, -1]
+
+substitute
+a1a2a3a
+
diff --git a/src/nvim/testdir/test95.in b/src/nvim/testdir/test95.in
index 568563f88d..b2b9de772e 100644
--- a/src/nvim/testdir/test95.in
+++ b/src/nvim/testdir/test95.in
@@ -50,7 +50,11 @@ STARTTEST
:call add(tl, [1, "\u05b9\u05bb", " y\u05b9 x\u05b9\u05bb ", "x\u05b9\u05bb"])
:call add(tl, [2, ".\u05b9\u05bb", " y\u05bb x\u05b9\u05bb ", "x\u05b9\u05bb"])
:call add(tl, [2, "a", "ca\u0300t"])
+:call add(tl, [2, "ca", "ca\u0300t"])
:call add(tl, [2, "a\u0300", "ca\u0300t", "a\u0300"])
+:call add(tl, [2, 'a\%C', "ca\u0300t", "a\u0300"])
+:call add(tl, [2, 'ca\%C', "ca\u0300t", "ca\u0300"])
+:call add(tl, [2, 'ca\%Ct', "ca\u0300t", "ca\u0300t"])
:"""" Test \Z
@@ -90,15 +94,15 @@ STARTTEST
: try
: let l = matchlist(text, pat)
: catch
-: $put ='ERROR: pat: \"' . pat . '\", text: \"' . text . '\", caused an exception: \"' . v:exception . '\"'
+: $put ='ERROR ' . engine . ': pat: \"' . pat . '\", text: \"' . text . '\", caused an exception: \"' . v:exception . '\"'
: endtry
:" check the match itself
: if len(l) == 0 && len(t) > matchidx
-: $put ='ERROR: pat: \"' . pat . '\", text: \"' . text . '\", did not match, expected: \"' . t[matchidx] . '\"'
+: $put ='ERROR ' . engine . ': pat: \"' . pat . '\", text: \"' . text . '\", did not match, expected: \"' . t[matchidx] . '\"'
: elseif len(l) > 0 && len(t) == matchidx
-: $put ='ERROR: pat: \"' . pat . '\", text: \"' . text . '\", match: \"' . l[0] . '\", expected no match'
+: $put ='ERROR ' . engine . ': pat: \"' . pat . '\", text: \"' . text . '\", match: \"' . l[0] . '\", expected no match'
: elseif len(t) > matchidx && l[0] != t[matchidx]
-: $put ='ERROR: pat: \"' . pat . '\", text: \"' . text . '\", match: \"' . l[0] . '\", expected: \"' . t[matchidx] . '\"'
+: $put ='ERROR ' . engine . ': pat: \"' . pat . '\", text: \"' . text . '\", match: \"' . l[0] . '\", expected: \"' . t[matchidx] . '\"'
: else
: $put ='OK ' . engine . ' - ' . pat
: endif
@@ -111,7 +115,7 @@ STARTTEST
: let e = t[matchidx + i]
: endif
: if l[i] != e
-: $put ='ERROR: pat: \"' . pat . '\", text: \"' . text . '\", submatch ' . i . ': \"' . l[i] . '\", expected: \"' . e . '\"'
+: $put ='ERROR ' . engine . ': pat: \"' . pat . '\", text: \"' . text . '\", submatch ' . i . ': \"' . l[i] . '\", expected: \"' . e . '\"'
: endif
: endfor
: unlet i
diff --git a/src/nvim/testdir/test95.ok b/src/nvim/testdir/test95.ok
index e2baee8d29..6762994c12 100644
--- a/src/nvim/testdir/test95.ok
+++ b/src/nvim/testdir/test95.ok
@@ -70,9 +70,21 @@ OK 2 - .ֹֻ
OK 0 - a
OK 1 - a
OK 2 - a
+OK 0 - ca
+OK 1 - ca
+OK 2 - ca
OK 0 - à
OK 1 - à
OK 2 - à
+OK 0 - a\%C
+OK 1 - a\%C
+OK 2 - a\%C
+OK 0 - ca\%C
+OK 1 - ca\%C
+OK 2 - ca\%C
+OK 0 - ca\%Ct
+OK 1 - ca\%Ct
+OK 2 - ca\%Ct
OK 0 - ú\Z
OK 1 - ú\Z
OK 2 - ú\Z
diff --git a/src/nvim/testdir/test97.in b/src/nvim/testdir/test97.in
index 59bb62d15c..d4ff6d9295 100644
--- a/src/nvim/testdir/test97.in
+++ b/src/nvim/testdir/test97.in
@@ -8,12 +8,15 @@ STARTTEST
:" consistent sorting of file names
:set nofileignorecase
:e test.out
-:put =glob('Xxx\{')
-:put =glob('Xxx\$')
+:$put =glob('Xxx\{')
+:$put =glob('Xxx\$')
:w! Xxx{
:w! Xxx\$
-:put =glob('Xxx\{')
-:put =glob('Xxx\$')
+:$put =glob('Xxx\{')
+:$put =glob('Xxx\$')
+:"
+:$put =string(globpath('sautest/autoload', '*.vim'))
+:$put =string(globpath('sautest/autoload', '*.vim', 0, 1))
:w
:qa!
ENDTEST
diff --git a/src/nvim/testdir/test97.ok b/src/nvim/testdir/test97.ok
index afa96a4de4..32cdcbf1be 100644
--- a/src/nvim/testdir/test97.ok
+++ b/src/nvim/testdir/test97.ok
@@ -3,3 +3,6 @@
Xxx{
Xxx$
+'sautest/autoload/Test104.vim
+sautest/autoload/footest.vim'
+['sautest/autoload/Test104.vim', 'sautest/autoload/footest.vim']
diff --git a/src/nvim/undo.c b/src/nvim/undo.c
index 96b83a3e2d..8c7b5b38e9 100644
--- a/src/nvim/undo.c
+++ b/src/nvim/undo.c
@@ -1119,10 +1119,7 @@ void u_write_undo(char_u *name, int forceit, buf_T *buf, char_u *hash)
if (os_get_file_info((char *)buf->b_ffname, &file_info_old)
&& os_get_file_info((char *)file_name, &file_info_new)
&& file_info_old.stat.st_gid != file_info_new.stat.st_gid
-# ifdef HAVE_FCHOWN /* sequent-ptx lacks fchown() */
- && fchown(fd, (uid_t)-1, file_info_old.stat.st_gid) != 0
-# endif
- ) {
+ && os_fchown(fd, -1, file_info_old.stat.st_gid) != 0) {
os_setperm(file_name, (perm & 0707) | ((perm & 07) << 3));
}
# ifdef HAVE_SELINUX
diff --git a/src/nvim/version.c b/src/nvim/version.c
index 8214cb60b4..246ce02f1f 100644
--- a/src/nvim/version.c
+++ b/src/nvim/version.c
@@ -61,11 +61,7 @@ static char *(features[]) = {
"+conceal",
"+cscope",
"+cursorbind",
-#ifdef CURSOR_SHAPE
"+cursorshape",
-#else // ifdef CURSOR_SHAPE
- "-cursorshape",
-#endif // ifdef CURSOR_SHAPE
"+dialog_con",
"+diff",
"+digraphs",
@@ -145,11 +141,7 @@ static char *(features[]) = {
"+syntax",
"+tag_binary",
"+tag_old_static",
-#ifdef FEAT_TAG_ANYWHITE
- "+tag_any_white",
-#else // ifdef FEAT_TAG_ANYWHITE
"-tag_any_white",
-#endif // ifdef FEAT_TAG_ANYWHITE
#if defined(UNIX)
// only Unix can have terminfo instead of termcap
@@ -193,6 +185,52 @@ static char *(features[]) = {
static int included_patches[] = {
// Add new patch number below this line
+ //410,
+ //409,
+ //408,
+ //407,
+ //406,
+ //405,
+ //404,
+ //403,
+ //402,
+ //401,
+ //400,
+ //399,
+ //398,
+ //397,
+ //396,
+ //395,
+ //394,
+ //393,
+ //392,
+ //391,
+ //390,
+ //389,
+ //388,
+ //387,
+ //386,
+ //385,
+ //384,
+ //383,
+ //382,
+ //381,
+ //380 NA
+ //379,
+ //378,
+ //377,
+ //376,
+ //375,
+ //374,
+ //373,
+ //372,
+ //371,
+ //370,
+ //369,
+ //368,
+ //367,
+ //366,
+ //365,
//364,
//363,
//362,
@@ -201,7 +239,7 @@ static int included_patches[] = {
//359,
//358,
//357,
- //356,
+ //356 NA
//355,
//354,
//353,
@@ -215,62 +253,62 @@ static int included_patches[] = {
//345,
//344,
//343,
- //342,
+ //342 NA
//341,
- //340,
+ //340 NA
//339,
//338,
//337,
//336,
- //335,
+ 335,
//334,
- //333,
- //332,
- //331,
+ //333 NA
+ //332 NA
+ 331,
//330,
- //329,
- //328,
- //327,
- //326,
- //325,
+ 329,
+ 328,
+ 327,
+ //326 NA
+ 325,
//324,
- //323,
- //322,
- //321,
+ 323,
+ //322 NA
+ //321 NA
//320,
- //319,
- //318,
+ //319 NA
+ 318,
//317,
- //316,
- //315,
- //314,
+ //316 NA
+ 315,
+ 314,
//313,
//312,
//311,
//310,
309,
308,
- //307,
+ //307 NA
306,
//305,
- //304,
+ //304 NA
303,
302,
301,
- //300,
- //299,
+ //300 NA
+ //299 NA
298,
//297,
//296,
295,
- //294,
- //293,
+ 294,
+ 293,
292,
291,
290,
289,
288,
- //287,
+ //287 NA
286,
285,
284,
@@ -278,16 +316,16 @@ static int included_patches[] = {
282,
281,
280,
- //279,
+ 279,
//278,
277,
- //276,
+ 276,
275,
274,
- //273,
+ //273 NA
272,
//271,
- //270,
+ //270 NA
269,
268,
267,
@@ -299,13 +337,13 @@ static int included_patches[] = {
261,
260,
//259,
- //258,
- //257,
+ //258 NA
+ //257 NA
//256,
//255,
//254,
253,
- //252,
+ //252 NA
251,
//250,
//249,
@@ -327,76 +365,76 @@ static int included_patches[] = {
233,
232,
//231,
- //230,
+ 230,
229,
- //228,
- //227,
+ //228 NA
+ //227 NA
226,
- //225,
- //224,
- //223,
- //222,
+ //225 NA
+ //224 NA
+ //223 NA
+ //222 NA
221,
//220,
219,
218,
- //217,
- //216,
+ //217 NA
+ //216 NA
215,
- //214,
+ //214 NA
213,
- //212,
+ //212 NA
//211,
210,
209,
- //208,
+ //208 NA
207,
- //206,
+ //206 NA
205,
204,
203,
- //202,
- //201,
- //200,
+ //202 NA
+ 201,
+ //200 NA
199,
- //198,
- //197,
- //196,
- //195,
- //194,
+ //198 NA
+ //197 NA
+ //196 NA
+ //195 NA
+ //194 NA
193,
192,
191,
- //190,
+ //190 NA
//189,
- //188,
+ //188 NA
187,
186,
//185,
184,
- //183,
- //182,
+ //183 NA
+ //182 NA
181,
- //180,
- //179,
+ //180 NA
+ //179 NA
178,
- //177,
+ //177 NA
//176,
- //175,
- //174,
+ //175 NA
+ //174 NA
173,
172,
171,
170,
169,
- //168,
+ //168 NA
167,
166,
- //165,
- //164,
- //163,
- //162,
- //161,
+ 165,
+ //164 NA
+ //163 NA
+ //162 NA
+ //161 NA
160,
159,
158,
diff --git a/src/nvim/window.c b/src/nvim/window.c
index 7e4934bdfe..050f5e2acd 100644
--- a/src/nvim/window.c
+++ b/src/nvim/window.c
@@ -1445,7 +1445,6 @@ win_equal_rec (
}
for (fr = topfr->fr_child; fr != NULL; fr = fr->fr_next) {
- n = m = 0;
wincount = 1;
if (fr->fr_next == NULL)
/* last frame gets all that remains (avoid roundoff error) */
@@ -1566,7 +1565,6 @@ win_equal_rec (
}
for (fr = topfr->fr_child; fr != NULL; fr = fr->fr_next) {
- n = m = 0;
wincount = 1;
if (fr->fr_next == NULL)
/* last frame gets all that remains (avoid roundoff error) */
@@ -3398,12 +3396,19 @@ static void win_enter_ext(win_T *wp, bool undo_sync, int curwin_invalid, int tri
return;
}
- /* sync undo before leaving the current buffer */
- if (undo_sync && curbuf != wp->w_buffer)
+ // sync undo before leaving the current buffer
+ if (undo_sync && curbuf != wp->w_buffer) {
u_sync(FALSE);
- /* may have to copy the buffer options when 'cpo' contains 'S' */
- if (wp->w_buffer != curbuf)
+ }
+
+ // Might need to scroll the old window before switching, e.g., when the
+ // cursor was moved.
+ update_topline();
+
+ // may have to copy the buffer options when 'cpo' contains 'S'
+ if (wp->w_buffer != curbuf) {
buf_copy_options(wp->w_buffer, BCO_ENTER | BCO_NOHELP);
+ }
if (!curwin_invalid) {
prevwin = curwin; /* remember for CTRL-W p */
curwin->w_redr_status = TRUE;
@@ -4479,7 +4484,12 @@ void win_new_height(win_T *wp, int height)
if (wp->w_height > 0) {
if (wp == curwin) {
- validate_cursor(); // w_wrow needs to be valid
+ // w_wrow needs to be valid. When setting 'laststatus' this may
+ // call win_new_height() recursively.
+ validate_cursor();
+ }
+ if (wp->w_height != prev_height) {
+ return; // Recursive call already changed the size, bail out.
}
if (wp->w_wrow != wp->w_prev_fraction_row) {
set_fraction(wp);
diff --git a/test/legacy/test2-filename-recognition.vroom b/test/legacy/test2-filename-recognition.vroom
new file mode 100644
index 0000000000..b8169ec207
--- /dev/null
+++ b/test/legacy/test2-filename-recognition.vroom
@@ -0,0 +1,40 @@
+Test if URLs are recognized as filenames by commands such as "gf". Here
+we'll use `expand("<cfile>")` since "gf" would need to open the file.
+
+Insert some URLs:
+
+ % first test for URL://machine.name/tmp/vimtest2a and other text<cr>
+ % second test for URL://machine.name/tmp/vimtest2b. And other text<cr>
+ % third test for URL:\\machine.name\vimtest2c and other text<cr>
+ % fourth test for URL:\\machine.name\tmp\vimtest2d, and other text
+
+Go to the first URL:
+
+ :/^first<cr>/tmp
+
+Append the url to the beginning of the buffer:
+
+ :call append(0, expand("<cfile>"))
+
+Repeat for the second URL, but navigate to the 'URL' word:
+
+ :/^second<cr>/URL<cr>:call append(1, expand("<cfile>"))
+
+Repeat for the other two, but first the 'isfname' option must be set to
+allow '\' in filenames
+
+ :set isf=@,48-57,/,.,-,_,+,,,$,:,~,\
+ :/^third<cr>/name<cr>:call append(2, expand("<cfile>"))
+ :/^fourth<cr>/URL<cr>:call append(3, expand("<cfile>"))
+
+Delete the initial text which starts at line 5:
+
+ > 5GdG
+
+Result:
+
+ URL://machine.name/tmp/vimtest2a
+ URL://machine.name/tmp/vimtest2b
+ URL:\\machine.name\vimtest2c
+ URL:\\machine.name\tmp\vimtest2d
+ @end
diff --git a/test/unit/os/fs_spec.moon b/test/unit/os/fs_spec.moon
index 52f587d6f9..dd787e76cd 100644
--- a/test/unit/os/fs_spec.moon
+++ b/test/unit/os/fs_spec.moon
@@ -112,6 +112,12 @@ describe 'fs function', ->
os_setperm = (filename, perm) ->
fs.os_setperm (to_cstr filename), perm
+ os_fchown = (filename, user_id, group_id) ->
+ fd = ffi.C.open filename, 0
+ res = fs.os_fchown fd, user_id, group_id
+ ffi.C.close fd
+ return res
+
os_file_is_readonly = (filename) ->
fs.os_file_is_readonly (to_cstr filename)
@@ -158,6 +164,43 @@ describe 'fs function', ->
perm = ffi.C.kS_IXUSR
eq FAIL, (os_setperm 'non-existing-file', perm)
+ describe 'os_fchown', ->
+ filename = 'unit-test-directory/test.file'
+
+ it 'does not change owner and group if respective IDs are equal to -1', ->
+ uid = lfs.attributes filename, 'uid'
+ gid = lfs.attributes filename, 'gid'
+ eq 0, os_fchown filename, -1, -1
+ eq uid, lfs.attributes filename, 'uid'
+ eq gid, lfs.attributes filename, 'gid'
+
+ it 'owner of a file may change the group of the file
+ to any group of which that owner is a member', ->
+ -- Some systems may not have `id` utility.
+ if (os.execute('id -G &> /dev/null') == 0)
+ file_gid = lfs.attributes filename, 'gid'
+
+ -- Gets ID of any group of which current user is a member except the
+ -- group that owns the file.
+ id_fd = io.popen('id -G')
+ new_gid = id_fd\read '*n'
+ if (new_gid == file_gid)
+ new_gid = id_fd\read '*n'
+ id_fd\close!
+
+ -- User can be a member of only one group.
+ -- In that case we can not perform this test.
+ if new_gid
+ eq 0, (os_fchown filename, -1, new_gid)
+ eq new_gid, (lfs.attributes filename, 'gid')
+
+ it 'returns nonzero if process has not enough permissions', ->
+ -- On Windows `os_fchown` always returns 0
+ -- because `uv_fs_chown` is no-op on this platform.
+ if (ffi.os != 'Windows' and ffi.C.geteuid! != 0)
+ -- chown to root
+ neq 0, os_fchown filename, 0, 0
+
describe 'os_file_is_readonly', ->
it 'returns true if the file is readonly', ->
perm = os_getperm 'unit-test-directory/test.file'
diff --git a/test/unit/path_spec.moon b/test/unit/path_spec.moon
index 0786fe6c01..f7e5ed00bc 100644
--- a/test/unit/path_spec.moon
+++ b/test/unit/path_spec.moon
@@ -114,6 +114,65 @@ describe 'path function', ->
it 'returns the whole file name if there is no separator', ->
eq 'file.txt', path_tail_with_sep 'file.txt'
+ describe 'invocation_path_tail', ->
+ -- Returns the path tail and length (out param) of the tail.
+ -- Does not convert the tail from C-pointer to lua string for use with
+ -- strcmp.
+ invocation_path_tail = (invk) ->
+ plen = ffi.new 'size_t[?]', 1
+ ptail = path.invocation_path_tail (to_cstr invk), plen
+ neq NULL, ptail
+
+ -- it does not change the output if len==NULL
+ tail2 = path.invocation_path_tail (to_cstr invk), NULL
+ neq NULL, tail2
+ eq (ffi.string ptail), (ffi.string tail2)
+
+ ptail, plen[0]
+
+ -- This test mimics the intended use in C.
+ compare = (base, pinvk, len) ->
+ eq 0, (ffi.C.strncmp (to_cstr base), pinvk, len)
+
+ it 'returns the executable name of an invocation given a relative invocation', ->
+ invk, len = invocation_path_tail 'directory/exe a b c'
+ compare "exe a b c", invk, len
+ eq 3, len
+
+ it 'returns the executable name of an invocation given an absolute invocation', ->
+ if ffi.os == 'Windows'
+ invk, len = invocation_path_tail 'C:\\Users\\anyone\\Program Files\\z a b'
+ compare 'z a b', invk, len
+ eq 1, len
+ else
+ invk, len = invocation_path_tail '/usr/bin/z a b'
+ compare 'z a b', invk, len
+ eq 1, len
+
+ it 'does not count arguments to the executable as part of its path', ->
+ invk, len = invocation_path_tail 'exe a/b\\c'
+ compare "exe a/b\\c", invk, len
+ eq 3, len
+
+ it 'only accepts whitespace as a terminator for the executable name', ->
+ invk, len = invocation_path_tail 'exe-a+b_c[]()|#!@$%^&*'
+ eq 'exe-a+b_c[]()|#!@$%^&*', (ffi.string invk)
+
+ it 'is equivalent to path_tail when args do not contain a path separator', ->
+ ptail = path.path_tail to_cstr "a/b/c x y z"
+ neq NULL, ptail
+ tail = ffi.string ptail
+
+ invk, len = invocation_path_tail "a/b/c x y z"
+ eq tail, ffi.string invk
+
+ it 'is not equivalent to path_tail when args contain a path separator', ->
+ ptail = path.path_tail to_cstr "a/b/c x y/z"
+ neq NULL, ptail
+
+ invk, len = invocation_path_tail "a/b/c x y/z"
+ neq (ffi.string ptail), (ffi.string invk)
+
describe 'path_next_component', ->
path_next_component = (file) ->
res = path.path_next_component (to_cstr file)
diff --git a/third-party/CMakeLists.txt b/third-party/CMakeLists.txt
index c41b80c9b8..56956fdc70 100644
--- a/third-party/CMakeLists.txt
+++ b/third-party/CMakeLists.txt
@@ -46,8 +46,8 @@ endif()
include(ExternalProject)
-set(LIBUV_URL https://github.com/joyent/libuv/archive/v0.11.26.tar.gz)
-set(LIBUV_MD5 05fabe884173f422649fbe1047ca62b1)
+set(LIBUV_URL https://github.com/joyent/libuv/archive/v0.11.28.tar.gz)
+set(LIBUV_MD5 1a849ba4fc571d531482ed74bc7aabc4)
set(MSGPACK_URL https://github.com/msgpack/msgpack-c/releases/download/cpp-0.5.8/msgpack-0.5.8.tar.gz)
set(MSGPACK_MD5 ea0bee0939d2980c0df91f0e4843ccc4)