英文原文正文为项目原始 README(英文),本站后续会翻译为中文,当前仅剔除图片与无关章节并统一排版。
VSCode Neovim
VSCode Neovim Integration
Neovim is a fork of Vim to allow greater extensibility and integration. This extension uses a fully embedded Neovim instance, no more half-complete Vim emulation! VSCode's native functionality is used for insert mode and VSCode commands, making the best use of both editors.
- 🎉 Feature-complete Vim integration (except insert-mode and some Nvim UI plugins) by utilizing Nvim as a backend.
- 🔧 Supports custom
init.luaand most Nvim plugins. - 🥇 First-class and lag-free insert mode, letting VSCode do what it does best.
- 🤝 Complete integration with VSCode features (lsp/autocompletion/snippets/multi-cursor/etc).
Table of Contents
- 🧰 Getting Started
- 💡 Tips and Features
- ⚡️ API
- vscode.action(name, opts)
- vscode.call(name, opts, timeout)
- vscode.on(event, callback)
- vscode.has_config(name)
- vscode.get_config(name)
- vscode.update_config(name, value, target)
- vscode.notify(msg)
- vscode.eval(code[, opts, timeout])
- vscode.eval_async(code[, opts])
- vscode.with_insert(callback[, ms])
- Builtin module overrides
- VimScript
- ⌨️ Keybindings (shortcuts)
- 📟 Neovim Commands
- 🎨 Highlights
- 🧰 Developing
- ❤️ Credits \& External Resources
🧰 入门
Installation
- Install the vscode-neovim extension.
- Install Neovim 0.10.0 or newer.
- (Optional) Set the Nvim path in the extension settings. You must specify the full path to Neovim, like
C:\Neovim\bin\nvim.exeor/usr/local/bin/nvim. - Choose one of the following platform-specific settings:
vscode-neovim.neovimExecutablePaths.win32vscode-neovim.neovimExecutablePaths.linuxvscode-neovim.neovimExecutablePaths.darwin
- (Optional) Set the Nvim path in the extension settings. You must specify the full path to Neovim, like
- If you want to use Neovim from WSL, set the
useWSLconfiguration toggle and specify the Linux path to the nvim binary.wsl.exeWindows binary andwslpathLinux binary are required for this.wslpathmust be available through$PATHLinux env setting. Usewsl --listto check for the correct default Linux distribution. - Assign affinity value for performance improvement.
Snap Users: If you want to use Neovim from Snap, the Neovim path must be resolved to the snap binary location. On
some systems it might be "/snap/nvim/current/usr/bin/nvim". To check if you're running as a snap package, see if
which nvimresolves to/usr/bin/snap.
Neovim configuration
Since many Vim plugins can cause issues in VSCode, it is recommended to start from an empty init.vim. For a guide for which types of plugins are supported, see troubleshooting.
Before creating an issue on Github, make sure you can reproduce the problem with an empty init.vim and no VSCode extensions.
To detect if Nvim is running in VSCode, add to your init.vim:
if exists('g:vscode')
" VSCode extension
else
" ordinary Nvim
endif
In lua:
if vim.g.vscode then
-- VSCode extension
else
-- ordinary Nvim
end
To conditionally activate plugins, the best solution is to use the LazyVim VSCode extra. However, packer.nvim and lazy.nvim have built-in support for cond = vim.g.vscode and vim-plug has a few solutions. See plugins in the wiki for tips on configuring Vim plugins.
VSCode Settings & Commands
You can view all available settings and commands by opening the vscode-neovim extension details pane, and navigating to the features tab.
💡 提示与功能
VSCode specific differences
- File and editor management commands such as
:e/:q/:vsplit/:tabnext/etc are mapped to corresponding VSCode commands and behavior may be different (see below).- Do not use vim commands like
:einscripts/keybindings.ts, they won't work. If you're using them in some
custom commands/mappings, you might need to rebind them to call VSCode commands from Neovim with
require('vscode').call()(see API). - Since version 1.18.0,
:w,:waand:savcommands are supported and no longer alias to VSCode commands. You
can use them as you would in Neovim.
- Do not use vim commands like
- When you type some commands they may be substituted for another, check AlterCommand for the list of substitutions.
- Scrolling is done by VSCode. C-d/C-u/etc are slightly different.
- Editor customization (relative line number, scrolloff, etc) is handled by VSCode.
- Dot-repeat (.) is slightly different - moving the cursor within a change range won't break the repeat. sequence. In Neovim, if you type
abc<cursor>in insert mode, then move the cursor toa<cursor>bcand type1here the repeat sequence would be1. However, in VSCode, it would bea1bc. Another difference is that when you delete some text in insert mode, dot repeat only works from right to left, meaning it will treat Del key as BS keys when running dot repeat.
Troubleshooting
- To fix intermittent problems, you can run the
Neovim: Restart Extensioncommand to restart the extension. - View the logs via
Output: Focus on Output Viewand selectvscode-neovim logs.- To enable debug logs, click the "gear" icon and select
Debug, then click it again and choose
Set As Default.
- To enable debug logs, click the "gear" icon and select
- Enable
vscode-neovim.neovimCleanin VSCode settings, which starts Nvim without your plugins (nvim --clean). Nvim plugins can do anything. Visual effects in particular can cause visual artifacts. vscode-neovim does its best to merge the visual effects of Nvim and VSCode, but it's far from perfect. You may need to disable some Nvim plugins that cause visual effects. - If you encounter rendering issues (visual artifacts), try CTRL-L to force Nvim to redraw.
- If you get the
Unable to init vscode-neovim: command 'type' already existsmessage, uninstall other VSCode extensions that useregisterTextEditorCommand("type", …)(like VSCodeVim or Overtype). - On a Mac, the h, j, k and l movement keys may not repeat when held, to fix this open Terminal and execute the following command:
defaults write com.microsoft.VSCode ApplePressAndHoldEnabled -bool false. - To fix the remapped escape key not working in Linux, set
"keyboard.dispatch": "keyCode". - Two VSCode developer commands are useful for keybindings debugging:
Developer: Toggle Keyboard Shortcuts Troubleshootingfor tracing VSCode emitted keypresses and their processing
via defined keybindings.Developer: Inspect Key Mappingfor getting the recognized mappings for the current keyboard layout inside
VSCode.
Performance
If you have any performance problems (cursor jitter usually) make sure you're not using vim plugins that increase latency and cause performance problems.
Make sure to disable unneeded plugins, as many of them don't make sense with VSCode. Specifically, you don't need any code highlighting, completion, LSP plugins, or plugins that spawn windows/buffers (nerdtree , fuzzy-finders, etc). Most navigation/textobject/editing plugins should be fine.
For example, make sure you're not using anything that renders decorators very often:
- Line number extensions (VSCode has built-in support for normal/relative line numbers)
- Indent guide extensions (VSCode has built-in indent guides)
- Brackets highlighter extensions (VSCode has built-in feature)
If you're not sure, disable all other extensions, reload VSCode window, and see if the problem persists before
reporting it.
Composite escape keys
Set with compositeKeys and tweak with compositeTimeout.
Examples: add to your settings.json:
jj to escape
{
"vscode-neovim.compositeKeys": {
"jj": {
"command": "vscode-neovim.escape",
},
},
}
jk to escape and save
{
"vscode-neovim.compositeKeys": {
"jk": {
// Use lua to execute any logic
"command": "vscode-neovim.lua",
"args": [
[
"local code = require('vscode')",
"code.action('vscode-neovim.escape')",
"code.action('workbench.action.files.save')",
],
],
},
},
}
Jumplist
VSCode's jumplist is used instead of Neovim's. This is to make VSCode native navigation (mouse click, jump to definition, etc) navigable through the jumplist.
Make sure to bind to workbench.action.navigateBack / workbench.action.navigateForward if you're using custom mappings. Marks (both upper & lowercased) should work fine.
Multiple cursors
Multiple cursors work in:
- Insert mode
- Visual line mode
- Visual block mode
To spawn multiple cursors from visual line/block modes type ma/mA or mi/mI (by default). The effect differs:
- For visual line mode, mi will start insert mode on each selected line on the first non whitespace character and ma will on the end of line.
- For visual block mode, mi will start insert on each selected line before the cursor block and ma after.
- mA/mI versions accounts for empty lines (only for visual line mode, for visual block mode they're same as ma/mi).
See gif in action:
Note: The built-in multi-cursor support may not meet your needs. Please refer to the plugin
vscode-multi-cursor.nvim for more multi-cursor features
Remote development
We intend to use vscode-neovim as a UI extension, so when you're using remote development, vscode-neovim is enabled in the Local Extension Host, and it should work out of the box.
If you prefer to use the remote environment's copy of Neovim, rather than the locally installed one, vscode-neovim should be installed in the Remote Extension Host. You can set the following in your VSCode settings.json:
{
"remote.extensionKind": {
"asvetliakov.vscode-neovim": ["workspace"]
}
}
Note: You will need to install neovim in the remote environment.
For more information:
⚡️ 应用程序接口
Load the module:
local vscode = require('vscode')
The previously used module named "vscode-neovim" is now deprecated, so don't be confused if "vscode-neovim" is used in old discussions or other resources.
vscode.action(): asynchronously executes a vscode command.vscode.call(): synchronously executes a vscode command.vscode.on(): defines a handler for some Nvim UI events.vscode.has_config(): checks if a vscode setting exists.vscode.get_config(): gets a vscode setting value.vscode.update_config(): sets a vscode setting.vscode.notify(): shows a vscode message (see also Nvim'svim.notify).vscode.to_op(): A helper formap-operator. See code_actions.lua for the usageg:vscode_clipboard: Clipboard provider using VSCode's clipboard API. Used by default when in WSL. See:h g:clipboardfor more details. Usage:vim.g.clipboard = vim.g.vscode_clipboardvscode.eval(): evaluate javascript synchronously in vscode and return the resultvscode.eval_async(): evaluate javascript asynchronously in vscodevscode.with_insert(): perform operations in insert mode.
vscode.action(name, opts)
Asynchronously executes a vscode command.
Parameters:
name(string): The name of the action, generally a vscode command.opts(table): Map of optional parameters:args(table): List of arguments passed to the vscode command. If the command only requires a single object
parameter, you can directly pass in a map-like table.- Examples:
action('foo', { args = { 'foo', 'bar', … } })action('foo', { args = { foo = bar, … } })
- Examples:
range(table): Specific range for the action. Implicitly passed in visual mode. Has three possible forms (all
values are 0-indexed):[start_line, end_line][start_line, start_character, end_line, end_character]{start = { line = start_line, character = start_character}, end = { line = end_line, character = end_character}}
restore_selection(boolean): Whether to preserve the current selection. Only valid whenrangeis specified.
Defaults totrue.callback: Function to handle the action result. Must have this signature:function(err: string|nil, ret: any):erris the error message, if anyretis the result- If no callback is provided, error will be shown as a VSCode notification.
Example: open definition aside (default binding):
nnoremap <C-w>gd <Cmd>lua require('vscode').action('editor.action.revealDefinitionAside')<CR>
Example: find in files for word under cursor (see the vscode command definition for the expected parameter format):
nnoremap ? <Cmd>lua require('vscode').action('workbench.action.findInFiles', { args = { query = vim.fn.expand('<cword>') } })<CR>
Example: use in lua script:
-- 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('<cword>') }
})
end
Currently, two built-in actions are provided for testing purposes:
_pingreturns"pong"_waitwaits for the specified milliseconds and then returns"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
vscode.call(name, opts, timeout)
Synchronously executes a vscode command.
Parameters:
name(string): The name of the action, generally a vscode command.opts(table): Same as vscode.action().timeout(number): Timeout in milliseconds. The default value is -1, which means there is no timeout.
Returns: the result of the action
Example: format selection (default binding):
xnoremap = <Cmd>lua require('vscode').call('editor.action.formatSelection')<CR>
nnoremap = <Cmd>lua require('vscode').call('editor.action.formatSelection')<CR><Esc>
nnoremap == <Cmd>lua require('vscode').call('editor.action.formatSelection')<CR>
Example: use in lua script:
-- 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(event, callback)
Currently no available events for user use.
vscode.has_config(name)
Check if configuration has a certain value.
Parameters:
name(string|string[]): The configuration name or an array of configuration names.
Returns:
boolean|boolean[]: Returnstrueif the configuration has a certain value,falseotherwise. Ifnameis an array, returns an array of booleans indicating whether each configuration has a certain value or not.
Examples:
-- 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 }
vscode.get_config(name)
Get configuration value.
Parameters:
name(string|string[]): The configuration name or an array of configuration names.
Returns:
unknown|unknown[]: The value of the configuration. Ifnameis an array, returns an array of values corresponding to each configuration.
Examples:
-- 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" }
vscode.update_config(name, value, target)
Update configuration value.
Parameters:
name(string|string[]): The configuration name or an array of configuration names.value(unknown|unknown[]): The new value for the configuration.target("global"|"workspace"|"workspace_folder"): The configuration target. Optional, defaults to "workspace_folder".
Examples:
-- 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(msg)
Show a vscode notification
You can set vscode.notify as your default notify function.
vim.notify = vscode.notify
vscode.eval(code[, opts, timeout])
Evaluate javascript inside vscode and return the result. The code is executed in an async function context (so await can be used). Use a return statement to return a value back to lua. Arguments passed from lua are available as the args variable. The evaluated code has access to the VSCode API through the vscode global.
Tips:
- Make sure to
awaiton asynchronous functions when accessing the API. - Use the global
logger(e.g.logger.info(...)) to log messages to the output of vscode-neovim. - JSON serializable values (primitives and simple objects) can be returned and will be automatically serialized then deserialized to an equivalent lua value. If the return value is not JSON serializable then an error will be raised.
globalThis['some_name'] = ...can be used to persist values between calls.
Parameters:
code(string): The javascript to execute.opts(table): Map of optional parameters:args(any): a value to make available as theargsvariable in javascript. Can be a single value such as a
string or a table of multiple values.
timeout(number): The number of milliseconds to wait for the evaluation to complete before cancelling. By default there is no timeout.
Returns:
- The result of executing the provided code.
Examples:
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" } })
local vscode_app_name = vscode.eval("return vscode.env.appName")
vscode.eval_async(code[, opts])
Like vscode.eval() but returns immediately and evaluates in the background instead.
Parameters:
code(string): The javascript to execute.opts(table): Map of optional parameters:args(any): a value to make available as theargsvariable in javascript. Can be a single value such as a
string or a table of multiple values.callback: Function to handle the eval result. Must have this signature:function(err: string|nil, ret: any):erris the error message, if anyretis the result- If no callback is provided, error will be shown as a VSCode notification.
vscode.with_insert(callback[, ms])
Perform operations in insert mode. If in visual mode, this function will preserve the selection after switching to insert mode.
Parameters:
callback(function): Callback function to run after switching to insert modems(number, optional): Milliseconds to defer the callback. Defaults to 30.
Example: make editor.action.addSelectionToNextFindMatch work correctly in any mode.
vim.keymap.set({ "n", "x", "i" }, "<C-d>", function()
vscode.with_insert(function()
vscode.action("editor.action.addSelectionToNextFindMatch")
end)
end)
Example: make "editor.action.refactor" work correctly on the selection and support snippet manipulation after entering VSCode snippet mode.
vim.keymap.set({ "n", "x" }, "<leader>r", function()
vscode.with_insert(function()
vscode.action("editor.action.refactor")
end)
end)
Builtin module overrides
vim.ui: use VSCode's UI components.vim.lsp.buf: execute corresponding VSCode LSP commands.
VimScript
Note: Since 1.0.0, vimscript functions are deprecated. Use the Lua api instead.
VSCodeNotify()/VSCodeCall(): deprecated, use Luarequire('vscode').call()instead.VSCodeNotifyRange()/VSCodeCallRange(): deprecated, use Luarequire('vscode').call(…, {range:…})instead.VSCodeNotifyRangePos()/VSCodeCallRangePos(): deprecated, use Luarequire('vscode').call(…, {range:…})instead.
You can also use v:lua.require("vscode") to access the API from VimScript.
⌨️ 快捷键(快捷方式)
There are three types of default/user keybindings:
- Neovim keybindings: These are the keybindings that are defined in the extension's vimscript files or the user's
init.vimfile. These provide code navigation, buffer management, and other neovim-specific overrides. - VSCode keybindings: These are the keybindings that are defined in the extension's
package.jsonor the user'skeybindings.jsonfile. These provide the ability to interact with VSCode's built-in features, and are used to make VSCode more Vim-like. - VSCode passthrough keybindings: These are the keybindings that are defined in the extension's
package.jsonor the user'skeybindings.jsonfile, but simply pass the keypress through to Neovim. These are used to allow Neovim to handle certain keypresses that would otherwise be handled by VSCode.
This document only mentions some special cases, it is not an exhaustive list of keybindings and commands. Use VSCode and Nvim features to see documentation and all defined shortcuts:
- Run the
Preferences: Open Keyboard Shortcutsvscode command and search for "neovim" to see all vscode and passthrough keybindings. - Use the Nvim
:helpcommand to see the documentation for a given neovim command or keybinding. For example try:help :splitor:help zo.- Note that
:helpfor<C-…>bindings is spelledCTRL-…. For example to see the help for<c-w>, run
:help CTRL-W.
- Note that
- Search the online Nvim documentation: https://neovim.io/doc/user/
- Reference the VSCode docs:
Keybinding Passthroughs
Every special (control/alt/non-alphanumerical) keyboard shortcut must be explicitly defined in VSCode to send to neovim. By default, only bindings that are used by Neovim by default are sent.
Note: if you want to pass additional control keys without adding a custom passthrough, see below.
To add a custom passthrough, for example A-h in normal mode, add to your keybindings.json:
{
"command": "vscode-neovim.send",
// Invoke the binding with this key sequence.
"key": "alt+h",
// Don't activate during insert mode.
// Docs for "when": https://code.visualstudio.com/api/references/when-clause-contexts
"when": "editorTextFocus && neovim.mode != insert",
// Send this input to Neovim.
"args": "<A-h>",
}
Insert mode control keys passthrough
Set by vscode-neovim.ctrlKeysForInsertMode.
Default: ["a", "d", "h", "j", "m", "o", "r", "t", "u", "w"]
Normal mode control keys passthrough
Set by ctrlKeysForNormalMode.
Default: ["a", "b", "d", "e", "f", "h", "i", "j", "k", "l", "m", "o", "r", "t", "u", "v", "w", "x", "y", "z", "/", "]"]
Cmdline mode special keys passthrough
Always enabled.
- Tab, Up, Down
- Ctrl keys:
<C-h><C-w><C-u><C-n><C-p><C-l><C-g><C-t> - All
<C-r>prefixed keys
Disable passthrough for certain filetypes
Set by editorLangIdExclusions.
Disable keybindings defined by this extension in certain filetypes. Please note that this will not affect all keybindings.
Remove other vscode or passthrough keybindings
If the above configuration flags do not provide enough control, you can remove the keybindings by editing your keybindings.json or using the VSCode keybindings editor:
Code navigation bindings
| Key | VSCode Command |
|---|---|
| = / == | editor.action.formatSelection |
| gh / K | editor.action.showHover |
| gd / C-] | editor.action.revealDefinition Also works in vim help. |
| 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 Switch between peek editor and reference list. |
| C-n / C-p | Navigate lists, parameter hints, suggestions, quick-open, cmdline history, peek reference list |
💡 To specify the default peek mode, modify
editor.peekWidgetDefaultFocusin your settings.
Explorer/list navigation bindings
| Key | VSCode Command |
|---|---|
| j or k | list.focusDown/Up |
| h or l | list.collapse/select |
| Enter | list.select |
| gg | list.focusFirst |
| G | list.focusLast |
| o | list.toggleExpand |
| C-u or C-d | list.focusPageUp/Down |
| zo or zO | list.expand |
| zc | list.collapse |
| zC | list.collapseAllToFocus |
| za or zA | list.toggleExpand |
| zm or zM | list.collapseAll |
| / or Escape | list.toggleKeyboardNavigation |
Explorer file manipulation bindings
| Key | VSCode Command |
|---|---|
| r | renameFile |
| d | deleteFile |
| y | filesExplorer.copy |
| x | filesExplorer.cut |
| p | filesExplorer.paste |
| v | explorer.openToSide |
| a | explorer.newFile |
| A | explorer.newFolder |
| R | workbench.files.action.refreshFilesExplorer |
Hover widget manipulation bindings
| Key | VSCode Command |
|---|---|
| K | editor.action.showHover |
| h | editor.action.scrollLeftHover |
| j | editor.action.scrollDownHover |
| k | editor.action.scrollUpHover |
| l | editor.action.scrollRightHover |
| gg | editor.action.goToTopHover |
| G | editor.action.goToBottomHover |
| C-f | editor.action.pageDownHover |
| C-b | editor.action.pageUpHover |
📟 Neovim 命令
Default commands and bindings are available for file/scroll/window/tab management.
File management
See vscode-file-commands.vim for file commands reference.
The extension aliases various Nvim commands (:edit, :enew, :find, :quit, etc.) to equivalent vscode commands. Also their normal-mode equivalents (where applicable) such as C-w q, etc.
Tab management
See vscode-tab-commands.vim for tab commands reference.
The extension aliases various Nvim tab commands (:tabedit, :tabnew, :tabfind, :tabclose, :tabnext, :tabprevious, :tabfirst, :tablast) to equivalent vscode commands. Also their normal-mode equivalents (where applicable) such as gt, etc.
Buffer/window management
See vscode-window-commands.vim for file commands reference.
The extension aliases various Nvim buffer/window commands (:split, :vsplit, :new, :vnew, :only) to equivalent vscode commands. Also their normal-mode equivalents (where applicable) such as C-w s, etc.
💡 Split size distribution is controlled by
workbench.editor.splitSizingsetting. By default, it'sdistribute,
which is equal to vim'sequalalwaysandeadirection = 'both'(default).
To use VSCode command 'Increase/decrease current view size' instead of separate bindings for width and height:
workbench.action.increaseViewSizeworkbench.action.decreaseViewSize
Copy this into init.vim
function! s:manageEditorSize(...)
let count = a:1
let to = a:2
for i in range(1, count ? count : 1)
call VSCodeNotify(to ==# 'increase' ? 'workbench.action.increaseViewSize' : 'workbench.action.decreaseViewSize')
endfor
endfunction
" Sample keybindings. Note these override default keybindings mentioned above.
nnoremap <C-w>> <Cmd>call <SID>manageEditorSize(v:count, 'increase')<CR>
xnoremap <C-w>> <Cmd>call <SID>manageEditorSize(v:count, 'increase')<CR>
nnoremap <C-w>+ <Cmd>call <SID>manageEditorSize(v:count, 'increase')<CR>
xnoremap <C-w>+ <Cmd>call <SID>manageEditorSize(v:count, 'increase')<CR>
nnoremap <C-w>< <Cmd>call <SID>manageEditorSize(v:count, 'decrease')<CR>
xnoremap <C-w>< <Cmd>call <SID>manageEditorSize(v:count, 'decrease')<CR>
nnoremap <C-w>- <Cmd>call <SID>manageEditorSize(v:count, 'decrease')<CR>
xnoremap <C-w>- <Cmd>call <SID>manageEditorSize(v:count, 'decrease')<CR>
🎨 高亮
There are two ways to customize highlight colors:
-
Set colors in nvim
Note: Due to the support for the
syntaxoption requiring processing of syntax highlights, all built-in
highlight groups may be overridden or cleared. Therefore, please do not link any highlights to the built-in
highlight groups. -
Set colors in vscode
🧰 开发
Please see CONTRIBUTING.md for details on how to contribute to this project.
❤️ 致谢与外部资源
- vim-altercmd - Used for rebinding default commands to call VSCode command.
- neovim nodejs client - NodeJS library for communicating with Neovim.
- VSCodeVim - Used for various inspiration.
- 本文标题:vscode-neovim - 适用于 VSCode 的 Vim 模式
- 本文链接:https://www.cn121.com/edplugin/vscode-neovim-vscode-neovim.html
- 原项目:vscode-neovim/vscode-neovim 版权归原作者 vscode-neovim 及贡献者所有
- 收录信息:本站于 2026-11-05 收录本项目,本页所列协议与仓库指标均为收录当时的状态;该日期之后原项目的版本更新与协议变更,本页不作同步。
- 开源协议:收录时本项目采用 MIT(查看 LICENSE 原文),本站转载其原始文档(未改动文字,仅剔除图片与无关章节);使用、修改、分发请以该仓库 LICENSE 原文为准。
- 站点出处:本文首发于 OneTwoOne,收录自 GitHub 开源项目 vscode-neovim/vscode-neovim。
- 内容说明:本页正文为原项目 README 原文(英文),本站后续会翻译为中文(当前尚未译出,仅将二级标题译为中文,便于按栏目定位;标题原文可在下方原仓库中查看),仅剔除了图片与赞助等无关章节、并把相对链接改为绝对地址;页首简介为机器翻译自仓库描述。
- 引用声明:商业转载、第三方聚合或 AI 检索训练引用时,请务必保留以上来源出处、本文永久链接,以及原项目的版权声明与许可信息。
- 下架通道:若原项目此后变更或收紧了许可协议、或作者/权利人认为本站的收录方式(译文、排版适配、简介翻译等)超出其授权范围,请通过 xyd3302001@163.com 发送下架通知,并附上项目地址与本页链接。本站核实后将第一时间删除本页内容,或改为不复制原文的目录性收录;署名更正等其他要求可一并提出。