如何在 NeoVim 中将 Ctrl Left 重新映射为 Esc?

问题描述 投票:0回答:1

我想将 Ctrl - Left 重新映射为 ESC,但它不起作用。 我只能用右手,这样对我来说会更方便。

谢谢。

我使用 Arco/linux 和 kitty 终端。

vim.keymap.set("i", "", "") 我以为它应该有效,但事实并非如此

lua neovim kitty
1个回答
0
投票

我不知道如何仅在 Neovim 中重新映射它,但我可以帮助您在 udev 级别的 Linux 系统范围内重新映射它。您可以使用 interception-tools 并编写一个 C 程序来执行此操作。我不使用arco,我使用arch linux,但我认为它是基于arch的,所以你可能可以做

sudo pacman -S interception-tools
,然后编写这个C程序,或者如果你喜欢的话复制和粘贴,并且可能会更好地命名它我在下面做

#include <stdio.h>
#include <stdlib.h>
#include <linux/input.h>

int main(void) {
    setbuf(stdin, NULL);
    setbuf(stdout, NULL);

    struct input_event events[2];
    int event_count = 0;

    while (1) {
        if (fread(&events[event_count], sizeof(struct input_event), 1, stdin) != 1) {
            break;
        }

        if (events[event_count].type == EV_KEY) {
            if (events[event_count].code == KEY_RIGHTCTRL) {
                if (events[event_count].value == 1) {
                    event_count++;
                } else if (events[event_count].value == 0 && event_count == 1 && events[0].code == KEY_LEFT) {
                    // Remap Ctrl+Left to Esc
                    events[0].code = KEY_ESC;
                    events[1].code = 0;  // Clear the second event
                    event_count = 0;
                } else {
                    // Not Ctrl+Left, write the events as is
                    for (int i = 0; i <= event_count; i++) {
                        fwrite(&events[i], sizeof(struct input_event), 1, stdout);
                    }
                    event_count = 0;
                }
            } else {
                // Not Ctrl, write the events as is
                for (int i = 0; i <= event_count; i++) {
                    fwrite(&events[i], sizeof(struct input_event), 1, stdout);
                }
                event_count = 0;
            }
        } else {
            // Non-key events, write the events as is
            for (int i = 0; i <= event_count; i++) {
                fwrite(&events[i], sizeof(struct input_event), 1, stdout);
            }
            event_count = 0;
        }
    }

    return 0;
}

您可以随意命名,但例如我将其命名为

right.c

gcc -o right right.c
sudo mv right /usr/local/bin
编译它,然后用 sudo 创建一个名为
/etc/udevmon.yaml
的文件,其中包含这些内容

- JOB: intercept -g $DEVNODE | right | uinput -d $DEVNODE
  DEVICE:
    EVENTS:
      EV_KEY: [KEY_RIGHTCTRL, KEY_LEFT]

然后你就

sudo systemctl enable --now udevmon.service
就可以了。不确定是否需要重新启动。如果有任何问题请评论,我很乐意提供进一步的帮助。抱歉,你只能使用右手。 :(

© www.soinside.com 2019 - 2024. All rights reserved.