VS code VIM 扩展复制粘贴

105
有没有一种在vs code中使用vim扩展程序来正常复制和粘贴的方法?
我尝试将VIM寄存器命令映射到我习惯的快捷命令(用于复制的ctrl + c和用于粘贴的ctrl + v),但结果相当奇怪,我不确定如何正确地执行此操作。
在使用vim时,按键绑定非常简单, vimrc文件:
map <C-c> "+y
map <C-v> "+p

现在我尝试通过编辑json.settings文件将它们迁移到VS Code中:

{
    "vim.visualModeKeyBindings": [
        {
            "before": ["<C-c>"],
            "after": ["\"", "+", "y"]
        },
        {
            "before": ["<C-v>"], 
            "after":  ["\"", "+", "p"]
        },
    ], }

我希望这个操作可以在可视模式和正常模式(用于粘贴)下运行,并能够使用这些快捷键从剪贴板复制和粘贴。

如何正确实现?还有其他方法吗?


1
您可以使用 "+y 将内容复制到剪贴板,使用 "+p 从剪贴板粘贴。 - Sharku
1
在可视模式下,按下<C-v>会与垂直可视模式发生冲突。 - Muhammed Ozdogan
8个回答

244

Vim - 扩展配置标志

在设置中搜索“vim clip”,勾选复选框。

或者

将以下内容粘贴到您的 VS Code 的 settings.json 文件中:

"vim.useSystemClipboard": true

访问VSCode的settings.json文件:

  1. 按下 Ctrl + ,(或转到文件(File) > 首选项(Preferences) > 设置(Settings)
  2. 点击右上角的“带有箭头的文件”图标

VSCode access settings json file


在VSCodeVim / Vim存储库的快速示例中找到设置


17
这个答案比将 <C-c><C-v> 绑定为“false”更好,因为它保留了视觉块模式的快捷键。 - Macondo
6
快捷方式:进入设置,搜索“vim clip”,勾选选项。 - Hamza Zubair
1
出于某些原因,这在我的情况下并没有解决问题。然而,第一个答案解决了它。你有任何想法为什么吗? - basilisk
@basilisk,@rbansal 这个解决方案的一个额外细节是它使系统剪贴板可用于选择寄存器(*)。这允许您通过正常模式下的本地 p 命令(或插入模式下的 Ctrl-r *)进行粘贴。它不允许您像预期的那样使用 Ctrl-v - Tony Cesaro
不能在VS Code中使用Ctrl-C和Ctrl-V进行复制和粘贴让我感到非常烦恼。感谢您发布这篇文章! - Vincent
显示剩余3条评论

80

不需要重新绑定,您可以完全停止vscodevim扩展处理Ctrl-CCtrl-V,这样VSCode就可以在本机处理它们。这可以通过将以下代码放置在扩展的settings.json文件中来完成:

"vim.handleKeys": {
    "<C-c>": false,
    "<C-v>": false
}
无论你处于哪种模式,这都可以工作,并且可以完美地适应系统剪贴板。我不确定<C-c>是否必要,但<C-v>肯定是必要的,因为<C-v>是进入可视块模式的标准Vim和弦。顺便说一下,你的重新绑定方法是完全有效的;它只需要更多的代码:
// For visual mode
"vim.visualModeKeyBindings": [
  {
    "before": ["<C-c>"],
    "after": ["\"", "+", "y"]
  },
  {
    "before": ["<C-v>"], 
    "after":  ["\"", "+", "p"]
  }
],
// For normal mode
"vim.normalModeKeyBindings": [
  {
    "before": ["<C-c>"],
    "after": ["\"", "+", "y"]
  },
  {
    "before": ["<C-v>"], 
    "after":  ["\"", "+", "p"]
  }
]

1
你知道为什么 C 中的复制操作会覆盖整行而不是修改它吗? - 7537247
是的!谢谢,这解决了我的一个问题,即yank y键会复制并覆盖删除键d的寄存器。不过我还有一个问题: 在yanking之后,我想用ci'替换一个'word',但是ci'会将word复制到我的剪贴板中。你知道如何禁用这个功能吗? - Flov
我刚刚回答了自己的问题: { "before": ["c"], "after": ["\"", "_", "c"] } - Flov
5
如果您使用的是OS X系统,为了方便您浏览,请注意修改映射关系中的"<C-v>""<D-v>"。因为Vim将命令键视为“D”键。打开Vim并键入:help <D-以获取更多详细信息。 - Sami Farhat
其他有用的快捷键从原始VS Code中保留,包括ctrl+a; ctrl+s; ctrl+x; settings.json: "vim.handleKeys": { "<C-a>": false, "<C-s>": false, "<C-c>": false, "<C-v>": false, "<C-x>": false } - Bart N
"这可以通过将以下代码放置在扩展的settings.json文件中来实现:" 这也是主要的用户设置文件。我有什么遗漏吗?(就我所知,将其放入用户首选项文件确实有效,供参考。)" - ruffin

4
在最新版本的VS Code(Linux,flatpak版本1.68.1)和Vim插件(撰写时),可以通过勾选“Vim: Use System Clipboard”来轻松启用此功能。
注意:您可以通过按Ctrl+,打开设置,然后搜索“vim clipboard”。 enter image description here

完美,与 LunarVim 的行为完全匹配。 - Alexei Sosin

2

如果你使用Linux(或终端本身),你必须知道复制和粘贴需要在中间添加shift键,即:

ctrl + shift + c 复制

ctrl + shift + v 粘贴

因此,对我来说更简单的方法是记住这个快捷键,并将其添加到配置中,因为它帮助我将VS Code视为“终端”。

步骤:

  1. F1
  2. Preferences: Open Keyboard shortcuts (JSON)
  3. 添加以下内容
 {
    "key": "ctrl+shift+c",
    "command": "editor.action.clipboardCopyAction"
  },
  {
    "key": "ctrl+shift+v",
    "command": "editor.action.clipboardPasteAction"
  }

是的,但为什么人们在vim插入模式下不直接使用Ctrl+V进行粘贴呢?(*NeoVim中我不得不添加Ctrl+V键绑定.json) - undefined

2

我发现在使用VS Code VIM时,可以成功地使用CTRL+INSERT / SHIFT+INSERT将内容复制到/从系统剪贴板中,而不会遇到VIM缓冲区的问题。

为了更好的理解,我是在Windows上的WSL2上运行VS Code。


1

对于Mac用户,

将以下内容添加到settings.json文件中:

"vim.handleKeys":{
  "<D-c>": false
}

访问VSCode的settings.json文件:

按下Cmd + ,(或转到文件 > 首选项 > 设置)
单击右上角的“带箭头的文件”图标

icon


1

你也可以使用vim访问系统剪贴板

插入模式下,按下CTRL+R,然后按*+


1
使用 VS Code 的默认复制、粘贴、删除行功能。
"vim.normalModeKeyBindingsNonRecursive": [
        {
            "before": ["d","d"],
            "commands":["editor.action.deleteLines"],
            "when":"textInputFocus && !editorReadonly"
        },
        {
            "before":["y"],
            "commands":["editor.action.clipboardCopyAction"],
            "when":"textInputFocus"
        },
        {
            "before":["y","y"],
            "commands":["editor.action.clipboardCopyAction"],
            "when":"textInputFocus"
        },
        {
            "before":["p"],
            "commands":["editor.action.clipboardPasteAction"],
            "when":"textInputFocus && !editorReadonly"
        }
    ],
    "vim.visualModeKeyBindingsNonRecursive":[
        {
            "before":["y"],
            "commands":["editor.action.clipboardCopyAction"],
            "when":"textInputFocus"
        },
        {
            "before":["y","y"],
            "commands":["editor.action.clipboardCopyAction"],
            "when":"textInputFocus"
        },
        {
            "before":["x"],
            "commands":["deleteRight"],
            "when":"textInputFocus"
        },
    ]

https://github.com/VSCodeVim/Vim/#key-remapping https://code.visualstudio.com/docs/getstarted/keybindings


4
这可能是一个正确的答案,但最好提供代码的附加说明,以便开发人员可以理解您的推理过程。这对于不熟悉该语法的新开发人员尤其有用。此外,这有助于减少后续问题的需要。您介意在评论中更新更多详细信息吗?看一下被接受的答案会有很好的例子。 - Jeremy Caney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接