Compare commits

..

89 Commits

Author SHA1 Message Date
Justin M. Keyes
d9dd30a955 Merge #12822 release-0.4 patches 2020-09-06 10:34:44 -07:00
erw7
b2cef8b665 terminal: fix terminal attribute overflow
fixes #11548
2020-09-05 21:59:22 -07:00
Christian Clason
1de33ce2cd build: remove duplicate empty CONFIGURE_COMMAND (#12676)
The cmake file for libvterm had an empty CONFIGURE_COMMAND "", which tells cmake to skip the configure step for this dependency (even though a later patch added another, actual, CONFIGURE_COMMAND two lines below). Evidently the recently released cmake 3.18.0 is pickier about this than previous versions, causing the build to fail. Removing this line makes the build successful again.
2020-09-01 01:13:37 -07:00
Jan Edmund Lazo
1c3afe4e25 doc: powershell is 'pwsh' on non-Windows OS 2020-09-01 01:07:23 -07:00
Jan Edmund Lazo
b92399d008 doc: update shellquote for powershell #11122
shellquote is not treated like shellxquote for non-quote values.
2020-09-01 01:07:09 -07:00
Christian Clason
20070310a4 bump libvterm to 0.1.4 2020-09-01 00:31:43 -07:00
James McCoy
c685a2ef48 Merge pull request #12751 from jamessan/openbsd-ci
ci: bump openbsd image 6.5 -> 6.7
2020-08-11 20:36:13 -04:00
Matthieu Coudron
018ec2172b ci: bump openbsd image 6.5 -> 6.7
seems like 6.5 is not supported anymore.

(cherry picked from commit c4888b2bde)
2020-08-11 20:21:27 -04:00
James McCoy
87a88c8e42 Merge pull request #12746 from jamessan/libcallnr-0.4 2020-08-11 15:02:28 -04:00
James McCoy
47b84599df Merge remote-tracking branch 'upstream/release-0.4' into libcallnr-0.4 2020-08-11 07:33:42 -04:00
James McCoy
40dc1ba85c version bump 2020-08-04 20:46:17 -04:00
James McCoy
ee77d8665f NVIM v0.4.4
Maintenance release for v0.4.x series.

FIXES:

fd02e6351 #12701 ui: fix problem with sattr_T overflow
3e3002b90 #12710 fs: Ensure FileInfo struct is initialized
e4629f203 #12496 main.c: fix hang issue with recoverymode #12520
f558af8b1 #12209 fixed hang issue with --headless and -r option specified
cda119055 #12180 TUI: block signals on suspend
8399f7357 #12142 Fix issues revealed by gcc10 setting -fno-common by default
5e47cf27b netrw.vim: do not save +/* registers
5d41bfcce #11907 quickfix.c: Fix vimgrep regression
641e22913 #11903 screen: add missing redraws after a message
47bd62c15 loop_close: close all handles
d2730365e loop_close: call uv_stop(), fix bug
284b398eb #11821 loop_close: timout after 2 seconds
1b2666cd2 messages: echo "line1\r\nline2" should not clear line1
1bf90bf9d #11651 API: fix crash on copy_object(kObjectTypeWindow)
fafd63626 #11566 libcallnr: Use int, not int64_t, as the return type for Vim compat
972dd758c #11460 win_line: Fix crash with 'rightleft' in :terminal
4c48cf302 f_getenv/setenv: Access v_special when v_type is VAR_SPECIAL
2cd1ff762 #11360 paste: Select-mode, Visual-mode
2020-08-04 20:07:48 -04:00
James McCoy
a09b3cbcb1 Merge pull request #12717 from jamessan/release-0.4-backports 2020-08-04 15:28:44 -04:00
Jan Edmund Lazo
23c99bb78f vim-patch:8.2.1259: empty group in 'tabline' may cause using an invalid pointer
Problem:    Empty group in 'tabline' may cause using an invalid pointer.
Solution:   Set the group start position. (closes vim/vim#6505)
f56c95fdad
(cherry picked from commit 9443d39941)
2020-08-04 07:20:39 -04:00
erw7
fd02e63513 ui: fix problem with sattr_T overflow
sattr_T was defined as uint16_t. But this is not enough to handle the
24-bit colors of the terminal. To solve this problem, change it to int.
In 32bit, int may overflow. So, if it overflows, change it to ignore it
without adding more attr_entries.

fixes #12366

(cherry picked from commit 872ecf65d1)
2020-08-04 07:20:07 -04:00
James McCoy
0547b4cdad Merge pull request #12710 from jamessan/fileinfo-garbage-0.4 2020-08-02 23:23:44 -04:00
James McCoy
052337ddfc Merge remote-tracking branch 'upstream/release-0.4' into fileinfo-garbage-0.4 2020-08-02 22:37:13 -04:00
James McCoy
82283a3d10 Merge pull request #12711 from jamessan/travis-0.4
travis: Use Python 3.7.1
2020-08-02 22:36:24 -04:00
erw7
704151c8a2 ci: fix build failure in Travis [skip appveyor] (#12678) 2020-08-02 22:20:17 -04:00
James McCoy
e4629f203f main.c: fix hang issue with recoverymode (#12496) (#12520)
In the case of recoverymode, the headlessmode was true, causing the UI
to hang without starting. Fix this problem by setting headlessmode to
true for List swap files only.

Co-authored-by: erw7 <erw7.github@gmail.com>
2020-06-23 12:15:32 +02:00
James McCoy
ce3db4648a Merge pull request #12352 from jamessan/fix/hang-headless-mode 2020-05-21 07:39:22 -04:00
Kei Kamikawa
f558af8b18 fixed hang issue with --headless and -r option specified (#12209)
* fixed hang issue with --headless and -r option specified

Calling the do_more_prompt function in headless mode will freeze neovim because it is eventally in the input-accepting state (the same as waiting for --more--).

* fixed "Press ENTER or type command to continue" to be suppressed

If in headless mode, we need to exit at this point. If we continue, we will enter the normal mode and the message "Press ENTER or type command to continue" will be displayed and we will be in the input waiting state.

* fixed functional ex_cmds tests

* Revert "fixed "Press ENTER or type command to continue" to be suppressed"

This reverts commit a02dc40e3b.

* Revert "fixed functional ex_cmds tests"

This reverts commit 3bdb8da20a.

* fixed conditional again

* added test for fixed hang issue with --headless (#11386)

(cherry picked from commit c6dc397801)
2020-05-20 22:32:50 -04:00
Kei Kamikawa
cda119055a TUI: block signals on suspend #12180
fix #8075
2020-04-25 18:24:46 -07:00
James McCoy
8399f73574 Merge pull request #12142 from jamessan/gcc-10-fixes 2020-04-17 15:24:52 -04:00
Andreas Schneider
faaf83a49e [release-0.4] cmake: Check for -fno-common and use it if available 2020-04-17 13:02:40 -04:00
Andreas Schneider
0493fa00fa [release-0.4] nvim: Correctly setup global channels
As gcc10 uses -fno-common by default, global variables declared with the
same name more than once is not allowed anymore revealing this issue.

We need to define it as extern to access it.

See also https://bugzilla.redhat.com/show_bug.cgi?id=1799680
2020-04-17 13:02:37 -04:00
Andreas Schneider
6b38b9e4c6 [release-0.4] nvim:msgpack: Correctly set up global ch_before_blocking_events
gcc10 builds with -fno-common by default. This mean you can't define
a global variable with the same name twice.

See also https://bugzilla.redhat.com/show_bug.cgi?id=1799680
2020-04-17 13:02:34 -04:00
Andreas Schneider
047e36695f [release-0.4] nvim: Fix enum declaration of RemapValues
Instead of declaring an enum, this creates a global variable. As gcc10
uses -fno-common by default, global variables declared with the same
name more than once is not allowed anymore revealing this issue.

Each time this header is included, we define the enum name as a global
variable.

See also https://bugzilla.redhat.com/show_bug.cgi?id=1799680
2020-04-17 13:02:28 -04:00
Andreas Schneider
e1cc8e8e09 [release-0.4] nvim:viml: Fix enum declaration of ExprParserFlags
Instead of declaring an enum, this creates a global variable. As gcc10
uses -fno-common by default, global variables declared with the same
name more than once is not allowed anymore revealing this issue.

Each time this header is included, we define the enum name as a global
variable.

See also https://bugzilla.redhat.com/show_bug.cgi?id=1799680
2020-04-17 13:02:26 -04:00
Andreas Schneider
49469ec6b9 [release-0.4] nvim:eval: Fix enum declaration for ListLenSpecials
Instead of declaring an enum, this creates a global variable. As gcc10
uses -fno-common by default, global variables declared with the same
name more than once is not allowed anymore revealing this issue.

Each time this header is included, we define the enum name as a global
variable.

See also https://bugzilla.redhat.com/show_bug.cgi?id=1799680
2020-04-17 13:02:14 -04:00
Justin M. Keyes
5e47cf27b4 netrw.vim: do not save +/* registers
netrw shouldn't be touching these in the first place.

fix #11089
ref #6892
ref #6695
2020-02-29 18:34:19 -08:00
Justin M. Keyes
dd0a3cd22f CI/travis: workaround broken homebrew
6.70s$ rvm $brew_ruby do brew bundle --verbose --global
    /usr/local/bin/brew tap homebrew/bundle
    ==> Tapping homebrew/bundle
    Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-bundle'...
    Tapped (102 files, 251.1KB).
    Error: Unknown command: bundle

https://travis-ci.community/t/macos-build-fails-because-of-homebrew-bundle-unknown-command/7296/10
https://twitter.com/AJenbo/status/1175976531480457216
2020-02-22 14:16:57 -08:00
Justin M. Keyes
10590e4b20 Merge #11901 "options: global-local 'fillchars', 'listchars'" 2020-02-22 13:09:58 -08:00
Justin M. Keyes
b4a10dd9b2 vim-patch:8.1.2060: "precedes" in 'listchars' not used properly
(Credit: Zach Wegner, https://github.com/neovim/neovim/pull/11034)

Problem:    "precedes" in 'listchars' not used properly.
Solution:   Correctly handle the "precedes" char in list mode for long lines.
bffba7f704
2020-02-22 12:53:21 -08:00
Zach Wegner
dd7206af37 Fix "precedes" listchar behavior in wrap mode
Previously, the "precedes" character would be rendered on every row
when w_skipcol > 0 (i.e., when viewing a single line longer than the
entire screen), instead of just on the first row. Make sure to only
render it on the first row in this case.

Add a test for this behavior.

Fix documentation for the "precedes" character, which erroneously
stated that it was only active when wrap mode was off.
2020-02-21 14:21:11 -08:00
Björn Linse
92e80f18a8 options: make 'fillchars' and 'listchars' global-local
These options were previously global. A global-local window option
behaves closer to a global option "per default" (i e with :set),
but still supports local behavior via :setl

Also this restores back-compat for nvim_set_option("fcs", ...)
which are currently broken on 0.4.x but worked in earlier versions
2020-02-21 14:14:15 -08:00
cballam
5d41bfccec quickfix.c: Fix vimgrep regression #11907
Fix ex_vimgrep to properly ignore filetype when running vimgrep.
This restores vimgrep to behaviour before function refactoring.

fix #9842
fix #11856
2020-02-19 22:55:11 -08:00
Björn Linse
641e229132 Merge pull request #11903 from bfredl/backport-qf_msg
[release-0.4] screen: add missing redraws after a message
2020-02-19 19:32:38 +01:00
Björn Linse
f225028a0d [release-0.4] screen: add missing redraws after a message 2020-02-19 15:13:21 +01:00
Björn Linse
02dae63bf7 Merge pull request #11905 from bfredl/backport-patch-8.2.0235
[release-0.4] vim-patch:8.2.0235
2020-02-19 13:54:02 +01:00
Björn Linse
6274f06aba [release-0.4] vim-patch:8.2.0235: draw error when an empty group is removed from 'statusline'
Problem:    Draw error when an empty group is removed from 'statusline'.
Solution:   Do not use highlighting from a removed group.
dbe5d361fe
2020-02-19 10:32:18 +01:00
Justin M. Keyes
47bd62c15c loop_close: close all handles
- Move uv_stop(), it still causes a "leak" on exit somehow.
- Tenatively restore `UV_RUN_DEFAULT`.  It shouldn't hang since we
  clobber the handles via `uv_walk((h)=>uv_close(h))`. Although this
  still "leaks" on exit, it's faster than the 2-second timeout.

fix #11820
fix #7376
2020-02-18 16:05:38 -08:00
Justin M. Keyes
d2730365ef loop_close: call uv_stop(), fix bug
- Call uv_stop().
- Restore `uv_loop_close` condition (braindead cosmetic change from
  a2efc9cf8b that caused uv_loop_close *not* to be called if
  wait=false, sorry).

Not doing `uv_walk(() => uv_close)`: see source comment for explanation.

fix #11820
fix #7376

Q: Should we restore use of `UV_RUN_DEFAULT`/`UV_RUN_ONCE` (removed in
   a2efc9cf8b)?
A: The while-loop (hopefully) achieves the same purpose while avoiding
   a hang.
2020-02-18 16:05:38 -08:00
Justin M. Keyes
284b398eb9 loop_close: timout after 2 seconds #11821
never UV_RUN_DEFAULT
ref #11820
ref #7376
2020-02-18 16:05:38 -08:00
Justin M. Keyes
2645669c89 Merge pull request #11779 from justinmk/release-0.4
build/MSVC: fix gettext multibyte issue #11774
2020-01-28 10:42:50 -08:00
Justin M. Keyes
b5cee56757 test: skip nodejs_spec on 0.4.x branch 2020-01-28 02:43:09 -08:00
erw7
d56f6fed9c build/MSVC: fix gettext multibyte issue #11774
Problem:  On Windows with the MSVC build, gettext-translation
          "Questa è già la" displays as "Questa <e8> gi<e0> la".
Solution: Fix iconv detection iconv when building gettext.
          So HAVE_ICONV is correctly defined when building nvim.

* fix gettext mb chars on MSVC
* fix libintl detection failure on MSVC

fixes #11749
2020-01-28 01:58:40 -08:00
Justin M. Keyes
910cdac22c Merge #11770 from justinmk/release-0.4 2020-01-26 18:53:52 -08:00
Daniel Hahler
23a64c95d8 test: cherry-pick improvements from master branch
Partial cherry-pick of b3686b1597.

* test/functional/provider: display reason from missing_provider
* provider#node#Detect: skip / handle non-existing node executable
2020-01-26 18:32:11 -08:00
Björn Linse
1b2666cd21 messages: echo "line1\r\nline2" should not clear line1 2020-01-26 17:18:51 -08:00
Ghjuvan Lacambre
1bf90bf9d3 API: fix crash on copy_object(kObjectTypeWindow) #11651
Closes #11646
2020-01-02 02:02:26 -08:00
James McCoy
fafd636267 [release-0.4] libcallnr: Use int, not int64_t, as the return t… (#11566)
[release-0.4] libcallnr: Use int, not int64_t, as the return type for Vim compat
2019-12-16 10:04:51 -05:00
James McCoy
ef71c89129 Merge remote-tracking branch 'upstream/release-0.4' into release-0.4.x/libcall 2019-12-16 07:32:31 -05:00
erw7
972dd758cb win_line: Fix crash with 'rightleft' in :terminal #11460
fixes #11438

Backtrace:

    0  schar_from_ascii ( p=0x801cc9e112c3 <error: Cannot access memory at address 0x801cc9e112c3>, c=32 ' ') at ../src/nvim/screen.c:5263
    1  0x00007f31460eccc5 in win_line (wp=wp@entry=0x7fffc9df6230, lnum=lnum@entry=11, startrow=startrow@entry=10, endrow=41, nochange=false, number_only=number_only@entry=false) at ../src/nvim/screen.c:4025
    2  0x00007f31460eed8e in win_update (wp=wp@entry=0x7fffc9df6230) at ../src/nvim/screen.c:1403
    3  0x00007f31460f011f in update_screen (type=<optimized out>) at ../src/nvim/screen.c:502
    4  0x00007f3146138ef4 in normal_redraw (s=s@entry=0x7fffd0a5f700) at ../src/nvim/normal.c:1247
    5  0x00007f314613b159 in normal_check (state=0x7fffd0a5f700) at ../src/nvim/normal.c:1324
    6  0x00007f31460accfe in state_enter (s=0x7fffd0a5f700) at ../src/nvim/state.c:28
    7  0x00007f3146143099 in normal_enter (cmdwin=<optimized out>, noexmode=<optimized out>) at ../src/nvim/normal.c:463
    8  0x00007f314618b541 in main (argc=<optimized out>, argv=<optimized out>) at ../src/nvim/main.c:580

(cherry picked from commit 1bb7ea189e)
2019-11-29 05:34:32 +01:00
James McCoy
d379db428b Merge pull request #11392 from jamessan/get-setenv-bug
[release-0.4] f_getenv/setenv: Access v_special when v_type is VAR_SPECIAL
2019-11-14 09:09:27 -05:00
James McCoy
4c48cf3020 f_getenv/setenv: Access v_special when v_type is VAR_SPECIAL
Multiple Debian builds were failing these tests:

    Failures:
    	From test_environ.vim:
    	Found errors in Test_external_env():
    	function RunTheTest[37]..Test_external_env line 16: Expected '' but got 'FOO=null\n'
    	Found errors in Test_getenv():
    	function RunTheTest[37]..Test_getenv line 2: Expected v:null but got v:false
    	Found errors in Test_setenv():
    	function RunTheTest[37]..Test_setenv line 5: Expected v:null but got 'null'

This is because nvim has a separate tag (`v_special`) in `typval_T` for
special variables, whereas vim re-uses the `v_number` tag.

On little-endian architectures, using the incorrect tag is not an issue
because the byte representation is the same.  However, on big-endian
systems this caused the `v_number == kSpecialVarNull` checks to fail,
and the non-special code to execute.
2019-11-13 22:31:02 -05:00
Justin M. Keyes
2cd1ff762e paste: Select-mode, Visual-mode #11360
fix #11344
2019-11-09 21:27:48 -08:00
Justin M. Keyes
941dc1b0ca version bump 2019-11-06 01:59:54 -08:00
Justin M. Keyes
b99dad7b4c NVIM v0.4.3
Maintenance release for the v0.4.x series.

FIXES:

599ad5d3b8 Windows: nvim-qt v0.2.15 (fix "invalid font" error on startup)
1def94597b #11332 autocmd: Fix event name casing
b678d33dd3 #11315 test: delete duplicate highlight group
924fa143cc #11225 ex_echo: fix check for got_int
327e8ddb18 #11138 deps: pass LDFLAGS+=-static
a1f557690f #11222 mac: fix "tags file not sorted" bug on Catalina
f2f37712a4 #11187 recovery mode (-r/-L): use headless_mode
4f452a6744 #11190 Remove "highbright bold" conversion.
9571a87d3d #11177 third-party: upgrade libvterm to 0.1.2
3817518ab4 #11074 terminfo_start: flush buffer
56d9412999 win_line: update `w_last_cursorline` always
ddd3363a42 #11132 patch_terminfo_bugs: TERM=xterm with non-xterm: ignore smglr
d453d2c484 Fix redraw regression with w_p_cole in visual mode
e0622b4c65 screen: missing redraw/highlight for ruler in message area
b781f2b072 cmdline: wildmenumode() should be true with wildoptions+=pum
eef3809067 #11027 win_update: fix redraw regression
43f4955f70 #11069 Merge pull request from bfredl/virtualcol
6f693be1ee #11050 env: use putenv_s for LC_ALL, LANG, etc.
36e2846b49 #11094 paste: fix handling of "<" in cmdline
60b56ed458 #11126 Merge pull request from bfredl/invalidcell-0.4
8250d6795b screen: don't crash on invalid grid cells being recomposed
2019-11-06 01:54:45 -08:00
lacygoill
1def94597b autocmd: Fix event name casing #11332
Affects getcompletion()
2019-11-04 00:25:20 -08:00
Björn Linse
b678d33dd3 Merge pull request #11315 from bfredl/termtestfix
[release-0.4] test: delete duplicate highlight group
2019-10-29 21:49:56 +01:00
Björn Linse
a012387074 [release-0.4] test: delete duplicate highlight group
Depending on the lua version, 6 might get used instead of
2 here, which causes test failures in upstream builds.
This was fixed as part of #11206 on master
2019-10-29 19:44:47 +01:00
Justin M. Keyes
599ad5d3b8 win/dist: nvim-qt v0.2.15 2019-10-26 13:18:59 -07:00
Daniel Hahler
924fa143cc [release-0.4] ex_echo: fix check for got_int #11225
It needs to return to not output any remaining parts.

Followup to https://github.com/neovim/neovim/pull/10926
Ref: https://github.com/neovim/neovim/issues/10923

(cherry picked from commit 93fe30593b)
2019-10-20 00:54:07 +02:00
Daniel Hahler
327e8ddb18 [release-0.4] deps: pass LDFLAGS+=-static (#11138)
This is required when `build_old_libs=no` is used in `libtool`.

Fixes https://github.com/neovim/neovim/issues/11198

(cherry picked from commit 2e14dffbb4)
2019-10-14 15:17:47 +02:00
dm1try
a1f557690f [release-0.4] mac: fix "tags file not sorted" bug on Catalina (#11222)
I/O in Catalina is currently known to be broken. This commit works
around a pesky bug and also makes the code more consistent by removing
the mix of C file and standard I/O.

Fixes https://github.com/neovim/neovim/issues/11196

(cherry picked from commit d0efc1c906)
2019-10-14 14:05:58 +02:00
Daniel Hahler
f2f37712a4 [release-0.4] recovery mode (-r/-L): use headless_mode (#11187)
Fixes https://github.com/neovim/neovim/issues/11181.

(cherry picked from commit 9af0fe529d)
2019-10-11 19:17:29 +02:00
Björn Linse
4f452a6744 Remove "highbright bold" conversion. Fixes #11190
When using TUI host terminal should take care of this (regardless
if 'termguicolors' is active or not). For GUI the behavior doesn't make
sense (GUI should display bold attr as bold always).

(cherry picked from commit b772b86d2b)
2019-10-11 00:00:26 +02:00
Daniel Hahler
9571a87d3d [release-0.4] third-party: upgrade libvterm to 0.1.2 (#11177)
(cherry picked from commit f2ad93168b)
2019-10-09 19:58:14 +02:00
Daniel Hahler
3817518ab4 [release-0.4] terminfo_start: flush buffer #11074
This aligns with `terminfo_stop`, which also flushes the buffer
after disabling things.

This ensures Neovim gets the response to the terminal background query
before exiting (`nvim -u NONE -cq` with e.g. urxvt or kitty).

Caveats:
* With kitty this causes some "flickering", likely since the alternate
  screen is being setup with `nvim -u NONE -cq`, whereas it would not be
  processed otherwise before quitting (as with the background query).
* tmux after this patch may print ^[[I (CSI I / FocusGained) after
  `nvim -u NONE -cq`.

Fixes https://github.com/neovim/neovim/issues/11062

Ref: https://github.com/neovim/neovim/issues/11181
2019-10-08 19:18:07 +02:00
Daniel Hahler
56d9412999 [release-0.4] win_line: update w_last_cursorline always
Vim patch 8.1.0856 (54d9ea6) caused a performance regression in Neovim,
when `set conceallevel=1 nocursorline` was used, since then due to
refactoring in 23c71d5 `w_last_cursorline` would never get updated
anymore.

Adds/uses `redrawdebug+=nodelta` for testing this.

Fixes https://github.com/neovim/neovim/issues/11100.
Closes https://github.com/neovim/neovim/pull/11101.
2019-10-04 08:54:02 +02:00
Daniel Hahler
ddd3363a42 [release-0.4] patch_terminfo_bugs: TERM=xterm with non-xterm: ignore smglr (#11132)
"smglr" was added for TERM=xterm recently to the terminfo database,
which causes display issues with terminals that use `TERM=xterm` by
default for themselves, although not supporting it.

This patch makes "smglr" to be ignored then.

Fixes https://github.com/neovim/neovim/issues/10562
2019-10-03 07:47:47 +02:00
Daniel Hahler
d453d2c484 [release-0.4] Fix redraw regression with w_p_cole in visual mode
Fixes https://github.com/neovim/neovim/issues/11024, regressed in 23c71d51.
Closes https://github.com/neovim/neovim/pull/11120.
2019-10-03 07:47:40 +02:00
Justin M. Keyes
c5d1b0f3da Merge pull request #11142 from bfredl/backports
[release-0.4] Backport fixes for ruler drawing and wildmenumode()
2019-10-02 22:39:10 -07:00
Björn Linse
e0622b4c65 [release-0.4] screen: missing redraw/highlight for ruler in message area 2019-10-02 22:30:40 +02:00
Björn Linse
b781f2b072 [release-0.4] cmdline: wildmenumode() should be true with wildoptions+=pum 2019-10-02 22:29:42 +02:00
Daniel Hahler
e63fdf63ba Merge pull request #11133 from blueyed/backports
[release-0.4] backports
2019-10-02 03:43:39 +02:00
Daniel Hahler
eef3809067 [release-0.4] win_update: fix redraw regression (#11027)
Before 6e9ea5adc `win_ins_lines` would return `FAIL` for `i/line_count == 0`.

Handle this by checking it in the outer `if`.

Ref: https://github.com/neovim/neovim/commit/6e9ea5ad#commitcomment-35084669
2019-10-01 02:16:14 +02:00
Björn Linse
43f4955f70 [release-0.4] Merge pull request #11069 from bfredl/virtualcol
screen: fix vcol counting with virtual text.
2019-10-01 02:15:24 +02:00
erw7
6f693be1ee [release-0.4] env: use putenv_s for LC_ALL, LANG, etc. #11050
Problem:  ":lang messages en_US.UTF-8" no longer overrides the language
          detected from the environment (at startup).
Solution: In os_setenv, special-case "LC_ALL", "LANG", et al. to use
          putenv_s instead of uv_os_setenv.

fixes #11045
2019-10-01 02:13:13 +02:00
Daniel Hahler
36e2846b49 [release-0.4] paste: fix handling of "<" in cmdline (#11094)
Fixes https://github.com/neovim/neovim/issues/11088.
2019-10-01 02:11:40 +02:00
Björn Linse
60b56ed458 Merge pull request #11126 from bfredl/invalidcell-0.4
[release-0.4] screen: don't crash on invalid grid cells being recomposed
2019-09-30 22:44:38 +02:00
Björn Linse
8250d6795b screen: don't crash on invalid grid cells being recomposed 2019-09-30 20:33:09 +02:00
Justin M. Keyes
38d02d58b2 version bump 2019-09-15 19:40:58 -07:00
Justin M. Keyes
7d6aa82b69 NVIM v0.4.2
This is a "stub" release to fix release automation.

Release notes: e2cc5fe09d

FIXES:

6c65f8f182 CI/AppVeyor: revert whitelist
2019-09-15 19:36:35 -07:00
Justin M. Keyes
6c65f8f182 CI/AppVeyor: revert whitelist
revert 6b028ec5f2 #10746

This seems to skip tags also, which breaks our release automation.
From the AppVeyor logs:

    2019-09-15 17:25:00.232 Warning Commit "1f76c4af" of branch "master" skipped as commit message contains either "[skip ci]" or "[ci skip]" or "[skip appveyor]"
    2019-09-15 17:20:24.152 Warning Commit "baa5263b" skipped as branch "stable" is not in white-list
    2019-09-15 17:20:03.163 Warning Commit "6cb5ffc0" skipped as branch "release-0.4" is not in white-list
    2019-09-15 17:20:02.977 Warning Commit "baa5263b" skipped as branch "v0.4.1" is not in white-list
    2019-09-15 16:35:38.810 Warning Commit "31956372" of branch "master" skipped as commit message contains either "[skip ci]" or "[ci skip]" or "[skip appveyor]"
    2019-09-15 16:28:35.237 Warning Commit "e2cc5fe0" skipped as branch "stable" is not in white-list
    2019-09-15 16:28:17.814 Information Build version 31489 created
    2019-09-15 16:28:16.364 Warning Commit "e2cc5fe0" skipped as branch "v0.4.0" is not in white-list
2019-09-15 17:39:07 -07:00
Justin M. Keyes
6cb5ffc075 version bump 2019-09-15 17:12:50 -07:00
Justin M. Keyes
baa5263b56 NVIM v0.4.1
FIXES:

2abdb89522 fix failed release: regenerate the *.mpack file
2019-09-15 17:11:39 -07:00
Justin M. Keyes
2abdb89522 fix failed release: regenerate the *.mpack file
Set NVIM_API_PRERELEASE=true to regenerate the *.mpack file, because it
was generated from an old binary accidentally, which caused the release
to fail:

    test/functional\api\version_spec.lua:133: Expected objects to be the same.
    Passed in:
    (table: 0x0c6175a8) {
      [method] = false
      [name] = 'nvim_get_context'
     *[parameters] = {
       *[1] = {
         *[1] = 'Dictionary'
          [2] = '' } }
      [return_type] = 'Dictionary'
      [since] = 6 }
    Expected:
    (table: 0x0c6cd2d0) {
      [method] = false
      [name] = 'nvim_get_context'
     *[parameters] = {
       *[1] = {
         *[1] = 'Array'
          [2] = '' } }
      [return_type] = 'Dictionary'
      [since] = 6 }
    stack traceback:
        test/functional\api\version_spec.lua:133: in function <test/functional\api\version_spec.lua:122>
2019-09-15 17:10:16 -07:00
1658 changed files with 114738 additions and 260124 deletions

View File

@@ -1,44 +0,0 @@
image: freebsd/12.x
packages:
- cmake
- gmake
- ninja
- libtool
- sha
- automake
- pkgconf
- unzip
- wget
- gettext
- python
- libffi
sources:
- https://github.com/neovim/neovim
environment:
SOURCEHUT: 1
LANG: en_US.UTF-8
CMAKE_EXTRA_FLAGS: -DCI_BUILD=ON -DMIN_LOG_LEVEL=3
tasks:
- build-deps: |
cd neovim
gmake deps
- build: |
cd neovim
gmake CMAKE_BUILD_TYPE=RelWithDebInfo CMAKE_EXTRA_FLAGS="${CMAKE_EXTRA_FLAGS}" nvim
- functionaltest: |
cd neovim
gmake functionaltest
- unittest: |
cd neovim
gmake unittest
# Unfortunately, oldtest is tanking hard on sourcehut's FreeBSD instance
# and not producing any logs as a result. So don't do this task for now.
# Ref: https://github.com/neovim/neovim/pull/11477#discussion_r352095005.
# - test-oldtest: |
# cd neovim
# gmake oldtest

View File

@@ -1,43 +1,41 @@
# sourcehut CI: https://builds.sr.ht/~jmk/neovim # sourcehut CI: https://builds.sr.ht/~jmk/neovim
image: openbsd/6.9 image: openbsd/6.7
packages: packages:
- autoconf-2.71 - autoconf-2.69p2
- automake-1.16.3 - automake-1.15.1
- cmake - cmake
- gettext-runtime-0.21p1 - gettext-runtime-0.20.1p1
- gettext-tools-0.21p1 - gettext-tools-0.20.1p3
- gmake - gmake
- libtool - libtool
- ninja-1.10.2p0 - ninja-1.10.0
- unzip-6.0p14 - unzip-6.0p13
sources: sources:
- https://github.com/neovim/neovim - https://github.com/neovim/neovim
environment:
SOURCEHUT: 1
LC_CTYPE: en_US.UTF-8
CMAKE_EXTRA_FLAGS: -DCI_BUILD=ON -DMIN_LOG_LEVEL=3
tasks: tasks:
- build-deps: |
export AUTOCONF_VERSION=2.71
export AUTOMAKE_VERSION=1.16
mkdir neovim/.deps
cd neovim/.deps
cmake -G Ninja ../third-party/
cmake --build . --config RelWithDebInfo
- build: | - build: |
mkdir neovim/build export AUTOCONF_VERSION=2.69
cd neovim/build export AUTOMAKE_VERSION=1.15
cmake -G Ninja $CMAKE_EXTRA_FLAGS ..
cmake --build . --config RelWithDebInfo
./bin/nvim --version
- functionaltest: |
cd neovim/build
cmake --build . --config RelWithDebInfo --target functionaltest
- oldtest: |
cd neovim cd neovim
mkdir .deps
cd .deps
cmake -G Ninja ../third-party/
cmake --build . --config Debug
cd ..
mkdir build
cd build
cmake -G Ninja -DMIN_LOG_LEVEL=3 ..
cmake --build . --config Debug
./bin/nvim --version
- test: |
export LC_CTYPE=en_US.UTF-8
# functional tests
cd neovim/build
# cmake --build . --config Debug --target functionaltest
# oldtests
cd ..
gmake oldtest gmake oldtest

View File

@@ -1,6 +1,6 @@
BasedOnStyle: Google BasedOnStyle: Google
Language: Cpp Language: Cpp
ColumnLimit: 100 ColumnLimit: 80
IndentWidth: 2 IndentWidth: 2
TabWidth: 2 TabWidth: 2
UseTab: Never UseTab: Never

View File

@@ -1,2 +0,0 @@
CompileFlags:
CompilationDatabase: build/ # Search build/ directory for compile_commands.json

View File

@@ -1,38 +0,0 @@
# To use this file (requires git 2.23):
# git config blame.ignoreRevsFile .git-blame-ignore-revs
# eval.c: factor out eval/funcs.c #11828
# - This is a move/rename. git 2.33 doesn't know how to ignore it.
# It is here anyway, (1) in case git improves later, and (2) to
# save you the trouble of attempting this.
6c5bbf07d988ef55e5e8ba8d70b62c1f0885261b
# symbol renames
6186df3562e33e92f04ed8c850204ceabc4746e1
# style (uncrustify, etc.)
2d240024acbd68c2d3f82bc72cb12b1a4928c6bf
61178778230e609d68b271ffd53ffd993cd23c42
15af08ad176339d1f269ce264bb0efea283c9536
47f99d66440ae8be26b34531989ac61edc1ad9fe
1e49a1c888a3d9a581f4aa409a26ada3ac2417cb
3b3dbcf7b7ba5466e6ab643e256f2374b520a6b2
e8067d1490a31ff76143d576dc9948b4f09c6c55
d5b66e88601b4d2fde5d905f9d12847126ba4449
07715044887d82f74254e64c4c32fa49b0501bea
6ed43f8f1caad702f9590d174c5ec142f3d85b18
0a83017fe95df0290adb98ec6bf457b96a3fab17
867e8885991ae450019c18aa5e42546bd4b62c2c
1f49268c46fcbe65f7e2e2cb620e6f51c059cf9e
51a98aa0c2fe3231a0ffc8a78189bc6fafd6abf6
853346a94d6aa78c97314a3b217fb5a5408a47f1
30fefee684e641a0c6867446c6de30efa2f0a126
f4ca3a29ddcb0c98e8e09c45a6342af709f8cc45
48e67b229415b4e2b3315bd00b817e5f9ab970c8
7a26eb8a567cbc831d4f629f9eccb767a44436b8
2f9b9e61d7417183f2d9f36d804247c0926be9d4
c0767bd4f3ce7b34bb77da0657c49ba10ba1b32e
d90fb1c0bfc1e64c783c385a79e7de87013dadba
9c268263b1792d00b3ffdfd7495af2575862656e
8c74c895b300bcee5fa937a2329d1d4756567b42
40be47e0faef7aa015eb4ba44ceb1ee1a03e97cf

5
.gitattributes vendored
View File

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

3
.github/FUNDING.yml vendored
View File

@@ -1,2 +1 @@
github: neovim custom: https://salt.bountysource.com/teams/neovim
open_collective: neovim

29
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@@ -0,0 +1,29 @@
---
name: Bug report
about: Report a problem in Nvim
title: ''
labels: bug
---
<!-- Before reporting: search existing issues and check the FAQ. -->
- `nvim --version`:
- `vim -u DEFAULTS` (version: ) behaves differently?
- Operating system/version:
- Terminal name/version:
- `$TERM`:
### Steps to reproduce using `nvim -u NORC`
```
nvim -u NORC
# Alternative for shell-related problems:
# env -i TERM=ansi-256color "$(which nvim)"
```
### Actual behaviour
### Expected behaviour

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

@@ -1,61 +0,0 @@
name: Language server (LSP) client bug
description: Report an issue with Neovim LSP
labels: [bug, lsp]
body:
- type: markdown
attributes:
value: |
_Before reporting:_ search [existing issues](https://github.com/neovim/neovim/issues?q=is%3Aissue+is%3Aopen+label%3Abug) and check the [FAQ](https://github.com/neovim/neovim/wiki/FAQ). Usage questions such as "How do I...?" or "Why isn't X language server/feature working?" belong on the [Neovim Discourse](https://neovim.discourse.group/c/7-category/7) and will be closed.
- type: input
attributes:
label: "Neovim version (nvim -v)"
placeholder: "0.6.0 commit db1b0ee3b30f"
validations:
required: true
- type: input
attributes:
label: "Language server name/version"
placeholder: "rls 0.5.2"
validations:
required: true
- type: input
attributes:
label: "Operating system/version"
placeholder: "emacs 23"
validations:
required: true
- type: textarea
attributes:
label: ':checkhealth'
description: |
Paste the results from `nvim -c ":checkhealth nvim lspconfig"`
render: markdown
- type: textarea
attributes:
label: 'Steps to reproduce using "nvim -u minimal_init.lua"'
description: |
- Download the minimal config with `curl -LO https://raw.githubusercontent.com/neovim/nvim-lspconfig/master/test/minimal_init.lua` and modify it to include any specific commands or servers pertaining to your issues.
- _Note_: if the issue is with an autocompletion or other LSP plugin, report to that plugin's issue tracker.
validations:
required: true
- type: textarea
attributes:
label: "Expected behavior"
description: "Describe the behavior you expect. May include logs, images, or videos."
- type: textarea
attributes:
label: "Actual behavior"
- type: input
attributes:
label: "Log file"
placeholder: "https://gist.github.com/prakhar1989/1b0a2c9849b2e1e912fb"
description: |
- Upload `lsp.log` before and after the problem in a [secret gist](https://gist.github.com/). Paste the URL to the gist.
- You can set the log level by adding `vim.lsp.set_log_level("debug")` after setting up LSP in your config.
- You can find the location of the log with `:lua print(vim.lsp.get_log_path())`

61
.github/labeler.yml vendored
View File

@@ -1,61 +0,0 @@
"lsp":
- runtime/lua/vim/lsp.lua
- runtime/lua/vim/lsp/*
"lua":
- runtime/lua/**/*
- src/nvim/lua/*
"tui":
- src/nvim/tui/tui.*
"treesitter":
- src/nvim/lua/treesitter.*
- runtime/lua/vim/treesitter.lua
- runtime/lua/vim/treesitter/*
"diagnostic":
- runtime/lua/vim/diagnostic.lua
"dependencies":
- third-party/**/*
"spell":
- src/nvim/spell*
"terminal":
- src/nvim/terminal.*
"column":
- src/nvim/mark.h
- src/nvim/mark.c
- src/nvim/sign*
"folds":
- src/nvim/fold*
"mouse":
- src/nvim/mouse*
"documentation":
- all: ["runtime/doc/*"]
"clipboard":
- runtime/autoload/provider/clipboard.vim
"diff":
- src/nvim/diff.*
"build":
- CMakeLists.txt
- "**/CMakeLists.txt"
- "**/*.cmake"
"tests":
- all: ["test/**/*"]
"ci":
- .github/labeler.yml
- .github/workflows/**/*
- .builds/*
- ci/**/*

View File

@@ -1,53 +0,0 @@
name: Autogenerate API docs
on:
push:
paths:
- 'src/nvim/api/*.[ch]'
- 'src/nvim/**.lua'
- 'runtime/lua/**.lua'
branches:
- 'master'
- 'release-[0-9]+.[0-9]+'
workflow_dispatch:
jobs:
regen-api-docs:
runs-on: ubuntu-20.04
permissions:
contents: write
pull-requests: write
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Install dependencies
run: |
sudo apt-get update
sudo env DEBIAN_FRONTEND=noninteractive apt-get install -y python3 luajit
conda install -c conda-forge doxygen=1.9.2 msgpack-python
echo "$CONDA/bin" >> $GITHUB_PATH
- name: Setup git config
run: |
git config --global user.name 'marvim'
git config --global user.email 'marvim@users.noreply.github.com'
- run: printf 'DOC_BRANCH=marvim/api-doc-update/%s\n' ${GITHUB_REF#refs/heads/} >> $GITHUB_ENV
- name: Generate docs
id: docs
run: |
git checkout -b ${DOC_BRANCH}
python3 scripts/gen_vimdoc.py
printf '::set-output name=UPDATED_DOCS::%s\n' $([ -z "$(git diff)" ]; echo $?)
- name: Automatic PR
if: ${{ steps.docs.outputs.UPDATED_DOCS != 0 }}
run: |
git add -u
git commit -m 'docs: regenerate'
git push --force https://${GITHUB_ACTOR}:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY} ${DOC_BRANCH}
gh pr create --fill --base ${GITHUB_REF#refs/heads/} --head ${DOC_BRANCH} || true

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' &&
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,220 +0,0 @@
name: CI
on:
push:
branches:
- 'master'
- 'release-[0-9]+.[0-9]+'
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
branches:
- 'master'
- 'release-[0-9]+.[0-9]+'
jobs:
lint:
if: (github.event_name == 'pull_request' && github.base_ref == 'master' && !github.event.pull_request.draft) || (github.event_name == 'push' && github.ref == 'refs/heads/master')
runs-on: ubuntu-20.04
env:
CC: gcc
steps:
- uses: actions/checkout@v2
- name: Setup common environment variables
run: ./.github/workflows/env.sh lint
- name: Install apt packages
run: |
sudo apt-get update
sudo apt-get install -y autoconf automake build-essential ccache cmake cpanminus gettext gperf language-pack-tr libtool-bin locales ninja-build pkg-config python3 python3-pip python3-setuptools unzip
- name: Setup interpreter packages
run: |
./ci/before_install.sh
./ci/install.sh
- name: Cache dependencies
uses: actions/cache@v2
with:
path: |
${{ env.CACHE_NVIM_DEPS_DIR }}
~/.ccache
key: ${{ matrix.runner }}-lint-${{ matrix.cc }}-${{ hashFiles('cmake/*', 'third-party/**', '**/CMakeLists.txt') }}-${{ github.base_ref }}
- name: Build third-party
run: ./ci/before_script.sh
- name: Run lint
run: ./ci/script.sh
- name: Cache dependencies
if: ${{ success() }}
run: ./ci/before_cache.sh
unixish:
name: ${{ matrix.runner }} ${{ matrix.flavor }} (cc=${{ matrix.cc }})
strategy:
fail-fast: false
matrix:
include:
- flavor: asan
cc: clang-12
runner: ubuntu-20.04
os: linux
- flavor: tsan
cc: clang-12
runner: ubuntu-20.04
os: linux
- cc: clang
runner: macos-10.15
os: osx
- cc: clang
runner: macos-11.0
os: osx
runs-on: ${{ matrix.runner }}
timeout-minutes: 45
if: github.event.pull_request.draft == false
env:
CC: ${{ matrix.cc }}
CI_OS_NAME: ${{ matrix.os }}
steps:
- uses: actions/checkout@v2
- name: Setup common environment variables
run: ./.github/workflows/env.sh ${{ matrix.flavor }}
- name: Install apt packages
if: matrix.os == 'linux'
run: |
sudo apt-get update
sudo apt-get install -y autoconf automake build-essential ccache cmake cpanminus cscope gcc-multilib gdb gettext gperf language-pack-tr libtool-bin locales ninja-build pkg-config python3 python3-pip python3-setuptools unzip valgrind xclip
- name: Install new clang
if: matrix.flavor == 'asan' || matrix.flavor == 'tsan'
run: |
wget https://apt.llvm.org/llvm.sh
chmod a+x llvm.sh
sudo ./llvm.sh 12
rm llvm.sh
- name: Install brew packages
if: matrix.os == 'osx'
run: |
# Workaround brew issues
rm -f /usr/local/bin/2to3
brew update >/dev/null
brew upgrade
brew install automake ccache perl cpanminus ninja
- name: Setup interpreter packages
run: |
./ci/before_install.sh
./ci/install.sh
- name: Cache dependencies
uses: actions/cache@v2
with:
path: |
${{ env.CACHE_NVIM_DEPS_DIR }}
~/.ccache
key: ${{ matrix.runner }}-${{ matrix.flavor }}-${{ matrix.cc }}-${{ hashFiles('cmake/*', 'third-party/**', '**/CMakeLists.txt') }}-${{ github.base_ref }}
- name: Build third-party
run: ./ci/before_script.sh
- name: Build and test
run: ./ci/script.sh
- name: Cache dependencies
if: ${{ success() }}
run: ./ci/before_cache.sh
windows:
runs-on: windows-2016
if: github.event.pull_request.draft == false
env:
DEPS_BUILD_DIR: ${{ format('{0}/nvim-deps', github.workspace) }}
DEPS_PREFIX: ${{ format('{0}/nvim-deps/usr', github.workspace) }}
strategy:
fail-fast: false
matrix:
config: [ MINGW_64-gcov, MSVC_64 ]
name: windows (${{ matrix.config }})
steps:
- uses: actions/checkout@v2
- uses: actions/cache@v2
with:
path: ${{ env.DEPS_BUILD_DIR }}
key: ${{ matrix.config }}-${{ hashFiles('third-party\**') }}
- name: Run CI
run: powershell ci\build.ps1
env:
CONFIGURATION: ${{ matrix.config }}
functionaltest:
name: ${{ matrix.runner }} ${{ matrix.flavor }} (cc=${{ matrix.cc }})
strategy:
fail-fast: false
matrix:
include:
- flavor: functionaltest-lua
cc: gcc
runner: ubuntu-20.04
os: linux
runs-on: ${{ matrix.runner }}
timeout-minutes: 45
env:
CC: ${{ matrix.cc }}
CI_OS_NAME: ${{ matrix.os }}
steps:
- uses: actions/checkout@v2
- name: Setup commom environment variables
run: ./.github/workflows/env.sh ${{ matrix.flavor }}
- name: Install apt packages
run: |
sudo apt-get update
sudo apt-get install -y autoconf automake build-essential ccache cmake cpanminus cscope gcc-multilib gdb gettext gperf language-pack-tr libtool-bin locales ninja-build pkg-config python3 python3-pip python3-setuptools unzip valgrind xclip
- name: Install minimum required version of cmake
env:
CMAKE_URL: 'https://cmake.org/files/v3.10/cmake-3.10.0-Linux-x86_64.sh'
CMAKE_VERSION: '3.10.0'
shell: bash
run: |
curl --retry 5 --silent --show-error --fail -o /tmp/cmake-installer.sh "$CMAKE_URL"
mkdir -p "$HOME/.local/bin" /opt/cmake-custom
chmod a+x /tmp/cmake-installer.sh
/tmp/cmake-installer.sh --prefix=/opt/cmake-custom --skip-license
ln -sfn /opt/cmake-custom/bin/cmake "$HOME/.local/bin/cmake"
cmake_version="$(cmake --version | head -1)"
echo "$cmake_version" | grep -qF "cmake version $CMAKE_VERSION" || {
echo "Unexpected CMake version: $cmake_version"
exit 1
}
- name: Setup interpreter packages
run: |
./ci/before_install.sh
./ci/install.sh
- name: Cache dependencies
uses: actions/cache@v2
with:
path: |
${{ env.CACHE_NVIM_DEPS_DIR }}
~/.ccache
key: ${{ matrix.runner }}-${{ matrix.flavor }}-${{ matrix.cc }}-${{ hashFiles('cmake/*', 'third-party/**', '**/CMakeLists.txt') }}-${{ github.base_ref }}
- name: Build third-party
run: ./ci/before_script.sh
- name: Build and test
run: ./ci/script.sh
- name: Cache dependencies
if: ${{ success() }}
run: ./ci/before_cache.sh

View File

@@ -1,21 +0,0 @@
name: "Commit Linter"
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
jobs:
lint-commits:
runs-on: ubuntu-latest
if: github.event.pull_request.draft == false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps:
- uses: actions/checkout@v2.3.1
with:
fetch-depth: 0
ref: ${{ github.event.pull_request.head.sha }}
path: pr_nvim
- uses: rhysd/action-setup-vim@v1
with:
neovim: true
- run: wget https://raw.githubusercontent.com/neovim/neovim/master/scripts/lintcommit.lua
- run: nvim --clean -es +"cd pr_nvim" +"lua dofile('../lintcommit.lua').main({trace=true})"

View File

@@ -1,44 +0,0 @@
name: Coverity
on:
schedule:
- cron: '0 10 * * 1' # Run every Monday at 00:10
workflow_dispatch:
jobs:
scan:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y autoconf automake build-essential cmake gettext gperf libtool-bin locales ninja-build pkg-config unzip
- name: Download Coverity
run: |
wget -q https://scan.coverity.com/download/cxx/linux64 --post-data "token=$TOKEN&project=neovim%2Fneovim" -O coverity_tool.tgz
mkdir cov-scan
tar ax -f coverity_tool.tgz --strip-components=1 -C cov-scan
env:
TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}
- name: Build dependencies
run: make deps
- name: Build/scan neovim
run: |
env PATH=$(pwd)/cov-scan/bin:$PATH cov-build --dir cov-int make
- name: Submit results
run: |
tar zcf cov-scan.tgz cov-int
curl --form token=$TOKEN \
--form email=$EMAIL \
--form file=@cov-scan.tgz \
--form version="$(git rev-parse HEAD)" \
--form description="Weekly GHA scan" \
'https://scan.coverity.com/builds?project=neovim%2Fneovim'
env:
TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }}
EMAIL: ${{ secrets.COVERITY_SCAN_EMAIL }}

View File

@@ -1,65 +0,0 @@
#!/bin/bash
set -e -u
FLAVOR=${1:-}
cat <<EOF >> "$GITHUB_PATH"
$HOME/.local/bin
EOF
cat <<EOF >> "$GITHUB_ENV"
CACHE_ENABLE=true
CI_TARGET=tests
CI_BUILD_DIR=$GITHUB_WORKSPACE
BUILD_DIR=$GITHUB_WORKSPACE/build
DEPS_BUILD_DIR=$HOME/nvim-deps
INSTALL_PREFIX=$HOME/nvim-install
LOG_DIR=$GITHUB_WORKSPACE/build/log
NVIM_LOG_FILE=$GITHUB_WORKSPACE/build/.nvimlog
VALGRIND_LOG=$GITHUB_WORKSPACE/build/log/valgrind-%p.log
CACHE_NVIM_DEPS_DIR=$HOME/.cache/nvim-deps
CACHE_MARKER=$HOME/.cache/nvim-deps/.ci_cache_marker
CCACHE_BASEDIR=$GITHUB_WORKSPACE
CCACHE_COMPRESS=1
CCACHE_SLOPPINESS=time_macros,file_macro
CCACHE_DIR=$HOME/.ccache
EOF
DEPS_CMAKE_FLAGS=-DUSE_BUNDLED_GPERF=OFF
FUNCTIONALTEST=functionaltest
BUILD_FLAGS="CMAKE_FLAGS=-DCI_BUILD=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX:PATH=$HOME/nvim-install -DBUSTED_OUTPUT_TYPE=nvim -DDEPS_PREFIX=$HOME/nvim-deps/usr -DMIN_LOG_LEVEL=3"
case "$FLAVOR" in
asan)
BUILD_FLAGS="$BUILD_FLAGS -DPREFER_LUA=ON"
cat <<EOF >> "$GITHUB_ENV"
CLANG_SANITIZER=ASAN_UBSAN
SYMBOLIZER=asan_symbolize-12
ASAN_OPTIONS=detect_leaks=1:check_initialization_order=1:log_path=$GITHUB_WORKSPACE/build/log/asan
UBSAN_OPTIONS=print_stacktrace=1 log_path=$GITHUB_WORKSPACE/build/log/ubsan
EOF
;;
tsan)
cat <<EOF >> "$GITHUB_ENV"
TSAN_OPTIONS=log_path=$GITHUB_WORKSPACE/build/log/tsan
EOF
;;
lint)
cat <<EOF >> "$GITHUB_ENV"
CI_TARGET=lint
EOF
;;
functionaltest-lua)
BUILD_FLAGS="$BUILD_FLAGS -DPREFER_LUA=ON"
FUNCTIONALTEST=functionaltest-lua
DEPS_CMAKE_FLAGS="$DEPS_CMAKE_FLAGS -DUSE_BUNDLED_LUAJIT=OFF"
;;
*)
;;
esac
cat <<EOF >> "$GITHUB_ENV"
$BUILD_FLAGS
DEPS_CMAKE_FLAGS=$DEPS_CMAKE_FLAGS
FUNCTIONALTEST=$FUNCTIONALTEST
EOF

View File

@@ -1,30 +0,0 @@
name: "Pull Request Labeler"
on:
pull_request_target:
types: opened
jobs:
triage:
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: write
steps:
- uses: actions/labeler@main
with:
repo-token: "${{ secrets.GITHUB_TOKEN }}"
type-scope:
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GH_REPO: ${{ github.repository }}
PR_NUMBER: ${{ github.event.pull_request.number }}
PR_TITLE: ${{ github.event.pull_request.title }}
steps:
# Extract type and try to add it as a label
- run: gh pr edit "$PR_NUMBER" --add-label "$(echo "$PR_TITLE" | sed -E 's|([[:alpha:]]+)(\(.*\))?!?:.*|\1|')" || true
# Extract scope and try to add it as a label
- run: gh pr edit "$PR_NUMBER" --add-label "$(echo "$PR_TITLE" | sed -E 's|[[:alpha:]]+\((.+)\)!?:.*|\1|')" || true

View File

@@ -1,40 +0,0 @@
```
${NVIM_VERSION}
```
## Install
### Windows
1. Extract **nvim-win64.zip**
2. Run `nvim-qt.exe`
### macOS
1. Download **nvim-macos.tar.gz**
2. Extract: `tar xzvf nvim-macos.tar.gz`
3. Run `./nvim-osx64/bin/nvim`
### Linux (x64)
1. Download **nvim.appimage**
2. Run `chmod u+x nvim.appimage && ./nvim.appimage`
- If your system does not have FUSE you can [extract the appimage](https://github.com/AppImage/AppImageKit/wiki/FUSE#type-2-appimage):
```
./nvim.appimage --appimage-extract
./squashfs-root/usr/bin/nvim
```
### Other
- Install by [package manager](https://github.com/neovim/neovim/wiki/Installing-Neovim)
## SHA256 Checksums
```
${SHA_LINUX_64}
${SHA_APP_IMAGE}
${SHA_APP_IMAGE_ZSYNC}
${SHA_MACOS}
${SHA_WIN_64}
```

View File

@@ -1,222 +0,0 @@
name: Release
on:
schedule:
- cron: '5 5 * * *'
workflow_dispatch:
inputs:
tag_name:
description: 'Tag name for release'
required: false
default: nightly
push:
tags:
- v[0-9]+.[0-9]+.[0-9]+
# Build on the oldest supported images, so we have broader compatibility
# Upgrade to gcc-11 to prevent it from using its builtins (#14150)
jobs:
linux:
runs-on: ubuntu-18.04
outputs:
version: ${{ steps.build.outputs.version }}
release: ${{ steps.build.outputs.release }}
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y autoconf automake build-essential cmake gcc-11 gettext gperf libtool-bin locales ninja-build pkg-config unzip
- if: github.event_name == 'push' || (github.event_name == 'workflow_dispatch' && github.event.inputs.tag_name != 'nightly')
run: printf 'NVIM_BUILD_TYPE=Release\n' >> $GITHUB_ENV
- if: github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.event.inputs.tag_name == 'nightly')
run: printf 'NVIM_BUILD_TYPE=RelWithDebInfo\n' >> $GITHUB_ENV
- name: Build release
id: build
run: |
CC=gcc-11 make CMAKE_BUILD_TYPE=${NVIM_BUILD_TYPE} CMAKE_EXTRA_FLAGS="-DCMAKE_INSTALL_PREFIX:PATH="
printf '::set-output name=version::%s\n' "$(./build/bin/nvim --version | head -n 3 | sed -z 's/\n/%0A/g')"
printf '::set-output name=release::%s\n' "$(./build/bin/nvim --version | head -n 1)"
make DESTDIR="$GITHUB_WORKSPACE/build/release/nvim-linux64" install
cd "$GITHUB_WORKSPACE/build/release"
tar cfz nvim-linux64.tar.gz nvim-linux64
- uses: actions/upload-artifact@v2
with:
name: nvim-linux64
path: build/release/nvim-linux64.tar.gz
retention-days: 1
appimage:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y autoconf automake build-essential cmake gcc-11 gettext gperf libtool-bin locales ninja-build pkg-config unzip
- if: github.event_name == 'push' || (github.event_name == 'workflow_dispatch' && github.event.inputs.tag_name != 'nightly')
run: CC=gcc-11 make appimage-latest
- if: github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.event.inputs.tag_name == 'nightly')
run: CC=gcc-11 make appimage-nightly
- uses: actions/upload-artifact@v2
with:
name: appimage
path: build/bin/nvim.appimage
retention-days: 1
- uses: actions/upload-artifact@v2
with:
name: appimage
path: build/bin/nvim.appimage.zsync
retention-days: 1
macOS:
runs-on: macos-10.15
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Install brew packages
run: |
rm -f /usr/local/bin/2to3
brew update >/dev/null
brew upgrade
brew install automake ninja
- if: github.event_name == 'push' || (github.event_name == 'workflow_dispatch' && github.event.inputs.tag_name != 'nightly')
run: printf 'NVIM_BUILD_TYPE=Release\n' >> $GITHUB_ENV
- if: github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && github.event.inputs.tag_name == 'nightly')
run: printf 'NVIM_BUILD_TYPE=RelWithDebInfo\n' >> $GITHUB_ENV
- name: Build release
run: |
make CMAKE_BUILD_TYPE=${NVIM_BUILD_TYPE} CMAKE_EXTRA_FLAGS="-DCMAKE_INSTALL_PREFIX:PATH= -DCMAKE_OSX_DEPLOYMENT_TARGET=10.11"
make DESTDIR="$GITHUB_WORKSPACE/build/release/nvim-osx64" install
- name: Create package
run: |
cd "$GITHUB_WORKSPACE/build/release"
mkdir -p nvim-osx64/libs
libs=($(otool -L nvim-osx64/bin/nvim | sed 1d | sed -E -e 's|^[[:space:]]*||' -e 's| .*||'))
echo "libs:"
for lib in "${libs[@]}"; do
if echo "$lib" | grep -q -E 'libSystem|CoreFoundation' 2>/dev/null; then
echo " [skipped] $lib"
else
echo " $lib"
relname="libs/${lib##*/}"
cp -L "$lib" "nvim-osx64/$relname"
install_name_tool -change "$lib" "@executable_path/../$relname" nvim-osx64/bin/nvim
fi
done
tar cfz nvim-macos.tar.gz nvim-osx64
- uses: actions/upload-artifact@v2
with:
name: nvim-macos
path: build/release/nvim-macos.tar.gz
retention-days: 1
windows:
runs-on: windows-2016
env:
DEPS_BUILD_DIR: ${{ format('{0}/nvim-deps', github.workspace) }}
DEPS_PREFIX: ${{ format('{0}/nvim-deps/usr', github.workspace) }}
strategy:
matrix:
include:
- config: MSVC_64
archive: nvim-win64
name: windows (${{ matrix.config }})
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- run: powershell ci\build.ps1 -NoTests
env:
CONFIGURATION: ${{ matrix.config }}
- run: move build\Neovim.zip build\${{ matrix.archive }}.zip
- uses: actions/upload-artifact@v2
with:
name: ${{ matrix.archive }}
path: build/${{ matrix.archive }}.zip
retention-days: 1
publish:
needs: [linux, appimage, macOS, windows]
runs-on: ubuntu-20.04
env:
GH_REPO: ${{ github.repository }}
permissions:
contents: write
steps:
# Must perform checkout first, since it deletes the target directory
# before running, and would therefore delete the downloaded artifacts
- uses: actions/checkout@v2
- uses: actions/download-artifact@v2
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y gettext-base
- if: github.event_name == 'workflow_dispatch'
run: echo "TAG_NAME=${{ github.event.inputs.tag_name }}" >> $GITHUB_ENV
- if: github.event_name == 'schedule'
run: echo 'TAG_NAME=nightly' >> $GITHUB_ENV
- if: github.event_name == 'push'
run: |
TAG_NAME=${{ github.ref }}
echo "TAG_NAME=${TAG_NAME#refs/tags/}" >> $GITHUB_ENV
- if: env.TAG_NAME == 'nightly'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
(echo 'SUBJECT=Nvim development (prerelease) build';
echo 'PRERELEASE=--prerelease') >> $GITHUB_ENV
gh release delete nightly --yes || true
git push origin :nightly || true
- if: env.TAG_NAME != 'nightly'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
(echo 'SUBJECT=Nvim release build';
echo 'PRERELEASE=') >> $GITHUB_ENV
gh release delete stable --yes || true
git push origin :stable || true
# `sha256sum` outputs <sha> <path>, so we cd into each dir to drop the
# containing folder from the output.
- name: Generate Linux64 SHA256 checksums
run: |
cd ./nvim-linux64
sha256sum nvim-linux64.tar.gz > nvim-linux64.tar.gz.sha256sum
echo "SHA_LINUX_64=$(cat nvim-linux64.tar.gz.sha256sum)" >> $GITHUB_ENV
- name: Generate App Image SHA256 checksums
run: |
cd ./appimage
sha256sum nvim.appimage > nvim.appimage.sha256sum
echo "SHA_APP_IMAGE=$(cat nvim.appimage.sha256sum)" >> $GITHUB_ENV
- name: Generate App Image Zsync SHA256 checksums
run: |
cd ./appimage
sha256sum nvim.appimage.zsync > nvim.appimage.zsync.sha256sum
echo "SHA_APP_IMAGE_ZSYNC=$(cat nvim.appimage.zsync.sha256sum)" >> $GITHUB_ENV
- name: Generate macOS SHA256 checksums
run: |
cd ./nvim-macos
sha256sum nvim-macos.tar.gz > nvim-macos.tar.gz.sha256sum
echo "SHA_MACOS=$(cat nvim-macos.tar.gz.sha256sum)" >> $GITHUB_ENV
- name: Generate Win64 SHA256 checksums
run: |
cd ./nvim-win64
sha256sum nvim-win64.zip > nvim-win64.zip.sha256sum
echo "SHA_WIN_64=$(cat nvim-win64.zip.sha256sum)" >> $GITHUB_ENV
- name: Publish release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NVIM_VERSION: ${{ needs.linux.outputs.version }}
run: |
envsubst < "$GITHUB_WORKSPACE/.github/workflows/notes.md" > "$RUNNER_TEMP/notes.md"
gh release create $TAG_NAME $PRERELEASE --notes-file "$RUNNER_TEMP/notes.md" --title "$SUBJECT" --target $GITHUB_SHA nvim-macos/* nvim-linux64/* appimage/* nvim-win64/*
if [ "$TAG_NAME" != "nightly" ]; then
gh release create stable $PRERELEASE --notes-file "$RUNNER_TEMP/notes.md" --title "$SUBJECT" --target $GITHUB_SHA nvim-macos/* nvim-linux64/* appimage/* nvim-win64/*
fi

View File

@@ -1,52 +0,0 @@
name: vim-patches
on:
schedule:
- cron: '3 3 * * *'
jobs:
update-vim-patches:
runs-on: ubuntu-20.04
permissions:
contents: write
pull-requests: write
env:
VIM_SOURCE_DIR: ${{ format('{0}/vim-src', github.workspace) }}
VERSION_BRANCH: marvim/ci-version-update
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- uses: actions/checkout@v2
with:
repository: vim/vim
path: ${{ env.VIM_SOURCE_DIR }}
fetch-depth: 0
- run: |
gh release download -R neovim/neovim -p nvim.appimage
chmod a+x nvim.appimage
mkdir -p $HOME/.local/bin
mv nvim.appimage $HOME/.local/bin/nvim
printf '%s\n' "$HOME/.local/bin" >> $GITHUB_PATH
- name: Setup git config
run: |
git config --global user.name 'marvim'
git config --global user.email 'marvim@users.noreply.github.com'
- name: Update src/version.c
id: update-version
run: |
git checkout -b ${VERSION_BRANCH}
nvim -i NONE -u NONE --headless +'luafile scripts/vimpatch.lua' +q
printf '::set-output name=NEW_PATCHES::%s\n' $([ -z "$(git diff)" ]; echo $?)
- name: Automatic PR
if: ${{ steps.update-version.outputs.NEW_PATCHES != 0 }}
run: |
git add -u
git commit -m 'version.c: update [skip ci]'
git push --force https://${GITHUB_ACTOR}:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY} ${VERSION_BRANCH}
gh pr create --fill --label vim-patch --base ${GITHUB_REF#refs/heads/} --head ${VERSION_BRANCH} || true

32
.gitignore vendored
View File

@@ -1,21 +1,16 @@
# Tools # Tools
/venv/ .ropeproject/
compile_commands.json compile_commands.json
# Visual Studio
# IDEs
/.vs/ /.vs/
/.vscode/
/.idea/
# Build/deps dir # Build/deps dir
/build/ /build/
/cmake-build-debug/
/dist/
/.deps/ /.deps/
/tmp/ /tmp/
/.clangd/
/.cache/clangd/
/.ccls-cache/
.DS_Store
*.mo *.mo
.*.sw? .*.sw?
*~ *~
@@ -23,6 +18,8 @@ compile_commands.json
*.o *.o
*.so *.so
tags
/src/nvim/po/vim.pot /src/nvim/po/vim.pot
/src/nvim/po/*.ck /src/nvim/po/*.ck
@@ -30,14 +27,13 @@ compile_commands.json
/.nvimlog /.nvimlog
# Generated by scripts/vim-patch.sh # Generated by scripts/vim-patch.sh
/.vim-src /.vim-src/
*.rej
# Generated by old (Vim) tests. # Generated by old (Vim) tests.
/src/nvim/testdir/del /src/nvim/testdir/del
/src/nvim/testdir/test*.out /src/nvim/testdir/test*.out
/src/nvim/testdir/test*.res /src/nvim/testdir/test*.res
/src/nvim/testdir/test*.log /src/nvim/testdir/test.log
/src/nvim/testdir/messages /src/nvim/testdir/messages
/src/nvim/testdir/viminfo /src/nvim/testdir/viminfo
/src/nvim/testdir/test.ok /src/nvim/testdir/test.ok
@@ -46,7 +42,6 @@ compile_commands.json
/src/nvim/testdir/valgrind.* /src/nvim/testdir/valgrind.*
/src/nvim/testdir/.gdbinit /src/nvim/testdir/.gdbinit
/runtime/indent/testdir/*.out /runtime/indent/testdir/*.out
+runtime/indent/testdir/*.fail
# Generated by src/nvim/testdir/runnvim.sh. # Generated by src/nvim/testdir/runnvim.sh.
/src/nvim/testdir/*.tlog /src/nvim/testdir/*.tlog
@@ -59,15 +54,10 @@ compile_commands.json
# local make targets # local make targets
local.mk local.mk
# Generated from :help docs # runtime/doc
tags
/runtime/doc/*.html /runtime/doc/*.html
/runtime/doc/tags.ref /runtime/doc/tags.ref
/runtime/doc/errors.log /runtime/doc/errors.log
# Generated by gen_vimdoc.py: # CLion
/runtime/doc/*.mpack /.idea/
/tmp-*-doc
# vim patches
/vim-*.patch

View File

@@ -1,14 +1,7 @@
-- vim: ft=lua tw=80 -- vim: ft=lua tw=80
stds.nvim = {
read_globals = { "jit" }
}
std = "lua51+nvim"
-- Ignore W211 (unused variable) with preload files. -- Ignore W211 (unused variable) with preload files.
files["**/preload.lua"] = {ignore = { "211" }} files["**/preload.lua"] = {ignore = { "211" }}
-- Allow vim module to modify itself, but only here.
files["src/nvim/lua/vim.lua"] = {ignore = { "122/vim" }}
-- Don't report unused self arguments of methods. -- Don't report unused self arguments of methods.
self = false self = false
@@ -25,7 +18,3 @@ ignore = {
read_globals = { read_globals = {
"vim", "vim",
} }
exclude_files = {
'test/functional/fixtures/lua/syntax_error.lua',
}

22
.luacov
View File

@@ -1,22 +0,0 @@
-- Configuration file for LuaCov
local source = require("lfs").currentdir()
local function pesc(s)
assert(type(s) == 'string', s)
return s:gsub('[%(%)%.%%%+%-%*%?%[%]%^%$]', '%%%1')
end
return {
include = {
-- Absolute paths (starting with source dir, not hidden (i.e. .deps)).
pesc(source) .. "[/\\][^.].+",
-- Relative (non-hidden) paths.
'^[^/\\.]',
},
modules = {
['vim'] = 'runtime/lua/vim/shared.lua'
},
}
-- vim: ft=lua tw=80 sw=2 et

View File

@@ -1,23 +1,9 @@
dist: bionic dist: xenial
language: c language: c
env: env:
global: global:
# Encrypted environment variables, see
# http://docs.travis-ci.com/user/encryption-keys/
#
# SNAP_SECRET_KEY: generated by:
# travis encrypt SNAP_SECRET_KEY=xx --add
# https://github.com/neovim/neovim/pull/11428
# snapcraft key expires after 1 year. Steps to refresh it:
# 1. snapcraft enable-ci travis --refresh
# 2. mv .snapcraft/travis_snapcraft.cfg ci/snap/travis_snapcraft.cfg
# 3. Copy after_success command to ci/snap/deploy.sh from .travis.yml
# 4. Undo changes to .travis.yml
- secure: hd0qn2u8ABbJg5Bx4pBRcUQbKYFmcSHoecyHIPTCnGJT+NI41Bvm/IkN/N5DhBF+LbD3Q2nmR/dzI5H/dqS7RxMFvEx1DuFLendFHHX3MYf0AuKpXYY3gwgMTmqx8p/v6srlU7RBGWNGzHCWqksAem+EIWCe3I7WvfdKo1/DV/Y=
- PATH="$HOME/.local/bin:$PATH"
# Set "false" to force rebuild of third-party dependencies. # Set "false" to force rebuild of third-party dependencies.
- CACHE_ENABLE=true - CACHE_ENABLE=true
# Build directory for Neovim. # Build directory for Neovim.
@@ -31,13 +17,17 @@ env:
# Nvim log file. # Nvim log file.
- NVIM_LOG_FILE="$BUILD_DIR/.nvimlog" - NVIM_LOG_FILE="$BUILD_DIR/.nvimlog"
# Default CMake flags. # Default CMake flags.
- CMAKE_FLAGS="-DCI_BUILD=ON - CMAKE_FLAGS="-DTRAVIS_CI_BUILD=ON
-DCMAKE_BUILD_TYPE=Debug -DCMAKE_BUILD_TYPE=Debug
-DCMAKE_INSTALL_PREFIX:PATH=$INSTALL_PREFIX -DCMAKE_INSTALL_PREFIX:PATH=$INSTALL_PREFIX
-DBUSTED_OUTPUT_TYPE=nvim -DBUSTED_OUTPUT_TYPE=nvim
-DDEPS_PREFIX=$DEPS_BUILD_DIR/usr -DDEPS_PREFIX=$DEPS_BUILD_DIR/usr
-DMIN_LOG_LEVEL=3" -DMIN_LOG_LEVEL=3"
- DEPS_CMAKE_FLAGS="-DUSE_BUNDLED_GPERF=OFF" - DEPS_CMAKE_FLAGS="-DUSE_BUNDLED_GPERF=OFF"
# Additional CMake flags for 32-bit builds.
- CMAKE_FLAGS_32BIT="-DCMAKE_SYSTEM_LIBRARY_PATH=/lib32:/usr/lib32:/usr/local/lib32
-DCMAKE_IGNORE_PATH=/lib:/usr/lib:/usr/local/lib
-DCMAKE_TOOLCHAIN_FILE=$TRAVIS_BUILD_DIR/cmake/i386-linux-gnu.toolchain.cmake"
# Environment variables for Clang sanitizers. # Environment variables for Clang sanitizers.
- ASAN_OPTIONS="detect_leaks=1:check_initialization_order=1:log_path=$LOG_DIR/asan" - ASAN_OPTIONS="detect_leaks=1:check_initialization_order=1:log_path=$LOG_DIR/asan"
- TSAN_OPTIONS="log_path=$LOG_DIR/tsan" - TSAN_OPTIONS="log_path=$LOG_DIR/tsan"
@@ -46,7 +36,7 @@ env:
- VALGRIND_LOG="$LOG_DIR/valgrind-%p.log" - VALGRIND_LOG="$LOG_DIR/valgrind-%p.log"
- CACHE_NVIM_DEPS_DIR="$HOME/.cache/nvim-deps" - CACHE_NVIM_DEPS_DIR="$HOME/.cache/nvim-deps"
# If this file exists, the cache is valid (compile was successful). # If this file exists, the cache is valid (compile was successful).
- CACHE_MARKER="$CACHE_NVIM_DEPS_DIR/.ci_cache_marker" - CACHE_MARKER="$CACHE_NVIM_DEPS_DIR/.travis_cache_marker"
# default target name for functional tests # default target name for functional tests
- FUNCTIONALTEST=functionaltest - FUNCTIONALTEST=functionaltest
- CI_TARGET=tests - CI_TARGET=tests
@@ -54,7 +44,8 @@ env:
- CCACHE_COMPRESS=1 - CCACHE_COMPRESS=1
- CCACHE_SLOPPINESS=time_macros,file_macro - CCACHE_SLOPPINESS=time_macros,file_macro
- CCACHE_BASEDIR="$TRAVIS_BUILD_DIR" - CCACHE_BASEDIR="$TRAVIS_BUILD_DIR"
- CI_OS_NAME="$TRAVIS_OS_NAME" # Default since 3.3, but Travis (Xenial) has 3.2.4; required with newer gcc/clang.
- CCACHE_CPP2=1
anchors: anchors:
envs: &common-job-env envs: &common-job-env
@@ -71,12 +62,12 @@ addons:
- build-essential - build-essential
- clang - clang
- cmake - cmake
- cpanminus
- cscope - cscope
- gcc-multilib - gcc-multilib
- gdb - gdb
- gperf - gperf
- language-pack-tr - language-pack-tr
- libc6-dev-i386
- libtool-bin - libtool-bin
- locales - locales
- ninja-build - ninja-build
@@ -86,16 +77,21 @@ addons:
- xclip - xclip
homebrew: homebrew:
update: true update: true
casks:
- powershell
packages: packages:
- ccache - ccache
- cpanminus
- ninja - ninja
- perl
jobs: jobs:
include: include:
- stage: baseline
name: clang-asan
os: linux
compiler: clang
# Use Lua so that ASAN can test our embedded Lua support. 8fec4d53d0f6
env:
- CLANG_SANITIZER=ASAN_UBSAN
- CMAKE_FLAGS="$CMAKE_FLAGS -DPREFER_LUA=ON"
- *common-job-env
- name: gcc-coverage (gcc 9) - name: gcc-coverage (gcc 9)
os: linux os: linux
compiler: gcc-9 compiler: gcc-9
@@ -103,19 +99,28 @@ jobs:
- GCOV=gcov-9 - GCOV=gcov-9
- CMAKE_FLAGS="$CMAKE_FLAGS -DUSE_GCOV=ON" - CMAKE_FLAGS="$CMAKE_FLAGS -DUSE_GCOV=ON"
- GCOV_ERROR_FILE="/tmp/libgcov-errors.log" - GCOV_ERROR_FILE="/tmp/libgcov-errors.log"
- USE_LUACOV=1
- BUSTED_ARGS="--coverage"
- *common-job-env - *common-job-env
addons: addons:
snaps:
- name: powershell
confinement: classic
apt: apt:
sources: sources:
- sourceline: 'ppa:ubuntu-toolchain-r/test' - sourceline: 'ppa:ubuntu-toolchain-r/test'
packages: packages:
- *common-apt-packages - *common-apt-packages
- gcc-9 - gcc-9
- if: branch = master AND commit_message !~ /\[skip.lint\]/
name: lint
os: linux
env:
- CI_TARGET=lint
- *common-job-env
- stage: second stage
name: "macOS: clang"
os: osx
compiler: clang
osx_image: xcode10.2 # macOS 10.14
env:
- *common-job-env
- name: gcc-functionaltest-lua - name: gcc-functionaltest-lua
os: linux os: linux
compiler: gcc compiler: gcc
@@ -131,67 +136,15 @@ jobs:
compiler: gcc compiler: gcc
env: env:
- BUILD_32BIT=ON - BUILD_32BIT=ON
- CMAKE_FLAGS="$CMAKE_FLAGS -m32 -DCMAKE_TOOLCHAIN_FILE=$TRAVIS_BUILD_DIR/cmake/i386-linux-gnu.toolchain.cmake" # Minimum required CMake.
- DEPS_CMAKE_FLAGS="$DEPS_CMAKE_FLAGS -m32 -DCMAKE_TOOLCHAIN_FILE=$TRAVIS_BUILD_DIR/cmake/i386-linux-gnu.toolchain.cmake" - CMAKE_URL=https://cmake.org/files/v2.8/cmake-2.8.12-Linux-i386.sh
- *common-job-env - *common-job-env
- name: big-endian - name: clang-tsan
os: linux os: linux
arch: s390x compiler: clang
compiler: gcc
env: env:
- FUNCTIONALTEST=functionaltest-lua - CLANG_SANITIZER=TSAN
- CMAKE_FLAGS="$CMAKE_FLAGS -DPREFER_LUA=ON"
- DEPS_CMAKE_FLAGS="$DEPS_CMAKE_FLAGS -DUSE_BUNDLED_LUAJIT=OFF"
- *common-job-env - *common-job-env
addons:
apt:
packages:
- *common-apt-packages
- gettext
- python-pip
- python3-pip
- python-setuptools
- python3-setuptools
- python-dev
- python3-dev
- if: type != pull_request
name: snap
os: linux
env:
- LC_ALL: C.UTF-8
- LANG: C.UTF-8
- SNAPCRAFT_ENABLE_SILENT_REPORT: y
- SNAPCRAFT_ENABLE_DEVELOPER_DEBUG: y
- SNAPCRAFT_BUILD_ENVIRONMENT: lxd
addons:
snaps:
- name: snapcraft
channel: stable
classic: true
- name: http
- name: transfer
- name: lxd
channel: stable
# Override default before_install, before_cache.
before_install: /bin/true
before_cache: /bin/true
install: ci/snap/install.sh
before_script: echo "Building snap..."
script: ci/snap/script.sh
after_success: ci/snap/after_success.sh
deploy:
skip_cleanup: true
provider: script
script: ci/snap/deploy.sh
on:
branch: master
allow_failures:
- env:
- LC_ALL: C.UTF-8
- LANG: C.UTF-8
- SNAPCRAFT_ENABLE_SILENT_REPORT: y
- SNAPCRAFT_ENABLE_DEVELOPER_DEBUG: y
- SNAPCRAFT_BUILD_ENVIRONMENT: lxd
fast_finish: true fast_finish: true
before_install: ci/before_install.sh before_install: ci/before_install.sh

View File

@@ -1,4 +1,4 @@
.DONE: .DONE:
@echo "Use GNU Make (gmake) to build neovim" @echo "Please use GNU Make (gmake) to build neovim"
.DEFAULT: .DEFAULT:
@echo "Use GNU Make (gmake) to build neovim" @echo "Please use GNU Make (gmake) to build neovim"

View File

@@ -2,17 +2,10 @@
# intro: https://codingnest.com/basic-cmake/ # intro: https://codingnest.com/basic-cmake/
# best practices (3.0+): https://gist.github.com/mbinna/c61dbb39bca0e4fb7d1f73b0d66a4fd1 # best practices (3.0+): https://gist.github.com/mbinna/c61dbb39bca0e4fb7d1f73b0d66a4fd1
# Version should match the tested CMAKE_URL in .github/workflows/ci.yml. # Version should match the tested CMAKE_URL in .travis.yml.
cmake_minimum_required(VERSION 3.10) cmake_minimum_required(VERSION 2.8.12)
project(nvim C) project(nvim C)
if(POLICY CMP0065)
cmake_policy(SET CMP0065 NEW)
endif()
if(POLICY CMP0060)
cmake_policy(SET CMP0060 NEW)
endif()
# Point CMake at any custom modules we may ship # Point CMake at any custom modules we may ship
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
@@ -23,23 +16,9 @@ set_property(GLOBAL PROPERTY USE_FOLDERS ON)
# Prefer our bundled versions of dependencies. # Prefer our bundled versions of dependencies.
if(DEFINED ENV{DEPS_BUILD_DIR}) if(DEFINED ENV{DEPS_BUILD_DIR})
if(CMAKE_SYSTEM_NAME MATCHES "OpenBSD") set(DEPS_PREFIX "$ENV{DEPS_BUILD_DIR}/usr" CACHE PATH "Path prefix for finding dependencies")
# pkg-config 29.2 has a bug on OpenBSD which causes it to drop any paths that
# *contain* system include paths. To avoid this, we prefix what would be
# "/usr/include" as "/_usr/include".
# This check is also performed in the third-party/CMakeLists.txt and in the
# else clause following here.
# https://github.com/neovim/neovim/pull/14745#issuecomment-860201794
set(DEPS_PREFIX "$ENV{DEPS_BUILD_DIR}/_usr" CACHE PATH "Path prefix for finding dependencies")
else()
set(DEPS_PREFIX "$ENV{DEPS_BUILD_DIR}/usr" CACHE PATH "Path prefix for finding dependencies")
endif()
else() else()
if(CMAKE_SYSTEM_NAME MATCHES "OpenBSD") set(DEPS_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/.deps/usr" CACHE PATH "Path prefix for finding dependencies")
set(DEPS_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/.deps/_usr" CACHE PATH "Path prefix for finding dependencies")
else()
set(DEPS_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/.deps/usr" CACHE PATH "Path prefix for finding dependencies")
endif()
# When running from within CLion or Visual Studio, # When running from within CLion or Visual Studio,
# build bundled dependencies automatically. # build bundled dependencies automatically.
if(NOT EXISTS ${DEPS_PREFIX} if(NOT EXISTS ${DEPS_PREFIX}
@@ -97,8 +76,6 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
endif() endif()
if(WIN32 OR CMAKE_SYSTEM_NAME STREQUAL "Darwin") if(WIN32 OR CMAKE_SYSTEM_NAME STREQUAL "Darwin")
# Ignore case when comparing filenames on Windows and Mac.
set(CASE_INSENSITIVE_FILENAME TRUE)
# Enable fixing case-insensitive filenames for Windows and Mac. # Enable fixing case-insensitive filenames for Windows and Mac.
set(USE_FNAME_CASE TRUE) set(USE_FNAME_CASE TRUE)
endif() endif()
@@ -136,32 +113,47 @@ set_property(CACHE CMAKE_BUILD_TYPE PROPERTY
# If not in a git repo (e.g., a tarball) these tokens define the complete # If not in a git repo (e.g., a tarball) these tokens define the complete
# version string, else they are combined with the result of `git describe`. # version string, else they are combined with the result of `git describe`.
set(NVIM_VERSION_MAJOR 0) set(NVIM_VERSION_MAJOR 0)
set(NVIM_VERSION_MINOR 6) set(NVIM_VERSION_MINOR 4)
set(NVIM_VERSION_PATCH 2) set(NVIM_VERSION_PATCH 5)
set(NVIM_VERSION_PRERELEASE "-dev") # for package maintainers set(NVIM_VERSION_PRERELEASE "-dev") # for package maintainers
# API level # API level
set(NVIM_API_LEVEL 8) # Bump this after any API change. set(NVIM_API_LEVEL 6) # Bump this after any API change.
set(NVIM_API_LEVEL_COMPAT 0) # Adjust this after a _breaking_ API change. set(NVIM_API_LEVEL_COMPAT 0) # Adjust this after a _breaking_ API change.
set(NVIM_API_PRERELEASE false) set(NVIM_API_PRERELEASE false)
file(TO_CMAKE_PATH ${CMAKE_CURRENT_LIST_DIR}/.git FORCED_GIT_DIR)
include(GetGitRevisionDescription)
get_git_head_revision(GIT_REFSPEC NVIM_VERSION_COMMIT)
if(NVIM_VERSION_COMMIT) # is a git repo
git_describe(NVIM_VERSION_MEDIUM)
# `git describe` annotates the most recent tagged release; for pre-release
# builds we must replace that with the unreleased version.
string(REGEX REPLACE "^v[0-9]+\\.[0-9]+\\.[0-9]+"
"v${NVIM_VERSION_MAJOR}.${NVIM_VERSION_MINOR}.${NVIM_VERSION_PATCH}"
NVIM_VERSION_MEDIUM
${NVIM_VERSION_MEDIUM})
endif()
set(NVIM_VERSION_BUILD_TYPE "${CMAKE_BUILD_TYPE}") set(NVIM_VERSION_BUILD_TYPE "${CMAKE_BUILD_TYPE}")
# NVIM_VERSION_CFLAGS set further below. # NVIM_VERSION_CFLAGS set further below.
set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# Minimize logging for release-type builds.
if(NOT CMAKE_C_FLAGS_RELEASE MATCHES DMIN_LOG_LEVEL)
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DMIN_LOG_LEVEL=3")
endif()
if(NOT CMAKE_C_FLAGS_MINSIZEREL MATCHES DMIN_LOG_LEVEL)
set(CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL} -DMIN_LOG_LEVEL=3")
endif()
if(NOT CMAKE_C_FLAGS_RELWITHDEBINFO MATCHES DMIN_LOG_LEVEL)
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -DMIN_LOG_LEVEL=3")
endif()
# Log level (MIN_LOG_LEVEL in log.h) # Log level (MIN_LOG_LEVEL in log.h)
if("${MIN_LOG_LEVEL}" MATCHES "^$") if("${MIN_LOG_LEVEL}" MATCHES "^$")
# Minimize logging for release-type builds. message(STATUS "MIN_LOG_LEVEL not specified, default is 1 (INFO)")
if(CMAKE_BUILD_TYPE STREQUAL "Release"
OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo"
OR CMAKE_BUILD_TYPE STREQUAL "MinSizeRel")
message(STATUS "MIN_LOG_LEVEL not specified, default is 3 (ERROR) for release builds")
set(MIN_LOG_LEVEL 3)
else()
message(STATUS "MIN_LOG_LEVEL not specified, default is 1 (INFO)")
set(MIN_LOG_LEVEL 1)
endif()
else() else()
if(NOT MIN_LOG_LEVEL MATCHES "^[0-3]$") if(NOT MIN_LOG_LEVEL MATCHES "^[0-3]$")
message(FATAL_ERROR "invalid MIN_LOG_LEVEL: " ${MIN_LOG_LEVEL}) message(FATAL_ERROR "invalid MIN_LOG_LEVEL: " ${MIN_LOG_LEVEL})
@@ -283,8 +275,8 @@ else()
-Wstrict-prototypes -std=gnu99 -Wshadow -Wconversion -Wstrict-prototypes -std=gnu99 -Wshadow -Wconversion
-Wmissing-prototypes) -Wmissing-prototypes)
check_c_compiler_flag(-Wimplicit-fallthrough HAVE_WIMPLICIT_FALLTHROUGH_FLAG) check_c_compiler_flag(-Wimplicit-fallthrough HAS_WIMPLICIT_FALLTHROUGH_FLAG)
if(HAVE_WIMPLICIT_FALLTHROUGH_FLAG) if(HAS_WIMPLICIT_FALLTHROUGH_FLAG)
add_compile_options(-Wimplicit-fallthrough) add_compile_options(-Wimplicit-fallthrough)
endif() endif()
@@ -317,10 +309,8 @@ if(UNIX)
if(HAS_FSTACK_PROTECTOR_STRONG_FLAG) if(HAS_FSTACK_PROTECTOR_STRONG_FLAG)
add_compile_options(-fstack-protector-strong) add_compile_options(-fstack-protector-strong)
link_libraries(-fstack-protector-strong)
elseif(HAS_FSTACK_PROTECTOR_FLAG) elseif(HAS_FSTACK_PROTECTOR_FLAG)
add_compile_options(-fstack-protector --param ssp-buffer-size=4) add_compile_options(-fstack-protector --param ssp-buffer-size=4)
link_libraries(-fstack-protector --param ssp-buffer-size=4)
endif() endif()
endif() endif()
@@ -338,10 +328,10 @@ if(HAS_DIAG_COLOR_FLAG)
endif() endif()
endif() endif()
option(CI_BUILD "CI, extra flags will be set" OFF) option(TRAVIS_CI_BUILD "Travis/QuickBuild CI, extra flags will be set" OFF)
if(CI_BUILD) if(TRAVIS_CI_BUILD)
message(STATUS "CI build enabled") message(STATUS "Travis/QuickBuild CI build enabled")
add_compile_options(-Werror) add_compile_options(-Werror)
if(DEFINED ENV{BUILD_32BIT}) if(DEFINED ENV{BUILD_32BIT})
# Get some test coverage for unsigned char # Get some test coverage for unsigned char
@@ -368,8 +358,8 @@ if(CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
add_definitions(-D_GNU_SOURCE) add_definitions(-D_GNU_SOURCE)
endif() endif()
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT PREFER_LUA AND LUAJIT_VERSION LESS "2.1.0-beta3") if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND CMAKE_SIZEOF_VOID_P EQUAL 8)
# Required for luajit < 2.1.0-beta3. # Required for luajit.
set(CMAKE_EXE_LINKER_FLAGS set(CMAKE_EXE_LINKER_FLAGS
"${CMAKE_EXE_LINKER_FLAGS} -pagezero_size 10000 -image_base 100000000") "${CMAKE_EXE_LINKER_FLAGS} -pagezero_size 10000 -image_base 100000000")
set(CMAKE_SHARED_LINKER_FLAGS set(CMAKE_SHARED_LINKER_FLAGS
@@ -390,25 +380,6 @@ include_directories(SYSTEM ${MSGPACK_INCLUDE_DIRS})
find_package(LibLUV 1.30.0 REQUIRED) find_package(LibLUV 1.30.0 REQUIRED)
include_directories(SYSTEM ${LIBLUV_INCLUDE_DIRS}) include_directories(SYSTEM ${LIBLUV_INCLUDE_DIRS})
find_package(TreeSitter REQUIRED)
include_directories(SYSTEM ${TreeSitter_INCLUDE_DIRS})
list(APPEND CMAKE_REQUIRED_INCLUDES "${TreeSitter_INCLUDE_DIRS}")
list(APPEND CMAKE_REQUIRED_LIBRARIES "${TreeSitter_LIBRARIES}")
check_c_source_compiles("
#include <tree_sitter/api.h>
int
main(void)
{
TSQueryCursor *cursor = ts_query_cursor_new();
ts_query_cursor_set_match_limit(cursor, 32);
return 0;
}
" TS_HAS_SET_MATCH_LIMIT)
if(TS_HAS_SET_MATCH_LIMIT)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DNVIM_TS_HAS_SET_MATCH_LIMIT")
endif()
# Note: The test lib requires LuaJIT; it will be skipped if LuaJIT is missing. # Note: The test lib requires LuaJIT; it will be skipped if LuaJIT is missing.
option(PREFER_LUA "Prefer Lua over LuaJIT in the nvim executable." OFF) option(PREFER_LUA "Prefer Lua over LuaJIT in the nvim executable." OFF)
@@ -520,19 +491,18 @@ include(LuaHelpers)
set(LUA_DEPENDENCIES lpeg mpack bit) set(LUA_DEPENDENCIES lpeg mpack bit)
if(NOT LUA_PRG) if(NOT LUA_PRG)
foreach(CURRENT_LUA_PRG luajit lua5.1 lua5.2 lua) foreach(CURRENT_LUA_PRG luajit lua5.1 lua5.2 lua)
unset(_CHECK_LUA_PRG CACHE) # If LUA_PRG is set find_program() will not search
unset(LUA_PRG CACHE)
unset(LUA_PRG_WORKS) unset(LUA_PRG_WORKS)
find_program(_CHECK_LUA_PRG ${CURRENT_LUA_PRG}) find_program(LUA_PRG ${CURRENT_LUA_PRG})
if(_CHECK_LUA_PRG) if(LUA_PRG)
check_lua_deps(${_CHECK_LUA_PRG} "${LUA_DEPENDENCIES}" LUA_PRG_WORKS) check_lua_deps(${LUA_PRG} "${LUA_DEPENDENCIES}" LUA_PRG_WORKS)
if(LUA_PRG_WORKS) if(LUA_PRG_WORKS)
set(LUA_PRG "${_CHECK_LUA_PRG}" CACHE FILEPATH "Path to a program.")
break() break()
endif() endif()
endif() endif()
endforeach() endforeach()
unset(_CHECK_LUA_PRG CACHE)
else() else()
check_lua_deps(${LUA_PRG} "${LUA_DEPENDENCIES}" LUA_PRG_WORKS) check_lua_deps(${LUA_PRG} "${LUA_DEPENDENCIES}" LUA_PRG_WORKS)
endif() endif()
@@ -590,10 +560,15 @@ if(BUSTED_PRG)
# console pool: to do so we need to use the USES_TERMINAL # console pool: to do so we need to use the USES_TERMINAL
# option, but this is only available in CMake 3.2 # option, but this is only available in CMake 3.2
set(TEST_TARGET_ARGS) set(TEST_TARGET_ARGS)
list(APPEND TEST_TARGET_ARGS "USES_TERMINAL") if(NOT (${CMAKE_VERSION} VERSION_LESS 3.2.0))
list(APPEND TEST_TARGET_ARGS "USES_TERMINAL")
endif()
set(UNITTEST_PREREQS nvim-test unittest-headers) set(UNITTEST_PREREQS nvim-test unittest-headers)
set(FUNCTIONALTEST_PREREQS nvim printenv-test printargs-test shell-test streams-test tty-test ${GENERATED_HELP_TAGS}) set(FUNCTIONALTEST_PREREQS nvim printargs-test shell-test streams-test ${GENERATED_HELP_TAGS})
if(NOT WIN32)
list(APPEND FUNCTIONALTEST_PREREQS tty-test)
endif()
set(BENCHMARK_PREREQS nvim tty-test) set(BENCHMARK_PREREQS nvim tty-test)
# Useful for automated build systems, if they want to manually run the tests. # Useful for automated build systems, if they want to manually run the tests.
@@ -689,7 +664,7 @@ endif()
if(LUACHECK_PRG) if(LUACHECK_PRG)
add_custom_target(lualint add_custom_target(lualint
COMMAND ${LUACHECK_PRG} -q runtime/ scripts/ src/ test/ COMMAND ${LUACHECK_PRG} -q runtime/ src/ test/
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
else() else()
add_custom_target(lualint false add_custom_target(lualint false
@@ -707,14 +682,3 @@ set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
set(CPACK_NSIS_MODIFY_PATH ON) set(CPACK_NSIS_MODIFY_PATH ON)
set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON) set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
include(CPack) include(CPack)
#add uninstall target
if(NOT TARGET uninstall)
configure_file(
"cmake/UninstallHelper.cmake.in"
"${CMAKE_CURRENT_BINARY_DIR}/UninstallHelper.cmake"
IMMEDIATE @ONLY)
add_custom_target(uninstall
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/UninstallHelper.cmake)
endif()

View File

@@ -8,10 +8,9 @@ If you want to help but don't know where to start, here are some
low-risk/isolated tasks: low-risk/isolated tasks:
- [Merge a Vim patch]. - [Merge a Vim patch].
- Try a [good first issue](../../labels/good-first-issue) or [complexity:low] issue. - Try a [complexity:low] issue.
- Fix bugs found by [Clang](#clang-scan-build), [PVS](#pvs-studio) or - Fix bugs found by [Clang](#clang-scan-build), [PVS](#pvs-studio) or
[Coverity](#coverity). [Coverity](#coverity).
- [Improve documentation][wiki-contribute-help]
Reporting problems Reporting problems
------------------ ------------------
@@ -19,21 +18,19 @@ Reporting problems
- [Check the FAQ][wiki-faq]. - [Check the FAQ][wiki-faq].
- [Search existing issues][github-issues] (including closed!) - [Search existing issues][github-issues] (including closed!)
- Update Neovim to the latest version to see if your problem persists. - Update Neovim to the latest version to see if your problem persists.
- Try to reproduce with `nvim --clean` ("factory defaults"). - Disable plugins incrementally, to narrow down the cause of the issue.
- [Bisect](https://neovim.io/doc/user/starting.html#bisect) your config: disable plugins incrementally, to narrow down the cause of the issue.
- [Bisect][git-bisect] Neovim's source code to find the cause of a regression, if you can. This is _extremely_ helpful.
- When reporting a crash, [include a stacktrace](https://github.com/neovim/neovim/wiki/FAQ#backtrace-linux). - When reporting a crash, [include a stacktrace](https://github.com/neovim/neovim/wiki/FAQ#backtrace-linux).
- Use [ASAN/UBSAN](#clang-sanitizers-asan-and-ubsan) to get detailed errors for segfaults and undefined behavior. - [Bisect][git-bisect] to the cause of a regression, if you are able. This is _extremely_ helpful.
- Check the logs. `:edit $NVIM_LOG_FILE` - Check `$NVIM_LOG_FILE`, if it exists.
- Include `cmake --system-information` for build-related issues. - Include `cmake --system-information` for build-related issues.
Developer guidelines Developer guidelines
-------------------- --------------------
- Read `:help dev` if you are working on Nvim core. - Nvim contributors should read `:help dev`.
- Read `:help dev-ui` if you are developing a UI. - External UI developers should read `:help dev-ui`.
- Read `:help dev-api-client` if you are developing an API client. - API client developers should read `:help dev-api-client`.
- Install `ninja` for faster builds of Nvim. - Nvim developers are _strongly encouraged_ to install `ninja` for faster builds.
``` ```
sudo apt-get install ninja-build sudo apt-get install ninja-build
make distclean make distclean
@@ -43,8 +40,8 @@ Developer guidelines
Pull requests (PRs) Pull requests (PRs)
--------------------- ---------------------
- To avoid duplicate work, create a draft pull request. - To avoid duplicate work, create a `[WIP]` pull request as soon as possible.
- Your PR must include [test coverage][run-tests]. - Your PR must include **test coverage.** See [test/README.md][run-tests].
- Avoid cosmetic changes to unrelated files in the same commit. - Avoid cosmetic changes to unrelated files in the same commit.
- Use a [feature branch][git-feature-branch] instead of the master branch. - Use a [feature branch][git-feature-branch] instead of the master branch.
- Use a **rebase workflow** for small PRs. - Use a **rebase workflow** for small PRs.
@@ -63,55 +60,33 @@ Pull requests (PRs)
- During a squash/fixup, use `exec make -C build unittest` between each - During a squash/fixup, use `exec make -C build unittest` between each
pick/edit/reword. pick/edit/reword.
### Stages: Draft and Ready for review ### Stages: WIP, RFC, RDY
Pull requests have two stages: Draft and Ready for review. Pull requests have three stages: `[WIP]` (Work In Progress), `[RFC]` (Request
For Comment) and `[RDY]` (Ready).
1. [Create a Draft PR][pr-draft] while you are _not_ requesting feedback as - `[RFC]` is assumed by default, i.e. you are requesting a review.
you are still working on the PR. - Add `[WIP]` to the PR title if you are _not_ requesting feedback and the work
- You can skip this if your PR is ready for review. is still in flux.
2. [Change your PR to ready][pr-ready] when the PR is ready for review. - Add `[RDY]` if you are _done_ and only waiting on merge.
- You can convert back to Draft at any time.
Do __not__ add labels like `[RFC]` or `[WIP]` in the title to indicate the
state of your PR: this just adds noise. Non-Draft PRs are assumed to be open
for comments; if you want feedback from specific people, `@`-mention them in
a comment.
### Commit messages ### Commit messages
Follow the [conventional commits guidelines][conventional_commits] to *make reviews easier* and to make Follow [commit message hygiene][hygiene] to *make reviews easier* and to make
the VCS/git logs more valuable. The general structure of a commit message is: the VCS/git logs more valuable.
```
<type>([optional scope]): <description>
[optional body]
[optional footer(s)]
```
- Prefix the commit subject with one of these [_types_](https://github.com/commitizen/conventional-commit-types/blob/master/index.json):
- `build`, `ci`, `docs`, `feat`, `fix`, `perf`, `refactor`, `revert`, `test`, `vim-patch`, `chore`
- You can **ignore this for "fixup" commits** or any commits you expect to be squashed.
- Append optional scope to _type_ such as `(lsp)`, `(treesitter)`, `(float)`, …
- _Description_ shouldn't start with a capital letter or end in a period.
- Use the _imperative voice_: "Fix bug" rather than "Fixed bug" or "Fixes bug."
- Try to keep the first line under 72 characters. - Try to keep the first line under 72 characters.
- A blank line must follow the subject. - **Prefix the commit subject with a _scope_:** `doc:`, `test:`, `foo.c:`,
- Breaking API changes must be indicated by `runtime:`, ...
1. "!" after the type/scope, and - Subject line for commits with only style/lint changes can be a single
2. a "BREAKING CHANGE" footer describing the change. word: `style` or `lint`.
Example: - A blank line must separate the subject from the description.
``` - Use the _imperative voice_: "Fix bug" rather than "Fixed bug" or "Fixes bug."
refactor(provider)!: drop support for Python 2
BREAKING CHANGE: refactor to use Python 3 features since Python 2 is no longer supported.
```
### Automated builds (CI) ### Automated builds (CI)
Each pull request must pass the automated builds on [sourcehut] and [GitHub Actions]. Each pull request must pass the automated builds on [Travis CI], [QuickBuild]
and [AppVeyor].
- CI builds are compiled with [`-Werror`][gcc-warnings], so compiler warnings - CI builds are compiled with [`-Werror`][gcc-warnings], so compiler warnings
will fail the build. will fail the build.
@@ -125,19 +100,14 @@ Each pull request must pass the automated builds on [sourcehut] and [GitHub Acti
- The [lint](#lint) build checks modified lines _and their immediate - The [lint](#lint) build checks modified lines _and their immediate
neighbors_, to encourage incrementally updating the legacy style to meet our neighbors_, to encourage incrementally updating the legacy style to meet our
[style](#style). (See [#3174][3174] for background.) [style](#style). (See [#3174][3174] for background.)
- CI for freebsd and openbsd runs on [sourcehut]. - [How to investigate QuickBuild failures](https://github.com/neovim/neovim/pull/4718#issuecomment-217631350)
- To get a backtrace on freebsd (after connecting via ssh): - QuickBuild uses this invocation:
```sh ```
sudo pkg install tmux # If you want tmux. mkdir -p build/${params.get("buildType")} \
lldb build/bin/nvim -c nvim.core && cd build/${params.get("buildType")} \
&& cmake -G "Unix Makefiles" -DBUSTED_OUTPUT_TYPE=TAP -DCMAKE_BUILD_TYPE=${params.get("buildType")}
# To get a full backtrace: -DTRAVIS_CI_BUILD=ON ../.. && ${node.getAttribute("make", "make")}
# 1. Rebuild with debug info. VERBOSE=1 nvim unittest-prereqs functionaltest-prereqs
rm -rf nvim.core build
gmake CMAKE_BUILD_TYPE=RelWithDebInfo CMAKE_EXTRA_FLAGS="-DCI_BUILD=ON -DMIN_LOG_LEVEL=3" nvim
# 2. Run the failing test to generate a new core file.
TEST_FILE=test/functional/foo.lua gmake functionaltest
lldb build/bin/nvim -c nvim.core
``` ```
### Clang scan-build ### Clang scan-build
@@ -162,7 +132,7 @@ see potential bugs found by [PVS Studio](https://www.viva64.com/en/pvs-studio/).
- Use this format for commit messages (where `{id}` is the PVS warning-id)): - Use this format for commit messages (where `{id}` is the PVS warning-id)):
``` ```
fix(PVS/V{id}): {description} PVS/V{id}: {description}
``` ```
- Search the Neovim commit history to find examples: - Search the Neovim commit history to find examples:
``` ```
@@ -178,27 +148,13 @@ master build. To view the defects, just request access; you will be approved.
- Use this format for commit messages (where `{id}` is the CID (Coverity ID); - Use this format for commit messages (where `{id}` is the CID (Coverity ID);
([example](https://github.com/neovim/neovim/pull/804))): ([example](https://github.com/neovim/neovim/pull/804))):
``` ```
fix(coverity/{id}): {description} coverity/{id}: {description}
``` ```
- Search the Neovim commit history to find examples: - Search the Neovim commit history to find examples:
``` ```
git log --oneline --no-merges --grep coverity git log --oneline --no-merges --grep coverity
``` ```
### Clang sanitizers (ASAN and UBSAN)
ASAN/UBSAN can be used to detect memory errors and other common forms of undefined behavior at runtime in debug builds.
- To build Neovim with sanitizers enabled, use
```
rm -rf build && CMAKE_EXTRA_FLAGS="-DCMAKE_C_COMPILER=clang -DCLANG_ASAN_UBSAN=1" make
```
- When running Neovim, use
```
UBSAN_OPTIONS=print_stacktrace=1 ASAN_OPTIONS=log_path=/tmp/nvim_asan nvim args...
```
- If Neovim exits unexpectedly, check `/tmp/nvim_asan.{PID}` (or your preferred `log_path`) for log files with error messages.
Coding Coding
------ ------
@@ -218,28 +174,16 @@ You can lint a single file (but this will _not_ exclude legacy errors):
### Style ### Style
- Style rules are (mostly) defined by `src/uncrustify.cfg` which tries to match The repo includes a `.clang-format` config file which (mostly) matches the
the [style-guide]. To use the Nvim `gq` command with `uncrustify`: [style-guide]. You can use `clang-format` to format code with the `gq`
``` operator in Nvim:
if !empty(findfile('src/uncrustify.cfg', ';'))
setlocal formatprg=uncrustify\ -q\ -l\ C\ -c\ src/uncrustify.cfg\ --no-backup if !empty(findfile('.clang-format', ';'))
endif setlocal formatprg=clang-format\ -style=file
``` endif
The required version of `uncrustify` is specified in `uncrustify.cfg`.
- There is also `.clang-format` which has drifted from the [style-guide], but
is available for reference. To use the Nvim `gq` command with `clang-format`:
```
if !empty(findfile('.clang-format', ';'))
setlocal formatprg=clang-format\ -style=file
endif
```
### Navigate ### Navigate
- Set `blame.ignoreRevsFile` to ignore [noise commits](https://github.com/neovim/neovim/commit/2d240024acbd68c2d3f82bc72cb12b1a4928c6bf) in git blame:
```
git config blame.ignoreRevsFile .git-blame-ignore-revs
```
- Use **[universal-ctags](https://github.com/universal-ctags/ctags).** - Use **[universal-ctags](https://github.com/universal-ctags/ctags).**
("Exuberant ctags", the typical `ctags` binary provided by your distro, is ("Exuberant ctags", the typical `ctags` binary provided by your distro, is
unmaintained and won't recognize many function signatures in Neovim source.) unmaintained and won't recognize many function signatures in Neovim source.)
@@ -271,20 +215,17 @@ as context, use the `-W` argument as well.
[github-issues]: https://github.com/neovim/neovim/issues [github-issues]: https://github.com/neovim/neovim/issues
[1820]: https://github.com/neovim/neovim/pull/1820 [1820]: https://github.com/neovim/neovim/pull/1820
[hub]: https://hub.github.com/ [hub]: https://hub.github.com/
[conventional_commits]: https://www.conventionalcommits.org [hygiene]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
[style-guide]: https://neovim.io/doc/user/dev_style.html#dev-style [style-guide]: http://neovim.io/develop/style-guide.xml
[ASan]: http://clang.llvm.org/docs/AddressSanitizer.html [ASan]: http://clang.llvm.org/docs/AddressSanitizer.html
[run-tests]: https://github.com/neovim/neovim/blob/master/test/README.md#running-tests [run-tests]: https://github.com/neovim/neovim/blob/master/test/README.md#running-tests
[wiki-faq]: https://github.com/neovim/neovim/wiki/FAQ [wiki-faq]: https://github.com/neovim/neovim/wiki/FAQ
[review-checklist]: https://github.com/neovim/neovim/wiki/Code-review-checklist [review-checklist]: https://github.com/neovim/neovim/wiki/Code-review-checklist
[3174]: https://github.com/neovim/neovim/issues/3174 [3174]: https://github.com/neovim/neovim/issues/3174
[sourcehut]: https://builds.sr.ht/~jmk [Travis CI]: https://travis-ci.org/neovim/neovim
[GitHub Actions]: https://github.com/neovim/neovim/actions [QuickBuild]: http://neovim-qb.szakmeister.net/dashboard
[AppVeyor]: https://ci.appveyor.com/project/neovim/neovim
[Merge a Vim patch]: https://github.com/neovim/neovim/wiki/Merging-patches-from-upstream-Vim [Merge a Vim patch]: https://github.com/neovim/neovim/wiki/Merging-patches-from-upstream-Vim
[Clang report]: https://neovim.io/doc/reports/clang/ [Clang report]: https://neovim.io/doc/reports/clang/
[complexity:low]: https://github.com/neovim/neovim/issues?q=is%3Aopen+is%3Aissue+label%3Acomplexity%3Alow [complexity:low]: https://github.com/neovim/neovim/issues?q=is%3Aopen+is%3Aissue+label%3Acomplexity%3Alow
[master error list]: https://raw.githubusercontent.com/neovim/doc/gh-pages/reports/clint/errors.json [master error list]: https://raw.githubusercontent.com/neovim/doc/gh-pages/reports/clint/errors.json
[wiki-contribute-help]: https://github.com/neovim/neovim/wiki/contribute-%3Ahelp
[pr-draft]: https://docs.github.com/en/github/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request
[pr-ready]: https://docs.github.com/en/github/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/changing-the-stage-of-a-pull-request
[uncrustify]: https://formulae.brew.sh/formula/uncrustify

11
LICENSE
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
-------------- --------------
@@ -55,36 +56,6 @@ has a major bug:
- The [nightly job](https://github.com/neovim/bot-ci/blob/master/ci/nightly.sh) - The [nightly job](https://github.com/neovim/bot-ci/blob/master/ci/nightly.sh)
will update the release assets based on the `stable` tag. will update the release assets based on the `stable` tag.
The neovim repository includes a backport [github action](https://github.com/zeebe-io/backport-action).
In order to trigger the action, a PR must be labeled with a label matching the
form `backport release-0.X`. If the label is applied before the PR is merged,
the backport will be filed automatically against the target branch. Otherwise,
comment `\backport` on the merged PR *after* the label has been applied to trigger
a backport. Note, the PR must have a description in the issue body, or the backport
will fail.
Third-party dependencies
--------------
These "bundled" dependencies can be updated by bumping their versions in `third-party/CMakeLists.txt`:
- [Lua](https://www.lua.org/download.html)
- [LuaJIT](https://github.com/LuaJIT/LuaJIT)
- [Luv](https://github.com/luvit/luv)
- [libtermkey](https://github.com/neovim/libtermkey)
- [libuv](https://github.com/libuv/libuv)
- [libvterm](http://www.leonerd.org.uk/code/libvterm/)
- [lua-compat](https://github.com/keplerproject/lua-compat-5.3)
- [tree-sitter](https://github.com/tree-sitter/tree-sitter)
These dependencies are "vendored" (inlined), we need to update the sources manually:
- [libmpack](https://github.com/libmpack/libmpack)
- [xdiff](https://github.com/git/git/tree/master/xdiff)
- [lua-cjson](https://github.com/openresty/lua-cjson)
- [Klib](https://github.com/attractivechaos/klib)
We also maintain some forks, particularly for Windows, if we are waiting on upstream changes:
https://github.com/neovim/neovim/wiki/Deps
See also See also
-------- --------

103
Makefile
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,25 @@ ifneq (1,$(words [$(DEPS_BUILD_DIR)]))
endif endif
ifeq (,$(BUILD_TOOL)) ifeq (,$(BUILD_TOOL))
ifeq (Ninja,$(CMAKE_GENERATOR)) ifeq (Ninja,$(BUILD_TYPE))
ifneq ($(shell $(CMAKE_PRG) --help 2>/dev/null | grep Ninja),) ifneq ($(shell $(CMAKE_PRG) --help 2>/dev/null | grep Ninja),)
BUILD_TOOL = ninja BUILD_TOOL := ninja
else else
# User's version of CMake doesn't support Ninja # User's version of CMake doesn't support Ninja
BUILD_TOOL = $(MAKE) BUILD_TOOL = $(MAKE)
CMAKE_GENERATOR := Unix Makefiles BUILD_TYPE := Unix Makefiles
endif endif
else else
BUILD_TOOL = $(MAKE) BUILD_TOOL = $(MAKE)
endif endif
endif endif
BUILD_CMD = $(BUILD_TOOL)
# Only need to handle Ninja here. Make will inherit the VERBOSE variable, and the -j, -l, and -n flags. ifneq ($(VERBOSE),)
ifeq ($(CMAKE_GENERATOR),Ninja) # Only need to handle Ninja here. Make will inherit the VERBOSE variable.
ifneq ($(VERBOSE),) ifeq ($(BUILD_TYPE),Ninja)
BUILD_TOOL += -v BUILD_CMD += -v
endif
BUILD_TOOL += $(shell printf '%s' '$(MAKEFLAGS)' | grep -o -- ' *-[jl][0-9]\+ *')
ifeq (n,$(findstring n,$(firstword -$(MAKEFLAGS))))
BUILD_TOOL += -n
endif endif
endif endif
@@ -89,22 +83,22 @@ endif
SINGLE_MAKE = export MAKEFLAGS= ; $(MAKE) SINGLE_MAKE = export MAKEFLAGS= ; $(MAKE)
nvim: build/.ran-cmake deps nvim: build/.ran-cmake deps
+$(BUILD_TOOL) -C build +$(BUILD_CMD) -C build
libnvim: build/.ran-cmake deps libnvim: build/.ran-cmake deps
+$(BUILD_TOOL) -C build libnvim +$(BUILD_CMD) -C build libnvim
cmake: cmake:
touch CMakeLists.txt touch CMakeLists.txt
$(MAKE) build/.ran-cmake $(MAKE) build/.ran-cmake
build/.ran-cmake: | deps build/.ran-cmake: | deps
cd build && $(CMAKE_PRG) -G '$(CMAKE_GENERATOR)' $(CMAKE_FLAGS) $(CMAKE_EXTRA_FLAGS) $(MAKEFILE_DIR) cd build && $(CMAKE_PRG) -G '$(BUILD_TYPE)' $(CMAKE_FLAGS) $(CMAKE_EXTRA_FLAGS) $(THIS_DIR)
touch $@ touch $@
deps: | build/.ran-third-party-cmake deps: | build/.ran-third-party-cmake
ifeq ($(call filter-true,$(USE_BUNDLED)),) ifeq ($(call filter-true,$(USE_BUNDLED)),)
+$(BUILD_TOOL) -C $(DEPS_BUILD_DIR) +$(BUILD_CMD) -C $(DEPS_BUILD_DIR)
endif endif
ifeq ($(call filter-true,$(USE_BUNDLED)),) ifeq ($(call filter-true,$(USE_BUNDLED)),)
@@ -112,8 +106,8 @@ $(DEPS_BUILD_DIR):
mkdir -p "$@" mkdir -p "$@"
build/.ran-third-party-cmake:: $(DEPS_BUILD_DIR) build/.ran-third-party-cmake:: $(DEPS_BUILD_DIR)
cd $(DEPS_BUILD_DIR) && \ cd $(DEPS_BUILD_DIR) && \
$(CMAKE_PRG) -G '$(CMAKE_GENERATOR)' $(BUNDLED_CMAKE_FLAG) $(BUNDLED_LUA_CMAKE_FLAG) \ $(CMAKE_PRG) -G '$(BUILD_TYPE)' $(BUNDLED_CMAKE_FLAG) $(BUNDLED_LUA_CMAKE_FLAG) \
$(DEPS_CMAKE_FLAGS) $(MAKEFILE_DIR)/third-party $(DEPS_CMAKE_FLAGS) $(THIS_DIR)/third-party
endif endif
build/.ran-third-party-cmake:: build/.ran-third-party-cmake::
mkdir -p build mkdir -p build
@@ -123,39 +117,26 @@ build/.ran-third-party-cmake::
oldtest: | nvim build/runtime/doc/tags oldtest: | nvim build/runtime/doc/tags
+$(SINGLE_MAKE) -C src/nvim/testdir clean +$(SINGLE_MAKE) -C src/nvim/testdir clean
ifeq ($(strip $(TEST_FILE)),) ifeq ($(strip $(TEST_FILE)),)
+$(SINGLE_MAKE) -C src/nvim/testdir NVIM_PRG=$(NVIM_PRG) $(MAKEOVERRIDES) +$(SINGLE_MAKE) -C src/nvim/testdir NVIM_PRG="$(realpath build/bin/nvim)" $(MAKEOVERRIDES)
else else
@# Handle TEST_FILE=test_foo{,.res,.vim}. +$(SINGLE_MAKE) -C src/nvim/testdir NVIM_PRG="$(realpath build/bin/nvim)" NEW_TESTS=$(TEST_FILE) SCRIPTS= $(MAKEOVERRIDES)
+$(SINGLE_MAKE) -C src/nvim/testdir NVIM_PRG=$(NVIM_PRG) SCRIPTS= $(MAKEOVERRIDES) $(patsubst %.vim,%,$(patsubst %.res,%,$(TEST_FILE)))
endif endif
# Build oldtest by specifying the relative .vim filename.
.PHONY: phony_force
src/nvim/testdir/%.vim: phony_force
+$(SINGLE_MAKE) -C src/nvim/testdir NVIM_PRG=$(NVIM_PRG) SCRIPTS= $(MAKEOVERRIDES) $(patsubst src/nvim/testdir/%.vim,%,$@)
build/runtime/doc/tags helptags: | nvim build/runtime/doc/tags helptags: | nvim
+$(BUILD_TOOL) -C build runtime/doc/tags +$(BUILD_CMD) -C build runtime/doc/tags
# Builds help HTML _and_ checks for invalid help tags. # Builds help HTML _and_ checks for invalid help tags.
helphtml: | nvim build/runtime/doc/tags helphtml: | nvim build/runtime/doc/tags
+$(BUILD_TOOL) -C build doc_html +$(BUILD_CMD) -C build doc_html
functionaltest: | nvim functionaltest: | nvim
+$(BUILD_TOOL) -C build functionaltest +$(BUILD_CMD) -C build functionaltest
functionaltest-lua: | nvim functionaltest-lua: | nvim
+$(BUILD_TOOL) -C build functionaltest-lua +$(BUILD_CMD) -C build functionaltest-lua
lualint: | build/.ran-cmake deps lualint: | build/.ran-cmake deps
$(BUILD_TOOL) -C build lualint $(BUILD_CMD) -C build lualint
shlint:
@shellcheck --version | head -n 2
shellcheck scripts/vim-patch.sh
_opt_shlint:
@command -v shellcheck && { $(MAKE) shlint; exit $$?; } \
|| echo "SKIP: shlint (shellcheck not found)"
pylint: pylint:
flake8 contrib/ scripts/ src/ test/ flake8 contrib/ scripts/ src/ test/
@@ -165,45 +146,37 @@ _opt_pylint:
@command -v flake8 && { $(MAKE) pylint; exit $$?; } \ @command -v flake8 && { $(MAKE) pylint; exit $$?; } \
|| echo "SKIP: pylint (flake8 not found)" || echo "SKIP: pylint (flake8 not found)"
commitlint:
$(NVIM_PRG) --clean -es +"lua require('scripts.lintcommit').main({trace=false})"
_opt_commitlint:
@test -x build/bin/nvim && { $(MAKE) commitlint; exit $$?; } \
|| echo "SKIP: commitlint (build/bin/nvim not found)"
unittest: | nvim unittest: | nvim
+$(BUILD_TOOL) -C build unittest +$(BUILD_CMD) -C build unittest
benchmark: | nvim benchmark: | nvim
+$(BUILD_TOOL) -C build benchmark +$(BUILD_CMD) -C build benchmark
test: functionaltest unittest test: functionaltest unittest
clean: clean:
+test -d build && $(BUILD_TOOL) -C build clean || true +test -d build && $(BUILD_CMD) -C build clean || true
$(MAKE) -C src/nvim/testdir clean $(MAKE) -C src/nvim/testdir clean
$(MAKE) -C runtime/doc clean $(MAKE) -C runtime/doc clean
$(MAKE) -C runtime/indent clean
distclean: distclean:
rm -rf $(DEPS_BUILD_DIR) build rm -rf $(DEPS_BUILD_DIR) build
$(MAKE) clean $(MAKE) clean
install: checkprefix nvim install: checkprefix nvim
+$(BUILD_TOOL) -C build install +$(BUILD_CMD) -C build install
clint: build/.ran-cmake clint: build/.ran-cmake
+$(BUILD_TOOL) -C build clint +$(BUILD_CMD) -C build clint
clint-full: build/.ran-cmake clint-full: build/.ran-cmake
+$(BUILD_TOOL) -C build clint-full +$(BUILD_CMD) -C build clint-full
check-single-includes: build/.ran-cmake check-single-includes: build/.ran-cmake
+$(BUILD_TOOL) -C build check-single-includes +$(BUILD_CMD) -C build check-single-includes
generated-sources: build/.ran-cmake generated-sources: build/.ran-cmake
+$(BUILD_TOOL) -C build generated-sources +$(BUILD_CMD) -C build generated-sources
appimage: appimage:
bash scripts/genappimage.sh bash scripts/genappimage.sh
@@ -214,16 +187,16 @@ appimage:
appimage-%: appimage-%:
bash scripts/genappimage.sh $* bash scripts/genappimage.sh $*
lint: check-single-includes clint lualint _opt_pylint _opt_shlint _opt_commitlint lint: check-single-includes clint lualint _opt_pylint
# Generic pattern rules, allowing for `make build/bin/nvim` etc. # Generic pattern rules, allowing for `make build/bin/nvim` etc.
# Does not work with "Unix Makefiles". # Does not work with "Unix Makefiles".
ifeq ($(CMAKE_GENERATOR),Ninja) ifeq ($(BUILD_TYPE),Ninja)
build/%: phony_force build/%:
$(BUILD_TOOL) -C build $(patsubst build/%,%,$@) $(BUILD_CMD) -C build $(patsubst build/%,%,$@)
$(DEPS_BUILD_DIR)/%: phony_force $(DEPS_BUILD_DIR)/%:
$(BUILD_TOOL) -C $(DEPS_BUILD_DIR) $(patsubst $(DEPS_BUILD_DIR)/%,%,$@) $(BUILD_CMD) -C $(DEPS_BUILD_DIR) $(patsubst $(DEPS_BUILD_DIR)/%,%,$@)
endif endif
.PHONY: test lualint pylint shlint functionaltest unittest lint clint clean distclean nvim libnvim cmake deps install appimage checkprefix commitlint .PHONY: test lualint pylint functionaltest unittest lint clint clean distclean nvim libnvim cmake deps install appimage checkprefix

View File

@@ -1,10 +1,12 @@
[![Neovim](https://raw.githubusercontent.com/neovim/neovim.github.io/master/logos/neovim-logo-300x87.png)](https://neovim.io) [![Neovim](https://raw.githubusercontent.com/neovim/neovim.github.io/master/logos/neovim-logo-300x87.png)](https://neovim.io)
[Documentation](https://neovim.io/doc/general/) | [Wiki](https://github.com/neovim/neovim/wiki) |
[Chat](https://app.element.io/#/room/#neovim:matrix.org) | [Documentation](https://neovim.io/doc) |
[Chat/Discussion](https://gitter.im/neovim/neovim) |
[Twitter](https://twitter.com/Neovim) [Twitter](https://twitter.com/Neovim)
[![GitHub CI](https://github.com/neovim/neovim/workflows/CI/badge.svg)](https://github.com/neovim/neovim/actions?query=workflow%3ACI+branch%3Amaster+event%3Apush) [![Travis build status](https://travis-ci.org/neovim/neovim.svg?branch=master)](https://travis-ci.org/neovim/neovim)
[![AppVeyor build status](https://ci.appveyor.com/api/projects/status/urdqjrik5u521fac/branch/master?svg=true)](https://ci.appveyor.com/project/neovim/neovim/branch/master)
[![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)
@@ -13,7 +15,6 @@
[![Packages](https://repology.org/badge/tiny-repos/neovim.svg)](https://repology.org/metapackage/neovim) [![Packages](https://repology.org/badge/tiny-repos/neovim.svg)](https://repology.org/metapackage/neovim)
[![Debian CI](https://badges.debian.net/badges/debian/testing/neovim/version.svg)](https://buildd.debian.org/neovim) [![Debian CI](https://badges.debian.net/badges/debian/testing/neovim/version.svg)](https://buildd.debian.org/neovim)
[![Downloads](https://img.shields.io/github/downloads/neovim/neovim/total.svg?maxAge=2592001)](https://github.com/neovim/neovim/releases/) [![Downloads](https://img.shields.io/github/downloads/neovim/neovim/total.svg?maxAge=2592001)](https://github.com/neovim/neovim/releases/)
[![nvim](https://snapcraft.io//nvim/badge.svg)](https://snapcraft.io/nvim)
Neovim is a project that seeks to aggressively refactor Vim in order to: Neovim is a project that seeks to aggressively refactor Vim in order to:
@@ -46,15 +47,13 @@ Install from package
Pre-built packages for Windows, macOS, and Linux are found on the Pre-built packages for Windows, macOS, and Linux are found on the
[Releases](https://github.com/neovim/neovim/releases/) page. [Releases](https://github.com/neovim/neovim/releases/) page.
[Managed packages] are in [Homebrew], [Debian], [Ubuntu], [Fedora], [Arch Linux], [Void Linux], [Gentoo], and more! [Managed packages] are in Homebrew, [Debian], [Ubuntu], [Fedora], [Arch Linux],
[Gentoo], and more!
Install from source Install from source
------------------- -------------------
See the [Building Neovim](https://github.com/neovim/neovim/wiki/Building-Neovim) wiki page for details.
The build is CMake-based, but a Makefile is provided as a convenience. The build is CMake-based, but a Makefile is provided as a convenience.
After installing the dependencies, run the following command.
make CMAKE_BUILD_TYPE=RelWithDebInfo make CMAKE_BUILD_TYPE=RelWithDebInfo
sudo make install sudo make install
@@ -64,12 +63,29 @@ To install to a non-default location:
make CMAKE_INSTALL_PREFIX=/full/path/ make CMAKE_INSTALL_PREFIX=/full/path/
make install make install
CMake hints for inspecting the build: To skip bundled (`third-party/*`) dependencies:
1. Install the dependencies using a package manager.
```
sudo apt install gperf luajit luarocks libuv1-dev libluajit-5.1-dev libunibilium-dev libmsgpack-dev libtermkey-dev libvterm-dev
sudo luarocks build mpack
sudo luarocks build lpeg
sudo luarocks build inspect
```
2. Build with `USE_BUNDLED=OFF`:
```
make CMAKE_BUILD_TYPE=RelWithDebInfo USE_BUNDLED=OFF
sudo make install
```
To inspect the build, these CMake features are useful:
- `cmake --build build --target help` lists all build targets. - `cmake --build build --target help` lists all build targets.
- `build/CMakeCache.txt` (or `cmake -LAH build/`) contains the resolved values of all CMake variables. - `build/CMakeCache.txt` (or `cmake -LAH build/`) contains the resolved values of all CMake variables.
- `build/compile_commands.json` shows the full compiler invocations for each translation unit. - `build/compile_commands.json` shows the full compiler invocations for each translation unit.
See the [Building Neovim](https://github.com/neovim/neovim/wiki/Building-Neovim) wiki page for details.
Transitioning from Vim Transitioning from Vim
-------------------- --------------------
@@ -97,9 +113,17 @@ Project layout
License License
------- -------
Neovim contributions since [b17d96][license-commit] are licensed under the Neovim is licensed under the terms of the Apache 2.0 license, except for
Apache 2.0 license, except for contributions copied from Vim (identified by the parts that were contributed under the Vim license.
`vim-patch` token). See LICENSE for details.
- Contributions committed before [b17d96][license-commit] remain under the Vim
license.
- Contributions committed after [b17d96][license-commit] are licensed under
Apache 2.0 unless those contributions were copied from Vim (identified in
the commit logs by the `vim-patch` token).
See `LICENSE` for details.
Vim is Charityware. You can use and copy it as much as you like, but you are Vim is Charityware. You can use and copy it as much as you like, but you are
encouraged to make a donation for needy children in Uganda. Please see the encouraged to make a donation for needy children in Uganda. Please see the
@@ -121,8 +145,6 @@ Apache 2.0 license, except for contributions copied from Vim (identified by the
[Ubuntu]: http://packages.ubuntu.com/search?keywords=neovim [Ubuntu]: http://packages.ubuntu.com/search?keywords=neovim
[Fedora]: https://apps.fedoraproject.org/packages/neovim [Fedora]: https://apps.fedoraproject.org/packages/neovim
[Arch Linux]: https://www.archlinux.org/packages/?q=neovim [Arch Linux]: https://www.archlinux.org/packages/?q=neovim
[Void Linux]: https://voidlinux.org/packages/?arch=x86_64&q=neovim
[Gentoo]: https://packages.gentoo.org/packages/app-editors/neovim [Gentoo]: https://packages.gentoo.org/packages/app-editors/neovim
[Homebrew]: https://formulae.brew.sh/formula/neovim
<!-- vim: set tw=80: --> <!-- vim: set tw=80: -->

42
appveyor.yml Normal file
View File

@@ -0,0 +1,42 @@
version: '{build}'
environment:
APPVEYOR_CACHE_ENTRY_ZIP_ARGS: "-t7z -m0=lzma -mx=9"
DEPS_BUILD_DIR: "C:/projects/nvim-deps"
DEPS_PREFIX: "C:/projects/nvim-deps/usr"
# Silence/redirect errors due to missing locking support (via libgcov).
GCOV_ERROR_FILE: "$(TEMP)/libgcov-errors.log"
image: Visual Studio 2017
configuration:
- MINGW_64-gcov
- MINGW_32
- MSVC_64
- MSVC_32
init:
- ps: |
# Pull requests: skip some build configurations to save time.
if ($env:APPVEYOR_PULL_REQUEST_HEAD_COMMIT -and $env:CONFIGURATION -match '^(MSVC_64|MINGW_32)$') {
$env:APPVEYOR_CACHE_SKIP_SAVE = "true"
Exit-AppVeyorBuild
}
# RDP
#- ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
matrix:
fast_finish: true
install: []
before_build:
- ps: Install-Product node 8
build_script:
- powershell ci\build.ps1
after_build:
- ps: |
if (Test-Path $env:GCOV_ERROR_FILE) {
Get-Content $env:GCOV_ERROR_FILE -Head 10
Get-Content $env:GCOV_ERROR_FILE -Tail 10
} else {
write-host "no GCOV_ERROR_FILE"
}
cache:
- C:\projects\nvim-deps -> third-party\**
artifacts:
- path: build/Neovim.zip
- path: build/bin/nvim.exe

View File

@@ -3,6 +3,10 @@
set -e set -e
set -o pipefail set -o pipefail
if [[ "${CI_TARGET}" == lint ]]; then
exit
fi
echo 'Python info:' echo 'Python info:'
( (
set -x set -x
@@ -22,7 +26,7 @@ if [[ "${TRAVIS_OS_NAME}" != osx ]] && command -v pyenv; then
echo 'Setting Python versions via pyenv' echo 'Setting Python versions via pyenv'
# Prefer Python 2 over 3 (more conservative). # Prefer Python 2 over 3 (more conservative).
pyenv global 2.7:3.8 pyenv global 2.7.15:3.7.1
echo 'Updated Python info:' echo 'Updated Python info:'
( (
@@ -43,4 +47,18 @@ if [[ "${TRAVIS_OS_NAME}" == osx ]] || [ ! -f ~/.nvm/nvm.sh ]; then
fi fi
source ~/.nvm/nvm.sh source ~/.nvm/nvm.sh
nvm install 10 nvm install --lts
nvm use --lts
if [[ -n "$CMAKE_URL" ]]; then
echo "Installing custom CMake: $CMAKE_URL"
curl --retry 5 --silent --fail -o /tmp/cmake-installer.sh "$CMAKE_URL"
mkdir -p "$HOME/.local/bin" /opt/cmake-custom
bash /tmp/cmake-installer.sh --prefix=/opt/cmake-custom --skip-license
ln -sfn /opt/cmake-custom/bin/cmake "$HOME/.local/bin/cmake"
cmake_version="$(cmake --version)"
echo "$cmake_version" | grep -qF '2.8.12' || {
echo "Unexpected CMake version: $cmake_version"
exit 1
}
fi

View File

@@ -3,15 +3,13 @@
set -e set -e
set -o pipefail set -o pipefail
if [[ "${CI_TARGET}" == lint ]]; then
exit
fi
CI_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" CI_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${CI_DIR}/common/build.sh" source "${CI_DIR}/common/build.sh"
# Enable ipv6 on Travis. ref: a39c8b7ce30d
if test -n "${TRAVIS_OS_NAME}" && ! test "${TRAVIS_OS_NAME}" = osx ; then
echo "before_script.sh: enable ipv6"
sudo sysctl -w net.ipv6.conf.lo.disable_ipv6=0
fi
# Test some of the configuration variables. # Test some of the configuration variables.
if [[ -n "${GCOV}" ]] && [[ ! $(type -P "${GCOV}") ]]; then if [[ -n "${GCOV}" ]] && [[ ! $(type -P "${GCOV}") ]]; then
echo "\$GCOV: '${GCOV}' is not executable." echo "\$GCOV: '${GCOV}' is not executable."
@@ -37,10 +35,5 @@ fi
# Compile dependencies. # Compile dependencies.
build_deps build_deps
# Install cluacov for Lua coverage.
if [[ "$USE_LUACOV" == 1 ]]; then
"${DEPS_BUILD_DIR}/usr/bin/luarocks" install cluacov
fi
rm -rf "${LOG_DIR}" rm -rf "${LOG_DIR}"
mkdir -p "${LOG_DIR}" mkdir -p "${LOG_DIR}"

View File

@@ -1,11 +1,10 @@
param([switch]$NoTests) $ErrorActionPreference = 'stop'
Set-StrictMode -Version Latest Set-PSDebug -Strict -Trace 1
$ErrorActionPreference = 'Stop'
$ProgressPreference = 'SilentlyContinue'
$isPullRequest = ($env:APPVEYOR_PULL_REQUEST_HEAD_COMMIT -ne $null)
$env:CONFIGURATION -match '^(?<compiler>\w+)_(?<bits>32|64)(?:-(?<option>\w+))?$' $env:CONFIGURATION -match '^(?<compiler>\w+)_(?<bits>32|64)(?:-(?<option>\w+))?$'
$compiler = $Matches.compiler $compiler = $Matches.compiler
$compileOption = if ($Matches -contains 'option') {$Matches.option} else {''} $compileOption = $Matches.option
$bits = $Matches.bits $bits = $Matches.bits
$cmakeBuildType = $(if ($env:CMAKE_BUILD_TYPE -ne $null) {$env:CMAKE_BUILD_TYPE} else {'RelWithDebInfo'}); $cmakeBuildType = $(if ($env:CMAKE_BUILD_TYPE -ne $null) {$env:CMAKE_BUILD_TYPE} else {'RelWithDebInfo'});
$buildDir = [System.IO.Path]::GetFullPath("$(pwd)") $buildDir = [System.IO.Path]::GetFullPath("$(pwd)")
@@ -24,15 +23,11 @@ $uploadToCodeCov = $false
function exitIfFailed() { function exitIfFailed() {
if ($LastExitCode -ne 0) { if ($LastExitCode -ne 0) {
Set-PSDebug -Off
exit $LastExitCode exit $LastExitCode
} }
} }
if (-not $NoTests) {
node --version
npm.cmd --version
}
if (-Not (Test-Path -PathType container $env:DEPS_BUILD_DIR)) { if (-Not (Test-Path -PathType container $env:DEPS_BUILD_DIR)) {
write-host "cache dir not found: $($env:DEPS_BUILD_DIR)" write-host "cache dir not found: $($env:DEPS_BUILD_DIR)"
mkdir $env:DEPS_BUILD_DIR mkdir $env:DEPS_BUILD_DIR
@@ -51,17 +46,13 @@ if ($compiler -eq 'MINGW') {
$nvimCmakeVars['USE_GCOV'] = 'ON' $nvimCmakeVars['USE_GCOV'] = 'ON'
$uploadToCodecov = $true $uploadToCodecov = $true
$env:GCOV = "C:\msys64\mingw$bits\bin\gcov" $env:GCOV = "C:\msys64\mingw$bits\bin\gcov"
# Setup/build Lua coverage.
$env:USE_LUACOV = 1
$env:BUSTED_ARGS = "--coverage"
} }
# These are native MinGW builds, but they use the toolchain inside # These are native MinGW builds, but they use the toolchain inside
# MSYS2, this allows using all the dependencies and tools available # MSYS2, this allows using all the dependencies and tools available
# in MSYS2, but we cannot build inside the MSYS2 shell. # in MSYS2, but we cannot build inside the MSYS2 shell.
$cmakeGenerator = 'Ninja' $cmakeGenerator = 'Ninja'
$cmakeGeneratorArgs = '-v' $cmakeGeneratorArgs = '-v'
$mingwPackages = @('ninja', 'cmake', 'diffutils').ForEach({ $mingwPackages = @('ninja', 'cmake', 'perl', 'diffutils').ForEach({
"mingw-w64-$arch-$_" "mingw-w64-$arch-$_"
}) })
@@ -72,7 +63,7 @@ if ($compiler -eq 'MINGW') {
& C:\msys64\usr\bin\mkdir -p /var/cache/pacman/pkg & C:\msys64\usr\bin\mkdir -p /var/cache/pacman/pkg
# Build third-party dependencies # Build third-party dependencies
C:\msys64\usr\bin\bash -lc "pacman --verbose --noconfirm -Syu" ; exitIfFailed C:\msys64\usr\bin\bash -lc "pacman --verbose --noconfirm -Su" ; exitIfFailed
C:\msys64\usr\bin\bash -lc "pacman --verbose --noconfirm --needed -S $mingwPackages" ; exitIfFailed C:\msys64\usr\bin\bash -lc "pacman --verbose --noconfirm --needed -S $mingwPackages" ; exitIfFailed
} }
elseif ($compiler -eq 'MSVC') { elseif ($compiler -eq 'MSVC') {
@@ -85,24 +76,23 @@ elseif ($compiler -eq 'MSVC') {
} }
} }
if (-not $NoTests) { # Setup python (use AppVeyor system python)
python -m ensurepip C:\Python27\python.exe -m pip install pynvim ; exitIfFailed
python -m pip install pynvim ; exitIfFailed C:\Python35\python.exe -m pip install pynvim ; exitIfFailed
# Sanity check # Disambiguate python3
python -c "import pynvim; print(str(pynvim))" ; exitIfFailed move c:\Python35\python.exe c:\Python35\python3.exe
$env:PATH = "C:\Python35;C:\Python27;$env:PATH"
# Sanity check
python -c "import pynvim; print(str(pynvim))" ; exitIfFailed
python3 -c "import pynvim; print(str(pynvim))" ; exitIfFailed
gem.cmd install --pre neovim $env:PATH = "C:\Ruby24\bin;$env:PATH"
Get-Command -CommandType Application neovim-ruby-host.bat gem.cmd install neovim
Get-Command -CommandType Application neovim-ruby-host.bat
npm.cmd install -g neovim npm.cmd install -g neovim
Get-Command -CommandType Application neovim-node-host.cmd Get-Command -CommandType Application neovim-node-host.cmd
npm.cmd link neovim npm.cmd link neovim
}
if ($compiler -eq 'MSVC') {
# Required for LuaRocks (https://github.com/luarocks/luarocks/issues/1039#issuecomment-507296940).
$env:VCINSTALLDIR = "C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.16.27023/"
}
function convertToCmakeArgs($vars) { function convertToCmakeArgs($vars) {
return $vars.GetEnumerator() | foreach { "-D$($_.Key)=$($_.Value)" } return $vars.GetEnumerator() | foreach { "-D$($_.Key)=$($_.Value)" }
@@ -123,47 +113,37 @@ cmake --build . --config $cmakeBuildType -- $cmakeGeneratorArgs ; exitIfFailed
# Ensure that the "win32" feature is set. # Ensure that the "win32" feature is set.
.\bin\nvim -u NONE --headless -c 'exe !has(\"win32\").\"cq\"' ; exitIfFailed .\bin\nvim -u NONE --headless -c 'exe !has(\"win32\").\"cq\"' ; exitIfFailed
if ($env:USE_LUACOV -eq 1) { # Functional tests
& $env:DEPS_PREFIX\luarocks\luarocks.bat install cluacov # The $LastExitCode from MSBuild can't be trusted
} $failed = $false
# Temporarily turn off tracing to reduce log file output
if (-not $NoTests) { Set-PSDebug -Off
# Functional tests cmake --build . --config $cmakeBuildType --target functionaltest -- $cmakeGeneratorArgs 2>&1 |
# The $LastExitCode from MSBuild can't be trusted foreach { $failed = $failed -or
$failed = $false $_ -match 'functional tests failed with error'; $_ }
if ($failed) {
# Run only this test file:
# $env:TEST_FILE = "test\functional\foo.lua"
cmake --build . --config $cmakeBuildType --target functionaltest -- $cmakeGeneratorArgs 2>&1 |
foreach { $failed = $failed -or
$_ -match 'functional tests failed with error'; $_ }
if ($uploadToCodecov) { if ($uploadToCodecov) {
if ($env:USE_LUACOV -eq 1) {
& $env:DEPS_PREFIX\bin\luacov.bat
}
bash -l /c/projects/neovim/ci/common/submit_coverage.sh functionaltest bash -l /c/projects/neovim/ci/common/submit_coverage.sh functionaltest
} }
if ($failed) { exit $LastExitCode
exit $LastExitCode }
} Set-PSDebug -Strict -Trace 1
# Old tests
# Add MSYS to path, required for e.g. `find` used in test scripts.
# But would break functionaltests, where its `more` would be used then.
$OldPath = $env:PATH
$env:PATH = "C:\msys64\usr\bin;$env:PATH"
& "C:\msys64\mingw$bits\bin\mingw32-make.exe" -C $(Convert-Path ..\src\nvim\testdir) VERBOSE=1 ; exitIfFailed
$env:PATH = $OldPath
if ($uploadToCodecov) { if ($uploadToCodecov) {
bash -l /c/projects/neovim/ci/common/submit_coverage.sh oldtest bash -l /c/projects/neovim/ci/common/submit_coverage.sh functionaltest
}
} }
# Ensure choco's cpack is not in PATH otherwise, it conflicts with CMake's # Old tests
if (Test-Path -Path $env:ChocolateyInstall\bin\cpack.exe) { # Add MSYS to path, required for e.g. `find` used in test scripts.
Remove-Item -Path $env:ChocolateyInstall\bin\cpack.exe -Force # But would break functionaltests, where its `more` would be used then.
$OldPath = $env:PATH
$env:PATH = "C:\msys64\usr\bin;$env:PATH"
& "C:\msys64\mingw$bits\bin\mingw32-make.exe" -C $(Convert-Path ..\src\nvim\testdir) VERBOSE=1 ; exitIfFailed
$env:PATH = $OldPath
if ($uploadToCodecov) {
bash -l /c/projects/neovim/ci/common/submit_coverage.sh oldtest
} }
# Build artifacts # Build artifacts

View File

@@ -1,5 +1,5 @@
_stat() { _stat() {
if test "${CI_OS_NAME}" = osx ; then if test "${TRAVIS_OS_NAME}" = osx ; then
stat -f %Sm "${@}" stat -f %Sm "${@}"
else else
stat -c %y "${@}" stat -c %y "${@}"
@@ -18,6 +18,9 @@ build_make() {
} }
build_deps() { build_deps() {
if test "${BUILD_32BIT}" = ON ; then
DEPS_CMAKE_FLAGS="${DEPS_CMAKE_FLAGS} ${CMAKE_FLAGS_32BIT}"
fi
if test "${FUNCTIONALTEST}" = "functionaltest-lua" \ if test "${FUNCTIONALTEST}" = "functionaltest-lua" \
|| test "${CLANG_SANITIZER}" = "ASAN_UBSAN" ; then || test "${CLANG_SANITIZER}" = "ASAN_UBSAN" ; then
DEPS_CMAKE_FLAGS="${DEPS_CMAKE_FLAGS} -DUSE_BUNDLED_LUA=ON" DEPS_CMAKE_FLAGS="${DEPS_CMAKE_FLAGS} -DUSE_BUNDLED_LUA=ON"
@@ -29,7 +32,7 @@ build_deps() {
if test "${CACHE_ENABLE}" = "false" ; then if test "${CACHE_ENABLE}" = "false" ; then
export CCACHE_RECACHE=1 export CCACHE_RECACHE=1
elif test -f "${CACHE_MARKER}" ; then elif test -f "${CACHE_MARKER}" ; then
echo "Using third-party dependencies from cache (last update: $(_stat "${CACHE_MARKER}"))." echo "Using third-party dependencies from Travis cache (last update: $(_stat "${CACHE_MARKER}"))."
cp -a "${CACHE_NVIM_DEPS_DIR}"/. "${DEPS_BUILD_DIR}" cp -a "${CACHE_NVIM_DEPS_DIR}"/. "${DEPS_BUILD_DIR}"
fi fi
@@ -37,24 +40,27 @@ build_deps() {
# update CMake configuration and update to newer deps versions. # update CMake configuration and update to newer deps versions.
cd "${DEPS_BUILD_DIR}" cd "${DEPS_BUILD_DIR}"
echo "Configuring with '${DEPS_CMAKE_FLAGS}'." echo "Configuring with '${DEPS_CMAKE_FLAGS}'."
CC= cmake -G Ninja ${DEPS_CMAKE_FLAGS} "${CI_BUILD_DIR}/third-party/" CC= cmake -G Ninja ${DEPS_CMAKE_FLAGS} "${TRAVIS_BUILD_DIR}/third-party/"
if ! top_make; then if ! top_make; then
exit 1 exit 1
fi fi
cd "${CI_BUILD_DIR}" cd "${TRAVIS_BUILD_DIR}"
} }
prepare_build() { prepare_build() {
if test -n "${CLANG_SANITIZER}" ; then if test -n "${CLANG_SANITIZER}" ; then
CMAKE_FLAGS="${CMAKE_FLAGS} -DCLANG_${CLANG_SANITIZER}=ON" CMAKE_FLAGS="${CMAKE_FLAGS} -DCLANG_${CLANG_SANITIZER}=ON"
fi fi
if test "${BUILD_32BIT}" = ON ; then
CMAKE_FLAGS="${CMAKE_FLAGS} ${CMAKE_FLAGS_32BIT}"
fi
mkdir -p "${BUILD_DIR}" mkdir -p "${BUILD_DIR}"
cd "${BUILD_DIR}" cd "${BUILD_DIR}"
echo "Configuring with '${CMAKE_FLAGS} $@'." echo "Configuring with '${CMAKE_FLAGS} $@'."
cmake -G Ninja ${CMAKE_FLAGS} "$@" "${CI_BUILD_DIR}" cmake -G Ninja ${CMAKE_FLAGS} "$@" "${TRAVIS_BUILD_DIR}"
} }
build_nvim() { build_nvim() {
@@ -84,5 +90,14 @@ build_nvim() {
fi fi
check_sanitizer "${LOG_DIR}" check_sanitizer "${LOG_DIR}"
cd "${CI_BUILD_DIR}" cd "${TRAVIS_BUILD_DIR}"
}
macos_rvm_dance() {
# neovim-ruby gem requires a ruby newer than the macOS default.
source ~/.rvm/scripts/rvm
rvm get stable --auto-dotfiles
rvm reload
rvm use 2.2.5
rvm use
} }

View File

@@ -43,14 +43,3 @@ fi
# Cleanup always, especially collected data. # Cleanup always, especially collected data.
find . \( -name '*.gcov' -o -name '*.gcda' \) -ls -delete | wc -l find . \( -name '*.gcov' -o -name '*.gcda' \) -ls -delete | wc -l
rm -f coverage.xml rm -f coverage.xml
# Upload Lua coverage (generated manually on AppVeyor/Windows).
if [ "$USE_LUACOV" = 1 ] && [ "$1" != "oldtest" ]; then
if [ -x "${DEPS_BUILD_DIR}/usr/bin/luacov" ]; then
"${DEPS_BUILD_DIR}/usr/bin/luacov"
fi
if ! "$codecov_sh" -f luacov.report.out -X gcov -X fix -Z -F "lua,${codecov_flags}"; then
echo "codecov upload failed."
fi
rm luacov.stats.out
fi

View File

@@ -13,33 +13,16 @@ FAIL_SUMMARY_FILE="$BUILD_DIR/.test_errors"
ANSI_CLEAR="\033[0K" ANSI_CLEAR="\033[0K"
if test "$TRAVIS" = "true"; then travis_fold() {
ci_fold() { local action="$1"
local action="$1" local name="$2"
local name="$2" name="$(echo -n "$name" | tr '\n\0' '--' | sed 's/[^A-Za-z0-9]\{1,\}/-/g')"
name="$(echo -n "$name" | tr '\n\0' '--' | sed 's/[^A-Za-z0-9]\{1,\}/-/g')" name="$(echo -n "$name" | sed 's/-$//')"
name="$(echo -n "$name" | sed 's/-$//')" echo -en "travis_fold:${action}:${name}\r${ANSI_CLEAR}"
echo -en "travis_fold:${action}:${name}\r${ANSI_CLEAR}" }
}
elif test "$GITHUB_ACTIONS" = "true"; then if test "$TRAVIS" != "true" ; then
ci_fold() { travis_fold() {
local action="$1"
local name="$2"
name="$(echo -n "$name" | tr '\n\0' '--' | sed 's/[^A-Za-z0-9]\{1,\}/-/g')"
name="$(echo -n "$name" | sed 's/-$//')"
case "$action" in
start)
echo "::group::${name}"
;;
end)
echo "::endgroup::"
;;
*)
:;;
esac
}
else
ci_fold() {
return 0 return 0
} }
fi fi
@@ -50,7 +33,7 @@ enter_suite() {
rm -f "${END_MARKER}" rm -f "${END_MARKER}"
local suite_name="$1" local suite_name="$1"
export NVIM_TEST_CURRENT_SUITE="${NVIM_TEST_CURRENT_SUITE}/$suite_name" export NVIM_TEST_CURRENT_SUITE="${NVIM_TEST_CURRENT_SUITE}/$suite_name"
ci_fold start "${NVIM_TEST_CURRENT_SUITE}" travis_fold start "${NVIM_TEST_CURRENT_SUITE}"
set -x set -x
} }
@@ -60,7 +43,7 @@ exit_suite() {
echo "Suite ${NVIM_TEST_CURRENT_SUITE} failed, summary:" echo "Suite ${NVIM_TEST_CURRENT_SUITE} failed, summary:"
echo "${FAIL_SUMMARY}" echo "${FAIL_SUMMARY}"
else else
ci_fold end "${NVIM_TEST_CURRENT_SUITE}" travis_fold end "${NVIM_TEST_CURRENT_SUITE}"
fi fi
export NVIM_TEST_CURRENT_SUITE="${NVIM_TEST_CURRENT_SUITE%/*}" export NVIM_TEST_CURRENT_SUITE="${NVIM_TEST_CURRENT_SUITE%/*}"
if test "$1" != "--continue" ; then if test "$1" != "--continue" ; then

View File

@@ -15,7 +15,7 @@ print_core() {
return 0 return 0
fi fi
echo "======= Core file $core =======" echo "======= Core file $core ======="
if test "${CI_OS_NAME}" = osx ; then if test "${TRAVIS_OS_NAME}" = osx ; then
lldb -Q -o "bt all" -f "${app}" -c "${core}" lldb -Q -o "bt all" -f "${app}" -c "${core}"
else else
gdb -n -batch -ex 'thread apply all bt full' "${app}" -c "${core}" gdb -n -batch -ex 'thread apply all bt full' "${app}" -c "${core}"
@@ -30,11 +30,11 @@ check_core_dumps() {
fi fi
local app="${1:-${BUILD_DIR}/bin/nvim}" local app="${1:-${BUILD_DIR}/bin/nvim}"
local cores local cores
if test "${CI_OS_NAME}" = osx ; then if test "${TRAVIS_OS_NAME}" = osx ; then
cores="$(find /cores/ -type f -print)" cores="$(find /cores/ -type f -print)"
local _sudo='sudo' local _sudo='sudo'
else else
cores="$(find ./ -type f \( -name 'core.*' -o -name core -o -name nvim.core \) -print)" cores="$(find ./ -type f -name 'core.*' -print)"
local _sudo= local _sudo=
fi fi
@@ -82,7 +82,7 @@ valgrind_check() {
check_sanitizer() { check_sanitizer() {
if test -n "${CLANG_SANITIZER}"; then if test -n "${CLANG_SANITIZER}"; then
check_logs "${1}" "*san.*" | ${SYMBOLIZER:-cat} check_logs "${1}" "*san.*"
fi fi
} }

View File

@@ -4,7 +4,7 @@ set -e
set -o pipefail set -o pipefail
if [[ "${CI_TARGET}" == lint ]]; then if [[ "${CI_TARGET}" == lint ]]; then
python3 -m pip -q install --user --upgrade flake8 python -m pip -q install --user --upgrade flake8
exit exit
fi fi
@@ -14,20 +14,13 @@ fi
# Use default CC to avoid compilation problems when installing Python modules. # Use default CC to avoid compilation problems when installing Python modules.
echo "Install neovim module for Python 3." echo "Install neovim module for Python 3."
CC=cc python3 -m pip -q install --user --upgrade pynvim CC=cc python3 -m pip -q install --upgrade pynvim
if python2 -m pip -c True 2>&1; then echo "Install neovim module for Python 2."
echo "Install neovim module for Python 2." CC=cc python2 -m pip -q install --upgrade pynvim
CC=cc python2 -m pip -q install --user --upgrade pynvim
fi
echo "Install neovim RubyGem." echo "Install neovim RubyGem."
gem install --no-document --bindir "$HOME/.local/bin" --user-install --pre neovim gem install --no-document --version ">= 0.8.0" neovim
echo "Install neovim npm package" echo "Install neovim npm package"
source ~/.nvm/nvm.sh
nvm use 10
npm install -g neovim npm install -g neovim
npm link neovim npm link neovim
sudo cpanm -n Neovim::Ext || cat "$HOME/.cpanm/build.log"
perl -W -e 'use Neovim::Ext; print $Neovim::Ext::VERSION'

View File

@@ -20,10 +20,6 @@ enter_suite 'pylint'
run_test 'make pylint' pylint run_test 'make pylint' pylint
exit_suite --continue exit_suite --continue
enter_suite 'shlint'
run_test 'make shlint' shlint
exit_suite --continue
enter_suite single-includes enter_suite single-includes
CLICOLOR_FORCE=1 run_test_wd \ CLICOLOR_FORCE=1 run_test_wd \
--allow-hang \ --allow-hang \

View File

@@ -17,10 +17,6 @@ build_nvim
exit_suite --continue exit_suite --continue
source ~/.nvm/nvm.sh
nvm use 10
enter_suite tests enter_suite tests
if test "$CLANG_SANITIZER" != "TSAN" ; then if test "$CLANG_SANITIZER" != "TSAN" ; then

View File

@@ -1,194 +0,0 @@
{
"ref": "refs/heads/master",
"before": "66b136c43c12df3dcf8f19ff48f206ad2e4f43fc",
"after": "1bf69c32217cc455603ce8aa2b5415d9717f0fa2",
"repository": {
"id": 292861950,
"node_id": "MDEwOlJlcG9zaXRvcnkyOTI4NjE5NTA=",
"name": "neovim-snap",
"full_name": "hurricanehrndz/neovim-snap",
"private": false,
"owner": {
"name": "hurricanehrndz",
"email": "hurricanehrndz@users.noreply.github.com",
"login": "hurricanehrndz",
"id": 5804237,
"node_id": "MDQ6VXNlcjU4MDQyMzc=",
"avatar_url": "https://avatars0.githubusercontent.com/u/5804237?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/hurricanehrndz",
"html_url": "https://github.com/hurricanehrndz",
"followers_url": "https://api.github.com/users/hurricanehrndz/followers",
"following_url": "https://api.github.com/users/hurricanehrndz/following{/other_user}",
"gists_url": "https://api.github.com/users/hurricanehrndz/gists{/gist_id}",
"starred_url": "https://api.github.com/users/hurricanehrndz/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/hurricanehrndz/subscriptions",
"organizations_url": "https://api.github.com/users/hurricanehrndz/orgs",
"repos_url": "https://api.github.com/users/hurricanehrndz/repos",
"events_url": "https://api.github.com/users/hurricanehrndz/events{/privacy}",
"received_events_url": "https://api.github.com/users/hurricanehrndz/received_events",
"type": "User",
"site_admin": false
},
"html_url": "https://github.com/hurricanehrndz/neovim-snap",
"description": "snap build for neovim",
"fork": false,
"url": "https://github.com/hurricanehrndz/neovim-snap",
"forks_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/forks",
"keys_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/keys{/key_id}",
"collaborators_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/collaborators{/collaborator}",
"teams_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/teams",
"hooks_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/hooks",
"issue_events_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/issues/events{/number}",
"events_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/events",
"assignees_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/assignees{/user}",
"branches_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/branches{/branch}",
"tags_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/tags",
"blobs_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/git/blobs{/sha}",
"git_tags_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/git/tags{/sha}",
"git_refs_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/git/refs{/sha}",
"trees_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/git/trees{/sha}",
"statuses_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/statuses/{sha}",
"languages_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/languages",
"stargazers_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/stargazers",
"contributors_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/contributors",
"subscribers_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/subscribers",
"subscription_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/subscription",
"commits_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/commits{/sha}",
"git_commits_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/git/commits{/sha}",
"comments_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/comments{/number}",
"issue_comment_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/issues/comments{/number}",
"contents_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/contents/{+path}",
"compare_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/compare/{base}...{head}",
"merges_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/merges",
"archive_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/{archive_format}{/ref}",
"downloads_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/downloads",
"issues_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/issues{/number}",
"pulls_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/pulls{/number}",
"milestones_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/milestones{/number}",
"notifications_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/notifications{?since,all,participating}",
"labels_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/labels{/name}",
"releases_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/releases{/id}",
"deployments_url": "https://api.github.com/repos/hurricanehrndz/neovim-snap/deployments",
"created_at": 1599227980,
"updated_at": "2020-09-04T14:02:38Z",
"pushed_at": 1599228352,
"git_url": "git://github.com/hurricanehrndz/neovim-snap.git",
"ssh_url": "git@github.com:hurricanehrndz/neovim-snap.git",
"clone_url": "https://github.com/hurricanehrndz/neovim-snap.git",
"svn_url": "https://github.com/hurricanehrndz/neovim-snap",
"homepage": null,
"size": 0,
"stargazers_count": 0,
"watchers_count": 0,
"language": null,
"has_issues": true,
"has_projects": true,
"has_downloads": true,
"has_wiki": true,
"has_pages": false,
"forks_count": 0,
"mirror_url": null,
"archived": false,
"disabled": false,
"open_issues_count": 0,
"license": {
"key": "mit",
"name": "MIT License",
"spdx_id": "MIT",
"url": "https://api.github.com/licenses/mit",
"node_id": "MDc6TGljZW5zZTEz"
},
"forks": 0,
"open_issues": 0,
"watchers": 0,
"default_branch": "master",
"stargazers": 0,
"master_branch": "master"
},
"pusher": {
"name": "hurricanehrndz",
"email": "hurricanehrndz@users.noreply.github.com"
},
"sender": {
"login": "hurricanehrndz",
"id": 5804237,
"node_id": "MDQ6VXNlcjU4MDQyMzc=",
"avatar_url": "https://avatars0.githubusercontent.com/u/5804237?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/hurricanehrndz",
"html_url": "https://github.com/hurricanehrndz",
"followers_url": "https://api.github.com/users/hurricanehrndz/followers",
"following_url": "https://api.github.com/users/hurricanehrndz/following{/other_user}",
"gists_url": "https://api.github.com/users/hurricanehrndz/gists{/gist_id}",
"starred_url": "https://api.github.com/users/hurricanehrndz/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/hurricanehrndz/subscriptions",
"organizations_url": "https://api.github.com/users/hurricanehrndz/orgs",
"repos_url": "https://api.github.com/users/hurricanehrndz/repos",
"events_url": "https://api.github.com/users/hurricanehrndz/events{/privacy}",
"received_events_url": "https://api.github.com/users/hurricanehrndz/received_events",
"type": "User",
"site_admin": false
},
"created": false,
"deleted": false,
"forced": false,
"base_ref": null,
"compare": "https://github.com/hurricanehrndz/neovim-snap/compare/66b136c43c12...1bf69c32217c",
"commits": [
{
"id": "1bf69c32217cc455603ce8aa2b5415d9717f0fa2",
"tree_id": "62ea83a2349be8c930c45fdc199f71b08bf5927e",
"distinct": true,
"message": "Build of latest tag",
"timestamp": "2020-09-04T14:05:40Z",
"url": "https://github.com/hurricanehrndz/neovim-snap/commit/1bf69c32217cc455603ce8aa2b5415d9717f0fa2",
"author": {
"name": "Carlos Hernandez",
"email": "carlos@techbyte.ca",
"username": "hurricanehrndz"
},
"committer": {
"name": "Carlos Hernandez",
"email": "carlos@techbyte.ca",
"username": "hurricanehrndz"
},
"added": [
],
"removed": [
],
"modified": [
"snap/snapcraft.yaml"
]
}
],
"head_commit": {
"id": "1bf69c32217cc455603ce8aa2b5415d9717f0fa2",
"tree_id": "62ea83a2349be8c930c45fdc199f71b08bf5927e",
"distinct": true,
"message": "Build of latest tag",
"timestamp": "2020-09-04T14:05:40Z",
"url": "https://github.com/hurricanehrndz/neovim-snap/commit/1bf69c32217cc455603ce8aa2b5415d9717f0fa2",
"author": {
"name": "Carlos Hernandez",
"email": "carlos@techbyte.ca",
"username": "hurricanehrndz"
},
"committer": {
"name": "Carlos Hernandez",
"email": "carlos@techbyte.ca",
"username": "hurricanehrndz"
},
"added": [
],
"removed": [
],
"modified": [
"snap/snapcraft.yaml"
]
}
}

View File

@@ -1,14 +0,0 @@
#!/usr/bin/env bash
set -e
set -o pipefail
RESULT_SNAP=$(find ./ -name "*.snap")
sudo snap install "$RESULT_SNAP" --dangerous --classic
/snap/bin/nvim --version
SHA256=$(sha256sum "$RESULT_SNAP")
echo "SHA256: ${SHA256} ."

View File

@@ -1,39 +0,0 @@
#!/usr/bin/env bash
set -e
set -o pipefail
SNAP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
WEBHOOK_PAYLOAD="$(cat "${SNAP_DIR}/.snapcraft_payload")"
PAYLOAD_SIG="${SECRET_SNAP_SIG}"
snap_realease_needed() {
last_committed_tag="$(git tag -l --sort=refname|head -1)"
last_snap_release="$(snap info nvim | awk '$1 == "latest/edge:" { print $2 }' | perl -lpe 's/v\d.\d.\d-//g')"
git fetch -f --tags
git checkout "${last_committed_tag}" 2> /dev/null
last_git_release="$(git describe --first-parent 2> /dev/null | perl -lpe 's/v\d.\d.\d-//g')"
if [[ -z "$(echo $last_snap_release | perl -ne "print if /${last_git_release}.*/")" ]]; then
return 0
fi
return 1
}
trigger_snapcraft_webhook() {
[[ -n "${PAYLOAD_SIG}" ]] || exit
echo "Triggering new snap release via webhook..."
curl -X POST \
-H "Content-Type: application/json" \
-H "X-Hub-Signature: sha1=${PAYLOAD_SIG}" \
--data "${WEBHOOK_PAYLOAD}" \
https://snapcraft.io/nvim/webhook/notify
}
if $(snap_realease_needed); then
echo "New snap release required"
trigger_snapcraft_webhook
fi

View File

@@ -1,11 +0,0 @@
#!/usr/bin/env bash
set -e
set -o pipefail
sudo apt update
sudo usermod -aG lxd $USER
sudo /snap/bin/lxd.migrate -yes
sudo /snap/bin/lxd waitready
sudo /snap/bin/lxd init --auto

View File

@@ -1,8 +0,0 @@
#!/usr/bin/env bash
set -e
set -o pipefail
mkdir -p "$CI_BUILD_DIR/snaps-cache"
sg lxd -c snapcraft

Binary file not shown.

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

@@ -42,7 +42,7 @@ unset(_lua_append_versions)
# this is a function only to have all the variables inside go away automatically # this is a function only to have all the variables inside go away automatically
function(_lua_set_version_vars) function(_lua_set_version_vars)
set(LUA_VERSIONS5 5.4 5.3 5.2 5.1 5.0) set(LUA_VERSIONS5 5.3 5.2 5.1 5.0)
if (Lua_FIND_VERSION_EXACT) if (Lua_FIND_VERSION_EXACT)
if (Lua_FIND_VERSION_COUNT GREATER 1) if (Lua_FIND_VERSION_COUNT GREATER 1)

View File

@@ -1,11 +0,0 @@
# - Try to find tree-sitter
# Once done, this will define
#
# TreeSitter_FOUND - system has tree-sitter
# TreeSitter_INCLUDE_DIRS - the tree-sitter include directories
# TreeSitter_LIBRARIES - link these to use tree-sitter
include(LibFindMacros)
libfind_pkg_detect(TreeSitter tree-sitter FIND_PATH tree_sitter/api.h FIND_LIBRARY tree-sitter)
libfind_process(TreeSitter)

View File

@@ -3,13 +3,6 @@ function(get_compile_flags _compile_flags)
set(compile_flags "<CMAKE_C_COMPILER> <CFLAGS> <BUILD_TYPE_CFLAGS> <COMPILE_OPTIONS><COMPILE_DEFINITIONS> <INCLUDES>") set(compile_flags "<CMAKE_C_COMPILER> <CFLAGS> <BUILD_TYPE_CFLAGS> <COMPILE_OPTIONS><COMPILE_DEFINITIONS> <INCLUDES>")
# Get C compiler. # Get C compiler.
if(CMAKE_C_COMPILER_ARG1)
string(REPLACE
"<CMAKE_C_COMPILER>"
"<CMAKE_C_COMPILER> ${CMAKE_C_COMPILER_ARG1}"
compile_flags
"${compile_flags}")
endif()
string(REPLACE string(REPLACE
"<CMAKE_C_COMPILER>" "<CMAKE_C_COMPILER>"
"${CMAKE_C_COMPILER}" "${CMAKE_C_COMPILER}"

View File

@@ -0,0 +1,180 @@
# https://github.com/rpavlik/cmake-modules
#
# - Returns a version string from Git
#
# These functions force a re-configure on each git commit so that you can
# trust the values of the variables in your build system.
#
# get_git_head_revision(<refspecvar> <hashvar> [<additional arguments to git describe> ...])
#
# Returns the refspec and sha hash of the current head revision
#
# git_describe(<var> [<additional arguments to git describe> ...])
#
# Returns the results of git describe on the source tree, and adjusting
# the output so that it tests false if an error occurs.
#
# git_get_exact_tag(<var> [<additional arguments to git describe> ...])
#
# Returns the results of git describe --exact-match on the source tree,
# and adjusting the output so that it tests false if there was no exact
# matching tag.
#
# Requires CMake 2.6 or newer (uses the 'function' command)
#
# Original Author:
# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
# http://academic.cleardefinition.com
# Iowa State University HCI Graduate Program/VRAC
#
# Copyright Iowa State University 2009-2010.
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
if(__get_git_revision_description)
return()
endif()
set(__get_git_revision_description YES)
# We must run the following at "include" time, not at function call time,
# to find the path to this module rather than the path to a calling list file
get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH)
function(get_git_dir _gitdir)
# check FORCED_GIT_DIR first
if(FORCED_GIT_DIR)
set(${_gitdir} ${FORCED_GIT_DIR} PARENT_SCOPE)
return()
endif()
# check GIT_DIR in environment
set(GIT_DIR $ENV{GIT_DIR})
if(NOT GIT_DIR)
set(GIT_PARENT_DIR ${CMAKE_CURRENT_SOURCE_DIR})
set(GIT_DIR ${GIT_PARENT_DIR}/.git)
endif()
# .git dir not found, search parent directories
while(NOT EXISTS ${GIT_DIR})
set(GIT_PREVIOUS_PARENT ${GIT_PARENT_DIR})
get_filename_component(GIT_PARENT_DIR ${GIT_PARENT_DIR} PATH)
if(GIT_PARENT_DIR STREQUAL GIT_PREVIOUS_PARENT)
return()
endif()
set(GIT_DIR ${GIT_PARENT_DIR}/.git)
endwhile()
# check if this is a submodule
if(NOT IS_DIRECTORY ${GIT_DIR})
file(READ ${GIT_DIR} submodule)
string(REGEX REPLACE "gitdir: (.*)\n$" "\\1" GIT_DIR_RELATIVE ${submodule})
get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH)
get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} ABSOLUTE)
endif()
set(${_gitdir} ${GIT_DIR} PARENT_SCOPE)
endfunction()
function(get_git_head_revision _refspecvar _hashvar)
get_git_dir(GIT_DIR)
if(NOT GIT_DIR)
return()
endif()
set(GIT_DATA ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data)
if(NOT EXISTS ${GIT_DATA})
file(MAKE_DIRECTORY ${GIT_DATA})
endif()
if(NOT EXISTS ${GIT_DIR}/HEAD)
return()
endif()
set(HEAD_FILE ${GIT_DATA}/HEAD)
configure_file(${GIT_DIR}/HEAD ${HEAD_FILE} COPYONLY)
configure_file(${_gitdescmoddir}/GetGitRevisionDescription.cmake.in
${GIT_DATA}/grabRef.cmake
@ONLY)
include(${GIT_DATA}/grabRef.cmake)
set(${_refspecvar} ${HEAD_REF} PARENT_SCOPE)
set(${_hashvar} ${HEAD_HASH} PARENT_SCOPE)
endfunction()
function(git_describe _var)
get_git_dir(GIT_DIR)
if(NOT GIT_DIR)
return()
endif()
if(NOT GIT_FOUND)
find_package(Git QUIET)
endif()
if(NOT GIT_FOUND)
set(${_var} "GIT-NOTFOUND" PARENT_SCOPE)
return()
endif()
get_git_head_revision(refspec hash)
if(NOT hash)
set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE)
return()
endif()
execute_process(COMMAND
${GIT_EXECUTABLE}
describe
${hash}
${ARGN}
WORKING_DIRECTORY
${GIT_DIR}
RESULT_VARIABLE
res
OUTPUT_VARIABLE
out
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(NOT res EQUAL 0)
set(out "${out}-${res}-NOTFOUND")
endif()
set(${_var} ${out} PARENT_SCOPE)
endfunction()
function(git_timestamp _var)
get_git_dir(GIT_DIR)
if(NOT GIT_DIR)
return()
endif()
if(NOT GIT_FOUND)
find_package(Git QUIET)
endif()
if(NOT GIT_FOUND)
return()
endif()
get_git_head_revision(refspec hash)
if(NOT hash)
set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE)
return()
endif()
execute_process(COMMAND ${GIT_EXECUTABLE} log -1 --format="%ci" ${hash} ${ARGN}
WORKING_DIRECTORY ${GIT_DIR}
RESULT_VARIABLE res
OUTPUT_VARIABLE out
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
if(res EQUAL 0)
string(REGEX REPLACE "[-\" :]" "" out ${out})
string(SUBSTRING ${out} 0 12 out)
else()
set(out "${out}-${res}-NOTFOUND")
endif()
set(${_var} ${out} PARENT_SCOPE)
endfunction()
function(git_get_exact_tag _var)
git_describe(out --exact-match ${ARGN})
set(${_var} ${out} PARENT_SCOPE)
endfunction()

View File

@@ -0,0 +1,38 @@
#
# Internal file for GetGitRevisionDescription.cmake
#
# Requires CMake 2.6 or newer (uses the 'function' command)
#
# Original Author:
# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
# http://academic.cleardefinition.com
# Iowa State University HCI Graduate Program/VRAC
#
# Copyright Iowa State University 2009-2010.
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
set(HEAD_HASH)
file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024)
string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS)
if(HEAD_CONTENTS MATCHES "ref")
# named branch
string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}")
if(EXISTS "@GIT_DIR@/${HEAD_REF}")
configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY)
elseif(EXISTS "@GIT_DIR@/logs/${HEAD_REF}")
configure_file("@GIT_DIR@/logs/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY)
set(HEAD_HASH "${HEAD_REF}")
endif()
else()
# detached HEAD
configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY)
endif()
if(NOT HEAD_HASH)
file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024)
string(STRIP "${HEAD_HASH}" HEAD_HASH)
endif()

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,21 +45,10 @@ if(DEFINED ENV{TEST_FILTER} AND NOT "$ENV{TEST_FILTER}" STREQUAL "")
list(APPEND BUSTED_ARGS --filter $ENV{TEST_FILTER}) list(APPEND BUSTED_ARGS --filter $ENV{TEST_FILTER})
endif() endif()
if(DEFINED ENV{TEST_FILTER_OUT} AND NOT "$ENV{TEST_FILTER_OUT}" STREQUAL "")
list(APPEND BUSTED_ARGS --filter-out $ENV{TEST_FILTER_OUT})
endif()
# TMPDIR: use relative test path (for parallel test runs / isolation). # TMPDIR: use relative test path (for parallel test runs / isolation).
set(ENV{TMPDIR} "${BUILD_DIR}/Xtest_tmpdir/${TEST_PATH}") set(ENV{TMPDIR} "${BUILD_DIR}/Xtest_tmpdir/${TEST_PATH}")
execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory $ENV{TMPDIR}) execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory $ENV{TMPDIR})
# HISTFILE: do not write into user's ~/.bash_history
set(ENV{HISTFILE} "/dev/null")
if(NOT DEFINED ENV{TEST_TIMEOUT} OR "$ENV{TEST_TIMEOUT}" STREQUAL "")
set(ENV{TEST_TIMEOUT} 1200)
endif()
set(ENV{SYSTEM_NAME} ${CMAKE_HOST_SYSTEM_NAME}) # used by test/helpers.lua. set(ENV{SYSTEM_NAME} ${CMAKE_HOST_SYSTEM_NAME}) # used by test/helpers.lua.
execute_process( execute_process(
COMMAND ${BUSTED_PRG} -v -o test.busted.outputHandlers.${BUSTED_OUTPUT_TYPE} COMMAND ${BUSTED_PRG} -v -o test.busted.outputHandlers.${BUSTED_OUTPUT_TYPE}
@@ -70,7 +58,6 @@ execute_process(
--lpath=?.lua --lpath=?.lua
${BUSTED_ARGS} ${BUSTED_ARGS}
${TEST_PATH} ${TEST_PATH}
TIMEOUT $ENV{TEST_TIMEOUT}
WORKING_DIRECTORY ${WORKING_DIR} WORKING_DIRECTORY ${WORKING_DIR}
ERROR_VARIABLE err ERROR_VARIABLE err
RESULT_VARIABLE res RESULT_VARIABLE res

View File

@@ -1,21 +0,0 @@
if(NOT EXISTS "@CMAKE_BINARY_DIR@/install_manifest.txt")
message(FATAL_ERROR "Cannot find install manifest: @CMAKE_BINARY_DIR@/install_manifest.txt")
endif()
file(READ "@CMAKE_BINARY_DIR@/install_manifest.txt" files)
string(REGEX REPLACE "\n" ";" files "${files}")
foreach(file ${files})
message(STATUS "Uninstalling $ENV{DESTDIR}${file}")
if(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
exec_program(
"@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\""
OUTPUT_VARIABLE rm_out
RETURN_VALUE rm_retval
)
if(NOT "${rm_retval}" STREQUAL 0)
message(FATAL_ERROR "Problem when removing $ENV{DESTDIR}${file}")
endif()
else(IS_SYMLINK "$ENV{DESTDIR}${file}" OR EXISTS "$ENV{DESTDIR}${file}")
message(STATUS "File $ENV{DESTDIR}${file} does not exist.")
endif()
endforeach()

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")
# Windows Subsystem for Linux
set(HAVE_WSL 1)
endif()
check_symbol_exists(_NSGetEnviron crt_externs.h HAVE__NSGETENVIRON) check_symbol_exists(_NSGetEnviron crt_externs.h HAVE__NSGETENVIRON)
# Headers # Headers
@@ -27,7 +32,6 @@ endif()
check_include_files(sys/utsname.h HAVE_SYS_UTSNAME_H) check_include_files(sys/utsname.h HAVE_SYS_UTSNAME_H)
check_include_files(termios.h HAVE_TERMIOS_H) check_include_files(termios.h HAVE_TERMIOS_H)
check_include_files(sys/uio.h HAVE_SYS_UIO_H) check_include_files(sys/uio.h HAVE_SYS_UIO_H)
check_include_files(sys/sdt.h HAVE_SYS_SDT_H)
# Functions # Functions
check_function_exists(fseeko HAVE_FSEEKO) check_function_exists(fseeko HAVE_FSEEKO)
@@ -47,7 +51,6 @@ check_function_exists(setsid HAVE_SETSID)
check_function_exists(sigaction HAVE_SIGACTION) check_function_exists(sigaction HAVE_SIGACTION)
check_function_exists(strcasecmp HAVE_STRCASECMP) check_function_exists(strcasecmp HAVE_STRCASECMP)
check_function_exists(strncasecmp HAVE_STRNCASECMP) check_function_exists(strncasecmp HAVE_STRNCASECMP)
check_function_exists(strptime HAVE_STRPTIME)
# Symbols # Symbols
check_symbol_exists(FD_CLOEXEC "fcntl.h" HAVE_FD_CLOEXEC) check_symbol_exists(FD_CLOEXEC "fcntl.h" HAVE_FD_CLOEXEC)
@@ -92,7 +95,7 @@ if (NOT "${HAVE_BE64TOH}")
# any case and ORDER_BIG_ENDIAN will not be examined. # any case and ORDER_BIG_ENDIAN will not be examined.
# - CMAKE_CROSSCOMPILING *and* HAVE_BE64TOH are both false. In this case # - CMAKE_CROSSCOMPILING *and* HAVE_BE64TOH are both false. In this case
# be64toh function which uses cycle and arithmetic operations is used which # be64toh function which uses cycle and arithmetic operations is used which
# will work regardless of endianness. Function is sub-optimal though. # will work regardless of endianess. Function is sub-optimal though.
check_c_source_runs(" check_c_source_runs("
${SI} ${SI}
${MS} ${MS}

View File

@@ -33,14 +33,12 @@
#cmakedefine HAVE_STRCASECMP #cmakedefine HAVE_STRCASECMP
#cmakedefine HAVE_STRINGS_H #cmakedefine HAVE_STRINGS_H
#cmakedefine HAVE_STRNCASECMP #cmakedefine HAVE_STRNCASECMP
#cmakedefine HAVE_STRPTIME
#cmakedefine HAVE_SYS_SDT_H
#cmakedefine HAVE_SYS_UTSNAME_H #cmakedefine HAVE_SYS_UTSNAME_H
#cmakedefine HAVE_SYS_WAIT_H #cmakedefine HAVE_SYS_WAIT_H
#cmakedefine HAVE_TERMIOS_H #cmakedefine HAVE_TERMIOS_H
#cmakedefine HAVE_WORKING_LIBINTL #cmakedefine HAVE_WORKING_LIBINTL
#cmakedefine HAVE_WSL
#cmakedefine UNIX #cmakedefine UNIX
#cmakedefine CASE_INSENSITIVE_FILENAME
#cmakedefine USE_FNAME_CASE #cmakedefine USE_FNAME_CASE
#cmakedefine HAVE_SYS_UIO_H #cmakedefine HAVE_SYS_UIO_H
#ifdef HAVE_SYS_UIO_H #ifdef HAVE_SYS_UIO_H
@@ -62,6 +60,5 @@
#cmakedefine HAVE_EXECINFO_BACKTRACE #cmakedefine HAVE_EXECINFO_BACKTRACE
#cmakedefine HAVE_BUILTIN_ADD_OVERFLOW #cmakedefine HAVE_BUILTIN_ADD_OVERFLOW
#cmakedefine HAVE_WIMPLICIT_FALLTHROUGH_FLAG
#endif // AUTO_CONFIG_H #endif // AUTO_CONFIG_H

View File

@@ -3,6 +3,5 @@
#include "${PROJECT_SOURCE_DIR}/src/nvim/vim.h" #include "${PROJECT_SOURCE_DIR}/src/nvim/vim.h"
char *default_vim_dir = "${CMAKE_INSTALL_FULL_DATAROOTDIR}/nvim"; char *default_vim_dir = "${CMAKE_INSTALL_FULL_DATAROOTDIR}/nvim";
char *default_vimruntime_dir = ""; char *default_vimruntime_dir = "";
char *default_lib_dir = "${CMAKE_INSTALL_FULL_LIBDIR}/nvim";
char_u *compiled_user = (char_u *)"${USERNAME}"; char_u *compiled_user = (char_u *)"${USERNAME}";
char_u *compiled_sys = (char_u *)"${HOSTNAME}"; char_u *compiled_sys = (char_u *)"${HOSTNAME}";

View File

@@ -5,11 +5,7 @@
#define NVIM_VERSION_MINOR @NVIM_VERSION_MINOR@ #define NVIM_VERSION_MINOR @NVIM_VERSION_MINOR@
#define NVIM_VERSION_PATCH @NVIM_VERSION_PATCH@ #define NVIM_VERSION_PATCH @NVIM_VERSION_PATCH@
#define NVIM_VERSION_PRERELEASE "@NVIM_VERSION_PRERELEASE@" #define NVIM_VERSION_PRERELEASE "@NVIM_VERSION_PRERELEASE@"
#cmakedefine NVIM_VERSION_MEDIUM "@NVIM_VERSION_MEDIUM@" #cmakedefine NVIM_VERSION_MEDIUM "@NVIM_VERSION_MEDIUM@"
#ifndef NVIM_VERSION_MEDIUM
# include "auto/versiondef_git.h"
#endif
#define NVIM_API_LEVEL @NVIM_API_LEVEL@ #define NVIM_API_LEVEL @NVIM_API_LEVEL@
#define NVIM_API_LEVEL_COMPAT @NVIM_API_LEVEL_COMPAT@ #define NVIM_API_LEVEL_COMPAT @NVIM_API_LEVEL_COMPAT@

43
contrib/flake.lock generated
View File

@@ -1,43 +0,0 @@
{
"nodes": {
"flake-utils": {
"locked": {
"lastModified": 1629481132,
"narHash": "sha256-JHgasjPR0/J1J3DRm4KxM4zTyAj4IOJY8vIl75v/kPI=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "997f7efcb746a9c140ce1f13c72263189225f482",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1630074300,
"narHash": "sha256-BFM7OiXRs0RvSUZd6NCGAKWVPn3VodgYQ4TUQXxbMBU=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "21c937f8cb1e6adcfeb36dfd6c90d9d9bfab1d28",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}

View File

@@ -1,133 +0,0 @@
{
description = "Neovim flake";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, flake-utils }:
{
overlay = final: prev:
let
pkgs = nixpkgs.legacyPackages.${prev.system};
in
rec {
neovim = pkgs.neovim-unwrapped.overrideAttrs (oa: {
version = "master";
src = ../.;
});
# a development binary to help debug issues
neovim-debug = let
stdenv = if pkgs.stdenv.isLinux then pkgs.llvmPackages_latest.stdenv else pkgs.stdenv;
in
((neovim.override {
lua = pkgs.luajit;
inherit stdenv;
}).overrideAttrs (oa: {
dontStrip = true;
NIX_CFLAGS_COMPILE = " -ggdb -Og";
cmakeBuildType = "Debug";
cmakeFlags = oa.cmakeFlags ++ [
"-DMIN_LOG_LEVEL=0"
];
disallowedReferences = [];
}));
# for neovim developers, beware of the slow binary
neovim-developer =
let
lib = nixpkgs.lib;
luacheck = pkgs.luaPackages.luacheck;
in
(neovim-debug.override ({ doCheck = pkgs.stdenv.isLinux; })).overrideAttrs (oa: {
cmakeFlags = oa.cmakeFlags ++ [
"-DLUACHECK_PRG=${luacheck}/bin/luacheck"
"-DMIN_LOG_LEVEL=0"
"-DENABLE_LTO=OFF"
] ++ pkgs.lib.optionals pkgs.stdenv.isLinux [
# https://github.com/google/sanitizers/wiki/AddressSanitizerFlags
# https://clang.llvm.org/docs/AddressSanitizer.html#symbolizing-the-reports
"-DCLANG_ASAN_UBSAN=ON"
];
});
};
} //
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = import nixpkgs {
overlays = [ self.overlay ];
inherit system;
};
pythonEnv = pkgs.python3.withPackages(ps: [
ps.msgpack
ps.flake8 # for 'make pylint'
]);
in
rec {
packages = with pkgs; {
inherit neovim neovim-debug neovim-developer;
};
checks = {
pylint = pkgs.runCommandNoCC "pylint" {
nativeBuildInputs = [ pythonEnv ];
preferLocalBuild = true;
} "make -C ${./..} pylint > $out";
shlint = pkgs.runCommandNoCC "shlint" {
nativeBuildInputs = [ pkgs.shellcheck ];
preferLocalBuild = true;
} "make -C ${./..} shlint > $out";
};
defaultPackage = pkgs.neovim;
apps = {
nvim = flake-utils.lib.mkApp { drv = pkgs.neovim; name = "nvim"; };
nvim-debug = flake-utils.lib.mkApp { drv = pkgs.neovim-debug; name = "nvim"; };
};
defaultApp = apps.nvim;
devShell = let
in
pkgs.neovim-developer.overrideAttrs(oa: {
buildInputs = with pkgs; oa.buildInputs ++ [
cmake
pythonEnv
include-what-you-use # for scripts/check-includes.py
jq # jq for scripts/vim-patch.sh -r
shellcheck # for `make shlint`
doxygen # for script/gen_vimdoc.py
clang-tools # for clangd to find the correct headers
];
shellHook = oa.shellHook + ''
export NVIM_PYTHON_LOG_LEVEL=DEBUG
export NVIM_LOG_FILE=/tmp/nvim.log
export ASAN_SYMBOLIZER_PATH=${pkgs.llvm_11}/bin/llvm-symbolizer
# ASAN_OPTIONS=detect_leaks=1
export ASAN_OPTIONS="log_path=./test.log:abort_on_error=1"
export UBSAN_OPTIONS=print_stacktrace=1
mkdir -p build/runtime/parser
# nvim looks into CMAKE_INSTALL_DIR. Hack to avoid errors
# when running the functionaltests
mkdir -p outputs/out/share/nvim/syntax
touch outputs/out/share/nvim/syntax/syntax.vim
# for treesitter functionaltests
mkdir -p runtime/parser
cp -f ${pkgs.tree-sitter.builtGrammars.tree-sitter-c}/parser runtime/parser/c.so
'';
});
});
}

View File

@@ -25,12 +25,6 @@
# #
# CMAKE_BUILD_TYPE := Debug # CMAKE_BUILD_TYPE := Debug
# With non-Debug builds interprocedural optimization (IPO) (which includes
# link-time optimization (LTO)) is enabled by default, which causes the link
# step to take a significant amount of time, which is relevant when building
# often. You can disable it explicitly:
# CMAKE_EXTRA_FLAGS += -DENABLE_LTO=OFF
# Log levels: 0 (DEBUG), 1 (INFO), 2 (WARNING), 3 (ERROR) # Log levels: 0 (DEBUG), 1 (INFO), 2 (WARNING), 3 (ERROR)
# Default is 1 (INFO) unless CMAKE_BUILD_TYPE is Release or RelWithDebInfo. # Default is 1 (INFO) unless CMAKE_BUILD_TYPE is Release or RelWithDebInfo.
# CMAKE_EXTRA_FLAGS += -DMIN_LOG_LEVEL=1 # CMAKE_EXTRA_FLAGS += -DMIN_LOG_LEVEL=1
@@ -48,7 +42,6 @@
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_LUAROCKS=OFF # DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_LUAROCKS=OFF
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_MSGPACK=OFF # DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_MSGPACK=OFF
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_UNIBILIUM=OFF # DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_UNIBILIUM=OFF
# DEPS_CMAKE_FLAGS += -DUSE_BUNDLED_UTF8PROC=OFF
# #
# Or disable all bundled dependencies at once. # Or disable all bundled dependencies at once.
# #

1578
contrib/uncrustify.cfg Normal file

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
@@ -113,6 +113,9 @@ associated with a file.
To overwrite a file, add an exclamation mark to the relevant Ex command, such as To overwrite a file, add an exclamation mark to the relevant Ex command, such as
.Ic :w! . .Ic :w! .
.Ic ":help 'readonly'" .Ic ":help 'readonly'"
.It Fl Z
Restricted mode.
Disable commands that make use of an external shell.
.It Fl m .It Fl m
Resets the 'write' option, to disable file modifications. Resets the 'write' option, to disable file modifications.
Writing to a file is disabled, but buffers can still be modified. Writing to a file is disabled, but buffers can still be modified.
@@ -177,7 +180,8 @@ If
.Ar vimrc .Ar vimrc
is is
.Cm NORC , .Cm NORC ,
do not load any initialization files (except plugins). do not load any initialization files (except plugins),
and do not attempt to parse environment variables.
If If
.Ar vimrc .Ar vimrc
is is
@@ -200,7 +204,7 @@ Skip loading plugins.
Implied by Implied by
.Cm -u NONE . .Cm -u NONE .
.It Fl -clean .It Fl -clean
Mimic a fresh install of Nvim. Skip loading non-builtin plugins and shada (viminfo) file. Skip loading plugins and shada (viminfo) file.
.It Fl o Ns Op Ar N .It Fl o Ns Op Ar N
Open Open
.Ar N .Ar N
@@ -326,7 +330,7 @@ Print version information and exit.
.Sh ENVIRONMENT .Sh ENVIRONMENT
.Bl -tag -width Fl .Bl -tag -width Fl
.It Ev NVIM_LOG_FILE .It Ev NVIM_LOG_FILE
Low-level log file, usually found at ~/.cache/nvim/log. Low-level log file, usually found at ~/.local/share/nvim/log.
:help $NVIM_LOG_FILE :help $NVIM_LOG_FILE
.It Ev VIM .It Ev VIM
Used to locate user files, such as init.vim. Used to locate user files, such as init.vim.
@@ -374,7 +378,7 @@ See also
System-global System-global
.Nm .Nm
configuration file. configuration file.
.It Pa $VIM .It Pa /usr/local/share/nvim
System-global System-global
.Nm .Nm
runtime directory. runtime directory.

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})
@@ -111,10 +111,12 @@ if(NOT APPLE)
install_helper( install_helper(
FILES ${CMAKE_CURRENT_SOURCE_DIR}/nvim.png FILES ${CMAKE_CURRENT_SOURCE_DIR}/nvim.png
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/128x128/apps) DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pixmaps)
endif() endif()
globrecurse_wrapper(RUNTIME_PROGRAMS ${CMAKE_CURRENT_SOURCE_DIR} *.awk *.sh *.bat) file(GLOB_RECURSE RUNTIME_PROGRAMS
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
*.awk *.sh *.bat)
foreach(PROG ${RUNTIME_PROGRAMS}) foreach(PROG ${RUNTIME_PROGRAMS})
get_filename_component(BASEDIR ${PROG} PATH) get_filename_component(BASEDIR ${PROG} PATH)
@@ -122,7 +124,9 @@ foreach(PROG ${RUNTIME_PROGRAMS})
DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/nvim/runtime/${BASEDIR}) DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/nvim/runtime/${BASEDIR})
endforeach() endforeach()
globrecurse_wrapper(RUNTIME_FILES ${CMAKE_CURRENT_SOURCE_DIR} file(GLOB_RECURSE RUNTIME_FILES
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
rgb.txt
*.vim *.lua *.dict *.py *.rb *.ps *.spl *.tutor *.tutor.json) *.vim *.lua *.dict *.py *.rb *.ps *.spl *.tutor *.tutor.json)
foreach(F ${RUNTIME_FILES}) foreach(F ${RUNTIME_FILES})

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

View File

@@ -1,13 +1,13 @@
" Vim completion script " Vim completion script
" Language: C " Language: C
" Maintainer: Bram Moolenaar <Bram@vim.org> " Maintainer: Bram Moolenaar <Bram@vim.org>
" Last Change: 2020 Nov 14 " Last Change: 2018 Aug 20
let s:cpo_save = &cpo let s:cpo_save = &cpo
set cpo&vim set cpo&vim
" This function is used for the 'omnifunc' option. " This function is used for the 'omnifunc' option.
func ccomplete#Complete(findstart, base) function! ccomplete#Complete(findstart, base)
if a:findstart if a:findstart
" Locate the start of the item, including ".", "->" and "[...]". " Locate the start of the item, including ".", "->" and "[...]".
let line = getline('.') let line = getline('.')
@@ -244,7 +244,7 @@ func ccomplete#Complete(findstart, base)
return map(res, 's:Tagline2item(v:val, brackets)') return map(res, 's:Tagline2item(v:val, brackets)')
endfunc endfunc
func s:GetAddition(line, match, memarg, bracket) function! s:GetAddition(line, match, memarg, bracket)
" Guess if the item is an array. " Guess if the item is an array.
if a:bracket && match(a:line, a:match . '\s*\[') > 0 if a:bracket && match(a:line, a:match . '\s*\[') > 0
return '[' return '['
@@ -260,13 +260,13 @@ func s:GetAddition(line, match, memarg, bracket)
endif endif
endif endif
return '' return ''
endfunc endfunction
" Turn the tag info "val" into an item for completion. " Turn the tag info "val" into an item for completion.
" "val" is is an item in the list returned by taglist(). " "val" is is an item in the list returned by taglist().
" If it is a variable we may add "." or "->". Don't do it for other types, " If it is a variable we may add "." or "->". Don't do it for other types,
" such as a typedef, by not including the info that s:GetAddition() uses. " such as a typedef, by not including the info that s:GetAddition() uses.
func s:Tag2item(val) function! s:Tag2item(val)
let res = {'match': a:val['name']} let res = {'match': a:val['name']}
let res['extra'] = s:Tagcmd2extra(a:val['cmd'], a:val['name'], a:val['filename']) let res['extra'] = s:Tagcmd2extra(a:val['cmd'], a:val['name'], a:val['filename'])
@@ -289,10 +289,10 @@ func s:Tag2item(val)
endif endif
return res return res
endfunc endfunction
" Use all the items in dictionary for the "info" entry. " Use all the items in dictionary for the "info" entry.
func s:Dict2info(dict) function! s:Dict2info(dict)
let info = '' let info = ''
for k in sort(keys(a:dict)) for k in sort(keys(a:dict))
let info .= k . repeat(' ', 10 - len(k)) let info .= k . repeat(' ', 10 - len(k))
@@ -307,7 +307,7 @@ func s:Dict2info(dict)
endfunc endfunc
" Parse a tag line and return a dictionary with items like taglist() " Parse a tag line and return a dictionary with items like taglist()
func s:ParseTagline(line) function! s:ParseTagline(line)
let l = split(a:line, "\t") let l = split(a:line, "\t")
let d = {} let d = {}
if len(l) >= 3 if len(l) >= 3
@@ -334,12 +334,12 @@ func s:ParseTagline(line)
endif endif
return d return d
endfunc endfunction
" Turn a match item "val" into an item for completion. " Turn a match item "val" into an item for completion.
" "val['match']" is the matching item. " "val['match']" is the matching item.
" "val['tagline']" is the tagline in which the last part was found. " "val['tagline']" is the tagline in which the last part was found.
func s:Tagline2item(val, brackets) function! s:Tagline2item(val, brackets)
let line = a:val['tagline'] let line = a:val['tagline']
let add = s:GetAddition(line, a:val['match'], [a:val], a:brackets == '') let add = s:GetAddition(line, a:val['match'], [a:val], a:brackets == '')
let res = {'word': a:val['match'] . a:brackets . add } let res = {'word': a:val['match'] . a:brackets . add }
@@ -377,10 +377,10 @@ func s:Tagline2item(val, brackets)
let res['menu'] = s:Tagcmd2extra(s, a:val['match'], matchstr(line, '[^\t]*\t\zs[^\t]*\ze\t')) let res['menu'] = s:Tagcmd2extra(s, a:val['match'], matchstr(line, '[^\t]*\t\zs[^\t]*\ze\t'))
endif endif
return res return res
endfunc endfunction
" Turn a command from a tag line to something that is useful in the menu " Turn a command from a tag line to something that is useful in the menu
func s:Tagcmd2extra(cmd, name, fname) function! s:Tagcmd2extra(cmd, name, fname)
if a:cmd =~ '^/^' if a:cmd =~ '^/^'
" The command is a search command, useful to see what it is. " The command is a search command, useful to see what it is.
let x = matchstr(a:cmd, '^/^\s*\zs.*\ze$/') let x = matchstr(a:cmd, '^/^\s*\zs.*\ze$/')
@@ -395,13 +395,13 @@ func s:Tagcmd2extra(cmd, name, fname)
let x = a:cmd . ' - ' . a:fname let x = a:cmd . ' - ' . a:fname
endif endif
return x return x
endfunc endfunction
" Find composing type in "lead" and match items[0] with it. " Find composing type in "lead" and match items[0] with it.
" Repeat this recursively for items[1], if it's there. " Repeat this recursively for items[1], if it's there.
" When resolving typedefs "depth" is used to avoid infinite recursion. " When resolving typedefs "depth" is used to avoid infinite recursion.
" Return the list of matches. " Return the list of matches.
func s:Nextitem(lead, items, depth, all) function! s:Nextitem(lead, items, depth, all)
" Use the text up to the variable name and split it in tokens. " Use the text up to the variable name and split it in tokens.
let tokens = split(a:lead, '\s\+\|\<') let tokens = split(a:lead, '\s\+\|\<')
@@ -485,7 +485,7 @@ func s:Nextitem(lead, items, depth, all)
endfor endfor
return res return res
endfunc endfunction
" Search for members of structure "typename" in tags files. " Search for members of structure "typename" in tags files.
@@ -493,7 +493,7 @@ endfunc
" Each match is a dictionary with "match" and "tagline" entries. " Each match is a dictionary with "match" and "tagline" entries.
" When "all" is non-zero find all, otherwise just return 1 if there is any " When "all" is non-zero find all, otherwise just return 1 if there is any
" member. " member.
func s:StructMembers(typename, items, all) function! s:StructMembers(typename, items, all)
" Todo: What about local structures? " Todo: What about local structures?
let fnames = join(map(tagfiles(), 'escape(v:val, " \\#%")')) let fnames = join(map(tagfiles(), 'escape(v:val, " \\#%")'))
if fnames == '' if fnames == ''
@@ -586,12 +586,12 @@ func s:StructMembers(typename, items, all)
" Failed to find anything. " Failed to find anything.
return [] return []
endfunc endfunction
" For matching members, find matches for following items. " For matching members, find matches for following items.
" When "all" is non-zero find all, otherwise just return 1 if there is any " When "all" is non-zero find all, otherwise just return 1 if there is any
" member. " member.
func s:SearchMembers(matches, items, all) function! s:SearchMembers(matches, items, all)
let res = [] let res = []
for i in range(len(a:matches)) for i in range(len(a:matches))
let typename = '' let typename = ''
@@ -635,5 +635,3 @@ endfunc
let &cpo = s:cpo_save let &cpo = s:cpo_save
unlet s:cpo_save unlet s:cpo_save
" vim: noet sw=2 sts=2

File diff suppressed because one or more lines are too long

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

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: 2020 Aug 17 " Last Change: 2019 Mar 08
" These functions are moved here from runtime/filetype.vim to make startup " These functions are moved here from runtime/filetype.vim to make startup
" faster. " faster.
@@ -172,17 +172,6 @@ func dist#ft#FTent()
setf dtd setf dtd
endfunc endfunc
func dist#ft#ExCheck()
let lines = getline(1, min([line("$"), 100]))
if exists('g:filetype_euphoria')
exe 'setf ' . g:filetype_euphoria
elseif match(lines, '^--\|^ifdef\>\|^include\>') > -1
setf euphoria3
else
setf elixir
endif
endfunc
func dist#ft#EuphoriaCheck() func dist#ft#EuphoriaCheck()
if exists('g:filetype_euphoria') if exists('g:filetype_euphoria')
exe 'setf ' . g:filetype_euphoria exe 'setf ' . g:filetype_euphoria
@@ -219,23 +208,6 @@ func dist#ft#FTe()
endif endif
endfunc endfunc
" Distinguish between Forth and F#.
" Provided by Doug Kearns.
func dist#ft#FTfs()
if exists("g:filetype_fs")
exe "setf " . g:filetype_fs
else
let line = getline(nextnonblank(1))
" comments and colon definitions
if line =~ '^\s*\.\=( ' || line =~ '^\s*\\G\= ' || line =~ '^\\$'
\ || line =~ '^\s*: \S'
setf forth
else
setf fsharp
endif
endif
endfunc
" Distinguish between HTML, XHTML and Django " Distinguish between HTML, XHTML and Django
func dist#ft#FThtml() func dist#ft#FThtml()
let n = 1 let n = 1
@@ -281,16 +253,6 @@ func dist#ft#ProtoCheck(default)
endfunc endfunc
func dist#ft#FTm() func dist#ft#FTm()
if exists("g:filetype_m")
exe "setf " . g:filetype_m
return
endif
" excluding end(for|function|if|switch|while) common to Murphi
let octave_block_terminators = '\<end\%(_try_catch\|classdef\|enumeration\|events\|methods\|parfor\|properties\)\>'
let objc_preprocessor = '^\s*#\s*\%(import\|include\|define\|if\|ifn\=def\|undef\|line\|error\|pragma\)\>'
let n = 1 let n = 1
let saw_comment = 0 " Whether we've seen a multiline comment leader. let saw_comment = 0 " Whether we've seen a multiline comment leader.
while n < 100 while n < 100
@@ -301,16 +263,10 @@ func dist#ft#FTm()
" anything more definitive. " anything more definitive.
let saw_comment = 1 let saw_comment = 1
endif endif
if line =~ '^\s*//' || line =~ '^\s*@import\>' || line =~ objc_preprocessor if line =~ '^\s*\(#\s*\(include\|import\)\>\|@import\>\|//\)'
setf objc setf objc
return return
endif endif
if line =~ '^\s*\%(#\|%!\)' || line =~ '^\s*unwind_protect\>' ||
\ line =~ '\%(^\|;\)\s*' .. octave_block_terminators
setf octave
return
endif
" TODO: could be Matlab or Octave
if line =~ '^\s*%' if line =~ '^\s*%'
setf matlab setf matlab
return return
@@ -331,15 +287,18 @@ func dist#ft#FTm()
" or Murphi based on the comment leader. Assume the former as it is more " or Murphi based on the comment leader. Assume the former as it is more
" common. " common.
setf objc setf objc
elseif exists("g:filetype_m")
" Use user specified default filetype for .m
exe "setf " . g:filetype_m
else else
" Default is Matlab " Default is matlab
setf matlab setf matlab
endif endif
endfunc endfunc
func dist#ft#FTmms() func dist#ft#FTmms()
let n = 1 let n = 1
while n < 20 while n < 10
let line = getline(n) let line = getline(n)
if line =~ '^\s*\(%\|//\)' || line =~ '^\*' if line =~ '^\s*\(%\|//\)' || line =~ '^\*'
setf mmix setf mmix
@@ -366,7 +325,7 @@ endfunc
func dist#ft#FTmm() func dist#ft#FTmm()
let n = 1 let n = 1
while n < 20 while n < 10
let line = getline(n) let line = getline(n)
if line =~ '^\s*\(#\s*\(include\|import\)\>\|@import\>\|/\*\)' if line =~ '^\s*\(#\s*\(include\|import\)\>\|@import\>\|/\*\)'
setf objcpp setf objcpp
@@ -403,10 +362,6 @@ func dist#ft#FTinc()
setf aspvbs setf aspvbs
elseif lines =~ "<?" elseif lines =~ "<?"
setf php setf php
" Pascal supports // comments but they're vary rarely used for file
" headers so assume POV-Ray
elseif lines =~ '^\s*\%({\|(\*\)' || lines =~? s:ft_pascal_keywords
setf pascal
else else
call dist#ft#FTasmsyntax() call dist#ft#FTasmsyntax()
if exists("b:asmsyntax") if exists("b:asmsyntax")
@@ -453,9 +408,6 @@ func dist#ft#FTprogress_asm()
setf progress setf progress
endfunc endfunc
let s:ft_pascal_comments = '^\s*\%({\|(\*\|//\)'
let s:ft_pascal_keywords = '^\s*\%(program\|unit\|library\|uses\|begin\|procedure\|function\|const\|type\|var\)\>'
func dist#ft#FTprogress_pascal() func dist#ft#FTprogress_pascal()
if exists("g:filetype_p") if exists("g:filetype_p")
exe "setf " . g:filetype_p exe "setf " . g:filetype_p
@@ -467,7 +419,8 @@ func dist#ft#FTprogress_pascal()
let lnum = 1 let lnum = 1
while lnum <= 10 && lnum < line('$') while lnum <= 10 && lnum < line('$')
let line = getline(lnum) let line = getline(lnum)
if line =~ s:ft_pascal_comments || line =~? s:ft_pascal_keywords if line =~ '^\s*\(program\|unit\|procedure\|function\|const\|type\|var\)\>'
\ || line =~ '^\s*{' || line =~ '^\s*(\*'
setf pascal setf pascal
return return
elseif line !~ '^\s*$' || line =~ '^/\*' elseif line !~ '^\s*$' || line =~ '^/\*'
@@ -480,19 +433,6 @@ func dist#ft#FTprogress_pascal()
setf progress setf progress
endfunc endfunc
func dist#ft#FTpp()
if exists("g:filetype_pp")
exe "setf " . g:filetype_pp
else
let line = getline(nextnonblank(1))
if line =~ s:ft_pascal_comments || line =~? s:ft_pascal_keywords
setf pascal
else
setf puppet
endif
endif
endfunc
func dist#ft#FTr() func dist#ft#FTr()
let max = line("$") > 50 ? 50 : line("$") let max = line("$") > 50 ? 50 : line("$")
@@ -635,7 +575,7 @@ endfunc
let s:ft_rules_udev_rules_pattern = '^\s*\cudev_rules\s*=\s*"\([^"]\{-1,}\)/*".*' let s:ft_rules_udev_rules_pattern = '^\s*\cudev_rules\s*=\s*"\([^"]\{-1,}\)/*".*'
func dist#ft#FTRules() func dist#ft#FTRules()
let path = expand('<amatch>:p') let path = expand('<amatch>:p')
if path =~ '/\(etc/udev/\%(rules\.d/\)\=.*\.rules\|\%(usr/\)\=lib/udev/\%(rules\.d/\)\=.*\.rules\)$' if path =~ '^/\(etc/udev/\%(rules\.d/\)\=.*\.rules\|lib/udev/\%(rules\.d/\)\=.*\.rules\)$'
setf udevrules setf udevrules
return return
endif endif

View File

@@ -2,7 +2,7 @@
" Language: Haskell " Language: Haskell
" Maintainer: Daniel Campoverde <alx@sillybytes.net> " Maintainer: Daniel Campoverde <alx@sillybytes.net>
" URL: https://github.com/alx741/haskellcomplete.vim " URL: https://github.com/alx741/haskellcomplete.vim
" Last Change: 2019 May 14 " Last Change: 2018 Aug 26
" Usage: setlocal omnifunc=haskellcomplete#Complete " Usage: setlocal omnifunc=haskellcomplete#Complete
@@ -54,7 +54,7 @@ function! haskellcomplete#Complete(findstart, base)
if b:completingLangExtension if b:completingLangExtension
if a:base ==? "" if a:base ==? ""
" Return all possible Lang extensions " Return all posible Lang extensions
return s:langExtensions return s:langExtensions
else else
let l:matches = [] let l:matches = []
@@ -63,14 +63,13 @@ function! haskellcomplete#Complete(findstart, base)
call add(l:matches, extension) call add(l:matches, extension)
endif endif
endfor endfor
let b:completingLangExtension = 0
return l:matches return l:matches
endif endif
elseif b:completingOptionsGHC elseif b:completingOptionsGHC
if a:base ==? "" if a:base ==? ""
" Return all possible GHC options " Return all posible GHC options
return s:optionsGHC return s:optionsGHC
else else
let l:matches = [] let l:matches = []
@@ -79,14 +78,13 @@ function! haskellcomplete#Complete(findstart, base)
call add(l:matches, flag) call add(l:matches, flag)
endif endif
endfor endfor
let b:completingOptionsGHC = 0
return l:matches return l:matches
endif endif
elseif b:completingModule elseif b:completingModule
if a:base ==? "" if a:base ==? ""
" Return all possible modules " Return all posible modules
return s:commonModules return s:commonModules
else else
let l:matches = [] let l:matches = []
@@ -95,7 +93,6 @@ function! haskellcomplete#Complete(findstart, base)
call add(l:matches, module) call add(l:matches, module)
endif endif
endfor endfor
let b:completingModule = 0
return l:matches return l:matches
endif endif

View File

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

View File

@@ -41,27 +41,10 @@ function! s:check_config() abort
\ 'Check `:verbose set paste?` to see if a plugin or script set the option.', ]) \ 'Check `:verbose set paste?` to see if a plugin or script set the option.', ])
endif endif
let writeable = v:true let shadafile = (empty(&shadafile) || &shadafile ==# 'NONE') ? stdpath('data').'/shada/main.shada' : &shadafile
let shadafile = empty(&shada) ? &shada : substitute(matchstr( if !empty(shadafile) && (!filereadable(shadafile) || !filewritable(shadafile))
\ split(&shada, ',')[-1], '^n.\+'), '^n', '', '')
let shadafile = empty(&shadafile) ? empty(shadafile) ?
\ stdpath('data').'/shada/main.shada' : expand(shadafile)
\ : &shadafile ==# 'NONE' ? '' : &shadafile
if !empty(shadafile) && empty(glob(shadafile))
" Since this may be the first time neovim has been run, we will try to
" create a shada file
try
wshada
catch /.*/
let writeable = v:false
endtry
endif
if !writeable || (!empty(shadafile) &&
\ (!filereadable(shadafile) || !filewritable(shadafile)))
let ok = v:false let ok = v:false
call health#report_error('shada file is not '. call health#report_error('shada file is not '.(filereadable(shadafile) ? 'writeable' : 'readable').":\n".shadafile)
\ ((!writeable || filereadable(shadafile)) ?
\ 'writeable' : 'readable').":\n".shadafile)
endif endif
if ok if ok
@@ -146,25 +129,6 @@ function! s:check_performance() abort
endif endif
endfunction endfunction
function! s:get_tmux_option(option) abort
let cmd = 'tmux show-option -qvg '.a:option " try global scope
let out = system(cmd)
let val = substitute(out, '\v(\s|\r|\n)', '', 'g')
if v:shell_error
call health#report_error('command failed: '.cmd."\n".out)
return 'error'
elseif empty(val)
let cmd = 'tmux show-option -qvgs '.a:option " try session scope
let out = system(cmd)
let val = substitute(out, '\v(\s|\r|\n)', '', 'g')
if v:shell_error
call health#report_error('command failed: '.cmd."\n".out)
return 'error'
endif
endif
return val
endfunction
function! s:check_tmux() abort function! s:check_tmux() abort
if empty($TMUX) || !executable('tmux') if empty($TMUX) || !executable('tmux')
return return
@@ -172,31 +136,20 @@ function! s:check_tmux() abort
call health#report_start('tmux') call health#report_start('tmux')
" check escape-time " check escape-time
let suggestions = ["set escape-time in ~/.tmux.conf:\nset-option -sg escape-time 10", let suggestions = ["Set escape-time in ~/.tmux.conf:\nset-option -sg escape-time 10",
\ s:suggest_faq] \ s:suggest_faq]
let tmux_esc_time = s:get_tmux_option('escape-time') let cmd = 'tmux show-option -qvgs escape-time'
if tmux_esc_time !=# 'error' let out = system(cmd)
if empty(tmux_esc_time) let tmux_esc_time = substitute(out, '\v(\s|\r|\n)', '', 'g')
call health#report_error('`escape-time` is not set', suggestions) if v:shell_error
elseif tmux_esc_time > 300 call health#report_error('command failed: '.cmd."\n".out)
call health#report_error( elseif empty(tmux_esc_time)
\ '`escape-time` ('.tmux_esc_time.') is higher than 300ms', suggestions) call health#report_error('escape-time is not set', suggestions)
else elseif tmux_esc_time > 300
call health#report_ok('escape-time: '.tmux_esc_time) call health#report_error(
endif \ 'escape-time ('.tmux_esc_time.') is higher than 300ms', suggestions)
endif else
call health#report_ok('escape-time: '.tmux_esc_time.'ms')
" check focus-events
let suggestions = ["(tmux 1.9+ only) Set `focus-events` in ~/.tmux.conf:\nset-option -g focus-events on"]
let tmux_focus_events = s:get_tmux_option('focus-events')
call health#report_info('Checking stuff')
if tmux_focus_events !=# 'error'
if empty(tmux_focus_events) || tmux_focus_events !=# 'on'
call health#report_warn(
\ "`focus-events` is not enabled. |'autoread'| may not work.", suggestions)
else
call health#report_ok('focus-events: '.tmux_focus_events)
endif
endif endif
" check default-terminal and $TERM " check default-terminal and $TERM
@@ -247,16 +200,12 @@ function! s:check_terminal() abort
let kdch1_entry = matchstr(out, 'key_dc=[^,[:space:]]*') let kdch1_entry = matchstr(out, 'key_dc=[^,[:space:]]*')
if v:shell_error if v:shell_error
\ && (!has('win32')
\ || empty(matchstr(out,
\ 'infocmp: couldn''t open terminfo file .\+'
\ ..'\%(conemu\|vtpcon\|win32con\)')))
call health#report_error('command failed: '.cmd."\n".out) call health#report_error('command failed: '.cmd."\n".out)
else else
call health#report_info('key_backspace (kbs) terminfo entry: ' call health#report_info('key_backspace (kbs) terminfo entry: '
\ .(empty(kbs_entry) ? '? (not found)' : kbs_entry)) \ .(empty(kbs_entry) ? '? (not found)' : kbs_entry))
call health#report_info('key_dc (kdch1) terminfo entry: ' call health#report_info('key_dc (kdch1) terminfo entry: '
\ .(empty(kbs_entry) ? '? (not found)' : kdch1_entry)) \ .(empty(kbs_entry) ? '? (not found)' : kdch1_entry))
endif endif
for env_var in ['XTERM_VERSION', 'VTE_VERSION', 'TERM_PROGRAM', 'COLORTERM', 'SSH_TTY'] for env_var in ['XTERM_VERSION', 'VTE_VERSION', 'TERM_PROGRAM', 'COLORTERM', 'SSH_TTY']
if exists('$'.env_var) if exists('$'.env_var)

View File

@@ -38,10 +38,9 @@ endfunction
" Handler for s:system() function. " Handler for s:system() function.
function! s:system_handler(jobid, data, event) dict abort function! s:system_handler(jobid, data, event) dict abort
if a:event ==# 'stderr' if a:event ==# 'stderr'
if self.add_stderr_to_output let self.stderr .= join(a:data, '')
if !self.ignore_stderr
let self.output .= join(a:data, '') let self.output .= join(a:data, '')
else
let self.stderr .= join(a:data, '')
endif endif
elseif a:event ==# 'stdout' elseif a:event ==# 'stdout'
let self.output .= join(a:data, '') let self.output .= join(a:data, '')
@@ -65,7 +64,7 @@ function! s:system(cmd, ...) abort
let stdin = a:0 ? a:1 : '' let stdin = a:0 ? a:1 : ''
let ignore_error = a:0 > 2 ? a:3 : 0 let ignore_error = a:0 > 2 ? a:3 : 0
let opts = { let opts = {
\ 'add_stderr_to_output': a:0 > 1 ? a:2 : 0, \ 'ignore_stderr': a:0 > 1 ? a:2 : 0,
\ 'output': '', \ 'output': '',
\ 'stderr': '', \ 'stderr': '',
\ 'on_stdout': function('s:system_handler'), \ 'on_stdout': function('s:system_handler'),
@@ -90,15 +89,8 @@ function! s:system(cmd, ...) abort
call health#report_error(printf('Command timed out: %s', s:shellify(a:cmd))) call health#report_error(printf('Command timed out: %s', s:shellify(a:cmd)))
call jobstop(jobid) call jobstop(jobid)
elseif s:shell_error != 0 && !ignore_error elseif s:shell_error != 0 && !ignore_error
let emsg = printf("Command error (job=%d, exit code %d): `%s` (in %s)", call health#report_error(printf("Command error (job=%d, exit code %d): `%s` (in %s)\nOutput: %s\nStderr: %s",
\ jobid, s:shell_error, s:shellify(a:cmd), string(getcwd())) \ jobid, s:shell_error, s:shellify(a:cmd), string(getcwd()), opts.output, opts.stderr))
if !empty(opts.output)
let emsg .= "\noutput: " . opts.output
end
if !empty(opts.stderr)
let emsg .= "\nstderr: " . opts.stderr
end
call health#report_error(emsg)
endif endif
return opts.output return opts.output
@@ -163,7 +155,7 @@ function! s:check_clipboard() abort
endif endif
endfunction endfunction
" Get the latest Nvim Python client (pynvim) version from PyPI. " Get the latest Neovim Python client (pynvim) version from PyPI.
function! s:latest_pypi_version() abort function! s:latest_pypi_version() abort
let pypi_version = 'unable to get pypi response' let pypi_version = 'unable to get pypi response'
let pypi_response = s:download('https://pypi.python.org/pypi/pynvim/json') let pypi_response = s:download('https://pypi.python.org/pypi/pynvim/json')
@@ -180,7 +172,7 @@ endfunction
" Get version information using the specified interpreter. The interpreter is " Get version information using the specified interpreter. The interpreter is
" used directly in case breaking changes were introduced since the last time " used directly in case breaking changes were introduced since the last time
" Nvim's Python client was updated. " Neovim's Python client was updated.
" "
" Returns: [ " Returns: [
" {python executable version}, " {python executable version},
@@ -202,8 +194,7 @@ function! s:version_info(python) abort
let nvim_path = s:trim(s:system([ let nvim_path = s:trim(s:system([
\ a:python, '-c', \ a:python, '-c',
\ 'import sys; ' . \ 'import sys; sys.path.remove(""); ' .
\ 'sys.path = list(filter(lambda x: x != "", sys.path)); ' .
\ 'import neovim; print(neovim.__file__)'])) \ 'import neovim; print(neovim.__file__)']))
if s:shell_error || empty(nvim_path) if s:shell_error || empty(nvim_path)
return [python_version, 'unable to load neovim Python module', pypi_version, return [python_version, 'unable to load neovim Python module', pypi_version,
@@ -224,7 +215,7 @@ function! s:version_info(python) abort
\ 'print("{}.{}.{}{}".format(v.major, v.minor, v.patch, v.prerelease))'], \ 'print("{}.{}.{}{}".format(v.major, v.minor, v.patch, v.prerelease))'],
\ '', 1, 1) \ '', 1, 1)
if empty(nvim_version) if empty(nvim_version)
let nvim_version = 'unable to find pynvim module version' let nvim_version = 'unable to find neovim Python module version'
let base = fnamemodify(nvim_path, ':h') let base = fnamemodify(nvim_path, ':h')
let metas = glob(base.'-*/METADATA', 1, 1) let metas = glob(base.'-*/METADATA', 1, 1)
\ + glob(base.'-*/PKG-INFO', 1, 1) \ + glob(base.'-*/PKG-INFO', 1, 1)
@@ -266,22 +257,6 @@ function! s:check_bin(bin) abort
return 1 return 1
endfunction endfunction
" Check "loaded" var for given a:provider.
" Returns 1 if the caller should return (skip checks).
function! s:disabled_via_loaded_var(provider) abort
let loaded_var = 'g:loaded_'.a:provider.'_provider'
if exists(loaded_var) && !exists('*provider#'.a:provider.'#Call')
let v = eval(loaded_var)
if 0 is v
call health#report_info('Disabled ('.loaded_var.'='.v.').')
return 1
else
call health#report_info('Disabled ('.loaded_var.'='.v.'). This might be due to some previous error.')
endif
endif
return 0
endfunction
function! s:check_python(version) abort function! s:check_python(version) abort
call health#report_start('Python ' . a:version . ' provider (optional)') call health#report_start('Python ' . a:version . ' provider (optional)')
@@ -289,10 +264,11 @@ function! s:check_python(version) abort
let python_exe = '' let python_exe = ''
let venv = exists('$VIRTUAL_ENV') ? resolve($VIRTUAL_ENV) : '' let venv = exists('$VIRTUAL_ENV') ? resolve($VIRTUAL_ENV) : ''
let host_prog_var = pyname.'_host_prog' let host_prog_var = pyname.'_host_prog'
let loaded_var = 'g:loaded_'.pyname.'_provider'
let python_multiple = [] let python_multiple = []
if s:disabled_via_loaded_var(pyname) if exists(loaded_var) && !exists('*provider#'.pyname.'#Call')
return call health#report_info('Disabled ('.loaded_var.'='.eval(loaded_var).'). This might be due to some previous error.')
endif endif
let [pyenv, pyenv_root] = s:check_for_pyenv() let [pyenv, pyenv_root] = s:check_for_pyenv()
@@ -310,7 +286,7 @@ function! s:check_python(version) abort
let python_exe = pyname let python_exe = pyname
endif endif
" No Python executable could `import neovim`, or host_prog_var was used. " No Python executable could `import neovim`.
if !empty(pythonx_errors) if !empty(pythonx_errors)
call health#report_error('Python provider error:', pythonx_errors) call health#report_error('Python provider error:', pythonx_errors)
@@ -363,7 +339,7 @@ function! s:check_python(version) abort
\ && !empty(pyenv_root) && resolve(python_exe) !~# '^'.pyenv_root.'/' \ && !empty(pyenv_root) && resolve(python_exe) !~# '^'.pyenv_root.'/'
call health#report_warn('pyenv is not set up optimally.', [ call health#report_warn('pyenv is not set up optimally.', [
\ printf('Create a virtualenv specifically ' \ printf('Create a virtualenv specifically '
\ . 'for Nvim using pyenv, and set `g:%s`. This will avoid ' \ . 'for Neovim using pyenv, and set `g:%s`. This will avoid '
\ . 'the need to install the pynvim module in each ' \ . 'the need to install the pynvim module in each '
\ . 'version/virtualenv.', host_prog_var) \ . 'version/virtualenv.', host_prog_var)
\ ]) \ ])
@@ -377,7 +353,7 @@ function! s:check_python(version) abort
if resolve(python_exe) !~# '^'.venv_root.'/' if resolve(python_exe) !~# '^'.venv_root.'/'
call health#report_warn('Your virtualenv is not set up optimally.', [ call health#report_warn('Your virtualenv is not set up optimally.', [
\ printf('Create a virtualenv specifically ' \ printf('Create a virtualenv specifically '
\ . 'for Nvim and use `g:%s`. This will avoid ' \ . 'for Neovim and use `g:%s`. This will avoid '
\ . 'the need to install the pynvim module in each ' \ . 'the need to install the pynvim module in each '
\ . 'virtualenv.', host_prog_var) \ . 'virtualenv.', host_prog_var)
\ ]) \ ])
@@ -392,6 +368,18 @@ function! s:check_python(version) abort
let python_exe = '' let python_exe = ''
endif endif
" Check if $VIRTUAL_ENV is valid.
if exists('$VIRTUAL_ENV') && !empty(python_exe)
if $VIRTUAL_ENV ==# matchstr(python_exe, '^\V'.$VIRTUAL_ENV)
call health#report_info('$VIRTUAL_ENV matches executable')
else
call health#report_warn(
\ '$VIRTUAL_ENV exists but appears to be inactive. '
\ . 'This could lead to unexpected results.',
\ [ 'If you are using Zsh, see: http://vi.stackexchange.com/a/7654' ])
endif
endif
" Diagnostic output " Diagnostic output
call health#report_info('Executable: ' . (empty(python_exe) ? 'Not found' : python_exe)) call health#report_info('Executable: ' . (empty(python_exe) ? 'Not found' : python_exe))
if len(python_multiple) if len(python_multiple)
@@ -400,6 +388,8 @@ function! s:check_python(version) abort
endfor endfor
endif endif
let pip = 'pip' . (a:version == 2 ? '' : '3')
if empty(python_exe) if empty(python_exe)
" No Python executable can import 'neovim'. Check if any Python executable " No Python executable can import 'neovim'. Check if any Python executable
" can import 'pynvim'. If so, that Python failed to import 'neovim' as " can import 'pynvim'. If so, that Python failed to import 'neovim' as
@@ -411,9 +401,9 @@ function! s:check_python(version) abort
\ 'Detected pip upgrade failure: Python executable can import "pynvim" but ' \ 'Detected pip upgrade failure: Python executable can import "pynvim" but '
\ . 'not "neovim": '. pynvim_exe, \ . 'not "neovim": '. pynvim_exe,
\ "Use that Python version to reinstall \"pynvim\" and optionally \"neovim\".\n" \ "Use that Python version to reinstall \"pynvim\" and optionally \"neovim\".\n"
\ . pynvim_exe ." -m pip uninstall pynvim neovim\n" \ . pip ." uninstall pynvim neovim\n"
\ . pynvim_exe ." -m pip install pynvim\n" \ . pip ." install pynvim\n"
\ . pynvim_exe ." -m pip install neovim # only if needed by third-party software") \ . pip ." install neovim # only if needed by third-party software")
endif endif
else else
let [pyversion, current, latest, status] = s:version_info(python_exe) let [pyversion, current, latest, status] = s:version_info(python_exe)
@@ -423,6 +413,10 @@ function! s:check_python(version) abort
\ ' This could lead to confusing error messages.') \ ' This could lead to confusing error messages.')
endif endif
if a:version == 3 && str2float(pyversion) < 3.3
call health#report_warn('Python 3.3+ is recommended.')
endif
call health#report_info('Python version: ' . pyversion) call health#report_info('Python version: ' . pyversion)
if s:is_bad_response(status) if s:is_bad_response(status)
@@ -434,7 +428,7 @@ function! s:check_python(version) abort
if s:is_bad_response(current) if s:is_bad_response(current)
call health#report_error( call health#report_error(
\ "pynvim is not installed.\nError: ".current, \ "pynvim is not installed.\nError: ".current,
\ ['Run in shell: '. python_exe .' -m pip install pynvim']) \ ['Run in shell: '. pip .' install pynvim'])
endif endif
if s:is_bad_response(latest) if s:is_bad_response(latest)
@@ -479,83 +473,12 @@ function! s:check_for_pyenv() abort
return [pyenv_path, pyenv_root] return [pyenv_path, pyenv_root]
endfunction endfunction
" Resolves Python executable path by invoking and checking `sys.executable`.
function! s:python_exepath(invocation) abort
return s:normalize_path(system(fnameescape(a:invocation)
\ . ' -c "import sys; sys.stdout.write(sys.executable)"'))
endfunction
" Checks that $VIRTUAL_ENV Python executables are found at front of $PATH in
" Nvim and subshells.
function! s:check_virtualenv() abort
call health#report_start('Python virtualenv')
if !exists('$VIRTUAL_ENV')
call health#report_ok('no $VIRTUAL_ENV')
return
endif
let errors = []
" Keep hints as dict keys in order to discard duplicates.
let hints = {}
" The virtualenv should contain some Python executables, and those
" executables should be first both on Nvim's $PATH and the $PATH of
" subshells launched from Nvim.
let bin_dir = has('win32') ? '/Scripts' : '/bin'
let venv_bins = glob($VIRTUAL_ENV . bin_dir . '/python*', v:true, v:true)
" XXX: Remove irrelevant executables found in bin/.
let venv_bins = filter(venv_bins, 'v:val !~# "python-config"')
if len(venv_bins)
for venv_bin in venv_bins
let venv_bin = s:normalize_path(venv_bin)
let py_bin_basename = fnamemodify(venv_bin, ':t')
let nvim_py_bin = s:python_exepath(exepath(py_bin_basename))
let subshell_py_bin = s:python_exepath(py_bin_basename)
if venv_bin !=# nvim_py_bin
call add(errors, '$PATH yields this '.py_bin_basename.' executable: '.nvim_py_bin)
let hint = '$PATH ambiguities arise if the virtualenv is not '
\.'properly activated prior to launching Nvim. Close Nvim, activate the virtualenv, '
\.'check that invoking Python from the command line launches the correct one, '
\.'then relaunch Nvim.'
let hints[hint] = v:true
endif
if venv_bin !=# subshell_py_bin
call add(errors, '$PATH in subshells yields this '
\.py_bin_basename . ' executable: '.subshell_py_bin)
let hint = '$PATH ambiguities in subshells typically are '
\.'caused by your shell config overriding the $PATH previously set by the '
\.'virtualenv. Either prevent them from doing so, or use this workaround: '
\.'https://vi.stackexchange.com/a/34996'
let hints[hint] = v:true
endif
endfor
else
call add(errors, 'no Python executables found in the virtualenv '.bin_dir.' directory.')
endif
let msg = '$VIRTUAL_ENV is set to: '.$VIRTUAL_ENV
if len(errors)
if len(venv_bins)
let msg .= "\nAnd its ".bin_dir.' directory contains: '
\.join(map(venv_bins, "fnamemodify(v:val, ':t')"), ', ')
endif
let conj = "\nBut "
for error in errors
let msg .= conj.error
let conj = "\nAnd "
endfor
let msg .= "\nSo invoking Python may lead to unexpected results."
call health#report_warn(msg, keys(hints))
else
call health#report_info(msg)
call health#report_info('Python version: '
\.system('python -c "import platform, sys; sys.stdout.write(platform.python_version())"'))
call health#report_ok('$VIRTUAL_ENV provides :!python.')
endif
endfunction
function! s:check_ruby() abort function! s:check_ruby() abort
call health#report_start('Ruby provider (optional)') call health#report_start('Ruby provider (optional)')
if s:disabled_via_loaded_var('ruby') let loaded_var = 'g:loaded_ruby_provider'
if exists(loaded_var) && !exists('*provider#ruby#Call')
call health#report_info('Disabled. '.loaded_var.'='.eval(loaded_var))
return return
endif endif
@@ -567,7 +490,7 @@ function! s:check_ruby() abort
endif endif
call health#report_info('Ruby: '. s:system('ruby -v')) call health#report_info('Ruby: '. s:system('ruby -v'))
let [host, err] = provider#ruby#Detect() let host = provider#ruby#Detect()
if empty(host) if empty(host)
call health#report_warn('`neovim-ruby-host` not found.', call health#report_warn('`neovim-ruby-host` not found.',
\ ['Run `gem install neovim` to ensure the neovim RubyGem is installed.', \ ['Run `gem install neovim` to ensure the neovim RubyGem is installed.',
@@ -578,7 +501,7 @@ function! s:check_ruby() abort
endif endif
call health#report_info('Host: '. host) call health#report_info('Host: '. host)
let latest_gem_cmd = has('win32') ? 'cmd /c gem list -ra "^^neovim$"' : 'gem list -ra ^neovim$' let latest_gem_cmd = has('win32') ? 'cmd /c gem list -ra ^^neovim$' : 'gem list -ra ^neovim$'
let latest_gem = s:system(split(latest_gem_cmd)) let latest_gem = s:system(split(latest_gem_cmd))
if s:shell_error || empty(latest_gem) if s:shell_error || empty(latest_gem)
call health#report_error('Failed to run: '. latest_gem_cmd, call health#report_error('Failed to run: '. latest_gem_cmd,
@@ -586,7 +509,7 @@ function! s:check_ruby() abort
\ 'Are you behind a firewall or proxy?']) \ 'Are you behind a firewall or proxy?'])
return return
endif endif
let latest_gem = get(split(latest_gem, 'neovim (\|, \|)$' ), 0, 'not found') let latest_gem = get(split(latest_gem, 'neovim (\|, \|)$' ), 1, 'not found')
let current_gem_cmd = host .' --version' let current_gem_cmd = host .' --version'
let current_gem = s:system(current_gem_cmd) let current_gem = s:system(current_gem_cmd)
@@ -609,7 +532,9 @@ endfunction
function! s:check_node() abort function! s:check_node() abort
call health#report_start('Node.js provider (optional)') call health#report_start('Node.js provider (optional)')
if s:disabled_via_loaded_var('node') let loaded_var = 'g:loaded_node_provider'
if exists(loaded_var) && !exists('*provider#node#Call')
call health#report_info('Disabled. '.loaded_var.'='.eval(loaded_var))
return return
endif endif
@@ -621,8 +546,8 @@ function! s:check_node() abort
endif endif
let node_v = get(split(s:system('node -v'), "\n"), 0, '') let node_v = get(split(s:system('node -v'), "\n"), 0, '')
call health#report_info('Node.js: '. node_v) call health#report_info('Node.js: '. node_v)
if s:shell_error || s:version_cmp(node_v[1:], '6.0.0') < 0 if !s:shell_error && s:version_cmp(node_v[1:], '6.0.0') < 0
call health#report_warn('Nvim node.js host does not support '.node_v) call health#report_warn('Neovim node.js host does not support '.node_v)
" Skip further checks, they are nonsense if nodejs is too old. " Skip further checks, they are nonsense if nodejs is too old.
return return
endif endif
@@ -630,14 +555,14 @@ function! s:check_node() abort
call health#report_warn('node.js on this system does not support --inspect-brk so $NVIM_NODE_HOST_DEBUG is ignored.') call health#report_warn('node.js on this system does not support --inspect-brk so $NVIM_NODE_HOST_DEBUG is ignored.')
endif endif
let [host, err] = provider#node#Detect() let host = provider#node#Detect()
if empty(host) if empty(host)
call health#report_warn('Missing "neovim" npm (or yarn) package.', call health#report_warn('Missing "neovim" npm (or yarn) package.',
\ ['Run in shell: npm install -g neovim', \ ['Run in shell: npm install -g neovim',
\ 'Run in shell (if you use yarn): yarn global add neovim']) \ 'Run in shell (if you use yarn): yarn global add neovim'])
return return
endif endif
call health#report_info('Nvim node.js host: '. host) call health#report_info('Neovim node.js host: '. host)
let manager = executable('npm') ? 'npm' : 'yarn' let manager = executable('npm') ? 'npm' : 'yarn'
let latest_npm_cmd = has('win32') ? let latest_npm_cmd = has('win32') ?
@@ -650,12 +575,14 @@ function! s:check_node() abort
\ 'Are you behind a firewall or proxy?']) \ 'Are you behind a firewall or proxy?'])
return return
endif endif
try if !empty(latest_npm)
let pkg_data = json_decode(latest_npm) try
catch /E474/ let pkg_data = json_decode(latest_npm)
return 'error: '.latest_npm catch /E474/
endtry return 'error: '.latest_npm
let latest_npm = get(get(pkg_data, 'dist-tags', {}), 'latest', 'unable to parse') endtry
let latest_npm = get(get(pkg_data, 'dist-tags', {}), 'latest', 'unable to parse')
endif
let current_npm_cmd = ['node', host, '--version'] let current_npm_cmd = ['node', host, '--version']
let current_npm = s:system(current_npm_cmd) let current_npm = s:system(current_npm_cmd)
@@ -676,85 +603,10 @@ function! s:check_node() abort
endif endif
endfunction endfunction
function! s:check_perl() abort
call health#report_start('Perl provider (optional)')
if s:disabled_via_loaded_var('perl')
return
endif
let [perl_exec, perl_errors] = provider#perl#Detect()
if empty(perl_exec)
if !empty(perl_errors)
call health#report_error('perl provider error:', perl_errors)
else
call health#report_warn('No usable perl executable found')
endif
return
endif
call health#report_info('perl executable: '. perl_exec)
" we cannot use cpanm that is on the path, as it may not be for the perl
" set with g:perl_host_prog
call s:system([perl_exec, '-W', '-MApp::cpanminus', '-e', ''])
if s:shell_error
return [perl_exec, '"App::cpanminus" module is not installed']
endif
let latest_cpan_cmd = [perl_exec,
\ '-MApp::cpanminus::fatscript', '-e',
\ 'my $app = App::cpanminus::script->new;
\ $app->parse_options ("--info", "-q", "Neovim::Ext");
\ exit $app->doit']
let latest_cpan = s:system(latest_cpan_cmd)
if s:shell_error || empty(latest_cpan)
call health#report_error('Failed to run: '. join(latest_cpan_cmd, " "),
\ ["Make sure you're connected to the internet.",
\ 'Are you behind a firewall or proxy?'])
return
elseif latest_cpan[0] ==# '!'
let cpanm_errs = split(latest_cpan, '!')
if cpanm_errs[0] =~# "Can't write to "
call health#report_warn(cpanm_errs[0], cpanm_errs[1:-2])
" Last line is the package info
let latest_cpan = cpanm_errs[-1]
else
call health#report_error('Unknown warning from command: ' . latest_cpan_cmd, cpanm_errs)
return
endif
endif
let latest_cpan = matchstr(latest_cpan, '\(\.\?\d\)\+')
if empty(latest_cpan)
call health#report_error('Cannot parse version number from cpanm output: ' . latest_cpan)
return
endif
let current_cpan_cmd = [perl_exec, '-W', '-MNeovim::Ext', '-e', 'print $Neovim::Ext::VERSION']
let current_cpan = s:system(current_cpan_cmd)
if s:shell_error
call health#report_error('Failed to run: '. string(current_cpan_cmd),
\ ['Report this issue with the output of: ', string(current_cpan_cmd)])
return
endif
if s:version_cmp(current_cpan, latest_cpan) == -1
call health#report_warn(
\ printf('Module "Neovim::Ext" is out-of-date. Installed: %s, latest: %s',
\ current_cpan, latest_cpan),
\ ['Run in shell: cpanm -n Neovim::Ext'])
else
call health#report_ok('Latest "Neovim::Ext" cpan module is installed: '. current_cpan)
endif
endfunction
function! health#provider#check() abort function! health#provider#check() abort
call s:check_clipboard() call s:check_clipboard()
call s:check_python(2) call s:check_python(2)
call s:check_python(3) call s:check_python(3)
call s:check_virtualenv()
call s:check_ruby() call s:check_ruby()
call s:check_node() call s:check_node()
call s:check_perl()
endfunction endfunction

View File

@@ -1,7 +1,7 @@
" Vim completion script " Vim completion script
" Language: HTML and XHTML " Language: HTML and XHTML
" Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl ) " Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl )
" Last Change: 2019 Sep 27 " Last Change: 2014 Jun 20
" Distinguish between HTML versions. " Distinguish between HTML versions.
" To use with other HTML versions add another "elseif" condition to match " To use with other HTML versions add another "elseif" condition to match
@@ -245,8 +245,7 @@ function! htmlcomplete#CompleteTags(findstart, base)
" If context contains white space it is attribute. " If context contains white space it is attribute.
" It can be also value of attribute. " It can be also value of attribute.
" We have to get first word to offer proper completions " We have to get first word to offer proper completions
if context =~ '^\s*$' if context == ''
" empty or whitespace line
let tag = '' let tag = ''
else else
let tag = split(context)[0] let tag = split(context)[0]
@@ -486,7 +485,7 @@ function! htmlcomplete#CompleteTags(findstart, base)
endif endif
endif endif
" Value of attribute completion {{{ " Value of attribute completion {{{
" If attr contains =\s*[\"'] we match value of attribute " If attr contains =\s*[\"'] we catched value of attribute
if attr =~ "=\s*[\"']" || attr =~ "=\s*$" if attr =~ "=\s*[\"']" || attr =~ "=\s*$"
" Let do attribute specific completion " Let do attribute specific completion
let attrname = matchstr(attr, '.*\ze\s*=') let attrname = matchstr(attr, '.*\ze\s*=')

View File

@@ -1,9 +1,7 @@
" Vim completion script " Vim completion script
" Language: Java Script " Language: Java Script
" Maintainer: Jay Sitter (jay@jaysitter.com) " Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl )
" URL: https://github.com/jsit/javascriptcomplete.vim/ " Last Change: 2017 Mar 04
" Previous Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl )
" Last Change: 2020 Jul 30
function! javascriptcomplete#CompleteJS(findstart, base) function! javascriptcomplete#CompleteJS(findstart, base)
if a:findstart if a:findstart
@@ -156,30 +154,12 @@ function! javascriptcomplete#CompleteJS(findstart, base)
\ 'text', 'vLink'] \ 'text', 'vLink']
let bodys = bodyprop let bodys = bodyprop
" Document - document. " Document - document.
let docuprop = ['anchors', 'body', 'characterSet', 'doctype', let docuprop = ['anchors', 'applets', 'childNodes', 'embeds', 'forms', 'images', 'links', 'stylesheets',
\ 'documentElement', 'documentURI', 'embeds', 'fonts', 'forms', \ 'body', 'cookie', 'documentElement', 'domain', 'lastModified', 'referrer', 'title', 'URL']
\ 'head', 'hidden', 'images', 'implementation', 'lastStyleSheetSet', let documeth = ['close', 'createAttribute', 'createElement', 'createTextNode', 'focus', 'getElementById',
\ 'links', 'plugins', 'preferredStyleSheetSet', 'scripts', \ 'getElementsByName', 'getElementsByTagName', 'open', 'write', 'writeln',
\ 'scrollingElement', 'selectedStyleSheetSet', 'styleSheetSets', \ 'onClick', 'onDblClick', 'onFocus', 'onKeyDown', 'onKeyPress', 'onKeyUp',
\ 'timeline', 'visibilityState', 'cookie', 'defaultView', \ 'onMouseDown', 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp', 'onResize']
\ 'designMode', 'dir', 'domain', 'lastModified', 'location',
\ 'readyState', 'referrer', 'title', 'URL', 'activeElement',
\ 'fullscreenElement', 'styleSheets']
let documeth = ['adoptNode', 'close', 'createAttribute',
\ 'createAttributeNS', 'createCDATASection', 'createComment',
\ 'createDocumentFragment', 'createElement', 'createElementNS',
\ 'createEvent', 'createExpression', 'createNSResolver',
\ 'createNodeIterator', 'createProcessingInstruction', 'createRange',
\ 'createTextNode', 'createTouchList', 'createTreeWalker',
\ 'enableStyleSheetsForSet', 'evaluate', 'focus', 'getElementById',
\ 'getElementById', 'getElementsByClassName', 'getElementsByName',
\ 'getElementsByTagName', 'getElementsByTagNameNS',
\ 'hasStorageAccess', 'importNode', 'onClick', 'onDblClick',
\ 'onFocus', 'onKeyDown', 'onKeyPress', 'onKeyUp', 'onMouseDown',
\ 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp',
\ 'onResize', 'open', 'querySelector', 'querySelectorAll',
\ 'requestStorageAccess', 'write', 'writeln']
call map(documeth, 'v:val."("') call map(documeth, 'v:val."("')
let docuxprop = ['attributes', 'childNodes', 'doctype', 'documentElement', 'firstChild', let docuxprop = ['attributes', 'childNodes', 'doctype', 'documentElement', 'firstChild',
\ 'implementation', 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', \ 'implementation', 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType',
@@ -388,11 +368,9 @@ function! javascriptcomplete#CompleteJS(findstart, base)
let xdomelemprop = ['attributes', 'childNodes', 'firstChild', 'lastChild', let xdomelemprop = ['attributes', 'childNodes', 'firstChild', 'lastChild',
\ 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', 'nodeValue', \ 'namespaceURI', 'nextSibling', 'nodeName', 'nodeType', 'nodeValue',
\ 'ownerDocument', 'parentNode', 'prefix', 'previousSibling', 'tagName'] \ 'ownerDocument', 'parentNode', 'prefix', 'previousSibling', 'tagName']
let xdomelemmeth = ['appendChild', 'addEventListener', 'cloneNode', let xdomelemmeth = ['appendChild', 'cloneNode', 'getAttribute', 'getAttributeNode',
\ 'dispatchEvent', 'getAttribute', 'getAttributeNode', \ 'getElementsByTagName', 'hasChildNodes', 'insertBefore', 'normalize',
\ 'getElementsByTagName', 'hasChildNodes', 'insertBefore', \ 'removeAttribute', 'removeAttributeNode', 'removeChild', 'replaceChild',
\ 'normalize', 'removeAttribute', 'removeAttributeNode',
\ 'removeChild', 'removeEventListener', 'replaceChild',
\ 'setAttribute', 'setAttributeNode'] \ 'setAttribute', 'setAttributeNode']
call map(xdomelemmeth, 'v:val."("') call map(xdomelemmeth, 'v:val."("')
let xdomelems = xdomelemprop + xdomelemmeth let xdomelems = xdomelemprop + xdomelemmeth

View File

@@ -1,4 +1,4 @@
" Maintainer: Anmol Sethi <hi@nhooyr.io> " Maintainer: Anmol Sethi <anmol@aubble.com>
if exists('s:loaded_man') if exists('s:loaded_man')
finish finish
@@ -7,18 +7,32 @@ let s:loaded_man = 1
let s:find_arg = '-w' let s:find_arg = '-w'
let s:localfile_arg = v:true " Always use -l if possible. #6683 let s:localfile_arg = v:true " Always use -l if possible. #6683
let s:section_arg = '-S' let s:section_arg = '-s'
function! man#init() abort function! s:init_section_flag()
call system(['env', 'MANPAGER=cat', 'man', s:section_arg, '1', 'man'])
if v:shell_error
let s:section_arg = '-S'
endif
endfunction
function! s:init() abort
call s:init_section_flag()
" TODO(nhooyr): Does `man -l` on SunOS list searched directories?
try try
if !has('win32') && $OSTYPE !~? 'cygwin\|linux' && system('uname -s') =~? 'SunOS' && system('uname -r') =~# '^5'
let s:find_arg = '-l'
endif
" Check for -l support. " Check for -l support.
call s:get_page(s:get_path('', 'man')) call s:get_page(s:get_path('', 'man'))
catch /E145:/
" Ignore the error in restricted mode
catch /command error .*/ catch /command error .*/
let s:localfile_arg = v:false let s:localfile_arg = v:false
endtry endtry
endfunction endfunction
function! man#open_page(count, mods, ...) abort function! man#open_page(count, count1, mods, ...) abort
if a:0 > 2 if a:0 > 2
call s:error('too many arguments') call s:error('too many arguments')
return return
@@ -38,40 +52,51 @@ function! man#open_page(count, mods, ...) abort
let ref = a:2.'('.a:1.')' let ref = a:2.'('.a:1.')'
endif endif
try try
let [sect, name] = s:extract_sect_and_name_ref(ref) let [sect, name] = man#extract_sect_and_name_ref(ref)
if a:count >= 0 if a:count ==# a:count1
" v:count defaults to 0 which is a valid section, and v:count1 defaults to
" 1, also a valid section. If they are equal, count explicitly set.
let sect = string(a:count) let sect = string(a:count)
endif endif
let path = s:verify_exists(sect, name) let [sect, name, path] = s:verify_exists(sect, name)
let [sect, name] = s:extract_sect_and_name_path(path)
catch catch
call s:error(v:exception) call s:error(v:exception)
return return
endtry endtry
let [l:buf, l:save_tfu] = [bufnr(), &tagfunc] call s:push_tag()
let bufname = 'man://'.name.(empty(sect)?'':'('.sect.')')
try try
setlocal tagfunc=man#goto_tag set eventignore+=BufReadCmd
let l:target = l:name . '(' . l:sect . ')'
if a:mods !~# 'tab' && s:find_man() if a:mods !~# 'tab' && s:find_man()
execute 'silent keepalt tag' l:target execute 'silent keepalt edit' fnameescape(bufname)
else else
execute 'silent keepalt' a:mods 'stag' l:target execute 'silent keepalt' a:mods 'split' fnameescape(bufname)
endif endif
call s:set_options(v:false)
finally finally
call setbufvar(l:buf, '&tagfunc', l:save_tfu) set eventignore-=BufReadCmd
endtry
try
let page = s:get_page(path)
catch
if a:mods =~# 'tab' || !s:find_man()
" a new window was opened
close
endif
call s:error(v:exception)
return
endtry endtry
let b:man_sect = sect let b:man_sect = sect
call s:put_page(page)
endfunction endfunction
" Called when a man:// buffer is opened.
function! man#read_page(ref) abort function! man#read_page(ref) abort
try try
let [sect, name] = s:extract_sect_and_name_ref(a:ref) let [sect, name] = man#extract_sect_and_name_ref(a:ref)
let path = s:verify_exists(sect, name) let [sect, name, path] = s:verify_exists(sect, name)
let [sect, name] = s:extract_sect_and_name_path(path)
let page = s:get_page(path) let page = s:get_page(path)
catch catch
call s:error(v:exception) call s:error(v:exception)
@@ -123,20 +148,11 @@ function! s:system(cmd, ...) abort
return opts.stdout return opts.stdout
endfunction endfunction
function! s:set_options(pager) abort
setlocal filetype=man
setlocal noswapfile buftype=nofile bufhidden=hide
setlocal nomodified readonly nomodifiable
if a:pager
nnoremap <silent> <buffer> <nowait> q :lclose<CR>:q<CR>
endif
endfunction
function! s:get_page(path) abort function! s:get_page(path) abort
" Disable hard-wrap by using a big $MANWIDTH (max 1000 on some systems #9065). " Disable hard-wrap by using a big $MANWIDTH (max 1000 on some systems #9065).
" Soft-wrap: ftplugin/man.vim sets wrap/breakindent/…. " Soft-wrap: ftplugin/man.vim sets wrap/breakindent/….
" Hard-wrap: driven by `man`. " Hard-wrap: driven by `man`.
let manwidth = !get(g:, 'man_hardwrap', 1) ? 999 : (empty($MANWIDTH) ? winwidth(0) : $MANWIDTH) let manwidth = !get(g:,'man_hardwrap') ? 999 : (empty($MANWIDTH) ? winwidth(0) : $MANWIDTH)
" Force MANPAGER=cat to ensure Vim is not recursively invoked (by man-db). " Force MANPAGER=cat to ensure Vim is not recursively invoked (by man-db).
" http://comments.gmane.org/gmane.editors.vim.devel/29085 " http://comments.gmane.org/gmane.editors.vim.devel/29085
" Set MAN_KEEP_FORMATTING so Debian man doesn't discard backspaces. " Set MAN_KEEP_FORMATTING so Debian man doesn't discard backspaces.
@@ -145,7 +161,8 @@ function! s:get_page(path) abort
endfunction endfunction
function! s:put_page(page) abort function! s:put_page(page) abort
setlocal modifiable noreadonly noswapfile setlocal modifiable
setlocal noreadonly
silent keepjumps %delete _ silent keepjumps %delete _
silent put =a:page silent put =a:page
while getline(1) =~# '^\s*$' while getline(1) =~# '^\s*$'
@@ -157,7 +174,7 @@ function! s:put_page(page) abort
silent! keeppatterns keepjumps %s/\s\{199,}/\=repeat(' ', 10)/g silent! keeppatterns keepjumps %s/\s\{199,}/\=repeat(' ', 10)/g
1 1
lua require("man").highlight_man_page() lua require("man").highlight_man_page()
call s:set_options(v:false) setlocal filetype=man
endfunction endfunction
function! man#show_toc() abort function! man#show_toc() abort
@@ -187,7 +204,7 @@ endfunction
" attempt to extract the name and sect out of 'name(sect)' " attempt to extract the name and sect out of 'name(sect)'
" otherwise just return the largest string of valid characters in ref " otherwise just return the largest string of valid characters in ref
function! s:extract_sect_and_name_ref(ref) abort function! man#extract_sect_and_name_ref(ref) abort
if a:ref[0] ==# '-' " try ':Man -pandoc' with this disabled. if a:ref[0] ==# '-' " try ':Man -pandoc' with this disabled.
throw 'manpage name cannot start with ''-''' throw 'manpage name cannot start with ''-'''
endif endif
@@ -197,21 +214,13 @@ function! s:extract_sect_and_name_ref(ref) abort
if empty(name) if empty(name)
throw 'manpage reference cannot contain only parentheses' throw 'manpage reference cannot contain only parentheses'
endif endif
return ['', s:spaces_to_underscores(name)] return [get(b:, 'man_default_sects', ''), name]
endif endif
let left = split(ref, '(') let left = split(ref, '(')
" see ':Man 3X curses' on why tolower. " see ':Man 3X curses' on why tolower.
" TODO(nhooyr) Not sure if this is portable across OSs " TODO(nhooyr) Not sure if this is portable across OSs
" but I have not seen a single uppercase section. " but I have not seen a single uppercase section.
return [tolower(split(left[1], ')')[0]), s:spaces_to_underscores(left[0])] return [tolower(split(left[1], ')')[0]), left[0]]
endfunction
" replace spaces in a man page name with underscores
" intended for PostgreSQL, which has man pages like 'CREATE_TABLE(7)';
" while editing SQL source code, it's nice to visually select 'CREATE TABLE'
" and hit 'K', which requires this transformation
function! s:spaces_to_underscores(str)
return substitute(a:str, ' ', '_', 'g')
endfunction endfunction
function! s:get_path(sect, name) abort function! s:get_path(sect, name) abort
@@ -228,62 +237,42 @@ function! s:get_path(sect, name) abort
return substitute(get(split(s:system(['man', s:find_arg, s:section_arg, a:sect, a:name])), 0, ''), '\n\+$', '', '') return substitute(get(split(s:system(['man', s:find_arg, s:section_arg, a:sect, a:name])), 0, ''), '\n\+$', '', '')
endfunction endfunction
" s:verify_exists attempts to find the path to a manpage
" based on the passed section and name.
"
" 1. If the passed section is empty, b:man_default_sects is used.
" 2. If manpage could not be found with the given sect and name,
" then another attempt is made with b:man_default_sects.
" 3. If it still could not be found, then we try again without a section.
" 4. If still not found but $MANSECT is set, then we try again with $MANSECT
" unset.
"
" This function is careful to avoid duplicating a search if a previous
" step has already done it. i.e if we use b:man_default_sects in step 1,
" then we don't do it again in step 2.
function! s:verify_exists(sect, name) abort function! s:verify_exists(sect, name) abort
let sect = a:sect
if empty(sect)
let sect = get(b:, 'man_default_sects', '')
endif
try try
return s:get_path(sect, a:name) let path = s:get_path(a:sect, a:name)
catch /^command error (/ catch /^command error (/
try
let path = s:get_path(get(b:, 'man_default_sects', ''), a:name)
catch /^command error (/
let path = s:get_path('', a:name)
endtry
endtry endtry
" Extract the section from the path, because sometimes the actual section is
if !empty(get(b:, 'man_default_sects', '')) && sect !=# b:man_default_sects " more specific than what we provided to `man` (try `:Man 3 App::CLI`).
try " Also on linux, name seems to be case-insensitive. So for `:Man PRIntf`, we
return s:get_path(b:man_default_sects, a:name) " still want the name of the buffer to be 'printf'.
catch /^command error (/ return s:extract_sect_and_name_path(path) + [path]
endtry
endif
if !empty(sect)
try
return s:get_path('', a:name)
catch /^command error (/
endtry
endif
if !empty($MANSECT)
try
let MANSECT = $MANSECT
call setenv('MANSECT', v:null)
return s:get_path('', a:name)
catch /^command error (/
finally
call setenv('MANSECT', MANSECT)
endtry
endif
throw 'no manual entry for ' . a:name
endfunction endfunction
" Extracts the name/section from the 'path/name.sect', because sometimes the actual section is let s:tag_stack = []
" more specific than what we provided to `man` (try `:Man 3 App::CLI`).
" Also on linux, name seems to be case-insensitive. So for `:Man PRIntf`, we function! s:push_tag() abort
" still want the name of the buffer to be 'printf'. let s:tag_stack += [{
\ 'buf': bufnr('%'),
\ 'lnum': line('.'),
\ 'col': col('.'),
\ }]
endfunction
function! man#pop_tag() abort
if !empty(s:tag_stack)
let tag = remove(s:tag_stack, -1)
execute 'silent' tag['buf'].'buffer'
call cursor(tag['lnum'], tag['col'])
endif
endfunction
" extracts the name and sect out of 'path/name.sect'
function! s:extract_sect_and_name_path(path) abort function! s:extract_sect_and_name_path(path) abort
let tail = fnamemodify(a:path, ':t') let tail = fnamemodify(a:path, ':t')
if a:path =~# '\.\%([glx]z\|bz2\|lzma\|Z\)$' " valid extensions if a:path =~# '\.\%([glx]z\|bz2\|lzma\|Z\)$' " valid extensions
@@ -295,16 +284,20 @@ function! s:extract_sect_and_name_path(path) abort
endfunction endfunction
function! s:find_man() abort function! s:find_man() abort
let l:win = 1 if &filetype ==# 'man'
while l:win <= winnr('$') return 1
let l:buf = winbufnr(l:win) elseif winnr('$') ==# 1
if getbufvar(l:buf, '&filetype', '') ==# 'man' return 0
execute l:win.'wincmd w' endif
let thiswin = winnr()
while 1
wincmd w
if &filetype ==# 'man'
return 1 return 1
elseif thiswin ==# winnr()
return 0
endif endif
let l:win += 1
endwhile endwhile
return 0
endfunction endfunction
function! s:error(msg) abort function! s:error(msg) abort
@@ -314,7 +307,7 @@ function! s:error(msg) abort
echohl None echohl None
endfunction endfunction
" see s:extract_sect_and_name_ref on why tolower(sect) " see man#extract_sect_and_name_ref on why tolower(sect)
function! man#complete(arg_lead, cmd_line, cursor_pos) abort function! man#complete(arg_lead, cmd_line, cursor_pos) abort
let args = split(a:cmd_line) let args = split(a:cmd_line)
let cmd_offset = index(args, 'Man') let cmd_offset = index(args, 'Man')
@@ -367,35 +360,14 @@ function! man#complete(arg_lead, cmd_line, cursor_pos) abort
return s:complete(sect, sect, name) return s:complete(sect, sect, name)
endfunction endfunction
function! s:get_paths(sect, name, do_fallback) abort function! s:complete(sect, psect, name) abort
" callers must try-catch this, as some `man` implementations don't support `s:find_arg`
try try
let mandirs = join(split(s:system(['man', s:find_arg]), ':\|\n'), ',') let mandirs = join(split(s:system(['man', s:find_arg]), ':\|\n'), ',')
let paths = globpath(mandirs, 'man?/'.a:name.'*.'.a:sect.'*', 0, 1)
try
" Prioritize the result from verify_exists as it obeys b:man_default_sects.
let first = s:verify_exists(a:sect, a:name)
let paths = filter(paths, 'v:val !=# first')
let paths = [first] + paths
catch
endtry
return paths
catch catch
if !a:do_fallback call s:error(v:exception)
throw v:exception return
endif
" Fallback to a single path, with the page we're trying to find.
try
return [s:verify_exists(a:sect, a:name)]
catch
return []
endtry
endtry endtry
endfunction let pages = globpath(mandirs,'man?/'.a:name.'*.'.a:sect.'*', 0, 1)
function! s:complete(sect, psect, name) abort
let pages = s:get_paths(a:sect, a:name, v:false)
" We remove duplicates in case the same manpage in different languages was found. " We remove duplicates in case the same manpage in different languages was found.
return uniq(sort(map(pages, 's:format_candidate(v:val, a:psect)'), 'i')) return uniq(sort(map(pages, 's:format_candidate(v:val, a:psect)'), 'i'))
endfunction endfunction
@@ -414,12 +386,7 @@ function! s:format_candidate(path, psect) abort
endif endif
endfunction endfunction
" Called when Nvim is invoked as $MANPAGER.
function! man#init_pager() abort function! man#init_pager() abort
" https://github.com/neovim/neovim/issues/6828
let og_modifiable = &modifiable
setlocal modifiable
if getline(1) =~# '^\s*$' if getline(1) =~# '^\s*$'
silent keepjumps 1delete _ silent keepjumps 1delete _
else else
@@ -430,44 +397,13 @@ function! man#init_pager() abort
" know the correct casing, cf. `man glDrawArraysInstanced`). " know the correct casing, cf. `man glDrawArraysInstanced`).
let ref = substitute(matchstr(getline(1), '^[^)]\+)'), ' ', '_', 'g') let ref = substitute(matchstr(getline(1), '^[^)]\+)'), ' ', '_', 'g')
try try
let b:man_sect = s:extract_sect_and_name_ref(ref)[0] let b:man_sect = man#extract_sect_and_name_ref(ref)[0]
catch catch
let b:man_sect = '' let b:man_sect = ''
endtry endtry
if -1 == match(bufname('%'), 'man:\/\/') " Avoid duplicate buffers, E95. if -1 == match(bufname('%'), 'man:\/\/') " Avoid duplicate buffers, E95.
execute 'silent file man://'.tolower(fnameescape(ref)) execute 'silent file man://'.tolower(fnameescape(ref))
endif endif
call s:set_options(v:true)
let &l:modifiable = og_modifiable
endfunction endfunction
function! man#goto_tag(pattern, flags, info) abort call s:init()
let [l:sect, l:name] = s:extract_sect_and_name_ref(a:pattern)
let l:paths = s:get_paths(l:sect, l:name, v:true)
let l:structured = []
for l:path in l:paths
let [l:sect, l:name] = s:extract_sect_and_name_path(l:path)
let l:structured += [{
\ 'name': l:name,
\ 'title': l:name . '(' . l:sect . ')'
\ }]
endfor
if &cscopetag
" return only a single entry so we work well with :cstag (#11675)
let l:structured = l:structured[:0]
endif
return map(l:structured, {
\ _, entry -> {
\ 'name': entry.name,
\ 'filename': 'man://' . entry.title,
\ 'cmd': '1'
\ }
\ })
endfunction
call man#init()

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"

File diff suppressed because it is too large Load Diff

View File

@@ -1,8 +1,8 @@
" netrwFileHandlers: contains various extension-based file handlers for " netrwFileHandlers: contains various extension-based file handlers for
" netrw's browsers' x command ("eXecute launcher") " netrw's browsers' x command ("eXecute launcher")
" Author: Charles E. Campbell " Author: Charles E. Campbell
" Date: Sep 18, 2020 " Date: May 03, 2013
" Version: 11 " Version: 11b ASTRO-ONLY
" Copyright: Copyright (C) 1999-2012 Charles E. Campbell {{{1 " Copyright: Copyright (C) 1999-2012 Charles E. Campbell {{{1
" Permission is hereby granted to use and distribute this code, " Permission is hereby granted to use and distribute this code,
" with or without modifications, provided that this copyright " with or without modifications, provided that this copyright
@@ -20,7 +20,7 @@
if exists("g:loaded_netrwFileHandlers") || &cp if exists("g:loaded_netrwFileHandlers") || &cp
finish finish
endif endif
let g:loaded_netrwFileHandlers= "v11" let g:loaded_netrwFileHandlers= "v11b"
if v:version < 702 if v:version < 702
echohl WarningMsg echohl WarningMsg
echo "***warning*** this version of netrwFileHandlers needs vim 7.2" echo "***warning*** this version of netrwFileHandlers needs vim 7.2"

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

View File

@@ -18,5 +18,61 @@
" holder be liable for any damages resulting from the use " holder be liable for any damages resulting from the use
" of this software. " of this software.
function! netrw_gitignore#Hide(...) function! netrw_gitignore#Hide(...)
return substitute(substitute(system('git ls-files --other --ignored --exclude-standard --directory'), '\n', ',', 'g'), ',$', '', '') let additional_files = a:000
let default_files = ['.gitignore', '.git/info/exclude']
" get existing global/system gitignore files
let global_gitignore = expand(substitute(system("git config --global core.excludesfile"), '\n', '', 'g'))
if global_gitignore !=# ''
let default_files = add(default_files, global_gitignore)
endif
let system_gitignore = expand(substitute(system("git config --system core.excludesfile"), '\n', '', 'g'))
if system_gitignore !=# ''
let default_files = add(default_files, system_gitignore)
endif
" append additional files if given as function arguments
if additional_files !=# []
let files = extend(default_files, additional_files)
else
let files = default_files
endif
" keep only existing/readable files
let gitignore_files = []
for file in files
if filereadable(file)
let gitignore_files = add(gitignore_files, file)
endif
endfor
" get contents of gitignore patterns from those files
let gitignore_lines = []
for file in gitignore_files
for line in readfile(file)
" filter empty lines and comments
if line !~# '^#' && line !~# '^$'
let gitignore_lines = add(gitignore_lines, line)
endif
endfor
endfor
" convert gitignore patterns to Netrw/Vim regex patterns
let escaped_lines = []
for line in gitignore_lines
let escaped = line
let escaped = substitute(escaped, '\*\*', '*', 'g')
let escaped = substitute(escaped, '\.', '\\.', 'g')
let escaped = substitute(escaped, '\$', '\\$', 'g')
let escaped = substitute(escaped, '*', '.*', 'g')
" correction: dot, dollar and asterisks chars shouldn't be escaped when
" within regex matching groups.
let escaped = substitute(escaped, '\(\[[^]]*\)\zs\\\.', '\.', 'g')
let escaped = substitute(escaped, '\(\[[^]]*\)\zs\\\$', '\$', 'g')
let escaped = substitute(escaped, '\(\[[^]]*\)\zs\.\*', '*', 'g')
let escaped_lines = add(escaped_lines, escaped)
endfor
return join(escaped_lines, ',')
endfunction endfunction

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

@@ -3,11 +3,8 @@
" Start the provider and perform a 'poll' request " Start the provider and perform a 'poll' request
" "
" Returns a valid channel on success " Returns a valid channel on success
function! provider#Poll(argv, orig_name, log_env, ...) abort function! provider#Poll(argv, orig_name, log_env) abort
let job = {'rpc': v:true, 'stderr_buffered': v:true} let job = {'rpc': v:true, 'stderr_buffered': v:true}
if a:0
let job = extend(job, a:1)
endif
try try
let channel_id = jobstart(a:argv, job) let channel_id = jobstart(a:argv, job)
if channel_id > 0 && rpcrequest(channel_id, 'poll') ==# 'ok' if channel_id > 0 && rpcrequest(channel_id, 'poll') ==# 'ok'

View File

@@ -35,7 +35,8 @@ endfunction
let s:selections = { '*': s:selection, '+': copy(s:selection) } let s:selections = { '*': s:selection, '+': copy(s:selection) }
function! s:try_cmd(cmd, ...) abort function! s:try_cmd(cmd, ...) abort
let out = systemlist(a:cmd, (a:0 ? a:1 : ['']), 1) let argv = split(a:cmd, " ")
let out = systemlist(argv, (a:0 ? a:1 : ['']), 1)
if v:shell_error if v:shell_error
if !exists('s:did_error_try_cmd') if !exists('s:did_error_try_cmd')
echohl WarningMsg echohl WarningMsg
@@ -54,10 +55,6 @@ function! s:cmd_ok(cmd) abort
return v:shell_error == 0 return v:shell_error == 0
endfunction endfunction
function! s:split_cmd(cmd) abort
return (type(a:cmd) == v:t_string) ? split(a:cmd, " ") : a:cmd
endfunction
let s:cache_enabled = 1 let s:cache_enabled = 1
let s:err = '' let s:err = ''
@@ -74,73 +71,56 @@ function! provider#clipboard#Executable() abort
return '' return ''
endif endif
let s:copy = {} let s:copy = get(g:clipboard, 'copy', { '+': v:null, '*': v:null })
let s:copy['+'] = s:split_cmd(get(g:clipboard.copy, '+', v:null)) let s:paste = get(g:clipboard, 'paste', { '+': v:null, '*': v:null })
let s:copy['*'] = s:split_cmd(get(g:clipboard.copy, '*', v:null))
let s:paste = {}
let s:paste['+'] = s:split_cmd(get(g:clipboard.paste, '+', v:null))
let s:paste['*'] = s:split_cmd(get(g:clipboard.paste, '*', v:null))
let s:cache_enabled = get(g:clipboard, 'cache_enabled', 0) let s:cache_enabled = get(g:clipboard, 'cache_enabled', 0)
return get(g:clipboard, 'name', 'g:clipboard') return get(g:clipboard, 'name', 'g:clipboard')
elseif has('mac') elseif has('mac')
let s:copy['+'] = ['pbcopy'] let s:copy['+'] = 'pbcopy'
let s:paste['+'] = ['pbpaste'] let s:paste['+'] = 'pbpaste'
let s:copy['*'] = s:copy['+'] let s:copy['*'] = s:copy['+']
let s:paste['*'] = s:paste['+'] let s:paste['*'] = s:paste['+']
let s:cache_enabled = 0 let s:cache_enabled = 0
return 'pbcopy' return 'pbcopy'
elseif !empty($WAYLAND_DISPLAY) && executable('wl-copy') && executable('wl-paste') elseif exists('$WAYLAND_DISPLAY') && executable('wl-copy') && executable('wl-paste')
let s:copy['+'] = ['wl-copy', '--foreground', '--type', 'text/plain'] let s:copy['+'] = 'wl-copy --foreground --type text/plain'
let s:paste['+'] = ['wl-paste', '--no-newline'] let s:paste['+'] = 'wl-paste --no-newline'
let s:copy['*'] = ['wl-copy', '--foreground', '--primary', '--type', 'text/plain'] let s:copy['*'] = 'wl-copy --foreground --primary --type text/plain'
let s:paste['*'] = ['wl-paste', '--no-newline', '--primary'] let s:paste['*'] = 'wl-paste --no-newline --primary'
return 'wl-copy' return 'wl-copy'
elseif !empty($DISPLAY) && executable('xclip') elseif exists('$DISPLAY') && executable('xclip')
let s:copy['+'] = ['xclip', '-quiet', '-i', '-selection', 'clipboard'] let s:copy['+'] = 'xclip -quiet -i -selection clipboard'
let s:paste['+'] = ['xclip', '-o', '-selection', 'clipboard'] let s:paste['+'] = 'xclip -o -selection clipboard'
let s:copy['*'] = ['xclip', '-quiet', '-i', '-selection', 'primary'] let s:copy['*'] = 'xclip -quiet -i -selection primary'
let s:paste['*'] = ['xclip', '-o', '-selection', 'primary'] let s:paste['*'] = 'xclip -o -selection primary'
return 'xclip' return 'xclip'
elseif !empty($DISPLAY) && executable('xsel') && s:cmd_ok('xsel -o -b') elseif exists('$DISPLAY') && executable('xsel') && s:cmd_ok('xsel -o -b')
let s:copy['+'] = ['xsel', '--nodetach', '-i', '-b'] let s:copy['+'] = 'xsel --nodetach -i -b'
let s:paste['+'] = ['xsel', '-o', '-b'] let s:paste['+'] = 'xsel -o -b'
let s:copy['*'] = ['xsel', '--nodetach', '-i', '-p'] let s:copy['*'] = 'xsel --nodetach -i -p'
let s:paste['*'] = ['xsel', '-o', '-p'] let s:paste['*'] = 'xsel -o -p'
return 'xsel' return 'xsel'
elseif executable('lemonade') elseif executable('lemonade')
let s:copy['+'] = ['lemonade', 'copy'] let s:copy['+'] = 'lemonade copy'
let s:paste['+'] = ['lemonade', 'paste'] let s:paste['+'] = 'lemonade paste'
let s:copy['*'] = ['lemonade', 'copy'] let s:copy['*'] = 'lemonade copy'
let s:paste['*'] = ['lemonade', 'paste'] let s:paste['*'] = 'lemonade paste'
return 'lemonade' return 'lemonade'
elseif executable('doitclient') elseif executable('doitclient')
let s:copy['+'] = ['doitclient', 'wclip'] let s:copy['+'] = 'doitclient wclip'
let s:paste['+'] = ['doitclient', 'wclip', '-r'] let s:paste['+'] = 'doitclient wclip -r'
let s:copy['*'] = s:copy['+'] let s:copy['*'] = s:copy['+']
let s:paste['*'] = s:paste['+'] let s:paste['*'] = s:paste['+']
return 'doitclient' return 'doitclient'
elseif executable('win32yank.exe') elseif executable('win32yank.exe')
if has('wsl') && getftype(exepath('win32yank.exe')) == 'link' let s:copy['+'] = 'win32yank.exe -i --crlf'
let win32yank = resolve(exepath('win32yank.exe')) let s:paste['+'] = 'win32yank.exe -o --lf'
else
let win32yank = 'win32yank.exe'
endif
let s:copy['+'] = [win32yank, '-i', '--crlf']
let s:paste['+'] = [win32yank, '-o', '--lf']
let s:copy['*'] = s:copy['+'] let s:copy['*'] = s:copy['+']
let s:paste['*'] = s:paste['+'] let s:paste['*'] = s:paste['+']
return 'win32yank' return 'win32yank'
elseif executable('termux-clipboard-set') elseif exists('$TMUX') && executable('tmux')
let s:copy['+'] = ['termux-clipboard-set'] let s:copy['+'] = 'tmux load-buffer -'
let s:paste['+'] = ['termux-clipboard-get'] let s:paste['+'] = 'tmux save-buffer -'
let s:copy['*'] = s:copy['+']
let s:paste['*'] = s:paste['+']
return 'termux-clipboard'
elseif !empty($TMUX) && executable('tmux')
let s:copy['+'] = ['tmux', 'load-buffer', '-']
let s:paste['+'] = ['tmux', 'save-buffer', '-']
let s:copy['*'] = s:copy['+'] let s:copy['*'] = s:copy['+']
let s:paste['*'] = s:paste['+'] let s:paste['*'] = s:paste['+']
return 'tmux' return 'tmux'
@@ -156,16 +136,7 @@ function! s:clipboard.get(reg) abort
elseif s:selections[a:reg].owner > 0 elseif s:selections[a:reg].owner > 0
return s:selections[a:reg].data return s:selections[a:reg].data
end end
return s:try_cmd(s:paste[a:reg])
let clipboard_data = s:try_cmd(s:paste[a:reg])
if match(&clipboard, '\v(unnamed|unnamedplus)') >= 0
\ && type(clipboard_data) == v:t_list
\ && get(s:selections[a:reg].data, 0, []) ==# clipboard_data
" When system clipboard return is same as our cache return the cache
" as it contains regtype information
return s:selections[a:reg].data
end
return clipboard_data
endfunction endfunction
function! s:clipboard.set(lines, regtype, reg) abort function! s:clipboard.set(lines, regtype, reg) abort
@@ -184,9 +155,6 @@ function! s:clipboard.set(lines, regtype, reg) abort
if s:cache_enabled == 0 if s:cache_enabled == 0
call s:try_cmd(s:copy[a:reg], a:lines) call s:try_cmd(s:copy[a:reg], a:lines)
"Cache it anyway we can compare it later to get regtype of the yank
let s:selections[a:reg] = copy(s:selection)
let s:selections[a:reg].data = [a:lines, a:regtype]
return 0 return 0
end end
@@ -196,17 +164,14 @@ function! s:clipboard.set(lines, regtype, reg) abort
let s:selections[a:reg] = copy(s:selection) let s:selections[a:reg] = copy(s:selection)
let selection = s:selections[a:reg] let selection = s:selections[a:reg]
let selection.data = [a:lines, a:regtype] let selection.data = [a:lines, a:regtype]
let selection.argv = s:copy[a:reg] let argv = split(s:copy[a:reg], " ")
let selection.argv = argv
let selection.detach = s:cache_enabled let selection.detach = s:cache_enabled
let selection.cwd = "/" let selection.cwd = "/"
let jobid = jobstart(selection.argv, selection) let jobid = jobstart(argv, selection)
if jobid > 0 if jobid > 0
call jobsend(jobid, a:lines) call jobsend(jobid, a:lines)
call jobclose(jobid, 'stdin') call jobclose(jobid, 'stdin')
" xclip does not close stdout when receiving input via stdin
if selection.argv[0] ==# 'xclip'
call jobclose(jobid, 'stdout')
endif
let selection.owner = jobid let selection.owner = jobid
let ret = 1 let ret = 1
else else

View File

@@ -48,15 +48,14 @@ function! provider#node#can_inspect() abort
endfunction endfunction
function! provider#node#Detect() abort function! provider#node#Detect() abort
let minver = [6, 0]
if exists('g:node_host_prog') if exists('g:node_host_prog')
return [expand(g:node_host_prog, v:true), ''] return expand(g:node_host_prog)
endif endif
if !executable('node') if !executable('node')
return ['', 'node not found (or not executable)'] return ''
endif endif
if !s:is_minimum_version(v:null, minver[0], minver[1]) if !s:is_minimum_version(v:null, 6, 0)
return ['', printf('node version %s.%s not found', minver[0], minver[1])] return ''
endif endif
let npm_opts = {} let npm_opts = {}
@@ -76,7 +75,7 @@ function! provider#node#Detect() abort
if has('unix') if has('unix')
let yarn_default_path = $HOME . '/.config/yarn/global/' . yarn_opts.entry_point let yarn_default_path = $HOME . '/.config/yarn/global/' . yarn_opts.entry_point
if filereadable(yarn_default_path) if filereadable(yarn_default_path)
return [yarn_default_path, ''] return yarn_default_path
endif endif
endif endif
let yarn_opts.job_id = jobstart('yarn global dir', yarn_opts) let yarn_opts.job_id = jobstart('yarn global dir', yarn_opts)
@@ -86,18 +85,18 @@ function! provider#node#Detect() abort
if !empty(npm_opts) if !empty(npm_opts)
let result = jobwait([npm_opts.job_id]) let result = jobwait([npm_opts.job_id])
if result[0] == 0 && npm_opts.result != '' if result[0] == 0 && npm_opts.result != ''
return [npm_opts.result, ''] return npm_opts.result
endif endif
endif endif
if !empty(yarn_opts) if !empty(yarn_opts)
let result = jobwait([yarn_opts.job_id]) let result = jobwait([yarn_opts.job_id])
if result[0] == 0 && yarn_opts.result != '' if result[0] == 0 && yarn_opts.result != ''
return [yarn_opts.result, ''] return yarn_opts.result
endif endif
endif endif
return ['', 'failed to detect node'] return ''
endfunction endfunction
function! provider#node#Prog() abort function! provider#node#Prog() abort
@@ -143,7 +142,7 @@ endfunction
let s:err = '' let s:err = ''
let [s:prog, s:_] = provider#node#Detect() let s:prog = provider#node#Detect()
let g:loaded_node_provider = empty(s:prog) ? 1 : 2 let g:loaded_node_provider = empty(s:prog) ? 1 : 2
if g:loaded_node_provider != 2 if g:loaded_node_provider != 2

View File

@@ -1,83 +0,0 @@
if exists('s:loaded_perl_provider')
finish
endif
let s:loaded_perl_provider = 1
function! provider#perl#Detect() abort
" use g:perl_host_prog if set or check if perl is on the path
let prog = exepath(get(g:, 'perl_host_prog', 'perl'))
if empty(prog)
return ['', '']
endif
" if perl is available, make sure we have 5.22+
call system([prog, '-e', 'use v5.22'])
if v:shell_error
return ['', 'Perl version is too old, 5.22+ required']
endif
" if perl is available, make sure the required module is available
call system([prog, '-W', '-MNeovim::Ext', '-e', ''])
if v:shell_error
return ['', '"Neovim::Ext" cpan module is not installed']
endif
return [prog, '']
endfunction
function! provider#perl#Prog() abort
return s:prog
endfunction
function! provider#perl#Require(host) abort
if s:err != ''
echoerr s:err
return
endif
let prog = provider#perl#Prog()
let args = [s:prog, '-e', 'use Neovim::Ext; start_host();']
" Collect registered perl plugins into args
let perl_plugins = remote#host#PluginsForHost(a:host.name)
for plugin in perl_plugins
call add(args, plugin.path)
endfor
return provider#Poll(args, a:host.orig_name, '$NVIM_PERL_LOG_FILE')
endfunction
function! provider#perl#Call(method, args) abort
if s:err != ''
echoerr s:err
return
endif
if !exists('s:host')
try
let s:host = remote#host#Require('legacy-perl-provider')
catch
let s:err = v:exception
echohl WarningMsg
echomsg v:exception
echohl None
return
endtry
endif
return call('rpcrequest', insert(insert(a:args, 'perl_'.a:method), s:host))
endfunction
let [s:prog, s:err] = provider#perl#Detect()
let g:loaded_perl_provider = empty(s:prog) ? 1 : 2
if g:loaded_perl_provider != 2
let s:err = 'Cannot find perl or the required perl module'
endif
" The perl provider plugin will run in a separate instance of the perl
" host.
call remote#host#RegisterClone('legacy-perl-provider', 'perl')
call remote#host#RegisterPlugin('legacy-perl-provider', 'ScriptHost.pm', [])

View File

@@ -10,8 +10,7 @@ function! provider#pythonx#Require(host) abort
" Python host arguments " Python host arguments
let prog = (ver == '2' ? provider#python#Prog() : provider#python3#Prog()) let prog = (ver == '2' ? provider#python#Prog() : provider#python3#Prog())
let args = [prog, '-c', 'import sys; sys.path = list(filter(lambda x: x != "", sys.path)); import neovim; neovim.start_host()'] let args = [prog, '-c', 'import sys; sys.path.remove(""); import neovim; neovim.start_host()']
" Collect registered Python plugins into args " Collect registered Python plugins into args
let python_plugins = remote#host#PluginsForHost(a:host.name) let python_plugins = remote#host#PluginsForHost(a:host.name)
@@ -19,18 +18,18 @@ function! provider#pythonx#Require(host) abort
call add(args, plugin.path) call add(args, plugin.path)
endfor endfor
return provider#Poll(args, a:host.orig_name, '$NVIM_PYTHON_LOG_FILE', {'overlapped': v:true}) return provider#Poll(args, a:host.orig_name, '$NVIM_PYTHON_LOG_FILE')
endfunction endfunction
function! s:get_python_executable_from_host_var(major_version) abort function! s:get_python_executable_from_host_var(major_version) abort
return expand(get(g:, 'python'.(a:major_version == 3 ? '3' : '').'_host_prog', ''), v:true) return expand(get(g:, 'python'.(a:major_version == 3 ? '3' : '').'_host_prog', ''))
endfunction endfunction
function! s:get_python_candidates(major_version) abort function! s:get_python_candidates(major_version) abort
return { return {
\ 2: ['python2', 'python2.7', 'python2.6', 'python'], \ 2: ['python2', 'python2.7', 'python2.6', 'python'],
\ 3: ['python3', 'python3.10', 'python3.9', 'python3.8', 'python3.7', \ 3: ['python3', 'python3.7', 'python3.6', 'python3.5', 'python3.4', 'python3.3',
\ 'python3.6', 'python'] \ 'python']
\ }[a:major_version] \ }[a:major_version]
endfunction endfunction
@@ -44,7 +43,7 @@ function! provider#pythonx#DetectByModule(module, major_version) abort
let python_exe = s:get_python_executable_from_host_var(a:major_version) let python_exe = s:get_python_executable_from_host_var(a:major_version)
if !empty(python_exe) if !empty(python_exe)
return [exepath(expand(python_exe, v:true)), ''] return [python_exe, '']
endif endif
let candidates = s:get_python_candidates(a:major_version) let candidates = s:get_python_candidates(a:major_version)
@@ -67,7 +66,7 @@ endfunction
function! s:import_module(prog, module) abort function! s:import_module(prog, module) abort
let prog_version = system([a:prog, '-c' , printf( let prog_version = system([a:prog, '-c' , printf(
\ 'import sys; ' . \ 'import sys; ' .
\ 'sys.path = list(filter(lambda x: x != "", sys.path)); ' . \ 'sys.path.remove(""); ' .
\ 'sys.stdout.write(str(sys.version_info[0]) + "." + str(sys.version_info[1])); ' . \ 'sys.stdout.write(str(sys.version_info[0]) + "." + str(sys.version_info[1])); ' .
\ 'import pkgutil; ' . \ 'import pkgutil; ' .
\ 'exit(2*int(pkgutil.get_loader("%s") is None))', \ 'exit(2*int(pkgutil.get_loader("%s") is None))',
@@ -96,7 +95,7 @@ function! provider#pythonx#CheckForModule(prog, module, major_version) abort
if prog_version !~ '^' . a:major_version if prog_version !~ '^' . a:major_version
return [0, prog_path . ' is Python ' . prog_version . ' and cannot provide Python ' return [0, prog_path . ' is Python ' . prog_version . ' and cannot provide Python '
\ . a:major_version . '.'] \ . a:major_version . '.']
elseif prog_version =~ '^' . a:major_version && str2nr(prog_version[2:]) < str2nr(min_version[2:]) elseif prog_version =~ '^' . a:major_version && prog_version < min_version
return [0, prog_path . ' is Python ' . prog_version . ' and cannot provide Python >= ' return [0, prog_path . ' is Python ' . prog_version . ' and cannot provide Python >= '
\ . min_version . '.'] \ . min_version . '.']
endif endif

View File

@@ -5,8 +5,7 @@ endif
let g:loaded_ruby_provider = 1 let g:loaded_ruby_provider = 1
function! provider#ruby#Detect() abort function! provider#ruby#Detect() abort
let e = empty(s:prog) ? 'missing ruby or ruby-host' : '' return s:prog
return [s:prog, e]
endfunction endfunction
function! provider#ruby#Prog() abort function! provider#ruby#Prog() abort
@@ -46,7 +45,7 @@ endfunction
function! s:detect() function! s:detect()
if exists("g:ruby_host_prog") if exists("g:ruby_host_prog")
return expand(g:ruby_host_prog, v:true) return expand(g:ruby_host_prog)
elseif has('win32') elseif has('win32')
return exepath('neovim-ruby-host.bat') return exepath('neovim-ruby-host.bat')
else else

View File

@@ -1,8 +1,7 @@
"python3complete.vim - Omni Completion for python "python3complete.vim - Omni Completion for python
" Maintainer: <vacancy> " Maintainer: Aaron Griffin <aaronmgriffin@gmail.com>
" Previous Maintainer: Aaron Griffin <aaronmgriffin@gmail.com>
" Version: 0.9 " Version: 0.9
" Last Updated: 2020 Oct 9 " Last Updated: 18 Jun 2009 (small fix 2015 Sep 14 from Debian)
" "
" Roland Puntaier: this file contains adaptations for python3 and is parallel to pythoncomplete.vim " Roland Puntaier: this file contains adaptations for python3 and is parallel to pythoncomplete.vim
" "
@@ -84,7 +83,7 @@ function! python3complete#Complete(findstart, base)
break break
endif endif
endwhile endwhile
execute "py3 vimpy3complete('" . escape(cword, "'") . "', '" . escape(a:base, "'") . "')" execute "py3 vimpy3complete('" . cword . "', '" . a:base . "')"
return g:python3complete_completions return g:python3complete_completions
endif endif
endfunction endfunction
@@ -173,7 +172,7 @@ class Completer(object):
pass pass
if len(arg_text) == 0: if len(arg_text) == 0:
# The doc string sometimes contains the function signature # The doc string sometimes contains the function signature
# this works for a lot of C modules that are part of the # this works for alot of C modules that are part of the
# standard library # standard library
doc = func_obj.__doc__ doc = func_obj.__doc__
if doc: if doc:

View File

@@ -1,8 +1,7 @@
"pythoncomplete.vim - Omni Completion for python "pythoncomplete.vim - Omni Completion for python
" Maintainer: <vacancy> " Maintainer: Aaron Griffin <aaronmgriffin@gmail.com>
" Previous Maintainer: Aaron Griffin <aaronmgriffin@gmail.com>
" Version: 0.9 " Version: 0.9
" Last Updated: 2020 Oct 9 " Last Updated: 18 Jun 2009
" "
" Changes " Changes
" TODO: " TODO:
@@ -82,7 +81,7 @@ function! pythoncomplete#Complete(findstart, base)
break break
endif endif
endwhile endwhile
execute "python vimcomplete('" . escape(cword, "'") . "', '" . escape(a:base, "'") . "')" execute "python vimcomplete('" . cword . "', '" . a:base . "')"
return g:pythoncomplete_completions return g:pythoncomplete_completions
endif endif
endfunction endfunction
@@ -191,7 +190,7 @@ class Completer(object):
pass pass
if len(arg_text) == 0: if len(arg_text) == 0:
# The doc string sometimes contains the function signature # The doc string sometimes contains the function signature
# this works for a lot of C modules that are part of the # this works for alot of C modules that are part of the
# standard library # standard library
doc = func_obj.__doc__ doc = func_obj.__doc__
if doc: if doc:

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