mirror of
https://github.com/neovim/neovim.git
synced 2025-09-06 11:28:22 +00:00
Compare commits
89 Commits
release-0.
...
release-0.
Author | SHA1 | Date | |
---|---|---|---|
![]() |
d9dd30a955 | ||
![]() |
b2cef8b665 | ||
![]() |
1de33ce2cd | ||
![]() |
1c3afe4e25 | ||
![]() |
b92399d008 | ||
![]() |
20070310a4 | ||
![]() |
c685a2ef48 | ||
![]() |
018ec2172b | ||
![]() |
87a88c8e42 | ||
![]() |
47b84599df | ||
![]() |
40dc1ba85c | ||
![]() |
ee77d8665f | ||
![]() |
a09b3cbcb1 | ||
![]() |
23c99bb78f | ||
![]() |
fd02e63513 | ||
![]() |
0547b4cdad | ||
![]() |
052337ddfc | ||
![]() |
82283a3d10 | ||
![]() |
704151c8a2 | ||
![]() |
e4629f203f | ||
![]() |
ce3db4648a | ||
![]() |
f558af8b18 | ||
![]() |
cda119055a | ||
![]() |
8399f73574 | ||
![]() |
faaf83a49e | ||
![]() |
0493fa00fa | ||
![]() |
6b38b9e4c6 | ||
![]() |
047e36695f | ||
![]() |
e1cc8e8e09 | ||
![]() |
49469ec6b9 | ||
![]() |
5e47cf27b4 | ||
![]() |
dd0a3cd22f | ||
![]() |
10590e4b20 | ||
![]() |
b4a10dd9b2 | ||
![]() |
dd7206af37 | ||
![]() |
92e80f18a8 | ||
![]() |
5d41bfccec | ||
![]() |
641e229132 | ||
![]() |
f225028a0d | ||
![]() |
02dae63bf7 | ||
![]() |
6274f06aba | ||
![]() |
47bd62c15c | ||
![]() |
d2730365ef | ||
![]() |
284b398eb9 | ||
![]() |
2645669c89 | ||
![]() |
b5cee56757 | ||
![]() |
d56f6fed9c | ||
![]() |
910cdac22c | ||
![]() |
23a64c95d8 | ||
![]() |
1b2666cd21 | ||
![]() |
1bf90bf9d3 | ||
![]() |
fafd636267 | ||
![]() |
ef71c89129 | ||
![]() |
972dd758cb | ||
![]() |
d379db428b | ||
![]() |
4c48cf3020 | ||
![]() |
2cd1ff762e | ||
![]() |
941dc1b0ca | ||
![]() |
b99dad7b4c | ||
![]() |
1def94597b | ||
![]() |
b678d33dd3 | ||
![]() |
a012387074 | ||
![]() |
599ad5d3b8 | ||
![]() |
924fa143cc | ||
![]() |
327e8ddb18 | ||
![]() |
a1f557690f | ||
![]() |
f2f37712a4 | ||
![]() |
4f452a6744 | ||
![]() |
9571a87d3d | ||
![]() |
3817518ab4 | ||
![]() |
56d9412999 | ||
![]() |
ddd3363a42 | ||
![]() |
d453d2c484 | ||
![]() |
c5d1b0f3da | ||
![]() |
e0622b4c65 | ||
![]() |
b781f2b072 | ||
![]() |
e63fdf63ba | ||
![]() |
eef3809067 | ||
![]() |
43f4955f70 | ||
![]() |
6f693be1ee | ||
![]() |
36e2846b49 | ||
![]() |
60b56ed458 | ||
![]() |
8250d6795b | ||
![]() |
38d02d58b2 | ||
![]() |
7d6aa82b69 | ||
![]() |
6c65f8f182 | ||
![]() |
6cb5ffc075 | ||
![]() |
baa5263b56 | ||
![]() |
2abdb89522 |
@@ -1,44 +0,0 @@
|
|||||||
image: freebsd/12.x
|
|
||||||
|
|
||||||
packages:
|
|
||||||
- cmake
|
|
||||||
- gmake
|
|
||||||
- ninja
|
|
||||||
- libtool
|
|
||||||
- sha
|
|
||||||
- automake
|
|
||||||
- pkgconf
|
|
||||||
- unzip
|
|
||||||
- wget
|
|
||||||
- gettext
|
|
||||||
- python
|
|
||||||
- libffi
|
|
||||||
|
|
||||||
sources:
|
|
||||||
- https://github.com/neovim/neovim
|
|
||||||
|
|
||||||
environment:
|
|
||||||
SOURCEHUT: 1
|
|
||||||
LANG: en_US.UTF-8
|
|
||||||
CMAKE_EXTRA_FLAGS: -DCI_BUILD=ON -DMIN_LOG_LEVEL=3
|
|
||||||
|
|
||||||
tasks:
|
|
||||||
- build-deps: |
|
|
||||||
cd neovim
|
|
||||||
gmake deps
|
|
||||||
- build: |
|
|
||||||
cd neovim
|
|
||||||
gmake CMAKE_BUILD_TYPE=RelWithDebInfo CMAKE_EXTRA_FLAGS="${CMAKE_EXTRA_FLAGS}" nvim
|
|
||||||
- functionaltest: |
|
|
||||||
cd neovim
|
|
||||||
gmake functionaltest
|
|
||||||
- unittest: |
|
|
||||||
cd neovim
|
|
||||||
gmake unittest
|
|
||||||
|
|
||||||
# Unfortunately, oldtest is tanking hard on sourcehut's FreeBSD instance
|
|
||||||
# and not producing any logs as a result. So don't do this task for now.
|
|
||||||
# Ref: https://github.com/neovim/neovim/pull/11477#discussion_r352095005.
|
|
||||||
# - test-oldtest: |
|
|
||||||
# cd neovim
|
|
||||||
# gmake oldtest
|
|
@@ -1,43 +1,41 @@
|
|||||||
# sourcehut CI: https://builds.sr.ht/~jmk/neovim
|
# sourcehut CI: https://builds.sr.ht/~jmk/neovim
|
||||||
|
|
||||||
image: openbsd/6.9
|
image: openbsd/6.7
|
||||||
|
|
||||||
packages:
|
packages:
|
||||||
- autoconf-2.71
|
- autoconf-2.69p2
|
||||||
- automake-1.16.3
|
- automake-1.15.1
|
||||||
- cmake
|
- cmake
|
||||||
- gettext-runtime-0.21p1
|
- gettext-runtime-0.20.1p1
|
||||||
- gettext-tools-0.21p1
|
- gettext-tools-0.20.1p3
|
||||||
- gmake
|
- gmake
|
||||||
- libtool
|
- libtool
|
||||||
- ninja-1.10.2p0
|
- ninja-1.10.0
|
||||||
- unzip-6.0p14
|
- unzip-6.0p13
|
||||||
|
|
||||||
sources:
|
sources:
|
||||||
- https://github.com/neovim/neovim
|
- https://github.com/neovim/neovim
|
||||||
|
|
||||||
environment:
|
|
||||||
SOURCEHUT: 1
|
|
||||||
LC_CTYPE: en_US.UTF-8
|
|
||||||
CMAKE_EXTRA_FLAGS: -DCI_BUILD=ON -DMIN_LOG_LEVEL=3
|
|
||||||
|
|
||||||
tasks:
|
tasks:
|
||||||
- build-deps: |
|
|
||||||
export AUTOCONF_VERSION=2.71
|
|
||||||
export AUTOMAKE_VERSION=1.16
|
|
||||||
mkdir neovim/.deps
|
|
||||||
cd neovim/.deps
|
|
||||||
cmake -G Ninja ../third-party/
|
|
||||||
cmake --build . --config RelWithDebInfo
|
|
||||||
- build: |
|
- build: |
|
||||||
mkdir neovim/build
|
export AUTOCONF_VERSION=2.69
|
||||||
cd neovim/build
|
export AUTOMAKE_VERSION=1.15
|
||||||
cmake -G Ninja $CMAKE_EXTRA_FLAGS ..
|
|
||||||
cmake --build . --config RelWithDebInfo
|
|
||||||
./bin/nvim --version
|
|
||||||
- functionaltest: |
|
|
||||||
cd neovim/build
|
|
||||||
cmake --build . --config RelWithDebInfo --target functionaltest
|
|
||||||
- oldtest: |
|
|
||||||
cd neovim
|
cd neovim
|
||||||
|
mkdir .deps
|
||||||
|
cd .deps
|
||||||
|
cmake -G Ninja ../third-party/
|
||||||
|
cmake --build . --config Debug
|
||||||
|
cd ..
|
||||||
|
mkdir build
|
||||||
|
cd build
|
||||||
|
cmake -G Ninja -DMIN_LOG_LEVEL=3 ..
|
||||||
|
cmake --build . --config Debug
|
||||||
|
./bin/nvim --version
|
||||||
|
- test: |
|
||||||
|
export LC_CTYPE=en_US.UTF-8
|
||||||
|
# functional tests
|
||||||
|
cd neovim/build
|
||||||
|
# cmake --build . --config Debug --target functionaltest
|
||||||
|
# oldtests
|
||||||
|
cd ..
|
||||||
gmake oldtest
|
gmake oldtest
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
BasedOnStyle: Google
|
BasedOnStyle: Google
|
||||||
Language: Cpp
|
Language: Cpp
|
||||||
ColumnLimit: 100
|
ColumnLimit: 80
|
||||||
IndentWidth: 2
|
IndentWidth: 2
|
||||||
TabWidth: 2
|
TabWidth: 2
|
||||||
UseTab: Never
|
UseTab: Never
|
||||||
|
2
.clangd
2
.clangd
@@ -1,2 +0,0 @@
|
|||||||
CompileFlags:
|
|
||||||
CompilationDatabase: build/ # Search build/ directory for compile_commands.json
|
|
@@ -1,38 +0,0 @@
|
|||||||
# To use this file (requires git 2.23):
|
|
||||||
# git config blame.ignoreRevsFile .git-blame-ignore-revs
|
|
||||||
|
|
||||||
# eval.c: factor out eval/funcs.c #11828
|
|
||||||
# - This is a move/rename. git 2.33 doesn't know how to ignore it.
|
|
||||||
# It is here anyway, (1) in case git improves later, and (2) to
|
|
||||||
# save you the trouble of attempting this.
|
|
||||||
6c5bbf07d988ef55e5e8ba8d70b62c1f0885261b
|
|
||||||
|
|
||||||
# symbol renames
|
|
||||||
6186df3562e33e92f04ed8c850204ceabc4746e1
|
|
||||||
|
|
||||||
# style (uncrustify, etc.)
|
|
||||||
2d240024acbd68c2d3f82bc72cb12b1a4928c6bf
|
|
||||||
61178778230e609d68b271ffd53ffd993cd23c42
|
|
||||||
15af08ad176339d1f269ce264bb0efea283c9536
|
|
||||||
47f99d66440ae8be26b34531989ac61edc1ad9fe
|
|
||||||
1e49a1c888a3d9a581f4aa409a26ada3ac2417cb
|
|
||||||
3b3dbcf7b7ba5466e6ab643e256f2374b520a6b2
|
|
||||||
e8067d1490a31ff76143d576dc9948b4f09c6c55
|
|
||||||
d5b66e88601b4d2fde5d905f9d12847126ba4449
|
|
||||||
07715044887d82f74254e64c4c32fa49b0501bea
|
|
||||||
6ed43f8f1caad702f9590d174c5ec142f3d85b18
|
|
||||||
0a83017fe95df0290adb98ec6bf457b96a3fab17
|
|
||||||
867e8885991ae450019c18aa5e42546bd4b62c2c
|
|
||||||
1f49268c46fcbe65f7e2e2cb620e6f51c059cf9e
|
|
||||||
51a98aa0c2fe3231a0ffc8a78189bc6fafd6abf6
|
|
||||||
853346a94d6aa78c97314a3b217fb5a5408a47f1
|
|
||||||
30fefee684e641a0c6867446c6de30efa2f0a126
|
|
||||||
f4ca3a29ddcb0c98e8e09c45a6342af709f8cc45
|
|
||||||
48e67b229415b4e2b3315bd00b817e5f9ab970c8
|
|
||||||
7a26eb8a567cbc831d4f629f9eccb767a44436b8
|
|
||||||
2f9b9e61d7417183f2d9f36d804247c0926be9d4
|
|
||||||
c0767bd4f3ce7b34bb77da0657c49ba10ba1b32e
|
|
||||||
d90fb1c0bfc1e64c783c385a79e7de87013dadba
|
|
||||||
9c268263b1792d00b3ffdfd7495af2575862656e
|
|
||||||
8c74c895b300bcee5fa937a2329d1d4756567b42
|
|
||||||
40be47e0faef7aa015eb4ba44ceb1ee1a03e97cf
|
|
5
.gitattributes
vendored
5
.gitattributes
vendored
@@ -1,6 +1 @@
|
|||||||
*.h linguist-language=C
|
*.h linguist-language=C
|
||||||
src/nvim/testdir/test42.in diff
|
|
||||||
.github/ export-ignore
|
|
||||||
.travis.yml export-ignore
|
|
||||||
codecov.yml export-ignore
|
|
||||||
.builds/ export-ignore
|
|
||||||
|
3
.github/FUNDING.yml
vendored
3
.github/FUNDING.yml
vendored
@@ -1,2 +1 @@
|
|||||||
github: neovim
|
custom: https://salt.bountysource.com/teams/neovim
|
||||||
open_collective: neovim
|
|
||||||
|
29
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
29
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Report a problem in Nvim
|
||||||
|
title: ''
|
||||||
|
labels: bug
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- Before reporting: search existing issues and check the FAQ. -->
|
||||||
|
|
||||||
|
- `nvim --version`:
|
||||||
|
- `vim -u DEFAULTS` (version: ) behaves differently?
|
||||||
|
- Operating system/version:
|
||||||
|
- Terminal name/version:
|
||||||
|
- `$TERM`:
|
||||||
|
|
||||||
|
### Steps to reproduce using `nvim -u NORC`
|
||||||
|
|
||||||
|
```
|
||||||
|
nvim -u NORC
|
||||||
|
# Alternative for shell-related problems:
|
||||||
|
# env -i TERM=ansi-256color "$(which nvim)"
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### Actual behaviour
|
||||||
|
|
||||||
|
### Expected behaviour
|
||||||
|
|
75
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
75
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@@ -1,75 +0,0 @@
|
|||||||
name: Bug Report
|
|
||||||
description: Report a problem in Neovim
|
|
||||||
labels: [bug]
|
|
||||||
body:
|
|
||||||
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: |
|
|
||||||
_Before reporting:_ search [existing issues](https://github.com/neovim/neovim/issues?q=is%3Aissue+is%3Aopen+label%3Abug) and check the [FAQ](https://github.com/neovim/neovim/wiki/FAQ). Usage questions such as "How do I...?" belong on the [Neovim Discourse](https://neovim.discourse.group/c/7-category/7) and will be closed.
|
|
||||||
|
|
||||||
- type: input
|
|
||||||
attributes:
|
|
||||||
label: "Neovim version (nvim -v)"
|
|
||||||
placeholder: "0.6.0 commit db1b0ee3b30f"
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: input
|
|
||||||
attributes:
|
|
||||||
label: "Vim (not Nvim) behaves the same?"
|
|
||||||
description: "Does `vim -u DEFAULTS` have the same issue? Note the exact Vim version (`8.x.yyyy`)."
|
|
||||||
placeholder: "no, vim 7.3.432"
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: input
|
|
||||||
attributes:
|
|
||||||
label: "Operating system/version"
|
|
||||||
placeholder: "macOS 11.5"
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: input
|
|
||||||
attributes:
|
|
||||||
label: "Terminal name/version"
|
|
||||||
placeholder: "xterm 3.1"
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: input
|
|
||||||
attributes:
|
|
||||||
label: "$TERM environment variable"
|
|
||||||
placeholder: "xterm-256color"
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
|
|
||||||
- type: input
|
|
||||||
attributes:
|
|
||||||
label: "Installation"
|
|
||||||
description: "How did you install neovim: build from repo / system package manager / appimage / homebrew / snap / chocolatey / other (describe)?"
|
|
||||||
placeholder: "Arch User Repository (AUR)"
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: "How to reproduce the issue"
|
|
||||||
description: |
|
|
||||||
- Steps to reproduce using `nvim --clean` ("factory defaults").
|
|
||||||
- For build failures: list the exact steps including CMake flags (if any).
|
|
||||||
- For shell-related problems: try `env -i TERM=ansi-256color "$(which nvim)"`.
|
|
||||||
placeholder: |
|
|
||||||
nvim --clean
|
|
||||||
:edit foo
|
|
||||||
yiwp
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: "Expected behavior"
|
|
||||||
description: "Describe the behavior you expect. May include logs, images, or videos."
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: "Actual behavior"
|
|
||||||
validations:
|
|
||||||
required: true
|
|
5
.github/ISSUE_TEMPLATE/config.yml
vendored
5
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1,5 +0,0 @@
|
|||||||
blank_issues_enabled: false
|
|
||||||
contact_links:
|
|
||||||
- name: Question
|
|
||||||
url: https://neovim.discourse.group/
|
|
||||||
about: Ask questions about configuration and usage of Neovim
|
|
27
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
27
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
---
|
||||||
|
name: Feature request
|
||||||
|
about: Request an enhancement for Nvim
|
||||||
|
title: ''
|
||||||
|
labels: enhancement
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- Before reporting: search existing issues and check the FAQ. -->
|
||||||
|
|
||||||
|
- `nvim --version`:
|
||||||
|
- `vim -u DEFAULTS` (version: ) behaves differently?
|
||||||
|
- Operating system/version:
|
||||||
|
- Terminal name/version:
|
||||||
|
- `$TERM`:
|
||||||
|
|
||||||
|
### Steps to reproduce using `nvim -u NORC`
|
||||||
|
|
||||||
|
```
|
||||||
|
nvim -u NORC
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### Actual behaviour
|
||||||
|
|
||||||
|
### Expected behaviour
|
||||||
|
|
21
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
21
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
@@ -1,21 +0,0 @@
|
|||||||
name: Feature request
|
|
||||||
description: Request an enhancement for Neovim
|
|
||||||
labels: [enhancement]
|
|
||||||
body:
|
|
||||||
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: |
|
|
||||||
Before requesting: search [existing issues](https://github.com/neovim/neovim/labels/enhancement) and check the [FAQ](https://github.com/neovim/neovim/wiki/FAQ).
|
|
||||||
|
|
||||||
- type: input
|
|
||||||
attributes:
|
|
||||||
label: "Feature already in Vim?"
|
|
||||||
description: "Does the feature already exist in Vim? If possible, specify which version (or commit) that introduced it."
|
|
||||||
placeholder: "Yes, Vim 7.3.432"
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: "Feature description"
|
|
||||||
validations:
|
|
||||||
required: true
|
|
61
.github/ISSUE_TEMPLATE/lsp_bug_report.yml
vendored
61
.github/ISSUE_TEMPLATE/lsp_bug_report.yml
vendored
@@ -1,61 +0,0 @@
|
|||||||
name: Language server (LSP) client bug
|
|
||||||
description: Report an issue with Neovim LSP
|
|
||||||
labels: [bug, lsp]
|
|
||||||
body:
|
|
||||||
|
|
||||||
- type: markdown
|
|
||||||
attributes:
|
|
||||||
value: |
|
|
||||||
_Before reporting:_ search [existing issues](https://github.com/neovim/neovim/issues?q=is%3Aissue+is%3Aopen+label%3Abug) and check the [FAQ](https://github.com/neovim/neovim/wiki/FAQ). Usage questions such as "How do I...?" or "Why isn't X language server/feature working?" belong on the [Neovim Discourse](https://neovim.discourse.group/c/7-category/7) and will be closed.
|
|
||||||
|
|
||||||
- type: input
|
|
||||||
attributes:
|
|
||||||
label: "Neovim version (nvim -v)"
|
|
||||||
placeholder: "0.6.0 commit db1b0ee3b30f"
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: input
|
|
||||||
attributes:
|
|
||||||
label: "Language server name/version"
|
|
||||||
placeholder: "rls 0.5.2"
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: input
|
|
||||||
attributes:
|
|
||||||
label: "Operating system/version"
|
|
||||||
placeholder: "emacs 23"
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: ':checkhealth'
|
|
||||||
description: |
|
|
||||||
Paste the results from `nvim -c ":checkhealth nvim lspconfig"`
|
|
||||||
render: markdown
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: 'Steps to reproduce using "nvim -u minimal_init.lua"'
|
|
||||||
description: |
|
|
||||||
- Download the minimal config with `curl -LO https://raw.githubusercontent.com/neovim/nvim-lspconfig/master/test/minimal_init.lua` and modify it to include any specific commands or servers pertaining to your issues.
|
|
||||||
- _Note_: if the issue is with an autocompletion or other LSP plugin, report to that plugin's issue tracker.
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: "Expected behavior"
|
|
||||||
description: "Describe the behavior you expect. May include logs, images, or videos."
|
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: "Actual behavior"
|
|
||||||
|
|
||||||
- type: input
|
|
||||||
attributes:
|
|
||||||
label: "Log file"
|
|
||||||
placeholder: "https://gist.github.com/prakhar1989/1b0a2c9849b2e1e912fb"
|
|
||||||
description: |
|
|
||||||
- Upload `lsp.log` before and after the problem in a [secret gist](https://gist.github.com/). Paste the URL to the gist.
|
|
||||||
- You can set the log level by adding `vim.lsp.set_log_level("debug")` after setting up LSP in your config.
|
|
||||||
- You can find the location of the log with `:lua print(vim.lsp.get_log_path())`
|
|
61
.github/labeler.yml
vendored
61
.github/labeler.yml
vendored
@@ -1,61 +0,0 @@
|
|||||||
"lsp":
|
|
||||||
- runtime/lua/vim/lsp.lua
|
|
||||||
- runtime/lua/vim/lsp/*
|
|
||||||
|
|
||||||
"lua":
|
|
||||||
- runtime/lua/**/*
|
|
||||||
- src/nvim/lua/*
|
|
||||||
|
|
||||||
"tui":
|
|
||||||
- src/nvim/tui/tui.*
|
|
||||||
|
|
||||||
"treesitter":
|
|
||||||
- src/nvim/lua/treesitter.*
|
|
||||||
- runtime/lua/vim/treesitter.lua
|
|
||||||
- runtime/lua/vim/treesitter/*
|
|
||||||
|
|
||||||
"diagnostic":
|
|
||||||
- runtime/lua/vim/diagnostic.lua
|
|
||||||
|
|
||||||
"dependencies":
|
|
||||||
- third-party/**/*
|
|
||||||
|
|
||||||
"spell":
|
|
||||||
- src/nvim/spell*
|
|
||||||
|
|
||||||
"terminal":
|
|
||||||
- src/nvim/terminal.*
|
|
||||||
|
|
||||||
"column":
|
|
||||||
- src/nvim/mark.h
|
|
||||||
- src/nvim/mark.c
|
|
||||||
- src/nvim/sign*
|
|
||||||
|
|
||||||
"folds":
|
|
||||||
- src/nvim/fold*
|
|
||||||
|
|
||||||
"mouse":
|
|
||||||
- src/nvim/mouse*
|
|
||||||
|
|
||||||
"documentation":
|
|
||||||
- all: ["runtime/doc/*"]
|
|
||||||
|
|
||||||
"clipboard":
|
|
||||||
- runtime/autoload/provider/clipboard.vim
|
|
||||||
|
|
||||||
"diff":
|
|
||||||
- src/nvim/diff.*
|
|
||||||
|
|
||||||
"build":
|
|
||||||
- CMakeLists.txt
|
|
||||||
- "**/CMakeLists.txt"
|
|
||||||
- "**/*.cmake"
|
|
||||||
|
|
||||||
"tests":
|
|
||||||
- all: ["test/**/*"]
|
|
||||||
|
|
||||||
"ci":
|
|
||||||
- .github/labeler.yml
|
|
||||||
- .github/workflows/**/*
|
|
||||||
- .builds/*
|
|
||||||
- ci/**/*
|
|
53
.github/workflows/api-docs.yml
vendored
53
.github/workflows/api-docs.yml
vendored
@@ -1,53 +0,0 @@
|
|||||||
name: Autogenerate API docs
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
paths:
|
|
||||||
- 'src/nvim/api/*.[ch]'
|
|
||||||
- 'src/nvim/**.lua'
|
|
||||||
- 'runtime/lua/**.lua'
|
|
||||||
branches:
|
|
||||||
- 'master'
|
|
||||||
- 'release-[0-9]+.[0-9]+'
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
regen-api-docs:
|
|
||||||
runs-on: ubuntu-20.04
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
pull-requests: write
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo env DEBIAN_FRONTEND=noninteractive apt-get install -y python3 luajit
|
|
||||||
conda install -c conda-forge doxygen=1.9.2 msgpack-python
|
|
||||||
echo "$CONDA/bin" >> $GITHUB_PATH
|
|
||||||
|
|
||||||
- name: Setup git config
|
|
||||||
run: |
|
|
||||||
git config --global user.name 'marvim'
|
|
||||||
git config --global user.email 'marvim@users.noreply.github.com'
|
|
||||||
|
|
||||||
- run: printf 'DOC_BRANCH=marvim/api-doc-update/%s\n' ${GITHUB_REF#refs/heads/} >> $GITHUB_ENV
|
|
||||||
|
|
||||||
- name: Generate docs
|
|
||||||
id: docs
|
|
||||||
run: |
|
|
||||||
git checkout -b ${DOC_BRANCH}
|
|
||||||
python3 scripts/gen_vimdoc.py
|
|
||||||
printf '::set-output name=UPDATED_DOCS::%s\n' $([ -z "$(git diff)" ]; echo $?)
|
|
||||||
|
|
||||||
- name: Automatic PR
|
|
||||||
if: ${{ steps.docs.outputs.UPDATED_DOCS != 0 }}
|
|
||||||
run: |
|
|
||||||
git add -u
|
|
||||||
git commit -m 'docs: regenerate'
|
|
||||||
git push --force https://${GITHUB_ACTOR}:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY} ${DOC_BRANCH}
|
|
||||||
gh pr create --fill --base ${GITHUB_REF#refs/heads/} --head ${DOC_BRANCH} || true
|
|
33
.github/workflows/backport.yml
vendored
33
.github/workflows/backport.yml
vendored
@@ -1,33 +0,0 @@
|
|||||||
name: Backport
|
|
||||||
on:
|
|
||||||
pull_request_target:
|
|
||||||
types: [closed, labeled]
|
|
||||||
issue_comment:
|
|
||||||
types: [created]
|
|
||||||
jobs:
|
|
||||||
backport:
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
pull-requests: write
|
|
||||||
name: Backport Pull Request
|
|
||||||
if: >
|
|
||||||
github.repository_owner == 'neovim' && (
|
|
||||||
github.event_name == 'pull_request' &&
|
|
||||||
github.event.pull_request.merged
|
|
||||||
) || (
|
|
||||||
github.event_name == 'issue_comment' &&
|
|
||||||
github.event.issue.pull_request &&
|
|
||||||
contains(github.event.comment.body, '/backport')
|
|
||||||
)
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
# required to find all branches
|
|
||||||
fetch-depth: 0
|
|
||||||
ref: ${{ github.event.pull_request.head.sha }}
|
|
||||||
- name: Create backport PRs
|
|
||||||
uses: zeebe-io/backport-action@v0.0.7
|
|
||||||
with:
|
|
||||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
github_workspace: ${{ github.workspace }}
|
|
220
.github/workflows/ci.yml
vendored
220
.github/workflows/ci.yml
vendored
@@ -1,220 +0,0 @@
|
|||||||
name: CI
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- 'master'
|
|
||||||
- 'release-[0-9]+.[0-9]+'
|
|
||||||
pull_request:
|
|
||||||
types: [opened, synchronize, reopened, ready_for_review]
|
|
||||||
branches:
|
|
||||||
- 'master'
|
|
||||||
- 'release-[0-9]+.[0-9]+'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
lint:
|
|
||||||
if: (github.event_name == 'pull_request' && github.base_ref == 'master' && !github.event.pull_request.draft) || (github.event_name == 'push' && github.ref == 'refs/heads/master')
|
|
||||||
runs-on: ubuntu-20.04
|
|
||||||
env:
|
|
||||||
CC: gcc
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Setup common environment variables
|
|
||||||
run: ./.github/workflows/env.sh lint
|
|
||||||
|
|
||||||
- name: Install apt packages
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y autoconf automake build-essential ccache cmake cpanminus gettext gperf language-pack-tr libtool-bin locales ninja-build pkg-config python3 python3-pip python3-setuptools unzip
|
|
||||||
|
|
||||||
- name: Setup interpreter packages
|
|
||||||
run: |
|
|
||||||
./ci/before_install.sh
|
|
||||||
./ci/install.sh
|
|
||||||
|
|
||||||
- name: Cache dependencies
|
|
||||||
uses: actions/cache@v2
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
${{ env.CACHE_NVIM_DEPS_DIR }}
|
|
||||||
~/.ccache
|
|
||||||
key: ${{ matrix.runner }}-lint-${{ matrix.cc }}-${{ hashFiles('cmake/*', 'third-party/**', '**/CMakeLists.txt') }}-${{ github.base_ref }}
|
|
||||||
|
|
||||||
- name: Build third-party
|
|
||||||
run: ./ci/before_script.sh
|
|
||||||
|
|
||||||
- name: Run lint
|
|
||||||
run: ./ci/script.sh
|
|
||||||
|
|
||||||
- name: Cache dependencies
|
|
||||||
if: ${{ success() }}
|
|
||||||
run: ./ci/before_cache.sh
|
|
||||||
|
|
||||||
unixish:
|
|
||||||
name: ${{ matrix.runner }} ${{ matrix.flavor }} (cc=${{ matrix.cc }})
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- flavor: asan
|
|
||||||
cc: clang-12
|
|
||||||
runner: ubuntu-20.04
|
|
||||||
os: linux
|
|
||||||
- flavor: tsan
|
|
||||||
cc: clang-12
|
|
||||||
runner: ubuntu-20.04
|
|
||||||
os: linux
|
|
||||||
- cc: clang
|
|
||||||
runner: macos-10.15
|
|
||||||
os: osx
|
|
||||||
- cc: clang
|
|
||||||
runner: macos-11.0
|
|
||||||
os: osx
|
|
||||||
runs-on: ${{ matrix.runner }}
|
|
||||||
timeout-minutes: 45
|
|
||||||
if: github.event.pull_request.draft == false
|
|
||||||
env:
|
|
||||||
CC: ${{ matrix.cc }}
|
|
||||||
CI_OS_NAME: ${{ matrix.os }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Setup common environment variables
|
|
||||||
run: ./.github/workflows/env.sh ${{ matrix.flavor }}
|
|
||||||
|
|
||||||
- name: Install apt packages
|
|
||||||
if: matrix.os == 'linux'
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y autoconf automake build-essential ccache cmake cpanminus cscope gcc-multilib gdb gettext gperf language-pack-tr libtool-bin locales ninja-build pkg-config python3 python3-pip python3-setuptools unzip valgrind xclip
|
|
||||||
|
|
||||||
- name: Install new clang
|
|
||||||
if: matrix.flavor == 'asan' || matrix.flavor == 'tsan'
|
|
||||||
run: |
|
|
||||||
wget https://apt.llvm.org/llvm.sh
|
|
||||||
chmod a+x llvm.sh
|
|
||||||
sudo ./llvm.sh 12
|
|
||||||
rm llvm.sh
|
|
||||||
|
|
||||||
- name: Install brew packages
|
|
||||||
if: matrix.os == 'osx'
|
|
||||||
run: |
|
|
||||||
# Workaround brew issues
|
|
||||||
rm -f /usr/local/bin/2to3
|
|
||||||
brew update >/dev/null
|
|
||||||
brew upgrade
|
|
||||||
brew install automake ccache perl cpanminus ninja
|
|
||||||
|
|
||||||
- name: Setup interpreter packages
|
|
||||||
run: |
|
|
||||||
./ci/before_install.sh
|
|
||||||
./ci/install.sh
|
|
||||||
|
|
||||||
- name: Cache dependencies
|
|
||||||
uses: actions/cache@v2
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
${{ env.CACHE_NVIM_DEPS_DIR }}
|
|
||||||
~/.ccache
|
|
||||||
key: ${{ matrix.runner }}-${{ matrix.flavor }}-${{ matrix.cc }}-${{ hashFiles('cmake/*', 'third-party/**', '**/CMakeLists.txt') }}-${{ github.base_ref }}
|
|
||||||
|
|
||||||
- name: Build third-party
|
|
||||||
run: ./ci/before_script.sh
|
|
||||||
|
|
||||||
- name: Build and test
|
|
||||||
run: ./ci/script.sh
|
|
||||||
|
|
||||||
- name: Cache dependencies
|
|
||||||
if: ${{ success() }}
|
|
||||||
run: ./ci/before_cache.sh
|
|
||||||
|
|
||||||
windows:
|
|
||||||
runs-on: windows-2016
|
|
||||||
if: github.event.pull_request.draft == false
|
|
||||||
env:
|
|
||||||
DEPS_BUILD_DIR: ${{ format('{0}/nvim-deps', github.workspace) }}
|
|
||||||
DEPS_PREFIX: ${{ format('{0}/nvim-deps/usr', github.workspace) }}
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
config: [ MINGW_64-gcov, MSVC_64 ]
|
|
||||||
name: windows (${{ matrix.config }})
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- uses: actions/cache@v2
|
|
||||||
with:
|
|
||||||
path: ${{ env.DEPS_BUILD_DIR }}
|
|
||||||
key: ${{ matrix.config }}-${{ hashFiles('third-party\**') }}
|
|
||||||
|
|
||||||
- name: Run CI
|
|
||||||
run: powershell ci\build.ps1
|
|
||||||
env:
|
|
||||||
CONFIGURATION: ${{ matrix.config }}
|
|
||||||
|
|
||||||
functionaltest:
|
|
||||||
name: ${{ matrix.runner }} ${{ matrix.flavor }} (cc=${{ matrix.cc }})
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- flavor: functionaltest-lua
|
|
||||||
cc: gcc
|
|
||||||
runner: ubuntu-20.04
|
|
||||||
os: linux
|
|
||||||
runs-on: ${{ matrix.runner }}
|
|
||||||
timeout-minutes: 45
|
|
||||||
env:
|
|
||||||
CC: ${{ matrix.cc }}
|
|
||||||
CI_OS_NAME: ${{ matrix.os }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Setup commom environment variables
|
|
||||||
run: ./.github/workflows/env.sh ${{ matrix.flavor }}
|
|
||||||
|
|
||||||
- name: Install apt packages
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y autoconf automake build-essential ccache cmake cpanminus cscope gcc-multilib gdb gettext gperf language-pack-tr libtool-bin locales ninja-build pkg-config python3 python3-pip python3-setuptools unzip valgrind xclip
|
|
||||||
|
|
||||||
- name: Install minimum required version of cmake
|
|
||||||
env:
|
|
||||||
CMAKE_URL: 'https://cmake.org/files/v3.10/cmake-3.10.0-Linux-x86_64.sh'
|
|
||||||
CMAKE_VERSION: '3.10.0'
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
curl --retry 5 --silent --show-error --fail -o /tmp/cmake-installer.sh "$CMAKE_URL"
|
|
||||||
mkdir -p "$HOME/.local/bin" /opt/cmake-custom
|
|
||||||
chmod a+x /tmp/cmake-installer.sh
|
|
||||||
/tmp/cmake-installer.sh --prefix=/opt/cmake-custom --skip-license
|
|
||||||
ln -sfn /opt/cmake-custom/bin/cmake "$HOME/.local/bin/cmake"
|
|
||||||
cmake_version="$(cmake --version | head -1)"
|
|
||||||
echo "$cmake_version" | grep -qF "cmake version $CMAKE_VERSION" || {
|
|
||||||
echo "Unexpected CMake version: $cmake_version"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
- name: Setup interpreter packages
|
|
||||||
run: |
|
|
||||||
./ci/before_install.sh
|
|
||||||
./ci/install.sh
|
|
||||||
|
|
||||||
- name: Cache dependencies
|
|
||||||
uses: actions/cache@v2
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
${{ env.CACHE_NVIM_DEPS_DIR }}
|
|
||||||
~/.ccache
|
|
||||||
key: ${{ matrix.runner }}-${{ matrix.flavor }}-${{ matrix.cc }}-${{ hashFiles('cmake/*', 'third-party/**', '**/CMakeLists.txt') }}-${{ github.base_ref }}
|
|
||||||
|
|
||||||
- name: Build third-party
|
|
||||||
run: ./ci/before_script.sh
|
|
||||||
|
|
||||||
- name: Build and test
|
|
||||||
run: ./ci/script.sh
|
|
||||||
|
|
||||||
- name: Cache dependencies
|
|
||||||
if: ${{ success() }}
|
|
||||||
run: ./ci/before_cache.sh
|
|
21
.github/workflows/commitlint.yml
vendored
21
.github/workflows/commitlint.yml
vendored
@@ -1,21 +0,0 @@
|
|||||||
name: "Commit Linter"
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
types: [opened, synchronize, reopened, ready_for_review]
|
|
||||||
jobs:
|
|
||||||
lint-commits:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: github.event.pull_request.draft == false
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2.3.1
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
ref: ${{ github.event.pull_request.head.sha }}
|
|
||||||
path: pr_nvim
|
|
||||||
- uses: rhysd/action-setup-vim@v1
|
|
||||||
with:
|
|
||||||
neovim: true
|
|
||||||
- run: wget https://raw.githubusercontent.com/neovim/neovim/master/scripts/lintcommit.lua
|
|
||||||
- run: nvim --clean -es +"cd pr_nvim" +"lua dofile('../lintcommit.lua').main({trace=true})"
|
|
44
.github/workflows/coverity-scan.yml
vendored
44
.github/workflows/coverity-scan.yml
vendored
@@ -1,44 +0,0 @@
|
|||||||
name: Coverity
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: '0 10 * * 1' # Run every Monday at 00:10
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
scan:
|
|
||||||
runs-on: ubuntu-18.04
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y autoconf automake build-essential cmake gettext gperf libtool-bin locales ninja-build pkg-config unzip
|
|
||||||
|
|
||||||
- name: Download Coverity
|
|
||||||
run: |
|
|
||||||
wget -q https://scan.coverity.com/download/cxx/linux64 --post-data "token=$TOKEN&project=neovim%2Fneovim" -O coverity_tool.tgz
|
|
||||||
mkdir cov-scan
|
|
||||||
tar ax -f coverity_tool.tgz --strip-components=1 -C cov-scan
|
|
||||||
env:
|
|
||||||
TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}
|
|
||||||
|
|
||||||
- name: Build dependencies
|
|
||||||
run: make deps
|
|
||||||
|
|
||||||
- name: Build/scan neovim
|
|
||||||
run: |
|
|
||||||
env PATH=$(pwd)/cov-scan/bin:$PATH cov-build --dir cov-int make
|
|
||||||
|
|
||||||
- name: Submit results
|
|
||||||
run: |
|
|
||||||
tar zcf cov-scan.tgz cov-int
|
|
||||||
curl --form token=$TOKEN \
|
|
||||||
--form email=$EMAIL \
|
|
||||||
--form file=@cov-scan.tgz \
|
|
||||||
--form version="$(git rev-parse HEAD)" \
|
|
||||||
--form description="Weekly GHA scan" \
|
|
||||||
'https://scan.coverity.com/builds?project=neovim%2Fneovim'
|
|
||||||
env:
|
|
||||||
TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}
|
|
||||||
EMAIL: ${{ secrets.COVERITY_SCAN_EMAIL }}
|
|
65
.github/workflows/env.sh
vendored
65
.github/workflows/env.sh
vendored
@@ -1,65 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -e -u
|
|
||||||
|
|
||||||
FLAVOR=${1:-}
|
|
||||||
|
|
||||||
cat <<EOF >> "$GITHUB_PATH"
|
|
||||||
$HOME/.local/bin
|
|
||||||
EOF
|
|
||||||
|
|
||||||
cat <<EOF >> "$GITHUB_ENV"
|
|
||||||
CACHE_ENABLE=true
|
|
||||||
CI_TARGET=tests
|
|
||||||
CI_BUILD_DIR=$GITHUB_WORKSPACE
|
|
||||||
BUILD_DIR=$GITHUB_WORKSPACE/build
|
|
||||||
DEPS_BUILD_DIR=$HOME/nvim-deps
|
|
||||||
INSTALL_PREFIX=$HOME/nvim-install
|
|
||||||
LOG_DIR=$GITHUB_WORKSPACE/build/log
|
|
||||||
NVIM_LOG_FILE=$GITHUB_WORKSPACE/build/.nvimlog
|
|
||||||
VALGRIND_LOG=$GITHUB_WORKSPACE/build/log/valgrind-%p.log
|
|
||||||
CACHE_NVIM_DEPS_DIR=$HOME/.cache/nvim-deps
|
|
||||||
CACHE_MARKER=$HOME/.cache/nvim-deps/.ci_cache_marker
|
|
||||||
CCACHE_BASEDIR=$GITHUB_WORKSPACE
|
|
||||||
CCACHE_COMPRESS=1
|
|
||||||
CCACHE_SLOPPINESS=time_macros,file_macro
|
|
||||||
CCACHE_DIR=$HOME/.ccache
|
|
||||||
EOF
|
|
||||||
|
|
||||||
DEPS_CMAKE_FLAGS=-DUSE_BUNDLED_GPERF=OFF
|
|
||||||
FUNCTIONALTEST=functionaltest
|
|
||||||
BUILD_FLAGS="CMAKE_FLAGS=-DCI_BUILD=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX:PATH=$HOME/nvim-install -DBUSTED_OUTPUT_TYPE=nvim -DDEPS_PREFIX=$HOME/nvim-deps/usr -DMIN_LOG_LEVEL=3"
|
|
||||||
|
|
||||||
case "$FLAVOR" in
|
|
||||||
asan)
|
|
||||||
BUILD_FLAGS="$BUILD_FLAGS -DPREFER_LUA=ON"
|
|
||||||
cat <<EOF >> "$GITHUB_ENV"
|
|
||||||
CLANG_SANITIZER=ASAN_UBSAN
|
|
||||||
SYMBOLIZER=asan_symbolize-12
|
|
||||||
ASAN_OPTIONS=detect_leaks=1:check_initialization_order=1:log_path=$GITHUB_WORKSPACE/build/log/asan
|
|
||||||
UBSAN_OPTIONS=print_stacktrace=1 log_path=$GITHUB_WORKSPACE/build/log/ubsan
|
|
||||||
EOF
|
|
||||||
;;
|
|
||||||
tsan)
|
|
||||||
cat <<EOF >> "$GITHUB_ENV"
|
|
||||||
TSAN_OPTIONS=log_path=$GITHUB_WORKSPACE/build/log/tsan
|
|
||||||
EOF
|
|
||||||
;;
|
|
||||||
lint)
|
|
||||||
cat <<EOF >> "$GITHUB_ENV"
|
|
||||||
CI_TARGET=lint
|
|
||||||
EOF
|
|
||||||
;;
|
|
||||||
functionaltest-lua)
|
|
||||||
BUILD_FLAGS="$BUILD_FLAGS -DPREFER_LUA=ON"
|
|
||||||
FUNCTIONALTEST=functionaltest-lua
|
|
||||||
DEPS_CMAKE_FLAGS="$DEPS_CMAKE_FLAGS -DUSE_BUNDLED_LUAJIT=OFF"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
cat <<EOF >> "$GITHUB_ENV"
|
|
||||||
$BUILD_FLAGS
|
|
||||||
DEPS_CMAKE_FLAGS=$DEPS_CMAKE_FLAGS
|
|
||||||
FUNCTIONALTEST=$FUNCTIONALTEST
|
|
||||||
EOF
|
|
30
.github/workflows/labeler.yml
vendored
30
.github/workflows/labeler.yml
vendored
@@ -1,30 +0,0 @@
|
|||||||
name: "Pull Request Labeler"
|
|
||||||
on:
|
|
||||||
pull_request_target:
|
|
||||||
types: opened
|
|
||||||
jobs:
|
|
||||||
triage:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
pull-requests: write
|
|
||||||
steps:
|
|
||||||
- uses: actions/labeler@main
|
|
||||||
with:
|
|
||||||
repo-token: "${{ secrets.GITHUB_TOKEN }}"
|
|
||||||
type-scope:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
pull-requests: write
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
GH_REPO: ${{ github.repository }}
|
|
||||||
PR_NUMBER: ${{ github.event.pull_request.number }}
|
|
||||||
PR_TITLE: ${{ github.event.pull_request.title }}
|
|
||||||
steps:
|
|
||||||
# Extract type and try to add it as a label
|
|
||||||
- run: gh pr edit "$PR_NUMBER" --add-label "$(echo "$PR_TITLE" | sed -E 's|([[:alpha:]]+)(\(.*\))?!?:.*|\1|')" || true
|
|
||||||
|
|
||||||
# Extract scope and try to add it as a label
|
|
||||||
- run: gh pr edit "$PR_NUMBER" --add-label "$(echo "$PR_TITLE" | sed -E 's|[[:alpha:]]+\((.+)\)!?:.*|\1|')" || true
|
|
40
.github/workflows/notes.md
vendored
40
.github/workflows/notes.md
vendored
@@ -1,40 +0,0 @@
|
|||||||
```
|
|
||||||
${NVIM_VERSION}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Install
|
|
||||||
|
|
||||||
### Windows
|
|
||||||
|
|
||||||
1. Extract **nvim-win64.zip**
|
|
||||||
2. Run `nvim-qt.exe`
|
|
||||||
|
|
||||||
### macOS
|
|
||||||
|
|
||||||
1. Download **nvim-macos.tar.gz**
|
|
||||||
2. Extract: `tar xzvf nvim-macos.tar.gz`
|
|
||||||
3. Run `./nvim-osx64/bin/nvim`
|
|
||||||
|
|
||||||
### Linux (x64)
|
|
||||||
|
|
||||||
1. Download **nvim.appimage**
|
|
||||||
2. Run `chmod u+x nvim.appimage && ./nvim.appimage`
|
|
||||||
- If your system does not have FUSE you can [extract the appimage](https://github.com/AppImage/AppImageKit/wiki/FUSE#type-2-appimage):
|
|
||||||
```
|
|
||||||
./nvim.appimage --appimage-extract
|
|
||||||
./squashfs-root/usr/bin/nvim
|
|
||||||
```
|
|
||||||
|
|
||||||
### Other
|
|
||||||
|
|
||||||
- Install by [package manager](https://github.com/neovim/neovim/wiki/Installing-Neovim)
|
|
||||||
|
|
||||||
## SHA256 Checksums
|
|
||||||
|
|
||||||
```
|
|
||||||
${SHA_LINUX_64}
|
|
||||||
${SHA_APP_IMAGE}
|
|
||||||
${SHA_APP_IMAGE_ZSYNC}
|
|
||||||
${SHA_MACOS}
|
|
||||||
${SHA_WIN_64}
|
|
||||||
```
|
|
222
.github/workflows/release.yml
vendored
222
.github/workflows/release.yml
vendored
@@ -1,222 +0,0 @@
|
|||||||
name: Release
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: '5 5 * * *'
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
tag_name:
|
|
||||||
description: 'Tag name for release'
|
|
||||||
required: false
|
|
||||||
default: nightly
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- v[0-9]+.[0-9]+.[0-9]+
|
|
||||||
|
|
||||||
# Build on the oldest supported images, so we have broader compatibility
|
|
||||||
# Upgrade to gcc-11 to prevent it from using its builtins (#14150)
|
|
||||||
jobs:
|
|
||||||
linux:
|
|
||||||
runs-on: ubuntu-18.04
|
|
||||||
outputs:
|
|
||||||
version: ${{ steps.build.outputs.version }}
|
|
||||||
release: ${{ steps.build.outputs.release }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y autoconf automake build-essential cmake gcc-11 gettext gperf libtool-bin locales ninja-build pkg-config unzip
|
|
||||||
- if: github.event_name == 'push' || (github.event_name == 'workflow_dispatch' && github.event.inputs.tag_name != 'nightly')
|
|
||||||
run: printf 'NVIM_BUILD_TYPE=Release\n' >> $GITHUB_ENV
|
|
||||||
- if: github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.event.inputs.tag_name == 'nightly')
|
|
||||||
run: printf 'NVIM_BUILD_TYPE=RelWithDebInfo\n' >> $GITHUB_ENV
|
|
||||||
- name: Build release
|
|
||||||
id: build
|
|
||||||
run: |
|
|
||||||
CC=gcc-11 make CMAKE_BUILD_TYPE=${NVIM_BUILD_TYPE} CMAKE_EXTRA_FLAGS="-DCMAKE_INSTALL_PREFIX:PATH="
|
|
||||||
printf '::set-output name=version::%s\n' "$(./build/bin/nvim --version | head -n 3 | sed -z 's/\n/%0A/g')"
|
|
||||||
printf '::set-output name=release::%s\n' "$(./build/bin/nvim --version | head -n 1)"
|
|
||||||
make DESTDIR="$GITHUB_WORKSPACE/build/release/nvim-linux64" install
|
|
||||||
cd "$GITHUB_WORKSPACE/build/release"
|
|
||||||
tar cfz nvim-linux64.tar.gz nvim-linux64
|
|
||||||
- uses: actions/upload-artifact@v2
|
|
||||||
with:
|
|
||||||
name: nvim-linux64
|
|
||||||
path: build/release/nvim-linux64.tar.gz
|
|
||||||
retention-days: 1
|
|
||||||
|
|
||||||
appimage:
|
|
||||||
runs-on: ubuntu-18.04
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y autoconf automake build-essential cmake gcc-11 gettext gperf libtool-bin locales ninja-build pkg-config unzip
|
|
||||||
- if: github.event_name == 'push' || (github.event_name == 'workflow_dispatch' && github.event.inputs.tag_name != 'nightly')
|
|
||||||
run: CC=gcc-11 make appimage-latest
|
|
||||||
- if: github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.event.inputs.tag_name == 'nightly')
|
|
||||||
run: CC=gcc-11 make appimage-nightly
|
|
||||||
- uses: actions/upload-artifact@v2
|
|
||||||
with:
|
|
||||||
name: appimage
|
|
||||||
path: build/bin/nvim.appimage
|
|
||||||
retention-days: 1
|
|
||||||
- uses: actions/upload-artifact@v2
|
|
||||||
with:
|
|
||||||
name: appimage
|
|
||||||
path: build/bin/nvim.appimage.zsync
|
|
||||||
retention-days: 1
|
|
||||||
|
|
||||||
macOS:
|
|
||||||
runs-on: macos-10.15
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
- name: Install brew packages
|
|
||||||
run: |
|
|
||||||
rm -f /usr/local/bin/2to3
|
|
||||||
brew update >/dev/null
|
|
||||||
brew upgrade
|
|
||||||
brew install automake ninja
|
|
||||||
- if: github.event_name == 'push' || (github.event_name == 'workflow_dispatch' && github.event.inputs.tag_name != 'nightly')
|
|
||||||
run: printf 'NVIM_BUILD_TYPE=Release\n' >> $GITHUB_ENV
|
|
||||||
- if: github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.event.inputs.tag_name == 'nightly')
|
|
||||||
run: printf 'NVIM_BUILD_TYPE=RelWithDebInfo\n' >> $GITHUB_ENV
|
|
||||||
- name: Build release
|
|
||||||
run: |
|
|
||||||
make CMAKE_BUILD_TYPE=${NVIM_BUILD_TYPE} CMAKE_EXTRA_FLAGS="-DCMAKE_INSTALL_PREFIX:PATH= -DCMAKE_OSX_DEPLOYMENT_TARGET=10.11"
|
|
||||||
make DESTDIR="$GITHUB_WORKSPACE/build/release/nvim-osx64" install
|
|
||||||
- name: Create package
|
|
||||||
run: |
|
|
||||||
cd "$GITHUB_WORKSPACE/build/release"
|
|
||||||
mkdir -p nvim-osx64/libs
|
|
||||||
libs=($(otool -L nvim-osx64/bin/nvim | sed 1d | sed -E -e 's|^[[:space:]]*||' -e 's| .*||'))
|
|
||||||
echo "libs:"
|
|
||||||
for lib in "${libs[@]}"; do
|
|
||||||
if echo "$lib" | grep -q -E 'libSystem|CoreFoundation' 2>/dev/null; then
|
|
||||||
echo " [skipped] $lib"
|
|
||||||
else
|
|
||||||
echo " $lib"
|
|
||||||
relname="libs/${lib##*/}"
|
|
||||||
cp -L "$lib" "nvim-osx64/$relname"
|
|
||||||
install_name_tool -change "$lib" "@executable_path/../$relname" nvim-osx64/bin/nvim
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
tar cfz nvim-macos.tar.gz nvim-osx64
|
|
||||||
- uses: actions/upload-artifact@v2
|
|
||||||
with:
|
|
||||||
name: nvim-macos
|
|
||||||
path: build/release/nvim-macos.tar.gz
|
|
||||||
retention-days: 1
|
|
||||||
|
|
||||||
windows:
|
|
||||||
runs-on: windows-2016
|
|
||||||
env:
|
|
||||||
DEPS_BUILD_DIR: ${{ format('{0}/nvim-deps', github.workspace) }}
|
|
||||||
DEPS_PREFIX: ${{ format('{0}/nvim-deps/usr', github.workspace) }}
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- config: MSVC_64
|
|
||||||
archive: nvim-win64
|
|
||||||
name: windows (${{ matrix.config }})
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
- run: powershell ci\build.ps1 -NoTests
|
|
||||||
env:
|
|
||||||
CONFIGURATION: ${{ matrix.config }}
|
|
||||||
- run: move build\Neovim.zip build\${{ matrix.archive }}.zip
|
|
||||||
- uses: actions/upload-artifact@v2
|
|
||||||
with:
|
|
||||||
name: ${{ matrix.archive }}
|
|
||||||
path: build/${{ matrix.archive }}.zip
|
|
||||||
retention-days: 1
|
|
||||||
|
|
||||||
publish:
|
|
||||||
needs: [linux, appimage, macOS, windows]
|
|
||||||
runs-on: ubuntu-20.04
|
|
||||||
env:
|
|
||||||
GH_REPO: ${{ github.repository }}
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
steps:
|
|
||||||
# Must perform checkout first, since it deletes the target directory
|
|
||||||
# before running, and would therefore delete the downloaded artifacts
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
|
|
||||||
- uses: actions/download-artifact@v2
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y gettext-base
|
|
||||||
|
|
||||||
- if: github.event_name == 'workflow_dispatch'
|
|
||||||
run: echo "TAG_NAME=${{ github.event.inputs.tag_name }}" >> $GITHUB_ENV
|
|
||||||
- if: github.event_name == 'schedule'
|
|
||||||
run: echo 'TAG_NAME=nightly' >> $GITHUB_ENV
|
|
||||||
- if: github.event_name == 'push'
|
|
||||||
run: |
|
|
||||||
TAG_NAME=${{ github.ref }}
|
|
||||||
echo "TAG_NAME=${TAG_NAME#refs/tags/}" >> $GITHUB_ENV
|
|
||||||
- if: env.TAG_NAME == 'nightly'
|
|
||||||
env:
|
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
run: |
|
|
||||||
(echo 'SUBJECT=Nvim development (prerelease) build';
|
|
||||||
echo 'PRERELEASE=--prerelease') >> $GITHUB_ENV
|
|
||||||
gh release delete nightly --yes || true
|
|
||||||
git push origin :nightly || true
|
|
||||||
- if: env.TAG_NAME != 'nightly'
|
|
||||||
env:
|
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
run: |
|
|
||||||
(echo 'SUBJECT=Nvim release build';
|
|
||||||
echo 'PRERELEASE=') >> $GITHUB_ENV
|
|
||||||
gh release delete stable --yes || true
|
|
||||||
git push origin :stable || true
|
|
||||||
# `sha256sum` outputs <sha> <path>, so we cd into each dir to drop the
|
|
||||||
# containing folder from the output.
|
|
||||||
- name: Generate Linux64 SHA256 checksums
|
|
||||||
run: |
|
|
||||||
cd ./nvim-linux64
|
|
||||||
sha256sum nvim-linux64.tar.gz > nvim-linux64.tar.gz.sha256sum
|
|
||||||
echo "SHA_LINUX_64=$(cat nvim-linux64.tar.gz.sha256sum)" >> $GITHUB_ENV
|
|
||||||
- name: Generate App Image SHA256 checksums
|
|
||||||
run: |
|
|
||||||
cd ./appimage
|
|
||||||
sha256sum nvim.appimage > nvim.appimage.sha256sum
|
|
||||||
echo "SHA_APP_IMAGE=$(cat nvim.appimage.sha256sum)" >> $GITHUB_ENV
|
|
||||||
- name: Generate App Image Zsync SHA256 checksums
|
|
||||||
run: |
|
|
||||||
cd ./appimage
|
|
||||||
sha256sum nvim.appimage.zsync > nvim.appimage.zsync.sha256sum
|
|
||||||
echo "SHA_APP_IMAGE_ZSYNC=$(cat nvim.appimage.zsync.sha256sum)" >> $GITHUB_ENV
|
|
||||||
- name: Generate macOS SHA256 checksums
|
|
||||||
run: |
|
|
||||||
cd ./nvim-macos
|
|
||||||
sha256sum nvim-macos.tar.gz > nvim-macos.tar.gz.sha256sum
|
|
||||||
echo "SHA_MACOS=$(cat nvim-macos.tar.gz.sha256sum)" >> $GITHUB_ENV
|
|
||||||
- name: Generate Win64 SHA256 checksums
|
|
||||||
run: |
|
|
||||||
cd ./nvim-win64
|
|
||||||
sha256sum nvim-win64.zip > nvim-win64.zip.sha256sum
|
|
||||||
echo "SHA_WIN_64=$(cat nvim-win64.zip.sha256sum)" >> $GITHUB_ENV
|
|
||||||
- name: Publish release
|
|
||||||
env:
|
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
NVIM_VERSION: ${{ needs.linux.outputs.version }}
|
|
||||||
run: |
|
|
||||||
envsubst < "$GITHUB_WORKSPACE/.github/workflows/notes.md" > "$RUNNER_TEMP/notes.md"
|
|
||||||
gh release create $TAG_NAME $PRERELEASE --notes-file "$RUNNER_TEMP/notes.md" --title "$SUBJECT" --target $GITHUB_SHA nvim-macos/* nvim-linux64/* appimage/* nvim-win64/*
|
|
||||||
if [ "$TAG_NAME" != "nightly" ]; then
|
|
||||||
gh release create stable $PRERELEASE --notes-file "$RUNNER_TEMP/notes.md" --title "$SUBJECT" --target $GITHUB_SHA nvim-macos/* nvim-linux64/* appimage/* nvim-win64/*
|
|
||||||
fi
|
|
52
.github/workflows/vim-patches.yml
vendored
52
.github/workflows/vim-patches.yml
vendored
@@ -1,52 +0,0 @@
|
|||||||
name: vim-patches
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: '3 3 * * *'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
update-vim-patches:
|
|
||||||
runs-on: ubuntu-20.04
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
pull-requests: write
|
|
||||||
env:
|
|
||||||
VIM_SOURCE_DIR: ${{ format('{0}/vim-src', github.workspace) }}
|
|
||||||
VERSION_BRANCH: marvim/ci-version-update
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- uses: actions/checkout@v2
|
|
||||||
with:
|
|
||||||
repository: vim/vim
|
|
||||||
path: ${{ env.VIM_SOURCE_DIR }}
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- run: |
|
|
||||||
gh release download -R neovim/neovim -p nvim.appimage
|
|
||||||
chmod a+x nvim.appimage
|
|
||||||
mkdir -p $HOME/.local/bin
|
|
||||||
mv nvim.appimage $HOME/.local/bin/nvim
|
|
||||||
printf '%s\n' "$HOME/.local/bin" >> $GITHUB_PATH
|
|
||||||
|
|
||||||
- name: Setup git config
|
|
||||||
run: |
|
|
||||||
git config --global user.name 'marvim'
|
|
||||||
git config --global user.email 'marvim@users.noreply.github.com'
|
|
||||||
|
|
||||||
- name: Update src/version.c
|
|
||||||
id: update-version
|
|
||||||
run: |
|
|
||||||
git checkout -b ${VERSION_BRANCH}
|
|
||||||
nvim -i NONE -u NONE --headless +'luafile scripts/vimpatch.lua' +q
|
|
||||||
printf '::set-output name=NEW_PATCHES::%s\n' $([ -z "$(git diff)" ]; echo $?)
|
|
||||||
|
|
||||||
- name: Automatic PR
|
|
||||||
if: ${{ steps.update-version.outputs.NEW_PATCHES != 0 }}
|
|
||||||
run: |
|
|
||||||
git add -u
|
|
||||||
git commit -m 'version.c: update [skip ci]'
|
|
||||||
git push --force https://${GITHUB_ACTOR}:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY} ${VERSION_BRANCH}
|
|
||||||
gh pr create --fill --label vim-patch --base ${GITHUB_REF#refs/heads/} --head ${VERSION_BRANCH} || true
|
|
32
.gitignore
vendored
32
.gitignore
vendored
@@ -1,21 +1,16 @@
|
|||||||
# Tools
|
# Tools
|
||||||
/venv/
|
.ropeproject/
|
||||||
compile_commands.json
|
compile_commands.json
|
||||||
|
# Visual Studio
|
||||||
# IDEs
|
|
||||||
/.vs/
|
/.vs/
|
||||||
/.vscode/
|
|
||||||
/.idea/
|
|
||||||
|
|
||||||
# Build/deps dir
|
# Build/deps dir
|
||||||
/build/
|
/build/
|
||||||
|
/cmake-build-debug/
|
||||||
|
/dist/
|
||||||
/.deps/
|
/.deps/
|
||||||
/tmp/
|
/tmp/
|
||||||
/.clangd/
|
|
||||||
/.cache/clangd/
|
|
||||||
/.ccls-cache/
|
|
||||||
|
|
||||||
.DS_Store
|
|
||||||
*.mo
|
*.mo
|
||||||
.*.sw?
|
.*.sw?
|
||||||
*~
|
*~
|
||||||
@@ -23,6 +18,8 @@ compile_commands.json
|
|||||||
*.o
|
*.o
|
||||||
*.so
|
*.so
|
||||||
|
|
||||||
|
tags
|
||||||
|
|
||||||
/src/nvim/po/vim.pot
|
/src/nvim/po/vim.pot
|
||||||
/src/nvim/po/*.ck
|
/src/nvim/po/*.ck
|
||||||
|
|
||||||
@@ -30,14 +27,13 @@ compile_commands.json
|
|||||||
/.nvimlog
|
/.nvimlog
|
||||||
|
|
||||||
# Generated by scripts/vim-patch.sh
|
# Generated by scripts/vim-patch.sh
|
||||||
/.vim-src
|
/.vim-src/
|
||||||
*.rej
|
|
||||||
|
|
||||||
# Generated by old (Vim) tests.
|
# Generated by old (Vim) tests.
|
||||||
/src/nvim/testdir/del
|
/src/nvim/testdir/del
|
||||||
/src/nvim/testdir/test*.out
|
/src/nvim/testdir/test*.out
|
||||||
/src/nvim/testdir/test*.res
|
/src/nvim/testdir/test*.res
|
||||||
/src/nvim/testdir/test*.log
|
/src/nvim/testdir/test.log
|
||||||
/src/nvim/testdir/messages
|
/src/nvim/testdir/messages
|
||||||
/src/nvim/testdir/viminfo
|
/src/nvim/testdir/viminfo
|
||||||
/src/nvim/testdir/test.ok
|
/src/nvim/testdir/test.ok
|
||||||
@@ -46,7 +42,6 @@ compile_commands.json
|
|||||||
/src/nvim/testdir/valgrind.*
|
/src/nvim/testdir/valgrind.*
|
||||||
/src/nvim/testdir/.gdbinit
|
/src/nvim/testdir/.gdbinit
|
||||||
/runtime/indent/testdir/*.out
|
/runtime/indent/testdir/*.out
|
||||||
+runtime/indent/testdir/*.fail
|
|
||||||
# Generated by src/nvim/testdir/runnvim.sh.
|
# Generated by src/nvim/testdir/runnvim.sh.
|
||||||
/src/nvim/testdir/*.tlog
|
/src/nvim/testdir/*.tlog
|
||||||
|
|
||||||
@@ -59,15 +54,10 @@ compile_commands.json
|
|||||||
# local make targets
|
# local make targets
|
||||||
local.mk
|
local.mk
|
||||||
|
|
||||||
# Generated from :help docs
|
# runtime/doc
|
||||||
tags
|
|
||||||
/runtime/doc/*.html
|
/runtime/doc/*.html
|
||||||
/runtime/doc/tags.ref
|
/runtime/doc/tags.ref
|
||||||
/runtime/doc/errors.log
|
/runtime/doc/errors.log
|
||||||
|
|
||||||
# Generated by gen_vimdoc.py:
|
# CLion
|
||||||
/runtime/doc/*.mpack
|
/.idea/
|
||||||
/tmp-*-doc
|
|
||||||
|
|
||||||
# vim patches
|
|
||||||
/vim-*.patch
|
|
||||||
|
11
.luacheckrc
11
.luacheckrc
@@ -1,14 +1,7 @@
|
|||||||
-- vim: ft=lua tw=80
|
-- vim: ft=lua tw=80
|
||||||
|
|
||||||
stds.nvim = {
|
|
||||||
read_globals = { "jit" }
|
|
||||||
}
|
|
||||||
std = "lua51+nvim"
|
|
||||||
|
|
||||||
-- Ignore W211 (unused variable) with preload files.
|
-- Ignore W211 (unused variable) with preload files.
|
||||||
files["**/preload.lua"] = {ignore = { "211" }}
|
files["**/preload.lua"] = {ignore = { "211" }}
|
||||||
-- Allow vim module to modify itself, but only here.
|
|
||||||
files["src/nvim/lua/vim.lua"] = {ignore = { "122/vim" }}
|
|
||||||
|
|
||||||
-- Don't report unused self arguments of methods.
|
-- Don't report unused self arguments of methods.
|
||||||
self = false
|
self = false
|
||||||
@@ -25,7 +18,3 @@ ignore = {
|
|||||||
read_globals = {
|
read_globals = {
|
||||||
"vim",
|
"vim",
|
||||||
}
|
}
|
||||||
|
|
||||||
exclude_files = {
|
|
||||||
'test/functional/fixtures/lua/syntax_error.lua',
|
|
||||||
}
|
|
||||||
|
22
.luacov
22
.luacov
@@ -1,22 +0,0 @@
|
|||||||
-- Configuration file for LuaCov
|
|
||||||
|
|
||||||
local source = require("lfs").currentdir()
|
|
||||||
|
|
||||||
local function pesc(s)
|
|
||||||
assert(type(s) == 'string', s)
|
|
||||||
return s:gsub('[%(%)%.%%%+%-%*%?%[%]%^%$]', '%%%1')
|
|
||||||
end
|
|
||||||
|
|
||||||
return {
|
|
||||||
include = {
|
|
||||||
-- Absolute paths (starting with source dir, not hidden (i.e. .deps)).
|
|
||||||
pesc(source) .. "[/\\][^.].+",
|
|
||||||
-- Relative (non-hidden) paths.
|
|
||||||
'^[^/\\.]',
|
|
||||||
},
|
|
||||||
modules = {
|
|
||||||
['vim'] = 'runtime/lua/vim/shared.lua'
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
-- vim: ft=lua tw=80 sw=2 et
|
|
123
.travis.yml
123
.travis.yml
@@ -1,23 +1,9 @@
|
|||||||
dist: bionic
|
dist: xenial
|
||||||
|
|
||||||
language: c
|
language: c
|
||||||
|
|
||||||
env:
|
env:
|
||||||
global:
|
global:
|
||||||
# Encrypted environment variables, see
|
|
||||||
# http://docs.travis-ci.com/user/encryption-keys/
|
|
||||||
#
|
|
||||||
# SNAP_SECRET_KEY: generated by:
|
|
||||||
# travis encrypt SNAP_SECRET_KEY=xx --add
|
|
||||||
# https://github.com/neovim/neovim/pull/11428
|
|
||||||
# snapcraft key expires after 1 year. Steps to refresh it:
|
|
||||||
# 1. snapcraft enable-ci travis --refresh
|
|
||||||
# 2. mv .snapcraft/travis_snapcraft.cfg ci/snap/travis_snapcraft.cfg
|
|
||||||
# 3. Copy after_success command to ci/snap/deploy.sh from .travis.yml
|
|
||||||
# 4. Undo changes to .travis.yml
|
|
||||||
- secure: hd0qn2u8ABbJg5Bx4pBRcUQbKYFmcSHoecyHIPTCnGJT+NI41Bvm/IkN/N5DhBF+LbD3Q2nmR/dzI5H/dqS7RxMFvEx1DuFLendFHHX3MYf0AuKpXYY3gwgMTmqx8p/v6srlU7RBGWNGzHCWqksAem+EIWCe3I7WvfdKo1/DV/Y=
|
|
||||||
|
|
||||||
- PATH="$HOME/.local/bin:$PATH"
|
|
||||||
# Set "false" to force rebuild of third-party dependencies.
|
# Set "false" to force rebuild of third-party dependencies.
|
||||||
- CACHE_ENABLE=true
|
- CACHE_ENABLE=true
|
||||||
# Build directory for Neovim.
|
# Build directory for Neovim.
|
||||||
@@ -31,13 +17,17 @@ env:
|
|||||||
# Nvim log file.
|
# Nvim log file.
|
||||||
- NVIM_LOG_FILE="$BUILD_DIR/.nvimlog"
|
- NVIM_LOG_FILE="$BUILD_DIR/.nvimlog"
|
||||||
# Default CMake flags.
|
# Default CMake flags.
|
||||||
- CMAKE_FLAGS="-DCI_BUILD=ON
|
- CMAKE_FLAGS="-DTRAVIS_CI_BUILD=ON
|
||||||
-DCMAKE_BUILD_TYPE=Debug
|
-DCMAKE_BUILD_TYPE=Debug
|
||||||
-DCMAKE_INSTALL_PREFIX:PATH=$INSTALL_PREFIX
|
-DCMAKE_INSTALL_PREFIX:PATH=$INSTALL_PREFIX
|
||||||
-DBUSTED_OUTPUT_TYPE=nvim
|
-DBUSTED_OUTPUT_TYPE=nvim
|
||||||
-DDEPS_PREFIX=$DEPS_BUILD_DIR/usr
|
-DDEPS_PREFIX=$DEPS_BUILD_DIR/usr
|
||||||
-DMIN_LOG_LEVEL=3"
|
-DMIN_LOG_LEVEL=3"
|
||||||
- DEPS_CMAKE_FLAGS="-DUSE_BUNDLED_GPERF=OFF"
|
- DEPS_CMAKE_FLAGS="-DUSE_BUNDLED_GPERF=OFF"
|
||||||
|
# Additional CMake flags for 32-bit builds.
|
||||||
|
- CMAKE_FLAGS_32BIT="-DCMAKE_SYSTEM_LIBRARY_PATH=/lib32:/usr/lib32:/usr/local/lib32
|
||||||
|
-DCMAKE_IGNORE_PATH=/lib:/usr/lib:/usr/local/lib
|
||||||
|
-DCMAKE_TOOLCHAIN_FILE=$TRAVIS_BUILD_DIR/cmake/i386-linux-gnu.toolchain.cmake"
|
||||||
# Environment variables for Clang sanitizers.
|
# Environment variables for Clang sanitizers.
|
||||||
- ASAN_OPTIONS="detect_leaks=1:check_initialization_order=1:log_path=$LOG_DIR/asan"
|
- ASAN_OPTIONS="detect_leaks=1:check_initialization_order=1:log_path=$LOG_DIR/asan"
|
||||||
- TSAN_OPTIONS="log_path=$LOG_DIR/tsan"
|
- TSAN_OPTIONS="log_path=$LOG_DIR/tsan"
|
||||||
@@ -46,7 +36,7 @@ env:
|
|||||||
- VALGRIND_LOG="$LOG_DIR/valgrind-%p.log"
|
- VALGRIND_LOG="$LOG_DIR/valgrind-%p.log"
|
||||||
- CACHE_NVIM_DEPS_DIR="$HOME/.cache/nvim-deps"
|
- CACHE_NVIM_DEPS_DIR="$HOME/.cache/nvim-deps"
|
||||||
# If this file exists, the cache is valid (compile was successful).
|
# If this file exists, the cache is valid (compile was successful).
|
||||||
- CACHE_MARKER="$CACHE_NVIM_DEPS_DIR/.ci_cache_marker"
|
- CACHE_MARKER="$CACHE_NVIM_DEPS_DIR/.travis_cache_marker"
|
||||||
# default target name for functional tests
|
# default target name for functional tests
|
||||||
- FUNCTIONALTEST=functionaltest
|
- FUNCTIONALTEST=functionaltest
|
||||||
- CI_TARGET=tests
|
- CI_TARGET=tests
|
||||||
@@ -54,7 +44,8 @@ env:
|
|||||||
- CCACHE_COMPRESS=1
|
- CCACHE_COMPRESS=1
|
||||||
- CCACHE_SLOPPINESS=time_macros,file_macro
|
- CCACHE_SLOPPINESS=time_macros,file_macro
|
||||||
- CCACHE_BASEDIR="$TRAVIS_BUILD_DIR"
|
- CCACHE_BASEDIR="$TRAVIS_BUILD_DIR"
|
||||||
- CI_OS_NAME="$TRAVIS_OS_NAME"
|
# Default since 3.3, but Travis (Xenial) has 3.2.4; required with newer gcc/clang.
|
||||||
|
- CCACHE_CPP2=1
|
||||||
|
|
||||||
anchors:
|
anchors:
|
||||||
envs: &common-job-env
|
envs: &common-job-env
|
||||||
@@ -71,12 +62,12 @@ addons:
|
|||||||
- build-essential
|
- build-essential
|
||||||
- clang
|
- clang
|
||||||
- cmake
|
- cmake
|
||||||
- cpanminus
|
|
||||||
- cscope
|
- cscope
|
||||||
- gcc-multilib
|
- gcc-multilib
|
||||||
- gdb
|
- gdb
|
||||||
- gperf
|
- gperf
|
||||||
- language-pack-tr
|
- language-pack-tr
|
||||||
|
- libc6-dev-i386
|
||||||
- libtool-bin
|
- libtool-bin
|
||||||
- locales
|
- locales
|
||||||
- ninja-build
|
- ninja-build
|
||||||
@@ -86,16 +77,21 @@ addons:
|
|||||||
- xclip
|
- xclip
|
||||||
homebrew:
|
homebrew:
|
||||||
update: true
|
update: true
|
||||||
casks:
|
|
||||||
- powershell
|
|
||||||
packages:
|
packages:
|
||||||
- ccache
|
- ccache
|
||||||
- cpanminus
|
|
||||||
- ninja
|
- ninja
|
||||||
- perl
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
include:
|
include:
|
||||||
|
- stage: baseline
|
||||||
|
name: clang-asan
|
||||||
|
os: linux
|
||||||
|
compiler: clang
|
||||||
|
# Use Lua so that ASAN can test our embedded Lua support. 8fec4d53d0f6
|
||||||
|
env:
|
||||||
|
- CLANG_SANITIZER=ASAN_UBSAN
|
||||||
|
- CMAKE_FLAGS="$CMAKE_FLAGS -DPREFER_LUA=ON"
|
||||||
|
- *common-job-env
|
||||||
- name: gcc-coverage (gcc 9)
|
- name: gcc-coverage (gcc 9)
|
||||||
os: linux
|
os: linux
|
||||||
compiler: gcc-9
|
compiler: gcc-9
|
||||||
@@ -103,19 +99,28 @@ jobs:
|
|||||||
- GCOV=gcov-9
|
- GCOV=gcov-9
|
||||||
- CMAKE_FLAGS="$CMAKE_FLAGS -DUSE_GCOV=ON"
|
- CMAKE_FLAGS="$CMAKE_FLAGS -DUSE_GCOV=ON"
|
||||||
- GCOV_ERROR_FILE="/tmp/libgcov-errors.log"
|
- GCOV_ERROR_FILE="/tmp/libgcov-errors.log"
|
||||||
- USE_LUACOV=1
|
|
||||||
- BUSTED_ARGS="--coverage"
|
|
||||||
- *common-job-env
|
- *common-job-env
|
||||||
addons:
|
addons:
|
||||||
snaps:
|
|
||||||
- name: powershell
|
|
||||||
confinement: classic
|
|
||||||
apt:
|
apt:
|
||||||
sources:
|
sources:
|
||||||
- sourceline: 'ppa:ubuntu-toolchain-r/test'
|
- sourceline: 'ppa:ubuntu-toolchain-r/test'
|
||||||
packages:
|
packages:
|
||||||
- *common-apt-packages
|
- *common-apt-packages
|
||||||
- gcc-9
|
- gcc-9
|
||||||
|
- if: branch = master AND commit_message !~ /\[skip.lint\]/
|
||||||
|
name: lint
|
||||||
|
os: linux
|
||||||
|
env:
|
||||||
|
- CI_TARGET=lint
|
||||||
|
- *common-job-env
|
||||||
|
|
||||||
|
- stage: second stage
|
||||||
|
name: "macOS: clang"
|
||||||
|
os: osx
|
||||||
|
compiler: clang
|
||||||
|
osx_image: xcode10.2 # macOS 10.14
|
||||||
|
env:
|
||||||
|
- *common-job-env
|
||||||
- name: gcc-functionaltest-lua
|
- name: gcc-functionaltest-lua
|
||||||
os: linux
|
os: linux
|
||||||
compiler: gcc
|
compiler: gcc
|
||||||
@@ -131,67 +136,15 @@ jobs:
|
|||||||
compiler: gcc
|
compiler: gcc
|
||||||
env:
|
env:
|
||||||
- BUILD_32BIT=ON
|
- BUILD_32BIT=ON
|
||||||
- CMAKE_FLAGS="$CMAKE_FLAGS -m32 -DCMAKE_TOOLCHAIN_FILE=$TRAVIS_BUILD_DIR/cmake/i386-linux-gnu.toolchain.cmake"
|
# Minimum required CMake.
|
||||||
- DEPS_CMAKE_FLAGS="$DEPS_CMAKE_FLAGS -m32 -DCMAKE_TOOLCHAIN_FILE=$TRAVIS_BUILD_DIR/cmake/i386-linux-gnu.toolchain.cmake"
|
- CMAKE_URL=https://cmake.org/files/v2.8/cmake-2.8.12-Linux-i386.sh
|
||||||
- *common-job-env
|
- *common-job-env
|
||||||
- name: big-endian
|
- name: clang-tsan
|
||||||
os: linux
|
os: linux
|
||||||
arch: s390x
|
compiler: clang
|
||||||
compiler: gcc
|
|
||||||
env:
|
env:
|
||||||
- FUNCTIONALTEST=functionaltest-lua
|
- CLANG_SANITIZER=TSAN
|
||||||
- CMAKE_FLAGS="$CMAKE_FLAGS -DPREFER_LUA=ON"
|
|
||||||
- DEPS_CMAKE_FLAGS="$DEPS_CMAKE_FLAGS -DUSE_BUNDLED_LUAJIT=OFF"
|
|
||||||
- *common-job-env
|
- *common-job-env
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
packages:
|
|
||||||
- *common-apt-packages
|
|
||||||
- gettext
|
|
||||||
- python-pip
|
|
||||||
- python3-pip
|
|
||||||
- python-setuptools
|
|
||||||
- python3-setuptools
|
|
||||||
- python-dev
|
|
||||||
- python3-dev
|
|
||||||
- if: type != pull_request
|
|
||||||
name: snap
|
|
||||||
os: linux
|
|
||||||
env:
|
|
||||||
- LC_ALL: C.UTF-8
|
|
||||||
- LANG: C.UTF-8
|
|
||||||
- SNAPCRAFT_ENABLE_SILENT_REPORT: y
|
|
||||||
- SNAPCRAFT_ENABLE_DEVELOPER_DEBUG: y
|
|
||||||
- SNAPCRAFT_BUILD_ENVIRONMENT: lxd
|
|
||||||
addons:
|
|
||||||
snaps:
|
|
||||||
- name: snapcraft
|
|
||||||
channel: stable
|
|
||||||
classic: true
|
|
||||||
- name: http
|
|
||||||
- name: transfer
|
|
||||||
- name: lxd
|
|
||||||
channel: stable
|
|
||||||
# Override default before_install, before_cache.
|
|
||||||
before_install: /bin/true
|
|
||||||
before_cache: /bin/true
|
|
||||||
install: ci/snap/install.sh
|
|
||||||
before_script: echo "Building snap..."
|
|
||||||
script: ci/snap/script.sh
|
|
||||||
after_success: ci/snap/after_success.sh
|
|
||||||
deploy:
|
|
||||||
skip_cleanup: true
|
|
||||||
provider: script
|
|
||||||
script: ci/snap/deploy.sh
|
|
||||||
on:
|
|
||||||
branch: master
|
|
||||||
allow_failures:
|
|
||||||
- env:
|
|
||||||
- LC_ALL: C.UTF-8
|
|
||||||
- LANG: C.UTF-8
|
|
||||||
- SNAPCRAFT_ENABLE_SILENT_REPORT: y
|
|
||||||
- SNAPCRAFT_ENABLE_DEVELOPER_DEBUG: y
|
|
||||||
- SNAPCRAFT_BUILD_ENVIRONMENT: lxd
|
|
||||||
fast_finish: true
|
fast_finish: true
|
||||||
|
|
||||||
before_install: ci/before_install.sh
|
before_install: ci/before_install.sh
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
.DONE:
|
.DONE:
|
||||||
@echo "Use GNU Make (gmake) to build neovim"
|
@echo "Please use GNU Make (gmake) to build neovim"
|
||||||
.DEFAULT:
|
.DEFAULT:
|
||||||
@echo "Use GNU Make (gmake) to build neovim"
|
@echo "Please use GNU Make (gmake) to build neovim"
|
||||||
|
140
CMakeLists.txt
140
CMakeLists.txt
@@ -2,17 +2,10 @@
|
|||||||
# intro: https://codingnest.com/basic-cmake/
|
# intro: https://codingnest.com/basic-cmake/
|
||||||
# best practices (3.0+): https://gist.github.com/mbinna/c61dbb39bca0e4fb7d1f73b0d66a4fd1
|
# best practices (3.0+): https://gist.github.com/mbinna/c61dbb39bca0e4fb7d1f73b0d66a4fd1
|
||||||
|
|
||||||
# Version should match the tested CMAKE_URL in .github/workflows/ci.yml.
|
# Version should match the tested CMAKE_URL in .travis.yml.
|
||||||
cmake_minimum_required(VERSION 3.10)
|
cmake_minimum_required(VERSION 2.8.12)
|
||||||
project(nvim C)
|
project(nvim C)
|
||||||
|
|
||||||
if(POLICY CMP0065)
|
|
||||||
cmake_policy(SET CMP0065 NEW)
|
|
||||||
endif()
|
|
||||||
if(POLICY CMP0060)
|
|
||||||
cmake_policy(SET CMP0060 NEW)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Point CMake at any custom modules we may ship
|
# Point CMake at any custom modules we may ship
|
||||||
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
|
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
|
||||||
|
|
||||||
@@ -23,23 +16,9 @@ set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
|||||||
|
|
||||||
# Prefer our bundled versions of dependencies.
|
# Prefer our bundled versions of dependencies.
|
||||||
if(DEFINED ENV{DEPS_BUILD_DIR})
|
if(DEFINED ENV{DEPS_BUILD_DIR})
|
||||||
if(CMAKE_SYSTEM_NAME MATCHES "OpenBSD")
|
set(DEPS_PREFIX "$ENV{DEPS_BUILD_DIR}/usr" CACHE PATH "Path prefix for finding dependencies")
|
||||||
# pkg-config 29.2 has a bug on OpenBSD which causes it to drop any paths that
|
|
||||||
# *contain* system include paths. To avoid this, we prefix what would be
|
|
||||||
# "/usr/include" as "/_usr/include".
|
|
||||||
# This check is also performed in the third-party/CMakeLists.txt and in the
|
|
||||||
# else clause following here.
|
|
||||||
# https://github.com/neovim/neovim/pull/14745#issuecomment-860201794
|
|
||||||
set(DEPS_PREFIX "$ENV{DEPS_BUILD_DIR}/_usr" CACHE PATH "Path prefix for finding dependencies")
|
|
||||||
else()
|
|
||||||
set(DEPS_PREFIX "$ENV{DEPS_BUILD_DIR}/usr" CACHE PATH "Path prefix for finding dependencies")
|
|
||||||
endif()
|
|
||||||
else()
|
else()
|
||||||
if(CMAKE_SYSTEM_NAME MATCHES "OpenBSD")
|
set(DEPS_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/.deps/usr" CACHE PATH "Path prefix for finding dependencies")
|
||||||
set(DEPS_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/.deps/_usr" CACHE PATH "Path prefix for finding dependencies")
|
|
||||||
else()
|
|
||||||
set(DEPS_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/.deps/usr" CACHE PATH "Path prefix for finding dependencies")
|
|
||||||
endif()
|
|
||||||
# When running from within CLion or Visual Studio,
|
# When running from within CLion or Visual Studio,
|
||||||
# build bundled dependencies automatically.
|
# build bundled dependencies automatically.
|
||||||
if(NOT EXISTS ${DEPS_PREFIX}
|
if(NOT EXISTS ${DEPS_PREFIX}
|
||||||
@@ -97,8 +76,6 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(WIN32 OR CMAKE_SYSTEM_NAME STREQUAL "Darwin")
|
if(WIN32 OR CMAKE_SYSTEM_NAME STREQUAL "Darwin")
|
||||||
# Ignore case when comparing filenames on Windows and Mac.
|
|
||||||
set(CASE_INSENSITIVE_FILENAME TRUE)
|
|
||||||
# Enable fixing case-insensitive filenames for Windows and Mac.
|
# Enable fixing case-insensitive filenames for Windows and Mac.
|
||||||
set(USE_FNAME_CASE TRUE)
|
set(USE_FNAME_CASE TRUE)
|
||||||
endif()
|
endif()
|
||||||
@@ -136,32 +113,47 @@ set_property(CACHE CMAKE_BUILD_TYPE PROPERTY
|
|||||||
# If not in a git repo (e.g., a tarball) these tokens define the complete
|
# If not in a git repo (e.g., a tarball) these tokens define the complete
|
||||||
# version string, else they are combined with the result of `git describe`.
|
# version string, else they are combined with the result of `git describe`.
|
||||||
set(NVIM_VERSION_MAJOR 0)
|
set(NVIM_VERSION_MAJOR 0)
|
||||||
set(NVIM_VERSION_MINOR 6)
|
set(NVIM_VERSION_MINOR 4)
|
||||||
set(NVIM_VERSION_PATCH 2)
|
set(NVIM_VERSION_PATCH 5)
|
||||||
set(NVIM_VERSION_PRERELEASE "-dev") # for package maintainers
|
set(NVIM_VERSION_PRERELEASE "-dev") # for package maintainers
|
||||||
|
|
||||||
# API level
|
# API level
|
||||||
set(NVIM_API_LEVEL 8) # Bump this after any API change.
|
set(NVIM_API_LEVEL 6) # Bump this after any API change.
|
||||||
set(NVIM_API_LEVEL_COMPAT 0) # Adjust this after a _breaking_ API change.
|
set(NVIM_API_LEVEL_COMPAT 0) # Adjust this after a _breaking_ API change.
|
||||||
set(NVIM_API_PRERELEASE false)
|
set(NVIM_API_PRERELEASE false)
|
||||||
|
|
||||||
|
file(TO_CMAKE_PATH ${CMAKE_CURRENT_LIST_DIR}/.git FORCED_GIT_DIR)
|
||||||
|
include(GetGitRevisionDescription)
|
||||||
|
get_git_head_revision(GIT_REFSPEC NVIM_VERSION_COMMIT)
|
||||||
|
if(NVIM_VERSION_COMMIT) # is a git repo
|
||||||
|
git_describe(NVIM_VERSION_MEDIUM)
|
||||||
|
# `git describe` annotates the most recent tagged release; for pre-release
|
||||||
|
# builds we must replace that with the unreleased version.
|
||||||
|
string(REGEX REPLACE "^v[0-9]+\\.[0-9]+\\.[0-9]+"
|
||||||
|
"v${NVIM_VERSION_MAJOR}.${NVIM_VERSION_MINOR}.${NVIM_VERSION_PATCH}"
|
||||||
|
NVIM_VERSION_MEDIUM
|
||||||
|
${NVIM_VERSION_MEDIUM})
|
||||||
|
endif()
|
||||||
|
|
||||||
set(NVIM_VERSION_BUILD_TYPE "${CMAKE_BUILD_TYPE}")
|
set(NVIM_VERSION_BUILD_TYPE "${CMAKE_BUILD_TYPE}")
|
||||||
# NVIM_VERSION_CFLAGS set further below.
|
# NVIM_VERSION_CFLAGS set further below.
|
||||||
|
|
||||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||||
|
|
||||||
|
# Minimize logging for release-type builds.
|
||||||
|
if(NOT CMAKE_C_FLAGS_RELEASE MATCHES DMIN_LOG_LEVEL)
|
||||||
|
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DMIN_LOG_LEVEL=3")
|
||||||
|
endif()
|
||||||
|
if(NOT CMAKE_C_FLAGS_MINSIZEREL MATCHES DMIN_LOG_LEVEL)
|
||||||
|
set(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DMIN_LOG_LEVEL=3")
|
||||||
|
endif()
|
||||||
|
if(NOT CMAKE_C_FLAGS_RELWITHDEBINFO MATCHES DMIN_LOG_LEVEL)
|
||||||
|
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -DMIN_LOG_LEVEL=3")
|
||||||
|
endif()
|
||||||
|
|
||||||
# Log level (MIN_LOG_LEVEL in log.h)
|
# Log level (MIN_LOG_LEVEL in log.h)
|
||||||
if("${MIN_LOG_LEVEL}" MATCHES "^$")
|
if("${MIN_LOG_LEVEL}" MATCHES "^$")
|
||||||
# Minimize logging for release-type builds.
|
message(STATUS "MIN_LOG_LEVEL not specified, default is 1 (INFO)")
|
||||||
if(CMAKE_BUILD_TYPE STREQUAL "Release"
|
|
||||||
OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo"
|
|
||||||
OR CMAKE_BUILD_TYPE STREQUAL "MinSizeRel")
|
|
||||||
message(STATUS "MIN_LOG_LEVEL not specified, default is 3 (ERROR) for release builds")
|
|
||||||
set(MIN_LOG_LEVEL 3)
|
|
||||||
else()
|
|
||||||
message(STATUS "MIN_LOG_LEVEL not specified, default is 1 (INFO)")
|
|
||||||
set(MIN_LOG_LEVEL 1)
|
|
||||||
endif()
|
|
||||||
else()
|
else()
|
||||||
if(NOT MIN_LOG_LEVEL MATCHES "^[0-3]$")
|
if(NOT MIN_LOG_LEVEL MATCHES "^[0-3]$")
|
||||||
message(FATAL_ERROR "invalid MIN_LOG_LEVEL: " ${MIN_LOG_LEVEL})
|
message(FATAL_ERROR "invalid MIN_LOG_LEVEL: " ${MIN_LOG_LEVEL})
|
||||||
@@ -283,8 +275,8 @@ else()
|
|||||||
-Wstrict-prototypes -std=gnu99 -Wshadow -Wconversion
|
-Wstrict-prototypes -std=gnu99 -Wshadow -Wconversion
|
||||||
-Wmissing-prototypes)
|
-Wmissing-prototypes)
|
||||||
|
|
||||||
check_c_compiler_flag(-Wimplicit-fallthrough HAVE_WIMPLICIT_FALLTHROUGH_FLAG)
|
check_c_compiler_flag(-Wimplicit-fallthrough HAS_WIMPLICIT_FALLTHROUGH_FLAG)
|
||||||
if(HAVE_WIMPLICIT_FALLTHROUGH_FLAG)
|
if(HAS_WIMPLICIT_FALLTHROUGH_FLAG)
|
||||||
add_compile_options(-Wimplicit-fallthrough)
|
add_compile_options(-Wimplicit-fallthrough)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -317,10 +309,8 @@ if(UNIX)
|
|||||||
|
|
||||||
if(HAS_FSTACK_PROTECTOR_STRONG_FLAG)
|
if(HAS_FSTACK_PROTECTOR_STRONG_FLAG)
|
||||||
add_compile_options(-fstack-protector-strong)
|
add_compile_options(-fstack-protector-strong)
|
||||||
link_libraries(-fstack-protector-strong)
|
|
||||||
elseif(HAS_FSTACK_PROTECTOR_FLAG)
|
elseif(HAS_FSTACK_PROTECTOR_FLAG)
|
||||||
add_compile_options(-fstack-protector --param ssp-buffer-size=4)
|
add_compile_options(-fstack-protector --param ssp-buffer-size=4)
|
||||||
link_libraries(-fstack-protector --param ssp-buffer-size=4)
|
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -338,10 +328,10 @@ if(HAS_DIAG_COLOR_FLAG)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
option(CI_BUILD "CI, extra flags will be set" OFF)
|
option(TRAVIS_CI_BUILD "Travis/QuickBuild CI, extra flags will be set" OFF)
|
||||||
|
|
||||||
if(CI_BUILD)
|
if(TRAVIS_CI_BUILD)
|
||||||
message(STATUS "CI build enabled")
|
message(STATUS "Travis/QuickBuild CI build enabled")
|
||||||
add_compile_options(-Werror)
|
add_compile_options(-Werror)
|
||||||
if(DEFINED ENV{BUILD_32BIT})
|
if(DEFINED ENV{BUILD_32BIT})
|
||||||
# Get some test coverage for unsigned char
|
# Get some test coverage for unsigned char
|
||||||
@@ -368,8 +358,8 @@ if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
|
|||||||
add_definitions(-D_GNU_SOURCE)
|
add_definitions(-D_GNU_SOURCE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT PREFER_LUA AND LUAJIT_VERSION LESS "2.1.0-beta3")
|
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
# Required for luajit < 2.1.0-beta3.
|
# Required for luajit.
|
||||||
set(CMAKE_EXE_LINKER_FLAGS
|
set(CMAKE_EXE_LINKER_FLAGS
|
||||||
"${CMAKE_EXE_LINKER_FLAGS} -pagezero_size 10000 -image_base 100000000")
|
"${CMAKE_EXE_LINKER_FLAGS} -pagezero_size 10000 -image_base 100000000")
|
||||||
set(CMAKE_SHARED_LINKER_FLAGS
|
set(CMAKE_SHARED_LINKER_FLAGS
|
||||||
@@ -390,25 +380,6 @@ include_directories(SYSTEM ${MSGPACK_INCLUDE_DIRS})
|
|||||||
find_package(LibLUV 1.30.0 REQUIRED)
|
find_package(LibLUV 1.30.0 REQUIRED)
|
||||||
include_directories(SYSTEM ${LIBLUV_INCLUDE_DIRS})
|
include_directories(SYSTEM ${LIBLUV_INCLUDE_DIRS})
|
||||||
|
|
||||||
find_package(TreeSitter REQUIRED)
|
|
||||||
include_directories(SYSTEM ${TreeSitter_INCLUDE_DIRS})
|
|
||||||
|
|
||||||
list(APPEND CMAKE_REQUIRED_INCLUDES "${TreeSitter_INCLUDE_DIRS}")
|
|
||||||
list(APPEND CMAKE_REQUIRED_LIBRARIES "${TreeSitter_LIBRARIES}")
|
|
||||||
check_c_source_compiles("
|
|
||||||
#include <tree_sitter/api.h>
|
|
||||||
int
|
|
||||||
main(void)
|
|
||||||
{
|
|
||||||
TSQueryCursor *cursor = ts_query_cursor_new();
|
|
||||||
ts_query_cursor_set_match_limit(cursor, 32);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
" TS_HAS_SET_MATCH_LIMIT)
|
|
||||||
if(TS_HAS_SET_MATCH_LIMIT)
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNVIM_TS_HAS_SET_MATCH_LIMIT")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Note: The test lib requires LuaJIT; it will be skipped if LuaJIT is missing.
|
# Note: The test lib requires LuaJIT; it will be skipped if LuaJIT is missing.
|
||||||
option(PREFER_LUA "Prefer Lua over LuaJIT in the nvim executable." OFF)
|
option(PREFER_LUA "Prefer Lua over LuaJIT in the nvim executable." OFF)
|
||||||
|
|
||||||
@@ -520,19 +491,18 @@ include(LuaHelpers)
|
|||||||
set(LUA_DEPENDENCIES lpeg mpack bit)
|
set(LUA_DEPENDENCIES lpeg mpack bit)
|
||||||
if(NOT LUA_PRG)
|
if(NOT LUA_PRG)
|
||||||
foreach(CURRENT_LUA_PRG luajit lua5.1 lua5.2 lua)
|
foreach(CURRENT_LUA_PRG luajit lua5.1 lua5.2 lua)
|
||||||
unset(_CHECK_LUA_PRG CACHE)
|
# If LUA_PRG is set find_program() will not search
|
||||||
|
unset(LUA_PRG CACHE)
|
||||||
unset(LUA_PRG_WORKS)
|
unset(LUA_PRG_WORKS)
|
||||||
find_program(_CHECK_LUA_PRG ${CURRENT_LUA_PRG})
|
find_program(LUA_PRG ${CURRENT_LUA_PRG})
|
||||||
|
|
||||||
if(_CHECK_LUA_PRG)
|
if(LUA_PRG)
|
||||||
check_lua_deps(${_CHECK_LUA_PRG} "${LUA_DEPENDENCIES}" LUA_PRG_WORKS)
|
check_lua_deps(${LUA_PRG} "${LUA_DEPENDENCIES}" LUA_PRG_WORKS)
|
||||||
if(LUA_PRG_WORKS)
|
if(LUA_PRG_WORKS)
|
||||||
set(LUA_PRG "${_CHECK_LUA_PRG}" CACHE FILEPATH "Path to a program.")
|
|
||||||
break()
|
break()
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
endforeach()
|
endforeach()
|
||||||
unset(_CHECK_LUA_PRG CACHE)
|
|
||||||
else()
|
else()
|
||||||
check_lua_deps(${LUA_PRG} "${LUA_DEPENDENCIES}" LUA_PRG_WORKS)
|
check_lua_deps(${LUA_PRG} "${LUA_DEPENDENCIES}" LUA_PRG_WORKS)
|
||||||
endif()
|
endif()
|
||||||
@@ -590,10 +560,15 @@ if(BUSTED_PRG)
|
|||||||
# console pool: to do so we need to use the USES_TERMINAL
|
# console pool: to do so we need to use the USES_TERMINAL
|
||||||
# option, but this is only available in CMake 3.2
|
# option, but this is only available in CMake 3.2
|
||||||
set(TEST_TARGET_ARGS)
|
set(TEST_TARGET_ARGS)
|
||||||
list(APPEND TEST_TARGET_ARGS "USES_TERMINAL")
|
if(NOT (${CMAKE_VERSION} VERSION_LESS 3.2.0))
|
||||||
|
list(APPEND TEST_TARGET_ARGS "USES_TERMINAL")
|
||||||
|
endif()
|
||||||
|
|
||||||
set(UNITTEST_PREREQS nvim-test unittest-headers)
|
set(UNITTEST_PREREQS nvim-test unittest-headers)
|
||||||
set(FUNCTIONALTEST_PREREQS nvim printenv-test printargs-test shell-test streams-test tty-test ${GENERATED_HELP_TAGS})
|
set(FUNCTIONALTEST_PREREQS nvim printargs-test shell-test streams-test ${GENERATED_HELP_TAGS})
|
||||||
|
if(NOT WIN32)
|
||||||
|
list(APPEND FUNCTIONALTEST_PREREQS tty-test)
|
||||||
|
endif()
|
||||||
set(BENCHMARK_PREREQS nvim tty-test)
|
set(BENCHMARK_PREREQS nvim tty-test)
|
||||||
|
|
||||||
# Useful for automated build systems, if they want to manually run the tests.
|
# Useful for automated build systems, if they want to manually run the tests.
|
||||||
@@ -689,7 +664,7 @@ endif()
|
|||||||
|
|
||||||
if(LUACHECK_PRG)
|
if(LUACHECK_PRG)
|
||||||
add_custom_target(lualint
|
add_custom_target(lualint
|
||||||
COMMAND ${LUACHECK_PRG} -q runtime/ scripts/ src/ test/
|
COMMAND ${LUACHECK_PRG} -q runtime/ src/ test/
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
else()
|
else()
|
||||||
add_custom_target(lualint false
|
add_custom_target(lualint false
|
||||||
@@ -707,14 +682,3 @@ set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
|
|||||||
set(CPACK_NSIS_MODIFY_PATH ON)
|
set(CPACK_NSIS_MODIFY_PATH ON)
|
||||||
set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
|
set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
|
||||||
include(CPack)
|
include(CPack)
|
||||||
|
|
||||||
#add uninstall target
|
|
||||||
if(NOT TARGET uninstall)
|
|
||||||
configure_file(
|
|
||||||
"cmake/UninstallHelper.cmake.in"
|
|
||||||
"${CMAKE_CURRENT_BINARY_DIR}/UninstallHelper.cmake"
|
|
||||||
IMMEDIATE @ONLY)
|
|
||||||
|
|
||||||
add_custom_target(uninstall
|
|
||||||
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/UninstallHelper.cmake)
|
|
||||||
endif()
|
|
||||||
|
157
CONTRIBUTING.md
157
CONTRIBUTING.md
@@ -8,10 +8,9 @@ If you want to help but don't know where to start, here are some
|
|||||||
low-risk/isolated tasks:
|
low-risk/isolated tasks:
|
||||||
|
|
||||||
- [Merge a Vim patch].
|
- [Merge a Vim patch].
|
||||||
- Try a [good first issue](../../labels/good-first-issue) or [complexity:low] issue.
|
- Try a [complexity:low] issue.
|
||||||
- Fix bugs found by [Clang](#clang-scan-build), [PVS](#pvs-studio) or
|
- Fix bugs found by [Clang](#clang-scan-build), [PVS](#pvs-studio) or
|
||||||
[Coverity](#coverity).
|
[Coverity](#coverity).
|
||||||
- [Improve documentation][wiki-contribute-help]
|
|
||||||
|
|
||||||
Reporting problems
|
Reporting problems
|
||||||
------------------
|
------------------
|
||||||
@@ -19,21 +18,19 @@ Reporting problems
|
|||||||
- [Check the FAQ][wiki-faq].
|
- [Check the FAQ][wiki-faq].
|
||||||
- [Search existing issues][github-issues] (including closed!)
|
- [Search existing issues][github-issues] (including closed!)
|
||||||
- Update Neovim to the latest version to see if your problem persists.
|
- Update Neovim to the latest version to see if your problem persists.
|
||||||
- Try to reproduce with `nvim --clean` ("factory defaults").
|
- Disable plugins incrementally, to narrow down the cause of the issue.
|
||||||
- [Bisect](https://neovim.io/doc/user/starting.html#bisect) your config: disable plugins incrementally, to narrow down the cause of the issue.
|
|
||||||
- [Bisect][git-bisect] Neovim's source code to find the cause of a regression, if you can. This is _extremely_ helpful.
|
|
||||||
- When reporting a crash, [include a stacktrace](https://github.com/neovim/neovim/wiki/FAQ#backtrace-linux).
|
- When reporting a crash, [include a stacktrace](https://github.com/neovim/neovim/wiki/FAQ#backtrace-linux).
|
||||||
- Use [ASAN/UBSAN](#clang-sanitizers-asan-and-ubsan) to get detailed errors for segfaults and undefined behavior.
|
- [Bisect][git-bisect] to the cause of a regression, if you are able. This is _extremely_ helpful.
|
||||||
- Check the logs. `:edit $NVIM_LOG_FILE`
|
- Check `$NVIM_LOG_FILE`, if it exists.
|
||||||
- Include `cmake --system-information` for build-related issues.
|
- Include `cmake --system-information` for build-related issues.
|
||||||
|
|
||||||
Developer guidelines
|
Developer guidelines
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
- Read `:help dev` if you are working on Nvim core.
|
- Nvim contributors should read `:help dev`.
|
||||||
- Read `:help dev-ui` if you are developing a UI.
|
- External UI developers should read `:help dev-ui`.
|
||||||
- Read `:help dev-api-client` if you are developing an API client.
|
- API client developers should read `:help dev-api-client`.
|
||||||
- Install `ninja` for faster builds of Nvim.
|
- Nvim developers are _strongly encouraged_ to install `ninja` for faster builds.
|
||||||
```
|
```
|
||||||
sudo apt-get install ninja-build
|
sudo apt-get install ninja-build
|
||||||
make distclean
|
make distclean
|
||||||
@@ -43,8 +40,8 @@ Developer guidelines
|
|||||||
Pull requests (PRs)
|
Pull requests (PRs)
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
- To avoid duplicate work, create a draft pull request.
|
- To avoid duplicate work, create a `[WIP]` pull request as soon as possible.
|
||||||
- Your PR must include [test coverage][run-tests].
|
- Your PR must include **test coverage.** See [test/README.md][run-tests].
|
||||||
- Avoid cosmetic changes to unrelated files in the same commit.
|
- Avoid cosmetic changes to unrelated files in the same commit.
|
||||||
- Use a [feature branch][git-feature-branch] instead of the master branch.
|
- Use a [feature branch][git-feature-branch] instead of the master branch.
|
||||||
- Use a **rebase workflow** for small PRs.
|
- Use a **rebase workflow** for small PRs.
|
||||||
@@ -63,55 +60,33 @@ Pull requests (PRs)
|
|||||||
- During a squash/fixup, use `exec make -C build unittest` between each
|
- During a squash/fixup, use `exec make -C build unittest` between each
|
||||||
pick/edit/reword.
|
pick/edit/reword.
|
||||||
|
|
||||||
### Stages: Draft and Ready for review
|
### Stages: WIP, RFC, RDY
|
||||||
|
|
||||||
Pull requests have two stages: Draft and Ready for review.
|
Pull requests have three stages: `[WIP]` (Work In Progress), `[RFC]` (Request
|
||||||
|
For Comment) and `[RDY]` (Ready).
|
||||||
|
|
||||||
1. [Create a Draft PR][pr-draft] while you are _not_ requesting feedback as
|
- `[RFC]` is assumed by default, i.e. you are requesting a review.
|
||||||
you are still working on the PR.
|
- Add `[WIP]` to the PR title if you are _not_ requesting feedback and the work
|
||||||
- You can skip this if your PR is ready for review.
|
is still in flux.
|
||||||
2. [Change your PR to ready][pr-ready] when the PR is ready for review.
|
- Add `[RDY]` if you are _done_ and only waiting on merge.
|
||||||
- You can convert back to Draft at any time.
|
|
||||||
|
|
||||||
Do __not__ add labels like `[RFC]` or `[WIP]` in the title to indicate the
|
|
||||||
state of your PR: this just adds noise. Non-Draft PRs are assumed to be open
|
|
||||||
for comments; if you want feedback from specific people, `@`-mention them in
|
|
||||||
a comment.
|
|
||||||
|
|
||||||
### Commit messages
|
### Commit messages
|
||||||
|
|
||||||
Follow the [conventional commits guidelines][conventional_commits] to *make reviews easier* and to make
|
Follow [commit message hygiene][hygiene] to *make reviews easier* and to make
|
||||||
the VCS/git logs more valuable. The general structure of a commit message is:
|
the VCS/git logs more valuable.
|
||||||
|
|
||||||
```
|
|
||||||
<type>([optional scope]): <description>
|
|
||||||
|
|
||||||
[optional body]
|
|
||||||
|
|
||||||
[optional footer(s)]
|
|
||||||
```
|
|
||||||
|
|
||||||
- Prefix the commit subject with one of these [_types_](https://github.com/commitizen/conventional-commit-types/blob/master/index.json):
|
|
||||||
- `build`, `ci`, `docs`, `feat`, `fix`, `perf`, `refactor`, `revert`, `test`, `vim-patch`, `chore`
|
|
||||||
- You can **ignore this for "fixup" commits** or any commits you expect to be squashed.
|
|
||||||
- Append optional scope to _type_ such as `(lsp)`, `(treesitter)`, `(float)`, …
|
|
||||||
- _Description_ shouldn't start with a capital letter or end in a period.
|
|
||||||
- Use the _imperative voice_: "Fix bug" rather than "Fixed bug" or "Fixes bug."
|
|
||||||
- Try to keep the first line under 72 characters.
|
- Try to keep the first line under 72 characters.
|
||||||
- A blank line must follow the subject.
|
- **Prefix the commit subject with a _scope_:** `doc:`, `test:`, `foo.c:`,
|
||||||
- Breaking API changes must be indicated by
|
`runtime:`, ...
|
||||||
1. "!" after the type/scope, and
|
- Subject line for commits with only style/lint changes can be a single
|
||||||
2. a "BREAKING CHANGE" footer describing the change.
|
word: `style` or `lint`.
|
||||||
Example:
|
- A blank line must separate the subject from the description.
|
||||||
```
|
- Use the _imperative voice_: "Fix bug" rather than "Fixed bug" or "Fixes bug."
|
||||||
refactor(provider)!: drop support for Python 2
|
|
||||||
|
|
||||||
BREAKING CHANGE: refactor to use Python 3 features since Python 2 is no longer supported.
|
|
||||||
```
|
|
||||||
|
|
||||||
### Automated builds (CI)
|
### Automated builds (CI)
|
||||||
|
|
||||||
Each pull request must pass the automated builds on [sourcehut] and [GitHub Actions].
|
Each pull request must pass the automated builds on [Travis CI], [QuickBuild]
|
||||||
|
and [AppVeyor].
|
||||||
|
|
||||||
- CI builds are compiled with [`-Werror`][gcc-warnings], so compiler warnings
|
- CI builds are compiled with [`-Werror`][gcc-warnings], so compiler warnings
|
||||||
will fail the build.
|
will fail the build.
|
||||||
@@ -125,19 +100,14 @@ Each pull request must pass the automated builds on [sourcehut] and [GitHub Acti
|
|||||||
- The [lint](#lint) build checks modified lines _and their immediate
|
- The [lint](#lint) build checks modified lines _and their immediate
|
||||||
neighbors_, to encourage incrementally updating the legacy style to meet our
|
neighbors_, to encourage incrementally updating the legacy style to meet our
|
||||||
[style](#style). (See [#3174][3174] for background.)
|
[style](#style). (See [#3174][3174] for background.)
|
||||||
- CI for freebsd and openbsd runs on [sourcehut].
|
- [How to investigate QuickBuild failures](https://github.com/neovim/neovim/pull/4718#issuecomment-217631350)
|
||||||
- To get a backtrace on freebsd (after connecting via ssh):
|
- QuickBuild uses this invocation:
|
||||||
```sh
|
```
|
||||||
sudo pkg install tmux # If you want tmux.
|
mkdir -p build/${params.get("buildType")} \
|
||||||
lldb build/bin/nvim -c nvim.core
|
&& cd build/${params.get("buildType")} \
|
||||||
|
&& cmake -G "Unix Makefiles" -DBUSTED_OUTPUT_TYPE=TAP -DCMAKE_BUILD_TYPE=${params.get("buildType")}
|
||||||
# To get a full backtrace:
|
-DTRAVIS_CI_BUILD=ON ../.. && ${node.getAttribute("make", "make")}
|
||||||
# 1. Rebuild with debug info.
|
VERBOSE=1 nvim unittest-prereqs functionaltest-prereqs
|
||||||
rm -rf nvim.core build
|
|
||||||
gmake CMAKE_BUILD_TYPE=RelWithDebInfo CMAKE_EXTRA_FLAGS="-DCI_BUILD=ON -DMIN_LOG_LEVEL=3" nvim
|
|
||||||
# 2. Run the failing test to generate a new core file.
|
|
||||||
TEST_FILE=test/functional/foo.lua gmake functionaltest
|
|
||||||
lldb build/bin/nvim -c nvim.core
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Clang scan-build
|
### Clang scan-build
|
||||||
@@ -162,7 +132,7 @@ see potential bugs found by [PVS Studio](https://www.viva64.com/en/pvs-studio/).
|
|||||||
|
|
||||||
- Use this format for commit messages (where `{id}` is the PVS warning-id)):
|
- Use this format for commit messages (where `{id}` is the PVS warning-id)):
|
||||||
```
|
```
|
||||||
fix(PVS/V{id}): {description}
|
PVS/V{id}: {description}
|
||||||
```
|
```
|
||||||
- Search the Neovim commit history to find examples:
|
- Search the Neovim commit history to find examples:
|
||||||
```
|
```
|
||||||
@@ -178,27 +148,13 @@ master build. To view the defects, just request access; you will be approved.
|
|||||||
- Use this format for commit messages (where `{id}` is the CID (Coverity ID);
|
- Use this format for commit messages (where `{id}` is the CID (Coverity ID);
|
||||||
([example](https://github.com/neovim/neovim/pull/804))):
|
([example](https://github.com/neovim/neovim/pull/804))):
|
||||||
```
|
```
|
||||||
fix(coverity/{id}): {description}
|
coverity/{id}: {description}
|
||||||
```
|
```
|
||||||
- Search the Neovim commit history to find examples:
|
- Search the Neovim commit history to find examples:
|
||||||
```
|
```
|
||||||
git log --oneline --no-merges --grep coverity
|
git log --oneline --no-merges --grep coverity
|
||||||
```
|
```
|
||||||
|
|
||||||
### Clang sanitizers (ASAN and UBSAN)
|
|
||||||
|
|
||||||
ASAN/UBSAN can be used to detect memory errors and other common forms of undefined behavior at runtime in debug builds.
|
|
||||||
|
|
||||||
- To build Neovim with sanitizers enabled, use
|
|
||||||
```
|
|
||||||
rm -rf build && CMAKE_EXTRA_FLAGS="-DCMAKE_C_COMPILER=clang -DCLANG_ASAN_UBSAN=1" make
|
|
||||||
```
|
|
||||||
- When running Neovim, use
|
|
||||||
```
|
|
||||||
UBSAN_OPTIONS=print_stacktrace=1 ASAN_OPTIONS=log_path=/tmp/nvim_asan nvim args...
|
|
||||||
```
|
|
||||||
- If Neovim exits unexpectedly, check `/tmp/nvim_asan.{PID}` (or your preferred `log_path`) for log files with error messages.
|
|
||||||
|
|
||||||
|
|
||||||
Coding
|
Coding
|
||||||
------
|
------
|
||||||
@@ -218,28 +174,16 @@ You can lint a single file (but this will _not_ exclude legacy errors):
|
|||||||
|
|
||||||
### Style
|
### Style
|
||||||
|
|
||||||
- Style rules are (mostly) defined by `src/uncrustify.cfg` which tries to match
|
The repo includes a `.clang-format` config file which (mostly) matches the
|
||||||
the [style-guide]. To use the Nvim `gq` command with `uncrustify`:
|
[style-guide]. You can use `clang-format` to format code with the `gq`
|
||||||
```
|
operator in Nvim:
|
||||||
if !empty(findfile('src/uncrustify.cfg', ';'))
|
|
||||||
setlocal formatprg=uncrustify\ -q\ -l\ C\ -c\ src/uncrustify.cfg\ --no-backup
|
if !empty(findfile('.clang-format', ';'))
|
||||||
endif
|
setlocal formatprg=clang-format\ -style=file
|
||||||
```
|
endif
|
||||||
The required version of `uncrustify` is specified in `uncrustify.cfg`.
|
|
||||||
- There is also `.clang-format` which has drifted from the [style-guide], but
|
|
||||||
is available for reference. To use the Nvim `gq` command with `clang-format`:
|
|
||||||
```
|
|
||||||
if !empty(findfile('.clang-format', ';'))
|
|
||||||
setlocal formatprg=clang-format\ -style=file
|
|
||||||
endif
|
|
||||||
```
|
|
||||||
|
|
||||||
### Navigate
|
### Navigate
|
||||||
|
|
||||||
- Set `blame.ignoreRevsFile` to ignore [noise commits](https://github.com/neovim/neovim/commit/2d240024acbd68c2d3f82bc72cb12b1a4928c6bf) in git blame:
|
|
||||||
```
|
|
||||||
git config blame.ignoreRevsFile .git-blame-ignore-revs
|
|
||||||
```
|
|
||||||
- Use **[universal-ctags](https://github.com/universal-ctags/ctags).**
|
- Use **[universal-ctags](https://github.com/universal-ctags/ctags).**
|
||||||
("Exuberant ctags", the typical `ctags` binary provided by your distro, is
|
("Exuberant ctags", the typical `ctags` binary provided by your distro, is
|
||||||
unmaintained and won't recognize many function signatures in Neovim source.)
|
unmaintained and won't recognize many function signatures in Neovim source.)
|
||||||
@@ -271,20 +215,17 @@ as context, use the `-W` argument as well.
|
|||||||
[github-issues]: https://github.com/neovim/neovim/issues
|
[github-issues]: https://github.com/neovim/neovim/issues
|
||||||
[1820]: https://github.com/neovim/neovim/pull/1820
|
[1820]: https://github.com/neovim/neovim/pull/1820
|
||||||
[hub]: https://hub.github.com/
|
[hub]: https://hub.github.com/
|
||||||
[conventional_commits]: https://www.conventionalcommits.org
|
[hygiene]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
|
||||||
[style-guide]: https://neovim.io/doc/user/dev_style.html#dev-style
|
[style-guide]: http://neovim.io/develop/style-guide.xml
|
||||||
[ASan]: http://clang.llvm.org/docs/AddressSanitizer.html
|
[ASan]: http://clang.llvm.org/docs/AddressSanitizer.html
|
||||||
[run-tests]: https://github.com/neovim/neovim/blob/master/test/README.md#running-tests
|
[run-tests]: https://github.com/neovim/neovim/blob/master/test/README.md#running-tests
|
||||||
[wiki-faq]: https://github.com/neovim/neovim/wiki/FAQ
|
[wiki-faq]: https://github.com/neovim/neovim/wiki/FAQ
|
||||||
[review-checklist]: https://github.com/neovim/neovim/wiki/Code-review-checklist
|
[review-checklist]: https://github.com/neovim/neovim/wiki/Code-review-checklist
|
||||||
[3174]: https://github.com/neovim/neovim/issues/3174
|
[3174]: https://github.com/neovim/neovim/issues/3174
|
||||||
[sourcehut]: https://builds.sr.ht/~jmk
|
[Travis CI]: https://travis-ci.org/neovim/neovim
|
||||||
[GitHub Actions]: https://github.com/neovim/neovim/actions
|
[QuickBuild]: http://neovim-qb.szakmeister.net/dashboard
|
||||||
|
[AppVeyor]: https://ci.appveyor.com/project/neovim/neovim
|
||||||
[Merge a Vim patch]: https://github.com/neovim/neovim/wiki/Merging-patches-from-upstream-Vim
|
[Merge a Vim patch]: https://github.com/neovim/neovim/wiki/Merging-patches-from-upstream-Vim
|
||||||
[Clang report]: https://neovim.io/doc/reports/clang/
|
[Clang report]: https://neovim.io/doc/reports/clang/
|
||||||
[complexity:low]: https://github.com/neovim/neovim/issues?q=is%3Aopen+is%3Aissue+label%3Acomplexity%3Alow
|
[complexity:low]: https://github.com/neovim/neovim/issues?q=is%3Aopen+is%3Aissue+label%3Acomplexity%3Alow
|
||||||
[master error list]: https://raw.githubusercontent.com/neovim/doc/gh-pages/reports/clint/errors.json
|
[master error list]: https://raw.githubusercontent.com/neovim/doc/gh-pages/reports/clint/errors.json
|
||||||
[wiki-contribute-help]: https://github.com/neovim/neovim/wiki/contribute-%3Ahelp
|
|
||||||
[pr-draft]: https://docs.github.com/en/github/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request
|
|
||||||
[pr-ready]: https://docs.github.com/en/github/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/changing-the-stage-of-a-pull-request
|
|
||||||
[uncrustify]: https://formulae.brew.sh/formula/uncrustify
|
|
||||||
|
11
LICENSE
11
LICENSE
@@ -189,17 +189,8 @@ contributed under the Vim license and (2) externally maintained libraries.
|
|||||||
The externally maintained libraries used by Neovim are:
|
The externally maintained libraries used by Neovim are:
|
||||||
|
|
||||||
- Klib: a Generic Library in C. MIT/X11 license.
|
- Klib: a Generic Library in C. MIT/X11 license.
|
||||||
- Lua: MIT license
|
|
||||||
- LuaJIT: a Just-In-Time Compiler for Lua. Copyright Mike Pall. MIT license.
|
|
||||||
- Luv: Apache 2.0 license
|
|
||||||
- libmpack: MIT license
|
|
||||||
- libtermkey: MIT license
|
|
||||||
- libuv. Copyright Joyent, Inc. and other Node contributors. Node.js license.
|
- libuv. Copyright Joyent, Inc. and other Node contributors. Node.js license.
|
||||||
- libvterm: MIT license
|
- LuaJIT: a Just-In-Time Compiler for Lua. Copyright Mike Pall. MIT license.
|
||||||
- lua-compat: MIT license
|
|
||||||
- tree-sitter: MIT license
|
|
||||||
- xdiff: LGPL license
|
|
||||||
- lua-cjson: MIT license
|
|
||||||
|
|
||||||
====
|
====
|
||||||
|
|
||||||
|
43
MAINTAIN.md
43
MAINTAIN.md
@@ -10,13 +10,14 @@ General guidelines
|
|||||||
* Write down what was decided
|
* Write down what was decided
|
||||||
* Constraints are good
|
* Constraints are good
|
||||||
* Use automation to solve problems
|
* Use automation to solve problems
|
||||||
* Never break the API... but sometimes break the UI
|
* Never break the API
|
||||||
|
|
||||||
Ticket triage
|
Ticket triage
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
In practice we haven't found a way to forecast more precisely than "next" and
|
In practice we haven't found a meaningful way to forecast more precisely than
|
||||||
"after next". So there are usually one or two (at most) planned milestones:
|
"next" and "after next". That means there are usually one or two (at most)
|
||||||
|
planned milestones:
|
||||||
|
|
||||||
- Next bugfix-release (1.0.x)
|
- Next bugfix-release (1.0.x)
|
||||||
- Next feature-release (1.x.0)
|
- Next feature-release (1.x.0)
|
||||||
@@ -24,16 +25,16 @@ In practice we haven't found a way to forecast more precisely than "next" and
|
|||||||
The forecasting problem might be solved with an explicit priority system (like
|
The forecasting problem might be solved with an explicit priority system (like
|
||||||
Bram's todo.txt). Meanwhile the Neovim priority system is defined by:
|
Bram's todo.txt). Meanwhile the Neovim priority system is defined by:
|
||||||
|
|
||||||
- PRs nearing completion.
|
- PRs nearing completion (RDY).
|
||||||
- Issue labels. E.g. the `+plan` label increases the ticket's priority merely
|
- Issue labels. E.g. the `+plan` label increases the ticket's priority merely
|
||||||
for having a plan written down: it is _closer to completion_ than tickets
|
for having a plan written down: it is _closer to completion_ than tickets
|
||||||
without a plan.
|
without a plan.
|
||||||
- Comment activity or new information.
|
- Comment activity or new information.
|
||||||
|
|
||||||
Anything that isn't in the next milestone, and doesn't have a finished PR—is
|
Anything that isn't in the next milestone, and doesn't have a RDY PR ... is
|
||||||
just not something you care very much about, by construction. Post-release you
|
just not something you care very much about, by construction. Post-release you
|
||||||
can review open issues, but chances are your next milestone is already getting
|
can review open issues, but chances are your next milestone is already getting
|
||||||
full... :)
|
full :)
|
||||||
|
|
||||||
Release policy
|
Release policy
|
||||||
--------------
|
--------------
|
||||||
@@ -55,36 +56,6 @@ has a major bug:
|
|||||||
- The [nightly job](https://github.com/neovim/bot-ci/blob/master/ci/nightly.sh)
|
- The [nightly job](https://github.com/neovim/bot-ci/blob/master/ci/nightly.sh)
|
||||||
will update the release assets based on the `stable` tag.
|
will update the release assets based on the `stable` tag.
|
||||||
|
|
||||||
The neovim repository includes a backport [github action](https://github.com/zeebe-io/backport-action).
|
|
||||||
In order to trigger the action, a PR must be labeled with a label matching the
|
|
||||||
form `backport release-0.X`. If the label is applied before the PR is merged,
|
|
||||||
the backport will be filed automatically against the target branch. Otherwise,
|
|
||||||
comment `\backport` on the merged PR *after* the label has been applied to trigger
|
|
||||||
a backport. Note, the PR must have a description in the issue body, or the backport
|
|
||||||
will fail.
|
|
||||||
|
|
||||||
Third-party dependencies
|
|
||||||
--------------
|
|
||||||
|
|
||||||
These "bundled" dependencies can be updated by bumping their versions in `third-party/CMakeLists.txt`:
|
|
||||||
- [Lua](https://www.lua.org/download.html)
|
|
||||||
- [LuaJIT](https://github.com/LuaJIT/LuaJIT)
|
|
||||||
- [Luv](https://github.com/luvit/luv)
|
|
||||||
- [libtermkey](https://github.com/neovim/libtermkey)
|
|
||||||
- [libuv](https://github.com/libuv/libuv)
|
|
||||||
- [libvterm](http://www.leonerd.org.uk/code/libvterm/)
|
|
||||||
- [lua-compat](https://github.com/keplerproject/lua-compat-5.3)
|
|
||||||
- [tree-sitter](https://github.com/tree-sitter/tree-sitter)
|
|
||||||
|
|
||||||
These dependencies are "vendored" (inlined), we need to update the sources manually:
|
|
||||||
- [libmpack](https://github.com/libmpack/libmpack)
|
|
||||||
- [xdiff](https://github.com/git/git/tree/master/xdiff)
|
|
||||||
- [lua-cjson](https://github.com/openresty/lua-cjson)
|
|
||||||
- [Klib](https://github.com/attractivechaos/klib)
|
|
||||||
|
|
||||||
We also maintain some forks, particularly for Windows, if we are waiting on upstream changes:
|
|
||||||
https://github.com/neovim/neovim/wiki/Deps
|
|
||||||
|
|
||||||
See also
|
See also
|
||||||
--------
|
--------
|
||||||
|
|
||||||
|
103
Makefile
103
Makefile
@@ -1,6 +1,4 @@
|
|||||||
MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST)))
|
THIS_DIR = $(shell pwd)
|
||||||
MAKEFILE_DIR := $(dir $(MAKEFILE_PATH))
|
|
||||||
|
|
||||||
filter-false = $(strip $(filter-out 0 off OFF false FALSE,$1))
|
filter-false = $(strip $(filter-out 0 off OFF false FALSE,$1))
|
||||||
filter-true = $(strip $(filter-out 1 on ON true TRUE,$1))
|
filter-true = $(strip $(filter-out 1 on ON true TRUE,$1))
|
||||||
|
|
||||||
@@ -14,7 +12,6 @@ CMAKE_BUILD_TYPE ?= Debug
|
|||||||
CMAKE_FLAGS := -DCMAKE_BUILD_TYPE=$(CMAKE_BUILD_TYPE)
|
CMAKE_FLAGS := -DCMAKE_BUILD_TYPE=$(CMAKE_BUILD_TYPE)
|
||||||
# Extra CMake flags which extend the default set
|
# Extra CMake flags which extend the default set
|
||||||
CMAKE_EXTRA_FLAGS ?=
|
CMAKE_EXTRA_FLAGS ?=
|
||||||
NVIM_PRG := $(MAKEFILE_DIR)/build/bin/nvim
|
|
||||||
|
|
||||||
# CMAKE_INSTALL_PREFIX
|
# CMAKE_INSTALL_PREFIX
|
||||||
# - May be passed directly or as part of CMAKE_EXTRA_FLAGS.
|
# - May be passed directly or as part of CMAKE_EXTRA_FLAGS.
|
||||||
@@ -38,7 +35,7 @@ else
|
|||||||
checkprefix: ;
|
checkprefix: ;
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CMAKE_GENERATOR ?= $(shell (command -v ninja > /dev/null 2>&1 && echo "Ninja") || \
|
BUILD_TYPE ?= $(shell (type ninja > /dev/null 2>&1 && echo "Ninja") || \
|
||||||
echo "Unix Makefiles")
|
echo "Unix Makefiles")
|
||||||
DEPS_BUILD_DIR ?= .deps
|
DEPS_BUILD_DIR ?= .deps
|
||||||
ifneq (1,$(words [$(DEPS_BUILD_DIR)]))
|
ifneq (1,$(words [$(DEPS_BUILD_DIR)]))
|
||||||
@@ -46,28 +43,25 @@ ifneq (1,$(words [$(DEPS_BUILD_DIR)]))
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq (,$(BUILD_TOOL))
|
ifeq (,$(BUILD_TOOL))
|
||||||
ifeq (Ninja,$(CMAKE_GENERATOR))
|
ifeq (Ninja,$(BUILD_TYPE))
|
||||||
ifneq ($(shell $(CMAKE_PRG) --help 2>/dev/null | grep Ninja),)
|
ifneq ($(shell $(CMAKE_PRG) --help 2>/dev/null | grep Ninja),)
|
||||||
BUILD_TOOL = ninja
|
BUILD_TOOL := ninja
|
||||||
else
|
else
|
||||||
# User's version of CMake doesn't support Ninja
|
# User's version of CMake doesn't support Ninja
|
||||||
BUILD_TOOL = $(MAKE)
|
BUILD_TOOL = $(MAKE)
|
||||||
CMAKE_GENERATOR := Unix Makefiles
|
BUILD_TYPE := Unix Makefiles
|
||||||
endif
|
endif
|
||||||
else
|
else
|
||||||
BUILD_TOOL = $(MAKE)
|
BUILD_TOOL = $(MAKE)
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
BUILD_CMD = $(BUILD_TOOL)
|
||||||
|
|
||||||
# Only need to handle Ninja here. Make will inherit the VERBOSE variable, and the -j, -l, and -n flags.
|
ifneq ($(VERBOSE),)
|
||||||
ifeq ($(CMAKE_GENERATOR),Ninja)
|
# Only need to handle Ninja here. Make will inherit the VERBOSE variable.
|
||||||
ifneq ($(VERBOSE),)
|
ifeq ($(BUILD_TYPE),Ninja)
|
||||||
BUILD_TOOL += -v
|
BUILD_CMD += -v
|
||||||
endif
|
|
||||||
BUILD_TOOL += $(shell printf '%s' '$(MAKEFLAGS)' | grep -o -- ' *-[jl][0-9]\+ *')
|
|
||||||
ifeq (n,$(findstring n,$(firstword -$(MAKEFLAGS))))
|
|
||||||
BUILD_TOOL += -n
|
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@@ -89,22 +83,22 @@ endif
|
|||||||
SINGLE_MAKE = export MAKEFLAGS= ; $(MAKE)
|
SINGLE_MAKE = export MAKEFLAGS= ; $(MAKE)
|
||||||
|
|
||||||
nvim: build/.ran-cmake deps
|
nvim: build/.ran-cmake deps
|
||||||
+$(BUILD_TOOL) -C build
|
+$(BUILD_CMD) -C build
|
||||||
|
|
||||||
libnvim: build/.ran-cmake deps
|
libnvim: build/.ran-cmake deps
|
||||||
+$(BUILD_TOOL) -C build libnvim
|
+$(BUILD_CMD) -C build libnvim
|
||||||
|
|
||||||
cmake:
|
cmake:
|
||||||
touch CMakeLists.txt
|
touch CMakeLists.txt
|
||||||
$(MAKE) build/.ran-cmake
|
$(MAKE) build/.ran-cmake
|
||||||
|
|
||||||
build/.ran-cmake: | deps
|
build/.ran-cmake: | deps
|
||||||
cd build && $(CMAKE_PRG) -G '$(CMAKE_GENERATOR)' $(CMAKE_FLAGS) $(CMAKE_EXTRA_FLAGS) $(MAKEFILE_DIR)
|
cd build && $(CMAKE_PRG) -G '$(BUILD_TYPE)' $(CMAKE_FLAGS) $(CMAKE_EXTRA_FLAGS) $(THIS_DIR)
|
||||||
touch $@
|
touch $@
|
||||||
|
|
||||||
deps: | build/.ran-third-party-cmake
|
deps: | build/.ran-third-party-cmake
|
||||||
ifeq ($(call filter-true,$(USE_BUNDLED)),)
|
ifeq ($(call filter-true,$(USE_BUNDLED)),)
|
||||||
+$(BUILD_TOOL) -C $(DEPS_BUILD_DIR)
|
+$(BUILD_CMD) -C $(DEPS_BUILD_DIR)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(call filter-true,$(USE_BUNDLED)),)
|
ifeq ($(call filter-true,$(USE_BUNDLED)),)
|
||||||
@@ -112,8 +106,8 @@ $(DEPS_BUILD_DIR):
|
|||||||
mkdir -p "$@"
|
mkdir -p "$@"
|
||||||
build/.ran-third-party-cmake:: $(DEPS_BUILD_DIR)
|
build/.ran-third-party-cmake:: $(DEPS_BUILD_DIR)
|
||||||
cd $(DEPS_BUILD_DIR) && \
|
cd $(DEPS_BUILD_DIR) && \
|
||||||
$(CMAKE_PRG) -G '$(CMAKE_GENERATOR)' $(BUNDLED_CMAKE_FLAG) $(BUNDLED_LUA_CMAKE_FLAG) \
|
$(CMAKE_PRG) -G '$(BUILD_TYPE)' $(BUNDLED_CMAKE_FLAG) $(BUNDLED_LUA_CMAKE_FLAG) \
|
||||||
$(DEPS_CMAKE_FLAGS) $(MAKEFILE_DIR)/third-party
|
$(DEPS_CMAKE_FLAGS) $(THIS_DIR)/third-party
|
||||||
endif
|
endif
|
||||||
build/.ran-third-party-cmake::
|
build/.ran-third-party-cmake::
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
@@ -123,39 +117,26 @@ build/.ran-third-party-cmake::
|
|||||||
oldtest: | nvim build/runtime/doc/tags
|
oldtest: | nvim build/runtime/doc/tags
|
||||||
+$(SINGLE_MAKE) -C src/nvim/testdir clean
|
+$(SINGLE_MAKE) -C src/nvim/testdir clean
|
||||||
ifeq ($(strip $(TEST_FILE)),)
|
ifeq ($(strip $(TEST_FILE)),)
|
||||||
+$(SINGLE_MAKE) -C src/nvim/testdir NVIM_PRG=$(NVIM_PRG) $(MAKEOVERRIDES)
|
+$(SINGLE_MAKE) -C src/nvim/testdir NVIM_PRG="$(realpath build/bin/nvim)" $(MAKEOVERRIDES)
|
||||||
else
|
else
|
||||||
@# Handle TEST_FILE=test_foo{,.res,.vim}.
|
+$(SINGLE_MAKE) -C src/nvim/testdir NVIM_PRG="$(realpath build/bin/nvim)" NEW_TESTS=$(TEST_FILE) SCRIPTS= $(MAKEOVERRIDES)
|
||||||
+$(SINGLE_MAKE) -C src/nvim/testdir NVIM_PRG=$(NVIM_PRG) SCRIPTS= $(MAKEOVERRIDES) $(patsubst %.vim,%,$(patsubst %.res,%,$(TEST_FILE)))
|
|
||||||
endif
|
endif
|
||||||
# Build oldtest by specifying the relative .vim filename.
|
|
||||||
.PHONY: phony_force
|
|
||||||
src/nvim/testdir/%.vim: phony_force
|
|
||||||
+$(SINGLE_MAKE) -C src/nvim/testdir NVIM_PRG=$(NVIM_PRG) SCRIPTS= $(MAKEOVERRIDES) $(patsubst src/nvim/testdir/%.vim,%,$@)
|
|
||||||
|
|
||||||
build/runtime/doc/tags helptags: | nvim
|
build/runtime/doc/tags helptags: | nvim
|
||||||
+$(BUILD_TOOL) -C build runtime/doc/tags
|
+$(BUILD_CMD) -C build runtime/doc/tags
|
||||||
|
|
||||||
# Builds help HTML _and_ checks for invalid help tags.
|
# Builds help HTML _and_ checks for invalid help tags.
|
||||||
helphtml: | nvim build/runtime/doc/tags
|
helphtml: | nvim build/runtime/doc/tags
|
||||||
+$(BUILD_TOOL) -C build doc_html
|
+$(BUILD_CMD) -C build doc_html
|
||||||
|
|
||||||
functionaltest: | nvim
|
functionaltest: | nvim
|
||||||
+$(BUILD_TOOL) -C build functionaltest
|
+$(BUILD_CMD) -C build functionaltest
|
||||||
|
|
||||||
functionaltest-lua: | nvim
|
functionaltest-lua: | nvim
|
||||||
+$(BUILD_TOOL) -C build functionaltest-lua
|
+$(BUILD_CMD) -C build functionaltest-lua
|
||||||
|
|
||||||
lualint: | build/.ran-cmake deps
|
lualint: | build/.ran-cmake deps
|
||||||
$(BUILD_TOOL) -C build lualint
|
$(BUILD_CMD) -C build lualint
|
||||||
|
|
||||||
shlint:
|
|
||||||
@shellcheck --version | head -n 2
|
|
||||||
shellcheck scripts/vim-patch.sh
|
|
||||||
|
|
||||||
_opt_shlint:
|
|
||||||
@command -v shellcheck && { $(MAKE) shlint; exit $$?; } \
|
|
||||||
|| echo "SKIP: shlint (shellcheck not found)"
|
|
||||||
|
|
||||||
pylint:
|
pylint:
|
||||||
flake8 contrib/ scripts/ src/ test/
|
flake8 contrib/ scripts/ src/ test/
|
||||||
@@ -165,45 +146,37 @@ _opt_pylint:
|
|||||||
@command -v flake8 && { $(MAKE) pylint; exit $$?; } \
|
@command -v flake8 && { $(MAKE) pylint; exit $$?; } \
|
||||||
|| echo "SKIP: pylint (flake8 not found)"
|
|| echo "SKIP: pylint (flake8 not found)"
|
||||||
|
|
||||||
commitlint:
|
|
||||||
$(NVIM_PRG) --clean -es +"lua require('scripts.lintcommit').main({trace=false})"
|
|
||||||
|
|
||||||
_opt_commitlint:
|
|
||||||
@test -x build/bin/nvim && { $(MAKE) commitlint; exit $$?; } \
|
|
||||||
|| echo "SKIP: commitlint (build/bin/nvim not found)"
|
|
||||||
|
|
||||||
unittest: | nvim
|
unittest: | nvim
|
||||||
+$(BUILD_TOOL) -C build unittest
|
+$(BUILD_CMD) -C build unittest
|
||||||
|
|
||||||
benchmark: | nvim
|
benchmark: | nvim
|
||||||
+$(BUILD_TOOL) -C build benchmark
|
+$(BUILD_CMD) -C build benchmark
|
||||||
|
|
||||||
test: functionaltest unittest
|
test: functionaltest unittest
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
+test -d build && $(BUILD_TOOL) -C build clean || true
|
+test -d build && $(BUILD_CMD) -C build clean || true
|
||||||
$(MAKE) -C src/nvim/testdir clean
|
$(MAKE) -C src/nvim/testdir clean
|
||||||
$(MAKE) -C runtime/doc clean
|
$(MAKE) -C runtime/doc clean
|
||||||
$(MAKE) -C runtime/indent clean
|
|
||||||
|
|
||||||
distclean:
|
distclean:
|
||||||
rm -rf $(DEPS_BUILD_DIR) build
|
rm -rf $(DEPS_BUILD_DIR) build
|
||||||
$(MAKE) clean
|
$(MAKE) clean
|
||||||
|
|
||||||
install: checkprefix nvim
|
install: checkprefix nvim
|
||||||
+$(BUILD_TOOL) -C build install
|
+$(BUILD_CMD) -C build install
|
||||||
|
|
||||||
clint: build/.ran-cmake
|
clint: build/.ran-cmake
|
||||||
+$(BUILD_TOOL) -C build clint
|
+$(BUILD_CMD) -C build clint
|
||||||
|
|
||||||
clint-full: build/.ran-cmake
|
clint-full: build/.ran-cmake
|
||||||
+$(BUILD_TOOL) -C build clint-full
|
+$(BUILD_CMD) -C build clint-full
|
||||||
|
|
||||||
check-single-includes: build/.ran-cmake
|
check-single-includes: build/.ran-cmake
|
||||||
+$(BUILD_TOOL) -C build check-single-includes
|
+$(BUILD_CMD) -C build check-single-includes
|
||||||
|
|
||||||
generated-sources: build/.ran-cmake
|
generated-sources: build/.ran-cmake
|
||||||
+$(BUILD_TOOL) -C build generated-sources
|
+$(BUILD_CMD) -C build generated-sources
|
||||||
|
|
||||||
appimage:
|
appimage:
|
||||||
bash scripts/genappimage.sh
|
bash scripts/genappimage.sh
|
||||||
@@ -214,16 +187,16 @@ appimage:
|
|||||||
appimage-%:
|
appimage-%:
|
||||||
bash scripts/genappimage.sh $*
|
bash scripts/genappimage.sh $*
|
||||||
|
|
||||||
lint: check-single-includes clint lualint _opt_pylint _opt_shlint _opt_commitlint
|
lint: check-single-includes clint lualint _opt_pylint
|
||||||
|
|
||||||
# Generic pattern rules, allowing for `make build/bin/nvim` etc.
|
# Generic pattern rules, allowing for `make build/bin/nvim` etc.
|
||||||
# Does not work with "Unix Makefiles".
|
# Does not work with "Unix Makefiles".
|
||||||
ifeq ($(CMAKE_GENERATOR),Ninja)
|
ifeq ($(BUILD_TYPE),Ninja)
|
||||||
build/%: phony_force
|
build/%:
|
||||||
$(BUILD_TOOL) -C build $(patsubst build/%,%,$@)
|
$(BUILD_CMD) -C build $(patsubst build/%,%,$@)
|
||||||
|
|
||||||
$(DEPS_BUILD_DIR)/%: phony_force
|
$(DEPS_BUILD_DIR)/%:
|
||||||
$(BUILD_TOOL) -C $(DEPS_BUILD_DIR) $(patsubst $(DEPS_BUILD_DIR)/%,%,$@)
|
$(BUILD_CMD) -C $(DEPS_BUILD_DIR) $(patsubst $(DEPS_BUILD_DIR)/%,%,$@)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
.PHONY: test lualint pylint shlint functionaltest unittest lint clint clean distclean nvim libnvim cmake deps install appimage checkprefix commitlint
|
.PHONY: test lualint pylint functionaltest unittest lint clint clean distclean nvim libnvim cmake deps install appimage checkprefix
|
||||||
|
50
README.md
50
README.md
@@ -1,10 +1,12 @@
|
|||||||
[](https://neovim.io)
|
[](https://neovim.io)
|
||||||
|
|
||||||
[Documentation](https://neovim.io/doc/general/) |
|
[Wiki](https://github.com/neovim/neovim/wiki) |
|
||||||
[Chat](https://app.element.io/#/room/#neovim:matrix.org) |
|
[Documentation](https://neovim.io/doc) |
|
||||||
|
[Chat/Discussion](https://gitter.im/neovim/neovim) |
|
||||||
[Twitter](https://twitter.com/Neovim)
|
[Twitter](https://twitter.com/Neovim)
|
||||||
|
|
||||||
[](https://github.com/neovim/neovim/actions?query=workflow%3ACI+branch%3Amaster+event%3Apush)
|
[](https://travis-ci.org/neovim/neovim)
|
||||||
|
[](https://ci.appveyor.com/project/neovim/neovim/branch/master)
|
||||||
[](https://codecov.io/gh/neovim/neovim)
|
[](https://codecov.io/gh/neovim/neovim)
|
||||||
[](https://scan.coverity.com/projects/2227)
|
[](https://scan.coverity.com/projects/2227)
|
||||||
[](https://neovim.io/doc/reports/clang)
|
[](https://neovim.io/doc/reports/clang)
|
||||||
@@ -13,7 +15,6 @@
|
|||||||
[](https://repology.org/metapackage/neovim)
|
[](https://repology.org/metapackage/neovim)
|
||||||
[](https://buildd.debian.org/neovim)
|
[](https://buildd.debian.org/neovim)
|
||||||
[](https://github.com/neovim/neovim/releases/)
|
[](https://github.com/neovim/neovim/releases/)
|
||||||
[](https://snapcraft.io/nvim)
|
|
||||||
|
|
||||||
Neovim is a project that seeks to aggressively refactor Vim in order to:
|
Neovim is a project that seeks to aggressively refactor Vim in order to:
|
||||||
|
|
||||||
@@ -46,15 +47,13 @@ Install from package
|
|||||||
Pre-built packages for Windows, macOS, and Linux are found on the
|
Pre-built packages for Windows, macOS, and Linux are found on the
|
||||||
[Releases](https://github.com/neovim/neovim/releases/) page.
|
[Releases](https://github.com/neovim/neovim/releases/) page.
|
||||||
|
|
||||||
[Managed packages] are in [Homebrew], [Debian], [Ubuntu], [Fedora], [Arch Linux], [Void Linux], [Gentoo], and more!
|
[Managed packages] are in Homebrew, [Debian], [Ubuntu], [Fedora], [Arch Linux],
|
||||||
|
[Gentoo], and more!
|
||||||
|
|
||||||
Install from source
|
Install from source
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
See the [Building Neovim](https://github.com/neovim/neovim/wiki/Building-Neovim) wiki page for details.
|
|
||||||
|
|
||||||
The build is CMake-based, but a Makefile is provided as a convenience.
|
The build is CMake-based, but a Makefile is provided as a convenience.
|
||||||
After installing the dependencies, run the following command.
|
|
||||||
|
|
||||||
make CMAKE_BUILD_TYPE=RelWithDebInfo
|
make CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||||
sudo make install
|
sudo make install
|
||||||
@@ -64,12 +63,29 @@ To install to a non-default location:
|
|||||||
make CMAKE_INSTALL_PREFIX=/full/path/
|
make CMAKE_INSTALL_PREFIX=/full/path/
|
||||||
make install
|
make install
|
||||||
|
|
||||||
CMake hints for inspecting the build:
|
To skip bundled (`third-party/*`) dependencies:
|
||||||
|
|
||||||
|
1. Install the dependencies using a package manager.
|
||||||
|
```
|
||||||
|
sudo apt install gperf luajit luarocks libuv1-dev libluajit-5.1-dev libunibilium-dev libmsgpack-dev libtermkey-dev libvterm-dev
|
||||||
|
sudo luarocks build mpack
|
||||||
|
sudo luarocks build lpeg
|
||||||
|
sudo luarocks build inspect
|
||||||
|
```
|
||||||
|
2. Build with `USE_BUNDLED=OFF`:
|
||||||
|
```
|
||||||
|
make CMAKE_BUILD_TYPE=RelWithDebInfo USE_BUNDLED=OFF
|
||||||
|
sudo make install
|
||||||
|
```
|
||||||
|
|
||||||
|
To inspect the build, these CMake features are useful:
|
||||||
|
|
||||||
- `cmake --build build --target help` lists all build targets.
|
- `cmake --build build --target help` lists all build targets.
|
||||||
- `build/CMakeCache.txt` (or `cmake -LAH build/`) contains the resolved values of all CMake variables.
|
- `build/CMakeCache.txt` (or `cmake -LAH build/`) contains the resolved values of all CMake variables.
|
||||||
- `build/compile_commands.json` shows the full compiler invocations for each translation unit.
|
- `build/compile_commands.json` shows the full compiler invocations for each translation unit.
|
||||||
|
|
||||||
|
See the [Building Neovim](https://github.com/neovim/neovim/wiki/Building-Neovim) wiki page for details.
|
||||||
|
|
||||||
Transitioning from Vim
|
Transitioning from Vim
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
@@ -97,9 +113,17 @@ Project layout
|
|||||||
License
|
License
|
||||||
-------
|
-------
|
||||||
|
|
||||||
Neovim contributions since [b17d96][license-commit] are licensed under the
|
Neovim is licensed under the terms of the Apache 2.0 license, except for
|
||||||
Apache 2.0 license, except for contributions copied from Vim (identified by the
|
parts that were contributed under the Vim license.
|
||||||
`vim-patch` token). See LICENSE for details.
|
|
||||||
|
- Contributions committed before [b17d96][license-commit] remain under the Vim
|
||||||
|
license.
|
||||||
|
|
||||||
|
- Contributions committed after [b17d96][license-commit] are licensed under
|
||||||
|
Apache 2.0 unless those contributions were copied from Vim (identified in
|
||||||
|
the commit logs by the `vim-patch` token).
|
||||||
|
|
||||||
|
See `LICENSE` for details.
|
||||||
|
|
||||||
Vim is Charityware. You can use and copy it as much as you like, but you are
|
Vim is Charityware. You can use and copy it as much as you like, but you are
|
||||||
encouraged to make a donation for needy children in Uganda. Please see the
|
encouraged to make a donation for needy children in Uganda. Please see the
|
||||||
@@ -121,8 +145,6 @@ Apache 2.0 license, except for contributions copied from Vim (identified by the
|
|||||||
[Ubuntu]: http://packages.ubuntu.com/search?keywords=neovim
|
[Ubuntu]: http://packages.ubuntu.com/search?keywords=neovim
|
||||||
[Fedora]: https://apps.fedoraproject.org/packages/neovim
|
[Fedora]: https://apps.fedoraproject.org/packages/neovim
|
||||||
[Arch Linux]: https://www.archlinux.org/packages/?q=neovim
|
[Arch Linux]: https://www.archlinux.org/packages/?q=neovim
|
||||||
[Void Linux]: https://voidlinux.org/packages/?arch=x86_64&q=neovim
|
|
||||||
[Gentoo]: https://packages.gentoo.org/packages/app-editors/neovim
|
[Gentoo]: https://packages.gentoo.org/packages/app-editors/neovim
|
||||||
[Homebrew]: https://formulae.brew.sh/formula/neovim
|
|
||||||
|
|
||||||
<!-- vim: set tw=80: -->
|
<!-- vim: set tw=80: -->
|
||||||
|
42
appveyor.yml
Normal file
42
appveyor.yml
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
version: '{build}'
|
||||||
|
environment:
|
||||||
|
APPVEYOR_CACHE_ENTRY_ZIP_ARGS: "-t7z -m0=lzma -mx=9"
|
||||||
|
DEPS_BUILD_DIR: "C:/projects/nvim-deps"
|
||||||
|
DEPS_PREFIX: "C:/projects/nvim-deps/usr"
|
||||||
|
# Silence/redirect errors due to missing locking support (via libgcov).
|
||||||
|
GCOV_ERROR_FILE: "$(TEMP)/libgcov-errors.log"
|
||||||
|
image: Visual Studio 2017
|
||||||
|
configuration:
|
||||||
|
- MINGW_64-gcov
|
||||||
|
- MINGW_32
|
||||||
|
- MSVC_64
|
||||||
|
- MSVC_32
|
||||||
|
init:
|
||||||
|
- ps: |
|
||||||
|
# Pull requests: skip some build configurations to save time.
|
||||||
|
if ($env:APPVEYOR_PULL_REQUEST_HEAD_COMMIT -and $env:CONFIGURATION -match '^(MSVC_64|MINGW_32)$') {
|
||||||
|
$env:APPVEYOR_CACHE_SKIP_SAVE = "true"
|
||||||
|
Exit-AppVeyorBuild
|
||||||
|
}
|
||||||
|
# RDP
|
||||||
|
#- ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
|
||||||
|
matrix:
|
||||||
|
fast_finish: true
|
||||||
|
install: []
|
||||||
|
before_build:
|
||||||
|
- ps: Install-Product node 8
|
||||||
|
build_script:
|
||||||
|
- powershell ci\build.ps1
|
||||||
|
after_build:
|
||||||
|
- ps: |
|
||||||
|
if (Test-Path $env:GCOV_ERROR_FILE) {
|
||||||
|
Get-Content $env:GCOV_ERROR_FILE -Head 10
|
||||||
|
Get-Content $env:GCOV_ERROR_FILE -Tail 10
|
||||||
|
} else {
|
||||||
|
write-host "no GCOV_ERROR_FILE"
|
||||||
|
}
|
||||||
|
cache:
|
||||||
|
- C:\projects\nvim-deps -> third-party\**
|
||||||
|
artifacts:
|
||||||
|
- path: build/Neovim.zip
|
||||||
|
- path: build/bin/nvim.exe
|
@@ -3,6 +3,10 @@
|
|||||||
set -e
|
set -e
|
||||||
set -o pipefail
|
set -o pipefail
|
||||||
|
|
||||||
|
if [[ "${CI_TARGET}" == lint ]]; then
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
echo 'Python info:'
|
echo 'Python info:'
|
||||||
(
|
(
|
||||||
set -x
|
set -x
|
||||||
@@ -22,7 +26,7 @@ if [[ "${TRAVIS_OS_NAME}" != osx ]] && command -v pyenv; then
|
|||||||
echo 'Setting Python versions via pyenv'
|
echo 'Setting Python versions via pyenv'
|
||||||
|
|
||||||
# Prefer Python 2 over 3 (more conservative).
|
# Prefer Python 2 over 3 (more conservative).
|
||||||
pyenv global 2.7:3.8
|
pyenv global 2.7.15:3.7.1
|
||||||
|
|
||||||
echo 'Updated Python info:'
|
echo 'Updated Python info:'
|
||||||
(
|
(
|
||||||
@@ -43,4 +47,18 @@ if [[ "${TRAVIS_OS_NAME}" == osx ]] || [ ! -f ~/.nvm/nvm.sh ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
source ~/.nvm/nvm.sh
|
source ~/.nvm/nvm.sh
|
||||||
nvm install 10
|
nvm install --lts
|
||||||
|
nvm use --lts
|
||||||
|
|
||||||
|
if [[ -n "$CMAKE_URL" ]]; then
|
||||||
|
echo "Installing custom CMake: $CMAKE_URL"
|
||||||
|
curl --retry 5 --silent --fail -o /tmp/cmake-installer.sh "$CMAKE_URL"
|
||||||
|
mkdir -p "$HOME/.local/bin" /opt/cmake-custom
|
||||||
|
bash /tmp/cmake-installer.sh --prefix=/opt/cmake-custom --skip-license
|
||||||
|
ln -sfn /opt/cmake-custom/bin/cmake "$HOME/.local/bin/cmake"
|
||||||
|
cmake_version="$(cmake --version)"
|
||||||
|
echo "$cmake_version" | grep -qF '2.8.12' || {
|
||||||
|
echo "Unexpected CMake version: $cmake_version"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
fi
|
||||||
|
@@ -3,15 +3,13 @@
|
|||||||
set -e
|
set -e
|
||||||
set -o pipefail
|
set -o pipefail
|
||||||
|
|
||||||
|
if [[ "${CI_TARGET}" == lint ]]; then
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
CI_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
CI_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
source "${CI_DIR}/common/build.sh"
|
source "${CI_DIR}/common/build.sh"
|
||||||
|
|
||||||
# Enable ipv6 on Travis. ref: a39c8b7ce30d
|
|
||||||
if test -n "${TRAVIS_OS_NAME}" && ! test "${TRAVIS_OS_NAME}" = osx ; then
|
|
||||||
echo "before_script.sh: enable ipv6"
|
|
||||||
sudo sysctl -w net.ipv6.conf.lo.disable_ipv6=0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Test some of the configuration variables.
|
# Test some of the configuration variables.
|
||||||
if [[ -n "${GCOV}" ]] && [[ ! $(type -P "${GCOV}") ]]; then
|
if [[ -n "${GCOV}" ]] && [[ ! $(type -P "${GCOV}") ]]; then
|
||||||
echo "\$GCOV: '${GCOV}' is not executable."
|
echo "\$GCOV: '${GCOV}' is not executable."
|
||||||
@@ -37,10 +35,5 @@ fi
|
|||||||
# Compile dependencies.
|
# Compile dependencies.
|
||||||
build_deps
|
build_deps
|
||||||
|
|
||||||
# Install cluacov for Lua coverage.
|
|
||||||
if [[ "$USE_LUACOV" == 1 ]]; then
|
|
||||||
"${DEPS_BUILD_DIR}/usr/bin/luarocks" install cluacov
|
|
||||||
fi
|
|
||||||
|
|
||||||
rm -rf "${LOG_DIR}"
|
rm -rf "${LOG_DIR}"
|
||||||
mkdir -p "${LOG_DIR}"
|
mkdir -p "${LOG_DIR}"
|
||||||
|
112
ci/build.ps1
112
ci/build.ps1
@@ -1,11 +1,10 @@
|
|||||||
param([switch]$NoTests)
|
$ErrorActionPreference = 'stop'
|
||||||
Set-StrictMode -Version Latest
|
Set-PSDebug -Strict -Trace 1
|
||||||
$ErrorActionPreference = 'Stop'
|
|
||||||
$ProgressPreference = 'SilentlyContinue'
|
|
||||||
|
|
||||||
|
$isPullRequest = ($env:APPVEYOR_PULL_REQUEST_HEAD_COMMIT -ne $null)
|
||||||
$env:CONFIGURATION -match '^(?<compiler>\w+)_(?<bits>32|64)(?:-(?<option>\w+))?$'
|
$env:CONFIGURATION -match '^(?<compiler>\w+)_(?<bits>32|64)(?:-(?<option>\w+))?$'
|
||||||
$compiler = $Matches.compiler
|
$compiler = $Matches.compiler
|
||||||
$compileOption = if ($Matches -contains 'option') {$Matches.option} else {''}
|
$compileOption = $Matches.option
|
||||||
$bits = $Matches.bits
|
$bits = $Matches.bits
|
||||||
$cmakeBuildType = $(if ($env:CMAKE_BUILD_TYPE -ne $null) {$env:CMAKE_BUILD_TYPE} else {'RelWithDebInfo'});
|
$cmakeBuildType = $(if ($env:CMAKE_BUILD_TYPE -ne $null) {$env:CMAKE_BUILD_TYPE} else {'RelWithDebInfo'});
|
||||||
$buildDir = [System.IO.Path]::GetFullPath("$(pwd)")
|
$buildDir = [System.IO.Path]::GetFullPath("$(pwd)")
|
||||||
@@ -24,15 +23,11 @@ $uploadToCodeCov = $false
|
|||||||
|
|
||||||
function exitIfFailed() {
|
function exitIfFailed() {
|
||||||
if ($LastExitCode -ne 0) {
|
if ($LastExitCode -ne 0) {
|
||||||
|
Set-PSDebug -Off
|
||||||
exit $LastExitCode
|
exit $LastExitCode
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (-not $NoTests) {
|
|
||||||
node --version
|
|
||||||
npm.cmd --version
|
|
||||||
}
|
|
||||||
|
|
||||||
if (-Not (Test-Path -PathType container $env:DEPS_BUILD_DIR)) {
|
if (-Not (Test-Path -PathType container $env:DEPS_BUILD_DIR)) {
|
||||||
write-host "cache dir not found: $($env:DEPS_BUILD_DIR)"
|
write-host "cache dir not found: $($env:DEPS_BUILD_DIR)"
|
||||||
mkdir $env:DEPS_BUILD_DIR
|
mkdir $env:DEPS_BUILD_DIR
|
||||||
@@ -51,17 +46,13 @@ if ($compiler -eq 'MINGW') {
|
|||||||
$nvimCmakeVars['USE_GCOV'] = 'ON'
|
$nvimCmakeVars['USE_GCOV'] = 'ON'
|
||||||
$uploadToCodecov = $true
|
$uploadToCodecov = $true
|
||||||
$env:GCOV = "C:\msys64\mingw$bits\bin\gcov"
|
$env:GCOV = "C:\msys64\mingw$bits\bin\gcov"
|
||||||
|
|
||||||
# Setup/build Lua coverage.
|
|
||||||
$env:USE_LUACOV = 1
|
|
||||||
$env:BUSTED_ARGS = "--coverage"
|
|
||||||
}
|
}
|
||||||
# These are native MinGW builds, but they use the toolchain inside
|
# These are native MinGW builds, but they use the toolchain inside
|
||||||
# MSYS2, this allows using all the dependencies and tools available
|
# MSYS2, this allows using all the dependencies and tools available
|
||||||
# in MSYS2, but we cannot build inside the MSYS2 shell.
|
# in MSYS2, but we cannot build inside the MSYS2 shell.
|
||||||
$cmakeGenerator = 'Ninja'
|
$cmakeGenerator = 'Ninja'
|
||||||
$cmakeGeneratorArgs = '-v'
|
$cmakeGeneratorArgs = '-v'
|
||||||
$mingwPackages = @('ninja', 'cmake', 'diffutils').ForEach({
|
$mingwPackages = @('ninja', 'cmake', 'perl', 'diffutils').ForEach({
|
||||||
"mingw-w64-$arch-$_"
|
"mingw-w64-$arch-$_"
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -72,7 +63,7 @@ if ($compiler -eq 'MINGW') {
|
|||||||
& C:\msys64\usr\bin\mkdir -p /var/cache/pacman/pkg
|
& C:\msys64\usr\bin\mkdir -p /var/cache/pacman/pkg
|
||||||
|
|
||||||
# Build third-party dependencies
|
# Build third-party dependencies
|
||||||
C:\msys64\usr\bin\bash -lc "pacman --verbose --noconfirm -Syu" ; exitIfFailed
|
C:\msys64\usr\bin\bash -lc "pacman --verbose --noconfirm -Su" ; exitIfFailed
|
||||||
C:\msys64\usr\bin\bash -lc "pacman --verbose --noconfirm --needed -S $mingwPackages" ; exitIfFailed
|
C:\msys64\usr\bin\bash -lc "pacman --verbose --noconfirm --needed -S $mingwPackages" ; exitIfFailed
|
||||||
}
|
}
|
||||||
elseif ($compiler -eq 'MSVC') {
|
elseif ($compiler -eq 'MSVC') {
|
||||||
@@ -85,24 +76,23 @@ elseif ($compiler -eq 'MSVC') {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (-not $NoTests) {
|
# Setup python (use AppVeyor system python)
|
||||||
python -m ensurepip
|
C:\Python27\python.exe -m pip install pynvim ; exitIfFailed
|
||||||
python -m pip install pynvim ; exitIfFailed
|
C:\Python35\python.exe -m pip install pynvim ; exitIfFailed
|
||||||
# Sanity check
|
# Disambiguate python3
|
||||||
python -c "import pynvim; print(str(pynvim))" ; exitIfFailed
|
move c:\Python35\python.exe c:\Python35\python3.exe
|
||||||
|
$env:PATH = "C:\Python35;C:\Python27;$env:PATH"
|
||||||
|
# Sanity check
|
||||||
|
python -c "import pynvim; print(str(pynvim))" ; exitIfFailed
|
||||||
|
python3 -c "import pynvim; print(str(pynvim))" ; exitIfFailed
|
||||||
|
|
||||||
gem.cmd install --pre neovim
|
$env:PATH = "C:\Ruby24\bin;$env:PATH"
|
||||||
Get-Command -CommandType Application neovim-ruby-host.bat
|
gem.cmd install neovim
|
||||||
|
Get-Command -CommandType Application neovim-ruby-host.bat
|
||||||
|
|
||||||
npm.cmd install -g neovim
|
npm.cmd install -g neovim
|
||||||
Get-Command -CommandType Application neovim-node-host.cmd
|
Get-Command -CommandType Application neovim-node-host.cmd
|
||||||
npm.cmd link neovim
|
npm.cmd link neovim
|
||||||
}
|
|
||||||
|
|
||||||
if ($compiler -eq 'MSVC') {
|
|
||||||
# Required for LuaRocks (https://github.com/luarocks/luarocks/issues/1039#issuecomment-507296940).
|
|
||||||
$env:VCINSTALLDIR = "C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.16.27023/"
|
|
||||||
}
|
|
||||||
|
|
||||||
function convertToCmakeArgs($vars) {
|
function convertToCmakeArgs($vars) {
|
||||||
return $vars.GetEnumerator() | foreach { "-D$($_.Key)=$($_.Value)" }
|
return $vars.GetEnumerator() | foreach { "-D$($_.Key)=$($_.Value)" }
|
||||||
@@ -123,47 +113,37 @@ cmake --build . --config $cmakeBuildType -- $cmakeGeneratorArgs ; exitIfFailed
|
|||||||
# Ensure that the "win32" feature is set.
|
# Ensure that the "win32" feature is set.
|
||||||
.\bin\nvim -u NONE --headless -c 'exe !has(\"win32\").\"cq\"' ; exitIfFailed
|
.\bin\nvim -u NONE --headless -c 'exe !has(\"win32\").\"cq\"' ; exitIfFailed
|
||||||
|
|
||||||
if ($env:USE_LUACOV -eq 1) {
|
# Functional tests
|
||||||
& $env:DEPS_PREFIX\luarocks\luarocks.bat install cluacov
|
# The $LastExitCode from MSBuild can't be trusted
|
||||||
}
|
$failed = $false
|
||||||
|
# Temporarily turn off tracing to reduce log file output
|
||||||
if (-not $NoTests) {
|
Set-PSDebug -Off
|
||||||
# Functional tests
|
cmake --build . --config $cmakeBuildType --target functionaltest -- $cmakeGeneratorArgs 2>&1 |
|
||||||
# The $LastExitCode from MSBuild can't be trusted
|
foreach { $failed = $failed -or
|
||||||
$failed = $false
|
$_ -match 'functional tests failed with error'; $_ }
|
||||||
|
if ($failed) {
|
||||||
# Run only this test file:
|
|
||||||
# $env:TEST_FILE = "test\functional\foo.lua"
|
|
||||||
cmake --build . --config $cmakeBuildType --target functionaltest -- $cmakeGeneratorArgs 2>&1 |
|
|
||||||
foreach { $failed = $failed -or
|
|
||||||
$_ -match 'functional tests failed with error'; $_ }
|
|
||||||
|
|
||||||
if ($uploadToCodecov) {
|
if ($uploadToCodecov) {
|
||||||
if ($env:USE_LUACOV -eq 1) {
|
|
||||||
& $env:DEPS_PREFIX\bin\luacov.bat
|
|
||||||
}
|
|
||||||
bash -l /c/projects/neovim/ci/common/submit_coverage.sh functionaltest
|
bash -l /c/projects/neovim/ci/common/submit_coverage.sh functionaltest
|
||||||
}
|
}
|
||||||
if ($failed) {
|
exit $LastExitCode
|
||||||
exit $LastExitCode
|
}
|
||||||
}
|
Set-PSDebug -Strict -Trace 1
|
||||||
|
|
||||||
# Old tests
|
|
||||||
# Add MSYS to path, required for e.g. `find` used in test scripts.
|
|
||||||
# But would break functionaltests, where its `more` would be used then.
|
|
||||||
$OldPath = $env:PATH
|
|
||||||
$env:PATH = "C:\msys64\usr\bin;$env:PATH"
|
|
||||||
& "C:\msys64\mingw$bits\bin\mingw32-make.exe" -C $(Convert-Path ..\src\nvim\testdir) VERBOSE=1 ; exitIfFailed
|
|
||||||
$env:PATH = $OldPath
|
|
||||||
|
|
||||||
if ($uploadToCodecov) {
|
if ($uploadToCodecov) {
|
||||||
bash -l /c/projects/neovim/ci/common/submit_coverage.sh oldtest
|
bash -l /c/projects/neovim/ci/common/submit_coverage.sh functionaltest
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Ensure choco's cpack is not in PATH otherwise, it conflicts with CMake's
|
# Old tests
|
||||||
if (Test-Path -Path $env:ChocolateyInstall\bin\cpack.exe) {
|
# Add MSYS to path, required for e.g. `find` used in test scripts.
|
||||||
Remove-Item -Path $env:ChocolateyInstall\bin\cpack.exe -Force
|
# But would break functionaltests, where its `more` would be used then.
|
||||||
|
$OldPath = $env:PATH
|
||||||
|
$env:PATH = "C:\msys64\usr\bin;$env:PATH"
|
||||||
|
& "C:\msys64\mingw$bits\bin\mingw32-make.exe" -C $(Convert-Path ..\src\nvim\testdir) VERBOSE=1 ; exitIfFailed
|
||||||
|
$env:PATH = $OldPath
|
||||||
|
|
||||||
|
if ($uploadToCodecov) {
|
||||||
|
bash -l /c/projects/neovim/ci/common/submit_coverage.sh oldtest
|
||||||
}
|
}
|
||||||
|
|
||||||
# Build artifacts
|
# Build artifacts
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
_stat() {
|
_stat() {
|
||||||
if test "${CI_OS_NAME}" = osx ; then
|
if test "${TRAVIS_OS_NAME}" = osx ; then
|
||||||
stat -f %Sm "${@}"
|
stat -f %Sm "${@}"
|
||||||
else
|
else
|
||||||
stat -c %y "${@}"
|
stat -c %y "${@}"
|
||||||
@@ -18,6 +18,9 @@ build_make() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
build_deps() {
|
build_deps() {
|
||||||
|
if test "${BUILD_32BIT}" = ON ; then
|
||||||
|
DEPS_CMAKE_FLAGS="${DEPS_CMAKE_FLAGS} ${CMAKE_FLAGS_32BIT}"
|
||||||
|
fi
|
||||||
if test "${FUNCTIONALTEST}" = "functionaltest-lua" \
|
if test "${FUNCTIONALTEST}" = "functionaltest-lua" \
|
||||||
|| test "${CLANG_SANITIZER}" = "ASAN_UBSAN" ; then
|
|| test "${CLANG_SANITIZER}" = "ASAN_UBSAN" ; then
|
||||||
DEPS_CMAKE_FLAGS="${DEPS_CMAKE_FLAGS} -DUSE_BUNDLED_LUA=ON"
|
DEPS_CMAKE_FLAGS="${DEPS_CMAKE_FLAGS} -DUSE_BUNDLED_LUA=ON"
|
||||||
@@ -29,7 +32,7 @@ build_deps() {
|
|||||||
if test "${CACHE_ENABLE}" = "false" ; then
|
if test "${CACHE_ENABLE}" = "false" ; then
|
||||||
export CCACHE_RECACHE=1
|
export CCACHE_RECACHE=1
|
||||||
elif test -f "${CACHE_MARKER}" ; then
|
elif test -f "${CACHE_MARKER}" ; then
|
||||||
echo "Using third-party dependencies from cache (last update: $(_stat "${CACHE_MARKER}"))."
|
echo "Using third-party dependencies from Travis cache (last update: $(_stat "${CACHE_MARKER}"))."
|
||||||
cp -a "${CACHE_NVIM_DEPS_DIR}"/. "${DEPS_BUILD_DIR}"
|
cp -a "${CACHE_NVIM_DEPS_DIR}"/. "${DEPS_BUILD_DIR}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -37,24 +40,27 @@ build_deps() {
|
|||||||
# update CMake configuration and update to newer deps versions.
|
# update CMake configuration and update to newer deps versions.
|
||||||
cd "${DEPS_BUILD_DIR}"
|
cd "${DEPS_BUILD_DIR}"
|
||||||
echo "Configuring with '${DEPS_CMAKE_FLAGS}'."
|
echo "Configuring with '${DEPS_CMAKE_FLAGS}'."
|
||||||
CC= cmake -G Ninja ${DEPS_CMAKE_FLAGS} "${CI_BUILD_DIR}/third-party/"
|
CC= cmake -G Ninja ${DEPS_CMAKE_FLAGS} "${TRAVIS_BUILD_DIR}/third-party/"
|
||||||
|
|
||||||
if ! top_make; then
|
if ! top_make; then
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cd "${CI_BUILD_DIR}"
|
cd "${TRAVIS_BUILD_DIR}"
|
||||||
}
|
}
|
||||||
|
|
||||||
prepare_build() {
|
prepare_build() {
|
||||||
if test -n "${CLANG_SANITIZER}" ; then
|
if test -n "${CLANG_SANITIZER}" ; then
|
||||||
CMAKE_FLAGS="${CMAKE_FLAGS} -DCLANG_${CLANG_SANITIZER}=ON"
|
CMAKE_FLAGS="${CMAKE_FLAGS} -DCLANG_${CLANG_SANITIZER}=ON"
|
||||||
fi
|
fi
|
||||||
|
if test "${BUILD_32BIT}" = ON ; then
|
||||||
|
CMAKE_FLAGS="${CMAKE_FLAGS} ${CMAKE_FLAGS_32BIT}"
|
||||||
|
fi
|
||||||
|
|
||||||
mkdir -p "${BUILD_DIR}"
|
mkdir -p "${BUILD_DIR}"
|
||||||
cd "${BUILD_DIR}"
|
cd "${BUILD_DIR}"
|
||||||
echo "Configuring with '${CMAKE_FLAGS} $@'."
|
echo "Configuring with '${CMAKE_FLAGS} $@'."
|
||||||
cmake -G Ninja ${CMAKE_FLAGS} "$@" "${CI_BUILD_DIR}"
|
cmake -G Ninja ${CMAKE_FLAGS} "$@" "${TRAVIS_BUILD_DIR}"
|
||||||
}
|
}
|
||||||
|
|
||||||
build_nvim() {
|
build_nvim() {
|
||||||
@@ -84,5 +90,14 @@ build_nvim() {
|
|||||||
fi
|
fi
|
||||||
check_sanitizer "${LOG_DIR}"
|
check_sanitizer "${LOG_DIR}"
|
||||||
|
|
||||||
cd "${CI_BUILD_DIR}"
|
cd "${TRAVIS_BUILD_DIR}"
|
||||||
|
}
|
||||||
|
|
||||||
|
macos_rvm_dance() {
|
||||||
|
# neovim-ruby gem requires a ruby newer than the macOS default.
|
||||||
|
source ~/.rvm/scripts/rvm
|
||||||
|
rvm get stable --auto-dotfiles
|
||||||
|
rvm reload
|
||||||
|
rvm use 2.2.5
|
||||||
|
rvm use
|
||||||
}
|
}
|
||||||
|
@@ -43,14 +43,3 @@ fi
|
|||||||
# Cleanup always, especially collected data.
|
# Cleanup always, especially collected data.
|
||||||
find . \( -name '*.gcov' -o -name '*.gcda' \) -ls -delete | wc -l
|
find . \( -name '*.gcov' -o -name '*.gcda' \) -ls -delete | wc -l
|
||||||
rm -f coverage.xml
|
rm -f coverage.xml
|
||||||
|
|
||||||
# Upload Lua coverage (generated manually on AppVeyor/Windows).
|
|
||||||
if [ "$USE_LUACOV" = 1 ] && [ "$1" != "oldtest" ]; then
|
|
||||||
if [ -x "${DEPS_BUILD_DIR}/usr/bin/luacov" ]; then
|
|
||||||
"${DEPS_BUILD_DIR}/usr/bin/luacov"
|
|
||||||
fi
|
|
||||||
if ! "$codecov_sh" -f luacov.report.out -X gcov -X fix -Z -F "lua,${codecov_flags}"; then
|
|
||||||
echo "codecov upload failed."
|
|
||||||
fi
|
|
||||||
rm luacov.stats.out
|
|
||||||
fi
|
|
||||||
|
@@ -13,33 +13,16 @@ FAIL_SUMMARY_FILE="$BUILD_DIR/.test_errors"
|
|||||||
|
|
||||||
ANSI_CLEAR="\033[0K"
|
ANSI_CLEAR="\033[0K"
|
||||||
|
|
||||||
if test "$TRAVIS" = "true"; then
|
travis_fold() {
|
||||||
ci_fold() {
|
local action="$1"
|
||||||
local action="$1"
|
local name="$2"
|
||||||
local name="$2"
|
name="$(echo -n "$name" | tr '\n\0' '--' | sed 's/[^A-Za-z0-9]\{1,\}/-/g')"
|
||||||
name="$(echo -n "$name" | tr '\n\0' '--' | sed 's/[^A-Za-z0-9]\{1,\}/-/g')"
|
name="$(echo -n "$name" | sed 's/-$//')"
|
||||||
name="$(echo -n "$name" | sed 's/-$//')"
|
echo -en "travis_fold:${action}:${name}\r${ANSI_CLEAR}"
|
||||||
echo -en "travis_fold:${action}:${name}\r${ANSI_CLEAR}"
|
}
|
||||||
}
|
|
||||||
elif test "$GITHUB_ACTIONS" = "true"; then
|
if test "$TRAVIS" != "true" ; then
|
||||||
ci_fold() {
|
travis_fold() {
|
||||||
local action="$1"
|
|
||||||
local name="$2"
|
|
||||||
name="$(echo -n "$name" | tr '\n\0' '--' | sed 's/[^A-Za-z0-9]\{1,\}/-/g')"
|
|
||||||
name="$(echo -n "$name" | sed 's/-$//')"
|
|
||||||
case "$action" in
|
|
||||||
start)
|
|
||||||
echo "::group::${name}"
|
|
||||||
;;
|
|
||||||
end)
|
|
||||||
echo "::endgroup::"
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
:;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
else
|
|
||||||
ci_fold() {
|
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
fi
|
fi
|
||||||
@@ -50,7 +33,7 @@ enter_suite() {
|
|||||||
rm -f "${END_MARKER}"
|
rm -f "${END_MARKER}"
|
||||||
local suite_name="$1"
|
local suite_name="$1"
|
||||||
export NVIM_TEST_CURRENT_SUITE="${NVIM_TEST_CURRENT_SUITE}/$suite_name"
|
export NVIM_TEST_CURRENT_SUITE="${NVIM_TEST_CURRENT_SUITE}/$suite_name"
|
||||||
ci_fold start "${NVIM_TEST_CURRENT_SUITE}"
|
travis_fold start "${NVIM_TEST_CURRENT_SUITE}"
|
||||||
set -x
|
set -x
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -60,7 +43,7 @@ exit_suite() {
|
|||||||
echo "Suite ${NVIM_TEST_CURRENT_SUITE} failed, summary:"
|
echo "Suite ${NVIM_TEST_CURRENT_SUITE} failed, summary:"
|
||||||
echo "${FAIL_SUMMARY}"
|
echo "${FAIL_SUMMARY}"
|
||||||
else
|
else
|
||||||
ci_fold end "${NVIM_TEST_CURRENT_SUITE}"
|
travis_fold end "${NVIM_TEST_CURRENT_SUITE}"
|
||||||
fi
|
fi
|
||||||
export NVIM_TEST_CURRENT_SUITE="${NVIM_TEST_CURRENT_SUITE%/*}"
|
export NVIM_TEST_CURRENT_SUITE="${NVIM_TEST_CURRENT_SUITE%/*}"
|
||||||
if test "$1" != "--continue" ; then
|
if test "$1" != "--continue" ; then
|
||||||
|
@@ -15,7 +15,7 @@ print_core() {
|
|||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
echo "======= Core file $core ======="
|
echo "======= Core file $core ======="
|
||||||
if test "${CI_OS_NAME}" = osx ; then
|
if test "${TRAVIS_OS_NAME}" = osx ; then
|
||||||
lldb -Q -o "bt all" -f "${app}" -c "${core}"
|
lldb -Q -o "bt all" -f "${app}" -c "${core}"
|
||||||
else
|
else
|
||||||
gdb -n -batch -ex 'thread apply all bt full' "${app}" -c "${core}"
|
gdb -n -batch -ex 'thread apply all bt full' "${app}" -c "${core}"
|
||||||
@@ -30,11 +30,11 @@ check_core_dumps() {
|
|||||||
fi
|
fi
|
||||||
local app="${1:-${BUILD_DIR}/bin/nvim}"
|
local app="${1:-${BUILD_DIR}/bin/nvim}"
|
||||||
local cores
|
local cores
|
||||||
if test "${CI_OS_NAME}" = osx ; then
|
if test "${TRAVIS_OS_NAME}" = osx ; then
|
||||||
cores="$(find /cores/ -type f -print)"
|
cores="$(find /cores/ -type f -print)"
|
||||||
local _sudo='sudo'
|
local _sudo='sudo'
|
||||||
else
|
else
|
||||||
cores="$(find ./ -type f \( -name 'core.*' -o -name core -o -name nvim.core \) -print)"
|
cores="$(find ./ -type f -name 'core.*' -print)"
|
||||||
local _sudo=
|
local _sudo=
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -82,7 +82,7 @@ valgrind_check() {
|
|||||||
|
|
||||||
check_sanitizer() {
|
check_sanitizer() {
|
||||||
if test -n "${CLANG_SANITIZER}"; then
|
if test -n "${CLANG_SANITIZER}"; then
|
||||||
check_logs "${1}" "*san.*" | ${SYMBOLIZER:-cat}
|
check_logs "${1}" "*san.*"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -4,7 +4,7 @@ set -e
|
|||||||
set -o pipefail
|
set -o pipefail
|
||||||
|
|
||||||
if [[ "${CI_TARGET}" == lint ]]; then
|
if [[ "${CI_TARGET}" == lint ]]; then
|
||||||
python3 -m pip -q install --user --upgrade flake8
|
python -m pip -q install --user --upgrade flake8
|
||||||
exit
|
exit
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -14,20 +14,13 @@ fi
|
|||||||
|
|
||||||
# Use default CC to avoid compilation problems when installing Python modules.
|
# Use default CC to avoid compilation problems when installing Python modules.
|
||||||
echo "Install neovim module for Python 3."
|
echo "Install neovim module for Python 3."
|
||||||
CC=cc python3 -m pip -q install --user --upgrade pynvim
|
CC=cc python3 -m pip -q install --upgrade pynvim
|
||||||
if python2 -m pip -c True 2>&1; then
|
echo "Install neovim module for Python 2."
|
||||||
echo "Install neovim module for Python 2."
|
CC=cc python2 -m pip -q install --upgrade pynvim
|
||||||
CC=cc python2 -m pip -q install --user --upgrade pynvim
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Install neovim RubyGem."
|
echo "Install neovim RubyGem."
|
||||||
gem install --no-document --bindir "$HOME/.local/bin" --user-install --pre neovim
|
gem install --no-document --version ">= 0.8.0" neovim
|
||||||
|
|
||||||
echo "Install neovim npm package"
|
echo "Install neovim npm package"
|
||||||
source ~/.nvm/nvm.sh
|
|
||||||
nvm use 10
|
|
||||||
npm install -g neovim
|
npm install -g neovim
|
||||||
npm link neovim
|
npm link neovim
|
||||||
|
|
||||||
sudo cpanm -n Neovim::Ext || cat "$HOME/.cpanm/build.log"
|
|
||||||
perl -W -e 'use Neovim::Ext; print $Neovim::Ext::VERSION'
|
|
||||||
|
@@ -20,10 +20,6 @@ enter_suite 'pylint'
|
|||||||
run_test 'make pylint' pylint
|
run_test 'make pylint' pylint
|
||||||
exit_suite --continue
|
exit_suite --continue
|
||||||
|
|
||||||
enter_suite 'shlint'
|
|
||||||
run_test 'make shlint' shlint
|
|
||||||
exit_suite --continue
|
|
||||||
|
|
||||||
enter_suite single-includes
|
enter_suite single-includes
|
||||||
CLICOLOR_FORCE=1 run_test_wd \
|
CLICOLOR_FORCE=1 run_test_wd \
|
||||||
--allow-hang \
|
--allow-hang \
|
||||||
|
@@ -17,10 +17,6 @@ build_nvim
|
|||||||
|
|
||||||
exit_suite --continue
|
exit_suite --continue
|
||||||
|
|
||||||
source ~/.nvm/nvm.sh
|
|
||||||
nvm use 10
|
|
||||||
|
|
||||||
|
|
||||||
enter_suite tests
|
enter_suite tests
|
||||||
|
|
||||||
if test "$CLANG_SANITIZER" != "TSAN" ; then
|
if test "$CLANG_SANITIZER" != "TSAN" ; then
|
||||||
|
@@ -1,194 +0,0 @@
|
|||||||
{
|
|
||||||
"ref": "refs/heads/master",
|
|
||||||
"before": "66b136c43c12df3dcf8f19ff48f206ad2e4f43fc",
|
|
||||||
"after": "1bf69c32217cc455603ce8aa2b5415d9717f0fa2",
|
|
||||||
"repository": {
|
|
||||||
"id": 292861950,
|
|
||||||
"node_id": "MDEwOlJlcG9zaXRvcnkyOTI4NjE5NTA=",
|
|
||||||
"name": "neovim-snap",
|
|
||||||
"full_name": "hurricanehrndz/neovim-snap",
|
|
||||||
"private": false,
|
|
||||||
"owner": {
|
|
||||||
"name": "hurricanehrndz",
|
|
||||||
"email": "hurricanehrndz@users.noreply.github.com",
|
|
||||||
"login": "hurricanehrndz",
|
|
||||||
"id": 5804237,
|
|
||||||
"node_id": "MDQ6VXNlcjU4MDQyMzc=",
|
|
||||||
"avatar_url": "https://avatars0.githubusercontent.com/u/5804237?v=4",
|
|
||||||
"gravatar_id": "",
|
|
||||||
"url": "https://api.github.com/users/hurricanehrndz",
|
|
||||||
"html_url": "https://github.com/hurricanehrndz",
|
|
||||||
"followers_url": "https://api.github.com/users/hurricanehrndz/followers",
|
|
||||||
"following_url": "https://api.github.com/users/hurricanehrndz/following{/other_user}",
|
|
||||||
"gists_url": "https://api.github.com/users/hurricanehrndz/gists{/gist_id}",
|
|
||||||
"starred_url": "https://api.github.com/users/hurricanehrndz/starred{/owner}{/repo}",
|
|
||||||
"subscriptions_url": "https://api.github.com/users/hurricanehrndz/subscriptions",
|
|
||||||
"organizations_url": "https://api.github.com/users/hurricanehrndz/orgs",
|
|
||||||
"repos_url": "https://api.github.com/users/hurricanehrndz/repos",
|
|
||||||
"events_url": "https://api.github.com/users/hurricanehrndz/events{/privacy}",
|
|
||||||
"received_events_url": "https://api.github.com/users/hurricanehrndz/received_events",
|
|
||||||
"type": "User",
|
|
||||||
"site_admin": false
|
|
||||||
},
|
|
||||||
"html_url": "https://github.com/hurricanehrndz/neovim-snap",
|
|
||||||
"description": "snap build for neovim",
|
|
||||||
"fork": false,
|
|
||||||
"url": "https://github.com/hurricanehrndz/neovim-snap",
|
|
||||||
"forks_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/forks",
|
|
||||||
"keys_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/keys{/key_id}",
|
|
||||||
"collaborators_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/collaborators{/collaborator}",
|
|
||||||
"teams_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/teams",
|
|
||||||
"hooks_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/hooks",
|
|
||||||
"issue_events_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/issues/events{/number}",
|
|
||||||
"events_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/events",
|
|
||||||
"assignees_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/assignees{/user}",
|
|
||||||
"branches_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/branches{/branch}",
|
|
||||||
"tags_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/tags",
|
|
||||||
"blobs_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/git/blobs{/sha}",
|
|
||||||
"git_tags_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/git/tags{/sha}",
|
|
||||||
"git_refs_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/git/refs{/sha}",
|
|
||||||
"trees_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/git/trees{/sha}",
|
|
||||||
"statuses_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/statuses/{sha}",
|
|
||||||
"languages_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/languages",
|
|
||||||
"stargazers_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/stargazers",
|
|
||||||
"contributors_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/contributors",
|
|
||||||
"subscribers_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/subscribers",
|
|
||||||
"subscription_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/subscription",
|
|
||||||
"commits_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/commits{/sha}",
|
|
||||||
"git_commits_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/git/commits{/sha}",
|
|
||||||
"comments_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/comments{/number}",
|
|
||||||
"issue_comment_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/issues/comments{/number}",
|
|
||||||
"contents_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/contents/{+path}",
|
|
||||||
"compare_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/compare/{base}...{head}",
|
|
||||||
"merges_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/merges",
|
|
||||||
"archive_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/{archive_format}{/ref}",
|
|
||||||
"downloads_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/downloads",
|
|
||||||
"issues_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/issues{/number}",
|
|
||||||
"pulls_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/pulls{/number}",
|
|
||||||
"milestones_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/milestones{/number}",
|
|
||||||
"notifications_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/notifications{?since,all,participating}",
|
|
||||||
"labels_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/labels{/name}",
|
|
||||||
"releases_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/releases{/id}",
|
|
||||||
"deployments_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/deployments",
|
|
||||||
"created_at": 1599227980,
|
|
||||||
"updated_at": "2020-09-04T14:02:38Z",
|
|
||||||
"pushed_at": 1599228352,
|
|
||||||
"git_url": "git://github.com/hurricanehrndz/neovim-snap.git",
|
|
||||||
"ssh_url": "git@github.com:hurricanehrndz/neovim-snap.git",
|
|
||||||
"clone_url": "https://github.com/hurricanehrndz/neovim-snap.git",
|
|
||||||
"svn_url": "https://github.com/hurricanehrndz/neovim-snap",
|
|
||||||
"homepage": null,
|
|
||||||
"size": 0,
|
|
||||||
"stargazers_count": 0,
|
|
||||||
"watchers_count": 0,
|
|
||||||
"language": null,
|
|
||||||
"has_issues": true,
|
|
||||||
"has_projects": true,
|
|
||||||
"has_downloads": true,
|
|
||||||
"has_wiki": true,
|
|
||||||
"has_pages": false,
|
|
||||||
"forks_count": 0,
|
|
||||||
"mirror_url": null,
|
|
||||||
"archived": false,
|
|
||||||
"disabled": false,
|
|
||||||
"open_issues_count": 0,
|
|
||||||
"license": {
|
|
||||||
"key": "mit",
|
|
||||||
"name": "MIT License",
|
|
||||||
"spdx_id": "MIT",
|
|
||||||
"url": "https://api.github.com/licenses/mit",
|
|
||||||
"node_id": "MDc6TGljZW5zZTEz"
|
|
||||||
},
|
|
||||||
"forks": 0,
|
|
||||||
"open_issues": 0,
|
|
||||||
"watchers": 0,
|
|
||||||
"default_branch": "master",
|
|
||||||
"stargazers": 0,
|
|
||||||
"master_branch": "master"
|
|
||||||
},
|
|
||||||
"pusher": {
|
|
||||||
"name": "hurricanehrndz",
|
|
||||||
"email": "hurricanehrndz@users.noreply.github.com"
|
|
||||||
},
|
|
||||||
"sender": {
|
|
||||||
"login": "hurricanehrndz",
|
|
||||||
"id": 5804237,
|
|
||||||
"node_id": "MDQ6VXNlcjU4MDQyMzc=",
|
|
||||||
"avatar_url": "https://avatars0.githubusercontent.com/u/5804237?v=4",
|
|
||||||
"gravatar_id": "",
|
|
||||||
"url": "https://api.github.com/users/hurricanehrndz",
|
|
||||||
"html_url": "https://github.com/hurricanehrndz",
|
|
||||||
"followers_url": "https://api.github.com/users/hurricanehrndz/followers",
|
|
||||||
"following_url": "https://api.github.com/users/hurricanehrndz/following{/other_user}",
|
|
||||||
"gists_url": "https://api.github.com/users/hurricanehrndz/gists{/gist_id}",
|
|
||||||
"starred_url": "https://api.github.com/users/hurricanehrndz/starred{/owner}{/repo}",
|
|
||||||
"subscriptions_url": "https://api.github.com/users/hurricanehrndz/subscriptions",
|
|
||||||
"organizations_url": "https://api.github.com/users/hurricanehrndz/orgs",
|
|
||||||
"repos_url": "https://api.github.com/users/hurricanehrndz/repos",
|
|
||||||
"events_url": "https://api.github.com/users/hurricanehrndz/events{/privacy}",
|
|
||||||
"received_events_url": "https://api.github.com/users/hurricanehrndz/received_events",
|
|
||||||
"type": "User",
|
|
||||||
"site_admin": false
|
|
||||||
},
|
|
||||||
"created": false,
|
|
||||||
"deleted": false,
|
|
||||||
"forced": false,
|
|
||||||
"base_ref": null,
|
|
||||||
"compare": "https://github.com/hurricanehrndz/neovim-snap/compare/66b136c43c12...1bf69c32217c",
|
|
||||||
"commits": [
|
|
||||||
{
|
|
||||||
"id": "1bf69c32217cc455603ce8aa2b5415d9717f0fa2",
|
|
||||||
"tree_id": "62ea83a2349be8c930c45fdc199f71b08bf5927e",
|
|
||||||
"distinct": true,
|
|
||||||
"message": "Build of latest tag",
|
|
||||||
"timestamp": "2020-09-04T14:05:40Z",
|
|
||||||
"url": "https://github.com/hurricanehrndz/neovim-snap/commit/1bf69c32217cc455603ce8aa2b5415d9717f0fa2",
|
|
||||||
"author": {
|
|
||||||
"name": "Carlos Hernandez",
|
|
||||||
"email": "carlos@techbyte.ca",
|
|
||||||
"username": "hurricanehrndz"
|
|
||||||
},
|
|
||||||
"committer": {
|
|
||||||
"name": "Carlos Hernandez",
|
|
||||||
"email": "carlos@techbyte.ca",
|
|
||||||
"username": "hurricanehrndz"
|
|
||||||
},
|
|
||||||
"added": [
|
|
||||||
|
|
||||||
],
|
|
||||||
"removed": [
|
|
||||||
|
|
||||||
],
|
|
||||||
"modified": [
|
|
||||||
"snap/snapcraft.yaml"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"head_commit": {
|
|
||||||
"id": "1bf69c32217cc455603ce8aa2b5415d9717f0fa2",
|
|
||||||
"tree_id": "62ea83a2349be8c930c45fdc199f71b08bf5927e",
|
|
||||||
"distinct": true,
|
|
||||||
"message": "Build of latest tag",
|
|
||||||
"timestamp": "2020-09-04T14:05:40Z",
|
|
||||||
"url": "https://github.com/hurricanehrndz/neovim-snap/commit/1bf69c32217cc455603ce8aa2b5415d9717f0fa2",
|
|
||||||
"author": {
|
|
||||||
"name": "Carlos Hernandez",
|
|
||||||
"email": "carlos@techbyte.ca",
|
|
||||||
"username": "hurricanehrndz"
|
|
||||||
},
|
|
||||||
"committer": {
|
|
||||||
"name": "Carlos Hernandez",
|
|
||||||
"email": "carlos@techbyte.ca",
|
|
||||||
"username": "hurricanehrndz"
|
|
||||||
},
|
|
||||||
"added": [
|
|
||||||
|
|
||||||
],
|
|
||||||
"removed": [
|
|
||||||
|
|
||||||
],
|
|
||||||
"modified": [
|
|
||||||
"snap/snapcraft.yaml"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
@@ -1,14 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
set -e
|
|
||||||
set -o pipefail
|
|
||||||
|
|
||||||
|
|
||||||
RESULT_SNAP=$(find ./ -name "*.snap")
|
|
||||||
|
|
||||||
sudo snap install "$RESULT_SNAP" --dangerous --classic
|
|
||||||
|
|
||||||
/snap/bin/nvim --version
|
|
||||||
|
|
||||||
SHA256=$(sha256sum "$RESULT_SNAP")
|
|
||||||
echo "SHA256: ${SHA256} ."
|
|
@@ -1,39 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
set -e
|
|
||||||
set -o pipefail
|
|
||||||
|
|
||||||
SNAP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
||||||
WEBHOOK_PAYLOAD="$(cat "${SNAP_DIR}/.snapcraft_payload")"
|
|
||||||
PAYLOAD_SIG="${SECRET_SNAP_SIG}"
|
|
||||||
|
|
||||||
|
|
||||||
snap_realease_needed() {
|
|
||||||
last_committed_tag="$(git tag -l --sort=refname|head -1)"
|
|
||||||
last_snap_release="$(snap info nvim | awk '$1 == "latest/edge:" { print $2 }' | perl -lpe 's/v\d.\d.\d-//g')"
|
|
||||||
git fetch -f --tags
|
|
||||||
git checkout "${last_committed_tag}" 2> /dev/null
|
|
||||||
last_git_release="$(git describe --first-parent 2> /dev/null | perl -lpe 's/v\d.\d.\d-//g')"
|
|
||||||
|
|
||||||
if [[ -z "$(echo $last_snap_release | perl -ne "print if /${last_git_release}.*/")" ]]; then
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
trigger_snapcraft_webhook() {
|
|
||||||
[[ -n "${PAYLOAD_SIG}" ]] || exit
|
|
||||||
echo "Triggering new snap release via webhook..."
|
|
||||||
curl -X POST \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-H "X-Hub-Signature: sha1=${PAYLOAD_SIG}" \
|
|
||||||
--data "${WEBHOOK_PAYLOAD}" \
|
|
||||||
https://snapcraft.io/nvim/webhook/notify
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if $(snap_realease_needed); then
|
|
||||||
echo "New snap release required"
|
|
||||||
trigger_snapcraft_webhook
|
|
||||||
fi
|
|
@@ -1,11 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
set -e
|
|
||||||
set -o pipefail
|
|
||||||
|
|
||||||
sudo apt update
|
|
||||||
sudo usermod -aG lxd $USER
|
|
||||||
sudo /snap/bin/lxd.migrate -yes
|
|
||||||
sudo /snap/bin/lxd waitready
|
|
||||||
sudo /snap/bin/lxd init --auto
|
|
||||||
|
|
@@ -1,8 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
set -e
|
|
||||||
set -o pipefail
|
|
||||||
|
|
||||||
mkdir -p "$CI_BUILD_DIR/snaps-cache"
|
|
||||||
sg lxd -c snapcraft
|
|
||||||
|
|
Binary file not shown.
@@ -15,7 +15,7 @@ find_path(LIBLUV_INCLUDE_DIR luv/luv.h
|
|||||||
PATHS ${PC_LIBLUV_INCLUDEDIR} ${PC_LIBLUV_INCLUDE_DIRS})
|
PATHS ${PC_LIBLUV_INCLUDEDIR} ${PC_LIBLUV_INCLUDE_DIRS})
|
||||||
|
|
||||||
# Explicitly look for luv.so. #10407
|
# Explicitly look for luv.so. #10407
|
||||||
list(APPEND LIBLUV_NAMES luv_a luv libluv_a luv${CMAKE_SHARED_LIBRARY_SUFFIX})
|
list(APPEND LIBLUV_NAMES luv luv${CMAKE_SHARED_LIBRARY_SUFFIX})
|
||||||
|
|
||||||
find_library(LIBLUV_LIBRARY NAMES ${LIBLUV_NAMES}
|
find_library(LIBLUV_LIBRARY NAMES ${LIBLUV_NAMES}
|
||||||
HINTS ${PC_LIBLUV_LIBDIR} ${PC_LIBLUV_LIBRARY_DIRS})
|
HINTS ${PC_LIBLUV_LIBDIR} ${PC_LIBLUV_LIBRARY_DIRS})
|
||||||
|
@@ -75,14 +75,6 @@ if(WIN32)
|
|||||||
list(APPEND LIBUV_LIBRARIES ws2_32)
|
list(APPEND LIBUV_LIBRARIES ws2_32)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
find_package(Threads)
|
|
||||||
if(Threads_FOUND)
|
|
||||||
# TODO: Fix the cmake file to properly handle static deps for bundled builds.
|
|
||||||
# Meanwhile just include the threads library if CMake tells us there's one to
|
|
||||||
# use.
|
|
||||||
list(APPEND LIBUV_LIBRARIES ${CMAKE_THREAD_LIBS_INIT})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
include(FindPackageHandleStandardArgs)
|
||||||
|
|
||||||
# handle the QUIETLY and REQUIRED arguments and set LIBUV_FOUND to TRUE
|
# handle the QUIETLY and REQUIRED arguments and set LIBUV_FOUND to TRUE
|
||||||
|
@@ -42,7 +42,7 @@ unset(_lua_append_versions)
|
|||||||
|
|
||||||
# this is a function only to have all the variables inside go away automatically
|
# this is a function only to have all the variables inside go away automatically
|
||||||
function(_lua_set_version_vars)
|
function(_lua_set_version_vars)
|
||||||
set(LUA_VERSIONS5 5.4 5.3 5.2 5.1 5.0)
|
set(LUA_VERSIONS5 5.3 5.2 5.1 5.0)
|
||||||
|
|
||||||
if (Lua_FIND_VERSION_EXACT)
|
if (Lua_FIND_VERSION_EXACT)
|
||||||
if (Lua_FIND_VERSION_COUNT GREATER 1)
|
if (Lua_FIND_VERSION_COUNT GREATER 1)
|
||||||
|
@@ -1,11 +0,0 @@
|
|||||||
# - Try to find tree-sitter
|
|
||||||
# Once done, this will define
|
|
||||||
#
|
|
||||||
# TreeSitter_FOUND - system has tree-sitter
|
|
||||||
# TreeSitter_INCLUDE_DIRS - the tree-sitter include directories
|
|
||||||
# TreeSitter_LIBRARIES - link these to use tree-sitter
|
|
||||||
|
|
||||||
include(LibFindMacros)
|
|
||||||
|
|
||||||
libfind_pkg_detect(TreeSitter tree-sitter FIND_PATH tree_sitter/api.h FIND_LIBRARY tree-sitter)
|
|
||||||
libfind_process(TreeSitter)
|
|
@@ -3,13 +3,6 @@ function(get_compile_flags _compile_flags)
|
|||||||
set(compile_flags "<CMAKE_C_COMPILER> <CFLAGS> <BUILD_TYPE_CFLAGS> <COMPILE_OPTIONS><COMPILE_DEFINITIONS> <INCLUDES>")
|
set(compile_flags "<CMAKE_C_COMPILER> <CFLAGS> <BUILD_TYPE_CFLAGS> <COMPILE_OPTIONS><COMPILE_DEFINITIONS> <INCLUDES>")
|
||||||
|
|
||||||
# Get C compiler.
|
# Get C compiler.
|
||||||
if(CMAKE_C_COMPILER_ARG1)
|
|
||||||
string(REPLACE
|
|
||||||
"<CMAKE_C_COMPILER>"
|
|
||||||
"<CMAKE_C_COMPILER> ${CMAKE_C_COMPILER_ARG1}"
|
|
||||||
compile_flags
|
|
||||||
"${compile_flags}")
|
|
||||||
endif()
|
|
||||||
string(REPLACE
|
string(REPLACE
|
||||||
"<CMAKE_C_COMPILER>"
|
"<CMAKE_C_COMPILER>"
|
||||||
"${CMAKE_C_COMPILER}"
|
"${CMAKE_C_COMPILER}"
|
||||||
|
180
cmake/GetGitRevisionDescription.cmake
Normal file
180
cmake/GetGitRevisionDescription.cmake
Normal file
@@ -0,0 +1,180 @@
|
|||||||
|
# https://github.com/rpavlik/cmake-modules
|
||||||
|
#
|
||||||
|
# - Returns a version string from Git
|
||||||
|
#
|
||||||
|
# These functions force a re-configure on each git commit so that you can
|
||||||
|
# trust the values of the variables in your build system.
|
||||||
|
#
|
||||||
|
# get_git_head_revision(<refspecvar> <hashvar> [<additional arguments to git describe> ...])
|
||||||
|
#
|
||||||
|
# Returns the refspec and sha hash of the current head revision
|
||||||
|
#
|
||||||
|
# git_describe(<var> [<additional arguments to git describe> ...])
|
||||||
|
#
|
||||||
|
# Returns the results of git describe on the source tree, and adjusting
|
||||||
|
# the output so that it tests false if an error occurs.
|
||||||
|
#
|
||||||
|
# git_get_exact_tag(<var> [<additional arguments to git describe> ...])
|
||||||
|
#
|
||||||
|
# Returns the results of git describe --exact-match on the source tree,
|
||||||
|
# and adjusting the output so that it tests false if there was no exact
|
||||||
|
# matching tag.
|
||||||
|
#
|
||||||
|
# Requires CMake 2.6 or newer (uses the 'function' command)
|
||||||
|
#
|
||||||
|
# Original Author:
|
||||||
|
# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
|
||||||
|
# http://academic.cleardefinition.com
|
||||||
|
# Iowa State University HCI Graduate Program/VRAC
|
||||||
|
#
|
||||||
|
# Copyright Iowa State University 2009-2010.
|
||||||
|
# Distributed under the Boost Software License, Version 1.0.
|
||||||
|
# (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
# http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
|
if(__get_git_revision_description)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
set(__get_git_revision_description YES)
|
||||||
|
|
||||||
|
# We must run the following at "include" time, not at function call time,
|
||||||
|
# to find the path to this module rather than the path to a calling list file
|
||||||
|
get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH)
|
||||||
|
|
||||||
|
function(get_git_dir _gitdir)
|
||||||
|
# check FORCED_GIT_DIR first
|
||||||
|
if(FORCED_GIT_DIR)
|
||||||
|
set(${_gitdir} ${FORCED_GIT_DIR} PARENT_SCOPE)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# check GIT_DIR in environment
|
||||||
|
set(GIT_DIR $ENV{GIT_DIR})
|
||||||
|
if(NOT GIT_DIR)
|
||||||
|
set(GIT_PARENT_DIR ${CMAKE_CURRENT_SOURCE_DIR})
|
||||||
|
set(GIT_DIR ${GIT_PARENT_DIR}/.git)
|
||||||
|
endif()
|
||||||
|
# .git dir not found, search parent directories
|
||||||
|
while(NOT EXISTS ${GIT_DIR})
|
||||||
|
set(GIT_PREVIOUS_PARENT ${GIT_PARENT_DIR})
|
||||||
|
get_filename_component(GIT_PARENT_DIR ${GIT_PARENT_DIR} PATH)
|
||||||
|
if(GIT_PARENT_DIR STREQUAL GIT_PREVIOUS_PARENT)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
set(GIT_DIR ${GIT_PARENT_DIR}/.git)
|
||||||
|
endwhile()
|
||||||
|
# check if this is a submodule
|
||||||
|
if(NOT IS_DIRECTORY ${GIT_DIR})
|
||||||
|
file(READ ${GIT_DIR} submodule)
|
||||||
|
string(REGEX REPLACE "gitdir: (.*)\n$" "\\1" GIT_DIR_RELATIVE ${submodule})
|
||||||
|
get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH)
|
||||||
|
get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} ABSOLUTE)
|
||||||
|
endif()
|
||||||
|
set(${_gitdir} ${GIT_DIR} PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(get_git_head_revision _refspecvar _hashvar)
|
||||||
|
get_git_dir(GIT_DIR)
|
||||||
|
if(NOT GIT_DIR)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(GIT_DATA ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data)
|
||||||
|
if(NOT EXISTS ${GIT_DATA})
|
||||||
|
file(MAKE_DIRECTORY ${GIT_DATA})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT EXISTS ${GIT_DIR}/HEAD)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
set(HEAD_FILE ${GIT_DATA}/HEAD)
|
||||||
|
configure_file(${GIT_DIR}/HEAD ${HEAD_FILE} COPYONLY)
|
||||||
|
|
||||||
|
configure_file(${_gitdescmoddir}/GetGitRevisionDescription.cmake.in
|
||||||
|
${GIT_DATA}/grabRef.cmake
|
||||||
|
@ONLY)
|
||||||
|
include(${GIT_DATA}/grabRef.cmake)
|
||||||
|
|
||||||
|
set(${_refspecvar} ${HEAD_REF} PARENT_SCOPE)
|
||||||
|
set(${_hashvar} ${HEAD_HASH} PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(git_describe _var)
|
||||||
|
get_git_dir(GIT_DIR)
|
||||||
|
if(NOT GIT_DIR)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT GIT_FOUND)
|
||||||
|
find_package(Git QUIET)
|
||||||
|
endif()
|
||||||
|
if(NOT GIT_FOUND)
|
||||||
|
set(${_var} "GIT-NOTFOUND" PARENT_SCOPE)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
get_git_head_revision(refspec hash)
|
||||||
|
if(NOT hash)
|
||||||
|
set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
execute_process(COMMAND
|
||||||
|
${GIT_EXECUTABLE}
|
||||||
|
describe
|
||||||
|
${hash}
|
||||||
|
${ARGN}
|
||||||
|
WORKING_DIRECTORY
|
||||||
|
${GIT_DIR}
|
||||||
|
RESULT_VARIABLE
|
||||||
|
res
|
||||||
|
OUTPUT_VARIABLE
|
||||||
|
out
|
||||||
|
ERROR_QUIET
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
if(NOT res EQUAL 0)
|
||||||
|
set(out "${out}-${res}-NOTFOUND")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(${_var} ${out} PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(git_timestamp _var)
|
||||||
|
get_git_dir(GIT_DIR)
|
||||||
|
if(NOT GIT_DIR)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT GIT_FOUND)
|
||||||
|
find_package(Git QUIET)
|
||||||
|
endif()
|
||||||
|
if(NOT GIT_FOUND)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
get_git_head_revision(refspec hash)
|
||||||
|
if(NOT hash)
|
||||||
|
set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
execute_process(COMMAND ${GIT_EXECUTABLE} log -1 --format="%ci" ${hash} ${ARGN}
|
||||||
|
WORKING_DIRECTORY ${GIT_DIR}
|
||||||
|
RESULT_VARIABLE res
|
||||||
|
OUTPUT_VARIABLE out
|
||||||
|
ERROR_QUIET
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
if(res EQUAL 0)
|
||||||
|
string(REGEX REPLACE "[-\" :]" "" out ${out})
|
||||||
|
string(SUBSTRING ${out} 0 12 out)
|
||||||
|
else()
|
||||||
|
set(out "${out}-${res}-NOTFOUND")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(${_var} ${out} PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(git_get_exact_tag _var)
|
||||||
|
git_describe(out --exact-match ${ARGN})
|
||||||
|
set(${_var} ${out} PARENT_SCOPE)
|
||||||
|
endfunction()
|
38
cmake/GetGitRevisionDescription.cmake.in
Normal file
38
cmake/GetGitRevisionDescription.cmake.in
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
#
|
||||||
|
# Internal file for GetGitRevisionDescription.cmake
|
||||||
|
#
|
||||||
|
# Requires CMake 2.6 or newer (uses the 'function' command)
|
||||||
|
#
|
||||||
|
# Original Author:
|
||||||
|
# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
|
||||||
|
# http://academic.cleardefinition.com
|
||||||
|
# Iowa State University HCI Graduate Program/VRAC
|
||||||
|
#
|
||||||
|
# Copyright Iowa State University 2009-2010.
|
||||||
|
# Distributed under the Boost Software License, Version 1.0.
|
||||||
|
# (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
# http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
|
set(HEAD_HASH)
|
||||||
|
|
||||||
|
file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024)
|
||||||
|
|
||||||
|
string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS)
|
||||||
|
if(HEAD_CONTENTS MATCHES "ref")
|
||||||
|
# named branch
|
||||||
|
string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}")
|
||||||
|
if(EXISTS "@GIT_DIR@/${HEAD_REF}")
|
||||||
|
configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY)
|
||||||
|
elseif(EXISTS "@GIT_DIR@/logs/${HEAD_REF}")
|
||||||
|
configure_file("@GIT_DIR@/logs/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY)
|
||||||
|
set(HEAD_HASH "${HEAD_REF}")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
# detached HEAD
|
||||||
|
configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT HEAD_HASH)
|
||||||
|
file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024)
|
||||||
|
string(STRIP "${HEAD_HASH}" HEAD_HASH)
|
||||||
|
endif()
|
@@ -154,25 +154,3 @@ function(install_helper)
|
|||||||
${RENAME})
|
${RENAME})
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# Without CONFIGURE_DEPENDS globbing reuses cached file tree on rebuild.
|
|
||||||
# For example it will ignore new files.
|
|
||||||
# CONFIGURE_DEPENDS was introduced in 3.12
|
|
||||||
|
|
||||||
function(glob_wrapper outvar)
|
|
||||||
if(${CMAKE_VERSION} VERSION_LESS 3.12)
|
|
||||||
file(GLOB ${outvar} ${ARGN})
|
|
||||||
else()
|
|
||||||
file(GLOB ${outvar} CONFIGURE_DEPENDS ${ARGN})
|
|
||||||
endif()
|
|
||||||
set(${outvar} ${${outvar}} PARENT_SCOPE)
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
function(globrecurse_wrapper outvar root)
|
|
||||||
if(${CMAKE_VERSION} VERSION_LESS 3.12)
|
|
||||||
file(GLOB_RECURSE ${outvar} RELATIVE ${root} ${ARGN})
|
|
||||||
else()
|
|
||||||
file(GLOB_RECURSE ${outvar} CONFIGURE_DEPENDS RELATIVE ${root} ${ARGN})
|
|
||||||
endif()
|
|
||||||
set(${outvar} ${${outvar}} PARENT_SCOPE)
|
|
||||||
endfunction()
|
|
||||||
|
@@ -10,7 +10,6 @@ set(ENV{VIMRUNTIME} ${WORKING_DIR}/runtime)
|
|||||||
set(ENV{NVIM_RPLUGIN_MANIFEST} ${BUILD_DIR}/Xtest_rplugin_manifest)
|
set(ENV{NVIM_RPLUGIN_MANIFEST} ${BUILD_DIR}/Xtest_rplugin_manifest)
|
||||||
set(ENV{XDG_CONFIG_HOME} ${BUILD_DIR}/Xtest_xdg/config)
|
set(ENV{XDG_CONFIG_HOME} ${BUILD_DIR}/Xtest_xdg/config)
|
||||||
set(ENV{XDG_DATA_HOME} ${BUILD_DIR}/Xtest_xdg/share)
|
set(ENV{XDG_DATA_HOME} ${BUILD_DIR}/Xtest_xdg/share)
|
||||||
unset(ENV{XDG_DATA_DIRS})
|
|
||||||
|
|
||||||
if(NOT DEFINED ENV{NVIM_LOG_FILE})
|
if(NOT DEFINED ENV{NVIM_LOG_FILE})
|
||||||
set(ENV{NVIM_LOG_FILE} ${BUILD_DIR}/.nvimlog)
|
set(ENV{NVIM_LOG_FILE} ${BUILD_DIR}/.nvimlog)
|
||||||
@@ -46,21 +45,10 @@ if(DEFINED ENV{TEST_FILTER} AND NOT "$ENV{TEST_FILTER}" STREQUAL "")
|
|||||||
list(APPEND BUSTED_ARGS --filter $ENV{TEST_FILTER})
|
list(APPEND BUSTED_ARGS --filter $ENV{TEST_FILTER})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(DEFINED ENV{TEST_FILTER_OUT} AND NOT "$ENV{TEST_FILTER_OUT}" STREQUAL "")
|
|
||||||
list(APPEND BUSTED_ARGS --filter-out $ENV{TEST_FILTER_OUT})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# TMPDIR: use relative test path (for parallel test runs / isolation).
|
# TMPDIR: use relative test path (for parallel test runs / isolation).
|
||||||
set(ENV{TMPDIR} "${BUILD_DIR}/Xtest_tmpdir/${TEST_PATH}")
|
set(ENV{TMPDIR} "${BUILD_DIR}/Xtest_tmpdir/${TEST_PATH}")
|
||||||
execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory $ENV{TMPDIR})
|
execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory $ENV{TMPDIR})
|
||||||
|
|
||||||
# HISTFILE: do not write into user's ~/.bash_history
|
|
||||||
set(ENV{HISTFILE} "/dev/null")
|
|
||||||
|
|
||||||
if(NOT DEFINED ENV{TEST_TIMEOUT} OR "$ENV{TEST_TIMEOUT}" STREQUAL "")
|
|
||||||
set(ENV{TEST_TIMEOUT} 1200)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(ENV{SYSTEM_NAME} ${CMAKE_HOST_SYSTEM_NAME}) # used by test/helpers.lua.
|
set(ENV{SYSTEM_NAME} ${CMAKE_HOST_SYSTEM_NAME}) # used by test/helpers.lua.
|
||||||
execute_process(
|
execute_process(
|
||||||
COMMAND ${BUSTED_PRG} -v -o test.busted.outputHandlers.${BUSTED_OUTPUT_TYPE}
|
COMMAND ${BUSTED_PRG} -v -o test.busted.outputHandlers.${BUSTED_OUTPUT_TYPE}
|
||||||
@@ -70,7 +58,6 @@ execute_process(
|
|||||||
--lpath=?.lua
|
--lpath=?.lua
|
||||||
${BUSTED_ARGS}
|
${BUSTED_ARGS}
|
||||||
${TEST_PATH}
|
${TEST_PATH}
|
||||||
TIMEOUT $ENV{TEST_TIMEOUT}
|
|
||||||
WORKING_DIRECTORY ${WORKING_DIR}
|
WORKING_DIRECTORY ${WORKING_DIR}
|
||||||
ERROR_VARIABLE err
|
ERROR_VARIABLE err
|
||||||
RESULT_VARIABLE res
|
RESULT_VARIABLE res
|
||||||
|
@@ -1,21 +0,0 @@
|
|||||||
if(NOT EXISTS "@CMAKE_BINARY_DIR@/install_manifest.txt")
|
|
||||||
message(FATAL_ERROR "Cannot find install manifest: @CMAKE_BINARY_DIR@/install_manifest.txt")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
file(READ "@CMAKE_BINARY_DIR@/install_manifest.txt" files)
|
|
||||||
string(REGEX REPLACE "\n" ";" files "${files}")
|
|
||||||
foreach(file ${files})
|
|
||||||
message(STATUS "Uninstalling $ENV{DESTDIR}${file}")
|
|
||||||
if(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
|
|
||||||
exec_program(
|
|
||||||
"@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\""
|
|
||||||
OUTPUT_VARIABLE rm_out
|
|
||||||
RETURN_VALUE rm_retval
|
|
||||||
)
|
|
||||||
if(NOT "${rm_retval}" STREQUAL 0)
|
|
||||||
message(FATAL_ERROR "Problem when removing $ENV{DESTDIR}${file}")
|
|
||||||
endif()
|
|
||||||
else(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
|
|
||||||
message(STATUS "File $ENV{DESTDIR}${file} does not exist.")
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
@@ -12,6 +12,11 @@ check_type_size("size_t" SIZEOF_SIZE_T)
|
|||||||
check_type_size("long long" SIZEOF_LONG_LONG)
|
check_type_size("long long" SIZEOF_LONG_LONG)
|
||||||
check_type_size("void *" SIZEOF_VOID_PTR)
|
check_type_size("void *" SIZEOF_VOID_PTR)
|
||||||
|
|
||||||
|
if (CMAKE_HOST_SYSTEM_VERSION MATCHES ".*-Microsoft")
|
||||||
|
# Windows Subsystem for Linux
|
||||||
|
set(HAVE_WSL 1)
|
||||||
|
endif()
|
||||||
|
|
||||||
check_symbol_exists(_NSGetEnviron crt_externs.h HAVE__NSGETENVIRON)
|
check_symbol_exists(_NSGetEnviron crt_externs.h HAVE__NSGETENVIRON)
|
||||||
|
|
||||||
# Headers
|
# Headers
|
||||||
@@ -27,7 +32,6 @@ endif()
|
|||||||
check_include_files(sys/utsname.h HAVE_SYS_UTSNAME_H)
|
check_include_files(sys/utsname.h HAVE_SYS_UTSNAME_H)
|
||||||
check_include_files(termios.h HAVE_TERMIOS_H)
|
check_include_files(termios.h HAVE_TERMIOS_H)
|
||||||
check_include_files(sys/uio.h HAVE_SYS_UIO_H)
|
check_include_files(sys/uio.h HAVE_SYS_UIO_H)
|
||||||
check_include_files(sys/sdt.h HAVE_SYS_SDT_H)
|
|
||||||
|
|
||||||
# Functions
|
# Functions
|
||||||
check_function_exists(fseeko HAVE_FSEEKO)
|
check_function_exists(fseeko HAVE_FSEEKO)
|
||||||
@@ -47,7 +51,6 @@ check_function_exists(setsid HAVE_SETSID)
|
|||||||
check_function_exists(sigaction HAVE_SIGACTION)
|
check_function_exists(sigaction HAVE_SIGACTION)
|
||||||
check_function_exists(strcasecmp HAVE_STRCASECMP)
|
check_function_exists(strcasecmp HAVE_STRCASECMP)
|
||||||
check_function_exists(strncasecmp HAVE_STRNCASECMP)
|
check_function_exists(strncasecmp HAVE_STRNCASECMP)
|
||||||
check_function_exists(strptime HAVE_STRPTIME)
|
|
||||||
|
|
||||||
# Symbols
|
# Symbols
|
||||||
check_symbol_exists(FD_CLOEXEC "fcntl.h" HAVE_FD_CLOEXEC)
|
check_symbol_exists(FD_CLOEXEC "fcntl.h" HAVE_FD_CLOEXEC)
|
||||||
@@ -92,7 +95,7 @@ if (NOT "${HAVE_BE64TOH}")
|
|||||||
# any case and ORDER_BIG_ENDIAN will not be examined.
|
# any case and ORDER_BIG_ENDIAN will not be examined.
|
||||||
# - CMAKE_CROSSCOMPILING *and* HAVE_BE64TOH are both false. In this case
|
# - CMAKE_CROSSCOMPILING *and* HAVE_BE64TOH are both false. In this case
|
||||||
# be64toh function which uses cycle and arithmetic operations is used which
|
# be64toh function which uses cycle and arithmetic operations is used which
|
||||||
# will work regardless of endianness. Function is sub-optimal though.
|
# will work regardless of endianess. Function is sub-optimal though.
|
||||||
check_c_source_runs("
|
check_c_source_runs("
|
||||||
${SI}
|
${SI}
|
||||||
${MS}
|
${MS}
|
||||||
|
@@ -33,14 +33,12 @@
|
|||||||
#cmakedefine HAVE_STRCASECMP
|
#cmakedefine HAVE_STRCASECMP
|
||||||
#cmakedefine HAVE_STRINGS_H
|
#cmakedefine HAVE_STRINGS_H
|
||||||
#cmakedefine HAVE_STRNCASECMP
|
#cmakedefine HAVE_STRNCASECMP
|
||||||
#cmakedefine HAVE_STRPTIME
|
|
||||||
#cmakedefine HAVE_SYS_SDT_H
|
|
||||||
#cmakedefine HAVE_SYS_UTSNAME_H
|
#cmakedefine HAVE_SYS_UTSNAME_H
|
||||||
#cmakedefine HAVE_SYS_WAIT_H
|
#cmakedefine HAVE_SYS_WAIT_H
|
||||||
#cmakedefine HAVE_TERMIOS_H
|
#cmakedefine HAVE_TERMIOS_H
|
||||||
#cmakedefine HAVE_WORKING_LIBINTL
|
#cmakedefine HAVE_WORKING_LIBINTL
|
||||||
|
#cmakedefine HAVE_WSL
|
||||||
#cmakedefine UNIX
|
#cmakedefine UNIX
|
||||||
#cmakedefine CASE_INSENSITIVE_FILENAME
|
|
||||||
#cmakedefine USE_FNAME_CASE
|
#cmakedefine USE_FNAME_CASE
|
||||||
#cmakedefine HAVE_SYS_UIO_H
|
#cmakedefine HAVE_SYS_UIO_H
|
||||||
#ifdef HAVE_SYS_UIO_H
|
#ifdef HAVE_SYS_UIO_H
|
||||||
@@ -62,6 +60,5 @@
|
|||||||
|
|
||||||
#cmakedefine HAVE_EXECINFO_BACKTRACE
|
#cmakedefine HAVE_EXECINFO_BACKTRACE
|
||||||
#cmakedefine HAVE_BUILTIN_ADD_OVERFLOW
|
#cmakedefine HAVE_BUILTIN_ADD_OVERFLOW
|
||||||
#cmakedefine HAVE_WIMPLICIT_FALLTHROUGH_FLAG
|
|
||||||
|
|
||||||
#endif // AUTO_CONFIG_H
|
#endif // AUTO_CONFIG_H
|
||||||
|
@@ -3,6 +3,5 @@
|
|||||||
#include "${PROJECT_SOURCE_DIR}/src/nvim/vim.h"
|
#include "${PROJECT_SOURCE_DIR}/src/nvim/vim.h"
|
||||||
char *default_vim_dir = "${CMAKE_INSTALL_FULL_DATAROOTDIR}/nvim";
|
char *default_vim_dir = "${CMAKE_INSTALL_FULL_DATAROOTDIR}/nvim";
|
||||||
char *default_vimruntime_dir = "";
|
char *default_vimruntime_dir = "";
|
||||||
char *default_lib_dir = "${CMAKE_INSTALL_FULL_LIBDIR}/nvim";
|
|
||||||
char_u *compiled_user = (char_u *)"${USERNAME}";
|
char_u *compiled_user = (char_u *)"${USERNAME}";
|
||||||
char_u *compiled_sys = (char_u *)"${HOSTNAME}";
|
char_u *compiled_sys = (char_u *)"${HOSTNAME}";
|
||||||
|
@@ -5,11 +5,7 @@
|
|||||||
#define NVIM_VERSION_MINOR @NVIM_VERSION_MINOR@
|
#define NVIM_VERSION_MINOR @NVIM_VERSION_MINOR@
|
||||||
#define NVIM_VERSION_PATCH @NVIM_VERSION_PATCH@
|
#define NVIM_VERSION_PATCH @NVIM_VERSION_PATCH@
|
||||||
#define NVIM_VERSION_PRERELEASE "@NVIM_VERSION_PRERELEASE@"
|
#define NVIM_VERSION_PRERELEASE "@NVIM_VERSION_PRERELEASE@"
|
||||||
|
|
||||||
#cmakedefine NVIM_VERSION_MEDIUM "@NVIM_VERSION_MEDIUM@"
|
#cmakedefine NVIM_VERSION_MEDIUM "@NVIM_VERSION_MEDIUM@"
|
||||||
#ifndef NVIM_VERSION_MEDIUM
|
|
||||||
# include "auto/versiondef_git.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define NVIM_API_LEVEL @NVIM_API_LEVEL@
|
#define NVIM_API_LEVEL @NVIM_API_LEVEL@
|
||||||
#define NVIM_API_LEVEL_COMPAT @NVIM_API_LEVEL_COMPAT@
|
#define NVIM_API_LEVEL_COMPAT @NVIM_API_LEVEL_COMPAT@
|
||||||
|
43
contrib/flake.lock
generated
43
contrib/flake.lock
generated
@@ -1,43 +0,0 @@
|
|||||||
{
|
|
||||||
"nodes": {
|
|
||||||
"flake-utils": {
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1629481132,
|
|
||||||
"narHash": "sha256-JHgasjPR0/J1J3DRm4KxM4zTyAj4IOJY8vIl75v/kPI=",
|
|
||||||
"owner": "numtide",
|
|
||||||
"repo": "flake-utils",
|
|
||||||
"rev": "997f7efcb746a9c140ce1f13c72263189225f482",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "numtide",
|
|
||||||
"repo": "flake-utils",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"nixpkgs": {
|
|
||||||
"locked": {
|
|
||||||
"lastModified": 1630074300,
|
|
||||||
"narHash": "sha256-BFM7OiXRs0RvSUZd6NCGAKWVPn3VodgYQ4TUQXxbMBU=",
|
|
||||||
"owner": "nixos",
|
|
||||||
"repo": "nixpkgs",
|
|
||||||
"rev": "21c937f8cb1e6adcfeb36dfd6c90d9d9bfab1d28",
|
|
||||||
"type": "github"
|
|
||||||
},
|
|
||||||
"original": {
|
|
||||||
"owner": "nixos",
|
|
||||||
"ref": "nixos-unstable",
|
|
||||||
"repo": "nixpkgs",
|
|
||||||
"type": "github"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"root": {
|
|
||||||
"inputs": {
|
|
||||||
"flake-utils": "flake-utils",
|
|
||||||
"nixpkgs": "nixpkgs"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"root": "root",
|
|
||||||
"version": 7
|
|
||||||
}
|
|
@@ -1,133 +0,0 @@
|
|||||||
{
|
|
||||||
description = "Neovim flake";
|
|
||||||
|
|
||||||
inputs = {
|
|
||||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
|
||||||
flake-utils.url = "github:numtide/flake-utils";
|
|
||||||
};
|
|
||||||
|
|
||||||
outputs = { self, nixpkgs, flake-utils }:
|
|
||||||
{
|
|
||||||
overlay = final: prev:
|
|
||||||
let
|
|
||||||
pkgs = nixpkgs.legacyPackages.${prev.system};
|
|
||||||
in
|
|
||||||
rec {
|
|
||||||
neovim = pkgs.neovim-unwrapped.overrideAttrs (oa: {
|
|
||||||
version = "master";
|
|
||||||
src = ../.;
|
|
||||||
});
|
|
||||||
|
|
||||||
# a development binary to help debug issues
|
|
||||||
neovim-debug = let
|
|
||||||
stdenv = if pkgs.stdenv.isLinux then pkgs.llvmPackages_latest.stdenv else pkgs.stdenv;
|
|
||||||
in
|
|
||||||
((neovim.override {
|
|
||||||
lua = pkgs.luajit;
|
|
||||||
inherit stdenv;
|
|
||||||
}).overrideAttrs (oa: {
|
|
||||||
|
|
||||||
dontStrip = true;
|
|
||||||
NIX_CFLAGS_COMPILE = " -ggdb -Og";
|
|
||||||
|
|
||||||
cmakeBuildType = "Debug";
|
|
||||||
cmakeFlags = oa.cmakeFlags ++ [
|
|
||||||
"-DMIN_LOG_LEVEL=0"
|
|
||||||
];
|
|
||||||
|
|
||||||
disallowedReferences = [];
|
|
||||||
}));
|
|
||||||
|
|
||||||
# for neovim developers, beware of the slow binary
|
|
||||||
neovim-developer =
|
|
||||||
let
|
|
||||||
lib = nixpkgs.lib;
|
|
||||||
luacheck = pkgs.luaPackages.luacheck;
|
|
||||||
in
|
|
||||||
(neovim-debug.override ({ doCheck = pkgs.stdenv.isLinux; })).overrideAttrs (oa: {
|
|
||||||
cmakeFlags = oa.cmakeFlags ++ [
|
|
||||||
"-DLUACHECK_PRG=${luacheck}/bin/luacheck"
|
|
||||||
"-DMIN_LOG_LEVEL=0"
|
|
||||||
"-DENABLE_LTO=OFF"
|
|
||||||
] ++ pkgs.lib.optionals pkgs.stdenv.isLinux [
|
|
||||||
# https://github.com/google/sanitizers/wiki/AddressSanitizerFlags
|
|
||||||
# https://clang.llvm.org/docs/AddressSanitizer.html#symbolizing-the-reports
|
|
||||||
"-DCLANG_ASAN_UBSAN=ON"
|
|
||||||
];
|
|
||||||
});
|
|
||||||
};
|
|
||||||
} //
|
|
||||||
flake-utils.lib.eachDefaultSystem (system:
|
|
||||||
let
|
|
||||||
pkgs = import nixpkgs {
|
|
||||||
overlays = [ self.overlay ];
|
|
||||||
inherit system;
|
|
||||||
};
|
|
||||||
|
|
||||||
pythonEnv = pkgs.python3.withPackages(ps: [
|
|
||||||
ps.msgpack
|
|
||||||
ps.flake8 # for 'make pylint'
|
|
||||||
]);
|
|
||||||
in
|
|
||||||
rec {
|
|
||||||
|
|
||||||
packages = with pkgs; {
|
|
||||||
inherit neovim neovim-debug neovim-developer;
|
|
||||||
};
|
|
||||||
|
|
||||||
checks = {
|
|
||||||
pylint = pkgs.runCommandNoCC "pylint" {
|
|
||||||
nativeBuildInputs = [ pythonEnv ];
|
|
||||||
preferLocalBuild = true;
|
|
||||||
} "make -C ${./..} pylint > $out";
|
|
||||||
|
|
||||||
shlint = pkgs.runCommandNoCC "shlint" {
|
|
||||||
nativeBuildInputs = [ pkgs.shellcheck ];
|
|
||||||
preferLocalBuild = true;
|
|
||||||
} "make -C ${./..} shlint > $out";
|
|
||||||
};
|
|
||||||
|
|
||||||
defaultPackage = pkgs.neovim;
|
|
||||||
|
|
||||||
apps = {
|
|
||||||
nvim = flake-utils.lib.mkApp { drv = pkgs.neovim; name = "nvim"; };
|
|
||||||
nvim-debug = flake-utils.lib.mkApp { drv = pkgs.neovim-debug; name = "nvim"; };
|
|
||||||
};
|
|
||||||
|
|
||||||
defaultApp = apps.nvim;
|
|
||||||
|
|
||||||
devShell = let
|
|
||||||
in
|
|
||||||
pkgs.neovim-developer.overrideAttrs(oa: {
|
|
||||||
|
|
||||||
buildInputs = with pkgs; oa.buildInputs ++ [
|
|
||||||
cmake
|
|
||||||
pythonEnv
|
|
||||||
include-what-you-use # for scripts/check-includes.py
|
|
||||||
jq # jq for scripts/vim-patch.sh -r
|
|
||||||
shellcheck # for `make shlint`
|
|
||||||
doxygen # for script/gen_vimdoc.py
|
|
||||||
clang-tools # for clangd to find the correct headers
|
|
||||||
];
|
|
||||||
|
|
||||||
shellHook = oa.shellHook + ''
|
|
||||||
export NVIM_PYTHON_LOG_LEVEL=DEBUG
|
|
||||||
export NVIM_LOG_FILE=/tmp/nvim.log
|
|
||||||
export ASAN_SYMBOLIZER_PATH=${pkgs.llvm_11}/bin/llvm-symbolizer
|
|
||||||
|
|
||||||
# ASAN_OPTIONS=detect_leaks=1
|
|
||||||
export ASAN_OPTIONS="log_path=./test.log:abort_on_error=1"
|
|
||||||
export UBSAN_OPTIONS=print_stacktrace=1
|
|
||||||
mkdir -p build/runtime/parser
|
|
||||||
# nvim looks into CMAKE_INSTALL_DIR. Hack to avoid errors
|
|
||||||
# when running the functionaltests
|
|
||||||
mkdir -p outputs/out/share/nvim/syntax
|
|
||||||
touch outputs/out/share/nvim/syntax/syntax.vim
|
|
||||||
|
|
||||||
# for treesitter functionaltests
|
|
||||||
mkdir -p runtime/parser
|
|
||||||
cp -f ${pkgs.tree-sitter.builtGrammars.tree-sitter-c}/parser runtime/parser/c.so
|
|
||||||
'';
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
@@ -25,12 +25,6 @@
|
|||||||
#
|
#
|
||||||
# CMAKE_BUILD_TYPE := Debug
|
# CMAKE_BUILD_TYPE := Debug
|
||||||
|
|
||||||
# With non-Debug builds interprocedural optimization (IPO) (which includes
|
|
||||||
# link-time optimization (LTO)) is enabled by default, which causes the link
|
|
||||||
# step to take a significant amount of time, which is relevant when building
|
|
||||||
# often. You can disable it explicitly:
|
|
||||||
# CMAKE_EXTRA_FLAGS += -DENABLE_LTO=OFF
|
|
||||||
|
|
||||||
# Log levels: 0 (DEBUG), 1 (INFO), 2 (WARNING), 3 (ERROR)
|
# Log levels: 0 (DEBUG), 1 (INFO), 2 (WARNING), 3 (ERROR)
|
||||||
# Default is 1 (INFO) unless CMAKE_BUILD_TYPE is Release or RelWithDebInfo.
|
# Default is 1 (INFO) unless CMAKE_BUILD_TYPE is Release or RelWithDebInfo.
|
||||||
# CMAKE_EXTRA_FLAGS += -DMIN_LOG_LEVEL=1
|
# CMAKE_EXTRA_FLAGS += -DMIN_LOG_LEVEL=1
|
||||||
@@ -48,7 +42,6 @@
|
|||||||
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_LUAROCKS=OFF
|
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_LUAROCKS=OFF
|
||||||
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_MSGPACK=OFF
|
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_MSGPACK=OFF
|
||||||
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_UNIBILIUM=OFF
|
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_UNIBILIUM=OFF
|
||||||
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_UTF8PROC=OFF
|
|
||||||
#
|
#
|
||||||
# Or disable all bundled dependencies at once.
|
# Or disable all bundled dependencies at once.
|
||||||
#
|
#
|
||||||
|
1578
contrib/uncrustify.cfg
Normal file
1578
contrib/uncrustify.cfg
Normal file
File diff suppressed because it is too large
Load Diff
14
man/nvim.1
14
man/nvim.1
@@ -100,7 +100,7 @@ Useful for scripting because it does NOT start a UI, unlike
|
|||||||
.Ic :help silent-mode
|
.Ic :help silent-mode
|
||||||
.It Fl d
|
.It Fl d
|
||||||
Diff mode.
|
Diff mode.
|
||||||
Show the difference between two to eight files, similar to
|
Show the difference between two to four files, similar to
|
||||||
.Xr sdiff 1 .
|
.Xr sdiff 1 .
|
||||||
.Ic ":help diff"
|
.Ic ":help diff"
|
||||||
.It Fl R
|
.It Fl R
|
||||||
@@ -113,6 +113,9 @@ associated with a file.
|
|||||||
To overwrite a file, add an exclamation mark to the relevant Ex command, such as
|
To overwrite a file, add an exclamation mark to the relevant Ex command, such as
|
||||||
.Ic :w! .
|
.Ic :w! .
|
||||||
.Ic ":help 'readonly'"
|
.Ic ":help 'readonly'"
|
||||||
|
.It Fl Z
|
||||||
|
Restricted mode.
|
||||||
|
Disable commands that make use of an external shell.
|
||||||
.It Fl m
|
.It Fl m
|
||||||
Resets the 'write' option, to disable file modifications.
|
Resets the 'write' option, to disable file modifications.
|
||||||
Writing to a file is disabled, but buffers can still be modified.
|
Writing to a file is disabled, but buffers can still be modified.
|
||||||
@@ -177,7 +180,8 @@ If
|
|||||||
.Ar vimrc
|
.Ar vimrc
|
||||||
is
|
is
|
||||||
.Cm NORC ,
|
.Cm NORC ,
|
||||||
do not load any initialization files (except plugins).
|
do not load any initialization files (except plugins),
|
||||||
|
and do not attempt to parse environment variables.
|
||||||
If
|
If
|
||||||
.Ar vimrc
|
.Ar vimrc
|
||||||
is
|
is
|
||||||
@@ -200,7 +204,7 @@ Skip loading plugins.
|
|||||||
Implied by
|
Implied by
|
||||||
.Cm -u NONE .
|
.Cm -u NONE .
|
||||||
.It Fl -clean
|
.It Fl -clean
|
||||||
Mimic a fresh install of Nvim. Skip loading non-builtin plugins and shada (viminfo) file.
|
Skip loading plugins and shada (viminfo) file.
|
||||||
.It Fl o Ns Op Ar N
|
.It Fl o Ns Op Ar N
|
||||||
Open
|
Open
|
||||||
.Ar N
|
.Ar N
|
||||||
@@ -326,7 +330,7 @@ Print version information and exit.
|
|||||||
.Sh ENVIRONMENT
|
.Sh ENVIRONMENT
|
||||||
.Bl -tag -width Fl
|
.Bl -tag -width Fl
|
||||||
.It Ev NVIM_LOG_FILE
|
.It Ev NVIM_LOG_FILE
|
||||||
Low-level log file, usually found at ~/.cache/nvim/log.
|
Low-level log file, usually found at ~/.local/share/nvim/log.
|
||||||
:help $NVIM_LOG_FILE
|
:help $NVIM_LOG_FILE
|
||||||
.It Ev VIM
|
.It Ev VIM
|
||||||
Used to locate user files, such as init.vim.
|
Used to locate user files, such as init.vim.
|
||||||
@@ -374,7 +378,7 @@ See also
|
|||||||
System-global
|
System-global
|
||||||
.Nm
|
.Nm
|
||||||
configuration file.
|
configuration file.
|
||||||
.It Pa $VIM
|
.It Pa /usr/local/share/nvim
|
||||||
System-global
|
System-global
|
||||||
.Nm
|
.Nm
|
||||||
runtime directory.
|
runtime directory.
|
||||||
|
@@ -21,12 +21,12 @@ add_custom_command(OUTPUT ${GENERATED_SYN_VIM}
|
|||||||
${FUNCS_DATA}
|
${FUNCS_DATA}
|
||||||
)
|
)
|
||||||
|
|
||||||
glob_wrapper(PACKAGES ${PROJECT_SOURCE_DIR}/runtime/pack/dist/opt/*)
|
file(GLOB PACKAGES ${PROJECT_SOURCE_DIR}/runtime/pack/dist/opt/*)
|
||||||
|
|
||||||
set(GENERATED_PACKAGE_TAGS)
|
set(GENERATED_PACKAGE_TAGS)
|
||||||
foreach(PACKAGE ${PACKAGES})
|
foreach(PACKAGE ${PACKAGES})
|
||||||
get_filename_component(PACKNAME ${PACKAGE} NAME)
|
get_filename_component(PACKNAME ${PACKAGE} NAME)
|
||||||
glob_wrapper("${PACKNAME}_DOC_FILES" ${PACKAGE}/doc/*.txt)
|
file(GLOB "${PACKNAME}_DOC_FILES" ${PACKAGE}/doc/*.txt)
|
||||||
if(${PACKNAME}_DOC_FILES)
|
if(${PACKNAME}_DOC_FILES)
|
||||||
file(MAKE_DIRECTORY ${GENERATED_PACKAGE_DIR}/${PACKNAME})
|
file(MAKE_DIRECTORY ${GENERATED_PACKAGE_DIR}/${PACKNAME})
|
||||||
add_custom_command(OUTPUT "${GENERATED_PACKAGE_DIR}/${PACKNAME}/doc/tags"
|
add_custom_command(OUTPUT "${GENERATED_PACKAGE_DIR}/${PACKNAME}/doc/tags"
|
||||||
@@ -54,7 +54,7 @@ foreach(PACKAGE ${PACKAGES})
|
|||||||
endif()
|
endif()
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
glob_wrapper(DOCFILES ${PROJECT_SOURCE_DIR}/runtime/doc/*.txt)
|
file(GLOB DOCFILES ${PROJECT_SOURCE_DIR}/runtime/doc/*.txt)
|
||||||
|
|
||||||
set(BUILDDOCFILES)
|
set(BUILDDOCFILES)
|
||||||
foreach(DF ${DOCFILES})
|
foreach(DF ${DOCFILES})
|
||||||
@@ -111,10 +111,12 @@ if(NOT APPLE)
|
|||||||
|
|
||||||
install_helper(
|
install_helper(
|
||||||
FILES ${CMAKE_CURRENT_SOURCE_DIR}/nvim.png
|
FILES ${CMAKE_CURRENT_SOURCE_DIR}/nvim.png
|
||||||
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/128x128/apps)
|
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pixmaps)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
globrecurse_wrapper(RUNTIME_PROGRAMS ${CMAKE_CURRENT_SOURCE_DIR} *.awk *.sh *.bat)
|
file(GLOB_RECURSE RUNTIME_PROGRAMS
|
||||||
|
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
*.awk *.sh *.bat)
|
||||||
|
|
||||||
foreach(PROG ${RUNTIME_PROGRAMS})
|
foreach(PROG ${RUNTIME_PROGRAMS})
|
||||||
get_filename_component(BASEDIR ${PROG} PATH)
|
get_filename_component(BASEDIR ${PROG} PATH)
|
||||||
@@ -122,7 +124,9 @@ foreach(PROG ${RUNTIME_PROGRAMS})
|
|||||||
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/nvim/runtime/${BASEDIR})
|
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/nvim/runtime/${BASEDIR})
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
globrecurse_wrapper(RUNTIME_FILES ${CMAKE_CURRENT_SOURCE_DIR}
|
file(GLOB_RECURSE RUNTIME_FILES
|
||||||
|
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
rgb.txt
|
||||||
*.vim *.lua *.dict *.py *.rb *.ps *.spl *.tutor *.tutor.json)
|
*.vim *.lua *.dict *.py *.rb *.ps *.spl *.tutor *.tutor.json)
|
||||||
|
|
||||||
foreach(F ${RUNTIME_FILES})
|
foreach(F ${RUNTIME_FILES})
|
||||||
|
@@ -67,13 +67,13 @@ if exists ('g:ada_with_gnat_project_files')
|
|||||||
endfor
|
endfor
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" Section: add standard exception {{{2
|
" Section: add standart exception {{{2
|
||||||
"
|
"
|
||||||
for Item in ['Constraint_Error', 'Program_Error', 'Storage_Error', 'Tasking_Error', 'Status_Error', 'Mode_Error', 'Name_Error', 'Use_Error', 'Device_Error', 'End_Error', 'Data_Error', 'Layout_Error', 'Length_Error', 'Pattern_Error', 'Index_Error', 'Translation_Error', 'Time_Error', 'Argument_Error', 'Tag_Error', 'Picture_Error', 'Terminator_Error', 'Conversion_Error', 'Pointer_Error', 'Dereference_Error', 'Update_Error']
|
for Item in ['Constraint_Error', 'Program_Error', 'Storage_Error', 'Tasking_Error', 'Status_Error', 'Mode_Error', 'Name_Error', 'Use_Error', 'Device_Error', 'End_Error', 'Data_Error', 'Layout_Error', 'Length_Error', 'Pattern_Error', 'Index_Error', 'Translation_Error', 'Time_Error', 'Argument_Error', 'Tag_Error', 'Picture_Error', 'Terminator_Error', 'Conversion_Error', 'Pointer_Error', 'Dereference_Error', 'Update_Error']
|
||||||
let g:ada#Keywords += [{
|
let g:ada#Keywords += [{
|
||||||
\ 'word': Item,
|
\ 'word': Item,
|
||||||
\ 'menu': 'exception',
|
\ 'menu': 'exception',
|
||||||
\ 'info': 'Ada standard exception.',
|
\ 'info': 'Ada standart exception.',
|
||||||
\ 'kind': 'x',
|
\ 'kind': 'x',
|
||||||
\ 'icase': 1}]
|
\ 'icase': 1}]
|
||||||
endfor
|
endfor
|
||||||
@@ -210,7 +210,7 @@ function ada#Word (...)
|
|||||||
let l:Line = substitute (getline (l:Line_Nr), g:ada#Comment, '', '' )
|
let l:Line = substitute (getline (l:Line_Nr), g:ada#Comment, '', '' )
|
||||||
|
|
||||||
" Cope with tag searching for items in comments; if we are, don't loop
|
" Cope with tag searching for items in comments; if we are, don't loop
|
||||||
" backwards looking for previous lines
|
" backards looking for previous lines
|
||||||
if l:Column_Nr > strlen(l:Line)
|
if l:Column_Nr > strlen(l:Line)
|
||||||
" We were in a comment
|
" We were in a comment
|
||||||
let l:Line = getline(l:Line_Nr)
|
let l:Line = getline(l:Line_Nr)
|
||||||
|
@@ -14,7 +14,7 @@
|
|||||||
" 15.10.2006 MK Bram's suggestion for runtime integration
|
" 15.10.2006 MK Bram's suggestion for runtime integration
|
||||||
" 05.11.2006 MK Bram suggested not to use include protection for
|
" 05.11.2006 MK Bram suggested not to use include protection for
|
||||||
" autoload
|
" autoload
|
||||||
" 05.11.2006 MK Bram suggested against using setlocal omnifunc
|
" 05.11.2006 MK Bram suggested agaist using setlocal omnifunc
|
||||||
" 05.11.2006 MK Bram suggested to save on spaces
|
" 05.11.2006 MK Bram suggested to save on spaces
|
||||||
" Help Page: ft-ada-omni
|
" Help Page: ft-ada-omni
|
||||||
"------------------------------------------------------------------------------
|
"------------------------------------------------------------------------------
|
||||||
|
@@ -1,13 +1,13 @@
|
|||||||
" Vim completion script
|
" Vim completion script
|
||||||
" Language: C
|
" Language: C
|
||||||
" Maintainer: Bram Moolenaar <Bram@vim.org>
|
" Maintainer: Bram Moolenaar <Bram@vim.org>
|
||||||
" Last Change: 2020 Nov 14
|
" Last Change: 2018 Aug 20
|
||||||
|
|
||||||
let s:cpo_save = &cpo
|
let s:cpo_save = &cpo
|
||||||
set cpo&vim
|
set cpo&vim
|
||||||
|
|
||||||
" This function is used for the 'omnifunc' option.
|
" This function is used for the 'omnifunc' option.
|
||||||
func ccomplete#Complete(findstart, base)
|
function! ccomplete#Complete(findstart, base)
|
||||||
if a:findstart
|
if a:findstart
|
||||||
" Locate the start of the item, including ".", "->" and "[...]".
|
" Locate the start of the item, including ".", "->" and "[...]".
|
||||||
let line = getline('.')
|
let line = getline('.')
|
||||||
@@ -244,7 +244,7 @@ func ccomplete#Complete(findstart, base)
|
|||||||
return map(res, 's:Tagline2item(v:val, brackets)')
|
return map(res, 's:Tagline2item(v:val, brackets)')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func s:GetAddition(line, match, memarg, bracket)
|
function! s:GetAddition(line, match, memarg, bracket)
|
||||||
" Guess if the item is an array.
|
" Guess if the item is an array.
|
||||||
if a:bracket && match(a:line, a:match . '\s*\[') > 0
|
if a:bracket && match(a:line, a:match . '\s*\[') > 0
|
||||||
return '['
|
return '['
|
||||||
@@ -260,13 +260,13 @@ func s:GetAddition(line, match, memarg, bracket)
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
return ''
|
return ''
|
||||||
endfunc
|
endfunction
|
||||||
|
|
||||||
" Turn the tag info "val" into an item for completion.
|
" Turn the tag info "val" into an item for completion.
|
||||||
" "val" is is an item in the list returned by taglist().
|
" "val" is is an item in the list returned by taglist().
|
||||||
" If it is a variable we may add "." or "->". Don't do it for other types,
|
" If it is a variable we may add "." or "->". Don't do it for other types,
|
||||||
" such as a typedef, by not including the info that s:GetAddition() uses.
|
" such as a typedef, by not including the info that s:GetAddition() uses.
|
||||||
func s:Tag2item(val)
|
function! s:Tag2item(val)
|
||||||
let res = {'match': a:val['name']}
|
let res = {'match': a:val['name']}
|
||||||
|
|
||||||
let res['extra'] = s:Tagcmd2extra(a:val['cmd'], a:val['name'], a:val['filename'])
|
let res['extra'] = s:Tagcmd2extra(a:val['cmd'], a:val['name'], a:val['filename'])
|
||||||
@@ -289,10 +289,10 @@ func s:Tag2item(val)
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
return res
|
return res
|
||||||
endfunc
|
endfunction
|
||||||
|
|
||||||
" Use all the items in dictionary for the "info" entry.
|
" Use all the items in dictionary for the "info" entry.
|
||||||
func s:Dict2info(dict)
|
function! s:Dict2info(dict)
|
||||||
let info = ''
|
let info = ''
|
||||||
for k in sort(keys(a:dict))
|
for k in sort(keys(a:dict))
|
||||||
let info .= k . repeat(' ', 10 - len(k))
|
let info .= k . repeat(' ', 10 - len(k))
|
||||||
@@ -307,7 +307,7 @@ func s:Dict2info(dict)
|
|||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
" Parse a tag line and return a dictionary with items like taglist()
|
" Parse a tag line and return a dictionary with items like taglist()
|
||||||
func s:ParseTagline(line)
|
function! s:ParseTagline(line)
|
||||||
let l = split(a:line, "\t")
|
let l = split(a:line, "\t")
|
||||||
let d = {}
|
let d = {}
|
||||||
if len(l) >= 3
|
if len(l) >= 3
|
||||||
@@ -334,12 +334,12 @@ func s:ParseTagline(line)
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
return d
|
return d
|
||||||
endfunc
|
endfunction
|
||||||
|
|
||||||
" Turn a match item "val" into an item for completion.
|
" Turn a match item "val" into an item for completion.
|
||||||
" "val['match']" is the matching item.
|
" "val['match']" is the matching item.
|
||||||
" "val['tagline']" is the tagline in which the last part was found.
|
" "val['tagline']" is the tagline in which the last part was found.
|
||||||
func s:Tagline2item(val, brackets)
|
function! s:Tagline2item(val, brackets)
|
||||||
let line = a:val['tagline']
|
let line = a:val['tagline']
|
||||||
let add = s:GetAddition(line, a:val['match'], [a:val], a:brackets == '')
|
let add = s:GetAddition(line, a:val['match'], [a:val], a:brackets == '')
|
||||||
let res = {'word': a:val['match'] . a:brackets . add }
|
let res = {'word': a:val['match'] . a:brackets . add }
|
||||||
@@ -377,10 +377,10 @@ func s:Tagline2item(val, brackets)
|
|||||||
let res['menu'] = s:Tagcmd2extra(s, a:val['match'], matchstr(line, '[^\t]*\t\zs[^\t]*\ze\t'))
|
let res['menu'] = s:Tagcmd2extra(s, a:val['match'], matchstr(line, '[^\t]*\t\zs[^\t]*\ze\t'))
|
||||||
endif
|
endif
|
||||||
return res
|
return res
|
||||||
endfunc
|
endfunction
|
||||||
|
|
||||||
" Turn a command from a tag line to something that is useful in the menu
|
" Turn a command from a tag line to something that is useful in the menu
|
||||||
func s:Tagcmd2extra(cmd, name, fname)
|
function! s:Tagcmd2extra(cmd, name, fname)
|
||||||
if a:cmd =~ '^/^'
|
if a:cmd =~ '^/^'
|
||||||
" The command is a search command, useful to see what it is.
|
" The command is a search command, useful to see what it is.
|
||||||
let x = matchstr(a:cmd, '^/^\s*\zs.*\ze$/')
|
let x = matchstr(a:cmd, '^/^\s*\zs.*\ze$/')
|
||||||
@@ -395,13 +395,13 @@ func s:Tagcmd2extra(cmd, name, fname)
|
|||||||
let x = a:cmd . ' - ' . a:fname
|
let x = a:cmd . ' - ' . a:fname
|
||||||
endif
|
endif
|
||||||
return x
|
return x
|
||||||
endfunc
|
endfunction
|
||||||
|
|
||||||
" Find composing type in "lead" and match items[0] with it.
|
" Find composing type in "lead" and match items[0] with it.
|
||||||
" Repeat this recursively for items[1], if it's there.
|
" Repeat this recursively for items[1], if it's there.
|
||||||
" When resolving typedefs "depth" is used to avoid infinite recursion.
|
" When resolving typedefs "depth" is used to avoid infinite recursion.
|
||||||
" Return the list of matches.
|
" Return the list of matches.
|
||||||
func s:Nextitem(lead, items, depth, all)
|
function! s:Nextitem(lead, items, depth, all)
|
||||||
|
|
||||||
" Use the text up to the variable name and split it in tokens.
|
" Use the text up to the variable name and split it in tokens.
|
||||||
let tokens = split(a:lead, '\s\+\|\<')
|
let tokens = split(a:lead, '\s\+\|\<')
|
||||||
@@ -485,7 +485,7 @@ func s:Nextitem(lead, items, depth, all)
|
|||||||
endfor
|
endfor
|
||||||
|
|
||||||
return res
|
return res
|
||||||
endfunc
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
" Search for members of structure "typename" in tags files.
|
" Search for members of structure "typename" in tags files.
|
||||||
@@ -493,7 +493,7 @@ endfunc
|
|||||||
" Each match is a dictionary with "match" and "tagline" entries.
|
" Each match is a dictionary with "match" and "tagline" entries.
|
||||||
" When "all" is non-zero find all, otherwise just return 1 if there is any
|
" When "all" is non-zero find all, otherwise just return 1 if there is any
|
||||||
" member.
|
" member.
|
||||||
func s:StructMembers(typename, items, all)
|
function! s:StructMembers(typename, items, all)
|
||||||
" Todo: What about local structures?
|
" Todo: What about local structures?
|
||||||
let fnames = join(map(tagfiles(), 'escape(v:val, " \\#%")'))
|
let fnames = join(map(tagfiles(), 'escape(v:val, " \\#%")'))
|
||||||
if fnames == ''
|
if fnames == ''
|
||||||
@@ -586,12 +586,12 @@ func s:StructMembers(typename, items, all)
|
|||||||
|
|
||||||
" Failed to find anything.
|
" Failed to find anything.
|
||||||
return []
|
return []
|
||||||
endfunc
|
endfunction
|
||||||
|
|
||||||
" For matching members, find matches for following items.
|
" For matching members, find matches for following items.
|
||||||
" When "all" is non-zero find all, otherwise just return 1 if there is any
|
" When "all" is non-zero find all, otherwise just return 1 if there is any
|
||||||
" member.
|
" member.
|
||||||
func s:SearchMembers(matches, items, all)
|
function! s:SearchMembers(matches, items, all)
|
||||||
let res = []
|
let res = []
|
||||||
for i in range(len(a:matches))
|
for i in range(len(a:matches))
|
||||||
let typename = ''
|
let typename = ''
|
||||||
@@ -635,5 +635,3 @@ endfunc
|
|||||||
|
|
||||||
let &cpo = s:cpo_save
|
let &cpo = s:cpo_save
|
||||||
unlet s:cpo_save
|
unlet s:cpo_save
|
||||||
|
|
||||||
" vim: noet sw=2 sts=2
|
|
||||||
|
File diff suppressed because one or more lines are too long
@@ -4,7 +4,7 @@
|
|||||||
" plus CSS Speech Module <http://www.w3.org/TR/css3-speech/>
|
" plus CSS Speech Module <http://www.w3.org/TR/css3-speech/>
|
||||||
" Maintainer: Kao, Wei-Ko(othree) ( othree AT gmail DOT com )
|
" Maintainer: Kao, Wei-Ko(othree) ( othree AT gmail DOT com )
|
||||||
" Original Author: Mikolaj Machowski ( mikmach AT wp DOT pl )
|
" Original Author: Mikolaj Machowski ( mikmach AT wp DOT pl )
|
||||||
" Last Change: 2021 Sep 21
|
" Last Change: 2018 Jul 02
|
||||||
|
|
||||||
let s:values = split("all additive-symbols align-content align-items align-self animation animation-delay animation-direction animation-duration animation-fill-mode animation-iteration-count animation-name animation-play-state animation-timing-function backface-visibility background background-attachment background-blend-mode background-clip background-color background-image background-origin background-position background-repeat background-size block-size border border-block-end border-block-end-color border-block-end-style border-block-end-width border-block-start border-block-start-color border-block-start-style border-block-start-width border-bottom border-bottom-color border-bottom-left-radius border-bottom-right-radius border-bottom-style border-bottom-width border-collapse border-color border-image border-image-outset border-image-repeat border-image-slice border-image-source border-image-width border-inline-end border-inline-end-color border-inline-end-style border-inline-end-width border-inline-start border-inline-start-color border-inline-start-style border-inline-start-width border-left border-left-color border-left-style border-left-width border-radius border-right border-right-color border-right-style border-right-width border-spacing border-style border-top border-top-color border-top-left-radius border-top-right-radius border-top-style border-top-width border-width bottom box-decoration-break box-shadow box-sizing break-after break-before break-inside caption-side clear clip clip-path color columns column-count column-fill column-gap column-rule column-rule-color column-rule-style column-rule-width column-span column-width content counter-increment counter-reset cue cue-before cue-after cursor direction display empty-cells fallback filter flex flex-basis flex-direction flex-flow flex-grow flex-shrink flex-wrap float font font-family font-feature-settings font-kerning font-language-override font-size font-size-adjust font-stretch font-style font-synthesis font-variant font-variant-alternates font-variant-caps font-variant-east-asian font-variant-ligatures font-variant-numeric font-variant-position font-weight grid grid-area grid-auto-columns grid-auto-flow grid-auto-position grid-auto-rows grid-column grid-column-start grid-column-end grid-row grid-row-start grid-row-end grid-template grid-template-areas grid-template-rows grid-template-columns height hyphens image-rendering image-resolution image-orientation ime-mode inline-size isolation justify-content left letter-spacing line-break line-height list-style list-style-image list-style-position list-style-type margin margin-block-end margin-block-start margin-bottom margin-inline-end margin-inline-start margin-left margin-right margin-top marks mask mask-type max-block-size max-height max-inline-size max-width max-zoom min-block-size min-height min-inline-size min-width min-zoom mix-blend-mode negative object-fit object-position offset-block-end offset-block-start offset-inline-end offset-inline-start opacity order orientation orphans outline outline-color outline-offset outline-style outline-width overflow overflow-wrap overflow-x overflow-y pad padding padding-block-end padding-block-start padding-bottom padding-inline-end padding-inline-start padding-left padding-right padding-top page-break-after page-break-before page-break-inside pause-before pause-after pause perspective perspective-origin pointer-events position prefix quotes range resize rest rest-before rest-after right ruby-align ruby-merge ruby-position scroll-behavior scroll-snap-coordinate scroll-snap-destination scroll-snap-points-x scroll-snap-points-y scroll-snap-type scroll-snap-type-x scroll-snap-type-y shape-image-threshold shape-margin shape-outside speak speak-as suffix symbols system table-layout tab-size text-align text-align-last text-combine-upright text-decoration text-decoration-color text-decoration-line text-emphasis text-emphasis-color text-emphasis-position text-emphasis-style text-indent text-orientation text-overflow text-rendering text-shadow text-transform text-underline-position top touch-action transform transform-box transform-origin transform-style transition transition-delay transition-duration transition-property transition-timing-function unicode-bidi unicode-range user-zoom vertical-align visibility voice-balance voice-duration voice-family voice-pitch voice-rate voice-range voice-stress voice-volume white-space widows width will-change word-break word-spacing word-wrap writing-mode z-index zoom")
|
let s:values = split("all additive-symbols align-content align-items align-self animation animation-delay animation-direction animation-duration animation-fill-mode animation-iteration-count animation-name animation-play-state animation-timing-function backface-visibility background background-attachment background-blend-mode background-clip background-color background-image background-origin background-position background-repeat background-size block-size border border-block-end border-block-end-color border-block-end-style border-block-end-width border-block-start border-block-start-color border-block-start-style border-block-start-width border-bottom border-bottom-color border-bottom-left-radius border-bottom-right-radius border-bottom-style border-bottom-width border-collapse border-color border-image border-image-outset border-image-repeat border-image-slice border-image-source border-image-width border-inline-end border-inline-end-color border-inline-end-style border-inline-end-width border-inline-start border-inline-start-color border-inline-start-style border-inline-start-width border-left border-left-color border-left-style border-left-width border-radius border-right border-right-color border-right-style border-right-width border-spacing border-style border-top border-top-color border-top-left-radius border-top-right-radius border-top-style border-top-width border-width bottom box-decoration-break box-shadow box-sizing break-after break-before break-inside caption-side clear clip clip-path color columns column-count column-fill column-gap column-rule column-rule-color column-rule-style column-rule-width column-span column-width content counter-increment counter-reset cue cue-before cue-after cursor direction display empty-cells fallback filter flex flex-basis flex-direction flex-flow flex-grow flex-shrink flex-wrap float font font-family font-feature-settings font-kerning font-language-override font-size font-size-adjust font-stretch font-style font-synthesis font-variant font-variant-alternates font-variant-caps font-variant-east-asian font-variant-ligatures font-variant-numeric font-variant-position font-weight grid grid-area grid-auto-columns grid-auto-flow grid-auto-position grid-auto-rows grid-column grid-column-start grid-column-end grid-row grid-row-start grid-row-end grid-template grid-template-areas grid-template-rows grid-template-columns height hyphens image-rendering image-resolution image-orientation ime-mode inline-size isolation justify-content left letter-spacing line-break line-height list-style list-style-image list-style-position list-style-type margin margin-block-end margin-block-start margin-bottom margin-inline-end margin-inline-start margin-left margin-right margin-top marks mask mask-type max-block-size max-height max-inline-size max-width max-zoom min-block-size min-height min-inline-size min-width min-zoom mix-blend-mode negative object-fit object-position offset-block-end offset-block-start offset-inline-end offset-inline-start opacity order orientation orphans outline outline-color outline-offset outline-style outline-width overflow overflow-wrap overflow-x overflow-y pad padding padding-block-end padding-block-start padding-bottom padding-inline-end padding-inline-start padding-left padding-right padding-top page-break-after page-break-before page-break-inside pause-before pause-after pause perspective perspective-origin pointer-events position prefix quotes range resize rest rest-before rest-after right ruby-align ruby-merge ruby-position scroll-behavior scroll-snap-coordinate scroll-snap-destination scroll-snap-points-x scroll-snap-points-y scroll-snap-type scroll-snap-type-x scroll-snap-type-y shape-image-threshold shape-margin shape-outside speak speak-as suffix symbols system table-layout tab-size text-align text-align-last text-combine-upright text-decoration text-decoration-color text-decoration-line text-emphasis text-emphasis-color text-emphasis-position text-emphasis-style text-indent text-orientation text-overflow text-rendering text-shadow text-transform text-underline-position top touch-action transform transform-box transform-origin transform-style transition transition-delay transition-duration transition-property transition-timing-function unicode-bidi unicode-range user-zoom vertical-align visibility voice-balance voice-duration voice-family voice-pitch voice-rate voice-range voice-stress voice-volume white-space widows width will-change word-break word-spacing word-wrap writing-mode z-index zoom")
|
||||||
|
|
||||||
@@ -38,12 +38,12 @@ function! csscomplete#CompleteCSS(findstart, base)
|
|||||||
if exists("b:compl_context")
|
if exists("b:compl_context")
|
||||||
let line = getline('.')
|
let line = getline('.')
|
||||||
let compl_begin = col('.') - 2
|
let compl_begin = col('.') - 2
|
||||||
let b:after = line[compl_begin:]
|
let after = line[compl_begin:]
|
||||||
let line = b:compl_context
|
let line = b:compl_context
|
||||||
unlet! b:compl_context
|
unlet! b:compl_context
|
||||||
else
|
else
|
||||||
let line = a:base
|
let line = a:base
|
||||||
let b:after = ''
|
let after = ''
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let res = []
|
let res = []
|
||||||
@@ -311,7 +311,7 @@ function! csscomplete#CompleteCSS(findstart, base)
|
|||||||
let values = ["normal", "italic", "oblique", "small-caps", "bold", "bolder", "lighter", "100", "200", "300", "400", "500", "600", "700", "800", "900", "xx-small", "x-small", "small", "medium", "large", "x-large", "xx-large", "larger", "smaller", "sans-serif", "serif", "monospace", "cursive", "fantasy", "caption", "icon", "menu", "message-box", "small-caption", "status-bar"]
|
let values = ["normal", "italic", "oblique", "small-caps", "bold", "bolder", "lighter", "100", "200", "300", "400", "500", "600", "700", "800", "900", "xx-small", "x-small", "small", "medium", "large", "x-large", "xx-large", "larger", "smaller", "sans-serif", "serif", "monospace", "cursive", "fantasy", "caption", "icon", "menu", "message-box", "small-caption", "status-bar"]
|
||||||
elseif prop =~ '^\%(height\|width\)$'
|
elseif prop =~ '^\%(height\|width\)$'
|
||||||
let values = ["auto", "border-box", "content-box", "max-content", "min-content", "available", "fit-content"]
|
let values = ["auto", "border-box", "content-box", "max-content", "min-content", "available", "fit-content"]
|
||||||
elseif prop =~ '^\%(left\|right\)$'
|
elseif prop =~ '^\%(left\|rigth\)$'
|
||||||
let values = ["auto"]
|
let values = ["auto"]
|
||||||
elseif prop == 'image-rendering'
|
elseif prop == 'image-rendering'
|
||||||
let values = ["auto", "crisp-edges", "pixelated"]
|
let values = ["auto", "crisp-edges", "pixelated"]
|
||||||
|
@@ -23,9 +23,9 @@ endif
|
|||||||
|
|
||||||
function decada#Unit_Name () dict " {{{1
|
function decada#Unit_Name () dict " {{{1
|
||||||
" Convert filename into acs unit:
|
" Convert filename into acs unit:
|
||||||
" 1: remove the file extension.
|
" 1: remove the file extenstion.
|
||||||
" 2: replace all double '_' or '-' with an dot (which denotes a separate)
|
" 2: replace all double '_' or '-' with an dot (which denotes a separate)
|
||||||
" 3: remove a trailing '_' (which denotes a specification)
|
" 3: remove a trailing '_' (wich denotes a specification)
|
||||||
return substitute (substitute (expand ("%:t:r"), '__\|-', ".", "g"), '_$', "", '')
|
return substitute (substitute (expand ("%:t:r"), '__\|-', ".", "g"), '_$', "", '')
|
||||||
endfunction decada#Unit_Name " }}}1
|
endfunction decada#Unit_Name " }}}1
|
||||||
|
|
||||||
|
82
runtime/autoload/dist/ft.vim
vendored
82
runtime/autoload/dist/ft.vim
vendored
@@ -1,7 +1,7 @@
|
|||||||
" Vim functions for file type detection
|
" Vim functions for file type detection
|
||||||
"
|
"
|
||||||
" Maintainer: Bram Moolenaar <Bram@vim.org>
|
" Maintainer: Bram Moolenaar <Bram@vim.org>
|
||||||
" Last Change: 2020 Aug 17
|
" Last Change: 2019 Mar 08
|
||||||
|
|
||||||
" These functions are moved here from runtime/filetype.vim to make startup
|
" These functions are moved here from runtime/filetype.vim to make startup
|
||||||
" faster.
|
" faster.
|
||||||
@@ -172,17 +172,6 @@ func dist#ft#FTent()
|
|||||||
setf dtd
|
setf dtd
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func dist#ft#ExCheck()
|
|
||||||
let lines = getline(1, min([line("$"), 100]))
|
|
||||||
if exists('g:filetype_euphoria')
|
|
||||||
exe 'setf ' . g:filetype_euphoria
|
|
||||||
elseif match(lines, '^--\|^ifdef\>\|^include\>') > -1
|
|
||||||
setf euphoria3
|
|
||||||
else
|
|
||||||
setf elixir
|
|
||||||
endif
|
|
||||||
endfunc
|
|
||||||
|
|
||||||
func dist#ft#EuphoriaCheck()
|
func dist#ft#EuphoriaCheck()
|
||||||
if exists('g:filetype_euphoria')
|
if exists('g:filetype_euphoria')
|
||||||
exe 'setf ' . g:filetype_euphoria
|
exe 'setf ' . g:filetype_euphoria
|
||||||
@@ -219,23 +208,6 @@ func dist#ft#FTe()
|
|||||||
endif
|
endif
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
" Distinguish between Forth and F#.
|
|
||||||
" Provided by Doug Kearns.
|
|
||||||
func dist#ft#FTfs()
|
|
||||||
if exists("g:filetype_fs")
|
|
||||||
exe "setf " . g:filetype_fs
|
|
||||||
else
|
|
||||||
let line = getline(nextnonblank(1))
|
|
||||||
" comments and colon definitions
|
|
||||||
if line =~ '^\s*\.\=( ' || line =~ '^\s*\\G\= ' || line =~ '^\\$'
|
|
||||||
\ || line =~ '^\s*: \S'
|
|
||||||
setf forth
|
|
||||||
else
|
|
||||||
setf fsharp
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endfunc
|
|
||||||
|
|
||||||
" Distinguish between HTML, XHTML and Django
|
" Distinguish between HTML, XHTML and Django
|
||||||
func dist#ft#FThtml()
|
func dist#ft#FThtml()
|
||||||
let n = 1
|
let n = 1
|
||||||
@@ -281,16 +253,6 @@ func dist#ft#ProtoCheck(default)
|
|||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func dist#ft#FTm()
|
func dist#ft#FTm()
|
||||||
if exists("g:filetype_m")
|
|
||||||
exe "setf " . g:filetype_m
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
" excluding end(for|function|if|switch|while) common to Murphi
|
|
||||||
let octave_block_terminators = '\<end\%(_try_catch\|classdef\|enumeration\|events\|methods\|parfor\|properties\)\>'
|
|
||||||
|
|
||||||
let objc_preprocessor = '^\s*#\s*\%(import\|include\|define\|if\|ifn\=def\|undef\|line\|error\|pragma\)\>'
|
|
||||||
|
|
||||||
let n = 1
|
let n = 1
|
||||||
let saw_comment = 0 " Whether we've seen a multiline comment leader.
|
let saw_comment = 0 " Whether we've seen a multiline comment leader.
|
||||||
while n < 100
|
while n < 100
|
||||||
@@ -301,16 +263,10 @@ func dist#ft#FTm()
|
|||||||
" anything more definitive.
|
" anything more definitive.
|
||||||
let saw_comment = 1
|
let saw_comment = 1
|
||||||
endif
|
endif
|
||||||
if line =~ '^\s*//' || line =~ '^\s*@import\>' || line =~ objc_preprocessor
|
if line =~ '^\s*\(#\s*\(include\|import\)\>\|@import\>\|//\)'
|
||||||
setf objc
|
setf objc
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
if line =~ '^\s*\%(#\|%!\)' || line =~ '^\s*unwind_protect\>' ||
|
|
||||||
\ line =~ '\%(^\|;\)\s*' .. octave_block_terminators
|
|
||||||
setf octave
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
" TODO: could be Matlab or Octave
|
|
||||||
if line =~ '^\s*%'
|
if line =~ '^\s*%'
|
||||||
setf matlab
|
setf matlab
|
||||||
return
|
return
|
||||||
@@ -331,15 +287,18 @@ func dist#ft#FTm()
|
|||||||
" or Murphi based on the comment leader. Assume the former as it is more
|
" or Murphi based on the comment leader. Assume the former as it is more
|
||||||
" common.
|
" common.
|
||||||
setf objc
|
setf objc
|
||||||
|
elseif exists("g:filetype_m")
|
||||||
|
" Use user specified default filetype for .m
|
||||||
|
exe "setf " . g:filetype_m
|
||||||
else
|
else
|
||||||
" Default is Matlab
|
" Default is matlab
|
||||||
setf matlab
|
setf matlab
|
||||||
endif
|
endif
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func dist#ft#FTmms()
|
func dist#ft#FTmms()
|
||||||
let n = 1
|
let n = 1
|
||||||
while n < 20
|
while n < 10
|
||||||
let line = getline(n)
|
let line = getline(n)
|
||||||
if line =~ '^\s*\(%\|//\)' || line =~ '^\*'
|
if line =~ '^\s*\(%\|//\)' || line =~ '^\*'
|
||||||
setf mmix
|
setf mmix
|
||||||
@@ -366,7 +325,7 @@ endfunc
|
|||||||
|
|
||||||
func dist#ft#FTmm()
|
func dist#ft#FTmm()
|
||||||
let n = 1
|
let n = 1
|
||||||
while n < 20
|
while n < 10
|
||||||
let line = getline(n)
|
let line = getline(n)
|
||||||
if line =~ '^\s*\(#\s*\(include\|import\)\>\|@import\>\|/\*\)'
|
if line =~ '^\s*\(#\s*\(include\|import\)\>\|@import\>\|/\*\)'
|
||||||
setf objcpp
|
setf objcpp
|
||||||
@@ -403,10 +362,6 @@ func dist#ft#FTinc()
|
|||||||
setf aspvbs
|
setf aspvbs
|
||||||
elseif lines =~ "<?"
|
elseif lines =~ "<?"
|
||||||
setf php
|
setf php
|
||||||
" Pascal supports // comments but they're vary rarely used for file
|
|
||||||
" headers so assume POV-Ray
|
|
||||||
elseif lines =~ '^\s*\%({\|(\*\)' || lines =~? s:ft_pascal_keywords
|
|
||||||
setf pascal
|
|
||||||
else
|
else
|
||||||
call dist#ft#FTasmsyntax()
|
call dist#ft#FTasmsyntax()
|
||||||
if exists("b:asmsyntax")
|
if exists("b:asmsyntax")
|
||||||
@@ -453,9 +408,6 @@ func dist#ft#FTprogress_asm()
|
|||||||
setf progress
|
setf progress
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
let s:ft_pascal_comments = '^\s*\%({\|(\*\|//\)'
|
|
||||||
let s:ft_pascal_keywords = '^\s*\%(program\|unit\|library\|uses\|begin\|procedure\|function\|const\|type\|var\)\>'
|
|
||||||
|
|
||||||
func dist#ft#FTprogress_pascal()
|
func dist#ft#FTprogress_pascal()
|
||||||
if exists("g:filetype_p")
|
if exists("g:filetype_p")
|
||||||
exe "setf " . g:filetype_p
|
exe "setf " . g:filetype_p
|
||||||
@@ -467,7 +419,8 @@ func dist#ft#FTprogress_pascal()
|
|||||||
let lnum = 1
|
let lnum = 1
|
||||||
while lnum <= 10 && lnum < line('$')
|
while lnum <= 10 && lnum < line('$')
|
||||||
let line = getline(lnum)
|
let line = getline(lnum)
|
||||||
if line =~ s:ft_pascal_comments || line =~? s:ft_pascal_keywords
|
if line =~ '^\s*\(program\|unit\|procedure\|function\|const\|type\|var\)\>'
|
||||||
|
\ || line =~ '^\s*{' || line =~ '^\s*(\*'
|
||||||
setf pascal
|
setf pascal
|
||||||
return
|
return
|
||||||
elseif line !~ '^\s*$' || line =~ '^/\*'
|
elseif line !~ '^\s*$' || line =~ '^/\*'
|
||||||
@@ -480,19 +433,6 @@ func dist#ft#FTprogress_pascal()
|
|||||||
setf progress
|
setf progress
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func dist#ft#FTpp()
|
|
||||||
if exists("g:filetype_pp")
|
|
||||||
exe "setf " . g:filetype_pp
|
|
||||||
else
|
|
||||||
let line = getline(nextnonblank(1))
|
|
||||||
if line =~ s:ft_pascal_comments || line =~? s:ft_pascal_keywords
|
|
||||||
setf pascal
|
|
||||||
else
|
|
||||||
setf puppet
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endfunc
|
|
||||||
|
|
||||||
func dist#ft#FTr()
|
func dist#ft#FTr()
|
||||||
let max = line("$") > 50 ? 50 : line("$")
|
let max = line("$") > 50 ? 50 : line("$")
|
||||||
|
|
||||||
@@ -635,7 +575,7 @@ endfunc
|
|||||||
let s:ft_rules_udev_rules_pattern = '^\s*\cudev_rules\s*=\s*"\([^"]\{-1,}\)/*".*'
|
let s:ft_rules_udev_rules_pattern = '^\s*\cudev_rules\s*=\s*"\([^"]\{-1,}\)/*".*'
|
||||||
func dist#ft#FTRules()
|
func dist#ft#FTRules()
|
||||||
let path = expand('<amatch>:p')
|
let path = expand('<amatch>:p')
|
||||||
if path =~ '/\(etc/udev/\%(rules\.d/\)\=.*\.rules\|\%(usr/\)\=lib/udev/\%(rules\.d/\)\=.*\.rules\)$'
|
if path =~ '^/\(etc/udev/\%(rules\.d/\)\=.*\.rules\|lib/udev/\%(rules\.d/\)\=.*\.rules\)$'
|
||||||
setf udevrules
|
setf udevrules
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
@@ -2,7 +2,7 @@
|
|||||||
" Language: Haskell
|
" Language: Haskell
|
||||||
" Maintainer: Daniel Campoverde <alx@sillybytes.net>
|
" Maintainer: Daniel Campoverde <alx@sillybytes.net>
|
||||||
" URL: https://github.com/alx741/haskellcomplete.vim
|
" URL: https://github.com/alx741/haskellcomplete.vim
|
||||||
" Last Change: 2019 May 14
|
" Last Change: 2018 Aug 26
|
||||||
|
|
||||||
" Usage: setlocal omnifunc=haskellcomplete#Complete
|
" Usage: setlocal omnifunc=haskellcomplete#Complete
|
||||||
|
|
||||||
@@ -54,7 +54,7 @@ function! haskellcomplete#Complete(findstart, base)
|
|||||||
|
|
||||||
if b:completingLangExtension
|
if b:completingLangExtension
|
||||||
if a:base ==? ""
|
if a:base ==? ""
|
||||||
" Return all possible Lang extensions
|
" Return all posible Lang extensions
|
||||||
return s:langExtensions
|
return s:langExtensions
|
||||||
else
|
else
|
||||||
let l:matches = []
|
let l:matches = []
|
||||||
@@ -63,14 +63,13 @@ function! haskellcomplete#Complete(findstart, base)
|
|||||||
call add(l:matches, extension)
|
call add(l:matches, extension)
|
||||||
endif
|
endif
|
||||||
endfor
|
endfor
|
||||||
let b:completingLangExtension = 0
|
|
||||||
return l:matches
|
return l:matches
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
elseif b:completingOptionsGHC
|
elseif b:completingOptionsGHC
|
||||||
if a:base ==? ""
|
if a:base ==? ""
|
||||||
" Return all possible GHC options
|
" Return all posible GHC options
|
||||||
return s:optionsGHC
|
return s:optionsGHC
|
||||||
else
|
else
|
||||||
let l:matches = []
|
let l:matches = []
|
||||||
@@ -79,14 +78,13 @@ function! haskellcomplete#Complete(findstart, base)
|
|||||||
call add(l:matches, flag)
|
call add(l:matches, flag)
|
||||||
endif
|
endif
|
||||||
endfor
|
endfor
|
||||||
let b:completingOptionsGHC = 0
|
|
||||||
return l:matches
|
return l:matches
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
elseif b:completingModule
|
elseif b:completingModule
|
||||||
if a:base ==? ""
|
if a:base ==? ""
|
||||||
" Return all possible modules
|
" Return all posible modules
|
||||||
return s:commonModules
|
return s:commonModules
|
||||||
else
|
else
|
||||||
let l:matches = []
|
let l:matches = []
|
||||||
@@ -95,7 +93,6 @@ function! haskellcomplete#Complete(findstart, base)
|
|||||||
call add(l:matches, module)
|
call add(l:matches, module)
|
||||||
endif
|
endif
|
||||||
endfor
|
endfor
|
||||||
let b:completingModule = 0
|
|
||||||
return l:matches
|
return l:matches
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@@ -1,57 +1,79 @@
|
|||||||
|
function! s:enhance_syntax() abort
|
||||||
|
syntax case match
|
||||||
|
|
||||||
|
syntax keyword healthError ERROR[:]
|
||||||
|
\ containedin=markdownCodeBlock,mkdListItemLine
|
||||||
|
highlight default link healthError Error
|
||||||
|
|
||||||
|
syntax keyword healthWarning WARNING[:]
|
||||||
|
\ containedin=markdownCodeBlock,mkdListItemLine
|
||||||
|
highlight default link healthWarning WarningMsg
|
||||||
|
|
||||||
|
syntax keyword healthSuccess OK[:]
|
||||||
|
\ containedin=markdownCodeBlock,mkdListItemLine
|
||||||
|
highlight default healthSuccess guibg=#5fff00 guifg=#080808 ctermbg=82 ctermfg=232
|
||||||
|
|
||||||
|
syntax match healthHelp "|.\{-}|" contains=healthBar
|
||||||
|
\ containedin=markdownCodeBlock,mkdListItemLine
|
||||||
|
syntax match healthBar "|" contained conceal
|
||||||
|
highlight default link healthHelp Identifier
|
||||||
|
|
||||||
|
" We do not care about markdown syntax errors in :checkhealth output.
|
||||||
|
highlight! link markdownError Normal
|
||||||
|
endfunction
|
||||||
|
|
||||||
" Runs the specified healthchecks.
|
" Runs the specified healthchecks.
|
||||||
" Runs all discovered healthchecks if a:plugin_names is empty.
|
" Runs all discovered healthchecks if a:plugin_names is empty.
|
||||||
function! health#check(plugin_names) abort
|
function! health#check(plugin_names) abort
|
||||||
let healthchecks = empty(a:plugin_names)
|
let healthchecks = empty(a:plugin_names)
|
||||||
\ ? s:discover_healthchecks()
|
\ ? s:discover_health_checks()
|
||||||
\ : s:get_healthcheck(a:plugin_names)
|
\ : s:to_fn_names(a:plugin_names)
|
||||||
|
|
||||||
" create scratch-buffer
|
tabnew
|
||||||
execute 'tab sbuffer' nvim_create_buf(v:true, v:true)
|
setlocal wrap breakindent linebreak
|
||||||
setfiletype checkhealth
|
setlocal filetype=markdown
|
||||||
|
setlocal conceallevel=2 concealcursor=nc
|
||||||
|
setlocal keywordprg=:help
|
||||||
|
let &l:iskeyword='!-~,^*,^|,^",192-255'
|
||||||
|
call s:enhance_syntax()
|
||||||
|
|
||||||
if empty(healthchecks)
|
if empty(healthchecks)
|
||||||
call setline(1, 'ERROR: No healthchecks found.')
|
call setline(1, 'ERROR: No healthchecks found.')
|
||||||
else
|
else
|
||||||
redraw|echo 'Running healthchecks...'
|
redraw|echo 'Running healthchecks...'
|
||||||
for name in sort(keys(healthchecks))
|
for c in healthchecks
|
||||||
let [func, type] = healthchecks[name]
|
let output = ''
|
||||||
let s:output = []
|
call append('$', split(printf("\n%s\n%s", c, repeat('=',72)), "\n"))
|
||||||
try
|
try
|
||||||
if func == ''
|
let output = "\n\n".execute('call '.c.'()')
|
||||||
throw 'healthcheck_not_found'
|
|
||||||
endif
|
|
||||||
eval type == 'v' ? call(func, []) : luaeval(func)
|
|
||||||
catch
|
catch
|
||||||
let s:output = [] " Clear the output
|
if v:exception =~# '^Vim\%((\a\+)\)\=:E117.*\V'.c
|
||||||
if v:exception =~# 'healthcheck_not_found'
|
let output = execute(
|
||||||
call health#report_error('No healthcheck found for "'.name.'" plugin.')
|
\ 'call health#report_error(''No healthcheck found for "'
|
||||||
|
\ .s:to_plugin_name(c)
|
||||||
|
\ .'" plugin.'')')
|
||||||
else
|
else
|
||||||
call health#report_error(printf(
|
let output = execute(
|
||||||
\ "Failed to run healthcheck for \"%s\" plugin. Exception:\n%s\n%s",
|
\ 'call health#report_error(''Failed to run healthcheck for "'
|
||||||
\ name, v:throwpoint, v:exception))
|
\ .s:to_plugin_name(c)
|
||||||
|
\ .'" plugin. Exception:''."\n".v:throwpoint."\n".v:exception)')
|
||||||
endif
|
endif
|
||||||
endtry
|
endtry
|
||||||
let header = [name. ': ' . func, repeat('=', 72)]
|
call append('$', split(output, "\n") + [''])
|
||||||
" remove empty line after header from report_start
|
|
||||||
let s:output = s:output[0] == '' ? s:output[1:] : s:output
|
|
||||||
let s:output = header + s:output + ['']
|
|
||||||
call append('$', s:output)
|
|
||||||
redraw
|
redraw
|
||||||
endfor
|
endfor
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" needed for plasticboy/vim-markdown, because it uses fdm=expr
|
" needed for plasticboy/vim-markdown, because it uses fdm=expr
|
||||||
normal! zR
|
normal! zR
|
||||||
|
setlocal nomodified
|
||||||
|
setlocal bufhidden=hide
|
||||||
redraw|echo ''
|
redraw|echo ''
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:collect_output(output)
|
|
||||||
let s:output += split(a:output, "\n", 1)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Starts a new report.
|
" Starts a new report.
|
||||||
function! health#report_start(name) abort
|
function! health#report_start(name) abort
|
||||||
call s:collect_output("\n## " . a:name)
|
echo "\n## " . a:name
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Indents lines *except* line 1 of a string if it contains newlines.
|
" Indents lines *except* line 1 of a string if it contains newlines.
|
||||||
@@ -97,21 +119,21 @@ endfunction " }}}
|
|||||||
|
|
||||||
" Use {msg} to report information in the current section
|
" Use {msg} to report information in the current section
|
||||||
function! health#report_info(msg) abort " {{{
|
function! health#report_info(msg) abort " {{{
|
||||||
call s:collect_output(s:format_report_message('INFO', a:msg))
|
echo s:format_report_message('INFO', a:msg)
|
||||||
endfunction " }}}
|
endfunction " }}}
|
||||||
|
|
||||||
" Reports a successful healthcheck.
|
" Reports a successful healthcheck.
|
||||||
function! health#report_ok(msg) abort " {{{
|
function! health#report_ok(msg) abort " {{{
|
||||||
call s:collect_output(s:format_report_message('OK', a:msg))
|
echo s:format_report_message('OK', a:msg)
|
||||||
endfunction " }}}
|
endfunction " }}}
|
||||||
|
|
||||||
" Reports a health warning.
|
" Reports a health warning.
|
||||||
" a:1: Optional advice (string or list)
|
" a:1: Optional advice (string or list)
|
||||||
function! health#report_warn(msg, ...) abort " {{{
|
function! health#report_warn(msg, ...) abort " {{{
|
||||||
if a:0 > 0
|
if a:0 > 0
|
||||||
call s:collect_output(s:format_report_message('WARNING', a:msg, a:1))
|
echo s:format_report_message('WARNING', a:msg, a:1)
|
||||||
else
|
else
|
||||||
call s:collect_output(s:format_report_message('WARNING', a:msg))
|
echo s:format_report_message('WARNING', a:msg)
|
||||||
endif
|
endif
|
||||||
endfunction " }}}
|
endfunction " }}}
|
||||||
|
|
||||||
@@ -119,73 +141,37 @@ endfunction " }}}
|
|||||||
" a:1: Optional advice (string or list)
|
" a:1: Optional advice (string or list)
|
||||||
function! health#report_error(msg, ...) abort " {{{
|
function! health#report_error(msg, ...) abort " {{{
|
||||||
if a:0 > 0
|
if a:0 > 0
|
||||||
call s:collect_output(s:format_report_message('ERROR', a:msg, a:1))
|
echo s:format_report_message('ERROR', a:msg, a:1)
|
||||||
else
|
else
|
||||||
call s:collect_output(s:format_report_message('ERROR', a:msg))
|
echo s:format_report_message('ERROR', a:msg)
|
||||||
endif
|
endif
|
||||||
endfunction " }}}
|
endfunction " }}}
|
||||||
|
|
||||||
" From a path return a list [{name}, {func}, {type}] representing a healthcheck
|
function! s:filepath_to_function(name) abort
|
||||||
function! s:filepath_to_healthcheck(path) abort
|
return substitute(substitute(substitute(a:name, '.*autoload[\/]', '', ''),
|
||||||
if a:path =~# 'vim$'
|
\ '\.vim', '#check', ''), '[\/]', '#', 'g')
|
||||||
let name = matchstr(a:path, '\zs[^\/]*\ze\.vim$')
|
|
||||||
let func = 'health#'.name.'#check'
|
|
||||||
let type = 'v'
|
|
||||||
else
|
|
||||||
let base_path = substitute(a:path,
|
|
||||||
\ '.*lua[\/]\(.\{-}\)[\/]health\([\/]init\)\?\.lua$',
|
|
||||||
\ '\1', '')
|
|
||||||
let name = substitute(base_path, '[\/]', '.', 'g')
|
|
||||||
let func = 'require("'.name.'.health").check()'
|
|
||||||
let type = 'l'
|
|
||||||
endif
|
|
||||||
return [name, func, type]
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:discover_healthchecks() abort
|
function! s:discover_health_checks() abort
|
||||||
return s:get_healthcheck('*')
|
let healthchecks = globpath(&runtimepath, 'autoload/health/*.vim', 1, 1)
|
||||||
|
let healthchecks = map(healthchecks, '<SID>filepath_to_function(v:val)')
|
||||||
|
return healthchecks
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Returns Dictionary {name: [func, type], ..} representing healthchecks
|
" Translates a list of plugin names to healthcheck function names.
|
||||||
function! s:get_healthcheck(plugin_names) abort
|
function! s:to_fn_names(plugin_names) abort
|
||||||
let health_list = s:get_healthcheck_list(a:plugin_names)
|
|
||||||
let healthchecks = {}
|
|
||||||
for c in health_list
|
|
||||||
let normalized_name = substitute(c[0], '-', '_', 'g')
|
|
||||||
let existent = get(healthchecks, normalized_name, [])
|
|
||||||
" Prefer Lua over vim entries
|
|
||||||
if existent != [] && existent[2] == 'l'
|
|
||||||
continue
|
|
||||||
else
|
|
||||||
let healthchecks[normalized_name] = c
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
let output = {}
|
|
||||||
for v in values(healthchecks)
|
|
||||||
let output[v[0]] = v[1:]
|
|
||||||
endfor
|
|
||||||
return output
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Returns list of lists [ [{name}, {func}, {type}] ] representing healthchecks
|
|
||||||
function! s:get_healthcheck_list(plugin_names) abort
|
|
||||||
let healthchecks = []
|
let healthchecks = []
|
||||||
let plugin_names = type('') == type(a:plugin_names)
|
let plugin_names = type('') ==# type(a:plugin_names)
|
||||||
\ ? split(a:plugin_names, ' ', v:false)
|
\ ? split(a:plugin_names, '', v:false)
|
||||||
\ : a:plugin_names
|
\ : a:plugin_names
|
||||||
for p in plugin_names
|
for p in plugin_names
|
||||||
" support vim/lsp/health{/init/}.lua as :checkhealth vim.lsp
|
call add(healthchecks, 'health#'.p.'#check')
|
||||||
let p = substitute(p, '\.', '/', 'g')
|
|
||||||
let p = substitute(p, '*$', '**', 'g') " find all submodule e.g vim*
|
|
||||||
let paths = nvim_get_runtime_file('autoload/health/'.p.'.vim', v:true)
|
|
||||||
\ + nvim_get_runtime_file('lua/**/'.p.'/health/init.lua', v:true)
|
|
||||||
\ + nvim_get_runtime_file('lua/**/'.p.'/health.lua', v:true)
|
|
||||||
if len(paths) == 0
|
|
||||||
let healthchecks += [[p, '', '']] " healthchek not found
|
|
||||||
else
|
|
||||||
let healthchecks += map(uniq(sort(paths)),
|
|
||||||
\'<SID>filepath_to_healthcheck(v:val)')
|
|
||||||
end
|
|
||||||
endfor
|
endfor
|
||||||
return healthchecks
|
return healthchecks
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
" Extracts 'foo' from 'health#foo#check'.
|
||||||
|
function! s:to_plugin_name(fn_name) abort
|
||||||
|
return substitute(a:fn_name,
|
||||||
|
\ '\v.*health\#(.+)\#check.*', '\1', '')
|
||||||
|
endfunction
|
||||||
|
@@ -41,27 +41,10 @@ function! s:check_config() abort
|
|||||||
\ 'Check `:verbose set paste?` to see if a plugin or script set the option.', ])
|
\ 'Check `:verbose set paste?` to see if a plugin or script set the option.', ])
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let writeable = v:true
|
let shadafile = (empty(&shadafile) || &shadafile ==# 'NONE') ? stdpath('data').'/shada/main.shada' : &shadafile
|
||||||
let shadafile = empty(&shada) ? &shada : substitute(matchstr(
|
if !empty(shadafile) && (!filereadable(shadafile) || !filewritable(shadafile))
|
||||||
\ split(&shada, ',')[-1], '^n.\+'), '^n', '', '')
|
|
||||||
let shadafile = empty(&shadafile) ? empty(shadafile) ?
|
|
||||||
\ stdpath('data').'/shada/main.shada' : expand(shadafile)
|
|
||||||
\ : &shadafile ==# 'NONE' ? '' : &shadafile
|
|
||||||
if !empty(shadafile) && empty(glob(shadafile))
|
|
||||||
" Since this may be the first time neovim has been run, we will try to
|
|
||||||
" create a shada file
|
|
||||||
try
|
|
||||||
wshada
|
|
||||||
catch /.*/
|
|
||||||
let writeable = v:false
|
|
||||||
endtry
|
|
||||||
endif
|
|
||||||
if !writeable || (!empty(shadafile) &&
|
|
||||||
\ (!filereadable(shadafile) || !filewritable(shadafile)))
|
|
||||||
let ok = v:false
|
let ok = v:false
|
||||||
call health#report_error('shada file is not '.
|
call health#report_error('shada file is not '.(filereadable(shadafile) ? 'writeable' : 'readable').":\n".shadafile)
|
||||||
\ ((!writeable || filereadable(shadafile)) ?
|
|
||||||
\ 'writeable' : 'readable').":\n".shadafile)
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if ok
|
if ok
|
||||||
@@ -146,25 +129,6 @@ function! s:check_performance() abort
|
|||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:get_tmux_option(option) abort
|
|
||||||
let cmd = 'tmux show-option -qvg '.a:option " try global scope
|
|
||||||
let out = system(cmd)
|
|
||||||
let val = substitute(out, '\v(\s|\r|\n)', '', 'g')
|
|
||||||
if v:shell_error
|
|
||||||
call health#report_error('command failed: '.cmd."\n".out)
|
|
||||||
return 'error'
|
|
||||||
elseif empty(val)
|
|
||||||
let cmd = 'tmux show-option -qvgs '.a:option " try session scope
|
|
||||||
let out = system(cmd)
|
|
||||||
let val = substitute(out, '\v(\s|\r|\n)', '', 'g')
|
|
||||||
if v:shell_error
|
|
||||||
call health#report_error('command failed: '.cmd."\n".out)
|
|
||||||
return 'error'
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
return val
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:check_tmux() abort
|
function! s:check_tmux() abort
|
||||||
if empty($TMUX) || !executable('tmux')
|
if empty($TMUX) || !executable('tmux')
|
||||||
return
|
return
|
||||||
@@ -172,31 +136,20 @@ function! s:check_tmux() abort
|
|||||||
call health#report_start('tmux')
|
call health#report_start('tmux')
|
||||||
|
|
||||||
" check escape-time
|
" check escape-time
|
||||||
let suggestions = ["set escape-time in ~/.tmux.conf:\nset-option -sg escape-time 10",
|
let suggestions = ["Set escape-time in ~/.tmux.conf:\nset-option -sg escape-time 10",
|
||||||
\ s:suggest_faq]
|
\ s:suggest_faq]
|
||||||
let tmux_esc_time = s:get_tmux_option('escape-time')
|
let cmd = 'tmux show-option -qvgs escape-time'
|
||||||
if tmux_esc_time !=# 'error'
|
let out = system(cmd)
|
||||||
if empty(tmux_esc_time)
|
let tmux_esc_time = substitute(out, '\v(\s|\r|\n)', '', 'g')
|
||||||
call health#report_error('`escape-time` is not set', suggestions)
|
if v:shell_error
|
||||||
elseif tmux_esc_time > 300
|
call health#report_error('command failed: '.cmd."\n".out)
|
||||||
call health#report_error(
|
elseif empty(tmux_esc_time)
|
||||||
\ '`escape-time` ('.tmux_esc_time.') is higher than 300ms', suggestions)
|
call health#report_error('escape-time is not set', suggestions)
|
||||||
else
|
elseif tmux_esc_time > 300
|
||||||
call health#report_ok('escape-time: '.tmux_esc_time)
|
call health#report_error(
|
||||||
endif
|
\ 'escape-time ('.tmux_esc_time.') is higher than 300ms', suggestions)
|
||||||
endif
|
else
|
||||||
|
call health#report_ok('escape-time: '.tmux_esc_time.'ms')
|
||||||
" check focus-events
|
|
||||||
let suggestions = ["(tmux 1.9+ only) Set `focus-events` in ~/.tmux.conf:\nset-option -g focus-events on"]
|
|
||||||
let tmux_focus_events = s:get_tmux_option('focus-events')
|
|
||||||
call health#report_info('Checking stuff')
|
|
||||||
if tmux_focus_events !=# 'error'
|
|
||||||
if empty(tmux_focus_events) || tmux_focus_events !=# 'on'
|
|
||||||
call health#report_warn(
|
|
||||||
\ "`focus-events` is not enabled. |'autoread'| may not work.", suggestions)
|
|
||||||
else
|
|
||||||
call health#report_ok('focus-events: '.tmux_focus_events)
|
|
||||||
endif
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" check default-terminal and $TERM
|
" check default-terminal and $TERM
|
||||||
@@ -247,16 +200,12 @@ function! s:check_terminal() abort
|
|||||||
let kdch1_entry = matchstr(out, 'key_dc=[^,[:space:]]*')
|
let kdch1_entry = matchstr(out, 'key_dc=[^,[:space:]]*')
|
||||||
|
|
||||||
if v:shell_error
|
if v:shell_error
|
||||||
\ && (!has('win32')
|
|
||||||
\ || empty(matchstr(out,
|
|
||||||
\ 'infocmp: couldn''t open terminfo file .\+'
|
|
||||||
\ ..'\%(conemu\|vtpcon\|win32con\)')))
|
|
||||||
call health#report_error('command failed: '.cmd."\n".out)
|
call health#report_error('command failed: '.cmd."\n".out)
|
||||||
else
|
else
|
||||||
call health#report_info('key_backspace (kbs) terminfo entry: '
|
call health#report_info('key_backspace (kbs) terminfo entry: '
|
||||||
\ .(empty(kbs_entry) ? '? (not found)' : kbs_entry))
|
\ .(empty(kbs_entry) ? '? (not found)' : kbs_entry))
|
||||||
call health#report_info('key_dc (kdch1) terminfo entry: '
|
call health#report_info('key_dc (kdch1) terminfo entry: '
|
||||||
\ .(empty(kbs_entry) ? '? (not found)' : kdch1_entry))
|
\ .(empty(kbs_entry) ? '? (not found)' : kdch1_entry))
|
||||||
endif
|
endif
|
||||||
for env_var in ['XTERM_VERSION', 'VTE_VERSION', 'TERM_PROGRAM', 'COLORTERM', 'SSH_TTY']
|
for env_var in ['XTERM_VERSION', 'VTE_VERSION', 'TERM_PROGRAM', 'COLORTERM', 'SSH_TTY']
|
||||||
if exists('$'.env_var)
|
if exists('$'.env_var)
|
||||||
|
@@ -38,10 +38,9 @@ endfunction
|
|||||||
" Handler for s:system() function.
|
" Handler for s:system() function.
|
||||||
function! s:system_handler(jobid, data, event) dict abort
|
function! s:system_handler(jobid, data, event) dict abort
|
||||||
if a:event ==# 'stderr'
|
if a:event ==# 'stderr'
|
||||||
if self.add_stderr_to_output
|
let self.stderr .= join(a:data, '')
|
||||||
|
if !self.ignore_stderr
|
||||||
let self.output .= join(a:data, '')
|
let self.output .= join(a:data, '')
|
||||||
else
|
|
||||||
let self.stderr .= join(a:data, '')
|
|
||||||
endif
|
endif
|
||||||
elseif a:event ==# 'stdout'
|
elseif a:event ==# 'stdout'
|
||||||
let self.output .= join(a:data, '')
|
let self.output .= join(a:data, '')
|
||||||
@@ -65,7 +64,7 @@ function! s:system(cmd, ...) abort
|
|||||||
let stdin = a:0 ? a:1 : ''
|
let stdin = a:0 ? a:1 : ''
|
||||||
let ignore_error = a:0 > 2 ? a:3 : 0
|
let ignore_error = a:0 > 2 ? a:3 : 0
|
||||||
let opts = {
|
let opts = {
|
||||||
\ 'add_stderr_to_output': a:0 > 1 ? a:2 : 0,
|
\ 'ignore_stderr': a:0 > 1 ? a:2 : 0,
|
||||||
\ 'output': '',
|
\ 'output': '',
|
||||||
\ 'stderr': '',
|
\ 'stderr': '',
|
||||||
\ 'on_stdout': function('s:system_handler'),
|
\ 'on_stdout': function('s:system_handler'),
|
||||||
@@ -90,15 +89,8 @@ function! s:system(cmd, ...) abort
|
|||||||
call health#report_error(printf('Command timed out: %s', s:shellify(a:cmd)))
|
call health#report_error(printf('Command timed out: %s', s:shellify(a:cmd)))
|
||||||
call jobstop(jobid)
|
call jobstop(jobid)
|
||||||
elseif s:shell_error != 0 && !ignore_error
|
elseif s:shell_error != 0 && !ignore_error
|
||||||
let emsg = printf("Command error (job=%d, exit code %d): `%s` (in %s)",
|
call health#report_error(printf("Command error (job=%d, exit code %d): `%s` (in %s)\nOutput: %s\nStderr: %s",
|
||||||
\ jobid, s:shell_error, s:shellify(a:cmd), string(getcwd()))
|
\ jobid, s:shell_error, s:shellify(a:cmd), string(getcwd()), opts.output, opts.stderr))
|
||||||
if !empty(opts.output)
|
|
||||||
let emsg .= "\noutput: " . opts.output
|
|
||||||
end
|
|
||||||
if !empty(opts.stderr)
|
|
||||||
let emsg .= "\nstderr: " . opts.stderr
|
|
||||||
end
|
|
||||||
call health#report_error(emsg)
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
return opts.output
|
return opts.output
|
||||||
@@ -163,7 +155,7 @@ function! s:check_clipboard() abort
|
|||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Get the latest Nvim Python client (pynvim) version from PyPI.
|
" Get the latest Neovim Python client (pynvim) version from PyPI.
|
||||||
function! s:latest_pypi_version() abort
|
function! s:latest_pypi_version() abort
|
||||||
let pypi_version = 'unable to get pypi response'
|
let pypi_version = 'unable to get pypi response'
|
||||||
let pypi_response = s:download('https://pypi.python.org/pypi/pynvim/json')
|
let pypi_response = s:download('https://pypi.python.org/pypi/pynvim/json')
|
||||||
@@ -180,7 +172,7 @@ endfunction
|
|||||||
|
|
||||||
" Get version information using the specified interpreter. The interpreter is
|
" Get version information using the specified interpreter. The interpreter is
|
||||||
" used directly in case breaking changes were introduced since the last time
|
" used directly in case breaking changes were introduced since the last time
|
||||||
" Nvim's Python client was updated.
|
" Neovim's Python client was updated.
|
||||||
"
|
"
|
||||||
" Returns: [
|
" Returns: [
|
||||||
" {python executable version},
|
" {python executable version},
|
||||||
@@ -202,8 +194,7 @@ function! s:version_info(python) abort
|
|||||||
|
|
||||||
let nvim_path = s:trim(s:system([
|
let nvim_path = s:trim(s:system([
|
||||||
\ a:python, '-c',
|
\ a:python, '-c',
|
||||||
\ 'import sys; ' .
|
\ 'import sys; sys.path.remove(""); ' .
|
||||||
\ 'sys.path = list(filter(lambda x: x != "", sys.path)); ' .
|
|
||||||
\ 'import neovim; print(neovim.__file__)']))
|
\ 'import neovim; print(neovim.__file__)']))
|
||||||
if s:shell_error || empty(nvim_path)
|
if s:shell_error || empty(nvim_path)
|
||||||
return [python_version, 'unable to load neovim Python module', pypi_version,
|
return [python_version, 'unable to load neovim Python module', pypi_version,
|
||||||
@@ -224,7 +215,7 @@ function! s:version_info(python) abort
|
|||||||
\ 'print("{}.{}.{}{}".format(v.major, v.minor, v.patch, v.prerelease))'],
|
\ 'print("{}.{}.{}{}".format(v.major, v.minor, v.patch, v.prerelease))'],
|
||||||
\ '', 1, 1)
|
\ '', 1, 1)
|
||||||
if empty(nvim_version)
|
if empty(nvim_version)
|
||||||
let nvim_version = 'unable to find pynvim module version'
|
let nvim_version = 'unable to find neovim Python module version'
|
||||||
let base = fnamemodify(nvim_path, ':h')
|
let base = fnamemodify(nvim_path, ':h')
|
||||||
let metas = glob(base.'-*/METADATA', 1, 1)
|
let metas = glob(base.'-*/METADATA', 1, 1)
|
||||||
\ + glob(base.'-*/PKG-INFO', 1, 1)
|
\ + glob(base.'-*/PKG-INFO', 1, 1)
|
||||||
@@ -266,22 +257,6 @@ function! s:check_bin(bin) abort
|
|||||||
return 1
|
return 1
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Check "loaded" var for given a:provider.
|
|
||||||
" Returns 1 if the caller should return (skip checks).
|
|
||||||
function! s:disabled_via_loaded_var(provider) abort
|
|
||||||
let loaded_var = 'g:loaded_'.a:provider.'_provider'
|
|
||||||
if exists(loaded_var) && !exists('*provider#'.a:provider.'#Call')
|
|
||||||
let v = eval(loaded_var)
|
|
||||||
if 0 is v
|
|
||||||
call health#report_info('Disabled ('.loaded_var.'='.v.').')
|
|
||||||
return 1
|
|
||||||
else
|
|
||||||
call health#report_info('Disabled ('.loaded_var.'='.v.'). This might be due to some previous error.')
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
return 0
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:check_python(version) abort
|
function! s:check_python(version) abort
|
||||||
call health#report_start('Python ' . a:version . ' provider (optional)')
|
call health#report_start('Python ' . a:version . ' provider (optional)')
|
||||||
|
|
||||||
@@ -289,10 +264,11 @@ function! s:check_python(version) abort
|
|||||||
let python_exe = ''
|
let python_exe = ''
|
||||||
let venv = exists('$VIRTUAL_ENV') ? resolve($VIRTUAL_ENV) : ''
|
let venv = exists('$VIRTUAL_ENV') ? resolve($VIRTUAL_ENV) : ''
|
||||||
let host_prog_var = pyname.'_host_prog'
|
let host_prog_var = pyname.'_host_prog'
|
||||||
|
let loaded_var = 'g:loaded_'.pyname.'_provider'
|
||||||
let python_multiple = []
|
let python_multiple = []
|
||||||
|
|
||||||
if s:disabled_via_loaded_var(pyname)
|
if exists(loaded_var) && !exists('*provider#'.pyname.'#Call')
|
||||||
return
|
call health#report_info('Disabled ('.loaded_var.'='.eval(loaded_var).'). This might be due to some previous error.')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let [pyenv, pyenv_root] = s:check_for_pyenv()
|
let [pyenv, pyenv_root] = s:check_for_pyenv()
|
||||||
@@ -310,7 +286,7 @@ function! s:check_python(version) abort
|
|||||||
let python_exe = pyname
|
let python_exe = pyname
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" No Python executable could `import neovim`, or host_prog_var was used.
|
" No Python executable could `import neovim`.
|
||||||
if !empty(pythonx_errors)
|
if !empty(pythonx_errors)
|
||||||
call health#report_error('Python provider error:', pythonx_errors)
|
call health#report_error('Python provider error:', pythonx_errors)
|
||||||
|
|
||||||
@@ -363,7 +339,7 @@ function! s:check_python(version) abort
|
|||||||
\ && !empty(pyenv_root) && resolve(python_exe) !~# '^'.pyenv_root.'/'
|
\ && !empty(pyenv_root) && resolve(python_exe) !~# '^'.pyenv_root.'/'
|
||||||
call health#report_warn('pyenv is not set up optimally.', [
|
call health#report_warn('pyenv is not set up optimally.', [
|
||||||
\ printf('Create a virtualenv specifically '
|
\ printf('Create a virtualenv specifically '
|
||||||
\ . 'for Nvim using pyenv, and set `g:%s`. This will avoid '
|
\ . 'for Neovim using pyenv, and set `g:%s`. This will avoid '
|
||||||
\ . 'the need to install the pynvim module in each '
|
\ . 'the need to install the pynvim module in each '
|
||||||
\ . 'version/virtualenv.', host_prog_var)
|
\ . 'version/virtualenv.', host_prog_var)
|
||||||
\ ])
|
\ ])
|
||||||
@@ -377,7 +353,7 @@ function! s:check_python(version) abort
|
|||||||
if resolve(python_exe) !~# '^'.venv_root.'/'
|
if resolve(python_exe) !~# '^'.venv_root.'/'
|
||||||
call health#report_warn('Your virtualenv is not set up optimally.', [
|
call health#report_warn('Your virtualenv is not set up optimally.', [
|
||||||
\ printf('Create a virtualenv specifically '
|
\ printf('Create a virtualenv specifically '
|
||||||
\ . 'for Nvim and use `g:%s`. This will avoid '
|
\ . 'for Neovim and use `g:%s`. This will avoid '
|
||||||
\ . 'the need to install the pynvim module in each '
|
\ . 'the need to install the pynvim module in each '
|
||||||
\ . 'virtualenv.', host_prog_var)
|
\ . 'virtualenv.', host_prog_var)
|
||||||
\ ])
|
\ ])
|
||||||
@@ -392,6 +368,18 @@ function! s:check_python(version) abort
|
|||||||
let python_exe = ''
|
let python_exe = ''
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
" Check if $VIRTUAL_ENV is valid.
|
||||||
|
if exists('$VIRTUAL_ENV') && !empty(python_exe)
|
||||||
|
if $VIRTUAL_ENV ==# matchstr(python_exe, '^\V'.$VIRTUAL_ENV)
|
||||||
|
call health#report_info('$VIRTUAL_ENV matches executable')
|
||||||
|
else
|
||||||
|
call health#report_warn(
|
||||||
|
\ '$VIRTUAL_ENV exists but appears to be inactive. '
|
||||||
|
\ . 'This could lead to unexpected results.',
|
||||||
|
\ [ 'If you are using Zsh, see: http://vi.stackexchange.com/a/7654' ])
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
" Diagnostic output
|
" Diagnostic output
|
||||||
call health#report_info('Executable: ' . (empty(python_exe) ? 'Not found' : python_exe))
|
call health#report_info('Executable: ' . (empty(python_exe) ? 'Not found' : python_exe))
|
||||||
if len(python_multiple)
|
if len(python_multiple)
|
||||||
@@ -400,6 +388,8 @@ function! s:check_python(version) abort
|
|||||||
endfor
|
endfor
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
let pip = 'pip' . (a:version == 2 ? '' : '3')
|
||||||
|
|
||||||
if empty(python_exe)
|
if empty(python_exe)
|
||||||
" No Python executable can import 'neovim'. Check if any Python executable
|
" No Python executable can import 'neovim'. Check if any Python executable
|
||||||
" can import 'pynvim'. If so, that Python failed to import 'neovim' as
|
" can import 'pynvim'. If so, that Python failed to import 'neovim' as
|
||||||
@@ -411,9 +401,9 @@ function! s:check_python(version) abort
|
|||||||
\ 'Detected pip upgrade failure: Python executable can import "pynvim" but '
|
\ 'Detected pip upgrade failure: Python executable can import "pynvim" but '
|
||||||
\ . 'not "neovim": '. pynvim_exe,
|
\ . 'not "neovim": '. pynvim_exe,
|
||||||
\ "Use that Python version to reinstall \"pynvim\" and optionally \"neovim\".\n"
|
\ "Use that Python version to reinstall \"pynvim\" and optionally \"neovim\".\n"
|
||||||
\ . pynvim_exe ." -m pip uninstall pynvim neovim\n"
|
\ . pip ." uninstall pynvim neovim\n"
|
||||||
\ . pynvim_exe ." -m pip install pynvim\n"
|
\ . pip ." install pynvim\n"
|
||||||
\ . pynvim_exe ." -m pip install neovim # only if needed by third-party software")
|
\ . pip ." install neovim # only if needed by third-party software")
|
||||||
endif
|
endif
|
||||||
else
|
else
|
||||||
let [pyversion, current, latest, status] = s:version_info(python_exe)
|
let [pyversion, current, latest, status] = s:version_info(python_exe)
|
||||||
@@ -423,6 +413,10 @@ function! s:check_python(version) abort
|
|||||||
\ ' This could lead to confusing error messages.')
|
\ ' This could lead to confusing error messages.')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if a:version == 3 && str2float(pyversion) < 3.3
|
||||||
|
call health#report_warn('Python 3.3+ is recommended.')
|
||||||
|
endif
|
||||||
|
|
||||||
call health#report_info('Python version: ' . pyversion)
|
call health#report_info('Python version: ' . pyversion)
|
||||||
|
|
||||||
if s:is_bad_response(status)
|
if s:is_bad_response(status)
|
||||||
@@ -434,7 +428,7 @@ function! s:check_python(version) abort
|
|||||||
if s:is_bad_response(current)
|
if s:is_bad_response(current)
|
||||||
call health#report_error(
|
call health#report_error(
|
||||||
\ "pynvim is not installed.\nError: ".current,
|
\ "pynvim is not installed.\nError: ".current,
|
||||||
\ ['Run in shell: '. python_exe .' -m pip install pynvim'])
|
\ ['Run in shell: '. pip .' install pynvim'])
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if s:is_bad_response(latest)
|
if s:is_bad_response(latest)
|
||||||
@@ -479,83 +473,12 @@ function! s:check_for_pyenv() abort
|
|||||||
return [pyenv_path, pyenv_root]
|
return [pyenv_path, pyenv_root]
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Resolves Python executable path by invoking and checking `sys.executable`.
|
|
||||||
function! s:python_exepath(invocation) abort
|
|
||||||
return s:normalize_path(system(fnameescape(a:invocation)
|
|
||||||
\ . ' -c "import sys; sys.stdout.write(sys.executable)"'))
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Checks that $VIRTUAL_ENV Python executables are found at front of $PATH in
|
|
||||||
" Nvim and subshells.
|
|
||||||
function! s:check_virtualenv() abort
|
|
||||||
call health#report_start('Python virtualenv')
|
|
||||||
if !exists('$VIRTUAL_ENV')
|
|
||||||
call health#report_ok('no $VIRTUAL_ENV')
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
let errors = []
|
|
||||||
" Keep hints as dict keys in order to discard duplicates.
|
|
||||||
let hints = {}
|
|
||||||
" The virtualenv should contain some Python executables, and those
|
|
||||||
" executables should be first both on Nvim's $PATH and the $PATH of
|
|
||||||
" subshells launched from Nvim.
|
|
||||||
let bin_dir = has('win32') ? '/Scripts' : '/bin'
|
|
||||||
let venv_bins = glob($VIRTUAL_ENV . bin_dir . '/python*', v:true, v:true)
|
|
||||||
" XXX: Remove irrelevant executables found in bin/.
|
|
||||||
let venv_bins = filter(venv_bins, 'v:val !~# "python-config"')
|
|
||||||
if len(venv_bins)
|
|
||||||
for venv_bin in venv_bins
|
|
||||||
let venv_bin = s:normalize_path(venv_bin)
|
|
||||||
let py_bin_basename = fnamemodify(venv_bin, ':t')
|
|
||||||
let nvim_py_bin = s:python_exepath(exepath(py_bin_basename))
|
|
||||||
let subshell_py_bin = s:python_exepath(py_bin_basename)
|
|
||||||
if venv_bin !=# nvim_py_bin
|
|
||||||
call add(errors, '$PATH yields this '.py_bin_basename.' executable: '.nvim_py_bin)
|
|
||||||
let hint = '$PATH ambiguities arise if the virtualenv is not '
|
|
||||||
\.'properly activated prior to launching Nvim. Close Nvim, activate the virtualenv, '
|
|
||||||
\.'check that invoking Python from the command line launches the correct one, '
|
|
||||||
\.'then relaunch Nvim.'
|
|
||||||
let hints[hint] = v:true
|
|
||||||
endif
|
|
||||||
if venv_bin !=# subshell_py_bin
|
|
||||||
call add(errors, '$PATH in subshells yields this '
|
|
||||||
\.py_bin_basename . ' executable: '.subshell_py_bin)
|
|
||||||
let hint = '$PATH ambiguities in subshells typically are '
|
|
||||||
\.'caused by your shell config overriding the $PATH previously set by the '
|
|
||||||
\.'virtualenv. Either prevent them from doing so, or use this workaround: '
|
|
||||||
\.'https://vi.stackexchange.com/a/34996'
|
|
||||||
let hints[hint] = v:true
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
else
|
|
||||||
call add(errors, 'no Python executables found in the virtualenv '.bin_dir.' directory.')
|
|
||||||
endif
|
|
||||||
|
|
||||||
let msg = '$VIRTUAL_ENV is set to: '.$VIRTUAL_ENV
|
|
||||||
if len(errors)
|
|
||||||
if len(venv_bins)
|
|
||||||
let msg .= "\nAnd its ".bin_dir.' directory contains: '
|
|
||||||
\.join(map(venv_bins, "fnamemodify(v:val, ':t')"), ', ')
|
|
||||||
endif
|
|
||||||
let conj = "\nBut "
|
|
||||||
for error in errors
|
|
||||||
let msg .= conj.error
|
|
||||||
let conj = "\nAnd "
|
|
||||||
endfor
|
|
||||||
let msg .= "\nSo invoking Python may lead to unexpected results."
|
|
||||||
call health#report_warn(msg, keys(hints))
|
|
||||||
else
|
|
||||||
call health#report_info(msg)
|
|
||||||
call health#report_info('Python version: '
|
|
||||||
\.system('python -c "import platform, sys; sys.stdout.write(platform.python_version())"'))
|
|
||||||
call health#report_ok('$VIRTUAL_ENV provides :!python.')
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:check_ruby() abort
|
function! s:check_ruby() abort
|
||||||
call health#report_start('Ruby provider (optional)')
|
call health#report_start('Ruby provider (optional)')
|
||||||
|
|
||||||
if s:disabled_via_loaded_var('ruby')
|
let loaded_var = 'g:loaded_ruby_provider'
|
||||||
|
if exists(loaded_var) && !exists('*provider#ruby#Call')
|
||||||
|
call health#report_info('Disabled. '.loaded_var.'='.eval(loaded_var))
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@@ -567,7 +490,7 @@ function! s:check_ruby() abort
|
|||||||
endif
|
endif
|
||||||
call health#report_info('Ruby: '. s:system('ruby -v'))
|
call health#report_info('Ruby: '. s:system('ruby -v'))
|
||||||
|
|
||||||
let [host, err] = provider#ruby#Detect()
|
let host = provider#ruby#Detect()
|
||||||
if empty(host)
|
if empty(host)
|
||||||
call health#report_warn('`neovim-ruby-host` not found.',
|
call health#report_warn('`neovim-ruby-host` not found.',
|
||||||
\ ['Run `gem install neovim` to ensure the neovim RubyGem is installed.',
|
\ ['Run `gem install neovim` to ensure the neovim RubyGem is installed.',
|
||||||
@@ -578,7 +501,7 @@ function! s:check_ruby() abort
|
|||||||
endif
|
endif
|
||||||
call health#report_info('Host: '. host)
|
call health#report_info('Host: '. host)
|
||||||
|
|
||||||
let latest_gem_cmd = has('win32') ? 'cmd /c gem list -ra "^^neovim$"' : 'gem list -ra ^neovim$'
|
let latest_gem_cmd = has('win32') ? 'cmd /c gem list -ra ^^neovim$' : 'gem list -ra ^neovim$'
|
||||||
let latest_gem = s:system(split(latest_gem_cmd))
|
let latest_gem = s:system(split(latest_gem_cmd))
|
||||||
if s:shell_error || empty(latest_gem)
|
if s:shell_error || empty(latest_gem)
|
||||||
call health#report_error('Failed to run: '. latest_gem_cmd,
|
call health#report_error('Failed to run: '. latest_gem_cmd,
|
||||||
@@ -586,7 +509,7 @@ function! s:check_ruby() abort
|
|||||||
\ 'Are you behind a firewall or proxy?'])
|
\ 'Are you behind a firewall or proxy?'])
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
let latest_gem = get(split(latest_gem, 'neovim (\|, \|)$' ), 0, 'not found')
|
let latest_gem = get(split(latest_gem, 'neovim (\|, \|)$' ), 1, 'not found')
|
||||||
|
|
||||||
let current_gem_cmd = host .' --version'
|
let current_gem_cmd = host .' --version'
|
||||||
let current_gem = s:system(current_gem_cmd)
|
let current_gem = s:system(current_gem_cmd)
|
||||||
@@ -609,7 +532,9 @@ endfunction
|
|||||||
function! s:check_node() abort
|
function! s:check_node() abort
|
||||||
call health#report_start('Node.js provider (optional)')
|
call health#report_start('Node.js provider (optional)')
|
||||||
|
|
||||||
if s:disabled_via_loaded_var('node')
|
let loaded_var = 'g:loaded_node_provider'
|
||||||
|
if exists(loaded_var) && !exists('*provider#node#Call')
|
||||||
|
call health#report_info('Disabled. '.loaded_var.'='.eval(loaded_var))
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@@ -621,8 +546,8 @@ function! s:check_node() abort
|
|||||||
endif
|
endif
|
||||||
let node_v = get(split(s:system('node -v'), "\n"), 0, '')
|
let node_v = get(split(s:system('node -v'), "\n"), 0, '')
|
||||||
call health#report_info('Node.js: '. node_v)
|
call health#report_info('Node.js: '. node_v)
|
||||||
if s:shell_error || s:version_cmp(node_v[1:], '6.0.0') < 0
|
if !s:shell_error && s:version_cmp(node_v[1:], '6.0.0') < 0
|
||||||
call health#report_warn('Nvim node.js host does not support '.node_v)
|
call health#report_warn('Neovim node.js host does not support '.node_v)
|
||||||
" Skip further checks, they are nonsense if nodejs is too old.
|
" Skip further checks, they are nonsense if nodejs is too old.
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
@@ -630,14 +555,14 @@ function! s:check_node() abort
|
|||||||
call health#report_warn('node.js on this system does not support --inspect-brk so $NVIM_NODE_HOST_DEBUG is ignored.')
|
call health#report_warn('node.js on this system does not support --inspect-brk so $NVIM_NODE_HOST_DEBUG is ignored.')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let [host, err] = provider#node#Detect()
|
let host = provider#node#Detect()
|
||||||
if empty(host)
|
if empty(host)
|
||||||
call health#report_warn('Missing "neovim" npm (or yarn) package.',
|
call health#report_warn('Missing "neovim" npm (or yarn) package.',
|
||||||
\ ['Run in shell: npm install -g neovim',
|
\ ['Run in shell: npm install -g neovim',
|
||||||
\ 'Run in shell (if you use yarn): yarn global add neovim'])
|
\ 'Run in shell (if you use yarn): yarn global add neovim'])
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
call health#report_info('Nvim node.js host: '. host)
|
call health#report_info('Neovim node.js host: '. host)
|
||||||
|
|
||||||
let manager = executable('npm') ? 'npm' : 'yarn'
|
let manager = executable('npm') ? 'npm' : 'yarn'
|
||||||
let latest_npm_cmd = has('win32') ?
|
let latest_npm_cmd = has('win32') ?
|
||||||
@@ -650,12 +575,14 @@ function! s:check_node() abort
|
|||||||
\ 'Are you behind a firewall or proxy?'])
|
\ 'Are you behind a firewall or proxy?'])
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
try
|
if !empty(latest_npm)
|
||||||
let pkg_data = json_decode(latest_npm)
|
try
|
||||||
catch /E474/
|
let pkg_data = json_decode(latest_npm)
|
||||||
return 'error: '.latest_npm
|
catch /E474/
|
||||||
endtry
|
return 'error: '.latest_npm
|
||||||
let latest_npm = get(get(pkg_data, 'dist-tags', {}), 'latest', 'unable to parse')
|
endtry
|
||||||
|
let latest_npm = get(get(pkg_data, 'dist-tags', {}), 'latest', 'unable to parse')
|
||||||
|
endif
|
||||||
|
|
||||||
let current_npm_cmd = ['node', host, '--version']
|
let current_npm_cmd = ['node', host, '--version']
|
||||||
let current_npm = s:system(current_npm_cmd)
|
let current_npm = s:system(current_npm_cmd)
|
||||||
@@ -676,85 +603,10 @@ function! s:check_node() abort
|
|||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:check_perl() abort
|
|
||||||
call health#report_start('Perl provider (optional)')
|
|
||||||
|
|
||||||
if s:disabled_via_loaded_var('perl')
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
let [perl_exec, perl_errors] = provider#perl#Detect()
|
|
||||||
if empty(perl_exec)
|
|
||||||
if !empty(perl_errors)
|
|
||||||
call health#report_error('perl provider error:', perl_errors)
|
|
||||||
else
|
|
||||||
call health#report_warn('No usable perl executable found')
|
|
||||||
endif
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
call health#report_info('perl executable: '. perl_exec)
|
|
||||||
|
|
||||||
" we cannot use cpanm that is on the path, as it may not be for the perl
|
|
||||||
" set with g:perl_host_prog
|
|
||||||
call s:system([perl_exec, '-W', '-MApp::cpanminus', '-e', ''])
|
|
||||||
if s:shell_error
|
|
||||||
return [perl_exec, '"App::cpanminus" module is not installed']
|
|
||||||
endif
|
|
||||||
|
|
||||||
let latest_cpan_cmd = [perl_exec,
|
|
||||||
\ '-MApp::cpanminus::fatscript', '-e',
|
|
||||||
\ 'my $app = App::cpanminus::script->new;
|
|
||||||
\ $app->parse_options ("--info", "-q", "Neovim::Ext");
|
|
||||||
\ exit $app->doit']
|
|
||||||
|
|
||||||
let latest_cpan = s:system(latest_cpan_cmd)
|
|
||||||
if s:shell_error || empty(latest_cpan)
|
|
||||||
call health#report_error('Failed to run: '. join(latest_cpan_cmd, " "),
|
|
||||||
\ ["Make sure you're connected to the internet.",
|
|
||||||
\ 'Are you behind a firewall or proxy?'])
|
|
||||||
return
|
|
||||||
elseif latest_cpan[0] ==# '!'
|
|
||||||
let cpanm_errs = split(latest_cpan, '!')
|
|
||||||
if cpanm_errs[0] =~# "Can't write to "
|
|
||||||
call health#report_warn(cpanm_errs[0], cpanm_errs[1:-2])
|
|
||||||
" Last line is the package info
|
|
||||||
let latest_cpan = cpanm_errs[-1]
|
|
||||||
else
|
|
||||||
call health#report_error('Unknown warning from command: ' . latest_cpan_cmd, cpanm_errs)
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
let latest_cpan = matchstr(latest_cpan, '\(\.\?\d\)\+')
|
|
||||||
if empty(latest_cpan)
|
|
||||||
call health#report_error('Cannot parse version number from cpanm output: ' . latest_cpan)
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
let current_cpan_cmd = [perl_exec, '-W', '-MNeovim::Ext', '-e', 'print $Neovim::Ext::VERSION']
|
|
||||||
let current_cpan = s:system(current_cpan_cmd)
|
|
||||||
if s:shell_error
|
|
||||||
call health#report_error('Failed to run: '. string(current_cpan_cmd),
|
|
||||||
\ ['Report this issue with the output of: ', string(current_cpan_cmd)])
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
if s:version_cmp(current_cpan, latest_cpan) == -1
|
|
||||||
call health#report_warn(
|
|
||||||
\ printf('Module "Neovim::Ext" is out-of-date. Installed: %s, latest: %s',
|
|
||||||
\ current_cpan, latest_cpan),
|
|
||||||
\ ['Run in shell: cpanm -n Neovim::Ext'])
|
|
||||||
else
|
|
||||||
call health#report_ok('Latest "Neovim::Ext" cpan module is installed: '. current_cpan)
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! health#provider#check() abort
|
function! health#provider#check() abort
|
||||||
call s:check_clipboard()
|
call s:check_clipboard()
|
||||||
call s:check_python(2)
|
call s:check_python(2)
|
||||||
call s:check_python(3)
|
call s:check_python(3)
|
||||||
call s:check_virtualenv()
|
|
||||||
call s:check_ruby()
|
call s:check_ruby()
|
||||||
call s:check_node()
|
call s:check_node()
|
||||||
call s:check_perl()
|
|
||||||
endfunction
|
endfunction
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
" Vim completion script
|
" Vim completion script
|
||||||
" Language: HTML and XHTML
|
" Language: HTML and XHTML
|
||||||
" Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl )
|
" Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl )
|
||||||
" Last Change: 2019 Sep 27
|
" Last Change: 2014 Jun 20
|
||||||
|
|
||||||
" Distinguish between HTML versions.
|
" Distinguish between HTML versions.
|
||||||
" To use with other HTML versions add another "elseif" condition to match
|
" To use with other HTML versions add another "elseif" condition to match
|
||||||
@@ -245,8 +245,7 @@ function! htmlcomplete#CompleteTags(findstart, base)
|
|||||||
" If context contains white space it is attribute.
|
" If context contains white space it is attribute.
|
||||||
" It can be also value of attribute.
|
" It can be also value of attribute.
|
||||||
" We have to get first word to offer proper completions
|
" We have to get first word to offer proper completions
|
||||||
if context =~ '^\s*$'
|
if context == ''
|
||||||
" empty or whitespace line
|
|
||||||
let tag = ''
|
let tag = ''
|
||||||
else
|
else
|
||||||
let tag = split(context)[0]
|
let tag = split(context)[0]
|
||||||
@@ -486,7 +485,7 @@ function! htmlcomplete#CompleteTags(findstart, base)
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
" Value of attribute completion {{{
|
" Value of attribute completion {{{
|
||||||
" If attr contains =\s*[\"'] we match value of attribute
|
" If attr contains =\s*[\"'] we catched value of attribute
|
||||||
if attr =~ "=\s*[\"']" || attr =~ "=\s*$"
|
if attr =~ "=\s*[\"']" || attr =~ "=\s*$"
|
||||||
" Let do attribute specific completion
|
" Let do attribute specific completion
|
||||||
let attrname = matchstr(attr, '.*\ze\s*=')
|
let attrname = matchstr(attr, '.*\ze\s*=')
|
||||||
|
@@ -1,9 +1,7 @@
|
|||||||
" Vim completion script
|
" Vim completion script
|
||||||
" Language: Java Script
|
" Language: Java Script
|
||||||
" Maintainer: Jay Sitter (jay@jaysitter.com)
|
" Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl )
|
||||||
" URL: https://github.com/jsit/javascriptcomplete.vim/
|
" Last Change: 2017 Mar 04
|
||||||
" Previous Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl )
|
|
||||||
" Last Change: 2020 Jul 30
|
|
||||||
|
|
||||||
function! javascriptcomplete#CompleteJS(findstart, base)
|
function! javascriptcomplete#CompleteJS(findstart, base)
|
||||||
if a:findstart
|
if a:findstart
|
||||||
@@ -156,30 +154,12 @@ function! javascriptcomplete#CompleteJS(findstart, base)
|
|||||||
\ 'text', 'vLink']
|
\ 'text', 'vLink']
|
||||||
let bodys = bodyprop
|
let bodys = bodyprop
|
||||||
" Document - document.
|
" Document - document.
|
||||||
let docuprop = ['anchors', 'body', 'characterSet', 'doctype',
|
let docuprop = ['anchors', 'applets', 'childNodes', 'embeds', 'forms', 'images', 'links', 'stylesheets',
|
||||||
\ 'documentElement', 'documentURI', 'embeds', 'fonts', 'forms',
|
\ 'body', 'cookie', 'documentElement', 'domain', 'lastModified', 'referrer', 'title', 'URL']
|
||||||
\ 'head', 'hidden', 'images', 'implementation', 'lastStyleSheetSet',
|
let documeth = ['close', 'createAttribute', 'createElement', 'createTextNode', 'focus', 'getElementById',
|
||||||
\ 'links', 'plugins', 'preferredStyleSheetSet', 'scripts',
|
\ 'getElementsByName', 'getElementsByTagName', 'open', 'write', 'writeln',
|
||||||
\ 'scrollingElement', 'selectedStyleSheetSet', 'styleSheetSets',
|
\ 'onClick', 'onDblClick', 'onFocus', 'onKeyDown', 'onKeyPress', 'onKeyUp',
|
||||||
\ 'timeline', 'visibilityState', 'cookie', 'defaultView',
|
\ 'onMouseDown', 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp', 'onResize']
|
||||||
\ 'designMode', 'dir', 'domain', 'lastModified', 'location',
|
|
||||||
\ 'readyState', 'referrer', 'title', 'URL', 'activeElement',
|
|
||||||
\ 'fullscreenElement', 'styleSheets']
|
|
||||||
let documeth = ['adoptNode', 'close', 'createAttribute',
|
|
||||||
\ 'createAttributeNS', 'createCDATASection', 'createComment',
|
|
||||||
\ 'createDocumentFragment', 'createElement', 'createElementNS',
|
|
||||||
\ 'createEvent', 'createExpression', 'createNSResolver',
|
|
||||||
\ 'createNodeIterator', 'createProcessingInstruction', 'createRange',
|
|
||||||
\ 'createTextNode', 'createTouchList', 'createTreeWalker',
|
|
||||||
\ 'enableStyleSheetsForSet', 'evaluate', 'focus', 'getElementById',
|
|
||||||
\ 'getElementById', 'getElementsByClassName', 'getElementsByName',
|
|
||||||
\ 'getElementsByTagName', 'getElementsByTagNameNS',
|
|
||||||
\ 'hasStorageAccess', 'importNode', 'onClick', 'onDblClick',
|
|
||||||
\ 'onFocus', 'onKeyDown', 'onKeyPress', 'onKeyUp', 'onMouseDown',
|
|
||||||
\ 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp',
|
|
||||||
\ 'onResize', 'open', 'querySelector', 'querySelectorAll',
|
|
||||||
\ 'requestStorageAccess', 'write', 'writeln']
|
|
||||||
|
|
||||||
call map(documeth, 'v:val."("')
|
call map(documeth, 'v:val."("')
|
||||||
let docuxprop = ['attributes', 'childNodes', 'doctype', 'documentElement', 'firstChild',
|
let docuxprop = ['attributes', 'childNodes', 'doctype', 'documentElement', 'firstChild',
|
||||||
\ 'implementation', 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType',
|
\ 'implementation', 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType',
|
||||||
@@ -388,11 +368,9 @@ function! javascriptcomplete#CompleteJS(findstart, base)
|
|||||||
let xdomelemprop = ['attributes', 'childNodes', 'firstChild', 'lastChild',
|
let xdomelemprop = ['attributes', 'childNodes', 'firstChild', 'lastChild',
|
||||||
\ 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', 'nodeValue',
|
\ 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', 'nodeValue',
|
||||||
\ 'ownerDocument', 'parentNode', 'prefix', 'previousSibling', 'tagName']
|
\ 'ownerDocument', 'parentNode', 'prefix', 'previousSibling', 'tagName']
|
||||||
let xdomelemmeth = ['appendChild', 'addEventListener', 'cloneNode',
|
let xdomelemmeth = ['appendChild', 'cloneNode', 'getAttribute', 'getAttributeNode',
|
||||||
\ 'dispatchEvent', 'getAttribute', 'getAttributeNode',
|
\ 'getElementsByTagName', 'hasChildNodes', 'insertBefore', 'normalize',
|
||||||
\ 'getElementsByTagName', 'hasChildNodes', 'insertBefore',
|
\ 'removeAttribute', 'removeAttributeNode', 'removeChild', 'replaceChild',
|
||||||
\ 'normalize', 'removeAttribute', 'removeAttributeNode',
|
|
||||||
\ 'removeChild', 'removeEventListener', 'replaceChild',
|
|
||||||
\ 'setAttribute', 'setAttributeNode']
|
\ 'setAttribute', 'setAttributeNode']
|
||||||
call map(xdomelemmeth, 'v:val."("')
|
call map(xdomelemmeth, 'v:val."("')
|
||||||
let xdomelems = xdomelemprop + xdomelemmeth
|
let xdomelems = xdomelemprop + xdomelemmeth
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
" Maintainer: Anmol Sethi <hi@nhooyr.io>
|
" Maintainer: Anmol Sethi <anmol@aubble.com>
|
||||||
|
|
||||||
if exists('s:loaded_man')
|
if exists('s:loaded_man')
|
||||||
finish
|
finish
|
||||||
@@ -7,18 +7,32 @@ let s:loaded_man = 1
|
|||||||
|
|
||||||
let s:find_arg = '-w'
|
let s:find_arg = '-w'
|
||||||
let s:localfile_arg = v:true " Always use -l if possible. #6683
|
let s:localfile_arg = v:true " Always use -l if possible. #6683
|
||||||
let s:section_arg = '-S'
|
let s:section_arg = '-s'
|
||||||
|
|
||||||
function! man#init() abort
|
function! s:init_section_flag()
|
||||||
|
call system(['env', 'MANPAGER=cat', 'man', s:section_arg, '1', 'man'])
|
||||||
|
if v:shell_error
|
||||||
|
let s:section_arg = '-S'
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! s:init() abort
|
||||||
|
call s:init_section_flag()
|
||||||
|
" TODO(nhooyr): Does `man -l` on SunOS list searched directories?
|
||||||
try
|
try
|
||||||
|
if !has('win32') && $OSTYPE !~? 'cygwin\|linux' && system('uname -s') =~? 'SunOS' && system('uname -r') =~# '^5'
|
||||||
|
let s:find_arg = '-l'
|
||||||
|
endif
|
||||||
" Check for -l support.
|
" Check for -l support.
|
||||||
call s:get_page(s:get_path('', 'man'))
|
call s:get_page(s:get_path('', 'man'))
|
||||||
|
catch /E145:/
|
||||||
|
" Ignore the error in restricted mode
|
||||||
catch /command error .*/
|
catch /command error .*/
|
||||||
let s:localfile_arg = v:false
|
let s:localfile_arg = v:false
|
||||||
endtry
|
endtry
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! man#open_page(count, mods, ...) abort
|
function! man#open_page(count, count1, mods, ...) abort
|
||||||
if a:0 > 2
|
if a:0 > 2
|
||||||
call s:error('too many arguments')
|
call s:error('too many arguments')
|
||||||
return
|
return
|
||||||
@@ -38,40 +52,51 @@ function! man#open_page(count, mods, ...) abort
|
|||||||
let ref = a:2.'('.a:1.')'
|
let ref = a:2.'('.a:1.')'
|
||||||
endif
|
endif
|
||||||
try
|
try
|
||||||
let [sect, name] = s:extract_sect_and_name_ref(ref)
|
let [sect, name] = man#extract_sect_and_name_ref(ref)
|
||||||
if a:count >= 0
|
if a:count ==# a:count1
|
||||||
|
" v:count defaults to 0 which is a valid section, and v:count1 defaults to
|
||||||
|
" 1, also a valid section. If they are equal, count explicitly set.
|
||||||
let sect = string(a:count)
|
let sect = string(a:count)
|
||||||
endif
|
endif
|
||||||
let path = s:verify_exists(sect, name)
|
let [sect, name, path] = s:verify_exists(sect, name)
|
||||||
let [sect, name] = s:extract_sect_and_name_path(path)
|
|
||||||
catch
|
catch
|
||||||
call s:error(v:exception)
|
call s:error(v:exception)
|
||||||
return
|
return
|
||||||
endtry
|
endtry
|
||||||
|
|
||||||
let [l:buf, l:save_tfu] = [bufnr(), &tagfunc]
|
call s:push_tag()
|
||||||
|
let bufname = 'man://'.name.(empty(sect)?'':'('.sect.')')
|
||||||
|
|
||||||
try
|
try
|
||||||
setlocal tagfunc=man#goto_tag
|
set eventignore+=BufReadCmd
|
||||||
let l:target = l:name . '(' . l:sect . ')'
|
|
||||||
if a:mods !~# 'tab' && s:find_man()
|
if a:mods !~# 'tab' && s:find_man()
|
||||||
execute 'silent keepalt tag' l:target
|
execute 'silent keepalt edit' fnameescape(bufname)
|
||||||
else
|
else
|
||||||
execute 'silent keepalt' a:mods 'stag' l:target
|
execute 'silent keepalt' a:mods 'split' fnameescape(bufname)
|
||||||
endif
|
endif
|
||||||
call s:set_options(v:false)
|
|
||||||
finally
|
finally
|
||||||
call setbufvar(l:buf, '&tagfunc', l:save_tfu)
|
set eventignore-=BufReadCmd
|
||||||
|
endtry
|
||||||
|
|
||||||
|
try
|
||||||
|
let page = s:get_page(path)
|
||||||
|
catch
|
||||||
|
if a:mods =~# 'tab' || !s:find_man()
|
||||||
|
" a new window was opened
|
||||||
|
close
|
||||||
|
endif
|
||||||
|
call s:error(v:exception)
|
||||||
|
return
|
||||||
endtry
|
endtry
|
||||||
|
|
||||||
let b:man_sect = sect
|
let b:man_sect = sect
|
||||||
|
call s:put_page(page)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Called when a man:// buffer is opened.
|
|
||||||
function! man#read_page(ref) abort
|
function! man#read_page(ref) abort
|
||||||
try
|
try
|
||||||
let [sect, name] = s:extract_sect_and_name_ref(a:ref)
|
let [sect, name] = man#extract_sect_and_name_ref(a:ref)
|
||||||
let path = s:verify_exists(sect, name)
|
let [sect, name, path] = s:verify_exists(sect, name)
|
||||||
let [sect, name] = s:extract_sect_and_name_path(path)
|
|
||||||
let page = s:get_page(path)
|
let page = s:get_page(path)
|
||||||
catch
|
catch
|
||||||
call s:error(v:exception)
|
call s:error(v:exception)
|
||||||
@@ -123,20 +148,11 @@ function! s:system(cmd, ...) abort
|
|||||||
return opts.stdout
|
return opts.stdout
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:set_options(pager) abort
|
|
||||||
setlocal filetype=man
|
|
||||||
setlocal noswapfile buftype=nofile bufhidden=hide
|
|
||||||
setlocal nomodified readonly nomodifiable
|
|
||||||
if a:pager
|
|
||||||
nnoremap <silent> <buffer> <nowait> q :lclose<CR>:q<CR>
|
|
||||||
endif
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! s:get_page(path) abort
|
function! s:get_page(path) abort
|
||||||
" Disable hard-wrap by using a big $MANWIDTH (max 1000 on some systems #9065).
|
" Disable hard-wrap by using a big $MANWIDTH (max 1000 on some systems #9065).
|
||||||
" Soft-wrap: ftplugin/man.vim sets wrap/breakindent/….
|
" Soft-wrap: ftplugin/man.vim sets wrap/breakindent/….
|
||||||
" Hard-wrap: driven by `man`.
|
" Hard-wrap: driven by `man`.
|
||||||
let manwidth = !get(g:, 'man_hardwrap', 1) ? 999 : (empty($MANWIDTH) ? winwidth(0) : $MANWIDTH)
|
let manwidth = !get(g:,'man_hardwrap') ? 999 : (empty($MANWIDTH) ? winwidth(0) : $MANWIDTH)
|
||||||
" Force MANPAGER=cat to ensure Vim is not recursively invoked (by man-db).
|
" Force MANPAGER=cat to ensure Vim is not recursively invoked (by man-db).
|
||||||
" http://comments.gmane.org/gmane.editors.vim.devel/29085
|
" http://comments.gmane.org/gmane.editors.vim.devel/29085
|
||||||
" Set MAN_KEEP_FORMATTING so Debian man doesn't discard backspaces.
|
" Set MAN_KEEP_FORMATTING so Debian man doesn't discard backspaces.
|
||||||
@@ -145,7 +161,8 @@ function! s:get_page(path) abort
|
|||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:put_page(page) abort
|
function! s:put_page(page) abort
|
||||||
setlocal modifiable noreadonly noswapfile
|
setlocal modifiable
|
||||||
|
setlocal noreadonly
|
||||||
silent keepjumps %delete _
|
silent keepjumps %delete _
|
||||||
silent put =a:page
|
silent put =a:page
|
||||||
while getline(1) =~# '^\s*$'
|
while getline(1) =~# '^\s*$'
|
||||||
@@ -157,7 +174,7 @@ function! s:put_page(page) abort
|
|||||||
silent! keeppatterns keepjumps %s/\s\{199,}/\=repeat(' ', 10)/g
|
silent! keeppatterns keepjumps %s/\s\{199,}/\=repeat(' ', 10)/g
|
||||||
1
|
1
|
||||||
lua require("man").highlight_man_page()
|
lua require("man").highlight_man_page()
|
||||||
call s:set_options(v:false)
|
setlocal filetype=man
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! man#show_toc() abort
|
function! man#show_toc() abort
|
||||||
@@ -187,7 +204,7 @@ endfunction
|
|||||||
|
|
||||||
" attempt to extract the name and sect out of 'name(sect)'
|
" attempt to extract the name and sect out of 'name(sect)'
|
||||||
" otherwise just return the largest string of valid characters in ref
|
" otherwise just return the largest string of valid characters in ref
|
||||||
function! s:extract_sect_and_name_ref(ref) abort
|
function! man#extract_sect_and_name_ref(ref) abort
|
||||||
if a:ref[0] ==# '-' " try ':Man -pandoc' with this disabled.
|
if a:ref[0] ==# '-' " try ':Man -pandoc' with this disabled.
|
||||||
throw 'manpage name cannot start with ''-'''
|
throw 'manpage name cannot start with ''-'''
|
||||||
endif
|
endif
|
||||||
@@ -197,21 +214,13 @@ function! s:extract_sect_and_name_ref(ref) abort
|
|||||||
if empty(name)
|
if empty(name)
|
||||||
throw 'manpage reference cannot contain only parentheses'
|
throw 'manpage reference cannot contain only parentheses'
|
||||||
endif
|
endif
|
||||||
return ['', s:spaces_to_underscores(name)]
|
return [get(b:, 'man_default_sects', ''), name]
|
||||||
endif
|
endif
|
||||||
let left = split(ref, '(')
|
let left = split(ref, '(')
|
||||||
" see ':Man 3X curses' on why tolower.
|
" see ':Man 3X curses' on why tolower.
|
||||||
" TODO(nhooyr) Not sure if this is portable across OSs
|
" TODO(nhooyr) Not sure if this is portable across OSs
|
||||||
" but I have not seen a single uppercase section.
|
" but I have not seen a single uppercase section.
|
||||||
return [tolower(split(left[1], ')')[0]), s:spaces_to_underscores(left[0])]
|
return [tolower(split(left[1], ')')[0]), left[0]]
|
||||||
endfunction
|
|
||||||
|
|
||||||
" replace spaces in a man page name with underscores
|
|
||||||
" intended for PostgreSQL, which has man pages like 'CREATE_TABLE(7)';
|
|
||||||
" while editing SQL source code, it's nice to visually select 'CREATE TABLE'
|
|
||||||
" and hit 'K', which requires this transformation
|
|
||||||
function! s:spaces_to_underscores(str)
|
|
||||||
return substitute(a:str, ' ', '_', 'g')
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:get_path(sect, name) abort
|
function! s:get_path(sect, name) abort
|
||||||
@@ -228,62 +237,42 @@ function! s:get_path(sect, name) abort
|
|||||||
return substitute(get(split(s:system(['man', s:find_arg, s:section_arg, a:sect, a:name])), 0, ''), '\n\+$', '', '')
|
return substitute(get(split(s:system(['man', s:find_arg, s:section_arg, a:sect, a:name])), 0, ''), '\n\+$', '', '')
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" s:verify_exists attempts to find the path to a manpage
|
|
||||||
" based on the passed section and name.
|
|
||||||
"
|
|
||||||
" 1. If the passed section is empty, b:man_default_sects is used.
|
|
||||||
" 2. If manpage could not be found with the given sect and name,
|
|
||||||
" then another attempt is made with b:man_default_sects.
|
|
||||||
" 3. If it still could not be found, then we try again without a section.
|
|
||||||
" 4. If still not found but $MANSECT is set, then we try again with $MANSECT
|
|
||||||
" unset.
|
|
||||||
"
|
|
||||||
" This function is careful to avoid duplicating a search if a previous
|
|
||||||
" step has already done it. i.e if we use b:man_default_sects in step 1,
|
|
||||||
" then we don't do it again in step 2.
|
|
||||||
function! s:verify_exists(sect, name) abort
|
function! s:verify_exists(sect, name) abort
|
||||||
let sect = a:sect
|
|
||||||
if empty(sect)
|
|
||||||
let sect = get(b:, 'man_default_sects', '')
|
|
||||||
endif
|
|
||||||
|
|
||||||
try
|
try
|
||||||
return s:get_path(sect, a:name)
|
let path = s:get_path(a:sect, a:name)
|
||||||
catch /^command error (/
|
catch /^command error (/
|
||||||
|
try
|
||||||
|
let path = s:get_path(get(b:, 'man_default_sects', ''), a:name)
|
||||||
|
catch /^command error (/
|
||||||
|
let path = s:get_path('', a:name)
|
||||||
|
endtry
|
||||||
endtry
|
endtry
|
||||||
|
" Extract the section from the path, because sometimes the actual section is
|
||||||
if !empty(get(b:, 'man_default_sects', '')) && sect !=# b:man_default_sects
|
" more specific than what we provided to `man` (try `:Man 3 App::CLI`).
|
||||||
try
|
" Also on linux, name seems to be case-insensitive. So for `:Man PRIntf`, we
|
||||||
return s:get_path(b:man_default_sects, a:name)
|
" still want the name of the buffer to be 'printf'.
|
||||||
catch /^command error (/
|
return s:extract_sect_and_name_path(path) + [path]
|
||||||
endtry
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !empty(sect)
|
|
||||||
try
|
|
||||||
return s:get_path('', a:name)
|
|
||||||
catch /^command error (/
|
|
||||||
endtry
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !empty($MANSECT)
|
|
||||||
try
|
|
||||||
let MANSECT = $MANSECT
|
|
||||||
call setenv('MANSECT', v:null)
|
|
||||||
return s:get_path('', a:name)
|
|
||||||
catch /^command error (/
|
|
||||||
finally
|
|
||||||
call setenv('MANSECT', MANSECT)
|
|
||||||
endtry
|
|
||||||
endif
|
|
||||||
|
|
||||||
throw 'no manual entry for ' . a:name
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Extracts the name/section from the 'path/name.sect', because sometimes the actual section is
|
let s:tag_stack = []
|
||||||
" more specific than what we provided to `man` (try `:Man 3 App::CLI`).
|
|
||||||
" Also on linux, name seems to be case-insensitive. So for `:Man PRIntf`, we
|
function! s:push_tag() abort
|
||||||
" still want the name of the buffer to be 'printf'.
|
let s:tag_stack += [{
|
||||||
|
\ 'buf': bufnr('%'),
|
||||||
|
\ 'lnum': line('.'),
|
||||||
|
\ 'col': col('.'),
|
||||||
|
\ }]
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! man#pop_tag() abort
|
||||||
|
if !empty(s:tag_stack)
|
||||||
|
let tag = remove(s:tag_stack, -1)
|
||||||
|
execute 'silent' tag['buf'].'buffer'
|
||||||
|
call cursor(tag['lnum'], tag['col'])
|
||||||
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" extracts the name and sect out of 'path/name.sect'
|
||||||
function! s:extract_sect_and_name_path(path) abort
|
function! s:extract_sect_and_name_path(path) abort
|
||||||
let tail = fnamemodify(a:path, ':t')
|
let tail = fnamemodify(a:path, ':t')
|
||||||
if a:path =~# '\.\%([glx]z\|bz2\|lzma\|Z\)$' " valid extensions
|
if a:path =~# '\.\%([glx]z\|bz2\|lzma\|Z\)$' " valid extensions
|
||||||
@@ -295,16 +284,20 @@ function! s:extract_sect_and_name_path(path) abort
|
|||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:find_man() abort
|
function! s:find_man() abort
|
||||||
let l:win = 1
|
if &filetype ==# 'man'
|
||||||
while l:win <= winnr('$')
|
return 1
|
||||||
let l:buf = winbufnr(l:win)
|
elseif winnr('$') ==# 1
|
||||||
if getbufvar(l:buf, '&filetype', '') ==# 'man'
|
return 0
|
||||||
execute l:win.'wincmd w'
|
endif
|
||||||
|
let thiswin = winnr()
|
||||||
|
while 1
|
||||||
|
wincmd w
|
||||||
|
if &filetype ==# 'man'
|
||||||
return 1
|
return 1
|
||||||
|
elseif thiswin ==# winnr()
|
||||||
|
return 0
|
||||||
endif
|
endif
|
||||||
let l:win += 1
|
|
||||||
endwhile
|
endwhile
|
||||||
return 0
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:error(msg) abort
|
function! s:error(msg) abort
|
||||||
@@ -314,7 +307,7 @@ function! s:error(msg) abort
|
|||||||
echohl None
|
echohl None
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" see s:extract_sect_and_name_ref on why tolower(sect)
|
" see man#extract_sect_and_name_ref on why tolower(sect)
|
||||||
function! man#complete(arg_lead, cmd_line, cursor_pos) abort
|
function! man#complete(arg_lead, cmd_line, cursor_pos) abort
|
||||||
let args = split(a:cmd_line)
|
let args = split(a:cmd_line)
|
||||||
let cmd_offset = index(args, 'Man')
|
let cmd_offset = index(args, 'Man')
|
||||||
@@ -367,35 +360,14 @@ function! man#complete(arg_lead, cmd_line, cursor_pos) abort
|
|||||||
return s:complete(sect, sect, name)
|
return s:complete(sect, sect, name)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:get_paths(sect, name, do_fallback) abort
|
function! s:complete(sect, psect, name) abort
|
||||||
" callers must try-catch this, as some `man` implementations don't support `s:find_arg`
|
|
||||||
try
|
try
|
||||||
let mandirs = join(split(s:system(['man', s:find_arg]), ':\|\n'), ',')
|
let mandirs = join(split(s:system(['man', s:find_arg]), ':\|\n'), ',')
|
||||||
let paths = globpath(mandirs, 'man?/'.a:name.'*.'.a:sect.'*', 0, 1)
|
|
||||||
try
|
|
||||||
" Prioritize the result from verify_exists as it obeys b:man_default_sects.
|
|
||||||
let first = s:verify_exists(a:sect, a:name)
|
|
||||||
let paths = filter(paths, 'v:val !=# first')
|
|
||||||
let paths = [first] + paths
|
|
||||||
catch
|
|
||||||
endtry
|
|
||||||
return paths
|
|
||||||
catch
|
catch
|
||||||
if !a:do_fallback
|
call s:error(v:exception)
|
||||||
throw v:exception
|
return
|
||||||
endif
|
|
||||||
|
|
||||||
" Fallback to a single path, with the page we're trying to find.
|
|
||||||
try
|
|
||||||
return [s:verify_exists(a:sect, a:name)]
|
|
||||||
catch
|
|
||||||
return []
|
|
||||||
endtry
|
|
||||||
endtry
|
endtry
|
||||||
endfunction
|
let pages = globpath(mandirs,'man?/'.a:name.'*.'.a:sect.'*', 0, 1)
|
||||||
|
|
||||||
function! s:complete(sect, psect, name) abort
|
|
||||||
let pages = s:get_paths(a:sect, a:name, v:false)
|
|
||||||
" We remove duplicates in case the same manpage in different languages was found.
|
" We remove duplicates in case the same manpage in different languages was found.
|
||||||
return uniq(sort(map(pages, 's:format_candidate(v:val, a:psect)'), 'i'))
|
return uniq(sort(map(pages, 's:format_candidate(v:val, a:psect)'), 'i'))
|
||||||
endfunction
|
endfunction
|
||||||
@@ -414,12 +386,7 @@ function! s:format_candidate(path, psect) abort
|
|||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Called when Nvim is invoked as $MANPAGER.
|
|
||||||
function! man#init_pager() abort
|
function! man#init_pager() abort
|
||||||
" https://github.com/neovim/neovim/issues/6828
|
|
||||||
let og_modifiable = &modifiable
|
|
||||||
setlocal modifiable
|
|
||||||
|
|
||||||
if getline(1) =~# '^\s*$'
|
if getline(1) =~# '^\s*$'
|
||||||
silent keepjumps 1delete _
|
silent keepjumps 1delete _
|
||||||
else
|
else
|
||||||
@@ -430,44 +397,13 @@ function! man#init_pager() abort
|
|||||||
" know the correct casing, cf. `man glDrawArraysInstanced`).
|
" know the correct casing, cf. `man glDrawArraysInstanced`).
|
||||||
let ref = substitute(matchstr(getline(1), '^[^)]\+)'), ' ', '_', 'g')
|
let ref = substitute(matchstr(getline(1), '^[^)]\+)'), ' ', '_', 'g')
|
||||||
try
|
try
|
||||||
let b:man_sect = s:extract_sect_and_name_ref(ref)[0]
|
let b:man_sect = man#extract_sect_and_name_ref(ref)[0]
|
||||||
catch
|
catch
|
||||||
let b:man_sect = ''
|
let b:man_sect = ''
|
||||||
endtry
|
endtry
|
||||||
if -1 == match(bufname('%'), 'man:\/\/') " Avoid duplicate buffers, E95.
|
if -1 == match(bufname('%'), 'man:\/\/') " Avoid duplicate buffers, E95.
|
||||||
execute 'silent file man://'.tolower(fnameescape(ref))
|
execute 'silent file man://'.tolower(fnameescape(ref))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
call s:set_options(v:true)
|
|
||||||
let &l:modifiable = og_modifiable
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! man#goto_tag(pattern, flags, info) abort
|
call s:init()
|
||||||
let [l:sect, l:name] = s:extract_sect_and_name_ref(a:pattern)
|
|
||||||
|
|
||||||
let l:paths = s:get_paths(l:sect, l:name, v:true)
|
|
||||||
let l:structured = []
|
|
||||||
|
|
||||||
for l:path in l:paths
|
|
||||||
let [l:sect, l:name] = s:extract_sect_and_name_path(l:path)
|
|
||||||
let l:structured += [{
|
|
||||||
\ 'name': l:name,
|
|
||||||
\ 'title': l:name . '(' . l:sect . ')'
|
|
||||||
\ }]
|
|
||||||
endfor
|
|
||||||
|
|
||||||
if &cscopetag
|
|
||||||
" return only a single entry so we work well with :cstag (#11675)
|
|
||||||
let l:structured = l:structured[:0]
|
|
||||||
endif
|
|
||||||
|
|
||||||
return map(l:structured, {
|
|
||||||
\ _, entry -> {
|
|
||||||
\ 'name': entry.name,
|
|
||||||
\ 'filename': 'man://' . entry.title,
|
|
||||||
\ 'cmd': '1'
|
|
||||||
\ }
|
|
||||||
\ })
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
call man#init()
|
|
||||||
|
@@ -56,7 +56,6 @@ function s:msgpack_init_python() abort
|
|||||||
\. " time = datetime.datetime.fromtimestamp(timestamp)\n"
|
\. " time = datetime.datetime.fromtimestamp(timestamp)\n"
|
||||||
\. " return time.strftime(fmt)\n"
|
\. " return time.strftime(fmt)\n"
|
||||||
\. "def shada_dict_strptime():\n"
|
\. "def shada_dict_strptime():\n"
|
||||||
\. " import calendar\n"
|
|
||||||
\. " import datetime\n"
|
\. " import datetime\n"
|
||||||
\. " import vim\n"
|
\. " import vim\n"
|
||||||
\. " fmt = vim.eval('a:format')\n"
|
\. " fmt = vim.eval('a:format')\n"
|
||||||
@@ -65,10 +64,7 @@ function s:msgpack_init_python() abort
|
|||||||
\. " try:\n"
|
\. " try:\n"
|
||||||
\. " timestamp = int(timestamp.timestamp())\n"
|
\. " timestamp = int(timestamp.timestamp())\n"
|
||||||
\. " except:\n"
|
\. " except:\n"
|
||||||
\. " try:\n"
|
\. " timestamp = int(timestamp.strftime('%s'))\n"
|
||||||
\. " timestamp = int(timestamp.strftime('%s'))\n"
|
|
||||||
\. " except:\n"
|
|
||||||
\. " timestamp = calendar.timegm(timestamp.utctimetuple())\n"
|
|
||||||
\. " if timestamp > 2 ** 31:\n"
|
\. " if timestamp > 2 ** 31:\n"
|
||||||
\. " tsabs = abs(timestamp)\n"
|
\. " tsabs = abs(timestamp)\n"
|
||||||
\. " return ('{\"_TYPE\": v:msgpack_types.integer,'\n"
|
\. " return ('{\"_TYPE\": v:msgpack_types.integer,'\n"
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,8 +1,8 @@
|
|||||||
" netrwFileHandlers: contains various extension-based file handlers for
|
" netrwFileHandlers: contains various extension-based file handlers for
|
||||||
" netrw's browsers' x command ("eXecute launcher")
|
" netrw's browsers' x command ("eXecute launcher")
|
||||||
" Author: Charles E. Campbell
|
" Author: Charles E. Campbell
|
||||||
" Date: Sep 18, 2020
|
" Date: May 03, 2013
|
||||||
" Version: 11
|
" Version: 11b ASTRO-ONLY
|
||||||
" Copyright: Copyright (C) 1999-2012 Charles E. Campbell {{{1
|
" Copyright: Copyright (C) 1999-2012 Charles E. Campbell {{{1
|
||||||
" Permission is hereby granted to use and distribute this code,
|
" Permission is hereby granted to use and distribute this code,
|
||||||
" with or without modifications, provided that this copyright
|
" with or without modifications, provided that this copyright
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
if exists("g:loaded_netrwFileHandlers") || &cp
|
if exists("g:loaded_netrwFileHandlers") || &cp
|
||||||
finish
|
finish
|
||||||
endif
|
endif
|
||||||
let g:loaded_netrwFileHandlers= "v11"
|
let g:loaded_netrwFileHandlers= "v11b"
|
||||||
if v:version < 702
|
if v:version < 702
|
||||||
echohl WarningMsg
|
echohl WarningMsg
|
||||||
echo "***warning*** this version of netrwFileHandlers needs vim 7.2"
|
echo "***warning*** this version of netrwFileHandlers needs vim 7.2"
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
" netrwSettings.vim: makes netrw settings simpler
|
" netrwSettings.vim: makes netrw settings simpler
|
||||||
" Date: Aug 12, 2021
|
" Date: Nov 09, 2016
|
||||||
" Maintainer: Charles E Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
|
" Maintainer: Charles E Campbell <drchipNOSPAM at campbellfamily dot biz>
|
||||||
" Version: 17 ASTRO-ONLY
|
" Version: 16
|
||||||
" Copyright: Copyright (C) 1999-2007 Charles E. Campbell {{{1
|
" Copyright: Copyright (C) 1999-2007 Charles E. Campbell {{{1
|
||||||
" Permission is hereby granted to use and distribute this code,
|
" Permission is hereby granted to use and distribute this code,
|
||||||
" with or without modifications, provided that this copyright
|
" with or without modifications, provided that this copyright
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
if exists("g:loaded_netrwSettings") || &cp
|
if exists("g:loaded_netrwSettings") || &cp
|
||||||
finish
|
finish
|
||||||
endif
|
endif
|
||||||
let g:loaded_netrwSettings = "v17"
|
let g:loaded_netrwSettings = "v16"
|
||||||
if v:version < 700
|
if v:version < 700
|
||||||
echohl WarningMsg
|
echohl WarningMsg
|
||||||
echo "***warning*** this version of netrwSettings needs vim 7.0"
|
echo "***warning*** this version of netrwSettings needs vim 7.0"
|
||||||
@@ -31,7 +31,7 @@ endif
|
|||||||
" NetrwSettings: {{{1
|
" NetrwSettings: {{{1
|
||||||
fun! netrwSettings#NetrwSettings()
|
fun! netrwSettings#NetrwSettings()
|
||||||
" this call is here largely just to insure that netrw has been loaded
|
" this call is here largely just to insure that netrw has been loaded
|
||||||
call netrw#WinPath("")
|
call netrw#SavePosn()
|
||||||
if !exists("g:loaded_netrw")
|
if !exists("g:loaded_netrw")
|
||||||
echohl WarningMsg | echomsg "***sorry*** netrw needs to be loaded prior to using NetrwSettings" | echohl None
|
echohl WarningMsg | echomsg "***sorry*** netrw needs to be loaded prior to using NetrwSettings" | echohl None
|
||||||
return
|
return
|
||||||
|
@@ -18,5 +18,61 @@
|
|||||||
" holder be liable for any damages resulting from the use
|
" holder be liable for any damages resulting from the use
|
||||||
" of this software.
|
" of this software.
|
||||||
function! netrw_gitignore#Hide(...)
|
function! netrw_gitignore#Hide(...)
|
||||||
return substitute(substitute(system('git ls-files --other --ignored --exclude-standard --directory'), '\n', ',', 'g'), ',$', '', '')
|
let additional_files = a:000
|
||||||
|
|
||||||
|
let default_files = ['.gitignore', '.git/info/exclude']
|
||||||
|
|
||||||
|
" get existing global/system gitignore files
|
||||||
|
let global_gitignore = expand(substitute(system("git config --global core.excludesfile"), '\n', '', 'g'))
|
||||||
|
if global_gitignore !=# ''
|
||||||
|
let default_files = add(default_files, global_gitignore)
|
||||||
|
endif
|
||||||
|
let system_gitignore = expand(substitute(system("git config --system core.excludesfile"), '\n', '', 'g'))
|
||||||
|
if system_gitignore !=# ''
|
||||||
|
let default_files = add(default_files, system_gitignore)
|
||||||
|
endif
|
||||||
|
|
||||||
|
" append additional files if given as function arguments
|
||||||
|
if additional_files !=# []
|
||||||
|
let files = extend(default_files, additional_files)
|
||||||
|
else
|
||||||
|
let files = default_files
|
||||||
|
endif
|
||||||
|
|
||||||
|
" keep only existing/readable files
|
||||||
|
let gitignore_files = []
|
||||||
|
for file in files
|
||||||
|
if filereadable(file)
|
||||||
|
let gitignore_files = add(gitignore_files, file)
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
|
||||||
|
" get contents of gitignore patterns from those files
|
||||||
|
let gitignore_lines = []
|
||||||
|
for file in gitignore_files
|
||||||
|
for line in readfile(file)
|
||||||
|
" filter empty lines and comments
|
||||||
|
if line !~# '^#' && line !~# '^$'
|
||||||
|
let gitignore_lines = add(gitignore_lines, line)
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
endfor
|
||||||
|
|
||||||
|
" convert gitignore patterns to Netrw/Vim regex patterns
|
||||||
|
let escaped_lines = []
|
||||||
|
for line in gitignore_lines
|
||||||
|
let escaped = line
|
||||||
|
let escaped = substitute(escaped, '\*\*', '*', 'g')
|
||||||
|
let escaped = substitute(escaped, '\.', '\\.', 'g')
|
||||||
|
let escaped = substitute(escaped, '\$', '\\$', 'g')
|
||||||
|
let escaped = substitute(escaped, '*', '.*', 'g')
|
||||||
|
" correction: dot, dollar and asterisks chars shouldn't be escaped when
|
||||||
|
" within regex matching groups.
|
||||||
|
let escaped = substitute(escaped, '\(\[[^]]*\)\zs\\\.', '\.', 'g')
|
||||||
|
let escaped = substitute(escaped, '\(\[[^]]*\)\zs\\\$', '\$', 'g')
|
||||||
|
let escaped = substitute(escaped, '\(\[[^]]*\)\zs\.\*', '*', 'g')
|
||||||
|
let escaped_lines = add(escaped_lines, escaped)
|
||||||
|
endfor
|
||||||
|
|
||||||
|
return join(escaped_lines, ',')
|
||||||
endfunction
|
endfunction
|
||||||
|
@@ -9,7 +9,7 @@
|
|||||||
"
|
"
|
||||||
" let g:phpcomplete_relax_static_constraint = 1/0 [default 0]
|
" let g:phpcomplete_relax_static_constraint = 1/0 [default 0]
|
||||||
" Enables completion for non-static methods when completing for static context (::).
|
" Enables completion for non-static methods when completing for static context (::).
|
||||||
" This generates E_STRICT level warning, but php calls these methods nonetheless.
|
" This generates E_STRICT level warning, but php calls these methods nontheless.
|
||||||
"
|
"
|
||||||
" let g:phpcomplete_complete_for_unknown_classes = 1/0 [default 0]
|
" let g:phpcomplete_complete_for_unknown_classes = 1/0 [default 0]
|
||||||
" Enables completion of variables and functions in "everything under the sun" fashion
|
" Enables completion of variables and functions in "everything under the sun" fashion
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
" This option controls the number of characters the user needs to type before
|
" This option controls the number of characters the user needs to type before
|
||||||
" the tags will be searched for namespaces and classes in typed out namespaces in
|
" the tags will be searched for namespaces and classes in typed out namespaces in
|
||||||
" "use ..." context. Setting this to 0 is not recommended because that means the code
|
" "use ..." context. Setting this to 0 is not recommended because that means the code
|
||||||
" have to scan every tag, and vim's taglist() function runs extremely slow with a
|
" have to scan every tag, and vim's taglist() function runs extremly slow with a
|
||||||
" "match everything" pattern.
|
" "match everything" pattern.
|
||||||
"
|
"
|
||||||
" let g:phpcomplete_parse_docblock_comments = 1/0 [default 0]
|
" let g:phpcomplete_parse_docblock_comments = 1/0 [default 0]
|
||||||
@@ -268,7 +268,7 @@ function! phpcomplete#CompleteUse(base) " {{{
|
|||||||
call add(no_namespace_matches, {'word': namespace_for_class.'\'.tag.name, 'kind': tag.kind, 'menu': tag.filename, 'info': tag.filename })
|
call add(no_namespace_matches, {'word': namespace_for_class.'\'.tag.name, 'kind': tag.kind, 'menu': tag.filename, 'info': tag.filename })
|
||||||
endif
|
endif
|
||||||
endfor
|
endfor
|
||||||
" if it seems that the tags file have namespace information we can safely throw
|
" if it seems that the tags file have namespace informations we can safely throw
|
||||||
" away namespaceless tag matches since we can be sure they are invalid
|
" away namespaceless tag matches since we can be sure they are invalid
|
||||||
if patched_ctags_detected
|
if patched_ctags_detected
|
||||||
no_namespace_matches = []
|
no_namespace_matches = []
|
||||||
@@ -810,7 +810,7 @@ function! phpcomplete#CompleteClassName(base, kinds, current_namespace, imports)
|
|||||||
endif
|
endif
|
||||||
endfor
|
endfor
|
||||||
|
|
||||||
" resolve the typed in part with namespaces (if there's a \ in it)
|
" resolve the typed in part with namespaces (if theres a \ in it)
|
||||||
let [tag_match_pattern, namespace_for_class] = phpcomplete#ExpandClassName(a:base, a:current_namespace, a:imports)
|
let [tag_match_pattern, namespace_for_class] = phpcomplete#ExpandClassName(a:base, a:current_namespace, a:imports)
|
||||||
|
|
||||||
let tags = []
|
let tags = []
|
||||||
@@ -926,11 +926,11 @@ function! s:getNextCharWithPos(filelines, current_pos) " {{{
|
|||||||
endfunction " }}}
|
endfunction " }}}
|
||||||
|
|
||||||
function! phpcomplete#EvaluateModifiers(modifiers, required_modifiers, prohibited_modifiers) " {{{
|
function! phpcomplete#EvaluateModifiers(modifiers, required_modifiers, prohibited_modifiers) " {{{
|
||||||
" if there's no modifier, and no modifier is allowed and no modifier is required
|
" if theres no modifier, and no modifier is allowed and no modifier is required
|
||||||
if len(a:modifiers) == 0 && len(a:required_modifiers) == 0
|
if len(a:modifiers) == 0 && len(a:required_modifiers) == 0
|
||||||
return 1
|
return 1
|
||||||
else
|
else
|
||||||
" check if every required modifier is present
|
" check if every requred modifier is present
|
||||||
for required_modifier in a:required_modifiers
|
for required_modifier in a:required_modifiers
|
||||||
if index(a:modifiers, required_modifier) == -1
|
if index(a:modifiers, required_modifier) == -1
|
||||||
return 0
|
return 0
|
||||||
@@ -1258,7 +1258,7 @@ function! phpcomplete#GetCurrentInstruction(line_number, col_number, phpbegin) "
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" save the coma position for later use if there's a "naked" , possibly separating a parameter and it is not in a parented part
|
" save the coma position for later use if theres a "naked" , possibly separating a parameter and it is not in a parented part
|
||||||
if first_coma_break_pos == -1 && current_char == ','
|
if first_coma_break_pos == -1 && current_char == ','
|
||||||
let first_coma_break_pos = len(instruction)
|
let first_coma_break_pos = len(instruction)
|
||||||
endif
|
endif
|
||||||
@@ -1304,7 +1304,7 @@ function! phpcomplete#GetCurrentInstruction(line_number, col_number, phpbegin) "
|
|||||||
|
|
||||||
" there were a "naked" coma in the instruction
|
" there were a "naked" coma in the instruction
|
||||||
if first_coma_break_pos != -1
|
if first_coma_break_pos != -1
|
||||||
if instruction !~? '^use' && instruction !~? '^class' " use ... statements and class declarations should not be broken up by comas
|
if instruction !~? '^use' && instruction !~? '^class' " use ... statements and class delcarations should not be broken up by comas
|
||||||
let pos = (-1 * first_coma_break_pos) + 1
|
let pos = (-1 * first_coma_break_pos) + 1
|
||||||
let instruction = instruction[pos :]
|
let instruction = instruction[pos :]
|
||||||
endif
|
endif
|
||||||
@@ -1316,7 +1316,7 @@ function! phpcomplete#GetCurrentInstruction(line_number, col_number, phpbegin) "
|
|||||||
" clear everything up until the first (
|
" clear everything up until the first (
|
||||||
let instruction = substitute(instruction, '^\(if\|while\|foreach\|for\)\s*(\s*', '', '')
|
let instruction = substitute(instruction, '^\(if\|while\|foreach\|for\)\s*(\s*', '', '')
|
||||||
|
|
||||||
" lets iterate through the instruction until we can find the pair for the opening (
|
" lets iterate trough the instruction until we can find the pair for the opening (
|
||||||
let i = 0
|
let i = 0
|
||||||
let depth = 1
|
let depth = 1
|
||||||
while i < len(instruction)
|
while i < len(instruction)
|
||||||
@@ -1424,7 +1424,7 @@ function! phpcomplete#GetCallChainReturnType(classname_candidate, class_candidat
|
|||||||
let parts = split(substitute(type, '^\\', '', ''), '\')
|
let parts = split(substitute(type, '^\\', '', ''), '\')
|
||||||
let class_candidate_namespace = join(parts[0:-2], '\')
|
let class_candidate_namespace = join(parts[0:-2], '\')
|
||||||
let classname_candidate = parts[-1]
|
let classname_candidate = parts[-1]
|
||||||
" check for renamed namespace in imports
|
" check for renamed namepsace in imports
|
||||||
if has_key(classstructure.imports, class_candidate_namespace)
|
if has_key(classstructure.imports, class_candidate_namespace)
|
||||||
let class_candidate_namespace = classstructure.imports[class_candidate_namespace].name
|
let class_candidate_namespace = classstructure.imports[class_candidate_namespace].name
|
||||||
endif
|
endif
|
||||||
@@ -2023,7 +2023,7 @@ function! phpcomplete#GetCachedClassContents(classlocation, class_name) " {{{
|
|||||||
if getftime(classstructure.file) != classstructure.mtime
|
if getftime(classstructure.file) != classstructure.mtime
|
||||||
let valid = 0
|
let valid = 0
|
||||||
" we could break here, but the time required for checking probably worth
|
" we could break here, but the time required for checking probably worth
|
||||||
" the memory we can free by checking every file in the cached hierarchy
|
" the the memory we can free by checking every file in the cached hirearchy
|
||||||
call phpcomplete#ClearCachedClassContents(classstructure.file)
|
call phpcomplete#ClearCachedClassContents(classstructure.file)
|
||||||
endif
|
endif
|
||||||
endfor
|
endfor
|
||||||
@@ -2037,7 +2037,7 @@ function! phpcomplete#GetCachedClassContents(classlocation, class_name) " {{{
|
|||||||
call remove(s:cache_classstructures, cache_key)
|
call remove(s:cache_classstructures, cache_key)
|
||||||
call phpcomplete#ClearCachedClassContents(full_file_path)
|
call phpcomplete#ClearCachedClassContents(full_file_path)
|
||||||
|
|
||||||
" fall through for the read from files path
|
" fall trough for the read from files path
|
||||||
endif
|
endif
|
||||||
else
|
else
|
||||||
call phpcomplete#ClearCachedClassContents(full_file_path)
|
call phpcomplete#ClearCachedClassContents(full_file_path)
|
||||||
@@ -2590,7 +2590,7 @@ function! phpcomplete#GetCurrentNameSpace(file_lines) " {{{
|
|||||||
let search_line = line
|
let search_line = line
|
||||||
let use_line = line
|
let use_line = line
|
||||||
|
|
||||||
" add lines from the file until there's no ';' in them
|
" add lines from the file until theres no ';' in them
|
||||||
while search_line !~? ';' && l > 0
|
while search_line !~? ';' && l > 0
|
||||||
" file lines are reversed so we need to go backwards
|
" file lines are reversed so we need to go backwards
|
||||||
let l -= 1
|
let l -= 1
|
||||||
@@ -2622,7 +2622,7 @@ function! phpcomplete#GetCurrentNameSpace(file_lines) " {{{
|
|||||||
" find kind flags from tags or built in methods for the objects we extracted
|
" find kind flags from tags or built in methods for the objects we extracted
|
||||||
" they can be either classes, interfaces or namespaces, no other thing is importable in php
|
" they can be either classes, interfaces or namespaces, no other thing is importable in php
|
||||||
for [key, import] in items(imports)
|
for [key, import] in items(imports)
|
||||||
" if there's a \ in the name we have it's definitely not a built in thing, look for tags
|
" if theres a \ in the name we have it's definitely not a built in thing, look for tags
|
||||||
if import.name =~ '\\'
|
if import.name =~ '\\'
|
||||||
let patched_ctags_detected = 0
|
let patched_ctags_detected = 0
|
||||||
let [classname, namespace_for_classes] = phpcomplete#ExpandClassName(import.name, '\', {})
|
let [classname, namespace_for_classes] = phpcomplete#ExpandClassName(import.name, '\', {})
|
||||||
@@ -2679,10 +2679,10 @@ function! phpcomplete#GetCurrentNameSpace(file_lines) " {{{
|
|||||||
let import['kind'] = 'i'
|
let import['kind'] = 'i'
|
||||||
let import['builtin'] = 1
|
let import['builtin'] = 1
|
||||||
else
|
else
|
||||||
" or can be a tag with exactly matching name
|
" or can be a tag with exactly matchign name
|
||||||
let tags = phpcomplete#GetTaglist('^'.import['name'].'$')
|
let tags = phpcomplete#GetTaglist('^'.import['name'].'$')
|
||||||
for tag in tags
|
for tag in tags
|
||||||
" search for the first matching namespace, class, interface with no namespace
|
" search for the first matchin namespace, class, interface with no namespace
|
||||||
if !has_key(tag, 'namespace') && (tag.kind == 'n' || tag.kind == 'c' || tag.kind == 'i' || tag.kind == 't')
|
if !has_key(tag, 'namespace') && (tag.kind == 'n' || tag.kind == 'c' || tag.kind == 'i' || tag.kind == 't')
|
||||||
call extend(import, tag)
|
call extend(import, tag)
|
||||||
let import['builtin'] = 0
|
let import['builtin'] = 0
|
||||||
@@ -2900,7 +2900,7 @@ for [ext, data] in items(php_builtin['functions'])
|
|||||||
call extend(g:php_builtin_functions, data)
|
call extend(g:php_builtin_functions, data)
|
||||||
endfor
|
endfor
|
||||||
|
|
||||||
" Built in class
|
" Built in classs
|
||||||
let g:php_builtin_classes = {}
|
let g:php_builtin_classes = {}
|
||||||
for [ext, data] in items(php_builtin['classes'])
|
for [ext, data] in items(php_builtin['classes'])
|
||||||
call extend(g:php_builtin_classes, data)
|
call extend(g:php_builtin_classes, data)
|
||||||
@@ -2918,10 +2918,10 @@ for [ext, data] in items(php_builtin['constants'])
|
|||||||
call extend(g:php_constants, data)
|
call extend(g:php_constants, data)
|
||||||
endfor
|
endfor
|
||||||
|
|
||||||
" When the classname not found or found but the tags doesn't contain that
|
" When the classname not found or found but the tags dosen't contain that
|
||||||
" class we will try to complete any method of any builtin class. To speed up
|
" class we will try to complate any method of any builtin class. To speed up
|
||||||
" that lookup we compile a 'ClassName::MethodName':'info' dictionary from the
|
" that lookup we compile a 'ClassName::MethodName':'info' dictionary from the
|
||||||
" builtin class information
|
" builtin class informations
|
||||||
let g:php_builtin_object_functions = {}
|
let g:php_builtin_object_functions = {}
|
||||||
|
|
||||||
" When completing for 'everyting imaginable' (no class context, not a
|
" When completing for 'everyting imaginable' (no class context, not a
|
||||||
|
@@ -3,11 +3,8 @@
|
|||||||
" Start the provider and perform a 'poll' request
|
" Start the provider and perform a 'poll' request
|
||||||
"
|
"
|
||||||
" Returns a valid channel on success
|
" Returns a valid channel on success
|
||||||
function! provider#Poll(argv, orig_name, log_env, ...) abort
|
function! provider#Poll(argv, orig_name, log_env) abort
|
||||||
let job = {'rpc': v:true, 'stderr_buffered': v:true}
|
let job = {'rpc': v:true, 'stderr_buffered': v:true}
|
||||||
if a:0
|
|
||||||
let job = extend(job, a:1)
|
|
||||||
endif
|
|
||||||
try
|
try
|
||||||
let channel_id = jobstart(a:argv, job)
|
let channel_id = jobstart(a:argv, job)
|
||||||
if channel_id > 0 && rpcrequest(channel_id, 'poll') ==# 'ok'
|
if channel_id > 0 && rpcrequest(channel_id, 'poll') ==# 'ok'
|
||||||
|
@@ -35,7 +35,8 @@ endfunction
|
|||||||
let s:selections = { '*': s:selection, '+': copy(s:selection) }
|
let s:selections = { '*': s:selection, '+': copy(s:selection) }
|
||||||
|
|
||||||
function! s:try_cmd(cmd, ...) abort
|
function! s:try_cmd(cmd, ...) abort
|
||||||
let out = systemlist(a:cmd, (a:0 ? a:1 : ['']), 1)
|
let argv = split(a:cmd, " ")
|
||||||
|
let out = systemlist(argv, (a:0 ? a:1 : ['']), 1)
|
||||||
if v:shell_error
|
if v:shell_error
|
||||||
if !exists('s:did_error_try_cmd')
|
if !exists('s:did_error_try_cmd')
|
||||||
echohl WarningMsg
|
echohl WarningMsg
|
||||||
@@ -54,10 +55,6 @@ function! s:cmd_ok(cmd) abort
|
|||||||
return v:shell_error == 0
|
return v:shell_error == 0
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:split_cmd(cmd) abort
|
|
||||||
return (type(a:cmd) == v:t_string) ? split(a:cmd, " ") : a:cmd
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
let s:cache_enabled = 1
|
let s:cache_enabled = 1
|
||||||
let s:err = ''
|
let s:err = ''
|
||||||
|
|
||||||
@@ -74,73 +71,56 @@ function! provider#clipboard#Executable() abort
|
|||||||
return ''
|
return ''
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let s:copy = {}
|
let s:copy = get(g:clipboard, 'copy', { '+': v:null, '*': v:null })
|
||||||
let s:copy['+'] = s:split_cmd(get(g:clipboard.copy, '+', v:null))
|
let s:paste = get(g:clipboard, 'paste', { '+': v:null, '*': v:null })
|
||||||
let s:copy['*'] = s:split_cmd(get(g:clipboard.copy, '*', v:null))
|
|
||||||
|
|
||||||
let s:paste = {}
|
|
||||||
let s:paste['+'] = s:split_cmd(get(g:clipboard.paste, '+', v:null))
|
|
||||||
let s:paste['*'] = s:split_cmd(get(g:clipboard.paste, '*', v:null))
|
|
||||||
|
|
||||||
let s:cache_enabled = get(g:clipboard, 'cache_enabled', 0)
|
let s:cache_enabled = get(g:clipboard, 'cache_enabled', 0)
|
||||||
return get(g:clipboard, 'name', 'g:clipboard')
|
return get(g:clipboard, 'name', 'g:clipboard')
|
||||||
elseif has('mac')
|
elseif has('mac')
|
||||||
let s:copy['+'] = ['pbcopy']
|
let s:copy['+'] = 'pbcopy'
|
||||||
let s:paste['+'] = ['pbpaste']
|
let s:paste['+'] = 'pbpaste'
|
||||||
let s:copy['*'] = s:copy['+']
|
let s:copy['*'] = s:copy['+']
|
||||||
let s:paste['*'] = s:paste['+']
|
let s:paste['*'] = s:paste['+']
|
||||||
let s:cache_enabled = 0
|
let s:cache_enabled = 0
|
||||||
return 'pbcopy'
|
return 'pbcopy'
|
||||||
elseif !empty($WAYLAND_DISPLAY) && executable('wl-copy') && executable('wl-paste')
|
elseif exists('$WAYLAND_DISPLAY') && executable('wl-copy') && executable('wl-paste')
|
||||||
let s:copy['+'] = ['wl-copy', '--foreground', '--type', 'text/plain']
|
let s:copy['+'] = 'wl-copy --foreground --type text/plain'
|
||||||
let s:paste['+'] = ['wl-paste', '--no-newline']
|
let s:paste['+'] = 'wl-paste --no-newline'
|
||||||
let s:copy['*'] = ['wl-copy', '--foreground', '--primary', '--type', 'text/plain']
|
let s:copy['*'] = 'wl-copy --foreground --primary --type text/plain'
|
||||||
let s:paste['*'] = ['wl-paste', '--no-newline', '--primary']
|
let s:paste['*'] = 'wl-paste --no-newline --primary'
|
||||||
return 'wl-copy'
|
return 'wl-copy'
|
||||||
elseif !empty($DISPLAY) && executable('xclip')
|
elseif exists('$DISPLAY') && executable('xclip')
|
||||||
let s:copy['+'] = ['xclip', '-quiet', '-i', '-selection', 'clipboard']
|
let s:copy['+'] = 'xclip -quiet -i -selection clipboard'
|
||||||
let s:paste['+'] = ['xclip', '-o', '-selection', 'clipboard']
|
let s:paste['+'] = 'xclip -o -selection clipboard'
|
||||||
let s:copy['*'] = ['xclip', '-quiet', '-i', '-selection', 'primary']
|
let s:copy['*'] = 'xclip -quiet -i -selection primary'
|
||||||
let s:paste['*'] = ['xclip', '-o', '-selection', 'primary']
|
let s:paste['*'] = 'xclip -o -selection primary'
|
||||||
return 'xclip'
|
return 'xclip'
|
||||||
elseif !empty($DISPLAY) && executable('xsel') && s:cmd_ok('xsel -o -b')
|
elseif exists('$DISPLAY') && executable('xsel') && s:cmd_ok('xsel -o -b')
|
||||||
let s:copy['+'] = ['xsel', '--nodetach', '-i', '-b']
|
let s:copy['+'] = 'xsel --nodetach -i -b'
|
||||||
let s:paste['+'] = ['xsel', '-o', '-b']
|
let s:paste['+'] = 'xsel -o -b'
|
||||||
let s:copy['*'] = ['xsel', '--nodetach', '-i', '-p']
|
let s:copy['*'] = 'xsel --nodetach -i -p'
|
||||||
let s:paste['*'] = ['xsel', '-o', '-p']
|
let s:paste['*'] = 'xsel -o -p'
|
||||||
return 'xsel'
|
return 'xsel'
|
||||||
elseif executable('lemonade')
|
elseif executable('lemonade')
|
||||||
let s:copy['+'] = ['lemonade', 'copy']
|
let s:copy['+'] = 'lemonade copy'
|
||||||
let s:paste['+'] = ['lemonade', 'paste']
|
let s:paste['+'] = 'lemonade paste'
|
||||||
let s:copy['*'] = ['lemonade', 'copy']
|
let s:copy['*'] = 'lemonade copy'
|
||||||
let s:paste['*'] = ['lemonade', 'paste']
|
let s:paste['*'] = 'lemonade paste'
|
||||||
return 'lemonade'
|
return 'lemonade'
|
||||||
elseif executable('doitclient')
|
elseif executable('doitclient')
|
||||||
let s:copy['+'] = ['doitclient', 'wclip']
|
let s:copy['+'] = 'doitclient wclip'
|
||||||
let s:paste['+'] = ['doitclient', 'wclip', '-r']
|
let s:paste['+'] = 'doitclient wclip -r'
|
||||||
let s:copy['*'] = s:copy['+']
|
let s:copy['*'] = s:copy['+']
|
||||||
let s:paste['*'] = s:paste['+']
|
let s:paste['*'] = s:paste['+']
|
||||||
return 'doitclient'
|
return 'doitclient'
|
||||||
elseif executable('win32yank.exe')
|
elseif executable('win32yank.exe')
|
||||||
if has('wsl') && getftype(exepath('win32yank.exe')) == 'link'
|
let s:copy['+'] = 'win32yank.exe -i --crlf'
|
||||||
let win32yank = resolve(exepath('win32yank.exe'))
|
let s:paste['+'] = 'win32yank.exe -o --lf'
|
||||||
else
|
|
||||||
let win32yank = 'win32yank.exe'
|
|
||||||
endif
|
|
||||||
let s:copy['+'] = [win32yank, '-i', '--crlf']
|
|
||||||
let s:paste['+'] = [win32yank, '-o', '--lf']
|
|
||||||
let s:copy['*'] = s:copy['+']
|
let s:copy['*'] = s:copy['+']
|
||||||
let s:paste['*'] = s:paste['+']
|
let s:paste['*'] = s:paste['+']
|
||||||
return 'win32yank'
|
return 'win32yank'
|
||||||
elseif executable('termux-clipboard-set')
|
elseif exists('$TMUX') && executable('tmux')
|
||||||
let s:copy['+'] = ['termux-clipboard-set']
|
let s:copy['+'] = 'tmux load-buffer -'
|
||||||
let s:paste['+'] = ['termux-clipboard-get']
|
let s:paste['+'] = 'tmux save-buffer -'
|
||||||
let s:copy['*'] = s:copy['+']
|
|
||||||
let s:paste['*'] = s:paste['+']
|
|
||||||
return 'termux-clipboard'
|
|
||||||
elseif !empty($TMUX) && executable('tmux')
|
|
||||||
let s:copy['+'] = ['tmux', 'load-buffer', '-']
|
|
||||||
let s:paste['+'] = ['tmux', 'save-buffer', '-']
|
|
||||||
let s:copy['*'] = s:copy['+']
|
let s:copy['*'] = s:copy['+']
|
||||||
let s:paste['*'] = s:paste['+']
|
let s:paste['*'] = s:paste['+']
|
||||||
return 'tmux'
|
return 'tmux'
|
||||||
@@ -156,16 +136,7 @@ function! s:clipboard.get(reg) abort
|
|||||||
elseif s:selections[a:reg].owner > 0
|
elseif s:selections[a:reg].owner > 0
|
||||||
return s:selections[a:reg].data
|
return s:selections[a:reg].data
|
||||||
end
|
end
|
||||||
|
return s:try_cmd(s:paste[a:reg])
|
||||||
let clipboard_data = s:try_cmd(s:paste[a:reg])
|
|
||||||
if match(&clipboard, '\v(unnamed|unnamedplus)') >= 0
|
|
||||||
\ && type(clipboard_data) == v:t_list
|
|
||||||
\ && get(s:selections[a:reg].data, 0, []) ==# clipboard_data
|
|
||||||
" When system clipboard return is same as our cache return the cache
|
|
||||||
" as it contains regtype information
|
|
||||||
return s:selections[a:reg].data
|
|
||||||
end
|
|
||||||
return clipboard_data
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:clipboard.set(lines, regtype, reg) abort
|
function! s:clipboard.set(lines, regtype, reg) abort
|
||||||
@@ -184,9 +155,6 @@ function! s:clipboard.set(lines, regtype, reg) abort
|
|||||||
|
|
||||||
if s:cache_enabled == 0
|
if s:cache_enabled == 0
|
||||||
call s:try_cmd(s:copy[a:reg], a:lines)
|
call s:try_cmd(s:copy[a:reg], a:lines)
|
||||||
"Cache it anyway we can compare it later to get regtype of the yank
|
|
||||||
let s:selections[a:reg] = copy(s:selection)
|
|
||||||
let s:selections[a:reg].data = [a:lines, a:regtype]
|
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -196,17 +164,14 @@ function! s:clipboard.set(lines, regtype, reg) abort
|
|||||||
let s:selections[a:reg] = copy(s:selection)
|
let s:selections[a:reg] = copy(s:selection)
|
||||||
let selection = s:selections[a:reg]
|
let selection = s:selections[a:reg]
|
||||||
let selection.data = [a:lines, a:regtype]
|
let selection.data = [a:lines, a:regtype]
|
||||||
let selection.argv = s:copy[a:reg]
|
let argv = split(s:copy[a:reg], " ")
|
||||||
|
let selection.argv = argv
|
||||||
let selection.detach = s:cache_enabled
|
let selection.detach = s:cache_enabled
|
||||||
let selection.cwd = "/"
|
let selection.cwd = "/"
|
||||||
let jobid = jobstart(selection.argv, selection)
|
let jobid = jobstart(argv, selection)
|
||||||
if jobid > 0
|
if jobid > 0
|
||||||
call jobsend(jobid, a:lines)
|
call jobsend(jobid, a:lines)
|
||||||
call jobclose(jobid, 'stdin')
|
call jobclose(jobid, 'stdin')
|
||||||
" xclip does not close stdout when receiving input via stdin
|
|
||||||
if selection.argv[0] ==# 'xclip'
|
|
||||||
call jobclose(jobid, 'stdout')
|
|
||||||
endif
|
|
||||||
let selection.owner = jobid
|
let selection.owner = jobid
|
||||||
let ret = 1
|
let ret = 1
|
||||||
else
|
else
|
||||||
|
@@ -48,15 +48,14 @@ function! provider#node#can_inspect() abort
|
|||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! provider#node#Detect() abort
|
function! provider#node#Detect() abort
|
||||||
let minver = [6, 0]
|
|
||||||
if exists('g:node_host_prog')
|
if exists('g:node_host_prog')
|
||||||
return [expand(g:node_host_prog, v:true), '']
|
return expand(g:node_host_prog)
|
||||||
endif
|
endif
|
||||||
if !executable('node')
|
if !executable('node')
|
||||||
return ['', 'node not found (or not executable)']
|
return ''
|
||||||
endif
|
endif
|
||||||
if !s:is_minimum_version(v:null, minver[0], minver[1])
|
if !s:is_minimum_version(v:null, 6, 0)
|
||||||
return ['', printf('node version %s.%s not found', minver[0], minver[1])]
|
return ''
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let npm_opts = {}
|
let npm_opts = {}
|
||||||
@@ -76,7 +75,7 @@ function! provider#node#Detect() abort
|
|||||||
if has('unix')
|
if has('unix')
|
||||||
let yarn_default_path = $HOME . '/.config/yarn/global/' . yarn_opts.entry_point
|
let yarn_default_path = $HOME . '/.config/yarn/global/' . yarn_opts.entry_point
|
||||||
if filereadable(yarn_default_path)
|
if filereadable(yarn_default_path)
|
||||||
return [yarn_default_path, '']
|
return yarn_default_path
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
let yarn_opts.job_id = jobstart('yarn global dir', yarn_opts)
|
let yarn_opts.job_id = jobstart('yarn global dir', yarn_opts)
|
||||||
@@ -86,18 +85,18 @@ function! provider#node#Detect() abort
|
|||||||
if !empty(npm_opts)
|
if !empty(npm_opts)
|
||||||
let result = jobwait([npm_opts.job_id])
|
let result = jobwait([npm_opts.job_id])
|
||||||
if result[0] == 0 && npm_opts.result != ''
|
if result[0] == 0 && npm_opts.result != ''
|
||||||
return [npm_opts.result, '']
|
return npm_opts.result
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if !empty(yarn_opts)
|
if !empty(yarn_opts)
|
||||||
let result = jobwait([yarn_opts.job_id])
|
let result = jobwait([yarn_opts.job_id])
|
||||||
if result[0] == 0 && yarn_opts.result != ''
|
if result[0] == 0 && yarn_opts.result != ''
|
||||||
return [yarn_opts.result, '']
|
return yarn_opts.result
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
return ['', 'failed to detect node']
|
return ''
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! provider#node#Prog() abort
|
function! provider#node#Prog() abort
|
||||||
@@ -143,7 +142,7 @@ endfunction
|
|||||||
|
|
||||||
|
|
||||||
let s:err = ''
|
let s:err = ''
|
||||||
let [s:prog, s:_] = provider#node#Detect()
|
let s:prog = provider#node#Detect()
|
||||||
let g:loaded_node_provider = empty(s:prog) ? 1 : 2
|
let g:loaded_node_provider = empty(s:prog) ? 1 : 2
|
||||||
|
|
||||||
if g:loaded_node_provider != 2
|
if g:loaded_node_provider != 2
|
||||||
|
@@ -1,83 +0,0 @@
|
|||||||
if exists('s:loaded_perl_provider')
|
|
||||||
finish
|
|
||||||
endif
|
|
||||||
|
|
||||||
let s:loaded_perl_provider = 1
|
|
||||||
|
|
||||||
function! provider#perl#Detect() abort
|
|
||||||
" use g:perl_host_prog if set or check if perl is on the path
|
|
||||||
let prog = exepath(get(g:, 'perl_host_prog', 'perl'))
|
|
||||||
if empty(prog)
|
|
||||||
return ['', '']
|
|
||||||
endif
|
|
||||||
|
|
||||||
" if perl is available, make sure we have 5.22+
|
|
||||||
call system([prog, '-e', 'use v5.22'])
|
|
||||||
if v:shell_error
|
|
||||||
return ['', 'Perl version is too old, 5.22+ required']
|
|
||||||
endif
|
|
||||||
|
|
||||||
" if perl is available, make sure the required module is available
|
|
||||||
call system([prog, '-W', '-MNeovim::Ext', '-e', ''])
|
|
||||||
if v:shell_error
|
|
||||||
return ['', '"Neovim::Ext" cpan module is not installed']
|
|
||||||
endif
|
|
||||||
|
|
||||||
return [prog, '']
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! provider#perl#Prog() abort
|
|
||||||
return s:prog
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! provider#perl#Require(host) abort
|
|
||||||
if s:err != ''
|
|
||||||
echoerr s:err
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
let prog = provider#perl#Prog()
|
|
||||||
let args = [s:prog, '-e', 'use Neovim::Ext; start_host();']
|
|
||||||
|
|
||||||
" Collect registered perl plugins into args
|
|
||||||
let perl_plugins = remote#host#PluginsForHost(a:host.name)
|
|
||||||
for plugin in perl_plugins
|
|
||||||
call add(args, plugin.path)
|
|
||||||
endfor
|
|
||||||
|
|
||||||
return provider#Poll(args, a:host.orig_name, '$NVIM_PERL_LOG_FILE')
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
function! provider#perl#Call(method, args) abort
|
|
||||||
if s:err != ''
|
|
||||||
echoerr s:err
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !exists('s:host')
|
|
||||||
try
|
|
||||||
let s:host = remote#host#Require('legacy-perl-provider')
|
|
||||||
catch
|
|
||||||
let s:err = v:exception
|
|
||||||
echohl WarningMsg
|
|
||||||
echomsg v:exception
|
|
||||||
echohl None
|
|
||||||
return
|
|
||||||
endtry
|
|
||||||
endif
|
|
||||||
return call('rpcrequest', insert(insert(a:args, 'perl_'.a:method), s:host))
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
let [s:prog, s:err] = provider#perl#Detect()
|
|
||||||
let g:loaded_perl_provider = empty(s:prog) ? 1 : 2
|
|
||||||
|
|
||||||
if g:loaded_perl_provider != 2
|
|
||||||
let s:err = 'Cannot find perl or the required perl module'
|
|
||||||
endif
|
|
||||||
|
|
||||||
|
|
||||||
" The perl provider plugin will run in a separate instance of the perl
|
|
||||||
" host.
|
|
||||||
call remote#host#RegisterClone('legacy-perl-provider', 'perl')
|
|
||||||
call remote#host#RegisterPlugin('legacy-perl-provider', 'ScriptHost.pm', [])
|
|
||||||
|
|
@@ -10,8 +10,7 @@ function! provider#pythonx#Require(host) abort
|
|||||||
|
|
||||||
" Python host arguments
|
" Python host arguments
|
||||||
let prog = (ver == '2' ? provider#python#Prog() : provider#python3#Prog())
|
let prog = (ver == '2' ? provider#python#Prog() : provider#python3#Prog())
|
||||||
let args = [prog, '-c', 'import sys; sys.path = list(filter(lambda x: x != "", sys.path)); import neovim; neovim.start_host()']
|
let args = [prog, '-c', 'import sys; sys.path.remove(""); import neovim; neovim.start_host()']
|
||||||
|
|
||||||
|
|
||||||
" Collect registered Python plugins into args
|
" Collect registered Python plugins into args
|
||||||
let python_plugins = remote#host#PluginsForHost(a:host.name)
|
let python_plugins = remote#host#PluginsForHost(a:host.name)
|
||||||
@@ -19,18 +18,18 @@ function! provider#pythonx#Require(host) abort
|
|||||||
call add(args, plugin.path)
|
call add(args, plugin.path)
|
||||||
endfor
|
endfor
|
||||||
|
|
||||||
return provider#Poll(args, a:host.orig_name, '$NVIM_PYTHON_LOG_FILE', {'overlapped': v:true})
|
return provider#Poll(args, a:host.orig_name, '$NVIM_PYTHON_LOG_FILE')
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:get_python_executable_from_host_var(major_version) abort
|
function! s:get_python_executable_from_host_var(major_version) abort
|
||||||
return expand(get(g:, 'python'.(a:major_version == 3 ? '3' : '').'_host_prog', ''), v:true)
|
return expand(get(g:, 'python'.(a:major_version == 3 ? '3' : '').'_host_prog', ''))
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:get_python_candidates(major_version) abort
|
function! s:get_python_candidates(major_version) abort
|
||||||
return {
|
return {
|
||||||
\ 2: ['python2', 'python2.7', 'python2.6', 'python'],
|
\ 2: ['python2', 'python2.7', 'python2.6', 'python'],
|
||||||
\ 3: ['python3', 'python3.10', 'python3.9', 'python3.8', 'python3.7',
|
\ 3: ['python3', 'python3.7', 'python3.6', 'python3.5', 'python3.4', 'python3.3',
|
||||||
\ 'python3.6', 'python']
|
\ 'python']
|
||||||
\ }[a:major_version]
|
\ }[a:major_version]
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
@@ -44,7 +43,7 @@ function! provider#pythonx#DetectByModule(module, major_version) abort
|
|||||||
let python_exe = s:get_python_executable_from_host_var(a:major_version)
|
let python_exe = s:get_python_executable_from_host_var(a:major_version)
|
||||||
|
|
||||||
if !empty(python_exe)
|
if !empty(python_exe)
|
||||||
return [exepath(expand(python_exe, v:true)), '']
|
return [python_exe, '']
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let candidates = s:get_python_candidates(a:major_version)
|
let candidates = s:get_python_candidates(a:major_version)
|
||||||
@@ -67,7 +66,7 @@ endfunction
|
|||||||
function! s:import_module(prog, module) abort
|
function! s:import_module(prog, module) abort
|
||||||
let prog_version = system([a:prog, '-c' , printf(
|
let prog_version = system([a:prog, '-c' , printf(
|
||||||
\ 'import sys; ' .
|
\ 'import sys; ' .
|
||||||
\ 'sys.path = list(filter(lambda x: x != "", sys.path)); ' .
|
\ 'sys.path.remove(""); ' .
|
||||||
\ 'sys.stdout.write(str(sys.version_info[0]) + "." + str(sys.version_info[1])); ' .
|
\ 'sys.stdout.write(str(sys.version_info[0]) + "." + str(sys.version_info[1])); ' .
|
||||||
\ 'import pkgutil; ' .
|
\ 'import pkgutil; ' .
|
||||||
\ 'exit(2*int(pkgutil.get_loader("%s") is None))',
|
\ 'exit(2*int(pkgutil.get_loader("%s") is None))',
|
||||||
@@ -96,7 +95,7 @@ function! provider#pythonx#CheckForModule(prog, module, major_version) abort
|
|||||||
if prog_version !~ '^' . a:major_version
|
if prog_version !~ '^' . a:major_version
|
||||||
return [0, prog_path . ' is Python ' . prog_version . ' and cannot provide Python '
|
return [0, prog_path . ' is Python ' . prog_version . ' and cannot provide Python '
|
||||||
\ . a:major_version . '.']
|
\ . a:major_version . '.']
|
||||||
elseif prog_version =~ '^' . a:major_version && str2nr(prog_version[2:]) < str2nr(min_version[2:])
|
elseif prog_version =~ '^' . a:major_version && prog_version < min_version
|
||||||
return [0, prog_path . ' is Python ' . prog_version . ' and cannot provide Python >= '
|
return [0, prog_path . ' is Python ' . prog_version . ' and cannot provide Python >= '
|
||||||
\ . min_version . '.']
|
\ . min_version . '.']
|
||||||
endif
|
endif
|
||||||
|
@@ -5,8 +5,7 @@ endif
|
|||||||
let g:loaded_ruby_provider = 1
|
let g:loaded_ruby_provider = 1
|
||||||
|
|
||||||
function! provider#ruby#Detect() abort
|
function! provider#ruby#Detect() abort
|
||||||
let e = empty(s:prog) ? 'missing ruby or ruby-host' : ''
|
return s:prog
|
||||||
return [s:prog, e]
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! provider#ruby#Prog() abort
|
function! provider#ruby#Prog() abort
|
||||||
@@ -46,7 +45,7 @@ endfunction
|
|||||||
|
|
||||||
function! s:detect()
|
function! s:detect()
|
||||||
if exists("g:ruby_host_prog")
|
if exists("g:ruby_host_prog")
|
||||||
return expand(g:ruby_host_prog, v:true)
|
return expand(g:ruby_host_prog)
|
||||||
elseif has('win32')
|
elseif has('win32')
|
||||||
return exepath('neovim-ruby-host.bat')
|
return exepath('neovim-ruby-host.bat')
|
||||||
else
|
else
|
||||||
|
@@ -1,8 +1,7 @@
|
|||||||
"python3complete.vim - Omni Completion for python
|
"python3complete.vim - Omni Completion for python
|
||||||
" Maintainer: <vacancy>
|
" Maintainer: Aaron Griffin <aaronmgriffin@gmail.com>
|
||||||
" Previous Maintainer: Aaron Griffin <aaronmgriffin@gmail.com>
|
|
||||||
" Version: 0.9
|
" Version: 0.9
|
||||||
" Last Updated: 2020 Oct 9
|
" Last Updated: 18 Jun 2009 (small fix 2015 Sep 14 from Debian)
|
||||||
"
|
"
|
||||||
" Roland Puntaier: this file contains adaptations for python3 and is parallel to pythoncomplete.vim
|
" Roland Puntaier: this file contains adaptations for python3 and is parallel to pythoncomplete.vim
|
||||||
"
|
"
|
||||||
@@ -84,7 +83,7 @@ function! python3complete#Complete(findstart, base)
|
|||||||
break
|
break
|
||||||
endif
|
endif
|
||||||
endwhile
|
endwhile
|
||||||
execute "py3 vimpy3complete('" . escape(cword, "'") . "', '" . escape(a:base, "'") . "')"
|
execute "py3 vimpy3complete('" . cword . "', '" . a:base . "')"
|
||||||
return g:python3complete_completions
|
return g:python3complete_completions
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
@@ -173,7 +172,7 @@ class Completer(object):
|
|||||||
pass
|
pass
|
||||||
if len(arg_text) == 0:
|
if len(arg_text) == 0:
|
||||||
# The doc string sometimes contains the function signature
|
# The doc string sometimes contains the function signature
|
||||||
# this works for a lot of C modules that are part of the
|
# this works for alot of C modules that are part of the
|
||||||
# standard library
|
# standard library
|
||||||
doc = func_obj.__doc__
|
doc = func_obj.__doc__
|
||||||
if doc:
|
if doc:
|
||||||
|
@@ -1,8 +1,7 @@
|
|||||||
"pythoncomplete.vim - Omni Completion for python
|
"pythoncomplete.vim - Omni Completion for python
|
||||||
" Maintainer: <vacancy>
|
" Maintainer: Aaron Griffin <aaronmgriffin@gmail.com>
|
||||||
" Previous Maintainer: Aaron Griffin <aaronmgriffin@gmail.com>
|
|
||||||
" Version: 0.9
|
" Version: 0.9
|
||||||
" Last Updated: 2020 Oct 9
|
" Last Updated: 18 Jun 2009
|
||||||
"
|
"
|
||||||
" Changes
|
" Changes
|
||||||
" TODO:
|
" TODO:
|
||||||
@@ -82,7 +81,7 @@ function! pythoncomplete#Complete(findstart, base)
|
|||||||
break
|
break
|
||||||
endif
|
endif
|
||||||
endwhile
|
endwhile
|
||||||
execute "python vimcomplete('" . escape(cword, "'") . "', '" . escape(a:base, "'") . "')"
|
execute "python vimcomplete('" . cword . "', '" . a:base . "')"
|
||||||
return g:pythoncomplete_completions
|
return g:pythoncomplete_completions
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
@@ -191,7 +190,7 @@ class Completer(object):
|
|||||||
pass
|
pass
|
||||||
if len(arg_text) == 0:
|
if len(arg_text) == 0:
|
||||||
# The doc string sometimes contains the function signature
|
# The doc string sometimes contains the function signature
|
||||||
# this works for a lot of C modules that are part of the
|
# this works for alot of C modules that are part of the
|
||||||
# standard library
|
# standard library
|
||||||
doc = func_obj.__doc__
|
doc = func_obj.__doc__
|
||||||
if doc:
|
if doc:
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user