做异端中的异端 -- 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;
}
至此,这个世界清静了很多!
你的绑定只要你顺手就可以了,不再有与他人冲突的问题!
相关文章:

做异端中的异端 -- 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…...

Java多线程介绍及使用指南
“多线程”:并发 要介绍线程,首先要区分开程序、进程和线程这三者的区别。 程序:具有一定功能的代码的集合,但是是静态的,没有启动运行 进程:启动运行的程序【资源的分配单位】 线程:进程中的…...

HarmonyOS 5.0应用开发——列表(List)
【高心星出品】 文章目录 列表(List)列表介绍列表布局设置主轴方向设置交叉轴方向 列表填充分组列表填充 滚动条位置设置滚动位置滚到监听 列表项侧滑 列表(List) 列表介绍 列表作为一种容器,会自动按其滚动方向排列…...
自动化电气行业的优势和劣势是什么
优势 市场需求广泛: 自动化电气技术广泛应用于电力系统、制造业、交通、农业等多个领域,随着智能化、数字化趋势的加强,其市场需求持续增长。在智能制造、智能电网等领域,自动化电气技术更是发挥着关键作用,推动了行业…...
第 42 章 - Go语言 设计模式
在Go语言中,设计模式是一种被广泛接受的解决常见问题的最佳实践。这些模式可以分为三类:创建型模式、结构型模式和行为型模式。下面我将结合案例以及源代码对这三种类型的设计模式进行详细讲解。 创建型模式 创建型模式主要关注对象的创建过程…...
【机器学习】---大语言模型
引言:开启大语言模型的奇幻旅程 近年来,人工智能(AI)领域正在经历一场前所未有的技术革命,而其中最耀眼的明星莫过于大语言模型(Large Language Models, LLMs)。这些模型,犹如现代科…...

挑战用React封装100个组件【002】
项目地址 https://github.com/hismeyy/react-component-100 组件描述 组件适用于需要展示图文信息的场景,比如产品介绍、用户卡片或任何带有标题、描述和可选图片的内容展示 样式展示 代码展示 InfoCard.tsx import ./InfoCard.cssinterface InfoCardProps {t…...

MarkDown-插入图片-图片url地址的生成获取方法
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、url地址是什么二、如何获取图片的url地址1.了解图床2.使用图床获取图片URL地址2.1进入网站后,点击右下角“Select Image.”按钮,即可…...

插值、拟合和回归分析的相关知识
目录 0 序言 1 分段线性插值 2 多项式插值 3 样条插值 4 最小二乘拟合 5 多元线性回归 0 序言 在生产实践和科学研究中,常常有这些问题: 插值问题:由实验或测量得到变量间的一批离散样点,要求得到变量之间的函数关系或得到样点之外的…...

【小白学机器学习42】进行多次抽样,样本的分布参数和总体的分布参数的关系
目录 1 进行多次抽样,样本的分布参数和总体的分布参数的关系 2 样本容量越大,多次抽样的样本的分布参数和总体的分布参数的关系 3 随着样本容量增大,多次抽样均值的 平均值,方差的变化 4 随着样本容量增大,多次抽…...
链动星海 质引未来|中信银行加码科技金融 “接力式”服务助力“新质生产力”释放
11月26日,第二届中国国际供应链促进博览会(以下简称链博会)在北京中国国际展览中心开幕。中信集团以“链动星海 质引未来”为主题,亮相先进制造链展区。此次布展由中信金控主办、中信银行承办,携手中信证券、中信建投证…...
黑马2024AI+JavaWeb开发入门Day02-JS-VUE飞书作业
视频地址:哔哩哔哩 讲义作业飞书地址:飞书 一、作业1 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge">&l…...

云计算基础-期末复习
第一章:云计算概论 一、云计算的定义与特征 1. 定义: 云计算是一种通过网络以按需、可扩展的方式获取计算资源和服务的模式。它将计算资源视为一种公用事业,用户可以根据需求动态获取和释放资源,而无需了解底层基础设施的细节。…...

Java GET请求 请求参数在Body中使用Json格式传参
业务需要调个三方接口 使用GET请求方式 但是!请求参数不在Query中,竟然在Body中,使用Json格式传参 在API调试工具里面可以调通 在java代码里,死活调不通 网上搜了搜,找到一个靠谱的,记录一下 import o…...

AI数据分析工具(一)
Looker Studio(谷歌)-免费 优点 免费使用:对于中小型企业和个人用户来说,没有任何费用压力,可以免费享受到数据可视化和报表创建的功能。与Google服务集成:特别适合使用Google产品生态的企业,…...

go结构体匿名“继承“方法冲突时继承优先顺序
在 Go 语言中,匿名字段(也称为嵌入字段)可以用来实现继承的效果。当你在一个结构体中匿名嵌入另一个结构体时,嵌入结构体的方法会被提升到外部结构体中。这意味着你可以直接通过外部结构体调用嵌入结构体的方法。 如果多个嵌入结…...
【049】基于51单片机语音录放【Proteus仿真+Keil程序+报告+原理图】
☆、设计硬件组成:51单片机最小系统ISD4004语音芯片LM386音频放大器喇叭LCD1602液晶显示按键控制LED灯。 1、本设计采用STC89C51/52、AT89C51/52、AT89S51/52作为主控芯片,LCD1602液晶显示屏实时显示; 2、系统具有两种模式:录音…...

《软件项目管理》期末-复习题及参考答案
(1)赶工一个任务时,你应该关注( C ) A. 尽可能多的任务 B. 非关键任务 C. 加速执行关键路径上的任务 D. 通过成本最低化加速执行任务 (2)下列哪个不是项目管理计划的一部分?&#x…...
milvus 通俗易懂原理
向量值如何生成的 Milvus 是一个开源的向量数据库,专门用于处理高维向量的存储、搜索和分析。向量值本身通常来自于某些机器学习或深度学习模型的输出,尤其是在自然语言处理(NLP)、计算机视觉(CV)、推荐系…...
什么是撞库、拖库和洗库?
“撞库”是黑客通过收集互联网已泄露的用户和密码信息,生成对应的字典表,尝试批量登陆其他网站后,得到一系列可以登录的用户。 很多用户在不同网站使用的是相同的帐号密码,因此黑客可以通过获取用户在A网站的账户从而尝试登录B网…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...