zsh (z shell) 数字键盘/数字锁定不起作用

zsh (z shell) 数字键盘/数字锁定不起作用

我刚刚升级到 zsh/oh-my-zsh。我几乎立刻就注意到我的机器上的 10 位数字键盘无法使用。它在 bash 和 fish shell 中可以正常工作。

奇怪的是,如果我按住 fn/功能键,它就像 numlock 一样起作用并且可以工作,但它不会“锁定”,我必须继续按住 fn 才能输入数字。

有什么想法吗?

答案1

数字键盘键不会发送与顶行“普通”数字键相同的键符号。例如:数字键盘 1 键发送,KP_1而 1 键只发送1

某些终端会自动重新映射数字键盘键,以将相同的代码发送到 shell。此外,某些 shell(例如bash)只是将数字键盘键解释为与主块中的等效键相同。

zsh不会自动进行映射,但您可以bindkey自行进行映射。我使用以下命令~/.zshrc使键盘正常工作:

# Keypad
# 0 . Enter
bindkey -s "^[Op" "0"
bindkey -s "^[Ol" "."
bindkey -s "^[OM" "^M"
# 1 2 3
bindkey -s "^[Oq" "1"
bindkey -s "^[Or" "2"
bindkey -s "^[Os" "3"
# 4 5 6
bindkey -s "^[Ot" "4"
bindkey -s "^[Ou" "5"
bindkey -s "^[Ov" "6"
# 7 8 9
bindkey -s "^[Ow" "7"
bindkey -s "^[Ox" "8"
bindkey -s "^[Oy" "9"
# + -  * /
bindkey -s "^[Ok" "+"
bindkey -s "^[Om" "-"
bindkey -s "^[Oj" "*"
bindkey -s "^[Oo" "/"

bindkey -s in-string out-string绑定in-stringout-string。如果in-string输入了 ,out-string则将其推回并视为输入。

实际代码(例如^[Oq)可能与您的系统不同。您可以按Ctrl+ ,v然后按相应键以获取您的终端的代码。

答案2

为了完善@adaephon 给出的答案,以下是 Apple USB 键盘 (A1243) 的正确绑定。这些需要添加到~/.zshrc

# Fix numeric keypad
# 0 . Enter
bindkey -s "^[Op" "0"
bindkey -s "^[On" "."
bindkey -s "^[OM" "^M"
# 1 2 3
bindkey -s "^[Oq" "1"
bindkey -s "^[Or" "2"
bindkey -s "^[Os" "3"
# 4 5 6
bindkey -s "^[Ot" "4"
bindkey -s "^[Ou" "5"
bindkey -s "^[Ov" "6"
# 7 8 9
bindkey -s "^[Ow" "7"
bindkey -s "^[Ox" "8"
bindkey -s "^[Oy" "9"
# + -  * / =
bindkey -s "^[Ol" "+"
bindkey -s "^[Om" "-"
bindkey -s "^[Oj" "*"
bindkey -s "^[Oo" "/"
bindkey -s "^[OX" "="

答案3

在带有 A1843 Apple 键盘的 MacOS Catalina 上:

我将终端配置设置为安西. 它适用于所有键。

不需要键绑定。

Terminal.app 截图

iTerm 截图

答案4

在我的 Mac OSX El Capitan 上,句号键是^[0n而不是^[01。此外,我有一个用于 Mac 的 Logitech 无线键盘,它的=数字键盘上也有一个符号。我的最终映射如下所示:

# Keypad
# 0 . Enter
bindkey -s "^[Op" "0"
bindkey -s "^[On" "."
bindkey -s "^[OM" "^M"
# 1 2 3
bindkey -s "^[Oq" "1"
bindkey -s "^[Or" "2"
bindkey -s "^[Os" "3"
# 4 5 6
bindkey -s "^[Ot" "4"
bindkey -s "^[Ou" "5"
bindkey -s "^[Ov" "6"
# 7 8 9
bindkey -s "^[Ow" "7"
bindkey -s "^[Ox" "8"
bindkey -s "^[Oy" "9"
# + -  * / =
bindkey -s "^[Ok" "+"
bindkey -s "^[Om" "-"
bindkey -s "^[Oj" "*"
bindkey -s "^[Oo" "/"
bindkey -s "^[OX" "="

然而其他人提出的解决方案却能正确运行。

相关内容