【问题标题】:Make a key behave as another key使一个键表现为另一个键
【发布时间】:2012-05-04 16:18:00
【问题描述】:

我希望某些键和组合键的行为与 Emacs 中的其他键或组合键一样。例如,我希望 F5 在涉及它的每个可能组合中充当 Cc 的替代品,或 CS- 作为 C- 。是否可以在不手动重新绑定所有此类组合键的情况下做到这一点?

【问题讨论】:

    标签: emacs keyboard-shortcuts elisp


    【解决方案1】:

    您所指的键称为“前缀键”。前缀键有自己的键映射,因此要使另一个键的行为相同,您需要将其分配给相同的键映射。对于 control-c,您使用 mode-specific-map:

    (global-set-key (kbd "<f5>") mode-specific-map)
    

    控件本身不是前缀键,或者根本不是键,因为它不会向 Emacs 发送按键[1],直到您按下另一个键。我不确定如何在 Emacs 中将 C-S- 重新映射为 C-。您可以使用 xmodmap 在系统范围内执行此操作,但这可能不是您想要的。

    [1] 控制键(和 shift、alt)确实会向操作系统发送按键,但 Emacs 不会“看到”这一点,除非同时按下另一个键

    【讨论】:

    • +1 但是... “控件本身不是前缀键,或者根本不是键,因为它不发送按键”。 .. 控制本身确实会发送按键。你可以在 Linux 下使用 xev 来查看。当你按下它时它会发送一个按键,当你释放它时它会发送一个键释放。我系统上 CTRL 的 xev 输出给出:KeyPress eventKeyPress event... state 0x14, keycode 37 (keysym 0xffe3, Control_L)... 等等。我有点争议您写道,控件根本不是“真正的关键”。我的键盘的 CTRL 和 CAPS-LOCK 重新映射为 CTRL 确实会冒犯; )
    • @TacticalCoder:公平点,就 X 而言。但我不认为 X 注册的按键对 Emacs 本身是可见的。如果没有修改另一个键,Emacs 无论如何都不会检测或响应修饰键。因此,从 Emacs 的角度来看,CTRL 本身并不是一个键,除非它与另一个键组合在一起。
    【解决方案2】:

    我更喜欢

    (define-key key-translation-map [f5] (kbd "\C-c"))
    

    这是good resource

    总结上面给出的链接:global-set-key的缺点是,当你定义一个组合键输入一个符号时,它在isearch中不起作用。

    key-translation-map 也有问题。想象一下,你定义了一个符号 | 来执行一个命令,并定义一个 C-| 来输入符号 |,按下 C-| kbd> 将执行命令。

    【讨论】:

    • 效果很好。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    相关资源
    最近更新 更多