aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt7
-rw-r--r--Makefile4
-rw-r--r--README.md24
-rw-r--r--cmake/PreventInTreeBuilds.cmake23
-rw-r--r--config/CMakeLists.txt8
-rw-r--r--contrib/local.mk.example2
-rw-r--r--runtime/autoload/health/provider.vim97
-rw-r--r--runtime/autoload/remote/host.vim9
-rw-r--r--runtime/compiler/gcc.vim2
-rw-r--r--runtime/doc/deprecated.txt1
-rw-r--r--runtime/doc/eval.txt53
-rw-r--r--runtime/doc/vim_diff.txt3
-rw-r--r--runtime/indent/html.vim12
-rw-r--r--runtime/optwin.vim10
-rw-r--r--runtime/synmenu.vim1
-rw-r--r--runtime/syntax/avra.vim73
-rw-r--r--runtime/syntax/desktop.vim7
-rw-r--r--runtime/syntax/diff.vim8
-rw-r--r--runtime/syntax/help.vim3
-rw-r--r--runtime/syntax/sshconfig.vim7
-rw-r--r--runtime/syntax/vim.vim198
-rw-r--r--runtime/vimrc_example.vim6
-rw-r--r--src/nvim/CMakeLists.txt2
-rw-r--r--src/nvim/api/private/helpers.c6
-rw-r--r--src/nvim/buffer.c43
-rw-r--r--src/nvim/edit.c7
-rw-r--r--src/nvim/eval.c117
-rw-r--r--src/nvim/eval.lua3
-rw-r--r--src/nvim/ex_cmds.c8
-rw-r--r--src/nvim/ex_docmd.c10
-rw-r--r--src/nvim/ex_eval.h22
-rw-r--r--src/nvim/hardcopy.c2
-rw-r--r--src/nvim/if_cscope.c43
-rw-r--r--src/nvim/main.c13
-rw-r--r--src/nvim/mbyte.c2
-rw-r--r--src/nvim/path.c33
-rw-r--r--src/nvim/po/eo.po15
-rw-r--r--src/nvim/po/fr.po12
-rw-r--r--src/nvim/terminal.c2
-rw-r--r--src/nvim/testdir/test_alot.vim1
-rw-r--r--src/nvim/testdir/test_cmdline.vim44
-rw-r--r--src/nvim/testdir/test_ex_undo.vim19
-rw-r--r--src/nvim/testdir/test_syn_attr.vim8
-rw-r--r--src/nvim/testdir/test_window_id.vim15
-rw-r--r--src/nvim/tui/tui.c14
-rw-r--r--src/nvim/ui.c8
-rw-r--r--src/nvim/ui_bridge.c (renamed from src/nvim/tui/ui_bridge.c)7
-rw-r--r--src/nvim/ui_bridge.h (renamed from src/nvim/tui/ui_bridge.h)11
-rw-r--r--src/nvim/version.c44
-rw-r--r--src/nvim/vim.h3
-rw-r--r--src/nvim/window.c4
-rw-r--r--test/functional/api/server_requests_spec.lua3
-rw-r--r--test/functional/eval/timer_spec.lua68
-rw-r--r--test/functional/ex_cmds/arg_spec.lua30
-rw-r--r--test/functional/ex_cmds/edit_spec.lua26
-rw-r--r--test/functional/terminal/ex_terminal_spec.lua26
-rw-r--r--test/functional/terminal/tui_spec.lua2
57 files changed, 886 insertions, 345 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0a6a9accea..4aa6a2de32 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -8,6 +8,9 @@ endif()
# Point CMake at any custom modules we may ship
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
+# We don't support building in-tree.
+include(PreventInTreeBuilds)
+
# Prefer our bundled versions of dependencies.
set(DEPS_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/.deps/usr" CACHE PATH "Path prefix for finding dependencies")
if(CMAKE_CROSSCOMPILING AND NOT UNIX)
@@ -253,6 +256,10 @@ option(
if(TRAVIS_CI_BUILD)
message(STATUS "Travis CI build enabled.")
add_definitions(-Werror)
+ if(DEFINED ENV{BUILD_32BIT})
+ # Get some test coverage for unsigned char
+ add_definitions(-funsigned-char)
+ endif()
endif()
if(CMAKE_BUILD_TYPE MATCHES Debug)
diff --git a/Makefile b/Makefile
index 8fdf007260..ef4b9cdcb5 100644
--- a/Makefile
+++ b/Makefile
@@ -13,6 +13,10 @@ CLINT_ERRORS_FILE_PATH := /reports/clint/errors.json
BUILD_TYPE ?= $(shell (type ninja > /dev/null 2>&1 && echo "Ninja") || \
echo "Unix Makefiles")
+ifneq (,$(PREFIX))
+ CMAKE_FLAGS += -DCMAKE_INSTALL_PREFIX:PATH="$(PREFIX)"
+endif
+
ifeq (,$(BUILD_TOOL))
ifeq (Ninja,$(BUILD_TYPE))
ifneq ($(shell cmake --help 2>/dev/null | grep Ninja),)
diff --git a/README.md b/README.md
index 03d478d42c..2d3d18a721 100644
--- a/README.md
+++ b/README.md
@@ -1,20 +1,24 @@
-![Neovim](https://raw.githubusercontent.com/neovim/neovim.github.io/master/logos/neovim-logo.png)
+[![Neovim](https://raw.githubusercontent.com/neovim/neovim.github.io/master/logos/neovim-logo.png)](https://neovim.io)
-[Website] | [Community] | [Wiki] | [Documentation] | [Mailing List] | [Twitter] | [Bountysource]
+[Wiki](https://github.com/neovim/neovim/wiki) |
+[Documentation](https://neovim.io/doc) |
+[Twitter](https://twitter.com/Neovim) |
+[Community](https://neovim.io/community/) |
+[Gitter **Chat**](https://gitter.im/neovim/neovim)
[![Travis Build Status](https://travis-ci.org/neovim/neovim.svg?branch=master)](https://travis-ci.org/neovim/neovim)
[![AppVeyor Build status](https://ci.appveyor.com/api/projects/status/cf1jwc29198748we/branch/master?svg=true)](https://ci.appveyor.com/project/neovim/neovim/branch/master)
[![Pull requests waiting for review](https://badge.waffle.io/neovim/neovim.svg?label=RFC&title=RFCs)](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://neovim.io/doc/reports/clang/badge.svg)](http://neovim.io/doc/reports/clang)
-[![Gitter chat](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/neovim/neovim?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+[![Clang Scan Build](https://neovim.io/doc/reports/clang/badge.svg)](https://neovim.io/doc/reports/clang)
+<a href="https://buildd.debian.org/neovim"><img src="https://www.debian.org/logos/openlogo-nd-25.png" width="13" height="15">Debian</a>
Neovim is a project that seeks to aggressively refactor Vim in order to:
- Simplify maintenance and encourage [contributions](CONTRIBUTING.md)
- Split the work between multiple developers
-- Enable the implementation of new/modern UIs without modifications to the core
+- Enable advanced [external UIs] without modifications to the core
- Improve extensibility with a new [plugin architecture](https://github.com/neovim/neovim/wiki/Plugin-UI-architecture)
For more details, see
@@ -45,7 +49,7 @@ See the [Roadmap].
How do I get it?
----------------
-There is a formula for OSX/homebrew, a PKGBUILD for Arch Linux, RPM, deb, and
+There is a Debian package, homebrew formula, PKGBUILD for Arch Linux, RPM, and
more. See [the wiki](https://github.com/neovim/neovim/wiki/Installing-Neovim)!
License
@@ -74,15 +78,9 @@ See `LICENSE` for details.
You can also sponsor the development of Vim. Vim sponsors can vote for
features. The money goes to Uganda anyway.
-[Website]: http://neovim.io
-[Community]: http://neovim.io/community/
-[Wiki]: https://github.com/neovim/neovim/wiki
-[Documentation]: http://neovim.io/doc
-[Mailing List]: https://groups.google.com/forum/#!forum/neovim
-[Twitter]: http://twitter.com/Neovim
-[Bountysource]: https://www.bountysource.com/teams/neovim
[license-commit]: https://github.com/neovim/neovim/commit/b17d9691a24099c9210289f16afb1a498a89d803
[nvim-features]: https://neovim.io/doc/user/vim_diff.html#nvim-features
[Roadmap]: https://neovim.io/roadmap/
+[external UIs]: https://github.com/neovim/neovim/wiki/Related-projects#gui-projects
<!-- vim: set tw=80: -->
diff --git a/cmake/PreventInTreeBuilds.cmake b/cmake/PreventInTreeBuilds.cmake
new file mode 100644
index 0000000000..9c0ce1c0a2
--- /dev/null
+++ b/cmake/PreventInTreeBuilds.cmake
@@ -0,0 +1,23 @@
+function(PreventInTreeBuilds)
+ get_filename_component(srcdir "${CMAKE_SOURCE_DIR}" REALPATH)
+ get_filename_component(bindir "${CMAKE_BINARY_DIR}" REALPATH)
+
+ if("${srcdir}" STREQUAL "${bindir}")
+ message("")
+ message("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+ message("Neovim doesn't support in-tree builds. It's recommended that you")
+ message("use a build/ subdirectory:")
+ message(" mkdir build")
+ message(" cd build")
+ message(" cmake <OPTIONS> ..")
+ message("")
+ message("Make sure to cleanup some CMake artifacts from this failed build")
+ message("with:")
+ message(" rm -rf CMakeFiles CMakeCache.txt")
+ message("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
+ message("")
+ message(FATAL_ERROR "Stopping build.")
+ endif()
+endfunction()
+
+PreventInTreeBuilds()
diff --git a/config/CMakeLists.txt b/config/CMakeLists.txt
index cf84f8c6a4..a16000aba8 100644
--- a/config/CMakeLists.txt
+++ b/config/CMakeLists.txt
@@ -142,12 +142,16 @@ configure_file (
find_program(WHOAMI_PROG whoami)
find_program(HOSTNAME_PROG hostname)
-if (NOT DEFINED USERNAME AND EXISTS ${WHOAMI_PROG})
+if (DEFINED ENV{USERNAME})
+ set(USERNAME $ENV{USERNAME})
+elseif (NOT DEFINED USERNAME AND EXISTS ${WHOAMI_PROG})
execute_process(COMMAND ${WHOAMI_PROG}
OUTPUT_STRIP_TRAILING_WHITESPACE
OUTPUT_VARIABLE USERNAME)
endif()
-if (EXISTS ${HOSTNAME_PROG})
+if (DEFINED ENV{HOSTNAME})
+ set(HOSTNAME $ENV{HOSTNAME})
+elseif (EXISTS ${HOSTNAME_PROG})
execute_process(COMMAND ${HOSTNAME_PROG}
OUTPUT_STRIP_TRAILING_WHITESPACE
OUTPUT_VARIABLE HOSTNAME)
diff --git a/contrib/local.mk.example b/contrib/local.mk.example
index a0b2d034e1..6959107ea2 100644
--- a/contrib/local.mk.example
+++ b/contrib/local.mk.example
@@ -2,7 +2,7 @@
# Individual entries must be uncommented to take effect.
# By default, the installation prefix is '/usr/local'.
-# CMAKE_EXTRA_FLAGS += -DCMAKE_INSTALL_PREFIX=/usr/local/nvim-latest
+# PREFIX := /usr/local/nvim-latest
# These CFLAGS can be used in addition to those specified in CMakeLists.txt:
# CMAKE_EXTRA_FLAGS="-DCMAKE_C_FLAGS=-ftrapv -Wlogical-op"
diff --git a/runtime/autoload/health/provider.vim b/runtime/autoload/health/provider.vim
index 8fa281e7e3..d4b2f07a17 100644
--- a/runtime/autoload/health/provider.vim
+++ b/runtime/autoload/health/provider.vim
@@ -1,13 +1,5 @@
-let s:bad_responses = [
- \ 'unable to parse python response',
- \ 'unable to parse',
- \ 'unable to get pypi response',
- \ 'unable to get neovim executable',
- \ 'unable to find neovim version'
- \ ]
-
function! s:is_bad_response(s) abort
- return index(s:bad_responses, a:s) >= 0
+ return a:s =~? '\v(^unable)|(^error)'
endfunction
function! s:trim(s) abort
@@ -32,44 +24,41 @@ endfunction
" Fetch the contents of a URL.
function! s:download(url) abort
- let content = ''
if executable('curl')
- let content = system(['curl', '-sL', "'", a:url, "'"])
- endif
-
- if empty(content) && executable('python')
+ let rv = system(['curl', '-sL', a:url])
+ return v:shell_error ? 'curl error: '.v:shell_error : rv
+ elseif executable('python')
let script = "
\try:\n
\ from urllib.request import urlopen\n
\except ImportError:\n
\ from urllib2 import urlopen\n
\\n
- \try:\n
- \ response = urlopen('".a:url."')\n
- \ print(response.read().decode('utf8'))\n
- \except Exception:\n
- \ pass\n
+ \response = urlopen('".a:url."')\n
+ \print(response.read().decode('utf8'))\n
\"
- let content = system(['python', '-c', "'", script, "'", '2>/dev/null'])
+ let rv = system(['python', '-c', script])
+ return empty(rv) && v:shell_error
+ \ ? 'python urllib.request error: '.v:shell_error
+ \ : rv
endif
-
- return content
+ return 'missing `curl` and `python`, cannot make pypi request'
endfunction
-" Get the latest Neovim Python client version from PyPI. Result is cached.
+" Get the latest Neovim Python client version from PyPI.
function! s:latest_pypi_version() abort
- if exists('s:pypi_version')
- return s:pypi_version
- endif
-
- let s:pypi_version = 'unable to get pypi response'
- let pypi_info = s:download('https://pypi.python.org/pypi/neovim/json')
- if !empty(pypi_info)
- let pypi_data = json_decode(pypi_info)
- let s:pypi_version = get(get(pypi_data, 'info', {}), 'version', 'unable to parse')
- return s:pypi_version
+ let pypi_version = 'unable to get pypi response'
+ let pypi_response = s:download('https://pypi.python.org/pypi/neovim/json')
+ if !empty(pypi_response)
+ try
+ let pypi_data = json_decode(pypi_response)
+ catch /E474/
+ return 'error: '.pypi_response
+ endtry
+ let pypi_version = get(get(pypi_data, 'info', {}), 'version', 'unable to parse')
endif
+ return pypi_version
endfunction
" Get version information using the specified interpreter. The interpreter is
@@ -97,29 +86,34 @@ function! s:version_info(python) abort
let nvim_path = s:trim(system([
\ a:python,
\ '-c',
- \ 'import neovim; print(neovim.__file__)',
- \ '2>/dev/null']))
-
- let nvim_path = s:trim(system([
- \ 'python3',
- \ '-c',
- \ 'import neovim; print(neovim.__file__)'
- \ ]))
- " \ '2>/dev/null']))
+ \ 'import neovim; print(neovim.__file__)']))
+ let nvim_path = v:shell_error ? '' : nvim_path
if empty(nvim_path)
- return [python_version, 'unable to find neovim executable', pypi_version, 'unable to get neovim executable']
+ return [python_version, 'unable to find nvim executable', pypi_version, 'unable to get nvim executable']
endif
- let nvim_version = 'unable to find neovim version'
+ " Assuming that multiple versions of a package are installed, sort them
+ " numerically in descending order.
+ function! s:compare(metapath1, metapath2)
+ let a = matchstr(fnamemodify(a:metapath1, ':p:h:t'), '[0-9.]\+')
+ let b = matchstr(fnamemodify(a:metapath2, ':p:h:t'), '[0-9.]\+')
+ return a == b ? 0 : a > b ? 1 : -1
+ endfunction
+
+ let nvim_version = 'unable to find nvim version'
let base = fnamemodify(nvim_path, ':h')
- for meta in glob(base.'-*/METADATA', 1, 1) + glob(base.'-*/PKG-INFO', 1, 1)
- for meta_line in readfile(meta)
+ let metas = glob(base.'-*/METADATA', 1, 1) + glob(base.'-*/PKG-INFO', 1, 1)
+ let metas = sort(metas, 's:compare')
+
+ if !empty(metas)
+ for meta_line in readfile(metas[0])
if meta_line =~# '^Version:'
let nvim_version = matchstr(meta_line, '^Version: \zs\S\+')
+ break
endif
endfor
- endfor
+ endif
let version_status = 'unknown'
if !s:is_bad_response(nvim_version) && !s:is_bad_response(pypi_version)
@@ -148,7 +142,7 @@ endfunction
function! s:check_python(version) abort
call health#report_start('Python ' . a:version . ' provider')
- let python_bin_name = 'python'.(a:version == 2 ? '2' : '3')
+ let python_bin_name = 'python'.(a:version == 2 ? '' : '3')
let pyenv = resolve(exepath('pyenv'))
let pyenv_root = exists('$PYENV_ROOT') ? resolve($PYENV_ROOT) : 'n'
let venv = exists('$VIRTUAL_ENV') ? resolve($VIRTUAL_ENV) : ''
@@ -329,12 +323,13 @@ function! s:check_python(version) abort
endif
if s:is_bad_response(latest)
- call health#report_warn('Unable to fetch latest Neovim Python client version.')
+ call health#report_warn('Unable to contact PyPI.')
+ call health#report_error('HTTP request failed: '.latest)
endif
if s:is_bad_response(status)
- call health#report_warn('Latest Neovim Python client versions: ('.latest.')')
- else
+ call health#report_warn('Latest Neovim Python client version: ('.latest.')')
+ elseif !s:is_bad_response(latest)
call health#report_ok('Latest Neovim Python client is installed: ('.status.')')
endif
endif
diff --git a/runtime/autoload/remote/host.vim b/runtime/autoload/remote/host.vim
index 110f80297a..1f30b91ab8 100644
--- a/runtime/autoload/remote/host.vim
+++ b/runtime/autoload/remote/host.vim
@@ -191,6 +191,7 @@ function! s:RegistrationCommands(host) abort
let pattern = s:plugin_patterns[a:host]
let paths = globpath(&rtp, 'rplugin/'.a:host.'/'.pattern, 0, 1)
let paths = map(paths, 'tr(v:val,"\\","/")') " Normalize slashes #4795
+ let paths = uniq(sort(paths))
if empty(paths)
return []
endif
@@ -260,11 +261,9 @@ endfunction
function! remote#host#LoadErrorForHost(host, log) abort
return 'Failed to load '. a:host . ' host. '.
- \ 'You can try to see what happened '.
- \ 'by starting Neovim with the environment variable '.
- \ a:log . ' set to a file and opening the generated '.
- \ 'log file. Also, the host stderr is available '.
- \ 'in messages.'
+ \ 'You can try to see what happened by starting nvim with '.
+ \ a:log . ' set and opening the generated log file.'.
+ \ ' Also, the host stderr is available in messages.'
endfunction
diff --git a/runtime/compiler/gcc.vim b/runtime/compiler/gcc.vim
index aee31d92c2..19ea2edc12 100644
--- a/runtime/compiler/gcc.vim
+++ b/runtime/compiler/gcc.vim
@@ -2,6 +2,7 @@
" Compiler: GNU C Compiler
" Maintainer: Nikolai Weibull <now@bitwi.se>
" Latest Revision: 2010-10-14
+" added line suggested by Anton Lindqvist 2016 Mar 31
if exists("current_compiler")
finish
@@ -24,6 +25,7 @@ CompilerSet errorformat=
\%f:%l:\ %trror:\ %m,
\%f:%l:\ %tarning:\ %m,
\%f:%l:\ %m,
+ \%f:\\(%*[^\\)]\\):\ %m,
\\"%f\"\\,\ line\ %l%*\\D%c%*[^\ ]\ %m,
\%D%*\\a[%*\\d]:\ Entering\ directory\ [`']%f',
\%X%*\\a[%*\\d]:\ Leaving\ directory\ [`']%f',
diff --git a/runtime/doc/deprecated.txt b/runtime/doc/deprecated.txt
index d108aca62f..2b69929cfe 100644
--- a/runtime/doc/deprecated.txt
+++ b/runtime/doc/deprecated.txt
@@ -41,3 +41,4 @@ Options ~
*'vi'*
*'viminfo'* Deprecated alias to 'shada' option.
+ vim:tw=78:ts=8:ft=help:norl:
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index df5713c63d..dedbe49605 100644
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -1813,6 +1813,7 @@ buflisted({expr}) Number TRUE if buffer {expr} is listed
bufloaded({expr}) Number TRUE if buffer {expr} is loaded
bufname({expr}) String Name of the buffer {expr}
bufnr({expr} [, {create}]) Number Number of the buffer {expr}
+bufwinid({expr}) Number window ID of buffer {expr}
bufwinnr({expr}) Number window number of buffer {expr}
byte2line({byte}) Number line number at byte count {byte}
byteidx({expr}, {nr}) Number byte index of {nr}'th char in {expr}
@@ -1897,7 +1898,8 @@ getcmdline() String return the current command-line
getcmdpos() Number return cursor position in command-line
getcmdtype() String return current command-line type
getcmdwintype() String return current command-line window type
-getcompletion({pat}, {type}) List list of cmdline completion matches
+getcompletion({pat}, {type} [, {filtered}])
+ List list of cmdline completion matches
getcurpos() List position of the cursor
getcwd([{winnr} [, {tabnr}]]) String the current working directory
getfontname([{name}]) String name of font being used
@@ -2243,6 +2245,7 @@ arglistid([{winnr} [, {tabnr}]])
With {winnr} only use this window in the current tab page.
With {winnr} and {tabnr} use the window in the specified tab
page.
+ {winnr} can be the window number or the window ID.
*argv()*
argv([{nr}]) The result is the {nr}th file in the argument list of the
@@ -2468,6 +2471,16 @@ bufnr({expr} [, {create}])
number necessarily exist, because ":bwipeout" may have removed
them. Use bufexists() to test for the existence of a buffer.
+bufwinid({expr}) *bufwinid()*
+ The result is a Number, which is the window ID of the first
+ window associated with buffer {expr}. For the use of {expr},
+ see |bufname()| above. If buffer {expr} doesn't exist or
+ there is no such window, -1 is returned. Example: >
+
+ echo "A window containing buffer 1 is " . (bufwinid(1))
+<
+ Only deals with the current tab page.
+
bufwinnr({expr}) *bufwinnr()*
The result is a Number, which is the number of the first
window associated with buffer {expr}. For the use of {expr},
@@ -3651,7 +3664,7 @@ getcmdwintype() *getcmdwintype()*
values are the same as |getcmdtype()|. Returns an empty string
when not in the command-line window.
-getcompletion({pat}, {type}) *getcompletion()*
+getcompletion({pat}, {type} [, {filtered}]) *getcompletion()*
Return a list of command-line completion matches. {type}
specifies what for. The following completion types are
supported:
@@ -3691,6 +3704,10 @@ getcompletion({pat}, {type}) *getcompletion()*
Otherwise only items matching {pat} are returned. See
|wildcards| for the use of special characters in {pat}.
+ If the optional {filtered} flag is set to 1, then 'wildignore'
+ is applied to filter the results. Otherwise all the matches
+ are returned. The 'wildignorecase' option always applies.
+
If there are no matches, an empty list is returned. An
invalid value for {type} produces an error.
@@ -3716,6 +3733,7 @@ getcwd([{winnr}[, {tabnr}]]) *getcwd()*
getcwd(0)
getcwd(0, 0)
< If {winnr} is -1 it is ignored, only the tab is resolved.
+ {winnr} can be the window number or the window ID.
getfsize({fname}) *getfsize()*
@@ -3810,7 +3828,9 @@ getline({lnum} [, {end}])
getloclist({nr}) *getloclist()*
Returns a list with all the entries in the location list for
- window {nr}. When {nr} is zero the current window is used.
+ window {nr}. {nr} can be the window number or the window ID.
+ When {nr} is zero the current window is used.
+
For a location list window, the displayed location list is
returned. For an invalid window number {nr}, an empty list is
returned. Otherwise, same as |getqflist()|.
@@ -3938,6 +3958,7 @@ gettabwinvar({tabnr}, {winnr}, {varname} [, {def}]) *gettabwinvar()*
Note that {varname} must be the name without "w:".
Tabs are numbered starting with one. For the current tabpage
use |getwinvar()|.
+ {winnr} can be the window number or the window ID.
When {winnr} is zero the current window is used.
This also works for a global option, buffer-local option and
window-local option, but it doesn't work for a global variable
@@ -4065,7 +4086,8 @@ haslocaldir([{winnr}[, {tabnr}]]) *haslocaldir()*
haslocaldir()
haslocaldir(0)
haslocaldir(0, 0)
-< If {winnr} is -1 it is ignored, only the tab is resolved.
+< {winnr} can be the window number or the window ID.
+ If {winnr} is -1 it is ignored, only the tab is resolved.
hasmapto({what} [, {mode} [, {abbr}]]) *hasmapto()*
The result is a Number, which is 1 if there is a mapping that
@@ -6054,11 +6076,13 @@ setline({lnum}, {text}) *setline()*
setloclist({nr}, {list} [, {action}[, {title}]]) *setloclist()*
Create or replace or add to the location list for window {nr}.
- When {nr} is zero the current window is used. For a location
- list window, the displayed location list is modified. For an
- invalid window number {nr}, -1 is returned. If {title} is
- given, it will be used to set |w:quickfix_title| after opening
- the location window.
+ {nr} can be the window number or the window ID.
+ When {nr} is zero the current window is used.
+
+ For a location list window, the displayed location list is
+ modified. For an invalid window number {nr}, -1 is returned. If
+ {title} is given, it will be used to set |w:quickfix_title|
+ after opening the location window.
Otherwise, same as |setqflist()|.
Also see |location-list|.
@@ -6222,6 +6246,7 @@ settabwinvar({tabnr}, {winnr}, {varname}, {val}) *settabwinvar()*
{val}.
Tabs are numbered starting with one. For the current tabpage
use |setwinvar()|.
+ {winnr} can be the window number or the window ID.
When {winnr} is zero the current window is used.
This also works for a global or local buffer option, but it
doesn't work for a global or local buffer variable.
@@ -7250,9 +7275,11 @@ win_id2win({expr}) *win_id2win()*
*winbufnr()*
winbufnr({nr}) The result is a Number, which is the number of the buffer
- associated with window {nr}. When {nr} is zero, the number of
- the buffer in the current window is returned. When window
- {nr} doesn't exist, -1 is returned.
+ associated with window {nr}. {nr} can be the window number or
+ the window ID.
+ When {nr} is zero, the number of the buffer in the current
+ window is returned.
+ When window {nr} doesn't exist, -1 is returned.
Example: >
:echo "The file in the current window is " . bufname(winbufnr(0))
<
@@ -7263,6 +7290,7 @@ wincol() The result is a Number, which is the virtual column of the
winheight({nr}) *winheight()*
The result is a Number, which is the height of window {nr}.
+ {nr} can be the window number or the window ID.
When {nr} is zero, the height of the current window is
returned. When window {nr} doesn't exist, -1 is returned.
An existing window always has a height of zero or more.
@@ -7342,6 +7370,7 @@ winsaveview() Returns a |Dictionary| that contains information to restore
winwidth({nr}) *winwidth()*
The result is a Number, which is the width of window {nr}.
+ {nr} can be the window number or the window ID.
When {nr} is zero, the width of the current window is
returned. When window {nr} doesn't exist, -1 is returned.
An existing window always has a width of zero or more.
diff --git a/runtime/doc/vim_diff.txt b/runtime/doc/vim_diff.txt
index c505652b1b..249208911b 100644
--- a/runtime/doc/vim_diff.txt
+++ b/runtime/doc/vim_diff.txt
@@ -36,7 +36,9 @@ these differences.
- 'autoindent' is set by default
- 'autoread' is set by default
- 'backspace' defaults to "indent,eol,start"
+- 'backupdir' defaults to .,~/.local/share/nvim/backup (|xdg|)
- 'complete' doesn't include "i"
+- 'directory' defaults to ~/.local/share/nvim/swap// (|xdg|), auto-created
- 'display' defaults to "lastline"
- 'encoding' defaults to "utf-8"
- 'formatoptions' defaults to "tcqj"
@@ -54,6 +56,7 @@ these differences.
- 'tabpagemax' defaults to 50
- 'tags' defaults to "./tags;,tags"
- 'ttyfast' is always set
+- 'undodir' defaults to ~/.local/share/nvim/undo (|xdg|), auto-created
- 'viminfo' includes "!"
- 'wildmenu' is set by default
diff --git a/runtime/indent/html.vim b/runtime/indent/html.vim
index 8aaf82e21f..828bc3120b 100644
--- a/runtime/indent/html.vim
+++ b/runtime/indent/html.vim
@@ -2,7 +2,7 @@
" Header: "{{{
" Maintainer: Bram Moolenaar
" Original Author: Andy Wokula <anwoku@yahoo.de>
-" Last Change: 2015 Sep 25
+" Last Change: 2016 Mar 30
" Version: 1.0
" Description: HTML indent script with cached state for faster indenting on a
" range of lines.
@@ -240,13 +240,13 @@ call s:AddITags(s:indent_tags, [
\ 'sup', 'table', 'textarea', 'title', 'tt', 'u', 'ul', 'var', 'th', 'td',
\ 'tr', 'tbody', 'tfoot', 'thead'])
-" Tags added 2011 Sep 09 (especially HTML5 tags):
+" New HTML5 elements:
call s:AddITags(s:indent_tags, [
\ 'area', 'article', 'aside', 'audio', 'bdi', 'canvas',
- \ 'command', 'datalist', 'details', 'embed', 'figure', 'footer',
- \ 'header', 'group', 'keygen', 'mark', 'math', 'meter', 'nav', 'output',
- \ 'progress', 'ruby', 'section', 'svg', 'texture', 'time', 'video',
- \ 'wbr', 'text'])
+ \ 'command', 'data', 'datalist', 'details', 'embed', 'figcaption',
+ \ 'figure', 'footer', 'header', 'keygen', 'mark', 'meter', 'nav', 'output',
+ \ 'progress', 'rp', 'rt', 'ruby', 'section', 'source', 'summary', 'svg',
+ \ 'time', 'track', 'video', 'wbr'])
" Tags added for web components:
call s:AddITags(s:indent_tags, [
diff --git a/runtime/optwin.vim b/runtime/optwin.vim
index 890c183a5a..3d585267d7 100644
--- a/runtime/optwin.vim
+++ b/runtime/optwin.vim
@@ -1,7 +1,7 @@
" These commands create the option window.
"
" Maintainer: Bram Moolenaar <Bram@vim.org>
-" Last Change: 2016 Mar 19
+" Last Change: 2016 Apr 21
" If there already is an option window, jump to that one.
if bufwinnr("option-window") > 0
@@ -710,6 +710,10 @@ call <SID>Header("editing text")
call append("$", "undolevels\tmaximum number of changes that can be undone")
call append("$", "\t(global or local to buffer)")
call append("$", " \tset ul=" . &ul)
+call append("$", "undofile\tautomatically save and restore undo history")
+call <SID>BinOptionG("udf", &udf)
+call append("$", "undodir\tlist of directories for undo files")
+call <SID>OptionG("udir", &udir)
call append("$", "undoreload\tmaximum number lines to save for undo on a buffer reload")
call append("$", " \tset ur=" . &ur)
call append("$", "modified\tchanges have been made and not written to a file")
@@ -1032,10 +1036,6 @@ if has("vertsplit")
call append("$", "cmdwinheight\theight of the command-line window")
call <SID>OptionG("cwh", &cwh)
endif
-call append("$", "undofile\tautomatically save and restore undo history")
-call <SID>BinOptionG("udf", &udf)
-call append("$", "undodir\tlist of directories for undo files")
-call <SID>OptionG("udir", &udir)
call <SID>Header("executing external commands")
diff --git a/runtime/synmenu.vim b/runtime/synmenu.vim
index 76f60131f2..01dad3c7f2 100644
--- a/runtime/synmenu.vim
+++ b/runtime/synmenu.vim
@@ -61,6 +61,7 @@ an 50.10.320 &Syntax.AB.Ascii\ Doc :cal SetSyn("asciidoc")<CR>
an 50.10.330 &Syntax.AB.ASP\ with\ VBScript :cal SetSyn("aspvbs")<CR>
an 50.10.340 &Syntax.AB.ASP\ with\ Perl :cal SetSyn("aspperl")<CR>
an 50.10.350 &Syntax.AB.Assembly.680x0 :cal SetSyn("asm68k")<CR>
+an 50.10.355 &Syntax.AB.Assembly.AVR :cal SetSyn("avra")<CR>
an 50.10.360 &Syntax.AB.Assembly.Flat :cal SetSyn("fasm")<CR>
an 50.10.370 &Syntax.AB.Assembly.GNU :cal SetSyn("asm")<CR>
an 50.10.380 &Syntax.AB.Assembly.GNU\ H-8300 :cal SetSyn("asmh8300")<CR>
diff --git a/runtime/syntax/avra.vim b/runtime/syntax/avra.vim
new file mode 100644
index 0000000000..ebf0aaff11
--- /dev/null
+++ b/runtime/syntax/avra.vim
@@ -0,0 +1,73 @@
+" Vim syntax file
+" Language: AVR Assembler (AVRA)
+" AVRA Home: http://avra.sourceforge.net/index.html
+" AVRA Version: 1.3.0
+" Maintainer: Marius Ghita <mhitza@gmail.com>
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal iskeyword=a-z,A-Z,48-57,.,_
+" 'isident' is a global option, better not set it
+" setlocal isident=a-z,A-Z,48-57,.,_
+syn case ignore
+
+syn keyword avraRegister r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14
+syn keyword avraRegister r15 r16 r17 r18 r19 r20 r21 r22 r23 r24 r25 r26 r27
+syn keyword avraRegister r28 r29 r30 r31
+
+syn keyword avraInstr add adc adiw sub subi sbc sbci sbiw and andi or ori eor
+syn keyword avraInstr com neg sbr cbr inc dec tst clr ser mul muls mulsu fmul
+syn keyword avraInstr fmuls fmulsu des rjmp ijmp eijmp jmp rcall icall eicall
+syn keyword avraInstr call ret reti cpse cp cpc cpi sbrc sbrs sbic sbis brbs
+syn keyword avraInstr brbc breq brne brcs brcc brsh brlo brmi brpl brge brlt
+syn keyword avraInstr brhs brhc brts brtc brvs brvc brie brid mov movw ldi lds
+syn keyword avraInstr ld ldd sts st std lpm elpm spm in out push pop xch las
+syn keyword avraInstr lac lat lsl lsr rol ror asr swap bset bclr sbi cbi bst bld
+syn keyword avraInstr sec clc sen cln sez clz sei cli ses cls sev clv set clt
+syn keyword avraInstr seh clh break nop sleep wdr
+
+syn keyword avraDirective .byte .cseg .db .def .device .dseg .dw .endmacro .equ
+syn keyword avraDirective .eseg .exit .include .list .listmac .macro .nolist
+syn keyword avraDirective .org .set .define .undef .ifdef .ifndef .if .else
+syn keyword avraDirective .elif .elseif .warning
+
+syn keyword avraOperator low high byte2 byte3 byte4 lwrd hwrd page exp2 log2
+
+syn match avraNumericOperator "[-*/+]"
+syn match avraUnaryOperator "!"
+syn match avraBinaryOperator "<<\|>>\|<\|<=\|>\|>=\|==\|!="
+syn match avraBitwiseOperator "[~&^|]\|&&\|||"
+
+syn match avraBinaryNumber "\<0[bB][0-1]*\>"
+syn match avraHexNumber "\<0[xX][0-9a-fA-F]\+\>"
+syn match avraDecNumber "\<\(0\|[1-9]\d*\)\>"
+
+syn region avraComment start=";" end="$"
+syn region avraString start="\"" end="\"\|$"
+
+syn match avraLabel "^\s*[^; \t]\+:"
+
+hi def link avraBinaryNumber avraNumber
+hi def link avraHexNumber avraNumber
+hi def link avraDecNumber avraNumber
+
+hi def link avraNumericOperator avraOperator
+hi def link avraUnaryOperator avraOperator
+hi def link avraBinaryOperator avraOperator
+hi def link avraBitwiseOperator avraOperator
+
+
+hi def link avraOperator operator
+hi def link avraComment comment
+hi def link avraDirective preproc
+hi def link avraRegister type
+hi def link avraNumber constant
+hi def link avraString String
+hi def link avraInstr keyword
+hi def link avraLabel label
+
+let b:current_syntax = "avra"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/desktop.vim b/runtime/syntax/desktop.vim
index 5b71e51192..27dac5c8ee 100644
--- a/runtime/syntax/desktop.vim
+++ b/runtime/syntax/desktop.vim
@@ -3,7 +3,8 @@
" according to freedesktop.org specification 0.9.4
" http://pdx.freedesktop.org/Standards/desktop-entry-spec/desktop-entry-spec-0.9.4.html
" Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl )
-" Last Change: 2004 May 16
+" Last Change: 2016 Apr 02
+" (added "Keywords")
" Version Info: desktop.vim 0.9.4-1.2
" For version 5.x: Clear all syntax items
@@ -53,8 +54,8 @@ syn keyword dtBooleanKey StartupNotify ReadOnly Terminal Hidden NoDisplay nextgr
syn keyword dtBooleanValue true false containedin=dtBoolean contained
" String
-syn match dtString /^\s*\<\(Encoding\|Icon\|Path\|Actions\|FSType\|MountPoint\|UnmountIcon\|URL\|Categories\|OnlyShowIn\|NotShowIn\|StartupWMClass\|FilePattern\|MimeType\)\>.*/ contains=dtStringKey,dtDelim transparent
-syn keyword dtStringKey Type Encoding TryExec Exec Path Actions FSType MountPoint URL Categories OnlyShowIn NotShowIn StartupWMClass FilePattern MimeType nextgroup=dtDelim containedin=dtString contained
+syn match dtString /^\s*\<\(Encoding\|Icon\|Path\|Actions\|FSType\|MountPoint\|UnmountIcon\|URL\|Keywords\|Categories\|OnlyShowIn\|NotShowIn\|StartupWMClass\|FilePattern\|MimeType\)\>.*/ contains=dtStringKey,dtDelim transparent
+syn keyword dtStringKey Type Encoding TryExec Exec Path Actions FSType MountPoint URL Keywords Categories OnlyShowIn NotShowIn StartupWMClass FilePattern MimeType nextgroup=dtDelim containedin=dtString contained
" Exec
syn match dtExec /^\s*\<\(Exec\|TryExec\|SwallowExec\)\>.*/ contains=dtExecKey,dtDelim,dtExecParam transparent
diff --git a/runtime/syntax/diff.vim b/runtime/syntax/diff.vim
index 885feaebdd..b656cd97a6 100644
--- a/runtime/syntax/diff.vim
+++ b/runtime/syntax/diff.vim
@@ -2,7 +2,7 @@
" Language: Diff (context or unified)
" Maintainer: Bram Moolenaar <Bram@vim.org>
" Translations by Jakson Alves de Aquino.
-" Last Change: 2015 Feb 03
+" Last Change: 2016 Apr 02
" Quit when a (custom) syntax file was already loaded
if exists("b:current_syntax")
@@ -342,7 +342,7 @@ syn match diffLine "^\<\d\+\>.*"
syn match diffLine "^\*\*\*\*.*"
syn match diffLine "^---$"
-"Some versions of diff have lines like "#c#" and "#d#" (where # is a number)
+" Some versions of diff have lines like "#c#" and "#d#" (where # is a number)
syn match diffLine "^\d\+\(,\d\+\)\=[cda]\d\+\>.*"
syn match diffFile "^diff\>.*"
@@ -352,12 +352,16 @@ syn match diffFile "^==== .*"
syn match diffOldFile "^\*\*\* .*"
syn match diffNewFile "^--- .*"
+" Used by git
+syn match diffIndexLine "^index \x\x\x\x.*"
+
syn match diffComment "^#.*"
" Define the default highlighting.
" Only used when an item doesn't have highlighting yet
hi def link diffOldFile diffFile
hi def link diffNewFile diffFile
+hi def link diffIndexLine PreProc
hi def link diffFile Type
hi def link diffOnly Constant
hi def link diffIdentical Constant
diff --git a/runtime/syntax/help.vim b/runtime/syntax/help.vim
index d133c6a804..b3c7f2a63e 100644
--- a/runtime/syntax/help.vim
+++ b/runtime/syntax/help.vim
@@ -1,7 +1,7 @@
" Vim syntax file
" Language: Vim help file
" Maintainer: Bram Moolenaar (Bram@vim.org)
-" Last Change: 2014 Feb 12
+" Last Change: 2016 Apr 01
" Quit when a (custom) syntax file was already loaded
if exists("b:current_syntax")
@@ -41,6 +41,7 @@ syn match helpVim "NVIM REFERENCE.*"
syn match helpOption "'[a-z]\{2,\}'"
syn match helpOption "'t_..'"
syn match helpCommand "`[^` \t]\+`"hs=s+1,he=e-1 contains=helpBacktick
+syn match helpCommand "\(^\|[^a-z"[]\)\zs`[^`]\+`\ze\([^a-z\t."']\|$\)"hs=s+1,he=e-1 contains=helpBacktick
syn match helpHeader "\s*\zs.\{-}\ze\s\=\~$" nextgroup=helpIgnore
syn match helpGraphic ".* \ze`$" nextgroup=helpIgnore
if has("conceal")
diff --git a/runtime/syntax/sshconfig.vim b/runtime/syntax/sshconfig.vim
index 44b3c67a96..bd9f0a3c28 100644
--- a/runtime/syntax/sshconfig.vim
+++ b/runtime/syntax/sshconfig.vim
@@ -4,8 +4,8 @@
" Maintainer: Dominik Fischer <d dot f dot fischer at web dot de>
" Contributor: Leonard Ehrenfried <leonard.ehrenfried@web.de>
" Contributor: Karsten Hopp <karsten@redhat.com>
-" Last Change: 2016 Mar 1
-" SSH Version: 7.2
+" Last Change: 2016 Apr 7
+" SSH Version: 7.2p2
"
" Setup
@@ -36,7 +36,7 @@ syn keyword sshconfigTodo TODO FIXME NOTE contained
" Constants
-syn keyword sshconfigYesNo yes no ask
+syn keyword sshconfigYesNo yes no ask confirm
syn keyword sshconfigYesNo any auto
syn keyword sshconfigYesNo force autoask none
@@ -139,6 +139,7 @@ syn keyword sshconfigHostSect Host
syn keyword sshconfigMatch canonical exec host originalhost user localuser all
syn keyword sshconfigKeyword AddressFamily
+syn keyword sshconfigKeyword AddKeysToAgent
syn keyword sshconfigKeyword BatchMode
syn keyword sshconfigKeyword BindAddress
syn keyword sshconfigKeyword CanonicalDomains
diff --git a/runtime/syntax/vim.vim b/runtime/syntax/vim.vim
index c855267137..d056e5b7bf 100644
--- a/runtime/syntax/vim.vim
+++ b/runtime/syntax/vim.vim
@@ -1,8 +1,8 @@
" Vim syntax file
" Language: Vim 7.4 script
" Maintainer: Charles E. Campbell <NdrOchipS@PcampbellAfamily.Mbiz>
-" Last Change: Apr 02, 2015
-" Version: 7.4-33
+" Last Change: March 29, 2016
+" Version: 7.4-45
" Automatically generated keyword lists: {{{1
" Quit when a syntax file was already loaded {{{2
@@ -58,6 +58,59 @@ syn keyword nvimHLGroup contained EndOfBuffer TermCursor TermCursorNC QuickFixLi
syn case match
" Special Vim Highlighting (not automatic) {{{1
+" Set up folding commands
+if exists("g:vimsyn_folding") && g:vimsyn_folding =~# '[aflmpPrt]'
+ if g:vimsyn_folding =~# 'a'
+ com! -nargs=* VimFolda <args> fold
+ else
+ com! -nargs=* VimFolda <args>
+ endif
+ if g:vimsyn_folding =~# 'f'
+ com! -nargs=* VimFoldf <args> fold
+ else
+ com! -nargs=* VimFoldf <args>
+ endif
+ if g:vimsyn_folding =~# 'l'
+ com! -nargs=* VimFoldl <args> fold
+ else
+ com! -nargs=* VimFoldl <args>
+ endif
+ if g:vimsyn_folding =~# 'm'
+ com! -nargs=* VimFoldm <args> fold
+ else
+ com! -nargs=* VimFoldm <args>
+ endif
+ if g:vimsyn_folding =~# 'p'
+ com! -nargs=* VimFoldp <args> fold
+ else
+ com! -nargs=* VimFoldp <args>
+ endif
+ if g:vimsyn_folding =~# 'P'
+ com! -nargs=* VimFoldP <args> fold
+ else
+ com! -nargs=* VimFoldP <args>
+ endif
+ if g:vimsyn_folding =~# 'r'
+ com! -nargs=* VimFoldr <args> fold
+ else
+ com! -nargs=* VimFoldr <args>
+ endif
+ if g:vimsyn_folding =~# 't'
+ com! -nargs=* VimFoldt <args> fold
+ else
+ com! -nargs=* VimFoldt <args>
+ endif
+else
+ com! -nargs=* VimFolda <args>
+ com! -nargs=* VimFoldf <args>
+ com! -nargs=* VimFoldl <args>
+ com! -nargs=* VimFoldm <args>
+ com! -nargs=* VimFoldp <args>
+ com! -nargs=* VimFoldP <args>
+ com! -nargs=* VimFoldr <args>
+ com! -nargs=* VimFoldt <args>
+endif
+
" commands not picked up by the generator (due to non-standard format)
syn keyword vimCommand contained py3
@@ -80,8 +133,8 @@ syn match vimNumber "\<0[xX]\x\+"
syn match vimNumber "\%(^\|[^a-zA-Z]\)\zs#\x\{6}"
" All vimCommands are contained by vimIsCommands. {{{2
-syn match vimCmdSep "[:|]\+" skipwhite nextgroup=vimAddress,vimAutoCmd,vimCommand,vimIsCommand,vimExtCmd,vimFilter,vimLet,vimMap,vimMark,vimSet,vimSyntax,vimUserCmd,vimOnlyCommand
-syn match vimIsCommand "\<\h\w*\>" contains=vimCommand,vimOnlyCommand
+syn match vimCmdSep "[:|]\+" skipwhite nextgroup=vimAddress,vimAutoCmd,vimIsCommand,vimExtCmd,vimFilter,vimLet,vimMap,vimMark,vimSet,vimSyntax,vimUserCmd
+syn match vimIsCommand "\<\h\w*\>" contains=vimCommand
syn match vimVar contained "\<\h[a-zA-Z0-9#_]*\>"
syn match vimVar "\<[bwglsav]:\h[a-zA-Z0-9#_]*\>"
syn match vimFBVar contained "\<[bwglsav]:\h[a-zA-Z0-9#_]*\>"
@@ -113,7 +166,7 @@ syn keyword vimFTOption contained detect indent off on plugin
" Augroup : vimAugroupError removed because long augroups caused sync'ing problems. {{{2
" ======= : Trade-off: Increasing synclines with slower editing vs augroup END error checking.
syn cluster vimAugroupList contains=vimAugroup,vimIsCommand,vimCommand,vimUserCmd,vimExecute,vimNotFunc,vimFuncName,vimFunction,vimFunctionError,vimLineComment,vimMap,vimSpecFile,vimOper,vimNumber,vimOperParen,vimComment,vimString,vimSubst,vimMark,vimRegister,vimAddress,vimFilter,vimCmplxRepeat,vimComment,vimLet,vimSet,vimAutoCmd,vimRegion,vimSynLine,vimNotation,vimCtrlChar,vimFuncVar,vimContinue
-if exists("g:vimsyn_folding") && g:vimsyn_folding =~ 'a'
+if exists("g:vimsyn_folding") && g:vimsyn_folding =~# 'a'
syn region vimAugroup fold matchgroup=vimAugroupKey start="\<aug\%[roup]\>\ze\s\+\K\k*" end="\<aug\%[roup]\>\ze\s\+[eE][nN][dD]\>" contains=vimAutoCmd,@vimAugroupList
else
syn region vimAugroup matchgroup=vimAugroupKey start="\<aug\%[roup]\>\ze\s\+\K\k*" end="\<aug\%[roup]\>\ze\s\+[eE][nN][dD]\>" contains=vimAutoCmd,@vimAugroupList
@@ -130,7 +183,7 @@ syn cluster vimOperGroup contains=vimEnvvar,vimFunc,vimFuncVar,vimOper,vimOperPa
syn match vimOper "\(==\|!=\|>=\|<=\|=\~\|!\~\|>\|<\|=\)[?#]\{0,2}" skipwhite nextgroup=vimString,vimSpecFile
syn match vimOper "||\|&&\|[-+.]" skipwhite nextgroup=vimString,vimSpecFile
syn region vimOperParen matchgroup=vimParenSep start="(" end=")" contains=@vimOperGroup
-syn region vimOperParen matchgroup=vimSep start="{" end="}" contains=@vimOperGroup nextgroup=vimVar,vimFuncVar
+syn region vimOperParen matchgroup=vimSep start="{" end="}" contains=@vimOperGroup nextgroup=vimVar,vimFuncVar
if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_noopererror")
syn match vimOperError ")"
endif
@@ -141,7 +194,7 @@ syn cluster vimFuncList contains=vimCommand,vimFunctionError,vimFuncKey,Tag,vimF
syn cluster vimFuncBodyList contains=vimAbb,vimAddress,vimAugroupKey,vimAutoCmd,vimCmplxRepeat,vimComment,vimComment,vimContinue,vimCtrlChar,vimEcho,vimEchoHL,vimExecute,vimIf,vimIsCommand,vimFBVar,vimFunc,vimFunction,vimFuncVar,vimGlobal,vimHighlight,vimIsCommand,vimLet,vimLineComment,vimMap,vimMark,vimNorm,vimNotation,vimNotFunc,vimNumber,vimOper,vimOperParen,vimRegion,vimRegister,vimSet,vimSpecFile,vimString,vimSubst,vimSynLine,vimUnmap,vimUserCommand,nvimUnmap,nvimMap
syn match vimFunction "\<fu\%[nction]!\=\s\+\%(<[sS][iI][dD]>\|[sSgGbBwWtTlL]:\)\=\%(\i\|[#.]\|{.\{-1,}}\)*\ze\s*(" contains=@vimFuncList nextgroup=vimFuncBody
-if exists("g:vimsyn_folding") && g:vimsyn_folding =~ 'f'
+if exists("g:vimsyn_folding") && g:vimsyn_folding =~# 'f'
syn region vimFuncBody contained fold start="\ze\s*(" matchgroup=vimCommand end="\<\(endf\>\|endfu\%[nction]\>\)" contains=@vimFuncBodyList
else
syn region vimFuncBody contained start="\ze\s*(" matchgroup=vimCommand end="\<\(endf\>\|endfu\%[nction]\>\)" contains=@vimFuncBodyList
@@ -225,7 +278,7 @@ syn cluster vimSubstList contains=vimPatSep,vimPatRegion,vimPatSepErr,vimSubstTw
syn cluster vimSubstRepList contains=vimSubstSubstr,vimSubstTwoBS,vimNotation
syn cluster vimSubstList add=vimCollection
syn match vimSubst "\(:\+\s*\|^\s*\||\s*\)\<\%(s\%[ubstitute]\|sm\%[agic]\|sno\%[magic]\)[:[:alpha:]]\@!" nextgroup=vimSubstPat
-syn match vimSubst "s\%[ubstitute][:#[:alpha:]]\@!" nextgroup=vimSubstPat contained
+syn match vimSubst "\%(^\|[^\\]\)s\%[ubstitute][:#[:alpha:]]\@!" nextgroup=vimSubstPat contained
syn match vimSubst "/\zss\%[ubstitute]\ze/" nextgroup=vimSubstPat
syn match vimSubst1 contained "s\%[ubstitute]\>" nextgroup=vimSubstPat
syn region vimSubstPat contained matchgroup=vimSubstDelim start="\z([^a-zA-Z( \t[\]&]\)"rs=s+1 skip="\\\\\|\\\z1" end="\z1"re=e-1,me=e-1 contains=@vimSubstList nextgroup=vimSubstRep4 oneline
@@ -267,7 +320,7 @@ syn match vimCmplxRepeat '[^a-zA-Z_/\\()]q[0-9a-zA-Z"]\>'lc=1
syn match vimCmplxRepeat '@[0-9a-z".=@:]\ze\($\|[^a-zA-Z]\>\)'
" Set command and associated set-options (vimOptions) with comment {{{2
-syn region vimSet matchgroup=vimCommand start="\<\%(setl\%[ocal]\|setg\%[lobal]\|se\%[t]\)\>" skip="\%(\\\\\)*\\." end="$" matchgroup=vimNotation end="<[cC][rR]>" keepend oneline contains=vimSetEqual,vimOption,vimErrSetting,vimComment,vimSetString,vimSetMod,vimTermOption,vimOnlyOption
+syn region vimSet matchgroup=vimCommand start="\<\%(setl\%[ocal]\|setg\%[lobal]\|se\%[t]\)\>" skip="\%(\\\\\)*\\." end="$" matchgroup=vimNotation end="<[cC][rR]>" keepend oneline contains=vimSetEqual,vimOption,vimErrSetting,vimComment,vimSetString,vimSetMod
syn region vimSetEqual contained start="[=:]\|[-+^]=" skip="\\\\\|\\\s" end="[| \t]\|$"me=e-1 contains=vimCtrlChar,vimSetSep,vimNotation,vimEnvvar oneline
syn region vimSetString contained start=+="+hs=s+1 skip=+\\\\\|\\"+ end=+"+ contains=vimCtrlChar
syn match vimSetSep contained "[,:]" skipwhite nextgroup=vimCommand
@@ -341,8 +394,8 @@ syn case match
" User Function Highlighting {{{2
" (following Gautam Iyer's suggestion)
" ==========================
-syn match vimFunc "\%(\%([sSgGbBwWtTlL]:\|<[sS][iI][dD]>\)\=\%([a-zA-Z0-9_.]\+\.\)*\I[a-zA-Z0-9_.]*\)\ze\s*(" contains=vimFuncName,vimUserFunc,vimExecute
-syn match vimUserFunc contained "\%(\%([sSgGbBwWtTlL]:\|<[sS][iI][dD]>\)\=\%([a-zA-Z0-9_.]\+\.\)*\I[a-zA-Z0-9_.]*\)\|\<\u[a-zA-Z0-9.]*\>\|\<if\>" contains=vimNotation
+syn match vimFunc "\%(\%([sSgGbBwWtTlL]:\|<[sS][iI][dD]>\)\=\%([a-zA-Z0-9_]\+\.\)*\I[a-zA-Z0-9_.]*\)\ze\s*(" contains=vimFuncName,vimUserFunc,vimExecute
+syn match vimUserFunc contained "\%(\%([sSgGbBwWtTlL]:\|<[sS][iI][dD]>\)\=\%([a-zA-Z0-9_]\+\.\)*\I[a-zA-Z0-9_.]*\)\|\<\u[a-zA-Z0-9.]*\>\|\<if\>" contains=vimNotation
syn match vimNotFunc "\<if\>\|\<el\%[seif]\>\|\<return\>\|\<while\>"
" Errors And Warnings: {{{2
@@ -388,11 +441,16 @@ syn keyword vimSynType contained clear skipwhite nextgroup=vimGroupList
" Syntax: cluster {{{2
syn keyword vimSynType contained cluster skipwhite nextgroup=vimClusterName
-syn region vimClusterName contained matchgroup=vimGroupName start="\k\+" skip="\\\\\|\\|" matchgroup=vimSep end="$\||" contains=vimGroupAdd,vimGroupRem,vimSynContains,vimSynError
+syn region vimClusterName contained matchgroup=vimGroupName start="\h\w*" skip="\\\\\|\\|" matchgroup=vimSep end="$\||" contains=vimGroupAdd,vimGroupRem,vimSynContains,vimSynError
syn match vimGroupAdd contained "add=" nextgroup=vimGroupList
syn match vimGroupRem contained "remove=" nextgroup=vimGroupList
syn cluster vimFuncBodyList add=vimSynType,vimGroupAdd,vimGroupRem
+" Syntax: iskeyword {{{2
+syn keyword vimSynType contained iskeyword skipwhite nextgroup=vimIskList
+syn match vimIskList contained '\S\+' contains=vimIskSep
+syn match vimIskSep contained ','
+
" Syntax: include {{{2
syn keyword vimSynType contained include skipwhite nextgroup=vimGroupList
syn cluster vimFuncBodyList add=vimSynType
@@ -400,14 +458,14 @@ syn cluster vimFuncBodyList add=vimSynType
" Syntax: keyword {{{2
syn cluster vimSynKeyGroup contains=vimSynNextgroup,vimSynKeyOpt,vimSynKeyContainedin
syn keyword vimSynType contained keyword skipwhite nextgroup=vimSynKeyRegion
-syn region vimSynKeyRegion contained oneline keepend matchgroup=vimGroupName start="\k\+" skip="\\\\\|\\|" matchgroup=vimSep end="|\|$" contains=@vimSynKeyGroup
+syn region vimSynKeyRegion contained oneline keepend matchgroup=vimGroupName start="\h\w*" skip="\\\\\|\\|" matchgroup=vimSep end="|\|$" contains=@vimSynKeyGroup
syn match vimSynKeyOpt contained "\<\(conceal\|contained\|transparent\|skipempty\|skipwhite\|skipnl\)\>"
syn cluster vimFuncBodyList add=vimSynType
" Syntax: match {{{2
syn cluster vimSynMtchGroup contains=vimMtchComment,vimSynContains,vimSynError,vimSynMtchOpt,vimSynNextgroup,vimSynRegPat,vimNotation
syn keyword vimSynType contained match skipwhite nextgroup=vimSynMatchRegion
-syn region vimSynMatchRegion contained keepend matchgroup=vimGroupName start="\k\+" matchgroup=vimSep end="|\|$" contains=@vimSynMtchGroup
+syn region vimSynMatchRegion contained keepend matchgroup=vimGroupName start="\h\w*" matchgroup=vimSep end="|\|$" contains=@vimSynMtchGroup
syn match vimSynMtchOpt contained "\<\(conceal\|transparent\|contained\|excludenl\|skipempty\|skipwhite\|display\|extend\|skipnl\|fold\)\>"
if has("conceal")
syn match vimSynMtchOpt contained "\<cchar=" nextgroup=vimSynMtchCchar
@@ -422,7 +480,7 @@ syn keyword vimSynType contained enable list manual off on reset
syn cluster vimSynRegPatGroup contains=vimPatSep,vimNotPatSep,vimSynPatRange,vimSynNotPatRange,vimSubstSubstr,vimPatRegion,vimPatSepErr,vimNotation
syn cluster vimSynRegGroup contains=vimSynContains,vimSynNextgroup,vimSynRegOpt,vimSynReg,vimSynMtchGrp
syn keyword vimSynType contained region skipwhite nextgroup=vimSynRegion
-syn region vimSynRegion contained keepend matchgroup=vimGroupName start="\k\+" skip="\\\\\|\\|" end="|\|$" contains=@vimSynRegGroup
+syn region vimSynRegion contained keepend matchgroup=vimGroupName start="\h\w*" skip="\\\\\|\\|" end="|\|$" contains=@vimSynRegGroup
syn match vimSynRegOpt contained "\<\(conceal\(ends\)\=\|transparent\|contained\|excludenl\|skipempty\|skipwhite\|display\|keepend\|oneline\|extend\|skipnl\|fold\)\>"
syn match vimSynReg contained "\(start\|skip\|end\)="he=e-1 nextgroup=vimSynRegPat
syn match vimSynMtchGrp contained "matchgroup=" nextgroup=vimGroup,vimHLGroup,vimOnlyHLGroup,nvimHLGroup
@@ -448,9 +506,9 @@ syn keyword vimSyncRegion contained region skipwhite nextgroup=vimSynReg
syn match vimSyncLinebreak contained "\<linebreaks=" skipwhite nextgroup=vimNumber
syn keyword vimSyncLinecont contained linecont skipwhite nextgroup=vimSynRegPat
syn match vimSyncLines contained "\(min\|max\)\=lines=" nextgroup=vimNumber
-syn match vimSyncGroupName contained "\k\+" skipwhite nextgroup=vimSyncKey
+syn match vimSyncGroupName contained "\h\w*" skipwhite nextgroup=vimSyncKey
syn match vimSyncKey contained "\<groupthere\|grouphere\>" skipwhite nextgroup=vimSyncGroup
-syn match vimSyncGroup contained "\k\+" skipwhite nextgroup=vimSynRegPat,vimSyncNone
+syn match vimSyncGroup contained "\h\w*" skipwhite nextgroup=vimSynRegPat,vimSyncNone
syn keyword vimSyncNone contained NONE
" Additional IsCommand, here by reasons of precedence {{{2
@@ -531,9 +589,14 @@ syn region vimGlobal matchgroup=Statement start='\<v\%[global]!\=/' skip='\\.' e
" Allows users to specify the type of embedded script highlighting
" they want: (perl/python/ruby/tcl support)
" g:vimsyn_embed == 0 : don't embed any scripts
-" g:vimsyn_embed ~= 'P' : embed python (but only if vim supports it)
+" g:vimsyn_embed =~# 'l' : embed lua (but only if vim supports it)
+" g:vimsyn_embed =~# 'm' : embed mzscheme (but only if vim supports it)
+" g:vimsyn_embed =~# 'p' : embed perl (but only if vim supports it)
+" g:vimsyn_embed =~# 'P' : embed python (but only if vim supports it)
+" g:vimsyn_embed =~# 'r' : embed ruby (but only if vim supports it)
+" g:vimsyn_embed =~# 't' : embed tcl (but only if vim supports it)
if !exists("g:vimsyn_embed")
- let g:vimsyn_embed= "P"
+ let g:vimsyn_embed= "lmpPr"
endif
" [-- lua --] {{{3
@@ -546,9 +609,16 @@ if !filereadable(s:luapath)
endif
endfor
endif
-
-syn region vimEmbedError start=+lua\s*<<\s*\z(.*\)$+ end=+^\z1$+
-syn region vimEmbedError start=+lua\s*<<\s*$+ end=+\.$+
+if (g:vimsyn_embed =~# 'l' && has("lua")) && filereadable(s:luapath)
+ unlet! b:current_syntax
+ exe "syn include @vimLuaScript ".s:luapath
+ VimFoldl syn region vimLuaRegion matchgroup=vimScriptDelim start=+lua\s*<<\s*\z(.*\)$+ end=+^\z1$+ contains=@vimLuaScript
+ VimFoldl syn region vimLuaRegion matchgroup=vimScriptDelim start=+lua\s*<<\s*$+ end=+\.$+ contains=@vimLuaScript
+ syn cluster vimFuncBodyList add=vimLuaRegion
+else
+ syn region vimEmbedError start=+lua\s*<<\s*\z(.*\)$+ end=+^\z1$+
+ syn region vimEmbedError start=+lua\s*<<\s*$+ end=+\.$+
+endif
unlet s:luapath
" [-- perl --] {{{3
@@ -561,9 +631,16 @@ if !filereadable(s:perlpath)
endif
endfor
endif
-
-syn region vimEmbedError start=+pe\%[rl]\s*<<\s*\z(.*\)$+ end=+^\z1$+
-syn region vimEmbedError start=+pe\%[rl]\s*<<\s*$+ end=+\.$+
+if (g:vimsyn_embed =~# 'p' && has("perl")) && filereadable(s:perlpath)
+ unlet! b:current_syntax
+ exe "syn include @vimPerlScript ".s:perlpath
+ VimFoldp syn region vimPerlRegion matchgroup=vimScriptDelim start=+pe\%[rl]\s*<<\s*\z(.*\)$+ end=+^\z1$+ contains=@vimPerlScript
+ VimFoldp syn region vimPerlRegion matchgroup=vimScriptDelim start=+pe\%[rl]\s*<<\s*$+ end=+\.$+ contains=@vimPerlScript
+ syn cluster vimFuncBodyList add=vimPerlRegion
+else
+ syn region vimEmbedError start=+pe\%[rl]\s*<<\s*\z(.*\)$+ end=+^\z1$+
+ syn region vimEmbedError start=+pe\%[rl]\s*<<\s*$+ end=+\.$+
+endif
unlet s:perlpath
" [-- ruby --] {{{3
@@ -576,9 +653,16 @@ if !filereadable(s:rubypath)
endif
endfor
endif
-
-syn region vimEmbedError start=+rub[y]\s*<<\s*\z(.*\)$+ end=+^\z1$+
-syn region vimEmbedError start=+rub[y]\s*<<\s*$+ end=+\.$+
+if (g:vimsyn_embed =~# 'r' && has("ruby")) && filereadable(s:rubypath)
+ unlet! b:current_syntax
+ exe "syn include @vimRubyScript ".s:rubypath
+ VimFoldr syn region vimRubyRegion matchgroup=vimScriptDelim start=+rub[y]\s*<<\s*\z(.*\)$+ end=+^\z1$+ contains=@vimRubyScript
+ syn region vimRubyRegion matchgroup=vimScriptDelim start=+rub[y]\s*<<\s*$+ end=+\.$+ contains=@vimRubyScript
+ syn cluster vimFuncBodyList add=vimRubyRegion
+else
+ syn region vimEmbedError start=+rub[y]\s*<<\s*\z(.*\)$+ end=+^\z1$+
+ syn region vimEmbedError start=+rub[y]\s*<<\s*$+ end=+\.$+
+endif
unlet s:rubypath
" [-- python --] {{{3
@@ -591,16 +675,13 @@ if !filereadable(s:pythonpath)
endif
endfor
endif
-if g:vimsyn_embed =~ 'P' && filereadable(s:pythonpath)
+if g:vimsyn_embed =~# 'P' && (has("python") || has("python3")) && filereadable(s:pythonpath)
unlet! b:current_syntax
exe "syn include @vimPythonScript ".s:pythonpath
- if exists("g:vimsyn_folding") && g:vimsyn_folding =~ 'P'
- syn region vimPythonRegion fold matchgroup=vimScriptDelim start=+py\%[thon]3\=\s*<<\s*\z(.*\)$+ end=+^\z1$+ contains=@vimPythonScript
- syn region vimPythonRegion fold matchgroup=vimScriptDelim start=+py\%[thon]3\=\s*<<\s*$+ end=+\.$+ contains=@vimPythonScript
- else
- syn region vimPythonRegion matchgroup=vimScriptDelim start=+py\%[thon]3\=\s*<<\s*\z(.*\)$+ end=+^\z1$+ contains=@vimPythonScript
- syn region vimPythonRegion matchgroup=vimScriptDelim start=+py\%[thon]3\=\s*<<\s*$+ end=+\.$+ contains=@vimPythonScript
- endif
+ VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+py\%[thon]3\=\s*<<\s*\z(.*\)$+ end=+^\z1$+ contains=@vimPythonScript
+ VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+py\%[thon]3\=\s*<<\s*$+ end=+\.$+ contains=@vimPythonScript
+ VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+Py\%[thon]2or3\s*<<\s*\z(.*\)$+ end=+^\z1$+ contains=@vimPythonScript
+ VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+Py\%[thon]2or3\=\s*<<\s*$+ end=+\.$+ contains=@vimPythonScript
syn cluster vimFuncBodyList add=vimPythonRegion
else
syn region vimEmbedError start=+py\%[thon]3\=\s*<<\s*\z(.*\)$+ end=+^\z1$+
@@ -625,11 +706,17 @@ if s:trytcl
endif
endfor
endif
-
- syn region vimEmbedError start=+tc[l]\=\s*<<\s*\z(.*\)$+ end=+^\z1$+
- syn region vimEmbedError start=+tc[l]\=\s*<<\s*$+ end=+\.$+
+ if (g:vimsyn_embed =~# 't' && has("tcl")) && filereadable(s:tclpath)
+ unlet! b:current_syntax
+ exe "syn include @vimTclScript ".s:tclpath
+ VimFoldt syn region vimTclRegion matchgroup=vimScriptDelim start=+tc[l]\=\s*<<\s*\z(.*\)$+ end=+^\z1$+ contains=@vimTclScript
+ VimFoldt syn region vimTclRegion matchgroup=vimScriptDelim start=+tc[l]\=\s*<<\s*$+ end=+\.$+ contains=@vimTclScript
+ syn cluster vimFuncBodyList add=vimTclScript
+ else
+ syn region vimEmbedError start=+tc[l]\=\s*<<\s*\z(.*\)$+ end=+^\z1$+
+ syn region vimEmbedError start=+tc[l]\=\s*<<\s*$+ end=+\.$+
+ endif
unlet s:tclpath
-
else
syn region vimEmbedError start=+tc[l]\=\s*<<\s*\z(.*\)$+ end=+^\z1$+
syn region vimEmbedError start=+tc[l]\=\s*<<\s*$+ end=+\.$+
@@ -646,9 +733,18 @@ if !filereadable(s:mzschemepath)
endif
endfor
endif
-
-syn region vimEmbedError start=+mz\%[scheme]\s*<<\s*\z(.*\)$+ end=+^\z1$+
-syn region vimEmbedError start=+mz\%[scheme]\s*<<\s*$+ end=+\.$+
+if (g:vimsyn_embed =~# 'm' && has("mzscheme")) && filereadable(s:mzschemepath)
+ unlet! b:current_syntax
+ let iskKeep= &isk
+ exe "syn include @vimMzSchemeScript ".s:mzschemepath
+ let &isk= iskKeep
+ VimFoldm syn region vimMzSchemeRegion matchgroup=vimScriptDelim start=+mz\%[scheme]\s*<<\s*\z(.*\)$+ end=+^\z1$+ contains=@vimMzSchemeScript
+ VimFoldm syn region vimMzSchemeRegion matchgroup=vimScriptDelim start=+mz\%[scheme]\s*<<\s*$+ end=+\.$+ contains=@vimMzSchemeScript
+ syn cluster vimFuncBodyList add=vimMzSchemeRegion
+else
+ syn region vimEmbedError start=+mz\%[scheme]\s*<<\s*\z(.*\)$+ end=+^\z1$+
+ syn region vimEmbedError start=+mz\%[scheme]\s*<<\s*$+ end=+\.$+
+endif
unlet s:mzschemepath
" Synchronize (speed) {{{2
@@ -668,7 +764,6 @@ syn sync match vimAugroupSyncA groupthere NONE "\<aug\%[roup]\>\s\+[eE][nN][dD]"
" Highlighting Settings {{{2
" ====================
-
if !exists("g:vimsyn_noerror")
hi def link vimBehaveError vimError
hi def link vimCollClassErr vimError
@@ -685,14 +780,11 @@ if !exists("g:vimsyn_noerror")
hi def link vimSubstFlagErr vimError
hi def link vimSynCaseError vimError
hi def link vimBufnrWarn vimWarn
- hi def link vimOnlyCommand vimError
- hi def link vimTermOption vimError
- hi def link vimOnlyOption vimError
- hi def link vimOnlyHLGroup vimError
endif
hi def link vimAbb vimCommand
hi def link vimAddress vimMark
+hi def link vimAugroupError vimError
hi def link vimAugroupKey vimCommand
hi def link vimAuHighlight vimHighlight
hi def link vimAutoCmdOpt vimOption
@@ -748,6 +840,7 @@ hi def link vimHLGroup vimGroup
hi def link nvimHLGroup vimHLGroup
hi def link vimHLMod PreProc
hi def link vimInsert vimString
+hi def link vimIskSep Delimiter
hi def link vimKeyCode vimSpecFile
hi def link vimKeyword Statement
hi def link vimLet vimCommand
@@ -830,6 +923,7 @@ hi def link vimUserAttrbCmpltFunc Special
hi def link vimUserAttrbCmplt vimSpecial
hi def link vimUserAttrbKey vimOption
hi def link vimUserAttrb vimSpecial
+hi def link vimUserAttrbError Error
hi def link vimUserCmdError Error
hi def link vimUserCommand vimCommand
hi def link vimUserFunc Normal
@@ -841,6 +935,14 @@ let b:current_syntax = "vim"
" ---------------------------------------------------------------------
" Cleanup: {{{1
+delc VimFolda
+delc VimFoldf
+delc VimFoldl
+delc VimFoldm
+delc VimFoldp
+delc VimFoldP
+delc VimFoldr
+delc VimFoldt
let &cpo = s:keepcpo
unlet s:keepcpo
" vim:ts=18 fdm=marker
diff --git a/runtime/vimrc_example.vim b/runtime/vimrc_example.vim
index c53dde8ceb..17cba123a8 100644
--- a/runtime/vimrc_example.vim
+++ b/runtime/vimrc_example.vim
@@ -19,6 +19,12 @@ inoremap <C-U> <C-G>u<C-U>
" Switch syntax highlighting on
syntax on
+" Also switch on highlighting the last used search pattern.
+set hlsearch
+
+" I like highlighting strings inside C comments.
+let c_comment_strings=1
+
" Enable file type detection.
" Use the default filetype settings, so that mail gets 'textwidth' set to 72,
" 'cindent' is on in C files, etc.
diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt
index 59582d0734..cbea6a05c9 100644
--- a/src/nvim/CMakeLists.txt
+++ b/src/nvim/CMakeLists.txt
@@ -156,7 +156,7 @@ foreach(sfile ${NEOVIM_SOURCES}
${GENERATED_API_DISPATCH})
get_filename_component(full_d ${sfile} PATH)
file(RELATIVE_PATH d "${PROJECT_SOURCE_DIR}/src/nvim" "${full_d}")
- if(${d} MATCHES "^[.][.]")
+ if(${d} MATCHES "^([.][.]|auto/)")
file(RELATIVE_PATH d "${GENERATED_DIR}" "${full_d}")
endif()
get_filename_component(f ${sfile} NAME)
diff --git a/src/nvim/api/private/helpers.c b/src/nvim/api/private/helpers.c
index fc114bae16..d80ee7dc67 100644
--- a/src/nvim/api/private/helpers.c
+++ b/src/nvim/api/private/helpers.c
@@ -368,11 +368,10 @@ static inline void typval_encode_list_start(EncodedData *const edata,
const size_t len)
FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_NONNULL_ALL
{
- const Object obj = OBJECT_INIT;
kv_push(edata->stack, ARRAY_OBJ(((Array) {
.capacity = len,
.size = 0,
- .items = xmalloc(len * sizeof(*obj.data.array.items)),
+ .items = xmalloc(len * sizeof(*((Object *)NULL)->data.array.items)),
})));
}
@@ -409,11 +408,10 @@ static inline void typval_encode_dict_start(EncodedData *const edata,
const size_t len)
FUNC_ATTR_ALWAYS_INLINE FUNC_ATTR_NONNULL_ALL
{
- const Object obj = OBJECT_INIT;
kv_push(edata->stack, DICTIONARY_OBJ(((Dictionary) {
.capacity = len,
.size = 0,
- .items = xmalloc(len * sizeof(*obj.data.dictionary.items)),
+ .items = xmalloc(len * sizeof(*((Object *)NULL)->data.dictionary.items)),
})));
}
diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c
index b42ad1c18a..5fb011885e 100644
--- a/src/nvim/buffer.c
+++ b/src/nvim/buffer.c
@@ -276,30 +276,25 @@ bool buf_valid(buf_T *buf)
return false;
}
-/*
- * Close the link to a buffer.
- * "action" is used when there is no longer a window for the buffer.
- * It can be:
- * 0 buffer becomes hidden
- * DOBUF_UNLOAD buffer is unloaded
- * DOBUF_DELETE buffer is unloaded and removed from buffer list
- * DOBUF_WIPE buffer is unloaded and really deleted
- * When doing all but the first one on the current buffer, the caller should
- * get a new buffer very soon!
- *
- * The 'bufhidden' option can force freeing and deleting.
- *
- * When "abort_if_last" is TRUE then do not close the buffer if autocommands
- * cause there to be only one window with this buffer. e.g. when ":quit" is
- * supposed to close the window but autocommands close all other windows.
- */
-void
-close_buffer (
- win_T *win, /* if not NULL, set b_last_cursor */
- buf_T *buf,
- int action,
- int abort_if_last
-)
+/// Close the link to a buffer.
+///
+/// @param win If not NULL, set b_last_cursor.
+/// @param buf
+/// @param action Used when there is no longer a window for the buffer.
+/// Possible values:
+/// 0 buffer becomes hidden
+/// DOBUF_UNLOAD buffer is unloaded
+/// DOBUF_DELETE buffer is unloaded and removed from buffer list
+/// DOBUF_WIPE buffer is unloaded and really deleted
+/// When doing all but the first one on the current buffer, the
+/// caller should get a new buffer very soon!
+/// The 'bufhidden' option can force freeing and deleting.
+/// @param abort_if_last
+/// If TRUE, do not close the buffer if autocommands cause
+/// there to be only one window with this buffer. e.g. when
+/// ":quit" is supposed to close the window but autocommands
+/// close all other windows.
+void close_buffer(win_T *win, buf_T *buf, int action, int abort_if_last)
{
bool unload_buf = (action != 0);
bool del_buf = (action == DOBUF_DEL || action == DOBUF_WIPE);
diff --git a/src/nvim/edit.c b/src/nvim/edit.c
index 892748ff5c..51c9fb1556 100644
--- a/src/nvim/edit.c
+++ b/src/nvim/edit.c
@@ -1286,10 +1286,9 @@ bool edit(int cmdchar, bool startln, long count)
{
if (curbuf->terminal) {
if (ex_normal_busy) {
- // don't enter terminal mode from `ex_normal`, which can result in all
- // kinds of havoc(such as terminal mode recursiveness). Instead, set a
- // flag that allow us to force-set the value of `restart_edit` before
- // `ex_normal` returns
+ // Do not enter terminal mode from ex_normal(), which would cause havoc
+ // (such as terminal-mode recursiveness). Instead set a flag to force-set
+ // the value of `restart_edit` before `ex_normal` returns.
restart_edit = 'i';
force_restart_edit = true;
} else {
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index 0b1fd6670e..dce2f32707 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -405,7 +405,7 @@ typedef struct {
LibuvProcess uv;
PtyProcess pty;
} proc;
- Stream in, out, err;
+ Stream in, out, err; // Initialized in common_job_start().
Terminal *term;
bool stopped;
bool exited;
@@ -6709,7 +6709,6 @@ static int get_env_tv(char_u **arg, typval_T *rettv, int evaluate)
# include "funcs.generated.h"
#endif
-
/*
* Function given to ExpandGeneric() to obtain the list of internal
* or user defined function names.
@@ -7712,26 +7711,47 @@ static void f_bufnr(typval_T *argvars, typval_T *rettv, FunPtr fptr)
rettv->vval.v_number = -1;
}
-/*
- * "bufwinnr(nr)" function
- */
-static void f_bufwinnr(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+static void buf_win_common(typval_T *argvars, typval_T *rettv, bool get_nr)
{
- (void)get_tv_number(&argvars[0]); /* issue errmsg if type error */
- ++emsg_off;
+ int error = false;
+ (void)get_tv_number_chk(&argvars[0], &error); // issue errmsg if type error
+ if (error) { // the argument has an invalid type
+ rettv->vval.v_number = -1;
+ return;
+ }
+
+ emsg_off++;
+ buf_T *buf = get_buf_tv(&argvars[0], true);
+ if (buf == NULL) { // no need to search if buffer was not found
+ rettv->vval.v_number = -1;
+ goto end;
+ }
- buf_T *buf = get_buf_tv(&argvars[0], TRUE);
int winnr = 0;
+ int winid;
bool found_buf = false;
FOR_ALL_WINDOWS_IN_TAB(wp, curtab) {
- ++winnr;
+ winnr++;
if (wp->w_buffer == buf) {
found_buf = true;
+ winid = wp->handle;
break;
}
}
- rettv->vval.v_number = (found_buf ? winnr : -1);
- --emsg_off;
+ rettv->vval.v_number = (found_buf ? (get_nr ? winnr : winid) : -1);
+end:
+ emsg_off--;
+}
+
+/// "bufwinid(nr)" function
+static void f_bufwinid(typval_T *argvars, typval_T *rettv, FunPtr fptr) {
+ buf_win_common(argvars, rettv, false);
+}
+
+/// "bufwinnr(nr)" function
+static void f_bufwinnr(typval_T *argvars, typval_T *rettv, FunPtr fptr)
+{
+ buf_win_common(argvars, rettv, true);
}
/*
@@ -9507,24 +9527,35 @@ static void f_getchar(typval_T *argvars, typval_T *rettv, FunPtr fptr)
varnumber_T n;
int error = FALSE;
- /* Position the cursor. Needed after a message that ends in a space. */
- ui_cursor_goto(msg_row, msg_col);
-
++no_mapping;
++allow_keys;
for (;; ) {
- if (argvars[0].v_type == VAR_UNKNOWN)
- /* getchar(): blocking wait. */
+ // Position the cursor. Needed after a message that ends in a space,
+ // or if event processing caused a redraw.
+ ui_cursor_goto(msg_row, msg_col);
+
+ if (argvars[0].v_type == VAR_UNKNOWN) {
+ // getchar(): blocking wait.
+ if (!(char_avail() || using_script() || input_available())) {
+ input_enable_events();
+ (void)os_inchar(NULL, 0, -1, 0);
+ input_disable_events();
+ if (!multiqueue_empty(main_loop.events)) {
+ multiqueue_process_events(main_loop.events);
+ continue;
+ }
+ }
n = safe_vgetc();
- else if (get_tv_number_chk(&argvars[0], &error) == 1)
- /* getchar(1): only check if char avail */
+ } else if (get_tv_number_chk(&argvars[0], &error) == 1) {
+ // getchar(1): only check if char avail
n = vpeekc_any();
- else if (error || vpeekc_any() == NUL)
- /* illegal argument or getchar(0) and no char avail: return zero */
+ } else if (error || vpeekc_any() == NUL) {
+ // illegal argument or getchar(0) and no char avail: return zero
n = 0;
- else
- /* getchar(0) and char avail: return char */
+ } else {
+ // getchar(0) and char avail: return char
n = safe_vgetc();
+ }
if (n == K_IGNORE)
continue;
@@ -9648,13 +9679,23 @@ static void f_getcompletion(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{
char_u *pat;
expand_T xpc;
+ bool filtered = false;
int options = WILD_SILENT | WILD_USE_NL | WILD_ADD_SLASH
| WILD_NO_BEEP;
+ if (argvars[2].v_type != VAR_UNKNOWN) {
+ filtered = get_tv_number_chk(&argvars[2], NULL);
+ }
+
if (p_wic) {
options |= WILD_ICASE;
}
+ // For filtered results, 'wildignore' is used
+ if (!filtered) {
+ options |= WILD_KEEP_ALL;
+ }
+
ExpandInit(&xpc);
xpc.xp_pattern = get_tv_string(&argvars[0]);
xpc.xp_pattern_len = STRLEN(xpc.xp_pattern);
@@ -9673,6 +9714,16 @@ static void f_getcompletion(typval_T *argvars, typval_T *rettv, FunPtr fptr)
xpc.xp_pattern_len = STRLEN(xpc.xp_pattern);
}
+ if (xpc.xp_context == EXPAND_CSCOPE) {
+ set_context_in_cscope_cmd(&xpc, xpc.xp_pattern, CMD_cscope);
+ xpc.xp_pattern_len = STRLEN(xpc.xp_pattern);
+ }
+
+ if (xpc.xp_context == EXPAND_SIGN) {
+ set_context_in_sign_cmd(&xpc, xpc.xp_pattern);
+ xpc.xp_pattern_len = STRLEN(xpc.xp_pattern);
+ }
+
pat = addstar(xpc.xp_pattern, xpc.xp_pattern_len, xpc.xp_context);
rettv_list_alloc(rettv);
if (pat != NULL) {
@@ -10259,7 +10310,11 @@ find_win_by_nr (
}
FOR_ALL_WINDOWS_IN_TAB(wp, tp) {
- if (--nr <= 0) {
+ if (nr >= LOWEST_WIN_ID) {
+ if (wp->handle == nr) {
+ return wp;
+ }
+ } else if (--nr <= 0) {
return wp;
}
}
@@ -21739,7 +21794,7 @@ static inline TerminalJobData *common_job_init(char **argv,
if (!pty) {
proc->err = &data->err;
}
- proc->cb = on_process_exit;
+ proc->cb = eval_job_process_exit_cb;
proc->events = data->events;
proc->detach = detach;
proc->cwd = cwd;
@@ -21923,7 +21978,7 @@ static void on_job_output(Stream *stream, TerminalJobData *data, RBuffer *buf,
rbuffer_consumed(buf, count);
}
-static void on_process_exit(Process *proc, int status, void *d)
+static void eval_job_process_exit_cb(Process *proc, int status, void *d)
{
TerminalJobData *data = d;
if (data->term && !data->exited) {
@@ -21947,9 +22002,15 @@ static void on_process_exit(Process *proc, int status, void *d)
static void term_write(char *buf, size_t size, void *d)
{
- TerminalJobData *data = d;
+ TerminalJobData *job = d;
+ if (job->in.closed) {
+ // If the backing stream was closed abruptly, there may be write events
+ // ahead of the terminal close event. Just ignore the writes.
+ ILOG("write failed: stream is closed");
+ return;
+ }
WBuffer *wbuf = wstream_new_buffer(xmemdup(buf, size), size, 1, xfree);
- wstream_write(&data->in, wbuf);
+ wstream_write(&job->in, wbuf);
}
static void term_resize(uint16_t width, uint16_t height, void *d)
diff --git a/src/nvim/eval.lua b/src/nvim/eval.lua
index 3c371fc264..eaaee81533 100644
--- a/src/nvim/eval.lua
+++ b/src/nvim/eval.lua
@@ -45,6 +45,7 @@ return {
bufloaded={args=1},
bufname={args=1},
bufnr={args={1, 2}},
+ bufwinid={args=1},
bufwinnr={args=1},
byte2line={args=1},
byteidx={args=2},
@@ -114,7 +115,7 @@ return {
getcmdpos={},
getcmdtype={},
getcmdwintype={},
- getcompletion={args=2},
+ getcompletion={args={2, 3}},
getcurpos={},
getcwd={args={0,2}},
getfontname={args={0, 1}},
diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c
index 0226499e78..6205daf0cb 100644
--- a/src/nvim/ex_cmds.c
+++ b/src/nvim/ex_cmds.c
@@ -2116,6 +2116,14 @@ do_ecmd (
}
}
+ // Re-editing a terminal buffer: skip most buffer re-initialization.
+ if (!other_file && curbuf->terminal) {
+ check_arg_idx(curwin); // Needed when called from do_argfile().
+ maketitle(); // Title may show the arg index, e.g. "(2 of 5)".
+ retval = OK;
+ goto theend;
+ }
+
/*
* if the file was changed we may not be allowed to abandon it
* - if we are going to re-edit the same file
diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c
index 45407b7f12..9f83688e1e 100644
--- a/src/nvim/ex_docmd.c
+++ b/src/nvim/ex_docmd.c
@@ -6726,11 +6726,6 @@ do_exedit (
old_curwin == NULL ? curwin : NULL);
} else if ((eap->cmdidx != CMD_split && eap->cmdidx != CMD_vsplit)
|| *eap->arg != NUL) {
- // ":edit <blank>" is a no-op in terminal buffers. #2822
- if (curbuf->terminal != NULL && eap->cmdidx == CMD_edit && *eap->arg == NUL) {
- return;
- }
-
/* Can't edit another file when "curbuf_lock" is set. Only ":edit"
* can bring us here, others are stopped earlier. */
if (*eap->arg != NUL && curbuf_locked())
@@ -7921,9 +7916,8 @@ static void ex_normal(exarg_T *eap)
if (force_restart_edit) {
force_restart_edit = false;
} else {
- // some function called was aware of ex_normal and decided to override the
- // value of restart_edit anyway. So far only used in terminal mode(see
- // terminal_enter() in edit.c)
+ // Some function (terminal_enter()) was aware of ex_normal and decided to
+ // override the value of restart_edit anyway.
restart_edit = save_restart_edit;
}
p_im = save_insertmode;
diff --git a/src/nvim/ex_eval.h b/src/nvim/ex_eval.h
index 30871c7711..f61e01d25b 100644
--- a/src/nvim/ex_eval.h
+++ b/src/nvim/ex_eval.h
@@ -23,19 +23,19 @@ struct eslist_elem {
#define CSTACK_LEN 50
struct condstack {
- short cs_flags[CSTACK_LEN]; /* CSF_ flags */
- char cs_pending[CSTACK_LEN]; /* CSTP_: what's pending in ":finally"*/
+ int cs_flags[CSTACK_LEN]; // CSF_ flags
+ char cs_pending[CSTACK_LEN]; // CSTP_: what's pending in ":finally"
union {
- void *csp_rv[CSTACK_LEN]; /* return typeval for pending return */
- void *csp_ex[CSTACK_LEN]; /* exception for pending throw */
+ void *csp_rv[CSTACK_LEN]; // return typeval for pending return
+ void *csp_ex[CSTACK_LEN]; // exception for pending throw
} cs_pend;
- void *cs_forinfo[CSTACK_LEN]; /* info used by ":for" */
- int cs_line[CSTACK_LEN]; /* line nr of ":while"/":for" line */
- int cs_idx; /* current entry, or -1 if none */
- int cs_looplevel; /* nr of nested ":while"s and ":for"s */
- int cs_trylevel; /* nr of nested ":try"s */
- eslist_T *cs_emsg_silent_list; /* saved values of "emsg_silent" */
- char cs_lflags; /* loop flags: CSL_ flags */
+ void *cs_forinfo[CSTACK_LEN]; // info used by ":for"
+ int cs_line[CSTACK_LEN]; // line nr of ":while"/":for" line
+ int cs_idx; // current entry, or -1 if none
+ int cs_looplevel; // nr of nested ":while"s and ":for"s
+ int cs_trylevel; // nr of nested ":try"s
+ eslist_T *cs_emsg_silent_list; // saved values of "emsg_silent"
+ int cs_lflags; // loop flags: CSL_ flags
};
# define cs_rettv cs_pend.csp_rv
# define cs_exception cs_pend.csp_ex
diff --git a/src/nvim/hardcopy.c b/src/nvim/hardcopy.c
index 7d4bfd0290..6acf7f395a 100644
--- a/src/nvim/hardcopy.c
+++ b/src/nvim/hardcopy.c
@@ -2105,7 +2105,7 @@ int mch_print_init(prt_settings_T *psettings, char_u *jobname, int forceit)
props = enc_canon_props(p_encoding);
if (!(props & ENC_8BIT) && ((*p_pmcs != NUL) || !(props & ENC_UNICODE))) {
p_mbenc_first = NULL;
- int effective_cmap;
+ int effective_cmap = 0;
for (cmap = 0; cmap < (int)ARRAY_SIZE(prt_ps_mbfonts); cmap++)
if (prt_match_encoding((char *)p_encoding, &prt_ps_mbfonts[cmap],
&p_mbenc)) {
diff --git a/src/nvim/if_cscope.c b/src/nvim/if_cscope.c
index 3ed85677fc..0b20647771 100644
--- a/src/nvim/if_cscope.c
+++ b/src/nvim/if_cscope.c
@@ -1761,8 +1761,8 @@ static void cs_print_tags_priv(char **matches, char **cntxts,
*/
static int cs_read_prompt(size_t i)
{
- char ch;
- char *buf = NULL; /* buffer for possible error message from cscope */
+ int ch;
+ char *buf = NULL; // buffer for possible error message from cscope
size_t bufpos = 0;
char *cs_emsg = _("E609: Cscope error: %s");
size_t cs_emsg_len = strlen(cs_emsg);
@@ -1774,35 +1774,34 @@ static int cs_read_prompt(size_t i)
size_t maxlen = IOSIZE - cs_emsg_len;
for (;; ) {
- while ((ch = (char)getc(csinfo[i].fr_fp)) != EOF && ch != CSCOPE_PROMPT[0])
- /* if there is room and char is printable */
+ while ((ch = getc(csinfo[i].fr_fp)) != EOF && ch != CSCOPE_PROMPT[0]) {
+ // if there is room and char is printable
if (bufpos < maxlen - 1 && vim_isprintc(ch)) {
// lazy buffer allocation
if (buf == NULL) {
buf = xmalloc(maxlen);
}
- {
- /* append character to the message */
- buf[bufpos++] = ch;
- buf[bufpos] = NUL;
- if (bufpos >= epromptlen
- && strcmp(&buf[bufpos - epromptlen], eprompt) == 0) {
- /* remove eprompt from buf */
- buf[bufpos - epromptlen] = NUL;
-
- /* print message to user */
- (void)EMSG2(cs_emsg, buf);
+ // append character to the message
+ buf[bufpos++] = (char)ch;
+ buf[bufpos] = NUL;
+ if (bufpos >= epromptlen
+ && strcmp(&buf[bufpos - epromptlen], eprompt) == 0) {
+ // remove eprompt from buf
+ buf[bufpos - epromptlen] = NUL;
+
+ // print message to user
+ (void)EMSG2(cs_emsg, buf);
- /* send RETURN to cscope */
- (void)putc('\n', csinfo[i].to_fp);
- (void)fflush(csinfo[i].to_fp);
+ // send RETURN to cscope
+ (void)putc('\n', csinfo[i].to_fp);
+ (void)fflush(csinfo[i].to_fp);
- /* clear buf */
- bufpos = 0;
- buf[bufpos] = NUL;
- }
+ // clear buf
+ bufpos = 0;
+ buf[bufpos] = NUL;
}
}
+ }
for (size_t n = 0; n < strlen(CSCOPE_PROMPT); ++n) {
if (n > 0)
diff --git a/src/nvim/main.c b/src/nvim/main.c
index 005f4dcc77..eb67483d08 100644
--- a/src/nvim/main.c
+++ b/src/nvim/main.c
@@ -270,11 +270,6 @@ int main(int argc, char **argv)
setbuf(stdout, NULL);
- /* This message comes before term inits, but after setting "silent_mode"
- * when the input is not a tty. */
- if (GARGCOUNT > 1 && !silent_mode)
- printf(_("%d files to edit\n"), GARGCOUNT);
-
full_screen = true;
check_tty(&params);
@@ -320,14 +315,18 @@ int main(int argc, char **argv)
// open terminals when opening files that start with term://
#define PROTO "term://"
+ do_cmdline_cmd("augroup nvim_terminal");
+ do_cmdline_cmd("autocmd!");
do_cmdline_cmd("autocmd BufReadCmd " PROTO "* nested "
- ":call termopen( "
+ ":if !exists('b:term_title')|call termopen( "
// Capture the command string
"matchstr(expand(\"<amatch>\"), "
"'\\c\\m" PROTO "\\%(.\\{-}//\\%(\\d\\+:\\)\\?\\)\\?\\zs.*'), "
// capture the working directory
"{'cwd': get(matchlist(expand(\"<amatch>\"), "
- "'\\c\\m" PROTO "\\(.\\{-}\\)//'), 1, '')})");
+ "'\\c\\m" PROTO "\\(.\\{-}\\)//'), 1, '')})"
+ "|endif");
+ do_cmdline_cmd("augroup END");
#undef PROTO
/* Execute --cmd arguments. */
diff --git a/src/nvim/mbyte.c b/src/nvim/mbyte.c
index c08b9e8fcf..e6312f9c00 100644
--- a/src/nvim/mbyte.c
+++ b/src/nvim/mbyte.c
@@ -1724,7 +1724,7 @@ int utf_class(int c)
return 2;
}
-int utf_ambiguous_width(int c)
+bool utf_ambiguous_width(int c)
{
return c >= 0x80 && (intable(ambiguous, ARRAY_SIZE(ambiguous), c)
|| intable(emoji_all, ARRAY_SIZE(emoji_all), c));
diff --git a/src/nvim/path.c b/src/nvim/path.c
index a79b7139f1..6149e1ab99 100644
--- a/src/nvim/path.c
+++ b/src/nvim/path.c
@@ -903,17 +903,30 @@ static void uniquefy_paths(garray_T *gap, char_u *pattern)
/* Shorten the filename while maintaining its uniqueness */
path_cutoff = get_path_cutoff(path, &path_ga);
- /* we start at the end of the path */
- pathsep_p = path + len - 1;
-
- while (find_previous_pathsep(path, &pathsep_p))
- if (vim_regexec(&regmatch, pathsep_p + 1, (colnr_T)0)
- && is_unique(pathsep_p + 1, gap, i)
- && path_cutoff != NULL && pathsep_p + 1 >= path_cutoff) {
- sort_again = true;
- memmove(path, pathsep_p + 1, STRLEN(pathsep_p));
- break;
+ // Don't assume all files can be reached without path when search
+ // pattern starts with **/, so only remove path_cutoff
+ // when possible.
+ if (pattern[0] == '*' && pattern[1] == '*'
+ && vim_ispathsep_nocolon(pattern[2])
+ && path_cutoff != NULL
+ && vim_regexec(&regmatch, path_cutoff, (colnr_T)0)
+ && is_unique(path_cutoff, gap, i)) {
+ sort_again = true;
+ memmove(path, path_cutoff, STRLEN(path_cutoff) + 1);
+ } else {
+ // Here all files can be reached without path, so get shortest
+ // unique path. We start at the end of the path. */
+ pathsep_p = path + len - 1;
+ while (find_previous_pathsep(path, &pathsep_p)) {
+ if (vim_regexec(&regmatch, pathsep_p + 1, (colnr_T)0)
+ && is_unique(pathsep_p + 1, gap, i)
+ && path_cutoff != NULL && pathsep_p + 1 >= path_cutoff) {
+ sort_again = true;
+ memmove(path, pathsep_p + 1, STRLEN(pathsep_p));
+ break;
+ }
}
+ }
if (path_is_absolute_path(path)) {
/*
diff --git a/src/nvim/po/eo.po b/src/nvim/po/eo.po
index 153eacc7b8..8a3cd50406 100644
--- a/src/nvim/po/eo.po
+++ b/src/nvim/po/eo.po
@@ -23,8 +23,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Vim(Esperanto)\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2016-02-13 23:42+0100\n"
-"PO-Revision-Date: 2016-02-13 23:45+0100\n"
+"POT-Creation-Date: 2016-03-29 23:03+0200\n"
+"PO-Revision-Date: 2016-03-29 23:05+0200\n"
"Last-Translator: Dominique PELLÉ <dominique.pelle@gmail.com>\n"
"Language-Team: \n"
"Language: eo\n"
@@ -1346,7 +1346,6 @@ msgstr "E670: Miksaĵo de kodoprezento de helpa dosiero en lingvo: %s"
msgid "E154: Duplicate tag \"%s\" in file %s/%s"
msgstr "E154: Ripetita etikedo \"%s\" en dosiero %s/%s"
-#: ../ex_cmds.c:5687
#, c-format
msgid "E160: Unknown sign command: %s"
msgstr "E160: Nekonata simbola komando: %s"
@@ -1482,8 +1481,8 @@ msgstr "Serĉado de \"%s\""
#: ../ex_cmds2.c:2307
#, c-format
-msgid "not found in 'runtimepath': \"%s\""
-msgstr "ne trovita en 'runtimepath': \"%s\""
+msgid "not found in '%s': \"%s\""
+msgstr "ne trovita en '%s: \"%s\""
#: ../ex_cmds2.c:2472
#, c-format
@@ -6686,6 +6685,12 @@ msgstr "E446: Neniu dosiernomo sub la kursoro"
#~ msgid "E232: Cannot create BalloonEval with both message and callback"
#~ msgstr "E232: Ne eblas krei BalloonEval kun ambaŭ mesaĝo kaj reagfunkcio"
+msgid "Yes"
+msgstr "Jes"
+
+msgid "No"
+msgstr "Ne"
+
# todo '_' is for hotkey, i guess?
#~ msgid "Input _Methods"
#~ msgstr "Enigaj _metodoj"
diff --git a/src/nvim/po/fr.po b/src/nvim/po/fr.po
index a16a939117..cd9f5a7eb2 100644
--- a/src/nvim/po/fr.po
+++ b/src/nvim/po/fr.po
@@ -645,7 +645,7 @@ msgstr "E708: [:] ne peut tre spcifi qu'en dernier"
#: ../eval.c:2439
msgid "E709: [:] requires a List value"
-msgstr "E709: [:] requiert une Liste"
+msgstr "E709: [:] n?cessite une Liste"
#: ../eval.c:2674
msgid "E710: List value has more items than target"
@@ -1639,8 +1639,8 @@ msgstr "Recherche de \"%s\""
#: ../ex_cmds2.c:2307
#, c-format
-msgid "not found in 'runtimepath': \"%s\""
-msgstr "introuvable dans 'runtimepath' : \"%s\""
+msgid "not found in '%s': \"%s\""
+msgstr "introuvable dans '%s' : \"%s\""
#: ../ex_cmds2.c:2472
#, c-format
@@ -6877,6 +6877,12 @@ msgstr "E446: Aucun nom de fichier sous le curseur"
#~ msgid "E232: Cannot create BalloonEval with both message and callback"
#~ msgstr "E232: Impossible de crer un BalloonEval avec message ET callback"
+msgid "Yes"
+msgstr "Oui"
+
+msgid "No"
+msgstr "Non"
+
# todo '_' is for hotkey, i guess?
#~ msgid "Input _Methods"
#~ msgstr "_Mthodes de saisie"
diff --git a/src/nvim/terminal.c b/src/nvim/terminal.c
index 8401343d7a..499716a7a8 100644
--- a/src/nvim/terminal.c
+++ b/src/nvim/terminal.c
@@ -366,10 +366,10 @@ void terminal_resize(Terminal *term, uint16_t width, uint16_t height)
void terminal_enter(void)
{
buf_T *buf = curbuf;
+ assert(buf->terminal); // Should only be called when curbuf has a terminal.
TerminalState state, *s = &state;
memset(s, 0, sizeof(TerminalState));
s->term = buf->terminal;
- assert(s->term && "should only be called when curbuf has a terminal");
// Ensure the terminal is properly sized.
terminal_resize(s->term, 0, 0);
diff --git a/src/nvim/testdir/test_alot.vim b/src/nvim/testdir/test_alot.vim
index 0a4aa1dc50..7169b6076f 100644
--- a/src/nvim/testdir/test_alot.vim
+++ b/src/nvim/testdir/test_alot.vim
@@ -3,6 +3,7 @@
source test_assign.vim
source test_cursor_func.vim
+source test_ex_undo.vim
source test_feedkeys.vim
source test_cmdline.vim
source test_menu.vim
diff --git a/src/nvim/testdir/test_cmdline.vim b/src/nvim/testdir/test_cmdline.vim
index 902ec1c05d..21bb057fe1 100644
--- a/src/nvim/testdir/test_cmdline.vim
+++ b/src/nvim/testdir/test_cmdline.vim
@@ -89,6 +89,10 @@ func Test_getcompletion()
call assert_true(index(l, 'runtest.vim') >= 0)
let l = getcompletion('walk', 'file')
call assert_equal([], l)
+ set wildignore=*.vim
+ let l = getcompletion('run', 'file', 1)
+ call assert_true(index(l, 'runtest.vim') < 0)
+ set wildignore&
let l = getcompletion('ha', 'filetype')
call assert_true(index(l, 'hamster') >= 0)
@@ -121,12 +125,35 @@ func Test_getcompletion()
let l = getcompletion('dark', 'highlight')
call assert_equal([], l)
+ if has('cscope')
+ let l = getcompletion('', 'cscope')
+ let cmds = ['add', 'find', 'help', 'kill', 'reset', 'show']
+ call assert_equal(cmds, l)
+ " using cmdline completion must not change the result
+ call feedkeys(":cscope find \<c-d>\<c-c>", 'xt')
+ let l = getcompletion('', 'cscope')
+ call assert_equal(cmds, l)
+ let keys = ['a', 'c', 'd', 'e', 'f', 'g', 'i', 's', 't']
+ let l = getcompletion('find ', 'cscope')
+ call assert_equal(keys, l)
+ endif
+
+ if has('signs')
+ sign define Testing linehl=Comment
+ let l = getcompletion('', 'sign')
+ let cmds = ['define', 'jump', 'list', 'place', 'undefine', 'unplace']
+ call assert_equal(cmds, l)
+ " using cmdline completion must not change the result
+ call feedkeys(":sign list \<c-d>\<c-c>", 'xt')
+ let l = getcompletion('', 'sign')
+ call assert_equal(cmds, l)
+ let l = getcompletion('list ', 'sign')
+ call assert_equal(['Testing'], l)
+ endif
+
" For others test if the name is recognized.
let names = ['buffer', 'environment', 'file_in_path',
\ 'mapping', 'shellcmd', 'tag', 'tag_listfiles', 'user']
- if has('cscope')
- call add(names, 'cscope')
- endif
if has('cmdline_hist')
call add(names, 'history')
endif
@@ -136,9 +163,6 @@ func Test_getcompletion()
if has('profile')
call add(names, 'syntime')
endif
- if has('signs')
- call add(names, 'sign')
- endif
set tags=Xtags
call writefile(["!_TAG_FILE_ENCODING\tutf-8\t//", "word\tfile\tcmd"], 'Xtags')
@@ -152,3 +176,11 @@ func Test_getcompletion()
call assert_fails('call getcompletion("", "burp")', 'E475:')
endfunc
+
+func Test_expand_star_star()
+ call mkdir('a/b', 'p')
+ call writefile(['asdfasdf'], 'a/b/fileXname')
+ call feedkeys(":find **/fileXname\<Tab>\<CR>", 'xt')
+ call assert_equal('find a/b/fileXname', getreg(':'))
+ call delete('a', 'rf')
+endfunc
diff --git a/src/nvim/testdir/test_ex_undo.vim b/src/nvim/testdir/test_ex_undo.vim
new file mode 100644
index 0000000000..44feb3680a
--- /dev/null
+++ b/src/nvim/testdir/test_ex_undo.vim
@@ -0,0 +1,19 @@
+" Tests for :undo
+
+func Test_ex_undo()
+ new ex-undo
+ setlocal ul=10
+ exe "normal ione\n\<Esc>"
+ setlocal ul=10
+ exe "normal itwo\n\<Esc>"
+ setlocal ul=10
+ exe "normal ithree\n\<Esc>"
+ call assert_equal(4, line('$'))
+ undo
+ call assert_equal(3, line('$'))
+ undo 1
+ call assert_equal(2, line('$'))
+ undo 0
+ call assert_equal(1, line('$'))
+ quit!
+endfunc
diff --git a/src/nvim/testdir/test_syn_attr.vim b/src/nvim/testdir/test_syn_attr.vim
index 809442eb94..94d6b8735f 100644
--- a/src/nvim/testdir/test_syn_attr.vim
+++ b/src/nvim/testdir/test_syn_attr.vim
@@ -16,9 +16,13 @@ func Test_missing_attr()
call assert_equal('', synIDattr(hlID("Mine"), "undercurl", 'gui'))
if has('gui')
- hi Mine guifg=blue guibg=red font=something
+ let fontname = getfontname()
+ if fontname == ''
+ let fontname = 'something'
+ endif
+ exe 'hi Mine guifg=blue guibg=red font=' . escape(fontname, ' \')
call assert_equal('blue', synIDattr(hlID("Mine"), "fg", 'gui'))
call assert_equal('red', synIDattr(hlID("Mine"), "bg", 'gui'))
- call assert_equal('something', synIDattr(hlID("Mine"), "font", 'gui'))
+ call assert_equal(fontname, synIDattr(hlID("Mine"), "font", 'gui'))
endif
endfunc
diff --git a/src/nvim/testdir/test_window_id.vim b/src/nvim/testdir/test_window_id.vim
index fa3ebd757e..66656e1d0a 100644
--- a/src/nvim/testdir/test_window_id.vim
+++ b/src/nvim/testdir/test_window_id.vim
@@ -3,17 +3,22 @@
func Test_win_getid()
edit one
let id1 = win_getid()
+ let w:one = 'one'
split two
let id2 = win_getid()
let bufnr2 = bufnr('%')
+ let w:two = 'two'
split three
let id3 = win_getid()
+ let w:three = 'three'
tabnew
edit four
let id4 = win_getid()
+ let w:four = 'four'
split five
let id5 = win_getid()
let bufnr5 = bufnr('%')
+ let w:five = 'five'
tabnext
wincmd w
@@ -28,6 +33,9 @@ func Test_win_getid()
call assert_equal("three", expand("%"))
call assert_equal(id3, win_getid())
let nr3 = winnr()
+ call assert_equal('one', getwinvar(id1, 'one'))
+ call assert_equal('two', getwinvar(id2, 'two'))
+ call assert_equal('three', getwinvar(id3, 'three'))
tabnext
call assert_equal("five", expand("%"))
call assert_equal(id5, win_getid())
@@ -36,7 +44,14 @@ func Test_win_getid()
call assert_equal("four", expand("%"))
call assert_equal(id4, win_getid())
let nr4 = winnr()
+ call assert_equal('four', getwinvar(id4, 'four'))
+ call assert_equal('five', getwinvar(id5, 'five'))
+ call settabwinvar(1, id2, 'two', '2')
+ call setwinvar(id4, 'four', '4')
tabnext
+ call assert_equal('4', gettabwinvar(2, id4, 'four'))
+ call assert_equal('five', gettabwinvar(2, id5, 'five'))
+ call assert_equal('2', getwinvar(id2, 'two'))
exe nr1 . "wincmd w"
call assert_equal(id1, win_getid())
diff --git a/src/nvim/tui/tui.c b/src/nvim/tui/tui.c
index 04b5868d2c..f252b00be2 100644
--- a/src/nvim/tui/tui.c
+++ b/src/nvim/tui/tui.c
@@ -22,10 +22,10 @@
#include "nvim/os/input.h"
#include "nvim/os/os.h"
#include "nvim/strings.h"
+#include "nvim/ui_bridge.h"
#include "nvim/ugrid.h"
#include "nvim/tui/input.h"
#include "nvim/tui/tui.h"
-#include "nvim/tui/ui_bridge.h"
// Space reserved in the output buffer to restore the cursor to normal when
// flushing. No existing terminal will require 32 bytes to do that.
@@ -174,7 +174,7 @@ static void terminfo_stop(UI *ui)
unibi_out(ui, data->unibi_ext.disable_bracketed_paste);
// Disable focus reporting
unibi_out(ui, data->unibi_ext.disable_focus_reporting);
- flush_buf(ui);
+ flush_buf(ui, true);
uv_tty_reset_mode();
uv_close((uv_handle_t *)&data->output_handle, NULL);
uv_run(&data->write_loop, UV_RUN_DEFAULT);
@@ -601,7 +601,7 @@ static void tui_flush(UI *ui)
unibi_goto(ui, grid->row, grid->col);
- flush_buf(ui);
+ flush_buf(ui, true);
}
static void suspend_event(void **argv)
@@ -774,7 +774,7 @@ static void out(void *ctx, const char *str, size_t len)
size_t available = data->bufsize - data->bufpos;
if (len > available) {
- flush_buf(ui);
+ flush_buf(ui, false);
}
memcpy(data->buf + data->bufpos, str, len);
@@ -910,13 +910,13 @@ end:
unibi_set_if_empty(ut, unibi_clr_eos, "\x1b[J");
}
-static void flush_buf(UI *ui)
+static void flush_buf(UI *ui, bool toggle_cursor)
{
uv_write_t req;
uv_buf_t buf;
TUIData *data = ui->data;
- if (!data->busy) {
+ if (toggle_cursor && !data->busy) {
// not busy and the cursor is invisible(see below). Append a "cursor
// normal" command to the end of the buffer.
data->bufsize += CNORM_COMMAND_MAX_SIZE;
@@ -930,7 +930,7 @@ static void flush_buf(UI *ui)
uv_run(&data->write_loop, UV_RUN_DEFAULT);
data->bufpos = 0;
- if (!data->busy) {
+ if (toggle_cursor && !data->busy) {
// not busy and cursor is visible(see above), append a "cursor invisible"
// command to the beginning of the buffer for the next flush
unibi_out(ui, unibi_cursor_invisible);
diff --git a/src/nvim/ui.c b/src/nvim/ui.c
index 648d633e07..eb500414a7 100644
--- a/src/nvim/ui.c
+++ b/src/nvim/ui.c
@@ -397,14 +397,14 @@ static void send_output(uint8_t **ptr)
size_t clen = (size_t)mb_ptr2len(p);
UI_CALL(put, p, (size_t)clen);
col++;
- if (utf_ambiguous_width(*p)) {
- pending_cursor_update = true;
- flush_cursor_update();
- } else if (mb_ptr2cells(p) > 1) {
+ if (mb_ptr2cells(p) > 1) {
// double cell character, blank the next cell
UI_CALL(put, NULL, 0);
col++;
}
+ if (utf_ambiguous_width(utf_ptr2char(p))) {
+ pending_cursor_update = true;
+ }
if (col >= width) {
ui_linefeed();
}
diff --git a/src/nvim/tui/ui_bridge.c b/src/nvim/ui_bridge.c
index 48f4b1bda6..cc27c734e0 100644
--- a/src/nvim/tui/ui_bridge.c
+++ b/src/nvim/ui_bridge.c
@@ -1,4 +1,5 @@
-// UI wrapper for the built-in TUI. Sends UI requests to the TUI thread.
+// UI wrapper that sends UI requests to the UI thread.
+// Used by the built-in TUI and external libnvim-based UIs.
#include <assert.h>
#include <stdbool.h>
@@ -9,11 +10,11 @@
#include "nvim/vim.h"
#include "nvim/ui.h"
#include "nvim/memory.h"
+#include "nvim/ui_bridge.h"
#include "nvim/ugrid.h"
-#include "nvim/tui/ui_bridge.h"
#ifdef INCLUDE_GENERATED_DECLARATIONS
-# include "tui/ui_bridge.c.generated.h"
+# include "ui_bridge.c.generated.h"
#endif
#define UI(b) (((UIBridgeData *)b)->ui)
diff --git a/src/nvim/tui/ui_bridge.h b/src/nvim/ui_bridge.h
index 003ed3c2c1..9e4bf9f2a7 100644
--- a/src/nvim/tui/ui_bridge.h
+++ b/src/nvim/ui_bridge.h
@@ -1,6 +1,7 @@
-// Bridge used for communication between a builtin UI thread and nvim core
-#ifndef NVIM_TUI_UI_BRIDGE_H
-#define NVIM_TUI_UI_BRIDGE_H
+// Bridge for communication between a UI thread and nvim core.
+// Used by the built-in TUI and external libnvim-based UIs.
+#ifndef NVIM_UI_BRIDGE_H
+#define NVIM_UI_BRIDGE_H
#include <uv.h>
@@ -39,6 +40,6 @@ struct ui_bridge_data {
#ifdef INCLUDE_GENERATED_DECLARATIONS
-# include "tui/ui_bridge.h.generated.h"
+# include "ui_bridge.h.generated.h"
#endif
-#endif // NVIM_TUI_UI_BRIDGE_H
+#endif // NVIM_UI_BRIDGE_H
diff --git a/src/nvim/version.c b/src/nvim/version.c
index 9f8fcd1232..e6ef600f8c 100644
--- a/src/nvim/version.c
+++ b/src/nvim/version.c
@@ -122,7 +122,7 @@ static int included_patches[] = {
// 2322,
// 2321,
// 2320,
- // 2319,
+ // 2319 NA
// 2318,
// 2317,
// 2316 NA
@@ -163,11 +163,11 @@ static int included_patches[] = {
// 2281 NA
// 2280,
// 2279,
- // 2278,
+ // 2278 NA
// 2277,
// 2276,
// 2275,
- // 2274,
+ 2274,
// 2273,
// 2272,
// 2271 NA
@@ -209,7 +209,7 @@ static int included_patches[] = {
// 2235,
// 2234 NA
// 2233,
- // 2232,
+ // 2232 NA
// 2231,
// 2230,
// 2229,
@@ -236,7 +236,7 @@ static int included_patches[] = {
// 2208,
// 2207 NA
// 2206 NA
- // 2205,
+ 2205,
// 2204,
// 2203 NA
// 2202 NA
@@ -279,11 +279,11 @@ static int included_patches[] = {
// 2165,
// 2164,
// 2163,
- // 2162,
+ 2162,
// 2161,
// 2160,
// 2159,
- // 2158,
+ 2158,
// 2157 NA
// 2156 NA
// 2155 NA
@@ -326,7 +326,7 @@ static int included_patches[] = {
// 2118 NA
// 2117,
// 2116 NA
- // 2115,
+ // 2115 NA
// 2114 NA
// 2113,
2112,
@@ -496,7 +496,7 @@ static int included_patches[] = {
// 1948,
// 1947 NA
// 1946 NA
- // 1945,
+ // 1945 NA
// 1944 NA
// 1943 NA
// 1942 NA
@@ -546,9 +546,9 @@ static int included_patches[] = {
1898,
// 1897,
1896,
- // 1895,
+ 1895,
// 1894 NA
- // 1893,
+ 1893,
// 1892 NA
// 1891 NA
// 1890 NA
@@ -630,14 +630,14 @@ static int included_patches[] = {
// 1814 NA
// 1813,
// 1812,
- // 1811,
+ // 1811 NA
// 1810 NA
1809,
1808,
// 1807 NA
1806,
- // 1805,
- // 1804,
+ // 1805 NA
+ // 1804 NA
// 1803 NA
// 1802,
// 1801 NA
@@ -647,7 +647,7 @@ static int included_patches[] = {
// 1797 NA
// 1796 NA
// 1795 NA
- // 1794,
+ // 1794 NA
// 1793,
// 1792 NA
// 1791 NA
@@ -672,14 +672,14 @@ static int included_patches[] = {
// 1773 NA
// 1772 NA
// 1771 NA
- // 1770,
+ // 1770 NA
// 1769,
// 1768,
// 1767 NA
// 1766 NA
- // 1765,
+ 1765,
// 1764 NA
- // 1763,
+ 1763,
// 1762,
// 1761,
// 1760 NA
@@ -693,7 +693,7 @@ static int included_patches[] = {
// 1753,
// 1752,
// 1751,
- // 1750,
+ // 1750 NA
// 1749 NA
// 1748,
// 1747 NA
@@ -729,7 +729,7 @@ static int included_patches[] = {
// 1717 NA
1716,
// 1715,
- // 1714,
+ 1714,
// 1713 NA
1712,
// 1711,
@@ -790,7 +790,7 @@ static int included_patches[] = {
// 1656,
// 1655 NA
1654,
- // 1653,
+ // 1653 NA
1652,
// 1651 NA
// 1650,
@@ -894,7 +894,7 @@ static int included_patches[] = {
1552,
1551,
1550,
- // 1549,
+ 1549,
1548,
1547,
1546,
diff --git a/src/nvim/vim.h b/src/nvim/vim.h
index 09e9e850a7..6bbd9b58ef 100644
--- a/src/nvim/vim.h
+++ b/src/nvim/vim.h
@@ -316,4 +316,7 @@ enum {
#define DIP_OPT 0x10 // also use "opt" directory in 'packpath'
#define DIP_NORTP 0x20 // do not use 'runtimepath'
+// Lowest number used for window ID. Cannot have this many windows per tab.
+#define LOWEST_WIN_ID 1000
+
#endif /* NVIM_VIM_H */
diff --git a/src/nvim/window.c b/src/nvim/window.c
index 2cc99b8dfa..29c670322a 100644
--- a/src/nvim/window.c
+++ b/src/nvim/window.c
@@ -482,7 +482,7 @@ wingotofile:
}
static void cmd_with_count(char *cmd, char_u *bufp, size_t bufsize,
- long Prenum)
+ int64_t Prenum)
{
size_t len = xstrlcpy((char *)bufp, cmd, bufsize);
@@ -3694,7 +3694,7 @@ win_T *buf_jump_open_tab(buf_T *buf)
*/
static win_T *win_alloc(win_T *after, int hidden)
{
- static int last_win_id = 0;
+ static int last_win_id = LOWEST_WIN_ID - 1;
// allocate window structure and linesizes arrays
win_T *new_wp = xcalloc(1, sizeof(win_T));
diff --git a/test/functional/api/server_requests_spec.lua b/test/functional/api/server_requests_spec.lua
index 480f099b4d..3245e1b52d 100644
--- a/test/functional/api/server_requests_spec.lua
+++ b/test/functional/api/server_requests_spec.lua
@@ -164,7 +164,8 @@ describe('server -> client', function()
it('can communicate buffers, tabpages, and windows', function()
eq({1}, eval("rpcrequest(vim, 'nvim_list_tabpages')"))
- eq({1}, eval("rpcrequest(vim, 'nvim_list_wins')"))
+ -- Window IDs start at 1000 (LOWEST_WIN_ID in vim.h)
+ eq({1000}, eval("rpcrequest(vim, 'nvim_list_wins')"))
local buf = eval("rpcrequest(vim, 'nvim_list_bufs')")[1]
eq(1, buf)
diff --git a/test/functional/eval/timer_spec.lua b/test/functional/eval/timer_spec.lua
index 295c763d74..fba9466b78 100644
--- a/test/functional/eval/timer_spec.lua
+++ b/test/functional/eval/timer_spec.lua
@@ -3,6 +3,7 @@ local Screen = require('test.functional.ui.screen')
local ok, feed, eq, eval = helpers.ok, helpers.feed, helpers.eq, helpers.eval
local source, nvim_async, run = helpers.source, helpers.nvim_async, helpers.run
local clear, execute, funcs = helpers.clear, helpers.execute, helpers.funcs
+local curbufmeths = helpers.curbufmeths
describe('timers', function()
before_each(function()
@@ -62,19 +63,76 @@ describe('timers', function()
end)
it('are paused when event processing is disabled', function()
- -- this is not the intended behavior, but at least there will
- -- not be a burst of queued up callbacks
- execute("call timer_start(50, 'MyHandler', {'repeat': 2})")
+ execute("call timer_start(50, 'MyHandler', {'repeat': -1})")
run(nil, nil, nil, 100)
local count = eval("g:val")
+ -- shows two line error message and thus invokes the return prompt.
+ -- if we start to allow event processing here, we need to change this test.
+ execute("throw 'fatal error'")
+ run(nil, nil, nil, 300)
+ feed("<cr>")
+ local diff = eval("g:val") - count
+ ok(0 <= diff and diff <= 4)
+ end)
+
+ it('are triggered in blocking getchar() call', function()
+ execute("call timer_start(50, 'MyHandler', {'repeat': -1})")
nvim_async("command", "let g:c = getchar()")
run(nil, nil, nil, 300)
feed("c")
- local diff = eval("g:val") - count
- ok(0 <= diff and diff <= 2)
+ local count = eval("g:val")
+ ok(count >= 5)
eq(99, eval("g:c"))
end)
+ it('can invoke redraw in blocking getchar() call', function()
+ local screen = Screen.new(40, 6)
+ screen:attach()
+ screen:set_default_attr_ids({
+ [1] = {bold=true, foreground=Screen.colors.Blue},
+ })
+
+ curbufmeths.set_lines(0, -1, true, {"ITEM 1", "ITEM 2"})
+ source([[
+ func! AddItem(timer)
+ call nvim_buf_set_lines(0, 2, 2, v:true, ['ITEM 3'])
+ redraw
+ endfunc
+ call timer_start(200, 'AddItem')
+ ]])
+ nvim_async("command", "let g:c2 = getchar()")
+
+ screen:expect([[
+ ITEM 1 |
+ ITEM 2 |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ^ |
+ ]])
+
+ screen:sleep(200)
+ screen:expect([[
+ ITEM 1 |
+ ITEM 2 |
+ ITEM 3 |
+ {1:~ }|
+ {1:~ }|
+ ^ |
+ ]])
+
+ feed("3")
+ eq(51, eval("g:c2"))
+ screen:expect([[
+ ^ITEM 1 |
+ ITEM 2 |
+ ITEM 3 |
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+ end)
+
it('can be stopped', function()
local t = eval("timer_start(50, 'MyHandler', {'repeat': -1})")
eq(0,eval("g:val"))
diff --git a/test/functional/ex_cmds/arg_spec.lua b/test/functional/ex_cmds/arg_spec.lua
new file mode 100644
index 0000000000..e66dc62491
--- /dev/null
+++ b/test/functional/ex_cmds/arg_spec.lua
@@ -0,0 +1,30 @@
+local helpers = require("test.functional.helpers")(after_each)
+local eq, execute, funcs = helpers.eq, helpers.execute, helpers.funcs
+local ok = helpers.ok
+local clear = helpers.clear
+
+describe(":argument", function()
+ before_each(function()
+ clear()
+ end)
+
+ it("does not restart :terminal buffer", function()
+ execute("terminal")
+ helpers.feed([[<C-\><C-N>]])
+ execute("argadd")
+ helpers.feed([[<C-\><C-N>]])
+ local bufname_before = funcs.bufname("%")
+ local bufnr_before = funcs.bufnr("%")
+ helpers.ok(nil ~= string.find(bufname_before, "^term://")) -- sanity
+
+ execute("argument 1")
+ helpers.feed([[<C-\><C-N>]])
+
+ local bufname_after = funcs.bufname("%")
+ local bufnr_after = funcs.bufnr("%")
+ eq("\n["..bufname_before.."] ", helpers.eval('execute("args")'))
+ ok(funcs.line('$') > 1)
+ eq(bufname_before, bufname_after)
+ eq(bufnr_before, bufnr_after)
+ end)
+end)
diff --git a/test/functional/ex_cmds/edit_spec.lua b/test/functional/ex_cmds/edit_spec.lua
new file mode 100644
index 0000000000..9e197d7466
--- /dev/null
+++ b/test/functional/ex_cmds/edit_spec.lua
@@ -0,0 +1,26 @@
+local helpers = require("test.functional.helpers")(after_each)
+local eq, execute, funcs = helpers.eq, helpers.execute, helpers.funcs
+local ok = helpers.ok
+local clear = helpers.clear
+
+describe(":edit", function()
+ before_each(function()
+ clear()
+ end)
+
+ it("without arguments does not restart :terminal buffer", function()
+ execute("terminal")
+ helpers.feed([[<C-\><C-N>]])
+ local bufname_before = funcs.bufname("%")
+ local bufnr_before = funcs.bufnr("%")
+ helpers.ok(nil ~= string.find(bufname_before, "^term://")) -- sanity
+
+ execute("edit")
+
+ local bufname_after = funcs.bufname("%")
+ local bufnr_after = funcs.bufnr("%")
+ ok(funcs.line('$') > 1)
+ eq(bufname_before, bufname_after)
+ eq(bufnr_before, bufnr_after)
+ end)
+end)
diff --git a/test/functional/terminal/ex_terminal_spec.lua b/test/functional/terminal/ex_terminal_spec.lua
index 6f929f17e4..09b4eaa8d5 100644
--- a/test/functional/terminal/ex_terminal_spec.lua
+++ b/test/functional/terminal/ex_terminal_spec.lua
@@ -13,13 +13,19 @@ describe(':terminal', function()
clear()
screen = Screen.new(50, 4)
screen:attach({rgb=false})
+ -- shell-test.c is a fake shell that prints its arguments and exits.
nvim('set_option', 'shell', nvim_dir..'/shell-test')
nvim('set_option', 'shellcmdflag', 'EXE')
-
end)
+ -- Invokes `:terminal {cmd}` using a fake shell (shell-test.c) which prints
+ -- the {cmd} and exits immediately .
+ local function terminal_run_fake_shell_cmd(cmd)
+ execute("terminal "..(cmd and cmd or ""))
+ end
+
it('with no argument, acts like termopen()', function()
- execute('terminal')
+ terminal_run_fake_shell_cmd()
wait()
screen:expect([[
ready $ |
@@ -30,7 +36,7 @@ describe(':terminal', function()
end)
it('executes a given command through the shell', function()
- execute('terminal echo hi')
+ terminal_run_fake_shell_cmd('echo hi')
wait()
screen:expect([[
ready $ echo hi |
@@ -41,7 +47,7 @@ describe(':terminal', function()
end)
it('allows quotes and slashes', function()
- execute([[terminal echo 'hello' \ "world"]])
+ terminal_run_fake_shell_cmd([[echo 'hello' \ "world"]])
wait()
screen:expect([[
ready $ echo 'hello' \ "world" |
@@ -58,4 +64,16 @@ describe(':terminal', function()
-- Verify that BufNew actually fired (else the test is invalid).
eq('foo', eval('&shell'))
end)
+
+ it('ignores writes if the backing stream closes', function()
+ terminal_run_fake_shell_cmd()
+ helpers.feed('iiXXXXXXX')
+ wait()
+ -- Race: Though the shell exited (and streams were closed by SIGCHLD
+ -- handler), :terminal cleanup is pending on the main-loop.
+ -- This write should be ignored (not crash, #5445).
+ helpers.feed('iiYYYYYYY')
+ wait()
+ end)
+
end)
diff --git a/test/functional/terminal/tui_spec.lua b/test/functional/terminal/tui_spec.lua
index 27f00e8550..60f989d701 100644
--- a/test/functional/terminal/tui_spec.lua
+++ b/test/functional/terminal/tui_spec.lua
@@ -313,7 +313,7 @@ describe("tui 't_Co' (terminal colors)", function()
-- This is ugly because :term/termopen() forces TERM=xterm-256color.
-- TODO: Revisit this after jobstart/termopen accept `env` dict.
screen = thelpers.screen_setup(0, string.format(
- [=[['sh', '-c', 'TERM=%s %s %s -u NONE -i NONE --cmd "silent set noswapfile"']]=],
+ [=[['sh', '-c', 'LANG=C TERM=%s %s %s -u NONE -i NONE --cmd "silent set noswapfile"']]=],
term,
(colorterm ~= nil and "COLORTERM="..colorterm or ""),
helpers.nvim_prog))