做异端中的异端 -- Emacs裸奔之路3: 上古神键Hyper

谈一下快捷捷冲突的问题。

Emacs几乎穷尽所有组合键

我用下面命令,在Fundamental模式下,枚举所有绑定。

复制代码
(defun keymap-lookup-test-fn()
  ; printable keys
  (setq printable-chars (number-sequence 33 126))
  (setq i 0)
  (while (< i (length printable-chars))
       ; (setq key-name (format "C-%c" (nth i printable-chars)))
       ; (setq key-name (format "M-%c" (nth i printable-chars)))
       (setq key-name (format "C-M-%c" (nth i printable-chars)))

       ; (setq key-name (format (concat custom-user-prefix-key "%c" (nth i printable-chars))))
       ; (setq key-name (format (concat custom-user-prefix-key "C-%c" (nth i printable-chars))))

       ; (setq key-name (format "C-x %c" (nth i printable-chars)))
       ; (setq key-name (format "C-x C-%c" (nth i printable-chars)))
       (setq key-desc (keymap-lookup (current-global-map) key-name))
       (message " ---------- %S : %S" key-name key-desc)
       (setq i (1+ i))))

发现没有使用的绑定只有:

  • M-N
  • M-O
  • M-P
  • C-M G
  • C-M M
  • C-M Q
  • C-M X
  • C-M Y
  • C-M Z
  • C-x c
  • C-x g
  • C-x j
  • C-x y
  • C-x C-a
  • C-x C-g
  • C-x C-h
  • C-x C-y

M-n M-p 实际是配合其它命令使用的,不能再占用。

值得一提的是C-c本来是给用户使用的,但其它包可能会占用,Emacs自带的Org Mode就大量占用C-c,甚至Org自身的绑定都相互冲突。

无法保证其它Mode或者包可能占用组合,冲突问题无法化解。

我机器上,我会关掉所有可见的全局快捷键,以避免与Emacs绑定冲突。

于是,Emacs用户经常会面临一个问题,自定义命令,无键可绑!

Hyper键

Hyper存在于上古的Lisp machine,现在的键盘几乎没有这个键。

所以没有谁会使用这个键,这个对于用户来说可是一个宝贵资源。

但Hyper只存在传说中了,在硬件层面已经不支持。

USB标准里面根本没有空间给Hyper,一个字节已经占满,

出处:
https://files.microscan.com/helpfiles/ms4_help_file/ms-4_help-02-46.html

另外QMK中,也不支持Hyper键,这基本上证实,物理上的Hyper不存在了。

但Emacs并没有遗忘Hyper,可能是因为Lisp血统。

做法是在Emacs中把一个不常用的键映射成Hyper键,这个是纯属Emacs自己做的事,与物理上有没有Hyper没有关系。

下面的代码,把菜单键(KCAPP/KCMENU)配置成Hyper, 再把Hyper-b配置为打开ibuffer的快捷键。

复制代码
(setq w32-apps-modifier 'hyper) ; Menu key
(global-set-key (kbd "H-b") 'ibuffer)

这样在键盘上按着菜单键,同时按下b键,就可以打开ibuffer.

QMK改键方案

这个是本文的重点。

Hyper方案的缺点是来自Emacs,即在Emacs是Hyper,在其它地方是菜单键。

所以你会时不时的在其它软件上打开菜单,另加上一个字母。

另外菜单键本身不是Modifier,并不是为组合设计的,存在按键冲突的可能。

所以这个方案并不完美。

我现在的方案是使用F12以上的功能键,即F13-F24,(常规键盘不存在这些键,但是允许使用的),再加组合键,使这个组合几乎唯一。

复制代码
(setq custom-user-prefix-key "C-M-S-<f13> ")
(global-set-key (kbd (concat custom-user-prefix-key ";")) 'custom/move-to-midlle-forward)

这里使用Ctrl-Alt-Shift-F13做前缀,再加分号,执行一个自定义命令。

相信没有哪个厂家或者第三方包会使用这样一个怪异的组合了!

就算有,我还有F13后面的11个键可以选,再冲突比被陨石击中概率还小了!

但随之而来的问题是,自己如何方便都按下Ctrl-Alt-Shift-F13四个键呢?

直接的做法就是在QMK中录制这个组合的宏,再把这个宏赋值到你方便的键上。

但这个做法就是牺牲一个方便的键,这可是宝贵资源。

我的做法是,当这个键正常按下松开时,释放Ctrl-Alt-Shift-F13组合,

如果按住不放,着切换另一个键盘逻辑层。对应的键设置为LT(1,KCESC).

然后修改QMK源码,代码如下(位于keymap.c):

复制代码
bool process_record_user(uint16_t keycode, keyrecord_t *record) {

    bool is_continue = true;

    switch (keycode) {
    case LT(1,KC_ESC):
            if (record->tap.count && record->event.pressed) {

                register_code16( LCTL(LALT(LSFT(KC_F13))) );

                is_continue = false;        // Return false to ignore further processing of key
            } else if (record->tap.count && !record->event.pressed) {

                unregister_code16( LCTL(LALT(LSFT(KC_F13))) );
                is_continue = false;        // Return false to ignore further processing of key

            }
            break;
    }

    return is_continue;
}

至此,这个世界清静了很多!

你的绑定只要你顺手就可以了,不再有与他人冲突的问题!

相关推荐
星云_byto1 天前
五分钟从零配置好VSCode + Claude Code + DeepSeek V4 Pro
ide·vscode·编辑器·cursor·codex·claude code·deepseekv4
林熙蕾LXL2 天前
VSCode调试
ide·vscode·编辑器
2501_942389552 天前
小米寥寥几家车企设计汽车顶棚
华为·编辑器·时序数据库·harmonyos
VidDown20 天前
VidDown 工具站:免费、本地优先的开发者工具箱
javascript·编辑器·音视频·视频编解码·视频
VidDown20 天前
显卡处理视频技术详解:从硬解码到 NVENC,GPU 如何让视频处理起飞?
javascript·编辑器·音视频·视频编解码·视频
夜猫逐梦20 天前
【UE基础】03.蓝图与编辑器工作流
编辑器·ue·蓝图·ue编辑器
VidDown20 天前
视频帧率技术详解:从 24fps 到 120fps,帧率如何影响你的观看体验?
网络·网络协议·编辑器·音视频·视频编解码·视频
爱就是恒久忍耐20 天前
VSCode里如何比较2个branch
ide·vscode·编辑器
bloglin9999920 天前
vscode中可视化的合并分支,在“合并编辑器中解析”中“与基线进行比较”是什么意思
ide·vscode·编辑器
zyplayer-doc21 天前
企业知识库安全与权限管理完全指南:从加密到审计的六层防护
人工智能·安全·pdf·编辑器·创业创新