Vim для VSCode: переназначить Ctrl + E, чтобы перейти к концу строки в режиме вставки

Я использую Vim с 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" }]

что тоже не сработало.

1 ответ

Решение

Попробуйте использовать commands вариант вместо:

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

Обновление: я попытался несколько <C-...> комбинации и после нескольких часов возни я пришел к выводу, что некоторые Ctrl привязки просто не работают. Я пробовал несколько вариантов безрезультатно, и любая другая комбинация клавиш, кажется, работает безупречно, посмотрите это, например:

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

Мое предложение для вас сейчас состоит в том, чтобы избежать Ctrl переназначения, использование <leader> вместо. Вы также можете правильно организовать эти выводы и открыть новый выпуск на GitHub.

PS

Вы можете проверить имена команд в меню Файл -> Настройки -> Сочетания клавиш:

Попробуйте это в своем keybindings.json:

{
  "key": "ctrl+a",
  "command": "cursorLineStart",
  "when": "textInputFocus && vim.mode == 'Insert'"
},
{
  "key": "ctrl+e",
  "command": "cursorLineEnd",
  "when": "textInputFocus && vim.mode == 'Insert'"
}

Вот что сработало для меня:

VSCode 1.37.1 (июль 2019 г.)

VSCodeVim v1.9

Сначала скажите расширение VSCodeVim к unhandle 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'"
  },
]

Я обнаружил, что первые две привязки работают в обычном режиме и в режиме вставки, но не в визуальном режиме (он как бы перемещает курсор, но ничего не выделяется). Последние два гарантируют, что он также работает в визуальном режиме.

Изменить: я обнаружил, что просто удаляя последнее условиеvim.mode != 'Insert' в whenработает и намного чище. Поэтому вместо сочетаний клавиш выше просто:

// 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"
  },
]

tl;dr

в 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

Добавление следующего в settings.json работает для меня:

"vim.inserModeKeyBindings": [
        {
            "before": ["<C-e>"],
            "after": ["<esc>", "$", "a"]
        }
]

Во-первых: установить vim.useCtrlKeys": true, в вашем setting.json

тогда:

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

и твоя воля сделана

Я обнаружил, что рекурсивные сопоставления работают:

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

Хотя они не идеальны.

Другие вопросы по тегам