mirror of https://github.com/neovim/neovim.git
Compare commits
5 Commits
06ccb4485f
...
4a3a7a79be
Author | SHA1 | Date |
---|---|---|
dundargoc | 4a3a7a79be | |
Maria José Solano | efb44e0cad | |
zeertzjq | e948d7feba | |
dundargoc | f6953e2333 | |
dundargoc | 172247710a |
|
@ -1,22 +1,6 @@
|
|||
if exists('g:loaded_node_provider')
|
||||
finish
|
||||
endif
|
||||
let g:loaded_node_provider = 1
|
||||
|
||||
function! s:is_minimum_version(version, min_version) abort
|
||||
if empty(a:version)
|
||||
let nodejs_version = get(split(system(['node', '-v']), "\n"), 0, '')
|
||||
if v:shell_error || nodejs_version[0] !=# 'v'
|
||||
return 0
|
||||
endif
|
||||
else
|
||||
let nodejs_version = a:version
|
||||
endif
|
||||
" Remove surrounding junk. Example: 'v4.12.0' => '4.12.0'
|
||||
let nodejs_version = matchstr(nodejs_version, '\(\d\.\?\)\+')
|
||||
" [major, minor, patch]
|
||||
return !v:lua.vim.version.lt(nodejs_version, a:min_version)
|
||||
endfunction
|
||||
|
||||
let s:NodeHandler = {
|
||||
\ 'stdout_buffered': v:true,
|
||||
|
@ -28,21 +12,6 @@ function! s:NodeHandler.on_exit(job_id, data, event) abort
|
|||
let self.result = filereadable(entry_point) ? entry_point : ''
|
||||
endfunction
|
||||
|
||||
" Support for --inspect-brk requires node 6.12+ or 7.6+ or 8+
|
||||
" Return 1 if it is supported
|
||||
" Return 0 otherwise
|
||||
function! provider#node#can_inspect() abort
|
||||
if !executable('node')
|
||||
return 0
|
||||
endif
|
||||
let ver = get(split(system(['node', '-v']), "\n"), 0, '')
|
||||
if v:shell_error || ver[0] !=# 'v'
|
||||
return 0
|
||||
endif
|
||||
return (ver[1] ==# '6' && s:is_minimum_version(ver, '6.12.0'))
|
||||
\ || s:is_minimum_version(ver, '7.6.0')
|
||||
endfunction
|
||||
|
||||
function! provider#node#Detect() abort
|
||||
let minver = '6.0.0'
|
||||
if exists('g:node_host_prog')
|
||||
|
@ -51,17 +20,10 @@ function! provider#node#Detect() abort
|
|||
if !executable('node')
|
||||
return ['', 'node not found (or not executable)']
|
||||
endif
|
||||
if !s:is_minimum_version(v:null, minver)
|
||||
if !v:lua.vim.provider.node.is_minimum_version(v:null, minver)
|
||||
return ['', printf('node version %s not found', minver)]
|
||||
endif
|
||||
|
||||
let npm_opts = {}
|
||||
if executable('npm')
|
||||
let npm_opts = deepcopy(s:NodeHandler)
|
||||
let npm_opts.entry_point = '/neovim/bin/cli.js'
|
||||
let npm_opts.job_id = jobstart('npm --loglevel silent root -g', npm_opts)
|
||||
endif
|
||||
|
||||
let yarn_opts = {}
|
||||
if executable('yarn')
|
||||
let yarn_opts = deepcopy(s:NodeHandler)
|
||||
|
@ -76,21 +38,6 @@ function! provider#node#Detect() abort
|
|||
let yarn_opts.job_id = jobstart('yarn global dir', yarn_opts)
|
||||
endif
|
||||
|
||||
let pnpm_opts = {}
|
||||
if executable('pnpm')
|
||||
let pnpm_opts = deepcopy(s:NodeHandler)
|
||||
let pnpm_opts.entry_point = '/neovim/bin/cli.js'
|
||||
let pnpm_opts.job_id = jobstart('pnpm --loglevel silent root -g', pnpm_opts)
|
||||
endif
|
||||
|
||||
" npm returns the directory faster, so let's check that first
|
||||
if !empty(npm_opts)
|
||||
let result = jobwait([npm_opts.job_id])
|
||||
if result[0] == 0 && npm_opts.result != ''
|
||||
return [npm_opts.result, '']
|
||||
endif
|
||||
endif
|
||||
|
||||
if !empty(yarn_opts)
|
||||
let result = jobwait([yarn_opts.job_id])
|
||||
if result[0] == 0 && yarn_opts.result != ''
|
||||
|
@ -98,6 +45,13 @@ function! provider#node#Detect() abort
|
|||
endif
|
||||
endif
|
||||
|
||||
let pnpm_opts = {}
|
||||
if executable('pnpm')
|
||||
let pnpm_opts = deepcopy(s:NodeHandler)
|
||||
let pnpm_opts.entry_point = '/neovim/bin/cli.js'
|
||||
let pnpm_opts.job_id = jobstart('pnpm --loglevel silent root -g', pnpm_opts)
|
||||
endif
|
||||
|
||||
if !empty(pnpm_opts)
|
||||
let result = jobwait([pnpm_opts.job_id])
|
||||
if result[0] == 0 && pnpm_opts.result != ''
|
||||
|
@ -105,57 +59,18 @@ function! provider#node#Detect() abort
|
|||
endif
|
||||
endif
|
||||
|
||||
return ['', 'failed to detect node']
|
||||
endfunction
|
||||
|
||||
function! provider#node#Prog() abort
|
||||
return s:prog
|
||||
return v:lua.vim.provider.node.detect()
|
||||
endfunction
|
||||
|
||||
function! provider#node#Require(host) abort
|
||||
if s:err != ''
|
||||
echoerr s:err
|
||||
return
|
||||
endif
|
||||
|
||||
let args = ['node']
|
||||
|
||||
if !empty($NVIM_NODE_HOST_DEBUG) && provider#node#can_inspect()
|
||||
call add(args, '--inspect-brk')
|
||||
endif
|
||||
|
||||
call add(args, provider#node#Prog())
|
||||
|
||||
return provider#Poll(args, a:host.orig_name, '$NVIM_NODE_LOG_FILE')
|
||||
return v:lua.vim.provider.node.require(a:host)
|
||||
endfunction
|
||||
|
||||
function! provider#node#Call(method, args) abort
|
||||
if s:err != ''
|
||||
echoerr s:err
|
||||
return
|
||||
endif
|
||||
|
||||
if !exists('s:host')
|
||||
try
|
||||
let s:host = remote#host#Require('node')
|
||||
catch
|
||||
let s:err = v:exception
|
||||
echohl WarningMsg
|
||||
echomsg v:exception
|
||||
echohl None
|
||||
return
|
||||
endtry
|
||||
endif
|
||||
return call('rpcrequest', insert(insert(a:args, 'node_'.a:method), s:host))
|
||||
return v:lua.vim.provider.node.call(a:method, a:args)
|
||||
endfunction
|
||||
|
||||
|
||||
let s:err = ''
|
||||
let [s:prog, s:_] = provider#node#Detect()
|
||||
let g:loaded_node_provider = empty(s:prog) ? 1 : 2
|
||||
|
||||
if g:loaded_node_provider != 2
|
||||
let s:err = 'Cannot find the "neovim" node package. Try :checkhealth'
|
||||
endif
|
||||
|
||||
call remote#host#RegisterPlugin('node-provider', 'node', [])
|
||||
call v:lua.vim.provider.node.start()
|
||||
|
|
|
@ -3014,7 +3014,7 @@ getscriptinfo([{opts}]) *getscriptinfo()*
|
|||
|
||||
Examples: >vim
|
||||
echo getscriptinfo({'name': 'myscript'})
|
||||
echo getscriptinfo({'sid': 15}).variables
|
||||
echo getscriptinfo({'sid': 15})[0].variables
|
||||
<
|
||||
|
||||
gettabinfo([{tabnr}]) *gettabinfo()*
|
||||
|
|
|
@ -33,7 +33,7 @@ function M.check()
|
|||
-- Skip further checks, they are nonsense if nodejs is too old.
|
||||
return
|
||||
end
|
||||
if vim.fn['provider#node#can_inspect']() == 0 then
|
||||
if not require('vim.provider.node').can_inspect() then
|
||||
health.warn(
|
||||
'node.js on this system does not support --inspect-brk so $NVIM_NODE_HOST_DEBUG is ignored.'
|
||||
)
|
||||
|
|
|
@ -124,7 +124,7 @@ error('Cannot require a meta file')
|
|||
--- @field commalist boolean
|
||||
--- @field flaglist boolean
|
||||
--- @field was_set boolean
|
||||
--- @field last_set_id integer
|
||||
--- @field last_set_sid integer
|
||||
--- @field last_set_linenr integer
|
||||
--- @field last_set_chan integer
|
||||
--- @field type 'string'|'boolean'|'number'
|
||||
|
|
|
@ -127,3 +127,11 @@
|
|||
--- @field skipcol integer
|
||||
--- @field topfill integer
|
||||
--- @field topline integer
|
||||
|
||||
--- @class vim.fn.getscriptinfo.ret
|
||||
--- @field autoload false
|
||||
--- @field functions? string[]
|
||||
--- @field name string
|
||||
--- @field sid string
|
||||
--- @field variables? table<string, any>
|
||||
--- @field version 1
|
||||
|
|
|
@ -3628,11 +3628,11 @@ function vim.fn.getregtype(regname) end
|
|||
---
|
||||
--- Examples: >vim
|
||||
--- echo getscriptinfo({'name': 'myscript'})
|
||||
--- echo getscriptinfo({'sid': 15}).variables
|
||||
--- echo getscriptinfo({'sid': 15})[0].variables
|
||||
--- <
|
||||
---
|
||||
--- @param opts? table
|
||||
--- @return any
|
||||
--- @return vim.fn.getscriptinfo.ret[]
|
||||
function vim.fn.getscriptinfo(opts) end
|
||||
|
||||
--- If {tabnr} is not specified, then information about all the
|
||||
|
|
|
@ -310,6 +310,7 @@ local function is_empty_or_default(bufnr, option)
|
|||
end
|
||||
|
||||
local info = api.nvim_get_option_info2(option, { buf = bufnr })
|
||||
---@param e vim.fn.getscriptinfo.ret
|
||||
local scriptinfo = vim.tbl_filter(function(e)
|
||||
return e.sid == info.last_set_sid
|
||||
end, vim.fn.getscriptinfo())
|
||||
|
@ -515,7 +516,7 @@ local function buf_attach(bufnr)
|
|||
textDocument = {
|
||||
uri = uri,
|
||||
},
|
||||
reason = protocol.TextDocumentSaveReason.Manual,
|
||||
reason = protocol.TextDocumentSaveReason.Manual, ---@type integer
|
||||
}
|
||||
if vim.tbl_get(client.server_capabilities, 'textDocumentSync', 'willSave') then
|
||||
client.notify(ms.textDocument_willSave, params)
|
||||
|
@ -899,7 +900,7 @@ end
|
|||
--- a `client_id:result` map.
|
||||
---@return function cancel Function that cancels all requests.
|
||||
function lsp.buf_request_all(bufnr, method, params, handler)
|
||||
local results = {} --- @type table<integer,{error:string, result:any}>
|
||||
local results = {} --- @type table<integer,{error:lsp.ResponseError, result:any}>
|
||||
local result_count = 0
|
||||
local expected_result_count = 0
|
||||
|
||||
|
@ -940,7 +941,7 @@ end
|
|||
---@return table<integer, {err: lsp.ResponseError, result: any}>? result Map of client_id:request_result.
|
||||
---@return string? err On timeout, cancel, or error, `err` is a string describing the failure reason, and `result` is nil.
|
||||
function lsp.buf_request_sync(bufnr, method, params, timeout_ms)
|
||||
local request_results
|
||||
local request_results ---@type table
|
||||
|
||||
local cancel = lsp.buf_request_all(bufnr, method, params, function(it)
|
||||
request_results = it
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
local M = vim._defer_require('vim.provider', {
|
||||
node = ..., --- @module 'vim.provider.node'
|
||||
perl = ..., --- @module 'vim.provider.perl'
|
||||
python = ..., --- @module 'vim.provider.python'
|
||||
ruby = ..., --- @module 'vim.provider.ruby'
|
||||
|
|
|
@ -0,0 +1,85 @@
|
|||
local M = {}
|
||||
local s_err ---@type string?
|
||||
local s_host ---@type string?
|
||||
|
||||
--- @param version string?
|
||||
--- @param min_version string
|
||||
--- @return boolean
|
||||
function M.is_minimum_version(version, min_version)
|
||||
local nodejs_version ---@type string?
|
||||
if version ~= nil and version ~= '' then
|
||||
local nodejs_version_system = vim.system({ 'node', '-v' }):wait()
|
||||
nodejs_version = nodejs_version_system.stdout or ''
|
||||
if nodejs_version_system.code ~= 0 or not vim.startswith(nodejs_version, 'v') then
|
||||
return false
|
||||
end
|
||||
else
|
||||
nodejs_version = version
|
||||
end
|
||||
-- Remove surrounding junk. Example: 'v4.12.0' => '4.12.0'
|
||||
nodejs_version = vim.fn.matchstr(nodejs_version, [[\(\d\.\?\)\+]])
|
||||
return vim.version.ge(nodejs_version, min_version)
|
||||
end
|
||||
|
||||
--- Support for --inspect-brk requires node 6.12+ or 7.6+ or 8+
|
||||
--- @return boolean true if it's supported
|
||||
function M.can_inspect()
|
||||
if vim.fn.executable('node') ~= 1 then
|
||||
return false
|
||||
end
|
||||
local ver_system = vim.system({ 'node', '-v' }):wait() or ''
|
||||
local ver = ver_system.stdout or ''
|
||||
if ver_system.code ~= 0 or not vim.startswith(ver, 'v') then
|
||||
return false
|
||||
end
|
||||
return (vim.startswith(ver, '6') and M.is_minimum_version(ver, '6.12.0'))
|
||||
or M.is_minimum_version(ver, '7.6.0')
|
||||
end
|
||||
|
||||
function M.detect()
|
||||
local p = vim.system({ 'npm', '--loglevel', 'silent', 'root', '-g' }):wait()
|
||||
if p.code == 0 and vim.trim(p.stdout) ~= '' then
|
||||
return { p.stdout, '' }
|
||||
end
|
||||
|
||||
-- Add yarn and pnmp code here later
|
||||
|
||||
return { '', 'failed to detect node' }
|
||||
end
|
||||
|
||||
function M.require(host)
|
||||
local args = { 'node' }
|
||||
|
||||
if vim.env.NVIM_NODE_HOST_DEBUG and M.can_inspect() then
|
||||
table.insert(args, '--inspect-brk')
|
||||
end
|
||||
|
||||
local prog = vim.fn['provider#node#Detect']()[1] ---@type any
|
||||
table.insert(args, prog)
|
||||
|
||||
return vim.fn['provider#Poll'](args, host.orig_name, '$NVIM_NODE_LOG_FILE')
|
||||
end
|
||||
|
||||
function M.call(method, args)
|
||||
if s_err then
|
||||
return
|
||||
end
|
||||
|
||||
if not s_host then
|
||||
local ok, result = pcall(vim.fn['remote#host#Require'], 'node') ---@type any, any
|
||||
if not ok then
|
||||
s_err = result
|
||||
vim.api.nvim_echo({ { result, 'WarningMsg' } }, true, {})
|
||||
return
|
||||
end
|
||||
s_host = result
|
||||
end
|
||||
|
||||
return vim.fn.rpcrequest(s_host, 'node_' .. method, unpack(args))
|
||||
end
|
||||
|
||||
function M.start()
|
||||
vim.fn['remote#host#RegisterPlugin']('node-provider', 'node', {})
|
||||
end
|
||||
|
||||
return M
|
|
@ -327,7 +327,7 @@ function M.get_captures_at_cursor(winnr)
|
|||
end
|
||||
|
||||
--- Optional keyword arguments:
|
||||
--- @class vim.treesitter.get_node.Opts
|
||||
--- @class vim.treesitter.get_node.Opts : vim.treesitter.LanguageTree.tree_for_range.Opts
|
||||
--- @inlinedoc
|
||||
---
|
||||
--- Buffer number (nil or 0 for current buffer)
|
||||
|
|
|
@ -4470,11 +4470,12 @@ M.funcs = {
|
|||
|
||||
Examples: >vim
|
||||
echo getscriptinfo({'name': 'myscript'})
|
||||
echo getscriptinfo({'sid': 15}).variables
|
||||
echo getscriptinfo({'sid': 15})[0].variables
|
||||
<
|
||||
]=],
|
||||
name = 'getscriptinfo',
|
||||
params = { { 'opts', 'table' } },
|
||||
returns = 'vim.fn.getscriptinfo.ret[]',
|
||||
signature = 'getscriptinfo([{opts}])',
|
||||
},
|
||||
gettabinfo = {
|
||||
|
|
Loading…
Reference in New Issue