做异端中的异端 -- 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;
}

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

内容概要:文档《软件测试经典面试题.docx》汇总了软件测试领域的常见面试题及其参考答案。涵盖的主题包括但不限于兼容性测试、性能测试、单元测试、集成测试、系统测试、Bug管理、测试工具(如Bugzilla、LoadRunner、QTP)、测试用例设计、测试流程、测试类型的区别与联系、测试中的沟通技巧、测试环境搭建、网络与操作系统基础知识等。文档不仅涉及具体的测试技术和工具,还包括了对测试人员职业发展的探讨,如测试工程师应具备的素质、职业规划、如何处理与开发人员的关系等。 适用人群:具备一定编程基础,尤其是有志于从事软件测试工作的人员,以及希望提升自身测试技能的专业人士。 使用场景及目标:①帮助求职者准备软件测试相关岗位的面试;②为在职测试工程师提供技术参考和职业发展建议;③为项目经理或HR提供招聘软件测试人员时的面试题目参考;④帮助理解软件测试在软件开发中的重要性及其实现方法。 阅读建议:本文内容详实,涵盖面广,建议读者根据自身需求选择性阅读。对于面试准备,重点关注面试题及其解答思路;对于技术提升,深入理解测试工具和方法;对于职业发展,思考测试人员所需素质及职业规划。同时,结合实际工作中的案例进行理解和实践,有助于更好地掌握和应用这些知识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值