mirror of
https://github.com/neovim/neovim.git
synced 2024-09-17 20:58:20 -04:00
Compare commits
106 Commits
2fb0084ab2
...
95b65a7554
Author | SHA1 | Date | |
---|---|---|---|
|
95b65a7554 | ||
|
e37404f7fe | ||
|
b40ec083ae | ||
|
d338ec9cb2 | ||
|
5ddf2ab768 | ||
|
3d1110674e | ||
|
738a84de09 | ||
|
439d031742 | ||
|
c81cb02dd6 | ||
|
fa99afe35e | ||
|
9570ad24f5 | ||
|
d60c753cff | ||
|
e36e68d35c | ||
|
f4d823b123 | ||
|
76aa3e52be | ||
|
f9108378b7 | ||
|
975aeee537 | ||
|
882a450a29 | ||
|
220b8aa6fe | ||
|
51088b67cb | ||
|
34ded4d97b | ||
|
b6e350a6b4 | ||
|
7b7c95dac9 | ||
|
45e76acaa0 | ||
|
fdd3a9cdf7 | ||
|
d1d7d54680 | ||
|
ceddaedfad | ||
|
ea2d949351 | ||
|
ae9674704a | ||
|
96128a5076 | ||
|
137f98cf64 | ||
|
ef8067a19d | ||
|
60ea046741 | ||
|
50a576ba57 | ||
|
a8fc799e8b | ||
|
13c739a664 | ||
|
bcae8be91f | ||
|
61e9137394 | ||
|
6913c5e1d9 | ||
|
318c0415d5 | ||
|
97f8d1de1c | ||
|
9b983e5f6c | ||
|
195eca94d4 | ||
|
9762c5e340 | ||
|
808d73b5df | ||
|
bfa365a872 | ||
|
f046c3eca6 | ||
|
751ab0e4ca | ||
|
5f81c36934 | ||
|
ea2998fec9 | ||
|
6f167fcae9 | ||
|
4ee65484b1 | ||
|
e1937286f0 | ||
|
26be6446e5 | ||
|
a6c4487e8b | ||
|
53af02adba | ||
|
55dc482e75 | ||
|
42ed0ffad9 | ||
|
5f95f1249f | ||
|
cfdf68a7ac | ||
|
4353996d0f | ||
|
862679c70f | ||
|
9a3c8f64a7 | ||
|
59baa5e8a1 | ||
|
176bfea135 | ||
|
7588ff2d89 | ||
|
6c2186a998 | ||
|
0346666f71 | ||
|
cd05a72fec | ||
|
3085c9d9da | ||
|
3a61f05dd2 | ||
|
3bcd5624be | ||
|
dad55f5e76 | ||
|
f8e1ebd6f6 | ||
|
d9ccd828b0 | ||
|
0e394f136f | ||
|
983953858e | ||
|
688b961d13 | ||
|
664de5ea97 | ||
|
c0a8abf18e | ||
|
b8135a76b7 | ||
|
cf44121f7f | ||
|
84f1c5e072 | ||
|
91ce0c3ddd | ||
|
bb4b6b427c | ||
|
2c6222c56b | ||
|
8010d1c0ed | ||
|
8f9669a27c | ||
|
6af9ca4926 | ||
|
3b32869ced | ||
|
8db8793503 | ||
|
916237d9b5 | ||
|
8c405d9b34 | ||
|
1f5bcc7c4e | ||
|
e48179f31e | ||
|
3bd7492a69 | ||
|
362389eb15 | ||
|
4e5607eb37 | ||
|
a691858326 | ||
|
78e48cd9b5 | ||
|
6f7bb02e7f | ||
|
a9e11168f5 | ||
|
9f49529627 | ||
|
9639552572 | ||
|
abd1b1ff42 | ||
|
41859c2d8c |
15
.github/workflows/build.yml
vendored
15
.github/workflows/build.yml
vendored
@ -21,6 +21,21 @@ env:
|
||||
INSTALL_PREFIX: ${{ github.workspace }}/nvim-install
|
||||
|
||||
jobs:
|
||||
wasmtime:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
test: [ubuntu-latest, macos-latest, windows-latest]
|
||||
runs-on: ${{ matrix.test }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: ./.github/actions/setup
|
||||
- run: |
|
||||
cmake -S cmake.deps --preset ci -D ENABLE_WASMTIME=ON
|
||||
cmake --build .deps
|
||||
cmake --preset ci -D ENABLE_WASMTIME=ON
|
||||
cmake --build build
|
||||
|
||||
old-cmake:
|
||||
name: Test oldest supported cmake
|
||||
runs-on: ubuntu-latest
|
||||
|
6
.github/workflows/optional.yml
vendored
6
.github/workflows/optional.yml
vendored
@ -11,7 +11,7 @@ concurrency:
|
||||
env:
|
||||
INSTALL_PREFIX: ${{ github.workspace }}/nvim-install
|
||||
# Double test timeout since it's running via qemu
|
||||
TEST_TIMEOUT: 2400
|
||||
TEST_TIMEOUT: 3600
|
||||
# TEST_FILE: test/functional/shada
|
||||
# TEST_FILTER: foo
|
||||
|
||||
@ -23,7 +23,7 @@ jobs:
|
||||
matrix:
|
||||
test: [functionaltest, oldtest]
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 60
|
||||
timeout-minutes: 90
|
||||
steps:
|
||||
- run: docker run --rm --privileged multiarch/qemu-user-static:register --reset
|
||||
- uses: docker://multiarch/ubuntu-core:s390x-focal
|
||||
@ -34,7 +34,7 @@ jobs:
|
||||
bash -c
|
||||
"
|
||||
apt-get -y update &&
|
||||
DEBIAN_FRONTEND=noninteractive apt-get -y install build-essential cmake curl gettext ninja-build locales-all cpanminus git attr libattr1-dev &&
|
||||
time DEBIAN_FRONTEND=noninteractive apt-get -y install build-essential cmake curl gettext ninja-build locales-all cpanminus git attr libattr1-dev xdg-utils &&
|
||||
useradd --create-home qemuci &&
|
||||
chown -R qemuci. . &&
|
||||
runuser -u qemuci -- git clone --depth=1 https://github.com/neovim/neovim.git &&
|
||||
|
@ -130,6 +130,7 @@ else()
|
||||
option(ENABLE_LTO "enable link time optimization" ON)
|
||||
endif()
|
||||
option(ENABLE_LIBINTL "enable libintl" ON)
|
||||
option(ENABLE_WASMTIME "enable wasmtime" OFF)
|
||||
|
||||
message(STATUS "CMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}")
|
||||
|
||||
|
@ -112,7 +112,7 @@ sudo rm -rf /opt/nvim
|
||||
sudo tar -C /opt -xzf nvim-linux64.tar.gz
|
||||
```
|
||||
|
||||
Then add this to your shell config (`~/.bashrc`, `~/. zshrc`, ...):
|
||||
Then add this to your shell config (`~/.bashrc`, `~/.zshrc`, ...):
|
||||
|
||||
export PATH="$PATH:/opt/nvim-linux64/bin"
|
||||
|
||||
@ -129,7 +129,7 @@ To expose nvim globally:
|
||||
mkdir -p /opt/nvim
|
||||
mv nvim.appimage /opt/nvim/nvim
|
||||
|
||||
And the following line to your shell config (`~/.bashrc`, `~/. zshrc`, ...):
|
||||
And the following line to your shell config (`~/.bashrc`, `~/.zshrc`, ...):
|
||||
|
||||
export PATH="$PATH:/opt/nvim/"
|
||||
|
||||
|
12
MAINTAIN.md
12
MAINTAIN.md
@ -160,7 +160,6 @@ These dependencies are "vendored" (inlined), we must update the sources manually
|
||||
* Needs to be updated when LPeg is updated.
|
||||
* `src/bit.c`: only for PUC lua: port of `require'bit'` from luajit https://bitop.luajit.org/
|
||||
* `runtime/lua/coxpcall.lua`: coxpcall (only needed for PUC lua, builtin to luajit)
|
||||
* `src/termkey`: [libtermkey](https://github.com/neovim/libtermkey)
|
||||
|
||||
Other dependencies
|
||||
--------------------------
|
||||
@ -170,6 +169,9 @@ Other dependencies
|
||||
* https://github.com/nvim-winget
|
||||
* Org secrets/tokens:
|
||||
* `CODECOV_TOKEN`
|
||||
* `BACKPORT_KEY`
|
||||
* Org/repo variables:
|
||||
* `BACKPORT_APP`
|
||||
* Domain names (held in https://namecheap.com):
|
||||
* neovim.org
|
||||
* neovim.io
|
||||
@ -185,10 +187,10 @@ Refactoring
|
||||
|
||||
Refactoring Vim structurally and aesthetically is an important goal of Neovim.
|
||||
But there are some modules that should not be changed significantly, because
|
||||
they are maintained Vim, at present. Until someone takes "ownership" of these
|
||||
modules, the cost of any significant changes (including style or structural
|
||||
changes that re-arrange the code) to these modules outweighs the benefit. The
|
||||
modules are:
|
||||
they are maintained by Vim, at present. Until someone takes "ownership" of
|
||||
these modules, the cost of any significant changes (including style or
|
||||
structural changes that re-arrange the code) to these modules outweighs the
|
||||
benefit. The modules are:
|
||||
|
||||
- `regexp.c`
|
||||
- `indent_c.c`
|
||||
|
79
Makefile
79
Makefile
@ -1,3 +1,25 @@
|
||||
ifeq ($(OS),Windows_NT)
|
||||
SHELL := powershell.exe
|
||||
.SHELLFLAGS := -NoProfile -NoLogo
|
||||
MKDIR := @$$null = new-item -itemtype directory -force
|
||||
TOUCH := @$$null = new-item -force
|
||||
RM := remove-item -force
|
||||
CMAKE := cmake
|
||||
CMAKE_GENERATOR := Ninja
|
||||
define rmdir
|
||||
if (Test-Path $1) { remove-item -recurse $1 }
|
||||
endef
|
||||
else
|
||||
MKDIR := mkdir -p
|
||||
TOUCH := touch
|
||||
RM := rm -rf
|
||||
CMAKE := $(shell (command -v cmake3 || echo cmake))
|
||||
CMAKE_GENERATOR ?= "$(shell (command -v ninja > /dev/null 2>&1 && echo "Ninja") || echo "Unix Makefiles")"
|
||||
define rmdir
|
||||
rm -rf $1
|
||||
endef
|
||||
endif
|
||||
|
||||
MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST)))
|
||||
MAKEFILE_DIR := $(dir $(MAKEFILE_PATH))
|
||||
|
||||
@ -9,7 +31,6 @@ filter-true = $(strip $(filter-out 1 on ON true TRUE,$1))
|
||||
|
||||
all: nvim
|
||||
|
||||
CMAKE ?= $(shell (command -v cmake3 || echo cmake))
|
||||
CMAKE_FLAGS := -DCMAKE_BUILD_TYPE=$(CMAKE_BUILD_TYPE)
|
||||
# Extra CMake flags which extend the default set
|
||||
CMAKE_EXTRA_FLAGS ?=
|
||||
@ -37,21 +58,11 @@ else
|
||||
checkprefix: ;
|
||||
endif
|
||||
|
||||
CMAKE_GENERATOR ?= $(shell (command -v ninja > /dev/null 2>&1 && echo "Ninja") || \
|
||||
echo "Unix Makefiles")
|
||||
DEPS_BUILD_DIR ?= .deps
|
||||
DEPS_BUILD_DIR ?= ".deps"
|
||||
ifneq (1,$(words [$(DEPS_BUILD_DIR)]))
|
||||
$(error DEPS_BUILD_DIR must not contain whitespace)
|
||||
endif
|
||||
|
||||
ifeq (,$(BUILD_TOOL))
|
||||
ifeq (Ninja,$(CMAKE_GENERATOR))
|
||||
BUILD_TOOL = ninja
|
||||
else
|
||||
BUILD_TOOL = $(MAKE)
|
||||
endif
|
||||
endif
|
||||
|
||||
DEPS_CMAKE_FLAGS ?=
|
||||
USE_BUNDLED ?=
|
||||
|
||||
@ -61,7 +72,7 @@ endif
|
||||
|
||||
ifneq (,$(findstring functionaltest-lua,$(MAKECMDGOALS)))
|
||||
BUNDLED_LUA_CMAKE_FLAG := -DUSE_BUNDLED_LUA=ON
|
||||
$(shell [ -x $(DEPS_BUILD_DIR)/usr/bin/lua ] || rm build/.ran-*)
|
||||
$(shell [ -x $(DEPS_BUILD_DIR)/usr/bin/lua ] || $(RM) build/.ran-*)
|
||||
endif
|
||||
|
||||
# For use where we want to make sure only a single job is run. This does issue
|
||||
@ -69,34 +80,33 @@ endif
|
||||
SINGLE_MAKE = export MAKEFLAGS= ; $(MAKE)
|
||||
|
||||
nvim: build/.ran-cmake deps
|
||||
$(BUILD_TOOL) -C build
|
||||
$(CMAKE) --build build
|
||||
|
||||
libnvim: build/.ran-cmake deps
|
||||
$(BUILD_TOOL) -C build libnvim
|
||||
$(CMAKE) --build build --target libnvim
|
||||
|
||||
cmake:
|
||||
touch CMakeLists.txt
|
||||
$(TOUCH) CMakeLists.txt
|
||||
$(MAKE) build/.ran-cmake
|
||||
|
||||
build/.ran-cmake: | deps
|
||||
$(CMAKE) -B build -G '$(CMAKE_GENERATOR)' $(CMAKE_FLAGS) $(CMAKE_EXTRA_FLAGS) $(MAKEFILE_DIR)
|
||||
touch $@
|
||||
$(CMAKE) -B build -G $(CMAKE_GENERATOR) $(CMAKE_FLAGS) $(CMAKE_EXTRA_FLAGS) $(MAKEFILE_DIR)
|
||||
$(TOUCH) $@
|
||||
|
||||
deps: | build/.ran-deps-cmake
|
||||
ifeq ($(call filter-true,$(USE_BUNDLED)),)
|
||||
$(BUILD_TOOL) -C $(DEPS_BUILD_DIR)
|
||||
$(CMAKE) --build $(DEPS_BUILD_DIR)
|
||||
endif
|
||||
|
||||
ifeq ($(call filter-true,$(USE_BUNDLED)),)
|
||||
$(DEPS_BUILD_DIR):
|
||||
mkdir -p "$@"
|
||||
$(MKDIR) $@
|
||||
build/.ran-deps-cmake:: $(DEPS_BUILD_DIR)
|
||||
$(CMAKE) -S $(MAKEFILE_DIR)/cmake.deps -B $(DEPS_BUILD_DIR) -G '$(CMAKE_GENERATOR)' \
|
||||
$(BUNDLED_CMAKE_FLAG) $(BUNDLED_LUA_CMAKE_FLAG) $(DEPS_CMAKE_FLAGS)
|
||||
$(CMAKE) -S $(MAKEFILE_DIR)/cmake.deps -B $(DEPS_BUILD_DIR) -G $(CMAKE_GENERATOR) $(BUNDLED_CMAKE_FLAG) $(BUNDLED_LUA_CMAKE_FLAG) $(DEPS_CMAKE_FLAGS)
|
||||
endif
|
||||
build/.ran-deps-cmake::
|
||||
mkdir -p build
|
||||
touch $@
|
||||
$(MKDIR) build
|
||||
$(TOUCH) "$@"
|
||||
|
||||
# TODO: cmake 3.2+ add_custom_target() has a USES_TERMINAL flag.
|
||||
oldtest: | nvim
|
||||
@ -113,7 +123,7 @@ test/old/testdir/%.vim: phony_force nvim
|
||||
$(SINGLE_MAKE) -C test/old/testdir NVIM_PRG=$(NVIM_PRG) SCRIPTS= $(MAKEOVERRIDES) $(patsubst test/old/testdir/%.vim,%,$@)
|
||||
|
||||
functionaltest-lua: | nvim
|
||||
$(BUILD_TOOL) -C build functionaltest
|
||||
$(CMAKE) --build build --target functionaltest
|
||||
|
||||
FORMAT=formatc formatlua format
|
||||
LINT=lintlua lintsh lintc clang-analyzer lintcommit lintdoc lint
|
||||
@ -135,16 +145,19 @@ iwyu: build/.ran-cmake
|
||||
$(CMAKE) --build build
|
||||
|
||||
clean:
|
||||
test -d build && $(BUILD_TOOL) -C build clean || true
|
||||
ifneq ($(wildcard build),)
|
||||
$(CMAKE) --build build --target clean
|
||||
endif
|
||||
$(MAKE) -C test/old/testdir clean
|
||||
$(MAKE) -C runtime/indent clean
|
||||
|
||||
distclean:
|
||||
rm -rf $(DEPS_BUILD_DIR) build
|
||||
$(call rmdir, $(DEPS_BUILD_DIR))
|
||||
$(call rmdir, build)
|
||||
$(MAKE) clean
|
||||
|
||||
install: checkprefix nvim
|
||||
$(BUILD_TOOL) -C build install
|
||||
$(CMAKE) --install build
|
||||
|
||||
appimage:
|
||||
bash scripts/genappimage.sh
|
||||
@ -155,14 +168,4 @@ appimage:
|
||||
appimage-%:
|
||||
bash scripts/genappimage.sh $*
|
||||
|
||||
# Generic pattern rules, allowing for `make build/bin/nvim` etc.
|
||||
# Does not work with "Unix Makefiles".
|
||||
ifeq ($(CMAKE_GENERATOR),Ninja)
|
||||
build/%: phony_force
|
||||
$(BUILD_TOOL) -C build $(patsubst build/%,%,$@)
|
||||
|
||||
$(DEPS_BUILD_DIR)/%: phony_force
|
||||
$(BUILD_TOOL) -C $(DEPS_BUILD_DIR) $(patsubst $(DEPS_BUILD_DIR)/%,%,$@)
|
||||
endif
|
||||
|
||||
.PHONY: test clean distclean nvim libnvim cmake deps install appimage checkprefix benchmark $(FORMAT) $(LINT) $(TEST)
|
||||
|
@ -36,6 +36,7 @@ option(USE_BUNDLED_TS "Use the bundled treesitter runtime." ${USE_BUNDLED})
|
||||
option(USE_BUNDLED_TS_PARSERS "Use the bundled treesitter parsers." ${USE_BUNDLED})
|
||||
option(USE_BUNDLED_UNIBILIUM "Use the bundled unibilium." ${USE_BUNDLED})
|
||||
option(USE_BUNDLED_UTF8PROC "Use the bundled utf8proc library." ${USE_BUNDLED})
|
||||
|
||||
if(USE_BUNDLED AND MSVC)
|
||||
option(USE_BUNDLED_GETTEXT "Use the bundled version of gettext." ON)
|
||||
option(USE_BUNDLED_LIBICONV "Use the bundled version of libiconv." ON)
|
||||
@ -44,6 +45,19 @@ else()
|
||||
option(USE_BUNDLED_LIBICONV "Use the bundled version of libiconv." OFF)
|
||||
endif()
|
||||
|
||||
option(ENABLE_WASMTIME "Use treesitter with wasmtime support." OFF)
|
||||
if(ENABLE_WASMTIME)
|
||||
if(USE_BUNDLED)
|
||||
option(USE_BUNDLED_WASMTIME "Use the bundled wasmtime." ON)
|
||||
else()
|
||||
option(USE_BUNDLED_WASMTIME "Use the bundled wasmtime." OFF)
|
||||
endif()
|
||||
endif()
|
||||
if(NOT ENABLE_WASMTIME AND USE_BUNDLED_WASMTIME)
|
||||
message(FATAL_ERROR "ENABLE_WASMTIME is set to OFF while USE_BUNDLED_WASMTIME is set to ON.\
|
||||
You need set ENABLE_WASMTIME to ON if you want to use wasmtime.")
|
||||
endif()
|
||||
|
||||
option(USE_EXISTING_SRC_DIR "Skip download of deps sources in case of existing source directory." OFF)
|
||||
|
||||
set_default_buildtype(Release)
|
||||
@ -127,6 +141,10 @@ if(USE_BUNDLED_TS_PARSERS)
|
||||
include(BuildTreesitterParsers)
|
||||
endif()
|
||||
|
||||
if(USE_BUNDLED_WASMTIME)
|
||||
include(BuildWasmtime)
|
||||
endif()
|
||||
|
||||
if(USE_BUNDLED_TS)
|
||||
include(BuildTreesitter)
|
||||
endif()
|
||||
|
@ -17,7 +17,8 @@
|
||||
"cacheVariables": {
|
||||
"USE_BUNDLED":"OFF",
|
||||
"USE_BUNDLED_TS":"ON",
|
||||
"USE_BUNDLED_UTF8PROC":"ON"
|
||||
"USE_BUNDLED_UTF8PROC":"ON",
|
||||
"ENABLE_WASMTIME":"OFF"
|
||||
},
|
||||
"inherits": ["base"]
|
||||
}
|
||||
|
@ -1,8 +1,24 @@
|
||||
if(ENABLE_WASMTIME)
|
||||
if(USE_BUNDLED_WASMTIME)
|
||||
set(WASMTIME_CACHE_ARGS "-DCMAKE_C_FLAGS:STRING=-I${DEPS_INSTALL_DIR}/include/wasmtime -I${DEPS_INSTALL_DIR}/include")
|
||||
else()
|
||||
find_package(Wasmtime 24.0.0 EXACT REQUIRED)
|
||||
set(WASMTIME_CACHE_ARGS "-DCMAKE_C_FLAGS:STRING=-I${WASMTIME_INCLUDE_DIR}")
|
||||
endif()
|
||||
string(APPEND WASMTIME_CACHE_ARGS " -DTREE_SITTER_FEATURE_WASM")
|
||||
set(WASMTIME_ARGS -D CMAKE_C_STANDARD=11)
|
||||
endif()
|
||||
|
||||
get_externalproject_options(treesitter ${DEPS_IGNORE_SHA})
|
||||
ExternalProject_Add(treesitter
|
||||
DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/treesitter
|
||||
PATCH_COMMAND ${CMAKE_COMMAND} -E copy
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/cmake/TreesitterCMakeLists.txt
|
||||
${DEPS_BUILD_DIR}/src/treesitter/CMakeLists.txt
|
||||
CMAKE_ARGS ${DEPS_CMAKE_ARGS}
|
||||
CMAKE_ARGS ${DEPS_CMAKE_ARGS} ${WASMTIME_ARGS}
|
||||
CMAKE_CACHE_ARGS ${WASMTIME_CACHE_ARGS}
|
||||
${EXTERNALPROJECT_OPTIONS})
|
||||
|
||||
if(USE_BUNDLED_WASMTIME)
|
||||
add_dependencies(treesitter wasmtime)
|
||||
endif()
|
||||
|
11
cmake.deps/cmake/BuildWasmtime.cmake
Normal file
11
cmake.deps/cmake/BuildWasmtime.cmake
Normal file
@ -0,0 +1,11 @@
|
||||
# wasmtime is a chungus -- optimize _extra hard_ to keep nvim svelte
|
||||
get_externalproject_options(wasmtime ${DEPS_IGNORE_SHA})
|
||||
ExternalProject_Add(wasmtime
|
||||
DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/wasmtime
|
||||
SOURCE_SUBDIR crates/c-api
|
||||
CMAKE_ARGS ${DEPS_CMAKE_ARGS}
|
||||
-D WASMTIME_FASTEST_RUNTIME=ON # build with full LTO
|
||||
-D WASMTIME_DISABLE_ALL_FEATURES=ON # don't need all that crap...
|
||||
-D WASMTIME_FEATURE_CRANELIFT=ON # ...except this one (compiles wasm to platform code)
|
||||
USES_TERMINAL_BUILD TRUE
|
||||
${EXTERNALPROJECT_OPTIONS})
|
@ -5,7 +5,7 @@ add_compile_options(-w)
|
||||
|
||||
add_library(tree-sitter lib/src/lib.c)
|
||||
target_include_directories(tree-sitter
|
||||
PRIVATE lib/src lib/include)
|
||||
PRIVATE lib/src lib/src/wasm lib/include)
|
||||
|
||||
install(FILES
|
||||
lib/include/tree_sitter/api.h
|
||||
|
@ -1,8 +1,8 @@
|
||||
LIBUV_URL https://github.com/libuv/libuv/archive/v1.48.0.tar.gz
|
||||
LIBUV_SHA256 8c253adb0f800926a6cbd1c6576abae0bc8eb86a4f891049b72f9e5b7dc58f33
|
||||
LIBUV_URL https://github.com/libuv/libuv/archive/0a00e80c3686b93eccb9a801954e86bd7d7fe6ab.tar.gz
|
||||
LIBUV_SHA256 8d240ad56f779ebca94a249b2a2c71725d89182e732cf53c1f6d85098cc9bcb3
|
||||
|
||||
LUAJIT_URL https://github.com/LuaJIT/LuaJIT/archive/fb22d0f80f291827a4004e16bc589b54bcc4a3c7.tar.gz
|
||||
LUAJIT_SHA256 6ec85c9588aca09f30f2dc2a843e9710be96292e32d28fe8f606daf4a89aeb45
|
||||
LUAJIT_URL https://github.com/LuaJIT/LuaJIT/archive/f725e44cda8f359869bf8f92ce71787ddca45618.tar.gz
|
||||
LUAJIT_SHA256 2b5514bd6a6573cb6111b43d013e952cbaf46762d14ebe26c872ddb80b5a84e0
|
||||
|
||||
LUA_URL https://www.lua.org/ftp/lua-5.1.5.tar.gz
|
||||
LUA_SHA256 2640fc56a795f29d28ef15e13c34a47e223960b0240e8cb0a82d9b0738695333
|
||||
@ -35,8 +35,8 @@ GETTEXT_SHA256 66415634c6e8c3fa8b71362879ec7575e27da43da562c798a8a2f223e6e47f5c
|
||||
LIBICONV_URL https://github.com/neovim/deps/raw/b9bf36eb31f27e8136d907da38fa23518927737e/opt/libiconv-1.17.tar.gz
|
||||
LIBICONV_SHA256 8f74213b56238c85a50a5329f77e06198771e70dd9a739779f4c02f65d971313
|
||||
|
||||
UTF8PROC_URL https://github.com/JuliaStrings/utf8proc/archive/v2.9.0.tar.gz
|
||||
UTF8PROC_SHA256 18c1626e9fc5a2e192311e36b3010bfc698078f692888940f1fa150547abb0c1
|
||||
UTF8PROC_URL https://github.com/JuliaStrings/utf8proc/archive/3de4596fbe28956855df2ecb3c11c0bbc3535838.tar.gz
|
||||
UTF8PROC_SHA256 fb4a16bb659b58afb7f921fcc8928d0b3c1fcab135366c8a4f9ca7de1b1cfada
|
||||
|
||||
TREESITTER_C_URL https://github.com/tree-sitter/tree-sitter-c/archive/v0.21.3.tar.gz
|
||||
TREESITTER_C_SHA256 75a3780df6114cd37496761c4a7c9fd900c78bee3a2707f590d78c0ca3a24368
|
||||
@ -50,8 +50,11 @@ TREESITTER_QUERY_URL https://github.com/tree-sitter-grammars/tree-sitter-query/a
|
||||
TREESITTER_QUERY_SHA256 d3a423ab66dc62b2969625e280116678a8a22582b5ff087795222108db2f6a6e
|
||||
TREESITTER_MARKDOWN_URL https://github.com/MDeiml/tree-sitter-markdown/archive/v0.2.3.tar.gz
|
||||
TREESITTER_MARKDOWN_SHA256 4909d6023643f1afc3ab219585d4035b7403f3a17849782ab803c5f73c8a31d5
|
||||
TREESITTER_URL https://github.com/tree-sitter/tree-sitter/archive/v0.22.6.tar.gz
|
||||
TREESITTER_SHA256 e2b687f74358ab6404730b7fb1a1ced7ddb3780202d37595ecd7b20a8f41861f
|
||||
TREESITTER_URL https://github.com/tree-sitter/tree-sitter/archive/v0.23.0.tar.gz
|
||||
TREESITTER_SHA256 6403b361b0014999e96f61b9c84d6950d42f0c7d6e806be79382e0232e48a11b
|
||||
|
||||
WASMTIME_URL https://github.com/bytecodealliance/wasmtime/archive/v24.0.0.tar.gz
|
||||
WASMTIME_SHA256 2ccb49bb3bfa4d86907ad4c80d1147aef6156c7b6e3f7f14ed02a39de9761155
|
||||
|
||||
UNCRUSTIFY_URL https://github.com/uncrustify/uncrustify/archive/uncrustify-0.79.0.tar.gz
|
||||
UNCRUSTIFY_SHA256 e7afaeabf636b7f0ce4e3e9747b95f7bd939613a8db49579755dddf44fedca5f
|
||||
|
22
cmake/FindWasmtime.cmake
Normal file
22
cmake/FindWasmtime.cmake
Normal file
@ -0,0 +1,22 @@
|
||||
find_path2(WASMTIME_INCLUDE_DIR wasmtime.h)
|
||||
find_library2(WASMTIME_LIBRARY wasmtime)
|
||||
|
||||
if(WASMTIME_INCLUDE_DIR AND EXISTS "${WASMTIME_INCLUDE_DIR}/wasmtime.h")
|
||||
file(STRINGS ${WASMTIME_INCLUDE_DIR}/wasmtime.h WASMTIME_VERSION REGEX "#define WASMTIME_VERSION")
|
||||
string(REGEX MATCH "[0-9]+\.[0-9]\.[0-9]" WASMTIME_VERSION ${WASMTIME_VERSION})
|
||||
endif()
|
||||
|
||||
find_package_handle_standard_args(Wasmtime
|
||||
REQUIRED_VARS WASMTIME_INCLUDE_DIR WASMTIME_LIBRARY
|
||||
VERSION_VAR WASMTIME_VERSION)
|
||||
|
||||
add_library(wasmtime INTERFACE)
|
||||
target_include_directories(wasmtime SYSTEM BEFORE INTERFACE ${WASMTIME_INCLUDE_DIR})
|
||||
target_link_libraries(wasmtime INTERFACE ${WASMTIME_LIBRARY})
|
||||
|
||||
if(MSVC)
|
||||
target_compile_options(wasmtime INTERFACE -DWASM_API_EXTERN= -DWASI_API_EXTERN=)
|
||||
target_link_libraries(wasmtime INTERFACE ws2_32 advapi32 userenv ntdll shell32 ole32 bcrypt)
|
||||
endif()
|
||||
|
||||
mark_as_advanced(WASMTIME_INCLUDE_DIR WASMTIME_LIBRARY)
|
@ -50,6 +50,7 @@
|
||||
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_TS=OFF
|
||||
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_TS_PARSERS=OFF
|
||||
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_UNIBILIUM=OFF
|
||||
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_UTF8PROC=OFF
|
||||
#
|
||||
# Or disable all bundled dependencies at once.
|
||||
#
|
||||
|
40
runtime/autoload/hcl.vim
Normal file
40
runtime/autoload/hcl.vim
Normal file
@ -0,0 +1,40 @@
|
||||
" Language: HCL
|
||||
" Maintainer: Gregory Anders
|
||||
" Last Change: 2024-09-03
|
||||
" Based on: https://github.com/hashivim/vim-terraform
|
||||
|
||||
function! hcl#indentexpr(lnum)
|
||||
" Beginning of the file should have no indent
|
||||
if a:lnum == 0
|
||||
return 0
|
||||
endif
|
||||
|
||||
" Usual case is to continue at the same indent as the previous non-blank line.
|
||||
let prevlnum = prevnonblank(a:lnum-1)
|
||||
let thisindent = indent(prevlnum)
|
||||
|
||||
" If that previous line is a non-comment ending in [ { (, increase the
|
||||
" indent level.
|
||||
let prevline = getline(prevlnum)
|
||||
if prevline !~# '^\s*\(#\|//\)' && prevline =~# '[\[{\(]\s*$'
|
||||
let thisindent += &shiftwidth
|
||||
endif
|
||||
|
||||
" If the current line ends a block, decrease the indent level.
|
||||
let thisline = getline(a:lnum)
|
||||
if thisline =~# '^\s*[\)}\]]'
|
||||
let thisindent -= &shiftwidth
|
||||
endif
|
||||
|
||||
" If the previous line starts a block comment /*, increase by one
|
||||
if prevline =~# '/\*'
|
||||
let thisindent += 1
|
||||
endif
|
||||
|
||||
" If the previous line ends a block comment */, decrease by one
|
||||
if prevline =~# '\*/'
|
||||
let thisindent -= 1
|
||||
endif
|
||||
|
||||
return thisindent
|
||||
endfunction
|
@ -21,6 +21,8 @@
|
||||
" 2024 Jul 30 by Vim Project: handle mark-copy to same target directory (#12112)
|
||||
" 2024 Aug 02 by Vim Project: honor g:netrw_alt{o,v} for :{S,H,V}explore (#15417)
|
||||
" 2024 Aug 15 by Vim Project: style changes, prevent E121 (#15501)
|
||||
" 2024 Aug 22 by Vim Project: fix mf-selection highlight (#15551)
|
||||
" 2024 Aug 22 by Vim Project: adjust echo output of mx command (#15550)
|
||||
" }}}
|
||||
" Former Maintainer: Charles E Campbell
|
||||
" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
|
||||
@ -6824,11 +6826,7 @@ fun! s:NetrwMarkFile(islocal,fname)
|
||||
|
||||
let ykeep = @@
|
||||
let curbufnr= bufnr("%")
|
||||
if a:fname =~ '^\a'
|
||||
let leader= '\<'
|
||||
else
|
||||
let leader= ''
|
||||
endif
|
||||
let leader= '\(^\|\s\)\zs'
|
||||
if a:fname =~ '\a$'
|
||||
let trailer = '\>[@=|\/\*]\=\ze\%( \|\t\|$\)'
|
||||
else
|
||||
@ -7437,7 +7435,13 @@ fun! s:NetrwMarkFileExe(islocal,enbloc)
|
||||
NetrwKeepj call netrw#ErrorMsg(s:ERROR,"command<".xcmd."> failed, aborting",54)
|
||||
break
|
||||
else
|
||||
echo ret
|
||||
if ret !=# ''
|
||||
echo "\n"
|
||||
" skip trailing new line
|
||||
echo ret[0:-2]
|
||||
else
|
||||
echo ret
|
||||
endif
|
||||
endif
|
||||
endfor
|
||||
|
||||
|
@ -140,6 +140,18 @@ function! provider#clipboard#Executable() abort
|
||||
let s:copy['*'] = s:copy['+']
|
||||
let s:paste['*'] = s:paste['+']
|
||||
return 'win32yank'
|
||||
elseif executable('putclip') && executable('getclip')
|
||||
let s:copy['+'] = ['putclip']
|
||||
let s:paste['+'] = ['getclip']
|
||||
let s:copy['*'] = s:copy['+']
|
||||
let s:paste['*'] = s:paste['+']
|
||||
return 'putclip'
|
||||
elseif executable('clip') && executable('powershell')
|
||||
let s:copy['+'] = ['clip']
|
||||
let s:paste['+'] = ['powershell', '-NoProfile', '-NoLogo', '-Command', 'Get-Clipboard']
|
||||
let s:copy['*'] = s:copy['+']
|
||||
let s:paste['*'] = s:paste['+']
|
||||
return 'clip'
|
||||
elseif executable('termux-clipboard-set')
|
||||
let s:copy['+'] = ['termux-clipboard-set']
|
||||
let s:paste['+'] = ['termux-clipboard-get']
|
||||
|
@ -1,6 +1,6 @@
|
||||
" zip.vim: Handles browsing zipfiles
|
||||
" AUTOLOAD PORTION
|
||||
" Date: Aug 05, 2024
|
||||
" Date: 2024 Aug 21
|
||||
" Version: 34
|
||||
" Maintainer: This runtime file is looking for a new maintainer.
|
||||
" Former Maintainer: Charles E Campbell
|
||||
@ -12,6 +12,8 @@
|
||||
" 2024 Aug 04 by Vim Project: escape '[' in name of file to be extracted
|
||||
" 2024 Aug 05 by Vim Project: workaround for the FreeBSD's unzip
|
||||
" 2024 Aug 05 by Vim Project: clean-up and make it work with shellslash on Windows
|
||||
" 2024 Aug 18 by Vim Project: correctly handle special globbing chars
|
||||
" 2024 Aug 21 by Vim Project: simplify condition to detect MS-Windows
|
||||
" License: Vim License (see vim's :help license)
|
||||
" Copyright: Copyright (C) 2005-2019 Charles E. Campbell {{{1
|
||||
" Permission is hereby granted to use and distribute this code,
|
||||
@ -72,6 +74,11 @@ if v:version < 702
|
||||
call s:Mess('WarningMsg', "***warning*** this version of zip needs vim 7.2 or later")
|
||||
finish
|
||||
endif
|
||||
" sanity checks
|
||||
if !executable(g:zip_unzipcmd)
|
||||
call s:Mess('Error', "***error*** (zip#Browse) unzip not available on your system")
|
||||
finish
|
||||
endif
|
||||
if !dist#vim#IsSafeExecutable('zip', g:zip_unzipcmd)
|
||||
call s:Mess('Error', "Warning: NOT executing " .. g:zip_unzipcmd .. " from current directory!")
|
||||
finish
|
||||
@ -198,7 +205,7 @@ fun! zip#Read(fname,mode)
|
||||
let zipfile = substitute(a:fname,'^.\{-}zipfile://\(.\{-}\)::[^\\].*$','\1','')
|
||||
let fname = substitute(a:fname,'^.\{-}zipfile://.\{-}::\([^\\].*\)$','\1','')
|
||||
endif
|
||||
let fname = substitute(fname, '[', '[[]', 'g')
|
||||
let fname = fname->substitute('[', '[[]', 'g')->escape('?*\\')
|
||||
" sanity check
|
||||
if !executable(substitute(g:zip_unzipcmd,'\s\+.*$','',''))
|
||||
call s:Mess('Error', "***error*** (zip#Read) sorry, your system doesn't appear to have the ".g:zip_unzipcmd." program")
|
||||
@ -330,9 +337,24 @@ fun! zip#Extract()
|
||||
call s:Mess('Error', "***error*** (zip#Extract) Please specify a file, not a directory")
|
||||
return
|
||||
endif
|
||||
if filereadable(fname)
|
||||
call s:Mess('Error', "***error*** (zip#Extract) <" .. fname .."> already exists in directory, not overwriting!")
|
||||
return
|
||||
endif
|
||||
let target = fname->substitute('\[', '[[]', 'g')
|
||||
if &shell =~ 'cmd' && has("win32")
|
||||
let target = target
|
||||
\ ->substitute('[?*]', '[&]', 'g')
|
||||
\ ->substitute('[\\]', '?', 'g')
|
||||
\ ->shellescape()
|
||||
" there cannot be a file name with '\' in its name, unzip replaces it by _
|
||||
let fname = fname->substitute('[\\?*]', '_', 'g')
|
||||
else
|
||||
let target = target->escape('*?\\')->shellescape()
|
||||
endif
|
||||
|
||||
" extract the file mentioned under the cursor
|
||||
call system($"{g:zip_extractcmd} {shellescape(b:zipfile)} {shellescape(fname)}")
|
||||
call system($"{g:zip_extractcmd} -o {shellescape(b:zipfile)} {target}")
|
||||
if v:shell_error != 0
|
||||
call s:Mess('Error', "***error*** ".g:zip_extractcmd." ".b:zipfile." ".fname.": failed!")
|
||||
elseif !filereadable(fname)
|
||||
|
@ -1,6 +1,7 @@
|
||||
" Vim compiler file
|
||||
" Compiler: Pandoc
|
||||
" Maintainer: Konfekt
|
||||
" Last Change: 2024 Aug 20
|
||||
"
|
||||
" Expects output file extension, say `:make html` or `:make pdf`.
|
||||
" Passes additional arguments to pandoc, say `:make html --self-contained`.
|
||||
@ -25,31 +26,33 @@ let s:supported_filetypes =
|
||||
|
||||
silent! function s:PandocFiletype(filetype) abort
|
||||
let ft = a:filetype
|
||||
if ft ==# 'pandoc'
|
||||
return 'markdown'
|
||||
elseif ft ==# 'tex'
|
||||
return 'latex'
|
||||
elseif ft ==# 'xml'
|
||||
" Pandoc does not support XML as a generic input format, but it does support
|
||||
" EndNote XML and Jats XML out of which the latter seems more universal.
|
||||
return 'jats'
|
||||
elseif ft ==# 'text' || empty(ft)
|
||||
return 'markdown'
|
||||
elseif index(s:supported_filetypes, &ft) >= 0
|
||||
return ft
|
||||
|
||||
if ft ==# 'pandoc' | return 'markdown'
|
||||
elseif ft ==# 'tex' | return 'latex'
|
||||
" Pandoc does not support XML as a generic input format, but it does support
|
||||
" EndNote XML and Jats XML out of which the latter seems more universal.
|
||||
elseif ft ==# 'xml' | return 'jats'
|
||||
elseif ft ==# 'text' || empty(ft) | return 'markdown'
|
||||
elseif index(s:supported_filetypes, &ft) >= 0 | return ft
|
||||
else
|
||||
echomsg 'Unsupported filetype: ' . ft . ', falling back to Markdown as input format!'
|
||||
echomsg 'Unsupported filetype: '..ft..', falling back to Markdown as input format!'
|
||||
return 'markdown'
|
||||
endif
|
||||
endfunction
|
||||
execute 'CompilerSet makeprg=pandoc\ --standalone' .
|
||||
\ '\ --metadata\ title=%:t:r:S' .
|
||||
\ '\ --metadata\ lang=' . matchstr(&spelllang, '^\a\a') .
|
||||
\ '\ --from=' . s:PandocFiletype(&filetype) .
|
||||
\ '\ ' . escape(get(b:, 'pandoc_compiler_args', get(g:, 'pandoc_compiler_args', '')), ' ') .
|
||||
\ '\ --output\ %:r:S.$*\ %:S'
|
||||
|
||||
CompilerSet errorformat="%f",\ line\ %l:\ %m
|
||||
let b:pandoc_compiler_from = get(b:, 'pandoc_compiler_from', s:PandocFiletype(&filetype))
|
||||
let b:pandoc_compiler_lang = get(b:, 'pandoc_compiler_lang', &spell ? matchstr(&spelllang, '^\a\a') : '')
|
||||
|
||||
execute 'CompilerSet makeprg=pandoc'..escape(
|
||||
\ ' --standalone' .
|
||||
\ (b:pandoc_compiler_from ==# 'markdown' && (getline(1) =~# '^%\s\+\S\+' || (search('^title:\s+\S+', 'cnw') > 0)) ?
|
||||
\ '' : ' --metadata title=%:t:r:S') .
|
||||
\ (empty(b:pandoc_compiler_lang) ?
|
||||
\ '' : ' --metadata lang='..b:pandoc_compiler_lang) .
|
||||
\ ' --from='..b:pandoc_compiler_from .
|
||||
\ ' '..get(b:, 'pandoc_compiler_args', get(g:, 'pandoc_compiler_args', '')) .
|
||||
\ ' --output %:r:S.$* -- %:S', ' ')
|
||||
CompilerSet errorformat=\"%f\",\ line\ %l:\ %m
|
||||
|
||||
let &cpo = s:keepcpo
|
||||
unlet s:keepcpo
|
||||
|
3
runtime/doc/builtin.txt
generated
3
runtime/doc/builtin.txt
generated
@ -1263,7 +1263,7 @@ executable({expr}) *executable()*
|
||||
On MS-Windows the ".exe", ".bat", etc. can optionally be
|
||||
included. Then the extensions in $PATHEXT are tried. Thus if
|
||||
"foo.exe" does not exist, "foo.exe.bat" can be found. If
|
||||
$PATHEXT is not set then ".exe;.com;.bat;.cmd" is used. A dot
|
||||
$PATHEXT is not set then ".com;.exe;.bat;.cmd" is used. A dot
|
||||
by itself can be used in $PATHEXT to try using the name
|
||||
without an extension. When 'shell' looks like a Unix shell,
|
||||
then the name is also tried without adding an extension.
|
||||
@ -4361,6 +4361,7 @@ maparg({name} [, {mode} [, {abbr} [, {dict}]]]) *maparg()*
|
||||
"lhsrawalt" The {lhs} of the mapping as raw bytes, alternate
|
||||
form, only present when it differs from "lhsraw"
|
||||
"rhs" The {rhs} of the mapping as typed.
|
||||
"callback" Lua function, if RHS was defined as such.
|
||||
"silent" 1 for a |:map-silent| mapping, else 0.
|
||||
"noremap" 1 if the {rhs} of the mapping is not remappable.
|
||||
"script" 1 if mapping was defined with <script>.
|
||||
|
@ -348,7 +348,8 @@ terminals)
|
||||
|
||||
:keepp[atterns] {command} *:keepp* *:keeppatterns*
|
||||
Execute {command}, without adding anything to the search
|
||||
history or modifying the last substitute string for |:&|.
|
||||
history and, in case of |:s| or |:&|, without modifying the
|
||||
last substitute pattern or substitute string.
|
||||
|
||||
==============================================================================
|
||||
2. Command-line completion *cmdline-completion*
|
||||
|
@ -138,15 +138,15 @@ DOCUMENTATION *dev-doc*
|
||||
- Write docstrings (as opposed to inline comments) with present tense ("Gets"),
|
||||
not imperative ("Get"). This tends to reduce ambiguity and improve clarity
|
||||
by describing "What" instead of "How". >
|
||||
GOOD:
|
||||
✅ OK:
|
||||
/// Gets a highlight definition.
|
||||
BAD:
|
||||
❌ NO:
|
||||
/// Get a highlight definition.
|
||||
- Avoid starting docstrings with "The" or "A" unless needed to avoid
|
||||
ambiguity. This is a visual aid and reduces noise. >
|
||||
GOOD:
|
||||
✅ OK:
|
||||
/// @param dirname Path fragment before `pend`
|
||||
BAD:
|
||||
❌ NO:
|
||||
/// @param dirname The path fragment before `pend`
|
||||
- Vim differences:
|
||||
- Do not prefix help tags with "nvim-". Use |vim_diff.txt| to catalog
|
||||
@ -329,13 +329,20 @@ Where possible, these patterns apply to _both_ Lua and the API:
|
||||
- When accepting a buffer id, etc., 0 means "current buffer", nil means "all
|
||||
buffers". Likewise for window id, tabpage id, etc.
|
||||
- Examples: |vim.lsp.codelens.clear()| |vim.diagnostic.enable()|
|
||||
- Any function signature that accepts a callback function should define the
|
||||
callback as the LAST parameter, if possible. This improves readability of
|
||||
calls by placing the less "noisy" arguments near the start. >
|
||||
GOOD:
|
||||
filter(table, opts, function() … end)
|
||||
BAD:
|
||||
filter(function() … end, table, opts)
|
||||
- Any function signature that accepts a callback (example: |table.foreach()|)
|
||||
should place it as the LAST parameter (after opts), if possible (or ALWAYS
|
||||
for "continuation callbacks"—functions called exactly once).
|
||||
- Improves readability by placing the less "noisy" arguments near the start.
|
||||
- Consistent with luv.
|
||||
- Useful for future async lib which transforms functions of the form
|
||||
`function(<args>, cb(<ret)>))` => `function(<args>) -> <ret>`.
|
||||
- Example: >lua
|
||||
-- ✅ OK:
|
||||
filter(…, opts, function() … end)
|
||||
-- ❌ NO:
|
||||
filter(function() … end, …, opts)
|
||||
-- ❌ NO:
|
||||
filter(…, function() … end, opts)
|
||||
- "Enable" ("toggle") interface and behavior:
|
||||
- `enable(…, nil)` and `enable(…, {buf=nil})` are synonyms and control the
|
||||
the "global" enablement of a feature.
|
||||
@ -566,10 +573,10 @@ a good name: it's idiomatic and unambiguous. If the package is named "neovim",
|
||||
it confuses users, and complicates documentation and discussions.
|
||||
|
||||
Examples of API-client package names:
|
||||
- GOOD: nvim-racket
|
||||
- GOOD: pynvim
|
||||
- BAD: python-client
|
||||
- BAD: neovim_
|
||||
- ✅ OK: nvim-racket
|
||||
- ✅ OK: pynvim
|
||||
- ❌ NO: python-client
|
||||
- ❌ NO: neovim_
|
||||
|
||||
API client implementation guidelines ~
|
||||
|
||||
|
@ -444,6 +444,10 @@ when the right mouse button is pressed, if 'mousemodel' is set to popup or
|
||||
popup_setpos.
|
||||
|
||||
The default "PopUp" menu is: >vim
|
||||
anoremenu PopUp.Go\ to\ definition <Cmd>lua vim.lsp.buf.definition()<CR>
|
||||
amenu PopUp.Open\ in\ web\ browser gx
|
||||
anoremenu PopUp.Inspect <Cmd>Inspect<CR>
|
||||
anoremenu PopUp.-1- <Nop>
|
||||
vnoremenu PopUp.Cut "+x
|
||||
vnoremenu PopUp.Copy "+y
|
||||
anoremenu PopUp.Paste "+gP
|
||||
@ -452,8 +456,7 @@ The default "PopUp" menu is: >vim
|
||||
nnoremenu PopUp.Select\ All ggVG
|
||||
vnoremenu PopUp.Select\ All gg0oG$
|
||||
inoremenu PopUp.Select\ All <C-Home><C-O>VG
|
||||
anoremenu PopUp.Inspect <Cmd>Inspect<CR>
|
||||
anoremenu PopUp.-1- <Nop>
|
||||
anoremenu PopUp.-2- <Nop>
|
||||
anoremenu PopUp.How-to\ disable\ mouse <Cmd>help disable-mouse<CR>
|
||||
<
|
||||
|
||||
|
@ -7,10 +7,10 @@
|
||||
Type |gO| to see the table of contents.
|
||||
|
||||
==============================================================================
|
||||
Checkhealth *health*
|
||||
Checkhealth *vim.health* *health*
|
||||
|
||||
|
||||
health.vim is a minimal framework to help users troubleshoot configuration and
|
||||
vim.health is a minimal framework to help users troubleshoot configuration and
|
||||
any other environment conditions that a plugin might care about. Nvim ships
|
||||
with healthchecks for configuration, performance, python support, ruby
|
||||
support, clipboard support, and more.
|
||||
@ -49,7 +49,7 @@ Commands *health-commands*
|
||||
:checkhealth vim*
|
||||
<
|
||||
|
||||
Create a healthcheck *health-dev* *vim.health*
|
||||
Create a healthcheck *health-dev*
|
||||
|
||||
Healthchecks are functions that check the user environment, configuration, or
|
||||
any other prerequisites that a plugin cares about. Nvim ships with
|
||||
|
@ -1183,6 +1183,12 @@ items:
|
||||
attributes in the popup menu to apply cterm and gui
|
||||
properties (with higher priority) like strikethrough
|
||||
to the completion items
|
||||
kind_hlgroup an additional highlight group specifically for setting
|
||||
the highlight attributes of the completion kind. When
|
||||
this field is present, it will override the
|
||||
|hl-PmenuKind| highlight group, allowing for the
|
||||
customization of ctermfg and guifg properties for the
|
||||
completion kind
|
||||
|
||||
All of these except "icase", "equal", "dup" and "empty" must be a string. If
|
||||
an item does not meet these requirements then an error message is given and
|
||||
|
@ -765,7 +765,7 @@ formatexpr({opts}) *vim.lsp.formatexpr()*
|
||||
function.
|
||||
|
||||
Currently only supports a single client. This can be set via
|
||||
`setlocal formatexpr=v:lua.vim.lsp.formatexpr()` but will typically or in
|
||||
`setlocal formatexpr=v:lua.vim.lsp.formatexpr()` or (more typically) in
|
||||
`on_attach` via
|
||||
`vim.bo[bufnr].formatexpr = 'v:lua.vim.lsp.formatexpr(#{timeout_ms:250})'`.
|
||||
|
||||
@ -1486,6 +1486,15 @@ workspace_symbol({query}, {opts}) *vim.lsp.buf.workspace_symbol()*
|
||||
==============================================================================
|
||||
Lua module: vim.lsp.diagnostic *lsp-diagnostic*
|
||||
|
||||
from({diagnostics}) *vim.lsp.diagnostic.from()*
|
||||
Converts the input `vim.Diagnostic`s to LSP diagnostics.
|
||||
|
||||
Parameters: ~
|
||||
• {diagnostics} (`vim.Diagnostic[]`)
|
||||
|
||||
Return: ~
|
||||
(`lsp.Diagnostic[]`)
|
||||
|
||||
*vim.lsp.diagnostic.get_namespace()*
|
||||
get_namespace({client_id}, {is_pull})
|
||||
Get the diagnostic namespace associated with an LSP client
|
||||
@ -1630,6 +1639,8 @@ Lua module: vim.lsp.completion *lsp-completion*
|
||||
Fields: ~
|
||||
• {autotrigger}? (`boolean`) Whether to trigger completion
|
||||
automatically. Default: false
|
||||
• {convert}? (`fun(item: lsp.CompletionItem): table`) Transforms an
|
||||
LSP CompletionItem to |complete-items|.
|
||||
|
||||
|
||||
*vim.lsp.completion.enable()*
|
||||
|
@ -352,16 +352,14 @@ Example: >vim
|
||||
<
|
||||
*lua-table-ambiguous*
|
||||
Lua tables are used as both dictionaries and lists, so it is impossible to
|
||||
determine whether empty table is meant to be empty list or empty dictionary.
|
||||
Additionally Lua does not have integer numbers. To distinguish between these
|
||||
cases there is the following agreement:
|
||||
decide whether empty table is a list or a dict. Also Lua does not have integer
|
||||
numbers. To disambiguate these cases, we define:
|
||||
*lua-list*
|
||||
0. Empty table is empty list.
|
||||
1. Table with N consecutive integer indices starting from 1 and ending with
|
||||
N is considered a list. See also |list-iterator|.
|
||||
0. Empty table is a list. Use |vim.empty_dict()| to represent empty dict.
|
||||
1. Table with N consecutive (no `nil` values, aka "holes") integer keys 1…N is
|
||||
a list. See also |list-iterator|.
|
||||
*lua-dict*
|
||||
2. Table with string keys, none of which contains NUL byte, is considered to
|
||||
be a dictionary.
|
||||
2. Table with string keys, none of which contains NUL byte, is a dict.
|
||||
3. Table with string keys, at least one of which contains NUL byte, is also
|
||||
considered to be a dictionary, but this time it is converted to
|
||||
a |msgpack-special-map|.
|
||||
@ -2674,7 +2672,7 @@ vim.filetype.add({filetypes}) *vim.filetype.add()*
|
||||
['.*/etc/foo/.*%.conf'] = { 'dosini', { priority = 10 } },
|
||||
-- A pattern containing an environment variable
|
||||
['${XDG_CONFIG_HOME}/foo/git'] = 'git',
|
||||
['README.(%a+)$'] = function(path, bufnr, ext)
|
||||
['.*README.(%a+)'] = function(path, bufnr, ext)
|
||||
if ext == 'md' then
|
||||
return 'markdown'
|
||||
elseif ext == 'rst' then
|
||||
@ -3839,10 +3837,12 @@ argument into an *Iter* object with methods (such as |Iter:filter()| and
|
||||
chained to create iterator "pipelines": the output of each pipeline stage is
|
||||
input to the next stage. The first stage depends on the type passed to
|
||||
`vim.iter()`:
|
||||
• List tables (arrays, |lua-list|) yield only the value of each element.
|
||||
• Holes (nil values) are allowed.
|
||||
• Lists or arrays (|lua-list|) yield only the value of each element.
|
||||
• Holes (nil values) are allowed (but discarded).
|
||||
• Use pairs() to treat array/list tables as dicts (preserve holes and
|
||||
non-contiguous integer keys): `vim.iter(pairs(…))`.
|
||||
• Use |Iter:enumerate()| to also pass the index to the next stage.
|
||||
• Or initialize with ipairs(): `vim.iter(ipairs(…))`.
|
||||
• Or initialize with ipairs(): `vim.iter(ipairs(…))`.
|
||||
• Non-list tables (|lua-dict|) yield both the key and value of each element.
|
||||
• Function |iterator|s yield all values returned by the underlying function.
|
||||
• Tables with a |__call()| metamethod are treated as function iterators.
|
||||
|
@ -1381,10 +1381,12 @@ completion can be enabled:
|
||||
|
||||
-complete=arglist file names in argument list
|
||||
-complete=augroup autocmd groups
|
||||
-complete=breakpoint |:breakadd| suboptions
|
||||
-complete=buffer buffer names
|
||||
-complete=color color schemes
|
||||
-complete=command Ex command (and arguments)
|
||||
-complete=compiler compilers
|
||||
-complete=diff_buffer diff buffer names
|
||||
-complete=dir directory names
|
||||
-complete=dir_in_path directory names in |'cdpath'|
|
||||
-complete=environment environment variable names
|
||||
@ -1396,7 +1398,7 @@ completion can be enabled:
|
||||
-complete=function function name
|
||||
-complete=help help subjects
|
||||
-complete=highlight highlight groups
|
||||
-complete=history :history suboptions
|
||||
-complete=history |:history| suboptions
|
||||
-complete=keymap keyboard mappings
|
||||
-complete=locale locale names (as output of locale -a)
|
||||
-complete=lua Lua expression |:lua|
|
||||
@ -1406,6 +1408,8 @@ completion can be enabled:
|
||||
-complete=messages |:messages| suboptions
|
||||
-complete=option options
|
||||
-complete=packadd optional package |pack-add| names
|
||||
-complete=runtime file and directory names in |'runtimepath'|
|
||||
-complete=scriptnames sourced script names
|
||||
-complete=shellcmd Shell command
|
||||
-complete=sign |:sign| suboptions
|
||||
-complete=syntax syntax file names |'syntax'|
|
||||
|
@ -646,6 +646,12 @@ widespread as file format.
|
||||
A composing or combining character is used to change the meaning of the
|
||||
character before it. The combining characters are drawn on top of the
|
||||
preceding character.
|
||||
|
||||
Nvim largely follows the definition of extended grapheme clusters in UAX#29
|
||||
in the Unicode standard, with some modifications: An ascii char will always
|
||||
start a new cluster. In addition 'arabicshape' enables the combining of some
|
||||
arabic letters, when they are shaped to be displayed together in a single cell.
|
||||
|
||||
Too big combined characters cannot be displayed, but they can still be
|
||||
inspected using the |g8| and |ga| commands described below.
|
||||
When editing text a composing character is mostly considered part of the
|
||||
|
@ -355,11 +355,11 @@ gg Goto line [count], default first line, on the first
|
||||
See also 'startofline' option.
|
||||
|
||||
:[range]go[to] [count] *:go* *:goto* *go*
|
||||
[count]go Go to [count] byte in the buffer. Default [count] is
|
||||
one, start of the file. When giving [range], the
|
||||
last number in it used as the byte count. End-of-line
|
||||
characters are counted depending on the current
|
||||
'fileformat' setting.
|
||||
[count]go Go to [count] byte in the buffer. |exclusive| motion.
|
||||
Default [count] is one, start of the file. When
|
||||
giving [range], the last number in it used as the byte
|
||||
count. End-of-line characters are counted depending
|
||||
on the current 'fileformat' setting.
|
||||
Also see the |line2byte()| function, and the 'o'
|
||||
option in 'statusline'.
|
||||
|
||||
|
@ -53,19 +53,16 @@ EDITOR
|
||||
documented and skips help buffers if run from a non-help buffer, otherwise
|
||||
it moves to another help buffer.
|
||||
|
||||
VIM SCRIPT
|
||||
|
||||
• |v:msgpack_types| has the type "binary" removed. |msgpackparse()| no longer
|
||||
treats BIN, STR and FIXSTR as separate types. Any of these is returned as a
|
||||
string if possible, or a |blob| if the value contained embedded NUL:s.
|
||||
|
||||
EVENTS
|
||||
|
||||
• TODO
|
||||
|
||||
LSP
|
||||
|
||||
• TODO
|
||||
• |vim.lsp.completion.enable()| gained the `convert` callback which enables
|
||||
customizing the transformation of an LSP CompletionItem to |complete-items|.
|
||||
• |vim.lsp.diagnostic.from()| can be used to convert a list of
|
||||
|vim.Diagnostic| objects into their LSP diagnostic representation.
|
||||
|
||||
LUA
|
||||
|
||||
@ -85,12 +82,22 @@ PLUGINS
|
||||
|
||||
TREESITTER
|
||||
|
||||
• TODO
|
||||
• |Query:iter_matches()| correctly returns all matching nodes in a match
|
||||
instead of only the last node. This means that the returned table maps
|
||||
capture IDs to a list of nodes that need to be iterated over. For
|
||||
backwards compatibility, an option `all=false` (only return the last
|
||||
matching node) is provided that will be removed in a future release.
|
||||
|
||||
TUI
|
||||
|
||||
• TODO
|
||||
|
||||
VIMSCRIPT
|
||||
|
||||
• |v:msgpack_types| has the type "binary" removed. |msgpackparse()| no longer
|
||||
treats BIN, STR and FIXSTR as separate types. Any of these is returned as a
|
||||
string if possible, or a |blob| if the value contained embedded NUL:s.
|
||||
|
||||
==============================================================================
|
||||
NEW FEATURES *news-features*
|
||||
|
||||
@ -107,6 +114,10 @@ DEFAULTS
|
||||
• |grr| in Normal mode maps to |vim.lsp.buf.references()|
|
||||
• |gra| in Normal and Visual mode maps to |vim.lsp.buf.code_action()|
|
||||
• CTRL-S in Insert mode maps to |vim.lsp.buf.signature_help()|
|
||||
• Mouse |popup-menu| includes an "Open in web browser" item when you right-click
|
||||
on a URL.
|
||||
• Mouse |popup-menu| includes a "Go to definition" item when LSP is active
|
||||
in the buffer.
|
||||
|
||||
• Snippet:
|
||||
• `<Tab>` in Insert and Select mode maps to `vim.snippet.jump({ direction = 1 })`
|
||||
@ -155,7 +166,8 @@ PLUGINS
|
||||
|
||||
STARTUP
|
||||
|
||||
• TODO
|
||||
• Nvim will fail if the |--listen| or |$NVIM_LISTEN_ADDRESS| address is
|
||||
invalid, instead of silently skipping an invalid address.
|
||||
|
||||
TERMINAL
|
||||
|
||||
@ -196,6 +208,15 @@ These existing features changed their behavior.
|
||||
top lines are calculated using screen line numbers which take virtual lines
|
||||
into account.
|
||||
|
||||
• The implementation of grapheme clusters (or combining chars |mbyte-combining|)
|
||||
was upgraded to closely follow extended grapheme clusters as defined by UAX#29
|
||||
in the unicode standard. Noteworthily, this enables proper display of many
|
||||
more emoji characters than before, including those encoded with multiple
|
||||
emoji codepoints combined with ZWJ (zero width joiner) codepoints.
|
||||
|
||||
• |vim.tbl_deep_extend()| no longer ignores any values for which |vim.isarray()|
|
||||
returns `true`.
|
||||
|
||||
==============================================================================
|
||||
REMOVED FEATURES *news-removed*
|
||||
|
||||
|
@ -1129,9 +1129,9 @@ A jump table for the options with a short description can be found at |Q_op|.
|
||||
list:{n} Adds an additional indent for lines that match a
|
||||
numbered or bulleted list (using the
|
||||
'formatlistpat' setting).
|
||||
list:-1 Uses the length of a match with 'formatlistpat'
|
||||
for indentation.
|
||||
(default: 0)
|
||||
list:-1 Uses the width of a match with 'formatlistpat' for
|
||||
indentation.
|
||||
column:{n} Indent at column {n}. Will overrule the other
|
||||
sub-options. Note: an additional indent may be
|
||||
added for the 'showbreak' setting.
|
||||
@ -2217,9 +2217,12 @@ A jump table for the options with a short description can be found at |Q_op|.
|
||||
global
|
||||
When on all Unicode emoji characters are considered to be full width.
|
||||
This excludes "text emoji" characters, which are normally displayed as
|
||||
single width. Unfortunately there is no good specification for this
|
||||
and it has been determined on trial-and-error basis. Use the
|
||||
|setcellwidths()| function to change the behavior.
|
||||
single width. However, such "text emoji" are treated as full-width
|
||||
emoji if they are followed by the U+FE0F variant selector.
|
||||
|
||||
Unfortunately there is no good specification for this and it has been
|
||||
determined on trial-and-error basis. Use the |setcellwidths()|
|
||||
function to change the behavior.
|
||||
|
||||
*'encoding'* *'enc'*
|
||||
'encoding' 'enc' string (default "utf-8")
|
||||
|
@ -194,6 +194,8 @@ registers. Nvim looks for these clipboard tools, in order of priority:
|
||||
- lemonade (for SSH) https://github.com/pocke/lemonade
|
||||
- doitclient (for SSH) https://www.chiark.greenend.org.uk/~sgtatham/doit/
|
||||
- win32yank (Windows)
|
||||
- putclip, getclip (Windows) https://cygwin.com/packages/summary/cygutils.html
|
||||
- clip, powershell (Windows) https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/clip
|
||||
- termux (via termux-clipboard-set, termux-clipboard-set)
|
||||
- tmux (if $TMUX is set)
|
||||
|
||||
@ -248,8 +250,8 @@ For Windows WSL, try this g:clipboard definition:
|
||||
\ '*': 'clip.exe',
|
||||
\ },
|
||||
\ 'paste': {
|
||||
\ '+': 'powershell.exe -c [Console]::Out.Write($(Get-Clipboard -Raw).tostring().replace("`r", ""))',
|
||||
\ '*': 'powershell.exe -c [Console]::Out.Write($(Get-Clipboard -Raw).tostring().replace("`r", ""))',
|
||||
\ '+': 'powershell.exe -NoLogo -NoProfile -c [Console]::Out.Write($(Get-Clipboard -Raw).tostring().replace("`r", ""))',
|
||||
\ '*': 'powershell.exe -NoLogo -NoProfile -c [Console]::Out.Write($(Get-Clipboard -Raw).tostring().replace("`r", ""))',
|
||||
\ },
|
||||
\ 'cache_enabled': 0,
|
||||
\ }
|
||||
|
@ -1305,6 +1305,13 @@ Additional arguments can be passed to pandoc:
|
||||
- either by appending them to make, say `:make html --self-contained` .
|
||||
- or setting them in `b:pandoc_compiler_args` or `g:pandoc_compiler_args`.
|
||||
|
||||
The `--from` argument is an educated guess using the buffer file type;
|
||||
it can be overridden by setting `b:pandoc_compiler_from`.
|
||||
Likewise the `--metadata lang` argument is set using `&spelllang`;
|
||||
it can be overridden by setting `b:pandoc_compiler_lang`.
|
||||
If `--from=markdown` is assumed and no title set in a title header or
|
||||
YAML block, then the filename (without extension) is used as the title.
|
||||
|
||||
PERL *quickfix-perl* *compiler-perl*
|
||||
|
||||
The Perl compiler plugin doesn't actually compile, but invokes Perl's internal
|
||||
|
@ -152,8 +152,7 @@ add a few items or change the highlighting, follow these steps:
|
||||
1. Create your user directory from 'runtimepath', see above.
|
||||
|
||||
2. Create a directory in there called "after/syntax". For Unix: >
|
||||
mkdir ~/.config/nvim/after
|
||||
mkdir ~/.config/nvim/after/syntax
|
||||
mkdir -p ~/.config/nvim/after/syntax
|
||||
|
||||
3. Write a Vim script that contains the commands you want to use. For
|
||||
example, to change the colors for the C syntax: >
|
||||
@ -1663,6 +1662,14 @@ Note that these three variables are maintained in the HTML syntax file.
|
||||
Numbers and strings can be recognized in non-Javadoc comments with >
|
||||
:let g:java_comment_strings = 1
|
||||
|
||||
When 'foldmethod' is set to "syntax", blocks of code and multi-line comments
|
||||
will be folded. No text is usually written in the first line of a multi-line
|
||||
comment, making folded contents of Javadoc comments less informative with the
|
||||
default 'foldtext' value; you may opt for showing the contents of a second
|
||||
line for any comments written in this way, and showing the contents of a first
|
||||
line otherwise, with >
|
||||
:let g:java_foldtext_show_first_or_second_line = 1
|
||||
|
||||
Trailing whitespace characters or a run of space characters before a tab
|
||||
character can be marked as an error with >
|
||||
:let g:java_space_errors = 1
|
||||
@ -1684,6 +1691,22 @@ This will make the syntax synchronization start 50 lines before the first
|
||||
displayed line. The default value is 10. The disadvantage of using a larger
|
||||
number is that redrawing can become slow.
|
||||
|
||||
Significant changes to the Java platform are gradually introduced in the form
|
||||
of JDK Enhancement Proposals (JEPs) that can be implemented for a release and
|
||||
offered as its preview features. It may take several JEPs and a few release
|
||||
cycles for such a feature to become either integrated into the platform or
|
||||
withdrawn from this effort. To cater for early adopters, there is optional
|
||||
support in Vim for syntax related preview features that are implemented. You
|
||||
can request it by specifying a list of preview feature numbers as follows: >
|
||||
:let g:java_syntax_previews = [430]
|
||||
|
||||
The supported JEP numbers are to be drawn from this table:
|
||||
`430`: String Templates [JDK 21]
|
||||
|
||||
Note that as soon as the particular preview feature will have been integrated
|
||||
into the Java platform, its entry will be removed from the table and related
|
||||
optionality will be discontinued.
|
||||
|
||||
|
||||
JSON *json.vim* *ft-json-syntax* *g:vim_json_conceal*
|
||||
*g:vim_json_warnings*
|
||||
|
@ -22,11 +22,9 @@ search for in the `parser` runtime directory.
|
||||
|
||||
Nvim includes these parsers:
|
||||
|
||||
- Bash
|
||||
- C
|
||||
- Lua
|
||||
- Markdown
|
||||
- Python
|
||||
- Vimscript
|
||||
- Vimdoc
|
||||
- Treesitter query files |ft-query-plugin|
|
||||
@ -51,6 +49,13 @@ treesitter parser for buffers with filetype `svg` or `xslt`, use: >lua
|
||||
|
||||
vim.treesitter.language.register('xml', { 'svg', 'xslt' })
|
||||
<
|
||||
*treesitter-parsers-wasm*
|
||||
|
||||
If Nvim is built with `ENABLE_WASMTIME`, then wasm parsers can also be
|
||||
loaded: >lua
|
||||
|
||||
vim.treesitter.language.add('python', { path = "/path/to/python.wasm" })
|
||||
<
|
||||
|
||||
==============================================================================
|
||||
TREESITTER TREES *treesitter-tree*
|
||||
@ -543,9 +548,9 @@ the exact definition):
|
||||
@keyword.coroutine keywords related to coroutines (e.g. `go` in Go, `async/await` in Python)
|
||||
@keyword.function keywords that define a function (e.g. `func` in Go, `def` in Python)
|
||||
@keyword.operator operators that are English words (e.g. `and`, `or`)
|
||||
@keyword.import keywords for including modules (e.g. `import`, `from` in Python)
|
||||
@keyword.type keywords defining composite types (e.g. `struct`, `enum`)
|
||||
@keyword.modifier keywords defining type modifiers (e.g. `const`, `static`, `public`)
|
||||
@keyword.import keywords for including or exporting modules (e.g. `import`, `from` in Python)
|
||||
@keyword.type keywords describing namespaces and composite types (e.g. `struct`, `enum`)
|
||||
@keyword.modifier keywords modifying other constructs (e.g. `const`, `static`, `public`)
|
||||
@keyword.repeat keywords related to loops (e.g. `for`, `while`)
|
||||
@keyword.return keywords like `return` and `yield`
|
||||
@keyword.debug keywords related to debugging
|
||||
@ -601,7 +606,7 @@ the exact definition):
|
||||
@diff.delta changed text (for diff files)
|
||||
|
||||
@tag XML-style tag names (e.g. in XML, HTML, etc.)
|
||||
@tag.builtin XML-style tag names (e.g. HTML5 tags)
|
||||
@tag.builtin builtin tag names (e.g. HTML5 tags)
|
||||
@tag.attribute XML-style tag attributes
|
||||
@tag.delimiter XML-style tag delimiters
|
||||
|
||||
@ -1018,7 +1023,7 @@ add_directive({name}, {handler}, {opts})
|
||||
|
||||
Parameters: ~
|
||||
• {name} (`string`) Name of the directive, without leading #
|
||||
• {handler} (`fun(match: table<integer,TSNode[]>, pattern: integer, source: integer|string, predicate: any[], metadata: table)`)
|
||||
• {handler} (`fun(match: table<integer,TSNode[]>, pattern: integer, source: integer|string, predicate: any[], metadata: vim.treesitter.query.TSMetadata)`)
|
||||
• match: A table mapping capture IDs to a list of captured
|
||||
nodes
|
||||
• pattern: the index of the matching pattern in the query
|
||||
@ -1031,9 +1036,8 @@ add_directive({name}, {handler}, {opts})
|
||||
the same name
|
||||
• {all}? (`boolean`) Use the correct implementation of the
|
||||
match table where capture IDs map to a list of nodes
|
||||
instead of a single node. Defaults to false (for backward
|
||||
compatibility). This option will eventually become the
|
||||
default and removed.
|
||||
instead of a single node. Defaults to true. This option
|
||||
will be removed in a future release.
|
||||
|
||||
*vim.treesitter.query.add_predicate()*
|
||||
add_predicate({name}, {handler}, {opts})
|
||||
@ -1041,17 +1045,16 @@ add_predicate({name}, {handler}, {opts})
|
||||
|
||||
Parameters: ~
|
||||
• {name} (`string`) Name of the predicate, without leading #
|
||||
• {handler} (`fun(match: table<integer,TSNode[]>, pattern: integer, source: integer|string, predicate: any[], metadata: table)`)
|
||||
• {handler} (`fun(match: table<integer,TSNode[]>, pattern: integer, source: integer|string, predicate: any[], metadata: vim.treesitter.query.TSMetadata)`)
|
||||
• see |vim.treesitter.query.add_directive()| for argument
|
||||
meanings
|
||||
• {opts} (`table`) A table with the following fields:
|
||||
• {opts} (`table?`) A table with the following fields:
|
||||
• {force}? (`boolean`) Override an existing predicate of
|
||||
the same name
|
||||
• {all}? (`boolean`) Use the correct implementation of the
|
||||
match table where capture IDs map to a list of nodes
|
||||
instead of a single node. Defaults to false (for backward
|
||||
compatibility). This option will eventually become the
|
||||
default and removed.
|
||||
instead of a single node. Defaults to true. This option
|
||||
will be removed in a future release.
|
||||
|
||||
edit({lang}) *vim.treesitter.query.edit()*
|
||||
Opens a live editor to query the buffer you started from.
|
||||
@ -1211,14 +1214,8 @@ Query:iter_matches({node}, {source}, {start}, {stop}, {opts})
|
||||
indices to a list of nodes, and metadata from any directives processing
|
||||
the match.
|
||||
|
||||
WARNING: Set `all=true` to ensure all matching nodes in a match are
|
||||
returned, otherwise only the last node in a match is returned, breaking
|
||||
captures involving quantifiers such as `(comment)+ @comment`. The default
|
||||
option `all=false` is only provided for backward compatibility and will be
|
||||
removed after Nvim 0.10.
|
||||
|
||||
Example: >lua
|
||||
for pattern, match, metadata in cquery:iter_matches(tree:root(), bufnr, 0, -1, { all = true }) do
|
||||
for pattern, match, metadata in cquery:iter_matches(tree:root(), bufnr, 0, -1) do
|
||||
for id, nodes in pairs(match) do
|
||||
local name = query.captures[id]
|
||||
for _, node in ipairs(nodes) do
|
||||
@ -1243,16 +1240,15 @@ Query:iter_matches({node}, {source}, {start}, {stop}, {opts})
|
||||
start depth for each match. This is used to prevent
|
||||
traversing too deep into a tree.
|
||||
• match_limit (integer) Set the maximum number of
|
||||
in-progress matches (Default: 256).
|
||||
• all (boolean) When set, the returned match table maps
|
||||
capture IDs to a list of nodes. Older versions of
|
||||
iter_matches incorrectly mapped capture IDs to a single
|
||||
node, which is incorrect behavior. This option will
|
||||
eventually become the default and removed.
|
||||
in-progress matches (Default: 256). all (boolean) When
|
||||
`false` (default `true`), the returned table maps capture
|
||||
IDs to a single (last) node instead of the full list of
|
||||
matching nodes. This option is only for backward
|
||||
compatibility and will be removed in a future release.
|
||||
|
||||
Return: ~
|
||||
(`fun(): integer, table<integer, TSNode[]>, table`) pattern id, match,
|
||||
metadata
|
||||
(`fun(): integer, table<integer, TSNode[]>, vim.treesitter.query.TSMetadata`)
|
||||
pattern id, match, metadata
|
||||
|
||||
set({lang}, {query_name}, {text}) *vim.treesitter.query.set()*
|
||||
Sets the runtime query named {query_name} for {lang}
|
||||
|
@ -106,23 +106,28 @@ standard actions ("Cut", "Copy", "Paste", …). Mouse is NOT enabled in
|
||||
|command-mode| or the |more-prompt|, so you can temporarily disable it just by
|
||||
typing ":".
|
||||
|
||||
If you don't like this you can disable the mouse in your |config| using any of
|
||||
the following:
|
||||
Or you can disable the popup-menu using any of the following:
|
||||
- Disable mouse completely by unsetting the 'mouse' option: >vim
|
||||
set mouse=
|
||||
- Pressing <RightMouse> extends selection instead of showing popup-menu: >vim
|
||||
- Change the 'mousemodel', so <RightMouse> extends selection instead of
|
||||
showing the popup-menu: >vim
|
||||
set mousemodel=extend
|
||||
- Pressing <A-LeftMouse> releases mouse until the cursor moves: >vim
|
||||
- Map <A-LeftMouse> so that it temporarily disables mouse until the cursor
|
||||
moves: >vim
|
||||
nnoremap <A-LeftMouse> <Cmd>
|
||||
\ set mouse=<Bar>
|
||||
\ echo 'mouse OFF until next cursor-move'<Bar>
|
||||
\ autocmd CursorMoved * ++once set mouse&<Bar>
|
||||
\ echo 'mouse ON'<CR>
|
||||
<
|
||||
To remove the "How-to disable mouse" menu item and the separator above it: >vim
|
||||
To remove the default popup-menu without disabling mouse: >vim
|
||||
aunmenu PopUp
|
||||
autocmd! nvim_popupmenu
|
||||
|
||||
To remove only the "How-to disable mouse" menu item (and its separator): >vim
|
||||
aunmenu PopUp.How-to\ disable\ mouse
|
||||
aunmenu PopUp.-1-
|
||||
<
|
||||
aunmenu PopUp.-2-
|
||||
|
||||
DEFAULT MAPPINGS
|
||||
*default-mappings*
|
||||
Nvim creates the following default mappings at |startup|. You can disable any
|
||||
|
@ -53,11 +53,17 @@ active yes yes 'a'
|
||||
hidden no yes 'h'
|
||||
inactive no no ' '
|
||||
|
||||
Note: All CTRL-W commands can also be executed with |:wincmd|, for those
|
||||
places where a Normal mode command can't be used or is inconvenient.
|
||||
*buffer-reuse*
|
||||
Each buffer has a unique number and the number will not change within a Vim
|
||||
session. The |bufnr()| and |bufname()| functions can be used to convert
|
||||
between a buffer name and the buffer number. There is one exception: if a new
|
||||
empty buffer is created and it is not modified, the buffer will be re-used
|
||||
when loading another file into that buffer. This also means the buffer number
|
||||
will not change.
|
||||
|
||||
The main Vim window can hold several split windows. There are also tab pages
|
||||
|tab-page|, each of which can hold multiple windows.
|
||||
|
||||
*window-ID* *winid* *windowid*
|
||||
Each window has a unique identifier called the window ID. This identifier
|
||||
will not change within a Vim session. The |win_getid()| and |win_id2tabwin()|
|
||||
@ -69,9 +75,6 @@ across tabs. For most functions that take a window ID or a window number, the
|
||||
window number only applies to the current tab, while the window ID can refer
|
||||
to a window in any tab.
|
||||
|
||||
Each buffer has a unique number and the number will not change within a Vim
|
||||
session. The |bufnr()| and |bufname()| functions can be used to convert
|
||||
between a buffer name and the buffer number.
|
||||
|
||||
==============================================================================
|
||||
2. Starting Vim *windows-starting*
|
||||
@ -468,6 +471,10 @@ These commands can also be executed with ":wincmd":
|
||||
:exe nr .. "wincmd w"
|
||||
< This goes to window "nr".
|
||||
|
||||
Note: All CTRL-W commands can also be executed with |:wincmd|, for those
|
||||
places where a Normal mode command can't be used or is inconvenient (e.g.
|
||||
in a browser-based terminal).
|
||||
|
||||
==============================================================================
|
||||
5. Moving windows around *window-moving*
|
||||
|
||||
|
10
runtime/ftplugin/hcl.vim
Normal file
10
runtime/ftplugin/hcl.vim
Normal file
@ -0,0 +1,10 @@
|
||||
" Vim filetype plugin
|
||||
" Language: HCL
|
||||
" Maintainer: Gregory Anders
|
||||
" Last Change: 2024-09-03
|
||||
|
||||
if exists('b:did_ftplugin')
|
||||
finish
|
||||
endif
|
||||
|
||||
runtime! ftplugin/terraform.vim
|
13
runtime/ftplugin/nu.vim
Normal file
13
runtime/ftplugin/nu.vim
Normal file
@ -0,0 +1,13 @@
|
||||
" Vim filetype plugin
|
||||
" Language: Nu
|
||||
" Maintainer: Marc Jakobi <marc@jakobi.dev>
|
||||
" Last Change: 2024 Aug 31
|
||||
|
||||
if exists('b:did_ftplugin')
|
||||
finish
|
||||
endif
|
||||
let b:did_ftplugin = 1
|
||||
|
||||
setlocal commentstring=#\ %s
|
||||
|
||||
let b:undo_ftplugin = 'setl com<'
|
16
runtime/indent/hcl.vim
Normal file
16
runtime/indent/hcl.vim
Normal file
@ -0,0 +1,16 @@
|
||||
" Vim indent file
|
||||
" Language: HCL
|
||||
" Maintainer: Gregory Anders
|
||||
" Upstream: https://github.com/hashivim/vim-terraform
|
||||
" Last Change: 2024-09-03
|
||||
|
||||
if exists('b:did_indent')
|
||||
finish
|
||||
endif
|
||||
let b:did_indent = 1
|
||||
|
||||
setlocal autoindent shiftwidth=2 tabstop=2 softtabstop=2 expandtab
|
||||
setlocal indentexpr=hcl#indentexpr(v:lnum)
|
||||
setlocal indentkeys+=<:>,0=},0=)
|
||||
|
||||
let b:undo_indent = 'setlocal ai< sw< ts< sts< et< inde< indk<'
|
11
runtime/indent/terraform.vim
Normal file
11
runtime/indent/terraform.vim
Normal file
@ -0,0 +1,11 @@
|
||||
" Vim indent file
|
||||
" Language: Terraform
|
||||
" Maintainer: Gregory Anders
|
||||
" Upstream: https://github.com/hashivim/vim-terraform
|
||||
" Last Change: 2024-09-03
|
||||
|
||||
if exists('b:did_indent')
|
||||
finish
|
||||
endif
|
||||
|
||||
runtime! indent/hcl.vim
|
@ -723,7 +723,7 @@ function M.open_page(count, smods, args)
|
||||
end
|
||||
|
||||
sect, name = extract_sect_and_name_path(path)
|
||||
local buf = fn.bufnr()
|
||||
local buf = api.nvim_get_current_buf()
|
||||
local save_tfu = vim.bo[buf].tagfunc
|
||||
vim.bo[buf].tagfunc = "v:lua.require'man'.goto_tag"
|
||||
|
||||
@ -739,7 +739,9 @@ function M.open_page(count, smods, args)
|
||||
end
|
||||
end)
|
||||
|
||||
vim.bo[buf].tagfunc = save_tfu
|
||||
if api.nvim_buf_is_valid(buf) then
|
||||
vim.bo[buf].tagfunc = save_tfu
|
||||
end
|
||||
|
||||
if not ok then
|
||||
error(ret)
|
||||
|
@ -1003,6 +1003,7 @@ local function extend_style(out, state)
|
||||
--TODO(altermo) use local namespace (instead of global 0)
|
||||
local fg = vim.fn.synIDattr(hlid, 'fg#')
|
||||
local bg = vim.fn.synIDattr(hlid, 'bg#')
|
||||
local sp = vim.fn.synIDattr(hlid, 'sp#')
|
||||
local decor_line = {}
|
||||
if vim.fn.synIDattr(hlid, 'underline') ~= '' then
|
||||
table.insert(decor_line, 'underline')
|
||||
@ -1020,6 +1021,8 @@ local function extend_style(out, state)
|
||||
['font-weight'] = vim.fn.synIDattr(hlid, 'bold') ~= '' and 'bold' or nil,
|
||||
['text-decoration-line'] = not vim.tbl_isempty(decor_line) and table.concat(decor_line, ' ')
|
||||
or nil,
|
||||
-- TODO(ribru17): fallback to displayed text color if sp not set
|
||||
['text-decoration-color'] = sp ~= '' and cterm_to_hex(sp) or nil,
|
||||
--TODO(altermo) if strikethrough and undercurl then the strikethrough becomes wavy
|
||||
['text-decoration-style'] = vim.fn.synIDattr(hlid, 'undercurl') ~= '' and 'wavy' or nil,
|
||||
}
|
||||
@ -1290,9 +1293,25 @@ local function opt_to_global_state(opt, title)
|
||||
local fonts = {}
|
||||
if opt.font then
|
||||
fonts = type(opt.font) == 'string' and { opt.font } or opt.font --[[@as (string[])]]
|
||||
for i, v in pairs(fonts) do
|
||||
fonts[i] = ('"%s"'):format(v)
|
||||
end
|
||||
elseif vim.o.guifont:match('^[^:]+') then
|
||||
table.insert(fonts, vim.o.guifont:match('^[^:]+'))
|
||||
-- Example:
|
||||
-- Input: "Font,Escape\,comma, Ignore space after comma"
|
||||
-- Output: { "Font","Escape,comma","Ignore space after comma" }
|
||||
local prev = ''
|
||||
for name in vim.gsplit(vim.o.guifont:match('^[^:]+'), ',', { trimempty = true }) do
|
||||
if vim.endswith(name, '\\') then
|
||||
prev = prev .. vim.trim(name:sub(1, -2) .. ',')
|
||||
elseif vim.trim(name) ~= '' then
|
||||
table.insert(fonts, ('"%s%s"'):format(prev, vim.trim(name)))
|
||||
prev = ''
|
||||
end
|
||||
end
|
||||
end
|
||||
-- Generic family names (monospace here) must not be quoted
|
||||
-- because the browser recognizes them as font families.
|
||||
table.insert(fonts, 'monospace')
|
||||
--- @type vim.tohtml.state.global
|
||||
local state = {
|
||||
|
@ -113,9 +113,11 @@ do
|
||||
local gx_desc =
|
||||
'Opens filepath or URI under cursor with the system handler (file explorer, web browser, …)'
|
||||
vim.keymap.set({ 'n' }, 'gx', function()
|
||||
local err = do_open(require('vim.ui')._get_url())
|
||||
if err then
|
||||
vim.notify(err, vim.log.levels.ERROR)
|
||||
for _, url in ipairs(require('vim.ui')._get_urls()) do
|
||||
local err = do_open(url)
|
||||
if err then
|
||||
vim.notify(err, vim.log.levels.ERROR)
|
||||
end
|
||||
end
|
||||
end, { desc = gx_desc })
|
||||
vim.keymap.set({ 'x' }, 'gx', function()
|
||||
@ -211,20 +213,48 @@ end
|
||||
--- Default menus
|
||||
do
|
||||
--- Right click popup menu
|
||||
-- TODO VimScript, no l10n
|
||||
vim.cmd([[
|
||||
vnoremenu PopUp.Cut "+x
|
||||
vnoremenu PopUp.Copy "+y
|
||||
anoremenu PopUp.Paste "+gP
|
||||
vnoremenu PopUp.Paste "+P
|
||||
vnoremenu PopUp.Delete "_x
|
||||
nnoremenu PopUp.Select\ All ggVG
|
||||
vnoremenu PopUp.Select\ All gg0oG$
|
||||
inoremenu PopUp.Select\ All <C-Home><C-O>VG
|
||||
anoremenu PopUp.Inspect <Cmd>Inspect<CR>
|
||||
anoremenu PopUp.-1- <Nop>
|
||||
anoremenu PopUp.How-to\ disable\ mouse <Cmd>help disable-mouse<CR>
|
||||
]])
|
||||
local function def_menu(ctx)
|
||||
vim.cmd([[
|
||||
anoremenu PopUp.Go\ to\ definition <Cmd>lua vim.lsp.buf.definition()<CR>
|
||||
amenu PopUp.Open\ in\ web\ browser gx
|
||||
anoremenu PopUp.Inspect <Cmd>Inspect<CR>
|
||||
anoremenu PopUp.-1- <Nop>
|
||||
vnoremenu PopUp.Cut "+x
|
||||
vnoremenu PopUp.Copy "+y
|
||||
anoremenu PopUp.Paste "+gP
|
||||
vnoremenu PopUp.Paste "+P
|
||||
vnoremenu PopUp.Delete "_x
|
||||
nnoremenu PopUp.Select\ All ggVG
|
||||
vnoremenu PopUp.Select\ All gg0oG$
|
||||
inoremenu PopUp.Select\ All <C-Home><C-O>VG
|
||||
anoremenu PopUp.-2- <Nop>
|
||||
anoremenu PopUp.How-to\ disable\ mouse <Cmd>help disable-mouse<CR>
|
||||
|
||||
amenu disable PopUp.Go\ to\ definition
|
||||
amenu disable PopUp.Open\ in\ web\ browser
|
||||
]])
|
||||
|
||||
if ctx == 'url' then
|
||||
vim.cmd([[amenu enable PopUp.Open\ in\ web\ browser]])
|
||||
elseif ctx == 'lsp' then
|
||||
vim.cmd([[anoremenu enable PopUp.Go\ to\ definition]])
|
||||
end
|
||||
end
|
||||
def_menu()
|
||||
|
||||
local nvim_popupmenu_augroup = vim.api.nvim_create_augroup('nvim_popupmenu', {})
|
||||
vim.api.nvim_create_autocmd('MenuPopup', {
|
||||
pattern = '*',
|
||||
group = nvim_popupmenu_augroup,
|
||||
desc = 'Mouse popup menu',
|
||||
-- nested = true,
|
||||
callback = function()
|
||||
local urls = require('vim.ui')._get_urls()
|
||||
local url = vim.startswith(urls[1], 'http')
|
||||
local ctx = url and 'url' or (vim.lsp.get_clients({ bufnr = 0 })[1] and 'lsp' or nil)
|
||||
def_menu(ctx)
|
||||
end,
|
||||
})
|
||||
end
|
||||
|
||||
--- Default autocommands. See |default-autocmds|
|
||||
|
@ -1,17 +1,19 @@
|
||||
-- Nvim-Lua stdlib: the `vim` module (:help lua-stdlib)
|
||||
--
|
||||
-- Lua code lives in one of three places:
|
||||
-- 1. runtime/lua/vim/ (the runtime): For "nice to have" features, e.g. the
|
||||
-- `inspect` and `lpeg` modules.
|
||||
-- 2. runtime/lua/vim/shared.lua: pure Lua functions which always
|
||||
-- are available. Used in the test runner, as well as worker threads
|
||||
-- and processes launched from Nvim.
|
||||
-- 3. runtime/lua/vim/_editor.lua: Code which directly interacts with
|
||||
-- the Nvim editor state. Only available in the main thread.
|
||||
-- Lua code lives in one of four places:
|
||||
-- 1. Plugins! Not everything needs to live on "vim.*". Plugins are the correct model for
|
||||
-- non-essential features which the user may want to disable or replace with a third-party
|
||||
-- plugin. Examples: "editorconfig", "comment".
|
||||
-- - "opt-out": runtime/plugin/*.lua
|
||||
-- - "opt-in": runtime/pack/dist/opt/
|
||||
-- 2. runtime/lua/vim/ (the runtime): Lazy-loaded modules. Examples: `inspect`, `lpeg`.
|
||||
-- 3. runtime/lua/vim/shared.lua: pure Lua functions which always are available. Used in the test
|
||||
-- runner, as well as worker threads and processes launched from Nvim.
|
||||
-- 4. runtime/lua/vim/_editor.lua: Eager-loaded code which directly interacts with the Nvim
|
||||
-- editor state. Only available in the main thread.
|
||||
--
|
||||
-- Guideline: "If in doubt, put it in the runtime".
|
||||
--
|
||||
-- Most functions should live directly in `vim.`, not in submodules.
|
||||
-- The top level "vim.*" namespace is for fundamental Lua and editor features. Use submodules for
|
||||
-- everything else (but avoid excessive "nesting"), or plugins (see above).
|
||||
--
|
||||
-- Compatibility with Vim's `if_lua` is explicitly a non-goal.
|
||||
--
|
||||
@ -19,9 +21,7 @@
|
||||
-- - https://github.com/luafun/luafun
|
||||
-- - https://github.com/rxi/lume
|
||||
-- - http://leafo.net/lapis/reference/utilities.html
|
||||
-- - https://github.com/torch/paths
|
||||
-- - https://github.com/bakpakin/Fennel (pretty print, repl)
|
||||
-- - https://github.com/howl-editor/howl/tree/master/lib/howl/util
|
||||
|
||||
-- These are for loading runtime modules lazily since they aren't available in
|
||||
-- the nvim binary as specified in executor.c
|
||||
|
2
runtime/lua/vim/_meta/api.lua
generated
2
runtime/lua/vim/_meta/api.lua
generated
@ -378,7 +378,7 @@ function vim.api.nvim_buf_get_commands(buffer, opts) end
|
||||
--- • details: Whether to include the details dict
|
||||
--- • hl_name: Whether to include highlight group name instead of
|
||||
--- id, true if omitted
|
||||
--- @return vim.api.keyset.get_extmark_item
|
||||
--- @return vim.api.keyset.get_extmark_item_by_id
|
||||
function vim.api.nvim_buf_get_extmark_by_id(buffer, ns_id, id, opts) end
|
||||
|
||||
--- Gets `extmarks` in "traversal order" from a `charwise` region defined by
|
||||
|
@ -23,7 +23,7 @@ error('Cannot require a meta file')
|
||||
--- @field conceal? boolean
|
||||
--- @field spell? boolean
|
||||
--- @field ui_watched? boolean
|
||||
--- @field url? boolean
|
||||
--- @field url? string
|
||||
--- @field hl_mode? string
|
||||
---
|
||||
--- @field virt_text? [string, string][]
|
||||
@ -43,11 +43,17 @@ error('Cannot require a meta file')
|
||||
--- @field line_hl_group? string
|
||||
--- @field cursorline_hl_group? string
|
||||
|
||||
--- @class vim.api.keyset.get_extmark_item
|
||||
--- @class vim.api.keyset.get_extmark_item_by_id
|
||||
--- @field [1] integer row
|
||||
--- @field [2] integer col
|
||||
--- @field [3] vim.api.keyset.extmark_details?
|
||||
|
||||
--- @class vim.api.keyset.get_extmark_item
|
||||
--- @field [1] integer extmark_id
|
||||
--- @field [2] integer row
|
||||
--- @field [3] integer col
|
||||
--- @field [4] vim.api.keyset.extmark_details?
|
||||
|
||||
--- @class vim.api.keyset.get_mark
|
||||
--- @field [1] integer row
|
||||
--- @field [2] integer col
|
||||
|
13
runtime/lua/vim/_meta/options.lua
generated
13
runtime/lua/vim/_meta/options.lua
generated
@ -558,9 +558,9 @@ vim.wo.bri = vim.wo.breakindent
|
||||
--- list:{n} Adds an additional indent for lines that match a
|
||||
--- numbered or bulleted list (using the
|
||||
--- 'formatlistpat' setting).
|
||||
--- list:-1 Uses the length of a match with 'formatlistpat'
|
||||
--- for indentation.
|
||||
--- (default: 0)
|
||||
--- list:-1 Uses the width of a match with 'formatlistpat' for
|
||||
--- indentation.
|
||||
--- column:{n} Indent at column {n}. Will overrule the other
|
||||
--- sub-options. Note: an additional indent may be
|
||||
--- added for the 'showbreak' setting.
|
||||
@ -1829,9 +1829,12 @@ vim.go.ead = vim.go.eadirection
|
||||
|
||||
--- When on all Unicode emoji characters are considered to be full width.
|
||||
--- This excludes "text emoji" characters, which are normally displayed as
|
||||
--- single width. Unfortunately there is no good specification for this
|
||||
--- and it has been determined on trial-and-error basis. Use the
|
||||
--- `setcellwidths()` function to change the behavior.
|
||||
--- single width. However, such "text emoji" are treated as full-width
|
||||
--- emoji if they are followed by the U+FE0F variant selector.
|
||||
---
|
||||
--- Unfortunately there is no good specification for this and it has been
|
||||
--- determined on trial-and-error basis. Use the `setcellwidths()`
|
||||
--- function to change the behavior.
|
||||
---
|
||||
--- @type boolean
|
||||
vim.o.emoji = true
|
||||
|
5
runtime/lua/vim/_meta/vimfn.lua
generated
5
runtime/lua/vim/_meta/vimfn.lua
generated
@ -1593,7 +1593,7 @@ function vim.fn.eventhandler() end
|
||||
--- On MS-Windows the ".exe", ".bat", etc. can optionally be
|
||||
--- included. Then the extensions in $PATHEXT are tried. Thus if
|
||||
--- "foo.exe" does not exist, "foo.exe.bat" can be found. If
|
||||
--- $PATHEXT is not set then ".exe;.com;.bat;.cmd" is used. A dot
|
||||
--- $PATHEXT is not set then ".com;.exe;.bat;.cmd" is used. A dot
|
||||
--- by itself can be used in $PATHEXT to try using the name
|
||||
--- without an extension. When 'shell' looks like a Unix shell,
|
||||
--- then the name is also tried without adding an extension.
|
||||
@ -2861,7 +2861,7 @@ function vim.fn.getcharpos(expr) end
|
||||
--- nnoremap <expr> , getcharsearch().forward ? ',' : ';'
|
||||
--- <Also see |setcharsearch()|.
|
||||
---
|
||||
--- @return table[]
|
||||
--- @return table
|
||||
function vim.fn.getcharsearch() end
|
||||
|
||||
--- Get a single character from the user or input stream as a
|
||||
@ -5262,6 +5262,7 @@ function vim.fn.map(expr1, expr2) end
|
||||
--- "lhsrawalt" The {lhs} of the mapping as raw bytes, alternate
|
||||
--- form, only present when it differs from "lhsraw"
|
||||
--- "rhs" The {rhs} of the mapping as typed.
|
||||
--- "callback" Lua function, if RHS was defined as such.
|
||||
--- "silent" 1 for a |:map-silent| mapping, else 0.
|
||||
--- "noremap" 1 if the {rhs} of the mapping is not remappable.
|
||||
--- "script" 1 if mapping was defined with <script>.
|
||||
|
@ -2518,7 +2518,7 @@ end
|
||||
--- ['.*/etc/foo/.*%.conf'] = { 'dosini', { priority = 10 } },
|
||||
--- -- A pattern containing an environment variable
|
||||
--- ['${XDG_CONFIG_HOME}/foo/git'] = 'git',
|
||||
--- ['README.(%a+)$'] = function(path, bufnr, ext)
|
||||
--- ['.*README.(%a+)'] = function(path, bufnr, ext)
|
||||
--- if ext == 'md' then
|
||||
--- return 'markdown'
|
||||
--- elseif ext == 'rst' then
|
||||
|
@ -1,6 +1,6 @@
|
||||
--- @brief
|
||||
---<pre>help
|
||||
--- health.vim is a minimal framework to help users troubleshoot configuration and
|
||||
--- vim.health is a minimal framework to help users troubleshoot configuration and
|
||||
--- any other environment conditions that a plugin might care about. Nvim ships
|
||||
--- with healthchecks for configuration, performance, python support, ruby
|
||||
--- support, clipboard support, and more.
|
||||
@ -39,7 +39,7 @@
|
||||
--- :checkhealth vim*
|
||||
--- <
|
||||
---
|
||||
--- Create a healthcheck *health-dev* *vim.health*
|
||||
--- Create a healthcheck *health-dev*
|
||||
---
|
||||
--- Healthchecks are functions that check the user environment, configuration, or
|
||||
--- any other prerequisites that a plugin cares about. Nvim ships with
|
||||
|
@ -6,10 +6,12 @@
|
||||
--- of each pipeline stage is input to the next stage. The first stage depends on the type passed to
|
||||
--- `vim.iter()`:
|
||||
---
|
||||
--- - List tables (arrays, |lua-list|) yield only the value of each element.
|
||||
--- - Holes (nil values) are allowed.
|
||||
--- - Lists or arrays (|lua-list|) yield only the value of each element.
|
||||
--- - Holes (nil values) are allowed (but discarded).
|
||||
--- - Use pairs() to treat array/list tables as dicts (preserve holes and non-contiguous integer
|
||||
--- keys): `vim.iter(pairs(…))`.
|
||||
--- - Use |Iter:enumerate()| to also pass the index to the next stage.
|
||||
--- - Or initialize with ipairs(): `vim.iter(ipairs(…))`.
|
||||
--- - Or initialize with ipairs(): `vim.iter(ipairs(…))`.
|
||||
--- - Non-list tables (|lua-dict|) yield both the key and value of each element.
|
||||
--- - Function |iterator|s yield all values returned by the underlying function.
|
||||
--- - Tables with a |__call()| metamethod are treated as function iterators.
|
||||
@ -1034,7 +1036,7 @@ function Iter.new(src, ...)
|
||||
if type(k) ~= 'number' or k <= 0 or math.floor(k) ~= k then
|
||||
return Iter.new(pairs(src))
|
||||
end
|
||||
t[#t + 1] = v
|
||||
t[#t + 1] = v -- Coerce to list-like table.
|
||||
end
|
||||
return ArrayIter.new(t)
|
||||
end
|
||||
|
@ -1031,7 +1031,7 @@ end
|
||||
--- Provides an interface between the built-in client and a `formatexpr` function.
|
||||
---
|
||||
--- Currently only supports a single client. This can be set via
|
||||
--- `setlocal formatexpr=v:lua.vim.lsp.formatexpr()` but will typically or in `on_attach`
|
||||
--- `setlocal formatexpr=v:lua.vim.lsp.formatexpr()` or (more typically) in `on_attach`
|
||||
--- via `vim.bo[bufnr].formatexpr = 'v:lua.vim.lsp.formatexpr(#{timeout_ms:250})'`.
|
||||
---
|
||||
---@param opts? vim.lsp.formatexpr.Opts
|
||||
|
@ -464,7 +464,7 @@ local function pick_call_hierarchy_item(call_hierarchy_items)
|
||||
if choice < 1 or choice > #items then
|
||||
return
|
||||
end
|
||||
return choice
|
||||
return call_hierarchy_items[choice]
|
||||
end
|
||||
|
||||
--- @param method string
|
||||
|
@ -23,6 +23,7 @@ local ns_to_ms = 0.000001
|
||||
--- @class vim.lsp.completion.BufHandle
|
||||
--- @field clients table<integer, vim.lsp.Client>
|
||||
--- @field triggers table<string, vim.lsp.Client[]>
|
||||
--- @field convert? fun(item: lsp.CompletionItem): table
|
||||
|
||||
--- @type table<integer, vim.lsp.completion.BufHandle>
|
||||
local buf_handles = {}
|
||||
@ -237,7 +238,7 @@ function M._lsp_to_complete_items(result, prefix, client_id)
|
||||
|
||||
---@type fun(item: lsp.CompletionItem):boolean
|
||||
local matches
|
||||
if prefix == '' then
|
||||
if not prefix:find('%w') then
|
||||
matches = function(_)
|
||||
return true
|
||||
end
|
||||
@ -250,6 +251,8 @@ function M._lsp_to_complete_items(result, prefix, client_id)
|
||||
end
|
||||
|
||||
local candidates = {}
|
||||
local bufnr = api.nvim_get_current_buf()
|
||||
local user_convert = vim.tbl_get(buf_handles, bufnr, 'convert')
|
||||
for _, item in ipairs(items) do
|
||||
if matches(item) then
|
||||
local word = get_completion_word(item)
|
||||
@ -260,7 +263,7 @@ function M._lsp_to_complete_items(result, prefix, client_id)
|
||||
then
|
||||
hl_group = 'DiagnosticDeprecated'
|
||||
end
|
||||
table.insert(candidates, {
|
||||
local completion_item = {
|
||||
word = word,
|
||||
abbr = item.label,
|
||||
kind = protocol.CompletionItemKind[item.kind] or 'Unknown',
|
||||
@ -278,7 +281,11 @@ function M._lsp_to_complete_items(result, prefix, client_id)
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
}
|
||||
if user_convert then
|
||||
completion_item = vim.tbl_extend('keep', user_convert(item), completion_item)
|
||||
end
|
||||
table.insert(candidates, completion_item)
|
||||
end
|
||||
end
|
||||
---@diagnostic disable-next-line: no-unknown
|
||||
@ -403,6 +410,10 @@ local function trigger(bufnr, clients)
|
||||
reset_timer()
|
||||
Context:cancel_pending()
|
||||
|
||||
if tonumber(vim.fn.pumvisible()) == 1 and not Context.isIncomplete then
|
||||
return
|
||||
end
|
||||
|
||||
local win = api.nvim_get_current_win()
|
||||
local cursor_row, cursor_col = unpack(api.nvim_win_get_cursor(win)) --- @type integer, integer
|
||||
local line = api.nvim_get_current_line()
|
||||
@ -586,14 +597,15 @@ end
|
||||
|
||||
--- @class vim.lsp.completion.BufferOpts
|
||||
--- @field autotrigger? boolean Whether to trigger completion automatically. Default: false
|
||||
--- @field convert? fun(item: lsp.CompletionItem): table Transforms an LSP CompletionItem to |complete-items|.
|
||||
|
||||
--- @param client_id integer
|
||||
---@param client_id integer
|
||||
---@param bufnr integer
|
||||
---@param opts vim.lsp.completion.BufferOpts
|
||||
local function enable_completions(client_id, bufnr, opts)
|
||||
local buf_handle = buf_handles[bufnr]
|
||||
if not buf_handle then
|
||||
buf_handle = { clients = {}, triggers = {} }
|
||||
buf_handle = { clients = {}, triggers = {}, convert = opts.convert }
|
||||
buf_handles[bufnr] = buf_handle
|
||||
|
||||
-- Attach to buffer events.
|
||||
|
@ -110,6 +110,14 @@ local function diagnostic_lsp_to_vim(diagnostics, bufnr, client_id)
|
||||
return vim.tbl_map(function(diagnostic)
|
||||
local start = diagnostic.range.start
|
||||
local _end = diagnostic.range['end']
|
||||
local message = diagnostic.message
|
||||
if type(message) ~= 'string' then
|
||||
vim.notify_once(
|
||||
string.format('Unsupported Markup message from LSP client %d', client_id),
|
||||
vim.lsp.log_levels.ERROR
|
||||
)
|
||||
message = diagnostic.message.value
|
||||
end
|
||||
--- @type vim.Diagnostic
|
||||
return {
|
||||
lnum = start.line,
|
||||
@ -117,7 +125,7 @@ local function diagnostic_lsp_to_vim(diagnostics, bufnr, client_id)
|
||||
end_lnum = _end.line,
|
||||
end_col = line_byte_from_position(buf_lines, _end.line, _end.character, offset_encoding),
|
||||
severity = severity_lsp_to_vim(diagnostic.severity),
|
||||
message = diagnostic.message,
|
||||
message = message,
|
||||
source = diagnostic.source,
|
||||
code = diagnostic.code,
|
||||
_tags = tags_lsp_to_vim(diagnostic, client_id),
|
||||
@ -145,9 +153,10 @@ local function tags_vim_to_lsp(diagnostic)
|
||||
return tags
|
||||
end
|
||||
|
||||
--- Converts the input `vim.Diagnostic`s to LSP diagnostics.
|
||||
--- @param diagnostics vim.Diagnostic[]
|
||||
--- @return lsp.Diagnostic[]
|
||||
local function diagnostic_vim_to_lsp(diagnostics)
|
||||
function M.from(diagnostics)
|
||||
---@param diagnostic vim.Diagnostic
|
||||
---@return lsp.Diagnostic
|
||||
return vim.tbl_map(function(diagnostic)
|
||||
@ -377,7 +386,7 @@ function M.get_line_diagnostics(bufnr, line_nr, opts, client_id)
|
||||
|
||||
diag_opts.lnum = line_nr or (api.nvim_win_get_cursor(0)[1] - 1)
|
||||
|
||||
return diagnostic_vim_to_lsp(vim.diagnostic.get(bufnr, diag_opts))
|
||||
return M.from(vim.diagnostic.get(bufnr, diag_opts))
|
||||
end
|
||||
|
||||
--- Clear diagnostics from pull based clients
|
||||
|
@ -703,7 +703,9 @@ function M.connect(host_or_path, port)
|
||||
if port == nil then
|
||||
handle:connect(host_or_path, on_connect)
|
||||
else
|
||||
handle:connect(host_or_path, port, on_connect)
|
||||
local info = uv.getaddrinfo(host_or_path, nil)
|
||||
local resolved_host = info and info[1] and info[1].addr or host_or_path
|
||||
handle:connect(resolved_host, port, on_connect)
|
||||
end
|
||||
|
||||
return public_client(client)
|
||||
|
@ -1795,8 +1795,18 @@ function M.locations_to_items(locations, offset_encoding)
|
||||
local row = pos.line
|
||||
local end_row = end_pos.line
|
||||
local line = lines[row] or ''
|
||||
local col = M._str_byteindex_enc(line, pos.character, offset_encoding)
|
||||
local end_col = M._str_byteindex_enc(lines[end_row] or '', end_pos.character, offset_encoding)
|
||||
local line_len = vim.fn.strcharlen(line)
|
||||
local end_line = lines[end_row] or ''
|
||||
local end_line_len = vim.fn.strcharlen(end_line)
|
||||
-- LSP spec: if character > line length, default to the line length.
|
||||
-- https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#position
|
||||
local col = pos.character <= line_len
|
||||
and M._str_byteindex_enc(line, pos.character, offset_encoding)
|
||||
or line_len
|
||||
local end_col = end_pos.character <= end_line_len
|
||||
and M._str_byteindex_enc(end_line, end_pos.character, offset_encoding)
|
||||
or end_line_len
|
||||
|
||||
table.insert(items, {
|
||||
filename = filename,
|
||||
lnum = row + 1,
|
||||
|
@ -354,37 +354,22 @@ function vim.tbl_isempty(t)
|
||||
return next(t) == nil
|
||||
end
|
||||
|
||||
--- We only merge empty tables or tables that are not an array (indexed by integers)
|
||||
local function can_merge(v)
|
||||
return type(v) == 'table' and (vim.tbl_isempty(v) or not vim.isarray(v))
|
||||
end
|
||||
|
||||
local function tbl_extend(behavior, deep_extend, ...)
|
||||
if behavior ~= 'error' and behavior ~= 'keep' and behavior ~= 'force' then
|
||||
error('invalid "behavior": ' .. tostring(behavior))
|
||||
end
|
||||
|
||||
if select('#', ...) < 2 then
|
||||
error(
|
||||
'wrong number of arguments (given '
|
||||
.. tostring(1 + select('#', ...))
|
||||
.. ', expected at least 3)'
|
||||
)
|
||||
end
|
||||
|
||||
--- Recursive worker for tbl_extend
|
||||
--- @param behavior 'error'|'keep'|'force'
|
||||
--- @param deep_extend boolean
|
||||
--- @param ... table<any,any>
|
||||
local function tbl_extend_rec(behavior, deep_extend, ...)
|
||||
local ret = {} --- @type table<any,any>
|
||||
if vim._empty_dict_mt ~= nil and getmetatable(select(1, ...)) == vim._empty_dict_mt then
|
||||
ret = vim.empty_dict()
|
||||
end
|
||||
|
||||
for i = 1, select('#', ...) do
|
||||
local tbl = select(i, ...)
|
||||
vim.validate('after the second argument', tbl, 'table')
|
||||
--- @cast tbl table<any,any>
|
||||
local tbl = select(i, ...) --[[@as table<any,any>]]
|
||||
if tbl then
|
||||
for k, v in pairs(tbl) do
|
||||
if deep_extend and can_merge(v) and can_merge(ret[k]) then
|
||||
ret[k] = tbl_extend(behavior, true, ret[k], v)
|
||||
if deep_extend and type(v) == 'table' and type(ret[k]) == 'table' then
|
||||
ret[k] = tbl_extend_rec(behavior, true, ret[k], v)
|
||||
elseif behavior ~= 'force' and ret[k] ~= nil then
|
||||
if behavior == 'error' then
|
||||
error('key found in more than one map: ' .. k)
|
||||
@ -395,9 +380,31 @@ local function tbl_extend(behavior, deep_extend, ...)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return ret
|
||||
end
|
||||
|
||||
--- @param behavior 'error'|'keep'|'force'
|
||||
--- @param deep_extend boolean
|
||||
--- @param ... table<any,any>
|
||||
local function tbl_extend(behavior, deep_extend, ...)
|
||||
if behavior ~= 'error' and behavior ~= 'keep' and behavior ~= 'force' then
|
||||
error('invalid "behavior": ' .. tostring(behavior))
|
||||
end
|
||||
|
||||
local nargs = select('#', ...)
|
||||
|
||||
if nargs < 2 then
|
||||
error(('wrong number of arguments (given %d, expected at least 3)'):format(1 + nargs))
|
||||
end
|
||||
|
||||
for i = 1, nargs do
|
||||
vim.validate('after the second argument', select(i, ...), 'table')
|
||||
end
|
||||
|
||||
return tbl_extend_rec(behavior, deep_extend, ...)
|
||||
end
|
||||
|
||||
--- Merges two or more tables.
|
||||
---
|
||||
---@see |extend()|
|
||||
|
@ -131,9 +131,7 @@ local function compute_folds_levels(bufnr, info, srow, erow, parse_injections)
|
||||
|
||||
-- Collect folds starting from srow - 1, because we should first subtract the folds that end at
|
||||
-- srow - 1 from the level of srow - 1 to get accurate level of srow.
|
||||
for _, match, metadata in
|
||||
query:iter_matches(tree:root(), bufnr, math.max(srow - 1, 0), erow, { all = true })
|
||||
do
|
||||
for _, match, metadata in query:iter_matches(tree:root(), bufnr, math.max(srow - 1, 0), erow) do
|
||||
for id, nodes in pairs(match) do
|
||||
if query.captures[id] == 'fold' then
|
||||
local range = ts.get_range(nodes[1], bufnr, metadata[id])
|
||||
|
@ -72,7 +72,11 @@ vim._ts_get_language_version = function() end
|
||||
--- @param path string
|
||||
--- @param lang string
|
||||
--- @param symbol_name? string
|
||||
vim._ts_add_language = function(path, lang, symbol_name) end
|
||||
vim._ts_add_language_from_object = function(path, lang, symbol_name) end
|
||||
|
||||
--- @param path string
|
||||
--- @param lang string
|
||||
vim._ts_add_language_from_wasm = function(path, lang) end
|
||||
|
||||
---@return integer
|
||||
vim._ts_get_minimum_language_version = function() end
|
||||
|
@ -176,7 +176,7 @@ function M.lint(buf, opts)
|
||||
parser:parse()
|
||||
parser:for_each_tree(function(tree, ltree)
|
||||
if ltree:lang() == 'query' then
|
||||
for _, match, _ in query:iter_matches(tree:root(), buf, 0, -1, { all = true }) do
|
||||
for _, match, _ in query:iter_matches(tree:root(), buf, 0, -1) do
|
||||
local lang_context = {
|
||||
lang = lang,
|
||||
parser_info = parser_info,
|
||||
@ -241,7 +241,7 @@ function M.omnifunc(findstart, base)
|
||||
end
|
||||
end
|
||||
for _, s in pairs(parser_info.symbols) do
|
||||
local text = s[2] and s[1] or '"' .. s[1]:gsub([[\]], [[\\]]) .. '"' ---@type string
|
||||
local text = s[2] and s[1] or string.format('%q', s[1]):gsub('\n', 'n') ---@type string
|
||||
if text:find(base, 1, true) then
|
||||
table.insert(items, text)
|
||||
end
|
||||
|
@ -28,6 +28,9 @@ function M.check()
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
local can_wasm = vim._ts_add_language_from_wasm ~= nil
|
||||
health.info(string.format('Can load WASM parsers: %s', tostring(can_wasm)))
|
||||
end
|
||||
|
||||
return M
|
||||
|
@ -109,7 +109,14 @@ function M.add(lang, opts)
|
||||
path = paths[1]
|
||||
end
|
||||
|
||||
vim._ts_add_language(path, lang, symbol_name)
|
||||
if vim.endswith(path, '.wasm') then
|
||||
if not vim._ts_add_language_from_wasm then
|
||||
error(string.format("Unable to load wasm parser '%s': not built with ENABLE_WASMTIME ", path))
|
||||
end
|
||||
vim._ts_add_language_from_wasm(path, lang)
|
||||
else
|
||||
vim._ts_add_language_from_object(path, lang, symbol_name)
|
||||
end
|
||||
M.register(lang, filetype)
|
||||
end
|
||||
|
||||
|
@ -833,13 +833,7 @@ function LanguageTree:_get_injections()
|
||||
local start_line, _, end_line, _ = root_node:range()
|
||||
|
||||
for pattern, match, metadata in
|
||||
self._injection_query:iter_matches(
|
||||
root_node,
|
||||
self._source,
|
||||
start_line,
|
||||
end_line + 1,
|
||||
{ all = true }
|
||||
)
|
||||
self._injection_query:iter_matches(root_node, self._source, start_line, end_line + 1)
|
||||
do
|
||||
local lang, combined, ranges = self:_get_injection(match, metadata)
|
||||
if lang then
|
||||
|
@ -487,8 +487,8 @@ predicate_handlers['any-vim-match?'] = predicate_handlers['any-match?']
|
||||
---@class vim.treesitter.query.TSMetadata
|
||||
---@field range? Range
|
||||
---@field conceal? string
|
||||
---@field [integer] vim.treesitter.query.TSMetadata
|
||||
---@field [string] integer|string
|
||||
---@field [integer]? vim.treesitter.query.TSMetadata
|
||||
---@field [string]? integer|string
|
||||
|
||||
---@alias TSDirective fun(match: table<integer,TSNode[]>, _, _, predicate: (string|integer)[], metadata: vim.treesitter.query.TSMetadata)
|
||||
|
||||
@ -620,16 +620,16 @@ local directive_handlers = {
|
||||
--- @field force? boolean
|
||||
---
|
||||
--- Use the correct implementation of the match table where capture IDs map to
|
||||
--- a list of nodes instead of a single node. Defaults to false (for backward
|
||||
--- compatibility). This option will eventually become the default and removed.
|
||||
--- a list of nodes instead of a single node. Defaults to true. This option will
|
||||
--- be removed in a future release.
|
||||
--- @field all? boolean
|
||||
|
||||
--- Adds a new predicate to be used in queries
|
||||
---
|
||||
---@param name string Name of the predicate, without leading #
|
||||
---@param handler fun(match: table<integer,TSNode[]>, pattern: integer, source: integer|string, predicate: any[], metadata: table)
|
||||
---@param handler fun(match: table<integer,TSNode[]>, pattern: integer, source: integer|string, predicate: any[], metadata: vim.treesitter.query.TSMetadata)
|
||||
--- - see |vim.treesitter.query.add_directive()| for argument meanings
|
||||
---@param opts vim.treesitter.query.add_predicate.Opts
|
||||
---@param opts? vim.treesitter.query.add_predicate.Opts
|
||||
function M.add_predicate(name, handler, opts)
|
||||
-- Backward compatibility: old signature had "force" as boolean argument
|
||||
if type(opts) == 'boolean' then
|
||||
@ -642,7 +642,7 @@ function M.add_predicate(name, handler, opts)
|
||||
error(string.format('Overriding existing predicate %s', name))
|
||||
end
|
||||
|
||||
if opts.all then
|
||||
if opts.all ~= false then
|
||||
predicate_handlers[name] = handler
|
||||
else
|
||||
--- @param match table<integer, TSNode[]>
|
||||
@ -667,7 +667,7 @@ end
|
||||
--- metadata table `metadata[capture_id].key = value`
|
||||
---
|
||||
---@param name string Name of the directive, without leading #
|
||||
---@param handler fun(match: table<integer,TSNode[]>, pattern: integer, source: integer|string, predicate: any[], metadata: table)
|
||||
---@param handler fun(match: table<integer,TSNode[]>, pattern: integer, source: integer|string, predicate: any[], metadata: vim.treesitter.query.TSMetadata)
|
||||
--- - match: A table mapping capture IDs to a list of captured nodes
|
||||
--- - pattern: the index of the matching pattern in the query file
|
||||
--- - predicate: list of strings containing the full directive being called, e.g.
|
||||
@ -894,16 +894,10 @@ end
|
||||
--- index of the pattern in the query, a table mapping capture indices to a list
|
||||
--- of nodes, and metadata from any directives processing the match.
|
||||
---
|
||||
--- WARNING: Set `all=true` to ensure all matching nodes in a match are
|
||||
--- returned, otherwise only the last node in a match is returned, breaking captures
|
||||
--- involving quantifiers such as `(comment)+ @comment`. The default option
|
||||
--- `all=false` is only provided for backward compatibility and will be removed
|
||||
--- after Nvim 0.10.
|
||||
---
|
||||
--- Example:
|
||||
---
|
||||
--- ```lua
|
||||
--- for pattern, match, metadata in cquery:iter_matches(tree:root(), bufnr, 0, -1, { all = true }) do
|
||||
--- for pattern, match, metadata in cquery:iter_matches(tree:root(), bufnr, 0, -1) do
|
||||
--- for id, nodes in pairs(match) do
|
||||
--- local name = query.captures[id]
|
||||
--- for _, node in ipairs(nodes) do
|
||||
@ -925,11 +919,11 @@ end
|
||||
--- - max_start_depth (integer) if non-zero, sets the maximum start depth
|
||||
--- for each match. This is used to prevent traversing too deep into a tree.
|
||||
--- - match_limit (integer) Set the maximum number of in-progress matches (Default: 256).
|
||||
--- - all (boolean) When set, the returned match table maps capture IDs to a list of nodes.
|
||||
--- Older versions of iter_matches incorrectly mapped capture IDs to a single node, which is
|
||||
--- incorrect behavior. This option will eventually become the default and removed.
|
||||
--- - all (boolean) When `false` (default `true`), the returned table maps capture IDs to a single
|
||||
--- (last) node instead of the full list of matching nodes. This option is only for backward
|
||||
--- compatibility and will be removed in a future release.
|
||||
---
|
||||
---@return (fun(): integer, table<integer, TSNode[]>, table): pattern id, match, metadata
|
||||
---@return (fun(): integer, table<integer, TSNode[]>, vim.treesitter.query.TSMetadata): pattern id, match, metadata
|
||||
function Query:iter_matches(node, source, start, stop, opts)
|
||||
opts = opts or {}
|
||||
opts.match_limit = opts.match_limit or 256
|
||||
@ -960,10 +954,10 @@ function Query:iter_matches(node, source, start, stop, opts)
|
||||
|
||||
local captures = match:captures()
|
||||
|
||||
if not opts.all then
|
||||
if opts.all == false then
|
||||
-- Convert the match table into the old buggy version for backward
|
||||
-- compatibility. This is slow. Plugin authors, if you're reading this, set the "all"
|
||||
-- option!
|
||||
-- compatibility. This is slow, but we only do it when the caller explicitly opted into it by
|
||||
-- setting `all` to `false`.
|
||||
local old_match = {} ---@type table<integer, TSNode>
|
||||
for k, v in pairs(captures or {}) do
|
||||
old_match[k] = v[#v]
|
||||
|
@ -152,14 +152,14 @@ function M.open(path)
|
||||
else
|
||||
return nil, 'vim.ui.open: rundll32 not found'
|
||||
end
|
||||
elseif vim.fn.executable('wslview') == 1 then
|
||||
cmd = { 'wslview', path }
|
||||
elseif vim.fn.executable('explorer.exe') == 1 then
|
||||
cmd = { 'explorer.exe', path }
|
||||
elseif vim.fn.executable('xdg-open') == 1 then
|
||||
cmd = { 'xdg-open', path }
|
||||
opts.stdout = false
|
||||
opts.stderr = false
|
||||
elseif vim.fn.executable('wslview') == 1 then
|
||||
cmd = { 'wslview', path }
|
||||
elseif vim.fn.executable('explorer.exe') == 1 then
|
||||
cmd = { 'explorer.exe', path }
|
||||
else
|
||||
return nil, 'vim.ui.open: no handler found (tried: wslview, explorer.exe, xdg-open)'
|
||||
end
|
||||
@ -167,29 +167,64 @@ function M.open(path)
|
||||
return vim.system(cmd, opts), nil
|
||||
end
|
||||
|
||||
--- Gets the URL at cursor, if any.
|
||||
function M._get_url()
|
||||
if vim.bo.filetype == 'markdown' then
|
||||
local range = vim.api.nvim_win_get_cursor(0)
|
||||
vim.treesitter.get_parser():parse(range)
|
||||
-- marking the node as `markdown_inline` is required. Setting it to `markdown` does not
|
||||
-- work.
|
||||
local current_node = vim.treesitter.get_node { lang = 'markdown_inline' }
|
||||
while current_node do
|
||||
local type = current_node:type()
|
||||
if type == 'inline_link' or type == 'image' then
|
||||
local child = assert(current_node:named_child(1))
|
||||
return vim.treesitter.get_node_text(child, 0)
|
||||
end
|
||||
current_node = current_node:parent()
|
||||
--- Returns all URLs at cursor, if any.
|
||||
--- @return string[]
|
||||
function M._get_urls()
|
||||
local urls = {} ---@type string[]
|
||||
|
||||
local bufnr = vim.api.nvim_get_current_buf()
|
||||
local cursor = vim.api.nvim_win_get_cursor(0)
|
||||
local row = cursor[1] - 1
|
||||
local col = cursor[2]
|
||||
local extmarks = vim.api.nvim_buf_get_extmarks(bufnr, -1, { row, col }, { row, col }, {
|
||||
details = true,
|
||||
type = 'highlight',
|
||||
overlap = true,
|
||||
})
|
||||
for _, v in ipairs(extmarks) do
|
||||
local details = v[4]
|
||||
if details and details.url then
|
||||
urls[#urls + 1] = details.url
|
||||
end
|
||||
end
|
||||
|
||||
local url = vim._with({ go = { isfname = vim.o.isfname .. ',@-@' } }, function()
|
||||
return vim.fn.expand('<cfile>')
|
||||
end)
|
||||
local highlighter = vim.treesitter.highlighter.active[bufnr]
|
||||
if highlighter then
|
||||
local range = { row, col, row, col }
|
||||
local ltree = highlighter.tree:language_for_range(range)
|
||||
local lang = ltree:lang()
|
||||
local query = vim.treesitter.query.get(lang, 'highlights')
|
||||
if query then
|
||||
local tree = assert(ltree:tree_for_range(range))
|
||||
for _, match, metadata in query:iter_matches(tree:root(), bufnr, row, row + 1) do
|
||||
for id, nodes in pairs(match) do
|
||||
for _, node in ipairs(nodes) do
|
||||
if vim.treesitter.node_contains(node, range) then
|
||||
local url = metadata[id] and metadata[id].url
|
||||
if url and match[url] then
|
||||
for _, n in ipairs(match[url]) do
|
||||
urls[#urls + 1] =
|
||||
vim.treesitter.get_node_text(n, bufnr, { metadata = metadata[url] })
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return url
|
||||
if #urls == 0 then
|
||||
-- If all else fails, use the filename under the cursor
|
||||
table.insert(
|
||||
urls,
|
||||
vim._with({ go = { isfname = vim.o.isfname .. ',@-@' } }, function()
|
||||
return vim.fn.expand('<cfile>')
|
||||
end)
|
||||
)
|
||||
end
|
||||
|
||||
return urls
|
||||
end
|
||||
|
||||
return M
|
||||
|
@ -4,6 +4,7 @@ GenericName=Text Editor
|
||||
GenericName[ckb]=دەستکاریکەری دەق
|
||||
GenericName[de]=Texteditor
|
||||
GenericName[fr]=Éditeur de texte
|
||||
GenericName[pl]=Edytor tekstu
|
||||
GenericName[ru]=Текстовый редактор
|
||||
GenericName[sr]=Едитор текст
|
||||
GenericName[tr]=Metin Düzenleyici
|
||||
|
@ -60,12 +60,8 @@ func s:Highlight_Matching_Pair()
|
||||
let before = 0
|
||||
|
||||
let text = getline(c_lnum)
|
||||
let matches = matchlist(text, '\(.\)\=\%'.c_col.'c\(.\=\)')
|
||||
if empty(matches)
|
||||
let [c_before, c] = ['', '']
|
||||
else
|
||||
let [c_before, c] = matches[1:2]
|
||||
endif
|
||||
let c_before = text->strpart(0, c_col - 1)->slice(-1)
|
||||
let c = text->strpart(c_col - 1)->slice(0, 1)
|
||||
let plist = split(&matchpairs, '.\zs[:,]')
|
||||
let i = index(plist, c)
|
||||
if i < 0
|
||||
|
66
runtime/syntax/hcl.vim
Normal file
66
runtime/syntax/hcl.vim
Normal file
@ -0,0 +1,66 @@
|
||||
" Vim syntax file
|
||||
" Language: HCL
|
||||
" Maintainer: Gregory Anders
|
||||
" Upstream: https://github.com/hashivim/vim-terraform
|
||||
" Last Change: 2024-09-03
|
||||
|
||||
if exists('b:current_syntax')
|
||||
finish
|
||||
endif
|
||||
|
||||
syn iskeyword a-z,A-Z,48-57,_,-
|
||||
|
||||
syn case match
|
||||
|
||||
" A block is introduced by a type, some number of labels - which are either
|
||||
" strings or identifiers - and an opening curly brace. Match the type.
|
||||
syn match hclBlockType /^\s*\zs\K\k*\ze\s\+\(\("\K\k*"\|\K\k*\)\s\+\)*{/
|
||||
|
||||
" An attribute name is an identifier followed by an equals sign.
|
||||
syn match hclAttributeAssignment /\(\K\k*\.\)*\K\k*\s\+=\s/ contains=hclAttributeName
|
||||
syn match hclAttributeName /\<\K\k*\>/ contained
|
||||
|
||||
syn keyword hclValueBool true false
|
||||
|
||||
syn keyword hclTodo contained TODO FIXME XXX BUG
|
||||
syn region hclComment start="/\*" end="\*/" contains=hclTodo,@Spell
|
||||
syn region hclComment start="#" end="$" contains=hclTodo,@Spell
|
||||
syn region hclComment start="//" end="$" contains=hclTodo,@Spell
|
||||
|
||||
""" misc.
|
||||
syn match hclValueDec "\<[0-9]\+\([kKmMgG]b\?\)\?\>"
|
||||
syn match hclValueHexaDec "\<0x[0-9a-f]\+\([kKmMgG]b\?\)\?\>"
|
||||
syn match hclBraces "[\[\]]"
|
||||
|
||||
""" skip \" and \\ in strings.
|
||||
syn region hclValueString start=/"/ skip=/\\\\\|\\"/ end=/"/ contains=hclStringInterp
|
||||
syn region hclStringInterp matchgroup=hclBraces start=/\(^\|[^$]\)\$\zs{/ end=/}/ contained contains=ALLBUT,hclAttributeName
|
||||
syn region hclHereDocText start=/<<-\?\z([a-z0-9A-Z]\+\)/ end=/^\s*\z1/ contains=hclStringInterp
|
||||
|
||||
"" Functions.
|
||||
syn match hclFunction "[a-z0-9]\+(\@="
|
||||
|
||||
""" HCL2
|
||||
syn keyword hclRepeat for in
|
||||
syn keyword hclConditional if
|
||||
syn keyword hclValueNull null
|
||||
|
||||
" enable block folding
|
||||
syn region hclBlockBody matchgroup=hclBraces start="{" end="}" fold transparent
|
||||
|
||||
hi def link hclComment Comment
|
||||
hi def link hclTodo Todo
|
||||
hi def link hclBraces Delimiter
|
||||
hi def link hclAttributeName Identifier
|
||||
hi def link hclBlockType Type
|
||||
hi def link hclValueBool Boolean
|
||||
hi def link hclValueDec Number
|
||||
hi def link hclValueHexaDec Number
|
||||
hi def link hclValueString String
|
||||
hi def link hclHereDocText String
|
||||
hi def link hclFunction Function
|
||||
hi def link hclRepeat Repeat
|
||||
hi def link hclConditional Conditional
|
||||
hi def link hclValueNull Constant
|
||||
|
||||
let b:current_syntax = 'hcl'
|
File diff suppressed because one or more lines are too long
18
runtime/syntax/htmlangular.vim
Normal file
18
runtime/syntax/htmlangular.vim
Normal file
@ -0,0 +1,18 @@
|
||||
" Vim syntax file
|
||||
" Language: Angular HTML template
|
||||
" Maintainer: Dennis van den Berg <dennis@vdberg.dev>
|
||||
" Last Change: 2024 Aug 22
|
||||
|
||||
" quit when a syntax file was already loaded
|
||||
if exists("b:current_syntax")
|
||||
finish
|
||||
endif
|
||||
|
||||
if !exists("main_syntax")
|
||||
let main_syntax = 'html'
|
||||
endif
|
||||
|
||||
runtime! syntax/html.vim
|
||||
unlet b:current_syntax
|
||||
|
||||
let b:current_syntax = "htmlangular"
|
@ -3,7 +3,7 @@
|
||||
" Maintainer: Aliaksei Budavei <0x000c70 AT gmail DOT com>
|
||||
" Former Maintainer: Claudio Fleiner <claudio@fleiner.com>
|
||||
" Repository: https://github.com/zzzyxwvut/java-vim.git
|
||||
" Last Change: 2024 Jul 30
|
||||
" Last Change: 2024 Aug 26
|
||||
|
||||
" Please check :help java.vim for comments on some of the options available.
|
||||
|
||||
@ -30,6 +30,10 @@ function! s:ff.RightConstant(x, y) abort
|
||||
return a:y
|
||||
endfunction
|
||||
|
||||
function! s:ff.IsRequestedPreviewFeature(n) abort
|
||||
return exists("g:java_syntax_previews") && index(g:java_syntax_previews, a:n) + 1
|
||||
endfunction
|
||||
|
||||
if !exists("*s:ReportOnce")
|
||||
function s:ReportOnce(message) abort
|
||||
echomsg 'syntax/java.vim: ' . a:message
|
||||
@ -39,17 +43,27 @@ else
|
||||
endfunction
|
||||
endif
|
||||
|
||||
function! JavaSyntaxFoldTextExpr() abort
|
||||
return getline(v:foldstart) !~ '/\*\+\s*$'
|
||||
\ ? foldtext()
|
||||
\ : printf('+-%s%3d lines: ',
|
||||
\ v:folddashes,
|
||||
\ (v:foldend - v:foldstart + 1)) .
|
||||
\ getline(v:foldstart + 1)
|
||||
endfunction
|
||||
if exists("g:java_foldtext_show_first_or_second_line")
|
||||
function! s:LazyPrefix(prefix, dashes, count) abort
|
||||
return empty(a:prefix)
|
||||
\ ? printf('+-%s%3d lines: ', a:dashes, a:count)
|
||||
\ : a:prefix
|
||||
endfunction
|
||||
|
||||
" E120 for "fdt=s:JavaSyntaxFoldTextExpr()" before v8.2.3900.
|
||||
setlocal foldtext=JavaSyntaxFoldTextExpr()
|
||||
function! JavaSyntaxFoldTextExpr() abort
|
||||
" Piggyback on NGETTEXT.
|
||||
let summary = foldtext()
|
||||
return getline(v:foldstart) !~ '/\*\+\s*$'
|
||||
\ ? summary
|
||||
\ : s:LazyPrefix(matchstr(summary, '^+-\+\s*\d\+\s.\{-1,}:\s'),
|
||||
\ v:folddashes,
|
||||
\ (v:foldend - v:foldstart + 1)) .
|
||||
\ getline(v:foldstart + 1)
|
||||
endfunction
|
||||
|
||||
" E120 for "fdt=s:JavaSyntaxFoldTextExpr()" before v8.2.3900.
|
||||
setlocal foldtext=JavaSyntaxFoldTextExpr()
|
||||
endif
|
||||
|
||||
" Admit the ASCII dollar sign to keyword characters (JLS-17, §3.8):
|
||||
try
|
||||
@ -357,9 +371,14 @@ syn match javaSpecialChar contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnf
|
||||
syn region javaString start=+"+ end=+"+ end=+$+ contains=javaSpecialChar,javaSpecialError,@Spell
|
||||
syn region javaString start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell
|
||||
syn match javaTextBlockError +"""\s*"""+
|
||||
syn region javaStrTemplEmbExp contained matchgroup=javaStrTempl start="\\{" end="}" contains=TOP
|
||||
exec 'syn region javaStrTempl start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,@Spell'
|
||||
exec 'syn region javaStrTempl start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell'
|
||||
|
||||
if s:ff.IsRequestedPreviewFeature(430)
|
||||
syn region javaStrTemplEmbExp contained matchgroup=javaStrTempl start="\\{" end="}" contains=TOP
|
||||
exec 'syn region javaStrTempl start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,@Spell'
|
||||
exec 'syn region javaStrTempl start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell'
|
||||
hi def link javaStrTempl Macro
|
||||
endif
|
||||
|
||||
syn match javaCharacter "'[^']*'" contains=javaSpecialChar,javaSpecialCharError
|
||||
syn match javaCharacter "'\\''" contains=javaSpecialChar
|
||||
syn match javaCharacter "'[^\\]'"
|
||||
@ -431,11 +450,16 @@ if exists("g:java_highlight_debug")
|
||||
syn match javaDebugSpecial contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
|
||||
syn region javaDebugString contained start=+"+ end=+"+ contains=javaDebugSpecial
|
||||
syn region javaDebugString contained start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaDebugSpecial,javaDebugTextBlockError
|
||||
" The highlight groups of java{StrTempl,Debug{,Paren,StrTempl}}\,
|
||||
" share one colour by default. Do not conflate unrelated parens.
|
||||
syn region javaDebugStrTemplEmbExp contained matchgroup=javaDebugStrTempl start="\\{" end="}" contains=javaComment,javaLineComment,javaDebug\%(Paren\)\@!.*
|
||||
exec 'syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaDebugStrTemplEmbExp,javaDebugSpecial'
|
||||
exec 'syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaDebugStrTemplEmbExp,javaDebugSpecial,javaDebugTextBlockError'
|
||||
|
||||
if s:ff.IsRequestedPreviewFeature(430)
|
||||
" The highlight groups of java{StrTempl,Debug{,Paren,StrTempl}}\,
|
||||
" share one colour by default. Do not conflate unrelated parens.
|
||||
syn region javaDebugStrTemplEmbExp contained matchgroup=javaDebugStrTempl start="\\{" end="}" contains=javaComment,javaLineComment,javaDebug\%(Paren\)\@!.*
|
||||
exec 'syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaDebugStrTemplEmbExp,javaDebugSpecial'
|
||||
exec 'syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaDebugStrTemplEmbExp,javaDebugSpecial,javaDebugTextBlockError'
|
||||
hi def link javaDebugStrTempl Macro
|
||||
endif
|
||||
|
||||
syn match javaDebugTextBlockError contained +"""\s*"""+
|
||||
syn match javaDebugCharacter contained "'[^\\]'"
|
||||
syn match javaDebugSpecialCharacter contained "'\\.'"
|
||||
@ -461,7 +485,6 @@ if exists("g:java_highlight_debug")
|
||||
|
||||
hi def link javaDebug Debug
|
||||
hi def link javaDebugString DebugString
|
||||
hi def link javaDebugStrTempl Macro
|
||||
hi def link javaDebugTextBlockError Error
|
||||
hi def link javaDebugType DebugType
|
||||
hi def link javaDebugBoolean DebugBoolean
|
||||
@ -570,7 +593,6 @@ hi def link javaSpecial Special
|
||||
hi def link javaSpecialError Error
|
||||
hi def link javaSpecialCharError Error
|
||||
hi def link javaString String
|
||||
hi def link javaStrTempl Macro
|
||||
hi def link javaCharacter Character
|
||||
hi def link javaSpecialChar SpecialChar
|
||||
hi def link javaNumber Number
|
||||
@ -624,15 +646,25 @@ if !has("vim9script")
|
||||
finish
|
||||
endif
|
||||
|
||||
def! s:JavaSyntaxFoldTextExpr(): string
|
||||
return getline(v:foldstart) !~ '/\*\+\s*$'
|
||||
? foldtext()
|
||||
: printf('+-%s%3d lines: ',
|
||||
v:folddashes,
|
||||
(v:foldend - v:foldstart + 1)) ..
|
||||
getline(v:foldstart + 1)
|
||||
enddef
|
||||
if exists("g:java_foldtext_show_first_or_second_line")
|
||||
def! s:LazyPrefix(prefix: string, dashes: string, count: number): string
|
||||
return empty(prefix)
|
||||
? printf('+-%s%3d lines: ', dashes, count)
|
||||
: prefix
|
||||
enddef
|
||||
|
||||
setlocal foldtext=s:JavaSyntaxFoldTextExpr()
|
||||
delfunction! g:JavaSyntaxFoldTextExpr
|
||||
def! s:JavaSyntaxFoldTextExpr(): string
|
||||
# Piggyback on NGETTEXT.
|
||||
const summary: string = foldtext()
|
||||
return getline(v:foldstart) !~ '/\*\+\s*$'
|
||||
? summary
|
||||
: LazyPrefix(matchstr(summary, '^+-\+\s*\d\+\s.\{-1,}:\s'),
|
||||
v:folddashes,
|
||||
(v:foldend - v:foldstart + 1)) ..
|
||||
getline(v:foldstart + 1)
|
||||
enddef
|
||||
|
||||
setlocal foldtext=s:JavaSyntaxFoldTextExpr()
|
||||
delfunction! g:JavaSyntaxFoldTextExpr
|
||||
endif
|
||||
" vim: sw=2 ts=8 noet sta
|
||||
|
@ -2,9 +2,10 @@
|
||||
" Language: sudoers(5) configuration files
|
||||
" Maintainer: Eisuke Kawashima ( e.kawaschima+vim AT gmail.com )
|
||||
" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
|
||||
" Latest Revision: 2021 Mar 15
|
||||
" Latest Revision: 2024 Sep 02
|
||||
" Recent Changes: Support for #include and #includedir.
|
||||
" Added many new options (Samuel D. Leslie)
|
||||
" Update allowed Tag_Spec Runas_Spec syntax items
|
||||
|
||||
if exists("b:current_syntax")
|
||||
finish
|
||||
@ -22,7 +23,7 @@ syn match sudoersUserSpec '^' nextgroup=@sudoersUserInSpec skipwhite
|
||||
|
||||
syn match sudoersSpecEquals contained '=' nextgroup=@sudoersCmndSpecList skipwhite
|
||||
|
||||
syn cluster sudoersCmndSpecList contains=sudoersUserRunasBegin,sudoersPASSWD,@sudoersCmndInSpec
|
||||
syn cluster sudoersCmndSpecList contains=sudoersUserRunasBegin,sudoersTagSpec,@sudoersCmndInSpec
|
||||
|
||||
syn keyword sudoersTodo contained TODO FIXME XXX NOTE
|
||||
|
||||
@ -92,10 +93,11 @@ syn cluster sudoersUserList contains=sudoersUserListComma,sudoersUserLis
|
||||
syn match sudoersUserSpecComma contained ',' nextgroup=@sudoersUserInSpec skipwhite skipnl
|
||||
syn cluster sudoersUserSpec contains=sudoersUserSpecComma,@sudoersHostInSpec
|
||||
|
||||
syn match sudoersUserRunasBegin contained '(' nextgroup=@sudoersUserInRunas skipwhite skipnl
|
||||
syn match sudoersUserRunasBegin contained '(' nextgroup=@sudoersUserInRunas,sudoersUserRunasColon skipwhite skipnl
|
||||
syn match sudoersUserRunasComma contained ',' nextgroup=@sudoersUserInRunas skipwhite skipnl
|
||||
syn match sudoersUserRunasEnd contained ')' nextgroup=sudoersPASSWD,@sudoersCmndInSpec skipwhite skipnl
|
||||
syn cluster sudoersUserRunas contains=sudoersUserRunasComma,@sudoersUserInRunas,sudoersUserRunasEnd
|
||||
syn match sudoersUserRunasColon contained ':' nextgroup=@sudoersUserInRunas skipwhite skipnl
|
||||
syn match sudoersUserRunasEnd contained ')' nextgroup=sudoersTagSpec,@sudoersCmndInSpec skipwhite skipnl
|
||||
syn cluster sudoersUserRunas contains=sudoersUserRunasComma,sudoersUserRunasColon,@sudoersUserInRunas,sudoersUserRunasEnd
|
||||
|
||||
|
||||
syn match sudoersHostAliasEquals contained '=' nextgroup=@sudoersHostInList skipwhite skipnl
|
||||
@ -291,7 +293,7 @@ syn region sudoersStringValue contained start=+"+ skip=+\\"+ end=+"+ nextgroup
|
||||
syn match sudoersListValue contained '[^[:space:],:=\\]*\%(\\[[:space:],:=\\][^[:space:],:=\\]*\)*' nextgroup=sudoersParameterListComma skipwhite skipnl
|
||||
syn region sudoersListValue contained start=+"+ skip=+\\"+ end=+"+ nextgroup=sudoersParameterListComma skipwhite skipnl
|
||||
|
||||
syn match sudoersPASSWD contained '\%(NO\)\=PASSWD:' nextgroup=@sudoersCmndInSpec skipwhite
|
||||
syn match sudoersTagSpec contained '\%(NO\)\=\%(EXEC\|FOLLOW\|LOG_\%(INPUT\|OUTPUT\)\|MAIL\|INTERCEPT\|PASSWD\|SETENV\):' nextgroup=sudoersTagSpec,@sudoersCmndInSpec skipwhite
|
||||
|
||||
hi def link sudoersSpecEquals Operator
|
||||
hi def link sudoersTodo Todo
|
||||
@ -345,6 +347,7 @@ hi def link sudoersUserListColon Delimiter
|
||||
hi def link sudoersUserSpecComma Delimiter
|
||||
hi def link sudoersUserRunasBegin Delimiter
|
||||
hi def link sudoersUserRunasComma Delimiter
|
||||
hi def link sudoersUserRunasColon Delimiter
|
||||
hi def link sudoersUserRunasEnd Delimiter
|
||||
hi def link sudoersHostAliasEquals Operator
|
||||
hi def link sudoersHostListComma Delimiter
|
||||
@ -381,7 +384,7 @@ hi def link sudoersListParameterEquals Operator
|
||||
hi def link sudoersIntegerValue Number
|
||||
hi def link sudoersStringValue String
|
||||
hi def link sudoersListValue String
|
||||
hi def link sudoersPASSWD Special
|
||||
hi def link sudoersTagSpec Special
|
||||
hi def link sudoersInclude Statement
|
||||
|
||||
let b:current_syntax = "sudoers"
|
||||
|
17
runtime/syntax/terraform.vim
Normal file
17
runtime/syntax/terraform.vim
Normal file
@ -0,0 +1,17 @@
|
||||
" Vim syntax file
|
||||
" Language: Terraform
|
||||
" Maintainer: Gregory Anders
|
||||
" Upstream: https://github.com/hashivim/vim-terraform
|
||||
" Last Change: 2024-09-03
|
||||
|
||||
if exists('b:current_syntax')
|
||||
finish
|
||||
endif
|
||||
|
||||
runtime! syntax/hcl.vim
|
||||
|
||||
syn keyword terraType string bool number object tuple list map set any
|
||||
|
||||
hi def link terraType Type
|
||||
|
||||
let b:current_syntax = 'terraform'
|
@ -1,5 +1,5 @@
|
||||
" Language: tmux(1) configuration file
|
||||
" Version: 3.4 (git-171004df)
|
||||
" Version: 3.4 (git-3d8ead8a)
|
||||
" URL: https://github.com/ericpruitt/tmux.vim/
|
||||
" Maintainer: Eric Pruitt <eric.pruitt@gmail.com>
|
||||
" License: 2-Clause BSD (http://opensource.org/licenses/BSD-2-Clause)
|
||||
@ -37,7 +37,7 @@ syn match tmuxInvalidVariableExpansion /\${[^}]*$/ display
|
||||
syn match tmuxInvalidVariableExpansion /\${[^A-Za-z_][^}]*}/ display
|
||||
syn match tmuxInvalidVariableExpansion /\$[^A-Za-z_{ \t]/ display
|
||||
" Contains invalid character.
|
||||
syn match tmuxInvalidVariableExpansion /\${[^}]*[^A-Za-z0-9_][^}]*}/ display
|
||||
syn match tmuxInvalidVariableExpansion /\${[^}]*[^A-Za-z0-9_}][^}]*}/ display
|
||||
|
||||
syn region tmuxComment start=/#/ skip=/\\\@<!\\$/ end=/$/ contains=tmuxTodo,@Spell
|
||||
|
||||
|
@ -177,10 +177,11 @@ syn match vimNumber '\%(^\|\A\)\zs#\x\{6}' skipwhite nextgroup=vimGlobal,vimSub
|
||||
syn case match
|
||||
|
||||
" All vimCommands are contained by vimIsCommand. {{{2
|
||||
syn cluster vimCmdList contains=vimAbb,vimAddress,vimAutoCmd,vimAugroup,vimBehave,vimCall,vimCatch,vimConst,vimDef,@vimEcho,vimEnddef,vimEndfunction,vimExecute,vimIsCommand,vimExtCmd,vimFor,vimFunction,vimGlobal,vimHighlight,vimLet,vimMap,vimMark,vimMatch,vimNotFunc,vimNorm,vimSet,vimSleep,vimSyntax,vimThrow,vimUnlet,vimUnmap,vimUserCmd,vimMenu,vimMenutranslate,@vim9CmdList
|
||||
syn cluster vimCmdList contains=vimAbb,vimAddress,vimAutoCmd,vimAugroup,vimBehave,vimCall,vimCatch,vimConst,vimDef,vimDelcommand,@vimEcho,vimEnddef,vimEndfunction,vimExecute,vimIsCommand,vimExtCmd,vimFor,vimFunction,vimGlobal,vimHighlight,vimLet,vimLoadkeymap,vimMap,vimMark,vimMatch,vimNotFunc,vimNorm,vimSet,vimSleep,vimSyntax,vimThrow,vimUnlet,vimUnmap,vimUserCmd,vimMenu,vimMenutranslate,@vim9CmdList
|
||||
syn cluster vim9CmdList contains=vim9Const,vim9Final,vim9For,vim9Var
|
||||
syn match vimCmdSep "[:|]\+" skipwhite nextgroup=@vimCmdList,vimSubst1
|
||||
syn match vimIsCommand "\<\%(\h\w*\|[23]mat\%[ch]\)\>" contains=vimCommand
|
||||
syn match vimBang contained "!"
|
||||
syn match vimVar contained "\<\h[a-zA-Z0-9#_]*\>"
|
||||
syn match vimVar "\<[bwglstav]:\h[a-zA-Z0-9#_]*\>"
|
||||
syn match vimVar "\s\zs&\%([lg]:\)\=\a\+\>"
|
||||
@ -338,7 +339,7 @@ else
|
||||
endif
|
||||
syn cluster vimKeymapLineComment contains=vim9\=KeymapLineComment
|
||||
|
||||
syn region vimKeymap matchgroup=vimCommand start="\<loadk\%[eymap]\>" end="\%$" contains=vimKeymapStart
|
||||
syn region vimLoadkeymap matchgroup=vimCommand start="\<loadk\%[eymap]\>" end="\%$" contains=vimKeymapStart
|
||||
|
||||
" Special Filenames, Modifiers, Extension Removal: {{{2
|
||||
" ===============================================
|
||||
@ -353,33 +354,46 @@ syn match vimSpecFileMod "\(:[phtre]\)\+" contained
|
||||
" User-Specified Commands: {{{2
|
||||
" =======================
|
||||
syn cluster vimUserCmdList contains=@vimCmdList,vimCmplxRepeat,@vimComment,vimCtrlChar,vimEscapeBrace,vimFunc,vimNotation,vimNumber,vimOper,vimRegister,vimSpecFile,vimString,vimSubst,vimSubstRep,vimSubstRange
|
||||
syn keyword vimUserCommand contained com[mand]
|
||||
syn match vimUserCmdName contained "\<\u\w*\>" nextgroup=vimUserCmdBlock skipwhite
|
||||
syn match vimUserCmd "\<com\%[mand]!\=\>.*$" contains=vimUserAttrb,vimUserAttrbError,vimUserCommand,@vimUserCmdList,vimComFilter,vimCmdBlock,vimUserCmdName
|
||||
syn match vimUserAttrbError contained "-\a\+\ze\s"
|
||||
syn match vimUserAttrb contained "-nargs=[01*?+]" contains=vimUserAttrbKey,vimOper
|
||||
syn match vimUserAttrb contained "-complete=" contains=vimUserAttrbKey,vimOper nextgroup=vimUserAttrbCmplt,vimUserCmdError
|
||||
syn match vimUserAttrb contained "-range\(=%\|=\d\+\)\=" contains=vimNumber,vimOper,vimUserAttrbKey
|
||||
syn match vimUserAttrb contained "-count\(=\d\+\)\=" contains=vimNumber,vimOper,vimUserAttrbKey
|
||||
syn match vimUserAttrb contained "-bang\>" contains=vimOper,vimUserAttrbKey
|
||||
syn match vimUserAttrb contained "-bar\>" contains=vimOper,vimUserAttrbKey
|
||||
syn match vimUserAttrb contained "-buffer\>" contains=vimOper,vimUserAttrbKey
|
||||
syn match vimUserAttrb contained "-register\>" contains=vimOper,vimUserAttrbKey
|
||||
syn keyword vimUserCmdKey contained com[mand]
|
||||
syn match vimUserCmdName contained "\<\u[[:alnum:]]*\>" skipwhite nextgroup=vimUserCmdBlock
|
||||
syn match vimUserCmd "\<com\%[mand]\>!\=.*$" contains=vimUserCmdKey,vimBang,vimUserCmdAttr,vimUserCmdAttrError,vimUserCmdName,@vimUserCmdList,vimComFilter
|
||||
syn match vimUserCmdAttrError contained "-\a\+\ze\%(\s\|=\)"
|
||||
syn match vimUserCmdAttr contained "-addr=" contains=vimUserCmdAttrKey nextgroup=vimUserCmdAttrAddr
|
||||
syn match vimUserCmdAttr contained "-bang\>" contains=vimUserCmdAttrKey
|
||||
syn match vimUserCmdAttr contained "-bar\>" contains=vimUserCmdAttrKey
|
||||
syn match vimUserCmdAttr contained "-buffer\>" contains=vimUserCmdAttrKey
|
||||
syn match vimUserCmdAttr contained "-complete=" contains=vimUserCmdAttrKey nextgroup=vimUserCmdAttrCmplt,vimUserCmdError
|
||||
syn match vimUserCmdAttr contained "-count\>" contains=vimUserCmdAttrKey
|
||||
syn match vimUserCmdAttr contained "-count=" contains=vimUserCmdAttrKey nextgroup=vimNumber
|
||||
syn match vimUserCmdAttr contained "-keepscript\>" contains=vimUserCmdAttrKey
|
||||
syn match vimUserCmdAttr contained "-nargs=" contains=vimUserCmdAttrKey nextgroup=vimUserCmdAttrNargs
|
||||
syn match vimUserCmdAttr contained "-range\>" contains=vimUserCmdAttrKey
|
||||
syn match vimUserCmdAttr contained "-range=" contains=vimUserCmdAttrKey nextgroup=vimNumber,vimUserCmdAttrRange
|
||||
syn match vimUserCmdAttr contained "-register\>" contains=vimUserCmdAttrKey
|
||||
|
||||
syn match vimUserCmdAttrNargs contained "[01*?+]"
|
||||
syn match vimUserCmdAttrRange contained "%"
|
||||
|
||||
if !exists("g:vimsyn_noerror") && !exists("g:vimsyn_nousercmderror")
|
||||
syn match vimUserCmdError contained "\S\+\>"
|
||||
endif
|
||||
syn case ignore
|
||||
syn keyword vimUserAttrbKey contained bar ban[g] cou[nt] ra[nge] com[plete] n[args] re[gister]
|
||||
" GEN_SYN_VIM: vimUserAttrbCmplt, START_STR='syn keyword vimUserAttrbCmplt contained', END_STR=''
|
||||
syn keyword vimUserAttrbCmplt contained arglist augroup behave buffer color command compiler cscope diff_buffer dir environment event expression file file_in_path filetype function help highlight history keymap locale mapclear mapping menu messages syntax syntime option packadd runtime shellcmd sign tag tag_listfiles user var breakpoint scriptnames dir_in_path
|
||||
syn keyword vimUserAttrbCmplt contained custom customlist nextgroup=vimUserAttrbCmpltFunc,vimUserCmdError
|
||||
syn match vimUserAttrbCmpltFunc contained ",\%([sS]:\|<[sS][iI][dD]>\)\=\%(\h\w*\%([.#]\h\w*\)\+\|\h\w*\)"hs=s+1 nextgroup=vimUserCmdError
|
||||
|
||||
syn case ignore
|
||||
syn keyword vimUserCmdAttrKey contained a[ddr] ban[g] bar bu[ffer] com[plete] cou[nt] k[eepscript] n[args] ra[nge] re[gister]
|
||||
" GEN_SYN_VIM: vimUserCmdAttrCmplt, START_STR='syn keyword vimUserCmdAttrCmplt contained', END_STR=''
|
||||
syn keyword vimUserCmdAttrCmplt contained arglist augroup behave breakpoint buffer color command compiler cscope diff_buffer dir dir_in_path environment event expression file file_in_path filetype function help highlight history keymap locale mapclear mapping menu messages option packadd runtime scriptnames shellcmd sign syntax syntime tag tag_listfiles user var
|
||||
syn keyword vimUserCmdAttrCmplt contained custom customlist nextgroup=vimUserCmdAttrCmpltFunc,vimUserCmdError
|
||||
syn match vimUserCmdAttrCmpltFunc contained ",\%([sS]:\|<[sS][iI][dD]>\)\=\%(\h\w*\%([.#]\h\w*\)\+\|\h\w*\)"hs=s+1 nextgroup=vimUserCmdError
|
||||
" GEN_SYN_VIM: vimUserCmdAttrAddr, START_STR='syn keyword vimUserCmdAttrAddr contained', END_STR=''
|
||||
syn keyword vimUserCmdAttrAddr contained arguments arg buffers buf lines line loaded_buffers load other quickfix qf tabs tab windows win
|
||||
syn match vimUserCmdAttrAddr contained "?"
|
||||
syn case match
|
||||
syn match vimUserAttrbCmplt contained "custom,\u\w*"
|
||||
|
||||
syn region vimUserCmdBlock contained matchgroup=vimSep start="{" end="}" contains=@vimDefBodyList
|
||||
|
||||
syn match vimDelcommand "\<delc\%[ommand]\>" skipwhite nextgroup=vimDelcommandAttr
|
||||
syn match vimDelcommandAttr contained "-buffer\>"
|
||||
|
||||
" Lower Priority Comments: after some vim commands... {{{2
|
||||
" =======================
|
||||
if get(g:, "vimsyn_comment_strings", 1)
|
||||
@ -470,8 +484,8 @@ syn match vimString "[^(,]'[^']\{-}\zs'"
|
||||
|
||||
" Marks, Registers, Addresses, Filters: {{{2
|
||||
syn match vimMark "'[a-zA-Z0-9]\ze[-+,!]" nextgroup=vimFilter,vimMarkNumber,vimSubst1
|
||||
syn match vimMark "'[<>]\ze[-+,!]" nextgroup=vimFilter,vimMarkNumber,vimSubst1
|
||||
syn match vimMark ",\zs'[<>]\ze" nextgroup=vimFilter,vimMarkNumber,vimSubst1
|
||||
syn match vimMark "'[[\]{}()<>]\ze[-+,!]" nextgroup=vimFilter,vimMarkNumber,vimSubst1
|
||||
syn match vimMark ",\zs'[[\]{}()<>]\ze" nextgroup=vimFilter,vimMarkNumber,vimSubst1
|
||||
syn match vimMark "[!,:]\zs'[a-zA-Z0-9]" nextgroup=vimFilter,vimMarkNumber,vimSubst1
|
||||
syn match vimMark "\<norm\%[al]\s\zs'[a-zA-Z0-9]" nextgroup=vimFilter,vimMarkNumber,vimSubst1
|
||||
syn match vimMarkNumber "[-+]\d\+" contained contains=vimOper nextgroup=vimSubst1
|
||||
@ -518,13 +532,10 @@ VimL syn keyword vimUnlet unl[et] skipwhite nextgroup=vimUnletBang,vimUnletVars
|
||||
syn match vimUnletBang contained "!" skipwhite nextgroup=vimUnletVars
|
||||
syn region vimUnletVars contained start="$\I\|\h" skip="\n\s*\\" end="$" end="|" contains=vimVar,vimEnvvar,vimContinue,vimString,vimNumber
|
||||
|
||||
" Note: This incorrectly matches end markers with leading whitespace even if
|
||||
" "trim" was not specified. Matching :let indent for "trim" indented
|
||||
" end markers would require a contained :let that cannot be restricted
|
||||
" to the start pattern. A common internal testing use of heredocs is to
|
||||
" specify code blocks where :let commonly appears in the heredoc text.
|
||||
VimFoldh syn region vimLetHereDoc matchgroup=vimLetHereDocStart start='=<<\s*\%(trim\s\+\)\=\z(\L\S*\)' matchgroup=vimLetHereDocStop end='^\s*\z1$' extend
|
||||
VimFoldh syn region vimLetHereDoc matchgroup=vimLetHereDocStart start='=<<\s*\%(\%(trim\s\+\)\=eval\s\+\|eval\s\+\%(trim\s\+\)\=\)\z(\L\S*\)' matchgroup=vimLetHereDocStop end='^\s*\z1$' contains=@vimStringInterpolation extend
|
||||
VimFoldh syn region vimLetHereDoc matchgroup=vimLetHereDocStart start='\%(^\z(\s*\)\S.*\)\@<==<<\s*trim\%(\s\+\)\@>\z(\L\S*\)' matchgroup=vimLetHereDocStop end='^\z1\=\z2$' extend
|
||||
VimFoldh syn region vimLetHereDoc matchgroup=vimLetHereDocStart start='=<<\%(\s*\)\@>\z(\L\S*\)' matchgroup=vimLetHereDocStop end='^\z1$' extend
|
||||
VimFoldh syn region vimLetHereDoc matchgroup=vimLetHereDocStart start='\%(^\z(\s*\)\S.*\)\@<==<<\s*\%(trim\s\+eval\|eval\s\+trim\)\%(\s\+\)\@>\z(\L\S*\)' matchgroup=vimLetHereDocStop end='^\z1\=\z2$' contains=@vimStringInterpolation extend
|
||||
VimFoldh syn region vimLetHereDoc matchgroup=vimLetHereDocStart start='=<<\s*eval\%(\s\+\)\@>\z(\L\S*\)' matchgroup=vimLetHereDocStop end='^\z1$' contains=@vimStringInterpolation extend
|
||||
|
||||
Vim9 syn keyword vim9Const const skipwhite nextgroup=vim9Variable,vim9VariableList
|
||||
Vim9 syn keyword vim9Final final skipwhite nextgroup=vim9Variable,vim9VariableList
|
||||
@ -931,12 +942,16 @@ if g:vimsyn_embed =~# 'l' && filereadable(s:luapath)
|
||||
unlet! b:current_syntax
|
||||
syn cluster vimFuncBodyList add=vimLuaRegion
|
||||
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
|
||||
VimFoldl syn region vimLuaRegion matchgroup=vimScriptDelim start=+^\z(\s*\)lua\s*<<\s*trim\s\+\z(\S\+\)+ end=+^\z1\z2$+ contains=@vimLuaScript
|
||||
VimFoldl syn region vimLuaRegion matchgroup=vimScriptDelim start=+lua\s*<<\s*\z(\S*\)+ end=+^\z1$+ contains=@vimLuaScript
|
||||
VimFoldl syn region vimLuaRegion matchgroup=vimScriptDelim start=+^\z(\s*\)lua\s*<<\s*trim\s*$+ 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=+\.$+
|
||||
syn region vimEmbedError start=+^\z(\s*\)lua\s*<<\s*trim\s\+\z(\S\+\)+ end=+^\z1\z2$+
|
||||
syn region vimEmbedError start=+lua\s*<<\s*\z(\S*\)+ end=+^\z1$+
|
||||
syn region vimEmbedError start=+^\z(\s*\)lua\s*<<\s*trim\s\*$+ end=+^\z1\.$+
|
||||
syn region vimEmbedError start=+lua\s*<<\s*$+ end=+^\.$+
|
||||
endif
|
||||
unlet s:luapath
|
||||
|
||||
@ -956,12 +971,16 @@ if g:vimsyn_embed =~# 'p' && filereadable(s:perlpath)
|
||||
let s:foldmethod = &l:foldmethod
|
||||
exe "syn include @vimPerlScript ".s:perlpath
|
||||
let &l:foldmethod = s:foldmethod
|
||||
VimFoldp syn region vimPerlRegion matchgroup=vimScriptDelim start=+pe\%[rl]\s*<<\s*\z(\S*\)\ze\(\s*["#].*\)\=$+ end=+^\z1\ze\(\s*[#"].*\)\=$+ contains=@vimPerlScript
|
||||
VimFoldp syn region vimPerlRegion matchgroup=vimScriptDelim start=+pe\%[rl]\s*<<\s*$+ end=+\.$+ contains=@vimPerlScript
|
||||
VimFoldp syn region vimPerlRegion matchgroup=vimScriptDelim start=+^\z(\s*\)pe\%[rl]\s*<<\s*trim\s\+\z(\S\+\)+ end=+^\z1\z2$+ contains=@vimPerlScript
|
||||
VimFoldp syn region vimPerlRegion matchgroup=vimScriptDelim start=+pe\%[rl]\s*<<\s*\z(\S*\)+ end=+^\z1$+ contains=@vimPerlScript
|
||||
VimFoldp syn region vimPerlRegion matchgroup=vimScriptDelim start=+^\z(\s*\)pe\%[rl]\s*<<\s*trim\s*$+ 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=+\.$+
|
||||
syn region vimEmbedError start=+^\z(\s*\)pe\%[rl]\s*<<\s*trim\s\+\z(\S\+\)+ end=+^\z1\z2$+
|
||||
syn region vimEmbedError start=+pe\%[rl]\s*<<\s*\z(\S*\)+ end=+^\z1$+
|
||||
syn region vimEmbedError start=+^\z(\s*\)pe\%[rl]\s*<<\s*trim\s\*$+ end=+^\z1\.$+
|
||||
syn region vimEmbedError start=+pe\%[rl]\s*<<\s*$+ end=+^\.$+
|
||||
endif
|
||||
unlet s:perlpath
|
||||
|
||||
@ -981,12 +1000,16 @@ if g:vimsyn_embed =~# 'r' && filereadable(s:rubypath)
|
||||
let s:foldmethod = &l:foldmethod
|
||||
exe "syn include @vimRubyScript ".s:rubypath
|
||||
let &l:foldmethod = s:foldmethod
|
||||
VimFoldr syn region vimRubyRegion matchgroup=vimScriptDelim start=+rub[y]\s*<<\s*\z(\S*\)\ze\(\s*#.*\)\=$+ end=+^\z1\ze\(\s*".*\)\=$+ contains=@vimRubyScript
|
||||
syn region vimRubyRegion matchgroup=vimScriptDelim start=+rub[y]\s*<<\s*$+ end=+\.$+ contains=@vimRubyScript
|
||||
VimFoldr syn region vimRubyRegion matchgroup=vimScriptDelim start=+^\z(\s*\)rub\%[y]\s*<<\s*trim\s\+\z(\S\+\)+ end=+^\z1\z2$+ contains=@vimRubyScript
|
||||
VimFoldr syn region vimRubyRegion matchgroup=vimScriptDelim start=+rub\%[y]\s*<<\s*\z(\S*\)+ end=+^\z1$+ contains=@vimRubyScript
|
||||
VimFoldr syn region vimRubyRegion matchgroup=vimScriptDelim start=+^\z(\s*\)rub\%[y]\s*<<\s*trim\s*$+ end=+^\z1\.$+ contains=@vimRubyScript
|
||||
VimFoldr 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=+\.$+
|
||||
syn region vimEmbedError start=+^\z(\s*\)rub\%[y]\s*<<\s*trim\s\+\z(\S\+\)+ end=+^\z1\z2$+
|
||||
syn region vimEmbedError start=+rub\%[y]\s*<<\s*\z(\S.*\)+ end=+^\z1$+
|
||||
syn region vimEmbedError start=+^\z(\s*\)rub\%[y]\s*<<\s*trim\s\*$+ end=+^\z1\.$+
|
||||
syn region vimEmbedError start=+rub\%[y]\s*<<\s*$+ end=+^\.$+
|
||||
endif
|
||||
unlet s:rubypath
|
||||
|
||||
@ -1004,14 +1027,18 @@ if g:vimsyn_embed =~# 'P' && filereadable(s:pythonpath)
|
||||
unlet! b:current_syntax
|
||||
syn cluster vimFuncBodyList add=vimPythonRegion
|
||||
exe "syn include @vimPythonScript ".s:pythonpath
|
||||
VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+py\%[thon][3x]\=\s*<<\s*\%(trim\s*\)\=\z(\S*\)\ze\(\s*#.*\)\=$+ end=+^\z1\ze\(\s*".*\)\=$+ contains=@vimPythonScript
|
||||
VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+py\%[thon][3x]\=\s*<<\s*\%(trim\s*\)\=$+ end=+\.$+ contains=@vimPythonScript
|
||||
VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+Py\%[thon]2or3\s*<<\s*\%(trim\s*\)\=\z(\S*\)\ze\(\s*#.*\)\=$+ end=+^\z1\ze\(\s*".*\)\=$+ contains=@vimPythonScript
|
||||
VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+Py\%[thon]2or3\=\s*<<\s*\%(trim\s*\)\=$+ end=+\.$+ contains=@vimPythonScript
|
||||
VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+^\z(\s*\)py\%[thon][3x]\=\s*<<\s*trim\s\+\z(\S\+\)+ end=+^\z1\z2$+ contains=@vimPythonScript
|
||||
VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+py\%[thon][3x]\=\s*<<\s*\z(\S\+\)+ end=+^\z1$+ contains=@vimPythonScript
|
||||
VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+^\z(\s*\)py\%[thon][3x]\=\s*<<\s*trim\s*$+ end=+^\z1\.$+ contains=@vimPythonScript
|
||||
VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+py\%[thon][3x]\=\s*<<\s*$+ end=+^\.$+ contains=@vimPythonScript
|
||||
VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+Py\%[thon]2or3\s*<<\s*\%(trim\s*\)\=\z(\S\+\)+ end=+^\z1$+ contains=@vimPythonScript
|
||||
VimFoldP syn region vimPythonRegion matchgroup=vimScriptDelim start=+Py\%[thon]2or3\s*<<\s*\%(trim\s*\)\=$+ end=+^\.$+ contains=@vimPythonScript
|
||||
syn cluster vimFuncBodyList add=vimPythonRegion
|
||||
else
|
||||
syn region vimEmbedError start=+py\%[thon]3\=\s*<<\s*\z(.*\)$+ end=+^\z1$+
|
||||
syn region vimEmbedError start=+py\%[thon]3\=\s*<<\s*$+ end=+\.$+
|
||||
syn region vimEmbedError start=+^\z(\s*\)py\%[thon][3x]\=\s*<<\s*trim\s\+\z(\S\+\)+ end=+^\z1\z2$+
|
||||
syn region vimEmbedError start=+py\%[thon][3x]\=\s*<<\s*\z(\S\+\)+ end=+^\z1$+
|
||||
syn region vimEmbedError start=+^\z(\s*\)py\%[thon][3x]\=\s*<<\s*trim\s*$+ end=+^\z1\.$+
|
||||
syn region vimEmbedError start=+py\%[thon][3x]\=\s*<<\s*$+ end=+^\.$+
|
||||
endif
|
||||
unlet s:pythonpath
|
||||
|
||||
@ -1036,17 +1063,23 @@ if s:trytcl
|
||||
unlet! b:current_syntax
|
||||
syn cluster vimFuncBodyList add=vimTclRegion
|
||||
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
|
||||
VimFoldt syn region vimTclRegion matchgroup=vimScriptDelim start=+^\z(\s*\)tc\%[l]\s*<<\s*trim\s\+\z(\S\+\)+ end=+^\z1\z2$+ contains=@vimTclScript
|
||||
VimFoldt syn region vimTclRegion matchgroup=vimScriptDelim start=+tc\%[l]\=\s*<<\s*\z(\S*\)+ end=+^\z1$+ contains=@vimTclScript
|
||||
VimFoldt syn region vimTclRegion matchgroup=vimScriptDelim start=+^\z(\s*\)tc\%[l]\s*<<\s*trim\s*$+ 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=+\.$+
|
||||
syn region vimEmbedError start=+^\z(\s*\)tc\%[l]\s*<<\s*trim\s\+\z(\S\+\)+ end=+^\z1\z2$+
|
||||
syn region vimEmbedError start=+tc\%[l]\=\s*<<\s*\z(\S*\)+ end=+^\z1$+
|
||||
syn region vimEmbedError start=+^\z(\s*\)tc\%[l]\s*<<\s*trim\s\*$+ 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=+\.$+
|
||||
syn region vimEmbedError start=+^\z(\s*\)tc\%[l]\s*<<\s*trim\s\+\z(\S\+\)+ end=+^\z1\z2$+
|
||||
syn region vimEmbedError start=+tc\%[l]\=\s*<<\s*\z(\S*\)+ end=+^\z1$+
|
||||
syn region vimEmbedError start=+^\z(\s*\)tc\%[l]\s*<<\s*trim\s\*$+ end=+^\z1\.$+
|
||||
syn region vimEmbedError start=+tc\%[l]\=\s*<<\s*$+ end=+^\.$+
|
||||
endif
|
||||
unlet s:trytcl
|
||||
|
||||
@ -1067,12 +1100,16 @@ if g:vimsyn_embed =~# 'm' && filereadable(s:mzschemepath)
|
||||
exe "syn include @vimMzSchemeScript ".s:mzschemepath
|
||||
let &isk= s:iskKeep
|
||||
unlet s: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
|
||||
VimFoldm syn region vimMzSchemeRegion matchgroup=vimScriptDelim start=+^\z(\s*\)mz\%[scheme]\s*<<\s*trim\s\+\z(\S\+\)+ end=+^\z1\z2$+ contains=@vimMzSchemeScript
|
||||
VimFoldm syn region vimMzSchemeRegion matchgroup=vimScriptDelim start=+mz\%[scheme]\s*<<\s*\z(\S*\)+ end=+^\z1$+ contains=@vimMzSchemeScript
|
||||
VimFoldm syn region vimMzSchemeRegion matchgroup=vimScriptDelim start=+^\z(\s*\)mz\%[scheme]\s*<<\s*trim\s*$+ 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=+\.$+
|
||||
syn region vimEmbedError start=+^\z(\s*\)mz\%[scheme]\s*<<\s*trim\s\+\z(\S\+\)+ end=+^\z1\z2$+
|
||||
syn region vimEmbedError start=+mz\%[scheme]\s*<<\s*\z(\S*\)+ end=+^\z1$+
|
||||
syn region vimEmbedError start=+^\z(\s*\)mz\%[scheme]\s*<<\s*trim\s\*$+ end=+^\z1\.$+
|
||||
syn region vimEmbedError start=+mz\%[scheme]\s*<<\s*$+ end=+^\.$+
|
||||
endif
|
||||
unlet s:mzschemepath
|
||||
|
||||
@ -1139,6 +1176,8 @@ if !exists("skip_vim_syntax_inits")
|
||||
hi def link vimDefComment vim9Comment
|
||||
hi def link vimDefKey vimCommand
|
||||
hi def link vimDefParam vimVar
|
||||
hi def link vimDelcommand vimCommand
|
||||
hi def link vimDelcommandAttr vimUserCmdAttr
|
||||
hi def link vimEcho vimCommand
|
||||
hi def link vimEchohlNone vimGroup
|
||||
hi def link vimEchohl vimCommand
|
||||
@ -1296,13 +1335,15 @@ if !exists("skip_vim_syntax_inits")
|
||||
hi def link vimUnlet vimCommand
|
||||
hi def link vimUnletBang vimBang
|
||||
hi def link vimUnmap vimMap
|
||||
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 vimUserCmdAttrAddr vimSpecial
|
||||
hi def link vimUserCmdAttrCmplt vimSpecial
|
||||
hi def link vimUserCmdAttrNargs vimSpecial
|
||||
hi def link vimUserCmdAttrRange vimSpecial
|
||||
hi def link vimUserCmdAttrKey vimUserCmdAttr
|
||||
hi def link vimUserCmdAttr Special
|
||||
hi def link vimUserCmdAttrError Error
|
||||
hi def link vimUserCmdError Error
|
||||
hi def link vimUserCommand vimCommand
|
||||
hi def link vimUserCmdKey vimCommand
|
||||
hi def link vimUserFunc Normal
|
||||
hi def link vimVar Identifier
|
||||
hi def link vimWarn WarningMsg
|
||||
|
@ -20,7 +20,7 @@ local DEP_API_METADATA = 'build/funcs_metadata.mpack'
|
||||
|
||||
local LUA_API_RETURN_OVERRIDES = {
|
||||
nvim_buf_get_command = 'table<string,vim.api.keyset.command_info>',
|
||||
nvim_buf_get_extmark_by_id = 'vim.api.keyset.get_extmark_item',
|
||||
nvim_buf_get_extmark_by_id = 'vim.api.keyset.get_extmark_item_by_id',
|
||||
nvim_buf_get_extmarks = 'vim.api.keyset.get_extmark_item[]',
|
||||
nvim_buf_get_keymap = 'vim.api.keyset.keymap[]',
|
||||
nvim_get_autocmds = 'vim.api.keyset.get_autocmds.ret[]',
|
||||
|
@ -373,8 +373,8 @@ local config = {
|
||||
section_fmt = function(_name)
|
||||
return 'Checkhealth'
|
||||
end,
|
||||
helptag_fmt = function(name)
|
||||
return name:lower()
|
||||
helptag_fmt = function()
|
||||
return 'vim.health* *health' -- HACK
|
||||
end,
|
||||
},
|
||||
}
|
||||
|
@ -31,7 +31,7 @@ target_link_libraries(main_lib INTERFACE ${LUV_LIBRARY})
|
||||
find_package(Iconv REQUIRED)
|
||||
find_package(Libuv 1.28.0 REQUIRED)
|
||||
find_package(Lpeg REQUIRED)
|
||||
find_package(Treesitter 0.22.6 REQUIRED)
|
||||
find_package(Treesitter 0.23.0 REQUIRED)
|
||||
find_package(Unibilium 2.0 REQUIRED)
|
||||
find_package(UTF8proc REQUIRED)
|
||||
|
||||
@ -48,7 +48,11 @@ if(ENABLE_LIBINTL)
|
||||
target_link_libraries(main_lib INTERFACE libintl)
|
||||
endif()
|
||||
|
||||
target_compile_definitions(main_lib INTERFACE HAVE_UNIBILIUM)
|
||||
if(ENABLE_WASMTIME)
|
||||
find_package(Wasmtime 24.0.0 EXACT REQUIRED)
|
||||
target_link_libraries(main_lib INTERFACE wasmtime)
|
||||
target_compile_definitions(nvim_bin PRIVATE HAVE_WASMTIME)
|
||||
endif()
|
||||
|
||||
# The unit test lib requires LuaJIT; it will be skipped if LuaJIT is missing.
|
||||
option(PREFER_LUA "Prefer Lua over LuaJIT in the nvim executable." OFF)
|
||||
@ -147,7 +151,7 @@ if(UNIX)
|
||||
endif()
|
||||
|
||||
if(CMAKE_SYSTEM_NAME MATCHES "Windows")
|
||||
target_compile_definitions(main_lib INTERFACE _WIN32_WINNT=0x0602 MSWIN)
|
||||
target_compile_definitions(main_lib INTERFACE _WIN32_WINNT=0x0602 MSWIN WIN32_LEAN_AND_MEAN)
|
||||
target_link_libraries(main_lib INTERFACE netapi32)
|
||||
elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin")
|
||||
target_link_libraries(nvim_bin PRIVATE "-framework CoreServices")
|
||||
@ -295,7 +299,6 @@ set(GENERATOR_DIR ${CMAKE_CURRENT_LIST_DIR}/generators)
|
||||
set(GEN_EVAL_TOUCH ${TOUCHES_DIR}/gen_doc_eval)
|
||||
set(LUAJIT_RUNTIME_DIR ${DEPS_PREFIX}/share/luajit-2.1/jit)
|
||||
set(NVIM_RUNTIME_DIR ${PROJECT_SOURCE_DIR}/runtime)
|
||||
set(UNICODE_DIR ${PROJECT_SOURCE_DIR}/src/unicode)
|
||||
|
||||
# GENERATOR_DIR
|
||||
set(API_DISPATCH_GENERATOR ${GENERATOR_DIR}/gen_api_dispatch.lua)
|
||||
@ -310,7 +313,6 @@ set(GENERATOR_PRELOAD ${GENERATOR_DIR}/preload.lua)
|
||||
set(HEADER_GENERATOR ${GENERATOR_DIR}/gen_declarations.lua)
|
||||
set(OPTIONS_ENUM_GENERATOR ${GENERATOR_DIR}/gen_options_enum.lua)
|
||||
set(OPTIONS_GENERATOR ${GENERATOR_DIR}/gen_options.lua)
|
||||
set(UNICODE_TABLES_GENERATOR ${GENERATOR_DIR}/gen_unicode_tables.lua)
|
||||
|
||||
# GENERATED_DIR and GENERATED_INCLUDES_DIR
|
||||
set(GENERATED_API_DISPATCH ${GENERATED_DIR}/api/private/dispatch_wrappers.generated.h)
|
||||
@ -327,7 +329,6 @@ set(GENERATED_OPTIONS_MAP ${GENERATED_DIR}/options_map.generated.h)
|
||||
set(GENERATED_UI_EVENTS_CALL ${GENERATED_DIR}/ui_events_call.generated.h)
|
||||
set(GENERATED_UI_EVENTS_CLIENT ${GENERATED_DIR}/ui_events_client.generated.h)
|
||||
set(GENERATED_UI_EVENTS_REMOTE ${GENERATED_DIR}/ui_events_remote.generated.h)
|
||||
set(GENERATED_UNICODE_TABLES ${GENERATED_DIR}/unicode_tables.generated.h)
|
||||
set(LUA_API_C_BINDINGS ${GENERATED_DIR}/lua_api_c_bindings.generated.h)
|
||||
set(VIM_MODULE_FILE ${GENERATED_DIR}/lua/vim_module.generated.h)
|
||||
|
||||
@ -344,7 +345,6 @@ set(LUA_LOADER_MODULE_SOURCE ${NVIM_RUNTIME_DIR}/lua/vim/loader.lua)
|
||||
set(LUA_OPTIONS_MODULE_SOURCE ${NVIM_RUNTIME_DIR}/lua/vim/_options.lua)
|
||||
set(LUA_SHARED_MODULE_SOURCE ${NVIM_RUNTIME_DIR}/lua/vim/shared.lua)
|
||||
|
||||
file(GLOB UNICODE_FILES CONFIGURE_DEPENDS ${UNICODE_DIR}/*.txt)
|
||||
file(GLOB API_HEADERS CONFIGURE_DEPENDS api/*.h)
|
||||
list(REMOVE_ITEM API_HEADERS ${CMAKE_CURRENT_LIST_DIR}/api/ui_events.in.h)
|
||||
file(GLOB MSGPACK_RPC_HEADERS CONFIGURE_DEPENDS msgpack_rpc/*.h)
|
||||
@ -364,8 +364,8 @@ file(MAKE_DIRECTORY ${TOUCHES_DIR} ${GENERATED_DIR} ${GENERATED_INCLUDES_DIR})
|
||||
|
||||
file(GLOB NVIM_SOURCES CONFIGURE_DEPENDS *.c)
|
||||
file(GLOB NVIM_HEADERS CONFIGURE_DEPENDS *.h)
|
||||
file(GLOB EXTERNAL_SOURCES CONFIGURE_DEPENDS ../xdiff/*.c ../mpack/*.c ../cjson/*.c ../klib/*.c ../termkey/*.c ../vterm/*.c)
|
||||
file(GLOB EXTERNAL_HEADERS CONFIGURE_DEPENDS ../xdiff/*.h ../mpack/*.h ../cjson/*.h ../klib/*.h ../termkey/*.h ../vterm/*.h)
|
||||
file(GLOB EXTERNAL_SOURCES CONFIGURE_DEPENDS ../xdiff/*.c ../mpack/*.c ../cjson/*.c ../klib/*.c ../vterm/*.c)
|
||||
file(GLOB EXTERNAL_HEADERS CONFIGURE_DEPENDS ../xdiff/*.h ../mpack/*.h ../cjson/*.h ../klib/*.h ../vterm/*.h)
|
||||
|
||||
file(GLOB NLUA0_SOURCES CONFIGURE_DEPENDS ../mpack/*.c)
|
||||
|
||||
@ -376,6 +376,15 @@ if(PREFER_LUA)
|
||||
target_compile_definitions(main_lib INTERFACE NVIM_VENDOR_BIT)
|
||||
endif()
|
||||
|
||||
# Inlined external projects, we don't maintain it. #9306
|
||||
if(MSVC)
|
||||
set_source_files_properties(
|
||||
${EXTERNAL_SOURCES} PROPERTIES COMPILE_OPTIONS "-wd4090;-wd4244;-wd4267")
|
||||
else()
|
||||
set_source_files_properties(
|
||||
${EXTERNAL_SOURCES} PROPERTIES COMPILE_OPTIONS "-Wno-conversion;-Wno-missing-noreturn;-Wno-missing-format-attribute;-Wno-double-promotion;-Wno-strict-prototypes;-Wno-misleading-indentation;-Wno-sign-compare;-Wno-implicit-fallthrough;-Wno-missing-prototypes;-Wno-missing-field-initializers")
|
||||
endif()
|
||||
|
||||
list(APPEND NLUA0_SOURCES ${PROJECT_SOURCE_DIR}/src/nlua0.c)
|
||||
|
||||
foreach(subdir
|
||||
@ -384,6 +393,7 @@ foreach(subdir
|
||||
api/private
|
||||
msgpack_rpc
|
||||
tui
|
||||
tui/termkey
|
||||
event
|
||||
eval
|
||||
lua
|
||||
@ -405,49 +415,36 @@ endforeach()
|
||||
list(SORT NVIM_SOURCES)
|
||||
list(SORT NVIM_HEADERS)
|
||||
|
||||
list(APPEND LINT_NVIM_SOURCES ${NVIM_SOURCES} ${NVIM_HEADERS})
|
||||
|
||||
foreach(sfile ${NVIM_SOURCES})
|
||||
get_filename_component(f ${sfile} NAME)
|
||||
if(WIN32 AND ${f} MATCHES "^(pty_process_unix.c)$")
|
||||
list(APPEND to_remove ${sfile})
|
||||
list(REMOVE_ITEM NVIM_SOURCES ${sfile})
|
||||
endif()
|
||||
if(NOT WIN32 AND ${f} MATCHES "^(pty_process_win.c)$")
|
||||
list(APPEND to_remove ${sfile})
|
||||
list(REMOVE_ITEM NVIM_SOURCES ${sfile})
|
||||
endif()
|
||||
if(NOT WIN32 AND ${f} MATCHES "^(pty_conpty_win.c)$")
|
||||
list(APPEND to_remove ${sfile})
|
||||
list(REMOVE_ITEM NVIM_SOURCES ${sfile})
|
||||
endif()
|
||||
if(NOT WIN32 AND ${f} MATCHES "^(os_win_console.c)$")
|
||||
list(APPEND to_remove ${sfile})
|
||||
list(REMOVE_ITEM NVIM_SOURCES ${sfile})
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
list(REMOVE_ITEM NVIM_SOURCES ${to_remove})
|
||||
|
||||
foreach(hfile ${NVIM_HEADERS})
|
||||
get_filename_component(f ${hfile} NAME)
|
||||
if(WIN32 AND ${f} MATCHES "^(unix_defs.h)$")
|
||||
list(APPEND to_remove_h ${hfile})
|
||||
list(REMOVE_ITEM NVIM_HEADERS ${hfile})
|
||||
endif()
|
||||
if(WIN32 AND ${f} MATCHES "^(pty_process_unix.h)$")
|
||||
list(APPEND to_remove_h ${hfile})
|
||||
list(REMOVE_ITEM NVIM_HEADERS ${hfile})
|
||||
endif()
|
||||
if(NOT WIN32 AND ${f} MATCHES "^(win_defs.h)$")
|
||||
list(APPEND to_remove_h ${hfile})
|
||||
list(REMOVE_ITEM NVIM_HEADERS ${hfile})
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
list(REMOVE_ITEM NVIM_HEADERS ${to_remove_h})
|
||||
|
||||
# xdiff, mpack, lua-cjson, termkey: inlined external project, we don't maintain it. #9306
|
||||
if(MSVC)
|
||||
set_source_files_properties(
|
||||
${EXTERNAL_SOURCES} PROPERTIES COMPILE_OPTIONS "-wd4090;-wd4244;-wd4267")
|
||||
else()
|
||||
set_source_files_properties(
|
||||
${EXTERNAL_SOURCES} PROPERTIES COMPILE_OPTIONS "-Wno-conversion;-Wno-missing-noreturn;-Wno-missing-format-attribute;-Wno-double-promotion;-Wno-strict-prototypes;-Wno-misleading-indentation;-Wno-sign-compare;-Wno-implicit-fallthrough;-Wno-missing-prototypes;-Wno-missing-field-initializers")
|
||||
endif()
|
||||
list(APPEND LINT_NVIM_SOURCES ${NVIM_SOURCES} ${NVIM_HEADERS})
|
||||
|
||||
# Log level (NVIM_LOG_DEBUG in log.h)
|
||||
if(CI_BUILD)
|
||||
@ -581,15 +578,6 @@ foreach(sfile ${NVIM_SOURCES}
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
add_custom_command(OUTPUT ${GENERATED_UNICODE_TABLES}
|
||||
COMMAND ${LUA_PRG} ${UNICODE_TABLES_GENERATOR}
|
||||
${UNICODE_DIR}
|
||||
${GENERATED_UNICODE_TABLES}
|
||||
DEPENDS
|
||||
${UNICODE_TABLES_GENERATOR}
|
||||
${UNICODE_FILES}
|
||||
)
|
||||
|
||||
set(NVIM_VERSION_LUA ${PROJECT_BINARY_DIR}/nvim_version.lua)
|
||||
configure_file(${GENERATOR_DIR}/nvim_version.lua.in ${NVIM_VERSION_LUA})
|
||||
|
||||
@ -681,7 +669,6 @@ list(APPEND NVIM_GENERATED_FOR_SOURCES
|
||||
"${GENERATED_EVENTS_NAMES_MAP}"
|
||||
"${GENERATED_OPTIONS}"
|
||||
"${GENERATED_OPTIONS_MAP}"
|
||||
"${GENERATED_UNICODE_TABLES}"
|
||||
"${VIM_MODULE_FILE}"
|
||||
"${PROJECT_BINARY_DIR}/cmake.config/auto/pathdef.h"
|
||||
)
|
||||
@ -857,7 +844,7 @@ endif()
|
||||
add_glob_target(
|
||||
TARGET lintc-clang-tidy
|
||||
COMMAND ${CLANG_TIDY_PRG}
|
||||
FILES ${NVIM_SOURCES} ${NVIM_HEADERS}
|
||||
FILES ${LINT_NVIM_SOURCES}
|
||||
FLAGS --quiet
|
||||
EXCLUDE ${EXCLUDE_CLANG_TIDY})
|
||||
|
||||
@ -870,7 +857,7 @@ endif()
|
||||
add_glob_target(
|
||||
TARGET clang-analyzer
|
||||
COMMAND ${CLANG_TIDY_PRG}
|
||||
FILES ${NVIM_SOURCES} ${NVIM_HEADERS}
|
||||
FILES ${LINT_NVIM_SOURCES}
|
||||
FLAGS --quiet
|
||||
--checks='
|
||||
-*,
|
||||
@ -913,13 +900,13 @@ add_glob_target(
|
||||
TARGET lintc-uncrustify
|
||||
COMMAND ${UNCRUSTIFY_PRG}
|
||||
FLAGS -c ${UNCRUSTIFY_CONFIG} -q --check
|
||||
FILES ${LINT_NVIM_SOURCES})
|
||||
FILES ${NVIM_SOURCES} ${NVIM_HEADERS})
|
||||
|
||||
add_glob_target(
|
||||
TARGET formatc
|
||||
COMMAND ${UNCRUSTIFY_PRG}
|
||||
FLAGS -c ${UNCRUSTIFY_CONFIG} --replace --no-backup
|
||||
FILES ${LINT_NVIM_SOURCES})
|
||||
FILES ${NVIM_SOURCES} ${NVIM_HEADERS})
|
||||
|
||||
add_dependencies(lintc-uncrustify uncrustify_update_config)
|
||||
add_dependencies(formatc uncrustify_update_config)
|
||||
|
@ -571,7 +571,7 @@ Integer nvim_buf_set_extmark(Buffer buffer, Integer ns_id, Integer line, Integer
|
||||
String c = opts->conceal;
|
||||
if (c.size > 0) {
|
||||
int ch;
|
||||
hl.conceal_char = utfc_ptr2schar_len(c.data, (int)c.size, &ch);
|
||||
hl.conceal_char = utfc_ptr2schar(c.data, &ch);
|
||||
if (!hl.conceal_char || !vim_isprintc(ch)) {
|
||||
api_set_error(err, kErrorTypeValidation, "conceal char has to be printable");
|
||||
goto error;
|
||||
|
@ -528,21 +528,15 @@ String buf_get_text(buf_T *buf, int64_t lnum, int64_t start_col, int64_t end_col
|
||||
start_col = start_col < 0 ? line_length + start_col + 1 : start_col;
|
||||
end_col = end_col < 0 ? line_length + end_col + 1 : end_col;
|
||||
|
||||
if (start_col >= MAXCOL || end_col >= MAXCOL) {
|
||||
api_set_error(err, kErrorTypeValidation, "Column index is too high");
|
||||
return rv;
|
||||
}
|
||||
start_col = MIN(MAX(0, start_col), line_length);
|
||||
end_col = MIN(MAX(0, end_col), line_length);
|
||||
|
||||
if (start_col > end_col) {
|
||||
api_set_error(err, kErrorTypeValidation, "start_col must be less than end_col");
|
||||
api_set_error(err, kErrorTypeValidation, "start_col must be less than or equal to end_col");
|
||||
return rv;
|
||||
}
|
||||
|
||||
if (start_col >= line_length) {
|
||||
return rv;
|
||||
}
|
||||
|
||||
return cstrn_as_string(&bufstr[start_col], (size_t)(end_col - start_col));
|
||||
return cbuf_as_string(bufstr + start_col, (size_t)(end_col - start_col));
|
||||
}
|
||||
|
||||
void api_free_string(String value)
|
||||
|
@ -93,15 +93,15 @@ void remote_ui_free_all_mem(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
/// Wait until ui has connected on stdio channel if only_stdio
|
||||
/// is true, otherwise any channel.
|
||||
/// Wait until UI has connected.
|
||||
///
|
||||
/// @param only_stdio UI is expected to connect on stdio.
|
||||
void remote_ui_wait_for_attach(bool only_stdio)
|
||||
{
|
||||
if (only_stdio) {
|
||||
Channel *channel = find_channel(CHAN_STDIO);
|
||||
if (!channel) {
|
||||
// this function should only be called in --embed mode, stdio channel
|
||||
// can be assumed.
|
||||
// `only_stdio` implies --embed mode, thus stdio channel can be assumed.
|
||||
abort();
|
||||
}
|
||||
|
||||
@ -847,7 +847,7 @@ void remote_ui_raw_line(RemoteUI *ui, Integer grid, Integer row, Integer startco
|
||||
char sc_buf[MAX_SCHAR_SIZE];
|
||||
schar_get(sc_buf, chunk[i]);
|
||||
remote_ui_put(ui, sc_buf);
|
||||
if (utf_ambiguous_width(utf_ptr2char(sc_buf))) {
|
||||
if (utf_ambiguous_width(sc_buf)) {
|
||||
ui->client_col = -1; // force cursor update
|
||||
}
|
||||
}
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include "nvim/cursor.h"
|
||||
#include "nvim/decoration.h"
|
||||
#include "nvim/drawscreen.h"
|
||||
#include "nvim/edit.h"
|
||||
#include "nvim/errors.h"
|
||||
#include "nvim/eval.h"
|
||||
#include "nvim/eval/typval.h"
|
||||
|
@ -756,10 +756,8 @@ void ins_char_bytes(char *buf, size_t charlen)
|
||||
// put back when BS is used. The bytes of a multi-byte character are
|
||||
// done the other way around, so that the first byte is popped off
|
||||
// first (it tells the byte length of the character).
|
||||
replace_push(NUL);
|
||||
for (size_t i = 0; i < oldlen; i++) {
|
||||
i += (size_t)replace_push_mb(oldp + col + i) - 1;
|
||||
}
|
||||
replace_push_nul();
|
||||
replace_push(oldp + col, oldlen);
|
||||
}
|
||||
|
||||
char *newp = xmalloc(linelen + newlen - oldlen);
|
||||
@ -896,14 +894,15 @@ int del_bytes(colnr_T count, bool fixpos_arg, bool use_delcombine)
|
||||
// delete the last combining character.
|
||||
if (p_deco && use_delcombine && utfc_ptr2len(oldp + col) >= count) {
|
||||
char *p0 = oldp + col;
|
||||
if (utf_composinglike(p0, p0 + utf_ptr2len(p0))) {
|
||||
GraphemeState state = GRAPHEME_STATE_INIT;
|
||||
if (utf_composinglike(p0, p0 + utf_ptr2len(p0), &state)) {
|
||||
// Find the last composing char, there can be several.
|
||||
int n = col;
|
||||
do {
|
||||
col = n;
|
||||
count = utf_ptr2len(oldp + n);
|
||||
n += count;
|
||||
} while (utf_composinglike(oldp + col, oldp + n));
|
||||
} while (utf_composinglike(oldp + col, oldp + n, &state));
|
||||
fixpos = false;
|
||||
}
|
||||
}
|
||||
@ -1136,12 +1135,10 @@ bool open_line(int dir, int flags, int second_line_indent, bool *did_do_comment)
|
||||
// on the line onto the replace stack. We'll push any other characters
|
||||
// that might be replaced at the start of the next line (due to
|
||||
// autoindent etc) a bit later.
|
||||
replace_push(NUL); // Call twice because BS over NL expects it
|
||||
replace_push(NUL);
|
||||
replace_push_nul(); // Call twice because BS over NL expects it
|
||||
replace_push_nul();
|
||||
p = saved_line + curwin->w_cursor.col;
|
||||
while (*p != NUL) {
|
||||
p += replace_push_mb(p);
|
||||
}
|
||||
replace_push(p, strlen(p));
|
||||
saved_line[curwin->w_cursor.col] = NUL;
|
||||
}
|
||||
|
||||
@ -1690,13 +1687,13 @@ bool open_line(int dir, int flags, int second_line_indent, bool *did_do_comment)
|
||||
// stack, preceded by a NUL, so they can be put back when a BS is
|
||||
// entered.
|
||||
if (REPLACE_NORMAL(State)) {
|
||||
replace_push(NUL); // end of extra blanks
|
||||
replace_push_nul(); // end of extra blanks
|
||||
}
|
||||
if (curbuf->b_p_ai || (flags & OPENLINE_DELSPACES)) {
|
||||
while ((*p_extra == ' ' || *p_extra == '\t')
|
||||
&& !utf_iscomposing(utf_ptr2char(p_extra + 1))) {
|
||||
&& !utf_iscomposing_first(utf_ptr2char(p_extra + 1))) {
|
||||
if (REPLACE_NORMAL(State)) {
|
||||
replace_push(*p_extra);
|
||||
replace_push(p_extra, 1); // always ascii, len = 1
|
||||
}
|
||||
p_extra++;
|
||||
less_cols_off++;
|
||||
@ -1793,7 +1790,7 @@ bool open_line(int dir, int flags, int second_line_indent, bool *did_do_comment)
|
||||
// must be a NUL on the replace stack, for when it is deleted with BS
|
||||
if (REPLACE_NORMAL(State)) {
|
||||
for (colnr_T n = 0; n < curwin->w_cursor.col; n++) {
|
||||
replace_push(NUL);
|
||||
replace_push_nul();
|
||||
}
|
||||
}
|
||||
newcol += curwin->w_cursor.col;
|
||||
@ -1807,7 +1804,7 @@ bool open_line(int dir, int flags, int second_line_indent, bool *did_do_comment)
|
||||
// must be a NUL on the replace stack, for when it is deleted with BS.
|
||||
if (REPLACE_NORMAL(State)) {
|
||||
while (lead_len-- > 0) {
|
||||
replace_push(NUL);
|
||||
replace_push_nul();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1865,7 +1865,7 @@ static void printdigraph(const digr_T *dp, result_T *previous)
|
||||
p = buf;
|
||||
|
||||
// add a space to draw a composing char on
|
||||
if (utf_iscomposing(dp->result)) {
|
||||
if (utf_iscomposing_first(dp->result)) {
|
||||
*p++ = ' ';
|
||||
}
|
||||
p += utf_char2bytes(dp->result, p);
|
||||
|
@ -1826,7 +1826,7 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, s
|
||||
|
||||
// If a double-width char doesn't fit display a '>' in the last column.
|
||||
// Don't advance the pointer but put the character at the start of the next line.
|
||||
if (wlv.col >= grid->cols - 1 && utf_char2cells(mb_c) == 2) {
|
||||
if (wlv.col >= grid->cols - 1 && schar_cells(mb_schar) == 2) {
|
||||
mb_c = '>';
|
||||
mb_l = 1;
|
||||
(void)mb_l;
|
||||
@ -1922,7 +1922,7 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, s
|
||||
// If a double-width char doesn't fit display a '>' in the
|
||||
// last column; the character is displayed at the start of the
|
||||
// next line.
|
||||
if (wlv.col >= grid->cols - 1 && utf_char2cells(mb_c) == 2) {
|
||||
if (wlv.col >= grid->cols - 1 && schar_cells(mb_schar) == 2) {
|
||||
mb_schar = schar_from_ascii('>');
|
||||
mb_c = '>';
|
||||
mb_l = 1;
|
||||
@ -2393,6 +2393,12 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, s
|
||||
|| (decor_conceal && decor_state.conceal_char)
|
||||
|| wp->w_p_cole == 1)
|
||||
&& wp->w_p_cole != 3) {
|
||||
if (schar_cells(mb_schar) > 1) {
|
||||
// When the first char to be concealed is double-width,
|
||||
// need to advance one more virtual column.
|
||||
wlv.n_extra++;
|
||||
}
|
||||
|
||||
// First time at this concealed item: display one
|
||||
// character.
|
||||
if (has_match_conc && match_conc) {
|
||||
@ -2410,12 +2416,6 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, s
|
||||
mb_schar = schar_from_ascii(' ');
|
||||
}
|
||||
|
||||
if (utf_char2cells(mb_c) > 1) {
|
||||
// When the first char to be concealed is double-width,
|
||||
// need to advance one more virtual column.
|
||||
wlv.n_extra++;
|
||||
}
|
||||
|
||||
mb_c = schar_get_first_codepoint(mb_schar);
|
||||
|
||||
prev_syntax_id = syntax_seqnr;
|
||||
@ -2484,7 +2484,7 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, s
|
||||
&& mb_schar != NUL) {
|
||||
mb_schar = wp->w_p_lcs_chars.prec;
|
||||
lcs_prec_todo = NUL;
|
||||
if (utf_char2cells(mb_c) > 1) {
|
||||
if (schar_cells(mb_schar) > 1) {
|
||||
// Double-width character being overwritten by the "precedes"
|
||||
// character, need to fill up half the character.
|
||||
wlv.sc_extra = schar_from_ascii(MB_FILLER_CHAR);
|
||||
@ -2725,7 +2725,7 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, s
|
||||
|
||||
linebuf_vcol[wlv.off] = wlv.vcol;
|
||||
|
||||
if (utf_char2cells(mb_c) > 1) {
|
||||
if (schar_cells(mb_schar) > 1) {
|
||||
// Need to fill two screen columns.
|
||||
wlv.off++;
|
||||
wlv.col++;
|
||||
@ -2744,7 +2744,7 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, int col_rows, s
|
||||
wlv.off++;
|
||||
wlv.col++;
|
||||
} else if (wp->w_p_cole > 0 && is_concealing) {
|
||||
bool concealed_wide = utf_char2cells(mb_c) > 1;
|
||||
bool concealed_wide = schar_cells(mb_schar) > 1;
|
||||
|
||||
wlv.skip_cells--;
|
||||
wlv.vcol_off_co++;
|
||||
|
@ -2453,10 +2453,12 @@ redr_statuscol:
|
||||
recursive = true;
|
||||
curwin->w_valid &= ~VALID_TOPLINE;
|
||||
update_topline(curwin); // may invalidate w_botline again
|
||||
// New redraw either due to updated topline or reset skipcol.
|
||||
if (must_redraw != 0) {
|
||||
// Don't update for changes in buffer again.
|
||||
int mod_set = curbuf->b_mod_set;
|
||||
curbuf->b_mod_set = false;
|
||||
curs_columns(curwin, true);
|
||||
win_update(curwin);
|
||||
must_redraw = 0;
|
||||
curbuf->b_mod_set = mod_set;
|
||||
|
188
src/nvim/edit.c
188
src/nvim/edit.c
@ -136,6 +136,8 @@ static TriState dont_sync_undo = kFalse; // CTRL-G U prevents syncing undo
|
||||
|
||||
static linenr_T o_lnum = 0;
|
||||
|
||||
static kvec_t(char) replace_stack = KV_INITIAL_VALUE;
|
||||
|
||||
static void insert_enter(InsertState *s)
|
||||
{
|
||||
s->did_backspace = true;
|
||||
@ -464,7 +466,8 @@ static int insert_check(VimState *state)
|
||||
&& !curwin->w_p_sms
|
||||
&& !s->did_backspace
|
||||
&& curwin->w_topline == s->old_topline
|
||||
&& curwin->w_topfill == s->old_topfill) {
|
||||
&& curwin->w_topfill == s->old_topfill
|
||||
&& s->count <= 1) {
|
||||
s->mincol = curwin->w_wcol;
|
||||
validate_cursor_col(curwin);
|
||||
|
||||
@ -486,11 +489,15 @@ static int insert_check(VimState *state)
|
||||
}
|
||||
|
||||
// May need to adjust w_topline to show the cursor.
|
||||
update_topline(curwin);
|
||||
if (s->count <= 1) {
|
||||
update_topline(curwin);
|
||||
}
|
||||
|
||||
s->did_backspace = false;
|
||||
|
||||
validate_cursor(curwin); // may set must_redraw
|
||||
if (s->count <= 1) {
|
||||
validate_cursor(curwin); // may set must_redraw
|
||||
}
|
||||
|
||||
// Redraw the display when no characters are waiting.
|
||||
// Also shows mode, ruler and positions cursor.
|
||||
@ -504,7 +511,9 @@ static int insert_check(VimState *state)
|
||||
do_check_cursorbind();
|
||||
}
|
||||
|
||||
update_curswant();
|
||||
if (s->count <= 1) {
|
||||
update_curswant();
|
||||
}
|
||||
s->old_topline = curwin->w_topline;
|
||||
s->old_topfill = curwin->w_topfill;
|
||||
|
||||
@ -1611,9 +1620,8 @@ void undisplay_dollar(void)
|
||||
/// type == INDENT_SET set indent to "amount"
|
||||
///
|
||||
/// @param round if true, round the indent to 'shiftwidth' (only with _INC and _Dec).
|
||||
/// @param replaced replaced character, put on replace stack
|
||||
/// @param call_changed_bytes call changed_bytes()
|
||||
void change_indent(int type, int amount, int round, int replaced, bool call_changed_bytes)
|
||||
void change_indent(int type, int amount, int round, bool call_changed_bytes)
|
||||
{
|
||||
int insstart_less; // reduction for Insstart.col
|
||||
colnr_T orig_col = 0; // init for GCC
|
||||
@ -1760,12 +1768,8 @@ void change_indent(int type, int amount, int round, int replaced, bool call_chan
|
||||
replace_join(0); // remove a NUL from the replace stack
|
||||
start_col--;
|
||||
}
|
||||
while (start_col < (int)curwin->w_cursor.col || replaced) {
|
||||
replace_push(NUL);
|
||||
if (replaced) {
|
||||
replace_push(replaced);
|
||||
replaced = NUL;
|
||||
}
|
||||
while (start_col < (int)curwin->w_cursor.col) {
|
||||
replace_push_nul();
|
||||
start_col++;
|
||||
}
|
||||
}
|
||||
@ -2318,7 +2322,7 @@ int stop_arrow(void)
|
||||
static void stop_insert(pos_T *end_insert_pos, int esc, int nomove)
|
||||
{
|
||||
stop_redo_ins();
|
||||
replace_flush(); // abandon replace stack
|
||||
kv_destroy(replace_stack); // abandon replace stack (reinitializes)
|
||||
|
||||
// Save the inserted text for later redo with ^@ and CTRL-A.
|
||||
// Don't do it when "restart_edit" was set and nothing was inserted,
|
||||
@ -2795,55 +2799,51 @@ static bool echeck_abbr(int c)
|
||||
// that the NL replaced. The extra one stores the characters after the cursor
|
||||
// that were deleted (always white space).
|
||||
|
||||
static uint8_t *replace_stack = NULL;
|
||||
static ssize_t replace_stack_nr = 0; // next entry in replace stack
|
||||
static ssize_t replace_stack_len = 0; // max. number of entries
|
||||
|
||||
/// Push character that is replaced onto the replace stack.
|
||||
///
|
||||
/// replace_offset is normally 0, in which case replace_push will add a new
|
||||
/// character at the end of the stack. If replace_offset is not 0, that many
|
||||
/// characters will be left on the stack above the newly inserted character.
|
||||
///
|
||||
/// @param c character that is replaced (NUL is none)
|
||||
void replace_push(int c)
|
||||
/// @param str character that is replaced (NUL is none)
|
||||
/// @param len length of character in bytes
|
||||
void replace_push(char *str, size_t len)
|
||||
{
|
||||
if (replace_stack_nr < replace_offset) { // nothing to do
|
||||
// TODO(bfredl): replace_offset is suss af, if we don't need it, this
|
||||
// function is just kv_concat() :p
|
||||
if (kv_size(replace_stack) < (size_t)replace_offset) { // nothing to do
|
||||
return;
|
||||
}
|
||||
|
||||
if (replace_stack_len <= replace_stack_nr) {
|
||||
replace_stack_len += 50;
|
||||
replace_stack = xrealloc(replace_stack, (size_t)replace_stack_len);
|
||||
}
|
||||
uint8_t *p = replace_stack + replace_stack_nr - replace_offset;
|
||||
kv_ensure_space(replace_stack, len);
|
||||
|
||||
char *p = replace_stack.items + kv_size(replace_stack) - replace_offset;
|
||||
if (replace_offset) {
|
||||
memmove(p + 1, p, (size_t)replace_offset);
|
||||
memmove(p + len, p, (size_t)replace_offset);
|
||||
}
|
||||
*p = (uint8_t)c;
|
||||
replace_stack_nr++;
|
||||
memcpy(p, str, len);
|
||||
kv_size(replace_stack) += len;
|
||||
}
|
||||
|
||||
/// Push a character onto the replace stack. Handles a multi-byte character in
|
||||
/// reverse byte order, so that the first byte is popped off first.
|
||||
///
|
||||
/// @return the number of bytes done (includes composing characters).
|
||||
int replace_push_mb(char *p)
|
||||
/// push NUL as separator between entries in the stack
|
||||
void replace_push_nul(void)
|
||||
{
|
||||
int l = utfc_ptr2len(p);
|
||||
|
||||
for (int j = l - 1; j >= 0; j--) {
|
||||
replace_push(p[j]);
|
||||
}
|
||||
return l;
|
||||
replace_push("", 1);
|
||||
}
|
||||
|
||||
/// Pop one item from the replace stack.
|
||||
/// Check top of replace stack, pop it if it was NUL
|
||||
///
|
||||
/// @return -1 if stack is empty, replaced character or NUL otherwise
|
||||
static int replace_pop(void)
|
||||
/// when a non-NUL byte is found, use mb_replace_pop_ins() to
|
||||
/// pop one complete multibyte character.
|
||||
///
|
||||
/// @return -1 if stack is empty, last byte of char or NUL otherwise
|
||||
static int replace_pop_if_nul(void)
|
||||
{
|
||||
return (replace_stack_nr == 0) ? -1 : (int)replace_stack[--replace_stack_nr];
|
||||
int ch = (kv_size(replace_stack)) ? (uint8_t)kv_A(replace_stack, kv_size(replace_stack) - 1) : -1;
|
||||
if (ch == NUL) {
|
||||
kv_size(replace_stack)--;
|
||||
}
|
||||
return ch;
|
||||
}
|
||||
|
||||
/// Join the top two items on the replace stack. This removes to "off"'th NUL
|
||||
@ -2852,11 +2852,11 @@ static int replace_pop(void)
|
||||
/// @param off offset for which NUL to remove
|
||||
static void replace_join(int off)
|
||||
{
|
||||
for (ssize_t i = replace_stack_nr; --i >= 0;) {
|
||||
if (replace_stack[i] == NUL && off-- <= 0) {
|
||||
replace_stack_nr--;
|
||||
memmove(replace_stack + i, replace_stack + i + 1,
|
||||
(size_t)(replace_stack_nr - i));
|
||||
for (ssize_t i = (ssize_t)kv_size(replace_stack); --i >= 0;) {
|
||||
if (kv_A(replace_stack, i) == NUL && off-- <= 0) {
|
||||
kv_size(replace_stack)--;
|
||||
memmove(&kv_A(replace_stack, i), &kv_A(replace_stack, i + 1),
|
||||
(kv_size(replace_stack) - (size_t)i));
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -2866,70 +2866,25 @@ static void replace_join(int off)
|
||||
/// before the cursor. Can only be used in MODE_REPLACE or MODE_VREPLACE state.
|
||||
static void replace_pop_ins(void)
|
||||
{
|
||||
int cc;
|
||||
int oldState = State;
|
||||
|
||||
State = MODE_NORMAL; // don't want MODE_REPLACE here
|
||||
while ((cc = replace_pop()) > 0) {
|
||||
mb_replace_pop_ins(cc);
|
||||
while ((replace_pop_if_nul()) > 0) {
|
||||
mb_replace_pop_ins();
|
||||
dec_cursor();
|
||||
}
|
||||
State = oldState;
|
||||
}
|
||||
|
||||
// Insert bytes popped from the replace stack. "cc" is the first byte. If it
|
||||
// indicates a multi-byte char, pop the other bytes too.
|
||||
static void mb_replace_pop_ins(int cc)
|
||||
/// Insert multibyte char popped from the replace stack.
|
||||
///
|
||||
/// caller must already have checked the top of the stack is not NUL!!
|
||||
static void mb_replace_pop_ins(void)
|
||||
{
|
||||
int n;
|
||||
uint8_t buf[MB_MAXBYTES + 1];
|
||||
|
||||
if ((n = MB_BYTE2LEN(cc)) > 1) {
|
||||
buf[0] = (uint8_t)cc;
|
||||
for (int i = 1; i < n; i++) {
|
||||
buf[i] = (uint8_t)replace_pop();
|
||||
}
|
||||
ins_bytes_len((char *)buf, (size_t)n);
|
||||
} else {
|
||||
ins_char(cc);
|
||||
}
|
||||
|
||||
// Handle composing chars.
|
||||
while (true) {
|
||||
int c = replace_pop();
|
||||
if (c == -1) { // stack empty
|
||||
break;
|
||||
}
|
||||
if ((n = MB_BYTE2LEN(c)) == 1) {
|
||||
// Not a multi-byte char, put it back.
|
||||
replace_push(c);
|
||||
break;
|
||||
}
|
||||
|
||||
buf[0] = (uint8_t)c;
|
||||
assert(n > 1);
|
||||
for (int i = 1; i < n; i++) {
|
||||
buf[i] = (uint8_t)replace_pop();
|
||||
}
|
||||
if (utf_iscomposing(utf_ptr2char((char *)buf))) {
|
||||
ins_bytes_len((char *)buf, (size_t)n);
|
||||
} else {
|
||||
// Not a composing char, put it back.
|
||||
for (int i = n - 1; i >= 0; i--) {
|
||||
replace_push(buf[i]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// make the replace stack empty
|
||||
// (called when exiting replace mode)
|
||||
static void replace_flush(void)
|
||||
{
|
||||
XFREE_CLEAR(replace_stack);
|
||||
replace_stack_len = 0;
|
||||
replace_stack_nr = 0;
|
||||
int len = utf_head_off(&kv_A(replace_stack, 0),
|
||||
&kv_A(replace_stack, kv_size(replace_stack) - 1)) + 1;
|
||||
kv_size(replace_stack) -= (size_t)len;
|
||||
ins_bytes_len(&kv_A(replace_stack, kv_size(replace_stack)), (size_t)len);
|
||||
}
|
||||
|
||||
// Handle doing a BS for one character.
|
||||
@ -2944,7 +2899,7 @@ static void replace_do_bs(int limit_col)
|
||||
colnr_T start_vcol;
|
||||
const int l_State = State;
|
||||
|
||||
int cc = replace_pop();
|
||||
int cc = replace_pop_if_nul();
|
||||
if (cc > 0) {
|
||||
int orig_len = 0;
|
||||
int orig_vcols = 0;
|
||||
@ -2958,7 +2913,6 @@ static void replace_do_bs(int limit_col)
|
||||
if (l_State & VREPLACE_FLAG) {
|
||||
orig_len = get_cursor_pos_len();
|
||||
}
|
||||
replace_push(cc);
|
||||
replace_pop_ins();
|
||||
|
||||
if (l_State & VREPLACE_FLAG) {
|
||||
@ -3617,9 +3571,9 @@ static void ins_shift(int c, int lastc)
|
||||
if (lastc == '^') {
|
||||
old_indent = get_indent(); // remember curr. indent
|
||||
}
|
||||
change_indent(INDENT_SET, 0, true, 0, true);
|
||||
change_indent(INDENT_SET, 0, true, true);
|
||||
} else {
|
||||
change_indent(c == Ctrl_D ? INDENT_DEC : INDENT_INC, 0, true, 0, true);
|
||||
change_indent(c == Ctrl_D ? INDENT_DEC : INDENT_INC, 0, true, true);
|
||||
}
|
||||
|
||||
if (did_ai && *skipwhite(get_cursor_line_ptr()) != NUL) {
|
||||
@ -3738,7 +3692,7 @@ static bool ins_bs(int c, int mode, int *inserted_space_p)
|
||||
// cc >= 0: NL was replaced, put original characters back
|
||||
cc = -1;
|
||||
if (State & REPLACE_FLAG) {
|
||||
cc = replace_pop(); // returns -1 if NL was inserted
|
||||
cc = replace_pop_if_nul(); // returns -1 if NL was inserted
|
||||
}
|
||||
// In replace mode, in the line we started replacing, we only move the
|
||||
// cursor.
|
||||
@ -3784,9 +3738,9 @@ static bool ins_bs(int c, int mode, int *inserted_space_p)
|
||||
// restore characters (blanks) deleted after cursor
|
||||
while (cc > 0) {
|
||||
colnr_T save_col = curwin->w_cursor.col;
|
||||
mb_replace_pop_ins(cc);
|
||||
mb_replace_pop_ins();
|
||||
curwin->w_cursor.col = save_col;
|
||||
cc = replace_pop();
|
||||
cc = replace_pop_if_nul();
|
||||
}
|
||||
// restore the characters that NL replaced
|
||||
replace_pop_ins();
|
||||
@ -3843,7 +3797,7 @@ static bool ins_bs(int c, int mode, int *inserted_space_p)
|
||||
space_sci = sci;
|
||||
space_vcol = vcol;
|
||||
}
|
||||
vcol += charsize_nowrap(curbuf, use_ts, vcol, sci.chr.value);
|
||||
vcol += charsize_nowrap(curbuf, sci.ptr, use_ts, vcol, sci.chr.value);
|
||||
sci = utfc_next(sci);
|
||||
prev_space = cur_space;
|
||||
}
|
||||
@ -3859,7 +3813,7 @@ static bool ins_bs(int c, int mode, int *inserted_space_p)
|
||||
// Find the position to stop backspacing.
|
||||
// Use charsize_nowrap() so that virtual text and wrapping are ignored.
|
||||
while (true) {
|
||||
int size = charsize_nowrap(curbuf, use_ts, space_vcol, space_sci.chr.value);
|
||||
int size = charsize_nowrap(curbuf, space_sci.ptr, use_ts, space_vcol, space_sci.chr.value);
|
||||
if (space_vcol + size > want_vcol) {
|
||||
break;
|
||||
}
|
||||
@ -3895,7 +3849,7 @@ static bool ins_bs(int c, int mode, int *inserted_space_p)
|
||||
} else {
|
||||
ins_str(" ");
|
||||
if ((State & REPLACE_FLAG)) {
|
||||
replace_push(NUL);
|
||||
replace_push_nul();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -3930,7 +3884,7 @@ static bool ins_bs(int c, int mode, int *inserted_space_p)
|
||||
bool has_composing = false;
|
||||
if (p_deco) {
|
||||
char *p0 = get_cursor_pos_ptr();
|
||||
has_composing = utf_composinglike(p0, p0 + utf_ptr2len(p0));
|
||||
has_composing = utf_composinglike(p0, p0 + utf_ptr2len(p0), NULL);
|
||||
}
|
||||
del_char(false);
|
||||
// If there are combining characters and 'delcombine' is set
|
||||
@ -4305,7 +4259,7 @@ static bool ins_tab(void)
|
||||
} else {
|
||||
ins_str(" ");
|
||||
if (State & REPLACE_FLAG) { // no char replaced
|
||||
replace_push(NUL);
|
||||
replace_push_nul();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -4472,7 +4426,7 @@ bool ins_eol(int c)
|
||||
// character under the cursor. Only push a NUL on the replace stack,
|
||||
// nothing to put back when the NL is deleted.
|
||||
if ((State & REPLACE_FLAG) && !(State & VREPLACE_FLAG)) {
|
||||
replace_push(NUL);
|
||||
replace_push_nul();
|
||||
}
|
||||
|
||||
// In MODE_VREPLACE state, a NL replaces the rest of the line, and starts
|
||||
@ -4673,7 +4627,7 @@ static void ins_try_si(int c)
|
||||
i = get_indent();
|
||||
curwin->w_cursor = old_pos;
|
||||
if (State & VREPLACE_FLAG) {
|
||||
change_indent(INDENT_SET, i, false, NUL, true);
|
||||
change_indent(INDENT_SET, i, false, true);
|
||||
} else {
|
||||
set_indent(i, SIN_CHANGED);
|
||||
}
|
||||
|
@ -2066,7 +2066,7 @@ M.funcs = {
|
||||
On MS-Windows the ".exe", ".bat", etc. can optionally be
|
||||
included. Then the extensions in $PATHEXT are tried. Thus if
|
||||
"foo.exe" does not exist, "foo.exe.bat" can be found. If
|
||||
$PATHEXT is not set then ".exe;.com;.bat;.cmd" is used. A dot
|
||||
$PATHEXT is not set then ".com;.exe;.bat;.cmd" is used. A dot
|
||||
by itself can be used in $PATHEXT to try using the name
|
||||
without an extension. When 'shell' looks like a Unix shell,
|
||||
then the name is also tried without adding an extension.
|
||||
@ -3564,7 +3564,7 @@ M.funcs = {
|
||||
]=],
|
||||
name = 'getcharsearch',
|
||||
params = {},
|
||||
returns = 'table[]',
|
||||
returns = 'table',
|
||||
signature = 'getcharsearch()',
|
||||
},
|
||||
getcharstr = {
|
||||
@ -6442,6 +6442,7 @@ M.funcs = {
|
||||
"lhsrawalt" The {lhs} of the mapping as raw bytes, alternate
|
||||
form, only present when it differs from "lhsraw"
|
||||
"rhs" The {rhs} of the mapping as typed.
|
||||
"callback" Lua function, if RHS was defined as such.
|
||||
"silent" 1 for a |:map-silent| mapping, else 0.
|
||||
"noremap" 1 if the {rhs} of the mapping is not remappable.
|
||||
"script" 1 if mapping was defined with <script>.
|
||||
|
@ -204,7 +204,7 @@ void do_ascii(exarg_T *eap)
|
||||
IObuff[iobuff_len++] = ' ';
|
||||
}
|
||||
IObuff[iobuff_len++] = '<';
|
||||
if (utf_iscomposing(c)) {
|
||||
if (utf_iscomposing_first(c)) {
|
||||
IObuff[iobuff_len++] = ' '; // Draw composing char on top of a space.
|
||||
}
|
||||
iobuff_len += (size_t)utf_char2bytes(c, IObuff + iobuff_len);
|
||||
@ -3378,12 +3378,12 @@ static int do_sub(exarg_T *eap, const proftime_T timeout, const int cmdpreview_n
|
||||
which_pat = RE_LAST; // use last used regexp
|
||||
delimiter = (uint8_t)(*cmd++); // remember delimiter character
|
||||
pat = cmd; // remember start of search pat
|
||||
patlen = strlen(pat);
|
||||
cmd = skip_regexp_ex(cmd, delimiter, magic_isset(), &eap->arg, NULL, NULL);
|
||||
if (cmd[0] == delimiter) { // end delimiter found
|
||||
*cmd++ = NUL; // replace it with a NUL
|
||||
has_second_delim = true;
|
||||
}
|
||||
patlen = strlen(pat);
|
||||
}
|
||||
|
||||
// Small incompatibility: vi sees '\n' as end of the command, but in
|
||||
|
@ -2499,6 +2499,15 @@ int parse_command_modifiers(exarg_T *eap, const char **errormsg, cmdmod_T *cmod,
|
||||
|
||||
// ignore comment and empty lines
|
||||
if (*eap->cmd == '"') {
|
||||
// a comment ends at a NL
|
||||
eap->nextcmd = vim_strchr(eap->cmd, '\n');
|
||||
if (eap->nextcmd != NULL) {
|
||||
eap->nextcmd++;
|
||||
}
|
||||
return FAIL;
|
||||
}
|
||||
if (*eap->cmd == '\n') {
|
||||
eap->nextcmd = eap->cmd + 1;
|
||||
return FAIL;
|
||||
}
|
||||
if (*eap->cmd == NUL) {
|
||||
|
@ -2118,7 +2118,7 @@ static int command_line_handle_key(CommandLineState *s)
|
||||
s->do_abbr = false; // don't do abbreviation now
|
||||
ccline.special_char = NUL;
|
||||
// may need to remove ^ when composing char was typed
|
||||
if (utf_iscomposing(s->c) && !cmd_silent) {
|
||||
if (utf_iscomposing_first(s->c) && !cmd_silent) {
|
||||
if (ui_has(kUICmdline)) {
|
||||
// TODO(bfredl): why not make unputcmdline also work with true?
|
||||
unputcmdline();
|
||||
@ -3585,7 +3585,9 @@ void put_on_cmdline(const char *str, int len, bool redraw)
|
||||
// backup to the character before it. There could be two of them.
|
||||
int i = 0;
|
||||
int c = utf_ptr2char(ccline.cmdbuff + ccline.cmdpos);
|
||||
while (ccline.cmdpos > 0 && utf_iscomposing(c)) {
|
||||
// TODO(bfredl): this can be corrected/simplified as utf_head_off implements the
|
||||
// correct grapheme cluster breaks
|
||||
while (ccline.cmdpos > 0 && utf_iscomposing_legacy(c)) {
|
||||
i = utf_head_off(ccline.cmdbuff, ccline.cmdbuff + ccline.cmdpos - 1) + 1;
|
||||
ccline.cmdpos -= i;
|
||||
len += i;
|
||||
|
@ -70,24 +70,19 @@ void extmark_set(buf_T *buf, uint32_t ns_id, uint32_t *idp, int row, colnr_T col
|
||||
extmark_del_id(buf, ns_id, id);
|
||||
} else {
|
||||
assert(marktree_itr_valid(itr));
|
||||
bool invalid = mt_invalid(old_mark);
|
||||
if (old_mark.pos.row == row && old_mark.pos.col == col) {
|
||||
// not paired: we can revise in place
|
||||
if (!invalid && mt_decor_any(old_mark)) {
|
||||
// TODO(bfredl): conflict of concerns: buf_decor_remove() must process
|
||||
// the buffer as if MT_FLAG_DECOR_SIGNTEXT is already removed, however
|
||||
// marktree must precisely adjust the set of flags from the old set to the new
|
||||
uint16_t save_flags = mt_itr_rawkey(itr).flags;
|
||||
mt_itr_rawkey(itr).flags &= (uint16_t) ~MT_FLAG_DECOR_SIGNTEXT;
|
||||
if (!mt_invalid(old_mark) && mt_decor_any(old_mark)) {
|
||||
mt_itr_rawkey(itr).flags &= (uint16_t) ~MT_FLAG_EXTERNAL_MASK;
|
||||
buf_decor_remove(buf, row, row, col, mt_decor(old_mark), true);
|
||||
mt_itr_rawkey(itr).flags = save_flags;
|
||||
}
|
||||
marktree_revise_flags(buf->b_marktree, itr, flags);
|
||||
mt_itr_rawkey(itr).flags |= flags;
|
||||
mt_itr_rawkey(itr).decor_data = decor.data;
|
||||
marktree_revise_meta(buf->b_marktree, itr, old_mark);
|
||||
goto revised;
|
||||
}
|
||||
marktree_del_itr(buf->b_marktree, itr, false);
|
||||
if (!invalid) {
|
||||
if (!mt_invalid(old_mark)) {
|
||||
buf_decor_remove(buf, old_mark.pos.row, old_mark.pos.row, old_mark.pos.col,
|
||||
mt_decor(old_mark), true);
|
||||
}
|
||||
@ -131,6 +126,7 @@ static void extmark_setraw(buf_T *buf, uint64_t mark, int row, colnr_T col, bool
|
||||
int row2 = 0;
|
||||
if (invalid) {
|
||||
mt_itr_rawkey(itr).flags &= (uint16_t) ~MT_FLAG_INVALID;
|
||||
marktree_revise_meta(buf->b_marktree, itr, key);
|
||||
} else if (move && key.flags & MT_FLAG_DECOR_SIGNTEXT && buf->b_signcols.autom) {
|
||||
MTPos end = marktree_get_altpos(buf->b_marktree, key, NULL);
|
||||
row1 = MIN(end.row, MIN(key.pos.row, row));
|
||||
@ -394,6 +390,7 @@ void extmark_splice_delete(buf_T *buf, int l_row, colnr_T l_col, int u_row, coln
|
||||
} else {
|
||||
invalidated = true;
|
||||
mt_itr_rawkey(itr).flags |= MT_FLAG_INVALID;
|
||||
marktree_revise_meta(buf->b_marktree, itr, mark);
|
||||
buf_decor_remove(buf, mark.pos.row, endpos.row, mark.pos.col, mt_decor(mark), false);
|
||||
}
|
||||
}
|
||||
|
@ -1,264 +0,0 @@
|
||||
-- Script creates the following tables in unicode_tables.generated.h:
|
||||
--
|
||||
-- 1. doublewidth and ambiguous tables: sorted list of non-overlapping closed
|
||||
-- intervals. Codepoints in these intervals have double (W or F) or ambiguous
|
||||
-- (A) east asian width respectively.
|
||||
-- 2. combining table: same as the above, but characters inside are combining
|
||||
-- characters (i.e. have general categories equal to Mn, Mc or Me).
|
||||
-- 3. foldCase table used to convert characters to
|
||||
-- folded variants. In this table first two values are
|
||||
-- character ranges: like in previous tables they are sorted and must be
|
||||
-- non-overlapping. Third value means step inside the range: e.g. if it is
|
||||
-- 2 then interval applies only to first, third, fifth, … character in range.
|
||||
-- Fourth value is number that should be added to the codepoint to yield
|
||||
-- folded codepoint.
|
||||
-- 4. emoji_wide and emoji_all tables: sorted lists of non-overlapping closed
|
||||
-- intervals of Emoji characters. emoji_wide contains all the characters
|
||||
-- which don't have ambiguous or double width, and emoji_all has all Emojis.
|
||||
if arg[1] == '--help' then
|
||||
print('Usage:')
|
||||
print(' gen_unicode_tables.lua unicode/ unicode_tables.generated.h')
|
||||
os.exit(0)
|
||||
end
|
||||
|
||||
local basedir = arg[1]
|
||||
local pathsep = package.config:sub(1, 1)
|
||||
local get_path = function(fname)
|
||||
return basedir .. pathsep .. fname
|
||||
end
|
||||
|
||||
local unicodedata_fname = get_path('UnicodeData.txt')
|
||||
local eastasianwidth_fname = get_path('EastAsianWidth.txt')
|
||||
local emoji_fname = get_path('emoji-data.txt')
|
||||
|
||||
local utf_tables_fname = arg[2]
|
||||
|
||||
local split_on_semicolons = function(s)
|
||||
local ret = {}
|
||||
local idx = 1
|
||||
while idx <= #s + 1 do
|
||||
local item = s:match('^[^;]*', idx)
|
||||
idx = idx + #item + 1
|
||||
if idx <= #s + 1 then
|
||||
assert(s:sub(idx - 1, idx - 1) == ';')
|
||||
end
|
||||
item = item:gsub('^%s*', '')
|
||||
item = item:gsub('%s*$', '')
|
||||
table.insert(ret, item)
|
||||
end
|
||||
return ret
|
||||
end
|
||||
|
||||
local fp_lines_to_lists = function(fp, n, has_comments)
|
||||
local ret = {}
|
||||
local line
|
||||
local i = 0
|
||||
while true do
|
||||
i = i + 1
|
||||
line = fp:read('*l')
|
||||
if not line then
|
||||
break
|
||||
end
|
||||
if not has_comments or (line:sub(1, 1) ~= '#' and not line:match('^%s*$')) then
|
||||
local l = split_on_semicolons(line)
|
||||
if #l ~= n then
|
||||
io.stderr:write(('Found %s items in line %u, expected %u\n'):format(#l, i, n))
|
||||
io.stderr:write('Line: ' .. line .. '\n')
|
||||
return nil
|
||||
end
|
||||
table.insert(ret, l)
|
||||
end
|
||||
end
|
||||
return ret
|
||||
end
|
||||
|
||||
local parse_data_to_props = function(ud_fp)
|
||||
return fp_lines_to_lists(ud_fp, 15, false)
|
||||
end
|
||||
|
||||
local parse_width_props = function(eaw_fp)
|
||||
return fp_lines_to_lists(eaw_fp, 2, true)
|
||||
end
|
||||
|
||||
local parse_emoji_props = function(emoji_fp)
|
||||
return fp_lines_to_lists(emoji_fp, 2, true)
|
||||
end
|
||||
|
||||
local make_range = function(start, end_, step, add)
|
||||
if step and add then
|
||||
return (' {0x%x, 0x%x, %d, %d},\n'):format(start, end_, step == 0 and -1 or step, add)
|
||||
else
|
||||
return (' {0x%04x, 0x%04x},\n'):format(start, end_)
|
||||
end
|
||||
end
|
||||
|
||||
local build_combining_table = function(ut_fp, dataprops)
|
||||
ut_fp:write('static const struct interval combining[] = {\n')
|
||||
local start = -1
|
||||
local end_ = -1
|
||||
for _, p in ipairs(dataprops) do
|
||||
-- The 'Mc' property was removed, it does take up space.
|
||||
if ({ Mn = true, Me = true })[p[3]] then
|
||||
local n = tonumber(p[1], 16)
|
||||
if start >= 0 and end_ + 1 == n then
|
||||
-- Continue with the same range.
|
||||
end_ = n
|
||||
else
|
||||
if start >= 0 then
|
||||
-- Produce previous range.
|
||||
ut_fp:write(make_range(start, end_))
|
||||
end
|
||||
start = n
|
||||
end_ = n
|
||||
end
|
||||
end
|
||||
end
|
||||
if start >= 0 then
|
||||
ut_fp:write(make_range(start, end_))
|
||||
end
|
||||
ut_fp:write('};\n')
|
||||
end
|
||||
|
||||
local build_width_table = function(ut_fp, dataprops, widthprops, widths, table_name)
|
||||
ut_fp:write('static const struct interval ' .. table_name .. '[] = {\n')
|
||||
local start = -1
|
||||
local end_ = -1
|
||||
local dataidx = 1
|
||||
local ret = {}
|
||||
for _, p in ipairs(widthprops) do
|
||||
if widths[p[2]:sub(1, 1)] then
|
||||
local rng_start, rng_end = p[1]:find('%.%.')
|
||||
local n, n_last
|
||||
if rng_start then
|
||||
-- It is a range. We don’t check for composing char then.
|
||||
n = tonumber(p[1]:sub(1, rng_start - 1), 16)
|
||||
n_last = tonumber(p[1]:sub(rng_end + 1), 16)
|
||||
else
|
||||
n = tonumber(p[1], 16)
|
||||
n_last = n
|
||||
end
|
||||
local dn
|
||||
while true do
|
||||
dn = tonumber(dataprops[dataidx][1], 16)
|
||||
if dn >= n then
|
||||
break
|
||||
end
|
||||
dataidx = dataidx + 1
|
||||
end
|
||||
if dn ~= n and n_last == n then
|
||||
io.stderr:write('Cannot find character ' .. n .. ' in data table.\n')
|
||||
end
|
||||
-- Only use the char when it’s not a composing char.
|
||||
-- But use all chars from a range.
|
||||
local dp = dataprops[dataidx]
|
||||
if (n_last > n) or not ({ Mn = true, Mc = true, Me = true })[dp[3]] then
|
||||
if start >= 0 and end_ + 1 == n then -- luacheck: ignore 542
|
||||
-- Continue with the same range.
|
||||
else
|
||||
if start >= 0 then
|
||||
ut_fp:write(make_range(start, end_))
|
||||
table.insert(ret, { start, end_ })
|
||||
end
|
||||
start = n
|
||||
end
|
||||
end_ = n_last
|
||||
end
|
||||
end
|
||||
end
|
||||
if start >= 0 then
|
||||
ut_fp:write(make_range(start, end_))
|
||||
table.insert(ret, { start, end_ })
|
||||
end
|
||||
ut_fp:write('};\n')
|
||||
return ret
|
||||
end
|
||||
|
||||
local build_emoji_table = function(ut_fp, emojiprops, doublewidth, ambiwidth)
|
||||
local emojiwidth = {}
|
||||
local emoji = {}
|
||||
for _, p in ipairs(emojiprops) do
|
||||
if p[2]:match('Emoji%s+#') then
|
||||
local rng_start, rng_end = p[1]:find('%.%.')
|
||||
local n
|
||||
local n_last
|
||||
if rng_start then
|
||||
n = tonumber(p[1]:sub(1, rng_start - 1), 16)
|
||||
n_last = tonumber(p[1]:sub(rng_end + 1), 16)
|
||||
else
|
||||
n = tonumber(p[1], 16)
|
||||
n_last = n
|
||||
end
|
||||
if #emoji > 0 and n - 1 == emoji[#emoji][2] then
|
||||
emoji[#emoji][2] = n_last
|
||||
else
|
||||
table.insert(emoji, { n, n_last })
|
||||
end
|
||||
|
||||
-- Characters below 1F000 may be considered single width traditionally,
|
||||
-- making them double width causes problems.
|
||||
if n >= 0x1f000 then
|
||||
-- exclude characters that are in the ambiguous/doublewidth table
|
||||
for _, ambi in ipairs(ambiwidth) do
|
||||
if n >= ambi[1] and n <= ambi[2] then
|
||||
n = ambi[2] + 1
|
||||
end
|
||||
if n_last >= ambi[1] and n_last <= ambi[2] then
|
||||
n_last = ambi[1] - 1
|
||||
end
|
||||
end
|
||||
for _, double in ipairs(doublewidth) do
|
||||
if n >= double[1] and n <= double[2] then
|
||||
n = double[2] + 1
|
||||
end
|
||||
if n_last >= double[1] and n_last <= double[2] then
|
||||
n_last = double[1] - 1
|
||||
end
|
||||
end
|
||||
|
||||
if n <= n_last then
|
||||
if #emojiwidth > 0 and n - 1 == emojiwidth[#emojiwidth][2] then
|
||||
emojiwidth[#emojiwidth][2] = n_last
|
||||
else
|
||||
table.insert(emojiwidth, { n, n_last })
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
ut_fp:write('static const struct interval emoji_all[] = {\n')
|
||||
for _, p in ipairs(emoji) do
|
||||
ut_fp:write(make_range(p[1], p[2]))
|
||||
end
|
||||
ut_fp:write('};\n')
|
||||
|
||||
ut_fp:write('static const struct interval emoji_wide[] = {\n')
|
||||
for _, p in ipairs(emojiwidth) do
|
||||
ut_fp:write(make_range(p[1], p[2]))
|
||||
end
|
||||
ut_fp:write('};\n')
|
||||
end
|
||||
|
||||
local ud_fp = io.open(unicodedata_fname, 'r')
|
||||
local dataprops = parse_data_to_props(ud_fp)
|
||||
ud_fp:close()
|
||||
|
||||
local ut_fp = io.open(utf_tables_fname, 'w')
|
||||
|
||||
build_combining_table(ut_fp, dataprops)
|
||||
|
||||
local eaw_fp = io.open(eastasianwidth_fname, 'r')
|
||||
local widthprops = parse_width_props(eaw_fp)
|
||||
eaw_fp:close()
|
||||
|
||||
local doublewidth =
|
||||
build_width_table(ut_fp, dataprops, widthprops, { W = true, F = true }, 'doublewidth')
|
||||
local ambiwidth = build_width_table(ut_fp, dataprops, widthprops, { A = true }, 'ambiguous')
|
||||
|
||||
local emoji_fp = io.open(emoji_fname, 'r')
|
||||
local emojiprops = parse_emoji_props(emoji_fp)
|
||||
emoji_fp:close()
|
||||
|
||||
build_emoji_table(ut_fp, emojiprops, doublewidth, ambiwidth)
|
||||
|
||||
ut_fp:close()
|
@ -186,6 +186,24 @@ size_t schar_len(schar_T sc)
|
||||
}
|
||||
}
|
||||
|
||||
int schar_cells(schar_T sc)
|
||||
{
|
||||
// hot path
|
||||
#ifdef ORDER_BIG_ENDIAN
|
||||
if (!(sc & 0x80FFFFFF)) {
|
||||
return 1;
|
||||
}
|
||||
#else
|
||||
if (sc < 0x80) {
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
char sc_buf[MAX_SCHAR_SIZE];
|
||||
schar_get(sc_buf, sc);
|
||||
return utf_ptr2cells(sc_buf);
|
||||
}
|
||||
|
||||
/// gets first raw UTF-8 byte of an schar
|
||||
static char schar_get_first_byte(schar_T sc)
|
||||
{
|
||||
@ -428,14 +446,19 @@ int grid_line_puts(int col, const char *text, int textlen, int attr)
|
||||
const int max_col = grid_line_maxcol;
|
||||
while (col < max_col && (len < 0 || (int)(ptr - text) < len) && *ptr != NUL) {
|
||||
// check if this is the first byte of a multibyte
|
||||
int mbyte_blen = len > 0
|
||||
? utfc_ptr2len_len(ptr, (int)((text + len) - ptr))
|
||||
: utfc_ptr2len(ptr);
|
||||
int mbyte_blen;
|
||||
if (len >= 0) {
|
||||
int maxlen = (int)((text + len) - ptr);
|
||||
mbyte_blen = utfc_ptr2len_len(ptr, maxlen);
|
||||
if (mbyte_blen > maxlen) {
|
||||
mbyte_blen = 1;
|
||||
}
|
||||
} else {
|
||||
mbyte_blen = utfc_ptr2len(ptr);
|
||||
}
|
||||
int firstc;
|
||||
schar_T schar = len >= 0
|
||||
? utfc_ptr2schar_len(ptr, (int)((text + len) - ptr), &firstc)
|
||||
: utfc_ptr2schar(ptr, &firstc);
|
||||
int mbyte_cells = utf_char2cells(firstc);
|
||||
schar_T schar = utfc_ptrlen2schar(ptr, mbyte_blen, &firstc);
|
||||
int mbyte_cells = utf_ptr2cells_len(ptr, mbyte_blen);
|
||||
if (mbyte_cells > 2 || schar == 0) {
|
||||
mbyte_cells = 1;
|
||||
schar = schar_from_char(0xFFFD);
|
||||
|
@ -144,6 +144,7 @@ static const char e_missing_argument_str[]
|
||||
static const char *highlight_init_both[] = {
|
||||
"Cursor guifg=bg guibg=fg",
|
||||
"CursorLineNr gui=bold cterm=bold",
|
||||
"PmenuSel gui=reverse cterm=reverse,underline blend=0",
|
||||
"RedrawDebugNormal gui=reverse cterm=reverse",
|
||||
"TabLineSel gui=bold cterm=bold",
|
||||
"TermCursor gui=reverse cterm=reverse",
|
||||
@ -358,7 +359,6 @@ static const char *highlight_init_light[] = {
|
||||
"NonText guifg=NvimLightGrey4",
|
||||
"NormalFloat guibg=NvimLightGrey1",
|
||||
"Pmenu guibg=NvimLightGrey3 cterm=reverse",
|
||||
"PmenuSel guifg=NvimLightGrey3 guibg=NvimDarkGrey2 cterm=reverse,underline blend=0",
|
||||
"PmenuThumb guibg=NvimLightGrey4",
|
||||
"Question guifg=NvimDarkCyan ctermfg=6",
|
||||
"QuickFixLine guifg=NvimDarkCyan ctermfg=6",
|
||||
@ -443,7 +443,6 @@ static const char *highlight_init_dark[] = {
|
||||
"NonText guifg=NvimDarkGrey4",
|
||||
"NormalFloat guibg=NvimDarkGrey1",
|
||||
"Pmenu guibg=NvimDarkGrey3 cterm=reverse",
|
||||
"PmenuSel guifg=NvimDarkGrey3 guibg=NvimLightGrey2 cterm=reverse,underline blend=0",
|
||||
"PmenuThumb guibg=NvimDarkGrey4",
|
||||
"Question guifg=NvimLightCyan ctermfg=14",
|
||||
"QuickFixLine guifg=NvimLightCyan ctermfg=14",
|
||||
|
@ -891,7 +891,17 @@ int get_breakindent_win(win_T *wp, char *line)
|
||||
if (wp->w_briopt_list > 0) {
|
||||
prev_list += wp->w_briopt_list;
|
||||
} else {
|
||||
prev_indent = (int)(*regmatch.endp - *regmatch.startp);
|
||||
char *ptr = *regmatch.startp;
|
||||
char *end_ptr = *regmatch.endp;
|
||||
int indent = 0;
|
||||
// Compute the width of the matched text.
|
||||
// Use win_chartabsize() so that TAB size is correct,
|
||||
// while wrapping is ignored.
|
||||
while (ptr < end_ptr) {
|
||||
indent += win_chartabsize(wp, ptr, indent);
|
||||
MB_PTR_ADV(ptr);
|
||||
}
|
||||
prev_indent = indent;
|
||||
}
|
||||
}
|
||||
vim_regfree(regmatch.regprog);
|
||||
@ -1407,7 +1417,7 @@ void fixthisline(IndentGetter get_the_indent)
|
||||
return;
|
||||
}
|
||||
|
||||
change_indent(INDENT_SET, amount, false, 0, true);
|
||||
change_indent(INDENT_SET, amount, false, true);
|
||||
if (linewhite(curwin->w_cursor.lnum)) {
|
||||
did_ai = true; // delete the indent if the line stays empty
|
||||
}
|
||||
|
@ -172,6 +172,7 @@ struct compl_S {
|
||||
int cp_number; ///< sequence number
|
||||
int cp_score; ///< fuzzy match score
|
||||
int cp_user_hlattr; ///< highlight attribute to combine with
|
||||
int cp_user_kind_hlattr; ///< highlight attribute for kind
|
||||
};
|
||||
|
||||
/// state information used for getting the next set of insert completion
|
||||
@ -764,7 +765,7 @@ int ins_compl_add_infercase(char *str_arg, int len, bool icase, char *fname, Dir
|
||||
flags |= CP_ICASE;
|
||||
}
|
||||
|
||||
int res = ins_compl_add(str, len, fname, NULL, false, NULL, dir, flags, false, -1);
|
||||
int res = ins_compl_add(str, len, fname, NULL, false, NULL, dir, flags, false, -1, -1);
|
||||
xfree(tofree);
|
||||
return res;
|
||||
}
|
||||
@ -804,7 +805,7 @@ static inline void free_cptext(char *const *const cptext)
|
||||
/// returned in case of error.
|
||||
static int ins_compl_add(char *const str, int len, char *const fname, char *const *const cptext,
|
||||
const bool cptext_allocated, typval_T *user_data, const Direction cdir,
|
||||
int flags_arg, const bool adup, int user_hlattr)
|
||||
int flags_arg, const bool adup, int user_hlattr, int user_kind_hlattr)
|
||||
FUNC_ATTR_NONNULL_ARG(1)
|
||||
{
|
||||
compl_T *match;
|
||||
@ -871,6 +872,7 @@ static int ins_compl_add(char *const str, int len, char *const fname, char *cons
|
||||
}
|
||||
match->cp_flags = flags;
|
||||
match->cp_user_hlattr = user_hlattr;
|
||||
match->cp_user_kind_hlattr = user_kind_hlattr;
|
||||
|
||||
if (cptext != NULL) {
|
||||
int i;
|
||||
@ -1004,7 +1006,7 @@ static void ins_compl_add_matches(int num_matches, char **matches, int icase)
|
||||
for (int i = 0; i < num_matches && add_r != FAIL; i++) {
|
||||
if ((add_r = ins_compl_add(matches[i], -1, NULL, NULL, false, NULL, dir,
|
||||
CP_FAST | (icase ? CP_ICASE : 0),
|
||||
false, -1)) == OK) {
|
||||
false, -1, -1)) == OK) {
|
||||
// If dir was BACKWARD then honor it just once.
|
||||
dir = FORWARD;
|
||||
}
|
||||
@ -1242,7 +1244,9 @@ static int ins_compl_build_pum(void)
|
||||
if (comp->cp_score > max_fuzzy_score) {
|
||||
did_find_shown_match = true;
|
||||
max_fuzzy_score = comp->cp_score;
|
||||
compl_shown_match = comp;
|
||||
if (!compl_no_select) {
|
||||
compl_shown_match = comp;
|
||||
}
|
||||
}
|
||||
|
||||
if (!shown_match_ok && comp == compl_shown_match && !compl_no_select) {
|
||||
@ -1272,6 +1276,7 @@ static int ins_compl_build_pum(void)
|
||||
compl_match_array[i].pum_info = comp->cp_text[CPT_INFO];
|
||||
compl_match_array[i].pum_score = comp->cp_score;
|
||||
compl_match_array[i].pum_user_hlattr = comp->cp_user_hlattr;
|
||||
compl_match_array[i].pum_user_kind_hlattr = comp->cp_user_kind_hlattr;
|
||||
if (comp->cp_text[CPT_MENU] != NULL) {
|
||||
compl_match_array[i++].pum_extra = comp->cp_text[CPT_MENU];
|
||||
} else {
|
||||
@ -1789,6 +1794,13 @@ int ins_compl_bs(void)
|
||||
return NUL;
|
||||
}
|
||||
|
||||
/// Check if the complete function returned "always" in the "refresh" dictionary item.
|
||||
static bool ins_compl_refresh_always(void)
|
||||
FUNC_ATTR_PURE
|
||||
{
|
||||
return (ctrl_x_mode_function() || ctrl_x_mode_omni()) && compl_opt_refresh_always;
|
||||
}
|
||||
|
||||
/// Check that we need to find matches again, ins_compl_restart() is to
|
||||
/// be called.
|
||||
static bool ins_compl_need_restart(void)
|
||||
@ -1796,9 +1808,7 @@ static bool ins_compl_need_restart(void)
|
||||
{
|
||||
// Return true if we didn't complete finding matches or when the
|
||||
// "completefunc" returned "always" in the "refresh" dictionary item.
|
||||
return compl_was_interrupted
|
||||
|| ((ctrl_x_mode_function() || ctrl_x_mode_omni())
|
||||
&& compl_opt_refresh_always);
|
||||
return compl_was_interrupted || ins_compl_refresh_always();
|
||||
}
|
||||
|
||||
/// Called after changing "compl_leader".
|
||||
@ -1831,7 +1841,7 @@ static void ins_compl_new_leader(void)
|
||||
|
||||
// Don't let Enter select the original text when there is no popup menu.
|
||||
// Don't let Enter select when use user function and refresh_always is set
|
||||
if (compl_match_array == NULL || ins_compl_need_restart()) {
|
||||
if (compl_match_array == NULL || ins_compl_refresh_always()) {
|
||||
compl_enter_selects = false;
|
||||
}
|
||||
}
|
||||
@ -2539,6 +2549,14 @@ theend:
|
||||
}
|
||||
}
|
||||
|
||||
static inline int get_user_highlight_attr(const char *hlname)
|
||||
{
|
||||
if (hlname != NULL && *hlname != NUL) {
|
||||
return syn_name2attr(hlname);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/// Add a match to the list of matches from Vimscript object
|
||||
///
|
||||
/// @param[in] tv Object to get matches from.
|
||||
@ -2557,7 +2575,9 @@ static int ins_compl_add_tv(typval_T *const tv, const Direction dir, bool fast)
|
||||
int flags = fast ? CP_FAST : 0;
|
||||
char *(cptext[CPT_COUNT]);
|
||||
char *user_hlname = NULL;
|
||||
char *user_kind_hlname = NULL;
|
||||
int user_hlattr = -1;
|
||||
int user_kind_hlattr = -1;
|
||||
typval_T user_data;
|
||||
|
||||
user_data.v_type = VAR_UNKNOWN;
|
||||
@ -2567,10 +2587,13 @@ static int ins_compl_add_tv(typval_T *const tv, const Direction dir, bool fast)
|
||||
cptext[CPT_MENU] = tv_dict_get_string(tv->vval.v_dict, "menu", true);
|
||||
cptext[CPT_KIND] = tv_dict_get_string(tv->vval.v_dict, "kind", true);
|
||||
cptext[CPT_INFO] = tv_dict_get_string(tv->vval.v_dict, "info", true);
|
||||
|
||||
user_hlname = tv_dict_get_string(tv->vval.v_dict, "hl_group", false);
|
||||
if (user_hlname != NULL && *user_hlname != NUL) {
|
||||
user_hlattr = syn_name2attr(user_hlname);
|
||||
}
|
||||
user_hlattr = get_user_highlight_attr(user_hlname);
|
||||
|
||||
user_kind_hlname = tv_dict_get_string(tv->vval.v_dict, "kind_hlgroup", false);
|
||||
user_kind_hlattr = get_user_highlight_attr(user_kind_hlname);
|
||||
|
||||
tv_dict_get_tv(tv->vval.v_dict, "user_data", &user_data);
|
||||
|
||||
if (tv_dict_get_number(tv->vval.v_dict, "icase")) {
|
||||
@ -2592,7 +2615,7 @@ static int ins_compl_add_tv(typval_T *const tv, const Direction dir, bool fast)
|
||||
return FAIL;
|
||||
}
|
||||
int status = ins_compl_add((char *)word, -1, NULL, cptext, true,
|
||||
&user_data, dir, flags, dup, user_hlattr);
|
||||
&user_data, dir, flags, dup, user_hlattr, user_kind_hlattr);
|
||||
if (status != OK) {
|
||||
tv_clear(&user_data);
|
||||
}
|
||||
@ -2685,7 +2708,7 @@ static void set_completion(colnr_T startcol, list_T *list)
|
||||
flags |= CP_ICASE;
|
||||
}
|
||||
if (ins_compl_add(compl_orig_text, -1, NULL, NULL, false, NULL, 0,
|
||||
flags | CP_FAST, false, -1) != OK) {
|
||||
flags | CP_FAST, false, -1, -1) != OK) {
|
||||
return;
|
||||
}
|
||||
|
||||
@ -3430,7 +3453,7 @@ static void get_next_bufname_token(void)
|
||||
char *tail = path_tail(b->b_sfname);
|
||||
if (strncmp(tail, compl_orig_text, strlen(compl_orig_text)) == 0) {
|
||||
ins_compl_add(tail, (int)strlen(tail), NULL, NULL, false, NULL, 0,
|
||||
p_ic ? CP_ICASE : 0, false, -1);
|
||||
p_ic ? CP_ICASE : 0, false, -1, -1);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -4468,7 +4491,7 @@ static int ins_compl_start(void)
|
||||
flags |= CP_ICASE;
|
||||
}
|
||||
if (ins_compl_add(compl_orig_text, -1, NULL, NULL, false, NULL, 0,
|
||||
flags, false, -1) != OK) {
|
||||
flags, false, -1, -1) != OK) {
|
||||
XFREE_CLEAR(compl_pattern);
|
||||
compl_patternlen = 0;
|
||||
XFREE_CLEAR(compl_orig_text);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user