Neovim是 Vim 的一个分支,具有更大的可扩展性和集成性。该扩展使用完全嵌入的 Neovim 实例,不再是半完整的 Vim 模拟! VSCode 的本机功能用于插入模式和编辑器命令,从而充分利用这两种编辑器。
安装如果您想从 WSL 使用 Neovim,请设置useWSL配置切换并指定 nvim 二进制文件的 Linux 路径。为此需要wsl.exeWindows 二进制文件和Linux 二进制文件。必须通过Linux 环境设置可用。用于检查正确的默认 Linux 发行版。wslpathwslpath$PATHwsl –list分配亲和力值以提高性能。Neovim 配置
由于许多 Vim 插件可能会导致 VSCode 出现问题,因此建议从空的init.vim.有关支持哪些类型的插件的指南,请参阅故障排除。
在 Github 上创建问题之前,请确保您可以使用空init.vim且无 VSCode 扩展来重现问题。
要确定 Neovim 是否在 VSCode 中运行lua api,请添加到您的init.vim:
if exists('g:vscode')
" VSCode extension
else
" ordinary Neovim
endif
在lua中:
if vim.g.vscode then
-- VSCode extension
else
-- ordinary Neovim
end
要有条件地激活插件,vim-plug有 一些解决方案。packer.nvim并lazy.nvim 内置对cond = vim.g.vscode.有关配置 Vim 插件的提示,请参阅 wiki 中的插件。
VSCode 配置 提示和功能VSCode 具体差异故障排除其他扩展
如果您遇到任何性能问题(通常是光标抖动),请确保您没有使用这些类型的扩展:
如果您不确定,请禁用所有其他扩展,重新加载 VSCode 窗口,并在报告之前查看问题是否仍然存在。
复合退出键
由于 VSCode 负责插入模式,因此自定义插入模式 Vim 映射不起作用。要映射复合转义键,请放入 keybindings.json 中:
为了jj
{
"command": "vscode-neovim.compositeEscape1",
"key": "j",
"when": "neovim.mode == insert && editorTextFocus",
"args": "j"
}
要启用jk还添加:
{
"command": "vscode-neovim.compositeEscape2",
"key": "k",
"when": "neovim.mode == insert && editorTextFocus",
"args": "k"
}
目前lua api,无法同时映射jk和kj,或者在jk不映射 的情况下进行映射jj。
跳转列表
使用 VSCode 的跳转列表而不是 Neovim 的。这是为了使 VSCode 原生导航(鼠标单击、跳转到定义等)可通过跳转列表进行导航。
如果您使用自定义映射最便宜 OpenAI api key,请确保绑定到
workbench.action.navigateBack/ 。
workbench.action.navigateForward标记(大写和小写)应该可以正常工作。
命令菜单具有类型上的通配菜单补全。 1.5 秒后出现补全选项(以免在您写入:w或时打扰您:noh)。Up/Down选择该选项并Tab接受它。看动图:
多个光标
多个游标适用于:
插入模式视线模式视觉块模式
要从视线/块模式生成多个光标,请键入ma/mA或mi/ mI (默认情况下)。效果不同:
查看实际操作中的 gif:
内置的多光标支持可能无法满足您的需求。更多多光标功能请参考插件 vscode-multi-cursor.nvim
️ API
加载模块:
local vscode = require('vscode-neovim')
vscode.action():异步执行vscode命令。vscode.call():同步执行vscode命令。vscode.on():定义一些 Nvim UI 事件的处理程序。vscode.has_config():检查 vscode 设置是否存在。vscode.get_config():获取vscode设置值。vscode.update_config():设置 vscode 设置。vscode.notify():显示 vscode 消息(另请参阅 Nvim 的vim.notify)。vscode.to_op(): 的帮手map-operator。使用方法见code_actions.luavscode.get_status_item:获取 vscode 状态栏项。可以分配属性,这会神奇地更新状态栏项目。g:vscode_clipboard:使用 VSCode 剪贴板 API 的剪贴板提供程序。在 WSL 中时默认使用。请参阅 :h g:clipboard了解更多详情。用法:let g:clipboard = g:vscode_clipboardvscode.eval():在vscode中同步计算javascript并返回结果vscode.eval_async():在 vscode 中异步评估 javascriptvscode.action(名称免费的大模型api,选项)
异步执行 vscode 命令。请参阅示例。
参数:
vscode.call(名称、选项、超时)
同步执行 vscode 命令。请参阅示例。
参数:
返回:操作的结果
例子
目前,提供了两个内置操作用于测试目的:
_ping回报”pong”_wait等待指定的毫秒数然后返回”ok”
do -- Execute _ping asynchronously and print the result
vscode.action("_ping", {
callback = function(err, res)
if err == nil then
print(res) -- outputs: pong
end
end,
})
end
-- Format current document
vscode.action("editor.action.formatDocument")
do -- Comment the three lines below the cursor
local curr_line = vim.fn.line(".") - 1 -- 0-indexed
vscode.action("editor.action.commentLine", {
range = { curr_line + 1, curr_line + 3 },
})
end
do -- Comment the previous line
local curr_line = vim.fn.line(".") - 1 -- 0-indexed
local prev_line = curr_line - 1
if prev_line >= 0 then
vscode.action("editor.action.commentLine", {
range = { prev_line , prev_line },
})
end
end
do -- Find in files for word under cursor
vscode.action("workbench.action.findInFiles", {
args = { query = vim.fn.expand('') }
})
end
-- Execute _ping synchronously and print the result
print(vscode.call("_ping")) -- outputs: pong
-- Wait for 1 second and print the return value 'ok'
print(vscode.call("_wait", { args = { 1000 } })) -- outputs: ok
-- Wait for 2 seconds with a timeout of 1 second
print(vscode.call("_wait", { args = { 2000 } }), 1000)
-- error: Call '_wait' timed out
vscode.on(事件,回调)
目前没有可供用户使用的可用事件。
VSCode 设置vscode.has_config(名称)
检查配置是否具有特定值。
参数:
返回:
vscode.get_config(名称)
获取配置值。
参数:
返回:
vscode.update_config(名称,值,目标)
更新配置值。
参数:
例子:
------------------
--- has_config ---
------------------
-- Check if the configuration "not.exist" exists
print(vscode.has_config("not.exist"))
-- Should return: false
-- Check multiple configurations
vim.print(vscode.has_config({ "not.exist", "existing.config" }))
-- Should return: { false, true }
------------------
--- get_config ---
------------------
-- Get the value of "editor.tabSize"
print(vscode.get_config("editor.tabSize")) -- a number
-- Get multiple configurations
vim.print(vscode.get_config({ "editor.fontFamily", "editor.tabSize" }))
-- Should return: { "the font family", "the editor tabSizse" }
---------------------
--- update_config ---
---------------------
-- Update the value of "editor.tabSize"
vscode.update_config("editor.tabSize", 16, "global")
-- Update multiple configurations
vscode.update_config({ "editor.fontFamily", "editor.tabSize" }, { "Fira Code", 14 })
留言vscode.notify(消息)
显示 vscode 通知
您可以设置vscode.notify为默认通知功能。
vim.notify = vscode.notify
vscode.get_status_item(id)
创建状态项
local test = vscode.get_status_item('test')
test.text = 'hello' -- Show the text
test.text = '' -- Hide the item
test.text = nil -- Close the item
test.text = '' -- error: The status item "test" has been closed
vscode.eval(代码
, opts, 超时
在 vscode 中评估 javascript 并返回结果。该代码在异步函数上下文中执行(因此await 可以使用)。使用return语句将值返回给 lua。从 lua 传递的参数可用作 args变量。评估的代码可以通过全局访问 VSCode APIvscode。
尖端:
参数:
返回:
例子:
local current_file = vscode.eval("return vscode.window.activeTextEditor.document.fileName")
local current_tab_is_pinned = vscode.eval("return vscode.window.tabGroups.activeTabGroup.activeTab.isPinned")
vscode.eval("await vscode.env.clipboard.writeText(args.text)", { args = { text = "some text" } })
vscode.eval_async(代码)
类似vscode.eval()音乐api调用,但会立即返回并在后台进行评估。
参数:
Vim脚本
注意:从 1.0.0 开始,vimscript 函数已被弃用。请改用Lua api。
️ 键绑定(快捷键)
可用于文件/滚动/窗口/选项卡管理的默认命令和绑定:
“With bang”是指加一个“!”到命令的结尾。
键绑定帮助
本文档仅提到一些特殊情况,并不是按键绑定和命令的详尽列表。使用 VSCode 和 Nvim 功能查看文档和所有定义的快捷方式:
添加按键绑定
每个特殊(control/alt)键盘快捷键都必须在 VSCode 中显式定义才能发送到 neovim。默认情况下,仅发送 Neovim 默认包含的绑定。
要将自定义绑定传递给 Neovim(例如C-h在正常模式下),请添加到 keybindings.json:
{
"command": "vscode-neovim.send",
// the key sequence to activate the binding
"key": "ctrl+h",
// don't activate during insert mode
"when": "editorTextFocus && neovim.mode != insert",
// the input to send to Neovim
"args": ""
}
禁用键绑定
切换键绑定有三种配置:
ctrlKeysForInsertMode:切换 ctrl 键进入插入模式。ctrlKeysForNormalMode:切换 ctrl 键为正常模式。editorLangIdExclusions:在某些文件类型中禁用此扩展定义的键绑定。请注意,这不会影响所有键绑定。
如果您发现这些选项不起作用,您可以手动修改 VSCode 中的键绑定(见下文)。
删除按键绑定代码导航
请参阅键绑定帮助查看所有定义的快捷方式及其文档。
editor.action.revealDefinition
也适用于 vim 帮助。
gf
editor.action.revealDeclaration
gH
editor.action.referenceSearch.trigger
gO
workbench.action.gotoSymbol
C-w gd/C-w gf
editor.action.revealDefinitionAside
gD
editor.action.peekDefinition
gF
editor.action.peekDeclaration
Tab
togglePeekWidgetFocus
在查看编辑器和参考列表之间切换。
C-n/C-p
导航列表、参数提示、建议、快速打开、命令行历史记录、查看参考列表
要指定默认的查看模式,请
editor.peekWidgetDefaultFocus在您的设置中进行修改。
资源管理器/列表导航
请参阅键绑定帮助查看所有定义的快捷方式及其文档。
资源管理器文件操作
请参阅键绑定帮助查看所有定义的快捷方式及其文档。
悬停小部件操作
请参阅键绑定帮助查看所有定义的快捷方式及其文档。
默认设置以下键绑定: 当悬停不可见时,将 K 发送到 nvim(show hoover);当悬停可见时,再次按 K 聚焦悬停小部件。
{
"command": "editor.action.showHover",
"key": "shift+k",
"when": "neovim.init && neovim.mode == normal && editorTextFocus && editorHoverVisible"
}
文件管理
该扩展将各种 Nvim 命令(:edit、:enew、:find、:write、:saveas、:wall、:quit等)别名为等效的 vscode 命令。还有它们的正常模式等效项(如果适用)C-w q,例如 等。
请参阅键绑定帮助查看所有定义的快捷方式及其文档。
标签管理
该扩展将各种 Nvim tab 命令(:tabedit, :tabnew, :tabfind, :tabclose, :tabnext, :tabprevious, :tabfirst, :tablast)别名为等效的 vscode 命令。还有它们的正常模式等效项(如果适用)gt,例如 等。
请参阅键绑定帮助查看所有定义的快捷方式及其文档。
缓冲区/窗口管理
该扩展将各种 Nvim 缓冲区/窗口命令 ( :split、:vsplit、:new、:vnew、:only) 别名为等效的 vscode 命令。还有它们的正常模式等效项(如果适用)C-w s,例如 等。
请参阅键绑定帮助查看所有定义的快捷方式及其文档。
分割尺寸分布由设置控制
workbench.editor.splitSizing。默认情况下,它是distribute,等于 vim 的equalalways和eadirection = 'both'(默认)。
要使用 VSCode 命令“增加/减少当前视图大小”而不是单独的宽度和高度绑定:
将其复制到 init.vim 中
插入模式特殊键
启用者ctrlKeysForInsertMode
默认:
“a”, “d”, “h”, “j”, “m”, “o”, “r”, “t”, “u”, “w”
请参阅键绑定帮助查看所有定义的快捷方式及其文档。
普通模式控制键
启用者ctrlKeysForNormalMode
默认:
“a”, “b”, “d”, “e”, “f”, “h”, “i”, “j”, “k”, “l”, “m”, “o”, “r”, “t”, “u”, “v”, “w”, “x”, “y”, “z”, “/”, “
请参阅键绑定帮助查看所有定义的快捷方式及其文档。
