欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > 做异端中的异端 -- Emacs裸奔之路3: 上古神键Hyper

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

2025/2/26 0:18:39 来源:https://blog.csdn.net/tms_li/article/details/144130631  浏览:    关键词:做异端中的异端 -- 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;
}

至此,这个世界清静了很多!
你的绑定只要你顺手就可以了,不再有与他人冲突的问题!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词