Skip to content

Commit

Permalink
Add nodejs tool layer
Browse files Browse the repository at this point in the history
  • Loading branch information
rene-descartes2021 committed Jul 6, 2022
1 parent 953d9ba commit 64f18d0
Show file tree
Hide file tree
Showing 7 changed files with 204 additions and 13 deletions.
100 changes: 100 additions & 0 deletions core/autoload/spacevim/plug/nodejs.vim
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
" Will do the following checks in order of precedence:
" -Use $NODE or $NODE/node if they exist and are executable
" -check for node as vim-plug plugin (user-specific)
" -check for system-wide install of node
" -If all above fail will get node as vim-plug plugin and build it
" Changes $PATH to include node path
function! spacevim#plug#nodejs#IsBuildRequired(maj, min)
let pathsep = g:spacevim.os.windows ? ';' : ':'
" Prefer $NODE override
if exists('$NODE') && spacevim#util#IsVersionSufficient('$NODE', a:maj, a:min)
let $PATH = fnamemodify('$NODE', ':h').pathsep.$PATH
return 0
endif
" Prefer user plugin Node.js if it exists
if spacevim#util#IsVersionSufficient(g:plug_home.'/node/node', a:maj, a:min)
let $PATH = g:plug_home.'/node'.pathsep.$PATH
return 0
endif
" Last check for system-wide Node.js
if spacevim#util#IsVersionSufficient('node', a:maj, a:min)
return 0
endif
return 1
endfunction

" If no valid $NODE or systemwide node.js: build node.js dependency
function! spacevim#plug#nodejs#Build(info)
if !spacevim#load('programming')
echom "nodejs layer requires the 'programming' layer to build. Add 'programming' layer to init.spacevim"
return
endif
if g:spacevim.os.windows
echom 'Building Node.js automatically on Windows is untested and likely to fail'
echom 'Run msys2_shell.cmd or vcvars64.bat per desired ABI'
return
elseif (!exists('$CC') && executable('gcc') != 1) ||
\ executable('make') != 1 || executable('python3') != 1
echom 'Unable to build Node.js, requires a C++ compiler, make, and python3'
return
endif

echom 'Building Node.js, please wait 60+ seconds for build to start...'
let s:cwd = getcwd()

if get(g:, 'spacevim.build_deps_in_tmp', 1) && getftype('out') !~# 'dir'
" Build intermediate files to temp, vim will delete folder on exit
let temp_dir = fnamemodify(tempname(), ':p:h')
call mkdir(temp_dir.'/out', 'p')
if getftype('out') =~# 'link'
call system('rm out')
endif
call system('ln -s '.temp_dir.'/out out')
endif

let s:jobs_flag = ''
if g:spacevim.os.windows
autocmd User asyncrun.vim ++once execute('AsyncRun -mode=term -pos=tab @ .\\vcbuild openssl-no-asm')
else
let ninja_flag = ''
if executable('ninja')
let ninja_flag=' --ninja'
else
" Determine number of cores/threads for make -j, ninja autodetects
let num_threads = 4
if executable('lscpu')
let result = system("lscpu | grep -E '?^(CPU\\(s\\):|Thread\\(s\\) per core:)' | tr -s ' ' | cut -f 2 -d:")
if !v:shell_error
let num_threads = join(split(result), '*')
endif
endif
let s:jobs_flag = ' -j '.num_threads
endif
call system('./configure'.ninja_flag.' > '.temp_dir.'/nodejs_configure.log')
autocmd User asyncrun.vim ++once execute(
\ 'AsyncRun -cwd='.s:cwd.' -mode=term -pos=tab -program=make -post=call\ spacevim\#plug\#nodejs\#PostBuild(code) @'.s:jobs_flag)
endif
call timer_start(60000, { -> plug#load('asyncrun.vim') })
endfunction

function! spacevim#plug#nodejs#PostBuild(exit_code)
execute 'tcd' fnameescape(s:cwd)
unlet s:cwd s:jobs_flag
if a:exit_code == 0
call system('rm -r deps/icu-tmp node')
call rename('out/Release/node', 'node')
let pathsep = g:spacevim.os.windows ? ';' : ':'
let $PATH = g:plug_home.'/node'.pathsep.$PATH

" This sets up corepack/npm links the same as `make install` does
call system('ln -s deps/corepack/dist/corepack.js corepack')
call system('ln -s deps/npm/bin/npm-cli.js npm')
call system('ln -s deps/npm/bin/npx-cli.js npx')
call system('node corepack enable')
endif
if get(g:, 'spacevim.build_deps_in_tmp', 1)
call system('rm out')
endif
tcd -
endfunction

13 changes: 13 additions & 0 deletions core/autoload/spacevim/util.vim
Original file line number Diff line number Diff line change
Expand Up @@ -213,3 +213,16 @@ function! spacevim#util#CycleQuickfix(action, fallback) abort
normal! zz
endtry
endfunction

function! spacevim#util#IsVersionSufficient(file, maj, min) abort
if executable(a:file) == 1
let fversion = system(a:file.' --version')
if !v:shell_error
let version_parts = map(filter(split(fversion, '\v\ze\.|v'), 'v:val =~# "\\v\\d+"'), 'matchstr(v:val, "\\v\\d+")')
if len(version_parts) >= 2 && (version_parts[0] >= (a:maj+1) || (version_parts[0] == a:maj && version_parts[1] >= a:min))
return 1
endif
endif
endif
return 0
endfunction
57 changes: 44 additions & 13 deletions layers/+tools/lsp/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
<!-- vim-markdown-toc GFM -->

* [Description](#description)
* [Requrement](#requrement)
* [Install](#install)
* [Manual Language Server Installation](#manual-language-server-installation)
* [Rust](#rust)
* [Python](#python)
* [Go](#go)
Expand All @@ -14,7 +15,6 @@
* [Haskell](#haskell)
* [Lua](#lua)
* [vue](#vue)
* [Install](#install)
* [Key Bindings](#key-bindings)
* [Related Projects](#related-projects)

Expand All @@ -24,7 +24,48 @@

This layer adds supports [Language Server Protocol](https://langserver.org/).

## Requrement
## Install

To use this configuration layer, add it to your `~/.spacevim`, set it up like so:

```vim
let g:spacevim_layers = [
\ 'lsp',
\ ]
```

Currently [LanguageClient-neovim](https://github.com/autozimu/LanguageClient-neovim) is the default *language server client* when using the lsp layer.

Currently the *language server client* builtin to Neovim is not supported by space-vim [#483](https://github.com/liuchengxu/space-vim/issues/483).

To use [coc.nvim](https://github.com/neoclide/coc.nvim) or [vim-lsp](https://github.com/prabirshrestha/vim-lsp) instead of the default set `g:spacevim_lsp_engine` as desired:

```vim
let g:spacevim_layers = [
\ 'lsp',
\ ]
let g:spacevim_lsp_engine = 'coc'
let g:spacevim_lsp_engine = 'vim_lsp'
```

Note that coc.nvim is dependent on Node.js, the nodejs layer will satisfy that dependency.

If using vim-lsp as the *language server client*, this layer will handle the configuration and installation of many *language servers* for you (this layer includes the [vim-lsp-settings](https://github.com/mattn/vim-lsp-settings) plugin). On opening a file this layer will detect if there is a *language server* for that filetype and prompt you to run the command `:LspInstallServer`.

Unlike other Vim *language server clients*, LanguageClient-neovim does not include configuration and installation of *language servers*. space-vim includes some configuration for *language servers* and this client, but installation must be done manually.

Often the Yarn or npm tools are needed to retrieve a *language server* and its dependencies. For convenience space-vim includes these tools within the nodejs layer, which builds them or locates them using the `$PATH` and `$NODE` environmental variables. You may include the nodejs layer as follows (which may require the programming layer):

```vim
let g:spacevim_layers = [
\ 'programming', 'nodejs', 'lsp',
\ ]
```

## Manual Language Server Installation

If using LanguageClient-neovim, directions for the manual installation of some LSP servers are as follows. Other configuration and installation directions can be found in locations like its github wiki pages.

### Rust

Expand Down Expand Up @@ -120,16 +161,6 @@ $ luarocks install --server=http://luarocks.org/dev lua-lsp
$ npm install vue-language-server -g
```

## Install

To use this configuration layer, add it to your `~/.spacevim`.

Currently, [LanguageClient-neovim](https://github.com/autozimu/LanguageClient-neovim) is the default LS client. To use [coc.nvim](https://github.com/neoclide/coc.nvim) instead:

```vim
let g:spacevim_lsp_engine = 'coc'
```

## Key Bindings

Key Binding | Mode | Description
Expand Down
43 changes: 43 additions & 0 deletions layers/+tools/nodejs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# nodejs tool Layer

## Table of Contents

<!-- vim-markdown-toc GFM -->
* [Description](#description)
* [Install](#install)
* [MS Windows](#ms-windows)

<!-- vim-markdown-toc -->

## Description

Folowing the zero-install philosophy, this layer adds the Node.js tool, built from source if needed.

If `node` is found on $PATH, or $NODE points to `node`, and either is of
sufficient version, that will be used instead of building from source.

Node.js built with the repo requires 1.2 GiB space. Intermediate files are deleted after build.

The curated node will be added to `$PATH` for use by other plugins. Also includes yarn/npm, useful for other plugins (such as language servers) to install dependencies.

## Install

To use this layer, add it to your `~/.spacevim` as follows:

```
let g:spacevim_layers = [
\ 'programming', 'nodejs',
\ ]
```

Under appropriate conditions the plugin manager will clone and build the repository in a Vim tab.

To speed up the build and conserve disk space, the repository will be built in a temp directory which will be cleared on Vim exit. See `:help tempfile`. Set `g:spacevim.build_deps_in_tmp = 0` to disable this optimization.

### MS Windows

You have two ABI choices: MSVC (comes with Visual Studio Tools) and GNU. Your choice depends on on C/C++ libraries you want to interoperate with.

Automated building from source isn't tested. However it should use the environmental variables as defined by `msys2_shell.cmd` or `vcvars64.bat` should you run that prior to launching `vim`.

Alternatively, navigate to the plugin directory and build manually. Installing system-wide isn't required, it may be used in-place. Or install prebuilt binaries and set $PATH or $NODE accordingly.
Empty file added layers/+tools/nodejs/config.vim
Empty file.
3 changes: 3 additions & 0 deletions layers/+tools/nodejs/packages.vim
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
if spacevim#plug#nodejs#IsBuildRequired(16, 10)
MP 'nodejs/node', { 'do': function('spacevim#plug#nodejs#Build') }
endif
1 change: 1 addition & 0 deletions layers/LAYERS.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ Topic | Layer | Plugins
+tools | [file-manager](https://github.com/liuchengxu/space-vim/tree/master/layers/+tools/file-manager) | <ul><li>[Xuyuanp/nerdtree-git-plugin](https://github.com/Xuyuanp/nerdtree-git-plugin)</li><li>[danro/rename.vim](https://github.com/danro/rename.vim)</li><li>[liuchengxu/nerdtree-dash](https://github.com/liuchengxu/nerdtree-dash)</li><li>[ryanoasis/vim-devicons](https://github.com/ryanoasis/vim-devicons)</li><li>[scrooloose/nerdtree](https://github.com/scrooloose/nerdtree)</li></ul>
+tools | [fzf](https://github.com/liuchengxu/space-vim/tree/master/layers/+tools/fzf) | <ul><li>[Yggdroot/LeaderF](https://github.com/Yggdroot/LeaderF)</li><li>[junegunn/fzf](https://github.com/junegunn/fzf)</li><li>[junegunn/fzf.vim](https://github.com/junegunn/fzf.vim)</li><li>[liuchengxu/vim-clap](https://github.com/liuchengxu/vim-clap)</li></ul>
+tools | [lsp](https://github.com/liuchengxu/space-vim/tree/master/layers/+tools/lsp) | <ul><li>[autozimu/LanguageClient-neovim](https://github.com/autozimu/LanguageClient-neovim)</li><li>[mattn/vim-lsp-settings](https://github.com/mattn/vim-lsp-settings)</li><li>[neoclide/coc-neco](https://github.com/neoclide/coc-neco)</li><li>[neoclide/coc.nvim](https://github.com/neoclide/coc.nvim)</li><li>[prabirshrestha/async.vim](https://github.com/prabirshrestha/async.vim)</li><li>[prabirshrestha/vim-lsp](https://github.com/prabirshrestha/vim-lsp)</li><li>[rhysd/vim-lsp-ale](https://github.com/rhysd/vim-lsp-ale)</li></ul>
+tools | [nodejs](https://github.com/liuchengxu/space-vim/tree/master/layers/+tools/nodejs) | <ul><li>[nodejs/node](https://github.com/nodejs/node)</li></ul>
+tools | [tmux](https://github.com/liuchengxu/space-vim/tree/master/layers/+tools/tmux) | <ul><li>[christoomey/vim-tmux-navigator](https://github.com/christoomey/vim-tmux-navigator)</li><li>[jebaum/vim-tmuxify](https://github.com/jebaum/vim-tmuxify)</li><li>[lucidstack/ctrlp-tmux.vim](https://github.com/lucidstack/ctrlp-tmux.vim)</li></ul>
+tools | [ycmd](https://github.com/liuchengxu/space-vim/tree/master/layers/+tools/ycmd) | <ul><li>[rdnetto/YCM-Generator](https://github.com/rdnetto/YCM-Generator)</li><li>[ycm-core/YouCompleteMe](https://github.com/ycm-core/YouCompleteMe)</li></ul>
+version-control | [git](https://github.com/liuchengxu/space-vim/tree/master/layers/+version-control/git) | <ul><li>[junegunn/gv.vim](https://github.com/junegunn/gv.vim)</li><li>[mhinz/vim-signify](https://github.com/mhinz/vim-signify)</li><li>[tpope/vim-fugitive](https://github.com/tpope/vim-fugitive)</li></ul>
Expand Down

0 comments on commit 64f18d0

Please sign in to comment.