Compare commits

..

55 Commits

Author SHA1 Message Date
Justin M. Keyes
0159e4daae NVIM v0.5.1
BREAKING CHANGES:
d83df7f7b5 feat(lua)!: register_keystroke_callback => on_key
cd8f6c5fb7 feat(lsp)!: change handler signature #15504

FEATURES:
915dda3f96 feat(jobstart): add parameter to close stdin

FIXES:
f8e0011534 #15732 fix(inccommand): ignore trailing commands only for *previewed* command
2132c063af backport: fix(windowing): positioning of relative floats
51d6b26729 #15495 backport: tests(lua/on_yank): assert conditions that fail correctly
f7002337c0 #15482 backport: fix(lua): verify buffer in highlight.on_yank
6bda2f56eb #15454 backport: fix(window.c): win_close from other tabpage
be58ba250e #15372 backport: fix(autocmd.c): fix conditions in block_autocmds, unblock_autocmds
d0e9a11e39 backport: refactor(sign): include longer sign column option
5c42376c15 backport: fix(sign): reset auto sign column with minimum in float win minimal style
41f761130e backport: fix(decorations): crash when :bdelete (extmark_free_all) after clear_namespace
cf62554e5a #15111 backport: fix(:source): copy curbuf lines to memory before sourcing
6436100b6e #14809 backport: fix(:source, nvim_exec): handle Vimscript line continuations
917f306666 #15043 backport: test/memory_usage_spec: skip on MacOS
a9cca1b050 #14984 backport: fixup(clipboard): Fix error not properly handled
ae89330ec0 #14982 backport: fix(vim.opt): vimL map string values not trimmed
2229e99ef9 #14962 backport: fixup(clipboard): Use case matching
b6b12ea7c3 #15489 fix(man.vim): filetype=man is too eager
6f965f41df build: use RelWithDebInfo build for nightlies, Release for releases
f027c5e1e4 build: update appdata.xml version in release commit
8336488ce1 test(treesitter): skip all parsers tests if parsers aren't installed
008b83f5a2 Rename stdin to stdin_mode (fixes Windows build)

FIXES (LSP):
132053c1d2 #15523 backport: fix(lsp): resolve bufnr in buf_is_attached
a265201307 backport: fix(lsp): Ensure human readable errors are printed
33000bd9cf backport: fix(lsp): Ensure users get feedback on references/symbols errors or empty results
9f73b7c214 #14954 backport: fix(lsp): correctly check for windows in lsp logger
eaa1c47377 #15023 backport: fix(lsp): restore diagnostics extmarks that were moved to the last edit line
989ccb8222 #15011 backport: fix(lsp): restore diagnostics extmarks on buffer changes
2ae4c96d91 backport: fix(lsp): prevent double <text> for cached plaintext markup
7b0ae589f0 feat(lsp): allow root_dir to be nil (#15430) (Mathias Fußenegger)
8ec5bc9126 lsp(start_client): Allow passing custom workspaceFolders to the LSP (#15132) (sim)
959cf5e53c fix(lsp): check if buffer is valid in changetracking (#15505) (Jose Alvarez)
dc15b3a92c fix(lsp): avoid ipairs on non-sequential tables (#15059) (Michael Lingelbach)
18375c6df6 feat(lsp): improve vim.lsp.util.apply_text_edits (#15561) (hrsh7th)
7b1315fe61 feat(lsp): improve logging (#15636) (Michael Lingelbach)
2021-09-26 15:15:30 -07:00
Justin M. Keyes
c9e4f86b75 fix(release.sh): ignore failed "rm" 2021-09-26 15:15:30 -07:00
Justin M. Keyes
14cdaca6a8 fix(lsp): fix handler signature, tests
- not necessary on master: got lost in the vim.lsp.diagnostic => vim.diagnostic migration
- fix tests which accidentally depended on previous session
- ref #15504
2021-09-26 15:15:03 -07:00
Mathias Fußenegger
7b0ae589f0 feat(lsp): allow root_dir to be nil (#15430)
According to the protocol definition `rootPath`, `rootUri` and
`workspaceFolders` are allowed to be null.

Some language servers utilize this to provide "single file" support.
If all three are null, they don't attempt to index a directory but
instead only provide capabilities for a single file.
2021-09-26 11:28:28 -07:00
sim
8ec5bc9126 lsp(start_client): Allow passing custom workspaceFolders to the LSP (#15132)
Some language servers *cough*rust-analyzer*cough* need an empty/custom
workspaceFolders for certain usecases. For example, rust-analyzer
needs an empty workspaceFolders table for standalone file support
(See https://github.com/rust-analyzer/rust-analyzer/pull/8955).

This can also be useful for other languages that need to commonly
open a certain directory (like flutter or lua), which would help
prevent spinning up a new language server altogether.

In case no workspaceFolders are passed, we fallback to what we had
before.
2021-09-26 11:28:28 -07:00
Jose Alvarez
959cf5e53c fix(lsp): check if buffer is valid in changetracking (#15505) 2021-09-26 11:28:28 -07:00
Michael Lingelbach
dc15b3a92c fix(lsp): avoid ipairs on non-sequential tables (#15059)
ipairs terminates on the first nil index when iterating over table keys:

for i,k in ipairs( {[1] = 'test', [3] = 'test'} ) do
  print(i, k)
end

prints:
1 test

Instead, use pairs which continues iterating over the entire table:

for i,k in pairs( {[1] = 'test', [3] = 'test'} ) do
  print(i, k)
end

prints:
1 test
3 test
2021-09-26 11:28:28 -07:00
hrsh7th
18375c6df6 feat(lsp): improve vim.lsp.util.apply_text_edits (#15561)
- Fix the cursor position after applying TextEdits
- Support reversed range of TextEdit
- Invoke nvim_buf_set_text one by one
2021-09-26 11:28:28 -07:00
Michael Lingelbach
7b1315fe61 feat(lsp): improve logging (#15636)
* Simplify rpc encode/decode messages to rpc.send/rcp.receive
* Make missing handlers message throw a warning
* Clean up formatting style in log
* Move all non-RPC loop messages to trace instead of debug
* Add format func option to log to allow newlines in per log entry
2021-09-26 11:28:28 -07:00
Mathias Fußenegger
27bac13be6 fix(lsp): update lsp-handler signature in call_hierarchy (#15738)
This fixes the handler signature and also prevents n+1 requests firing
if there are multiple clients.

(The first `prepareCallHierarchy` handler is called once per client,
each invocation used `buf_request` to make more requests using *all*
clients)
2021-09-26 10:25:17 -07:00
Mathias Fußenegger
d26d489e2e fix(lsp): adapt codelens resolve to handler signature change (#15578)
Follow up to https://github.com/neovim/neovim/pull/15504
2021-09-26 10:25:17 -07:00
Jose Alvarez
a6eab6e25e fix(lsp): update workspace/applyEdit handler signature (#15573) 2021-09-26 10:25:17 -07:00
Michael Lingelbach
cd8f6c5fb7 feat(lsp)!: change handler signature #15504 2021-09-26 10:25:17 -07:00
Justin M. Keyes
f8e0011534 fix(inccommand): ignore trailing commands only for *previewed* command #15732
Since the `State` is global, other scripts are unexpectedly affected during the
'inccommand' preview. This commit introduces a new flag for `do_cmdline`, in
order to ignore trailing '|'-separated commands only for the command invoking
the preview.

fix #8796, update #7494

Co-authored-by: itchyny <itchyny@hatena.ne.jp>
2021-09-20 08:42:18 -07:00
Justin M. Keyes
7d67bd5865 Merge #15677 release-0.5: backports 2021-09-16 12:00:13 -07:00
andrew-pa
2132c063af backport: fix(windowing): positioning of relative floats
Fix relative floating windows so that they open in the correct position
relative to each other. Also make sure that their positions are correct
immediately after creation without a redraw.
2021-09-16 15:00:31 +01:00
Jose Alvarez
132053c1d2 backport: fix(lsp): resolve bufnr in buf_is_attached (#15523) 2021-09-16 14:53:45 +01:00
notomo
51d6b26729 backport: tests(lua/on_yank): assert conditions that fail correctly #15495
The test added in 274a3504a7
does not fail if the code changes are reverted.
2021-09-16 14:46:52 +01:00
notomo
f7002337c0 backport: fix(lua): verify buffer in highlight.on_yank (#15482)
Resolve an issue with deferred clearing of highlight failing if the
buffer is deleted before the timeout by checking whether the
buffer is valid first.
2021-09-16 14:46:27 +01:00
notomo
6bda2f56eb backport: fix(window.c): win_close from other tabpage #15454
Fix #15313
2021-09-16 14:44:59 +01:00
gmntroll
be58ba250e backport: fix(autocmd.c): fix conditions in block_autocmds, unblock_autocmds #15372
Logic got swapped in 7574918dc7.
We didn't notice it since v:termresponse isn't really used yet. #6279
2021-09-16 14:43:36 +01:00
Sirisak Lueangsaksri
d0e9a11e39 backport: refactor(sign): include longer sign column option 2021-09-16 14:42:22 +01:00
Sirisak Lueangsaksri
5c42376c15 backport: fix(sign): reset auto sign column with minimum in float win minimal style 2021-09-16 14:42:06 +01:00
Björn Linse
41f761130e backport: fix(decorations): crash when :bdelete (extmark_free_all) after clear_namespace
fixes #15212
2021-09-16 14:40:32 +01:00
Mathias Fussenegger
a265201307 backport: fix(lsp): Ensure human readable errors are printed
`return err_message(tostring(err))` caused errors to be printed as
`table: 0x123456789` instead of showing the error code and error
message.

This also removes some `if err` blocks that never got called because at
the end of `handlers.lua` all the handlers are wrapped with logic that
adds generic error handling.
2021-09-16 14:37:20 +01:00
Mathias Fussenegger
33000bd9cf backport: fix(lsp): Ensure users get feedback on references/symbols errors or empty results
Relates to https://github.com/neovim/neovim/issues/15050

Users should get some indication if there was an error or an empty
result.
2021-09-16 14:36:49 +01:00
Oliver Marriott
9f73b7c214 backport: fix(lsp): correctly check for windows in lsp logger (#14954) 2021-09-16 14:31:49 +01:00
Folke Lemaitre
eaa1c47377 backport: fix(lsp): restore diagnostics extmarks that were moved to the last edit line (#15023) 2021-09-16 14:26:05 +01:00
Justin M. Keyes
942b16adf7 Merge #15671 backport: :source and nvim_exec fixes 2021-09-15 06:10:48 -07:00
Sean Dewar
cf62554e5a backport: fix(:source): copy curbuf lines to memory before sourcing #15111
It's possible for weirdness to happen if curbuf is modified while
sourcing from it via :source (with no arguments). For example:

- Deleting lines from or wiping curbuf can cause internal error E315 to
  be thrown from ml_get.
- Changing the curbuf to another buffer while sourcing can cause lines
  from the new curbuf to then be sourced instead.
2021-09-15 13:34:59 +01:00
Sean Dewar
6436100b6e backport: fix(:source, nvim_exec): handle Vimscript line continuations #14809
Problem:
Anonymous :source (no args) and nvim_exec() don't support Vimscript line continuations.

Solution:
Factor out the concat logic into concat_continued_line() and a
CONCAT_CONTINUED_LINES macro for simple concatenations where lines are
fetched individually.

Closes #14807
2021-09-15 13:34:54 +01:00
Justin M. Keyes
04cde576ed Merge #15667 release-0.5: backports 2021-09-14 09:22:31 -07:00
James McCoy
cd864748d3 test: use $TEST_TIMEOUT to specify timeout 2021-09-14 07:52:33 -07:00
Justin M. Keyes
09ff3146f3 test: timeout at 20 minutes #15597
Set a maximum test run-time of 20 minutes to:
- fail faster
- avoid wasting CI resources
- set a bound on the test time (if tests take longer than 20 minutes we
  need to invest in parallelizing them...)

Timeout looks like:

    -- Tests exited non-zero: Process terminated due to timeout
    -- No output to stderr.
    CMake Error at /…/neovim/cmake/RunTests.cmake:86
    (message):
      functional tests failed with error: Process terminated due to timeout
2021-09-14 07:52:27 -07:00
Justin M. Keyes
f809664f89 ci: skip "cancels stale events on channel close" #15278
- ref #14083 #15251
- also: docs: naming conventions
2021-09-14 07:51:01 -07:00
Justin M. Keyes
d83df7f7b5 feat(lua)!: register_keystroke_callback => on_key
Analogous to nodejs's `on('data', …)` interface, here on_key is the "add
listener" interface.

ref 3ccdbc570d #12536

BREAKING_CHANGE: vim.register_keystroke_callback() is now an error.
2021-09-14 07:29:46 -07:00
hrsh7th
64dc7a1b55 fix(lsp): correctly parse LSP snippets #15579
Fixes #15522
2021-09-14 07:11:40 -07:00
Justin M. Keyes
5a813160ae Merge #15664 backport PRs
backport: PRs #14962, #14982, #14984, #14989, #15011, #15043
2021-09-14 07:02:06 -07:00
Daniel Steinberg
917f306666 backport: test/memory_usage_spec: skip on MacOS #15043
Memory compression could complicate the measurements.
2021-09-14 14:41:25 +01:00
Shadman
a9cca1b050 backport: fixup(clipboard): Fix error not properly handled #14984
fixes #14967
2021-09-14 13:15:39 +01:00
Folke Lemaitre
989ccb8222 backport: fix(lsp): restore diagnostics extmarks on buffer changes (#15011) 2021-09-14 13:15:38 +01:00
Folke Lemaitre
2ae4c96d91 backport: fix(lsp): prevent double <text> for cached plaintext markup 2021-09-14 13:15:38 +01:00
jadedpasta
ae89330ec0 backport: fix(vim.opt): vimL map string values not trimmed (#14982)
Options formatted as a list of comma-separated key-value pairs may have
values that contain leading and trailing whitespace characters. For
example, the `listchars` option has a default value of
`"tab:> ,trail:-,nbsp:+"`. When converting this value to a lua table,
leading and trailing whitespace should not be trimmed.

Co-authored-by: Robert Hrusecky <robert.hrusecky@utexas.edu>
2021-09-14 13:15:38 +01:00
Shadman
2229e99ef9 backport: fixup(clipboard): Use case matching #14962
Context: https://github.com/neovim/neovim/pull/14848#discussion_r663203173
2021-09-14 13:15:37 +01:00
James McCoy
88336851ee Merge pull request #15496 from jamessan/stdin_closed_backport
backport: feat(job): add parameter to close stdin
2021-08-27 07:26:32 -04:00
Gregory Anders
3a0543bd61 Add test case for 'null' stdin mode 2021-08-26 21:57:25 -04:00
Gregory Anders
008b83f5a2 Rename stdin to stdin_mode
stdin is a macro in Windows builds.
2021-08-26 21:57:11 -04:00
Gregory Anders
915dda3f96 feat(job): add parameter to close stdin
Some programs behave differently when they detect that stdin is being
piped. This can be problematic when these programs are used with the job
control API where stdin is attached, but not typically used. It is
possible to run the job using a PTY which circumvents this problem, but
that includes a lot of overhead when simply closing the stdin pipe would
suffice.

To enable this behavior, add a new parameter to the jobstart options
dict called "stdin" with two valid values: "pipe" (the default)
implements the existing behavior of opening a channel for stdin and
"null" which disconnects stdin (or, if you prefer, connects it to
/dev/null). This is extensible so that other modes can be added in the
future.
2021-08-26 21:56:45 -04:00
Justin M. Keyes
b6b12ea7c3 fix(man.vim): filetype=man is too eager #15489
Problem:
"set filetype=man" assumes the user wants :Man features, this does extra
stuff like renaming the buffer as "man://".

Solution:
- old entrypoint was ":set filetype=man", but this is too presumptuous #15487
- make the entrypoints more explicit:
  1. when the ":Man" command is run
  2. when a "man://" buffer is opened
- remove the tricky b:man_sect checks in ftplugin/man.vim and syntax/man.vim
- MANPAGER is supported via ":Man!", as documented.

fixes #15487
2021-08-26 02:50:30 -07:00
James McCoy
502a56867d Merge pull request #15445 from jamessan/appdata-version
fix: add 0.5.0 release to appdata
2021-08-21 15:21:45 -04:00
James McCoy
78482138ae fix: add 0.5.0 release to appdata
[skip ci]
2021-08-21 14:36:12 -04:00
James McCoy
fe815244f0 Merge pull request #15389 from jamessan/32-bit-revert
[release-0.5] Revert "tests: unit: fix preprocess: pass -m32 for 32bit ABI (#11073)"
2021-08-16 07:55:38 -04:00
James McCoy
56d86970b0 Merge pull request #15375 from jamessan/fragility
[release-0.5] test(lsp): disable finicky test when TEST_SKIP_FRAGILE is set
2021-08-14 22:11:01 -04:00
James McCoy
6c4f66f381 Merge pull request #15376 from jamessan/release-fixes
[release-0.5] Clean up release handling
2021-08-14 21:46:38 -04:00
James McCoy
f589c2619b Merge pull request #15289 from jamessan/pending-c-parsers
[release-0.5] test(treesitter): skip all parsers tests if parsers aren't installed
2021-08-06 07:24:19 -04:00
1341 changed files with 102082 additions and 168427 deletions

View File

@@ -1,10 +1,11 @@
image: freebsd/latest image: freebsd/12.x
packages: packages:
- cmake - cmake
- gmake - gmake
- ninja - ninja
- libtool - libtool
- sha
- automake - automake
- pkgconf - pkgconf
- unzip - unzip
@@ -12,7 +13,6 @@ packages:
- gettext - gettext
- python - python
- libffi - libffi
- gdb
sources: sources:
- https://github.com/neovim/neovim - https://github.com/neovim/neovim
@@ -35,6 +35,10 @@ tasks:
- unittest: | - unittest: |
cd neovim cd neovim
gmake unittest gmake unittest
- oldtest: |
cd neovim # Unfortunately, oldtest is tanking hard on sourcehut's FreeBSD instance
gmake oldtest # 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

View File

@@ -1,6 +1,6 @@
# sourcehut CI: https://builds.sr.ht/~jmk/neovim # sourcehut CI: https://builds.sr.ht/~jmk/neovim
image: openbsd/latest image: openbsd/6.9
packages: packages:
- autoconf-2.71 - autoconf-2.71
@@ -12,7 +12,6 @@ packages:
- libtool - libtool
- ninja-1.10.2p0 - ninja-1.10.2p0
- unzip-6.0p14 - unzip-6.0p14
- gdb
sources: sources:
- https://github.com/neovim/neovim - https://github.com/neovim/neovim

View File

@@ -1,11 +1,11 @@
BasedOnStyle: Google BasedOnStyle: Google
Language: Cpp Language: Cpp
ColumnLimit: 100 ColumnLimit: 80
IndentWidth: 2 IndentWidth: 2
TabWidth: 8 TabWidth: 2
UseTab: Never UseTab: Never
IndentCaseLabels: false IndentCaseLabels: true
BreakBeforeBraces: Custom BreakBeforeBraces: Linux
AlignEscapedNewlinesLeft: false AlignEscapedNewlinesLeft: false
AllowShortFunctionsOnASingleLine: false AllowShortFunctionsOnASingleLine: false
AlignTrailingComments: true AlignTrailingComments: true
@@ -17,24 +17,4 @@ AllowShortLoopsOnASingleLine: false
BinPackParameters: false BinPackParameters: false
BreakBeforeBinaryOperators: true BreakBeforeBinaryOperators: true
BreakBeforeTernaryOperators: true BreakBeforeTernaryOperators: true
ContinuationIndentWidth: 2 ContinuationIndentWidth: 4
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

View File

@@ -8,9 +8,6 @@ end_of_line = lf
insert_final_newline = true insert_final_newline = true
charset = utf-8 charset = utf-8
[*.{c,h,in,lua}]
max_line_length = 100
[{Makefile,**/Makefile,runtime/doc/*.txt}] [{Makefile,**/Makefile,runtime/doc/*.txt}]
indent_style = tab indent_style = tab
indent_size = 8 indent_size = 8

View File

@@ -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
View File

@@ -1,6 +1,7 @@
*.h linguist-language=C *.h linguist-language=C
src/nvim/testdir/test42.in diff src/nvim/testdir/test42.in diff
.github/ export-ignore .github/ export-ignore
ci/ export-ignore
.travis.yml export-ignore .travis.yml export-ignore
codecov.yml export-ignore codecov.yml export-ignore
.builds/ export-ignore .builds/ export-ignore

34
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View 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

View File

@@ -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

View File

@@ -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

View 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

View File

@@ -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

View 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

View File

@@ -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
View File

@@ -4,7 +4,7 @@
"lua": "lua":
- runtime/lua/**/* - runtime/lua/**/*
- src/nvim/lua/* - src/nvim/lua
"tui": "tui":
- src/nvim/tui/tui.* - src/nvim/tui/tui.*
@@ -14,52 +14,36 @@
- runtime/lua/vim/treesitter.lua - runtime/lua/vim/treesitter.lua
- runtime/lua/vim/treesitter/* - runtime/lua/vim/treesitter/*
"diagnostic":
- runtime/lua/vim/diagnostic.lua
"dependencies": "dependencies":
- third-party/**/* - third-party/**/*
"spell": "topic: spell":
- src/nvim/spell* - src/nvim/spell*
"terminal": "topic: :terminal":
- src/nvim/terminal.* - src/nvim/terminal.*
"column": "topic: column":
- src/nvim/mark.h - src/nvim/mark.h
- src/nvim/mark.c - src/nvim/mark.c
- src/nvim/sign* - src/nvim/sign*
"folds": "topic: folds":
- src/nvim/fold* - src/nvim/fold*
"mouse": "topic: mouse":
- src/nvim/mouse* - src/nvim/mouse*
"documentation": "topic: documentation":
- all: ["runtime/doc/*"] - runtime/doc/*
"clipboard": "topic: clipboard":
- runtime/autoload/provider/clipboard.vim - runtime/autoload/provider/clipboard.vim
"diff": "topic: diff":
- src/nvim/diff.* - src/nvim/diff.*
"build": "topic: build":
- CMakeLists.txt - CMakeLists.txt
- "**/CMakeLists.txt" - "**/CMakeLists.txt"
- "**/Makefile"
- "**/*.cmake" - "**/*.cmake"
"test":
- all: ["test/**/*"]
"ci":
- .github/labeler.yml
- .github/workflows/**/*
- .builds/*
- ci/**/*
"filetype":
- runtime/lua/vim/filetype.lua

View File

@@ -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
});
}

View File

@@ -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)
});
}

View File

@@ -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

View File

@@ -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 name: Autogenerate API docs
on: on:
push: push:
paths: paths:
- 'src/nvim/api/*.[ch]' - 'src/nvim/api/*.[ch]'
- 'src/nvim/**.lua'
- 'runtime/lua/**.lua' - 'runtime/lua/**.lua'
- 'runtime/doc/**'
branches: branches:
- 'master' - 'master'
- 'release-[0-9]+.[0-9]+' - 'release-[0-9]+.[0-9]+'
workflow_dispatch: workflow_dispatch:
workflow_call:
inputs:
check_only:
type: boolean
default: false
required: false
jobs: jobs:
regen-api-docs: regen-api-docs:
@@ -35,9 +26,7 @@ jobs:
- name: Install dependencies - name: Install dependencies
run: | run: |
sudo apt-get update sudo apt-get update
sudo env DEBIAN_FRONTEND=noninteractive apt-get install -y python3 luajit sudo env DEBIAN_FRONTEND=noninteractive apt-get install -y doxygen python3 python3-msgpack luajit
conda install -c conda-forge doxygen=1.9.2 msgpack-python
echo "$CONDA/bin" >> $GITHUB_PATH
- name: Setup git config - name: Setup git config
run: | run: |
@@ -53,18 +42,10 @@ jobs:
python3 scripts/gen_vimdoc.py python3 scripts/gen_vimdoc.py
printf '::set-output name=UPDATED_DOCS::%s\n' $([ -z "$(git diff)" ]; echo $?) 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 - name: Automatic PR
if: ${{ steps.docs.outputs.UPDATED_DOCS != 0 && !inputs.check_only }} if: ${{ steps.docs.outputs.UPDATED_DOCS != 0 }}
run: | run: |
git add -u 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} 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

View File

@@ -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 }}

View File

@@ -1,143 +1,39 @@
name: CI name: CI
on: on:
push: push:
branches: branches: '**'
- 'master'
- 'release-[0-9]+.[0-9]+'
pull_request: pull_request:
types: [opened, synchronize, reopened, ready_for_review]
branches: branches:
- 'master' - 'master'
- 'release-[0-9]+.[0-9]+' - '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: jobs:
lint: unixish:
# This job tests two things: it lints the code but also builds neovim using name: ${{ matrix.os }} ${{ matrix.flavor }} (cc=${{ matrix.cc }})
# 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 }})
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
include: include:
- flavor: asan - flavor: asan
cc: clang-13 cc: clang-12
runner: ubuntu-20.04
os: linux
- flavor: lint
cc: gcc
runner: ubuntu-20.04 runner: ubuntu-20.04
os: linux os: linux
- flavor: tsan - flavor: tsan
cc: clang-13 cc: clang-12
runner: ubuntu-20.04 runner: ubuntu-20.04
os: linux os: linux
- cc: clang - cc: clang
runner: macos-10.15 runner: macos-10.15
os: osx 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 - flavor: functionaltest-lua
cc: gcc cc: gcc
runner: ubuntu-20.04 runner: ubuntu-20.04
os: linux os: linux
cmake: minimum_required
runs-on: ${{ matrix.runner }} runs-on: ${{ matrix.runner }}
timeout-minutes: 45
if: github.event.pull_request.draft == false if: github.event.pull_request.draft == false
env: env:
CC: ${{ matrix.cc }} CC: ${{ matrix.cc }}
@@ -145,7 +41,7 @@ jobs:
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Setup common environment variables - name: Setup commom environment variables
run: ./.github/workflows/env.sh ${{ matrix.flavor }} run: ./.github/workflows/env.sh ${{ matrix.flavor }}
- name: Install apt packages - name: Install apt packages
@@ -154,40 +50,27 @@ jobs:
sudo apt-get update 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 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 - name: Install new clang
if: matrix.flavor == 'asan' || matrix.flavor == 'tsan' if: matrix.flavor == 'asan' || matrix.flavor == 'tsan'
run: | run: |
wget https://apt.llvm.org/llvm.sh wget https://apt.llvm.org/llvm.sh
chmod a+x llvm.sh chmod a+x llvm.sh
sudo ./llvm.sh 13 sudo ./llvm.sh 12
rm llvm.sh rm llvm.sh
- name: Install brew packages - name: Install brew packages
if: matrix.os == 'osx' if: matrix.os == 'osx'
run: | run: |
brew update --quiet # Workaround brew issues
brew install automake ccache cpanminus ninja rm -f /usr/local/bin/2to3
brew update >/dev/null
brew upgrade
brew install automake ccache perl cpanminus ninja
- name: Setup interpreter packages - name: Setup interpreter packages
run: ./ci/install.sh run: |
./ci/before_install.sh
./ci/install.sh
- name: Cache dependencies - name: Cache dependencies
uses: actions/cache@v2 uses: actions/cache@v2
@@ -195,36 +78,20 @@ jobs:
path: | path: |
${{ env.CACHE_NVIM_DEPS_DIR }} ${{ env.CACHE_NVIM_DEPS_DIR }}
~/.ccache ~/.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 - name: Build third-party
run: ./ci/before_script.sh run: ./ci/before_script.sh
- name: Build - name: Build and test
run: ./ci/run_tests.sh build_nvim run: ./ci/script.sh
- 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: Cache dependencies - name: Cache dependencies
if: ${{ success() }}
run: ./ci/before_cache.sh run: ./ci/before_cache.sh
windows: windows:
runs-on: windows-2019 runs-on: windows-2016
timeout-minutes: 45
if: github.event.pull_request.draft == false if: github.event.pull_request.draft == false
env: env:
DEPS_BUILD_DIR: ${{ format('{0}/nvim-deps', github.workspace) }} DEPS_BUILD_DIR: ${{ format('{0}/nvim-deps', github.workspace) }}
@@ -233,7 +100,7 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
config: [ MINGW_64-gcov, MSVC_64 ] config: [ MINGW_64-gcov, MINGW_32, MSVC_64, MSVC_32 ]
name: windows (${{ matrix.config }}) name: windows (${{ matrix.config }})
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2

View File

@@ -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})"

View File

@@ -34,23 +34,18 @@ case "$FLAVOR" in
BUILD_FLAGS="$BUILD_FLAGS -DPREFER_LUA=ON" BUILD_FLAGS="$BUILD_FLAGS -DPREFER_LUA=ON"
cat <<EOF >> "$GITHUB_ENV" cat <<EOF >> "$GITHUB_ENV"
CLANG_SANITIZER=ASAN_UBSAN CLANG_SANITIZER=ASAN_UBSAN
SYMBOLIZER=asan_symbolize-13 SYMBOLIZER=asan_symbolize-12
ASAN_OPTIONS=detect_leaks=1:check_initialization_order=1:log_path=$GITHUB_WORKSPACE/build/log/asan:intercept_tls_get_addr=0 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 UBSAN_OPTIONS=print_stacktrace=1 log_path=$GITHUB_WORKSPACE/build/log/ubsan
EOF EOF
;; ;;
tsan) tsan)
cat <<EOF >> "$GITHUB_ENV" cat <<EOF >> "$GITHUB_ENV"
TSAN_OPTIONS=log_path=$GITHUB_WORKSPACE/build/log/tsan TSAN_OPTIONS=log_path=$GITHUB_WORKSPACE/build/log/tsan
CLANG_SANITIZER=TSAN
EOF EOF
;; ;;
lint) 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" cat <<EOF >> "$GITHUB_ENV"
USE_BUNDLED=OFF
CI_TARGET=lint CI_TARGET=lint
EOF EOF
;; ;;

View File

@@ -1,9 +1,7 @@
name: "Pull Request Labeler" name: "Pull Request Labeler"
on: on:
pull_request_target: - pull_request_target
types: [opened]
jobs: jobs:
triage: triage:
runs-on: ubuntu-latest runs-on: ubuntu-latest
permissions: permissions:
@@ -13,37 +11,3 @@ jobs:
- uses: actions/labeler@main - uses: actions/labeler@main
with: with:
repo-token: "${{ secrets.GITHUB_TOKEN }}" 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})

View File

@@ -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}
```

View File

@@ -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=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)" printf '::set-output name=release::%s\n' "$(./build/bin/nvim --version | head -n 1)"
make DESTDIR="$GITHUB_WORKSPACE/build/release/nvim-linux64" install make DESTDIR="$GITHUB_WORKSPACE/build/release/nvim-linux64" install
cd "$GITHUB_WORKSPACE/build/" cd "$GITHUB_WORKSPACE/build/release"
cpack -C $NVIM_BUILD_TYPE tar cfz nvim-linux64.tar.gz nvim-linux64
- uses: actions/upload-artifact@v2 - uses: actions/upload-artifact@v2
with: with:
name: nvim-linux64 name: nvim-linux64
path: build/nvim-linux64.tar.gz path: build/release/nvim-linux64.tar.gz
retention-days: 1
- uses: actions/upload-artifact@v2
with:
name: nvim-linux64
path: build/nvim-linux64.deb
retention-days: 1 retention-days: 1
appimage: appimage:
@@ -78,57 +73,50 @@ jobs:
retention-days: 1 retention-days: 1
macOS: macOS:
runs-on: macos-11 runs-on: macos-10.15
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Install brew packages - name: Install brew packages
run: | run: |
brew update --quiet rm -f /usr/local/bin/2to3
brew update >/dev/null
brew upgrade
brew install automake ninja brew install automake ninja
- if: github.event_name == 'push' || (github.event_name == 'workflow_dispatch' && github.event.inputs.tag_name != 'nightly') - 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 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') - 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 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 - name: Build release
run: | run: |
export MACOSX_DEPLOYMENT_TARGET="$(sw_vers -productVersion | cut -f1 -d.)" make CMAKE_BUILD_TYPE=${NVIM_BUILD_TYPE} CMAKE_EXTRA_FLAGS="-DCMAKE_INSTALL_PREFIX:PATH= -DCMAKE_OSX_DEPLOYMENT_TARGET=10.11"
OSX_FLAGS="-DCMAKE_OSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} -DCMAKE_OSX_ARCHITECTURES=arm64\;x86_64" make DESTDIR="$GITHUB_WORKSPACE/build/release/nvim-osx64" install
make CMAKE_BUILD_TYPE=${NVIM_BUILD_TYPE} \
CMAKE_EXTRA_FLAGS="-DCMAKE_INSTALL_PREFIX:PATH= $OSX_FLAGS" \
DEPS_CMAKE_FLAGS="$OSX_FLAGS"
make DESTDIR="$GITHUB_WORKSPACE/build/release/nvim-macos" install
- name: Create package - name: Create package
run: | run: |
cd "$GITHUB_WORKSPACE/build/release" cd "$GITHUB_WORKSPACE/build/release"
tar cfz nvim-macos.tar.gz nvim-macos mkdir -p nvim-osx64/libs
- uses: actions/upload-artifact@v3 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: with:
name: nvim-macos name: nvim-macos
path: build/release/nvim-macos.tar.gz path: build/release/nvim-macos.tar.gz
retention-days: 1 retention-days: 1
windows: windows:
runs-on: windows-2019 runs-on: windows-2016
env: env:
DEPS_BUILD_DIR: ${{ format('{0}/nvim-deps', github.workspace) }} DEPS_BUILD_DIR: ${{ format('{0}/nvim-deps', github.workspace) }}
DEPS_PREFIX: ${{ format('{0}/nvim-deps/usr', github.workspace) }} DEPS_PREFIX: ${{ format('{0}/nvim-deps/usr', github.workspace) }}
@@ -137,6 +125,8 @@ jobs:
include: include:
- config: MSVC_64 - config: MSVC_64
archive: nvim-win64 archive: nvim-win64
- config: MSVC_32
archive: nvim-win32
name: windows (${{ matrix.config }}) name: windows (${{ matrix.config }})
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
@@ -145,36 +135,20 @@ jobs:
- run: powershell ci\build.ps1 -NoTests - run: powershell ci\build.ps1 -NoTests
env: env:
CONFIGURATION: ${{ matrix.config }} CONFIGURATION: ${{ matrix.config }}
- run: move build\Neovim.zip build\${{ matrix.archive }}.zip
- uses: actions/upload-artifact@v2 - uses: actions/upload-artifact@v2
with: with:
name: ${{ matrix.archive }} name: ${{ matrix.archive }}
path: build/${{ matrix.archive }}.zip path: build/${{ matrix.archive }}.zip
retention-days: 1 retention-days: 1
- uses: actions/upload-artifact@v2
with:
name: ${{ matrix.archive }}
path: build/${{ matrix.archive }}.msi
retention-days: 1
publish: publish:
needs: [linux, appimage, macOS, windows] needs: [linux, appimage, macOS, windows]
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
env:
GH_REPO: ${{ github.repository }}
permissions: permissions:
contents: write contents: write
steps: 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 - 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' - if: github.event_name == 'workflow_dispatch'
run: echo "TAG_NAME=${{ github.event.inputs.tag_name }}" >> $GITHUB_ENV run: echo "TAG_NAME=${{ github.event.inputs.tag_name }}" >> $GITHUB_ENV
- if: github.event_name == 'schedule' - if: github.event_name == 'schedule'
@@ -184,30 +158,23 @@ jobs:
TAG_NAME=${{ github.ref }} TAG_NAME=${{ github.ref }}
echo "TAG_NAME=${TAG_NAME#refs/tags/}" >> $GITHUB_ENV echo "TAG_NAME=${TAG_NAME#refs/tags/}" >> $GITHUB_ENV
- if: env.TAG_NAME == 'nightly' - if: env.TAG_NAME == 'nightly'
env: run: echo 'SUBJECT=Nvim development (prerelease) build' >> $GITHUB_ENV
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
(echo 'SUBJECT=Nvim development (prerelease) build';
echo 'PRERELEASE=--prerelease') >> $GITHUB_ENV
gh release delete nightly --yes || true
git push origin :nightly || true
- if: env.TAG_NAME != 'nightly' - 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: env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: | with:
(echo 'SUBJECT=Nvim release build'; delete_release: true
echo 'PRERELEASE=') >> $GITHUB_ENV tag_name: nightly
gh release delete stable --yes || true
git push origin :stable || true
# `sha256sum` outputs <sha> <path>, so we cd into each dir to drop the # `sha256sum` outputs <sha> <path>, so we cd into each dir to drop the
# containing folder from the output. # containing folder from the output.
- name: Generate Linux64 SHA256 checksums - name: Generate Linux64 SHA256 checksums
run: | run: |
cd ./nvim-linux64 cd ./nvim-linux64
sha256sum nvim-linux64.tar.gz > nvim-linux64.tar.gz.sha256sum sha256sum nvim-linux64.tar.gz > nvim-linux64.tar.gz.sha256sum
echo "SHA_LINUX_64_TAR=$(cat nvim-linux64.tar.gz.sha256sum)" >> $GITHUB_ENV echo "SHA_LINUX_64=$(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
- name: Generate App Image SHA256 checksums - name: Generate App Image SHA256 checksums
run: | run: |
cd ./appimage cd ./appimage
@@ -223,21 +190,77 @@ jobs:
cd ./nvim-macos cd ./nvim-macos
sha256sum nvim-macos.tar.gz > nvim-macos.tar.gz.sha256sum sha256sum nvim-macos.tar.gz > nvim-macos.tar.gz.sha256sum
echo "SHA_MACOS=$(cat nvim-macos.tar.gz.sha256sum)" >> $GITHUB_ENV 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 - name: Generate Win64 SHA256 checksums
run: | run: |
cd ./nvim-win64 cd ./nvim-win64
sha256sum nvim-win64.zip > nvim-win64.zip.sha256sum sha256sum nvim-win64.zip > nvim-win64.zip.sha256sum
echo "SHA_WIN_64_ZIP=$(cat nvim-win64.zip.sha256sum)" >> $GITHUB_ENV echo "SHA_WIN_64=$(cat nvim-win64.zip.sha256sum)" >> $GITHUB_ENV
sha256sum nvim-win64.msi > nvim-win64.msi.sha256sum - uses: meeDamian/github-release@2.0
echo "SHA_WIN_64_MSI=$(cat nvim-win64.msi.sha256sum)" >> $GITHUB_ENV with:
- name: Publish release token: ${{ secrets.GITHUB_TOKEN }}
env: tag: ${{ env.TAG_NAME }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} name: ${{ needs.linux.outputs.release }}
NVIM_VERSION: ${{ needs.linux.outputs.version }} prerelease: ${{ env.TAG_NAME == 'nightly' }}
DEBUG: api commitish: ${{ github.sha }}
run: | gzip: false
envsubst < "$GITHUB_WORKSPACE/.github/workflows/notes.md" > "$RUNNER_TEMP/notes.md" allow_override: ${{ env.TAG_NAME == 'nightly' }}
gh release create $TAG_NAME $PRERELEASE --notes-file "$RUNNER_TEMP/notes.md" --title "$SUBJECT" --target $GITHUB_SHA nvim-macos/* nvim-linux64/* appimage/* nvim-win64/* files: |
if [ "$TAG_NAME" != "nightly" ]; then nvim-macos.tar.gz:./nvim-macos/nvim-macos.tar.gz
gh release create stable $PRERELEASE --notes-file "$RUNNER_TEMP/notes.md" --title "$SUBJECT" --target $GITHUB_SHA nvim-macos/* nvim-linux64/* appimage/* nvim-win64/* nvim-macos.tar.gz.sha256sum:./nvim-macos/nvim-macos.tar.gz.sha256sum
fi 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 }}
```

View File

@@ -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})

View File

@@ -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})

View File

@@ -49,4 +49,4 @@ jobs:
git add -u git add -u
git commit -m 'version.c: update [skip ci]' git commit -m 'version.c: update [skip ci]'
git push --force https://${GITHUB_ACTOR}:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY} ${VERSION_BRANCH} 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
View File

@@ -1,7 +1,6 @@
# Tools # Tools
/venv/ /venv/
compile_commands.json compile_commands.json
/.luarc.json
# IDEs # IDEs
/.vs/ /.vs/
@@ -14,8 +13,6 @@ compile_commands.json
/tmp/ /tmp/
/.clangd/ /.clangd/
/.cache/clangd/ /.cache/clangd/
/.ccls-cache/
/.clang-tidy
.DS_Store .DS_Store
*.mo *.mo

View File

@@ -25,11 +25,3 @@ ignore = {
read_globals = { read_globals = {
"vim", "vim",
} }
globals = {
"vim.g",
}
exclude_files = {
'test/functional/fixtures/lua/syntax_error.lua',
}

134
.mailmap
View File

@@ -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

View File

@@ -133,6 +133,8 @@ jobs:
- BUILD_32BIT=ON - BUILD_32BIT=ON
- CMAKE_FLAGS="$CMAKE_FLAGS -m32 -DCMAKE_TOOLCHAIN_FILE=$TRAVIS_BUILD_DIR/cmake/i386-linux-gnu.toolchain.cmake" - 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" - 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 - *common-job-env
- name: big-endian - name: big-endian
os: linux os: linux

View File

@@ -2,8 +2,8 @@
# intro: https://codingnest.com/basic-cmake/ # intro: https://codingnest.com/basic-cmake/
# best practices (3.0+): https://gist.github.com/mbinna/c61dbb39bca0e4fb7d1f73b0d66a4fd1 # best practices (3.0+): https://gist.github.com/mbinna/c61dbb39bca0e4fb7d1f73b0d66a4fd1
# Version should match the tested CMAKE_URL in .github/workflows/ci.yml. # Version should match the tested CMAKE_URL in .travis.yml.
cmake_minimum_required(VERSION 3.10) cmake_minimum_required(VERSION 2.8.12)
project(nvim C) project(nvim C)
if(POLICY CMP0065) if(POLICY CMP0065)
@@ -12,9 +12,6 @@ endif()
if(POLICY CMP0060) if(POLICY CMP0060)
cmake_policy(SET CMP0060 NEW) cmake_policy(SET CMP0060 NEW)
endif() endif()
if(POLICY CMP0075)
cmake_policy(SET CMP0075 NEW)
endif()
# Point CMake at any custom modules we may ship # Point CMake at any custom modules we may ship
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
@@ -71,8 +68,13 @@ else()
endif() endif()
endif() endif()
list(INSERT CMAKE_PREFIX_PATH 0 ${DEPS_PREFIX}) if(CMAKE_CROSSCOMPILING AND NOT UNIX)
set(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:${DEPS_PREFIX}/lib/pkgconfig") 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 # used for check_c_compiler_flag
include(CheckCCompilerFlag) 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 # If not in a git repo (e.g., a tarball) these tokens define the complete
# version string, else they are combined with the result of `git describe`. # version string, else they are combined with the result of `git describe`.
set(NVIM_VERSION_MAJOR 0) set(NVIM_VERSION_MAJOR 0)
set(NVIM_VERSION_MINOR 7) set(NVIM_VERSION_MINOR 5)
set(NVIM_VERSION_PATCH 1) set(NVIM_VERSION_PATCH 1)
set(NVIM_VERSION_PRERELEASE "") # for package maintainers set(NVIM_VERSION_PRERELEASE "") # for package maintainers
# API level # 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_LEVEL_COMPAT 0) # Adjust this after a _breaking_ API change.
set(NVIM_API_PRERELEASE false) set(NVIM_API_PRERELEASE false)
@@ -279,9 +281,6 @@ if(MSVC)
else() else()
add_compile_options(-Wall -Wextra -pedantic -Wno-unused-parameter add_compile_options(-Wall -Wextra -pedantic -Wno-unused-parameter
-Wstrict-prototypes -std=gnu99 -Wshadow -Wconversion -Wstrict-prototypes -std=gnu99 -Wshadow -Wconversion
-Wdouble-promotion
-Wmissing-noreturn
-Wmissing-format-attribute
-Wmissing-prototypes) -Wmissing-prototypes)
check_c_compiler_flag(-Wimplicit-fallthrough HAVE_WIMPLICIT_FALLTHROUGH_FLAG) check_c_compiler_flag(-Wimplicit-fallthrough HAVE_WIMPLICIT_FALLTHROUGH_FLAG)
@@ -289,27 +288,6 @@ else()
add_compile_options(-Wimplicit-fallthrough) add_compile_options(-Wimplicit-fallthrough)
endif() 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 # On FreeBSD 64 math.h uses unguarded C11 extension, which taints clang
# 3.4.1 used there. # 3.4.1 used there.
if(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD" AND CMAKE_C_COMPILER_ID MATCHES "Clang") 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) find_package(Msgpack 1.0.0 REQUIRED)
include_directories(SYSTEM ${MSGPACK_INCLUDE_DIRS}) 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}) include_directories(SYSTEM ${LIBLUV_INCLUDE_DIRS})
find_package(TreeSitter REQUIRED) find_package(TreeSitter REQUIRED)
@@ -430,19 +408,6 @@ main(void)
if(TS_HAS_SET_MATCH_LIMIT) if(TS_HAS_SET_MATCH_LIMIT)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNVIM_TS_HAS_SET_MATCH_LIMIT") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNVIM_TS_HAS_SET_MATCH_LIMIT")
endif() 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. # Note: The test lib requires LuaJIT; it will be skipped if LuaJIT is missing.
option(PREFER_LUA "Prefer Lua over LuaJIT in the nvim executable." OFF) option(PREFER_LUA "Prefer Lua over LuaJIT in the nvim executable." OFF)
@@ -578,33 +543,6 @@ endif()
message(STATUS "Using Lua interpreter: ${LUA_PRG}") 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. # Setup busted.
find_program(BUSTED_PRG NAMES busted busted.bat) find_program(BUSTED_PRG NAMES busted busted.bat)
find_program(BUSTED_LUA_PRG busted-lua) 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 # console pool: to do so we need to use the USES_TERMINAL
# option, but this is only available in CMake 3.2 # option, but this is only available in CMake 3.2
set(TEST_TARGET_ARGS) set(TEST_TARGET_ARGS)
list(APPEND TEST_TARGET_ARGS "USES_TERMINAL") if(NOT (${CMAKE_VERSION} VERSION_LESS 3.2.0))
list(APPEND TEST_TARGET_ARGS "USES_TERMINAL")
endif()
set(UNITTEST_PREREQS nvim-test unittest-headers) set(UNITTEST_PREREQS nvim-test unittest-headers)
set(FUNCTIONALTEST_PREREQS nvim printenv-test printargs-test shell-test 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) set(BENCHMARK_PREREQS nvim tty-test)
# Useful for automated build systems, if they want to manually run the tests. # Useful for automated build systems, if they want to manually run the tests.
@@ -751,13 +691,24 @@ endif()
if(LUACHECK_PRG) if(LUACHECK_PRG)
add_custom_target(lualint add_custom_target(lualint
COMMAND ${LUACHECK_PRG} -q runtime/ scripts/ src/ test/ COMMAND ${LUACHECK_PRG} -q runtime/ src/ test/ --exclude-files test/functional/fixtures/lua/syntax_error.lua
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
else() else()
add_custom_target(lualint false add_custom_target(lualint false
COMMENT "lualint: LUACHECK_PRG not defined") COMMENT "lualint: LUACHECK_PRG not defined")
endif() 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 #add uninstall target
if(NOT TARGET uninstall) if(NOT TARGET uninstall)
@@ -769,8 +720,3 @@ if(NOT TARGET uninstall)
add_custom_target(uninstall add_custom_target(uninstall
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/UninstallHelper.cmake) COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/UninstallHelper.cmake)
endif() endif()
if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR})
add_subdirectory(packaging)
endif()

View File

@@ -7,11 +7,10 @@ Getting started
If you want to help but don't know where to start, here are some If you want to help but don't know where to start, here are some
low-risk/isolated tasks: 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 - Fix bugs found by [Clang](#clang-scan-build), [PVS](#pvs-studio) or
[Coverity](#coverity). [Coverity](#coverity).
- [Improve documentation][wiki-contribute-help]
- [Merge a Vim patch] (familiarity with Vim is *strongly* recommended)
Reporting problems Reporting problems
------------------ ------------------
@@ -19,12 +18,11 @@ Reporting problems
- [Check the FAQ][wiki-faq]. - [Check the FAQ][wiki-faq].
- [Search existing issues][github-issues] (including closed!) - [Search existing issues][github-issues] (including closed!)
- Update Neovim to the latest version to see if your problem persists. - Update Neovim to the latest version to see if your problem persists.
- Try to reproduce with `nvim --clean` ("factory defaults"). - Disable plugins incrementally, to narrow down the cause of the issue.
- [Bisect](https://neovim.io/doc/user/starting.html#bisect) your config: disable plugins incrementally, to narrow down the cause of the issue.
- [Bisect][git-bisect] Neovim's source code to find the cause of a regression, if you can. This is _extremely_ helpful.
- When reporting a crash, [include a stacktrace](https://github.com/neovim/neovim/wiki/FAQ#backtrace-linux). - When reporting a crash, [include a stacktrace](https://github.com/neovim/neovim/wiki/FAQ#backtrace-linux).
- Use [ASAN/UBSAN](#clang-sanitizers-asan-and-ubsan) to get detailed errors for segfaults and undefined behavior. - 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. - Include `cmake --system-information` for build-related issues.
Developer guidelines Developer guidelines
@@ -39,12 +37,13 @@ Developer guidelines
make distclean make distclean
make # Nvim build system uses ninja automatically, if available. make # Nvim build system uses ninja automatically, if available.
``` ```
- [Improve documentation][wiki-contribute-help]
Pull requests (PRs) Pull requests (PRs)
--------------------- ---------------------
- To avoid duplicate work, create a draft pull request. - To avoid duplicate work, create a `[WIP]` pull request as soon as possible.
- Your PR must include [test coverage][run-tests]. - Your PR must include **test coverage.** See [test/README.md][run-tests].
- Avoid cosmetic changes to unrelated files in the same commit. - Avoid cosmetic changes to unrelated files in the same commit.
- Use a [feature branch][git-feature-branch] instead of the master branch. - Use a [feature branch][git-feature-branch] instead of the master branch.
- Use a **rebase workflow** for small PRs. - Use a **rebase workflow** for small PRs.
@@ -63,25 +62,21 @@ Pull requests (PRs)
- During a squash/fixup, use `exec make -C build unittest` between each - During a squash/fixup, use `exec make -C build unittest` between each
pick/edit/reword. pick/edit/reword.
### Stages: Draft and Ready for review ### Stages: WIP, RFC, RDY
Pull requests have two stages: Draft and Ready for review. Pull requests have three stages: `[WIP]` (Work In Progress), `[RFC]` (Request
For Comment) and `[RDY]` (Ready).
1. [Create a Draft PR][pr-draft] while you are _not_ requesting feedback as 1. `[RFC]` is assumed by default, **do not** put "RFC" in the PR title (it adds
you are still working on the PR. noise to merge commit messages).
- You can skip this if your PR is ready for review. 2. Add `[WIP]` to the PR title if you are _not_ requesting feedback and the work
2. [Change your PR to ready][pr-ready] when the PR is ready for review. is still in flux.
- You can convert back to Draft at any time. 3. Add `[RDY]` to the PR title if you are _done_ and only waiting on merge.
Do __not__ add labels like `[RFC]` or `[WIP]` in the title to indicate the
state of your PR: this just adds noise. Non-Draft PRs are assumed to be open
for comments; if you want feedback from specific people, `@`-mention them in
a comment.
### Commit messages ### Commit messages
Follow the [conventional commits guidelines][conventional_commits] to *make reviews easier* and to make Follow 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: the VCS/git logs more valuable. The general structure of a commit message is as follows:
``` ```
<type>([optional scope]): <description> <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)] [optional footer(s)]
``` ```
- Prefix the commit subject with one of these [_types_](https://github.com/commitizen/conventional-commit-types/blob/master/index.json): - **Prefix the commit subject with a _type_:** `doc:`, `test:`
- `build`, `ci`, `docs`, `feat`, `fix`, `perf`, `refactor`, `revert`, `test`, `vim-patch`, `chore` `runtime:`, ...
- You can **ignore this for "fixup" commits** or any commits you expect to be squashed. - Subject line for commits with only style/lint changes can be a single
- Append optional scope to _type_ such as `(lsp)`, `(treesitter)`, `(float)`, … word: `style` or `lint`.
- _Description_ shouldn't start with a capital letter or end in a period. - **Add the optional scope following <type> if possible:** `(lsp)`, `(treesitter)`, `(multigrid)`, ...
- Use the _imperative voice_: "Fix bug" rather than "Fixed bug" or "Fixes bug."
- Try to keep the first line under 72 characters. - Try to keep the first line under 72 characters.
- A blank line must follow the subject. - A blank line must separate the subject from the description.
- Breaking API changes must be indicated by - 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.
1. "!" after the type/scope, and - Check your commit message for spelling and grammatical mistakes.
2. a "BREAKING CHANGE" footer describing the change. - Use the _imperative voice_: "Fix bug" rather than "Fixed bug" or "Fixes bug."
Example:
```
refactor(provider)!: drop support for Python 2
BREAKING CHANGE: refactor to use Python 3 features since Python 2 is no longer supported.
```
### Automated builds (CI) ### Automated builds (CI)
Each pull request must pass the automated builds on [sourcehut] and [GitHub Actions]. Each pull request must pass the automated builds on [Travis CI], [sourcehut]
and [AppVeyor].
- CI builds are compiled with [`-Werror`][gcc-warnings], so compiler warnings - CI builds are compiled with [`-Werror`][gcc-warnings], so compiler warnings
will fail the build. will fail the build.
@@ -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)): - Use this format for commit messages (where `{id}` is the PVS warning-id)):
``` ```
fix(PVS/V{id}): {description} PVS/V{id}: {description}
``` ```
- Search the Neovim commit history to find examples: - Search the Neovim commit history to find examples:
``` ```
@@ -178,7 +167,7 @@ master build. To view the defects, just request access; you will be approved.
- Use this format for commit messages (where `{id}` is the CID (Coverity ID); - Use this format for commit messages (where `{id}` is the CID (Coverity ID);
([example](https://github.com/neovim/neovim/pull/804))): ([example](https://github.com/neovim/neovim/pull/804))):
``` ```
fix(coverity/{id}): {description} coverity/{id}: {description}
``` ```
- Search the Neovim commit history to find examples: - Search the Neovim commit history to find examples:
``` ```
@@ -188,16 +177,15 @@ master build. To view the defects, just request access; you will be approved.
### Clang sanitizers (ASAN and UBSAN) ### 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. 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 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... 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 Coding
@@ -218,36 +206,20 @@ You can lint a single file (but this will _not_ exclude legacy errors):
### Style ### Style
- Style rules are (mostly) defined by `src/uncrustify.cfg` which tries to match The repo includes a `.clang-format` config file which (mostly) matches the
the [style-guide]. To use the Nvim `gq` command with `uncrustify`: [style-guide]. You can use `clang-format` to format code with the `gq`
``` operator in Nvim:
if !empty(findfile('src/uncrustify.cfg', ';'))
setlocal formatprg=uncrustify\ -q\ -l\ C\ -c\ src/uncrustify.cfg\ --no-backup if !empty(findfile('.clang-format', ';'))
endif setlocal formatprg=clang-format\ -style=file
``` endif
The required version of `uncrustify` is specified in `uncrustify.cfg`.
- There is also `.clang-format` which has drifted from the [style-guide], but
is available for reference. To use the Nvim `gq` command with `clang-format`:
```
if !empty(findfile('.clang-format', ';'))
setlocal formatprg=clang-format\ -style=file
endif
```
### Navigate ### Navigate
- Set `blame.ignoreRevsFile` to ignore [noise commits](https://github.com/neovim/neovim/commit/2d240024acbd68c2d3f82bc72cb12b1a4928c6bf) in git blame:
```
git config blame.ignoreRevsFile .git-blame-ignore-revs
```
- Use **[universal-ctags](https://github.com/universal-ctags/ctags).** - Use **[universal-ctags](https://github.com/universal-ctags/ctags).**
("Exuberant ctags", the typical `ctags` binary provided by your distro, is ("Exuberant ctags", the typical `ctags` binary provided by your distro, is
unmaintained and won't recognize many function signatures in Neovim source.) unmaintained and won't recognize many function signatures in Neovim source.)
- Explore the source code [on the web](https://sourcegraph.com/github.com/neovim/neovim). - 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 Reviewing
@@ -256,10 +228,10 @@ Reviewing
To help review pull requests, start with [this checklist][review-checklist]. 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. 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]: 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 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` 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 [git-rebasing]: http://git-scm.com/book/en/v2/Git-Branching-Rebasing
[github-issues]: https://github.com/neovim/neovim/issues [github-issues]: https://github.com/neovim/neovim/issues
[1820]: https://github.com/neovim/neovim/pull/1820 [1820]: https://github.com/neovim/neovim/pull/1820
[gh]: https://cli.github.com/ [hub]: https://hub.github.com/
[conventional_commits]: https://www.conventionalcommits.org [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 [ASan]: http://clang.llvm.org/docs/AddressSanitizer.html
[run-tests]: https://github.com/neovim/neovim/blob/master/test/README.md#running-tests [run-tests]: https://github.com/neovim/neovim/blob/master/test/README.md#running-tests
[wiki-faq]: https://github.com/neovim/neovim/wiki/FAQ [wiki-faq]: https://github.com/neovim/neovim/wiki/FAQ
[review-checklist]: https://github.com/neovim/neovim/wiki/Code-review-checklist [review-checklist]: https://github.com/neovim/neovim/wiki/Code-review-checklist
[3174]: https://github.com/neovim/neovim/issues/3174 [3174]: https://github.com/neovim/neovim/issues/3174
[Travis CI]: https://travis-ci.org/neovim/neovim
[sourcehut]: https://builds.sr.ht/~jmk [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 [Merge a Vim patch]: https://github.com/neovim/neovim/wiki/Merging-patches-from-upstream-Vim
[Clang report]: https://neovim.io/doc/reports/clang/ [Clang report]: https://neovim.io/doc/reports/clang/
[complexity:low]: https://github.com/neovim/neovim/issues?q=is%3Aopen+is%3Aissue+label%3Acomplexity%3Alow [complexity:low]: https://github.com/neovim/neovim/issues?q=is%3Aopen+is%3Aissue+label%3Acomplexity%3Alow
[master error list]: https://raw.githubusercontent.com/neovim/doc/gh-pages/reports/clint/errors.json [master error list]: https://raw.githubusercontent.com/neovim/doc/gh-pages/reports/clint/errors.json
[wiki-contribute-help]: https://github.com/neovim/neovim/wiki/contribute-%3Ahelp [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/

View File

@@ -189,17 +189,8 @@ contributed under the Vim license and (2) externally maintained libraries.
The externally maintained libraries used by Neovim are: The externally maintained libraries used by Neovim are:
- Klib: a Generic Library in C. MIT/X11 license. - Klib: a Generic Library in C. MIT/X11 license.
- Lua: MIT license
- LuaJIT: a Just-In-Time Compiler for Lua. Copyright Mike Pall. MIT license.
- Luv: Apache 2.0 license
- libmpack: MIT license
- libtermkey: MIT license
- libuv. Copyright Joyent, Inc. and other Node contributors. Node.js license. - libuv. Copyright Joyent, Inc. and other Node contributors. Node.js license.
- libvterm: MIT license - LuaJIT: a Just-In-Time Compiler for Lua. Copyright Mike Pall. MIT license.
- lua-compat: MIT license
- tree-sitter: MIT license
- xdiff: LGPL license
- lua-cjson: MIT license
==== ====

View File

@@ -10,13 +10,14 @@ General guidelines
* Write down what was decided * Write down what was decided
* Constraints are good * Constraints are good
* Use automation to solve problems * Use automation to solve problems
* Never break the API... but sometimes break the UI * Never break the API
Ticket triage Ticket triage
------------- -------------
In practice we haven't found a way to forecast more precisely than "next" and In practice we haven't found a meaningful way to forecast more precisely than
"after next". So there are usually one or two (at most) planned milestones: "next" and "after next". That means there are usually one or two (at most)
planned milestones:
- Next bugfix-release (1.0.x) - Next bugfix-release (1.0.x)
- Next feature-release (1.x.0) - Next feature-release (1.x.0)
@@ -24,16 +25,16 @@ In practice we haven't found a way to forecast more precisely than "next" and
The forecasting problem might be solved with an explicit priority system (like The forecasting problem might be solved with an explicit priority system (like
Bram's todo.txt). Meanwhile the Neovim priority system is defined by: Bram's todo.txt). Meanwhile the Neovim priority system is defined by:
- PRs nearing completion. - PRs nearing completion (RDY).
- Issue labels. E.g. the `+plan` label increases the ticket's priority merely - Issue labels. E.g. the `+plan` label increases the ticket's priority merely
for having a plan written down: it is _closer to completion_ than tickets for having a plan written down: it is _closer to completion_ than tickets
without a plan. without a plan.
- Comment activity or new information. - Comment activity or new information.
Anything that isn't in the next milestone, and doesn't have a finished PR—is Anything that isn't in the next milestone, and doesn't have a RDY PR ... is
just not something you care very much about, by construction. Post-release you just not something you care very much about, by construction. Post-release you
can review open issues, but chances are your next milestone is already getting can review open issues, but chances are your next milestone is already getting
full... :) full :)
Release policy Release policy
-------------- --------------
@@ -52,45 +53,9 @@ has a major bug:
3. Cut a release from `release-x.y`. 3. Cut a release from `release-x.y`.
- Run `./scripts/release.sh` - Run `./scripts/release.sh`
- Update (force-push) the remote `stable` tag. - 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. 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 See also
-------- --------

View File

@@ -1,6 +1,4 @@
MAKEFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) THIS_DIR = $(shell pwd)
MAKEFILE_DIR := $(dir $(MAKEFILE_PATH))
filter-false = $(strip $(filter-out 0 off OFF false FALSE,$1)) filter-false = $(strip $(filter-out 0 off OFF false FALSE,$1))
filter-true = $(strip $(filter-out 1 on ON true TRUE,$1)) filter-true = $(strip $(filter-out 1 on ON true TRUE,$1))
@@ -14,7 +12,6 @@ CMAKE_BUILD_TYPE ?= Debug
CMAKE_FLAGS := -DCMAKE_BUILD_TYPE=$(CMAKE_BUILD_TYPE) CMAKE_FLAGS := -DCMAKE_BUILD_TYPE=$(CMAKE_BUILD_TYPE)
# Extra CMake flags which extend the default set # Extra CMake flags which extend the default set
CMAKE_EXTRA_FLAGS ?= CMAKE_EXTRA_FLAGS ?=
NVIM_PRG := $(MAKEFILE_DIR)/build/bin/nvim
# CMAKE_INSTALL_PREFIX # CMAKE_INSTALL_PREFIX
# - May be passed directly or as part of CMAKE_EXTRA_FLAGS. # - May be passed directly or as part of CMAKE_EXTRA_FLAGS.
@@ -38,7 +35,7 @@ else
checkprefix: ; checkprefix: ;
endif endif
CMAKE_GENERATOR ?= $(shell (command -v ninja > /dev/null 2>&1 && echo "Ninja") || \ BUILD_TYPE ?= $(shell (type ninja > /dev/null 2>&1 && echo "Ninja") || \
echo "Unix Makefiles") echo "Unix Makefiles")
DEPS_BUILD_DIR ?= .deps DEPS_BUILD_DIR ?= .deps
ifneq (1,$(words [$(DEPS_BUILD_DIR)])) ifneq (1,$(words [$(DEPS_BUILD_DIR)]))
@@ -46,28 +43,29 @@ ifneq (1,$(words [$(DEPS_BUILD_DIR)]))
endif endif
ifeq (,$(BUILD_TOOL)) ifeq (,$(BUILD_TOOL))
ifeq (Ninja,$(CMAKE_GENERATOR)) ifeq (Ninja,$(BUILD_TYPE))
ifneq ($(shell $(CMAKE_PRG) --help 2>/dev/null | grep Ninja),) ifneq ($(shell $(CMAKE_PRG) --help 2>/dev/null | grep Ninja),)
BUILD_TOOL = ninja BUILD_TOOL := ninja
else else
# User's version of CMake doesn't support Ninja # User's version of CMake doesn't support Ninja
BUILD_TOOL = $(MAKE) BUILD_TOOL = $(MAKE)
CMAKE_GENERATOR := Unix Makefiles BUILD_TYPE := Unix Makefiles
endif endif
else else
BUILD_TOOL = $(MAKE) BUILD_TOOL = $(MAKE)
endif endif
endif endif
BUILD_CMD = $(BUILD_TOOL)
# Only need to handle Ninja here. Make will inherit the VERBOSE variable, and the -j, -l, and -n flags. # Only need to handle Ninja here. Make will inherit the VERBOSE variable, and the -j and -n flags.
ifeq ($(CMAKE_GENERATOR),Ninja) ifeq ($(BUILD_TYPE),Ninja)
ifneq ($(VERBOSE),) ifneq ($(VERBOSE),)
BUILD_TOOL += -v BUILD_CMD += -v
endif 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)))) ifeq (n,$(findstring n,$(firstword -$(MAKEFLAGS))))
BUILD_TOOL += -n BUILD_CMD += -n
endif endif
endif endif
@@ -89,22 +87,22 @@ endif
SINGLE_MAKE = export MAKEFLAGS= ; $(MAKE) SINGLE_MAKE = export MAKEFLAGS= ; $(MAKE)
nvim: build/.ran-cmake deps nvim: build/.ran-cmake deps
+$(BUILD_TOOL) -C build +$(BUILD_CMD) -C build
libnvim: build/.ran-cmake deps libnvim: build/.ran-cmake deps
+$(BUILD_TOOL) -C build libnvim +$(BUILD_CMD) -C build libnvim
cmake: cmake:
touch CMakeLists.txt touch CMakeLists.txt
$(MAKE) build/.ran-cmake $(MAKE) build/.ran-cmake
build/.ran-cmake: | deps build/.ran-cmake: | deps
cd build && $(CMAKE_PRG) -G '$(CMAKE_GENERATOR)' $(CMAKE_FLAGS) $(CMAKE_EXTRA_FLAGS) $(MAKEFILE_DIR) cd build && $(CMAKE_PRG) -G '$(BUILD_TYPE)' $(CMAKE_FLAGS) $(CMAKE_EXTRA_FLAGS) $(THIS_DIR)
touch $@ touch $@
deps: | build/.ran-third-party-cmake deps: | build/.ran-third-party-cmake
ifeq ($(call filter-true,$(USE_BUNDLED)),) ifeq ($(call filter-true,$(USE_BUNDLED)),)
+$(BUILD_TOOL) -C $(DEPS_BUILD_DIR) +$(BUILD_CMD) -C $(DEPS_BUILD_DIR)
endif endif
ifeq ($(call filter-true,$(USE_BUNDLED)),) ifeq ($(call filter-true,$(USE_BUNDLED)),)
@@ -112,8 +110,8 @@ $(DEPS_BUILD_DIR):
mkdir -p "$@" mkdir -p "$@"
build/.ran-third-party-cmake:: $(DEPS_BUILD_DIR) build/.ran-third-party-cmake:: $(DEPS_BUILD_DIR)
cd $(DEPS_BUILD_DIR) && \ cd $(DEPS_BUILD_DIR) && \
$(CMAKE_PRG) -G '$(CMAKE_GENERATOR)' $(BUNDLED_CMAKE_FLAG) $(BUNDLED_LUA_CMAKE_FLAG) \ $(CMAKE_PRG) -G '$(BUILD_TYPE)' $(BUNDLED_CMAKE_FLAG) $(BUNDLED_LUA_CMAKE_FLAG) \
$(DEPS_CMAKE_FLAGS) $(MAKEFILE_DIR)/third-party $(DEPS_CMAKE_FLAGS) $(THIS_DIR)/third-party
endif endif
build/.ran-third-party-cmake:: build/.ran-third-party-cmake::
mkdir -p build mkdir -p build
@@ -123,31 +121,31 @@ build/.ran-third-party-cmake::
oldtest: | nvim build/runtime/doc/tags oldtest: | nvim build/runtime/doc/tags
+$(SINGLE_MAKE) -C src/nvim/testdir clean +$(SINGLE_MAKE) -C src/nvim/testdir clean
ifeq ($(strip $(TEST_FILE)),) ifeq ($(strip $(TEST_FILE)),)
+$(SINGLE_MAKE) -C src/nvim/testdir NVIM_PRG=$(NVIM_PRG) $(MAKEOVERRIDES) +$(SINGLE_MAKE) -C src/nvim/testdir NVIM_PRG="$(realpath build/bin/nvim)" $(MAKEOVERRIDES)
else else
@# Handle TEST_FILE=test_foo{,.res,.vim}. @# 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 endif
# Build oldtest by specifying the relative .vim filename. # Build oldtest by specifying the relative .vim filename.
.PHONY: phony_force .PHONY: phony_force
src/nvim/testdir/%.vim: 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/runtime/doc/tags helptags: | nvim
+$(BUILD_TOOL) -C build runtime/doc/tags +$(BUILD_CMD) -C build runtime/doc/tags
# Builds help HTML _and_ checks for invalid help tags. # Builds help HTML _and_ checks for invalid help tags.
helphtml: | nvim build/runtime/doc/tags helphtml: | nvim build/runtime/doc/tags
+$(BUILD_TOOL) -C build doc_html +$(BUILD_CMD) -C build doc_html
functionaltest: | nvim functionaltest: | nvim
+$(BUILD_TOOL) -C build functionaltest +$(BUILD_CMD) -C build functionaltest
functionaltest-lua: | nvim functionaltest-lua: | nvim
+$(BUILD_TOOL) -C build functionaltest-lua +$(BUILD_CMD) -C build functionaltest-lua
lualint: | build/.ran-cmake deps lualint: | build/.ran-cmake deps
$(BUILD_TOOL) -C build lualint $(BUILD_CMD) -C build lualint
shlint: shlint:
@shellcheck --version | head -n 2 @shellcheck --version | head -n 2
@@ -165,23 +163,16 @@ _opt_pylint:
@command -v flake8 && { $(MAKE) pylint; exit $$?; } \ @command -v flake8 && { $(MAKE) pylint; exit $$?; } \
|| echo "SKIP: pylint (flake8 not found)" || echo "SKIP: pylint (flake8 not found)"
commitlint:
$(NVIM_PRG) -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 unittest: | nvim
+$(BUILD_TOOL) -C build unittest +$(BUILD_CMD) -C build unittest
benchmark: | nvim benchmark: | nvim
+$(BUILD_TOOL) -C build benchmark +$(BUILD_CMD) -C build benchmark
test: functionaltest unittest test: functionaltest unittest
clean: clean:
+test -d build && $(BUILD_TOOL) -C build clean || true +test -d build && $(BUILD_CMD) -C build clean || true
$(MAKE) -C src/nvim/testdir clean $(MAKE) -C src/nvim/testdir clean
$(MAKE) -C runtime/doc clean $(MAKE) -C runtime/doc clean
$(MAKE) -C runtime/indent clean $(MAKE) -C runtime/indent clean
@@ -191,19 +182,19 @@ distclean:
$(MAKE) clean $(MAKE) clean
install: checkprefix nvim install: checkprefix nvim
+$(BUILD_TOOL) -C build install +$(BUILD_CMD) -C build install
clint: build/.ran-cmake clint: build/.ran-cmake
+$(BUILD_TOOL) -C build clint +$(BUILD_CMD) -C build clint
clint-full: build/.ran-cmake clint-full: build/.ran-cmake
+$(BUILD_TOOL) -C build clint-full +$(BUILD_CMD) -C build clint-full
check-single-includes: build/.ran-cmake check-single-includes: build/.ran-cmake
+$(BUILD_TOOL) -C build check-single-includes +$(BUILD_CMD) -C build check-single-includes
generated-sources: build/.ran-cmake generated-sources: build/.ran-cmake
+$(BUILD_TOOL) -C build generated-sources +$(BUILD_CMD) -C build generated-sources
appimage: appimage:
bash scripts/genappimage.sh bash scripts/genappimage.sh
@@ -214,16 +205,16 @@ appimage:
appimage-%: appimage-%:
bash scripts/genappimage.sh $* bash scripts/genappimage.sh $*
lint: check-single-includes clint lualint _opt_pylint _opt_shlint _opt_commitlint lint: check-single-includes clint lualint _opt_pylint _opt_shlint
# Generic pattern rules, allowing for `make build/bin/nvim` etc. # Generic pattern rules, allowing for `make build/bin/nvim` etc.
# Does not work with "Unix Makefiles". # Does not work with "Unix Makefiles".
ifeq ($(CMAKE_GENERATOR),Ninja) ifeq ($(BUILD_TYPE),Ninja)
build/%: phony_force build/%: phony_force
$(BUILD_TOOL) -C build $(patsubst build/%,%,$@) $(BUILD_CMD) -C build $(patsubst build/%,%,$@)
$(DEPS_BUILD_DIR)/%: phony_force $(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 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

View File

@@ -1,12 +1,10 @@
<h1 align="center"> [![Neovim](https://raw.githubusercontent.com/neovim/neovim.github.io/master/logos/neovim-logo-300x87.png)](https://neovim.io)
<img src="https://raw.githubusercontent.com/neovim/neovim.github.io/master/logos/neovim-logo-300x87.png" alt="Neovim">
</h1>
[Documentation](https://neovim.io/doc/general/) | [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) [Twitter](https://twitter.com/Neovim)
[![GitHub CI](https://github.com/neovim/neovim/workflows/CI/badge.svg)](https://github.com/neovim/neovim/actions?query=workflow%3ACI+branch%3Amaster+event%3Apush) [![GitHub CI](https://github.com/neovim/neovim/workflows/CI/badge.svg)](https://github.com/neovim/neovim/actions?query=workflow%3A%22CI%22)
[![Codecov coverage](https://img.shields.io/codecov/c/github/neovim/neovim.svg)](https://codecov.io/gh/neovim/neovim) [![Codecov coverage](https://img.shields.io/codecov/c/github/neovim/neovim.svg)](https://codecov.io/gh/neovim/neovim)
[![Coverity Scan analysis](https://scan.coverity.com/projects/2227/badge.svg)](https://scan.coverity.com/projects/2227) [![Coverity Scan analysis](https://scan.coverity.com/projects/2227/badge.svg)](https://scan.coverity.com/projects/2227)
[![Clang analysis](https://neovim.io/doc/reports/clang/badge.svg)](https://neovim.io/doc/reports/clang) [![Clang analysis](https://neovim.io/doc/reports/clang/badge.svg)](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 Pre-built packages for Windows, macOS, and Linux are found on the
[Releases](https://github.com/neovim/neovim/releases/) page. [Releases](https://github.com/neovim/neovim/releases/) page.
[Managed packages] are in [Homebrew], [Debian], [Ubuntu], [Fedora], [Arch Linux], [Void Linux], [Gentoo], and more! [Managed packages] are in [Homebrew], [Debian], [Ubuntu], [Fedora], [Arch Linux],
[Gentoo], and more!
Install from source Install from source
------------------- -------------------
@@ -66,7 +65,7 @@ To install to a non-default location:
make CMAKE_INSTALL_PREFIX=/full/path/ make CMAKE_INSTALL_PREFIX=/full/path/
make install make install
CMake hints for inspecting the build: To inspect the build, these CMake features are useful:
- `cmake --build build --target help` lists all build targets. - `cmake --build build --target help` lists all build targets.
- `build/CMakeCache.txt` (or `cmake -LAH build/`) contains the resolved values of all CMake variables. - `build/CMakeCache.txt` (or `cmake -LAH build/`) contains the resolved values of all CMake variables.
@@ -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 [Managed packages]: https://github.com/neovim/neovim/wiki/Installing-Neovim#install-from-package
[Debian]: https://packages.debian.org/testing/neovim [Debian]: https://packages.debian.org/testing/neovim
[Ubuntu]: http://packages.ubuntu.com/search?keywords=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 [Arch Linux]: https://www.archlinux.org/packages/?q=neovim
[Void Linux]: https://voidlinux.org/packages/?arch=x86_64&q=neovim
[Gentoo]: https://packages.gentoo.org/packages/app-editors/neovim [Gentoo]: https://packages.gentoo.org/packages/app-editors/neovim
[Homebrew]: https://formulae.brew.sh/formula/neovim [Homebrew]: https://formulae.brew.sh/formula/neovim

View File

@@ -7,8 +7,6 @@ CI_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${CI_DIR}/common/build.sh" source "${CI_DIR}/common/build.sh"
source "${CI_DIR}/common/suite.sh" source "${CI_DIR}/common/suite.sh"
mkdir -p "${HOME}/.cache"
echo "before_cache.sh: cache size" echo "before_cache.sh: cache size"
du -chd 1 "${HOME}/.cache" | sort -rh | head -20 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 find "${HOME}/.ccache" -name stats -delete
# Update the third-party dependency cache only if the build was successful. # 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. # Do not cache downloads. They should not be needed with up-to-date deps.
rm -rf "${DEPS_BUILD_DIR}/build/downloads" rm -rf "${DEPS_BUILD_DIR}/build/downloads"
rm -rf "${CACHE_NVIM_DEPS_DIR}" rm -rf "${CACHE_NVIM_DEPS_DIR}"

59
ci/before_install.sh Executable file
View 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

View File

@@ -6,6 +6,12 @@ set -o pipefail
CI_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" CI_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${CI_DIR}/common/build.sh" source "${CI_DIR}/common/build.sh"
# Enable ipv6 on Travis. ref: a39c8b7ce30d
if test -n "${TRAVIS_OS_NAME}" && ! test "${TRAVIS_OS_NAME}" = osx ; then
echo "before_script.sh: enable ipv6"
sudo sysctl -w net.ipv6.conf.lo.disable_ipv6=0
fi
# Test some of the configuration variables. # Test some of the configuration variables.
if [[ -n "${GCOV}" ]] && [[ ! $(type -P "${GCOV}") ]]; then if [[ -n "${GCOV}" ]] && [[ ! $(type -P "${GCOV}") ]]; then
echo "\$GCOV: '${GCOV}' is not executable." echo "\$GCOV: '${GCOV}' is not executable."
@@ -21,6 +27,13 @@ ccache -s
# Reset ccache stats for real results in before_cache. # Reset ccache stats for real results in before_cache.
ccache --zero-stats 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. # Compile dependencies.
build_deps build_deps

View File

@@ -72,31 +72,33 @@ if ($compiler -eq 'MINGW') {
& C:\msys64\usr\bin\mkdir -p /var/cache/pacman/pkg & C:\msys64\usr\bin\mkdir -p /var/cache/pacman/pkg
# Build third-party dependencies # Build third-party dependencies
C:\msys64\usr\bin\bash -lc "pacman --verbose --noconfirm -Syu" ; exitIfFailed C:\msys64\usr\bin\bash -lc "pacman --verbose --noconfirm -Su" ; exitIfFailed
# 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 --needed -S $mingwPackages" ; exitIfFailed C:\msys64\usr\bin\bash -lc "pacman --verbose --noconfirm --needed -S $mingwPackages" ; exitIfFailed
} }
elseif ($compiler -eq 'MSVC') { elseif ($compiler -eq 'MSVC') {
$cmakeGeneratorArgs = '/verbosity:normal' $cmakeGeneratorArgs = '/verbosity:normal'
$cmakeGenerator = 'Visual Studio 16 2019' if ($bits -eq 32) {
} $cmakeGenerator = 'Visual Studio 15 2017'
}
if ($compiler -eq 'MSVC') { elseif ($bits -eq 64) {
$installationPath = vswhere.exe -latest -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath $cmakeGenerator = 'Visual Studio 15 2017 Win64'
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 (-not $NoTests) { 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 python -m pip install pynvim ; exitIfFailed
python3 -m pip install pynvim ; exitIfFailed
# Sanity check # Sanity check
python -c "import pynvim; print(str(pynvim))" ; exitIfFailed python -c "import pynvim; print(str(pynvim))" ; exitIfFailed
python3 -c "import pynvim; print(str(pynvim))" ; exitIfFailed
gem.cmd install --pre neovim gem.cmd install --pre neovim
Get-Command -CommandType Application neovim-ruby-host.bat Get-Command -CommandType Application neovim-ruby-host.bat
@@ -106,35 +108,24 @@ if (-not $NoTests) {
npm.cmd link neovim npm.cmd link neovim
} }
if ($compiler -eq 'MSVC') {
# Required for LuaRocks (https://github.com/luarocks/luarocks/issues/1039#issuecomment-507296940).
$env:VCINSTALLDIR = "C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.16.27023/"
}
function convertToCmakeArgs($vars) { function convertToCmakeArgs($vars) {
return $vars.GetEnumerator() | foreach { "-D$($_.Key)=$($_.Value)" } return $vars.GetEnumerator() | foreach { "-D$($_.Key)=$($_.Value)" }
} }
cd $env:DEPS_BUILD_DIR cd $env:DEPS_BUILD_DIR
if ($compiler -eq 'MSVC') { cmake -G $cmakeGenerator $(convertToCmakeArgs($depsCmakeVars)) "$buildDir/third-party/" ; exitIfFailed
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 --build . --config $cmakeBuildType -- $cmakeGeneratorArgs ; exitIfFailed cmake --build . --config $cmakeBuildType -- $cmakeGeneratorArgs ; exitIfFailed
cd $buildDir cd $buildDir
# Build Neovim # Build Neovim
mkdir build mkdir build
cd build cd build
if ($compiler -eq 'MSVC') { cmake -G $cmakeGenerator $(convertToCmakeArgs($nvimCmakeVars)) .. ; exitIfFailed
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 --build . --config $cmakeBuildType -- $cmakeGeneratorArgs ; exitIfFailed cmake --build . --config $cmakeBuildType -- $cmakeGeneratorArgs ; exitIfFailed
.\bin\nvim --version ; 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 # Build artifacts
cpack -C $cmakeBuildType cpack -G ZIP -C RelWithDebInfo
if ($env:APPVEYOR_REPO_TAG_NAME -ne $null) {
cpack -G NSIS -C RelWithDebInfo
}

View File

@@ -8,6 +8,8 @@ _stat() {
top_make() { top_make() {
printf '%78s\n' | tr ' ' '=' 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 "$@" ninja "$@"
} }
@@ -44,9 +46,7 @@ build_deps() {
cd "${CI_BUILD_DIR}" cd "${CI_BUILD_DIR}"
} }
build_nvim() { prepare_build() {
check_core_dumps --delete quiet
if test -n "${CLANG_SANITIZER}" ; then if test -n "${CLANG_SANITIZER}" ; then
CMAKE_FLAGS="${CMAKE_FLAGS} -DCLANG_${CLANG_SANITIZER}=ON" CMAKE_FLAGS="${CMAKE_FLAGS} -DCLANG_${CLANG_SANITIZER}=ON"
fi fi
@@ -55,8 +55,9 @@ build_nvim() {
cd "${BUILD_DIR}" cd "${BUILD_DIR}"
echo "Configuring with '${CMAKE_FLAGS} $@'." echo "Configuring with '${CMAKE_FLAGS} $@'."
cmake -G Ninja ${CMAKE_FLAGS} "$@" "${CI_BUILD_DIR}" cmake -G Ninja ${CMAKE_FLAGS} "$@" "${CI_BUILD_DIR}"
}
build_nvim() {
echo "Building nvim." echo "Building nvim."
if ! top_make nvim ; then if ! top_make nvim ; then
exit 1 exit 1

View File

@@ -4,7 +4,7 @@
# Args: # Args:
# $1: Flag(s) for codecov, separated by comma. # $1: Flag(s) for codecov, separated by comma.
set -e set -ex
# Change to grandparent dir (POSIXly). # Change to grandparent dir (POSIXly).
CDPATH='' cd -P -- "$(dirname -- "$0")/../.." || exit 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 curl --retry 5 --silent --fail -o "$codecov_sh" https://codecov.io/bash
chmod +x "$codecov_sh" chmod +x "$codecov_sh"
python -m pip install --quiet --user gcovr python3 -m pip install --quiet --user gcovr
fi fi
( (
cd build 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. # Upload to codecov.

View File

@@ -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 # 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 # finished. If FAIL_SUMMARY_FILE exists we know that some tests failed, this
# file will contain information about failed tests. Build is considered # file will contain information about failed tests. Build is considered
@@ -5,27 +11,190 @@
END_MARKER="$BUILD_DIR/.tests_finished" END_MARKER="$BUILD_DIR/.tests_finished"
FAIL_SUMMARY_FILE="$BUILD_DIR/.test_errors" 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() { fail() {
local test_name="$1" local test_name="$1"
local message="$2" local fail_char="$2"
local message="$3"
: ${fail_char:=F}
: ${message:=Test $test_name failed} : ${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 "${full_msg}" >> "${FAIL_SUMMARY_FILE}"
echo "Failed: $full_msg" echo "Failed: $full_msg"
FAILED=1 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() { ended_successfully() {
if test -f "${FAIL_SUMMARY_FILE}" ; then if test -f "${FAIL_SUMMARY_FILE}" ; then
echo 'Test failed, complete summary:' echo 'Test failed, complete summary:'
cat "${FAIL_SUMMARY_FILE}" cat "${FAIL_SUMMARY_FILE}"
if [[ "$GITHUB_ACTIONS" == "true" ]]; then
rm -f "$FAIL_SUMMARY_FILE"
fi
return 1 return 1
fi fi
if ! test -f "${END_MARKER}" ; then if ! test -f "${END_MARKER}" ; then

View File

@@ -51,7 +51,7 @@ check_core_dumps() {
fi fi
done done
if test "$app" != quiet ; then if test "$app" != quiet ; then
fail 'cores' 'Core dumps found' fail 'cores' E 'Core dumps found'
fi fi
} }
@@ -72,7 +72,7 @@ check_logs() {
rm "${log}" rm "${log}"
done done
if test -n "${err}" ; then if test -n "${err}" ; then
fail 'logs' 'Runtime errors detected.' fail 'logs' E 'Runtime errors detected.'
fi fi
} }
@@ -86,39 +86,46 @@ check_sanitizer() {
fi fi
} }
unittests() {( run_unittests() {(
enter_suite unittests
ulimit -c unlimited || true ulimit -c unlimited || true
if ! build_make unittest ; then if ! build_make unittest ; then
fail 'unittests' 'Unit tests failed' fail 'unittests' F 'Unit tests failed'
fi fi
submit_coverage unittest submit_coverage unittest
check_core_dumps "$(command -v luajit)" check_core_dumps "$(command -v luajit)"
exit_suite
)} )}
functionaltests() {( run_functionaltests() {(
enter_suite functionaltests
ulimit -c unlimited || true ulimit -c unlimited || true
if ! build_make ${FUNCTIONALTEST}; then if ! build_make ${FUNCTIONALTEST}; then
fail 'functionaltests' 'Functional tests failed' fail 'functionaltests' F 'Functional tests failed'
fi fi
submit_coverage functionaltest submit_coverage functionaltest
check_sanitizer "${LOG_DIR}" check_sanitizer "${LOG_DIR}"
valgrind_check "${LOG_DIR}" valgrind_check "${LOG_DIR}"
check_core_dumps check_core_dumps
exit_suite
)} )}
oldtests() {( run_oldtests() {(
enter_suite oldtests
ulimit -c unlimited || true ulimit -c unlimited || true
if ! make oldtest; then if ! make oldtest; then
reset reset
fail 'oldtests' 'Legacy tests failed' fail 'oldtests' F 'Legacy tests failed'
fi fi
submit_coverage oldtest submit_coverage oldtest
check_sanitizer "${LOG_DIR}" check_sanitizer "${LOG_DIR}"
valgrind_check "${LOG_DIR}" valgrind_check "${LOG_DIR}"
check_core_dumps check_core_dumps
exit_suite
)} )}
check_runtime_files() {( check_runtime_files() {(
set +x
local test_name="$1" ; shift local test_name="$1" ; shift
local message="$1" ; shift local message="$1" ; shift
local tst="$1" ; shift local tst="$1" ; shift
@@ -129,25 +136,27 @@ check_runtime_files() {(
# Prefer failing the build over using more robust construct because files # Prefer failing the build over using more robust construct because files
# with IFS are not welcome. # with IFS are not welcome.
if ! test -e "$file" ; then 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 fi
if ! test "$tst" "$INSTALL_PREFIX/share/nvim/runtime/$file" ; then if ! test "$tst" "$INSTALL_PREFIX/share/nvim/runtime/$file" ; then
fail "$test_name" "$(printf "$message" "$file")" fail "$test_name" F "$(printf "$message" "$file")"
fi fi
done done
)} )}
install_nvim() {( install_nvim() {(
enter_suite 'install_nvim'
if ! build_make install ; then if ! build_make install ; then
fail 'install' 'make install failed' fail 'install' E 'make install failed'
exit 1 exit_suite
fi fi
"${INSTALL_PREFIX}/bin/nvim" --version "${INSTALL_PREFIX}/bin/nvim" --version
if ! "${INSTALL_PREFIX}/bin/nvim" -u NONE -e -c ':help' -c ':qall' ; then if ! "${INSTALL_PREFIX}/bin/nvim" -u NONE -e -c ':help' -c ':qall' ; then
echo "Running ':help' in the installed nvim failed." echo "Running ':help' in the installed nvim failed."
echo "Maybe the helptags have not been generated properly." echo "Maybe the helptags have not been generated properly."
fail 'help' 'Failed running :help' fail 'help' F 'Failed running :help'
fi fi
# Check that all runtime files were installed # Check that all runtime files were installed
@@ -168,6 +177,13 @@ install_nvim() {(
local genvimsynf=syntax/vim/generated.vim local genvimsynf=syntax/vim/generated.vim
local gpat='syn keyword vimFuncName .*eval' local gpat='syn keyword vimFuncName .*eval'
if ! grep -q "$gpat" "${INSTALL_PREFIX}/share/nvim/runtime/$genvimsynf" ; then 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 fi
exit_suite
)} )}
csi_clean() {
find "${BUILD_DIR}/bin" -name 'test-includes-*' -delete
find "${BUILD_DIR}" -name '*test-include*.o' -delete
}

View File

@@ -3,18 +3,31 @@
set -e set -e
set -o pipefail 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. # Use default CC to avoid compilation problems when installing Python modules.
echo "Install neovim module for Python." echo "Install neovim module for Python 3."
CC=cc python -m pip -q install --user --upgrade pynvim 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." echo "Install neovim RubyGem."
gem install --no-document --bindir "$HOME/.local/bin" --user-install --pre neovim gem install --no-document --bindir "$HOME/.local/bin" --user-install --pre neovim
echo "Install neovim npm package" echo "Install neovim npm package"
source ~/.nvm/nvm.sh
nvm use 10
npm install -g neovim npm install -g neovim
npm link neovim npm link neovim
if [[ $CI_OS_NAME != osx ]]; then sudo cpanm -n Neovim::Ext || cat "$HOME/.cpanm/build.log"
sudo cpanm -n Neovim::Ext || cat "$HOME/.cpanm/build.log" perl -W -e 'use Neovim::Ext; print $Neovim::Ext::VERSION'
perl -W -e 'use Neovim::Ext; print $Neovim::Ext::VERSION'
fi

View File

@@ -8,17 +8,29 @@ CI_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${CI_DIR}/common/build.sh" source "${CI_DIR}/common/build.sh"
source "${CI_DIR}/common/suite.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 enter_suite 'lualint'
if (($# == 0)); then run_test 'make lualint' lualint
tests=('clint-full' 'lualint' 'pylint' 'shlint' 'check-single-includes') exit_suite --continue
else
tests=("$@")
fi
for i in "${tests[@]}"; do enter_suite 'pylint'
make "$i" || fail "$i" run_test 'make pylint' pylint
done 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 end_tests

View File

@@ -8,28 +8,33 @@ source "${CI_DIR}/common/build.sh"
source "${CI_DIR}/common/test.sh" source "${CI_DIR}/common/test.sh"
source "${CI_DIR}/common/suite.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 check_core_dumps --delete quiet
if (($# == 0)); then
tests=('build_nvim')
if test "$CLANG_SANITIZER" != "TSAN"; then prepare_build
# Additional threads are only created when the builtin UI starts, which build_nvim
# doesn't happen in the unit/functional tests
if test "${FUNCTIONALTEST}" != "functionaltest-lua"; then exit_suite --continue
tests+=('unittests')
fi source ~/.nvm/nvm.sh
tests+=('functionaltests') 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 fi
run_test run_functionaltests
tests+=('oldtests' 'install_nvim')
else
tests=("$@")
fi fi
run_test run_oldtests
for i in "${tests[@]}"; do run_test install_nvim
eval "$i" || fail "$i"
done exit_suite --continue
end_tests end_tests

View File

@@ -3,7 +3,14 @@
set -e set -e
set -o pipefail 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 if [[ -s "${GCOV_ERROR_FILE}" ]]; then
echo '=== Unexpected gcov errors: ===' echo '=== Unexpected gcov errors: ==='

View File

@@ -8,7 +8,7 @@ WEBHOOK_PAYLOAD="$(cat "${SNAP_DIR}/.snapcraft_payload")"
PAYLOAD_SIG="${SECRET_SNAP_SIG}" PAYLOAD_SIG="${SECRET_SNAP_SIG}"
snap_release_needed() { snap_realease_needed() {
last_committed_tag="$(git tag -l --sort=refname|head -1)" 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')" last_snap_release="$(snap info nvim | awk '$1 == "latest/edge:" { print $2 }' | perl -lpe 's/v\d.\d.\d-//g')"
git fetch -f --tags git fetch -f --tags
@@ -24,7 +24,7 @@ snap_release_needed() {
trigger_snapcraft_webhook() { trigger_snapcraft_webhook() {
[[ -n "${PAYLOAD_SIG}" ]] || exit [[ -n "${PAYLOAD_SIG}" ]] || exit
echo "Triggering new snap release via webhook..." echo "Triggering new snap relase via webhook..."
curl -X POST \ curl -X POST \
-H "Content-Type: application/json" \ -H "Content-Type: application/json" \
-H "X-Hub-Signature: sha1=${PAYLOAD_SIG}" \ -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" echo "New snap release required"
trigger_snapcraft_webhook trigger_snapcraft_webhook
fi fi

View File

@@ -15,7 +15,7 @@ find_path(LIBLUV_INCLUDE_DIR luv/luv.h
PATHS ${PC_LIBLUV_INCLUDEDIR} ${PC_LIBLUV_INCLUDE_DIRS}) PATHS ${PC_LIBLUV_INCLUDEDIR} ${PC_LIBLUV_INCLUDE_DIRS})
# Explicitly look for luv.so. #10407 # Explicitly look for luv.so. #10407
list(APPEND LIBLUV_NAMES luv_a luv libluv_a luv${CMAKE_SHARED_LIBRARY_SUFFIX}) list(APPEND LIBLUV_NAMES luv luv${CMAKE_SHARED_LIBRARY_SUFFIX})
find_library(LIBLUV_LIBRARY NAMES ${LIBLUV_NAMES} find_library(LIBLUV_LIBRARY NAMES ${LIBLUV_NAMES}
HINTS ${PC_LIBLUV_LIBDIR} ${PC_LIBLUV_LIBRARY_DIRS}) HINTS ${PC_LIBLUV_LIBDIR} ${PC_LIBLUV_LIBRARY_DIRS})

View File

@@ -75,14 +75,6 @@ if(WIN32)
list(APPEND LIBUV_LIBRARIES ws2_32) list(APPEND LIBUV_LIBRARIES ws2_32)
endif() endif()
find_package(Threads)
if(Threads_FOUND)
# TODO: Fix the cmake file to properly handle static deps for bundled builds.
# Meanwhile just include the threads library if CMake tells us there's one to
# use.
list(APPEND LIBUV_LIBRARIES ${CMAKE_THREAD_LIBS_INIT})
endif()
include(FindPackageHandleStandardArgs) include(FindPackageHandleStandardArgs)
# handle the QUIETLY and REQUIRED arguments and set LIBUV_FOUND to TRUE # handle the QUIETLY and REQUIRED arguments and set LIBUV_FOUND to TRUE

View File

@@ -154,25 +154,3 @@ function(install_helper)
${RENAME}) ${RENAME})
endif() endif()
endfunction() endfunction()
# Without CONFIGURE_DEPENDS globbing reuses cached file tree on rebuild.
# For example it will ignore new files.
# CONFIGURE_DEPENDS was introduced in 3.12
function(glob_wrapper outvar)
if(${CMAKE_VERSION} VERSION_LESS 3.12)
file(GLOB ${outvar} ${ARGN})
else()
file(GLOB ${outvar} CONFIGURE_DEPENDS ${ARGN})
endif()
set(${outvar} ${${outvar}} PARENT_SCOPE)
endfunction()
function(globrecurse_wrapper outvar root)
if(${CMAKE_VERSION} VERSION_LESS 3.12)
file(GLOB_RECURSE ${outvar} RELATIVE ${root} ${ARGN})
else()
file(GLOB_RECURSE ${outvar} CONFIGURE_DEPENDS RELATIVE ${root} ${ARGN})
endif()
set(${outvar} ${${outvar}} PARENT_SCOPE)
endfunction()

View File

@@ -10,7 +10,6 @@ set(ENV{VIMRUNTIME} ${WORKING_DIR}/runtime)
set(ENV{NVIM_RPLUGIN_MANIFEST} ${BUILD_DIR}/Xtest_rplugin_manifest) set(ENV{NVIM_RPLUGIN_MANIFEST} ${BUILD_DIR}/Xtest_rplugin_manifest)
set(ENV{XDG_CONFIG_HOME} ${BUILD_DIR}/Xtest_xdg/config) set(ENV{XDG_CONFIG_HOME} ${BUILD_DIR}/Xtest_xdg/config)
set(ENV{XDG_DATA_HOME} ${BUILD_DIR}/Xtest_xdg/share) set(ENV{XDG_DATA_HOME} ${BUILD_DIR}/Xtest_xdg/share)
unset(ENV{XDG_DATA_DIRS})
if(NOT DEFINED ENV{NVIM_LOG_FILE}) if(NOT DEFINED ENV{NVIM_LOG_FILE})
set(ENV{NVIM_LOG_FILE} ${BUILD_DIR}/.nvimlog) set(ENV{NVIM_LOG_FILE} ${BUILD_DIR}/.nvimlog)
@@ -46,17 +45,10 @@ if(DEFINED ENV{TEST_FILTER} AND NOT "$ENV{TEST_FILTER}" STREQUAL "")
list(APPEND BUSTED_ARGS --filter $ENV{TEST_FILTER}) list(APPEND BUSTED_ARGS --filter $ENV{TEST_FILTER})
endif() endif()
if(DEFINED ENV{TEST_FILTER_OUT} AND NOT "$ENV{TEST_FILTER_OUT}" STREQUAL "")
list(APPEND BUSTED_ARGS --filter-out $ENV{TEST_FILTER_OUT})
endif()
# TMPDIR: use relative test path (for parallel test runs / isolation). # TMPDIR: use relative test path (for parallel test runs / isolation).
set(ENV{TMPDIR} "${BUILD_DIR}/Xtest_tmpdir/${TEST_PATH}") set(ENV{TMPDIR} "${BUILD_DIR}/Xtest_tmpdir/${TEST_PATH}")
execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory $ENV{TMPDIR}) execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory $ENV{TMPDIR})
# HISTFILE: do not write into user's ~/.bash_history
set(ENV{HISTFILE} "/dev/null")
if(NOT DEFINED ENV{TEST_TIMEOUT} OR "$ENV{TEST_TIMEOUT}" STREQUAL "") if(NOT DEFINED ENV{TEST_TIMEOUT} OR "$ENV{TEST_TIMEOUT}" STREQUAL "")
set(ENV{TEST_TIMEOUT} 1200) set(ENV{TEST_TIMEOUT} 1200)
endif() endif()

View File

@@ -12,6 +12,11 @@ check_type_size("size_t" SIZEOF_SIZE_T)
check_type_size("long long" SIZEOF_LONG_LONG) check_type_size("long long" SIZEOF_LONG_LONG)
check_type_size("void *" SIZEOF_VOID_PTR) check_type_size("void *" SIZEOF_VOID_PTR)
if (CMAKE_HOST_SYSTEM_VERSION MATCHES ".*-(Microsoft|microsoft-standard)")
# Windows Subsystem for Linux
set(HAVE_WSL 1)
endif()
check_symbol_exists(_NSGetEnviron crt_externs.h HAVE__NSGETENVIRON) check_symbol_exists(_NSGetEnviron crt_externs.h HAVE__NSGETENVIRON)
# Headers # Headers
@@ -45,24 +50,10 @@ check_function_exists(readlink HAVE_READLINK)
check_function_exists(setpgid HAVE_SETPGID) check_function_exists(setpgid HAVE_SETPGID)
check_function_exists(setsid HAVE_SETSID) check_function_exists(setsid HAVE_SETSID)
check_function_exists(sigaction HAVE_SIGACTION) check_function_exists(sigaction HAVE_SIGACTION)
check_function_exists(strnlen HAVE_STRNLEN)
check_function_exists(strcasecmp HAVE_STRCASECMP) check_function_exists(strcasecmp HAVE_STRCASECMP)
check_function_exists(strncasecmp HAVE_STRNCASECMP) check_function_exists(strncasecmp HAVE_STRNCASECMP)
check_function_exists(strptime HAVE_STRPTIME) 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 # Symbols
check_symbol_exists(FD_CLOEXEC "fcntl.h" HAVE_FD_CLOEXEC) check_symbol_exists(FD_CLOEXEC "fcntl.h" HAVE_FD_CLOEXEC)
if(HAVE_LANGINFO_H) if(HAVE_LANGINFO_H)
@@ -106,7 +97,7 @@ if (NOT "${HAVE_BE64TOH}")
# any case and ORDER_BIG_ENDIAN will not be examined. # any case and ORDER_BIG_ENDIAN will not be examined.
# - CMAKE_CROSSCOMPILING *and* HAVE_BE64TOH are both false. In this case # - CMAKE_CROSSCOMPILING *and* HAVE_BE64TOH are both false. In this case
# be64toh function which uses cycle and arithmetic operations is used which # be64toh function which uses cycle and arithmetic operations is used which
# will work regardless of endianness. Function is sub-optimal though. # will work regardless of endianess. Function is sub-optimal though.
check_c_source_runs(" check_c_source_runs("
${SI} ${SI}
${MS} ${MS}

View File

@@ -30,7 +30,6 @@
#cmakedefine HAVE_SETPGID #cmakedefine HAVE_SETPGID
#cmakedefine HAVE_SETSID #cmakedefine HAVE_SETSID
#cmakedefine HAVE_SIGACTION #cmakedefine HAVE_SIGACTION
#cmakedefine HAVE_STRNLEN
#cmakedefine HAVE_STRCASECMP #cmakedefine HAVE_STRCASECMP
#cmakedefine HAVE_STRINGS_H #cmakedefine HAVE_STRINGS_H
#cmakedefine HAVE_STRNCASECMP #cmakedefine HAVE_STRNCASECMP
@@ -40,6 +39,7 @@
#cmakedefine HAVE_SYS_WAIT_H #cmakedefine HAVE_SYS_WAIT_H
#cmakedefine HAVE_TERMIOS_H #cmakedefine HAVE_TERMIOS_H
#cmakedefine HAVE_WORKING_LIBINTL #cmakedefine HAVE_WORKING_LIBINTL
#cmakedefine HAVE_WSL
#cmakedefine UNIX #cmakedefine UNIX
#cmakedefine CASE_INSENSITIVE_FILENAME #cmakedefine CASE_INSENSITIVE_FILENAME
#cmakedefine USE_FNAME_CASE #cmakedefine USE_FNAME_CASE
@@ -50,7 +50,6 @@
# undef HAVE_SYS_UIO_H # undef HAVE_SYS_UIO_H
# endif # endif
#endif #endif
#cmakedefine HAVE_FORKPTY
#cmakedefine FEAT_TUI #cmakedefine FEAT_TUI

12
contrib/flake.lock generated
View File

@@ -2,11 +2,11 @@
"nodes": { "nodes": {
"flake-utils": { "flake-utils": {
"locked": { "locked": {
"lastModified": 1644229661, "lastModified": 1610051610,
"narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
"owner": "numtide", "owner": "numtide",
"repo": "flake-utils", "repo": "flake-utils",
"rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -17,11 +17,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1646254136, "lastModified": 1613226215,
"narHash": "sha256-8nQx02tTzgYO21BP/dy5BCRopE8OwE8Drsw98j+Qoaw=", "narHash": "sha256-3rA5cGIrBHD6yeKhNhsF7/t461ww25oJY8KyBb0IhjU=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "3e072546ea98db00c2364b81491b893673267827", "rev": "ff96a0fa5635770390b184ae74debea75c3fd534",
"type": "github" "type": "github"
}, },
"original": { "original": {

View File

@@ -16,20 +16,24 @@
neovim = pkgs.neovim-unwrapped.overrideAttrs (oa: { neovim = pkgs.neovim-unwrapped.overrideAttrs (oa: {
version = "master"; version = "master";
src = ../.; src = ../.;
buildInputs = oa.buildInputs ++ ([
pkgs.tree-sitter
]);
cmakeFlags = oa.cmakeFlags ++ [
"-DUSE_BUNDLED=OFF"
];
}); });
# a development binary to help debug issues # a development binary to help debug issues
neovim-debug = let 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 in
((neovim.override { pkgs.enableDebugging ((neovim.override {
lua = pkgs.luajit; lua = pkgs.enableDebugging pkgs.luajit;
inherit stdenv; inherit stdenv;
}).overrideAttrs (oa: { }).overrideAttrs (oa: {
dontStrip = true;
NIX_CFLAGS_COMPILE = " -ggdb -Og";
cmakeBuildType = "Debug"; cmakeBuildType = "Debug";
cmakeFlags = oa.cmakeFlags ++ [ cmakeFlags = oa.cmakeFlags ++ [
"-DMIN_LOG_LEVEL=0" "-DMIN_LOG_LEVEL=0"
@@ -38,10 +42,16 @@
disallowedReferences = []; 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 = neovim-developer =
let let
lib = nixpkgs.lib; lib = nixpkgs.lib;
pythonEnv = pkgs.python3.withPackages(ps: [
ps.msgpack
ps.flake8 # for 'make pylint'
]);
luacheck = pkgs.luaPackages.luacheck; luacheck = pkgs.luaPackages.luacheck;
in in
(neovim-debug.override ({ doCheck = pkgs.stdenv.isLinux; })).overrideAttrs (oa: { (neovim-debug.override ({ doCheck = pkgs.stdenv.isLinux; })).overrideAttrs (oa: {
@@ -49,11 +59,29 @@
"-DLUACHECK_PRG=${luacheck}/bin/luacheck" "-DLUACHECK_PRG=${luacheck}/bin/luacheck"
"-DMIN_LOG_LEVEL=0" "-DMIN_LOG_LEVEL=0"
"-DENABLE_LTO=OFF" "-DENABLE_LTO=OFF"
"-DUSE_BUNDLED=OFF"
] ++ pkgs.lib.optionals pkgs.stdenv.isLinux [ ] ++ pkgs.lib.optionals pkgs.stdenv.isLinux [
# https://github.com/google/sanitizers/wiki/AddressSanitizerFlags # https://github.com/google/sanitizers/wiki/AddressSanitizerFlags
# https://clang.llvm.org/docs/AddressSanitizer.html#symbolizing-the-reports # https://clang.llvm.org/docs/AddressSanitizer.html#symbolizing-the-reports
"-DCLANG_ASAN_UBSAN=ON" "-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 ]; overlays = [ self.overlay ];
inherit system; inherit system;
}; };
pythonEnv = pkgs.python3.withPackages(ps: [
ps.msgpack
ps.flake8 # for 'make pylint'
]);
in in
rec { rec {
@@ -75,18 +98,6 @@
inherit neovim neovim-debug neovim-developer; 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; defaultPackage = pkgs.neovim;
apps = { apps = {
@@ -96,38 +107,6 @@
defaultApp = apps.nvim; defaultApp = apps.nvim;
devShell = let devShell = pkgs.neovim-developer;
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
'';
});
}); });
} }

View File

@@ -27,7 +27,7 @@
# With non-Debug builds interprocedural optimization (IPO) (which includes # With non-Debug builds interprocedural optimization (IPO) (which includes
# link-time optimization (LTO)) is enabled by default, which causes the link # 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: # often. You can disable it explicitly:
# CMAKE_EXTRA_FLAGS += -DENABLE_LTO=OFF # CMAKE_EXTRA_FLAGS += -DENABLE_LTO=OFF

View File

@@ -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

File diff suppressed because it is too large Load Diff

View File

@@ -100,7 +100,7 @@ Useful for scripting because it does NOT start a UI, unlike
.Ic :help silent-mode .Ic :help silent-mode
.It Fl d .It Fl d
Diff mode. Diff mode.
Show the difference between two to eight files, similar to Show the difference between two to four files, similar to
.Xr sdiff 1 . .Xr sdiff 1 .
.Ic ":help diff" .Ic ":help diff"
.It Fl R .It Fl R
@@ -177,7 +177,8 @@ If
.Ar vimrc .Ar vimrc
is is
.Cm NORC , .Cm NORC ,
do not load any initialization files (except plugins). do not load any initialization files (except plugins),
and do not attempt to parse environment variables.
If If
.Ar vimrc .Ar vimrc
is is
@@ -200,7 +201,7 @@ Skip loading plugins.
Implied by Implied by
.Cm -u NONE . .Cm -u NONE .
.It Fl -clean .It Fl -clean
Mimic a fresh install of Nvim. Skip loading non-builtin plugins and shada (viminfo) file. Skip loading plugins and shada (viminfo) file.
.It Fl o Ns Op Ar N .It Fl o Ns Op Ar N
Open Open
.Ar N .Ar N

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -21,12 +21,12 @@ add_custom_command(OUTPUT ${GENERATED_SYN_VIM}
${FUNCS_DATA} ${FUNCS_DATA}
) )
glob_wrapper(PACKAGES ${PROJECT_SOURCE_DIR}/runtime/pack/dist/opt/*) file(GLOB PACKAGES ${PROJECT_SOURCE_DIR}/runtime/pack/dist/opt/*)
set(GENERATED_PACKAGE_TAGS) set(GENERATED_PACKAGE_TAGS)
foreach(PACKAGE ${PACKAGES}) foreach(PACKAGE ${PACKAGES})
get_filename_component(PACKNAME ${PACKAGE} NAME) get_filename_component(PACKNAME ${PACKAGE} NAME)
glob_wrapper("${PACKNAME}_DOC_FILES" ${PACKAGE}/doc/*.txt) file(GLOB "${PACKNAME}_DOC_FILES" ${PACKAGE}/doc/*.txt)
if(${PACKNAME}_DOC_FILES) if(${PACKNAME}_DOC_FILES)
file(MAKE_DIRECTORY ${GENERATED_PACKAGE_DIR}/${PACKNAME}) file(MAKE_DIRECTORY ${GENERATED_PACKAGE_DIR}/${PACKNAME})
add_custom_command(OUTPUT "${GENERATED_PACKAGE_DIR}/${PACKNAME}/doc/tags" add_custom_command(OUTPUT "${GENERATED_PACKAGE_DIR}/${PACKNAME}/doc/tags"
@@ -54,7 +54,7 @@ foreach(PACKAGE ${PACKAGES})
endif() endif()
endforeach() endforeach()
glob_wrapper(DOCFILES ${PROJECT_SOURCE_DIR}/runtime/doc/*.txt) file(GLOB DOCFILES ${PROJECT_SOURCE_DIR}/runtime/doc/*.txt)
set(BUILDDOCFILES) set(BUILDDOCFILES)
foreach(DF ${DOCFILES}) foreach(DF ${DOCFILES})
@@ -114,7 +114,9 @@ if(NOT APPLE)
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/128x128/apps) DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/128x128/apps)
endif() endif()
globrecurse_wrapper(RUNTIME_PROGRAMS ${CMAKE_CURRENT_SOURCE_DIR} *.awk *.sh *.bat) file(GLOB_RECURSE RUNTIME_PROGRAMS
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
*.awk *.sh *.bat)
foreach(PROG ${RUNTIME_PROGRAMS}) foreach(PROG ${RUNTIME_PROGRAMS})
get_filename_component(BASEDIR ${PROG} PATH) get_filename_component(BASEDIR ${PROG} PATH)
@@ -122,7 +124,9 @@ foreach(PROG ${RUNTIME_PROGRAMS})
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/nvim/runtime/${BASEDIR}) DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/nvim/runtime/${BASEDIR})
endforeach() endforeach()
globrecurse_wrapper(RUNTIME_FILES ${CMAKE_CURRENT_SOURCE_DIR} file(GLOB_RECURSE RUNTIME_FILES
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
rgb.txt
*.vim *.lua *.dict *.py *.rb *.ps *.spl *.tutor *.tutor.json) *.vim *.lua *.dict *.py *.rb *.ps *.spl *.tutor *.tutor.json)
foreach(F ${RUNTIME_FILES}) foreach(F ${RUNTIME_FILES})

View File

@@ -67,13 +67,13 @@ if exists ('g:ada_with_gnat_project_files')
endfor endfor
endif endif
" Section: add standard exception {{{2 " Section: add standart exception {{{2
" "
for Item in ['Constraint_Error', 'Program_Error', 'Storage_Error', 'Tasking_Error', 'Status_Error', 'Mode_Error', 'Name_Error', 'Use_Error', 'Device_Error', 'End_Error', 'Data_Error', 'Layout_Error', 'Length_Error', 'Pattern_Error', 'Index_Error', 'Translation_Error', 'Time_Error', 'Argument_Error', 'Tag_Error', 'Picture_Error', 'Terminator_Error', 'Conversion_Error', 'Pointer_Error', 'Dereference_Error', 'Update_Error'] for Item in ['Constraint_Error', 'Program_Error', 'Storage_Error', 'Tasking_Error', 'Status_Error', 'Mode_Error', 'Name_Error', 'Use_Error', 'Device_Error', 'End_Error', 'Data_Error', 'Layout_Error', 'Length_Error', 'Pattern_Error', 'Index_Error', 'Translation_Error', 'Time_Error', 'Argument_Error', 'Tag_Error', 'Picture_Error', 'Terminator_Error', 'Conversion_Error', 'Pointer_Error', 'Dereference_Error', 'Update_Error']
let g:ada#Keywords += [{ let g:ada#Keywords += [{
\ 'word': Item, \ 'word': Item,
\ 'menu': 'exception', \ 'menu': 'exception',
\ 'info': 'Ada standard exception.', \ 'info': 'Ada standart exception.',
\ 'kind': 'x', \ 'kind': 'x',
\ 'icase': 1}] \ 'icase': 1}]
endfor endfor
@@ -210,7 +210,7 @@ function ada#Word (...)
let l:Line = substitute (getline (l:Line_Nr), g:ada#Comment, '', '' ) let l:Line = substitute (getline (l:Line_Nr), g:ada#Comment, '', '' )
" Cope with tag searching for items in comments; if we are, don't loop " Cope with tag searching for items in comments; if we are, don't loop
" backwards looking for previous lines " backards looking for previous lines
if l:Column_Nr > strlen(l:Line) if l:Column_Nr > strlen(l:Line)
" We were in a comment " We were in a comment
let l:Line = getline(l:Line_Nr) let l:Line = getline(l:Line_Nr)

View File

@@ -14,7 +14,7 @@
" 15.10.2006 MK Bram's suggestion for runtime integration " 15.10.2006 MK Bram's suggestion for runtime integration
" 05.11.2006 MK Bram suggested not to use include protection for " 05.11.2006 MK Bram suggested not to use include protection for
" autoload " autoload
" 05.11.2006 MK Bram suggested against using setlocal omnifunc " 05.11.2006 MK Bram suggested agaist using setlocal omnifunc
" 05.11.2006 MK Bram suggested to save on spaces " 05.11.2006 MK Bram suggested to save on spaces
" Help Page: ft-ada-omni " Help Page: ft-ada-omni
"------------------------------------------------------------------------------ "------------------------------------------------------------------------------

File diff suppressed because one or more lines are too long

View File

@@ -4,7 +4,7 @@
" plus CSS Speech Module <http://www.w3.org/TR/css3-speech/> " plus CSS Speech Module <http://www.w3.org/TR/css3-speech/>
" Maintainer: Kao, Wei-Ko(othree) ( othree AT gmail DOT com ) " Maintainer: Kao, Wei-Ko(othree) ( othree AT gmail DOT com )
" Original Author: Mikolaj Machowski ( mikmach AT wp DOT pl ) " Original Author: Mikolaj Machowski ( mikmach AT wp DOT pl )
" Last Change: 2021 Sep 21 " Last Change: 2018 Jul 02
let s:values = split("all additive-symbols align-content align-items align-self animation animation-delay animation-direction animation-duration animation-fill-mode animation-iteration-count animation-name animation-play-state animation-timing-function backface-visibility background background-attachment background-blend-mode background-clip background-color background-image background-origin background-position background-repeat background-size block-size border border-block-end border-block-end-color border-block-end-style border-block-end-width border-block-start border-block-start-color border-block-start-style border-block-start-width border-bottom border-bottom-color border-bottom-left-radius border-bottom-right-radius border-bottom-style border-bottom-width border-collapse border-color border-image border-image-outset border-image-repeat border-image-slice border-image-source border-image-width border-inline-end border-inline-end-color border-inline-end-style border-inline-end-width border-inline-start border-inline-start-color border-inline-start-style border-inline-start-width border-left border-left-color border-left-style border-left-width border-radius border-right border-right-color border-right-style border-right-width border-spacing border-style border-top border-top-color border-top-left-radius border-top-right-radius border-top-style border-top-width border-width bottom box-decoration-break box-shadow box-sizing break-after break-before break-inside caption-side clear clip clip-path color columns column-count column-fill column-gap column-rule column-rule-color column-rule-style column-rule-width column-span column-width content counter-increment counter-reset cue cue-before cue-after cursor direction display empty-cells fallback filter flex flex-basis flex-direction flex-flow flex-grow flex-shrink flex-wrap float font font-family font-feature-settings font-kerning font-language-override font-size font-size-adjust font-stretch font-style font-synthesis font-variant font-variant-alternates font-variant-caps font-variant-east-asian font-variant-ligatures font-variant-numeric font-variant-position font-weight grid grid-area grid-auto-columns grid-auto-flow grid-auto-position grid-auto-rows grid-column grid-column-start grid-column-end grid-row grid-row-start grid-row-end grid-template grid-template-areas grid-template-rows grid-template-columns height hyphens image-rendering image-resolution image-orientation ime-mode inline-size isolation justify-content left letter-spacing line-break line-height list-style list-style-image list-style-position list-style-type margin margin-block-end margin-block-start margin-bottom margin-inline-end margin-inline-start margin-left margin-right margin-top marks mask mask-type max-block-size max-height max-inline-size max-width max-zoom min-block-size min-height min-inline-size min-width min-zoom mix-blend-mode negative object-fit object-position offset-block-end offset-block-start offset-inline-end offset-inline-start opacity order orientation orphans outline outline-color outline-offset outline-style outline-width overflow overflow-wrap overflow-x overflow-y pad padding padding-block-end padding-block-start padding-bottom padding-inline-end padding-inline-start padding-left padding-right padding-top page-break-after page-break-before page-break-inside pause-before pause-after pause perspective perspective-origin pointer-events position prefix quotes range resize rest rest-before rest-after right ruby-align ruby-merge ruby-position scroll-behavior scroll-snap-coordinate scroll-snap-destination scroll-snap-points-x scroll-snap-points-y scroll-snap-type scroll-snap-type-x scroll-snap-type-y shape-image-threshold shape-margin shape-outside speak speak-as suffix symbols system table-layout tab-size text-align text-align-last text-combine-upright text-decoration text-decoration-color text-decoration-line text-emphasis text-emphasis-color text-emphasis-position text-emphasis-style text-indent text-orientation text-overflow text-rendering text-shadow text-transform text-underline-position top touch-action transform transform-box transform-origin transform-style transition transition-delay transition-duration transition-property transition-timing-function unicode-bidi unicode-range user-zoom vertical-align visibility voice-balance voice-duration voice-family voice-pitch voice-rate voice-range voice-stress voice-volume white-space widows width will-change word-break word-spacing word-wrap writing-mode z-index zoom") let s:values = split("all additive-symbols align-content align-items align-self animation animation-delay animation-direction animation-duration animation-fill-mode animation-iteration-count animation-name animation-play-state animation-timing-function backface-visibility background background-attachment background-blend-mode background-clip background-color background-image background-origin background-position background-repeat background-size block-size border border-block-end border-block-end-color border-block-end-style border-block-end-width border-block-start border-block-start-color border-block-start-style border-block-start-width border-bottom border-bottom-color border-bottom-left-radius border-bottom-right-radius border-bottom-style border-bottom-width border-collapse border-color border-image border-image-outset border-image-repeat border-image-slice border-image-source border-image-width border-inline-end border-inline-end-color border-inline-end-style border-inline-end-width border-inline-start border-inline-start-color border-inline-start-style border-inline-start-width border-left border-left-color border-left-style border-left-width border-radius border-right border-right-color border-right-style border-right-width border-spacing border-style border-top border-top-color border-top-left-radius border-top-right-radius border-top-style border-top-width border-width bottom box-decoration-break box-shadow box-sizing break-after break-before break-inside caption-side clear clip clip-path color columns column-count column-fill column-gap column-rule column-rule-color column-rule-style column-rule-width column-span column-width content counter-increment counter-reset cue cue-before cue-after cursor direction display empty-cells fallback filter flex flex-basis flex-direction flex-flow flex-grow flex-shrink flex-wrap float font font-family font-feature-settings font-kerning font-language-override font-size font-size-adjust font-stretch font-style font-synthesis font-variant font-variant-alternates font-variant-caps font-variant-east-asian font-variant-ligatures font-variant-numeric font-variant-position font-weight grid grid-area grid-auto-columns grid-auto-flow grid-auto-position grid-auto-rows grid-column grid-column-start grid-column-end grid-row grid-row-start grid-row-end grid-template grid-template-areas grid-template-rows grid-template-columns height hyphens image-rendering image-resolution image-orientation ime-mode inline-size isolation justify-content left letter-spacing line-break line-height list-style list-style-image list-style-position list-style-type margin margin-block-end margin-block-start margin-bottom margin-inline-end margin-inline-start margin-left margin-right margin-top marks mask mask-type max-block-size max-height max-inline-size max-width max-zoom min-block-size min-height min-inline-size min-width min-zoom mix-blend-mode negative object-fit object-position offset-block-end offset-block-start offset-inline-end offset-inline-start opacity order orientation orphans outline outline-color outline-offset outline-style outline-width overflow overflow-wrap overflow-x overflow-y pad padding padding-block-end padding-block-start padding-bottom padding-inline-end padding-inline-start padding-left padding-right padding-top page-break-after page-break-before page-break-inside pause-before pause-after pause perspective perspective-origin pointer-events position prefix quotes range resize rest rest-before rest-after right ruby-align ruby-merge ruby-position scroll-behavior scroll-snap-coordinate scroll-snap-destination scroll-snap-points-x scroll-snap-points-y scroll-snap-type scroll-snap-type-x scroll-snap-type-y shape-image-threshold shape-margin shape-outside speak speak-as suffix symbols system table-layout tab-size text-align text-align-last text-combine-upright text-decoration text-decoration-color text-decoration-line text-emphasis text-emphasis-color text-emphasis-position text-emphasis-style text-indent text-orientation text-overflow text-rendering text-shadow text-transform text-underline-position top touch-action transform transform-box transform-origin transform-style transition transition-delay transition-duration transition-property transition-timing-function unicode-bidi unicode-range user-zoom vertical-align visibility voice-balance voice-duration voice-family voice-pitch voice-rate voice-range voice-stress voice-volume white-space widows width will-change word-break word-spacing word-wrap writing-mode z-index zoom")
@@ -38,12 +38,12 @@ function! csscomplete#CompleteCSS(findstart, base)
if exists("b:compl_context") if exists("b:compl_context")
let line = getline('.') let line = getline('.')
let compl_begin = col('.') - 2 let compl_begin = col('.') - 2
let b:after = line[compl_begin:] let after = line[compl_begin:]
let line = b:compl_context let line = b:compl_context
unlet! b:compl_context unlet! b:compl_context
else else
let line = a:base let line = a:base
let b:after = '' let after = ''
endif endif
let res = [] let res = []
@@ -311,7 +311,7 @@ function! csscomplete#CompleteCSS(findstart, base)
let values = ["normal", "italic", "oblique", "small-caps", "bold", "bolder", "lighter", "100", "200", "300", "400", "500", "600", "700", "800", "900", "xx-small", "x-small", "small", "medium", "large", "x-large", "xx-large", "larger", "smaller", "sans-serif", "serif", "monospace", "cursive", "fantasy", "caption", "icon", "menu", "message-box", "small-caption", "status-bar"] let values = ["normal", "italic", "oblique", "small-caps", "bold", "bolder", "lighter", "100", "200", "300", "400", "500", "600", "700", "800", "900", "xx-small", "x-small", "small", "medium", "large", "x-large", "xx-large", "larger", "smaller", "sans-serif", "serif", "monospace", "cursive", "fantasy", "caption", "icon", "menu", "message-box", "small-caption", "status-bar"]
elseif prop =~ '^\%(height\|width\)$' elseif prop =~ '^\%(height\|width\)$'
let values = ["auto", "border-box", "content-box", "max-content", "min-content", "available", "fit-content"] let values = ["auto", "border-box", "content-box", "max-content", "min-content", "available", "fit-content"]
elseif prop =~ '^\%(left\|right\)$' elseif prop =~ '^\%(left\|rigth\)$'
let values = ["auto"] let values = ["auto"]
elseif prop == 'image-rendering' elseif prop == 'image-rendering'
let values = ["auto", "crisp-edges", "pixelated"] let values = ["auto", "crisp-edges", "pixelated"]

View File

@@ -23,7 +23,7 @@ endif
function decada#Unit_Name () dict " {{{1 function decada#Unit_Name () dict " {{{1
" Convert filename into acs unit: " Convert filename into acs unit:
" 1: remove the file extension. " 1: remove the file extenstion.
" 2: replace all double '_' or '-' with an dot (which denotes a separate) " 2: replace all double '_' or '-' with an dot (which denotes a separate)
" 3: remove a trailing '_' (which denotes a specification) " 3: remove a trailing '_' (which denotes a specification)
return substitute (substitute (expand ("%:t:r"), '__\|-', ".", "g"), '_$', "", '') return substitute (substitute (expand ("%:t:r"), '__\|-', ".", "g"), '_$', "", '')

View File

@@ -1,7 +1,7 @@
" Vim functions for file type detection " Vim functions for file type detection
" "
" Maintainer: Bram Moolenaar <Bram@vim.org> " Maintainer: Bram Moolenaar <Bram@vim.org>
" Last Change: 2022 Apr 06 " Last Change: 2020 Aug 17
" These functions are moved here from runtime/filetype.vim to make startup " These functions are moved here from runtime/filetype.vim to make startup
" faster. " faster.
@@ -67,32 +67,13 @@ func dist#ft#FTasmsyntax()
endif endif
endfunc endfunc
let s:ft_visual_basic_content = '\cVB_Name\|Begin VB\.\(Form\|MDIForm\|UserControl\)' " 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.
" See FTfrm() for Visual Basic form file detection func dist#ft#FTVB(alt)
func dist#ft#FTbas() if getline(1).getline(2).getline(3).getline(4).getline(5) =~? 'VB_Name\|Begin VB\.\(Form\|MDIForm\|UserControl\)'
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
setf vb setf vb
else else
setf basic exe "setf " . a:alt
endif endif
endfunc endfunc
@@ -112,25 +93,6 @@ func dist#ft#BindzoneCheck(default)
endif endif
endfunc 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() func dist#ft#FTlpc()
if exists("g:lpc_syntax_for_c") if exists("g:lpc_syntax_for_c")
let lnum = 1 let lnum = 1
@@ -192,7 +154,7 @@ endfunc
func dist#ft#FTent() func dist#ft#FTent()
" This function checks for valid cl syntax in the first five lines. " 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. " If not found, assume SGML.
let lnum = 1 let lnum = 1
while lnum < 6 while lnum < 6
@@ -230,10 +192,6 @@ func dist#ft#EuphoriaCheck()
endfunc endfunc
func dist#ft#DtraceCheck() func dist#ft#DtraceCheck()
if did_filetype()
" Filetype was already detected
return
endif
let lines = getline(1, min([line("$"), 100])) let lines = getline(1, min([line("$"), 100]))
if match(lines, '^module\>\|^import\>') > -1 if match(lines, '^module\>\|^import\>') > -1
" D files often start with a module and/or import statement. " D files often start with a module and/or import statement.
@@ -261,38 +219,6 @@ func dist#ft#FTe()
endif endif
endfunc 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 " Distinguish between HTML, XHTML and Django
func dist#ft#FThtml() func dist#ft#FThtml()
let n = 1 let n = 1
@@ -338,16 +264,6 @@ func dist#ft#ProtoCheck(default)
endfunc endfunc
func dist#ft#FTm() func dist#ft#FTm()
if exists("g:filetype_m")
exe "setf " . g:filetype_m
return
endif
" excluding end(for|function|if|switch|while) common to Murphi
let octave_block_terminators = '\<end\%(_try_catch\|classdef\|enumeration\|events\|methods\|parfor\|properties\)\>'
let objc_preprocessor = '^\s*#\s*\%(import\|include\|define\|if\|ifn\=def\|undef\|line\|error\|pragma\)\>'
let n = 1 let n = 1
let saw_comment = 0 " Whether we've seen a multiline comment leader. let saw_comment = 0 " Whether we've seen a multiline comment leader.
while n < 100 while n < 100
@@ -358,16 +274,10 @@ func dist#ft#FTm()
" anything more definitive. " anything more definitive.
let saw_comment = 1 let saw_comment = 1
endif endif
if line =~ '^\s*//' || line =~ '^\s*@import\>' || line =~ objc_preprocessor if line =~ '^\s*\(#\s*\(include\|import\)\>\|@import\>\|//\)'
setf objc setf objc
return return
endif endif
if line =~ '^\s*\%(#\|%!\)' || line =~ '^\s*unwind_protect\>' ||
\ line =~ '\%(^\|;\)\s*' .. octave_block_terminators
setf octave
return
endif
" TODO: could be Matlab or Octave
if line =~ '^\s*%' if line =~ '^\s*%'
setf matlab setf matlab
return return
@@ -388,8 +298,11 @@ func dist#ft#FTm()
" or Murphi based on the comment leader. Assume the former as it is more " or Murphi based on the comment leader. Assume the former as it is more
" common. " common.
setf objc setf objc
elseif exists("g:filetype_m")
" Use user specified default filetype for .m
exe "setf " . g:filetype_m
else else
" Default is Matlab " Default is matlab
setf matlab setf matlab
endif endif
endfunc endfunc
@@ -434,36 +347,6 @@ func dist#ft#FTmm()
setf nroff setf nroff
endfunc 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() func dist#ft#FTpl()
if exists("g:filetype_pl") if exists("g:filetype_pl")
exe "setf " . g:filetype_pl exe "setf " . g:filetype_pl
@@ -580,18 +463,6 @@ func dist#ft#FTpp()
endif endif
endfunc 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() func dist#ft#FTr()
let max = line("$") > 50 ? 50 : line("$") let max = line("$") > 50 ? 50 : line("$")
@@ -773,28 +644,6 @@ func dist#ft#SQL()
endif endif
endfunc 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 " 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. " it is almost certainly a Perl test file.
" If the first line starts with '#' and contains 'perl' it's probably a Perl " If the first line starts with '#' and contains 'perl' it's probably a Perl
@@ -813,7 +662,7 @@ func dist#ft#FTperl()
endif endif
let save_cursor = getpos('.') let save_cursor = getpos('.')
call cursor(1,1) 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) call setpos('.', save_cursor)
if has_use if has_use
setf perl setf perl
@@ -822,16 +671,6 @@ func dist#ft#FTperl()
return 0 return 0
endfunc 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: " Choose context, plaintex, or tex (LaTeX) based on these rules:
" 1. Check the first line of the file for "%&<format>". " 1. Check the first line of the file for "%&<format>".
" 2. Check the first 1000 non-comment lines for LaTeX or ConTeXt keywords. " 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('.') let save_cursor = getpos('.')
call cursor(1,1) call cursor(1,1)
let firstNC = search('^\s*[^[:space:]%]', 'c', 1000) let firstNC = search('^\s*[^[:space:]%]', 'c', 1000)
if firstNC > 0 if firstNC " Check the next thousand lines for a LaTeX or ConTeXt keyword.
" Check the next thousand lines for a LaTeX or ConTeXt keyword.
let lpat = 'documentclass\>\|usepackage\>\|begin{\|newcommand\>\|renewcommand\>' 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 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 . '\)', let kwline = search('^\s*\\\%(' . lpat . '\)\|^\s*\\\(' . cpat . '\)',
@@ -943,72 +781,6 @@ func dist#ft#Redif()
endwhile endwhile
endfunc 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' " Restore 'cpoptions'
let &cpo = s:cpo_save let &cpo = s:cpo_save

View File

@@ -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:

View File

@@ -54,7 +54,7 @@ function! haskellcomplete#Complete(findstart, base)
if b:completingLangExtension if b:completingLangExtension
if a:base ==? "" if a:base ==? ""
" Return all possible Lang extensions " Return all posible Lang extensions
return s:langExtensions return s:langExtensions
else else
let l:matches = [] let l:matches = []
@@ -70,7 +70,7 @@ function! haskellcomplete#Complete(findstart, base)
elseif b:completingOptionsGHC elseif b:completingOptionsGHC
if a:base ==? "" if a:base ==? ""
" Return all possible GHC options " Return all posible GHC options
return s:optionsGHC return s:optionsGHC
else else
let l:matches = [] let l:matches = []
@@ -86,7 +86,7 @@ function! haskellcomplete#Complete(findstart, base)
elseif b:completingModule elseif b:completingModule
if a:base ==? "" if a:base ==? ""
" Return all possible modules " Return all posible modules
return s:commonModules return s:commonModules
else else
let l:matches = [] let l:matches = []

View File

@@ -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 the specified healthchecks.
" Runs all discovered healthchecks if a:plugin_names is empty. " Runs all discovered healthchecks if a:plugin_names is empty.
function! health#check(plugin_names) abort function! health#check(plugin_names) abort
let healthchecks = empty(a:plugin_names) let healthchecks = empty(a:plugin_names)
\ ? s:discover_healthchecks() \ ? s:discover_health_checks()
\ : s:get_healthcheck(a:plugin_names) \ : s:to_fn_names(a:plugin_names)
" create scratch-buffer tabnew
execute 'tab sbuffer' nvim_create_buf(v:true, v:true) setlocal wrap breakindent linebreak
setfiletype checkhealth setlocal filetype=markdown
setlocal conceallevel=2 concealcursor=nc
setlocal keywordprg=:help
let &l:iskeyword='!-~,^*,^|,^",192-255'
call s:enhance_syntax()
if empty(healthchecks) if empty(healthchecks)
call setline(1, 'ERROR: No healthchecks found.') call setline(1, 'ERROR: No healthchecks found.')
else else
redraw|echo 'Running healthchecks...' redraw|echo 'Running healthchecks...'
for name in sort(keys(healthchecks)) for c in healthchecks
let [func, type] = healthchecks[name] let output = ''
let s:output = [] call append('$', split(printf("\n%s\n%s", c, repeat('=',72)), "\n"))
try try
if func == '' let output = "\n\n".execute('call '.c.'()')
throw 'healthcheck_not_found'
endif
eval type == 'v' ? call(func, []) : luaeval(func)
" 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
catch catch
let s:output = [] " Clear the output if v:exception =~# '^Vim\%((\a\+)\)\=:E117.*\V'.c
if v:exception =~# 'healthcheck_not_found' let output = execute(
call health#report_error('No healthcheck found for "'.name.'" plugin.') \ 'call health#report_error(''No healthcheck found for "'
elseif v:exception =~# 'healthcheck_no_return_value' \ .s:to_plugin_name(c)
call health#report_error('The healthcheck report for "'.name.'" plugin is empty.') \ .'" plugin.'')')
else else
call health#report_error(printf( let output = execute(
\ "Failed to run healthcheck for \"%s\" plugin. Exception:\n%s\n%s", \ 'call health#report_error(''Failed to run healthcheck for "'
\ name, v:throwpoint, v:exception)) \ .s:to_plugin_name(c)
\ .'" plugin. Exception:''."\n".v:throwpoint."\n".v:exception)')
endif endif
endtry endtry
let header = [name. ': ' . func, repeat('=', 72)] call append('$', split(output, "\n") + [''])
" remove empty line after header from report_start
let s:output = s:output[0] == '' ? s:output[1:] : s:output
let s:output = header + s:output + ['']
call append('$', s:output)
redraw redraw
endfor endfor
endif endif
" needed for plasticboy/vim-markdown, because it uses fdm=expr " needed for plasticboy/vim-markdown, because it uses fdm=expr
normal! zR normal! zR
setlocal nomodified
setlocal bufhidden=hide
redraw|echo '' redraw|echo ''
endfunction endfunction
function! s:collect_output(output)
let s:output += split(a:output, "\n", 1)
endfunction
" Starts a new report. " Starts a new report.
function! health#report_start(name) abort function! health#report_start(name) abort
call s:collect_output("\n## " . a:name) echo "\n## " . a:name
endfunction endfunction
" Indents lines *except* line 1 of a string if it contains newlines. " Indents lines *except* line 1 of a string if it contains newlines.
@@ -104,21 +119,21 @@ endfunction " }}}
" Use {msg} to report information in the current section " Use {msg} to report information in the current section
function! health#report_info(msg) abort " {{{ function! health#report_info(msg) abort " {{{
call s:collect_output(s:format_report_message('INFO', a:msg)) echo s:format_report_message('INFO', a:msg)
endfunction " }}} endfunction " }}}
" Reports a successful healthcheck. " Reports a successful healthcheck.
function! health#report_ok(msg) abort " {{{ function! health#report_ok(msg) abort " {{{
call s:collect_output(s:format_report_message('OK', a:msg)) echo s:format_report_message('OK', a:msg)
endfunction " }}} endfunction " }}}
" Reports a health warning. " Reports a health warning.
" a:1: Optional advice (string or list) " a:1: Optional advice (string or list)
function! health#report_warn(msg, ...) abort " {{{ function! health#report_warn(msg, ...) abort " {{{
if a:0 > 0 if a:0 > 0
call s:collect_output(s:format_report_message('WARNING', a:msg, a:1)) echo s:format_report_message('WARNING', a:msg, a:1)
else else
call s:collect_output(s:format_report_message('WARNING', a:msg)) echo s:format_report_message('WARNING', a:msg)
endif endif
endfunction " }}} endfunction " }}}
@@ -126,73 +141,37 @@ endfunction " }}}
" a:1: Optional advice (string or list) " a:1: Optional advice (string or list)
function! health#report_error(msg, ...) abort " {{{ function! health#report_error(msg, ...) abort " {{{
if a:0 > 0 if a:0 > 0
call s:collect_output(s:format_report_message('ERROR', a:msg, a:1)) echo s:format_report_message('ERROR', a:msg, a:1)
else else
call s:collect_output(s:format_report_message('ERROR', a:msg)) echo s:format_report_message('ERROR', a:msg)
endif endif
endfunction " }}} endfunction " }}}
" From a path return a list [{name}, {func}, {type}] representing a healthcheck function! s:filepath_to_function(name) abort
function! s:filepath_to_healthcheck(path) abort return substitute(substitute(substitute(a:name, '.*autoload[\/]', '', ''),
if a:path =~# 'vim$' \ '\.vim', '#check', ''), '[\/]', '#', 'g')
let name = matchstr(a:path, '\zs[^\/]*\ze\.vim$')
let func = 'health#'.name.'#check'
let type = 'v'
else
let base_path = substitute(a:path,
\ '.*lua[\/]\(.\{-}\)[\/]health\([\/]init\)\?\.lua$',
\ '\1', '')
let name = substitute(base_path, '[\/]', '.', 'g')
let func = 'require("'.name.'.health").check()'
let type = 'l'
endif
return [name, func, type]
endfunction endfunction
function! s:discover_healthchecks() abort function! s:discover_health_checks() abort
return s:get_healthcheck('*') let healthchecks = globpath(&runtimepath, 'autoload/health/*.vim', 1, 1)
let healthchecks = map(healthchecks, '<SID>filepath_to_function(v:val)')
return healthchecks
endfunction endfunction
" Returns Dictionary {name: [func, type], ..} representing healthchecks " Translates a list of plugin names to healthcheck function names.
function! s:get_healthcheck(plugin_names) abort function! s:to_fn_names(plugin_names) abort
let health_list = s:get_healthcheck_list(a:plugin_names)
let healthchecks = {}
for c in health_list
let normalized_name = substitute(c[0], '-', '_', 'g')
let existent = get(healthchecks, normalized_name, [])
" Prefer Lua over vim entries
if existent != [] && existent[2] == 'l'
continue
else
let healthchecks[normalized_name] = c
endif
endfor
let output = {}
for v in values(healthchecks)
let output[v[0]] = v[1:]
endfor
return output
endfunction
" Returns list of lists [ [{name}, {func}, {type}] ] representing healthchecks
function! s:get_healthcheck_list(plugin_names) abort
let healthchecks = [] let healthchecks = []
let plugin_names = type('') == type(a:plugin_names) let plugin_names = type('') ==# type(a:plugin_names)
\ ? split(a:plugin_names, ' ', v:false) \ ? split(a:plugin_names, '', v:false)
\ : a:plugin_names \ : a:plugin_names
for p in plugin_names for p in plugin_names
" support vim/lsp/health{/init/}.lua as :checkhealth vim.lsp call add(healthchecks, 'health#'.p.'#check')
let p = substitute(p, '\.', '/', 'g')
let p = substitute(p, '*$', '**', 'g') " find all submodule e.g vim*
let paths = nvim_get_runtime_file('autoload/health/'.p.'.vim', v:true)
\ + nvim_get_runtime_file('lua/**/'.p.'/health/init.lua', v:true)
\ + nvim_get_runtime_file('lua/**/'.p.'/health.lua', v:true)
if len(paths) == 0
let healthchecks += [[p, '', '']] " healthcheck not found
else
let healthchecks += map(uniq(sort(paths)),
\'<SID>filepath_to_healthcheck(v:val)')
end
endfor endfor
return healthchecks return healthchecks
endfunction endfunction
" Extracts 'foo' from 'health#foo#check'.
function! s:to_plugin_name(fn_name) abort
return substitute(a:fn_name,
\ '\v.*health\#(.+)\#check.*', '\1', '')
endfunction

View File

@@ -104,8 +104,8 @@ function! s:check_rplugin_manifest() abort
if !has_key(existing_rplugins, script) if !has_key(existing_rplugins, script)
let msg = printf('"%s" is not registered.', fnamemodify(path, ':t')) let msg = printf('"%s" is not registered.', fnamemodify(path, ':t'))
if python_version ==# 'pythonx' if python_version ==# 'pythonx'
if !has('python3') if !has('python2') && !has('python3')
let msg .= ' (python3 not available)' let msg .= ' (python2 and python3 not available)'
endif endif
elseif !has(python_version) elseif !has(python_version)
let msg .= printf(' (%s not available)', python_version) let msg .= printf(' (%s not available)', python_version)
@@ -148,14 +148,14 @@ endfunction
function! s:get_tmux_option(option) abort function! s:get_tmux_option(option) abort
let cmd = 'tmux show-option -qvg '.a:option " try global scope 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') let val = substitute(out, '\v(\s|\r|\n)', '', 'g')
if v:shell_error if v:shell_error
call health#report_error('command failed: '.cmd."\n".out) call health#report_error('command failed: '.cmd."\n".out)
return 'error' return 'error'
elseif empty(val) elseif empty(val)
let cmd = 'tmux show-option -qvgs '.a:option " try session scope 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') let val = substitute(out, '\v(\s|\r|\n)', '', 'g')
if v:shell_error if v:shell_error
call health#report_error('command failed: '.cmd."\n".out) call health#report_error('command failed: '.cmd."\n".out)
@@ -202,11 +202,11 @@ function! s:check_tmux() abort
" check default-terminal and $TERM " check default-terminal and $TERM
call health#report_info('$TERM: '.$TERM) call health#report_info('$TERM: '.$TERM)
let cmd = 'tmux show-option -qvg default-terminal' 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') let tmux_default_term = substitute(out, '\v(\s|\r|\n)', '', 'g')
if empty(tmux_default_term) if empty(tmux_default_term)
let cmd = 'tmux show-option -qvgs default-terminal' 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') let tmux_default_term = substitute(out, '\v(\s|\r|\n)', '', 'g')
endif endif
@@ -225,7 +225,7 @@ function! s:check_tmux() abort
endif endif
" check for RGB capabilities " 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_tc = stridx(info, " Tc: (flag) true") != -1
let has_rgb = stridx(info, " RGB: (flag) true") != -1 let has_rgb = stridx(info, " RGB: (flag) true") != -1
if !has_tc && !has_rgb if !has_tc && !has_rgb
@@ -242,7 +242,7 @@ function! s:check_terminal() abort
endif endif
call health#report_start('terminal') call health#report_start('terminal')
let cmd = 'infocmp -L' let cmd = 'infocmp -L'
let out = system(split(cmd)) let out = system(cmd)
let kbs_entry = matchstr(out, 'key_backspace=[^,[:space:]]*') let kbs_entry = matchstr(out, 'key_backspace=[^,[:space:]]*')
let kdch1_entry = matchstr(out, 'key_dc=[^,[:space:]]*') let kdch1_entry = matchstr(out, 'key_dc=[^,[:space:]]*')

View File

@@ -282,10 +282,10 @@ function! s:disabled_via_loaded_var(provider) abort
return 0 return 0
endfunction endfunction
function! s:check_python() abort function! s:check_python(version) abort
call health#report_start('Python 3 provider (optional)') call health#report_start('Python ' . a:version . ' provider (optional)')
let pyname = 'python3' let pyname = 'python'.(a:version == 2 ? '' : '3')
let python_exe = '' let python_exe = ''
let venv = exists('$VIRTUAL_ENV') ? resolve($VIRTUAL_ENV) : '' let venv = exists('$VIRTUAL_ENV') ? resolve($VIRTUAL_ENV) : ''
let host_prog_var = pyname.'_host_prog' let host_prog_var = pyname.'_host_prog'
@@ -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))) call health#report_info(printf('Using: g:%s = "%s"', host_prog_var, get(g:, host_prog_var)))
endif endif
let [pyname, pythonx_warnings] = provider#pythonx#Detect(3) let [pyname, pythonx_errors] = provider#pythonx#Detect(a:version)
if empty(pyname) if empty(pyname)
call health#report_warn('No Python executable found that can `import neovim`. ' call health#report_warn('No Python executable found that can `import neovim`. '
@@ -311,9 +311,8 @@ function! s:check_python() abort
endif endif
" No Python executable could `import neovim`, or host_prog_var was used. " No Python executable could `import neovim`, or host_prog_var was used.
if !empty(pythonx_warnings) if !empty(pythonx_errors)
call health#report_warn(pythonx_warnings, ['See :help provider-python for more information.', call health#report_error('Python provider error:', pythonx_errors)
\ 'You may disable this provider (and warning) by adding `let g:loaded_python3_provider = 0` to your init.vim'])
elseif !empty(pyname) && empty(python_exe) elseif !empty(pyname) && empty(python_exe)
if !exists('g:'.host_prog_var) 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 " can import 'pynvim'. If so, that Python failed to import 'neovim' as
" well, which is most probably due to a failed pip upgrade: " well, which is most probably due to a failed pip upgrade:
" https://github.com/neovim/neovim/wiki/Following-HEAD#20181118 " 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) if !empty(pynvim_exe)
call health#report_error( call health#report_error(
\ 'Detected pip upgrade failure: Python executable can import "pynvim" but ' \ '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") \ . pynvim_exe ." -m pip install neovim # only if needed by third-party software")
endif endif
else 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.' . call health#report_warn('Unexpected Python version.' .
\ ' This could lead to confusing error messages.') \ ' This could lead to confusing error messages.')
endif endif
call health#report_info('Python version: ' . majorpyversion) call health#report_info('Python version: ' . pyversion)
if s:is_bad_response(status) if s:is_bad_response(status)
call health#report_info(printf('pynvim version: %s (%s)', current, 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 ' let hint = '$PATH ambiguities in subshells typically are '
\.'caused by your shell config overriding the $PATH previously set by the ' \.'caused by your shell config overriding the $PATH previously set by the '
\.'virtualenv. Either prevent them from doing so, or use this workaround: ' \.'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 let hints[hint] = v:true
endif endif
endfor endfor
@@ -566,7 +565,7 @@ function! s:check_ruby() abort
\ ['Install Ruby and verify that `ruby` and `gem` commands work.']) \ ['Install Ruby and verify that `ruby` and `gem` commands work.'])
return return
endif endif
call health#report_info('Ruby: '. s:system(['ruby', '-v'])) call health#report_info('Ruby: '. s:system('ruby -v'))
let [host, err] = provider#ruby#Detect() let [host, err] = provider#ruby#Detect()
if empty(host) 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 install neovim` to ensure the neovim RubyGem is installed.',
\ 'Run `gem environment` to ensure the gem bin directory is in $PATH.', \ 'Run `gem environment` to ensure the gem bin directory is in $PATH.',
\ 'If you are using rvm/rbenv/chruby, try "rehashing".', \ 'If you are using rvm/rbenv/chruby, try "rehashing".',
\ 'See :help g:ruby_host_prog for non-standard gem installations.', \ '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'])
return return
endif endif
call health#report_info('Host: '. host) call health#report_info('Host: '. host)
@@ -590,11 +588,11 @@ function! s:check_ruby() abort
endif endif
let latest_gem = get(split(latest_gem, 'neovim (\|, \|)$' ), 0, 'not found') 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) let current_gem = s:system(current_gem_cmd)
if s:shell_error if s:shell_error
call health#report_error('Failed to run: '. join(current_gem_cmd), call health#report_error('Failed to run: '. current_gem_cmd,
\ ['Report this issue with the output of: ', join(current_gem_cmd)]) \ ['Report this issue with the output of: ', current_gem_cmd])
return return
endif endif
@@ -621,7 +619,7 @@ function! s:check_node() abort
\ ['Install Node.js and verify that `node` and `npm` (or `yarn`) commands work.']) \ ['Install Node.js and verify that `node` and `npm` (or `yarn`) commands work.'])
return return
endif endif
let node_v = get(split(s:system(['node', '-v']), "\n"), 0, '') let node_v = get(split(s:system('node -v'), "\n"), 0, '')
call health#report_info('Node.js: '. node_v) call health#report_info('Node.js: '. node_v)
if s:shell_error || s:version_cmp(node_v[1:], '6.0.0') < 0 if s:shell_error || s:version_cmp(node_v[1:], '6.0.0') < 0
call health#report_warn('Nvim node.js host does not support '.node_v) call health#report_warn('Nvim node.js host does not support '.node_v)
@@ -636,8 +634,7 @@ function! s:check_node() abort
if empty(host) if empty(host)
call health#report_warn('Missing "neovim" npm (or yarn) package.', call health#report_warn('Missing "neovim" npm (or yarn) package.',
\ ['Run in shell: npm install -g neovim', \ ['Run in shell: npm install -g neovim',
\ 'Run in shell (if you use yarn): yarn global add neovim', \ 'Run in shell (if you use yarn): yarn global add neovim'])
\ 'You may disable this provider (and warning) by adding `let g:loaded_node_provider = 0` to your init.vim'])
return return
endif endif
call health#report_info('Nvim node.js host: '. host) 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_cmd = ['node', host, '--version']
let current_npm = s:system(current_npm_cmd) let current_npm = s:system(current_npm_cmd)
if s:shell_error if s:shell_error
call health#report_error('Failed to run: '. join(current_npm_cmd), call health#report_error('Failed to run: '. string(current_npm_cmd),
\ ['Report this issue with the output of: ', join(current_npm_cmd)]) \ ['Report this issue with the output of: ', string(current_npm_cmd)])
return return
endif endif
@@ -686,15 +683,14 @@ function! s:check_perl() abort
return return
endif endif
let [perl_exec, perl_warnings] = provider#perl#Detect() let [perl_exec, perl_errors] = provider#perl#Detect()
if empty(perl_exec) if empty(perl_exec)
if !empty(perl_warnings) if !empty(perl_errors)
call health#report_warn(perl_warnings, ['See :help provider-perl for more information.', call health#report_error('perl provider error:', perl_errors)
\ 'You may disable this provider (and warning) by adding `let g:loaded_perl_provider = 0` to your init.vim']) else
else
call health#report_warn('No usable perl executable found') call health#report_warn('No usable perl executable found')
endif endif
return return
endif endif
call health#report_info('perl executable: '. perl_exec) 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) let latest_cpan = s:system(latest_cpan_cmd)
if s:shell_error || empty(latest_cpan) 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.", \ ["Make sure you're connected to the internet.",
\ 'Are you behind a firewall or proxy?']) \ 'Are you behind a firewall or proxy?'])
return 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_cmd = [perl_exec, '-W', '-MNeovim::Ext', '-e', 'print $Neovim::Ext::VERSION']
let current_cpan = s:system(current_cpan_cmd) let current_cpan = s:system(current_cpan_cmd)
if s:shell_error if s:shell_error
call health#report_error('Failed to run: '. join(current_cpan_cmd), call health#report_error('Failed to run: '. string(current_cpan_cmd),
\ ['Report this issue with the output of: ', join(current_cpan_cmd)]) \ ['Report this issue with the output of: ', string(current_cpan_cmd)])
return return
endif endif
@@ -755,7 +751,8 @@ endfunction
function! health#provider#check() abort function! health#provider#check() abort
call s:check_clipboard() 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_virtualenv()
call s:check_ruby() call s:check_ruby()
call s:check_node() call s:check_node()

View 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

View File

@@ -486,7 +486,7 @@ function! htmlcomplete#CompleteTags(findstart, base)
endif endif
endif endif
" Value of attribute completion {{{ " Value of attribute completion {{{
" If attr contains =\s*[\"'] we match value of attribute " If attr contains =\s*[\"'] we catched value of attribute
if attr =~ "=\s*[\"']" || attr =~ "=\s*$" if attr =~ "=\s*[\"']" || attr =~ "=\s*$"
" Let do attribute specific completion " Let do attribute specific completion
let attrname = matchstr(attr, '.*\ze\s*=') let attrname = matchstr(attr, '.*\ze\s*=')

View File

@@ -7,6 +7,7 @@ let s:loaded_man = 1
let s:find_arg = '-w' let s:find_arg = '-w'
let s:localfile_arg = v:true " Always use -l if possible. #6683 let s:localfile_arg = v:true " Always use -l if possible. #6683
let s:section_arg = '-S'
function! man#init() abort function! man#init() abort
try try
@@ -57,7 +58,6 @@ function! man#open_page(count, mods, ...) abort
else else
execute 'silent keepalt' a:mods 'stag' l:target execute 'silent keepalt' a:mods 'stag' l:target
endif endif
call s:set_options(v:false)
finally finally
call setbufvar(l:buf, '&tagfunc', l:save_tfu) call setbufvar(l:buf, '&tagfunc', l:save_tfu)
endtry endtry
@@ -196,61 +196,27 @@ function! s:extract_sect_and_name_ref(ref) abort
if empty(name) if empty(name)
throw 'manpage reference cannot contain only parentheses' throw 'manpage reference cannot contain only parentheses'
endif endif
return ['', s:spaces_to_underscores(name)] return ['', name]
endif endif
let left = split(ref, '(') let left = split(ref, '(')
" see ':Man 3X curses' on why tolower. " see ':Man 3X curses' on why tolower.
" TODO(nhooyr) Not sure if this is portable across OSs " TODO(nhooyr) Not sure if this is portable across OSs
" but I have not seen a single uppercase section. " but I have not seen a single uppercase section.
return [tolower(split(left[1], ')')[0]), s:spaces_to_underscores(left[0])] return [tolower(split(left[1], ')')[0]), left[0]]
endfunction
" replace spaces in a man page name with underscores
" intended for PostgreSQL, which has man pages like 'CREATE_TABLE(7)';
" while editing SQL source code, it's nice to visually select 'CREATE TABLE'
" and hit 'K', which requires this transformation
function! s:spaces_to_underscores(str)
return substitute(a:str, ' ', '_', 'g')
endfunction endfunction
function! s:get_path(sect, name) abort function! s:get_path(sect, name) abort
" Some man implementations (OpenBSD) return all available paths from the " Some man implementations (OpenBSD) return all available paths from the
" search command. Previously, this function would simply select the first one. " search command, so we get() the first one. #8341
"
" 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.
if empty(a:sect) if empty(a:sect)
let results = split(s:system(['man', s:find_arg, a:name])) return substitute(get(split(s:system(['man', s:find_arg, a:name])), 0, ''), '\n\+$', '', '')
else
let results = split(s:system(['man', s:find_arg, a:sect, a:name]))
endif endif
" '-s' flag handles:
if empty(results) " - tokens like 'printf(echo)'
return '' " - sections starting with '-'
endif " - 3pcap section (found on macOS)
" - commas between sections (for section priority)
" find any that match the specified name return substitute(get(split(s:system(['man', s:find_arg, s:section_arg, a:sect, a:name])), 0, ''), '\n\+$', '', '')
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\+$', '', '')
endfunction endfunction
" s:verify_exists attempts to find the path to a manpage " 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. " then we don't do it again in step 2.
function! s:verify_exists(sect, name) abort function! s:verify_exists(sect, name) abort
let sect = a:sect let sect = a:sect
if empty(sect) if empty(sect)
" no section specified, so search with b:man_default_sects let sect = get(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
endif endif
" if none of the above worked, we will try with no section
try try
let res = s:get_path('', a:name) return s:get_path(sect, a:name)
if !empty(res)
return res
endif
catch /^command error (/ catch /^command error (/
endtry endtry
" if that still didn't work, we will check for $MANSECT and try again with it if !empty(get(b:, 'man_default_sects', '')) && sect !=# b:man_default_sects
" unset 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) if !empty($MANSECT)
try try
let MANSECT = $MANSECT let MANSECT = $MANSECT
call setenv('MANSECT', v:null) call setenv('MANSECT', v:null)
let res = s:get_path('', a:name) return s:get_path('', a:name)
if !empty(res)
return res
endif
catch /^command error (/ catch /^command error (/
finally finally
call setenv('MANSECT', MANSECT) call setenv('MANSECT', MANSECT)
endtry endtry
endif endif
" finally, if that didn't work, there is no hope
throw 'no manual entry for ' . a:name throw 'no manual entry for ' . a:name
endfunction endfunction

View File

@@ -56,7 +56,6 @@ function s:msgpack_init_python() abort
\. " time = datetime.datetime.fromtimestamp(timestamp)\n" \. " time = datetime.datetime.fromtimestamp(timestamp)\n"
\. " return time.strftime(fmt)\n" \. " return time.strftime(fmt)\n"
\. "def shada_dict_strptime():\n" \. "def shada_dict_strptime():\n"
\. " import calendar\n"
\. " import datetime\n" \. " import datetime\n"
\. " import vim\n" \. " import vim\n"
\. " fmt = vim.eval('a:format')\n" \. " fmt = vim.eval('a:format')\n"
@@ -65,10 +64,7 @@ function s:msgpack_init_python() abort
\. " try:\n" \. " try:\n"
\. " timestamp = int(timestamp.timestamp())\n" \. " timestamp = int(timestamp.timestamp())\n"
\. " except:\n" \. " except:\n"
\. " try:\n" \. " timestamp = int(timestamp.strftime('%s'))\n"
\. " timestamp = int(timestamp.strftime('%s'))\n"
\. " except:\n"
\. " timestamp = calendar.timegm(timestamp.utctimetuple())\n"
\. " if timestamp > 2 ** 31:\n" \. " if timestamp > 2 ** 31:\n"
\. " tsabs = abs(timestamp)\n" \. " tsabs = abs(timestamp)\n"
\. " return ('{\"_TYPE\": v:msgpack_types.integer,'\n" \. " return ('{\"_TYPE\": v:msgpack_types.integer,'\n"

View File

@@ -1,7 +1,7 @@
" netrw.vim: Handles file transfer and remote directory listing across " netrw.vim: Handles file transfer and remote directory listing across
" AUTOLOAD SECTION " AUTOLOAD SECTION
" Date: Aug 16, 2021 " Date: Sep 18, 2020
" Version: 171 " Version: 170
" Maintainer: Charles E Campbell <NcampObell@SdrPchip.AorgM-NOSPAM> " Maintainer: Charles E Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim " GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
" Copyright: Copyright (C) 2016 Charles E. Campbell {{{1 " Copyright: Copyright (C) 2016 Charles E. Campbell {{{1
@@ -43,7 +43,7 @@ if exists("s:needspatches")
endfor endfor
endif endif
let g:loaded_netrw = "v171" let g:loaded_netrw = "v170"
if !exists("s:NOTE") if !exists("s:NOTE")
let s:NOTE = 0 let s:NOTE = 0
let s:WARNING = 1 let s:WARNING = 1
@@ -93,7 +93,7 @@ fun! netrw#ErrorMsg(level,msg,errnum)
else else
let msg= level.a:msg let msg= level.a:msg
endif endif
let s:popuperr_id = popup_atcursor(msg,{}) let s:popuperr_id = popup_beval(msg,{})
let s:popuperr_text= "" let s:popuperr_text= ""
elseif g:netrw_use_errorwindow elseif g:netrw_use_errorwindow
" (default) netrw creates a one-line window to show error/warning " (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_browse_split", 0)
call s:NetrwInit("g:netrw_bufsettings" , "noma nomod nonu nobl nowrap ro nornu") 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_chgwin" , -1)
call s:NetrwInit("g:netrw_clipboard" , 1)
call s:NetrwInit("g:netrw_compress" , "gzip") call s:NetrwInit("g:netrw_compress" , "gzip")
call s:NetrwInit("g:netrw_ctags" , "ctags") call s:NetrwInit("g:netrw_ctags" , "ctags")
if exists("g:netrw_cursorline") && !exists("g:netrw_cursor") if exists("g:netrw_cursorline") && !exists("g:netrw_cursor")
@@ -332,7 +331,6 @@ endif
call s:NetrwInit("g:netrw_cursor" , 2) call s:NetrwInit("g:netrw_cursor" , 2)
let s:netrw_usercul = &cursorline let s:netrw_usercul = &cursorline
let s:netrw_usercuc = &cursorcolumn 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") call s:NetrwInit("g:netrw_cygdrive","/cygdrive")
" Default values - d-g ---------- {{{3 " Default values - d-g ---------- {{{3
call s:NetrwInit("s:didstarstar",0) call s:NetrwInit("s:didstarstar",0)
@@ -1608,8 +1606,7 @@ endfun
fun! s:NetrwOptionsSave(vt) fun! s:NetrwOptionsSave(vt)
" call Dfunc("s:NetrwOptionsSave(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">"." winnr($)=".winnr("$")." mod=".&mod." ma=".&ma) " 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(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("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("(s:NetrwOptionsSave) lines=".&lines)
if !exists("{a:vt}netrw_optionsave") if !exists("{a:vt}netrw_optionsave")
let {a:vt}netrw_optionsave= 1 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_cinokeep = &l:cino
let {a:vt}netrw_comkeep = &l:com let {a:vt}netrw_comkeep = &l:com
let {a:vt}netrw_cpokeep = &l:cpo 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_diffkeep = &l:diff
let {a:vt}netrw_fenkeep = &l:fen let {a:vt}netrw_fenkeep = &l:fen
if !exists("g:netrw_ffkeep") || g:netrw_ffkeep if !exists("g:netrw_ffkeep") || g:netrw_ffkeep
@@ -1645,11 +1639,9 @@ fun! s:NetrwOptionsSave(vt)
endif endif
let {a:vt}netrw_fokeep = &l:fo " formatoptions let {a:vt}netrw_fokeep = &l:fo " formatoptions
let {a:vt}netrw_gdkeep = &l:gd " gdefault 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_hidkeep = &l:hidden
let {a:vt}netrw_imkeep = &l:im let {a:vt}netrw_imkeep = &l:im
let {a:vt}netrw_iskkeep = &l:isk let {a:vt}netrw_iskkeep = &l:isk
let {a:vt}netrw_lines = &lines
let {a:vt}netrw_lskeep = &l:ls let {a:vt}netrw_lskeep = &l:ls
let {a:vt}netrw_makeep = &l:ma let {a:vt}netrw_makeep = &l:ma
let {a:vt}netrw_magickeep = &l:magic let {a:vt}netrw_magickeep = &l:magic
@@ -1701,18 +1693,12 @@ fun! s:NetrwOptionsSafe(islocal)
endif endif
call s:NetrwSetSafeSetting("&l:ci",0) call s:NetrwSetSafeSetting("&l:ci",0)
call s:NetrwSetSafeSetting("&l:cin",0) call s:NetrwSetSafeSetting("&l:cin",0)
if g:netrw_fastbrowse > a:islocal call s:NetrwSetSafeSetting("&l:bh","hide")
call s:NetrwSetSafeSetting("&l:bh","hide")
else
call s:NetrwSetSafeSetting("&l:bh","delete")
endif
call s:NetrwSetSafeSetting("&l:cino","") call s:NetrwSetSafeSetting("&l:cino","")
call s:NetrwSetSafeSetting("&l:com","") 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
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 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:hid",0)
call s:NetrwSetSafeSetting("&l:im",0) call s:NetrwSetSafeSetting("&l:im",0)
setl isk+=@ isk+=* isk+=/ setl isk+=@ isk+=* isk+=/
@@ -1726,10 +1712,7 @@ fun! s:NetrwOptionsSafe(islocal)
call s:NetrwSetSafeSetting("&l:tw",0) call s:NetrwSetSafeSetting("&l:tw",0)
call s:NetrwSetSafeSetting("&l:wig","") call s:NetrwSetSafeSetting("&l:wig","")
setl cedit& setl cedit&
call s:NetrwCursor()
" set up cuc and cul based on g:netrw_cursor and listing style
" COMBAK -- cuc cul related
call s:NetrwCursor(0)
" allow the user to override safe options " allow the user to override safe options
" call Decho("ft<".&ft."> ei=".&ei,'~'.expand("<slnum>")) " call Decho("ft<".&ft."> ei=".&ei,'~'.expand("<slnum>"))
@@ -1747,14 +1730,11 @@ endfun
" s:NetrwOptionsRestore: restore options (based on prior s:NetrwOptionsSave) {{{2 " s:NetrwOptionsRestore: restore options (based on prior s:NetrwOptionsSave) {{{2
fun! s:NetrwOptionsRestore(vt) fun! s:NetrwOptionsRestore(vt)
" call Dfunc("s:NetrwOptionsRestore(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> winnr($)=".winnr("$")) " 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>")) " 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") if !exists("{a:vt}netrw_optionsave")
" call Decho("case ".a:vt."netrw_optionsave : doesn't exist",'~'.expand("<slnum>")) " call Decho("case ".a:vt."netrw_optionsave : doesn't exist",'~'.expand("<slnum>"))
" call Decho("..doing filetype detect anyway") " 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>"))
filetype detect " 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") " call Dret("s:NetrwOptionsRestore : ".a:vt."netrw_optionsave doesn't exist")
return return
endif endif
@@ -1771,53 +1751,41 @@ fun! s:NetrwOptionsRestore(vt)
endif endif
endif 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_aikeep","&l:ai")
call s:NetrwRestoreSetting(a:vt."netrw_awkeep","&l:aw") call s:NetrwRestoreSetting(a:vt."netrw_awkeep","&l:aw")
call s:NetrwRestoreSetting(a:vt."netrw_blkeep","&l:bl") call s:NetrwRestoreSetting(a:vt."netrw_blkeep","&l:bl")
call s:NetrwRestoreSetting(a:vt."netrw_btkeep","&l:bt") call s:NetrwRestoreSetting(a:vt."netrw_btkeep","&l:bt")
call s:NetrwRestoreSetting(a:vt."netrw_bombkeep","&l:bomb") 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_cedit","&cedit")
call s:NetrwRestoreSetting(a:vt."netrw_cikeep","&l:ci") call s:NetrwRestoreSetting(a:vt."netrw_cikeep","&l:ci")
call s:NetrwRestoreSetting(a:vt."netrw_cinkeep","&l:cin") call s:NetrwRestoreSetting(a:vt."netrw_cinkeep","&l:cin")
call s:NetrwRestoreSetting(a:vt."netrw_cinokeep","&l:cino") call s:NetrwRestoreSetting(a:vt."netrw_cinokeep","&l:cino")
call s:NetrwRestoreSetting(a:vt."netrw_comkeep","&l:com") 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_cpokeep","&l:cpo")
call s:NetrwRestoreSetting(a:vt."netrw_diffkeep","&l:diff") call s:NetrwRestoreSetting(a:vt."netrw_diffkeep","&l:diff")
call s:NetrwRestoreSetting(a:vt."netrw_fenkeep","&l:fen") call s:NetrwRestoreSetting(a:vt."netrw_fenkeep","&l:fen")
if exists("g:netrw_ffkeep") && g:netrw_ffkeep if exists("g:netrw_ffkeep") && g:netrw_ffkeep
call s:NetrwRestoreSetting(a:vt."netrw_ffkeep")","&l:ff") call s:NetrwRestoreSetting(a:vt."netrw_ffkeep")","&l:ff")
endif endif
" call Decho("(s:NetrwOptionsRestore) #4 lines=".&lines) call s:NetrwRestoreSetting(a:vt."netrw_fokeep","&l:fo")
call s:NetrwRestoreSetting(a:vt."netrw_fokeep" ,"&l:fo") call s:NetrwRestoreSetting(a:vt."netrw_gdkeep","&l:gd")
call s:NetrwRestoreSetting(a:vt."netrw_gdkeep" ,"&l:gd") call s:NetrwRestoreSetting(a:vt."netrw_hidkeep","&l:hidden")
call s:NetrwRestoreSetting(a:vt."netrw_gokeep" ,"&l:go") call s:NetrwRestoreSetting(a:vt."netrw_imkeep","&l:im")
call s:NetrwRestoreSetting(a:vt."netrw_hidkeep" ,"&l:hidden") call s:NetrwRestoreSetting(a:vt."netrw_iskkeep","&l:isk")
" call Decho("(s:NetrwOptionsRestore) #5 lines=".&lines) call s:NetrwRestoreSetting(a:vt."netrw_lskeep","&l:ls")
call s:NetrwRestoreSetting(a:vt."netrw_imkeep" ,"&l:im") call s:NetrwRestoreSetting(a:vt."netrw_makeep","&l:ma")
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_magickeep","&l:magic") call s:NetrwRestoreSetting(a:vt."netrw_magickeep","&l:magic")
call s:NetrwRestoreSetting(a:vt."netrw_modkeep" ,"&l:mod") call s:NetrwRestoreSetting(a:vt."netrw_modkeep","&l:mod")
call s:NetrwRestoreSetting(a:vt."netrw_nukeep" ,"&l:nu") 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_rnukeep" ,"&l:rnu") call s:NetrwRestoreSetting(a:vt."netrw_repkeep","&l:report")
call s:NetrwRestoreSetting(a:vt."netrw_repkeep" ,"&l:report") call s:NetrwRestoreSetting(a:vt."netrw_rokeep","&l:ro")
call s:NetrwRestoreSetting(a:vt."netrw_rokeep" ,"&l:ro") call s:NetrwRestoreSetting(a:vt."netrw_selkeep","&l:sel")
call s:NetrwRestoreSetting(a:vt."netrw_selkeep" ,"&l:sel")
" call Decho("(s:NetrwOptionsRestore) #9 lines=".&lines)
call s:NetrwRestoreSetting(a:vt."netrw_spellkeep","&l:spell") call s:NetrwRestoreSetting(a:vt."netrw_spellkeep","&l:spell")
call s:NetrwRestoreSetting(a:vt."netrw_twkeep" ,"&l:tw") call s:NetrwRestoreSetting(a:vt."netrw_twkeep","&l:tw")
call s:NetrwRestoreSetting(a:vt."netrw_wigkeep" ,"&l:wig") call s:NetrwRestoreSetting(a:vt."netrw_wigkeep","&l:wig")
call s:NetrwRestoreSetting(a:vt."netrw_wrapkeep" ,"&l:wrap") call s:NetrwRestoreSetting(a:vt."netrw_wrapkeep","&l:wrap")
call s:NetrwRestoreSetting(a:vt."netrw_writekeep","&l:write") call s:NetrwRestoreSetting(a:vt."netrw_writekeep","&l:write")
" call Decho("(s:NetrwOptionsRestore) #10 lines=".&lines)
call s:NetrwRestoreSetting("s:yykeep","@@") call s:NetrwRestoreSetting("s:yykeep","@@")
" former problem: start with liststyle=0; press <i> : result, following line resets l:ts. " 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 " 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 " were having their filetype detect-generated settings overwritten by
" NetrwOptionRestore. " NetrwOptionRestore.
if &ft != "netrw" if &ft != "netrw"
" call Decho("before: filetype detect (ft=".&ft.")",'~'.expand("<slnum>")) " call Decho("filetype detect (ft=".&ft.")",'~'.expand("<slnum>"))
filetype detect filetype detect
" call Decho("after : filetype detect (ft=".&ft.")",'~'.expand("<slnum>"))
endif 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 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) " call Dret("s:NetrwOptionsRestore : tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> modified=".&modified." modifiable=".&modifiable." readonly=".&readonly)
endfun endfun
@@ -1913,7 +1879,7 @@ fun! s:NetrwRestoreSetting(keepvar,setting)
" typically called from s:NetrwOptionsRestore " typically called from s:NetrwOptionsRestore
" call s:NetrwRestoreSettings(keep-option-variable-name,'associated-option') " call s:NetrwRestoreSettings(keep-option-variable-name,'associated-option')
" ex. call s:NetrwRestoreSetting(a:vt."netrw_selkeep","&l:sel") " 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) if exists(a:keepvar)
exe "let keepvarval= ".a:keepvar exe "let keepvarval= ".a:keepvar
exe "let setting= ".a:setting exe "let setting= ".a:setting
@@ -2835,16 +2801,14 @@ fun! netrw#SetTreetop(iscmd,...)
" call Decho("inittreetop<".(exists("inittreetop")? inittreetop : "n/a").">") " call Decho("inittreetop<".(exists("inittreetop")? inittreetop : "n/a").">")
if (a:iscmd == 0 || a:1 == "") && exists("inittreetop") if (a:iscmd == 0 || a:1 == "") && exists("inittreetop")
let treedir = s:NetrwTreePath(inittreetop) let treedir= s:NetrwTreePath(inittreetop)
" call Decho("treedir<".treedir.">",'~'.expand("<slnum>")) " call Decho("treedir<".treedir.">",'~'.expand("<slnum>"))
else else
if isdirectory(s:NetrwFile(a:1)) if isdirectory(s:NetrwFile(a:1))
" call Decho("a:1<".a:1."> is a directory",'~'.expand("<slnum>")) " call Decho("a:1<".a:1."> is a directory",'~'.expand("<slnum>"))
let treedir = a:1 let treedir= a:1
let s:netrw_treetop = treedir
elseif exists("b:netrw_curdir") && (isdirectory(s:NetrwFile(b:netrw_curdir."/".a:1)) || a:1 =~ '^\a\{3,}://') 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 treedir= b:netrw_curdir."/".a:1
let s:netrw_treetop = treedir
" call Decho("a:1<".a:1."> is NOT a directory, using treedir<".treedir.">",'~'.expand("<slnum>")) " call Decho("a:1<".a:1."> is NOT a directory, using treedir<".treedir.">",'~'.expand("<slnum>"))
else else
" normally the cursor is left in the message window. " normally the cursor is left in the message window.
@@ -2852,8 +2816,7 @@ fun! netrw#SetTreetop(iscmd,...)
let netrwbuf= bufnr("%") let netrwbuf= bufnr("%")
call netrw#ErrorMsg(s:ERROR,"sorry, ".a:1." doesn't seem to be a directory!",95) call netrw#ErrorMsg(s:ERROR,"sorry, ".a:1." doesn't seem to be a directory!",95)
exe bufwinnr(netrwbuf)."wincmd w" exe bufwinnr(netrwbuf)."wincmd w"
let treedir = "." let treedir= "."
let s:netrw_treetop = getcwd()
endif endif
endif endif
" call Decho("treedir<".treedir.">",'~'.expand("<slnum>")) " call Decho("treedir<".treedir.">",'~'.expand("<slnum>"))
@@ -4108,7 +4071,6 @@ fun! s:NetrwFileInfo(islocal,fname)
elseif g:netrw_sizestyle =~# 'h' elseif g:netrw_sizestyle =~# 'h'
let lsopt= "-lsadh --si" let lsopt= "-lsadh --si"
endif endif
" call Decho("(s:NetrwFileInfo) lsopt<".lsopt.">")
if (has("unix") || has("macunix")) && executable("/bin/ls") if (has("unix") || has("macunix")) && executable("/bin/ls")
if getline(".") == "../" if getline(".") == "../"
@@ -4170,10 +4132,9 @@ endfun
" s:NetrwGetBuffer: [get a new|find an old netrw] buffer for a netrw listing {{{2 " s:NetrwGetBuffer: [get a new|find an old netrw] buffer for a netrw listing {{{2
" returns 0=cleared buffer " returns 0=cleared buffer
" 1=re-used buffer (buffer not cleared) " 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) fun! s:NetrwGetBuffer(islocal,dirname)
" call Dfunc("s:NetrwGetBuffer(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".g:netrw_liststyle) " 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 Decho("netrwbuf dictionary=".(exists("s:netrwbuf")? string(s:netrwbuf) : 'n/a'),'~'.expand("<slnum>"))
" call Dredir("ls!","s:NetrwGetBuffer") " call Dredir("ls!","s:NetrwGetBuffer")
let dirname= a:dirname let dirname= a:dirname
@@ -4223,26 +4184,17 @@ fun! s:NetrwGetBuffer(islocal,dirname)
endif endif
" call Decho(" bufnum#".bufnum,'~'.expand("<slnum>")) " call Decho(" bufnum#".bufnum,'~'.expand("<slnum>"))
" hijack the current buffer " highjack the current buffer if
" IF the buffer already has the desired name " it has the desired name
" AND it is empty " it is empty
let curbuf = bufname("%") " call Decho("deciding if I can highjack the current buffer#".bufnr("%"),'~'.expand("<slnum>"))
if curbuf == '.' " call Decho("..dirname<".dirname.">",'~'.expand("<slnum>"))
let curbuf = getcwd() " call Decho("..bufname<".bufname("%").">",'~'.expand("<slnum>"))
endif " call Decho("..getline($)<".getline("$").">",'~'.expand("<slnum>"))
" call Dredir("ls!","NetrwGetFile (renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">)") if dirname == bufname("%") && line("$") == 1 && getline("%") == ""
" 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("%") == ""
" call Dret("s:NetrwGetBuffer 0<cleared buffer> : highjacking buffer#".bufnr("%")) " call Dret("s:NetrwGetBuffer 0<cleared buffer> : highjacking buffer#".bufnr("%"))
return 0 return 0
else " DEBUG
" call Decho("..did NOT hijack buffer",'~'.expand("<slnum>"))
endif 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 " get enew buffer and name it -or- re-use buffer {{{3
if bufnum < 0 " get enew buffer and name it if bufnum < 0 " get enew buffer and name it
@@ -4567,7 +4519,7 @@ fun! s:NetrwListStyle(islocal)
" refresh the listing " refresh the listing
" call Decho("refresh the listing",'~'.expand("<slnum>")) " call Decho("refresh the listing",'~'.expand("<slnum>"))
NetrwKeepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) 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 " repoint t:netrw_lexbufnr if appropriate
if exists("repointlexbufnr") if exists("repointlexbufnr")
@@ -4773,7 +4725,7 @@ fun! s:NetrwBrowseChgDir(islocal,newdir,...)
endif endif
" call Decho("b:netrw_curdir<".b:netrw_curdir.">") " 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 Decho("saving options",'~'.expand("<slnum>"))
call s:SavePosn(s:netrw_posn) call s:SavePosn(s:netrw_posn)
NetrwKeepj call s:NetrwOptionsSave("s:") 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:\)' 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: 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>")) " 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) let dirname= s:NetrwTreeDir(a:islocal)
"COMBAK : not working for a symlink -- but what about a regular file? a directory? "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?") " 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) exe "NetrwKeepj e ".fnameescape(dirname)
endif endif
" call Decho("edit-a-file: after e! ".dirname.": hidden=".&hidden." bufhidden<".&bufhidden."> mod=".&mod,'~'.expand("<slnum>")) " call Decho("edit-a-file: after e! ".dirname.": hidden=".&hidden." bufhidden<".&bufhidden."> mod=".&mod,'~'.expand("<slnum>"))
" COMBAK -- cuc cul related call s:NetrwCursor()
call s:NetrwCursor(1)
if &hidden || &bufhidden == "hide" if &hidden || &bufhidden == "hide"
" file came from vim's hidden storage. Don't "restore" options with it. " file came from vim's hidden storage. Don't "restore" options with it.
let dorestore= 0 let dorestore= 0
@@ -4978,8 +4927,8 @@ fun! s:NetrwBrowseChgDir(islocal,newdir,...)
elseif type(g:Netrw_funcref) == 3 elseif type(g:Netrw_funcref) == 3
" call Decho("edit-a-file: handling a list of g:Netrw_funcrefs",'~'.expand("<slnum>")) " call Decho("edit-a-file: handling a list of g:Netrw_funcrefs",'~'.expand("<slnum>"))
for Fncref in g:Netrw_funcref for Fncref in g:Netrw_funcref
if type(Fncref) == 2 if type(FncRef) == 2
NetrwKeepj call Fncref() NetrwKeepj call FncRef()
endif endif
endfor endfor
endif endif
@@ -5271,12 +5220,6 @@ fun! netrw#BrowseX(fname,remote)
endif endif
" call Decho("not a local file nor a webpage request",'~'.expand("<slnum>")) " 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 ykeep = @@
let screenposn = winsaveview() let screenposn = winsaveview()
" call Decho("saving posn to screenposn<".string(screenposn).">",'~'.expand("<slnum>")) " call Decho("saving posn to screenposn<".string(screenposn).">",'~'.expand("<slnum>"))
@@ -5321,9 +5264,9 @@ fun! netrw#BrowseX(fname,remote)
endif endif
" call Decho("exten<".exten.">",'~'.expand("<slnum>")) " call Decho("exten<".exten.">",'~'.expand("<slnum>"))
if remote == 1 if a:remote == 1
" create a local copy " 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 setl bh=delete
call netrw#NetRead(3,a:fname) call netrw#NetRead(3,a:fname)
" attempt to rename tempfile " attempt to rename tempfile
@@ -5345,7 +5288,7 @@ fun! netrw#BrowseX(fname,remote)
let fname= s:netrw_tmpfile let fname= s:netrw_tmpfile
endif endif
else 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 let fname= a:fname
" special ~ handler for local " special ~ handler for local
if fname =~ '^\~' && expand("$HOME") != "" if fname =~ '^\~' && expand("$HOME") != ""
@@ -5439,8 +5382,8 @@ fun! netrw#BrowseX(fname,remote)
if a:fname =~ '^https\=://' if a:fname =~ '^https\=://'
" atril does not appear to understand how to handle html -- so use gvim to edit the document " atril does not appear to understand how to handle html -- so use gvim to edit the document
let use_ctrlo= 0 let use_ctrlo= 0
" call Decho("fname<".fname.">") " call Decho("(COMBAK) fname<".fname.">")
" call Decho("a:fname<".a:fname.">") " call Decho("(COMBAK) a:fname<".a:fname.">")
call s:NetrwExe("sil! !gvim ".fname.' -c "keepj keepalt file '.fnameescape(a:fname).'"') call s:NetrwExe("sil! !gvim ".fname.' -c "keepj keepalt file '.fnameescape(a:fname).'"')
else else
@@ -5488,12 +5431,12 @@ fun! netrw#BrowseX(fname,remote)
" return to prior buffer (directory listing) " return to prior buffer (directory listing)
" Feb 12, 2008: had to de-activiate removal of " Feb 12, 2008: had to de-activiate removal of
" temporary file because it wasn't getting seen. " 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 Decho("deleting temporary file<".fname.">",'~'.expand("<slnum>"))
" call s:NetrwDelete(fname) " call s:NetrwDelete(fname)
" endif " endif
if remote == 1 if a:remote == 1
setl bh=delete bt=nofile setl bh=delete bt=nofile
if g:netrw_use_noswf if g:netrw_use_noswf
setl noswf setl noswf
@@ -5552,7 +5495,7 @@ fun! s:NetrwBufRename(newname)
let b:junk= 1 let b:junk= 1
" call Decho("rename buffer: sil! keepj keepalt file ".fnameescape(a:newname),'~'.expand("<slnum>")) " call Decho("rename buffer: sil! keepj keepalt file ".fnameescape(a:newname),'~'.expand("<slnum>"))
exe 'sil! keepj keepalt file '.fnameescape(a:newname) 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) let oldbufnr= bufnr(oldbufname)
" call Decho("oldbufname<".oldbufname."> oldbufnr#".oldbufnr,'~'.expand("<slnum>")) " call Decho("oldbufname<".oldbufname."> oldbufnr#".oldbufnr,'~'.expand("<slnum>"))
" call Decho("bufnr(%)=".bufnr("%"),'~'.expand("<slnum>")) " call Decho("bufnr(%)=".bufnr("%"),'~'.expand("<slnum>"))
@@ -5561,9 +5504,6 @@ fun! s:NetrwBufRename(newname)
exe "bwipe! ".oldbufnr exe "bwipe! ".oldbufnr
" else " Decho " else " Decho
" call Decho("did *not* bwipe buf#".oldbufnr,'~'.expand("<slnum>")) " 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 endif
" call Dredir("ls!","s:NetrwBufRename (after rename)") " call Dredir("ls!","s:NetrwBufRename (after rename)")
" else " Decho " else " Decho
@@ -6542,7 +6482,7 @@ fun! s:NetrwMaps(islocal)
if !hasmapto('<Plug>NetrwRefresh') if !hasmapto('<Plug>NetrwRefresh')
nmap <buffer> <unique> <c-l> <Plug>NetrwRefresh nmap <buffer> <unique> <c-l> <Plug>NetrwRefresh
endif 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") if s:didstarstar || !mapcheck("<s-down>","n")
nnoremap <buffer> <silent> <s-down> :Nexplore<cr> nnoremap <buffer> <silent> <s-down> :Nexplore<cr>
endif endif
@@ -6791,7 +6731,7 @@ fun! s:NetrwMarkFile(islocal,fname)
" sanity check " sanity check
if empty(a:fname) if empty(a:fname)
" call Dret("s:NetrwMarkFile : empty fname") " call Dret("s:NetrwMarkFile : emtpy fname")
return return
endif endif
let curdir = s:NetrwGetCurdir(a:islocal) let curdir = s:NetrwGetCurdir(a:islocal)
@@ -8170,23 +8110,6 @@ fun! s:NetrwOpenFile(islocal)
call inputsave() call inputsave()
let fname= input("Enter filename: ") let fname= input("Enter filename: ")
call inputrestore() 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 fname !~ '[/\\]'
if exists("b:netrw_curdir") if exists("b:netrw_curdir")
if exists("g:netrw_quiet") if exists("g:netrw_quiet")
@@ -8525,7 +8448,6 @@ fun! s:NetrwPrevWinOpen(islocal)
let lastwinnr = winnr("$") let lastwinnr = winnr("$")
let curword = s:NetrwGetWord() let curword = s:NetrwGetWord()
let choice = 0 let choice = 0
let s:prevwinopen= 1 " lets s:NetrwTreeDir() know that NetrwPrevWinOpen called it
let s:treedir = s:NetrwTreeDir(a:islocal) let s:treedir = s:NetrwTreeDir(a:islocal)
let curdir = s:treedir let curdir = s:treedir
" call Decho("winnr($)#".lastwinnr." curword<".curword.">",'~'.expand("<slnum>")) " 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 : 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 " 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 " 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>")) " call Decho("exe ".(g:netrw_alto? "top " : "bot ").(g:netrw_preview? "vert " : "")."pedit ".fnameescape(a:path),'~'.expand("<slnum>"))
let eikeep = &ei 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("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_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("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 " 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 let treedir= s:treedir
unlet s:treedir unlet s:treedir
unlet s:prevwinopen " call Dret("s:NetrwTreeDir ".treedir)
" call Dret("s:NetrwTreeDir ".treedir.": early return since s:treedir existed previously")
return treedir return treedir
endif endif
if exists("s:prevwinopen")
unlet s:prevwinopen
endif
if !exists("b:netrw_curdir") || b:netrw_curdir == "" if !exists("b:netrw_curdir") || b:netrw_curdir == ""
let b:netrw_curdir= getcwd() let b:netrw_curdir= getcwd()
@@ -9508,29 +9424,20 @@ endfun
" Called by s:PerformListing() " Called by s:PerformListing()
fun! s:NetrwTreeListing(dirname) fun! s:NetrwTreeListing(dirname)
if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST 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("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("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>")) " 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 " update the treetop
" call Decho("update the treetop",'~'.expand("<slnum>"))
if !exists("w:netrw_treetop") 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 w:netrw_treetop= a:dirname
let s:netrw_treetop= w:netrw_treetop
" call Decho("w:netrw_treetop<".w:netrw_treetop."> (reusing)",'~'.expand("<slnum>")) " 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) 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 w:netrw_treetop= a:dirname
let s:netrw_treetop= w:netrw_treetop
" call Decho("w:netrw_treetop<".w:netrw_treetop."> (went up)",'~'.expand("<slnum>")) " call Decho("w:netrw_treetop<".w:netrw_treetop."> (went up)",'~'.expand("<slnum>"))
endif 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") if !exists("w:netrw_treedict")
" insure that we have a treedict, albeit empty " insure that we have a treedict, albeit empty
@@ -9568,7 +9475,7 @@ fun! s:NetrwTreeListing(dirname)
exe "setl ".g:netrw_bufsettings exe "setl ".g:netrw_bufsettings
" call Dret("s:NetrwTreeListing : bufname<".expand("%").">") " call Dret("NetrwTreeListing : bufname<".expand("%").">")
return return
endif endif
endfun endfun
@@ -10712,7 +10619,7 @@ endfun
" --------------------------------------------------------------------- " ---------------------------------------------------------------------
" netrw#LocalBrowseCheck: {{{2 " netrw#LocalBrowseCheck: {{{2
fun! netrw#LocalBrowseCheck(dirname) 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) " 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 " 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". " Hiding a buffer means that it will be re-used when examined, hence "fast".
" (re-using a buffer may not be as accurate) " (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. " =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. " 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. " 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) let sz= s:NetrwHumanReadable(sz)
endif endif
let longfile= printf("%-".(g:netrw_maxfilenamelen+1)."s",pfile) 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>")) " call Decho("longlist support: sz=".sz." fsz=".fsz,'~'.expand("<slnum>"))
endif endif
if g:netrw_sort_by =~# "^t" if g:netrw_sort_by =~# "^t"
" sort by time (handles time up to 1 quintillion seconds, US) " 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. " 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>")) " call Decho("getftime(".filename.")=".getftime(filename),'~'.expand("<slnum>"))
let t = getftime(filename) let t = getftime(filename)
let ft = strpart("000000000000000000",1,18-strlen(t)).t let ft = strpart("000000000000000000",1,18-strlen(t)).t
@@ -11042,7 +10948,6 @@ fun! s:LocalListing()
elseif g:netrw_sort_by =~ "^s" elseif g:netrw_sort_by =~ "^s"
" sort by size (handles file sizes up to 1 quintillion bytes, US) " 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>")) " call Decho("getfsize(".filename.")=".getfsize(filename),'~'.expand("<slnum>"))
let sz = getfsize(filename) let sz = getfsize(filename)
if g:netrw_sizestyle =~# "[hH]" if g:netrw_sizestyle =~# "[hH]"
@@ -11055,7 +10960,6 @@ fun! s:LocalListing()
else else
" sort by name " sort by name
" call Decho("implementing g:netrw_sort_by=".g:netrw_sort_by." (name)")
" call Decho("exe NetrwKeepj put ='".pfile."'",'~'.expand("<slnum>")) " call Decho("exe NetrwKeepj put ='".pfile."'",'~'.expand("<slnum>"))
sil! NetrwKeepj put=pfile sil! NetrwKeepj put=pfile
endif endif
@@ -11778,32 +11682,19 @@ endfun
" --------------------------------------------------------------------- " ---------------------------------------------------------------------
" s:NetrwCursor: responsible for setting cursorline/cursorcolumn based upon g:netrw_cursor {{{2 " 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") if !exists("w:netrw_liststyle")
let w:netrw_liststyle= g:netrw_liststyle let w:netrw_liststyle= g:netrw_liststyle
endif 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 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 &ft != "netrw"
" if the current window isn't a netrw directory listing window, then use user cursorline/column " 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. " 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>")) " 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 elseif g:netrw_cursor == 4
" all styles: cursorline, cursorcolumn " all styles: cursorline, cursorcolumn
" call Decho("case g:netrw_cursor==4: setl cul cuc",'~'.expand("<slnum>")) " call Decho("case g:netrw_cursor==4: setl cul cuc",'~'.expand("<slnum>"))
@@ -11820,22 +11711,26 @@ fun! s:NetrwCursor(editfile)
else else
" call Decho("case g:netrw_cursor==3 and not wide: setl cul (use user's cuc)",'~'.expand("<slnum>")) " call Decho("case g:netrw_cursor==3 and not wide: setl cul (use user's cuc)",'~'.expand("<slnum>"))
setl cursorline setl cursorline
let &l:cursorcolumn = s:netrw_usercuc
endif endif
elseif g:netrw_cursor == 2 elseif g:netrw_cursor == 2
" thin-long-tree: cursorline, user's cursorcolumn " thin-long-tree: cursorline, user's cursorcolumn
" wide : cursorline, user's cursorcolumn " wide : cursorline, user's cursorcolumn
" call Decho("case g:netrw_cursor==2: setl cuc (use user's cul)",'~'.expand("<slnum>")) " call Decho("case g:netrw_cursor==2: setl cuc (use user's cul)",'~'.expand("<slnum>"))
let &l:cursorcolumn = s:netrw_usercuc
setl cursorline setl cursorline
elseif g:netrw_cursor == 1 elseif g:netrw_cursor == 1
" thin-long-tree: user's cursorline, user's cursorcolumn " thin-long-tree: user's cursorline, user's cursorcolumn
" wide : cursorline, user's cursorcolumn " wide : cursorline, user's cursorcolumn
let &l:cursorcolumn = s:netrw_usercuc
if w:netrw_liststyle == s:WIDELIST if w:netrw_liststyle == s:WIDELIST
" call Decho("case g:netrw_cursor==2 and wide: setl cul (use user's cuc)",'~'.expand("<slnum>")) " call Decho("case g:netrw_cursor==2 and wide: setl cul (use user's cuc)",'~'.expand("<slnum>"))
setl cursorline setl cursorline
else else
" call Decho("case g:netrw_cursor==2 and not wide: (use user's cul,cuc)",'~'.expand("<slnum>")) " call Decho("case g:netrw_cursor==2 and not wide: (use user's cul,cuc)",'~'.expand("<slnum>"))
let &l:cursorline = s:netrw_usercul
endif endif
else else
@@ -11845,7 +11740,6 @@ fun! s:NetrwCursor(editfile)
let &l:cursorcolumn = s:netrw_usercuc let &l:cursorcolumn = s:netrw_usercuc
endif endif
" call Decho("(s:NetrwCursor) COMBAK: cuc=".&l:cuc." cul=".&l:cul)
" call Dret("s:NetrwCursor : l:cursorline=".&l:cursorline." l:cursorcolumn=".&l:cursorcolumn) " call Dret("s:NetrwCursor : l:cursorline=".&l:cursorline." l:cursorcolumn=".&l:cursorcolumn)
endfun endfun
@@ -11859,7 +11753,6 @@ fun! s:RestoreCursorline()
if exists("s:netrw_usercuc") if exists("s:netrw_usercuc")
let &l:cursorcolumn = s:netrw_usercuc let &l:cursorcolumn = s:netrw_usercuc
endif endif
" call Decho("(s:RestoreCursorline) COMBAK: cuc=".&l:cuc." cul=".&l:cul)
" call Dret("s:RestoreCursorline : restored cul=".&l:cursorline." cuc=".&l:cursorcolumn) " call Dret("s:RestoreCursorline : restored cul=".&l:cursorline." cuc=".&l:cursorcolumn)
endfun endfun
@@ -11894,38 +11787,12 @@ fun! s:NetrwDelete(path)
return result return result
endfun 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 " s:NetrwEnew: opens a new buffer, passes netrw buffer variables through {{{2
fun! s:NetrwEnew(...) fun! s:NetrwEnew(...)
" call Dfunc("s:NetrwEnew() a:0=".a:0." win#".winnr()." winnr($)=".winnr("$")." bufnr($)=".bufnr("$")." expand(%)<".expand("%").">") " 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>")) " 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 " grab a function-local-variable copy of buffer variables
" call Decho("make function-local copy of netrw variables",'~'.expand("<slnum>")) " call Decho("make function-local copy of netrw variables",'~'.expand("<slnum>"))
if exists("b:netrw_bannercnt") |let netrw_bannercnt = b:netrw_bannercnt |endif if exists("b:netrw_bannercnt") |let netrw_bannercnt = b:netrw_bannercnt |endif

View File

@@ -1,7 +1,7 @@
" netrwSettings.vim: makes netrw settings simpler " netrwSettings.vim: makes netrw settings simpler
" Date: Aug 12, 2021 " Date: Nov 09, 2016
" Maintainer: Charles E Campbell <NcampObell@SdrPchip.AorgM-NOSPAM> " Maintainer: Charles E Campbell <NcampObell@SdrPchip.AorgM-NOSPAM>
" Version: 17 ASTRO-ONLY " Version: 16
" Copyright: Copyright (C) 1999-2007 Charles E. Campbell {{{1 " Copyright: Copyright (C) 1999-2007 Charles E. Campbell {{{1
" Permission is hereby granted to use and distribute this code, " Permission is hereby granted to use and distribute this code,
" with or without modifications, provided that this copyright " with or without modifications, provided that this copyright
@@ -19,7 +19,7 @@
if exists("g:loaded_netrwSettings") || &cp if exists("g:loaded_netrwSettings") || &cp
finish finish
endif endif
let g:loaded_netrwSettings = "v17" let g:loaded_netrwSettings = "v16"
if v:version < 700 if v:version < 700
echohl WarningMsg echohl WarningMsg
echo "***warning*** this version of netrwSettings needs vim 7.0" echo "***warning*** this version of netrwSettings needs vim 7.0"
@@ -31,7 +31,7 @@ endif
" NetrwSettings: {{{1 " NetrwSettings: {{{1
fun! netrwSettings#NetrwSettings() fun! netrwSettings#NetrwSettings()
" this call is here largely just to insure that netrw has been loaded " this call is here largely just to insure that netrw has been loaded
call netrw#WinPath("") call netrw#SavePosn()
if !exists("g:loaded_netrw") if !exists("g:loaded_netrw")
echohl WarningMsg | echomsg "***sorry*** netrw needs to be loaded prior to using NetrwSettings" | echohl None echohl WarningMsg | echomsg "***sorry*** netrw needs to be loaded prior to using NetrwSettings" | echohl None
return return

View File

@@ -9,7 +9,7 @@
" "
" let g:phpcomplete_relax_static_constraint = 1/0 [default 0] " let g:phpcomplete_relax_static_constraint = 1/0 [default 0]
" Enables completion for non-static methods when completing for static context (::). " Enables completion for non-static methods when completing for static context (::).
" This generates E_STRICT level warning, but php calls these methods nonetheless. " This generates E_STRICT level warning, but php calls these methods nontheless.
" "
" let g:phpcomplete_complete_for_unknown_classes = 1/0 [default 0] " let g:phpcomplete_complete_for_unknown_classes = 1/0 [default 0]
" Enables completion of variables and functions in "everything under the sun" fashion " Enables completion of variables and functions in "everything under the sun" fashion
@@ -28,7 +28,7 @@
" This option controls the number of characters the user needs to type before " This option controls the number of characters the user needs to type before
" the tags will be searched for namespaces and classes in typed out namespaces in " the tags will be searched for namespaces and classes in typed out namespaces in
" "use ..." context. Setting this to 0 is not recommended because that means the code " "use ..." context. Setting this to 0 is not recommended because that means the code
" have to scan every tag, and vim's taglist() function runs extremely slow with a " have to scan every tag, and vim's taglist() function runs extremly slow with a
" "match everything" pattern. " "match everything" pattern.
" "
" let g:phpcomplete_parse_docblock_comments = 1/0 [default 0] " let g:phpcomplete_parse_docblock_comments = 1/0 [default 0]
@@ -268,7 +268,7 @@ function! phpcomplete#CompleteUse(base) " {{{
call add(no_namespace_matches, {'word': namespace_for_class.'\'.tag.name, 'kind': tag.kind, 'menu': tag.filename, 'info': tag.filename }) call add(no_namespace_matches, {'word': namespace_for_class.'\'.tag.name, 'kind': tag.kind, 'menu': tag.filename, 'info': tag.filename })
endif endif
endfor endfor
" if it seems that the tags file have namespace information we can safely throw " if it seems that the tags file have namespace informations we can safely throw
" away namespaceless tag matches since we can be sure they are invalid " away namespaceless tag matches since we can be sure they are invalid
if patched_ctags_detected if patched_ctags_detected
no_namespace_matches = [] no_namespace_matches = []
@@ -810,7 +810,7 @@ function! phpcomplete#CompleteClassName(base, kinds, current_namespace, imports)
endif endif
endfor endfor
" resolve the typed in part with namespaces (if there's a \ in it) " resolve the typed in part with namespaces (if theres a \ in it)
let [tag_match_pattern, namespace_for_class] = phpcomplete#ExpandClassName(a:base, a:current_namespace, a:imports) let [tag_match_pattern, namespace_for_class] = phpcomplete#ExpandClassName(a:base, a:current_namespace, a:imports)
let tags = [] let tags = []
@@ -926,11 +926,11 @@ function! s:getNextCharWithPos(filelines, current_pos) " {{{
endfunction " }}} endfunction " }}}
function! phpcomplete#EvaluateModifiers(modifiers, required_modifiers, prohibited_modifiers) " {{{ function! phpcomplete#EvaluateModifiers(modifiers, required_modifiers, prohibited_modifiers) " {{{
" if there's no modifier, and no modifier is allowed and no modifier is required " if theres no modifier, and no modifier is allowed and no modifier is required
if len(a:modifiers) == 0 && len(a:required_modifiers) == 0 if len(a:modifiers) == 0 && len(a:required_modifiers) == 0
return 1 return 1
else else
" check if every required modifier is present " check if every requred modifier is present
for required_modifier in a:required_modifiers for required_modifier in a:required_modifiers
if index(a:modifiers, required_modifier) == -1 if index(a:modifiers, required_modifier) == -1
return 0 return 0
@@ -1258,7 +1258,7 @@ function! phpcomplete#GetCurrentInstruction(line_number, col_number, phpbegin) "
endif endif
endif endif
" save the coma position for later use if there's a "naked" , possibly separating a parameter and it is not in a parented part " save the coma position for later use if theres a "naked" , possibly separating a parameter and it is not in a parented part
if first_coma_break_pos == -1 && current_char == ',' if first_coma_break_pos == -1 && current_char == ','
let first_coma_break_pos = len(instruction) let first_coma_break_pos = len(instruction)
endif endif
@@ -1304,7 +1304,7 @@ function! phpcomplete#GetCurrentInstruction(line_number, col_number, phpbegin) "
" there were a "naked" coma in the instruction " there were a "naked" coma in the instruction
if first_coma_break_pos != -1 if first_coma_break_pos != -1
if instruction !~? '^use' && instruction !~? '^class' " use ... statements and class declarations should not be broken up by comas if instruction !~? '^use' && instruction !~? '^class' " use ... statements and class delcarations should not be broken up by comas
let pos = (-1 * first_coma_break_pos) + 1 let pos = (-1 * first_coma_break_pos) + 1
let instruction = instruction[pos :] let instruction = instruction[pos :]
endif endif
@@ -1316,7 +1316,7 @@ function! phpcomplete#GetCurrentInstruction(line_number, col_number, phpbegin) "
" clear everything up until the first ( " clear everything up until the first (
let instruction = substitute(instruction, '^\(if\|while\|foreach\|for\)\s*(\s*', '', '') let instruction = substitute(instruction, '^\(if\|while\|foreach\|for\)\s*(\s*', '', '')
" lets iterate through the instruction until we can find the pair for the opening ( " lets iterate trough the instruction until we can find the pair for the opening (
let i = 0 let i = 0
let depth = 1 let depth = 1
while i < len(instruction) while i < len(instruction)
@@ -1424,7 +1424,7 @@ function! phpcomplete#GetCallChainReturnType(classname_candidate, class_candidat
let parts = split(substitute(type, '^\\', '', ''), '\') let parts = split(substitute(type, '^\\', '', ''), '\')
let class_candidate_namespace = join(parts[0:-2], '\') let class_candidate_namespace = join(parts[0:-2], '\')
let classname_candidate = parts[-1] let classname_candidate = parts[-1]
" check for renamed namespace in imports " check for renamed namepsace in imports
if has_key(classstructure.imports, class_candidate_namespace) if has_key(classstructure.imports, class_candidate_namespace)
let class_candidate_namespace = classstructure.imports[class_candidate_namespace].name let class_candidate_namespace = classstructure.imports[class_candidate_namespace].name
endif endif
@@ -2023,7 +2023,7 @@ function! phpcomplete#GetCachedClassContents(classlocation, class_name) " {{{
if getftime(classstructure.file) != classstructure.mtime if getftime(classstructure.file) != classstructure.mtime
let valid = 0 let valid = 0
" we could break here, but the time required for checking probably worth " we could break here, but the time required for checking probably worth
" the memory we can free by checking every file in the cached hierarchy " the the memory we can free by checking every file in the cached hirearchy
call phpcomplete#ClearCachedClassContents(classstructure.file) call phpcomplete#ClearCachedClassContents(classstructure.file)
endif endif
endfor endfor
@@ -2037,7 +2037,7 @@ function! phpcomplete#GetCachedClassContents(classlocation, class_name) " {{{
call remove(s:cache_classstructures, cache_key) call remove(s:cache_classstructures, cache_key)
call phpcomplete#ClearCachedClassContents(full_file_path) call phpcomplete#ClearCachedClassContents(full_file_path)
" fall through for the read from files path " fall trough for the read from files path
endif endif
else else
call phpcomplete#ClearCachedClassContents(full_file_path) call phpcomplete#ClearCachedClassContents(full_file_path)
@@ -2590,7 +2590,7 @@ function! phpcomplete#GetCurrentNameSpace(file_lines) " {{{
let search_line = line let search_line = line
let use_line = line let use_line = line
" add lines from the file until there's no ';' in them " add lines from the file until theres no ';' in them
while search_line !~? ';' && l > 0 while search_line !~? ';' && l > 0
" file lines are reversed so we need to go backwards " file lines are reversed so we need to go backwards
let l -= 1 let l -= 1
@@ -2622,7 +2622,7 @@ function! phpcomplete#GetCurrentNameSpace(file_lines) " {{{
" find kind flags from tags or built in methods for the objects we extracted " find kind flags from tags or built in methods for the objects we extracted
" they can be either classes, interfaces or namespaces, no other thing is importable in php " they can be either classes, interfaces or namespaces, no other thing is importable in php
for [key, import] in items(imports) for [key, import] in items(imports)
" if there's a \ in the name we have it's definitely not a built in thing, look for tags " if theres a \ in the name we have it's definitely not a built in thing, look for tags
if import.name =~ '\\' if import.name =~ '\\'
let patched_ctags_detected = 0 let patched_ctags_detected = 0
let [classname, namespace_for_classes] = phpcomplete#ExpandClassName(import.name, '\', {}) let [classname, namespace_for_classes] = phpcomplete#ExpandClassName(import.name, '\', {})
@@ -2679,10 +2679,10 @@ function! phpcomplete#GetCurrentNameSpace(file_lines) " {{{
let import['kind'] = 'i' let import['kind'] = 'i'
let import['builtin'] = 1 let import['builtin'] = 1
else else
" or can be a tag with exactly matching name " or can be a tag with exactly matchign name
let tags = phpcomplete#GetTaglist('^'.import['name'].'$') let tags = phpcomplete#GetTaglist('^'.import['name'].'$')
for tag in tags for tag in tags
" search for the first matching namespace, class, interface with no namespace " search for the first matchin namespace, class, interface with no namespace
if !has_key(tag, 'namespace') && (tag.kind == 'n' || tag.kind == 'c' || tag.kind == 'i' || tag.kind == 't') if !has_key(tag, 'namespace') && (tag.kind == 'n' || tag.kind == 'c' || tag.kind == 'i' || tag.kind == 't')
call extend(import, tag) call extend(import, tag)
let import['builtin'] = 0 let import['builtin'] = 0
@@ -2900,7 +2900,7 @@ for [ext, data] in items(php_builtin['functions'])
call extend(g:php_builtin_functions, data) call extend(g:php_builtin_functions, data)
endfor endfor
" Built in class " Built in classs
let g:php_builtin_classes = {} let g:php_builtin_classes = {}
for [ext, data] in items(php_builtin['classes']) for [ext, data] in items(php_builtin['classes'])
call extend(g:php_builtin_classes, data) call extend(g:php_builtin_classes, data)
@@ -2918,10 +2918,10 @@ for [ext, data] in items(php_builtin['constants'])
call extend(g:php_constants, data) call extend(g:php_constants, data)
endfor endfor
" When the classname not found or found but the tags doesn't contain that " When the classname not found or found but the tags dosen't contain that
" class we will try to complete any method of any builtin class. To speed up " class we will try to complate any method of any builtin class. To speed up
" that lookup we compile a 'ClassName::MethodName':'info' dictionary from the " that lookup we compile a 'ClassName::MethodName':'info' dictionary from the
" builtin class information " builtin class informations
let g:php_builtin_object_functions = {} let g:php_builtin_object_functions = {}
" When completing for 'everyting imaginable' (no class context, not a " When completing for 'everyting imaginable' (no class context, not a

View 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

View File

@@ -6,8 +6,10 @@ endif
let s:loaded_pythonx_provider = 1 let s:loaded_pythonx_provider = 1
function! provider#pythonx#Require(host) abort function! provider#pythonx#Require(host) abort
let ver = (a:host.orig_name ==# 'python') ? 2 : 3
" Python host arguments " 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()'] 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 endfunction
function! s:get_python_executable_from_host_var(major_version) abort function! s:get_python_executable_from_host_var(major_version) abort
return expand(get(g:, 'python'.(a:major_version == 3 ? '3' : execute("throw 'unsupported'")).'_host_prog', ''), v:true) return expand(get(g:, 'python'.(a:major_version == 3 ? '3' : '').'_host_prog', ''), v:true)
endfunction endfunction
function! s:get_python_candidates(major_version) abort function! s:get_python_candidates(major_version) abort
return { 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] \ }[a:major_version]
endfunction endfunction
@@ -56,7 +60,7 @@ function! provider#pythonx#DetectByModule(module, major_version) abort
endfor endfor
" No suitable Python executable found. " 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 endfunction
" Returns array: [prog_exitcode, prog_version] " 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.'] return [0, a:prog . ' not found in search path or not executable.']
endif 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. " Try to load module, and output Python version.
" Exit codes: " Exit codes:
@@ -92,14 +96,14 @@ function! provider#pythonx#CheckForModule(prog, module, major_version) abort
if prog_version !~ '^' . a:major_version if prog_version !~ '^' . a:major_version
return [0, prog_path . ' is Python ' . prog_version . ' and cannot provide Python ' return [0, prog_path . ' is Python ' . prog_version . ' and cannot provide Python '
\ . a:major_version . '.'] \ . a:major_version . '.']
elseif prog_version =~ '^' . a:major_version && str2nr(prog_version[2:]) < str2nr(min_version[2:]) elseif prog_version =~ '^' . a:major_version && prog_version < min_version
return [0, prog_path . ' is Python ' . prog_version . ' and cannot provide Python >= ' return [0, prog_path . ' is Python ' . prog_version . ' and cannot provide Python >= '
\ . min_version . '.'] \ . min_version . '.']
endif endif
endif endif
if prog_exitcode == 2 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 elseif prog_exitcode == 127
" This can happen with pyenv's shims. " This can happen with pyenv's shims.
return [0, prog_path . ' does not exist: ' . prog_version] return [0, prog_path . ' does not exist: ' . prog_version]

View File

@@ -2,7 +2,7 @@
" Maintainer: <vacancy> " Maintainer: <vacancy>
" Previous Maintainer: Aaron Griffin <aaronmgriffin@gmail.com> " Previous Maintainer: Aaron Griffin <aaronmgriffin@gmail.com>
" Version: 0.9 " 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 " Roland Puntaier: this file contains adaptations for python3 and is parallel to pythoncomplete.vim
" "
@@ -91,9 +91,6 @@ endfunction
function! s:DefPython() function! s:DefPython()
py3 << PYTHONEOF py3 << PYTHONEOF
import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)
import sys, tokenize, io, types import sys, tokenize, io, types
from token import NAME, DEDENT, NEWLINE, STRING from token import NAME, DEDENT, NEWLINE, STRING
@@ -176,7 +173,7 @@ class Completer(object):
pass pass
if len(arg_text) == 0: if len(arg_text) == 0:
# The doc string sometimes contains the function signature # The doc string sometimes contains the function signature
# this works for a lot of C modules that are part of the # this works for alot of C modules that are part of the
# standard library # standard library
doc = func_obj.__doc__ doc = func_obj.__doc__
if doc: if doc:

View File

@@ -191,7 +191,7 @@ class Completer(object):
pass pass
if len(arg_text) == 0: if len(arg_text) == 0:
# The doc string sometimes contains the function signature # The doc string sometimes contains the function signature
# this works for a lot of C modules that are part of the # this works for alot of C modules that are part of the
# standard library # standard library
doc = func_obj.__doc__ doc = func_obj.__doc__
if doc: if doc:

View File

@@ -240,11 +240,7 @@ function! s:GetAutocmdPrefix(name, opts)
endif endif
if has_key(a:opts, 'nested') && a:opts.nested if has_key(a:opts, 'nested') && a:opts.nested
call add(rv, '++nested') call add(rv, 'nested')
endif
if has_key(a:opts, 'once') && a:opts.once
call add(rv, '++once')
endif endif
return join(rv, ' ') return join(rv, ' ')

View File

@@ -114,7 +114,7 @@ function! s:RegistrationCommands(host) abort
let host_id = a:host.'-registration-clone' let host_id = a:host.'-registration-clone'
call remote#host#RegisterClone(host_id, a:host) call remote#host#RegisterClone(host_id, a:host)
let pattern = s:plugin_patterns[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 = map(paths, 'tr(resolve(v:val),"\\","/")') " Normalize slashes #4795
let paths = uniq(sort(paths)) let paths = uniq(sort(paths))
if empty(paths) if empty(paths)

View File

@@ -3,7 +3,7 @@
" Maintainer: Mark Guzman <segfault@hasno.info> " Maintainer: Mark Guzman <segfault@hasno.info>
" URL: https://github.com/vim-ruby/vim-ruby " URL: https://github.com/vim-ruby/vim-ruby
" Release Coordinator: Doug Kearns <dougkearns@gmail.com> " 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) " Ruby IRB/Complete author: Keiju ISHITSUKA(keiju@ishitsuka.com)
@@ -501,8 +501,13 @@ class VimRubyCompletion
return if rails_base == nil return if rails_base == nil
$:.push rails_base unless $:.index( rails_base ) $:.push rails_base unless $:.index( rails_base )
bootfile = rails_base + "config/boot.rb" rails_config = rails_base + "config/"
envfile = rails_base + "config/environment.rb" 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 ) if File.exists?( bootfile ) && File.exists?( envfile )
begin begin
require bootfile require bootfile

View File

@@ -17,7 +17,7 @@
" and complete it. " and complete it.
" "
" Version 16.0 (Dec 2015) " 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 " had been used via dbext, have dbext delete or recreate the
" dictionary so that new objects are picked up for the " dictionary so that new objects are picked up for the
" next completion. " next completion.
@@ -554,7 +554,7 @@ function! sqlcomplete#PreCacheSyntax(...)
let syn_group_arr = g:omni_sql_precache_syntax_groups let syn_group_arr = g:omni_sql_precache_syntax_groups
endif endif
" For each group specified in the list, precache all " For each group specified in the list, precache all
" the syntax items. " the sytnax items.
if !empty(syn_group_arr) if !empty(syn_group_arr)
for group_name in syn_group_arr for group_name in syn_group_arr
let syn_items = extend( syn_items, s:SQLCGetSyntaxList(group_name) ) 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 let syn_group_arr = g:omni_sql_precache_syntax_groups
endif endif
" For each group specified in the list, precache all " For each group specified in the list, precache all
" the syntax items. " the sytnax items.
if !empty(syn_group_arr) if !empty(syn_group_arr)
for group_name in syn_group_arr for group_name in syn_group_arr
let list_idx = index(s:syn_list, group_name, 0, &ignorecase) 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 curline = line(".")
let curcol = col(".") let curcol = col(".")
" Do not let searches wrap " Do not let searchs wrap
setlocal nowrapscan setlocal nowrapscan
" If . was entered, look at the word just before the . " If . was entered, look at the word just before the .
" We are looking for something like this: " 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: " Search forward until one of the following:
" 1. Another select/update/delete statement " 1. Another select/update/delete statement
" 2. A ; at the end of a line (the delimiter) " 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. " Yank the visually selected text into the "y register.
exec 'silent! normal! vl/\c\(\<select\>\|\<update\>\|\<delete\>\|;\s*$\|\%$\)'."\n".'"yy' exec 'silent! normal! vl/\c\(\<select\>\|\<update\>\|\<delete\>\|;\s*$\|\%$\)'."\n".'"yy'

View File

@@ -778,7 +778,7 @@ fun! tar#Vimuntar(...)
elseif executable("gzip") elseif executable("gzip")
silent exe "!gzip -d ".shellescape(tartail) silent exe "!gzip -d ".shellescape(tartail)
else else
echoerr "unable to decompress<".tartail."> on this system" echoerr "unable to decompress<".tartail."> on this sytem"
if simplify(curdir) != simplify(tarhome) if simplify(curdir) != simplify(tarhome)
" remove decompressed tarball, restore directory " remove decompressed tarball, restore directory
" call Decho("delete(".tartail.".tar)") " call Decho("delete(".tartail.".tar)")

View File

@@ -693,7 +693,7 @@ func! tohtml#GetUserSettings() "{{{
let user_settings = {} let user_settings = {}
" Define the correct option if the old option name exists and we haven't " 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, " this sometime and remove the old option entirely at some even later time,
" but for now just silently accept the old option. " but for now just silently accept the old option.
if exists('g:use_xhtml') && !exists("g:html_use_xhtml") if exists('g:use_xhtml') && !exists("g:html_use_xhtml")

View File

@@ -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 " 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 " is a dictionary that will be the `self` of every State method call associated
" with the parser, and may contain options normally passed to " 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`: " can be called directly as the second argument of `jobstart`:
" "
" call jobstart(prog_argv, vimexpect#Parser(initial_state, {'pty': 1})) " call jobstart(prog_argv, vimexpect#Parser(initial_state, {'pty': 1}))

View File

@@ -199,7 +199,7 @@ function! xmlcomplete#CompleteTags(findstart, base)
" 1. Events attributes " 1. Events attributes
if context =~ '\s' 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*$" if attr =~ "=\s*[\"']" || attr =~ "=\s*$"
" Let do attribute specific completion " Let do attribute specific completion
let attrname = matchstr(attr, '.*\ze\s*=') let attrname = matchstr(attr, '.*\ze\s*=')

Some files were not shown because too many files have changed in this diff Show More