我需要解决为什么在终端中输入某些 unicode 字符不起作用的原因。
我使用非标准键盘布局(即新),它允许我直接输入 unicode 字符,例如α β γ δ … ∀ ∃ … ∘ ⇒ ⇔
,这对于大多数应用程序来说效果很好。
然而,对于诸如rxvt-unicode
或 之类的终端xterm
,输入字符∘
并⇔
不会执行任何操作 –虽然人物表现得非常好当我复制粘贴它们时。
有关不起作用的特定字符和键的信息:
Capslock + AltGr + ⟨some key⟩
例如,输入 via 的其他字符⇒
在我的终端上也可以正常工作。这让我很困惑。
那么有谁知道问题可能出在哪里?有人知道去哪里看吗?
我使用 Parabola GNU/Linux(基本上是 Arch Linux)。
答案1
好吧,我现在至少找到了解决方法。
事实证明,问题在于ifonlyif
和jot
似乎没有被xmodmap
键符号名称识别。它们在我的配置中使用。
$ xmodmap -pke | egrep "jot|ifonlyif"
keycode 34 = ssharp U1E9E ssharp U1E9E U017F Greek_finalsmallsigma U2212 NoSymbol jot NoSymbol U017F Greek_finalsmallsigma U2212 NoSymbol jot
keycode 58 = m M m M percent Greek_mu KP_1 KP_1 ifonlyif
如果将它们替换为 unicode 十六进制代码,则一切正常。所以我只是做了:
$ xmodmap -pke | sed -e 's:ifonlyif:U21D4:' -e 's:jot:U2218:' > .Xmodmap
$ xmodmap .Xmodmap
$ xmodmap -pke | egrep "keycode (34|58)"
keycode 34 = ssharp U1E9E ssharp U1E9E U017F Greek_finalsmallsigma U2212 NoSymbol U2218 NoSymbol U017F Greek_finalsmallsigma U2212
keycode 58 = m M m M percent Greek_mu KP_1 KP_1 U21D4
如果这可能对其他人有帮助,我通过以下方式得出这一结论:我观察了xev
尝试分别输入⇔
(ifonlyif) 和∘
(jot) 的输出。
KeyPress event, serial 34, synthetic NO, window 0x2400001,
root 0x9b, subw 0x0, time 170075495, (1,1), root:(552,302),
state 0xa0, keycode 58 (keysym 0x8cd, ifonlyif), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 34, synthetic NO, window 0x2400001,
root 0x9b, subw 0x0, time 170075574, (1,1), root:(552,302),
state 0xa0, keycode 58 (keysym 0x8cd, ifonlyif), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
KeyPress event, serial 34, synthetic NO, window 0x2400001,
root 0x9b, subw 0x0, time 170076304, (1,1), root:(552,302),
state 0xa0, keycode 34 (keysym 0xbca, jot), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
KeyRelease event, serial 34, synthetic NO, window 0x2400001,
root 0x9b, subw 0x0, time 170076336, (1,1), root:(552,302),
state 0xa0, keycode 34 (keysym 0xbca, jot), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
相反,输入其他工作字符 ( Θ
, ⇒
) 会给出如下行:
…
state 0xa0, keycode 61 (keysym 0x7c8, Greek_THETA), same_screen YES,
XLookupString gives 2 bytes: (ce 98) "Θ"
…
state 0xa0, keycode 59 (keysym 0x10021d2, U21D2), same_screen YES,
XLookupString gives 3 bytes: (e2 87 92) "⇒"
所以我知道问题可能是XLookupString
无法返回任何东西。所以我就这么做了,man xlookupstring
并且man xmodmap
。然后我调查了 xmodmap 表xmodmap -pke
,并将失败的ifonlyif
as查找⇔
与成功的U21D2
as查找进行了比较⇒
。