我想将 Ctrl - Left 重新映射为 ESC,但它不起作用。 我只能用右手,这样对我来说会更方便。
谢谢。
我使用 Arco/linux 和 kitty 终端。
vim.keymap.set("i", "", "") 我以为它应该有效,但事实并非如此
我不知道如何仅在 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
就可以了。不确定是否需要重新启动。如果有任何问题请评论,我很乐意提供进一步的帮助。抱歉,你只能使用右手。 :(