aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CONTRIBUTING.md8
-rw-r--r--README.md2
-rw-r--r--ci/build.bat6
-rw-r--r--runtime/doc/api.txt97
-rw-r--r--runtime/doc/autocmd.txt27
-rw-r--r--runtime/doc/syntax.txt12
-rw-r--r--runtime/doc/ui.txt2
-rw-r--r--runtime/doc/various.txt19
-rw-r--r--runtime/doc/vim_diff.txt3
-rw-r--r--scripts/gen_api_vimdoc.py17
-rwxr-xr-xscripts/vim-patch.sh57
-rw-r--r--src/nvim/CMakeLists.txt3
-rw-r--r--src/nvim/api/buffer.c4
-rw-r--r--src/nvim/api/vim.c6
-rw-r--r--src/nvim/option.c3
-rw-r--r--src/nvim/os/lang.c40
-rw-r--r--src/nvim/os/lang.h7
-rw-r--r--src/nvim/testdir/Makefile20
-rw-r--r--src/nvim/testdir/unix.vim6
-rw-r--r--src/nvim/tui/tui.c2
-rw-r--r--src/nvim/version.c4
-rw-r--r--src/nvim/window.c29
-rw-r--r--test/README.md13
-rw-r--r--test/functional/autocmd/bufenter_spec.lua13
24 files changed, 300 insertions, 100 deletions
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 20bce8ca62..05a97ebf18 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -14,7 +14,7 @@ low-risk/isolated tasks:
Developer guidelines
--------------------
-- Nvim developers should read `:help dev-help`.
+- Nvim developers should read `:help dev`.
- External UI developers should read `:help dev-ui`.
Reporting problems
@@ -24,7 +24,7 @@ Reporting problems
- Search [existing issues][github-issues] (including closed!)
- Update Neovim to the latest version to see if your problem persists.
- Disable plugins incrementally, to narrow down the cause of the issue.
-- When reporting a crash, include a stacktrace.
+- When reporting a crash, [include a stacktrace](https://github.com/neovim/neovim/wiki/Development-tips#backtrace-linux).
- [Bisect][git-bisect] to the cause of a regression, if you are able. This is _extremely_ helpful.
- Check `$NVIM_LOG_FILE`, if it exists.
- Include `cmake --system-information` for **build** issues.
@@ -92,7 +92,7 @@ and [AppVeyor].
- CI builds are compiled with [`-Werror`][gcc-warnings], so compiler warnings
will fail the build.
- If any tests fail, the build will fail.
- See [Building Neovim#running-tests][wiki-run-tests] to run tests locally.
+ See [test/README.md#running-tests][run-tests] to run tests locally.
Passing locally doesn't guarantee passing the CI build, because of the
different compilers and platforms tested against.
- CI runs [ASan] and other analyzers.
@@ -168,7 +168,7 @@ as context, use the `-W` argument as well.
[hygiene]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
[style-guide]: http://neovim.io/develop/style-guide.xml
[ASan]: http://clang.llvm.org/docs/AddressSanitizer.html
-[wiki-run-tests]: https://github.com/neovim/neovim/wiki/Building-Neovim#running-tests
+[run-tests]: https://github.com/neovim/neovim/blob/master/test/README.md#running-tests
[wiki-faq]: https://github.com/neovim/neovim/wiki/FAQ
[review-checklist]: https://github.com/neovim/neovim/wiki/Code-review-checklist
[3174]: https://github.com/neovim/neovim/issues/3174
diff --git a/README.md b/README.md
index 454137219f..2e1fc90c0c 100644
--- a/README.md
+++ b/README.md
@@ -14,7 +14,7 @@
[![PVS-studio Check](https://neovim.io/doc/reports/pvs/badge.svg)](https://neovim.io/doc/reports/pvs)
[![Debian CI](https://badges.debian.net/badges/debian/testing/neovim/version.svg)](https://buildd.debian.org/neovim)
-[![Downloads](https://img.shields.io/github/downloads/neovim/neovim/total.svg?maxAge=2592000)](https://github.com/neovim/neovim/releases/)
+[![Downloads](https://img.shields.io/github/downloads/neovim/neovim/total.svg?maxAge=2592001)](https://github.com/neovim/neovim/releases/)
Neovim is a project that seeks to aggressively refactor Vim in order to:
diff --git a/ci/build.bat b/ci/build.bat
index 91eca9ef73..25f949b5e4 100644
--- a/ci/build.bat
+++ b/ci/build.bat
@@ -53,6 +53,12 @@ bin\nvim --version || goto :error
:: Functional tests
mingw32-make functionaltest VERBOSE=1 || goto :error
+:: Old tests
+setlocal
+set PATH=%PATH%;C:\msys64\usr\bin
+mingw32-make -C "%~dp0\..\src\nvim\testdir" VERBOSE=1
+endlocal
+
if defined USE_GCOV (
C:\msys64\usr\bin\bash -lc "cd /c/projects/neovim; bash <(curl -s https://codecov.io/bash) || echo 'codecov upload failed.'"
)
diff --git a/runtime/doc/api.txt b/runtime/doc/api.txt
index ef8b9c7d47..6c2a3a8632 100644
--- a/runtime/doc/api.txt
+++ b/runtime/doc/api.txt
@@ -60,8 +60,7 @@ External programs ("clients") can use the metadata to discover the |rpc-api|.
API contract *api-contract*
The API is made of functions and events. Clients call functions like those
-described at |api-global|, and may "attach" in order to receive rich events,
-described at |rpc-remote-ui|.
+described at |api-global|, and may "attach" to receive rich |ui-events|.
As Nvim develops, its API may change only according the following "contract":
@@ -446,7 +445,11 @@ nvim_get_keymap({mode}) *nvim_get_keymap()*
Array of maparg()-like dictionaries describing mappings
nvim_get_api_info() *nvim_get_api_info()*
- TODO: Documentation
+ Returns a 2-tuple (Array), where item 0 is the current channel
+ id and item 1 is the |api-metadata| map (Dictionary).
+
+ Return:~
+ 2-tuple [{channel-id}, {api-metadata}]
Attributes:~
{async}
@@ -477,6 +480,84 @@ nvim_call_atomic({calls}) *nvim_call_atomic()*
error ocurred, the values from all preceding calls will
still be returned.
+ *nvim_parse_expression()*
+nvim_parse_expression({expr}, {flags}, {highlight})
+ Parse a VimL expression
+
+ Attributes:~
+ {async}
+
+ Parameters:~
+ {expr} Expression to parse. Is always treated as a
+ single line.
+ {flags} Flags: - "m" if multiple expressions in a
+ row are allowed (only the first one will be
+ parsed), - "E" if EOC tokens are not allowed
+ (determines whether they will stop parsing
+ process or be recognized as an
+ operator/space, though also yielding an
+ error). - "l" when needing to start parsing
+ with lvalues for ":let" or ":for". Common
+ flag sets: - "m" to parse like for ":echo". -
+ "E" to parse like for "<C-r>=". - empty
+ string for ":call". - "lm" to parse for
+ ":let".
+ {highlight} If true, return value will also include
+ "highlight" key containing array of 4-tuples
+ (arrays) (Integer, Integer, Integer, String),
+ where first three numbers define the
+ highlighted region and represent line,
+ starting column and ending column (latter
+ exclusive: one should highlight region
+ [start_col, end_col)).
+
+ Return:~
+ AST: top-level dictionary holds keys "error": Dictionary
+ with error, present only if parser saw some error.
+ Contains the following keys: "message": String, error
+ message in printf format, translated. Must contain exactly
+ one "%.*s". "arg": String, error message argument. "len":
+ Amount of bytes successfully parsed. With flags equal to
+ "" that should be equal to the length of expr string.
+ @note: “Sucessfully parsed” here means “participated in
+ AST creation”, not “till the first error”. "ast": AST,
+ either nil or a dictionary with these keys: "type": node
+ type, one of the value names from ExprASTNodeType
+ stringified without "kExprNode" prefix. "start": a pair
+ [line, column] describing where node is “started” where
+ "line" is always 0 (will not be 0 if you will be using
+ nvim_parse_viml() on e.g. ":let", but that is not present
+ yet). Both elements are Integers. "len": “length” of the
+ node. This and "start" are there for debugging purposes
+ primary (debugging parser and providing debug
+ information). "children": a list of nodes described in
+ top/"ast". There always is zero, one or two children, key
+ will not be present if node has no children. Maximum
+ number of children may be found in node_maxchildren array.
+ Local values (present only for certain nodes): "scope": a
+ single Integer, specifies scope for "Option" and
+ "PlainIdentifier" nodes. For "Option" it is one of
+ ExprOptScope values, for "PlainIdentifier" it is one of
+ ExprVarScope values. "ident": identifier (without scope,
+ if any), present for "Option", "PlainIdentifier",
+ "PlainKey" and "Environment" nodes. "name": Integer,
+ register name (one character) or -1. Only present for
+ "Register" nodes. "cmp_type": String, comparison type, one
+ of the value names from ExprComparisonType, stringified
+ without "kExprCmp" prefix. Only present for "Comparison"
+ nodes. "ccs_strategy": String, case comparison strategy,
+ one of the value names from ExprCaseCompareStrategy,
+ stringified without "kCCStrategy" prefix. Only present for
+ "Comparison" nodes. "augmentation": String, augmentation
+ type for "Assignment" nodes. Is either an empty string,
+ "Add", "Subtract" or "Concat" for "=", "+=", "-=" or ".="
+ respectively. "invert": Boolean, true if result of
+ comparison needs to be inverted. Only present for
+ "Comparison" nodes. "ivalue": Integer, integer value for
+ "Integer" nodes. "fvalue": Float, floating-point value for
+ "Float" nodes. "svalue": String, value for
+ "SingleQuotedString" and "DoubleQuotedString" nodes.
+
nvim__id({obj}) *nvim__id()*
Returns object given as argument
@@ -717,9 +798,10 @@ nvim_buf_add_highlight({buffer}, {src_id}, {hl_group}, {line},
or -1 for ungrouped highlight
{hl_group} Name of the highlight group to use
{line} Line to highlight (zero-indexed)
- {col_start} Start of range of columns to highlight
- {col_end} End of range of columns to highlight, or -1
- to highlight to end of line
+ {col_start} Start of (byte-indexed) column range to
+ highlight
+ {col_end} End of (byte-indexed) column range to
+ highlight, or -1 to highlight to end of line
Return:~
The src_id that was used
@@ -953,9 +1035,6 @@ nvim_tabpage_is_valid({tabpage}) *nvim_tabpage_is_valid()*
==============================================================================
UI Functions *api-ui*
-remote_ui_disconnect() *remote_ui_disconnect()*
- TODO: Documentation
-
nvim_ui_attach({width}, {height}, {options}) *nvim_ui_attach()*
TODO: Documentation
diff --git a/runtime/doc/autocmd.txt b/runtime/doc/autocmd.txt
index 740f44414a..9a04bf2824 100644
--- a/runtime/doc/autocmd.txt
+++ b/runtime/doc/autocmd.txt
@@ -259,13 +259,12 @@ Name triggered by ~
|BufNew| just after creating a new buffer
|SwapExists| detected an existing swap file
-|TermOpen| when a terminal buffer is starting
-|TermClose| when a terminal buffer ends
+|TermOpen| when a terminal job starts
+|TermClose| when a terminal job ends
Options
|FileType| when the 'filetype' option has been set
|Syntax| when the 'syntax' option has been set
-|TermChanged| after the value of 'term' has changed
|OptionSet| after setting any option
Startup and exit
@@ -933,26 +932,20 @@ TabEnter Just after entering a tab page. |tab-page|
TabLeave Just before leaving a tab page. |tab-page|
A WinLeave event will have been triggered
first.
- {Nvim} *TabNew*
+ *TabNew*
TabNew When creating a new tab page. |tab-page|
After WinEnter and before TabEnter.
- {Nvim} *TabNewEntered*
+ *TabNewEntered*
TabNewEntered After entering a new tab page. |tab-page|
After BufEnter.
- {Nvim} *TabClosed*
+ *TabClosed*
TabClosed After closing a tab page. <afile> can be used
for the tab page number.
- *TermChanged*
-TermChanged After the value of 'term' has changed. Useful
- for re-loading the syntax file to update the
- colors, fonts and other terminal-dependent
- settings. Executed for all loaded buffers.
- {Nvim} *TermClose*
-TermClose When a terminal buffer ends.
- {Nvim} *TermOpen*
-TermOpen When a terminal buffer is starting. This can
- be used to configure the terminal emulator by
- setting buffer variables. |terminal|
+ *TermClose*
+TermClose When a |terminal| job ends.
+ *TermOpen*
+TermOpen When a |terminal| job is starting. Can be
+ used to configure the terminal buffer.
*TermResponse*
TermResponse After the response to |t_RV| is received from
the terminal. The value of |v:termresponse|
diff --git a/runtime/doc/syntax.txt b/runtime/doc/syntax.txt
index 85330f3dec..ff9773b136 100644
--- a/runtime/doc/syntax.txt
+++ b/runtime/doc/syntax.txt
@@ -4709,17 +4709,7 @@ ctermbg={color-nr} *highlight-ctermbg*
"cterm". For example, on some systems "cterm=bold ctermfg=3" gives
another color, on others you just get color 3.
- For an xterm this depends on your resources, and is a bit
- unpredictable. See your xterm documentation for the defaults. The
- colors for a color-xterm can be changed from the .Xdefaults file.
- Unfortunately this means that it's not possible to get the same colors
- for each user.
-
- The MSDOS standard colors are fixed (in a console window), so these
- have been used for the names. But the meaning of color names in X11
- are fixed, so these color settings have been used, to make the
- highlighting settings portable (complicated, isn't it?). The
- following names are recognized, with the color number used:
+ The following names are recognized, with the color number used:
*cterm-colors*
NR-16 NR-8 COLOR NAME ~
diff --git a/runtime/doc/ui.txt b/runtime/doc/ui.txt
index 685019aed7..abbd063483 100644
--- a/runtime/doc/ui.txt
+++ b/runtime/doc/ui.txt
@@ -9,7 +9,7 @@ Nvim UI protocol *ui*
Type |gO| to see the table of contents.
==============================================================================
-Introduction *ui-intro*
+UI Events *ui-events*
GUIs can be implemented as external processes communicating with Nvim over the
RPC API. The UI model consists of a terminal-like grid with a single,
diff --git a/runtime/doc/various.txt b/runtime/doc/various.txt
index baac72c106..9232cd70c5 100644
--- a/runtime/doc/various.txt
+++ b/runtime/doc/various.txt
@@ -207,21 +207,18 @@ g8 Print the hex values of the bytes used in the
:sh[ell] Removed. |vim-differences| {Nvim}
*:terminal* *:te*
-:te[rminal][!] [{cmd}] Execute {cmd} with 'shell' in a new |terminal| buffer.
- Equivalent to: >
- :enew
- :call termopen('{cmd}')
-<
- See |termopen()|.
+:te[rminal][!] [{cmd}] Execute {cmd} with 'shell' in a new |terminal-emulator|
+ buffer. Without {cmd}, start an interactive 'shell'.
- Without {cmd}, start an interactive shell.
+ Type |i| to enter |Terminal-mode|, then keys are sent to
+ the job running in the terminal. Type <C-\><C-N> to
+ leave Terminal-mode. |CTRL-\_CTRL-N|
- Creating the terminal buffer fails when changes have been
- made to the current buffer, unless 'hidden' is set.
+ Fails if changes have been made to the current buffer,
+ unless 'hidden' is set.
To enter |Terminal-mode| automatically: >
- autocmd BufEnter term://* startinsert
- autocmd BufLeave term://* stopinsert
+ autocmd TermOpen * startinsert
<
*:!cmd* *:!* *E34*
:!{cmd} Execute {cmd} with 'shell'. See also |:terminal|.
diff --git a/runtime/doc/vim_diff.txt b/runtime/doc/vim_diff.txt
index 1a4a66ed89..7061f01316 100644
--- a/runtime/doc/vim_diff.txt
+++ b/runtime/doc/vim_diff.txt
@@ -302,7 +302,8 @@ Highlight groups:
|hl-ColorColumn|, |hl-CursorColumn| are lower priority than most other
groups
-The variable name "count" is no fallback for |v:count| anymore.
+VimL (Vim script) compatibility:
+ `count` does not alias to |v:count|
==============================================================================
5. Missing legacy features *nvim-features-missing*
diff --git a/scripts/gen_api_vimdoc.py b/scripts/gen_api_vimdoc.py
index 51e585a007..4ddf415f1a 100644
--- a/scripts/gen_api_vimdoc.py
+++ b/scripts/gen_api_vimdoc.py
@@ -45,6 +45,8 @@ if sys.version_info[0] < 3:
doc_filename = 'api.txt'
# String used to find the start of the generated part of the doc.
section_start_token = '*api-global*'
+# Required prefix for API function names.
+api_func_name_prefix = 'nvim_'
# Section name overrides.
section_name = {
@@ -260,11 +262,11 @@ def parse_parblock(parent, width=62):
def parse_source_xml(filename):
"""Collects API functions.
- This returns two strings:
- 1. The API functions
- 2. The deprecated API functions
+ Returns two strings:
+ 1. API functions
+ 2. Deprecated API functions
- The caller decides what to do with the deprecated documentation.
+ Caller decides what to do with the deprecated documentation.
"""
global xrefs
xrefs = set()
@@ -294,9 +296,8 @@ def parse_source_xml(filename):
annotations = get_text(get_child(member, 'argsstring'))
if annotations and ')' in annotations:
annotations = annotations.rsplit(')', 1)[-1].strip()
- # XXX: (doxygen 1.8.11) 'argsstring' only includes FUNC_ATTR_*
- # attributes if the function signature is non-void.
- # Force attributes here for such functions.
+ # XXX: (doxygen 1.8.11) 'argsstring' only includes attributes of
+ # non-void functions. Special-case void functions here.
if name == 'nvim_get_mode' and len(annotations) == 0:
annotations += 'FUNC_API_ASYNC'
annotations = filter(None, map(lambda x: annotation_map.get(x),
@@ -379,7 +380,7 @@ def parse_source_xml(filename):
if 'Deprecated' in xrefs:
deprecated_functions.append(func_doc)
- else:
+ elif name.startswith(api_func_name_prefix):
functions.append(func_doc)
xrefs.clear()
diff --git a/scripts/vim-patch.sh b/scripts/vim-patch.sh
index 2875e7d95a..04bc16dd25 100755
--- a/scripts/vim-patch.sh
+++ b/scripts/vim-patch.sh
@@ -21,7 +21,8 @@ usage() {
echo
echo "Options:"
echo " -h Show this message and exit."
- echo " -l Show list of Vim patches missing from Neovim."
+ echo " -l Show list of missing Vim patches."
+ echo " -L Print missing Vim patches in machine-readable form."
echo " -p {vim-revision} Download and generate the specified Vim patch."
echo " vim-revision can be a version number '8.0.xxx'"
echo " or a valid Git ref (hash, tag, etc.)."
@@ -147,6 +148,10 @@ preprocess_patch() {
local na_src_testdir='Make_amiga.mak\|Make_dos.mak\|Make_ming.mak\|Make_vms.mms'
2>/dev/null $nvim --cmd 'set dir=/tmp' +'g@^diff --git a/src/testdir/\<\%('${na_src_testdir}'\)\>@norm! d/\v(^diff)|%$ ' +w +q "$file"
+ # Remove version.c #7555
+ local na_po='version.c'
+ 2>/dev/null $nvim --cmd 'set dir=/tmp' +'g@^diff --git a/src/\<\%('${na_po}'\)\>@norm! d/\v(^diff)|%$ ' +w +q "$file"
+
# Remove some *.po files. #5622
local na_po='sjiscorr.c\|ja.sjis.po\|ko.po\|pl.cp1250.po\|pl.po\|ru.cp1251.po\|uk.cp1251.po\|zh_CN.cp936.po\|zh_CN.po\|zh_TW.po'
2>/dev/null $nvim --cmd 'set dir=/tmp' +'g@^diff --git a/src/po/\<\%('${na_po}'\)\>@norm! d/\v(^diff)|%$ ' +w +q "$file"
@@ -318,15 +323,17 @@ submit_pr() {
done
}
+# Prints a newline-delimited list of Vim commits, for use by scripts.
list_vim_patches() {
- get_vim_sources
-
- printf "\nVim patches missing from Neovim:\n"
-
# Get missing Vim commits
local vim_commits
vim_commits="$(cd "${VIM_SOURCE_DIR}" && git log --reverse --format='%H' v8.0.0000..HEAD)"
+ # Find all "vim-patch:xxx" tokens in the Nvim git log.
+ local tokens
+ tokens="$(cd "${NVIM_SOURCE_DIR}" && git log -E --grep='vim-patch:[^ ]+' | grep 'vim-patch')"
+ tokens="$(for i in $tokens ; do echo "$i" | grep -E 'vim-patch:[^ ]{7}' | sed 's/.*\(vim-patch:[.0-9a-z]\+\).*/\1/' ; done)"
+
local vim_commit
for vim_commit in ${vim_commits}; do
local is_missing
@@ -334,23 +341,31 @@ list_vim_patches() {
# This fails for untagged commits (e.g., runtime file updates) so mask the return status
vim_tag="$(cd "${VIM_SOURCE_DIR}" && git describe --tags --exact-match "${vim_commit}" 2>/dev/null)" || true
if [[ -n "${vim_tag}" ]]; then
- local patch_number="${vim_tag:5}" # Remove prefix like "v7.4."
- patch_number="$(echo ${patch_number} | sed 's/^0*//g')" # Remove prefix "0"
- # Tagged Vim patch, check version.c:
- is_missing="$(sed -n '/static const int included_patches/,/}/p' "${NVIM_SOURCE_DIR}/src/nvim/version.c" |
- grep -x -e "[[:space:]]*//[[:space:]]${patch_number} NA.*" -e "[[:space:]]*${patch_number}," >/dev/null && echo "false" || echo "true")"
+ # Vim version number (not commit hash).
+ local patch_number="${vim_tag:1}" # "v7.4.0001" => "7.4.0001"
+ is_missing="$(echo "$tokens" | >/dev/null 2>&1 grep "vim\-patch:${patch_number}" && echo false || echo true)"
vim_commit="${vim_tag#v}"
- if (cd "${VIM_SOURCE_DIR}" && git --no-pager show --color=never --name-only "v${vim_commit}" 2>/dev/null) | grep -q ^runtime; then
- vim_commit="${vim_commit} (+runtime)"
- fi
else
- # Untagged Vim patch (e.g. runtime updates), check the Neovim git log:
- is_missing="$(cd "${NVIM_SOURCE_DIR}" &&
- git log -1 --no-merges --grep="vim\-patch:${vim_commit:0:7}" --pretty=format:false)"
+ # Untagged Vim patch (e.g. runtime updates).
+ is_missing="$(echo "$tokens" | >/dev/null 2>&1 grep "vim\-patch:${vim_commit:0:7}" && echo false || echo true)"
fi
- if [[ ${is_missing} != "false" ]]; then
- echo " • ${vim_commit}"
+ if ! [ "$is_missing" = "false" ]; then
+ echo "${vim_commit}"
+ fi
+ done
+}
+
+# Prints a human-formatted list of Vim commits, with instructional messages.
+show_vim_patches() {
+ get_vim_sources
+ printf "\nVim patches missing from Neovim:\n"
+
+ list_vim_patches | while read vim_commit; do
+ if (cd "${VIM_SOURCE_DIR}" && git --no-pager show --color=never --name-only "v${vim_commit}" 2>/dev/null) | grep -q ^runtime; then
+ printf " • ${vim_commit} (+runtime)\n"
+ else
+ printf " • ${vim_commit}\n"
fi
done
@@ -461,13 +476,17 @@ review_pr() {
clean_files
}
-while getopts "hlp:P:g:r:s" opt; do
+while getopts "hlLp:P:g:r:s" opt; do
case ${opt} in
h)
usage
exit 0
;;
l)
+ show_vim_patches
+ exit 0
+ ;;
+ L)
list_vim_patches
exit 0
;;
diff --git a/src/nvim/CMakeLists.txt b/src/nvim/CMakeLists.txt
index d3e07326bf..7eb1afa135 100644
--- a/src/nvim/CMakeLists.txt
+++ b/src/nvim/CMakeLists.txt
@@ -13,6 +13,9 @@ endif()
if(WIN32)
# tell MinGW compiler to enable wmain
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -municode")
+elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -framework CoreFoundation")
+ set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -framework CoreFoundation")
endif()
set(TOUCHES_DIR ${PROJECT_BINARY_DIR}/touches)
diff --git a/src/nvim/api/buffer.c b/src/nvim/api/buffer.c
index 4b6a88e5fa..fdde28f2bb 100644
--- a/src/nvim/api/buffer.c
+++ b/src/nvim/api/buffer.c
@@ -763,8 +763,8 @@ ArrayOf(Integer, 2) nvim_buf_get_mark(Buffer buffer, String name, Error *err)
/// or -1 for ungrouped highlight
/// @param hl_group Name of the highlight group to use
/// @param line Line to highlight (zero-indexed)
-/// @param col_start Start of range of columns to highlight
-/// @param col_end End of range of columns to highlight,
+/// @param col_start Start of (byte-indexed) column range to highlight
+/// @param col_end End of (byte-indexed) column range to highlight,
/// or -1 to highlight to end of line
/// @param[out] err Error details, if any
/// @return The src_id that was used
diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c
index 416e7d22d2..f0db391abe 100644
--- a/src/nvim/api/vim.c
+++ b/src/nvim/api/vim.c
@@ -789,6 +789,10 @@ ArrayOf(Dictionary) nvim_get_keymap(String mode)
return keymap_array(mode, NULL);
}
+/// Returns a 2-tuple (Array), where item 0 is the current channel id and item
+/// 1 is the |api-metadata| map (Dictionary).
+///
+/// @returns 2-tuple [{channel-id}, {api-metadata}]
Array nvim_get_api_info(uint64_t channel_id)
FUNC_API_SINCE(1) FUNC_API_ASYNC FUNC_API_REMOTE_ONLY
{
@@ -896,7 +900,9 @@ typedef struct {
Object *ret_node_p;
} ExprASTConvStackItem;
+///@cond DOXYGEN_NOT_A_FUNCTION
typedef kvec_withinit_t(ExprASTConvStackItem, 16) ExprASTConvStack;
+///@endcond
/// Parse a VimL expression
///
diff --git a/src/nvim/option.c b/src/nvim/option.c
index 37c4233142..f8a05f133d 100644
--- a/src/nvim/option.c
+++ b/src/nvim/option.c
@@ -75,6 +75,7 @@
#include "nvim/window.h"
#include "nvim/os/os.h"
#include "nvim/os/input.h"
+#include "nvim/os/lang.h"
/*
* The options that are local to a window or buffer have "indir" set to one of
@@ -784,6 +785,8 @@ void set_init_1(void)
didset_options2();
+ lang_init();
+
// enc_locale() will try to find the encoding of the current locale.
// This will be used when 'default' is used as encoding specifier
// in 'fileencodings'
diff --git a/src/nvim/os/lang.c b/src/nvim/os/lang.c
new file mode 100644
index 0000000000..f0bbf4b1cb
--- /dev/null
+++ b/src/nvim/os/lang.c
@@ -0,0 +1,40 @@
+#ifdef __APPLE__
+# define Boolean CFBoolean // Avoid conflict with API's Boolean
+# include <CoreFoundation/CFLocale.h>
+# include <CoreFoundation/CFString.h>
+# undef Boolean
+#endif
+
+#ifdef HAVE_LOCALE_H
+# include <locale.h>
+#endif
+#include "nvim/os/os.h"
+
+void lang_init(void)
+{
+#ifdef __APPLE__
+ if (os_getenv("LANG") == NULL) {
+ CFLocaleRef cf_locale = CFLocaleCopyCurrent();
+ CFTypeRef cf_lang_region = CFLocaleGetValue(cf_locale,
+ kCFLocaleIdentifier);
+ CFRetain(cf_lang_region);
+ CFRelease(cf_locale);
+
+ const char *lang_region = CFStringGetCStringPtr(cf_lang_region,
+ kCFStringEncodingUTF8);
+ if (lang_region) {
+ os_setenv("LANG", lang_region, true);
+ } else {
+ char buf[20] = { 0 };
+ if (CFStringGetCString(cf_lang_region, buf, 20,
+ kCFStringEncodingUTF8)) {
+ os_setenv("LANG", lang_region, true);
+ }
+ }
+ CFRelease(cf_lang_region);
+# ifdef HAVE_LOCALE_H
+ setlocale(LC_ALL, "");
+# endif
+ }
+#endif
+}
diff --git a/src/nvim/os/lang.h b/src/nvim/os/lang.h
new file mode 100644
index 0000000000..f60e064f57
--- /dev/null
+++ b/src/nvim/os/lang.h
@@ -0,0 +1,7 @@
+#ifndef NVIM_OS_LANG_H
+#define NVIM_OS_LANG_H
+
+#ifdef INCLUDE_GENERATED_DECLARATIONS
+# include "os/lang.h.generated.h"
+#endif
+#endif // NVIM_OS_LANG_H
diff --git a/src/nvim/testdir/Makefile b/src/nvim/testdir/Makefile
index 111bd172ef..e1faaccb84 100644
--- a/src/nvim/testdir/Makefile
+++ b/src/nvim/testdir/Makefile
@@ -2,7 +2,11 @@
# Makefile to run all tests for Vim
#
-NVIM_PRG ?= ../../../build/bin/nvim
+ifeq ($(OS),Windows_NT)
+ NVIM_PRG ?= ../../../build/bin/nvim.exe
+else
+ NVIM_PRG ?= ../../../build/bin/nvim
+endif
TMPDIR ?= Xtest-tmpdir
SCRIPTSOURCE := ../../../runtime
@@ -10,12 +14,9 @@ export SHELL := sh
export NVIM_PRG := $(NVIM_PRG)
export TMPDIR
-SCRIPTS ?= \
- test13.out \
+SCRIPTS_DEFAULT = \
test14.out \
- test17.out \
test24.out \
- test32.out \
test37.out \
test40.out \
test42.out \
@@ -27,6 +28,15 @@ SCRIPTS ?= \
test73.out \
test79.out \
+ifneq ($(OS),Windows_NT)
+ SCRIPTS_DEFAULTS := $(SCRIPTS_DEFAULT) \
+ test17.out \
+ test32.out \
+
+endif
+
+SCRIPTS ?= $(SCRIPTS_DEFAULT)
+
# Tests using runtest.vim.
# Keep test_alot*.res as the last one, sort the others.
NEW_TESTS ?= \
diff --git a/src/nvim/testdir/unix.vim b/src/nvim/testdir/unix.vim
index a7daacf8cf..ce2beff7fe 100644
--- a/src/nvim/testdir/unix.vim
+++ b/src/nvim/testdir/unix.vim
@@ -2,6 +2,12 @@
" Always use "sh", don't use the value of "$SHELL".
set shell=sh
+if has('win32')
+ set shellcmdflag=-c shellxquote= shellxescape= shellquote=
+ let &shellredir = '>%s 2>&1'
+ set shellslash
+endif
+
" Don't depend on system locale, always use utf-8
set encoding=utf-8
diff --git a/src/nvim/tui/tui.c b/src/nvim/tui/tui.c
index 6e2a5cbe67..9ff1acf64a 100644
--- a/src/nvim/tui/tui.c
+++ b/src/nvim/tui/tui.c
@@ -1529,7 +1529,7 @@ static void patch_terminfo_bugs(TUIData *data, const char *term,
|| iterm || iterm_pretending_xterm
|| teraterm // per TeraTerm "Supported Control Functions" doco
// Some linux-type terminals (such as console-terminal-emulator
- // from the nosh toolset) implement implement the xterm extension.
+ // from the nosh toolset) implement the xterm extension.
|| (linuxvt && (xterm_version || (vte_version > 0) || colorterm)))) {
data->unibi_ext.set_cursor_style =
(int)unibi_add_ext_str(ut, "Ss", "\x1b[%p1%d q");
diff --git a/src/nvim/version.c b/src/nvim/version.c
index 1a9c9d73e5..e8cf1d0f0b 100644
--- a/src/nvim/version.c
+++ b/src/nvim/version.c
@@ -1012,7 +1012,7 @@ static const int included_patches[] = {
247,
// 246 NA
245,
- // 244,
+ // 244 NA
243,
242,
// 241 NA
@@ -1041,7 +1041,7 @@ static const int included_patches[] = {
218,
// 217 NA
// 216,
- // 215,
+ // 215 NA
// 214,
// 213 NA
// 212,
diff --git a/src/nvim/window.c b/src/nvim/window.c
index 4c996aea79..28cb9449d1 100644
--- a/src/nvim/window.c
+++ b/src/nvim/window.c
@@ -1991,6 +1991,14 @@ int win_close(win_T *win, int free_buf)
* the screen space. */
wp = win_free_mem(win, &dir, NULL);
+ if (help_window) {
+ // Closing the help window moves the cursor back to the original window.
+ win_T *tmpwp = get_snapshot_focus(SNAP_HELP_IDX);
+ if (tmpwp != NULL) {
+ wp = tmpwp;
+ }
+ }
+
/* Make sure curwin isn't invalid. It can cause severe trouble when
* printing an error message. For win_equal() curbuf needs to be valid
* too. */
@@ -5421,6 +5429,27 @@ static win_T *restore_snapshot_rec(frame_T *sn, frame_T *fr)
return wp;
}
+/// Gets the focused window (the one holding the cursor) of the snapshot.
+static win_T *get_snapshot_focus(int idx)
+{
+ if (curtab->tp_snapshot[idx] == NULL) {
+ return NULL;
+ }
+
+ frame_T *sn = curtab->tp_snapshot[idx];
+ // This should be equivalent to the recursive algorithm found in
+ // restore_snapshot as far as traveling nodes go.
+ while (sn->fr_child != NULL || sn->fr_next != NULL) {
+ while (sn->fr_child != NULL) {
+ sn = sn->fr_child;
+ }
+ if (sn->fr_next != NULL) {
+ sn = sn->fr_next;
+ }
+ }
+
+ return sn->fr_win;
+}
/*
* Set "win" to be the curwin and "tp" to be the current tab page.
diff --git a/test/README.md b/test/README.md
index 1cb814d85b..58aa6a06aa 100644
--- a/test/README.md
+++ b/test/README.md
@@ -168,16 +168,13 @@ minutes](http://learnxinyminutes.com/docs/lua/).
Do not silently skip the test with `if-else`. If a functional test depends on
some external factor (e.g. the existence of `md5sum` on `$PATH`), *and* you
can't mock or fake the dependency, then skip the test via `pending()` if the
- external factor is missing. This ensures that the *total* test-count (success
- + fail + error + pending) is the same in all environments.
+ external factor is missing. This ensures that the *total* test-count
+ (success + fail + error + pending) is the same in all environments.
- *Note:* `pending()` is ignored if it is missing an argument _unless_ it is
- [contained in an `it()`
- block](https://github.com/neovim/neovim/blob/d21690a66e7eb5ebef18046c7a79ef898966d786/test/functional/ex_cmds/grep_spec.lua#L11).
- Provide empty function argument if the `pending()` call is outside of
- `it()`
+ [contained in an `it()` block](https://github.com/neovim/neovim/blob/d21690a66e7eb5ebef18046c7a79ef898966d786/test/functional/ex_cmds/grep_spec.lua#L11).
+ Provide empty function argument if the `pending()` call is outside of `it()`
([example](https://github.com/neovim/neovim/commit/5c1dc0fbe7388528875aff9d7b5055ad718014de#diff-bf80b24c724b0004e8418102f68b0679R18)).
-- Use `make testlint` for using the shipped luacheck program ([supported by
- syntastic](https://github.com/scrooloose/syntastic/blob/d6b96c079be137c83009827b543a83aa113cc011/doc/syntastic-checkers.txt#L3546))
+- Use `make testlint` for using the shipped luacheck program ([supported by syntastic](https://github.com/scrooloose/syntastic/blob/d6b96c079be137c83009827b543a83aa113cc011/doc/syntastic-checkers.txt#L3546))
to lint all tests.
### Where tests go
diff --git a/test/functional/autocmd/bufenter_spec.lua b/test/functional/autocmd/bufenter_spec.lua
index fef9838050..e14ddb3316 100644
--- a/test/functional/autocmd/bufenter_spec.lua
+++ b/test/functional/autocmd/bufenter_spec.lua
@@ -31,4 +31,17 @@ describe('autocmd BufEnter', function()
eq(1, eval("exists('g:dir_bufenter')")) -- Did BufEnter for the directory.
eq(2, eval("bufnr('%')")) -- Switched to the dir buffer.
end)
+
+ it('triggered by ":split normal|:help|:bw"', function()
+ command("split normal")
+ command("wincmd j")
+ command("helptags runtime/doc")
+ command("help")
+ command("wincmd L")
+ command("autocmd BufEnter normal let g:bufentered = 1")
+ command("bw")
+ eq(1, eval('bufnr("%")')) -- The cursor is back to the bottom window
+ eq(0, eval("exists('g:bufentered')")) -- The autocmd hasn't been triggered
+ end)
+
end)