mirror of
https://github.com/neovim/neovim.git
synced 2025-09-06 11:28:22 +00:00
Compare commits
31 Commits
release-0.
...
v0.4.3
Author | SHA1 | Date | |
---|---|---|---|
![]() |
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
|
||||
|
||||
image: openbsd/6.9
|
||||
image: openbsd/6.5
|
||||
|
||||
packages:
|
||||
- autoconf-2.71
|
||||
- automake-1.16.3
|
||||
- autoconf-2.69p2
|
||||
- automake-1.15.1
|
||||
- cmake
|
||||
- gettext-runtime-0.21p1
|
||||
- gettext-tools-0.21p1
|
||||
- gettext-0.19.8.1p3
|
||||
- gettext-tools-0.19.8.1
|
||||
- gmake
|
||||
- libtool
|
||||
- ninja-1.10.2p0
|
||||
- unzip-6.0p14
|
||||
- ninja-1.8.2p0
|
||||
- unzip-6.0p11
|
||||
|
||||
sources:
|
||||
- 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:
|
||||
- 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: |
|
||||
mkdir neovim/build
|
||||
cd neovim/build
|
||||
cmake -G Ninja $CMAKE_EXTRA_FLAGS ..
|
||||
cmake --build . --config RelWithDebInfo
|
||||
./bin/nvim --version
|
||||
- functionaltest: |
|
||||
cd neovim/build
|
||||
cmake --build . --config RelWithDebInfo --target functionaltest
|
||||
- oldtest: |
|
||||
export AUTOCONF_VERSION=2.69
|
||||
export AUTOMAKE_VERSION=1.15
|
||||
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
|
||||
|
@@ -1,6 +1,6 @@
|
||||
BasedOnStyle: Google
|
||||
Language: Cpp
|
||||
ColumnLimit: 100
|
||||
ColumnLimit: 80
|
||||
IndentWidth: 2
|
||||
TabWidth: 2
|
||||
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
|
||||
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
|
||||
open_collective: neovim
|
||||
custom: https://salt.bountysource.com/teams/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
|
||||
/venv/
|
||||
.ropeproject/
|
||||
compile_commands.json
|
||||
|
||||
# IDEs
|
||||
# Visual Studio
|
||||
/.vs/
|
||||
/.vscode/
|
||||
/.idea/
|
||||
|
||||
# Build/deps dir
|
||||
/build/
|
||||
/cmake-build-debug/
|
||||
/dist/
|
||||
/.deps/
|
||||
/tmp/
|
||||
/.clangd/
|
||||
/.cache/clangd/
|
||||
/.ccls-cache/
|
||||
|
||||
.DS_Store
|
||||
*.mo
|
||||
.*.sw?
|
||||
*~
|
||||
@@ -23,6 +18,8 @@ compile_commands.json
|
||||
*.o
|
||||
*.so
|
||||
|
||||
tags
|
||||
|
||||
/src/nvim/po/vim.pot
|
||||
/src/nvim/po/*.ck
|
||||
|
||||
@@ -30,14 +27,13 @@ compile_commands.json
|
||||
/.nvimlog
|
||||
|
||||
# Generated by scripts/vim-patch.sh
|
||||
/.vim-src
|
||||
*.rej
|
||||
/.vim-src/
|
||||
|
||||
# Generated by old (Vim) tests.
|
||||
/src/nvim/testdir/del
|
||||
/src/nvim/testdir/test*.out
|
||||
/src/nvim/testdir/test*.res
|
||||
/src/nvim/testdir/test*.log
|
||||
/src/nvim/testdir/test.log
|
||||
/src/nvim/testdir/messages
|
||||
/src/nvim/testdir/viminfo
|
||||
/src/nvim/testdir/test.ok
|
||||
@@ -46,7 +42,6 @@ compile_commands.json
|
||||
/src/nvim/testdir/valgrind.*
|
||||
/src/nvim/testdir/.gdbinit
|
||||
/runtime/indent/testdir/*.out
|
||||
+runtime/indent/testdir/*.fail
|
||||
# Generated by src/nvim/testdir/runnvim.sh.
|
||||
/src/nvim/testdir/*.tlog
|
||||
|
||||
@@ -59,15 +54,10 @@ compile_commands.json
|
||||
# local make targets
|
||||
local.mk
|
||||
|
||||
# Generated from :help docs
|
||||
tags
|
||||
# runtime/doc
|
||||
/runtime/doc/*.html
|
||||
/runtime/doc/tags.ref
|
||||
/runtime/doc/errors.log
|
||||
|
||||
# Generated by gen_vimdoc.py:
|
||||
/runtime/doc/*.mpack
|
||||
/tmp-*-doc
|
||||
|
||||
# vim patches
|
||||
/vim-*.patch
|
||||
# CLion
|
||||
/.idea/
|
||||
|
11
.luacheckrc
11
.luacheckrc
@@ -1,14 +1,7 @@
|
||||
-- vim: ft=lua tw=80
|
||||
|
||||
stds.nvim = {
|
||||
read_globals = { "jit" }
|
||||
}
|
||||
std = "lua51+nvim"
|
||||
|
||||
-- Ignore W211 (unused variable) with preload files.
|
||||
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.
|
||||
self = false
|
||||
@@ -25,7 +18,3 @@ ignore = {
|
||||
read_globals = {
|
||||
"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
|
125
.travis.yml
125
.travis.yml
@@ -1,23 +1,9 @@
|
||||
dist: bionic
|
||||
dist: xenial
|
||||
|
||||
language: c
|
||||
|
||||
env:
|
||||
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.
|
||||
- CACHE_ENABLE=true
|
||||
# Build directory for Neovim.
|
||||
@@ -31,13 +17,17 @@ env:
|
||||
# Nvim log file.
|
||||
- NVIM_LOG_FILE="$BUILD_DIR/.nvimlog"
|
||||
# Default CMake flags.
|
||||
- CMAKE_FLAGS="-DCI_BUILD=ON
|
||||
- CMAKE_FLAGS="-DTRAVIS_CI_BUILD=ON
|
||||
-DCMAKE_BUILD_TYPE=Debug
|
||||
-DCMAKE_INSTALL_PREFIX:PATH=$INSTALL_PREFIX
|
||||
-DBUSTED_OUTPUT_TYPE=nvim
|
||||
-DDEPS_PREFIX=$DEPS_BUILD_DIR/usr
|
||||
-DMIN_LOG_LEVEL=3"
|
||||
- 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.
|
||||
- ASAN_OPTIONS="detect_leaks=1:check_initialization_order=1:log_path=$LOG_DIR/asan"
|
||||
- TSAN_OPTIONS="log_path=$LOG_DIR/tsan"
|
||||
@@ -46,7 +36,7 @@ env:
|
||||
- VALGRIND_LOG="$LOG_DIR/valgrind-%p.log"
|
||||
- CACHE_NVIM_DEPS_DIR="$HOME/.cache/nvim-deps"
|
||||
# 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
|
||||
- FUNCTIONALTEST=functionaltest
|
||||
- CI_TARGET=tests
|
||||
@@ -54,7 +44,8 @@ env:
|
||||
- CCACHE_COMPRESS=1
|
||||
- CCACHE_SLOPPINESS=time_macros,file_macro
|
||||
- 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:
|
||||
envs: &common-job-env
|
||||
@@ -71,12 +62,12 @@ addons:
|
||||
- build-essential
|
||||
- clang
|
||||
- cmake
|
||||
- cpanminus
|
||||
- cscope
|
||||
- gcc-multilib
|
||||
- gdb
|
||||
- gperf
|
||||
- language-pack-tr
|
||||
- libc6-dev-i386
|
||||
- libtool-bin
|
||||
- locales
|
||||
- ninja-build
|
||||
@@ -85,17 +76,22 @@ addons:
|
||||
- valgrind
|
||||
- xclip
|
||||
homebrew:
|
||||
update: true
|
||||
casks:
|
||||
- powershell
|
||||
update: false
|
||||
packages:
|
||||
- ccache
|
||||
- cpanminus
|
||||
- ninja
|
||||
- perl
|
||||
|
||||
jobs:
|
||||
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)
|
||||
os: linux
|
||||
compiler: gcc-9
|
||||
@@ -103,19 +99,28 @@ jobs:
|
||||
- GCOV=gcov-9
|
||||
- CMAKE_FLAGS="$CMAKE_FLAGS -DUSE_GCOV=ON"
|
||||
- GCOV_ERROR_FILE="/tmp/libgcov-errors.log"
|
||||
- USE_LUACOV=1
|
||||
- BUSTED_ARGS="--coverage"
|
||||
- *common-job-env
|
||||
addons:
|
||||
snaps:
|
||||
- name: powershell
|
||||
confinement: classic
|
||||
apt:
|
||||
sources:
|
||||
- sourceline: 'ppa:ubuntu-toolchain-r/test'
|
||||
packages:
|
||||
- *common-apt-packages
|
||||
- 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
|
||||
os: linux
|
||||
compiler: gcc
|
||||
@@ -131,67 +136,15 @@ jobs:
|
||||
compiler: gcc
|
||||
env:
|
||||
- BUILD_32BIT=ON
|
||||
- CMAKE_FLAGS="$CMAKE_FLAGS -m32 -DCMAKE_TOOLCHAIN_FILE=$TRAVIS_BUILD_DIR/cmake/i386-linux-gnu.toolchain.cmake"
|
||||
- DEPS_CMAKE_FLAGS="$DEPS_CMAKE_FLAGS -m32 -DCMAKE_TOOLCHAIN_FILE=$TRAVIS_BUILD_DIR/cmake/i386-linux-gnu.toolchain.cmake"
|
||||
# Minimum required CMake.
|
||||
- CMAKE_URL=https://cmake.org/files/v2.8/cmake-2.8.12-Linux-i386.sh
|
||||
- *common-job-env
|
||||
- name: big-endian
|
||||
- name: clang-tsan
|
||||
os: linux
|
||||
arch: s390x
|
||||
compiler: gcc
|
||||
compiler: clang
|
||||
env:
|
||||
- FUNCTIONALTEST=functionaltest-lua
|
||||
- CMAKE_FLAGS="$CMAKE_FLAGS -DPREFER_LUA=ON"
|
||||
- DEPS_CMAKE_FLAGS="$DEPS_CMAKE_FLAGS -DUSE_BUNDLED_LUAJIT=OFF"
|
||||
- CLANG_SANITIZER=TSAN
|
||||
- *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
|
||||
|
||||
before_install: ci/before_install.sh
|
||||
|
@@ -1,4 +1,4 @@
|
||||
.DONE:
|
||||
@echo "Use GNU Make (gmake) to build neovim"
|
||||
@echo "Please use GNU Make (gmake) to build neovim"
|
||||
.DEFAULT:
|
||||
@echo "Use GNU Make (gmake) to build neovim"
|
||||
@echo "Please use GNU Make (gmake) to build neovim"
|
||||
|
149
CMakeLists.txt
149
CMakeLists.txt
@@ -2,17 +2,10 @@
|
||||
# intro: https://codingnest.com/basic-cmake/
|
||||
# best practices (3.0+): https://gist.github.com/mbinna/c61dbb39bca0e4fb7d1f73b0d66a4fd1
|
||||
|
||||
# Version should match the tested CMAKE_URL in .github/workflows/ci.yml.
|
||||
cmake_minimum_required(VERSION 3.10)
|
||||
# Version should match the tested CMAKE_URL in .travis.yml.
|
||||
cmake_minimum_required(VERSION 2.8.12)
|
||||
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
|
||||
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.
|
||||
if(DEFINED ENV{DEPS_BUILD_DIR})
|
||||
if(CMAKE_SYSTEM_NAME MATCHES "OpenBSD")
|
||||
# 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()
|
||||
if(CMAKE_SYSTEM_NAME MATCHES "OpenBSD")
|
||||
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,
|
||||
# build bundled dependencies automatically.
|
||||
if(NOT EXISTS ${DEPS_PREFIX}
|
||||
@@ -97,8 +76,6 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
|
||||
endif()
|
||||
|
||||
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.
|
||||
set(USE_FNAME_CASE TRUE)
|
||||
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
|
||||
# version string, else they are combined with the result of `git describe`.
|
||||
set(NVIM_VERSION_MAJOR 0)
|
||||
set(NVIM_VERSION_MINOR 6)
|
||||
set(NVIM_VERSION_PATCH 2)
|
||||
set(NVIM_VERSION_PRERELEASE "-dev") # for package maintainers
|
||||
set(NVIM_VERSION_MINOR 4)
|
||||
set(NVIM_VERSION_PATCH 3)
|
||||
set(NVIM_VERSION_PRERELEASE "") # for package maintainers
|
||||
|
||||
# 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_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}")
|
||||
# NVIM_VERSION_CFLAGS set further below.
|
||||
|
||||
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)
|
||||
if("${MIN_LOG_LEVEL}" MATCHES "^$")
|
||||
# Minimize logging for release-type builds.
|
||||
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()
|
||||
if(NOT MIN_LOG_LEVEL MATCHES "^[0-3]$")
|
||||
message(FATAL_ERROR "invalid MIN_LOG_LEVEL: " ${MIN_LOG_LEVEL})
|
||||
@@ -283,8 +275,8 @@ else()
|
||||
-Wstrict-prototypes -std=gnu99 -Wshadow -Wconversion
|
||||
-Wmissing-prototypes)
|
||||
|
||||
check_c_compiler_flag(-Wimplicit-fallthrough HAVE_WIMPLICIT_FALLTHROUGH_FLAG)
|
||||
if(HAVE_WIMPLICIT_FALLTHROUGH_FLAG)
|
||||
check_c_compiler_flag(-Wimplicit-fallthrough HAS_WIMPLICIT_FALLTHROUGH_FLAG)
|
||||
if(HAS_WIMPLICIT_FALLTHROUGH_FLAG)
|
||||
add_compile_options(-Wimplicit-fallthrough)
|
||||
endif()
|
||||
|
||||
@@ -317,18 +309,11 @@ if(UNIX)
|
||||
|
||||
if(HAS_FSTACK_PROTECTOR_STRONG_FLAG)
|
||||
add_compile_options(-fstack-protector-strong)
|
||||
link_libraries(-fstack-protector-strong)
|
||||
elseif(HAS_FSTACK_PROTECTOR_FLAG)
|
||||
add_compile_options(-fstack-protector --param ssp-buffer-size=4)
|
||||
link_libraries(-fstack-protector --param ssp-buffer-size=4)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
check_c_compiler_flag(-fno-common HAVE_FNO_COMMON)
|
||||
if (HAVE_FNO_COMMON)
|
||||
add_compile_options(-fno-common)
|
||||
endif()
|
||||
|
||||
check_c_compiler_flag(-fdiagnostics-color=auto HAS_DIAG_COLOR_FLAG)
|
||||
if(HAS_DIAG_COLOR_FLAG)
|
||||
if(CMAKE_GENERATOR MATCHES "Ninja")
|
||||
@@ -338,10 +323,10 @@ if(HAS_DIAG_COLOR_FLAG)
|
||||
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)
|
||||
message(STATUS "CI build enabled")
|
||||
if(TRAVIS_CI_BUILD)
|
||||
message(STATUS "Travis/QuickBuild CI build enabled")
|
||||
add_compile_options(-Werror)
|
||||
if(DEFINED ENV{BUILD_32BIT})
|
||||
# Get some test coverage for unsigned char
|
||||
@@ -368,8 +353,8 @@ if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
|
||||
add_definitions(-D_GNU_SOURCE)
|
||||
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")
|
||||
# Required for luajit < 2.1.0-beta3.
|
||||
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||
# Required for luajit.
|
||||
set(CMAKE_EXE_LINKER_FLAGS
|
||||
"${CMAKE_EXE_LINKER_FLAGS} -pagezero_size 10000 -image_base 100000000")
|
||||
set(CMAKE_SHARED_LINKER_FLAGS
|
||||
@@ -390,25 +375,6 @@ include_directories(SYSTEM ${MSGPACK_INCLUDE_DIRS})
|
||||
find_package(LibLUV 1.30.0 REQUIRED)
|
||||
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.
|
||||
option(PREFER_LUA "Prefer Lua over LuaJIT in the nvim executable." OFF)
|
||||
|
||||
@@ -488,17 +454,17 @@ if((CLANG_ASAN_UBSAN OR CLANG_MSAN OR CLANG_TSAN) AND NOT CMAKE_C_COMPILER_ID MA
|
||||
message(FATAL_ERROR "Sanitizers are only supported for Clang")
|
||||
endif()
|
||||
|
||||
if(ENABLE_LIBICONV)
|
||||
find_package(Iconv REQUIRED)
|
||||
include_directories(SYSTEM ${Iconv_INCLUDE_DIRS})
|
||||
endif()
|
||||
|
||||
if(ENABLE_LIBINTL)
|
||||
# LibIntl (not Intl) selects our FindLibIntl.cmake script. #8464
|
||||
find_package(LibIntl REQUIRED)
|
||||
include_directories(SYSTEM ${LibIntl_INCLUDE_DIRS})
|
||||
endif()
|
||||
|
||||
if(ENABLE_LIBICONV)
|
||||
find_package(Iconv REQUIRED)
|
||||
include_directories(SYSTEM ${Iconv_INCLUDE_DIRS})
|
||||
endif()
|
||||
|
||||
# Determine platform's threading library. Set CMAKE_THREAD_PREFER_PTHREAD
|
||||
# explicitly to indicate a strong preference for pthread.
|
||||
set(CMAKE_THREAD_PREFER_PTHREAD ON)
|
||||
@@ -520,19 +486,18 @@ include(LuaHelpers)
|
||||
set(LUA_DEPENDENCIES lpeg mpack bit)
|
||||
if(NOT LUA_PRG)
|
||||
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)
|
||||
find_program(_CHECK_LUA_PRG ${CURRENT_LUA_PRG})
|
||||
find_program(LUA_PRG ${CURRENT_LUA_PRG})
|
||||
|
||||
if(_CHECK_LUA_PRG)
|
||||
check_lua_deps(${_CHECK_LUA_PRG} "${LUA_DEPENDENCIES}" LUA_PRG_WORKS)
|
||||
if(LUA_PRG)
|
||||
check_lua_deps(${LUA_PRG} "${LUA_DEPENDENCIES}" LUA_PRG_WORKS)
|
||||
if(LUA_PRG_WORKS)
|
||||
set(LUA_PRG "${_CHECK_LUA_PRG}" CACHE FILEPATH "Path to a program.")
|
||||
break()
|
||||
endif()
|
||||
endif()
|
||||
endforeach()
|
||||
unset(_CHECK_LUA_PRG CACHE)
|
||||
else()
|
||||
check_lua_deps(${LUA_PRG} "${LUA_DEPENDENCIES}" LUA_PRG_WORKS)
|
||||
endif()
|
||||
@@ -590,10 +555,15 @@ if(BUSTED_PRG)
|
||||
# console pool: to do so we need to use the USES_TERMINAL
|
||||
# option, but this is only available in CMake 3.2
|
||||
set(TEST_TARGET_ARGS)
|
||||
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(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)
|
||||
|
||||
# Useful for automated build systems, if they want to manually run the tests.
|
||||
@@ -689,7 +659,7 @@ endif()
|
||||
|
||||
if(LUACHECK_PRG)
|
||||
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})
|
||||
else()
|
||||
add_custom_target(lualint false
|
||||
@@ -707,14 +677,3 @@ set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
|
||||
set(CPACK_NSIS_MODIFY_PATH ON)
|
||||
set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
|
||||
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()
|
||||
|
151
CONTRIBUTING.md
151
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:
|
||||
|
||||
- [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
|
||||
[Coverity](#coverity).
|
||||
- [Improve documentation][wiki-contribute-help]
|
||||
|
||||
Reporting problems
|
||||
------------------
|
||||
@@ -19,21 +18,19 @@ Reporting problems
|
||||
- [Check the FAQ][wiki-faq].
|
||||
- [Search existing issues][github-issues] (including closed!)
|
||||
- Update Neovim to the latest version to see if your problem persists.
|
||||
- Try to reproduce with `nvim --clean` ("factory defaults").
|
||||
- [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.
|
||||
- Disable plugins incrementally, to narrow down the cause of the issue.
|
||||
- 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.
|
||||
- Check the logs. `:edit $NVIM_LOG_FILE`
|
||||
- [Bisect][git-bisect] to the cause of a regression, if you are able. This is _extremely_ helpful.
|
||||
- Check `$NVIM_LOG_FILE`, if it exists.
|
||||
- Include `cmake --system-information` for build-related issues.
|
||||
|
||||
Developer guidelines
|
||||
--------------------
|
||||
|
||||
- Read `:help dev` if you are working on Nvim core.
|
||||
- Read `:help dev-ui` if you are developing a UI.
|
||||
- Read `:help dev-api-client` if you are developing an API client.
|
||||
- Install `ninja` for faster builds of Nvim.
|
||||
- Nvim contributors should read `:help dev`.
|
||||
- External UI developers should read `:help dev-ui`.
|
||||
- API client developers should read `:help dev-api-client`.
|
||||
- Nvim developers are _strongly encouraged_ to install `ninja` for faster builds.
|
||||
```
|
||||
sudo apt-get install ninja-build
|
||||
make distclean
|
||||
@@ -43,8 +40,8 @@ Developer guidelines
|
||||
Pull requests (PRs)
|
||||
---------------------
|
||||
|
||||
- To avoid duplicate work, create a draft pull request.
|
||||
- Your PR must include [test coverage][run-tests].
|
||||
- To avoid duplicate work, create a `[WIP]` pull request as soon as possible.
|
||||
- Your PR must include **test coverage.** See [test/README.md][run-tests].
|
||||
- Avoid cosmetic changes to unrelated files in the same commit.
|
||||
- Use a [feature branch][git-feature-branch] instead of the master branch.
|
||||
- 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
|
||||
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
|
||||
you are still working on the PR.
|
||||
- You can skip this if your PR is ready for review.
|
||||
2. [Change your PR to ready][pr-ready] when the PR is ready for review.
|
||||
- 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.
|
||||
- `[RFC]` is assumed by default, i.e. you are requesting a review.
|
||||
- Add `[WIP]` to the PR title if you are _not_ requesting feedback and the work
|
||||
is still in flux.
|
||||
- Add `[RDY]` if you are _done_ and only waiting on merge.
|
||||
|
||||
### Commit messages
|
||||
|
||||
Follow the [conventional commits guidelines][conventional_commits] to *make reviews easier* and to make
|
||||
the VCS/git logs more valuable. The general structure of a commit message is:
|
||||
Follow [commit message hygiene][hygiene] to *make reviews easier* and to make
|
||||
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.
|
||||
- A blank line must follow the subject.
|
||||
- Breaking API changes must be indicated by
|
||||
1. "!" after the type/scope, and
|
||||
2. a "BREAKING CHANGE" footer describing the change.
|
||||
Example:
|
||||
```
|
||||
refactor(provider)!: drop support for Python 2
|
||||
|
||||
BREAKING CHANGE: refactor to use Python 3 features since Python 2 is no longer supported.
|
||||
```
|
||||
- **Prefix the commit subject with a _scope_:** `doc:`, `test:`, `foo.c:`,
|
||||
`runtime:`, ...
|
||||
- Subject line for commits with only style/lint changes can be a single
|
||||
word: `style` or `lint`.
|
||||
- A blank line must separate the subject from the description.
|
||||
- Use the _imperative voice_: "Fix bug" rather than "Fixed bug" or "Fixes bug."
|
||||
|
||||
### 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
|
||||
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
|
||||
neighbors_, to encourage incrementally updating the legacy style to meet our
|
||||
[style](#style). (See [#3174][3174] for background.)
|
||||
- CI for freebsd and openbsd runs on [sourcehut].
|
||||
- To get a backtrace on freebsd (after connecting via ssh):
|
||||
```sh
|
||||
sudo pkg install tmux # If you want tmux.
|
||||
lldb build/bin/nvim -c nvim.core
|
||||
|
||||
# To get a full backtrace:
|
||||
# 1. Rebuild with debug info.
|
||||
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
|
||||
- [How to investigate QuickBuild failures](https://github.com/neovim/neovim/pull/4718#issuecomment-217631350)
|
||||
- QuickBuild uses this invocation:
|
||||
```
|
||||
mkdir -p build/${params.get("buildType")} \
|
||||
&& cd build/${params.get("buildType")} \
|
||||
&& cmake -G "Unix Makefiles" -DBUSTED_OUTPUT_TYPE=TAP -DCMAKE_BUILD_TYPE=${params.get("buildType")}
|
||||
-DTRAVIS_CI_BUILD=ON ../.. && ${node.getAttribute("make", "make")}
|
||||
VERBOSE=1 nvim unittest-prereqs functionaltest-prereqs
|
||||
```
|
||||
|
||||
### 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)):
|
||||
```
|
||||
fix(PVS/V{id}): {description}
|
||||
PVS/V{id}: {description}
|
||||
```
|
||||
- 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);
|
||||
([example](https://github.com/neovim/neovim/pull/804))):
|
||||
```
|
||||
fix(coverity/{id}): {description}
|
||||
coverity/{id}: {description}
|
||||
```
|
||||
- Search the Neovim commit history to find examples:
|
||||
```
|
||||
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
|
||||
------
|
||||
@@ -218,28 +174,16 @@ You can lint a single file (but this will _not_ exclude legacy errors):
|
||||
|
||||
### Style
|
||||
|
||||
- Style rules are (mostly) defined by `src/uncrustify.cfg` which tries to match
|
||||
the [style-guide]. To use the Nvim `gq` command with `uncrustify`:
|
||||
```
|
||||
if !empty(findfile('src/uncrustify.cfg', ';'))
|
||||
setlocal formatprg=uncrustify\ -q\ -l\ C\ -c\ src/uncrustify.cfg\ --no-backup
|
||||
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`:
|
||||
```
|
||||
The repo includes a `.clang-format` config file which (mostly) matches the
|
||||
[style-guide]. You can use `clang-format` to format code with the `gq`
|
||||
operator in Nvim:
|
||||
|
||||
if !empty(findfile('.clang-format', ';'))
|
||||
setlocal formatprg=clang-format\ -style=file
|
||||
endif
|
||||
```
|
||||
|
||||
### 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).**
|
||||
("Exuberant ctags", the typical `ctags` binary provided by your distro, is
|
||||
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
|
||||
[1820]: https://github.com/neovim/neovim/pull/1820
|
||||
[hub]: https://hub.github.com/
|
||||
[conventional_commits]: https://www.conventionalcommits.org
|
||||
[style-guide]: https://neovim.io/doc/user/dev_style.html#dev-style
|
||||
[hygiene]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
|
||||
[style-guide]: http://neovim.io/develop/style-guide.xml
|
||||
[ASan]: http://clang.llvm.org/docs/AddressSanitizer.html
|
||||
[run-tests]: https://github.com/neovim/neovim/blob/master/test/README.md#running-tests
|
||||
[wiki-faq]: https://github.com/neovim/neovim/wiki/FAQ
|
||||
[review-checklist]: https://github.com/neovim/neovim/wiki/Code-review-checklist
|
||||
[3174]: https://github.com/neovim/neovim/issues/3174
|
||||
[sourcehut]: https://builds.sr.ht/~jmk
|
||||
[GitHub Actions]: https://github.com/neovim/neovim/actions
|
||||
[Travis CI]: https://travis-ci.org/neovim/neovim
|
||||
[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
|
||||
[Clang report]: https://neovim.io/doc/reports/clang/
|
||||
[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
|
||||
[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:
|
||||
|
||||
- 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.
|
||||
- libvterm: MIT license
|
||||
- lua-compat: MIT license
|
||||
- tree-sitter: MIT license
|
||||
- xdiff: LGPL license
|
||||
- lua-cjson: MIT license
|
||||
- LuaJIT: a Just-In-Time Compiler for Lua. Copyright Mike Pall. MIT license.
|
||||
|
||||
====
|
||||
|
||||
|
43
MAINTAIN.md
43
MAINTAIN.md
@@ -10,13 +10,14 @@ General guidelines
|
||||
* Write down what was decided
|
||||
* Constraints are good
|
||||
* Use automation to solve problems
|
||||
* Never break the API... but sometimes break the UI
|
||||
* Never break the API
|
||||
|
||||
Ticket triage
|
||||
-------------
|
||||
|
||||
In practice we haven't found a way to forecast more precisely than "next" and
|
||||
"after next". So there are usually one or two (at most) planned milestones:
|
||||
In practice we haven't found a meaningful way to forecast more precisely than
|
||||
"next" and "after next". That means there are usually one or two (at most)
|
||||
planned milestones:
|
||||
|
||||
- Next bugfix-release (1.0.x)
|
||||
- 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
|
||||
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
|
||||
for having a plan written down: it is _closer to completion_ than tickets
|
||||
without a plan.
|
||||
- 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
|
||||
can review open issues, but chances are your next milestone is already getting
|
||||
full... :)
|
||||
full :)
|
||||
|
||||
Release policy
|
||||
--------------
|
||||
@@ -55,36 +56,6 @@ has a major bug:
|
||||
- The [nightly job](https://github.com/neovim/bot-ci/blob/master/ci/nightly.sh)
|
||||
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
|
||||
--------
|
||||
|
||||
|
101
Makefile
101
Makefile
@@ -1,6 +1,4 @@
|
||||
MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST)))
|
||||
MAKEFILE_DIR := $(dir $(MAKEFILE_PATH))
|
||||
|
||||
THIS_DIR = $(shell pwd)
|
||||
filter-false = $(strip $(filter-out 0 off OFF false FALSE,$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)
|
||||
# Extra CMake flags which extend the default set
|
||||
CMAKE_EXTRA_FLAGS ?=
|
||||
NVIM_PRG := $(MAKEFILE_DIR)/build/bin/nvim
|
||||
|
||||
# CMAKE_INSTALL_PREFIX
|
||||
# - May be passed directly or as part of CMAKE_EXTRA_FLAGS.
|
||||
@@ -38,7 +35,7 @@ else
|
||||
checkprefix: ;
|
||||
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")
|
||||
DEPS_BUILD_DIR ?= .deps
|
||||
ifneq (1,$(words [$(DEPS_BUILD_DIR)]))
|
||||
@@ -46,28 +43,25 @@ ifneq (1,$(words [$(DEPS_BUILD_DIR)]))
|
||||
endif
|
||||
|
||||
ifeq (,$(BUILD_TOOL))
|
||||
ifeq (Ninja,$(CMAKE_GENERATOR))
|
||||
ifeq (Ninja,$(BUILD_TYPE))
|
||||
ifneq ($(shell $(CMAKE_PRG) --help 2>/dev/null | grep Ninja),)
|
||||
BUILD_TOOL = ninja
|
||||
BUILD_TOOL := ninja
|
||||
else
|
||||
# User's version of CMake doesn't support Ninja
|
||||
BUILD_TOOL = $(MAKE)
|
||||
CMAKE_GENERATOR := Unix Makefiles
|
||||
BUILD_TYPE := Unix Makefiles
|
||||
endif
|
||||
else
|
||||
BUILD_TOOL = $(MAKE)
|
||||
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.
|
||||
ifeq ($(CMAKE_GENERATOR),Ninja)
|
||||
ifneq ($(VERBOSE),)
|
||||
BUILD_TOOL += -v
|
||||
endif
|
||||
BUILD_TOOL += $(shell printf '%s' '$(MAKEFLAGS)' | grep -o -- ' *-[jl][0-9]\+ *')
|
||||
ifeq (n,$(findstring n,$(firstword -$(MAKEFLAGS))))
|
||||
BUILD_TOOL += -n
|
||||
# Only need to handle Ninja here. Make will inherit the VERBOSE variable.
|
||||
ifeq ($(BUILD_TYPE),Ninja)
|
||||
BUILD_CMD += -v
|
||||
endif
|
||||
endif
|
||||
|
||||
@@ -89,22 +83,22 @@ endif
|
||||
SINGLE_MAKE = export MAKEFLAGS= ; $(MAKE)
|
||||
|
||||
nvim: build/.ran-cmake deps
|
||||
+$(BUILD_TOOL) -C build
|
||||
+$(BUILD_CMD) -C build
|
||||
|
||||
libnvim: build/.ran-cmake deps
|
||||
+$(BUILD_TOOL) -C build libnvim
|
||||
+$(BUILD_CMD) -C build libnvim
|
||||
|
||||
cmake:
|
||||
touch CMakeLists.txt
|
||||
$(MAKE) build/.ran-cmake
|
||||
|
||||
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 $@
|
||||
|
||||
deps: | build/.ran-third-party-cmake
|
||||
ifeq ($(call filter-true,$(USE_BUNDLED)),)
|
||||
+$(BUILD_TOOL) -C $(DEPS_BUILD_DIR)
|
||||
+$(BUILD_CMD) -C $(DEPS_BUILD_DIR)
|
||||
endif
|
||||
|
||||
ifeq ($(call filter-true,$(USE_BUNDLED)),)
|
||||
@@ -112,8 +106,8 @@ $(DEPS_BUILD_DIR):
|
||||
mkdir -p "$@"
|
||||
build/.ran-third-party-cmake:: $(DEPS_BUILD_DIR)
|
||||
cd $(DEPS_BUILD_DIR) && \
|
||||
$(CMAKE_PRG) -G '$(CMAKE_GENERATOR)' $(BUNDLED_CMAKE_FLAG) $(BUNDLED_LUA_CMAKE_FLAG) \
|
||||
$(DEPS_CMAKE_FLAGS) $(MAKEFILE_DIR)/third-party
|
||||
$(CMAKE_PRG) -G '$(BUILD_TYPE)' $(BUNDLED_CMAKE_FLAG) $(BUNDLED_LUA_CMAKE_FLAG) \
|
||||
$(DEPS_CMAKE_FLAGS) $(THIS_DIR)/third-party
|
||||
endif
|
||||
build/.ran-third-party-cmake::
|
||||
mkdir -p build
|
||||
@@ -123,39 +117,26 @@ build/.ran-third-party-cmake::
|
||||
oldtest: | nvim build/runtime/doc/tags
|
||||
+$(SINGLE_MAKE) -C src/nvim/testdir clean
|
||||
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
|
||||
@# Handle TEST_FILE=test_foo{,.res,.vim}.
|
||||
+$(SINGLE_MAKE) -C src/nvim/testdir NVIM_PRG=$(NVIM_PRG) SCRIPTS= $(MAKEOVERRIDES) $(patsubst %.vim,%,$(patsubst %.res,%,$(TEST_FILE)))
|
||||
+$(SINGLE_MAKE) -C src/nvim/testdir NVIM_PRG="$(realpath build/bin/nvim)" NEW_TESTS=$(TEST_FILE) SCRIPTS= $(MAKEOVERRIDES)
|
||||
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_TOOL) -C build runtime/doc/tags
|
||||
+$(BUILD_CMD) -C build runtime/doc/tags
|
||||
|
||||
# Builds help HTML _and_ checks for invalid help tags.
|
||||
helphtml: | nvim build/runtime/doc/tags
|
||||
+$(BUILD_TOOL) -C build doc_html
|
||||
+$(BUILD_CMD) -C build doc_html
|
||||
|
||||
functionaltest: | nvim
|
||||
+$(BUILD_TOOL) -C build functionaltest
|
||||
+$(BUILD_CMD) -C build functionaltest
|
||||
|
||||
functionaltest-lua: | nvim
|
||||
+$(BUILD_TOOL) -C build functionaltest-lua
|
||||
+$(BUILD_CMD) -C build functionaltest-lua
|
||||
|
||||
lualint: | build/.ran-cmake deps
|
||||
$(BUILD_TOOL) -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)"
|
||||
$(BUILD_CMD) -C build lualint
|
||||
|
||||
pylint:
|
||||
flake8 contrib/ scripts/ src/ test/
|
||||
@@ -165,45 +146,37 @@ _opt_pylint:
|
||||
@command -v flake8 && { $(MAKE) pylint; exit $$?; } \
|
||||
|| 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
|
||||
+$(BUILD_TOOL) -C build unittest
|
||||
+$(BUILD_CMD) -C build unittest
|
||||
|
||||
benchmark: | nvim
|
||||
+$(BUILD_TOOL) -C build benchmark
|
||||
+$(BUILD_CMD) -C build benchmark
|
||||
|
||||
test: functionaltest unittest
|
||||
|
||||
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 runtime/doc clean
|
||||
$(MAKE) -C runtime/indent clean
|
||||
|
||||
distclean:
|
||||
rm -rf $(DEPS_BUILD_DIR) build
|
||||
$(MAKE) clean
|
||||
|
||||
install: checkprefix nvim
|
||||
+$(BUILD_TOOL) -C build install
|
||||
+$(BUILD_CMD) -C build install
|
||||
|
||||
clint: build/.ran-cmake
|
||||
+$(BUILD_TOOL) -C build clint
|
||||
+$(BUILD_CMD) -C build clint
|
||||
|
||||
clint-full: build/.ran-cmake
|
||||
+$(BUILD_TOOL) -C build clint-full
|
||||
+$(BUILD_CMD) -C build clint-full
|
||||
|
||||
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
|
||||
+$(BUILD_TOOL) -C build generated-sources
|
||||
+$(BUILD_CMD) -C build generated-sources
|
||||
|
||||
appimage:
|
||||
bash scripts/genappimage.sh
|
||||
@@ -214,16 +187,16 @@ appimage:
|
||||
appimage-%:
|
||||
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.
|
||||
# Does not work with "Unix Makefiles".
|
||||
ifeq ($(CMAKE_GENERATOR),Ninja)
|
||||
build/%: phony_force
|
||||
$(BUILD_TOOL) -C build $(patsubst build/%,%,$@)
|
||||
ifeq ($(BUILD_TYPE),Ninja)
|
||||
build/%:
|
||||
$(BUILD_CMD) -C build $(patsubst build/%,%,$@)
|
||||
|
||||
$(DEPS_BUILD_DIR)/%: phony_force
|
||||
$(BUILD_TOOL) -C $(DEPS_BUILD_DIR) $(patsubst $(DEPS_BUILD_DIR)/%,%,$@)
|
||||
$(DEPS_BUILD_DIR)/%:
|
||||
$(BUILD_CMD) -C $(DEPS_BUILD_DIR) $(patsubst $(DEPS_BUILD_DIR)/%,%,$@)
|
||||
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)
|
||||
|
||||
[Documentation](https://neovim.io/doc/general/) |
|
||||
[Chat](https://app.element.io/#/room/#neovim:matrix.org) |
|
||||
[Wiki](https://github.com/neovim/neovim/wiki) |
|
||||
[Documentation](https://neovim.io/doc) |
|
||||
[Chat/Discussion](https://gitter.im/neovim/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://scan.coverity.com/projects/2227)
|
||||
[](https://neovim.io/doc/reports/clang)
|
||||
@@ -13,7 +15,6 @@
|
||||
[](https://repology.org/metapackage/neovim)
|
||||
[](https://buildd.debian.org/neovim)
|
||||
[](https://github.com/neovim/neovim/releases/)
|
||||
[](https://snapcraft.io/nvim)
|
||||
|
||||
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
|
||||
[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
|
||||
-------------------
|
||||
|
||||
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.
|
||||
After installing the dependencies, run the following command.
|
||||
|
||||
make CMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
sudo make install
|
||||
@@ -64,12 +63,29 @@ To install to a non-default location:
|
||||
make CMAKE_INSTALL_PREFIX=/full/path/
|
||||
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.
|
||||
- `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.
|
||||
|
||||
See the [Building Neovim](https://github.com/neovim/neovim/wiki/Building-Neovim) wiki page for details.
|
||||
|
||||
Transitioning from Vim
|
||||
--------------------
|
||||
|
||||
@@ -97,9 +113,17 @@ Project layout
|
||||
License
|
||||
-------
|
||||
|
||||
Neovim contributions since [b17d96][license-commit] are licensed under the
|
||||
Apache 2.0 license, except for contributions copied from Vim (identified by the
|
||||
`vim-patch` token). See LICENSE for details.
|
||||
Neovim is licensed under the terms of the Apache 2.0 license, except for
|
||||
parts that were contributed under the Vim license.
|
||||
|
||||
- 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
|
||||
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
|
||||
[Fedora]: https://apps.fedoraproject.org/packages/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
|
||||
[Homebrew]: https://formulae.brew.sh/formula/neovim
|
||||
|
||||
<!-- 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 -o pipefail
|
||||
|
||||
if [[ "${CI_TARGET}" == lint ]]; then
|
||||
exit
|
||||
fi
|
||||
|
||||
echo 'Python info:'
|
||||
(
|
||||
set -x
|
||||
@@ -22,7 +26,7 @@ if [[ "${TRAVIS_OS_NAME}" != osx ]] && command -v pyenv; then
|
||||
echo 'Setting Python versions via pyenv'
|
||||
|
||||
# Prefer Python 2 over 3 (more conservative).
|
||||
pyenv global 2.7:3.8
|
||||
pyenv global 2.7.15:3.7
|
||||
|
||||
echo 'Updated Python info:'
|
||||
(
|
||||
@@ -43,4 +47,18 @@ if [[ "${TRAVIS_OS_NAME}" == osx ]] || [ ! -f ~/.nvm/nvm.sh ]; then
|
||||
fi
|
||||
|
||||
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 -o pipefail
|
||||
|
||||
if [[ "${CI_TARGET}" == lint ]]; then
|
||||
exit
|
||||
fi
|
||||
|
||||
CI_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
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.
|
||||
if [[ -n "${GCOV}" ]] && [[ ! $(type -P "${GCOV}") ]]; then
|
||||
echo "\$GCOV: '${GCOV}' is not executable."
|
||||
@@ -37,10 +35,5 @@ fi
|
||||
# Compile dependencies.
|
||||
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}"
|
||||
mkdir -p "${LOG_DIR}"
|
||||
|
70
ci/build.ps1
70
ci/build.ps1
@@ -1,11 +1,10 @@
|
||||
param([switch]$NoTests)
|
||||
Set-StrictMode -Version Latest
|
||||
$ErrorActionPreference = 'Stop'
|
||||
$ProgressPreference = 'SilentlyContinue'
|
||||
$ErrorActionPreference = 'stop'
|
||||
Set-PSDebug -Strict -Trace 1
|
||||
|
||||
$isPullRequest = ($env:APPVEYOR_PULL_REQUEST_HEAD_COMMIT -ne $null)
|
||||
$env:CONFIGURATION -match '^(?<compiler>\w+)_(?<bits>32|64)(?:-(?<option>\w+))?$'
|
||||
$compiler = $Matches.compiler
|
||||
$compileOption = if ($Matches -contains 'option') {$Matches.option} else {''}
|
||||
$compileOption = $Matches.option
|
||||
$bits = $Matches.bits
|
||||
$cmakeBuildType = $(if ($env:CMAKE_BUILD_TYPE -ne $null) {$env:CMAKE_BUILD_TYPE} else {'RelWithDebInfo'});
|
||||
$buildDir = [System.IO.Path]::GetFullPath("$(pwd)")
|
||||
@@ -24,15 +23,11 @@ $uploadToCodeCov = $false
|
||||
|
||||
function exitIfFailed() {
|
||||
if ($LastExitCode -ne 0) {
|
||||
Set-PSDebug -Off
|
||||
exit $LastExitCode
|
||||
}
|
||||
}
|
||||
|
||||
if (-not $NoTests) {
|
||||
node --version
|
||||
npm.cmd --version
|
||||
}
|
||||
|
||||
if (-Not (Test-Path -PathType container $env:DEPS_BUILD_DIR)) {
|
||||
write-host "cache dir not found: $($env:DEPS_BUILD_DIR)"
|
||||
mkdir $env:DEPS_BUILD_DIR
|
||||
@@ -51,17 +46,13 @@ if ($compiler -eq 'MINGW') {
|
||||
$nvimCmakeVars['USE_GCOV'] = 'ON'
|
||||
$uploadToCodecov = $true
|
||||
$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
|
||||
# MSYS2, this allows using all the dependencies and tools available
|
||||
# in MSYS2, but we cannot build inside the MSYS2 shell.
|
||||
$cmakeGenerator = 'Ninja'
|
||||
$cmakeGeneratorArgs = '-v'
|
||||
$mingwPackages = @('ninja', 'cmake', 'diffutils').ForEach({
|
||||
$mingwPackages = @('ninja', 'cmake', 'perl', 'diffutils').ForEach({
|
||||
"mingw-w64-$arch-$_"
|
||||
})
|
||||
|
||||
@@ -72,7 +63,7 @@ if ($compiler -eq 'MINGW') {
|
||||
& C:\msys64\usr\bin\mkdir -p /var/cache/pacman/pkg
|
||||
|
||||
# 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
|
||||
}
|
||||
elseif ($compiler -eq 'MSVC') {
|
||||
@@ -85,24 +76,23 @@ elseif ($compiler -eq 'MSVC') {
|
||||
}
|
||||
}
|
||||
|
||||
if (-not $NoTests) {
|
||||
python -m ensurepip
|
||||
python -m pip install pynvim ; exitIfFailed
|
||||
# Setup python (use AppVeyor system python)
|
||||
C:\Python27\python.exe -m pip install pynvim ; exitIfFailed
|
||||
C:\Python35\python.exe -m pip install pynvim ; exitIfFailed
|
||||
# Disambiguate python3
|
||||
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"
|
||||
gem.cmd install neovim
|
||||
Get-Command -CommandType Application neovim-ruby-host.bat
|
||||
|
||||
npm.cmd install -g neovim
|
||||
Get-Command -CommandType Application neovim-node-host.cmd
|
||||
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) {
|
||||
return $vars.GetEnumerator() | foreach { "-D$($_.Key)=$($_.Value)" }
|
||||
@@ -123,30 +113,26 @@ cmake --build . --config $cmakeBuildType -- $cmakeGeneratorArgs ; exitIfFailed
|
||||
# Ensure that the "win32" feature is set.
|
||||
.\bin\nvim -u NONE --headless -c 'exe !has(\"win32\").\"cq\"' ; exitIfFailed
|
||||
|
||||
if ($env:USE_LUACOV -eq 1) {
|
||||
& $env:DEPS_PREFIX\luarocks\luarocks.bat install cluacov
|
||||
}
|
||||
|
||||
if (-not $NoTests) {
|
||||
# Functional tests
|
||||
# The $LastExitCode from MSBuild can't be trusted
|
||||
$failed = $false
|
||||
|
||||
# Run only this test file:
|
||||
# $env:TEST_FILE = "test\functional\foo.lua"
|
||||
# Temporarily turn off tracing to reduce log file output
|
||||
Set-PSDebug -Off
|
||||
cmake --build . --config $cmakeBuildType --target functionaltest -- $cmakeGeneratorArgs 2>&1 |
|
||||
foreach { $failed = $failed -or
|
||||
$_ -match 'functional tests failed with error'; $_ }
|
||||
|
||||
if ($failed) {
|
||||
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
|
||||
}
|
||||
if ($failed) {
|
||||
exit $LastExitCode
|
||||
}
|
||||
Set-PSDebug -Strict -Trace 1
|
||||
|
||||
|
||||
if ($uploadToCodecov) {
|
||||
bash -l /c/projects/neovim/ci/common/submit_coverage.sh functionaltest
|
||||
}
|
||||
|
||||
# Old tests
|
||||
# Add MSYS to path, required for e.g. `find` used in test scripts.
|
||||
@@ -159,12 +145,6 @@ if (-not $NoTests) {
|
||||
if ($uploadToCodecov) {
|
||||
bash -l /c/projects/neovim/ci/common/submit_coverage.sh oldtest
|
||||
}
|
||||
}
|
||||
|
||||
# Ensure choco's cpack is not in PATH otherwise, it conflicts with CMake's
|
||||
if (Test-Path -Path $env:ChocolateyInstall\bin\cpack.exe) {
|
||||
Remove-Item -Path $env:ChocolateyInstall\bin\cpack.exe -Force
|
||||
}
|
||||
|
||||
# Build artifacts
|
||||
cpack -G ZIP -C RelWithDebInfo
|
||||
|
@@ -1,5 +1,5 @@
|
||||
_stat() {
|
||||
if test "${CI_OS_NAME}" = osx ; then
|
||||
if test "${TRAVIS_OS_NAME}" = osx ; then
|
||||
stat -f %Sm "${@}"
|
||||
else
|
||||
stat -c %y "${@}"
|
||||
@@ -18,6 +18,9 @@ build_make() {
|
||||
}
|
||||
|
||||
build_deps() {
|
||||
if test "${BUILD_32BIT}" = ON ; then
|
||||
DEPS_CMAKE_FLAGS="${DEPS_CMAKE_FLAGS} ${CMAKE_FLAGS_32BIT}"
|
||||
fi
|
||||
if test "${FUNCTIONALTEST}" = "functionaltest-lua" \
|
||||
|| test "${CLANG_SANITIZER}" = "ASAN_UBSAN" ; then
|
||||
DEPS_CMAKE_FLAGS="${DEPS_CMAKE_FLAGS} -DUSE_BUNDLED_LUA=ON"
|
||||
@@ -29,7 +32,7 @@ build_deps() {
|
||||
if test "${CACHE_ENABLE}" = "false" ; then
|
||||
export CCACHE_RECACHE=1
|
||||
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}"
|
||||
fi
|
||||
|
||||
@@ -37,24 +40,27 @@ build_deps() {
|
||||
# update CMake configuration and update to newer deps versions.
|
||||
cd "${DEPS_BUILD_DIR}"
|
||||
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
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cd "${CI_BUILD_DIR}"
|
||||
cd "${TRAVIS_BUILD_DIR}"
|
||||
}
|
||||
|
||||
prepare_build() {
|
||||
if test -n "${CLANG_SANITIZER}" ; then
|
||||
CMAKE_FLAGS="${CMAKE_FLAGS} -DCLANG_${CLANG_SANITIZER}=ON"
|
||||
fi
|
||||
if test "${BUILD_32BIT}" = ON ; then
|
||||
CMAKE_FLAGS="${CMAKE_FLAGS} ${CMAKE_FLAGS_32BIT}"
|
||||
fi
|
||||
|
||||
mkdir -p "${BUILD_DIR}"
|
||||
cd "${BUILD_DIR}"
|
||||
echo "Configuring with '${CMAKE_FLAGS} $@'."
|
||||
cmake -G Ninja ${CMAKE_FLAGS} "$@" "${CI_BUILD_DIR}"
|
||||
cmake -G Ninja ${CMAKE_FLAGS} "$@" "${TRAVIS_BUILD_DIR}"
|
||||
}
|
||||
|
||||
build_nvim() {
|
||||
@@ -84,5 +90,14 @@ build_nvim() {
|
||||
fi
|
||||
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.
|
||||
find . \( -name '*.gcov' -o -name '*.gcda' \) -ls -delete | wc -l
|
||||
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"
|
||||
|
||||
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/-$//')"
|
||||
echo -en "travis_fold:${action}:${name}\r${ANSI_CLEAR}"
|
||||
}
|
||||
elif test "$GITHUB_ACTIONS" = "true"; then
|
||||
ci_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() {
|
||||
|
||||
if test "$TRAVIS" != "true" ; then
|
||||
travis_fold() {
|
||||
return 0
|
||||
}
|
||||
fi
|
||||
@@ -50,7 +33,7 @@ enter_suite() {
|
||||
rm -f "${END_MARKER}"
|
||||
local suite_name="$1"
|
||||
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
|
||||
}
|
||||
|
||||
@@ -60,7 +43,7 @@ exit_suite() {
|
||||
echo "Suite ${NVIM_TEST_CURRENT_SUITE} failed, summary:"
|
||||
echo "${FAIL_SUMMARY}"
|
||||
else
|
||||
ci_fold end "${NVIM_TEST_CURRENT_SUITE}"
|
||||
travis_fold end "${NVIM_TEST_CURRENT_SUITE}"
|
||||
fi
|
||||
export NVIM_TEST_CURRENT_SUITE="${NVIM_TEST_CURRENT_SUITE%/*}"
|
||||
if test "$1" != "--continue" ; then
|
||||
|
@@ -15,7 +15,7 @@ print_core() {
|
||||
return 0
|
||||
fi
|
||||
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}"
|
||||
else
|
||||
gdb -n -batch -ex 'thread apply all bt full' "${app}" -c "${core}"
|
||||
@@ -30,11 +30,11 @@ check_core_dumps() {
|
||||
fi
|
||||
local app="${1:-${BUILD_DIR}/bin/nvim}"
|
||||
local cores
|
||||
if test "${CI_OS_NAME}" = osx ; then
|
||||
if test "${TRAVIS_OS_NAME}" = osx ; then
|
||||
cores="$(find /cores/ -type f -print)"
|
||||
local _sudo='sudo'
|
||||
else
|
||||
cores="$(find ./ -type f \( -name 'core.*' -o -name core -o -name nvim.core \) -print)"
|
||||
cores="$(find ./ -type f -name 'core.*' -print)"
|
||||
local _sudo=
|
||||
fi
|
||||
|
||||
@@ -82,7 +82,7 @@ valgrind_check() {
|
||||
|
||||
check_sanitizer() {
|
||||
if test -n "${CLANG_SANITIZER}"; then
|
||||
check_logs "${1}" "*san.*" | ${SYMBOLIZER:-cat}
|
||||
check_logs "${1}" "*san.*"
|
||||
fi
|
||||
}
|
||||
|
||||
|
@@ -4,7 +4,7 @@ set -e
|
||||
set -o pipefail
|
||||
|
||||
if [[ "${CI_TARGET}" == lint ]]; then
|
||||
python3 -m pip -q install --user --upgrade flake8
|
||||
python -m pip -q install --user --upgrade flake8
|
||||
exit
|
||||
fi
|
||||
|
||||
@@ -14,20 +14,13 @@ fi
|
||||
|
||||
# Use default CC to avoid compilation problems when installing Python modules.
|
||||
echo "Install neovim module for Python 3."
|
||||
CC=cc python3 -m pip -q install --user --upgrade pynvim
|
||||
if python2 -m pip -c True 2>&1; then
|
||||
CC=cc python3 -m pip -q install --upgrade pynvim
|
||||
echo "Install neovim module for Python 2."
|
||||
CC=cc python2 -m pip -q install --user --upgrade pynvim
|
||||
fi
|
||||
CC=cc python2 -m pip -q install --upgrade pynvim
|
||||
|
||||
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"
|
||||
source ~/.nvm/nvm.sh
|
||||
nvm use 10
|
||||
npm install -g 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
|
||||
exit_suite --continue
|
||||
|
||||
enter_suite 'shlint'
|
||||
run_test 'make shlint' shlint
|
||||
exit_suite --continue
|
||||
|
||||
enter_suite single-includes
|
||||
CLICOLOR_FORCE=1 run_test_wd \
|
||||
--allow-hang \
|
||||
|
@@ -17,10 +17,6 @@ build_nvim
|
||||
|
||||
exit_suite --continue
|
||||
|
||||
source ~/.nvm/nvm.sh
|
||||
nvm use 10
|
||||
|
||||
|
||||
enter_suite tests
|
||||
|
||||
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.
@@ -38,9 +38,6 @@ endif()
|
||||
if (LibIntl_LIBRARY)
|
||||
list(APPEND CMAKE_REQUIRED_LIBRARIES "${LibIntl_LIBRARY}")
|
||||
endif()
|
||||
if (MSVC)
|
||||
list(APPEND CMAKE_REQUIRED_LIBRARIES ${ICONV_LIBRARY})
|
||||
endif()
|
||||
check_c_source_compiles("
|
||||
#include <libintl.h>
|
||||
|
||||
@@ -51,9 +48,6 @@ int main(int argc, char** argv) {
|
||||
bind_textdomain_codeset(\"foo\", \"bar\");
|
||||
textdomain(\"foo\");
|
||||
}" HAVE_WORKING_LIBINTL)
|
||||
if (MSVC)
|
||||
list(REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES ${ICONV_LIBRARY})
|
||||
endif()
|
||||
if (LibIntl_INCLUDE_DIR)
|
||||
list(REMOVE_ITEM CMAKE_REQUIRED_INCLUDES "${LibIntl_INCLUDE_DIR}")
|
||||
endif()
|
||||
|
@@ -15,7 +15,7 @@ find_path(LIBLUV_INCLUDE_DIR luv/luv.h
|
||||
PATHS ${PC_LIBLUV_INCLUDEDIR} ${PC_LIBLUV_INCLUDE_DIRS})
|
||||
|
||||
# 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}
|
||||
HINTS ${PC_LIBLUV_LIBDIR} ${PC_LIBLUV_LIBRARY_DIRS})
|
||||
|
@@ -75,14 +75,6 @@ if(WIN32)
|
||||
list(APPEND LIBUV_LIBRARIES ws2_32)
|
||||
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)
|
||||
|
||||
# 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
|
||||
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_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>")
|
||||
|
||||
# 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
|
||||
"<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})
|
||||
endif()
|
||||
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{XDG_CONFIG_HOME} ${BUILD_DIR}/Xtest_xdg/config)
|
||||
set(ENV{XDG_DATA_HOME} ${BUILD_DIR}/Xtest_xdg/share)
|
||||
unset(ENV{XDG_DATA_DIRS})
|
||||
|
||||
if(NOT DEFINED ENV{NVIM_LOG_FILE})
|
||||
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})
|
||||
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).
|
||||
set(ENV{TMPDIR} "${BUILD_DIR}/Xtest_tmpdir/${TEST_PATH}")
|
||||
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.
|
||||
execute_process(
|
||||
COMMAND ${BUSTED_PRG} -v -o test.busted.outputHandlers.${BUSTED_OUTPUT_TYPE}
|
||||
@@ -70,7 +58,6 @@ execute_process(
|
||||
--lpath=?.lua
|
||||
${BUSTED_ARGS}
|
||||
${TEST_PATH}
|
||||
TIMEOUT $ENV{TEST_TIMEOUT}
|
||||
WORKING_DIRECTORY ${WORKING_DIR}
|
||||
ERROR_VARIABLE err
|
||||
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("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)
|
||||
|
||||
# Headers
|
||||
@@ -27,7 +32,6 @@ endif()
|
||||
check_include_files(sys/utsname.h HAVE_SYS_UTSNAME_H)
|
||||
check_include_files(termios.h HAVE_TERMIOS_H)
|
||||
check_include_files(sys/uio.h HAVE_SYS_UIO_H)
|
||||
check_include_files(sys/sdt.h HAVE_SYS_SDT_H)
|
||||
|
||||
# Functions
|
||||
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(strcasecmp HAVE_STRCASECMP)
|
||||
check_function_exists(strncasecmp HAVE_STRNCASECMP)
|
||||
check_function_exists(strptime HAVE_STRPTIME)
|
||||
|
||||
# Symbols
|
||||
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.
|
||||
# - CMAKE_CROSSCOMPILING *and* HAVE_BE64TOH are both false. In this case
|
||||
# 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("
|
||||
${SI}
|
||||
${MS}
|
||||
|
@@ -33,14 +33,12 @@
|
||||
#cmakedefine HAVE_STRCASECMP
|
||||
#cmakedefine HAVE_STRINGS_H
|
||||
#cmakedefine HAVE_STRNCASECMP
|
||||
#cmakedefine HAVE_STRPTIME
|
||||
#cmakedefine HAVE_SYS_SDT_H
|
||||
#cmakedefine HAVE_SYS_UTSNAME_H
|
||||
#cmakedefine HAVE_SYS_WAIT_H
|
||||
#cmakedefine HAVE_TERMIOS_H
|
||||
#cmakedefine HAVE_WORKING_LIBINTL
|
||||
#cmakedefine HAVE_WSL
|
||||
#cmakedefine UNIX
|
||||
#cmakedefine CASE_INSENSITIVE_FILENAME
|
||||
#cmakedefine USE_FNAME_CASE
|
||||
#cmakedefine HAVE_SYS_UIO_H
|
||||
#ifdef HAVE_SYS_UIO_H
|
||||
@@ -62,6 +60,5 @@
|
||||
|
||||
#cmakedefine HAVE_EXECINFO_BACKTRACE
|
||||
#cmakedefine HAVE_BUILTIN_ADD_OVERFLOW
|
||||
#cmakedefine HAVE_WIMPLICIT_FALLTHROUGH_FLAG
|
||||
|
||||
#endif // AUTO_CONFIG_H
|
||||
|
@@ -3,6 +3,5 @@
|
||||
#include "${PROJECT_SOURCE_DIR}/src/nvim/vim.h"
|
||||
char *default_vim_dir = "${CMAKE_INSTALL_FULL_DATAROOTDIR}/nvim";
|
||||
char *default_vimruntime_dir = "";
|
||||
char *default_lib_dir = "${CMAKE_INSTALL_FULL_LIBDIR}/nvim";
|
||||
char_u *compiled_user = (char_u *)"${USERNAME}";
|
||||
char_u *compiled_sys = (char_u *)"${HOSTNAME}";
|
||||
|
@@ -5,11 +5,7 @@
|
||||
#define NVIM_VERSION_MINOR @NVIM_VERSION_MINOR@
|
||||
#define NVIM_VERSION_PATCH @NVIM_VERSION_PATCH@
|
||||
#define NVIM_VERSION_PRERELEASE "@NVIM_VERSION_PRERELEASE@"
|
||||
|
||||
#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_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
|
||||
|
||||
# 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)
|
||||
# Default is 1 (INFO) unless CMAKE_BUILD_TYPE is Release or RelWithDebInfo.
|
||||
# CMAKE_EXTRA_FLAGS += -DMIN_LOG_LEVEL=1
|
||||
@@ -48,7 +42,6 @@
|
||||
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_LUAROCKS=OFF
|
||||
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_MSGPACK=OFF
|
||||
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_UNIBILIUM=OFF
|
||||
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_UTF8PROC=OFF
|
||||
#
|
||||
# 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
|
||||
.It Fl d
|
||||
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 .
|
||||
.Ic ":help diff"
|
||||
.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
|
||||
.Ic :w! .
|
||||
.Ic ":help 'readonly'"
|
||||
.It Fl Z
|
||||
Restricted mode.
|
||||
Disable commands that make use of an external shell.
|
||||
.It Fl m
|
||||
Resets the 'write' option, to disable file modifications.
|
||||
Writing to a file is disabled, but buffers can still be modified.
|
||||
@@ -177,7 +180,8 @@ If
|
||||
.Ar vimrc
|
||||
is
|
||||
.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
|
||||
.Ar vimrc
|
||||
is
|
||||
@@ -200,7 +204,7 @@ Skip loading plugins.
|
||||
Implied by
|
||||
.Cm -u NONE .
|
||||
.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
|
||||
Open
|
||||
.Ar N
|
||||
@@ -326,7 +330,7 @@ Print version information and exit.
|
||||
.Sh ENVIRONMENT
|
||||
.Bl -tag -width Fl
|
||||
.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
|
||||
.It Ev VIM
|
||||
Used to locate user files, such as init.vim.
|
||||
@@ -374,7 +378,7 @@ See also
|
||||
System-global
|
||||
.Nm
|
||||
configuration file.
|
||||
.It Pa $VIM
|
||||
.It Pa /usr/local/share/nvim
|
||||
System-global
|
||||
.Nm
|
||||
runtime directory.
|
||||
|
@@ -21,12 +21,12 @@ add_custom_command(OUTPUT ${GENERATED_SYN_VIM}
|
||||
${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)
|
||||
foreach(PACKAGE ${PACKAGES})
|
||||
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)
|
||||
file(MAKE_DIRECTORY ${GENERATED_PACKAGE_DIR}/${PACKNAME})
|
||||
add_custom_command(OUTPUT "${GENERATED_PACKAGE_DIR}/${PACKNAME}/doc/tags"
|
||||
@@ -54,7 +54,7 @@ foreach(PACKAGE ${PACKAGES})
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
glob_wrapper(DOCFILES ${PROJECT_SOURCE_DIR}/runtime/doc/*.txt)
|
||||
file(GLOB DOCFILES ${PROJECT_SOURCE_DIR}/runtime/doc/*.txt)
|
||||
|
||||
set(BUILDDOCFILES)
|
||||
foreach(DF ${DOCFILES})
|
||||
@@ -111,10 +111,12 @@ if(NOT APPLE)
|
||||
|
||||
install_helper(
|
||||
FILES ${CMAKE_CURRENT_SOURCE_DIR}/nvim.png
|
||||
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/128x128/apps)
|
||||
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pixmaps)
|
||||
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})
|
||||
get_filename_component(BASEDIR ${PROG} PATH)
|
||||
@@ -122,7 +124,9 @@ foreach(PROG ${RUNTIME_PROGRAMS})
|
||||
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/nvim/runtime/${BASEDIR})
|
||||
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)
|
||||
|
||||
foreach(F ${RUNTIME_FILES})
|
||||
|
@@ -67,13 +67,13 @@ if exists ('g:ada_with_gnat_project_files')
|
||||
endfor
|
||||
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']
|
||||
let g:ada#Keywords += [{
|
||||
\ 'word': Item,
|
||||
\ 'menu': 'exception',
|
||||
\ 'info': 'Ada standard exception.',
|
||||
\ 'info': 'Ada standart exception.',
|
||||
\ 'kind': 'x',
|
||||
\ 'icase': 1}]
|
||||
endfor
|
||||
@@ -210,7 +210,7 @@ function ada#Word (...)
|
||||
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
|
||||
" backwards looking for previous lines
|
||||
" backards looking for previous lines
|
||||
if l:Column_Nr > strlen(l:Line)
|
||||
" We were in a comment
|
||||
let l:Line = getline(l:Line_Nr)
|
||||
|
@@ -14,7 +14,7 @@
|
||||
" 15.10.2006 MK Bram's suggestion for runtime integration
|
||||
" 05.11.2006 MK Bram suggested not to use include protection for
|
||||
" 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
|
||||
" Help Page: ft-ada-omni
|
||||
"------------------------------------------------------------------------------
|
||||
|
@@ -1,13 +1,13 @@
|
||||
" Vim completion script
|
||||
" Language: C
|
||||
" Maintainer: Bram Moolenaar <Bram@vim.org>
|
||||
" Last Change: 2020 Nov 14
|
||||
" Last Change: 2018 Aug 20
|
||||
|
||||
let s:cpo_save = &cpo
|
||||
set cpo&vim
|
||||
|
||||
" This function is used for the 'omnifunc' option.
|
||||
func ccomplete#Complete(findstart, base)
|
||||
function! ccomplete#Complete(findstart, base)
|
||||
if a:findstart
|
||||
" Locate the start of the item, including ".", "->" and "[...]".
|
||||
let line = getline('.')
|
||||
@@ -244,7 +244,7 @@ func ccomplete#Complete(findstart, base)
|
||||
return map(res, 's:Tagline2item(v:val, brackets)')
|
||||
endfunc
|
||||
|
||||
func s:GetAddition(line, match, memarg, bracket)
|
||||
function! s:GetAddition(line, match, memarg, bracket)
|
||||
" Guess if the item is an array.
|
||||
if a:bracket && match(a:line, a:match . '\s*\[') > 0
|
||||
return '['
|
||||
@@ -260,13 +260,13 @@ func s:GetAddition(line, match, memarg, bracket)
|
||||
endif
|
||||
endif
|
||||
return ''
|
||||
endfunc
|
||||
endfunction
|
||||
|
||||
" Turn the tag info "val" into an item for completion.
|
||||
" "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,
|
||||
" 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['extra'] = s:Tagcmd2extra(a:val['cmd'], a:val['name'], a:val['filename'])
|
||||
@@ -289,10 +289,10 @@ func s:Tag2item(val)
|
||||
endif
|
||||
|
||||
return res
|
||||
endfunc
|
||||
endfunction
|
||||
|
||||
" Use all the items in dictionary for the "info" entry.
|
||||
func s:Dict2info(dict)
|
||||
function! s:Dict2info(dict)
|
||||
let info = ''
|
||||
for k in sort(keys(a:dict))
|
||||
let info .= k . repeat(' ', 10 - len(k))
|
||||
@@ -307,7 +307,7 @@ func s:Dict2info(dict)
|
||||
endfunc
|
||||
|
||||
" 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 d = {}
|
||||
if len(l) >= 3
|
||||
@@ -334,12 +334,12 @@ func s:ParseTagline(line)
|
||||
endif
|
||||
|
||||
return d
|
||||
endfunc
|
||||
endfunction
|
||||
|
||||
" Turn a match item "val" into an item for completion.
|
||||
" "val['match']" is the matching item.
|
||||
" "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 add = s:GetAddition(line, a:val['match'], [a:val], a:brackets == '')
|
||||
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'))
|
||||
endif
|
||||
return res
|
||||
endfunc
|
||||
endfunction
|
||||
|
||||
" 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 =~ '^/^'
|
||||
" The command is a search command, useful to see what it is.
|
||||
let x = matchstr(a:cmd, '^/^\s*\zs.*\ze$/')
|
||||
@@ -395,13 +395,13 @@ func s:Tagcmd2extra(cmd, name, fname)
|
||||
let x = a:cmd . ' - ' . a:fname
|
||||
endif
|
||||
return x
|
||||
endfunc
|
||||
endfunction
|
||||
|
||||
" Find composing type in "lead" and match items[0] with it.
|
||||
" Repeat this recursively for items[1], if it's there.
|
||||
" When resolving typedefs "depth" is used to avoid infinite recursion.
|
||||
" 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.
|
||||
let tokens = split(a:lead, '\s\+\|\<')
|
||||
@@ -485,7 +485,7 @@ func s:Nextitem(lead, items, depth, all)
|
||||
endfor
|
||||
|
||||
return res
|
||||
endfunc
|
||||
endfunction
|
||||
|
||||
|
||||
" Search for members of structure "typename" in tags files.
|
||||
@@ -493,7 +493,7 @@ endfunc
|
||||
" 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
|
||||
" member.
|
||||
func s:StructMembers(typename, items, all)
|
||||
function! s:StructMembers(typename, items, all)
|
||||
" Todo: What about local structures?
|
||||
let fnames = join(map(tagfiles(), 'escape(v:val, " \\#%")'))
|
||||
if fnames == ''
|
||||
@@ -586,12 +586,12 @@ func s:StructMembers(typename, items, all)
|
||||
|
||||
" Failed to find anything.
|
||||
return []
|
||||
endfunc
|
||||
endfunction
|
||||
|
||||
" For matching members, find matches for following items.
|
||||
" When "all" is non-zero find all, otherwise just return 1 if there is any
|
||||
" member.
|
||||
func s:SearchMembers(matches, items, all)
|
||||
function! s:SearchMembers(matches, items, all)
|
||||
let res = []
|
||||
for i in range(len(a:matches))
|
||||
let typename = ''
|
||||
@@ -635,5 +635,3 @@ endfunc
|
||||
|
||||
let &cpo = 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/>
|
||||
" Maintainer: Kao, Wei-Ko(othree) ( othree AT gmail DOT com )
|
||||
" 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")
|
||||
|
||||
@@ -38,12 +38,12 @@ function! csscomplete#CompleteCSS(findstart, base)
|
||||
if exists("b:compl_context")
|
||||
let line = getline('.')
|
||||
let compl_begin = col('.') - 2
|
||||
let b:after = line[compl_begin:]
|
||||
let after = line[compl_begin:]
|
||||
let line = b:compl_context
|
||||
unlet! b:compl_context
|
||||
else
|
||||
let line = a:base
|
||||
let b:after = ''
|
||||
let after = ''
|
||||
endif
|
||||
|
||||
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"]
|
||||
elseif prop =~ '^\%(height\|width\)$'
|
||||
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"]
|
||||
elseif prop == 'image-rendering'
|
||||
let values = ["auto", "crisp-edges", "pixelated"]
|
||||
|
@@ -23,9 +23,9 @@ endif
|
||||
|
||||
function decada#Unit_Name () dict " {{{1
|
||||
" 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)
|
||||
" 3: remove a trailing '_' (which denotes a specification)
|
||||
" 3: remove a trailing '_' (wich denotes a specification)
|
||||
return substitute (substitute (expand ("%:t:r"), '__\|-', ".", "g"), '_$', "", '')
|
||||
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
|
||||
"
|
||||
" 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
|
||||
" faster.
|
||||
@@ -172,17 +172,6 @@ func dist#ft#FTent()
|
||||
setf dtd
|
||||
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()
|
||||
if exists('g:filetype_euphoria')
|
||||
exe 'setf ' . g:filetype_euphoria
|
||||
@@ -219,23 +208,6 @@ func dist#ft#FTe()
|
||||
endif
|
||||
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
|
||||
func dist#ft#FThtml()
|
||||
let n = 1
|
||||
@@ -281,16 +253,6 @@ func dist#ft#ProtoCheck(default)
|
||||
endfunc
|
||||
|
||||
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 saw_comment = 0 " Whether we've seen a multiline comment leader.
|
||||
while n < 100
|
||||
@@ -301,16 +263,10 @@ func dist#ft#FTm()
|
||||
" anything more definitive.
|
||||
let saw_comment = 1
|
||||
endif
|
||||
if line =~ '^\s*//' || line =~ '^\s*@import\>' || line =~ objc_preprocessor
|
||||
if line =~ '^\s*\(#\s*\(include\|import\)\>\|@import\>\|//\)'
|
||||
setf objc
|
||||
return
|
||||
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*%'
|
||||
setf matlab
|
||||
return
|
||||
@@ -331,15 +287,18 @@ func dist#ft#FTm()
|
||||
" or Murphi based on the comment leader. Assume the former as it is more
|
||||
" common.
|
||||
setf objc
|
||||
elseif exists("g:filetype_m")
|
||||
" Use user specified default filetype for .m
|
||||
exe "setf " . g:filetype_m
|
||||
else
|
||||
" Default is Matlab
|
||||
" Default is matlab
|
||||
setf matlab
|
||||
endif
|
||||
endfunc
|
||||
|
||||
func dist#ft#FTmms()
|
||||
let n = 1
|
||||
while n < 20
|
||||
while n < 10
|
||||
let line = getline(n)
|
||||
if line =~ '^\s*\(%\|//\)' || line =~ '^\*'
|
||||
setf mmix
|
||||
@@ -366,7 +325,7 @@ endfunc
|
||||
|
||||
func dist#ft#FTmm()
|
||||
let n = 1
|
||||
while n < 20
|
||||
while n < 10
|
||||
let line = getline(n)
|
||||
if line =~ '^\s*\(#\s*\(include\|import\)\>\|@import\>\|/\*\)'
|
||||
setf objcpp
|
||||
@@ -403,10 +362,6 @@ func dist#ft#FTinc()
|
||||
setf aspvbs
|
||||
elseif lines =~ "<?"
|
||||
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
|
||||
call dist#ft#FTasmsyntax()
|
||||
if exists("b:asmsyntax")
|
||||
@@ -453,9 +408,6 @@ func dist#ft#FTprogress_asm()
|
||||
setf progress
|
||||
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()
|
||||
if exists("g:filetype_p")
|
||||
exe "setf " . g:filetype_p
|
||||
@@ -467,7 +419,8 @@ func dist#ft#FTprogress_pascal()
|
||||
let lnum = 1
|
||||
while lnum <= 10 && lnum < line('$')
|
||||
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
|
||||
return
|
||||
elseif line !~ '^\s*$' || line =~ '^/\*'
|
||||
@@ -480,19 +433,6 @@ func dist#ft#FTprogress_pascal()
|
||||
setf progress
|
||||
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()
|
||||
let max = line("$") > 50 ? 50 : line("$")
|
||||
|
||||
@@ -635,7 +575,7 @@ endfunc
|
||||
let s:ft_rules_udev_rules_pattern = '^\s*\cudev_rules\s*=\s*"\([^"]\{-1,}\)/*".*'
|
||||
func dist#ft#FTRules()
|
||||
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
|
||||
return
|
||||
endif
|
||||
|
@@ -2,7 +2,7 @@
|
||||
" Language: Haskell
|
||||
" Maintainer: Daniel Campoverde <alx@sillybytes.net>
|
||||
" URL: https://github.com/alx741/haskellcomplete.vim
|
||||
" Last Change: 2019 May 14
|
||||
" Last Change: 2018 Aug 26
|
||||
|
||||
" Usage: setlocal omnifunc=haskellcomplete#Complete
|
||||
|
||||
@@ -54,7 +54,7 @@ function! haskellcomplete#Complete(findstart, base)
|
||||
|
||||
if b:completingLangExtension
|
||||
if a:base ==? ""
|
||||
" Return all possible Lang extensions
|
||||
" Return all posible Lang extensions
|
||||
return s:langExtensions
|
||||
else
|
||||
let l:matches = []
|
||||
@@ -63,14 +63,13 @@ function! haskellcomplete#Complete(findstart, base)
|
||||
call add(l:matches, extension)
|
||||
endif
|
||||
endfor
|
||||
let b:completingLangExtension = 0
|
||||
return l:matches
|
||||
endif
|
||||
|
||||
|
||||
elseif b:completingOptionsGHC
|
||||
if a:base ==? ""
|
||||
" Return all possible GHC options
|
||||
" Return all posible GHC options
|
||||
return s:optionsGHC
|
||||
else
|
||||
let l:matches = []
|
||||
@@ -79,14 +78,13 @@ function! haskellcomplete#Complete(findstart, base)
|
||||
call add(l:matches, flag)
|
||||
endif
|
||||
endfor
|
||||
let b:completingOptionsGHC = 0
|
||||
return l:matches
|
||||
endif
|
||||
|
||||
|
||||
elseif b:completingModule
|
||||
if a:base ==? ""
|
||||
" Return all possible modules
|
||||
" Return all posible modules
|
||||
return s:commonModules
|
||||
else
|
||||
let l:matches = []
|
||||
@@ -95,7 +93,6 @@ function! haskellcomplete#Complete(findstart, base)
|
||||
call add(l:matches, module)
|
||||
endif
|
||||
endfor
|
||||
let b:completingModule = 0
|
||||
return l:matches
|
||||
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 all discovered healthchecks if a:plugin_names is empty.
|
||||
function! health#check(plugin_names) abort
|
||||
let healthchecks = empty(a:plugin_names)
|
||||
\ ? s:discover_healthchecks()
|
||||
\ : s:get_healthcheck(a:plugin_names)
|
||||
\ ? s:discover_health_checks()
|
||||
\ : s:to_fn_names(a:plugin_names)
|
||||
|
||||
" create scratch-buffer
|
||||
execute 'tab sbuffer' nvim_create_buf(v:true, v:true)
|
||||
setfiletype checkhealth
|
||||
tabnew
|
||||
setlocal wrap breakindent linebreak
|
||||
setlocal filetype=markdown
|
||||
setlocal conceallevel=2 concealcursor=nc
|
||||
setlocal keywordprg=:help
|
||||
let &l:iskeyword='!-~,^*,^|,^",192-255'
|
||||
call s:enhance_syntax()
|
||||
|
||||
if empty(healthchecks)
|
||||
call setline(1, 'ERROR: No healthchecks found.')
|
||||
else
|
||||
redraw|echo 'Running healthchecks...'
|
||||
for name in sort(keys(healthchecks))
|
||||
let [func, type] = healthchecks[name]
|
||||
let s:output = []
|
||||
for c in healthchecks
|
||||
let output = ''
|
||||
call append('$', split(printf("\n%s\n%s", c, repeat('=',72)), "\n"))
|
||||
try
|
||||
if func == ''
|
||||
throw 'healthcheck_not_found'
|
||||
endif
|
||||
eval type == 'v' ? call(func, []) : luaeval(func)
|
||||
let output = "\n\n".execute('call '.c.'()')
|
||||
catch
|
||||
let s:output = [] " Clear the output
|
||||
if v:exception =~# 'healthcheck_not_found'
|
||||
call health#report_error('No healthcheck found for "'.name.'" plugin.')
|
||||
if v:exception =~# '^Vim\%((\a\+)\)\=:E117.*\V'.c
|
||||
let output = execute(
|
||||
\ 'call health#report_error(''No healthcheck found for "'
|
||||
\ .s:to_plugin_name(c)
|
||||
\ .'" plugin.'')')
|
||||
else
|
||||
call health#report_error(printf(
|
||||
\ "Failed to run healthcheck for \"%s\" plugin. Exception:\n%s\n%s",
|
||||
\ name, v:throwpoint, v:exception))
|
||||
let output = execute(
|
||||
\ 'call health#report_error(''Failed to run healthcheck for "'
|
||||
\ .s:to_plugin_name(c)
|
||||
\ .'" plugin. Exception:''."\n".v:throwpoint."\n".v:exception)')
|
||||
endif
|
||||
endtry
|
||||
let header = [name. ': ' . func, repeat('=', 72)]
|
||||
" 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)
|
||||
call append('$', split(output, "\n") + [''])
|
||||
redraw
|
||||
endfor
|
||||
endif
|
||||
|
||||
" needed for plasticboy/vim-markdown, because it uses fdm=expr
|
||||
normal! zR
|
||||
setlocal nomodified
|
||||
setlocal bufhidden=hide
|
||||
redraw|echo ''
|
||||
endfunction
|
||||
|
||||
function! s:collect_output(output)
|
||||
let s:output += split(a:output, "\n", 1)
|
||||
endfunction
|
||||
|
||||
" Starts a new report.
|
||||
function! health#report_start(name) abort
|
||||
call s:collect_output("\n## " . a:name)
|
||||
echo "\n## " . a:name
|
||||
endfunction
|
||||
|
||||
" 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
|
||||
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 " }}}
|
||||
|
||||
" Reports a successful healthcheck.
|
||||
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 " }}}
|
||||
|
||||
" Reports a health warning.
|
||||
" a:1: Optional advice (string or list)
|
||||
function! health#report_warn(msg, ...) abort " {{{
|
||||
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
|
||||
call s:collect_output(s:format_report_message('WARNING', a:msg))
|
||||
echo s:format_report_message('WARNING', a:msg)
|
||||
endif
|
||||
endfunction " }}}
|
||||
|
||||
@@ -119,73 +141,37 @@ endfunction " }}}
|
||||
" a:1: Optional advice (string or list)
|
||||
function! health#report_error(msg, ...) abort " {{{
|
||||
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
|
||||
call s:collect_output(s:format_report_message('ERROR', a:msg))
|
||||
echo s:format_report_message('ERROR', a:msg)
|
||||
endif
|
||||
endfunction " }}}
|
||||
|
||||
" From a path return a list [{name}, {func}, {type}] representing a healthcheck
|
||||
function! s:filepath_to_healthcheck(path) abort
|
||||
if a:path =~# 'vim$'
|
||||
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]
|
||||
function! s:filepath_to_function(name) abort
|
||||
return substitute(substitute(substitute(a:name, '.*autoload[\/]', '', ''),
|
||||
\ '\.vim', '#check', ''), '[\/]', '#', 'g')
|
||||
endfunction
|
||||
|
||||
function! s:discover_healthchecks() abort
|
||||
return s:get_healthcheck('*')
|
||||
function! s:discover_health_checks() abort
|
||||
let healthchecks = globpath(&runtimepath, 'autoload/health/*.vim', 1, 1)
|
||||
let healthchecks = map(healthchecks, '<SID>filepath_to_function(v:val)')
|
||||
return healthchecks
|
||||
endfunction
|
||||
|
||||
" Returns Dictionary {name: [func, type], ..} representing healthchecks
|
||||
function! s:get_healthcheck(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
|
||||
" Translates a list of plugin names to healthcheck function names.
|
||||
function! s:to_fn_names(plugin_names) abort
|
||||
let healthchecks = []
|
||||
let plugin_names = type('') == type(a:plugin_names)
|
||||
let plugin_names = type('') ==# type(a:plugin_names)
|
||||
\ ? split(a:plugin_names, '', v:false)
|
||||
\ : a:plugin_names
|
||||
for p in plugin_names
|
||||
" support vim/lsp/health{/init/}.lua as :checkhealth vim.lsp
|
||||
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
|
||||
call add(healthchecks, 'health#'.p.'#check')
|
||||
endfor
|
||||
return healthchecks
|
||||
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.', ])
|
||||
endif
|
||||
|
||||
let writeable = v:true
|
||||
let shadafile = empty(&shada) ? &shada : substitute(matchstr(
|
||||
\ 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 shadafile = (empty(&shadafile) || &shadafile ==# 'NONE') ? stdpath('data').'/shada/main.shada' : &shadafile
|
||||
if !empty(shadafile) && (!filereadable(shadafile) || !filewritable(shadafile))
|
||||
let ok = v:false
|
||||
call health#report_error('shada file is not '.
|
||||
\ ((!writeable || filereadable(shadafile)) ?
|
||||
\ 'writeable' : 'readable').":\n".shadafile)
|
||||
call health#report_error('shada file is not '.(filereadable(shadafile) ? 'writeable' : 'readable').":\n".shadafile)
|
||||
endif
|
||||
|
||||
if ok
|
||||
@@ -146,25 +129,6 @@ function! s:check_performance() abort
|
||||
endif
|
||||
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
|
||||
if empty($TMUX) || !executable('tmux')
|
||||
return
|
||||
@@ -172,31 +136,20 @@ function! s:check_tmux() abort
|
||||
call health#report_start('tmux')
|
||||
|
||||
" 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]
|
||||
let tmux_esc_time = s:get_tmux_option('escape-time')
|
||||
if tmux_esc_time !=# 'error'
|
||||
if empty(tmux_esc_time)
|
||||
call health#report_error('`escape-time` is not set', suggestions)
|
||||
let cmd = 'tmux show-option -qvgs escape-time'
|
||||
let out = system(cmd)
|
||||
let tmux_esc_time = substitute(out, '\v(\s|\r|\n)', '', 'g')
|
||||
if v:shell_error
|
||||
call health#report_error('command failed: '.cmd."\n".out)
|
||||
elseif empty(tmux_esc_time)
|
||||
call health#report_error('escape-time is not set', suggestions)
|
||||
elseif tmux_esc_time > 300
|
||||
call health#report_error(
|
||||
\ '`escape-time` ('.tmux_esc_time.') is higher than 300ms', suggestions)
|
||||
\ 'escape-time ('.tmux_esc_time.') is higher than 300ms', suggestions)
|
||||
else
|
||||
call health#report_ok('escape-time: '.tmux_esc_time)
|
||||
endif
|
||||
endif
|
||||
|
||||
" 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
|
||||
call health#report_ok('escape-time: '.tmux_esc_time.'ms')
|
||||
endif
|
||||
|
||||
" check default-terminal and $TERM
|
||||
@@ -247,10 +200,6 @@ function! s:check_terminal() abort
|
||||
let kdch1_entry = matchstr(out, 'key_dc=[^,[:space:]]*')
|
||||
|
||||
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)
|
||||
else
|
||||
call health#report_info('key_backspace (kbs) terminfo entry: '
|
||||
|
@@ -38,10 +38,9 @@ endfunction
|
||||
" Handler for s:system() function.
|
||||
function! s:system_handler(jobid, data, event) dict abort
|
||||
if a:event ==# 'stderr'
|
||||
if self.add_stderr_to_output
|
||||
let self.output .= join(a:data, '')
|
||||
else
|
||||
let self.stderr .= join(a:data, '')
|
||||
if !self.ignore_stderr
|
||||
let self.output .= join(a:data, '')
|
||||
endif
|
||||
elseif a:event ==# 'stdout'
|
||||
let self.output .= join(a:data, '')
|
||||
@@ -65,7 +64,7 @@ function! s:system(cmd, ...) abort
|
||||
let stdin = a:0 ? a:1 : ''
|
||||
let ignore_error = a:0 > 2 ? a:3 : 0
|
||||
let opts = {
|
||||
\ 'add_stderr_to_output': a:0 > 1 ? a:2 : 0,
|
||||
\ 'ignore_stderr': a:0 > 1 ? a:2 : 0,
|
||||
\ 'output': '',
|
||||
\ 'stderr': '',
|
||||
\ '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 jobstop(jobid)
|
||||
elseif s:shell_error != 0 && !ignore_error
|
||||
let emsg = printf("Command error (job=%d, exit code %d): `%s` (in %s)",
|
||||
\ jobid, s:shell_error, s:shellify(a:cmd), string(getcwd()))
|
||||
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)
|
||||
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()), opts.output, opts.stderr))
|
||||
endif
|
||||
|
||||
return opts.output
|
||||
@@ -163,7 +155,7 @@ function! s:check_clipboard() abort
|
||||
endif
|
||||
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
|
||||
let pypi_version = 'unable to get pypi response'
|
||||
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
|
||||
" 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: [
|
||||
" {python executable version},
|
||||
@@ -202,8 +194,7 @@ function! s:version_info(python) abort
|
||||
|
||||
let nvim_path = s:trim(s:system([
|
||||
\ a:python, '-c',
|
||||
\ 'import sys; ' .
|
||||
\ 'sys.path = list(filter(lambda x: x != "", sys.path)); ' .
|
||||
\ 'import sys; sys.path.remove(""); ' .
|
||||
\ 'import neovim; print(neovim.__file__)']))
|
||||
if s:shell_error || empty(nvim_path)
|
||||
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))'],
|
||||
\ '', 1, 1)
|
||||
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 metas = glob(base.'-*/METADATA', 1, 1)
|
||||
\ + glob(base.'-*/PKG-INFO', 1, 1)
|
||||
@@ -266,22 +257,6 @@ function! s:check_bin(bin) abort
|
||||
return 1
|
||||
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
|
||||
call health#report_start('Python ' . a:version . ' provider (optional)')
|
||||
|
||||
@@ -289,10 +264,11 @@ function! s:check_python(version) abort
|
||||
let python_exe = ''
|
||||
let venv = exists('$VIRTUAL_ENV') ? resolve($VIRTUAL_ENV) : ''
|
||||
let host_prog_var = pyname.'_host_prog'
|
||||
let loaded_var = 'g:loaded_'.pyname.'_provider'
|
||||
let python_multiple = []
|
||||
|
||||
if s:disabled_via_loaded_var(pyname)
|
||||
return
|
||||
if exists(loaded_var) && !exists('*provider#'.pyname.'#Call')
|
||||
call health#report_info('Disabled ('.loaded_var.'='.eval(loaded_var).'). This might be due to some previous error.')
|
||||
endif
|
||||
|
||||
let [pyenv, pyenv_root] = s:check_for_pyenv()
|
||||
@@ -310,7 +286,7 @@ function! s:check_python(version) abort
|
||||
let python_exe = pyname
|
||||
endif
|
||||
|
||||
" No Python executable could `import neovim`, or host_prog_var was used.
|
||||
" No Python executable could `import neovim`.
|
||||
if !empty(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.'/'
|
||||
call health#report_warn('pyenv is not set up optimally.', [
|
||||
\ 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 '
|
||||
\ . 'version/virtualenv.', host_prog_var)
|
||||
\ ])
|
||||
@@ -377,7 +353,7 @@ function! s:check_python(version) abort
|
||||
if resolve(python_exe) !~# '^'.venv_root.'/'
|
||||
call health#report_warn('Your virtualenv is not set up optimally.', [
|
||||
\ 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 '
|
||||
\ . 'virtualenv.', host_prog_var)
|
||||
\ ])
|
||||
@@ -392,6 +368,18 @@ function! s:check_python(version) abort
|
||||
let python_exe = ''
|
||||
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
|
||||
call health#report_info('Executable: ' . (empty(python_exe) ? 'Not found' : python_exe))
|
||||
if len(python_multiple)
|
||||
@@ -400,6 +388,8 @@ function! s:check_python(version) abort
|
||||
endfor
|
||||
endif
|
||||
|
||||
let pip = 'pip' . (a:version == 2 ? '' : '3')
|
||||
|
||||
if empty(python_exe)
|
||||
" No Python executable can import 'neovim'. Check if any Python executable
|
||||
" 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 '
|
||||
\ . 'not "neovim": '. pynvim_exe,
|
||||
\ "Use that Python version to reinstall \"pynvim\" and optionally \"neovim\".\n"
|
||||
\ . pynvim_exe ." -m pip uninstall pynvim neovim\n"
|
||||
\ . pynvim_exe ." -m pip install pynvim\n"
|
||||
\ . pynvim_exe ." -m pip install neovim # only if needed by third-party software")
|
||||
\ . pip ." uninstall pynvim neovim\n"
|
||||
\ . pip ." install pynvim\n"
|
||||
\ . pip ." install neovim # only if needed by third-party software")
|
||||
endif
|
||||
else
|
||||
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.')
|
||||
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)
|
||||
|
||||
if s:is_bad_response(status)
|
||||
@@ -434,7 +428,7 @@ function! s:check_python(version) abort
|
||||
if s:is_bad_response(current)
|
||||
call health#report_error(
|
||||
\ "pynvim is not installed.\nError: ".current,
|
||||
\ ['Run in shell: '. python_exe .' -m pip install pynvim'])
|
||||
\ ['Run in shell: '. pip .' install pynvim'])
|
||||
endif
|
||||
|
||||
if s:is_bad_response(latest)
|
||||
@@ -479,83 +473,12 @@ function! s:check_for_pyenv() abort
|
||||
return [pyenv_path, pyenv_root]
|
||||
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
|
||||
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
|
||||
endif
|
||||
|
||||
@@ -567,7 +490,7 @@ function! s:check_ruby() abort
|
||||
endif
|
||||
call health#report_info('Ruby: '. s:system('ruby -v'))
|
||||
|
||||
let [host, err] = provider#ruby#Detect()
|
||||
let host = provider#ruby#Detect()
|
||||
if empty(host)
|
||||
call health#report_warn('`neovim-ruby-host` not found.',
|
||||
\ ['Run `gem install neovim` to ensure the neovim RubyGem is installed.',
|
||||
@@ -578,7 +501,7 @@ function! s:check_ruby() abort
|
||||
endif
|
||||
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))
|
||||
if s:shell_error || empty(latest_gem)
|
||||
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?'])
|
||||
return
|
||||
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 = s:system(current_gem_cmd)
|
||||
@@ -609,7 +532,9 @@ endfunction
|
||||
function! s:check_node() abort
|
||||
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
|
||||
endif
|
||||
|
||||
@@ -621,8 +546,8 @@ function! s:check_node() abort
|
||||
endif
|
||||
let node_v = get(split(s:system('node -v'), "\n"), 0, '')
|
||||
call health#report_info('Node.js: '. node_v)
|
||||
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)
|
||||
if !s:shell_error && s:version_cmp(node_v[1:], '6.0.0') < 0
|
||||
call health#report_warn('Neovim node.js host does not support '.node_v)
|
||||
" Skip further checks, they are nonsense if nodejs is too old.
|
||||
return
|
||||
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.')
|
||||
endif
|
||||
|
||||
let [host, err] = provider#node#Detect()
|
||||
let host = provider#node#Detect()
|
||||
if empty(host)
|
||||
call health#report_warn('Missing "neovim" npm (or yarn) package.',
|
||||
\ ['Run in shell: npm install -g neovim',
|
||||
\ 'Run in shell (if you use yarn): yarn global add neovim'])
|
||||
return
|
||||
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 latest_npm_cmd = has('win32') ?
|
||||
@@ -650,12 +575,14 @@ function! s:check_node() abort
|
||||
\ 'Are you behind a firewall or proxy?'])
|
||||
return
|
||||
endif
|
||||
if !empty(latest_npm)
|
||||
try
|
||||
let pkg_data = json_decode(latest_npm)
|
||||
catch /E474/
|
||||
return 'error: '.latest_npm
|
||||
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 = s:system(current_npm_cmd)
|
||||
@@ -676,85 +603,10 @@ function! s:check_node() abort
|
||||
endif
|
||||
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
|
||||
call s:check_clipboard()
|
||||
call s:check_python(2)
|
||||
call s:check_python(3)
|
||||
call s:check_virtualenv()
|
||||
call s:check_ruby()
|
||||
call s:check_node()
|
||||
call s:check_perl()
|
||||
endfunction
|
||||
|
@@ -1,7 +1,7 @@
|
||||
" Vim completion script
|
||||
" Language: HTML and XHTML
|
||||
" Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl )
|
||||
" Last Change: 2019 Sep 27
|
||||
" Last Change: 2014 Jun 20
|
||||
|
||||
" Distinguish between HTML versions.
|
||||
" 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.
|
||||
" It can be also value of attribute.
|
||||
" We have to get first word to offer proper completions
|
||||
if context =~ '^\s*$'
|
||||
" empty or whitespace line
|
||||
if context == ''
|
||||
let tag = ''
|
||||
else
|
||||
let tag = split(context)[0]
|
||||
@@ -486,7 +485,7 @@ function! htmlcomplete#CompleteTags(findstart, base)
|
||||
endif
|
||||
endif
|
||||
" 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*$"
|
||||
" Let do attribute specific completion
|
||||
let attrname = matchstr(attr, '.*\ze\s*=')
|
||||
|
@@ -1,9 +1,7 @@
|
||||
" Vim completion script
|
||||
" Language: Java Script
|
||||
" Maintainer: Jay Sitter (jay@jaysitter.com)
|
||||
" URL: https://github.com/jsit/javascriptcomplete.vim/
|
||||
" Previous Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl )
|
||||
" Last Change: 2020 Jul 30
|
||||
" Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl )
|
||||
" Last Change: 2017 Mar 04
|
||||
|
||||
function! javascriptcomplete#CompleteJS(findstart, base)
|
||||
if a:findstart
|
||||
@@ -156,30 +154,12 @@ function! javascriptcomplete#CompleteJS(findstart, base)
|
||||
\ 'text', 'vLink']
|
||||
let bodys = bodyprop
|
||||
" Document - document.
|
||||
let docuprop = ['anchors', 'body', 'characterSet', 'doctype',
|
||||
\ 'documentElement', 'documentURI', 'embeds', 'fonts', 'forms',
|
||||
\ 'head', 'hidden', 'images', 'implementation', 'lastStyleSheetSet',
|
||||
\ 'links', 'plugins', 'preferredStyleSheetSet', 'scripts',
|
||||
\ 'scrollingElement', 'selectedStyleSheetSet', 'styleSheetSets',
|
||||
\ 'timeline', 'visibilityState', 'cookie', 'defaultView',
|
||||
\ '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']
|
||||
|
||||
let docuprop = ['anchors', 'applets', 'childNodes', 'embeds', 'forms', 'images', 'links', 'stylesheets',
|
||||
\ 'body', 'cookie', 'documentElement', 'domain', 'lastModified', 'referrer', 'title', 'URL']
|
||||
let documeth = ['close', 'createAttribute', 'createElement', 'createTextNode', 'focus', 'getElementById',
|
||||
\ 'getElementsByName', 'getElementsByTagName', 'open', 'write', 'writeln',
|
||||
\ 'onClick', 'onDblClick', 'onFocus', 'onKeyDown', 'onKeyPress', 'onKeyUp',
|
||||
\ 'onMouseDown', 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp', 'onResize']
|
||||
call map(documeth, 'v:val."("')
|
||||
let docuxprop = ['attributes', 'childNodes', 'doctype', 'documentElement', 'firstChild',
|
||||
\ 'implementation', 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType',
|
||||
@@ -388,11 +368,9 @@ function! javascriptcomplete#CompleteJS(findstart, base)
|
||||
let xdomelemprop = ['attributes', 'childNodes', 'firstChild', 'lastChild',
|
||||
\ 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', 'nodeValue',
|
||||
\ 'ownerDocument', 'parentNode', 'prefix', 'previousSibling', 'tagName']
|
||||
let xdomelemmeth = ['appendChild', 'addEventListener', 'cloneNode',
|
||||
\ 'dispatchEvent', 'getAttribute', 'getAttributeNode',
|
||||
\ 'getElementsByTagName', 'hasChildNodes', 'insertBefore',
|
||||
\ 'normalize', 'removeAttribute', 'removeAttributeNode',
|
||||
\ 'removeChild', 'removeEventListener', 'replaceChild',
|
||||
let xdomelemmeth = ['appendChild', 'cloneNode', 'getAttribute', 'getAttributeNode',
|
||||
\ 'getElementsByTagName', 'hasChildNodes', 'insertBefore', 'normalize',
|
||||
\ 'removeAttribute', 'removeAttributeNode', 'removeChild', 'replaceChild',
|
||||
\ 'setAttribute', 'setAttributeNode']
|
||||
call map(xdomelemmeth, 'v:val."("')
|
||||
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')
|
||||
finish
|
||||
@@ -7,18 +7,32 @@ let s:loaded_man = 1
|
||||
|
||||
let s:find_arg = '-w'
|
||||
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
|
||||
if !has('win32') && $OSTYPE !~? 'cygwin\|linux' && system('uname -s') =~? 'SunOS' && system('uname -r') =~# '^5'
|
||||
let s:find_arg = '-l'
|
||||
endif
|
||||
" Check for -l support.
|
||||
call s:get_page(s:get_path('', 'man'))
|
||||
catch /E145:/
|
||||
" Ignore the error in restricted mode
|
||||
catch /command error .*/
|
||||
let s:localfile_arg = v:false
|
||||
endtry
|
||||
endfunction
|
||||
|
||||
function! man#open_page(count, mods, ...) abort
|
||||
function! man#open_page(count, count1, mods, ...) abort
|
||||
if a:0 > 2
|
||||
call s:error('too many arguments')
|
||||
return
|
||||
@@ -38,40 +52,51 @@ function! man#open_page(count, mods, ...) abort
|
||||
let ref = a:2.'('.a:1.')'
|
||||
endif
|
||||
try
|
||||
let [sect, name] = s:extract_sect_and_name_ref(ref)
|
||||
if a:count >= 0
|
||||
let [sect, name] = man#extract_sect_and_name_ref(ref)
|
||||
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)
|
||||
endif
|
||||
let path = s:verify_exists(sect, name)
|
||||
let [sect, name] = s:extract_sect_and_name_path(path)
|
||||
let [sect, name, path] = s:verify_exists(sect, name)
|
||||
catch
|
||||
call s:error(v:exception)
|
||||
return
|
||||
endtry
|
||||
|
||||
let [l:buf, l:save_tfu] = [bufnr(), &tagfunc]
|
||||
call s:push_tag()
|
||||
let bufname = 'man://'.name.(empty(sect)?'':'('.sect.')')
|
||||
|
||||
try
|
||||
setlocal tagfunc=man#goto_tag
|
||||
let l:target = l:name . '(' . l:sect . ')'
|
||||
set eventignore+=BufReadCmd
|
||||
if a:mods !~# 'tab' && s:find_man()
|
||||
execute 'silent keepalt tag' l:target
|
||||
execute 'silent keepalt edit' fnameescape(bufname)
|
||||
else
|
||||
execute 'silent keepalt' a:mods 'stag' l:target
|
||||
execute 'silent keepalt' a:mods 'split' fnameescape(bufname)
|
||||
endif
|
||||
call s:set_options(v:false)
|
||||
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
|
||||
|
||||
let b:man_sect = sect
|
||||
call s:put_page(page)
|
||||
endfunction
|
||||
|
||||
" Called when a man:// buffer is opened.
|
||||
function! man#read_page(ref) abort
|
||||
try
|
||||
let [sect, name] = s:extract_sect_and_name_ref(a:ref)
|
||||
let path = s:verify_exists(sect, name)
|
||||
let [sect, name] = s:extract_sect_and_name_path(path)
|
||||
let [sect, name] = man#extract_sect_and_name_ref(a:ref)
|
||||
let [sect, name, path] = s:verify_exists(sect, name)
|
||||
let page = s:get_page(path)
|
||||
catch
|
||||
call s:error(v:exception)
|
||||
@@ -123,20 +148,11 @@ function! s:system(cmd, ...) abort
|
||||
return opts.stdout
|
||||
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
|
||||
" Disable hard-wrap by using a big $MANWIDTH (max 1000 on some systems #9065).
|
||||
" Soft-wrap: ftplugin/man.vim sets wrap/breakindent/….
|
||||
" 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).
|
||||
" http://comments.gmane.org/gmane.editors.vim.devel/29085
|
||||
" Set MAN_KEEP_FORMATTING so Debian man doesn't discard backspaces.
|
||||
@@ -145,7 +161,8 @@ function! s:get_page(path) abort
|
||||
endfunction
|
||||
|
||||
function! s:put_page(page) abort
|
||||
setlocal modifiable noreadonly noswapfile
|
||||
setlocal modifiable
|
||||
setlocal noreadonly
|
||||
silent keepjumps %delete _
|
||||
silent put =a:page
|
||||
while getline(1) =~# '^\s*$'
|
||||
@@ -157,7 +174,7 @@ function! s:put_page(page) abort
|
||||
silent! keeppatterns keepjumps %s/\s\{199,}/\=repeat(' ', 10)/g
|
||||
1
|
||||
lua require("man").highlight_man_page()
|
||||
call s:set_options(v:false)
|
||||
setlocal filetype=man
|
||||
endfunction
|
||||
|
||||
function! man#show_toc() abort
|
||||
@@ -187,7 +204,7 @@ endfunction
|
||||
|
||||
" attempt to extract the name and sect out of 'name(sect)'
|
||||
" 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.
|
||||
throw 'manpage name cannot start with ''-'''
|
||||
endif
|
||||
@@ -197,21 +214,13 @@ function! s:extract_sect_and_name_ref(ref) abort
|
||||
if empty(name)
|
||||
throw 'manpage reference cannot contain only parentheses'
|
||||
endif
|
||||
return ['', s:spaces_to_underscores(name)]
|
||||
return [get(b:, 'man_default_sects', ''), name]
|
||||
endif
|
||||
let left = split(ref, '(')
|
||||
" see ':Man 3X curses' on why tolower.
|
||||
" TODO(nhooyr) Not sure if this is portable across OSs
|
||||
" but I have not seen a single uppercase section.
|
||||
return [tolower(split(left[1], ')')[0]), s:spaces_to_underscores(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')
|
||||
return [tolower(split(left[1], ')')[0]), left[0]]
|
||||
endfunction
|
||||
|
||||
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\+$', '', '')
|
||||
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
|
||||
let sect = a:sect
|
||||
if empty(sect)
|
||||
let sect = get(b:, 'man_default_sects', '')
|
||||
endif
|
||||
|
||||
try
|
||||
return s:get_path(sect, a:name)
|
||||
let path = s:get_path(a:sect, a:name)
|
||||
catch /^command error (/
|
||||
endtry
|
||||
|
||||
if !empty(get(b:, 'man_default_sects', '')) && sect !=# b:man_default_sects
|
||||
try
|
||||
return s:get_path(b:man_default_sects, a:name)
|
||||
let path = s:get_path(get(b:, 'man_default_sects', ''), a:name)
|
||||
catch /^command error (/
|
||||
let path = s:get_path('', a:name)
|
||||
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
|
||||
|
||||
" Extracts the name/section from the 'path/name.sect', because sometimes the actual section is
|
||||
" Extract the section from the path, because sometimes the actual section is
|
||||
" 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
|
||||
" still want the name of the buffer to be 'printf'.
|
||||
return s:extract_sect_and_name_path(path) + [path]
|
||||
endfunction
|
||||
|
||||
let s:tag_stack = []
|
||||
|
||||
function! s:push_tag() abort
|
||||
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
|
||||
let tail = fnamemodify(a:path, ':t')
|
||||
if a:path =~# '\.\%([glx]z\|bz2\|lzma\|Z\)$' " valid extensions
|
||||
@@ -295,16 +284,20 @@ function! s:extract_sect_and_name_path(path) abort
|
||||
endfunction
|
||||
|
||||
function! s:find_man() abort
|
||||
let l:win = 1
|
||||
while l:win <= winnr('$')
|
||||
let l:buf = winbufnr(l:win)
|
||||
if getbufvar(l:buf, '&filetype', '') ==# 'man'
|
||||
execute l:win.'wincmd w'
|
||||
if &filetype ==# 'man'
|
||||
return 1
|
||||
endif
|
||||
let l:win += 1
|
||||
endwhile
|
||||
elseif winnr('$') ==# 1
|
||||
return 0
|
||||
endif
|
||||
let thiswin = winnr()
|
||||
while 1
|
||||
wincmd w
|
||||
if &filetype ==# 'man'
|
||||
return 1
|
||||
elseif thiswin ==# winnr()
|
||||
return 0
|
||||
endif
|
||||
endwhile
|
||||
endfunction
|
||||
|
||||
function! s:error(msg) abort
|
||||
@@ -314,7 +307,7 @@ function! s:error(msg) abort
|
||||
echohl None
|
||||
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
|
||||
let args = split(a:cmd_line)
|
||||
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)
|
||||
endfunction
|
||||
|
||||
function! s:get_paths(sect, name, do_fallback) abort
|
||||
" callers must try-catch this, as some `man` implementations don't support `s:find_arg`
|
||||
function! s:complete(sect, psect, name) abort
|
||||
try
|
||||
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
|
||||
call s:error(v:exception)
|
||||
return
|
||||
endtry
|
||||
return paths
|
||||
catch
|
||||
if !a:do_fallback
|
||||
throw v:exception
|
||||
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
|
||||
endfunction
|
||||
|
||||
function! s:complete(sect, psect, name) abort
|
||||
let pages = s:get_paths(a:sect, a:name, v:false)
|
||||
let pages = globpath(mandirs,'man?/'.a:name.'*.'.a:sect.'*', 0, 1)
|
||||
" 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'))
|
||||
endfunction
|
||||
@@ -414,12 +386,7 @@ function! s:format_candidate(path, psect) abort
|
||||
endif
|
||||
endfunction
|
||||
|
||||
" Called when Nvim is invoked as $MANPAGER.
|
||||
function! man#init_pager() abort
|
||||
" https://github.com/neovim/neovim/issues/6828
|
||||
let og_modifiable = &modifiable
|
||||
setlocal modifiable
|
||||
|
||||
if getline(1) =~# '^\s*$'
|
||||
silent keepjumps 1delete _
|
||||
else
|
||||
@@ -430,44 +397,13 @@ function! man#init_pager() abort
|
||||
" know the correct casing, cf. `man glDrawArraysInstanced`).
|
||||
let ref = substitute(matchstr(getline(1), '^[^)]\+)'), ' ', '_', 'g')
|
||||
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
|
||||
let b:man_sect = ''
|
||||
endtry
|
||||
if -1 == match(bufname('%'), 'man:\/\/') " Avoid duplicate buffers, E95.
|
||||
execute 'silent file man://'.tolower(fnameescape(ref))
|
||||
endif
|
||||
|
||||
call s:set_options(v:true)
|
||||
let &l:modifiable = og_modifiable
|
||||
endfunction
|
||||
|
||||
function! man#goto_tag(pattern, flags, info) abort
|
||||
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()
|
||||
call s:init()
|
||||
|
@@ -56,7 +56,6 @@ function s:msgpack_init_python() abort
|
||||
\. " time = datetime.datetime.fromtimestamp(timestamp)\n"
|
||||
\. " return time.strftime(fmt)\n"
|
||||
\. "def shada_dict_strptime():\n"
|
||||
\. " import calendar\n"
|
||||
\. " import datetime\n"
|
||||
\. " import vim\n"
|
||||
\. " fmt = vim.eval('a:format')\n"
|
||||
@@ -65,10 +64,7 @@ function s:msgpack_init_python() abort
|
||||
\. " try:\n"
|
||||
\. " timestamp = int(timestamp.timestamp())\n"
|
||||
\. " except:\n"
|
||||
\. " try:\n"
|
||||
\. " timestamp = int(timestamp.strftime('%s'))\n"
|
||||
\. " except:\n"
|
||||
\. " timestamp = calendar.timegm(timestamp.utctimetuple())\n"
|
||||
\. " if timestamp > 2 ** 31:\n"
|
||||
\. " tsabs = abs(timestamp)\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
|
||||
" netrw's browsers' x command ("eXecute launcher")
|
||||
" Author: Charles E. Campbell
|
||||
" Date: Sep 18, 2020
|
||||
" Version: 11
|
||||
" Date: May 03, 2013
|
||||
" Version: 11b ASTRO-ONLY
|
||||
" Copyright: Copyright (C) 1999-2012 Charles E. Campbell {{{1
|
||||
" Permission is hereby granted to use and distribute this code,
|
||||
" with or without modifications, provided that this copyright
|
||||
@@ -20,7 +20,7 @@
|
||||
if exists("g:loaded_netrwFileHandlers") || &cp
|
||||
finish
|
||||
endif
|
||||
let g:loaded_netrwFileHandlers= "v11"
|
||||
let g:loaded_netrwFileHandlers= "v11b"
|
||||
if v:version < 702
|
||||
echohl WarningMsg
|
||||
echo "***warning*** this version of netrwFileHandlers needs vim 7.2"
|
||||
|
@@ -1,7 +1,7 @@
|
||||
" netrwSettings.vim: makes netrw settings simpler
|
||||
" Date: Aug 12, 2021
|
||||
" Maintainer: Charles E Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
|
||||
" Version: 17 ASTRO-ONLY
|
||||
" Date: Nov 09, 2016
|
||||
" Maintainer: Charles E Campbell <drchipNOSPAM at campbellfamily dot biz>
|
||||
" Version: 16
|
||||
" Copyright: Copyright (C) 1999-2007 Charles E. Campbell {{{1
|
||||
" Permission is hereby granted to use and distribute this code,
|
||||
" with or without modifications, provided that this copyright
|
||||
@@ -19,7 +19,7 @@
|
||||
if exists("g:loaded_netrwSettings") || &cp
|
||||
finish
|
||||
endif
|
||||
let g:loaded_netrwSettings = "v17"
|
||||
let g:loaded_netrwSettings = "v16"
|
||||
if v:version < 700
|
||||
echohl WarningMsg
|
||||
echo "***warning*** this version of netrwSettings needs vim 7.0"
|
||||
@@ -31,7 +31,7 @@ endif
|
||||
" NetrwSettings: {{{1
|
||||
fun! netrwSettings#NetrwSettings()
|
||||
" this call is here largely just to insure that netrw has been loaded
|
||||
call netrw#WinPath("")
|
||||
call netrw#SavePosn()
|
||||
if !exists("g:loaded_netrw")
|
||||
echohl WarningMsg | echomsg "***sorry*** netrw needs to be loaded prior to using NetrwSettings" | echohl None
|
||||
return
|
||||
|
@@ -18,5 +18,61 @@
|
||||
" holder be liable for any damages resulting from the use
|
||||
" of this software.
|
||||
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
|
||||
|
@@ -9,7 +9,7 @@
|
||||
"
|
||||
" let g:phpcomplete_relax_static_constraint = 1/0 [default 0]
|
||||
" 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]
|
||||
" 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
|
||||
" 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
|
||||
" 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.
|
||||
"
|
||||
" 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 })
|
||||
endif
|
||||
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
|
||||
if patched_ctags_detected
|
||||
no_namespace_matches = []
|
||||
@@ -810,7 +810,7 @@ function! phpcomplete#CompleteClassName(base, kinds, current_namespace, imports)
|
||||
endif
|
||||
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 tags = []
|
||||
@@ -926,11 +926,11 @@ function! s:getNextCharWithPos(filelines, current_pos) " {{{
|
||||
endfunction " }}}
|
||||
|
||||
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
|
||||
return 1
|
||||
else
|
||||
" check if every required modifier is present
|
||||
" check if every requred modifier is present
|
||||
for required_modifier in a:required_modifiers
|
||||
if index(a:modifiers, required_modifier) == -1
|
||||
return 0
|
||||
@@ -1258,7 +1258,7 @@ function! phpcomplete#GetCurrentInstruction(line_number, col_number, phpbegin) "
|
||||
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 == ','
|
||||
let first_coma_break_pos = len(instruction)
|
||||
endif
|
||||
@@ -1304,7 +1304,7 @@ function! phpcomplete#GetCurrentInstruction(line_number, col_number, phpbegin) "
|
||||
|
||||
" there were a "naked" coma in the instruction
|
||||
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 instruction = instruction[pos :]
|
||||
endif
|
||||
@@ -1316,7 +1316,7 @@ function! phpcomplete#GetCurrentInstruction(line_number, col_number, phpbegin) "
|
||||
" clear everything up until the first (
|
||||
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 depth = 1
|
||||
while i < len(instruction)
|
||||
@@ -1424,7 +1424,7 @@ function! phpcomplete#GetCallChainReturnType(classname_candidate, class_candidat
|
||||
let parts = split(substitute(type, '^\\', '', ''), '\')
|
||||
let class_candidate_namespace = join(parts[0:-2], '\')
|
||||
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)
|
||||
let class_candidate_namespace = classstructure.imports[class_candidate_namespace].name
|
||||
endif
|
||||
@@ -2023,7 +2023,7 @@ function! phpcomplete#GetCachedClassContents(classlocation, class_name) " {{{
|
||||
if getftime(classstructure.file) != classstructure.mtime
|
||||
let valid = 0
|
||||
" 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)
|
||||
endif
|
||||
endfor
|
||||
@@ -2037,7 +2037,7 @@ function! phpcomplete#GetCachedClassContents(classlocation, class_name) " {{{
|
||||
call remove(s:cache_classstructures, cache_key)
|
||||
call phpcomplete#ClearCachedClassContents(full_file_path)
|
||||
|
||||
" fall through for the read from files path
|
||||
" fall trough for the read from files path
|
||||
endif
|
||||
else
|
||||
call phpcomplete#ClearCachedClassContents(full_file_path)
|
||||
@@ -2590,7 +2590,7 @@ function! phpcomplete#GetCurrentNameSpace(file_lines) " {{{
|
||||
let search_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
|
||||
" file lines are reversed so we need to go backwards
|
||||
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
|
||||
" they can be either classes, interfaces or namespaces, no other thing is importable in php
|
||||
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 =~ '\\'
|
||||
let patched_ctags_detected = 0
|
||||
let [classname, namespace_for_classes] = phpcomplete#ExpandClassName(import.name, '\', {})
|
||||
@@ -2679,10 +2679,10 @@ function! phpcomplete#GetCurrentNameSpace(file_lines) " {{{
|
||||
let import['kind'] = 'i'
|
||||
let import['builtin'] = 1
|
||||
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'].'$')
|
||||
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')
|
||||
call extend(import, tag)
|
||||
let import['builtin'] = 0
|
||||
@@ -2900,7 +2900,7 @@ for [ext, data] in items(php_builtin['functions'])
|
||||
call extend(g:php_builtin_functions, data)
|
||||
endfor
|
||||
|
||||
" Built in class
|
||||
" Built in classs
|
||||
let g:php_builtin_classes = {}
|
||||
for [ext, data] in items(php_builtin['classes'])
|
||||
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)
|
||||
endfor
|
||||
|
||||
" When the classname not found or found but the tags doesn't contain that
|
||||
" class we will try to complete any method of any builtin class. To speed up
|
||||
" When the classname not found or found but the tags dosen't contain that
|
||||
" 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
|
||||
" builtin class information
|
||||
" builtin class informations
|
||||
let g:php_builtin_object_functions = {}
|
||||
|
||||
" When completing for 'everyting imaginable' (no class context, not a
|
||||
|
@@ -3,11 +3,8 @@
|
||||
" Start the provider and perform a 'poll' request
|
||||
"
|
||||
" 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}
|
||||
if a:0
|
||||
let job = extend(job, a:1)
|
||||
endif
|
||||
try
|
||||
let channel_id = jobstart(a:argv, job)
|
||||
if channel_id > 0 && rpcrequest(channel_id, 'poll') ==# 'ok'
|
||||
|
@@ -35,7 +35,8 @@ endfunction
|
||||
let s:selections = { '*': s:selection, '+': copy(s:selection) }
|
||||
|
||||
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 !exists('s:did_error_try_cmd')
|
||||
echohl WarningMsg
|
||||
@@ -54,10 +55,6 @@ function! s:cmd_ok(cmd) abort
|
||||
return v:shell_error == 0
|
||||
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:err = ''
|
||||
|
||||
@@ -74,73 +71,56 @@ function! provider#clipboard#Executable() abort
|
||||
return ''
|
||||
endif
|
||||
|
||||
let s:copy = {}
|
||||
let s:copy['+'] = s:split_cmd(get(g:clipboard.copy, '+', 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:copy = get(g:clipboard, 'copy', { '+': v:null, '*': v:null })
|
||||
let s:paste = get(g:clipboard, 'paste', { '+': v:null, '*': v:null })
|
||||
let s:cache_enabled = get(g:clipboard, 'cache_enabled', 0)
|
||||
return get(g:clipboard, 'name', 'g:clipboard')
|
||||
elseif has('mac')
|
||||
let s:copy['+'] = ['pbcopy']
|
||||
let s:paste['+'] = ['pbpaste']
|
||||
let s:copy['+'] = 'pbcopy'
|
||||
let s:paste['+'] = 'pbpaste'
|
||||
let s:copy['*'] = s:copy['+']
|
||||
let s:paste['*'] = s:paste['+']
|
||||
let s:cache_enabled = 0
|
||||
return 'pbcopy'
|
||||
elseif !empty($WAYLAND_DISPLAY) && executable('wl-copy') && executable('wl-paste')
|
||||
let s:copy['+'] = ['wl-copy', '--foreground', '--type', 'text/plain']
|
||||
let s:paste['+'] = ['wl-paste', '--no-newline']
|
||||
let s:copy['*'] = ['wl-copy', '--foreground', '--primary', '--type', 'text/plain']
|
||||
let s:paste['*'] = ['wl-paste', '--no-newline', '--primary']
|
||||
elseif exists('$WAYLAND_DISPLAY') && executable('wl-copy') && executable('wl-paste')
|
||||
let s:copy['+'] = 'wl-copy --foreground --type text/plain'
|
||||
let s:paste['+'] = 'wl-paste --no-newline'
|
||||
let s:copy['*'] = 'wl-copy --foreground --primary --type text/plain'
|
||||
let s:paste['*'] = 'wl-paste --no-newline --primary'
|
||||
return 'wl-copy'
|
||||
elseif !empty($DISPLAY) && executable('xclip')
|
||||
let s:copy['+'] = ['xclip', '-quiet', '-i', '-selection', 'clipboard']
|
||||
let s:paste['+'] = ['xclip', '-o', '-selection', 'clipboard']
|
||||
let s:copy['*'] = ['xclip', '-quiet', '-i', '-selection', 'primary']
|
||||
let s:paste['*'] = ['xclip', '-o', '-selection', 'primary']
|
||||
elseif exists('$DISPLAY') && executable('xclip')
|
||||
let s:copy['+'] = 'xclip -quiet -i -selection clipboard'
|
||||
let s:paste['+'] = 'xclip -o -selection clipboard'
|
||||
let s:copy['*'] = 'xclip -quiet -i -selection primary'
|
||||
let s:paste['*'] = 'xclip -o -selection primary'
|
||||
return 'xclip'
|
||||
elseif !empty($DISPLAY) && executable('xsel') && s:cmd_ok('xsel -o -b')
|
||||
let s:copy['+'] = ['xsel', '--nodetach', '-i', '-b']
|
||||
let s:paste['+'] = ['xsel', '-o', '-b']
|
||||
let s:copy['*'] = ['xsel', '--nodetach', '-i', '-p']
|
||||
let s:paste['*'] = ['xsel', '-o', '-p']
|
||||
elseif exists('$DISPLAY') && executable('xsel') && s:cmd_ok('xsel -o -b')
|
||||
let s:copy['+'] = 'xsel --nodetach -i -b'
|
||||
let s:paste['+'] = 'xsel -o -b'
|
||||
let s:copy['*'] = 'xsel --nodetach -i -p'
|
||||
let s:paste['*'] = 'xsel -o -p'
|
||||
return 'xsel'
|
||||
elseif executable('lemonade')
|
||||
let s:copy['+'] = ['lemonade', 'copy']
|
||||
let s:paste['+'] = ['lemonade', 'paste']
|
||||
let s:copy['*'] = ['lemonade', 'copy']
|
||||
let s:paste['*'] = ['lemonade', 'paste']
|
||||
let s:copy['+'] = 'lemonade copy'
|
||||
let s:paste['+'] = 'lemonade paste'
|
||||
let s:copy['*'] = 'lemonade copy'
|
||||
let s:paste['*'] = 'lemonade paste'
|
||||
return 'lemonade'
|
||||
elseif executable('doitclient')
|
||||
let s:copy['+'] = ['doitclient', 'wclip']
|
||||
let s:paste['+'] = ['doitclient', 'wclip', '-r']
|
||||
let s:copy['+'] = 'doitclient wclip'
|
||||
let s:paste['+'] = 'doitclient wclip -r'
|
||||
let s:copy['*'] = s:copy['+']
|
||||
let s:paste['*'] = s:paste['+']
|
||||
return 'doitclient'
|
||||
elseif executable('win32yank.exe')
|
||||
if has('wsl') && getftype(exepath('win32yank.exe')) == 'link'
|
||||
let win32yank = resolve(exepath('win32yank.exe'))
|
||||
else
|
||||
let win32yank = 'win32yank.exe'
|
||||
endif
|
||||
let s:copy['+'] = [win32yank, '-i', '--crlf']
|
||||
let s:paste['+'] = [win32yank, '-o', '--lf']
|
||||
let s:copy['+'] = 'win32yank.exe -i --crlf'
|
||||
let s:paste['+'] = 'win32yank.exe -o --lf'
|
||||
let s:copy['*'] = s:copy['+']
|
||||
let s:paste['*'] = s:paste['+']
|
||||
return 'win32yank'
|
||||
elseif executable('termux-clipboard-set')
|
||||
let s:copy['+'] = ['termux-clipboard-set']
|
||||
let s:paste['+'] = ['termux-clipboard-get']
|
||||
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', '-']
|
||||
elseif exists('$TMUX') && executable('tmux')
|
||||
let s:copy['+'] = 'tmux load-buffer -'
|
||||
let s:paste['+'] = 'tmux save-buffer -'
|
||||
let s:copy['*'] = s:copy['+']
|
||||
let s:paste['*'] = s:paste['+']
|
||||
return 'tmux'
|
||||
@@ -156,16 +136,7 @@ function! s:clipboard.get(reg) abort
|
||||
elseif s:selections[a:reg].owner > 0
|
||||
return s:selections[a:reg].data
|
||||
end
|
||||
|
||||
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
|
||||
return s:try_cmd(s:paste[a:reg])
|
||||
endfunction
|
||||
|
||||
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
|
||||
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
|
||||
end
|
||||
|
||||
@@ -196,17 +164,14 @@ function! s:clipboard.set(lines, regtype, reg) abort
|
||||
let s:selections[a:reg] = copy(s:selection)
|
||||
let selection = s:selections[a:reg]
|
||||
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.cwd = "/"
|
||||
let jobid = jobstart(selection.argv, selection)
|
||||
let jobid = jobstart(argv, selection)
|
||||
if jobid > 0
|
||||
call jobsend(jobid, a:lines)
|
||||
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 ret = 1
|
||||
else
|
||||
|
@@ -48,15 +48,11 @@ function! provider#node#can_inspect() abort
|
||||
endfunction
|
||||
|
||||
function! provider#node#Detect() abort
|
||||
let minver = [6, 0]
|
||||
if exists('g:node_host_prog')
|
||||
return [expand(g:node_host_prog, v:true), '']
|
||||
return expand(g:node_host_prog)
|
||||
endif
|
||||
if !executable('node')
|
||||
return ['', 'node not found (or not executable)']
|
||||
endif
|
||||
if !s:is_minimum_version(v:null, minver[0], minver[1])
|
||||
return ['', printf('node version %s.%s not found', minver[0], minver[1])]
|
||||
if !s:is_minimum_version(v:null, 6, 0)
|
||||
return ''
|
||||
endif
|
||||
|
||||
let npm_opts = {}
|
||||
@@ -76,7 +72,7 @@ function! provider#node#Detect() abort
|
||||
if has('unix')
|
||||
let yarn_default_path = $HOME . '/.config/yarn/global/' . yarn_opts.entry_point
|
||||
if filereadable(yarn_default_path)
|
||||
return [yarn_default_path, '']
|
||||
return yarn_default_path
|
||||
endif
|
||||
endif
|
||||
let yarn_opts.job_id = jobstart('yarn global dir', yarn_opts)
|
||||
@@ -86,18 +82,18 @@ function! provider#node#Detect() abort
|
||||
if !empty(npm_opts)
|
||||
let result = jobwait([npm_opts.job_id])
|
||||
if result[0] == 0 && npm_opts.result != ''
|
||||
return [npm_opts.result, '']
|
||||
return npm_opts.result
|
||||
endif
|
||||
endif
|
||||
|
||||
if !empty(yarn_opts)
|
||||
let result = jobwait([yarn_opts.job_id])
|
||||
if result[0] == 0 && yarn_opts.result != ''
|
||||
return [yarn_opts.result, '']
|
||||
return yarn_opts.result
|
||||
endif
|
||||
endif
|
||||
|
||||
return ['', 'failed to detect node']
|
||||
return ''
|
||||
endfunction
|
||||
|
||||
function! provider#node#Prog() abort
|
||||
@@ -143,7 +139,7 @@ endfunction
|
||||
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
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
|
||||
let python_plugins = remote#host#PluginsForHost(a:host.name)
|
||||
@@ -19,18 +18,18 @@ function! provider#pythonx#Require(host) abort
|
||||
call add(args, plugin.path)
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
function! s:get_python_candidates(major_version) abort
|
||||
return {
|
||||
\ 2: ['python2', 'python2.7', 'python2.6', 'python'],
|
||||
\ 3: ['python3', 'python3.10', 'python3.9', 'python3.8', 'python3.7',
|
||||
\ 'python3.6', 'python']
|
||||
\ 3: ['python3', 'python3.7', 'python3.6', 'python3.5', 'python3.4', 'python3.3',
|
||||
\ 'python']
|
||||
\ }[a:major_version]
|
||||
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)
|
||||
|
||||
if !empty(python_exe)
|
||||
return [exepath(expand(python_exe, v:true)), '']
|
||||
return [python_exe, '']
|
||||
endif
|
||||
|
||||
let candidates = s:get_python_candidates(a:major_version)
|
||||
@@ -67,7 +66,7 @@ endfunction
|
||||
function! s:import_module(prog, module) abort
|
||||
let prog_version = system([a:prog, '-c' , printf(
|
||||
\ '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])); ' .
|
||||
\ 'import pkgutil; ' .
|
||||
\ '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
|
||||
return [0, prog_path . ' is Python ' . prog_version . ' and cannot provide Python '
|
||||
\ . 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 >= '
|
||||
\ . min_version . '.']
|
||||
endif
|
||||
|
@@ -5,8 +5,7 @@ endif
|
||||
let g:loaded_ruby_provider = 1
|
||||
|
||||
function! provider#ruby#Detect() abort
|
||||
let e = empty(s:prog) ? 'missing ruby or ruby-host' : ''
|
||||
return [s:prog, e]
|
||||
return s:prog
|
||||
endfunction
|
||||
|
||||
function! provider#ruby#Prog() abort
|
||||
@@ -46,7 +45,7 @@ endfunction
|
||||
|
||||
function! s:detect()
|
||||
if exists("g:ruby_host_prog")
|
||||
return expand(g:ruby_host_prog, v:true)
|
||||
return expand(g:ruby_host_prog)
|
||||
elseif has('win32')
|
||||
return exepath('neovim-ruby-host.bat')
|
||||
else
|
||||
|
@@ -1,8 +1,7 @@
|
||||
"python3complete.vim - Omni Completion for python
|
||||
" Maintainer: <vacancy>
|
||||
" Previous Maintainer: Aaron Griffin <aaronmgriffin@gmail.com>
|
||||
" Maintainer: Aaron Griffin <aaronmgriffin@gmail.com>
|
||||
" 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
|
||||
"
|
||||
@@ -84,7 +83,7 @@ function! python3complete#Complete(findstart, base)
|
||||
break
|
||||
endif
|
||||
endwhile
|
||||
execute "py3 vimpy3complete('" . escape(cword, "'") . "', '" . escape(a:base, "'") . "')"
|
||||
execute "py3 vimpy3complete('" . cword . "', '" . a:base . "')"
|
||||
return g:python3complete_completions
|
||||
endif
|
||||
endfunction
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user