我在 Ubuntu 的 WSL2 上使用 bash,我希望 Crtl-i 和 TAB 发送不同的键码,这样我就可以在 emacs 上重新映射 Ctrl-i,同时仍然使用 TAB 进行缩进。我尝试遵循以下答案这个问题,这建议通过编辑.Xresources
文件然后运行来重新映射 Ctrl-i xrdb ~/.Xresources
。我的.Xresources
文件中有这个
XTerm*metaSendsEscape: true
XTerm*eightBitInput: false
Xterm*Translations: #override\
Ctrl ~Meta ~Shift <Key>i :string("\033[105;5u")
除非打电话时xrdb .Xresources
它只会给我这条消息
xrdb: Connection refused
xrdb: Can't open display 'localhost:0.0'
这似乎是由于 WSL 是纯文本编辑器,而我对文件的更改没有产生效果。我在 bash 上运行echo $TERM
以确保它正在使用 xterm 并且它返回了xterm-256color
,所以这似乎是正确的。
有没有办法让 WSL 使用.Xresources
或有其他方法在 WSL 中区分 Ctrl-i 和 TAB?
答案1
您进行了一些很好的研究,但对 WSL 中的终端情况有一些误解。
您链接到的问题/答案专门给出了这些xrdb
说明xterm
。可能使用的终端有很多,并且每个终端的重新映射方法都不同。该特定答案甚至给出了三个不同终端的解决方案:
- Xterm
- 乌尔克斯夫特
- 猫咪
虽然它是可能的要使用 WSL 下的终端(请参阅本答案的末尾),这些终端都不是默认的 WSL 终端。 WSL 有两种可能的默认终端:
- 在 Windows 10 中,旧版 Windows 控制台主机。这是用于 CMD 和 PowerShell 的同一终端。
- 在 Windows 11 中,(相当)新的 Windows 终端取代了控制台主机。与它的前身相比,它相当先进,包括许多附加功能。终端也可以安装在 Windows 10 中,但无法将其设置为默认值。
所以您需要以下说明终端您正在使用,而不是真正用于 WSL。
据我所知,Windows 控制台主机不包含任何关键的重新映射功能。但是,您可以使用类似的东西自动热键或(可能)自动它拦截Ctrl+i并发送正确的转义序列。在我看来,至少AutoHotkey有这个能力,但我还没有为此目的尝试过。
不过,我建议您继续安装 Windows 终端(如果您尚未安装)。它可以在 Windows 10 的 Microsoft Store 中找到(并在最新的 Windows 11 版本中自动安装)。
它确实包括重新映射键的功能,但它有点“隐藏”在配置文件后面。虽然终端现在包含用于编辑某些设置的 GUI,但此类高级功能确实需要手动编辑settings.json
.
为此:
在 Windows 终端中,转到下拉菜单并打开设置
在设置的左下角,选择“打开 JSON 文件”选项。
旁注:建议您安装 VSCode,或者至少安装一些可以很好处理 JSON 的编辑器。 VSCode 的另一个优势是了解 Windows 终端架构,因此它会在您键入时自动完成选项。
在列表中添加以下内容
"actions"
:{ "command": { "action": "sendInput", "input": "\u001b[105;5u" }, "keys": "ctrl+i" }
虽然我还没有使用 Emacs 对此进行测试,但我确实在 Fish shell 中确认fish_key_reader
+Ctrl正在i发送指定的控制代码而不是制表符。
在 WSL 中使用 Linux/X 终端
如果您确实想使用 Linux 终端之一,则可以使用 WSL 来实现。您只需要使用支持 WSLg 的 Windows 11(允许您在 WSL2 中运行 Linux GUI 应用程序)或使用我在 Windows 10 中详细介绍的方法之一配置 GUI 支持这位超级用户的回答。完成此操作后,如果您愿意,您可以运行 Xterm 并使用您链接的答案中的说明。