Files
dotfiles/.vscode/extensions/asvetliakov.vscode-neovim-1.18.24/runtime/vscode-neovim.vim
2025-12-15 12:50:23 -05:00

157 lines
5.7 KiB
VimL

" Set global flag to allow checking in custom user config
let g:vscode = 1
" Setup runtimepath
let g:vscode_neovim_runtime = fnamemodify(resolve(expand('<sfile>:p')), ':h')
lua << EOF
-- Detect potential module conflicts
local dirs = vim.api.nvim_get_runtime_file("lua/vscode/", true)
local files = vim.api.nvim_get_runtime_file("lua/vscode.lua", true)
if #dirs > 0 or #files > 0 then
for _, file in ipairs(files) do
table.insert(dirs, file)
end
local msg = "vscode-neovim uses module name `vscode` which conflicts with existing modules. Please rename the module. "
.. table.concat(dirs, ", ")
local cmd = "await vscode.window.showErrorMessage(args)"
vim.rpcnotify(vim.g.vscode_channel, "vscode-action", "eval", { args = { cmd, msg } })
end
vim.opt.rtp:prepend(vim.g.vscode_neovim_runtime)
EOF
" Check version
lua << EOF
local MIN_VERSION = vim.g.vscode_nvim_min_version
local cmp = -1 ---@type -1|0|1
local prerelease = false
if vim.version and vim.version.parse then
local v = vim.version()
local curr = { v.major, v.minor, v.patch }
local min = vim.version.parse(MIN_VERSION)
cmp = vim.version.cmp(curr, min)
prerelease = not not v.prerelease
end
local warn = true
local msgs = {
("vscode-neovim requires nvim version %s or higher."):format(MIN_VERSION),
"Install the [latest stable version](https://github.com/neovim/neovim/releases/latest).",
}
if cmp < 0 then
-- nothing
elseif cmp == 0 and prerelease then
table.insert(msgs, 2, ("Current version is a **prerelease** of %s.").format(MIN_VERSION))
else
warn = false
end
if warn then
vim.rpcnotify(vim.g.vscode_channel, "vscode-action", "eval", {
args = { "vscode.window.showErrorMessage(args)", table.concat(msgs, " ") },
})
end
EOF
" Load altercmd
" {{{
" altercmd - Alter built-in Ex commands by your own ones
" Version: 0.0.1
" Copyright (C) 2009-2015 Kana Natsuno <http://whileimautomaton.net/>
" License: MIT license
function! s:altercmd_define(...)
let [buffer, original_name, alternate_name]
\ = (a:000[0] ==? '<buffer>' ? [] : ['']) + a:000
if original_name =~ '\['
let [original_name_head, original_name_tail] = split(original_name, '[')
let original_name_tail = substitute(original_name_tail, '\]', '', '')
else
let original_name_head = original_name
let original_name_tail = ''
endif
let original_name_tail = ' ' . original_name_tail
for i in range(len(original_name_tail))
let lhs = original_name_head . original_name_tail[1:i]
execute 'cnoreabbrev <expr>' buffer lhs
\ '(getcmdtype() == ":" && getcmdline() ==# "' . lhs . '")'
\ '?' ('"' . alternate_name . '"')
\ ':' ('"' . lhs . '"')
endfor
endfunction
command! -bar -complete=command -nargs=* AlterCommand call s:altercmd_define(<f-args>)
" }}}
" RPC and global functions
" internal
function! VSCodeExtensionNotify(cmd, ...)
call rpcnotify(g:vscode_channel, 'vscode-neovim', a:cmd, a:000)
endfunction
" apis
function! VSCodeCall(cmd, ...) abort
call luaeval('require"vscode".call(_A[1], {args = _A[2]})', [a:cmd, a:000])
endfunction
function! VSCodeNotify(cmd, ...)
call luaeval('require"vscode".action(_A[1], {args = _A[2]})', [a:cmd, a:000])
endfunction
function! VSCodeCallRange(cmd, line1, line2, leaveSelection, ...) abort
call luaeval('require"vscode".call(_A[1], { range = _A[2], restore_selection=_A[3], args = _A[4] })',
\ [a:cmd, [a:line1 - 1, a:line2 - 1], a:leaveSelection ? v:false : v:true, a:000])
endfunction
function! VSCodeNotifyRange(cmd, line1, line2, leaveSelection, ...)
call luaeval('require"vscode".action(_A[1], { range = _A[2], restore_selection=_A[3], args = _A[4] })',
\ [a:cmd, [a:line1 - 1, a:line2 - 1], a:leaveSelection ? v:false : v:true, a:000])
endfunction
function! VSCodeCallRangePos(cmd, line1, line2, pos1, pos2, leaveSelection, ...) abort
call luaeval('require"vscode".call(_A[1], { range = _A[2], restore_selection=_A[3], args = _A[4] })',
\ [a:cmd, [a:line1 - 1, a:pos1 - 1, a:line2 - 1, a:pos2 - 1], a:leaveSelection ? v:false : v:true, a:000])
endfunction
function! VSCodeNotifyRangePos(cmd, line1, line2, pos1, pos2, leaveSelection, ...)
call luaeval('require"vscode".action(_A[1], { range = _A[2], restore_selection=_A[3], args = _A[4] })',
\ [a:cmd, [a:line1 - 1, a:pos1 - 1, a:line2 - 1, a:pos2 - 1], a:leaveSelection ? v:false : v:true, a:000])
endfunction
function! s:onInsertEnter()
let reg = reg_recording()
if !empty(reg)
call VSCodeExtensionNotify('notify-recording', reg)
endif
" Hack to disable `type` unbinding during insert mode by triggering recording mode to add support for vim-visual-multi
" https://github.com/vscode-neovim/vscode-neovim/pull/1755
if exists("b:VM_Selection") && !empty(b:VM_Selection)
call VSCodeExtensionNotify('notify-recording', reg)
endif
endfunction
augroup VscodeGeneral
autocmd!
autocmd BufWinEnter * call VSCodeExtensionNotify('external-buffer', getbufinfo(bufnr())[0], &et, &ts)
autocmd InsertEnter * call <SID>onInsertEnter()
" Trigger filetype detection
autocmd BufAdd * do BufRead
autocmd VimEnter,ModeChanged * call VSCodeExtensionNotify('mode-changed', mode())
autocmd WinEnter * call VSCodeExtensionNotify('window-changed', win_getid())
" LazyVim will clear runtimepath by default. To avoid user intervention, we need to set it again.
autocmd User LazyDone let &runtimepath = g:vscode_neovim_runtime . ',' . &runtimepath
" Source config "afterInitConfig"
autocmd VimEnter * call nvim_exec2(join(v:lua.require("vscode").get_config("vscode-neovim.afterInitConfig"), "\n"), {})
augroup END
" TODO: Remove when dropping support for nvim 0.9
lua vim.islist = vim.islist or vim.tbl_islist
lua require("vscode")
runtime! vscode/**/*.{vim,lua}