如何在 WSL 中将 Ctrl-i 与 TAB 分开?

如何在 WSL 中将 Ctrl-i 与 TAB 分开?

我在 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 并使用您链接的答案中的说明。

相关内容