mirror of
https://github.com/neovim/neovim
synced 2025-07-25 07:41:53 +00:00
Compare commits
55 Commits
Author | SHA1 | Date | |
---|---|---|---|
0159e4daae | |||
c9e4f86b75 | |||
14cdaca6a8 | |||
7b0ae589f0 | |||
8ec5bc9126 | |||
959cf5e53c | |||
dc15b3a92c | |||
18375c6df6 | |||
7b1315fe61 | |||
27bac13be6 | |||
d26d489e2e | |||
a6eab6e25e | |||
cd8f6c5fb7 | |||
f8e0011534 | |||
7d67bd5865 | |||
2132c063af | |||
132053c1d2 | |||
51d6b26729 | |||
f7002337c0 | |||
6bda2f56eb | |||
be58ba250e | |||
d0e9a11e39 | |||
5c42376c15 | |||
41f761130e | |||
a265201307 | |||
33000bd9cf | |||
9f73b7c214 | |||
eaa1c47377 | |||
942b16adf7 | |||
cf62554e5a | |||
6436100b6e | |||
04cde576ed | |||
cd864748d3 | |||
09ff3146f3 | |||
f809664f89 | |||
d83df7f7b5 | |||
64dc7a1b55 | |||
5a813160ae | |||
917f306666 | |||
a9cca1b050 | |||
989ccb8222 | |||
2ae4c96d91 | |||
ae89330ec0 | |||
2229e99ef9 | |||
88336851ee | |||
3a0543bd61 | |||
008b83f5a2 | |||
915dda3f96 | |||
b6b12ea7c3 | |||
502a56867d | |||
78482138ae | |||
fe815244f0 | |||
56d86970b0 | |||
6c4f66f381 | |||
f589c2619b |
@ -1,10 +1,11 @@
|
||||
image: freebsd/latest
|
||||
image: freebsd/12.x
|
||||
|
||||
packages:
|
||||
- cmake
|
||||
- gmake
|
||||
- ninja
|
||||
- libtool
|
||||
- sha
|
||||
- automake
|
||||
- pkgconf
|
||||
- unzip
|
||||
@ -12,7 +13,6 @@ packages:
|
||||
- gettext
|
||||
- python
|
||||
- libffi
|
||||
- gdb
|
||||
|
||||
sources:
|
||||
- https://github.com/neovim/neovim
|
||||
@ -35,6 +35,10 @@ tasks:
|
||||
- unittest: |
|
||||
cd neovim
|
||||
gmake unittest
|
||||
- oldtest: |
|
||||
cd neovim
|
||||
gmake oldtest
|
||||
|
||||
# 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,6 +1,6 @@
|
||||
# sourcehut CI: https://builds.sr.ht/~jmk/neovim
|
||||
|
||||
image: openbsd/latest
|
||||
image: openbsd/6.9
|
||||
|
||||
packages:
|
||||
- autoconf-2.71
|
||||
@ -12,7 +12,6 @@ packages:
|
||||
- libtool
|
||||
- ninja-1.10.2p0
|
||||
- unzip-6.0p14
|
||||
- gdb
|
||||
|
||||
sources:
|
||||
- https://github.com/neovim/neovim
|
||||
|
@ -1,11 +1,11 @@
|
||||
BasedOnStyle: Google
|
||||
Language: Cpp
|
||||
ColumnLimit: 100
|
||||
ColumnLimit: 80
|
||||
IndentWidth: 2
|
||||
TabWidth: 8
|
||||
TabWidth: 2
|
||||
UseTab: Never
|
||||
IndentCaseLabels: false
|
||||
BreakBeforeBraces: Custom
|
||||
IndentCaseLabels: true
|
||||
BreakBeforeBraces: Linux
|
||||
AlignEscapedNewlinesLeft: false
|
||||
AllowShortFunctionsOnASingleLine: false
|
||||
AlignTrailingComments: true
|
||||
@ -17,24 +17,4 @@ AllowShortLoopsOnASingleLine: false
|
||||
BinPackParameters: false
|
||||
BreakBeforeBinaryOperators: true
|
||||
BreakBeforeTernaryOperators: true
|
||||
ContinuationIndentWidth: 2
|
||||
AlwaysBreakAfterDefinitionReturnType: None
|
||||
AlwaysBreakAfterReturnType: None
|
||||
AlwaysBreakBeforeMultilineStrings: No
|
||||
AlwaysBreakTemplateDeclarations: No
|
||||
AlignEscapedNewlines: DontAlign
|
||||
BinPackArguments: false
|
||||
BraceWrapping:
|
||||
AfterClass: false
|
||||
AfterControlStatement: false
|
||||
AfterEnum: false
|
||||
AfterFunction: true
|
||||
AfterObjCDeclaration: false
|
||||
AfterStruct: false
|
||||
AfterUnion: false
|
||||
BeforeCatch: false
|
||||
BeforeElse: false
|
||||
IndentBraces: false
|
||||
PointerAlignment: Right
|
||||
SortIncludes: false
|
||||
Cpp11BracedListStyle: false
|
||||
ContinuationIndentWidth: 4
|
||||
|
@ -8,9 +8,6 @@ end_of_line = lf
|
||||
insert_final_newline = true
|
||||
charset = utf-8
|
||||
|
||||
[*.{c,h,in,lua}]
|
||||
max_line_length = 100
|
||||
|
||||
[{Makefile,**/Makefile,runtime/doc/*.txt}]
|
||||
indent_style = tab
|
||||
indent_size = 8
|
||||
|
@ -1,53 +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
|
||||
4472c56d54f447040f6e8610b261b7efa0d04eb6
|
||||
a68faed02dc8e37b8f10da14dc02e33e6ed93947
|
||||
725cbe7d414f609e769081276f2a034e32a4337b
|
||||
7e3bdc75e44b9139d8afaea4381b53ae78b15746
|
||||
4ba12b3dda34472c193c9fa8ffd7d3bd5b6c04d6
|
||||
849f104c2789c884428fd45501912c6591a78e12
|
||||
38dd53c525054daf83dba27d7d46e90e8b41fa50
|
||||
6059784770c4c88fb6fe528b9f7634192fa1164e
|
||||
ee031eb5256bb83e0d6add2bae6fd943a4186ffe
|
||||
69e11b58b4db0952f11a5ff85aa7150b5f5b8db8
|
||||
271bb32855853b011fceaf0ad2f829bce66b2a19
|
||||
|
||||
# typos
|
||||
d238b8f6003d34cae7f65ff7585b48a2cd9449fb
|
||||
4547137aaff32b20172870a549d3a28a3c7adf1c
|
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -1,6 +1,7 @@
|
||||
*.h linguist-language=C
|
||||
src/nvim/testdir/test42.in diff
|
||||
.github/ export-ignore
|
||||
ci/ export-ignore
|
||||
.travis.yml export-ignore
|
||||
codecov.yml export-ignore
|
||||
.builds/ export-ignore
|
||||
|
34
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
34
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@ -0,0 +1,34 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Report a problem in Nvim
|
||||
title: ''
|
||||
labels: bug
|
||||
|
||||
---
|
||||
|
||||
<!-- Before reporting: search existing issues and check the FAQ. -->
|
||||
|
||||
- `nvim --version`:
|
||||
- Operating system/version:
|
||||
- Terminal name/version:
|
||||
- `$TERM`:
|
||||
|
||||
<!--
|
||||
If this report is about different behaviour between Nvim and Vim, make sure to
|
||||
read `:h vim-differences` first. Otherwise remove the next line.
|
||||
-->
|
||||
[ ] `vim -u DEFAULTS` (version: ) behaves differently
|
||||
|
||||
### 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
|
58
.github/ISSUE_TEMPLATE/lsp_bug_report.md
vendored
Normal file
58
.github/ISSUE_TEMPLATE/lsp_bug_report.md
vendored
Normal file
@ -0,0 +1,58 @@
|
||||
---
|
||||
name: Language server client bug report
|
||||
about: Report a built-in lsp problem in Nvim
|
||||
title: ''
|
||||
labels: bug, lsp
|
||||
|
||||
---
|
||||
|
||||
<!--
|
||||
Before reporting: search existing issues and check the 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.
|
||||
-->
|
||||
|
||||
- `nvim --version`:
|
||||
- language server name/version:
|
||||
- Operating system/version:
|
||||
|
||||
<details>
|
||||
<summary>nvim -c ":checkhealth nvim lspconfig"</summary>
|
||||
|
||||
<!-- Paste the results from `nvim -c ":checkhealth nvim lspconfig"` here. -->
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>lsp.log</summary>
|
||||
|
||||
<!--
|
||||
Please paste the lsp log before and after the problem.
|
||||
|
||||
You can set log level like this.
|
||||
`:lua vim.lsp.set_log_level("debug")`
|
||||
|
||||
You can find the location of the log with the following command.
|
||||
`:lua print(vim.lsp.get_log_path())`
|
||||
-->
|
||||
|
||||
</details>
|
||||
|
||||
### Steps to reproduce using nvim -u minimal_init.lua
|
||||
<!--
|
||||
Note, if the issue is with an autocompletion or other LSP plugin, please
|
||||
report to the upstream tracker. Download the minmal config with
|
||||
wget 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.
|
||||
-->
|
||||
|
||||
|
||||
```
|
||||
nvim -u minimal_init.lua
|
||||
```
|
||||
|
||||
### Actual behaviour
|
||||
|
||||
### Expected behaviour
|
||||
|
54
.github/ISSUE_TEMPLATE/lsp_bug_report.yml
vendored
54
.github/ISSUE_TEMPLATE/lsp_bug_report.yml
vendored
@ -1,54 +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: '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())`
|
38
.github/labeler.yml
vendored
38
.github/labeler.yml
vendored
@ -4,7 +4,7 @@
|
||||
|
||||
"lua":
|
||||
- runtime/lua/**/*
|
||||
- src/nvim/lua/*
|
||||
- src/nvim/lua
|
||||
|
||||
"tui":
|
||||
- src/nvim/tui/tui.*
|
||||
@ -14,52 +14,36 @@
|
||||
- runtime/lua/vim/treesitter.lua
|
||||
- runtime/lua/vim/treesitter/*
|
||||
|
||||
"diagnostic":
|
||||
- runtime/lua/vim/diagnostic.lua
|
||||
|
||||
"dependencies":
|
||||
- third-party/**/*
|
||||
|
||||
"spell":
|
||||
"topic: spell":
|
||||
- src/nvim/spell*
|
||||
|
||||
"terminal":
|
||||
"topic: :terminal":
|
||||
- src/nvim/terminal.*
|
||||
|
||||
"column":
|
||||
"topic: column":
|
||||
- src/nvim/mark.h
|
||||
- src/nvim/mark.c
|
||||
- src/nvim/sign*
|
||||
|
||||
"folds":
|
||||
"topic: folds":
|
||||
- src/nvim/fold*
|
||||
|
||||
"mouse":
|
||||
"topic: mouse":
|
||||
- src/nvim/mouse*
|
||||
|
||||
"documentation":
|
||||
- all: ["runtime/doc/*"]
|
||||
"topic: documentation":
|
||||
- runtime/doc/*
|
||||
|
||||
"clipboard":
|
||||
"topic: clipboard":
|
||||
- runtime/autoload/provider/clipboard.vim
|
||||
|
||||
"diff":
|
||||
"topic: diff":
|
||||
- src/nvim/diff.*
|
||||
|
||||
"build":
|
||||
"topic: build":
|
||||
- CMakeLists.txt
|
||||
- "**/CMakeLists.txt"
|
||||
- "**/Makefile"
|
||||
- "**/*.cmake"
|
||||
|
||||
"test":
|
||||
- all: ["test/**/*"]
|
||||
|
||||
"ci":
|
||||
- .github/labeler.yml
|
||||
- .github/workflows/**/*
|
||||
- .builds/*
|
||||
- ci/**/*
|
||||
|
||||
"filetype":
|
||||
- runtime/lua/vim/filetype.lua
|
||||
|
16
.github/scripts/remove-reviewers.js
vendored
16
.github/scripts/remove-reviewers.js
vendored
@ -1,16 +0,0 @@
|
||||
module.exports = async ({github, context}) => {
|
||||
const requestedReviewers = await github.rest.pulls.listRequestedReviewers({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
pull_number: context.issue.number
|
||||
});
|
||||
|
||||
const reviewers = requestedReviewers.data.users.map(e => e.login)
|
||||
|
||||
github.rest.pulls.removeRequestedReviewers({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
pull_number: context.issue.number,
|
||||
reviewers: reviewers
|
||||
});
|
||||
}
|
95
.github/scripts/reviews.js
vendored
95
.github/scripts/reviews.js
vendored
@ -1,95 +0,0 @@
|
||||
module.exports = async ({github, context}) => {
|
||||
const pr_data = await github.rest.pulls.get({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
pull_number: context.issue.number
|
||||
})
|
||||
const labels = pr_data.data.labels.map(e => e.name)
|
||||
|
||||
const reviewers = new Set()
|
||||
if (labels.includes('api')) {
|
||||
reviewers.add("bfredl")
|
||||
reviewers.add("gpanders")
|
||||
reviewers.add("muniter")
|
||||
}
|
||||
|
||||
if (labels.includes('build')) {
|
||||
reviewers.add("jamessan")
|
||||
}
|
||||
|
||||
if (labels.includes('ci')) {
|
||||
reviewers.add("jamessan")
|
||||
}
|
||||
|
||||
if (labels.includes('column')) {
|
||||
reviewers.add("lewis6991")
|
||||
}
|
||||
|
||||
if (labels.includes('diagnostic')) {
|
||||
reviewers.add("gpanders")
|
||||
}
|
||||
|
||||
if (labels.includes('diff')) {
|
||||
reviewers.add("lewis6991")
|
||||
}
|
||||
|
||||
if (labels.includes('dependencies')) {
|
||||
reviewers.add("jamessan")
|
||||
}
|
||||
|
||||
if (labels.includes('distribution')) {
|
||||
reviewers.add("jamessan")
|
||||
}
|
||||
|
||||
if (labels.includes('documentation')) {
|
||||
reviewers.add("clason")
|
||||
}
|
||||
|
||||
if (labels.includes('extmarks')) {
|
||||
reviewers.add("bfredl")
|
||||
}
|
||||
|
||||
if (labels.includes('filetype')) {
|
||||
reviewers.add("clason")
|
||||
reviewers.add("gpanders")
|
||||
}
|
||||
|
||||
if (labels.includes('gui')) {
|
||||
reviewers.add("glacambre")
|
||||
reviewers.add("smolck")
|
||||
}
|
||||
|
||||
if (labels.includes('lsp')) {
|
||||
reviewers.add("mfussenegger")
|
||||
reviewers.add("mjlbach")
|
||||
}
|
||||
|
||||
if (labels.includes('treesitter')) {
|
||||
reviewers.add("bfredl")
|
||||
reviewers.add("vigoux")
|
||||
}
|
||||
|
||||
if (labels.includes('typo')) {
|
||||
reviewers.add("dundargoc")
|
||||
}
|
||||
|
||||
if (labels.includes('ui')) {
|
||||
reviewers.add("bfredl")
|
||||
}
|
||||
|
||||
if (labels.includes('vim-patch')) {
|
||||
reviewers.add("seandewar")
|
||||
reviewers.add("zeertzjq")
|
||||
}
|
||||
|
||||
// Remove person that opened the PR since they can't review themselves
|
||||
const pr_opener = pr_data.data.user.login
|
||||
reviewers.delete(pr_opener)
|
||||
|
||||
github.rest.pulls.requestReviewers({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
pull_number: context.issue.number,
|
||||
reviewers: Array.from(reviewers)
|
||||
});
|
||||
}
|
20
.github/workflows/api-docs-check.yml
vendored
20
.github/workflows/api-docs-check.yml
vendored
@ -1,20 +0,0 @@
|
||||
name: Missing API docs
|
||||
on:
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened, ready_for_review]
|
||||
branches-ignore:
|
||||
- 'marvim/api-doc-update**'
|
||||
paths:
|
||||
- 'src/nvim/api/*.[ch]'
|
||||
- 'runtime/lua/**.lua'
|
||||
- 'runtime/doc/**'
|
||||
|
||||
jobs:
|
||||
call-regen-api-docs:
|
||||
if: github.event.pull_request.draft == false
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
uses: ./.github/workflows/api-docs.yml
|
||||
with:
|
||||
check_only: true
|
29
.github/workflows/api-docs.yml
vendored
29
.github/workflows/api-docs.yml
vendored
@ -1,23 +1,14 @@
|
||||
# Autogenerate the API docs on new commit to important branches
|
||||
# Also work as a check for PR's to not forget committing their doc changes
|
||||
# called from api-docs-check.yml
|
||||
name: Autogenerate API docs
|
||||
on:
|
||||
push:
|
||||
paths:
|
||||
- 'src/nvim/api/*.[ch]'
|
||||
- 'src/nvim/**.lua'
|
||||
- 'runtime/lua/**.lua'
|
||||
- 'runtime/doc/**'
|
||||
branches:
|
||||
- 'master'
|
||||
- 'release-[0-9]+.[0-9]+'
|
||||
workflow_dispatch:
|
||||
workflow_call:
|
||||
inputs:
|
||||
check_only:
|
||||
type: boolean
|
||||
default: false
|
||||
required: false
|
||||
|
||||
jobs:
|
||||
regen-api-docs:
|
||||
@ -35,9 +26,7 @@ jobs:
|
||||
- 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
|
||||
sudo env DEBIAN_FRONTEND=noninteractive apt-get install -y doxygen python3 python3-msgpack luajit
|
||||
|
||||
- name: Setup git config
|
||||
run: |
|
||||
@ -53,18 +42,10 @@ jobs:
|
||||
python3 scripts/gen_vimdoc.py
|
||||
printf '::set-output name=UPDATED_DOCS::%s\n' $([ -z "$(git diff)" ]; echo $?)
|
||||
|
||||
- name: FAIL, PR has not committed doc changes
|
||||
if: ${{ steps.docs.outputs.UPDATED_DOCS != 0 && inputs.check_only }}
|
||||
run: |
|
||||
echo "Job failed, run ./scripts/gen_vimdoc.py and commit your doc changes"
|
||||
echo "The doc generation produces the following changes:"
|
||||
git --no-pager diff
|
||||
exit 1
|
||||
|
||||
- name: Automatic PR
|
||||
if: ${{ steps.docs.outputs.UPDATED_DOCS != 0 && !inputs.check_only }}
|
||||
if: ${{ steps.docs.outputs.UPDATED_DOCS != 0 }}
|
||||
run: |
|
||||
git add -u
|
||||
git commit -m 'docs: regenerate [skip ci]'
|
||||
git commit -m 'docs: regenerate'
|
||||
git push --force https://${GITHUB_ACTOR}:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY} ${DOC_BRANCH}
|
||||
gh pr create --draft --fill --base ${GITHUB_REF#refs/heads/} --head ${DOC_BRANCH} || true
|
||||
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_target' &&
|
||||
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 }}
|
183
.github/workflows/ci.yml
vendored
183
.github/workflows/ci.yml
vendored
@ -1,143 +1,39 @@
|
||||
name: CI
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'master'
|
||||
- 'release-[0-9]+.[0-9]+'
|
||||
branches: '**'
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened, ready_for_review]
|
||||
branches:
|
||||
- 'master'
|
||||
- 'release-[0-9]+.[0-9]+'
|
||||
paths-ignore:
|
||||
- 'runtime/doc/*'
|
||||
|
||||
# Cancel any in-progress CI runs for a PR if it is updated
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.sha }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
# This job tests two things: it lints the code but also builds neovim using
|
||||
# system dependencies instead of bundled dependencies. This is to make sure
|
||||
# we are able to build neovim without pigeonholing ourselves into specifics
|
||||
# of the bundled dependencies.
|
||||
|
||||
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
|
||||
timeout-minutes: 10
|
||||
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 add-apt-repository ppa:neovim-ppa/stable
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y \
|
||||
autoconf \
|
||||
automake \
|
||||
build-essential \
|
||||
ccache \
|
||||
cmake \
|
||||
flake8 \
|
||||
gettext \
|
||||
gperf \
|
||||
libluajit-5.1-dev \
|
||||
libmsgpack-dev \
|
||||
libtermkey-dev \
|
||||
libtool-bin \
|
||||
libtree-sitter-dev \
|
||||
libunibilium-dev \
|
||||
libuv1-dev \
|
||||
libvterm-dev \
|
||||
locales \
|
||||
lua-busted \
|
||||
lua-check \
|
||||
lua-filesystem \
|
||||
lua-inspect \
|
||||
lua-lpeg \
|
||||
lua-luv-dev \
|
||||
lua-nvim \
|
||||
luajit \
|
||||
ninja-build \
|
||||
pkg-config
|
||||
|
||||
- name: Cache artifacts
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: |
|
||||
${{ env.CACHE_NVIM_DEPS_DIR }}
|
||||
~/.ccache
|
||||
key: lint-${{ hashFiles('cmake/*', '**/CMakeLists.txt', '!third-party/**CMakeLists.txt') }}-${{ github.base_ref }}
|
||||
|
||||
- name: Build third-party
|
||||
run: ./ci/before_script.sh
|
||||
|
||||
- name: Build nvim
|
||||
run: ./ci/run_tests.sh build_nvim
|
||||
|
||||
- if: "!cancelled()"
|
||||
name: clint-full
|
||||
run: ./ci/run_lint.sh clint-full
|
||||
|
||||
- if: "!cancelled()"
|
||||
name: lualint
|
||||
run: ./ci/run_lint.sh lualint
|
||||
|
||||
- if: "!cancelled()"
|
||||
name: pylint
|
||||
run: ./ci/run_lint.sh pylint
|
||||
|
||||
- if: "!cancelled()"
|
||||
name: shlint
|
||||
run: ./ci/run_lint.sh shlint
|
||||
|
||||
- if: "!cancelled()"
|
||||
name: check-single-includes
|
||||
run: ./ci/run_lint.sh check-single-includes
|
||||
|
||||
- name: Cache dependencies
|
||||
run: ./ci/before_cache.sh
|
||||
|
||||
posix:
|
||||
name: ${{ matrix.runner }} ${{ matrix.flavor }} (cc=${{ matrix.cc }})
|
||||
unixish:
|
||||
name: ${{ matrix.os }} ${{ matrix.flavor }} (cc=${{ matrix.cc }})
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- flavor: asan
|
||||
cc: clang-13
|
||||
cc: clang-12
|
||||
runner: ubuntu-20.04
|
||||
os: linux
|
||||
- flavor: lint
|
||||
cc: gcc
|
||||
runner: ubuntu-20.04
|
||||
os: linux
|
||||
- flavor: tsan
|
||||
cc: clang-13
|
||||
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
|
||||
|
||||
# The functionaltest-lua test two things simultaneously:
|
||||
# 1. Check that the tests pass with PUC Lua instead of LuaJIT.
|
||||
# 2. Use as oldest/minimum versions of dependencies/build tools we
|
||||
# still explicitly support so we don't accidentally rely on
|
||||
# features that is only available on later versions.
|
||||
- flavor: functionaltest-lua
|
||||
cc: gcc
|
||||
runner: ubuntu-20.04
|
||||
os: linux
|
||||
cmake: minimum_required
|
||||
runs-on: ${{ matrix.runner }}
|
||||
timeout-minutes: 45
|
||||
if: github.event.pull_request.draft == false
|
||||
env:
|
||||
CC: ${{ matrix.cc }}
|
||||
@ -145,7 +41,7 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Setup common environment variables
|
||||
- name: Setup commom environment variables
|
||||
run: ./.github/workflows/env.sh ${{ matrix.flavor }}
|
||||
|
||||
- name: Install apt packages
|
||||
@ -154,40 +50,27 @@ jobs:
|
||||
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
|
||||
if: matrix.cmake == 'minimum_required'
|
||||
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: 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 13
|
||||
sudo ./llvm.sh 12
|
||||
rm llvm.sh
|
||||
|
||||
- name: Install brew packages
|
||||
if: matrix.os == 'osx'
|
||||
run: |
|
||||
brew update --quiet
|
||||
brew install automake ccache cpanminus ninja
|
||||
# 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/install.sh
|
||||
run: |
|
||||
./ci/before_install.sh
|
||||
./ci/install.sh
|
||||
|
||||
- name: Cache dependencies
|
||||
uses: actions/cache@v2
|
||||
@ -195,36 +78,20 @@ jobs:
|
||||
path: |
|
||||
${{ env.CACHE_NVIM_DEPS_DIR }}
|
||||
~/.ccache
|
||||
key: ${{ matrix.runner }}-${{ matrix.flavor }}-${{ matrix.cc }}-${{ hashFiles('cmake/*', 'third-party/**', '**/CMakeLists.txt') }}-${{ github.base_ref }}
|
||||
key: ${{ runner.os }}-${{ matrix.flavor }}-${{ matrix.cc }}-${{ hashFiles('cmake/*', 'third-party/**', '**/CMakeLists.txt') }}-${{ github.base_ref }}
|
||||
|
||||
- name: Build third-party
|
||||
run: ./ci/before_script.sh
|
||||
|
||||
- name: Build
|
||||
run: ./ci/run_tests.sh build_nvim
|
||||
|
||||
- if: matrix.flavor != 'tsan' && matrix.flavor != 'functionaltest-lua' && !cancelled()
|
||||
name: Unittests
|
||||
run: ./ci/run_tests.sh unittests
|
||||
|
||||
- if: matrix.flavor != 'tsan' && !cancelled()
|
||||
name: Functionaltests
|
||||
run: ./ci/run_tests.sh functionaltests
|
||||
|
||||
- if: "!cancelled()"
|
||||
name: Oldtests
|
||||
run: ./ci/run_tests.sh oldtests
|
||||
|
||||
- if: "!cancelled()"
|
||||
name: Install nvim
|
||||
run: ./ci/run_tests.sh install_nvim
|
||||
- name: Build and test
|
||||
run: ./ci/script.sh
|
||||
|
||||
- name: Cache dependencies
|
||||
if: ${{ success() }}
|
||||
run: ./ci/before_cache.sh
|
||||
|
||||
windows:
|
||||
runs-on: windows-2019
|
||||
timeout-minutes: 45
|
||||
runs-on: windows-2016
|
||||
if: github.event.pull_request.draft == false
|
||||
env:
|
||||
DEPS_BUILD_DIR: ${{ format('{0}/nvim-deps', github.workspace) }}
|
||||
@ -233,7 +100,7 @@ jobs:
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
config: [ MINGW_64-gcov, MSVC_64 ]
|
||||
config: [ MINGW_64-gcov, MINGW_32, MSVC_64, MSVC_32 ]
|
||||
name: windows (${{ matrix.config }})
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
23
.github/workflows/commitlint.yml
vendored
23
.github/workflows/commitlint.yml
vendored
@ -1,23 +0,0 @@
|
||||
name: "Commit Linter"
|
||||
on:
|
||||
# Only pull_request and push honor [skip ci]. Since this workflow must pass
|
||||
# to merge a PR, it can't be skipped, so use pull_request_target
|
||||
pull_request_target:
|
||||
types: [opened, synchronize, reopened, ready_for_review]
|
||||
branches:
|
||||
- 'master'
|
||||
jobs:
|
||||
lint-commits:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.event.pull_request.draft == false
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
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})"
|
9
.github/workflows/env.sh
vendored
9
.github/workflows/env.sh
vendored
@ -34,23 +34,18 @@ case "$FLAVOR" in
|
||||
BUILD_FLAGS="$BUILD_FLAGS -DPREFER_LUA=ON"
|
||||
cat <<EOF >> "$GITHUB_ENV"
|
||||
CLANG_SANITIZER=ASAN_UBSAN
|
||||
SYMBOLIZER=asan_symbolize-13
|
||||
ASAN_OPTIONS=detect_leaks=1:check_initialization_order=1:log_path=$GITHUB_WORKSPACE/build/log/asan:intercept_tls_get_addr=0
|
||||
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
|
||||
CLANG_SANITIZER=TSAN
|
||||
EOF
|
||||
;;
|
||||
lint)
|
||||
# Re-enable once system deps are available
|
||||
# BUILD_FLAGS="$BUILD_FLAGS -DLIBLUV_LIBRARY:FILEPATH=/usr/lib/$(dpkg-architecture -qDEB_HOST_MULTIARCH)/lua/5.1/luv.so -DLIBLUV_INCLUDE_DIR:PATH=/usr/include/lua5.1"
|
||||
DEPS_CMAKE_FLAGS="$DEPS_CMAKE_FLAGS -DUSE_BUNDLED_LUV=ON"
|
||||
cat <<EOF >> "$GITHUB_ENV"
|
||||
USE_BUNDLED=OFF
|
||||
CI_TARGET=lint
|
||||
EOF
|
||||
;;
|
||||
|
38
.github/workflows/labeler.yml
vendored
38
.github/workflows/labeler.yml
vendored
@ -1,9 +1,7 @@
|
||||
name: "Pull Request Labeler"
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [opened]
|
||||
- pull_request_target
|
||||
jobs:
|
||||
|
||||
triage:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
@ -13,37 +11,3 @@ jobs:
|
||||
- uses: actions/labeler@main
|
||||
with:
|
||||
repo-token: "${{ secrets.GITHUB_TOKEN }}"
|
||||
sync-labels: ""
|
||||
|
||||
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:
|
||||
- name: "Extract commit type and add as label"
|
||||
run: gh pr edit "$PR_NUMBER" --add-label "$(echo "$PR_TITLE" | sed -E 's|([[:alpha:]]+)(\(.*\))?!?:.*|\1|')" || true
|
||||
- name: "Extract commit scope and add as label"
|
||||
run: gh pr edit "$PR_NUMBER" --add-label "$(echo "$PR_TITLE" | sed -E 's|[[:alpha:]]+\((.+)\)!?:.*|\1|')" || true
|
||||
- name: "Extract if the PR is a breaking change and add it as label"
|
||||
run: gh pr edit "$PR_NUMBER" --add-label "$(echo "$PR_TITLE" | sed -E 's|[[:alpha:]]+(\(.*\))?!:.*|breaking-change|')" || true
|
||||
|
||||
request-reviewer:
|
||||
if: github.event.pull_request.state == 'open' && github.event.pull_request.draft == false
|
||||
runs-on: ubuntu-latest
|
||||
needs: ["triage", "type-scope"]
|
||||
permissions:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: 'Request reviewers'
|
||||
uses: actions/github-script@v6
|
||||
with:
|
||||
script: |
|
||||
const script = require('./.github/scripts/reviews.js')
|
||||
await script({github, context})
|
||||
|
64
.github/workflows/notes.md
vendored
64
.github/workflows/notes.md
vendored
@ -1,64 +0,0 @@
|
||||
```
|
||||
${NVIM_VERSION}
|
||||
```
|
||||
|
||||
## Install
|
||||
|
||||
### Windows
|
||||
|
||||
#### Zip
|
||||
|
||||
1. Download **nvim-win64.zip**
|
||||
2. Extract the zip.
|
||||
3. Run `nvim-qt.exe`
|
||||
|
||||
#### MSI
|
||||
|
||||
1. Download **nvim-win64.msi**
|
||||
2. Run the MSI
|
||||
3. Search and run `nvim-qt.exe` or run `nvim.exe` on your CLI of choice.
|
||||
|
||||
### macOS
|
||||
|
||||
1. Download **nvim-macos.tar.gz**
|
||||
2. Extract: `tar xzvf nvim-macos.tar.gz`
|
||||
3. Run `./nvim-macos/bin/nvim`
|
||||
|
||||
### Linux (x64)
|
||||
|
||||
#### Tarball
|
||||
|
||||
1. Download **nvim-linux64.tar.gz**
|
||||
2. Extract: `tar xzvf nvim-linux64.tar.gz`
|
||||
3. Run `./nvim-linux64/bin/nvim`
|
||||
|
||||
#### Debian Package
|
||||
|
||||
1. Download **nvim-linux64.deb**
|
||||
2. Install the package using `sudo apt install ./nvim-linux64.deb`
|
||||
3. Run `nvim`
|
||||
|
||||
#### AppImage
|
||||
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_TAR}
|
||||
${SHA_LINUX_64_DEB}
|
||||
${SHA_APP_IMAGE}
|
||||
${SHA_APP_IMAGE_ZSYNC}
|
||||
${SHA_MACOS}
|
||||
${SHA_WIN_64_ZIP}
|
||||
${SHA_WIN_64_MSI}
|
||||
```
|
191
.github/workflows/release.yml
vendored
191
.github/workflows/release.yml
vendored
@ -39,17 +39,12 @@ jobs:
|
||||
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/"
|
||||
cpack -C $NVIM_BUILD_TYPE
|
||||
cd "$GITHUB_WORKSPACE/build/release"
|
||||
tar cfz nvim-linux64.tar.gz nvim-linux64
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: nvim-linux64
|
||||
path: build/nvim-linux64.tar.gz
|
||||
retention-days: 1
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: nvim-linux64
|
||||
path: build/nvim-linux64.deb
|
||||
path: build/release/nvim-linux64.tar.gz
|
||||
retention-days: 1
|
||||
|
||||
appimage:
|
||||
@ -78,57 +73,50 @@ jobs:
|
||||
retention-days: 1
|
||||
|
||||
macOS:
|
||||
runs-on: macos-11
|
||||
runs-on: macos-10.15
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Install brew packages
|
||||
run: |
|
||||
brew update --quiet
|
||||
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: Provision universal `libintl`
|
||||
run: |
|
||||
GETTEXT_PREFIX="$(brew --prefix gettext)"
|
||||
printf 'GETTEXT_PREFIX=%s\n' "$GETTEXT_PREFIX" >> $GITHUB_ENV
|
||||
bottle_tag="arm64_big_sur"
|
||||
brew fetch --bottle-tag="$bottle_tag" gettext
|
||||
cd "$(mktemp -d)"
|
||||
tar xf "$(brew --cache)"/**/*gettext*${bottle_tag}*.tar.gz
|
||||
lipo gettext/*/lib/libintl.a "${GETTEXT_PREFIX}/lib/libintl.a" -create -output libintl.a
|
||||
mv -f libintl.a /usr/local/lib/
|
||||
- name: Ensure static linkage to `libintl`
|
||||
run: |
|
||||
# We're about to mangle `gettext`, so let's remove any potentially broken
|
||||
# installs (e.g. curl, git) as those could interfere with our build.
|
||||
brew uninstall $(brew uses --installed --recursive gettext)
|
||||
brew unlink gettext
|
||||
ln -sf "$(brew --prefix)/opt/$(readlink "${GETTEXT_PREFIX}")/bin"/* /usr/local/bin/
|
||||
rm -f "$GETTEXT_PREFIX"
|
||||
- name: Build release
|
||||
run: |
|
||||
export MACOSX_DEPLOYMENT_TARGET="$(sw_vers -productVersion | cut -f1 -d.)"
|
||||
OSX_FLAGS="-DCMAKE_OSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} -DCMAKE_OSX_ARCHITECTURES=arm64\;x86_64"
|
||||
make CMAKE_BUILD_TYPE=${NVIM_BUILD_TYPE} \
|
||||
CMAKE_EXTRA_FLAGS="-DCMAKE_INSTALL_PREFIX:PATH= $OSX_FLAGS" \
|
||||
DEPS_CMAKE_FLAGS="$OSX_FLAGS -DUSE_BUNDLED_GPERF=OFF"
|
||||
make DESTDIR="$GITHUB_WORKSPACE/build/release/nvim-macos" install
|
||||
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"
|
||||
tar cfz nvim-macos.tar.gz nvim-macos
|
||||
- uses: actions/upload-artifact@v3
|
||||
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-2019
|
||||
runs-on: windows-2016
|
||||
env:
|
||||
DEPS_BUILD_DIR: ${{ format('{0}/nvim-deps', github.workspace) }}
|
||||
DEPS_PREFIX: ${{ format('{0}/nvim-deps/usr', github.workspace) }}
|
||||
@ -137,6 +125,8 @@ jobs:
|
||||
include:
|
||||
- config: MSVC_64
|
||||
archive: nvim-win64
|
||||
- config: MSVC_32
|
||||
archive: nvim-win32
|
||||
name: windows (${{ matrix.config }})
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
@ -145,36 +135,20 @@ jobs:
|
||||
- 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
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: ${{ matrix.archive }}
|
||||
path: build/${{ matrix.archive }}.msi
|
||||
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'
|
||||
@ -184,30 +158,23 @@ jobs:
|
||||
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
|
||||
run: echo 'SUBJECT=Nvim development (prerelease) build' >> $GITHUB_ENV
|
||||
- if: env.TAG_NAME != 'nightly'
|
||||
run: echo 'SUBJECT=Nvim release build' >> $GITHUB_ENV
|
||||
- if: env.TAG_NAME == 'nightly'
|
||||
uses: dev-drprasad/delete-tag-and-release@v0.1.2
|
||||
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
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
delete_release: true
|
||||
tag_name: nightly
|
||||
# `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_TAR=$(cat nvim-linux64.tar.gz.sha256sum)" >> $GITHUB_ENV
|
||||
sha256sum nvim-linux64.deb > nvim-linux64.deb.sha256sum
|
||||
echo "SHA_LINUX_64_DEB=$(cat nvim-linux64.deb.sha256sum)" >> $GITHUB_ENV
|
||||
echo "SHA_LINUX_64=$(cat nvim-linux64.tar.gz.sha256sum)" >> $GITHUB_ENV
|
||||
- name: Generate App Image SHA256 checksums
|
||||
run: |
|
||||
cd ./appimage
|
||||
@ -223,21 +190,77 @@ jobs:
|
||||
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 Win32 SHA256 checksums
|
||||
run: |
|
||||
cd ./nvim-win32
|
||||
sha256sum nvim-win32.zip > nvim-win32.zip.sha256sum
|
||||
echo "SHA_WIN_32=$(cat nvim-win32.zip.sha256sum)" >> $GITHUB_ENV
|
||||
- name: Generate Win64 SHA256 checksums
|
||||
run: |
|
||||
cd ./nvim-win64
|
||||
sha256sum nvim-win64.zip > nvim-win64.zip.sha256sum
|
||||
echo "SHA_WIN_64_ZIP=$(cat nvim-win64.zip.sha256sum)" >> $GITHUB_ENV
|
||||
sha256sum nvim-win64.msi > nvim-win64.msi.sha256sum
|
||||
echo "SHA_WIN_64_MSI=$(cat nvim-win64.msi.sha256sum)" >> $GITHUB_ENV
|
||||
- name: Publish release
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
NVIM_VERSION: ${{ needs.linux.outputs.version }}
|
||||
DEBUG: api
|
||||
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
|
||||
echo "SHA_WIN_64=$(cat nvim-win64.zip.sha256sum)" >> $GITHUB_ENV
|
||||
- uses: meeDamian/github-release@2.0
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
tag: ${{ env.TAG_NAME }}
|
||||
name: ${{ needs.linux.outputs.release }}
|
||||
prerelease: ${{ env.TAG_NAME == 'nightly' }}
|
||||
commitish: ${{ github.sha }}
|
||||
gzip: false
|
||||
allow_override: ${{ env.TAG_NAME == 'nightly' }}
|
||||
files: |
|
||||
nvim-macos.tar.gz:./nvim-macos/nvim-macos.tar.gz
|
||||
nvim-macos.tar.gz.sha256sum:./nvim-macos/nvim-macos.tar.gz.sha256sum
|
||||
nvim-linux64.tar.gz:./nvim-linux64/nvim-linux64.tar.gz
|
||||
nvim-linux64.tar.gz.sha256sum:./nvim-linux64/nvim-linux64.tar.gz.sha256sum
|
||||
nvim.appimage:./appimage/nvim.appimage
|
||||
nvim.appimage.sha256sum:./appimage/nvim.appimage.sha256sum
|
||||
nvim.appimage.zsync:./appimage/nvim.appimage.zsync
|
||||
nvim.appimage.zsync.sha256sum:./appimage/nvim.appimage.zsync.sha256sum
|
||||
nvim-win32.zip:./nvim-win32/nvim-win32.zip
|
||||
nvim-win32.zip.sha256sum:./nvim-win32/nvim-win32.zip.sha256sum
|
||||
nvim-win64.zip:./nvim-win64/nvim-win64.zip
|
||||
nvim-win64.zip.sha256sum:./nvim-win64/nvim-win64.zip.sha256sum
|
||||
body: |
|
||||
${{ env.SUBJECT }}
|
||||
```
|
||||
${{ needs.linux.outputs.version }}```
|
||||
|
||||
## Install
|
||||
|
||||
### Windows
|
||||
|
||||
1. Extract **nvim-win64.zip** (or **nvim-win32.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
|
||||
|
||||
```
|
||||
${{ env.SHA_LINUX_64 }}
|
||||
${{ env.SHA_APP_IMAGE }}
|
||||
${{ env.SHA_APP_IMAGE_ZSYNC }}
|
||||
${{ env.SHA_MACOS }}
|
||||
${{ env.SHA_WIN_64 }}
|
||||
${{ env.SHA_WIN_32 }}
|
||||
```
|
||||
|
17
.github/workflows/remove-reviewers-on-draft.yml
vendored
17
.github/workflows/remove-reviewers-on-draft.yml
vendored
@ -1,17 +0,0 @@
|
||||
name: "Remove reviewers"
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [converted_to_draft, closed]
|
||||
jobs:
|
||||
remove-reviewers:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: 'Remove reviewers'
|
||||
uses: actions/github-script@v6
|
||||
with:
|
||||
script: |
|
||||
const script = require('./.github/scripts/remove-reviewers.js')
|
||||
await script({github, context})
|
18
.github/workflows/reviews.yml
vendored
18
.github/workflows/reviews.yml
vendored
@ -1,18 +0,0 @@
|
||||
name: "Request reviews"
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [labeled, ready_for_review]
|
||||
jobs:
|
||||
request-reviewer:
|
||||
if: github.event.pull_request.state == 'open' && github.event.pull_request.draft == false
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: 'Request reviewers'
|
||||
uses: actions/github-script@v6
|
||||
with:
|
||||
script: |
|
||||
const script = require('./.github/scripts/reviews.js')
|
||||
await script({github, context})
|
2
.github/workflows/vim-patches.yml
vendored
2
.github/workflows/vim-patches.yml
vendored
@ -49,4 +49,4 @@ jobs:
|
||||
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 --draft --fill --label vim-patch --base ${GITHUB_REF#refs/heads/} --head ${VERSION_BRANCH} || true
|
||||
gh pr create --fill --label vim-patch --base ${GITHUB_REF#refs/heads/} --head ${VERSION_BRANCH} || true
|
||||
|
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,7 +1,6 @@
|
||||
# Tools
|
||||
/venv/
|
||||
compile_commands.json
|
||||
/.luarc.json
|
||||
|
||||
# IDEs
|
||||
/.vs/
|
||||
@ -14,8 +13,6 @@ compile_commands.json
|
||||
/tmp/
|
||||
/.clangd/
|
||||
/.cache/clangd/
|
||||
/.ccls-cache/
|
||||
/.clang-tidy
|
||||
|
||||
.DS_Store
|
||||
*.mo
|
||||
|
@ -25,11 +25,3 @@ ignore = {
|
||||
read_globals = {
|
||||
"vim",
|
||||
}
|
||||
|
||||
globals = {
|
||||
"vim.g",
|
||||
}
|
||||
|
||||
exclude_files = {
|
||||
'test/functional/fixtures/lua/syntax_error.lua',
|
||||
}
|
||||
|
134
.mailmap
134
.mailmap
@ -1,134 +0,0 @@
|
||||
Abdelhakeem <abdelhakeem.osama@hotmail.com> Abdelhakeem Osama
|
||||
Alvaro Muñoz <alvaro@pwntester.com> Alvaro Muñoz
|
||||
Andreas Johansson <andreas@ndrs.xyz> <ndreas@users.noreply.github.com>
|
||||
Andrew Pyatkov <mrbiggfoot@gmail.com> <mrbiggfoot@users.noreply.github.com>
|
||||
Anmol Sethi <hi@nhooyr.io> <anmol@aubble.com>
|
||||
Anmol Sethi <hi@nhooyr.io> <me@anmol.io>
|
||||
Anmol Sethi <hi@nhooyr.io> <nhooyr@users.noreply.github.com>
|
||||
BK1603 <chouhan.shreyansh2702@gmail.com> Shreyansh Chouhan
|
||||
Billy Su <g4691821@gmail.com> Billy SU
|
||||
Billy Vong <billyvg@gmail.com> <billyvg@users.noreply.github.com>
|
||||
Björn Linse <bjorn.linse@gmail.com> bfredl
|
||||
Carlos Hernandez <carlos@techbyte.ca> <hurricanehrndz@users.noreply.github.com>
|
||||
Chris Kipp <ckipp@pm.me> ckipp01
|
||||
Christian Clason <c.clason@uni-graz.at> <christian.clason@uni-due.de>
|
||||
Cédric Barreteau <> <cbarrete@users.noreply.github.com>
|
||||
Dan Aloni <alonid@gmail.com> <dan@kernelim.com>
|
||||
Daniel Hahler <git@thequod.de> <github@thequod.de>
|
||||
Eisuke Kawashima <e-kwsm@users.noreply.github.com> E Kawashima
|
||||
ElPiloto <luis.r.piloto@gmail.com> Luis Piloto
|
||||
Eliseo Martínez <eliseomarmol@gmail.com> Eliseo Martínez
|
||||
Fabian Viöl <f.vioel@googlemail.com> Fabian
|
||||
Florian Walch <florian@fwalch.com> <fwalch@users.noreply.github.com>
|
||||
Gabriel Cruz <gabs.oficial98@gmail.com> <LTKills@users.noreply.github.com>
|
||||
Gaelan Steele <gbs@canishe.com> Gaelan
|
||||
Gavin D. Howard <gavin@schedmd.com> <yzena.tech@gmail.com>
|
||||
George Zhao <zhaozg@gmail.com> <zhaozg@aliyun.com>
|
||||
George Zhao <zhaozg@gmail.com> George Zhao
|
||||
Gregory Anders <greg@gpanders.com> <8965202+gpanders@users.noreply.github.com>
|
||||
Gregory Anders <greg@gpanders.com> Greg Anders
|
||||
Grzegorz Milka <grzegorzmilka@gmail.com> Grzegorz
|
||||
Harm te Hennepe <dhtehennepe@gmail.com> <d.h.tehennepe@student.utwente.nl>
|
||||
Harm te Hennepe <dhtehennepe@gmail.com> <harm@tehennepe.org>
|
||||
Hirokazu Hata <h.hata.ai.t@gmail.com> <h-michael@users.noreply.github.com>
|
||||
Ihor Antonov <ngortheone@gmail.com> <ngortheone@users.noreply.github.com>
|
||||
J Phani Mahesh <phanimahesh@gmail.com> <github@phanimahesh.me>
|
||||
Jack Bracewell <FriedSock@users.noreply.github.com> <jack.bracewell@unboxedconsulting.com>
|
||||
Jack Bracewell <FriedSock@users.noreply.github.com> <jbtwentythree@gmail.com>
|
||||
Jacques Germishuys <jacquesg@striata.com> <jacquesg@users.noreply.github.com>
|
||||
Jakub Łuczyński <doubleloop@o2.pl> <doubleloop@users.noreply.github.com>
|
||||
James McCoy <jamessan@jamessan.com> <vega.james@gmail.com>
|
||||
Jan Edmund Lazo <jan.lazo@mail.utoronto.ca> <janedmundlazo@hotmail.com>
|
||||
Jan Viljanen <jan.a.viljanen@gmail.com> <jan.viljanen@greenpeace.org>
|
||||
Javier Lopez <graulopezjavier@gmail.com> Javier López
|
||||
Jit Yao Yap <jityao@gmail.com> <jityao+github@gmail.com>
|
||||
Jit Yao Yap <jityao@gmail.com> Jit
|
||||
John Gehrig <jdg.gehrig@gmail.com> <jgehrig@users.noreply.github.com>
|
||||
John Schmidt <john.schmidt.h@gmail.com> John
|
||||
John Szakmeister <john@szakmeister.net> <jszakmeister@users.noreply.github.com>
|
||||
Jonathan de Boyne Pollard <J.deBoynePollard-newsgroups@NTLWorld.com> <jdebp@users.noreply.github.com>
|
||||
Jonathan de Boyne Pollard <J.deBoynePollard-newsgroups@NTLWorld.com> <postmaster@localhost>
|
||||
Jurica Bradaric <jbradaric@gmail.com> <jbradaric@users.noreply.github.com>
|
||||
Jurica Bradaric <jbradaric@gmail.com> <jurica.bradaric@avl.com>
|
||||
KillTheMule <KillTheMule@users.noreply.github.com> <github@pipsfrank.de>
|
||||
Kwon-Young Choi <kwon-young.choi@hotmail.fr> Kwon-Young
|
||||
Lucas Hoffmann <l-m-h@web.de> <lucc@posteo.de>
|
||||
Lucas Hoffmann <l-m-h@web.de> <lucc@users.noreply.github.com>
|
||||
Marco Hinz <mh.codebro@gmail.com> <mh.codebro+github@gmail.com>
|
||||
Marvim the Paranoid Android <marvim@users.noreply.github.com> marvim
|
||||
Mateusz Czapliński <czapkofan@gmail.com> Mateusz Czaplinski
|
||||
Mathias Fussenegger <f.mathias@zignar.net> <mfussenegger@users.noreply.github.com>
|
||||
Mathias Fussenegger <f.mathias@zignar.net> Mathias Fußenegger
|
||||
Matt Wozniski <godlygeek@gmail.com> <godlygeek+git@gmail.com>
|
||||
Matthieu Coudron <mattator@gmail.com> <coudron@iij.ad.jp>
|
||||
Matthieu Coudron <mattator@gmail.com> <matthieu.coudron@upmc.fr>
|
||||
Matthieu Coudron <mattator@gmail.com> <mcoudron@hotmail.com>
|
||||
Matthieu Coudron <mattator@gmail.com> <teto@users.noreply.github.com>
|
||||
MichaHoffmann <michoffmann.potsdam@gmail.com> Michael Hoffmann
|
||||
MichaHoffmann <michoffmann.potsdam@gmail.com> micha
|
||||
Michael Ennen <mike.ennen@gmail.com> <brcolow@users.noreply.github.com>
|
||||
Michael Ennen <mike.ennen@gmail.com> brcolow
|
||||
Michael Reed <m.reed@mykolab.com> <Pyrohh@users.noreply.github.com>
|
||||
Michael Schupikov <michael@schupikov.de> <DarkDeepBlue@users.noreply.github.com>
|
||||
Nicolas Hillegeer <nicolas@hillegeer.com> <nicolashillegeer@gmail.com>
|
||||
Panashe M. Fundira <fundirap@gmail.com> Panashe Fundira
|
||||
Patrice Peterson <patrice.peterson@mailbox.org> runiq
|
||||
Pavel Platto <hinidu@gmail.com> Hinidu
|
||||
Petter Wahlman <petter@wahlman.no> <pwahlman@cisco.com>
|
||||
Poh Zi How <poh.zihow@gmail.com> pohzipohzi
|
||||
Rich Wareham <rjw57@cam.ac.uk> <rjw57@cantab.net>
|
||||
Rui Abreu Ferreira <equalsraf@users.noreply.github.com> @equalsraf
|
||||
Rui Abreu Ferreira <raf-ep@gmx.com> <equalsraf@users.noreply.github.com>
|
||||
Rui Abreu Ferreira <raf-ep@gmx.com> <rap-ep@gmx.com>
|
||||
Sam Wilson <tecywiz121@hotmail.com> <sawilson@akamai.com>
|
||||
Sander Bosma <sanderbosma@gmail.com> sander2
|
||||
Santos Gallegos <stsewd@protonmail.com> <santos_g@outlook.com>
|
||||
Sebastian Parborg <darkdefende@gmail.com> DarkDefender
|
||||
Shirasaka <tk.shirasaka@gmail.com> tk-shirasaka
|
||||
Shota <shotat@users.noreply.github.com> shotat
|
||||
Shougo Matsushita <Shougo.Matsu@gmail.com> Shougo
|
||||
Stephan Seitz <stephan.seitz@fau.de> <stephan.lauf@yahoo.de>
|
||||
Steven Sojka <Steven.Sojka@tdameritrade.com> <steelsojka@gmail.com>
|
||||
Steven Sojka <steelsojka@gmail.com> <steelsojka@users.noreply.github.com>
|
||||
TJ DeVries <devries.timothyj@gmail.com> <timothydvrs1234@gmail.com>
|
||||
Thomas Fehér <thomas.feher@yahoo.de> <thomasfeher@web.de>
|
||||
Thomas Vigouroux <tomvig38@gmail.com> <39092278+vigoux@users.noreply.github.com>
|
||||
Utkarsh Maheshwari <UtkarshME96@gmail.com> UTkarsh Maheshwari
|
||||
Utkarsh Maheshwari <utkarshme96@gmail.com> <UtkarshME96@gmail.com>
|
||||
VVKot <volodymyr.kot.ua@gmail.com> Volodymyr Kot
|
||||
Victor Adam <victor.adam@cofelyineo-gdfsuez.com> <Victor.Adam@derpymail.org>
|
||||
Wang Shidong <wsdjeg@outlook.com> <wsdjeg@users.noreply.github.com>
|
||||
Wei Huang <daviseago@gmail.com> davix
|
||||
Xu Cheng <xucheng@me.com> <xu-cheng@users.noreply.github.com>
|
||||
Yamakaky <yamakaky@gmail.com> <yamakaky@yamaworld.fr>
|
||||
Yegappan Lakshmanan <yegappan@yahoo.com> <4298407+yegappan@users.noreply.github.com>
|
||||
Yichao Zhou <broken.zhoug@gmail.com> Yichao Zhou <broken.zhou@gmail.com>
|
||||
Yichao Zhou <broken.zhoug@gmail.com> zhou13 <broken.zhou@gmail.com>
|
||||
Yorick Peterse <git@yorickpeterse.com> <yorick@yorickpeterse.com>
|
||||
ZyX <kp-pav@yandex.ru> <kp-pav@ya.ru>
|
||||
ZyX <kp-pav@yandex.ru> Nikolai Aleksandrovich Pavlov
|
||||
aph <a.hewson@gmail.com> Ashley Hewson
|
||||
butwerenotthereyet <58348703+butwerenotthereyet@users.noreply.github.com> We're Yet
|
||||
chemzqm <chemzqm@gmail.com> Qiming zhao
|
||||
chentau <tchen1998@gmail.com> Tony Chen
|
||||
dedmass <carlo.abelli@gmail.com> Carlo Abelli
|
||||
equal-l2 <eng.equall2@gmail.com> <equal-l2@users.noreply.github.com>
|
||||
francisco souza <fsouza@users.noreply.github.com> <108725+fsouza@users.noreply.github.com>
|
||||
glacambre <code@lacamb.re> <me@r4>
|
||||
glacambre <code@lacamb.re> Ghjuvan Lacambre
|
||||
ii14 <ii14@users.noreply.github.com> <59243201+ii14@users.noreply.github.com>
|
||||
jdrouhard <john@jmdtech.org> <github@jmdtech.org>
|
||||
kuuote <znmxodq1@gmail.com> <36663503+kuuote@users.noreply.github.com>
|
||||
matveyt <matthewtarasov@gmail.com> <35012635+matveyt@users.noreply.github.com>
|
||||
nate <nateozemon@gmail.com> nateozem
|
||||
ray-x <rayx.cn@gmail.com> rayx
|
||||
relnod <mail@paul-schiffers.de> <relnod@users.noreply.github.com>
|
||||
rockerBOO <rockerboo@gmail.com> Dave Lage
|
||||
rpigott <rpigott@berkeley.edu> Ronan Pigott
|
||||
sach1t <sach0010t@gmail.com> <sach1t@users.noreply.github.com>
|
||||
shade-of-noon <73705427+shade-of-noon@users.noreply.github.com> Edwin Pujols
|
||||
shadmansaleh <shadmansaleh3@gmail.com> <13149513+shadmansaleh@users.noreply.github.com>
|
||||
shadmansaleh <shadmansaleh3@gmail.com> Shadman
|
||||
sohnryang <loop.infinitely@gmail.com> 손량
|
||||
timeyyy <timeyyy_da_man@hotmail.com> Timothy C Eichler
|
||||
timeyyy <timeyyy_da_man@hotmail.com> timothy eichler
|
@ -133,6 +133,8 @@ jobs:
|
||||
- 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
|
||||
os: linux
|
||||
|
112
CMakeLists.txt
112
CMakeLists.txt
@ -2,8 +2,8 @@
|
||||
# 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)
|
||||
@ -12,9 +12,6 @@ endif()
|
||||
if(POLICY CMP0060)
|
||||
cmake_policy(SET CMP0060 NEW)
|
||||
endif()
|
||||
if(POLICY CMP0075)
|
||||
cmake_policy(SET CMP0075 NEW)
|
||||
endif()
|
||||
|
||||
# Point CMake at any custom modules we may ship
|
||||
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
|
||||
@ -71,8 +68,13 @@ else()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
list(INSERT CMAKE_PREFIX_PATH 0 ${DEPS_PREFIX})
|
||||
set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:${DEPS_PREFIX}/lib/pkgconfig")
|
||||
if(CMAKE_CROSSCOMPILING AND NOT UNIX)
|
||||
list(INSERT CMAKE_FIND_ROOT_PATH 0 ${DEPS_PREFIX})
|
||||
list(INSERT CMAKE_PREFIX_PATH 0 ${DEPS_PREFIX}/../host/bin)
|
||||
else()
|
||||
list(INSERT CMAKE_PREFIX_PATH 0 ${DEPS_PREFIX})
|
||||
set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:${DEPS_PREFIX}/lib/pkgconfig")
|
||||
endif()
|
||||
|
||||
# used for check_c_compiler_flag
|
||||
include(CheckCCompilerFlag)
|
||||
@ -134,12 +136,12 @@ 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 7)
|
||||
set(NVIM_VERSION_PATCH 2)
|
||||
set(NVIM_VERSION_MINOR 5)
|
||||
set(NVIM_VERSION_PATCH 1)
|
||||
set(NVIM_VERSION_PRERELEASE "") # for package maintainers
|
||||
|
||||
# API level
|
||||
set(NVIM_API_LEVEL 9) # Bump this after any API change.
|
||||
set(NVIM_API_LEVEL 7) # Bump this after any API change.
|
||||
set(NVIM_API_LEVEL_COMPAT 0) # Adjust this after a _breaking_ API change.
|
||||
set(NVIM_API_PRERELEASE false)
|
||||
|
||||
@ -279,9 +281,6 @@ if(MSVC)
|
||||
else()
|
||||
add_compile_options(-Wall -Wextra -pedantic -Wno-unused-parameter
|
||||
-Wstrict-prototypes -std=gnu99 -Wshadow -Wconversion
|
||||
-Wdouble-promotion
|
||||
-Wmissing-noreturn
|
||||
-Wmissing-format-attribute
|
||||
-Wmissing-prototypes)
|
||||
|
||||
check_c_compiler_flag(-Wimplicit-fallthrough HAVE_WIMPLICIT_FALLTHROUGH_FLAG)
|
||||
@ -289,27 +288,6 @@ else()
|
||||
add_compile_options(-Wimplicit-fallthrough)
|
||||
endif()
|
||||
|
||||
# Clang doesn't have -Wsuggest-attribute so check for each one.
|
||||
check_c_compiler_flag(-Wsuggest-attribute=pure HAVE_WSUGGEST_ATTRIBUTE_PURE)
|
||||
if(HAVE_WSUGGEST_ATTRIBUTE_PURE)
|
||||
add_compile_options(-Wsuggest-attribute=pure)
|
||||
endif()
|
||||
|
||||
check_c_compiler_flag(-Wsuggest-attribute=const HAVE_WSUGGEST_ATTRIBUTE_CONST)
|
||||
if(HAVE_WSUGGEST_ATTRIBUTE_CONST)
|
||||
add_compile_options(-Wsuggest-attribute=const)
|
||||
endif()
|
||||
|
||||
check_c_compiler_flag(-Wsuggest-attribute=malloc HAVE_WSUGGEST_ATTRIBUTE_MALLOC)
|
||||
if(HAVE_WSUGGEST_ATTRIBUTE_MALLOC)
|
||||
add_compile_options(-Wsuggest-attribute=malloc)
|
||||
endif()
|
||||
|
||||
check_c_compiler_flag(-Wsuggest-attribute=cold HAVE_WSUGGEST_ATTRIBUTE_COLD)
|
||||
if(HAVE_WSUGGEST_ATTRIBUTE_COLD)
|
||||
add_compile_options(-Wsuggest-attribute=cold)
|
||||
endif()
|
||||
|
||||
# On FreeBSD 64 math.h uses unguarded C11 extension, which taints clang
|
||||
# 3.4.1 used there.
|
||||
if(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD" AND CMAKE_C_COMPILER_ID MATCHES "Clang")
|
||||
@ -409,7 +387,7 @@ include_directories(SYSTEM ${LIBUV_INCLUDE_DIRS})
|
||||
find_package(Msgpack 1.0.0 REQUIRED)
|
||||
include_directories(SYSTEM ${MSGPACK_INCLUDE_DIRS})
|
||||
|
||||
find_package(LibLUV 1.43.0 REQUIRED)
|
||||
find_package(LibLUV 1.30.0 REQUIRED)
|
||||
include_directories(SYSTEM ${LIBLUV_INCLUDE_DIRS})
|
||||
|
||||
find_package(TreeSitter REQUIRED)
|
||||
@ -430,19 +408,6 @@ main(void)
|
||||
if(TS_HAS_SET_MATCH_LIMIT)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNVIM_TS_HAS_SET_MATCH_LIMIT")
|
||||
endif()
|
||||
check_c_source_compiles("
|
||||
#include <stdlib.h>
|
||||
#include <tree_sitter/api.h>
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
ts_set_allocator(malloc, calloc, realloc, free);
|
||||
return 0;
|
||||
}
|
||||
" TS_HAS_SET_ALLOCATOR)
|
||||
if(TS_HAS_SET_ALLOCATOR)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNVIM_TS_HAS_SET_ALLOCATOR")
|
||||
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)
|
||||
@ -578,33 +543,6 @@ endif()
|
||||
|
||||
message(STATUS "Using Lua interpreter: ${LUA_PRG}")
|
||||
|
||||
if(DEBUG)
|
||||
option(COMPILE_LUA "Pre-compile Lua sources into bytecode (for sources that are included in the binary)" OFF)
|
||||
else()
|
||||
option(COMPILE_LUA "Pre-compile Lua sources into bytecode (for sources that are included in the binary)" ON)
|
||||
endif()
|
||||
|
||||
if(COMPILE_LUA AND NOT WIN32)
|
||||
if(PREFER_LUA)
|
||||
foreach(CURRENT_LUAC_PRG luac5.1 luac)
|
||||
find_program(_CHECK_LUAC_PRG ${CURRENT_LUAC_PRG})
|
||||
if(_CHECK_LUAC_PRG)
|
||||
set(LUAC_PRG "${_CHECK_LUAC_PRG} -s -o - %s" CACHE STRING "Format for compiling to Lua bytecode")
|
||||
break()
|
||||
endif()
|
||||
endforeach()
|
||||
elseif(LUA_PRG MATCHES "luajit")
|
||||
check_lua_module(${LUA_PRG} "jit.bcsave" LUAJIT_HAS_JIT_BCSAVE)
|
||||
if(LUAJIT_HAS_JIT_BCSAVE)
|
||||
set(LUAC_PRG "${LUA_PRG} -b -s %s -" CACHE STRING "Format for compiling to Lua bytecode")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(LUAC_PRG)
|
||||
message(STATUS "Using Lua compiler: ${LUAC_PRG}")
|
||||
endif()
|
||||
|
||||
# Setup busted.
|
||||
find_program(BUSTED_PRG NAMES busted busted.bat)
|
||||
find_program(BUSTED_LUA_PRG busted-lua)
|
||||
@ -652,10 +590,12 @@ 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)
|
||||
list(APPEND TEST_TARGET_ARGS "USES_TERMINAL")
|
||||
if(NOT (${CMAKE_VERSION} VERSION_LESS 3.2.0))
|
||||
list(APPEND TEST_TARGET_ARGS "USES_TERMINAL")
|
||||
endif()
|
||||
|
||||
set(UNITTEST_PREREQS nvim-test unittest-headers)
|
||||
set(FUNCTIONALTEST_PREREQS nvim printenv-test printargs-test shell-test pwsh-test streams-test tty-test ${GENERATED_HELP_TAGS})
|
||||
set(FUNCTIONALTEST_PREREQS nvim printenv-test printargs-test shell-test streams-test tty-test ${GENERATED_HELP_TAGS})
|
||||
set(BENCHMARK_PREREQS nvim tty-test)
|
||||
|
||||
# Useful for automated build systems, if they want to manually run the tests.
|
||||
@ -751,13 +691,24 @@ endif()
|
||||
|
||||
if(LUACHECK_PRG)
|
||||
add_custom_target(lualint
|
||||
COMMAND ${LUACHECK_PRG} -q runtime/ scripts/ src/ test/
|
||||
COMMAND ${LUACHECK_PRG} -q runtime/ src/ test/ --exclude-files test/functional/fixtures/lua/syntax_error.lua
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
else()
|
||||
add_custom_target(lualint false
|
||||
COMMENT "lualint: LUACHECK_PRG not defined")
|
||||
endif()
|
||||
|
||||
set(CPACK_PACKAGE_NAME "Neovim")
|
||||
set(CPACK_PACKAGE_VENDOR "neovim.io")
|
||||
set(CPACK_PACKAGE_VERSION ${NVIM_VERSION_MEDIUM})
|
||||
set(CPACK_PACKAGE_INSTALL_DIRECTORY "Neovim")
|
||||
# Set toplevel directory/installer name as Neovim
|
||||
set(CPACK_PACKAGE_FILE_NAME "Neovim")
|
||||
set(CPACK_TOPLEVEL_TAG "Neovim")
|
||||
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)
|
||||
@ -769,8 +720,3 @@ if(NOT TARGET uninstall)
|
||||
add_custom_target(uninstall
|
||||
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/UninstallHelper.cmake)
|
||||
endif()
|
||||
|
||||
|
||||
if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR})
|
||||
add_subdirectory(packaging)
|
||||
endif()
|
||||
|
129
CONTRIBUTING.md
129
CONTRIBUTING.md
@ -7,11 +7,10 @@ Getting started
|
||||
If you want to help but don't know where to start, here are some
|
||||
low-risk/isolated tasks:
|
||||
|
||||
- Try a [complexity:low] issue.
|
||||
- [Merge a Vim patch].
|
||||
- Try a [good first issue](../../labels/good%20first%20issue) or [complexity:low] issue.
|
||||
- Fix bugs found by [Clang](#clang-scan-build), [PVS](#pvs-studio) or
|
||||
[Coverity](#coverity).
|
||||
- [Improve documentation][wiki-contribute-help]
|
||||
- [Merge a Vim patch] (familiarity with Vim is *strongly* recommended)
|
||||
|
||||
Reporting problems
|
||||
------------------
|
||||
@ -19,12 +18,11 @@ 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
|
||||
@ -39,12 +37,13 @@ Developer guidelines
|
||||
make distclean
|
||||
make # Nvim build system uses ninja automatically, if available.
|
||||
```
|
||||
- [Improve documentation][wiki-contribute-help]
|
||||
|
||||
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,25 +62,21 @@ 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.
|
||||
1. `[RFC]` is assumed by default, **do not** put "RFC" in the PR title (it adds
|
||||
noise to merge commit messages).
|
||||
2. Add `[WIP]` to the PR title if you are _not_ requesting feedback and the work
|
||||
is still in flux.
|
||||
3. Add `[RDY]` to the PR title 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 the [convential 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 as follows:
|
||||
|
||||
```
|
||||
<type>([optional scope]): <description>
|
||||
@ -91,27 +86,21 @@ the VCS/git logs more valuable. The general structure of a commit message is:
|
||||
[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."
|
||||
- **Prefix the commit subject with a _type_:** `doc:`, `test:`
|
||||
`runtime:`, ...
|
||||
- Subject line for commits with only style/lint changes can be a single
|
||||
word: `style` or `lint`.
|
||||
- **Add the optional scope following <type> if possible:** `(lsp)`, `(treesitter)`, `(multigrid)`, ...
|
||||
- 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.
|
||||
```
|
||||
- A blank line must separate the subject from the description.
|
||||
- Breaking changes must be indicated at the very beginning of the footer or body section of a commit. A breaking change must consist of the uppercase text BREAKING CHANGE, followed by a colon, a space, and a description of what has changed about the API.
|
||||
- Check your commit message for spelling and grammatical mistakes.
|
||||
- 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], [sourcehut]
|
||||
and [AppVeyor].
|
||||
|
||||
- CI builds are compiled with [`-Werror`][gcc-warnings], so compiler warnings
|
||||
will fail the build.
|
||||
@ -162,7 +151,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 +167,26 @@ 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
|
||||
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
|
||||
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.
|
||||
|
||||
If neovim exits unexpectedly, check `/tmp/nvim_asan.{PID}` (or your preferred `log_path`) for log files with error messages.
|
||||
|
||||
|
||||
Coding
|
||||
------
|
||||
@ -218,36 +206,20 @@ 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`:
|
||||
```
|
||||
if !empty(findfile('.clang-format', ';'))
|
||||
setlocal formatprg=clang-format\ -style=file
|
||||
endif
|
||||
```
|
||||
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.)
|
||||
- Explore the source code [on the web](https://sourcegraph.com/github.com/neovim/neovim).
|
||||
- If using [lua-language-server][], symlink `contrib/luarc.json` into the
|
||||
project root:
|
||||
|
||||
$ ln -s contrib/luarc.json .luarc.json
|
||||
|
||||
|
||||
Reviewing
|
||||
@ -256,10 +228,10 @@ Reviewing
|
||||
To help review pull requests, start with [this checklist][review-checklist].
|
||||
|
||||
Reviewing can be done on GitHub, but you may find it easier to do locally.
|
||||
Using [GitHub CLI][gh], you can create a new branch with the contents of a pull
|
||||
Using [`hub`][hub], you can create a new branch with the contents of a pull
|
||||
request, e.g. [#1820][1820]:
|
||||
|
||||
gh pr checkout https://github.com/neovim/neovim/pull/1820
|
||||
hub checkout https://github.com/neovim/neovim/pull/1820
|
||||
|
||||
Use [`git log -p master..FETCH_HEAD`][git-history-filtering] to list all
|
||||
commits in the feature branch which aren't in the `master` branch; `-p`
|
||||
@ -274,22 +246,19 @@ as context, use the `-W` argument as well.
|
||||
[git-rebasing]: http://git-scm.com/book/en/v2/Git-Branching-Rebasing
|
||||
[github-issues]: https://github.com/neovim/neovim/issues
|
||||
[1820]: https://github.com/neovim/neovim/pull/1820
|
||||
[gh]: https://cli.github.com/
|
||||
[hub]: https://hub.github.com/
|
||||
[conventional_commits]: https://www.conventionalcommits.org
|
||||
[style-guide]: https://neovim.io/doc/user/dev_style.html#dev-style
|
||||
[style-guide]: http://neovim.io/develop/style-guide.xml
|
||||
[ASan]: http://clang.llvm.org/docs/AddressSanitizer.html
|
||||
[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
|
||||
[Travis CI]: https://travis-ci.org/neovim/neovim
|
||||
[sourcehut]: https://builds.sr.ht/~jmk
|
||||
[GitHub Actions]: https://github.com/neovim/neovim/actions
|
||||
[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/pull-requests/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]: http://uncrustify.sourceforge.net/
|
||||
[lua-language-server]: https://github.com/sumneko/lua-language-server/
|
||||
|
@ -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.
|
||||
|
||||
====
|
||||
|
51
MAINTAIN.md
51
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
|
||||
--------------
|
||||
@ -52,45 +53,9 @@ has a major bug:
|
||||
3. Cut a release from `release-x.y`.
|
||||
- Run `./scripts/release.sh`
|
||||
- Update (force-push) the remote `stable` tag.
|
||||
- The [nightly job](https://github.com/neovim/neovim/blob/master/.github/workflows/release.yml#L4)
|
||||
- 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)
|
||||
|
||||
`scripts/bump-dep.sh` is a script that can automate this process for `LuaJIT`, `Luv`, `libuv` & `tree-sitter`. See usage guide:
|
||||
- Run `./scripts/bump-deps.sh --dep Luv --version 1.43.0-0` to update a dependency.
|
||||
See `./scripts/bump-deps.sh -h` for more detailed usage
|
||||
- Run `./scripts/bump-deps.sh --pr` to create a pr
|
||||
To generate the default PR title and body, the script uses the most recent commit (not in `master`) with prefix `build(deps): `
|
||||
|
||||
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
|
||||
--------
|
||||
|
||||
|
85
Makefile
85
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,29 @@ 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)
|
||||
# Only need to handle Ninja here. Make will inherit the VERBOSE variable, and the -j and -n flags.
|
||||
ifeq ($(BUILD_TYPE),Ninja)
|
||||
ifneq ($(VERBOSE),)
|
||||
BUILD_TOOL += -v
|
||||
BUILD_CMD += -v
|
||||
endif
|
||||
BUILD_TOOL += $(shell printf '%s' '$(MAKEFLAGS)' | grep -o -- ' *-[jl][0-9]\+ *')
|
||||
BUILD_CMD += $(shell printf '%s' '$(MAKEFLAGS)' | grep -o -- '-j[0-9]\+')
|
||||
ifeq (n,$(findstring n,$(firstword -$(MAKEFLAGS))))
|
||||
BUILD_TOOL += -n
|
||||
BUILD_CMD += -n
|
||||
endif
|
||||
endif
|
||||
|
||||
@ -89,22 +87,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 +110,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,31 +121,31 @@ 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)" SCRIPTS= $(MAKEOVERRIDES) $(patsubst %.vim,%,$(patsubst %.res,%,$(TEST_FILE)))
|
||||
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,%,$@)
|
||||
+$(SINGLE_MAKE) -C src/nvim/testdir NVIM_PRG="$(realpath build/bin/nvim)" 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
|
||||
$(BUILD_CMD) -C build lualint
|
||||
|
||||
shlint:
|
||||
@shellcheck --version | head -n 2
|
||||
@ -165,23 +163,16 @@ _opt_pylint:
|
||||
@command -v flake8 && { $(MAKE) pylint; exit $$?; } \
|
||||
|| echo "SKIP: pylint (flake8 not found)"
|
||||
|
||||
commitlint:
|
||||
$(NVIM_PRG) -u NONE -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
|
||||
@ -191,19 +182,19 @@ distclean:
|
||||
$(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 +205,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 _opt_shlint
|
||||
|
||||
# Generic pattern rules, allowing for `make build/bin/nvim` etc.
|
||||
# Does not work with "Unix Makefiles".
|
||||
ifeq ($(CMAKE_GENERATOR),Ninja)
|
||||
ifeq ($(BUILD_TYPE),Ninja)
|
||||
build/%: phony_force
|
||||
$(BUILD_TOOL) -C build $(patsubst build/%,%,$@)
|
||||
$(BUILD_CMD) -C build $(patsubst build/%,%,$@)
|
||||
|
||||
$(DEPS_BUILD_DIR)/%: phony_force
|
||||
$(BUILD_TOOL) -C $(DEPS_BUILD_DIR) $(patsubst $(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 shlint functionaltest unittest lint clint clean distclean nvim libnvim cmake deps install appimage checkprefix
|
||||
|
16
README.md
16
README.md
@ -1,12 +1,10 @@
|
||||
<h1 align="center">
|
||||
<img src="https://raw.githubusercontent.com/neovim/neovim.github.io/master/logos/neovim-logo-300x87.png" alt="Neovim">
|
||||
</h1>
|
||||
[](https://neovim.io)
|
||||
|
||||
[Documentation](https://neovim.io/doc/general/) |
|
||||
[Chat](https://app.element.io/#/room/#neovim:matrix.org) |
|
||||
[Chat](https://gitter.im/neovim/neovim) |
|
||||
[Twitter](https://twitter.com/Neovim)
|
||||
|
||||
[](https://github.com/neovim/neovim/actions?query=workflow%3ACI+branch%3Amaster+event%3Apush)
|
||||
[](https://github.com/neovim/neovim/actions?query=workflow%3A%22CI%22)
|
||||
[](https://codecov.io/gh/neovim/neovim)
|
||||
[](https://scan.coverity.com/projects/2227)
|
||||
[](https://neovim.io/doc/reports/clang)
|
||||
@ -48,7 +46,8 @@ 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
|
||||
-------------------
|
||||
@ -66,7 +65,7 @@ To install to a non-default location:
|
||||
make CMAKE_INSTALL_PREFIX=/full/path/
|
||||
make install
|
||||
|
||||
CMake hints for inspecting the build:
|
||||
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.
|
||||
@ -121,9 +120,8 @@ Apache 2.0 license, except for contributions copied from Vim (identified by the
|
||||
[Managed packages]: https://github.com/neovim/neovim/wiki/Installing-Neovim#install-from-package
|
||||
[Debian]: https://packages.debian.org/testing/neovim
|
||||
[Ubuntu]: http://packages.ubuntu.com/search?keywords=neovim
|
||||
[Fedora]: https://packages.fedoraproject.org/pkgs/neovim/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
|
||||
|
||||
|
@ -7,8 +7,6 @@ CI_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
source "${CI_DIR}/common/build.sh"
|
||||
source "${CI_DIR}/common/suite.sh"
|
||||
|
||||
mkdir -p "${HOME}/.cache"
|
||||
|
||||
echo "before_cache.sh: cache size"
|
||||
du -chd 1 "${HOME}/.cache" | sort -rh | head -20
|
||||
|
||||
@ -18,7 +16,7 @@ ccache -s 2>/dev/null || true
|
||||
find "${HOME}/.ccache" -name stats -delete
|
||||
|
||||
# Update the third-party dependency cache only if the build was successful.
|
||||
if ended_successfully && [ -d "${DEPS_BUILD_DIR}" ]; then
|
||||
if ended_successfully; then
|
||||
# Do not cache downloads. They should not be needed with up-to-date deps.
|
||||
rm -rf "${DEPS_BUILD_DIR}/build/downloads"
|
||||
rm -rf "${CACHE_NVIM_DEPS_DIR}"
|
||||
|
59
ci/before_install.sh
Executable file
59
ci/before_install.sh
Executable file
@ -0,0 +1,59 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
set -o pipefail
|
||||
|
||||
echo 'Python info:'
|
||||
(
|
||||
set -x
|
||||
python3 --version
|
||||
python2 --version
|
||||
python --version
|
||||
pip3 --version
|
||||
pip2 --version
|
||||
pip --version
|
||||
|
||||
pyenv --version
|
||||
pyenv versions
|
||||
) 2>&1 | sed 's/^/ /' || true
|
||||
|
||||
# Use pyenv, but not for OSX on Travis, where it only has the "system" version.
|
||||
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
|
||||
|
||||
echo 'Updated Python info:'
|
||||
(
|
||||
set -x
|
||||
python3 --version
|
||||
python2 --version
|
||||
python --version
|
||||
|
||||
python3 -m pip --version
|
||||
python2 -m pip --version
|
||||
) 2>&1 | sed 's/^/ /'
|
||||
fi
|
||||
|
||||
echo "Install node (LTS)"
|
||||
|
||||
if [[ "${TRAVIS_OS_NAME}" == osx ]] || [ ! -f ~/.nvm/nvm.sh ]; then
|
||||
curl -o ~/.nvm/nvm.sh https://raw.githubusercontent.com/creationix/nvm/master/nvm.sh
|
||||
fi
|
||||
|
||||
source ~/.nvm/nvm.sh
|
||||
nvm install 10
|
||||
|
||||
if [[ -n "$CMAKE_URL" ]]; then
|
||||
echo "Installing custom CMake: $CMAKE_URL"
|
||||
curl --retry 5 --silent --show-error --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
|
@ -6,6 +6,12 @@ set -o pipefail
|
||||
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."
|
||||
@ -21,6 +27,13 @@ ccache -s
|
||||
# Reset ccache stats for real results in before_cache.
|
||||
ccache --zero-stats
|
||||
|
||||
if [[ "${TRAVIS_OS_NAME}" == osx ]]; then
|
||||
# Adds user to a dummy group.
|
||||
# That allows to test changing the group of the file by `os_fchown`.
|
||||
sudo dscl . -create /Groups/chown_test
|
||||
sudo dscl . -append /Groups/chown_test GroupMembership "${USER}"
|
||||
fi
|
||||
|
||||
# Compile dependencies.
|
||||
build_deps
|
||||
|
||||
|
65
ci/build.ps1
65
ci/build.ps1
@ -72,31 +72,33 @@ 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
|
||||
# Update again in case updating pacman changes pacman.conf
|
||||
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') {
|
||||
$cmakeGeneratorArgs = '/verbosity:normal'
|
||||
$cmakeGenerator = 'Visual Studio 16 2019'
|
||||
}
|
||||
|
||||
if ($compiler -eq 'MSVC') {
|
||||
$installationPath = vswhere.exe -latest -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath
|
||||
if ($installationPath -and (test-path "$installationPath\Common7\Tools\vsdevcmd.bat")) {
|
||||
& "${env:COMSPEC}" /s /c "`"$installationPath\Common7\Tools\vsdevcmd.bat`" -arch=x${bits} -no_logo && set" | foreach-object {
|
||||
$name, $value = $_ -split '=', 2
|
||||
set-content env:\"$name" $value
|
||||
}
|
||||
if ($bits -eq 32) {
|
||||
$cmakeGenerator = 'Visual Studio 15 2017'
|
||||
}
|
||||
elseif ($bits -eq 64) {
|
||||
$cmakeGenerator = 'Visual Studio 15 2017 Win64'
|
||||
}
|
||||
}
|
||||
|
||||
if (-not $NoTests) {
|
||||
python -m ensurepip
|
||||
# Setup python (use AppVeyor system python)
|
||||
|
||||
# Disambiguate python3, if needed
|
||||
if (-not (Test-Path -Path C:\hostedtoolcache\windows\Python\3.5.4\x64\python3.exe) ) {
|
||||
move C:\hostedtoolcache\windows\Python\3.5.4\x64\python.exe C:\hostedtoolcache\windows\Python\3.5.4\x64\python3.exe
|
||||
}
|
||||
$env:PATH = "C:\hostedtoolcache\windows\Python\2.7.18\x64;C:\hostedtoolcache\windows\Python\3.5.4\x64;$env:PATH"
|
||||
|
||||
python -m pip install pynvim ; exitIfFailed
|
||||
python3 -m pip install pynvim ; exitIfFailed
|
||||
# Sanity check
|
||||
python -c "import pynvim; print(str(pynvim))" ; exitIfFailed
|
||||
python3 -c "import pynvim; print(str(pynvim))" ; exitIfFailed
|
||||
|
||||
gem.cmd install --pre neovim
|
||||
Get-Command -CommandType Application neovim-ruby-host.bat
|
||||
@ -106,35 +108,24 @@ if (-not $NoTests) {
|
||||
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)" }
|
||||
}
|
||||
|
||||
cd $env:DEPS_BUILD_DIR
|
||||
if ($compiler -eq 'MSVC') {
|
||||
if ($bits -eq 32) {
|
||||
cmake -G $cmakeGenerator -A Win32 $(convertToCmakeArgs($depsCmakeVars)) "$buildDir/third-party/" ; exitIfFailed
|
||||
} else {
|
||||
cmake -G $cmakeGenerator -A x64 $(convertToCmakeArgs($depsCmakeVars)) "$buildDir/third-party/" ; exitIfFailed
|
||||
}
|
||||
} else {
|
||||
cmake -G $cmakeGenerator $(convertToCmakeArgs($depsCmakeVars)) "$buildDir/third-party/" ; exitIfFailed
|
||||
}
|
||||
cmake -G $cmakeGenerator $(convertToCmakeArgs($depsCmakeVars)) "$buildDir/third-party/" ; exitIfFailed
|
||||
cmake --build . --config $cmakeBuildType -- $cmakeGeneratorArgs ; exitIfFailed
|
||||
cd $buildDir
|
||||
|
||||
# Build Neovim
|
||||
mkdir build
|
||||
cd build
|
||||
if ($compiler -eq 'MSVC') {
|
||||
if ($bits -eq 32) {
|
||||
cmake -G $cmakeGenerator -A Win32 $(convertToCmakeArgs($nvimCmakeVars)) .. ; exitIfFailed
|
||||
} else {
|
||||
cmake -G $cmakeGenerator -A x64 $(convertToCmakeArgs($nvimCmakeVars)) .. ; exitIfFailed
|
||||
}
|
||||
} else {
|
||||
cmake -G $cmakeGenerator $(convertToCmakeArgs($nvimCmakeVars)) .. ; exitIfFailed
|
||||
}
|
||||
cmake -G $cmakeGenerator $(convertToCmakeArgs($nvimCmakeVars)) .. ; exitIfFailed
|
||||
cmake --build . --config $cmakeBuildType -- $cmakeGeneratorArgs ; exitIfFailed
|
||||
.\bin\nvim --version ; exitIfFailed
|
||||
|
||||
@ -179,10 +170,8 @@ if (-not $NoTests) {
|
||||
}
|
||||
}
|
||||
|
||||
# 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 -C $cmakeBuildType
|
||||
cpack -G ZIP -C RelWithDebInfo
|
||||
if ($env:APPVEYOR_REPO_TAG_NAME -ne $null) {
|
||||
cpack -G NSIS -C RelWithDebInfo
|
||||
}
|
||||
|
@ -8,6 +8,8 @@ _stat() {
|
||||
|
||||
top_make() {
|
||||
printf '%78s\n' | tr ' ' '='
|
||||
# Travis has 1.5 virtual cores according to:
|
||||
# http://docs.travis-ci.com/user/speeding-up-the-build/#Paralellizing-your-build-on-one-VM
|
||||
ninja "$@"
|
||||
}
|
||||
|
||||
@ -44,9 +46,7 @@ build_deps() {
|
||||
cd "${CI_BUILD_DIR}"
|
||||
}
|
||||
|
||||
build_nvim() {
|
||||
check_core_dumps --delete quiet
|
||||
|
||||
prepare_build() {
|
||||
if test -n "${CLANG_SANITIZER}" ; then
|
||||
CMAKE_FLAGS="${CMAKE_FLAGS} -DCLANG_${CLANG_SANITIZER}=ON"
|
||||
fi
|
||||
@ -55,8 +55,9 @@ build_nvim() {
|
||||
cd "${BUILD_DIR}"
|
||||
echo "Configuring with '${CMAKE_FLAGS} $@'."
|
||||
cmake -G Ninja ${CMAKE_FLAGS} "$@" "${CI_BUILD_DIR}"
|
||||
}
|
||||
|
||||
|
||||
build_nvim() {
|
||||
echo "Building nvim."
|
||||
if ! top_make nvim ; then
|
||||
exit 1
|
||||
|
@ -4,7 +4,7 @@
|
||||
# Args:
|
||||
# $1: Flag(s) for codecov, separated by comma.
|
||||
|
||||
set -e
|
||||
set -ex
|
||||
|
||||
# Change to grandparent dir (POSIXly).
|
||||
CDPATH='' cd -P -- "$(dirname -- "$0")/../.." || exit
|
||||
@ -18,12 +18,12 @@ if ! [ -f "$codecov_sh" ]; then
|
||||
curl --retry 5 --silent --fail -o "$codecov_sh" https://codecov.io/bash
|
||||
chmod +x "$codecov_sh"
|
||||
|
||||
python -m pip install --quiet --user gcovr
|
||||
python3 -m pip install --quiet --user gcovr
|
||||
fi
|
||||
|
||||
(
|
||||
cd build
|
||||
python -m gcovr --branches --exclude-unreachable-branches --print-summary -j 2 --exclude '.*/auto/.*' --root .. --delete -o ../coverage.xml --xml
|
||||
python3 -m gcovr --branches --exclude-unreachable-branches --print-summary -j 2 --exclude '.*/auto/.*' --root .. --delete -o ../coverage.xml --xml
|
||||
)
|
||||
|
||||
# Upload to codecov.
|
||||
|
@ -1,3 +1,9 @@
|
||||
# HACK: get newline for use in strings given that "\n" and $'' do not work.
|
||||
NL="$(printf '\nE')"
|
||||
NL="${NL%E}"
|
||||
|
||||
FAIL_SUMMARY=""
|
||||
|
||||
# Test success marker. If END_MARKER file exists, we know that all tests
|
||||
# finished. If FAIL_SUMMARY_FILE exists we know that some tests failed, this
|
||||
# file will contain information about failed tests. Build is considered
|
||||
@ -5,27 +11,190 @@
|
||||
END_MARKER="$BUILD_DIR/.tests_finished"
|
||||
FAIL_SUMMARY_FILE="$BUILD_DIR/.test_errors"
|
||||
|
||||
ANSI_CLEAR="\033[0K"
|
||||
|
||||
if test "$TRAVIS" = "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/-$//')"
|
||||
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() {
|
||||
return 0
|
||||
}
|
||||
fi
|
||||
|
||||
enter_suite() {
|
||||
set +x
|
||||
FAILED=0
|
||||
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}"
|
||||
set -x
|
||||
}
|
||||
|
||||
exit_suite() {
|
||||
set +x
|
||||
if test $FAILED -ne 0 ; then
|
||||
echo "Suite ${NVIM_TEST_CURRENT_SUITE} failed, summary:"
|
||||
echo "${FAIL_SUMMARY}"
|
||||
else
|
||||
ci_fold end "${NVIM_TEST_CURRENT_SUITE}"
|
||||
fi
|
||||
export NVIM_TEST_CURRENT_SUITE="${NVIM_TEST_CURRENT_SUITE%/*}"
|
||||
if test "$1" != "--continue" ; then
|
||||
exit $FAILED
|
||||
else
|
||||
local saved_failed=$FAILED
|
||||
FAILED=0
|
||||
return $saved_failed
|
||||
fi
|
||||
}
|
||||
|
||||
fail() {
|
||||
local test_name="$1"
|
||||
local message="$2"
|
||||
local fail_char="$2"
|
||||
local message="$3"
|
||||
|
||||
: ${fail_char:=F}
|
||||
: ${message:=Test $test_name failed}
|
||||
|
||||
local full_msg="$test_name :: $message"
|
||||
local full_msg="$fail_char $NVIM_TEST_CURRENT_SUITE|$test_name :: $message"
|
||||
FAIL_SUMMARY="${FAIL_SUMMARY}${NL}${full_msg}"
|
||||
echo "${full_msg}" >> "${FAIL_SUMMARY_FILE}"
|
||||
echo "Failed: $full_msg"
|
||||
FAILED=1
|
||||
}
|
||||
|
||||
run_test() {
|
||||
local cmd="$1"
|
||||
test $# -gt 0 && shift
|
||||
local test_name="$1"
|
||||
: ${test_name:=$cmd}
|
||||
test $# -gt 0 && shift
|
||||
if ! eval "$cmd" ; then
|
||||
fail "${test_name}" "$@"
|
||||
fi
|
||||
}
|
||||
|
||||
run_test_wd() {
|
||||
local hang_ok=
|
||||
if test "$1" = "--allow-hang" ; then
|
||||
hang_ok=1
|
||||
shift
|
||||
fi
|
||||
|
||||
local timeout="$1"
|
||||
test $# -gt 0 && shift
|
||||
|
||||
local cmd="$1"
|
||||
test $# -gt 0 && shift
|
||||
|
||||
local restart_cmd="$1"
|
||||
: ${restart_cmd:=true}
|
||||
test $# -gt 0 && shift
|
||||
|
||||
local test_name="$1"
|
||||
: ${test_name:=$cmd}
|
||||
test $# -gt 0 && shift
|
||||
|
||||
local output_file="$(mktemp)"
|
||||
local status_file="$(mktemp)"
|
||||
local sid_file="$(mktemp)"
|
||||
|
||||
local restarts=5
|
||||
local prev_tmpsize=-1
|
||||
while test $restarts -gt 0 ; do
|
||||
: > "$status_file"
|
||||
: > "$sid_file"
|
||||
setsid \
|
||||
env \
|
||||
output_file="$output_file" \
|
||||
status_file="$status_file" \
|
||||
sid_file="$sid_file" \
|
||||
cmd="$cmd" \
|
||||
CI_DIR="$CI_DIR" \
|
||||
sh -c '
|
||||
. "${CI_DIR}/common/test.sh"
|
||||
ps -o sid= > "$sid_file"
|
||||
(
|
||||
ret=0
|
||||
if ! eval "$cmd" 2>&1 ; then
|
||||
ret=1
|
||||
fi
|
||||
echo "$ret" > "$status_file"
|
||||
) | tee -a "$output_file"
|
||||
'
|
||||
while test "$(stat -c "%s" "$status_file")" -eq 0 ; do
|
||||
prev_tmpsize=$tmpsize
|
||||
sleep $timeout
|
||||
tmpsize="$(stat -c "%s" "$output_file")"
|
||||
if test $tempsize -eq $prev_temsize ; then
|
||||
# no output, assuming either hang or exit
|
||||
break
|
||||
fi
|
||||
done
|
||||
restarts=$(( restarts - 1 ))
|
||||
if test "$(stat -c "%s" "$status_file")" -eq 0 ; then
|
||||
# Status file not updated, assuming hang
|
||||
|
||||
# SID not known, this should not ever happen
|
||||
if test "$(stat -c "%s" "$sid_file")" -eq 0 ; then
|
||||
fail "$test_name" E "Shell did not run"
|
||||
break
|
||||
fi
|
||||
|
||||
# Kill all processes which belong to one session: should get rid of test
|
||||
# processes as well as sh itself.
|
||||
pkill -KILL -s$(cat "$sid_file")
|
||||
|
||||
if test $restarts -eq 0 ; then
|
||||
if test -z "$hang_ok" ; then
|
||||
fail "$test_name" E "Test hang up"
|
||||
fi
|
||||
else
|
||||
echo "Test ${test_name} hang up, restarting"
|
||||
eval "$restart_cmd"
|
||||
fi
|
||||
else
|
||||
local new_failed="$(cat "$status_file")"
|
||||
if test "$new_failed" != "0" ; then
|
||||
fail "$test_name" F "Test failed in run_test_wd"
|
||||
fi
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
rm -f "$output_file"
|
||||
rm -f "$status_file"
|
||||
rm -f "$sid_file"
|
||||
}
|
||||
|
||||
ended_successfully() {
|
||||
if test -f "${FAIL_SUMMARY_FILE}" ; then
|
||||
echo 'Test failed, complete summary:'
|
||||
cat "${FAIL_SUMMARY_FILE}"
|
||||
|
||||
if [[ "$GITHUB_ACTIONS" == "true" ]]; then
|
||||
rm -f "$FAIL_SUMMARY_FILE"
|
||||
fi
|
||||
|
||||
return 1
|
||||
fi
|
||||
if ! test -f "${END_MARKER}" ; then
|
||||
|
@ -51,7 +51,7 @@ check_core_dumps() {
|
||||
fi
|
||||
done
|
||||
if test "$app" != quiet ; then
|
||||
fail 'cores' 'Core dumps found'
|
||||
fail 'cores' E 'Core dumps found'
|
||||
fi
|
||||
}
|
||||
|
||||
@ -72,7 +72,7 @@ check_logs() {
|
||||
rm "${log}"
|
||||
done
|
||||
if test -n "${err}" ; then
|
||||
fail 'logs' 'Runtime errors detected.'
|
||||
fail 'logs' E 'Runtime errors detected.'
|
||||
fi
|
||||
}
|
||||
|
||||
@ -86,39 +86,46 @@ check_sanitizer() {
|
||||
fi
|
||||
}
|
||||
|
||||
unittests() {(
|
||||
run_unittests() {(
|
||||
enter_suite unittests
|
||||
ulimit -c unlimited || true
|
||||
if ! build_make unittest ; then
|
||||
fail 'unittests' 'Unit tests failed'
|
||||
fail 'unittests' F 'Unit tests failed'
|
||||
fi
|
||||
submit_coverage unittest
|
||||
check_core_dumps "$(command -v luajit)"
|
||||
exit_suite
|
||||
)}
|
||||
|
||||
functionaltests() {(
|
||||
run_functionaltests() {(
|
||||
enter_suite functionaltests
|
||||
ulimit -c unlimited || true
|
||||
if ! build_make ${FUNCTIONALTEST}; then
|
||||
fail 'functionaltests' 'Functional tests failed'
|
||||
fail 'functionaltests' F 'Functional tests failed'
|
||||
fi
|
||||
submit_coverage functionaltest
|
||||
check_sanitizer "${LOG_DIR}"
|
||||
valgrind_check "${LOG_DIR}"
|
||||
check_core_dumps
|
||||
exit_suite
|
||||
)}
|
||||
|
||||
oldtests() {(
|
||||
run_oldtests() {(
|
||||
enter_suite oldtests
|
||||
ulimit -c unlimited || true
|
||||
if ! make oldtest; then
|
||||
reset
|
||||
fail 'oldtests' 'Legacy tests failed'
|
||||
fail 'oldtests' F 'Legacy tests failed'
|
||||
fi
|
||||
submit_coverage oldtest
|
||||
check_sanitizer "${LOG_DIR}"
|
||||
valgrind_check "${LOG_DIR}"
|
||||
check_core_dumps
|
||||
exit_suite
|
||||
)}
|
||||
|
||||
check_runtime_files() {(
|
||||
set +x
|
||||
local test_name="$1" ; shift
|
||||
local message="$1" ; shift
|
||||
local tst="$1" ; shift
|
||||
@ -129,25 +136,27 @@ check_runtime_files() {(
|
||||
# Prefer failing the build over using more robust construct because files
|
||||
# with IFS are not welcome.
|
||||
if ! test -e "$file" ; then
|
||||
fail "$test_name" "It appears that $file is only a part of the file name"
|
||||
fail "$test_name" E \
|
||||
"It appears that $file is only a part of the file name"
|
||||
fi
|
||||
if ! test "$tst" "$INSTALL_PREFIX/share/nvim/runtime/$file" ; then
|
||||
fail "$test_name" "$(printf "$message" "$file")"
|
||||
fail "$test_name" F "$(printf "$message" "$file")"
|
||||
fi
|
||||
done
|
||||
)}
|
||||
|
||||
install_nvim() {(
|
||||
enter_suite 'install_nvim'
|
||||
if ! build_make install ; then
|
||||
fail 'install' 'make install failed'
|
||||
exit 1
|
||||
fail 'install' E 'make install failed'
|
||||
exit_suite
|
||||
fi
|
||||
|
||||
"${INSTALL_PREFIX}/bin/nvim" --version
|
||||
if ! "${INSTALL_PREFIX}/bin/nvim" -u NONE -e -c ':help' -c ':qall' ; then
|
||||
echo "Running ':help' in the installed nvim failed."
|
||||
echo "Maybe the helptags have not been generated properly."
|
||||
fail 'help' 'Failed running :help'
|
||||
fail 'help' F 'Failed running :help'
|
||||
fi
|
||||
|
||||
# Check that all runtime files were installed
|
||||
@ -168,6 +177,13 @@ install_nvim() {(
|
||||
local genvimsynf=syntax/vim/generated.vim
|
||||
local gpat='syn keyword vimFuncName .*eval'
|
||||
if ! grep -q "$gpat" "${INSTALL_PREFIX}/share/nvim/runtime/$genvimsynf" ; then
|
||||
fail 'funcnames' "It appears that $genvimsynf does not contain $gpat."
|
||||
fail 'funcnames' F "It appears that $genvimsynf does not contain $gpat."
|
||||
fi
|
||||
|
||||
exit_suite
|
||||
)}
|
||||
|
||||
csi_clean() {
|
||||
find "${BUILD_DIR}/bin" -name 'test-includes-*' -delete
|
||||
find "${BUILD_DIR}" -name '*test-include*.o' -delete
|
||||
}
|
||||
|
@ -3,18 +3,31 @@
|
||||
set -e
|
||||
set -o pipefail
|
||||
|
||||
if [[ "${CI_TARGET}" == lint ]]; then
|
||||
python3 -m pip -q install --user --upgrade flake8
|
||||
exit
|
||||
fi
|
||||
|
||||
if [[ "${TRAVIS_OS_NAME}" == osx ]]; then
|
||||
export PATH="/usr/local/opt/ccache/libexec:$PATH"
|
||||
fi
|
||||
|
||||
# Use default CC to avoid compilation problems when installing Python modules.
|
||||
echo "Install neovim module for Python."
|
||||
CC=cc python -m pip -q install --user --upgrade pynvim
|
||||
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
|
||||
echo "Install neovim module for Python 2."
|
||||
CC=cc python2 -m pip -q install --user --upgrade pynvim
|
||||
fi
|
||||
|
||||
echo "Install neovim RubyGem."
|
||||
gem install --no-document --bindir "$HOME/.local/bin" --user-install --pre neovim
|
||||
|
||||
echo "Install neovim npm package"
|
||||
source ~/.nvm/nvm.sh
|
||||
nvm use 10
|
||||
npm install -g neovim
|
||||
npm link neovim
|
||||
|
||||
if [[ $CI_OS_NAME != osx ]]; then
|
||||
sudo cpanm -n Neovim::Ext || cat "$HOME/.cpanm/build.log"
|
||||
perl -W -e 'use Neovim::Ext; print $Neovim::Ext::VERSION'
|
||||
fi
|
||||
sudo cpanm -n Neovim::Ext || cat "$HOME/.cpanm/build.log"
|
||||
perl -W -e 'use Neovim::Ext; print $Neovim::Ext::VERSION'
|
||||
|
@ -8,17 +8,29 @@ CI_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
source "${CI_DIR}/common/build.sh"
|
||||
source "${CI_DIR}/common/suite.sh"
|
||||
|
||||
rm -f "$END_MARKER"
|
||||
enter_suite 'clint'
|
||||
run_test 'make clint-full' clint
|
||||
exit_suite --continue
|
||||
|
||||
# Run all tests if no input argument is given
|
||||
if (($# == 0)); then
|
||||
tests=('clint-full' 'lualint' 'pylint' 'shlint' 'check-single-includes')
|
||||
else
|
||||
tests=("$@")
|
||||
fi
|
||||
enter_suite 'lualint'
|
||||
run_test 'make lualint' lualint
|
||||
exit_suite --continue
|
||||
|
||||
for i in "${tests[@]}"; do
|
||||
make "$i" || fail "$i"
|
||||
done
|
||||
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 \
|
||||
10s \
|
||||
'make check-single-includes' \
|
||||
'csi_clean' \
|
||||
single-includes
|
||||
exit_suite --continue
|
||||
|
||||
end_tests
|
||||
|
@ -8,28 +8,33 @@ source "${CI_DIR}/common/build.sh"
|
||||
source "${CI_DIR}/common/test.sh"
|
||||
source "${CI_DIR}/common/suite.sh"
|
||||
|
||||
rm -f "$END_MARKER"
|
||||
enter_suite build
|
||||
|
||||
# Run all tests (with some caveats) if no input argument is given
|
||||
if (($# == 0)); then
|
||||
tests=('build_nvim')
|
||||
check_core_dumps --delete quiet
|
||||
|
||||
if test "$CLANG_SANITIZER" != "TSAN"; then
|
||||
# Additional threads are only created when the builtin UI starts, which
|
||||
# doesn't happen in the unit/functional tests
|
||||
if test "${FUNCTIONALTEST}" != "functionaltest-lua"; then
|
||||
tests+=('unittests')
|
||||
fi
|
||||
tests+=('functionaltests')
|
||||
prepare_build
|
||||
build_nvim
|
||||
|
||||
exit_suite --continue
|
||||
|
||||
source ~/.nvm/nvm.sh
|
||||
nvm use 10
|
||||
|
||||
|
||||
enter_suite tests
|
||||
|
||||
if test "$CLANG_SANITIZER" != "TSAN" ; then
|
||||
# Additional threads are only created when the builtin UI starts, which
|
||||
# doesn't happen in the unit/functional tests
|
||||
if test "${FUNCTIONALTEST}" != "functionaltest-lua"; then
|
||||
run_test run_unittests
|
||||
fi
|
||||
|
||||
tests+=('oldtests' 'install_nvim')
|
||||
else
|
||||
tests=("$@")
|
||||
run_test run_functionaltests
|
||||
fi
|
||||
run_test run_oldtests
|
||||
|
||||
for i in "${tests[@]}"; do
|
||||
eval "$i" || fail "$i"
|
||||
done
|
||||
run_test install_nvim
|
||||
|
||||
exit_suite --continue
|
||||
|
||||
end_tests
|
||||
|
@ -3,7 +3,14 @@
|
||||
set -e
|
||||
set -o pipefail
|
||||
|
||||
ci/run_${CI_TARGET}.sh
|
||||
# This will pass the environment variables down to a bash process which runs
|
||||
# as $USER, while retaining the environment variables defined and belonging
|
||||
# to secondary groups given above in usermod.
|
||||
if [[ "${TRAVIS_OS_NAME}" == osx ]]; then
|
||||
sudo -E su "${USER}" -c "ci/run_${CI_TARGET}.sh"
|
||||
else
|
||||
ci/run_${CI_TARGET}.sh
|
||||
fi
|
||||
|
||||
if [[ -s "${GCOV_ERROR_FILE}" ]]; then
|
||||
echo '=== Unexpected gcov errors: ==='
|
||||
|
@ -8,7 +8,7 @@ WEBHOOK_PAYLOAD="$(cat "${SNAP_DIR}/.snapcraft_payload")"
|
||||
PAYLOAD_SIG="${SECRET_SNAP_SIG}"
|
||||
|
||||
|
||||
snap_release_needed() {
|
||||
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
|
||||
@ -24,7 +24,7 @@ snap_release_needed() {
|
||||
|
||||
trigger_snapcraft_webhook() {
|
||||
[[ -n "${PAYLOAD_SIG}" ]] || exit
|
||||
echo "Triggering new snap release via webhook..."
|
||||
echo "Triggering new snap relase via webhook..."
|
||||
curl -X POST \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "X-Hub-Signature: sha1=${PAYLOAD_SIG}" \
|
||||
@ -33,7 +33,7 @@ trigger_snapcraft_webhook() {
|
||||
}
|
||||
|
||||
|
||||
if $(snap_release_needed); then
|
||||
if $(snap_realease_needed); then
|
||||
echo "New snap release required"
|
||||
trigger_snapcraft_webhook
|
||||
fi
|
||||
|
@ -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
|
||||
|
@ -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,17 +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()
|
||||
|
@ -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|microsoft-standard)")
|
||||
# Windows Subsystem for Linux
|
||||
set(HAVE_WSL 1)
|
||||
endif()
|
||||
|
||||
check_symbol_exists(_NSGetEnviron crt_externs.h HAVE__NSGETENVIRON)
|
||||
|
||||
# Headers
|
||||
@ -45,24 +50,10 @@ check_function_exists(readlink HAVE_READLINK)
|
||||
check_function_exists(setpgid HAVE_SETPGID)
|
||||
check_function_exists(setsid HAVE_SETSID)
|
||||
check_function_exists(sigaction HAVE_SIGACTION)
|
||||
check_function_exists(strnlen HAVE_STRNLEN)
|
||||
check_function_exists(strcasecmp HAVE_STRCASECMP)
|
||||
check_function_exists(strncasecmp HAVE_STRNCASECMP)
|
||||
check_function_exists(strptime HAVE_STRPTIME)
|
||||
|
||||
if(CMAKE_SYSTEM_NAME STREQUAL "SunOS")
|
||||
check_c_source_compiles("
|
||||
#include <termios.h>
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
return forkpty(0, NULL, NULL, NULL);
|
||||
}
|
||||
" HAVE_FORKPTY)
|
||||
else()
|
||||
set(HAVE_FORKPTY 1)
|
||||
endif()
|
||||
|
||||
# Symbols
|
||||
check_symbol_exists(FD_CLOEXEC "fcntl.h" HAVE_FD_CLOEXEC)
|
||||
if(HAVE_LANGINFO_H)
|
||||
@ -106,7 +97,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}
|
||||
|
@ -30,7 +30,6 @@
|
||||
#cmakedefine HAVE_SETPGID
|
||||
#cmakedefine HAVE_SETSID
|
||||
#cmakedefine HAVE_SIGACTION
|
||||
#cmakedefine HAVE_STRNLEN
|
||||
#cmakedefine HAVE_STRCASECMP
|
||||
#cmakedefine HAVE_STRINGS_H
|
||||
#cmakedefine HAVE_STRNCASECMP
|
||||
@ -40,6 +39,7 @@
|
||||
#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
|
||||
@ -50,7 +50,6 @@
|
||||
# undef HAVE_SYS_UIO_H
|
||||
# endif
|
||||
#endif
|
||||
#cmakedefine HAVE_FORKPTY
|
||||
|
||||
#cmakedefine FEAT_TUI
|
||||
|
||||
|
12
contrib/flake.lock
generated
12
contrib/flake.lock
generated
@ -2,11 +2,11 @@
|
||||
"nodes": {
|
||||
"flake-utils": {
|
||||
"locked": {
|
||||
"lastModified": 1644229661,
|
||||
"narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=",
|
||||
"lastModified": 1610051610,
|
||||
"narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797",
|
||||
"rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
@ -17,11 +17,11 @@
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1646254136,
|
||||
"narHash": "sha256-8nQx02tTzgYO21BP/dy5BCRopE8OwE8Drsw98j+Qoaw=",
|
||||
"lastModified": 1613226215,
|
||||
"narHash": "sha256-3rA5cGIrBHD6yeKhNhsF7/t461ww25oJY8KyBb0IhjU=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "3e072546ea98db00c2364b81491b893673267827",
|
||||
"rev": "ff96a0fa5635770390b184ae74debea75c3fd534",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -16,20 +16,24 @@
|
||||
neovim = pkgs.neovim-unwrapped.overrideAttrs (oa: {
|
||||
version = "master";
|
||||
src = ../.;
|
||||
|
||||
buildInputs = oa.buildInputs ++ ([
|
||||
pkgs.tree-sitter
|
||||
]);
|
||||
|
||||
cmakeFlags = oa.cmakeFlags ++ [
|
||||
"-DUSE_BUNDLED=OFF"
|
||||
];
|
||||
});
|
||||
|
||||
# a development binary to help debug issues
|
||||
neovim-debug = let
|
||||
stdenv = if pkgs.stdenv.isLinux then pkgs.llvmPackages_latest.stdenv else pkgs.stdenv;
|
||||
stdenv = pkgs.stdenvAdapters.keepDebugInfo (if pkgs.stdenv.isLinux then pkgs.llvmPackages_latest.stdenv else pkgs.stdenv);
|
||||
in
|
||||
((neovim.override {
|
||||
lua = pkgs.luajit;
|
||||
pkgs.enableDebugging ((neovim.override {
|
||||
lua = pkgs.enableDebugging pkgs.luajit;
|
||||
inherit stdenv;
|
||||
}).overrideAttrs (oa: {
|
||||
|
||||
dontStrip = true;
|
||||
NIX_CFLAGS_COMPILE = " -ggdb -Og";
|
||||
|
||||
cmakeBuildType = "Debug";
|
||||
cmakeFlags = oa.cmakeFlags ++ [
|
||||
"-DMIN_LOG_LEVEL=0"
|
||||
@ -38,10 +42,16 @@
|
||||
disallowedReferences = [];
|
||||
}));
|
||||
|
||||
# for neovim developers, beware of the slow binary
|
||||
# for neovim developers, builds a slow binary
|
||||
# huge closure size but aims at covering all scripts
|
||||
# brings development tools as well
|
||||
neovim-developer =
|
||||
let
|
||||
lib = nixpkgs.lib;
|
||||
pythonEnv = pkgs.python3.withPackages(ps: [
|
||||
ps.msgpack
|
||||
ps.flake8 # for 'make pylint'
|
||||
]);
|
||||
luacheck = pkgs.luaPackages.luacheck;
|
||||
in
|
||||
(neovim-debug.override ({ doCheck = pkgs.stdenv.isLinux; })).overrideAttrs (oa: {
|
||||
@ -49,11 +59,29 @@
|
||||
"-DLUACHECK_PRG=${luacheck}/bin/luacheck"
|
||||
"-DMIN_LOG_LEVEL=0"
|
||||
"-DENABLE_LTO=OFF"
|
||||
"-DUSE_BUNDLED=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"
|
||||
];
|
||||
|
||||
nativeBuildInputs = oa.nativeBuildInputs ++ (with pkgs; [
|
||||
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_OPTIONS="log_path=./test.log:abort_on_error=1"
|
||||
export UBSAN_OPTIONS=print_stacktrace=1
|
||||
'';
|
||||
});
|
||||
};
|
||||
} //
|
||||
@ -63,11 +91,6 @@
|
||||
overlays = [ self.overlay ];
|
||||
inherit system;
|
||||
};
|
||||
|
||||
pythonEnv = pkgs.python3.withPackages(ps: [
|
||||
ps.msgpack
|
||||
ps.flake8 # for 'make pylint'
|
||||
]);
|
||||
in
|
||||
rec {
|
||||
|
||||
@ -75,18 +98,6 @@
|
||||
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 = {
|
||||
@ -96,38 +107,6 @@
|
||||
|
||||
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
|
||||
'';
|
||||
});
|
||||
devShell = pkgs.neovim-developer;
|
||||
});
|
||||
}
|
||||
|
@ -27,7 +27,7 @@
|
||||
|
||||
# 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
|
||||
# step to take a significant amout of time, which is relevant when building
|
||||
# often. You can disable it explicitly:
|
||||
# CMAKE_EXTRA_FLAGS += -DENABLE_LTO=OFF
|
||||
|
||||
|
@ -1,23 +0,0 @@
|
||||
{
|
||||
"runtime.version": "LuaJIT",
|
||||
"diagnostics": {
|
||||
"enable": true,
|
||||
"globals": [
|
||||
"vim",
|
||||
"describe",
|
||||
"it",
|
||||
"before_each",
|
||||
"after_each",
|
||||
"setup",
|
||||
"teardown"
|
||||
]
|
||||
},
|
||||
"workspace": {
|
||||
"library": {
|
||||
"runtime/lua": true
|
||||
},
|
||||
"maxPreload": 2000,
|
||||
"preloadFileSize": 1000
|
||||
},
|
||||
"telemetry.enable": false
|
||||
}
|
1578
contrib/uncrustify.cfg
Normal file
1578
contrib/uncrustify.cfg
Normal file
File diff suppressed because it is too large
Load Diff
@ -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
|
||||
@ -177,7 +177,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 +201,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
|
||||
|
@ -1,64 +0,0 @@
|
||||
set(CPACK_PACKAGE_NAME "Neovim")
|
||||
set(CPACK_PACKAGE_VENDOR "neovim.io")
|
||||
set(CPACK_PACKAGE_FILE_NAME "nvim")
|
||||
|
||||
# From the GitHub About section
|
||||
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Vim-fork focused on extensibility and usability.")
|
||||
|
||||
set(CPACK_PACKAGE_INSTALL_DIRECTORY ${CPACK_PACKAGE_NAME})
|
||||
|
||||
# Pull the versions defined with the top level CMakeLists.txt
|
||||
set(CPACK_PACKAGE_VERSION_MAJOR ${NVIM_VERSION_MAJOR})
|
||||
set(CPACK_PACKAGE_VERSION_MINOR ${NVIM_VERSION_MINOR})
|
||||
set(CPACK_PACKAGE_VERSION_PATCH ${NVIM_VERSION_PATCH})
|
||||
|
||||
# CPACK_VERBATIM_VARIABLES ensures that the variables prefixed with *CPACK_*
|
||||
# are correctly passed to the cpack program.
|
||||
# This should always be set to true.
|
||||
set(CPACK_VERBATIM_VARIABLES TRUE)
|
||||
|
||||
set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE.txt")
|
||||
set(CPACK_RESOURCE_FILE_README ${PROJECT_SOURCE_DIR}/README.md)
|
||||
|
||||
|
||||
if(WIN32)
|
||||
set(CPACK_PACKAGE_FILE_NAME "nvim-win64")
|
||||
set(CPACK_GENERATOR ZIP WIX)
|
||||
|
||||
# WIX
|
||||
# CPACK_WIX_UPGRADE_GUID should be set, but should never change.
|
||||
# CPACK_WIX_PRODUCT_GUID should not be set (leave as default to auto-generate).
|
||||
|
||||
# The following guid is just a randomly generated guid that's been pasted here.
|
||||
# It has no special meaning other than to supply it to WIX.
|
||||
set(CPACK_WIX_UPGRADE_GUID "207A1A70-7B0C-418A-A153-CA6883E38F4D")
|
||||
set(CPACK_WIX_PRODUCT_ICON ${CMAKE_CURRENT_LIST_DIR}/neovim.ico)
|
||||
|
||||
# We use a wix patch to add further options to the installer. At present, it's just to add neovim to the path
|
||||
# on installation, however, it can be extended.
|
||||
# See: https://cmake.org/cmake/help/v3.7/module/CPackWIX.html#variable:CPACK_WIX_PATCH_FILE
|
||||
list(APPEND CPACK_WIX_EXTENSIONS WixUtilExtension)
|
||||
list(APPEND CPACK_WIX_PATCH_FILE ${CMAKE_CURRENT_LIST_DIR}/WixPatch.xml)
|
||||
elseif(APPLE)
|
||||
set(CPACK_PACKAGE_FILE_NAME "nvim-macos")
|
||||
set(CPACK_GENERATOR TGZ)
|
||||
set(CPACK_PACKAGE_ICON ${CMAKE_CURRENT_LIST_DIR}/neovim.icns)
|
||||
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||
set(CPACK_PACKAGE_FILE_NAME "nvim-linux64")
|
||||
set(CPACK_GENERATOR TGZ DEB)
|
||||
set(CPACK_DEBIAN_PACKAGE_NAME "Neovim") # required
|
||||
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Neovim.io") # required
|
||||
|
||||
# Automatically compute required shared lib dependencies.
|
||||
# Unfortunately, you "just need to know" that this has a hidden
|
||||
# dependency on dpkg-shlibdeps whilst using a debian based host.
|
||||
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS TRUE)
|
||||
else()
|
||||
set(CPACK_GENERATOR TGZ)
|
||||
endif()
|
||||
|
||||
# CPack variables are loaded in on the call to include(CPack). If you set
|
||||
# variables *after* the inclusion, they don't get updated within the CPack
|
||||
# config. Note that some CPack commands should still be run after it, such
|
||||
# as cpack_add_component().
|
||||
include(CPack)
|
@ -1,16 +0,0 @@
|
||||
<CPackWiXPatch>
|
||||
<!-- Fragment ID is from: <your build dir>/_CPack_Packages/win64/WIX/files.wxs -->
|
||||
<CPackWiXFragment Id="CM_CP_bin.nvim.exe">
|
||||
<!-- Note: if we were to specify Value='[INSTALL_ROOT]\bin' - with a backslash, the installer will still
|
||||
use a forward slash in the path. -->
|
||||
<Environment
|
||||
Id='UpdatePath'
|
||||
Name='PATH'
|
||||
Action='set'
|
||||
Permanent='no'
|
||||
System='yes'
|
||||
Part='last'
|
||||
Value='[INSTALL_ROOT]/bin'
|
||||
/>
|
||||
</CPackWiXFragment>
|
||||
</CPackWiXPatch>
|
Binary file not shown.
Binary file not shown.
Before Width: | Height: | Size: 120 KiB |
Binary file not shown.
Before Width: | Height: | Size: 6.6 KiB |
@ -1,147 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:sketch="http://www.bohemiancoding.com/sketch/ns"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="256"
|
||||
height="256"
|
||||
viewBox="0 0 256 256"
|
||||
version="1.1"
|
||||
id="svg4612"
|
||||
sodipodi:docname="neovim.svg"
|
||||
inkscape:version="0.92.4 5da689c313, 2019-01-14">
|
||||
<metadata
|
||||
id="metadata4616">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title>neovim-mark@2x</dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1333"
|
||||
id="namedview4614"
|
||||
showgrid="false"
|
||||
inkscape:zoom="2.1945358"
|
||||
inkscape:cx="132.84232"
|
||||
inkscape:cy="196.34741"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="34"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4612" />
|
||||
<title
|
||||
id="title4587">neovim-mark@2x</title>
|
||||
<description>Created with Sketch (http://www.bohemiancoding.com/sketch)</description>
|
||||
<defs
|
||||
id="defs4604">
|
||||
<linearGradient
|
||||
x1="167.95833"
|
||||
y1="-0.46142399"
|
||||
x2="167.95833"
|
||||
y2="335.45523"
|
||||
id="linearGradient-1"
|
||||
gradientTransform="scale(0.46142398,2.1672042)"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
stop-color="#16B0ED"
|
||||
stop-opacity="0.800235524"
|
||||
offset="0%"
|
||||
id="stop4589" />
|
||||
<stop
|
||||
stop-color="#0F59B2"
|
||||
stop-opacity="0.83700023"
|
||||
offset="100%"
|
||||
id="stop4591" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
x1="1118.3427"
|
||||
y1="-0.46586797"
|
||||
x2="1118.3427"
|
||||
y2="338.68604"
|
||||
id="linearGradient-2"
|
||||
gradientTransform="scale(0.46586797,2.1465309)"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
stop-color="#7DB643"
|
||||
offset="0%"
|
||||
id="stop4594" />
|
||||
<stop
|
||||
stop-color="#367533"
|
||||
offset="100%"
|
||||
id="stop4596" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
x1="356.33795"
|
||||
y1="0"
|
||||
x2="356.33795"
|
||||
y2="612.90131"
|
||||
id="linearGradient-3"
|
||||
gradientTransform="scale(0.84189739,1.1877932)"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
stop-color="#88C649"
|
||||
stop-opacity="0.8"
|
||||
offset="0%"
|
||||
id="stop4599" />
|
||||
<stop
|
||||
stop-color="#439240"
|
||||
stop-opacity="0.84"
|
||||
offset="100%"
|
||||
id="stop4601" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<g
|
||||
id="Page-1"
|
||||
sketch:type="MSPage"
|
||||
style="fill:none;fill-rule:evenodd;stroke:none;stroke-width:1"
|
||||
transform="matrix(0.34367476,0,0,0.34367476,25.312651,1.7737533)">
|
||||
<g
|
||||
id="mark-copy"
|
||||
sketch:type="MSLayerGroup"
|
||||
transform="translate(2,3)">
|
||||
<path
|
||||
d="M 0,155.5704 155,-1 V 727 L 0,572.23792 Z"
|
||||
id="Left---green"
|
||||
sketch:type="MSShapeGroup"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:url(#linearGradient-1)" />
|
||||
<path
|
||||
d="M 443.0604,156.9824 600,-1 596.81879,727 442,572.21994 Z"
|
||||
id="Right---blue"
|
||||
sketch:type="MSShapeGroup"
|
||||
transform="matrix(-1,0,0,1,1042,0)"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:url(#linearGradient-2)" />
|
||||
<path
|
||||
d="M 154.98629,0 558,615.1897 445.2246,728 42,114.17202 Z"
|
||||
id="Cross---blue"
|
||||
sketch:type="MSShapeGroup"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:url(#linearGradient-3)" />
|
||||
<path
|
||||
d="M 155,283.83232 154.78675,308 31,124.71061 42.461949,113 Z"
|
||||
id="Shadow"
|
||||
sketch:type="MSShapeGroup"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#000000;fill-opacity:0.12999998" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 4.3 KiB |
@ -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})
|
||||
@ -114,7 +114,9 @@ if(NOT APPLE)
|
||||
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/128x128/apps)
|
||||
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
|
||||
"------------------------------------------------------------------------------
|
||||
|
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,7 +23,7 @@ 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)
|
||||
return substitute (substitute (expand ("%:t:r"), '__\|-', ".", "g"), '_$', "", '')
|
||||
|
256
runtime/autoload/dist/ft.vim
vendored
256
runtime/autoload/dist/ft.vim
vendored
@ -1,7 +1,7 @@
|
||||
" Vim functions for file type detection
|
||||
"
|
||||
" Maintainer: Bram Moolenaar <Bram@vim.org>
|
||||
" Last Change: 2022 Apr 06
|
||||
" Last Change: 2020 Aug 17
|
||||
|
||||
" These functions are moved here from runtime/filetype.vim to make startup
|
||||
" faster.
|
||||
@ -67,32 +67,13 @@ func dist#ft#FTasmsyntax()
|
||||
endif
|
||||
endfunc
|
||||
|
||||
let s:ft_visual_basic_content = '\cVB_Name\|Begin VB\.\(Form\|MDIForm\|UserControl\)'
|
||||
|
||||
" See FTfrm() for Visual Basic form file detection
|
||||
func dist#ft#FTbas()
|
||||
if exists("g:filetype_bas")
|
||||
exe "setf " . g:filetype_bas
|
||||
return
|
||||
endif
|
||||
|
||||
" most frequent FreeBASIC-specific keywords in distro files
|
||||
let fb_keywords = '\c^\s*\%(extern\|var\|enum\|private\|scope\|union\|byref\|operator\|constructor\|delete\|namespace\|public\|property\|with\|destructor\|using\)\>\%(\s*[:=(]\)\@!'
|
||||
let fb_preproc = '\c^\s*\%(#\a\+\|option\s\+\%(byval\|dynamic\|escape\|\%(no\)\=gosub\|nokeyword\|private\|static\)\>\)'
|
||||
let fb_comment = "^\\s*/'"
|
||||
" OPTION EXPLICIT, without the leading underscore, is common to many dialects
|
||||
let qb64_preproc = '\c^\s*\%($\a\+\|option\s\+\%(_explicit\|_\=explicitarray\)\>\)'
|
||||
|
||||
let lines = getline(1, min([line("$"), 100]))
|
||||
|
||||
if match(lines, fb_preproc) > -1 || match(lines, fb_comment) > -1 || match(lines, fb_keywords) > -1
|
||||
setf freebasic
|
||||
elseif match(lines, qb64_preproc) > -1
|
||||
setf qb64
|
||||
elseif match(lines, s:ft_visual_basic_content) > -1
|
||||
" Check if one of the first five lines contains "VB_Name". In that case it is
|
||||
" probably a Visual Basic file. Otherwise it's assumed to be "alt" filetype.
|
||||
func dist#ft#FTVB(alt)
|
||||
if getline(1).getline(2).getline(3).getline(4).getline(5) =~? 'VB_Name\|Begin VB\.\(Form\|MDIForm\|UserControl\)'
|
||||
setf vb
|
||||
else
|
||||
setf basic
|
||||
exe "setf " . a:alt
|
||||
endif
|
||||
endfunc
|
||||
|
||||
@ -112,25 +93,6 @@ func dist#ft#BindzoneCheck(default)
|
||||
endif
|
||||
endfunc
|
||||
|
||||
" Returns true if file content looks like RAPID
|
||||
func IsRapid(sChkExt = "")
|
||||
if a:sChkExt == "cfg"
|
||||
return getline(1) =~? '\v^%(EIO|MMC|MOC|PROC|SIO|SYS):CFG'
|
||||
endif
|
||||
" called from FTmod, FTprg or FTsys
|
||||
return getline(nextnonblank(1)) =~? '\v^\s*%(\%{3}|module\s+\k+\s*%(\(|$))'
|
||||
endfunc
|
||||
|
||||
func dist#ft#FTcfg()
|
||||
if exists("g:filetype_cfg")
|
||||
exe "setf " .. g:filetype_cfg
|
||||
elseif IsRapid("cfg")
|
||||
setf rapid
|
||||
else
|
||||
setf cfg
|
||||
endif
|
||||
endfunc
|
||||
|
||||
func dist#ft#FTlpc()
|
||||
if exists("g:lpc_syntax_for_c")
|
||||
let lnum = 1
|
||||
@ -192,7 +154,7 @@ endfunc
|
||||
|
||||
func dist#ft#FTent()
|
||||
" This function checks for valid cl syntax in the first five lines.
|
||||
" Look for either an opening comment, '#', or a block start, '{'.
|
||||
" Look for either an opening comment, '#', or a block start, '{".
|
||||
" If not found, assume SGML.
|
||||
let lnum = 1
|
||||
while lnum < 6
|
||||
@ -230,10 +192,6 @@ func dist#ft#EuphoriaCheck()
|
||||
endfunc
|
||||
|
||||
func dist#ft#DtraceCheck()
|
||||
if did_filetype()
|
||||
" Filetype was already detected
|
||||
return
|
||||
endif
|
||||
let lines = getline(1, min([line("$"), 100]))
|
||||
if match(lines, '^module\>\|^import\>') > -1
|
||||
" D files often start with a module and/or import statement.
|
||||
@ -261,38 +219,6 @@ func dist#ft#FTe()
|
||||
endif
|
||||
endfunc
|
||||
|
||||
func dist#ft#FTfrm()
|
||||
if exists("g:filetype_frm")
|
||||
exe "setf " . g:filetype_frm
|
||||
return
|
||||
endif
|
||||
|
||||
let lines = getline(1, min([line("$"), 5]))
|
||||
|
||||
if match(lines, s:ft_visual_basic_content) > -1
|
||||
setf vb
|
||||
else
|
||||
setf form
|
||||
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
|
||||
@ -338,16 +264,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
|
||||
@ -358,16 +274,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
|
||||
@ -388,8 +298,11 @@ 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
|
||||
@ -434,36 +347,6 @@ func dist#ft#FTmm()
|
||||
setf nroff
|
||||
endfunc
|
||||
|
||||
" Returns true if file content looks like LambdaProlog
|
||||
func IsLProlog()
|
||||
" skip apparent comments and blank lines, what looks like
|
||||
" LambdaProlog comment may be RAPID header
|
||||
let l = nextnonblank(1)
|
||||
while l > 0 && l < line('$') && getline(l) =~ '^\s*%' " LambdaProlog comment
|
||||
let l = nextnonblank(l + 1)
|
||||
endwhile
|
||||
" this pattern must not catch a go.mod file
|
||||
return getline(l) =~ '\<module\s\+\w\+\s*\.\s*\(%\|$\)'
|
||||
endfunc
|
||||
|
||||
" Determine if *.mod is ABB RAPID, LambdaProlog, Modula-2, Modsim III or go.mod
|
||||
func dist#ft#FTmod()
|
||||
if exists("g:filetype_mod")
|
||||
exe "setf " .. g:filetype_mod
|
||||
elseif IsLProlog()
|
||||
setf lprolog
|
||||
elseif getline(nextnonblank(1)) =~ '\%(\<MODULE\s\+\w\+\s*;\|^\s*(\*\)'
|
||||
setf modula2
|
||||
elseif IsRapid()
|
||||
setf rapid
|
||||
elseif expand("<afile>") =~ '\<go.mod$'
|
||||
setf gomod
|
||||
else
|
||||
" Nothing recognized, assume modsim3
|
||||
setf modsim3
|
||||
endif
|
||||
endfunc
|
||||
|
||||
func dist#ft#FTpl()
|
||||
if exists("g:filetype_pl")
|
||||
exe "setf " . g:filetype_pl
|
||||
@ -580,18 +463,6 @@ func dist#ft#FTpp()
|
||||
endif
|
||||
endfunc
|
||||
|
||||
" Determine if *.prg is ABB RAPID. Can also be Clipper, FoxPro or eviews
|
||||
func dist#ft#FTprg()
|
||||
if exists("g:filetype_prg")
|
||||
exe "setf " .. g:filetype_prg
|
||||
elseif IsRapid()
|
||||
setf rapid
|
||||
else
|
||||
" Nothing recognized, assume Clipper
|
||||
setf clipper
|
||||
endif
|
||||
endfunc
|
||||
|
||||
func dist#ft#FTr()
|
||||
let max = line("$") > 50 ? 50 : line("$")
|
||||
|
||||
@ -773,28 +644,6 @@ func dist#ft#SQL()
|
||||
endif
|
||||
endfunc
|
||||
|
||||
" This function checks the first 25 lines of file extension "sc" to resolve
|
||||
" detection between scala and SuperCollider
|
||||
func dist#ft#FTsc()
|
||||
for lnum in range(1, min([line("$"), 25]))
|
||||
if getline(lnum) =~# '[A-Za-z0-9]*\s:\s[A-Za-z0-9]\|var\s<\|classvar\s<\|\^this.*\||\w*|\|+\s\w*\s{\|\*ar\s'
|
||||
setf supercollider
|
||||
return
|
||||
endif
|
||||
endfor
|
||||
setf scala
|
||||
endfunc
|
||||
|
||||
" This function checks the first line of file extension "scd" to resolve
|
||||
" detection between scdoc and SuperCollider
|
||||
func dist#ft#FTscd()
|
||||
if getline(1) =~# '\%^\S\+(\d[0-9A-Za-z]*)\%(\s\+\"[^"]*\"\%(\s\+\"[^"]*\"\)\=\)\=$'
|
||||
setf scdoc
|
||||
else
|
||||
setf supercollider
|
||||
endif
|
||||
endfunc
|
||||
|
||||
" If the file has an extension of 't' and is in a directory 't' or 'xt' then
|
||||
" it is almost certainly a Perl test file.
|
||||
" If the first line starts with '#' and contains 'perl' it's probably a Perl
|
||||
@ -813,7 +662,7 @@ func dist#ft#FTperl()
|
||||
endif
|
||||
let save_cursor = getpos('.')
|
||||
call cursor(1,1)
|
||||
let has_use = search('^use\s\s*\k', 'c', 30) > 0
|
||||
let has_use = search('^use\s\s*\k', 'c', 30)
|
||||
call setpos('.', save_cursor)
|
||||
if has_use
|
||||
setf perl
|
||||
@ -822,16 +671,6 @@ func dist#ft#FTperl()
|
||||
return 0
|
||||
endfunc
|
||||
|
||||
func dist#ft#FTsys()
|
||||
if exists("g:filetype_sys")
|
||||
exe "setf " .. g:filetype_sys
|
||||
elseif IsRapid()
|
||||
setf rapid
|
||||
else
|
||||
setf bat
|
||||
endif
|
||||
endfunc
|
||||
|
||||
" Choose context, plaintex, or tex (LaTeX) based on these rules:
|
||||
" 1. Check the first line of the file for "%&<format>".
|
||||
" 2. Check the first 1000 non-comment lines for LaTeX or ConTeXt keywords.
|
||||
@ -855,8 +694,7 @@ func dist#ft#FTtex()
|
||||
let save_cursor = getpos('.')
|
||||
call cursor(1,1)
|
||||
let firstNC = search('^\s*[^[:space:]%]', 'c', 1000)
|
||||
if firstNC > 0
|
||||
" Check the next thousand lines for a LaTeX or ConTeXt keyword.
|
||||
if firstNC " Check the next thousand lines for a LaTeX or ConTeXt keyword.
|
||||
let lpat = 'documentclass\>\|usepackage\>\|begin{\|newcommand\>\|renewcommand\>'
|
||||
let cpat = 'start\a\+\|setup\a\+\|usemodule\|enablemode\|enableregime\|setvariables\|useencoding\|usesymbols\|stelle\a\+\|verwende\a\+\|stel\a\+\|gebruik\a\+\|usa\a\+\|imposta\a\+\|regle\a\+\|utilisemodule\>'
|
||||
let kwline = search('^\s*\\\%(' . lpat . '\)\|^\s*\\\(' . cpat . '\)',
|
||||
@ -943,72 +781,6 @@ func dist#ft#Redif()
|
||||
endwhile
|
||||
endfunc
|
||||
|
||||
" This function is called for all files under */debian/patches/*, make sure not
|
||||
" to non-dep3patch files, such as README and other text files.
|
||||
func dist#ft#Dep3patch()
|
||||
if expand('%:t') ==# 'series'
|
||||
return
|
||||
endif
|
||||
|
||||
for ln in getline(1, 100)
|
||||
if ln =~# '^\%(Description\|Subject\|Origin\|Bug\|Forwarded\|Author\|From\|Reviewed-by\|Acked-by\|Last-Updated\|Applied-Upstream\):'
|
||||
setf dep3patch
|
||||
return
|
||||
elseif ln =~# '^---'
|
||||
" end of headers found. stop processing
|
||||
return
|
||||
endif
|
||||
endfor
|
||||
endfunc
|
||||
|
||||
" This function checks the first 15 lines for appearance of 'FoamFile'
|
||||
" and then 'object' in a following line.
|
||||
" In that case, it's probably an OpenFOAM file
|
||||
func dist#ft#FTfoam()
|
||||
let ffile = 0
|
||||
let lnum = 1
|
||||
while lnum <= 15
|
||||
if getline(lnum) =~# '^FoamFile'
|
||||
let ffile = 1
|
||||
elseif ffile == 1 && getline(lnum) =~# '^\s*object'
|
||||
setf foam
|
||||
return
|
||||
endif
|
||||
let lnum = lnum + 1
|
||||
endwhile
|
||||
endfunc
|
||||
|
||||
" Determine if a *.tf file is TF mud client or terraform
|
||||
func dist#ft#FTtf()
|
||||
let numberOfLines = line('$')
|
||||
for i in range(1, numberOfLines)
|
||||
let currentLine = trim(getline(i))
|
||||
let firstCharacter = currentLine[0]
|
||||
if firstCharacter !=? ";" && firstCharacter !=? "/" && firstCharacter !=? ""
|
||||
setf terraform
|
||||
return
|
||||
endif
|
||||
endfor
|
||||
setf tf
|
||||
endfunc
|
||||
|
||||
" Determine if a *.src file is Kuka Robot Language
|
||||
func dist#ft#FTsrc()
|
||||
if exists("g:filetype_src")
|
||||
exe "setf " .. g:filetype_src
|
||||
elseif getline(nextnonblank(1)) =~? '^\s*\%(&\w\+\|\%(global\s\+\)\?def\>\)'
|
||||
setf krl
|
||||
endif
|
||||
endfunc
|
||||
|
||||
" Determine if a *.dat file is Kuka Robot Language
|
||||
func dist#ft#FTdat()
|
||||
if exists("g:filetype_dat")
|
||||
exe "setf " .. g:filetype_dat
|
||||
elseif getline(nextnonblank(1)) =~? '^\s*\%(&\w\+\|defdat\>\)'
|
||||
setf krl
|
||||
endif
|
||||
endfunc
|
||||
|
||||
" Restore 'cpoptions'
|
||||
let &cpo = s:cpo_save
|
||||
|
@ -1,41 +0,0 @@
|
||||
" Vim filetype plugin file
|
||||
" Language: FreeBASIC
|
||||
" Maintainer: Doug Kearns <dougkearns@gmail.com>
|
||||
" Last Change: 2021 Mar 16
|
||||
|
||||
" Dialects can be one of fb, qb, fblite, or deprecated
|
||||
" Precedence is forcelang > #lang > lang
|
||||
function! freebasic#GetDialect() abort
|
||||
if exists("g:freebasic_forcelang")
|
||||
return g:freebasic_forcelang
|
||||
endif
|
||||
|
||||
if exists("g:freebasic_lang")
|
||||
let dialect = g:freebasic_lang
|
||||
else
|
||||
let dialect = "fb"
|
||||
endif
|
||||
|
||||
" override with #lang directive or metacommand
|
||||
|
||||
let skip = "has('syntax_items') && synIDattr(synID(line('.'), col('.'), 1), 'name') =~ 'Comment$'"
|
||||
let pat = '\c^\s*\%(#\s*lang\s\+\|''\s*$lang\s*:\s*\)"\([^"]*\)"'
|
||||
|
||||
let save_cursor = getcurpos()
|
||||
call cursor(1, 1)
|
||||
let lnum = search(pat, 'n', '', '', skip)
|
||||
call setpos('.', save_cursor)
|
||||
|
||||
if lnum
|
||||
let word = matchlist(getline(lnum), pat)[1]
|
||||
if word =~? '\%(fb\|deprecated\|fblite\|qb\)'
|
||||
let dialect = word
|
||||
else
|
||||
echomsg "freebasic#GetDialect: Invalid lang, found '" .. word .. "' at line " .. lnum .. " " .. getline(lnum)
|
||||
endif
|
||||
endif
|
||||
|
||||
return dialect
|
||||
endfunction
|
||||
|
||||
" vim: nowrap sw=2 sts=2 ts=8 noet fdm=marker:
|
@ -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 = []
|
||||
@ -70,7 +70,7 @@ function! haskellcomplete#Complete(findstart, base)
|
||||
|
||||
elseif b:completingOptionsGHC
|
||||
if a:base ==? ""
|
||||
" Return all possible GHC options
|
||||
" Return all posible GHC options
|
||||
return s:optionsGHC
|
||||
else
|
||||
let l:matches = []
|
||||
@ -86,7 +86,7 @@ function! haskellcomplete#Complete(findstart, base)
|
||||
|
||||
elseif b:completingModule
|
||||
if a:base ==? ""
|
||||
" Return all possible modules
|
||||
" Return all posible modules
|
||||
return s:commonModules
|
||||
else
|
||||
let l:matches = []
|
||||
|
@ -1,64 +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)
|
||||
" in the event the healthcheck doesn't return anything
|
||||
" (the plugin author should avoid this possibility)
|
||||
if len(s:output) == 0
|
||||
throw 'healthcheck_no_return_value'
|
||||
endif
|
||||
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.')
|
||||
elseif v:exception =~# 'healthcheck_no_return_value'
|
||||
call health#report_error('The healthcheck report for "'.name.'" plugin is empty.')
|
||||
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.
|
||||
@ -104,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 " }}}
|
||||
|
||||
@ -126,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)
|
||||
\ ? split(a:plugin_names, ' ', v:false)
|
||||
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, '', '']] " healthcheck 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
|
||||
|
@ -104,8 +104,8 @@ function! s:check_rplugin_manifest() abort
|
||||
if !has_key(existing_rplugins, script)
|
||||
let msg = printf('"%s" is not registered.', fnamemodify(path, ':t'))
|
||||
if python_version ==# 'pythonx'
|
||||
if !has('python3')
|
||||
let msg .= ' (python3 not available)'
|
||||
if !has('python2') && !has('python3')
|
||||
let msg .= ' (python2 and python3 not available)'
|
||||
endif
|
||||
elseif !has(python_version)
|
||||
let msg .= printf(' (%s not available)', python_version)
|
||||
@ -148,14 +148,14 @@ endfunction
|
||||
|
||||
function! s:get_tmux_option(option) abort
|
||||
let cmd = 'tmux show-option -qvg '.a:option " try global scope
|
||||
let out = system(split(cmd))
|
||||
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(split(cmd))
|
||||
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)
|
||||
@ -202,11 +202,11 @@ function! s:check_tmux() abort
|
||||
" check default-terminal and $TERM
|
||||
call health#report_info('$TERM: '.$TERM)
|
||||
let cmd = 'tmux show-option -qvg default-terminal'
|
||||
let out = system(split(cmd))
|
||||
let out = system(cmd)
|
||||
let tmux_default_term = substitute(out, '\v(\s|\r|\n)', '', 'g')
|
||||
if empty(tmux_default_term)
|
||||
let cmd = 'tmux show-option -qvgs default-terminal'
|
||||
let out = system(split(cmd))
|
||||
let out = system(cmd)
|
||||
let tmux_default_term = substitute(out, '\v(\s|\r|\n)', '', 'g')
|
||||
endif
|
||||
|
||||
@ -225,7 +225,7 @@ function! s:check_tmux() abort
|
||||
endif
|
||||
|
||||
" check for RGB capabilities
|
||||
let info = system(['tmux', 'server-info'])
|
||||
let info = system('tmux server-info')
|
||||
let has_tc = stridx(info, " Tc: (flag) true") != -1
|
||||
let has_rgb = stridx(info, " RGB: (flag) true") != -1
|
||||
if !has_tc && !has_rgb
|
||||
@ -242,7 +242,7 @@ function! s:check_terminal() abort
|
||||
endif
|
||||
call health#report_start('terminal')
|
||||
let cmd = 'infocmp -L'
|
||||
let out = system(split(cmd))
|
||||
let out = system(cmd)
|
||||
let kbs_entry = matchstr(out, 'key_backspace=[^,[:space:]]*')
|
||||
let kdch1_entry = matchstr(out, 'key_dc=[^,[:space:]]*')
|
||||
|
||||
|
@ -282,10 +282,10 @@ function! s:disabled_via_loaded_var(provider) abort
|
||||
return 0
|
||||
endfunction
|
||||
|
||||
function! s:check_python() abort
|
||||
call health#report_start('Python 3 provider (optional)')
|
||||
function! s:check_python(version) abort
|
||||
call health#report_start('Python ' . a:version . ' provider (optional)')
|
||||
|
||||
let pyname = 'python3'
|
||||
let pyname = 'python'.(a:version == 2 ? '' : '3')
|
||||
let python_exe = ''
|
||||
let venv = exists('$VIRTUAL_ENV') ? resolve($VIRTUAL_ENV) : ''
|
||||
let host_prog_var = pyname.'_host_prog'
|
||||
@ -301,7 +301,7 @@ function! s:check_python() abort
|
||||
call health#report_info(printf('Using: g:%s = "%s"', host_prog_var, get(g:, host_prog_var)))
|
||||
endif
|
||||
|
||||
let [pyname, pythonx_warnings] = provider#pythonx#Detect(3)
|
||||
let [pyname, pythonx_errors] = provider#pythonx#Detect(a:version)
|
||||
|
||||
if empty(pyname)
|
||||
call health#report_warn('No Python executable found that can `import neovim`. '
|
||||
@ -311,9 +311,8 @@ function! s:check_python() abort
|
||||
endif
|
||||
|
||||
" No Python executable could `import neovim`, or host_prog_var was used.
|
||||
if !empty(pythonx_warnings)
|
||||
call health#report_warn(pythonx_warnings, ['See :help provider-python for more information.',
|
||||
\ 'You may disable this provider (and warning) by adding `let g:loaded_python3_provider = 0` to your init.vim'])
|
||||
if !empty(pythonx_errors)
|
||||
call health#report_error('Python provider error:', pythonx_errors)
|
||||
|
||||
elseif !empty(pyname) && empty(python_exe)
|
||||
if !exists('g:'.host_prog_var)
|
||||
@ -406,7 +405,7 @@ function! s:check_python() abort
|
||||
" can import 'pynvim'. If so, that Python failed to import 'neovim' as
|
||||
" well, which is most probably due to a failed pip upgrade:
|
||||
" https://github.com/neovim/neovim/wiki/Following-HEAD#20181118
|
||||
let [pynvim_exe, errors] = provider#pythonx#DetectByModule('pynvim', 3)
|
||||
let [pynvim_exe, errors] = provider#pythonx#DetectByModule('pynvim', a:version)
|
||||
if !empty(pynvim_exe)
|
||||
call health#report_error(
|
||||
\ 'Detected pip upgrade failure: Python executable can import "pynvim" but '
|
||||
@ -417,14 +416,14 @@ function! s:check_python() abort
|
||||
\ . pynvim_exe ." -m pip install neovim # only if needed by third-party software")
|
||||
endif
|
||||
else
|
||||
let [majorpyversion, current, latest, status] = s:version_info(python_exe)
|
||||
let [pyversion, current, latest, status] = s:version_info(python_exe)
|
||||
|
||||
if 3 != str2nr(majorpyversion)
|
||||
if a:version != str2nr(pyversion)
|
||||
call health#report_warn('Unexpected Python version.' .
|
||||
\ ' This could lead to confusing error messages.')
|
||||
endif
|
||||
|
||||
call health#report_info('Python version: ' . majorpyversion)
|
||||
call health#report_info('Python version: ' . pyversion)
|
||||
|
||||
if s:is_bad_response(status)
|
||||
call health#report_info(printf('pynvim version: %s (%s)', current, status))
|
||||
@ -524,7 +523,7 @@ function! s:check_virtualenv() abort
|
||||
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'
|
||||
\.'https://vi.stackexchange.com/a/7654'
|
||||
let hints[hint] = v:true
|
||||
endif
|
||||
endfor
|
||||
@ -566,7 +565,7 @@ function! s:check_ruby() abort
|
||||
\ ['Install Ruby and verify that `ruby` and `gem` commands work.'])
|
||||
return
|
||||
endif
|
||||
call health#report_info('Ruby: '. s:system(['ruby', '-v']))
|
||||
call health#report_info('Ruby: '. s:system('ruby -v'))
|
||||
|
||||
let [host, err] = provider#ruby#Detect()
|
||||
if empty(host)
|
||||
@ -574,8 +573,7 @@ function! s:check_ruby() abort
|
||||
\ ['Run `gem install neovim` to ensure the neovim RubyGem is installed.',
|
||||
\ 'Run `gem environment` to ensure the gem bin directory is in $PATH.',
|
||||
\ 'If you are using rvm/rbenv/chruby, try "rehashing".',
|
||||
\ 'See :help g:ruby_host_prog for non-standard gem installations.',
|
||||
\ 'You may disable this provider (and warning) by adding `let g:loaded_ruby_provider = 0` to your init.vim'])
|
||||
\ 'See :help g:ruby_host_prog for non-standard gem installations.'])
|
||||
return
|
||||
endif
|
||||
call health#report_info('Host: '. host)
|
||||
@ -590,11 +588,11 @@ function! s:check_ruby() abort
|
||||
endif
|
||||
let latest_gem = get(split(latest_gem, 'neovim (\|, \|)$' ), 0, 'not found')
|
||||
|
||||
let current_gem_cmd = [host, '--version']
|
||||
let current_gem_cmd = host .' --version'
|
||||
let current_gem = s:system(current_gem_cmd)
|
||||
if s:shell_error
|
||||
call health#report_error('Failed to run: '. join(current_gem_cmd),
|
||||
\ ['Report this issue with the output of: ', join(current_gem_cmd)])
|
||||
call health#report_error('Failed to run: '. current_gem_cmd,
|
||||
\ ['Report this issue with the output of: ', current_gem_cmd])
|
||||
return
|
||||
endif
|
||||
|
||||
@ -621,7 +619,7 @@ function! s:check_node() abort
|
||||
\ ['Install Node.js and verify that `node` and `npm` (or `yarn`) commands work.'])
|
||||
return
|
||||
endif
|
||||
let node_v = get(split(s:system(['node', '-v']), "\n"), 0, '')
|
||||
let node_v = get(split(s:system('node -v'), "\n"), 0, '')
|
||||
call health#report_info('Node.js: '. node_v)
|
||||
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)
|
||||
@ -636,8 +634,7 @@ function! s:check_node() abort
|
||||
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',
|
||||
\ 'You may disable this provider (and warning) by adding `let g:loaded_node_provider = 0` to your init.vim'])
|
||||
\ 'Run in shell (if you use yarn): yarn global add neovim'])
|
||||
return
|
||||
endif
|
||||
call health#report_info('Nvim node.js host: '. host)
|
||||
@ -663,8 +660,8 @@ function! s:check_node() abort
|
||||
let current_npm_cmd = ['node', host, '--version']
|
||||
let current_npm = s:system(current_npm_cmd)
|
||||
if s:shell_error
|
||||
call health#report_error('Failed to run: '. join(current_npm_cmd),
|
||||
\ ['Report this issue with the output of: ', join(current_npm_cmd)])
|
||||
call health#report_error('Failed to run: '. string(current_npm_cmd),
|
||||
\ ['Report this issue with the output of: ', string(current_npm_cmd)])
|
||||
return
|
||||
endif
|
||||
|
||||
@ -686,15 +683,14 @@ function! s:check_perl() abort
|
||||
return
|
||||
endif
|
||||
|
||||
let [perl_exec, perl_warnings] = provider#perl#Detect()
|
||||
let [perl_exec, perl_errors] = provider#perl#Detect()
|
||||
if empty(perl_exec)
|
||||
if !empty(perl_warnings)
|
||||
call health#report_warn(perl_warnings, ['See :help provider-perl for more information.',
|
||||
\ 'You may disable this provider (and warning) by adding `let g:loaded_perl_provider = 0` to your init.vim'])
|
||||
else
|
||||
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
|
||||
return
|
||||
endif
|
||||
|
||||
call health#report_info('perl executable: '. perl_exec)
|
||||
@ -714,7 +710,7 @@ function! s:check_perl() abort
|
||||
|
||||
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, " "),
|
||||
call health#report_error('Failed to run: '. latest_cpan_cmd,
|
||||
\ ["Make sure you're connected to the internet.",
|
||||
\ 'Are you behind a firewall or proxy?'])
|
||||
return
|
||||
@ -738,8 +734,8 @@ function! s:check_perl() abort
|
||||
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: '. join(current_cpan_cmd),
|
||||
\ ['Report this issue with the output of: ', join(current_cpan_cmd)])
|
||||
call health#report_error('Failed to run: '. string(current_cpan_cmd),
|
||||
\ ['Report this issue with the output of: ', string(current_cpan_cmd)])
|
||||
return
|
||||
endif
|
||||
|
||||
@ -755,7 +751,8 @@ endfunction
|
||||
|
||||
function! health#provider#check() abort
|
||||
call s:check_clipboard()
|
||||
call s:check_python()
|
||||
call s:check_python(2)
|
||||
call s:check_python(3)
|
||||
call s:check_virtualenv()
|
||||
call s:check_ruby()
|
||||
call s:check_node()
|
||||
|
5
runtime/autoload/health/treesitter.vim
Normal file
5
runtime/autoload/health/treesitter.vim
Normal file
@ -0,0 +1,5 @@
|
||||
function! health#treesitter#check() abort
|
||||
call health#report_start('Checking treesitter configuration')
|
||||
lua require 'vim.treesitter.health'.check_health()
|
||||
endfunction
|
||||
|
@ -486,7 +486,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*=')
|
||||
|
@ -7,6 +7,7 @@ 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'
|
||||
|
||||
function! man#init() abort
|
||||
try
|
||||
@ -57,7 +58,6 @@ function! man#open_page(count, mods, ...) abort
|
||||
else
|
||||
execute 'silent keepalt' a:mods 'stag' l:target
|
||||
endif
|
||||
call s:set_options(v:false)
|
||||
finally
|
||||
call setbufvar(l:buf, '&tagfunc', l:save_tfu)
|
||||
endtry
|
||||
@ -196,61 +196,27 @@ 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 ['', 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
|
||||
" Some man implementations (OpenBSD) return all available paths from the
|
||||
" search command. Previously, this function would simply select the first one.
|
||||
"
|
||||
" However, some searches will report matches that are incorrect:
|
||||
" man -w strlen may return string.3 followed by strlen.3, and therefore
|
||||
" selecting the first would get us the wrong page. Thus, we must find the
|
||||
" first matching one.
|
||||
"
|
||||
" There's yet another special case here. Consider the following:
|
||||
" If you run man -w strlen and string.3 comes up first, this is a problem. We
|
||||
" should search for a matching named one in the results list.
|
||||
" However, if you search for man -w clock_gettime, you will *only* get
|
||||
" clock_getres.2, which is the right page. Searching the resuls for
|
||||
" clock_gettime will no longer work. In this case, we should just use the
|
||||
" first one that was found in the correct section.
|
||||
"
|
||||
" Finally, we can avoid relying on -S or -s here since they are very
|
||||
" inconsistently supported. Instead, call -w with a section and a name.
|
||||
" search command, so we get() the first one. #8341
|
||||
if empty(a:sect)
|
||||
let results = split(s:system(['man', s:find_arg, a:name]))
|
||||
else
|
||||
let results = split(s:system(['man', s:find_arg, a:sect, a:name]))
|
||||
return substitute(get(split(s:system(['man', s:find_arg, a:name])), 0, ''), '\n\+$', '', '')
|
||||
endif
|
||||
|
||||
if empty(results)
|
||||
return ''
|
||||
endif
|
||||
|
||||
" find any that match the specified name
|
||||
let namematches = filter(copy(results), 'fnamemodify(v:val, ":t") =~ a:name')
|
||||
let sectmatches = []
|
||||
|
||||
if !empty(namematches) && !empty(a:sect)
|
||||
let sectmatches = filter(copy(namematches), 'fnamemodify(v:val, ":e") == a:sect')
|
||||
endif
|
||||
|
||||
return substitute(get(sectmatches, 0, get(namematches, 0, results[0])), '\n\+$', '', '')
|
||||
" '-s' flag handles:
|
||||
" - tokens like 'printf(echo)'
|
||||
" - sections starting with '-'
|
||||
" - 3pcap section (found on macOS)
|
||||
" - commas between sections (for section priority)
|
||||
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
|
||||
@ -268,72 +234,40 @@ endfunction
|
||||
" then we don't do it again in step 2.
|
||||
function! s:verify_exists(sect, name) abort
|
||||
let sect = a:sect
|
||||
|
||||
if empty(sect)
|
||||
" no section specified, so search with b:man_default_sects
|
||||
if exists('b:man_default_sects')
|
||||
let sects = split(b:man_default_sects, ',')
|
||||
for sec in sects
|
||||
try
|
||||
let res = s:get_path(sec, a:name)
|
||||
if !empty(res)
|
||||
return res
|
||||
endif
|
||||
catch /^command error (/
|
||||
endtry
|
||||
endfor
|
||||
endif
|
||||
else
|
||||
" try with specified section
|
||||
try
|
||||
let res = s:get_path(sect, a:name)
|
||||
if !empty(res)
|
||||
return res
|
||||
endif
|
||||
catch /^command error (/
|
||||
endtry
|
||||
|
||||
" try again with b:man_default_sects
|
||||
if exists('b:man_default_sects')
|
||||
let sects = split(b:man_default_sects, ',')
|
||||
for sec in sects
|
||||
try
|
||||
let res = s:get_path(sec, a:name)
|
||||
if !empty(res)
|
||||
return res
|
||||
endif
|
||||
catch /^command error (/
|
||||
endtry
|
||||
endfor
|
||||
endif
|
||||
let sect = get(b:, 'man_default_sects', '')
|
||||
endif
|
||||
|
||||
" if none of the above worked, we will try with no section
|
||||
try
|
||||
let res = s:get_path('', a:name)
|
||||
if !empty(res)
|
||||
return res
|
||||
endif
|
||||
return s:get_path(sect, a:name)
|
||||
catch /^command error (/
|
||||
endtry
|
||||
|
||||
" if that still didn't work, we will check for $MANSECT and try again with it
|
||||
" unset
|
||||
if !empty(get(b:, 'man_default_sects', '')) && sect !=# b:man_default_sects
|
||||
try
|
||||
return s:get_path(b:man_default_sects, a:name)
|
||||
catch /^command error (/
|
||||
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)
|
||||
let res = s:get_path('', a:name)
|
||||
if !empty(res)
|
||||
return res
|
||||
endif
|
||||
return s:get_path('', a:name)
|
||||
catch /^command error (/
|
||||
finally
|
||||
call setenv('MANSECT', MANSECT)
|
||||
endtry
|
||||
endif
|
||||
|
||||
" finally, if that didn't work, there is no hope
|
||||
throw 'no manual entry for ' . a:name
|
||||
endfunction
|
||||
|
||||
|
@ -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"
|
||||
\. " timestamp = int(timestamp.strftime('%s'))\n"
|
||||
\. " if timestamp > 2 ** 31:\n"
|
||||
\. " tsabs = abs(timestamp)\n"
|
||||
\. " return ('{\"_TYPE\": v:msgpack_types.integer,'\n"
|
||||
|
@ -1,7 +1,7 @@
|
||||
" netrw.vim: Handles file transfer and remote directory listing across
|
||||
" AUTOLOAD SECTION
|
||||
" Date: Aug 16, 2021
|
||||
" Version: 171
|
||||
" Date: Sep 18, 2020
|
||||
" Version: 170
|
||||
" Maintainer: Charles E Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
|
||||
" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
|
||||
" Copyright: Copyright (C) 2016 Charles E. Campbell {{{1
|
||||
@ -43,7 +43,7 @@ if exists("s:needspatches")
|
||||
endfor
|
||||
endif
|
||||
|
||||
let g:loaded_netrw = "v171"
|
||||
let g:loaded_netrw = "v170"
|
||||
if !exists("s:NOTE")
|
||||
let s:NOTE = 0
|
||||
let s:WARNING = 1
|
||||
@ -93,7 +93,7 @@ fun! netrw#ErrorMsg(level,msg,errnum)
|
||||
else
|
||||
let msg= level.a:msg
|
||||
endif
|
||||
let s:popuperr_id = popup_atcursor(msg,{})
|
||||
let s:popuperr_id = popup_beval(msg,{})
|
||||
let s:popuperr_text= ""
|
||||
elseif g:netrw_use_errorwindow
|
||||
" (default) netrw creates a one-line window to show error/warning
|
||||
@ -322,7 +322,6 @@ call s:NetrwInit("g:netrw_banner" , 1)
|
||||
call s:NetrwInit("g:netrw_browse_split", 0)
|
||||
call s:NetrwInit("g:netrw_bufsettings" , "noma nomod nonu nobl nowrap ro nornu")
|
||||
call s:NetrwInit("g:netrw_chgwin" , -1)
|
||||
call s:NetrwInit("g:netrw_clipboard" , 1)
|
||||
call s:NetrwInit("g:netrw_compress" , "gzip")
|
||||
call s:NetrwInit("g:netrw_ctags" , "ctags")
|
||||
if exists("g:netrw_cursorline") && !exists("g:netrw_cursor")
|
||||
@ -332,7 +331,6 @@ endif
|
||||
call s:NetrwInit("g:netrw_cursor" , 2)
|
||||
let s:netrw_usercul = &cursorline
|
||||
let s:netrw_usercuc = &cursorcolumn
|
||||
"call Decho("(netrw) COMBAK: cuc=".&l:cuc." cul=".&l:cul." initialization of s:netrw_cu[cl]")
|
||||
call s:NetrwInit("g:netrw_cygdrive","/cygdrive")
|
||||
" Default values - d-g ---------- {{{3
|
||||
call s:NetrwInit("s:didstarstar",0)
|
||||
@ -1608,8 +1606,7 @@ endfun
|
||||
fun! s:NetrwOptionsSave(vt)
|
||||
" call Dfunc("s:NetrwOptionsSave(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">"." winnr($)=".winnr("$")." mod=".&mod." ma=".&ma)
|
||||
" call Decho(a:vt."netrw_optionsave".(exists("{a:vt}netrw_optionsave")? ("=".{a:vt}netrw_optionsave) : " doesn't exist"),'~'.expand("<slnum>"))
|
||||
" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo." a:vt=".a:vt." hid=".&hid,'~'.expand("<slnum>"))
|
||||
" call Decho("(s:NetrwOptionsSave) lines=".&lines)
|
||||
" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo." a:vt=".a:vt,'~'.expand("<slnum>"))
|
||||
|
||||
if !exists("{a:vt}netrw_optionsave")
|
||||
let {a:vt}netrw_optionsave= 1
|
||||
@ -1635,9 +1632,6 @@ fun! s:NetrwOptionsSave(vt)
|
||||
let {a:vt}netrw_cinokeep = &l:cino
|
||||
let {a:vt}netrw_comkeep = &l:com
|
||||
let {a:vt}netrw_cpokeep = &l:cpo
|
||||
let {a:vt}netrw_cuckeep = &l:cuc
|
||||
let {a:vt}netrw_culkeep = &l:cul
|
||||
" call Decho("(s:NetrwOptionsSave) COMBAK: cuc=".&l:cuc." cul=".&l:cul)
|
||||
let {a:vt}netrw_diffkeep = &l:diff
|
||||
let {a:vt}netrw_fenkeep = &l:fen
|
||||
if !exists("g:netrw_ffkeep") || g:netrw_ffkeep
|
||||
@ -1645,11 +1639,9 @@ fun! s:NetrwOptionsSave(vt)
|
||||
endif
|
||||
let {a:vt}netrw_fokeep = &l:fo " formatoptions
|
||||
let {a:vt}netrw_gdkeep = &l:gd " gdefault
|
||||
let {a:vt}netrw_gokeep = &l:go " guioptions
|
||||
let {a:vt}netrw_hidkeep = &l:hidden
|
||||
let {a:vt}netrw_imkeep = &l:im
|
||||
let {a:vt}netrw_iskkeep = &l:isk
|
||||
let {a:vt}netrw_lines = &lines
|
||||
let {a:vt}netrw_lskeep = &l:ls
|
||||
let {a:vt}netrw_makeep = &l:ma
|
||||
let {a:vt}netrw_magickeep = &l:magic
|
||||
@ -1701,18 +1693,12 @@ fun! s:NetrwOptionsSafe(islocal)
|
||||
endif
|
||||
call s:NetrwSetSafeSetting("&l:ci",0)
|
||||
call s:NetrwSetSafeSetting("&l:cin",0)
|
||||
if g:netrw_fastbrowse > a:islocal
|
||||
call s:NetrwSetSafeSetting("&l:bh","hide")
|
||||
else
|
||||
call s:NetrwSetSafeSetting("&l:bh","delete")
|
||||
endif
|
||||
call s:NetrwSetSafeSetting("&l:bh","hide")
|
||||
call s:NetrwSetSafeSetting("&l:cino","")
|
||||
call s:NetrwSetSafeSetting("&l:com","")
|
||||
if &cpo =~ 'a' | call s:NetrwSetSafeSetting("&cpo",substitute(&cpo,'a','','g')) | endif
|
||||
if &cpo =~ 'A' | call s:NetrwSetSafeSetting("&cpo",substitute(&cpo,'A','','g')) | endif
|
||||
setl fo=nroql2
|
||||
" call s:NetrwSetSafeSetting("&go","begmr")
|
||||
if &go =~ '\ca' | call s:NetrwSetSafeSetting("&go",substitute(&go,'\ca','','g')) | endif
|
||||
call s:NetrwSetSafeSetting("&l:hid",0)
|
||||
call s:NetrwSetSafeSetting("&l:im",0)
|
||||
setl isk+=@ isk+=* isk+=/
|
||||
@ -1726,10 +1712,7 @@ fun! s:NetrwOptionsSafe(islocal)
|
||||
call s:NetrwSetSafeSetting("&l:tw",0)
|
||||
call s:NetrwSetSafeSetting("&l:wig","")
|
||||
setl cedit&
|
||||
|
||||
" set up cuc and cul based on g:netrw_cursor and listing style
|
||||
" COMBAK -- cuc cul related
|
||||
call s:NetrwCursor(0)
|
||||
call s:NetrwCursor()
|
||||
|
||||
" allow the user to override safe options
|
||||
" call Decho("ft<".&ft."> ei=".&ei,'~'.expand("<slnum>"))
|
||||
@ -1747,14 +1730,11 @@ endfun
|
||||
" s:NetrwOptionsRestore: restore options (based on prior s:NetrwOptionsSave) {{{2
|
||||
fun! s:NetrwOptionsRestore(vt)
|
||||
" call Dfunc("s:NetrwOptionsRestore(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> winnr($)=".winnr("$"))
|
||||
" call Decho("(s:NetrwOptionsRestore) lines=".&lines)
|
||||
" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo." a:vt=".a:vt,'~'.expand("<slnum>"))
|
||||
if !exists("{a:vt}netrw_optionsave")
|
||||
" call Decho("case ".a:vt."netrw_optionsave : doesn't exist",'~'.expand("<slnum>"))
|
||||
" call Decho("..doing filetype detect anyway")
|
||||
filetype detect
|
||||
" call Decho("..settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo." a:vt=".a:vt,'~'.expand("<slnum>"))
|
||||
" call Decho("..ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
|
||||
" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo." a:vt=".a:vt,'~'.expand("<slnum>"))
|
||||
" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)",'~'.expand("<slnum>"))
|
||||
" call Dret("s:NetrwOptionsRestore : ".a:vt."netrw_optionsave doesn't exist")
|
||||
return
|
||||
endif
|
||||
@ -1771,53 +1751,41 @@ fun! s:NetrwOptionsRestore(vt)
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
" call Decho("(s:NetrwOptionsRestore) #1 lines=".&lines)
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_aikeep","&l:ai")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_awkeep","&l:aw")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_blkeep","&l:bl")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_btkeep","&l:bt")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_bombkeep","&l:bomb")
|
||||
" call Decho("(s:NetrwOptionsRestore) #2 lines=".&lines)
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_cedit","&cedit")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_cikeep","&l:ci")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_cinkeep","&l:cin")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_cinokeep","&l:cino")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_comkeep","&l:com")
|
||||
" call Decho("(s:NetrwOptionsRestore) #3 lines=".&lines)
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_cpokeep","&l:cpo")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_diffkeep","&l:diff")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_fenkeep","&l:fen")
|
||||
if exists("g:netrw_ffkeep") && g:netrw_ffkeep
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_ffkeep")","&l:ff")
|
||||
endif
|
||||
" call Decho("(s:NetrwOptionsRestore) #4 lines=".&lines)
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_fokeep" ,"&l:fo")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_gdkeep" ,"&l:gd")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_gokeep" ,"&l:go")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_hidkeep" ,"&l:hidden")
|
||||
" call Decho("(s:NetrwOptionsRestore) #5 lines=".&lines)
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_imkeep" ,"&l:im")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_iskkeep" ,"&l:isk")
|
||||
" call Decho("(s:NetrwOptionsRestore) #6 lines=".&lines)
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_lines" ,"&lines")
|
||||
" call Decho("(s:NetrwOptionsRestore) #7 lines=".&lines)
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_lskeep" ,"&l:ls")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_makeep" ,"&l:ma")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_fokeep","&l:fo")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_gdkeep","&l:gd")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_hidkeep","&l:hidden")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_imkeep","&l:im")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_iskkeep","&l:isk")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_lskeep","&l:ls")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_makeep","&l:ma")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_magickeep","&l:magic")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_modkeep" ,"&l:mod")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_nukeep" ,"&l:nu")
|
||||
" call Decho("(s:NetrwOptionsRestore) #8 lines=".&lines)
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_rnukeep" ,"&l:rnu")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_repkeep" ,"&l:report")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_rokeep" ,"&l:ro")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_selkeep" ,"&l:sel")
|
||||
" call Decho("(s:NetrwOptionsRestore) #9 lines=".&lines)
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_modkeep","&l:mod")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_nukeep","&l:nu")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_rnukeep","&l:rnu")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_repkeep","&l:report")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_rokeep","&l:ro")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_selkeep","&l:sel")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_spellkeep","&l:spell")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_twkeep" ,"&l:tw")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_wigkeep" ,"&l:wig")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_wrapkeep" ,"&l:wrap")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_twkeep","&l:tw")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_wigkeep","&l:wig")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_wrapkeep","&l:wrap")
|
||||
call s:NetrwRestoreSetting(a:vt."netrw_writekeep","&l:write")
|
||||
" call Decho("(s:NetrwOptionsRestore) #10 lines=".&lines)
|
||||
call s:NetrwRestoreSetting("s:yykeep","@@")
|
||||
" former problem: start with liststyle=0; press <i> : result, following line resets l:ts.
|
||||
" Fixed; in s:PerformListing, when w:netrw_liststyle is s:LONGLIST, will use a printf to pad filename with spaces
|
||||
@ -1859,11 +1827,9 @@ fun! s:NetrwOptionsRestore(vt)
|
||||
" were having their filetype detect-generated settings overwritten by
|
||||
" NetrwOptionRestore.
|
||||
if &ft != "netrw"
|
||||
" call Decho("before: filetype detect (ft=".&ft.")",'~'.expand("<slnum>"))
|
||||
" call Decho("filetype detect (ft=".&ft.")",'~'.expand("<slnum>"))
|
||||
filetype detect
|
||||
" call Decho("after : filetype detect (ft=".&ft.")",'~'.expand("<slnum>"))
|
||||
endif
|
||||
" call Decho("(s:NetrwOptionsRestore) lines=".&lines)
|
||||
" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo." a:vt=".a:vt,'~'.expand("<slnum>"))
|
||||
" call Dret("s:NetrwOptionsRestore : tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
|
||||
endfun
|
||||
@ -1913,7 +1879,7 @@ fun! s:NetrwRestoreSetting(keepvar,setting)
|
||||
" typically called from s:NetrwOptionsRestore
|
||||
" call s:NetrwRestoreSettings(keep-option-variable-name,'associated-option')
|
||||
" ex. call s:NetrwRestoreSetting(a:vt."netrw_selkeep","&l:sel")
|
||||
" Restores option (but only if different) from a:keepvar
|
||||
" Restores option (if different) from a keepvar
|
||||
if exists(a:keepvar)
|
||||
exe "let keepvarval= ".a:keepvar
|
||||
exe "let setting= ".a:setting
|
||||
@ -2835,16 +2801,14 @@ fun! netrw#SetTreetop(iscmd,...)
|
||||
" call Decho("inittreetop<".(exists("inittreetop")? inittreetop : "n/a").">")
|
||||
|
||||
if (a:iscmd == 0 || a:1 == "") && exists("inittreetop")
|
||||
let treedir = s:NetrwTreePath(inittreetop)
|
||||
let treedir= s:NetrwTreePath(inittreetop)
|
||||
" call Decho("treedir<".treedir.">",'~'.expand("<slnum>"))
|
||||
else
|
||||
if isdirectory(s:NetrwFile(a:1))
|
||||
" call Decho("a:1<".a:1."> is a directory",'~'.expand("<slnum>"))
|
||||
let treedir = a:1
|
||||
let s:netrw_treetop = treedir
|
||||
let treedir= a:1
|
||||
elseif exists("b:netrw_curdir") && (isdirectory(s:NetrwFile(b:netrw_curdir."/".a:1)) || a:1 =~ '^\a\{3,}://')
|
||||
let treedir = b:netrw_curdir."/".a:1
|
||||
let s:netrw_treetop = treedir
|
||||
let treedir= b:netrw_curdir."/".a:1
|
||||
" call Decho("a:1<".a:1."> is NOT a directory, using treedir<".treedir.">",'~'.expand("<slnum>"))
|
||||
else
|
||||
" normally the cursor is left in the message window.
|
||||
@ -2852,8 +2816,7 @@ fun! netrw#SetTreetop(iscmd,...)
|
||||
let netrwbuf= bufnr("%")
|
||||
call netrw#ErrorMsg(s:ERROR,"sorry, ".a:1." doesn't seem to be a directory!",95)
|
||||
exe bufwinnr(netrwbuf)."wincmd w"
|
||||
let treedir = "."
|
||||
let s:netrw_treetop = getcwd()
|
||||
let treedir= "."
|
||||
endif
|
||||
endif
|
||||
" call Decho("treedir<".treedir.">",'~'.expand("<slnum>"))
|
||||
@ -4108,7 +4071,6 @@ fun! s:NetrwFileInfo(islocal,fname)
|
||||
elseif g:netrw_sizestyle =~# 'h'
|
||||
let lsopt= "-lsadh --si"
|
||||
endif
|
||||
" call Decho("(s:NetrwFileInfo) lsopt<".lsopt.">")
|
||||
if (has("unix") || has("macunix")) && executable("/bin/ls")
|
||||
|
||||
if getline(".") == "../"
|
||||
@ -4170,10 +4132,9 @@ endfun
|
||||
" s:NetrwGetBuffer: [get a new|find an old netrw] buffer for a netrw listing {{{2
|
||||
" returns 0=cleared buffer
|
||||
" 1=re-used buffer (buffer not cleared)
|
||||
" Nov 09, 2020: tst952 shows that when user does :set hidden that NetrwGetBuffer will come up with a [No Name] buffer (hid fix)
|
||||
fun! s:NetrwGetBuffer(islocal,dirname)
|
||||
" call Dfunc("s:NetrwGetBuffer(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".g:netrw_liststyle)
|
||||
" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo." hid=".&hid,'~'.expand("<slnum>"))
|
||||
" call Decho("settings buf#".bufnr("%")."<".bufname("%").">: ".((&l:ma == 0)? "no" : "")."ma ".((&l:mod == 0)? "no" : "")."mod ".((&l:bl == 0)? "no" : "")."bl ".((&l:ro == 0)? "no" : "")."ro fo=".&l:fo,'~'.expand("<slnum>"))
|
||||
" call Decho("netrwbuf dictionary=".(exists("s:netrwbuf")? string(s:netrwbuf) : 'n/a'),'~'.expand("<slnum>"))
|
||||
" call Dredir("ls!","s:NetrwGetBuffer")
|
||||
let dirname= a:dirname
|
||||
@ -4223,26 +4184,17 @@ fun! s:NetrwGetBuffer(islocal,dirname)
|
||||
endif
|
||||
" call Decho(" bufnum#".bufnum,'~'.expand("<slnum>"))
|
||||
|
||||
" hijack the current buffer
|
||||
" IF the buffer already has the desired name
|
||||
" AND it is empty
|
||||
let curbuf = bufname("%")
|
||||
if curbuf == '.'
|
||||
let curbuf = getcwd()
|
||||
endif
|
||||
" call Dredir("ls!","NetrwGetFile (renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">)")
|
||||
" call Decho("deciding if netrw may hijack the current buffer#".bufnr("%")."<".curbuf.">",'~'.expand("<slnum>"))
|
||||
" call Decho("..dirname<".dirname."> IF dirname == bufname",'~'.expand("<slnum>"))
|
||||
" call Decho("..curbuf<".curbuf.">",'~'.expand("<slnum>"))
|
||||
" call Decho("..line($)=".line("$")." AND this is 1",'~'.expand("<slnum>"))
|
||||
" call Decho("..getline(%)<".getline("%")."> AND this line is empty",'~'.expand("<slnum>"))
|
||||
if dirname == curbuf && line("$") == 1 && getline("%") == ""
|
||||
" highjack the current buffer if
|
||||
" it has the desired name
|
||||
" it is empty
|
||||
" call Decho("deciding if I can highjack the current buffer#".bufnr("%"),'~'.expand("<slnum>"))
|
||||
" call Decho("..dirname<".dirname.">",'~'.expand("<slnum>"))
|
||||
" call Decho("..bufname<".bufname("%").">",'~'.expand("<slnum>"))
|
||||
" call Decho("..getline($)<".getline("$").">",'~'.expand("<slnum>"))
|
||||
if dirname == bufname("%") && line("$") == 1 && getline("%") == ""
|
||||
" call Dret("s:NetrwGetBuffer 0<cleared buffer> : highjacking buffer#".bufnr("%"))
|
||||
return 0
|
||||
else " DEBUG
|
||||
" call Decho("..did NOT hijack buffer",'~'.expand("<slnum>"))
|
||||
endif
|
||||
" Aug 14, 2021: was thinking about looking for a [No Name] buffer here and using it, but that might cause problems
|
||||
|
||||
" get enew buffer and name it -or- re-use buffer {{{3
|
||||
if bufnum < 0 " get enew buffer and name it
|
||||
@ -4567,7 +4519,7 @@ fun! s:NetrwListStyle(islocal)
|
||||
" refresh the listing
|
||||
" call Decho("refresh the listing",'~'.expand("<slnum>"))
|
||||
NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./'))
|
||||
NetrwKeepj call s:NetrwCursor(0)
|
||||
NetrwKeepj call s:NetrwCursor()
|
||||
|
||||
" repoint t:netrw_lexbufnr if appropriate
|
||||
if exists("repointlexbufnr")
|
||||
@ -4773,7 +4725,7 @@ fun! s:NetrwBrowseChgDir(islocal,newdir,...)
|
||||
endif
|
||||
" call Decho("b:netrw_curdir<".b:netrw_curdir.">")
|
||||
|
||||
" NetrwBrowseChgDir; save options and initialize {{{3
|
||||
" NetrwBrowseChgDir: save options and initialize {{{3
|
||||
" call Decho("saving options",'~'.expand("<slnum>"))
|
||||
call s:SavePosn(s:netrw_posn)
|
||||
NetrwKeepj call s:NetrwOptionsSave("s:")
|
||||
@ -4841,8 +4793,6 @@ fun! s:NetrwBrowseChgDir(islocal,newdir,...)
|
||||
if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") && newdir !~ '^\(/\|\a:\)'
|
||||
" call Decho("edit-a-file: handle tree listing: w:netrw_treedict<".(exists("w:netrw_treedict")? string(w:netrw_treedict) : 'n/a').">",'~'.expand("<slnum>"))
|
||||
" call Decho("edit-a-file: newdir<".newdir.">",'~'.expand("<slnum>"))
|
||||
" let newdir = s:NetrwTreePath(s:netrw_treetop)
|
||||
" call Decho("edit-a-file: COMBAK why doesn't this recognize file1's directory???")
|
||||
let dirname= s:NetrwTreeDir(a:islocal)
|
||||
"COMBAK : not working for a symlink -- but what about a regular file? a directory?
|
||||
" call Decho("COMBAK : not working for a symlink -- but what about a regular file? a directory?")
|
||||
@ -4956,8 +4906,7 @@ fun! s:NetrwBrowseChgDir(islocal,newdir,...)
|
||||
exe "NetrwKeepj e ".fnameescape(dirname)
|
||||
endif
|
||||
" call Decho("edit-a-file: after e! ".dirname.": hidden=".&hidden." bufhidden<".&bufhidden."> mod=".&mod,'~'.expand("<slnum>"))
|
||||
" COMBAK -- cuc cul related
|
||||
call s:NetrwCursor(1)
|
||||
call s:NetrwCursor()
|
||||
if &hidden || &bufhidden == "hide"
|
||||
" file came from vim's hidden storage. Don't "restore" options with it.
|
||||
let dorestore= 0
|
||||
@ -4978,8 +4927,8 @@ fun! s:NetrwBrowseChgDir(islocal,newdir,...)
|
||||
elseif type(g:Netrw_funcref) == 3
|
||||
" call Decho("edit-a-file: handling a list of g:Netrw_funcrefs",'~'.expand("<slnum>"))
|
||||
for Fncref in g:Netrw_funcref
|
||||
if type(Fncref) == 2
|
||||
NetrwKeepj call Fncref()
|
||||
if type(FncRef) == 2
|
||||
NetrwKeepj call FncRef()
|
||||
endif
|
||||
endfor
|
||||
endif
|
||||
@ -5271,12 +5220,6 @@ fun! netrw#BrowseX(fname,remote)
|
||||
endif
|
||||
" call Decho("not a local file nor a webpage request",'~'.expand("<slnum>"))
|
||||
|
||||
if exists("g:netrw_browsex_viewer") && exists("g:netrw_browsex_support_remote") && !g:netrw_browsex_support_remote
|
||||
let remote = a:remote
|
||||
else
|
||||
let remote = 0
|
||||
endif
|
||||
|
||||
let ykeep = @@
|
||||
let screenposn = winsaveview()
|
||||
" call Decho("saving posn to screenposn<".string(screenposn).">",'~'.expand("<slnum>"))
|
||||
@ -5321,9 +5264,9 @@ fun! netrw#BrowseX(fname,remote)
|
||||
endif
|
||||
" call Decho("exten<".exten.">",'~'.expand("<slnum>"))
|
||||
|
||||
if remote == 1
|
||||
if a:remote == 1
|
||||
" create a local copy
|
||||
" call Decho("remote: remote=".remote.": create a local copy of <".a:fname.">",'~'.expand("<slnum>"))
|
||||
" call Decho("remote: a:remote=".a:remote.": create a local copy of <".a:fname.">",'~'.expand("<slnum>"))
|
||||
setl bh=delete
|
||||
call netrw#NetRead(3,a:fname)
|
||||
" attempt to rename tempfile
|
||||
@ -5345,7 +5288,7 @@ fun! netrw#BrowseX(fname,remote)
|
||||
let fname= s:netrw_tmpfile
|
||||
endif
|
||||
else
|
||||
" call Decho("local: remote=".remote.": handling local copy of <".a:fname.">",'~'.expand("<slnum>"))
|
||||
" call Decho("local: a:remote=".a:remote.": handling local copy of <".a:fname.">",'~'.expand("<slnum>"))
|
||||
let fname= a:fname
|
||||
" special ~ handler for local
|
||||
if fname =~ '^\~' && expand("$HOME") != ""
|
||||
@ -5439,8 +5382,8 @@ fun! netrw#BrowseX(fname,remote)
|
||||
if a:fname =~ '^https\=://'
|
||||
" atril does not appear to understand how to handle html -- so use gvim to edit the document
|
||||
let use_ctrlo= 0
|
||||
" call Decho("fname<".fname.">")
|
||||
" call Decho("a:fname<".a:fname.">")
|
||||
" call Decho("(COMBAK) fname<".fname.">")
|
||||
" call Decho("(COMBAK) a:fname<".a:fname.">")
|
||||
call s:NetrwExe("sil! !gvim ".fname.' -c "keepj keepalt file '.fnameescape(a:fname).'"')
|
||||
|
||||
else
|
||||
@ -5488,12 +5431,12 @@ fun! netrw#BrowseX(fname,remote)
|
||||
" return to prior buffer (directory listing)
|
||||
" Feb 12, 2008: had to de-activiate removal of
|
||||
" temporary file because it wasn't getting seen.
|
||||
" if remote == 1 && fname != a:fname
|
||||
" if a:remote == 1 && fname != a:fname
|
||||
"" call Decho("deleting temporary file<".fname.">",'~'.expand("<slnum>"))
|
||||
" call s:NetrwDelete(fname)
|
||||
" endif
|
||||
|
||||
if remote == 1
|
||||
if a:remote == 1
|
||||
setl bh=delete bt=nofile
|
||||
if g:netrw_use_noswf
|
||||
setl noswf
|
||||
@ -5552,7 +5495,7 @@ fun! s:NetrwBufRename(newname)
|
||||
let b:junk= 1
|
||||
" call Decho("rename buffer: sil! keepj keepalt file ".fnameescape(a:newname),'~'.expand("<slnum>"))
|
||||
exe 'sil! keepj keepalt file '.fnameescape(a:newname)
|
||||
" call Dredir("ls!","s:NetrwBufRename (before bwipe)~".expand("<slnum>"))
|
||||
" call Dredir("ls!","s:NetrwBufRename (before bwipe)")
|
||||
let oldbufnr= bufnr(oldbufname)
|
||||
" call Decho("oldbufname<".oldbufname."> oldbufnr#".oldbufnr,'~'.expand("<slnum>"))
|
||||
" call Decho("bufnr(%)=".bufnr("%"),'~'.expand("<slnum>"))
|
||||
@ -5561,9 +5504,6 @@ fun! s:NetrwBufRename(newname)
|
||||
exe "bwipe! ".oldbufnr
|
||||
" else " Decho
|
||||
" call Decho("did *not* bwipe buf#".oldbufnr,'~'.expand("<slnum>"))
|
||||
" call Decho("..reason: if oldbufname<".oldbufname."> is empty",'~'.expand("<slnum>"))"
|
||||
" call Decho("..reason: if oldbufnr#".oldbufnr." is -1",'~'.expand("<slnum>"))"
|
||||
" call Decho("..reason: if oldbufnr#".oldbufnr." != bufnr(%)#".bufnr("%"),'~'.expand("<slnum>"))"
|
||||
endif
|
||||
" call Dredir("ls!","s:NetrwBufRename (after rename)")
|
||||
" else " Decho
|
||||
@ -6542,7 +6482,7 @@ fun! s:NetrwMaps(islocal)
|
||||
if !hasmapto('<Plug>NetrwRefresh')
|
||||
nmap <buffer> <unique> <c-l> <Plug>NetrwRefresh
|
||||
endif
|
||||
nnoremap <buffer> <silent> <Plug>NetrwRefresh <c-l>:call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,(exists("w:netrw_liststyle") && exists("w:netrw_treetop") && w:netrw_liststyle == 3)? w:netrw_treetop : './'))<cr>
|
||||
nnoremap <buffer> <silent> <Plug>NetrwRefresh <c-l>:call <SID>NetrwRefresh(1,<SID>NetrwBrowseChgDir(1,(w:netrw_liststyle == 3)? w:netrw_treetop : './'))<cr>
|
||||
if s:didstarstar || !mapcheck("<s-down>","n")
|
||||
nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
|
||||
endif
|
||||
@ -6791,7 +6731,7 @@ fun! s:NetrwMarkFile(islocal,fname)
|
||||
|
||||
" sanity check
|
||||
if empty(a:fname)
|
||||
" call Dret("s:NetrwMarkFile : empty fname")
|
||||
" call Dret("s:NetrwMarkFile : emtpy fname")
|
||||
return
|
||||
endif
|
||||
let curdir = s:NetrwGetCurdir(a:islocal)
|
||||
@ -8170,23 +8110,6 @@ fun! s:NetrwOpenFile(islocal)
|
||||
call inputsave()
|
||||
let fname= input("Enter filename: ")
|
||||
call inputrestore()
|
||||
" call Decho("(s:NetrwOpenFile) fname<".fname.">",'~'.expand("<slnum>"))
|
||||
|
||||
" determine if Lexplore is in use
|
||||
if exists("t:netrw_lexbufnr")
|
||||
" check if t:netrw_lexbufnr refers to a netrw window
|
||||
" call Decho("(s:netrwOpenFile) ..t:netrw_lexbufnr=".t:netrw_lexbufnr,'~'.expand("<slnum>"))
|
||||
let lexwinnr = bufwinnr(t:netrw_lexbufnr)
|
||||
if lexwinnr != -1 && exists("g:netrw_chgwin") && g:netrw_chgwin != -1
|
||||
" call Decho("(s:netrwOpenFile) ..Lexplore in use",'~'.expand("<slnum>"))
|
||||
exe "NetrwKeepj keepalt ".g:netrw_chgwin."wincmd w"
|
||||
exe "NetrwKeepj e ".fnameescape(fname)
|
||||
let @@= ykeep
|
||||
" call Dret("s:NetrwOpenFile : creating a file with Lexplore mode")
|
||||
endif
|
||||
endif
|
||||
|
||||
" Does the filename contain a path?
|
||||
if fname !~ '[/\\]'
|
||||
if exists("b:netrw_curdir")
|
||||
if exists("g:netrw_quiet")
|
||||
@ -8525,7 +8448,6 @@ fun! s:NetrwPrevWinOpen(islocal)
|
||||
let lastwinnr = winnr("$")
|
||||
let curword = s:NetrwGetWord()
|
||||
let choice = 0
|
||||
let s:prevwinopen= 1 " lets s:NetrwTreeDir() know that NetrwPrevWinOpen called it
|
||||
let s:treedir = s:NetrwTreeDir(a:islocal)
|
||||
let curdir = s:treedir
|
||||
" call Decho("winnr($)#".lastwinnr." curword<".curword.">",'~'.expand("<slnum>"))
|
||||
@ -8853,7 +8775,7 @@ fun! s:NetrwPreview(path) range
|
||||
" 0 : 1: top -- preview window is horizontally split off and on the top
|
||||
" 0 : 0: bot -- preview window is horizontally split off and on the bottom
|
||||
"
|
||||
" Note that the file being previewed is already known to not be a directory, hence we can avoid doing a LocalBrowseCheck() check via
|
||||
" Note that the file being previewed is already known to not be a directory, hence we can avoid doing a LocalBrowse() check via
|
||||
" the BufEnter event set up in netrwPlugin.vim
|
||||
" call Decho("exe ".(g:netrw_alto? "top " : "bot ").(g:netrw_preview? "vert " : "")."pedit ".fnameescape(a:path),'~'.expand("<slnum>"))
|
||||
let eikeep = &ei
|
||||
@ -9288,20 +9210,14 @@ fun! s:NetrwTreeDir(islocal)
|
||||
" call Decho("g:netrw_keepdir =".(exists("g:netrw_keepdir")? g:netrw_keepdir : 'n/a'),'~'.expand("<slnum>"))
|
||||
" call Decho("w:netrw_liststyle=".(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a'),'~'.expand("<slnum>"))
|
||||
" call Decho("w:netrw_treetop =".(exists("w:netrw_treetop")? w:netrw_treetop : 'n/a'),'~'.expand("<slnum>"))
|
||||
" call Decho("current line<".getline(".").">")
|
||||
|
||||
if exists("s:treedir") && exists("s:prevwinopen")
|
||||
if exists("s:treedir")
|
||||
" s:NetrwPrevWinOpen opens a "previous" window -- and thus needs to and does call s:NetrwTreeDir early
|
||||
" call Decho('s:NetrwPrevWinOpen opens a "previous" window -- and thus needs to and does call s:NetrwTreeDir early')
|
||||
let treedir= s:treedir
|
||||
unlet s:treedir
|
||||
unlet s:prevwinopen
|
||||
" call Dret("s:NetrwTreeDir ".treedir.": early return since s:treedir existed previously")
|
||||
" call Dret("s:NetrwTreeDir ".treedir)
|
||||
return treedir
|
||||
endif
|
||||
if exists("s:prevwinopen")
|
||||
unlet s:prevwinopen
|
||||
endif
|
||||
|
||||
if !exists("b:netrw_curdir") || b:netrw_curdir == ""
|
||||
let b:netrw_curdir= getcwd()
|
||||
@ -9508,29 +9424,20 @@ endfun
|
||||
" Called by s:PerformListing()
|
||||
fun! s:NetrwTreeListing(dirname)
|
||||
if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST
|
||||
" call Dfunc("s:NetrwTreeListing() bufname<".expand("%").">")
|
||||
" call Dfunc("NetrwTreeListing() bufname<".expand("%").">")
|
||||
" call Decho("curdir<".a:dirname.">",'~'.expand("<slnum>"))
|
||||
" call Decho("win#".winnr().": w:netrw_treetop ".(exists("w:netrw_treetop")? "exists" : "doesn't exist")." w:netrw_treedict ".(exists("w:netrw_treedict")? "exists" : "doesn't exit"),'~'.expand("<slnum>"))
|
||||
" call Decho("g:netrw_banner=".g:netrw_banner.": banner ".(g:netrw_banner? "enabled" : "suppressed").": (line($)=".line("$")." byte2line(1)=".byte2line(1)." bannercnt=".w:netrw_bannercnt.")",'~'.expand("<slnum>"))
|
||||
|
||||
" update the treetop
|
||||
" call Decho("update the treetop",'~'.expand("<slnum>"))
|
||||
if !exists("w:netrw_treetop")
|
||||
" call Decho("update the treetop (w:netrw_treetop doesn't exist yet)",'~'.expand("<slnum>"))
|
||||
let w:netrw_treetop= a:dirname
|
||||
let s:netrw_treetop= w:netrw_treetop
|
||||
" call Decho("w:netrw_treetop<".w:netrw_treetop."> (reusing)",'~'.expand("<slnum>"))
|
||||
elseif (w:netrw_treetop =~ ('^'.a:dirname) && s:Strlen(a:dirname) < s:Strlen(w:netrw_treetop)) || a:dirname !~ ('^'.w:netrw_treetop)
|
||||
" call Decho("update the treetop (override w:netrw_treetop with a:dirname<".a:dirname.">)",'~'.expand("<slnum>"))
|
||||
let w:netrw_treetop= a:dirname
|
||||
let s:netrw_treetop= w:netrw_treetop
|
||||
" call Decho("w:netrw_treetop<".w:netrw_treetop."> (went up)",'~'.expand("<slnum>"))
|
||||
endif
|
||||
if exists("w:netrw_treetop")
|
||||
let s:netrw_treetop= w:netrw_treetop
|
||||
else
|
||||
let w:netrw_treetop= getcwd()
|
||||
let s:netrw_treetop= w:netrw_treetop
|
||||
endif
|
||||
|
||||
if !exists("w:netrw_treedict")
|
||||
" insure that we have a treedict, albeit empty
|
||||
@ -9568,7 +9475,7 @@ fun! s:NetrwTreeListing(dirname)
|
||||
|
||||
exe "setl ".g:netrw_bufsettings
|
||||
|
||||
" call Dret("s:NetrwTreeListing : bufname<".expand("%").">")
|
||||
" call Dret("NetrwTreeListing : bufname<".expand("%").">")
|
||||
return
|
||||
endif
|
||||
endfun
|
||||
@ -10712,7 +10619,7 @@ endfun
|
||||
" ---------------------------------------------------------------------
|
||||
" netrw#LocalBrowseCheck: {{{2
|
||||
fun! netrw#LocalBrowseCheck(dirname)
|
||||
" This function is called by netrwPlugin.vim's s:LocalBrowseCheck(), s:NetrwRexplore(),
|
||||
" This function is called by netrwPlugin.vim's s:LocalBrowse(), s:NetrwRexplore(),
|
||||
" and by <cr> when atop a listed file/directory (via a buffer-local map)
|
||||
"
|
||||
" unfortunate interaction -- split window debugging can't be used here, must use
|
||||
@ -10863,7 +10770,7 @@ endfun
|
||||
" Hiding a buffer means that it will be re-used when examined, hence "fast".
|
||||
" (re-using a buffer may not be as accurate)
|
||||
"
|
||||
" s:netrw_events : doesn't exist, s:LocalFastBrowser() will install autocmds with medium-speed or fast browsing
|
||||
" s:netrw_events : doesn't exist, s:LocalFastBrowser() will install autocmds whena med or fast browsing
|
||||
" =1: autocmds installed, but ignore next FocusGained event to avoid initial double-refresh of listing.
|
||||
" BufEnter may be first event, then a FocusGained event. Ignore the first FocusGained event.
|
||||
" If :Explore used: it sets s:netrw_events to 2, so no FocusGained events are ignored.
|
||||
@ -11025,14 +10932,13 @@ fun! s:LocalListing()
|
||||
let sz= s:NetrwHumanReadable(sz)
|
||||
endif
|
||||
let longfile= printf("%-".(g:netrw_maxfilenamelen+1)."s",pfile)
|
||||
let pfile = longfile.sz." ".strftime(g:netrw_timefmt,getftime(filename))
|
||||
let pfile = longfile.fsz." ".strftime(g:netrw_timefmt,getftime(filename))
|
||||
" call Decho("longlist support: sz=".sz." fsz=".fsz,'~'.expand("<slnum>"))
|
||||
endif
|
||||
|
||||
if g:netrw_sort_by =~# "^t"
|
||||
" sort by time (handles time up to 1 quintillion seconds, US)
|
||||
" Decorate listing by prepending a timestamp/ . Sorting will then be done based on time.
|
||||
" call Decho("implementing g:netrw_sort_by=".g:netrw_sort_by." (time)")
|
||||
" call Decho("getftime(".filename.")=".getftime(filename),'~'.expand("<slnum>"))
|
||||
let t = getftime(filename)
|
||||
let ft = strpart("000000000000000000",1,18-strlen(t)).t
|
||||
@ -11042,7 +10948,6 @@ fun! s:LocalListing()
|
||||
|
||||
elseif g:netrw_sort_by =~ "^s"
|
||||
" sort by size (handles file sizes up to 1 quintillion bytes, US)
|
||||
" call Decho("implementing g:netrw_sort_by=".g:netrw_sort_by." (size)")
|
||||
" call Decho("getfsize(".filename.")=".getfsize(filename),'~'.expand("<slnum>"))
|
||||
let sz = getfsize(filename)
|
||||
if g:netrw_sizestyle =~# "[hH]"
|
||||
@ -11055,7 +10960,6 @@ fun! s:LocalListing()
|
||||
|
||||
else
|
||||
" sort by name
|
||||
" call Decho("implementing g:netrw_sort_by=".g:netrw_sort_by." (name)")
|
||||
" call Decho("exe NetrwKeepj put ='".pfile."'",'~'.expand("<slnum>"))
|
||||
sil! NetrwKeepj put=pfile
|
||||
endif
|
||||
@ -11778,32 +11682,19 @@ endfun
|
||||
|
||||
" ---------------------------------------------------------------------
|
||||
" s:NetrwCursor: responsible for setting cursorline/cursorcolumn based upon g:netrw_cursor {{{2
|
||||
fun! s:NetrwCursor(editfile)
|
||||
fun! s:NetrwCursor()
|
||||
if !exists("w:netrw_liststyle")
|
||||
let w:netrw_liststyle= g:netrw_liststyle
|
||||
endif
|
||||
" call Dfunc("s:NetrwCursor() ft<".&ft."> liststyle=".w:netrw_liststyle." g:netrw_cursor=".g:netrw_cursor." s:netrw_usercuc=".s:netrw_usercuc." s:netrw_usercul=".s:netrw_usercul)
|
||||
|
||||
" call Decho("(s:NetrwCursor) COMBAK: cuc=".&l:cuc." cul=".&l:cul)
|
||||
|
||||
if &ft != "netrw"
|
||||
" if the current window isn't a netrw directory listing window, then use user cursorline/column
|
||||
" settings. Affects when netrw is used to read/write a file using scp/ftp/etc.
|
||||
" call Decho("case ft!=netrw: use user cul,cuc",'~'.expand("<slnum>"))
|
||||
let &l:cursorline = s:netrw_usercul
|
||||
let &l:cursorcolumn = s:netrw_usercuc
|
||||
|
||||
elseif g:netrw_cursor == 8
|
||||
if w:netrw_liststyle == s:WIDELIST
|
||||
setl cursorline
|
||||
setl cursorcolumn
|
||||
else
|
||||
setl cursorline
|
||||
endif
|
||||
elseif g:netrw_cursor == 7
|
||||
setl cursorline
|
||||
elseif g:netrw_cursor == 6
|
||||
if w:netrw_liststyle == s:WIDELIST
|
||||
setl cursorline
|
||||
endif
|
||||
elseif g:netrw_cursor == 4
|
||||
" all styles: cursorline, cursorcolumn
|
||||
" call Decho("case g:netrw_cursor==4: setl cul cuc",'~'.expand("<slnum>"))
|
||||
@ -11820,22 +11711,26 @@ fun! s:NetrwCursor(editfile)
|
||||
else
|
||||
" call Decho("case g:netrw_cursor==3 and not wide: setl cul (use user's cuc)",'~'.expand("<slnum>"))
|
||||
setl cursorline
|
||||
let &l:cursorcolumn = s:netrw_usercuc
|
||||
endif
|
||||
|
||||
elseif g:netrw_cursor == 2
|
||||
" thin-long-tree: cursorline, user's cursorcolumn
|
||||
" wide : cursorline, user's cursorcolumn
|
||||
" call Decho("case g:netrw_cursor==2: setl cuc (use user's cul)",'~'.expand("<slnum>"))
|
||||
let &l:cursorcolumn = s:netrw_usercuc
|
||||
setl cursorline
|
||||
|
||||
elseif g:netrw_cursor == 1
|
||||
" thin-long-tree: user's cursorline, user's cursorcolumn
|
||||
" wide : cursorline, user's cursorcolumn
|
||||
let &l:cursorcolumn = s:netrw_usercuc
|
||||
if w:netrw_liststyle == s:WIDELIST
|
||||
" call Decho("case g:netrw_cursor==2 and wide: setl cul (use user's cuc)",'~'.expand("<slnum>"))
|
||||
setl cursorline
|
||||
else
|
||||
" call Decho("case g:netrw_cursor==2 and not wide: (use user's cul,cuc)",'~'.expand("<slnum>"))
|
||||
let &l:cursorline = s:netrw_usercul
|
||||
endif
|
||||
|
||||
else
|
||||
@ -11845,7 +11740,6 @@ fun! s:NetrwCursor(editfile)
|
||||
let &l:cursorcolumn = s:netrw_usercuc
|
||||
endif
|
||||
|
||||
" call Decho("(s:NetrwCursor) COMBAK: cuc=".&l:cuc." cul=".&l:cul)
|
||||
" call Dret("s:NetrwCursor : l:cursorline=".&l:cursorline." l:cursorcolumn=".&l:cursorcolumn)
|
||||
endfun
|
||||
|
||||
@ -11859,7 +11753,6 @@ fun! s:RestoreCursorline()
|
||||
if exists("s:netrw_usercuc")
|
||||
let &l:cursorcolumn = s:netrw_usercuc
|
||||
endif
|
||||
" call Decho("(s:RestoreCursorline) COMBAK: cuc=".&l:cuc." cul=".&l:cul)
|
||||
" call Dret("s:RestoreCursorline : restored cul=".&l:cursorline." cuc=".&l:cursorcolumn)
|
||||
endfun
|
||||
|
||||
@ -11894,38 +11787,12 @@ fun! s:NetrwDelete(path)
|
||||
return result
|
||||
endfun
|
||||
|
||||
" ---------------------------------------------------------------------
|
||||
" s:NetrwBufRemover: removes a buffer that: {{{2s
|
||||
" has buffer-id > 1
|
||||
" is unlisted
|
||||
" is unnamed
|
||||
" does not appear in any window
|
||||
fun! s:NetrwBufRemover(bufid)
|
||||
" call Dfunc("s:NetrwBufRemover(".a:bufid.")")
|
||||
" call Decho("buf#".a:bufid." ".((a:bufid > 1)? ">" : "≯")." must be >1 for removal","~".expand("<slnum>"))
|
||||
" call Decho("buf#".a:bufid." is ".(buflisted(a:bufid)? "listed" : "unlisted"),"~".expand("<slnum>"))
|
||||
" call Decho("buf#".a:bufid." has name <".bufname(a:bufid).">","~".expand("<slnum>"))
|
||||
" call Decho("buf#".a:bufid." has winid#".bufwinid(a:bufid),"~".expand("<slnum>"))
|
||||
|
||||
if a:bufid > 1 && !buflisted(a:bufid) && bufname(a:bufid) == "" && bufwinid(a:bufid) == -1
|
||||
" call Decho("(s:NetrwBufRemover) removing buffer#".a:bufid,"~".expand("<slnum>"))
|
||||
exe "bd! ".a:bufid
|
||||
endif
|
||||
|
||||
" call Dret("s:NetrwBufRemover")
|
||||
endfun
|
||||
|
||||
" ---------------------------------------------------------------------
|
||||
" s:NetrwEnew: opens a new buffer, passes netrw buffer variables through {{{2
|
||||
fun! s:NetrwEnew(...)
|
||||
" call Dfunc("s:NetrwEnew() a:0=".a:0." win#".winnr()." winnr($)=".winnr("$")." bufnr($)=".bufnr("$")." expand(%)<".expand("%").">")
|
||||
" call Decho("curdir<".((a:0>0)? a:1 : "")."> buf#".bufnr("%")."<".bufname("%").">",'~'.expand("<slnum>"))
|
||||
|
||||
" Clean out the last buffer:
|
||||
" Check if the last buffer has # > 1, is unlisted, is unnamed, and does not appear in a window
|
||||
" If so, delete it.
|
||||
call s:NetrwBufRemover(bufnr("$"))
|
||||
|
||||
" grab a function-local-variable copy of buffer variables
|
||||
" call Decho("make function-local copy of netrw variables",'~'.expand("<slnum>"))
|
||||
if exists("b:netrw_bannercnt") |let netrw_bannercnt = b:netrw_bannercnt |endif
|
||||
|
@ -1,7 +1,7 @@
|
||||
" netrwSettings.vim: makes netrw settings simpler
|
||||
" Date: Aug 12, 2021
|
||||
" Date: Nov 09, 2016
|
||||
" Maintainer: Charles E Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
|
||||
" Version: 17 ASTRO-ONLY
|
||||
" 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
|
||||
|
@ -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
|
||||
|
45
runtime/autoload/provider/python.vim
Normal file
45
runtime/autoload/provider/python.vim
Normal file
@ -0,0 +1,45 @@
|
||||
" The Python provider uses a Python host to emulate an environment for running
|
||||
" python-vim plugins. :help provider
|
||||
"
|
||||
" Associating the plugin with the Python host is the first step because plugins
|
||||
" will be passed as command-line arguments
|
||||
|
||||
if exists('g:loaded_python_provider')
|
||||
finish
|
||||
endif
|
||||
let [s:prog, s:err] = provider#pythonx#Detect(2)
|
||||
let g:loaded_python_provider = empty(s:prog) ? 1 : 2
|
||||
|
||||
function! provider#python#Prog() abort
|
||||
return s:prog
|
||||
endfunction
|
||||
|
||||
function! provider#python#Error() abort
|
||||
return s:err
|
||||
endfunction
|
||||
|
||||
" The Python provider plugin will run in a separate instance of the Python
|
||||
" host.
|
||||
call remote#host#RegisterClone('legacy-python-provider', 'python')
|
||||
call remote#host#RegisterPlugin('legacy-python-provider', 'script_host.py', [])
|
||||
|
||||
function! provider#python#Call(method, args) abort
|
||||
if s:err != ''
|
||||
return
|
||||
endif
|
||||
if !exists('s:host')
|
||||
let s:rpcrequest = function('rpcrequest')
|
||||
|
||||
" Ensure that we can load the Python host before bootstrapping
|
||||
try
|
||||
let s:host = remote#host#Require('legacy-python-provider')
|
||||
catch
|
||||
let s:err = v:exception
|
||||
echohl WarningMsg
|
||||
echomsg v:exception
|
||||
echohl None
|
||||
return
|
||||
endtry
|
||||
endif
|
||||
return call(s:rpcrequest, insert(insert(a:args, 'python_'.a:method), s:host))
|
||||
endfunction
|
@ -6,8 +6,10 @@ endif
|
||||
let s:loaded_pythonx_provider = 1
|
||||
|
||||
function! provider#pythonx#Require(host) abort
|
||||
let ver = (a:host.orig_name ==# 'python') ? 2 : 3
|
||||
|
||||
" Python host arguments
|
||||
let prog = provider#python3#Prog()
|
||||
let prog = (ver == '2' ? provider#python#Prog() : provider#python3#Prog())
|
||||
let args = [prog, '-c', 'import sys; sys.path = list(filter(lambda x: x != "", sys.path)); import neovim; neovim.start_host()']
|
||||
|
||||
|
||||
@ -21,12 +23,14 @@ function! provider#pythonx#Require(host) abort
|
||||
endfunction
|
||||
|
||||
function! s:get_python_executable_from_host_var(major_version) abort
|
||||
return expand(get(g:, 'python'.(a:major_version == 3 ? '3' : execute("throw 'unsupported'")).'_host_prog', ''), v:true)
|
||||
return expand(get(g:, 'python'.(a:major_version == 3 ? '3' : '').'_host_prog', ''), v:true)
|
||||
endfunction
|
||||
|
||||
function! s:get_python_candidates(major_version) abort
|
||||
return {
|
||||
\ 3: ['python3', 'python3.10', 'python3.9', 'python3.8', 'python3.7', 'python']
|
||||
\ 2: ['python2', 'python2.7', 'python2.6', 'python'],
|
||||
\ 3: ['python3', 'python3.10', 'python3.9', 'python3.8', 'python3.7',
|
||||
\ 'python3.6', 'python']
|
||||
\ }[a:major_version]
|
||||
endfunction
|
||||
|
||||
@ -56,7 +60,7 @@ function! provider#pythonx#DetectByModule(module, major_version) abort
|
||||
endfor
|
||||
|
||||
" No suitable Python executable found.
|
||||
return ['', 'Could not load Python '.a:major_version.":\n".join(errors, "\n")]
|
||||
return ['', 'provider/pythonx: Could not load Python '.a:major_version.":\n".join(errors, "\n")]
|
||||
endfunction
|
||||
|
||||
" Returns array: [prog_exitcode, prog_version]
|
||||
@ -78,7 +82,7 @@ function! provider#pythonx#CheckForModule(prog, module, major_version) abort
|
||||
return [0, a:prog . ' not found in search path or not executable.']
|
||||
endif
|
||||
|
||||
let min_version = '3.7'
|
||||
let min_version = (a:major_version == 2) ? '2.6' : '3.3'
|
||||
|
||||
" Try to load module, and output Python version.
|
||||
" Exit codes:
|
||||
@ -92,14 +96,14 @@ 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
|
||||
endif
|
||||
|
||||
if prog_exitcode == 2
|
||||
return [0, prog_path.' does not have the "' . a:module . '" module.']
|
||||
return [0, prog_path.' does not have the "' . a:module . '" module. :help provider-python']
|
||||
elseif prog_exitcode == 127
|
||||
" This can happen with pyenv's shims.
|
||||
return [0, prog_path . ' does not exist: ' . prog_version]
|
||||
|
@ -2,7 +2,7 @@
|
||||
" Maintainer: <vacancy>
|
||||
" Previous Maintainer: Aaron Griffin <aaronmgriffin@gmail.com>
|
||||
" Version: 0.9
|
||||
" Last Updated: 2022 Mar 30
|
||||
" Last Updated: 2020 Oct 9
|
||||
"
|
||||
" Roland Puntaier: this file contains adaptations for python3 and is parallel to pythoncomplete.vim
|
||||
"
|
||||
@ -91,9 +91,6 @@ endfunction
|
||||
|
||||
function! s:DefPython()
|
||||
py3 << PYTHONEOF
|
||||
import warnings
|
||||
warnings.simplefilter(action='ignore', category=FutureWarning)
|
||||
|
||||
import sys, tokenize, io, types
|
||||
from token import NAME, DEDENT, NEWLINE, STRING
|
||||
|
||||
@ -176,7 +173,7 @@ class Completer(object):
|
||||
pass
|
||||
if len(arg_text) == 0:
|
||||
# The doc string sometimes contains the function signature
|
||||
# this works for a lot of C modules that are part of the
|
||||
# this works for alot of C modules that are part of the
|
||||
# standard library
|
||||
doc = func_obj.__doc__
|
||||
if doc:
|
||||
|
@ -191,7 +191,7 @@ class Completer(object):
|
||||
pass
|
||||
if len(arg_text) == 0:
|
||||
# The doc string sometimes contains the function signature
|
||||
# this works for a lot of C modules that are part of the
|
||||
# this works for alot of C modules that are part of the
|
||||
# standard library
|
||||
doc = func_obj.__doc__
|
||||
if doc:
|
||||
|
@ -240,11 +240,7 @@ function! s:GetAutocmdPrefix(name, opts)
|
||||
endif
|
||||
|
||||
if has_key(a:opts, 'nested') && a:opts.nested
|
||||
call add(rv, '++nested')
|
||||
endif
|
||||
|
||||
if has_key(a:opts, 'once') && a:opts.once
|
||||
call add(rv, '++once')
|
||||
call add(rv, 'nested')
|
||||
endif
|
||||
|
||||
return join(rv, ' ')
|
||||
|
@ -114,7 +114,7 @@ function! s:RegistrationCommands(host) abort
|
||||
let host_id = a:host.'-registration-clone'
|
||||
call remote#host#RegisterClone(host_id, a:host)
|
||||
let pattern = s:plugin_patterns[a:host]
|
||||
let paths = nvim_get_runtime_file('rplugin/'.a:host.'/'.pattern, 1)
|
||||
let paths = globpath(&rtp, 'rplugin/'.a:host.'/'.pattern, 1, 1)
|
||||
let paths = map(paths, 'tr(resolve(v:val),"\\","/")') " Normalize slashes #4795
|
||||
let paths = uniq(sort(paths))
|
||||
if empty(paths)
|
||||
|
@ -3,7 +3,7 @@
|
||||
" Maintainer: Mark Guzman <segfault@hasno.info>
|
||||
" URL: https://github.com/vim-ruby/vim-ruby
|
||||
" Release Coordinator: Doug Kearns <dougkearns@gmail.com>
|
||||
" Last Change: 2020 Apr 12
|
||||
" Last Change: 2019 Feb 25
|
||||
" ----------------------------------------------------------------------------
|
||||
"
|
||||
" Ruby IRB/Complete author: Keiju ISHITSUKA(keiju@ishitsuka.com)
|
||||
@ -501,8 +501,13 @@ class VimRubyCompletion
|
||||
return if rails_base == nil
|
||||
$:.push rails_base unless $:.index( rails_base )
|
||||
|
||||
bootfile = rails_base + "config/boot.rb"
|
||||
envfile = rails_base + "config/environment.rb"
|
||||
rails_config = rails_base + "config/"
|
||||
rails_lib = rails_base + "lib/"
|
||||
$:.push rails_config unless $:.index( rails_config )
|
||||
$:.push rails_lib unless $:.index( rails_lib )
|
||||
|
||||
bootfile = rails_config + "boot.rb"
|
||||
envfile = rails_config + "environment.rb"
|
||||
if File.exists?( bootfile ) && File.exists?( envfile )
|
||||
begin
|
||||
require bootfile
|
||||
|
@ -17,7 +17,7 @@
|
||||
" and complete it.
|
||||
"
|
||||
" Version 16.0 (Dec 2015)
|
||||
" - NF: If resetting the cache and table, procedure or view completion
|
||||
" - NF: If reseting the cache and table, procedure or view completion
|
||||
" had been used via dbext, have dbext delete or recreate the
|
||||
" dictionary so that new objects are picked up for the
|
||||
" next completion.
|
||||
@ -554,7 +554,7 @@ function! sqlcomplete#PreCacheSyntax(...)
|
||||
let syn_group_arr = g:omni_sql_precache_syntax_groups
|
||||
endif
|
||||
" For each group specified in the list, precache all
|
||||
" the syntax items.
|
||||
" the sytnax items.
|
||||
if !empty(syn_group_arr)
|
||||
for group_name in syn_group_arr
|
||||
let syn_items = extend( syn_items, s:SQLCGetSyntaxList(group_name) )
|
||||
@ -577,7 +577,7 @@ function! sqlcomplete#ResetCacheSyntax(...)
|
||||
let syn_group_arr = g:omni_sql_precache_syntax_groups
|
||||
endif
|
||||
" For each group specified in the list, precache all
|
||||
" the syntax items.
|
||||
" the sytnax items.
|
||||
if !empty(syn_group_arr)
|
||||
for group_name in syn_group_arr
|
||||
let list_idx = index(s:syn_list, group_name, 0, &ignorecase)
|
||||
@ -843,7 +843,7 @@ function! s:SQLCGetColumns(table_name, list_type)
|
||||
let curline = line(".")
|
||||
let curcol = col(".")
|
||||
|
||||
" Do not let searches wrap
|
||||
" Do not let searchs wrap
|
||||
setlocal nowrapscan
|
||||
" If . was entered, look at the word just before the .
|
||||
" We are looking for something like this:
|
||||
@ -863,7 +863,7 @@ function! s:SQLCGetColumns(table_name, list_type)
|
||||
" Search forward until one of the following:
|
||||
" 1. Another select/update/delete statement
|
||||
" 2. A ; at the end of a line (the delimiter)
|
||||
" 3. The end of the file (in case no delimiter)
|
||||
" 3. The end of the file (incase no delimiter)
|
||||
" Yank the visually selected text into the "y register.
|
||||
exec 'silent! normal! vl/\c\(\<select\>\|\<update\>\|\<delete\>\|;\s*$\|\%$\)'."\n".'"yy'
|
||||
|
||||
|
@ -778,7 +778,7 @@ fun! tar#Vimuntar(...)
|
||||
elseif executable("gzip")
|
||||
silent exe "!gzip -d ".shellescape(tartail)
|
||||
else
|
||||
echoerr "unable to decompress<".tartail."> on this system"
|
||||
echoerr "unable to decompress<".tartail."> on this sytem"
|
||||
if simplify(curdir) != simplify(tarhome)
|
||||
" remove decompressed tarball, restore directory
|
||||
" call Decho("delete(".tartail.".tar)")
|
||||
|
@ -693,7 +693,7 @@ func! tohtml#GetUserSettings() "{{{
|
||||
let user_settings = {}
|
||||
|
||||
" Define the correct option if the old option name exists and we haven't
|
||||
" already defined the correct one. Maybe I'll put out a warning message about
|
||||
" already defined the correct one. Maybe I'll put out a warnig message about
|
||||
" this sometime and remove the old option entirely at some even later time,
|
||||
" but for now just silently accept the old option.
|
||||
if exists('g:use_xhtml') && !exists("g:html_use_xhtml")
|
||||
|
@ -39,7 +39,7 @@ let s:Parser.LINE_BUFFER_MAX_LEN = 100
|
||||
" Create a new Parser instance with the initial state and a target. The target
|
||||
" is a dictionary that will be the `self` of every State method call associated
|
||||
" with the parser, and may contain options normally passed to
|
||||
" `jobstart`(on_stdout/on_stderr will be overridden). Returns the target so it
|
||||
" `jobstart`(on_stdout/on_stderr will be overriden). Returns the target so it
|
||||
" can be called directly as the second argument of `jobstart`:
|
||||
"
|
||||
" call jobstart(prog_argv, vimexpect#Parser(initial_state, {'pty': 1}))
|
||||
|
@ -199,7 +199,7 @@ function! xmlcomplete#CompleteTags(findstart, base)
|
||||
" 1. Events attributes
|
||||
if context =~ '\s'
|
||||
|
||||
" If attr contains =\s*[\"'] we catch 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*=')
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user