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 Jun 9, 2022
1 parent 79f8ddc commit c2a50b7
Show file tree
Hide file tree
Showing 6 changed files with 186 additions and 19 deletions.
51 changes: 38 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 LSP Server Installation](#manual-lsp-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,42 @@

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 LS client for Neovim, and vim-lsp is the default LS client for Vim. Currently the LSP client builtin to Neovim is not supported [#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'
```

If using vim-lsp as the LSP client, this layer will handle the installation of many LSP servers for you. On opening a file it will detect if there is a LSP server for that filetype and prompt you to run the command `:LspInstallServer`.

Often Yarn or npm are needed to retrieve the LSP 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 LSP Server Installation

If not using vim-lsp (which handles server installation for you), directions for the manual installation of some LSP servers are as follows.

### Rust

Expand Down Expand Up @@ -120,16 +155,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
5 changes: 4 additions & 1 deletion layers/+tools/lsp/packages.vim
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ function! s:vim_lsp() abort
MP 'prabirshrestha/async.vim'
MP 'prabirshrestha/vim-lsp'
MP 'mattn/vim-lsp-settings'
if spacevim#load('ale')
MP 'rhysd/vim-lsp-ale'
endif
endfunction

function! s:lcn() abort
Expand All @@ -21,6 +24,6 @@ function! s:lcn() abort
\ }
endfunction

let g:spacevim_lsp_engine = get(g:, 'spacevim_lsp_engine', 'lcn')
let g:spacevim_lsp_engine = get(g:, 'spacevim_lsp_engine', (has('nvim') ? 'lcn' : 'vim_lsp'))

call s:{g:spacevim_lsp_engine}()
32 changes: 32 additions & 0 deletions layers/+tools/nodejs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# nodejs Layer

## Table of Contents

<!-- vim-markdown-toc GFM -->
* [Description](#description)
* [Install](#install)
* [Key Bindings](#keybindings)

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

## Description

This layer adds support for the Node.js tool.

## Install

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

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

If Node.js is installed system-wide and is version >= 16.10 then that will be used. Otherwise the nodejs layer requires the programming layer to build Node.js as a dependency within vim-plug's plugged directory.

Node.js built requires approx 900 MiB space, largely intermediate files.

If you instead wish to use Node.js elsewhere (not on `$PATH`), this package will look at `$NODE` and use that if it is of sufficient version.

The curated node will be added to `$PATH` for use by other plugins. Node.js >= v16.10 also includes yarn/npm, useful for other plugins to install dependencies.
Empty file added layers/+tools/nodejs/config.vim
Empty file.
105 changes: 105 additions & 0 deletions layers/+tools/nodejs/packages.vim
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
" Check for Node.js >= v16.10
function! s:isNodeJsVersionSufficient(node)
let node_version = system(a:node.' --version')
let node_version_parts = map(filter(split(node_version, '\v\ze\.|v'), 'v:val =~ "\\v\\d+"'), 'matchstr(v:val, "\\v\\d+")')
if len(node_version_parts) >= 2 && (node_version_parts[0] > 16 || (node_version_parts[0] == 16 && node_version_parts[1] >= 10))
return 1
endif
return 0
endfunction

" 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! s:isNewNodeJsRequired()
let pathsep = g:spacevim.os.windows ? ';' : ':'
" Prefer $NODE override
if exists('$NODE')
if executable('$NODE') == 1 && s:isNodeJsVersionSufficient('$NODE')
let $PATH = fnamemodify($NODE, ':h').pathsep.$PATH
return 0
elseif executable('$NODE/node') == 1 && s:isNodeJsVersionSufficient('$NODE/node')
let $PATH = $NODE.pathsep.$PATH
return 0
endif
endif
" Prefer user/plugin Node.js if it exists
if executable(g:plug_home.'/node/node') == 1 && s:isNodeJsVersionSufficient(g:plug_home.'/node/node')
let $PATH = g:plug_home.'/node'.pathsep.$PATH
return 0
endif
" Last check for system-wide Node.js
if executable('node') == 1 && s:isNodeJsVersionSufficient('node')
return 0
endif
return 1
endfunction

" If no valid $NODE or systemwide node.js: build node.js dependency
function! BuildNodeJs(info)
if g:spacevim.os.windows
echom 'Building Node.js automatically is not supported on Windows, Build it manually or send PR'
return
endif
if (!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
if !spacevim#load('programming')
echom "nodejs layer requires the 'programming' layer to build. Add 'programming' layer to init.spacevim"
return
endif

echom 'Building Node.js, please wait... restart Vim on completion'
let ninja_flag = ''
let jobs_flag = ''
if executable('ninja')
let ninja_flag=' --ninja'
else
" Determine number of cores/threads for make -j, ninja autodetects
if executable('lscpu')
execute 'let num_threads = '.join(split(system("lscpu | grep -E '?^(CPU\\(s\\):|Thread\\(s\\) per core:)' | tr -s ' ' | cut -f 2 -d:")),'*')
else
let num_threads = 4
endif
let jobs_flag = ' -j '.num_threads
endif

" This sets up corepack/npm links as default make taget doesn't
" Could alternatively `make install` to prefix and set PATH to prefix/bin
let temp_dir = fnamemodify(tempname(), ':p:h')
call system('./configure --prefix=./build'.ninja_flag.' > '.temp_dir.'/nodejs_configure.log')

" Cache any existing Make definition and restore
let makeDefinitionTest = split(execute(':command Make'), '\n')
if len(makeDefinitionTest) > 1
let makeDefinition = split(makeDefinitionTest[2], '\s\s\+')
endif
command! -bang -nargs=* -bar Make AsyncRun -mode=term -pos=tab -program=make @ <args>
execute 'Make'.jobs_flag
delcommand Make
if exists('makeDefinition')
" Restores prior definition. Has inadequacies.
execute 'command! '.(makeDefinition[0] =~ '!' ? '-bang ' : '').(makeDefinition[0] =~ '|' ? '-bar ' : '').(makeDefinition[0] =~ 'b' ? '-buffer ' : '').(makeDefinition[0] =~ '\"' ? '-register ' : '').'-nargs='.makeDefinition[1].' Make '.makeDefinition[3]
endif
let $NODE = fnamemodify('.', ':p').'/node'
" TODO: Uncertain if correct node_modules
let $NODE_PATH = fnamemodify('.', ':p').'/tools/node_modules'
let pathsep = g:spacevim.os.windows ? ';' : ':'
let $PATH = g:plug_home.'/node'.pathsep.$PATH

" Set links which `make install` does, they're necessary for use
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")
" Make Yarn available
call system("node corepack enable")
endfunction

" isNewNodeJsRequired will add node to $PATH if needed
if s:isNewNodeJsRequired()
MP 'nodejs/node', { 'do': function('BuildNodeJs') }
endif
12 changes: 7 additions & 5 deletions layers/LAYERS.md
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
Layer Manifest
==============

Last updated: 2020-04-29 10:55:41
Last updated: 2022-06-09 15:32:49

Default layers: `fzf`, `better-defaults` and `which-key`.

Topic | Layer | Plugins
:----: | :----: | :----
+checkers | [syntax-checking](https://github.com/liuchengxu/space-vim/tree/master/layers/+checkers/syntax-checking) | <ul><li>[vim-syntastic/syntastic](https://github.com/vim-syntastic/syntastic)</li><li>[w0rp/ale](https://github.com/w0rp/ale)</li></ul>
+completion | [asyncomplete](https://github.com/liuchengxu/space-vim/tree/master/layers/+completion/asyncomplete) | <ul><li>[prabirshrestha/asyncomplete-lsp.vim](https://github.com/prabirshrestha/asyncomplete-lsp.vim)</li><li>[prabirshrestha/asyncomplete.vim](https://github.com/prabirshrestha/asyncomplete.vim)</li></ul>
+completion | [auto-completion](https://github.com/liuchengxu/space-vim/tree/master/layers/+completion/auto-completion) | <ul><li>[lifepillar/vim-mucomplete](https://github.com/lifepillar/vim-mucomplete)</li><li>[maralla/completor-neosnippet](https://github.com/maralla/completor-neosnippet)</li><li>[maralla/completor.vim](https://github.com/maralla/completor.vim)</li><li>[ncm2/float-preview.nvim](https://github.com/ncm2/float-preview.nvim)</li><li>[ncm2/ncm2](https://github.com/ncm2/ncm2)</li><li>[ncm2/ncm2-bufword](https://github.com/ncm2/ncm2-bufword)</li><li>[ncm2/ncm2-github](https://github.com/ncm2/ncm2-github)</li><li>[ncm2/ncm2-go](https://github.com/ncm2/ncm2-go)</li><li>[ncm2/ncm2-jedi](https://github.com/ncm2/ncm2-jedi)</li><li>[ncm2/ncm2-path](https://github.com/ncm2/ncm2-path)</li><li>[ncm2/ncm2-pyclang](https://github.com/ncm2/ncm2-pyclang)</li><li>[ncm2/ncm2-racer](https://github.com/ncm2/ncm2-racer)</li><li>[ncm2/ncm2-tmux](https://github.com/ncm2/ncm2-tmux)</li><li>[ncm2/ncm2-ultisnips](https://github.com/ncm2/ncm2-ultisnips)</li><li>[ncm2/ncm2-vim](https://github.com/ncm2/ncm2-vim)</li><li>[roxma/nvim-yarp](https://github.com/roxma/nvim-yarp)</li><li>[roxma/vim-hug-neovim-rpc](https://github.com/roxma/vim-hug-neovim-rpc)</li></ul>
+completion | [deoplete](https://github.com/liuchengxu/space-vim/tree/master/layers/+completion/deoplete) | <ul><li>[Shougo/deoplete.nvim](https://github.com/Shougo/deoplete.nvim)</li><li>[Shougo/neco-vim](https://github.com/Shougo/neco-vim)</li><li>[eagletmt/neco-ghc](https://github.com/eagletmt/neco-ghc)</li><li>[sebastianmarkow/deoplete-rust](https://github.com/sebastianmarkow/deoplete-rust)</li><li>[zchee/deoplete-go](https://github.com/zchee/deoplete-go)</li></ul>
+completion | [unite](https://github.com/liuchengxu/space-vim/tree/master/layers/+completion/unite) | <ul><li>[Shougo/unite.vim](https://github.com/Shougo/unite.vim)</li></ul>
+distributions | [better-defaults](https://github.com/liuchengxu/space-vim/tree/master/layers/+distributions/better-defaults) | <ul><li>[dominikduda/vim_current_word](https://github.com/dominikduda/vim_current_word)</li><li>[google/vim-searchindex](https://github.com/google/vim-searchindex)</li><li>[haya14busa/incsearch-fuzzy.vim](https://github.com/haya14busa/incsearch-fuzzy.vim)</li><li>[haya14busa/incsearch.vim](https://github.com/haya14busa/incsearch.vim)</li><li>[haya14busa/is.vim](https://github.com/haya14busa/is.vim)</li><li>[kshenoy/vim-signature](https://github.com/kshenoy/vim-signature)</li><li>[mhinz/vim-startify](https://github.com/mhinz/vim-startify)</li><li>[ntpeters/vim-better-whitespace](https://github.com/ntpeters/vim-better-whitespace)</li><li>[tpope/vim-rsi](https://github.com/tpope/vim-rsi)</li><li>[xtal8/traces.vim](https://github.com/xtal8/traces.vim)</li><li>[ybian/smartim](https://github.com/ybian/smartim)</li></ul>
+distributions | [better-defaults](https://github.com/liuchengxu/space-vim/tree/master/layers/+distributions/better-defaults) | <ul><li>[dominikduda/vim_current_word](https://github.com/dominikduda/vim_current_word)</li><li>[google/vim-searchindex](https://github.com/google/vim-searchindex)</li><li>[haya14busa/incsearch-fuzzy.vim](https://github.com/haya14busa/incsearch-fuzzy.vim)</li><li>[haya14busa/incsearch.vim](https://github.com/haya14busa/incsearch.vim)</li><li>[haya14busa/is.vim](https://github.com/haya14busa/is.vim)</li><li>[kshenoy/vim-signature](https://github.com/kshenoy/vim-signature)</li><li>[markonm/traces.vim](https://github.com/markonm/traces.vim)</li><li>[mhinz/vim-startify](https://github.com/mhinz/vim-startify)</li><li>[ntpeters/vim-better-whitespace](https://github.com/ntpeters/vim-better-whitespace)</li><li>[tpope/vim-rsi](https://github.com/tpope/vim-rsi)</li><li>[ybian/smartim](https://github.com/ybian/smartim)</li></ul>
+distributions | [spacevim](https://github.com/liuchengxu/space-vim/tree/master/layers/+distributions/spacevim) | <ul><li>[liuchengxu/eleline.vim](https://github.com/liuchengxu/eleline.vim)</li><li>[liuchengxu/space-vim-dark](https://github.com/liuchengxu/space-vim-dark)</li><li>[liuchengxu/space-vim-theme](https://github.com/liuchengxu/space-vim-theme)</li><li>[liuchengxu/vim-better-default](https://github.com/liuchengxu/vim-better-default)</li></ul>
+fun | [emoji](https://github.com/liuchengxu/space-vim/tree/master/layers/+fun/emoji) | <ul><li>[junegunn/vim-emoji](https://github.com/junegunn/vim-emoji)</li></ul>
+fun | [games](https://github.com/liuchengxu/space-vim/tree/master/layers/+fun/games) | <ul><li>[johngrib/vim-game-code-break](https://github.com/johngrib/vim-game-code-break)</li></ul>
Expand Down Expand Up @@ -47,9 +48,10 @@ Topic | Layer | Plugins
+tools | [cscope](https://github.com/liuchengxu/space-vim/tree/master/layers/+tools/cscope) | <ul><li>[romainl/vim-qf](https://github.com/romainl/vim-qf)</li></ul>
+tools | [ctags](https://github.com/liuchengxu/space-vim/tree/master/layers/+tools/ctags) | <ul><li>[ludovicchabant/vim-gutentags](https://github.com/ludovicchabant/vim-gutentags)</li></ul>
+tools | [docker](https://github.com/liuchengxu/space-vim/tree/master/layers/+tools/docker) | <ul><li>[ekalinin/Dockerfile.vim](https://github.com/ekalinin/Dockerfile.vim)</li></ul>
+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></ul>
+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><li>[tiagofumo/vim-nerdtree-syntax-highlight](https://github.com/tiagofumo/vim-nerdtree-syntax-highlight)</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><li>[vn-ki/coc-clap](https://github.com/vn-ki/coc-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 c2a50b7

Please sign in to comment.