Vim for VSCode:将Ctrl + e重新映射到插入模式下的行末

5
我是使用 Vim with VSCode
我正在尝试ctrl+e映射到插入模式下的行尾。这是我在settings.json中编写的内容:
"vim.insertModeKeyBindingsNonRecursive": [{ "before": ["<C-o>", "$"], "after": ["<C-e>"] }]

很遗憾,这种方法并不起作用。我该如何重新映射呢? 编辑: 根据回答,我也尝试了
"vim.insertModeKeyBindingsNonRecursive": [ { "before": ["<C-e>"], "commands": { "command": "cursorLineEnd" } } ]

"vim.insertModeKeyBindingsNonRecursive": [{ "before": ["<C-e>"], "commands": "cursorLineEnd" }]

它们都没有起作用。

7个回答

6

尝试使用commands选项代替:

"vim.insertModeKeyBindingsNonRecursive": [{
       "before":[
          "<C-e>"
       ],
       "after":[],
       "commands":[
          {
             "command":"cursorEnd",
             "args":[]
          }
       ]
    }]

更新:我已经尝试了几种<C-...>组合,经过几个小时的摆弄,我得出结论,一些Ctrl绑定根本不起作用。我尝试了多种变化,但都无济于事,任何其他键盘组合似乎都可以完美地工作,例如:

"vim.insertModeKeyBindingsNonRecursive": [
      {
         "before": [
            "j",
            "k"
         ],
         "commands": [
            "cursorLineEnd",
         ]
      }
   ]

我现在给你的建议是避免使用Ctrl重新映射,而是使用<leader>。您还可以适当地组织这些发现并在GitHub上开启一个新问题。

P.S

您可以在“文件” ->“首选项” ->“键盘快捷方式”中检查命令名称:

enter image description here


1
我尝试使用以下代码:"vim.insertModeKeyBindingsNonRecursive": [ { "before": ["<C-e>"], "commands": { "command": "cursorLineEnd" } } ] ,因为 cursorLineEnd 更符合我的需求。不幸的是,它也无效 :( - J. Hesters
似乎绑定某些<C-...>组合键目前不太稳定,我已经更新了我的答案并分享了我的想法。 - guychouk

3

以下是对我起作用的解决方案:

VSCode 1.37.1(2019年7月)

VSCodeVim v1.9

首先,告诉VSCodeVim扩展程序取消处理“C-a”和“C-e”键。这将使这些控制键委托给VSCode而不是扩展程序:

// In your settings.json
"vim.handleKeys": {
        "<C-a>": false,
        "<C-e>": false
    },

现在只需在 VSCode 中重新映射这些按键:

// In your keybindings.json
[
  {
      "key": "ctrl+a", // default is Home
      "command": "cursorHome",
      "when": "textInputFocus"
  },
  {
      "key": "ctrl+e", // default is End
      "command": "cursorEnd",
      "when": "textInputFocus"
  },
  {
      "key": "ctrl+a", // default is Home
      "command": "extension.vim_home",
      "when": "editorTextFocus && vim.active && !inDebugRepl && vim.mode != 'Insert'"
  },
  {
      "key": "ctrl+e", // default is End
      "command": "extension.vim_end",
      "when": "editorTextFocus && vim.active && !inDebugRepl && vim.mode != 'Insert'"
  },
]

我发现前两个绑定在正常模式和插入模式下起作用,但在可视模式下不起作用(它似乎只是移动光标,但没有选择任何内容)。后两个绑定确保它也在可视模式下起作用。

编辑:我发现在when中简单地删除最后一个条件vim.mode != 'Insert'可以工作,并且更加简洁。所以,而不是使用上述键绑定,只需:

// In your keybindings.json
[
  {
      "key": "ctrl+a",
      "command": "extension.vim_home",
      "when": "editorTextFocus && vim.active && !inDebugRepl"
  },
  {
      "key": "ctrl+e",
      "command": "extension.vim_end",
      "when": "editorTextFocus && vim.active && !inDebugRepl"
  },
]

找不到 extension.vim_home 和 extension.vim_end,必须使用 cursorHome 和 cursorEnd。 - bnPYSse

3
尝试在您的keybindings.json中使用此代码:
{
  "key": "ctrl+a",
  "command": "cursorLineStart",
  "when": "textInputFocus && vim.mode == 'Insert'"
},
{
  "key": "ctrl+e",
  "command": "cursorLineEnd",
  "when": "textInputFocus && vim.mode == 'Insert'"
}

当我安装Rewrap并将其映射到“gq”时,它对我有很大帮助。在vim模式下,我无法再输入字母“g”,因为vsCode正在等待“g”的发生。我将该条件添加到我的映射中,解决了我的问题。 - xh3b4sd

1

简述:

在keybindings.json文件中:

[
  {
    "key": "ctrl+a",
    "command": "cursorHome",
    "when": "editorTextFocus && vim.active && !inDebugRepl && vim.mode == 'Insert'"
  },
  {
    "key": "ctrl+e",
    "command": "cursorEnd",
    "when": "editorTextFocus && vim.active && !inDebugRepl && vim.mode == 'Insert'"
  }
]

长版

尝试了2020-05-15这个帖子中的答案,但都没有起作用。发现了一个问题https://github.com/VSCodeVim/Vim/issues/3126,其中包含一个解决方法,对我有用。
我的vscode版本:1.45.0
感谢问题的作者https://github.com/paupalou


0
首先,在您的setting.json文件中设置vim.useCtrlKeys: true
然后:
    "vim.insertModeKeyBindingsNonRecursive": [
        {
            "before": ["<C-e>"],
            "after": [],
            "commands":[
                {
                   "command":"cursorLineEnd",
                   "args":[]
                }
             ]
        },
        {
            "before": ["<C-a>"],
            "after": [],
            "commands":[
                {
                   "command":"cursorLineStart",
                   "args":[]
                }
             ]
        }
    ],

然后你就完成了


0
将以下内容添加到settings.json中对我有效:
"vim.inserModeKeyBindings": [
        {
            "before": ["<C-e>"],
            "after": ["<esc>", "$", "a"]
        }
]

0

我发现递归映射很有效:

    "vim.insertModeKeyBindings": [
        {
            "before": [
                "<C-e>"
            ],
            "commands": [
                "cursorEnd"
            ],
        },
        {
            "before": [
                "<C-a>"
            ],
            "commands": [
                "cursorHome"
            ],
        }
    ],

虽然它们并不理想。


很不幸,它很快就无法工作了,而我毫无头绪。 - moba

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