再见了,我可爱的 jk

双拼

早早就想学习双拼了,但一直拖延。高考后本来应该学的,顺便练习打字,但都最后无功而返。直到这周才去学习

我学习的是「xnheulpb」方案。微软拼音输入法没有这个方案,我自己手动添加了,注册表对应 HKEY_CURRENT_USER\Software\Microsoft\InputMethod\Settings\CHSUserDefinedDoublePinyinScheme0 项,值为 xnheulpb*2*^*iuvdjhcwfg^xmlnpbksqszxkrltvyovt

打了半个小时,基本键位都记住了,现在就是看肌肉记忆了。

然而由于我本身打字速度和准确率都不高,因此现在打字速度非常慢,所以本篇内容可能会比较短。而昨天那篇,因为我赶时间,就暂时切换回了全拼。

虽然我已经记住了键位,但是可能有一些不常用的可能会遗忘,或者有时候脑子抽了。因此我将桌面背景换成了键位图,以便查看,同时激励我尽快学好双拼,赶紧把这个丑陋的背景换掉。

这其实就是我桌面的截图,并不是背景原图,只不过我不在桌面放图标罢了。

逝去的 jk

我最喜欢的 jk,已经逝去了。我不知道她的名字,也不知道她的年龄,但我知道她是个 jk,她是个女孩子,她是个人。

这是 Copilot 给的提示,莫名其妙的,就记录下来。

随便搜一个 StackExchange 的问题,例如这个 Other ways to exit Insert mode besides Escape,就提到了使用 jkkj 退出 Insert 模式,进入 Normal 模式的方法。同时,在国内的许多教程中,也会建议进行下面的 mapping:

1
2
inoremap jk <Esc>
inoremap kj <Esc>

我不常用 kj,主要用的是 jk

可以说是相当的方便,毕竟 Esc 不好按,而且终端下 Esc 是前缀键,非常不方便。而英文输入中基本不会出现 jk 这个组合,因此也不会出现误触。

而且标准指法下,j k 正好是最有力的右手食指和中指,按起来既快又舒服,还有别样的节奏感。

同时注意到中文输入中也少见 jk 这个组合,我印象中意外退出只有「快捷键」这个词 kjj,别的组合似乎比较常用的就是「技科」了,不过我一般「技科」是打全的,没怎么误触过。因此我使用 AutoHotkey 使得我在中文输入下也能通过 jk 退出 Insert 模式。

1
2
3
4
5
6
#HotIf WinActive("^i🏷️.*✏️$") && WinActive("ahk_exe gvim.exe") && IsChinese()

#Hotstring * C0 ? X

::jk::SendInput("{Esc}")
::kj::SendInput("{Esc}")

然而我也提到了,最近我在学习双拼,jk 这个组合不可谓少见。我就想着使用不可能的拼音组合,我发现的使用相同按键的大概只有 jjtttt 不太习惯,因此更偏向于 jj

然而这面临一个问题,jj 不一定是一个字,譬如说「看见」这个词就是 kjjm。因此为了避免误触,只好使用三连击的方式,即 jjj。但是失去了节奏感,于是我就想着寻求更好的方法。

网上有提到用 CapsLock,但是遗憾的是 CapsLock 已经作为 Snippets 的键了,而且这个键我已经配得很好了,不想再动了。

于是我把目光移向了键盘上最大的键——Space。尝试用 AutoHotkey 映射热字串 jk,如果检测到 Space 是按下的状态,就发送 BackSpace + Esc

之所以要发送 BackSpace 是因为要去除输入的 Space。但是这个方案,从描述中也可以看出其不稳定之处。同时以这种方式退出了 Insert 模式,再次进入后原本是中文输入法,会变成英文输入法,非常麻烦。就抛弃了这个方案。

然后试过了 Shift + Space 的方案,还不错,但也有几个问题。

首先还是重中之重的问题,中英文切换问题,这个问题比上面还要严重一点。这个方案进入 Normal 模式后会变成中文输入法,同时回到 Insert 模式后会变成英文输入法,可以说是把所有的不便之处结合起来了。我测试了一下应该是微软拼音输入法使用 Shift 切换中英文的问题,因为我关闭 Shift 切换中英文后,这个问题就消失了。但是这个是万万动不得的,不然难道我要用 Ctrl 之类的来切换吗?

其次,我没想到 Shift + Space 这个组合键我还蛮常用的。主要是因为按下 Shift 键,比如 Normal 下用 A 进入行尾进行 Insert,按完 A 后我会先松 A,再松 Shift,但是先松掉的那只手很快会去按 Space,从而造成了误触。

因此这个方案也被我废弃了。尝试使用双击 Space 的方案。

但最终这个方案也被否决了,因我会造成 Space 的延迟。其实一点延迟也无什么所谓,但是如果按 Space + A,会导致 a 和空格偏移。我也没找到很好的解决方案,就放弃了。

最后只好额外添加一个 ; 双击的方案。不过这个方案跟 Snippet 的 short_math 有冲突。但很好解决,而且没啥负担,我就将 short_math 的触发键改为了 ,,,,

但我最熟悉的无疑还是 jk,本篇博文切换了很多次模式,还是有一大部分用的是 jk。但是呢还是得形成一个新的肌肉记忆,所以我决定写完本篇博文就废掉了 mappings 里的 jk

😭对不起 jk,你没有做错什么,你非常好用,我对你很满意,但是我不得不抛弃你,我怕我记忆里还留有你的影子,我怕我忘不了你,我必须抛弃你,请原谅我。

所以,就这样,这也是本篇博文标题和简介的由来。

再见了,我可爱的 jk。

AutoHotkey

我提到 AutoHotkey 的频率有点高,这类小脚本还是不要太过沉迷为好,应该多学点更有意义的东西。不过这次还是提一下比较好。

之前提及我在 WSL 简单迁移了一下 Windows 下 gVim 的配置,还遗留下来一个问题就是中英文输入法的切换。我也在这周进行了解决。

WSLVim.ahkGitHub
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#NoTrayIcon

#Include ..\..\..\Library\IME.ahk

SetTitleMatchMode "RegEx"

SetTimer(SmartWSLVimIMELang, 100)

global IME_Lang := 1 ; 1: 中文, 0: 英文

SmartWSLVimIMELang() {
static Mode := 1 ; 1: 插入 0: 命令
if WinActive("ahk_exe WindowsTerminal.exe") && WinActive("^[iR]🏷️.*✏️$") && GetIMELang() != IME_Lang {
IME_Lang ? Switch2Chinese() : Switch2English()
Mode := 1
}
else if WinActive("ahk_exe WindowsTerminal.exe") && WinActive("^[^iR]🏷️.*✏️$") && Mode {
Switch2English()
Mode := 0
}
}

#HotIf WinActive("^[iR]🏷️.*✏️$") && WinActive("ahk_exe WindowsTerminal.exe")
~Shift::global IME_Lang := !IME_Lang

搜了一下无法做到在某个窗口激活时执行命令,只好使用 SetTimer 来弄了,希望不会对性能有太大影响。

可以说比较完美地实现了我的目标。目前唯一缺憾就是单独的 r 无法实现输入法的切换,因为单独的 r 不会更新 titlestring,因此我无法知道模式的切换。以及搜索时的切换也做不到,毕竟普通命令模式还是英文输入法,只是搜索时才切换成 Insert 模式的输入法,而显示模式都是 c,我无法区分。好在两个问题都不算大,已经令我很满意了。

这段代码用到了我自己的 IME 库。

IME.ahkGitHub
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
GetIMELang() {
DetectHiddenWindows True
result := SendMessage(0x283, 0x001, 0, , "ahk_id " DllCall("imm32\ImmGetDefaultIMEWnd", "Uint", WinGetID("A"), "Uint"))
DetectHiddenWindows False
return result
}

ChangeIMELang(code) {
DetectHiddenWindows True
SendMessage(0x283, 0x002, code, , "ahk_id " DllCall("imm32\ImmGetDefaultIMEWnd", "Uint", WinGetID("A"), "Uint"))
DetectHiddenWindows False
}

GetIMECompatibility() { ; 1 为兼容模式,0 为不兼容模式(即新版)
DummyValue := RegRead("HKEY_CURRENT_USER\Software\Microsoft\CTF\TIP\{81D4E9C9-1D3B-41BC-9E6C-4B40BF79E35E}", "DummyValue")
NoTsf3Override2 := RegRead("HKEY_CURRENT_USER\Software\Microsoft\input\tsf\tsf3override\{81d4e9c9-1d3b-41bc-9e6c-4b40bf79e35e}", "NoTsf3Override2")
return (DummyValue == 0) && (NoTsf3Override2 == 1)
}

ChangeIMECompatibility(compatibility) {
RegWrite(!compatibility, "REG_DWORD", "HKEY_CURRENT_USER\Software\Microsoft\CTF\TIP\{81D4E9C9-1D3B-41BC-9E6C-4B40BF79E35E}", "DummyValue")
RegWrite(compatibility, "REG_DWORD", "HKEY_CURRENT_USER\Software\Microsoft\input\tsf\tsf3override\{81d4e9c9-1d3b-41bc-9e6c-4b40bf79e35e}", "NoTsf3Override2")
}

IsChinese() => (lang := GetIMELang()) == 1025 || lang == 1
IsEnglish() => (lang := GetIMELang()) == 0 || lang == 1024
Switch2Chinese() => ChangeIMELang(1025) ; 不支持兼容模式,因为兼容模式 GetIMELang() 返回值十分奇怪
Switch2English() => ChangeIMELang(0) ; 同上

IsShuangpin() => RegRead("HKEY_CURRENT_USER\Software\Microsoft\InputMethod\Settings\CHS", "Enable Double Pinyin")

正如注释所说,兼容模式下 GetIMELang 返回值非常奇怪,中文有时候是 1 有时候是 1025,英文有时候是 0 有时候是 1024,我也没摸清楚规律。然后切换语言模式的函数有时候能生效有时候不能。因此我就不支持兼容模式了。

再加上兼容模式确实丑陋,我又切回新版了。但是我也提到过新版 gVim 下会有问题,而既然我都用 SetTimer 了,不妨再深入一下,一并解决了。

gVIME.ahkGitHub
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#NoTrayIcon

#Include ..\..\..\Library\IME.ahk

SetTimer(gVimIMEwithCompatibility, 250)

gVIME_status := [1, 0] ; [vim, others]

gVimIMEwithCompatibility() {
static ime_compatibility
ime_compatibility := GetIMECompatibility()
vimactive := WinActive("ahk_exe gvim.exe")
if vimactive && ime_compatibility != gVIME_status[1]
ChangeIMECompatibility(gVIME_status[1])
else if !vimactive && ime_compatibility != gVIME_status[2]
ChangeIMECompatibility(gVIME_status[2])
}

#F1::ChangeIMECompatibility(gVIME_status[!WinActive("ahk_exe gvim.exe") + 1] := !GetIMECompatibility())

这个脚本为 gVim 和非 gVim 窗口设置了不同的输入法兼容模式状态,默认是 gVim 为兼容模式,非 gVim 为新版。同时也可以使用 Win + F1 来对两种窗口进行兼容模式的切换。

既然提到了这个热键,那就不得不提及 Run 里面各种奇葩的热键了。Run 为啥叫 Run 我也记不清了,但确实不知道更好的名字了,就沿用下去了。

Run.ahkGitHub
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#NoTrayIcon

#Include ..\..\Library\Clipboard.ahk
#Include ..\..\Library\IME.ahk

; 请将 Everything 目录放 PATH
#f::{
ClipLists := GetSelectedPath(), ClipSaved := ClipLists.saved, selected := ClipLists.path
if DirExist(selected)
; "Run(everything -path `"" selected "`"") ; 为路径则打开路径(包括子文件夹)
Run("everything -parent `"" selected "`"") ; 为路径则打开路径(不包括子文件夹)
else if FileExist(selected)
SplitPath(selected, &name), Run("everything -search `"" name "`"") ; 为文件则搜索文件名
else
Run("everything -search `"" selected "`"") ; 不为路径则搜索指定内容
A_Clipboard := ClipSaved, ClipSaved := ""
}

^Space::{
ProxyStatus := RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings", "ProxyEnable")
RegWrite(ProxyStatus := !ProxyStatus, "REG_DWORD", "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings", "ProxyEnable")
ToolTip("Proxy has been switched " (ProxyStatus ? "On." : "Off."))
SetTimer(() => ToolTip(), -1000)
}

#+F1::{
RegWrite(ShuangpinStatus := !IsShuangpin(), "REG_DWORD", "HKEY_CURRENT_USER\Software\Microsoft\InputMethod\Settings\CHS", "Enable Double Pinyin")
ToolTip("已" (ShuangpinStatus ? "启用" : "关闭") "双拼。")
SetTimer(() => ToolTip(), -1000)
}

#!Space::{
TouchpadStatus := RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\PrecisionTouchPad\Status", "Enabled")
Run("SystemSettingsAdminFlows.exe EnableTouchPad " (TouchpadStatus := !TouchpadStatus))
}

Win + F 使用 Everything 搜索,可以说非常常用。

不过我在 Windows11 中使用发现有时候会触发 Feedback,当时(好像是 7 月)还交过一次,然后它说我是未成年人,无法反馈。我有点乐,搜了一下还发现一个更乐的东西

所以,你们的意思是青少年不配提出意见吗?我要求微软给我个合理的解释,并作出相应得到补偿,以补偿我在这不愉快的使用中受到的心理伤害。否则我将寻求青少年保护机构的帮助对你们发起公诉。

我想我不太用得到这个功能,就卸掉了。Windows10 就没这个问题,也许是早就卸掉了?

在 11 会发现 AutoHotkey 有关 Win 的热键有时候会触发原本的功能,也许是因为我没关 UAC?以前我是关掉的,现在为了安全就一直保持默认,确实不方便了一点,但我也习惯了。

以前我是用 F8 进行 Snipaste 截图的,这些热键当时都是随便分配的,结果沿用至今。但 FKey 还是给更有意义的热键留着比较好,而且很多程序都会用到 FKey,因此我就想改为 PrintScreen

但是出于我上面提到的原因,我映射 PrintScreen 后还是调起了默认的截图工具(不管是 Snipaste 设置还是 AutoHotkey 映射)。没找到好的解决方案,就使用 PowerToys 将 PrintScreen 映射为 ScrollLock,然后再为 Snipaste 设置 ScrollLock 为截图热键。

不过相当于废掉了 ScrollLock,但这个键我也没用过,也就无所谓了。

也是基于上面的理由,我把 OCRC 的热键也换了。换成了 Win + 1Win + 2,没错,就是那么的随意,毕竟想热键也是一个技术活。不过我其实提到过不能映射 Win 的热键,但是我直接改配置文件就绕过去了,界面显示的是「无」。

不过也是有我上面提及的问题,比如我刚刚试了一下 Win + 1,打开了我任务栏第一个应用 Microsoft To Do。不过也算是少见现象,刚刚是我第一次触发。

绕远了。然后是 Ctrl + Space 切换代理。这个热键我觉得可以换一下,毕竟我现在不常切换代理。

Win + Shift + F1 切换双拼。还有一个 Win + Alt + Space 切换触控板,也就是左下方连着的三个按键。

有时候不想用触控板,例如形策课写作业,空间小,书只好放在键盘下,但是容易碰到触控板,这个时候就可以关闭了。

OJ

OJ commits 信息每次都要自己敲太麻烦了,Copilot 又不记得我上次怎么写的,每次瞎给建议。于是写了个 Snippets,自动生成 commits 信息。

本周 OJ 作业第一题,行为题。有一个

ant-hengxin 在作业截止之前把自己的 AC 代码上传到了 github 的公开仓库;

有点心虚,因此我现在截止前不 push 了,写完时只 commit,等截止后再 push。不过似乎看不出来我何时 push 的,只看得出来我在作业期间 commit 了。要真出事我似乎跳进黄河也洗不清啊。

行为题错了近 10 次,惭愧。最关键的是我眼瞎,导致我把唯三不确定的都试了才发现还有一个是错的。

最后一题还没 AC,时间超限了,我用了快排还超,估计是要用二分查找。不过现在累了,不想写,加上罚时已经爆掉了,也不着急像上次一样赶紧做完排在前面。等过几天,或者下周二看一下蚂蚁老师的视频,学习一下再做吧。

另外明天就要机试了,我还没机试过呢,既有点期待又有点紧张。祝我好运吧。

机试电脑配置要先关掉保存自动格式化,它默认格式化的格式与我的风格不一致,只会添乱。

然后自己弄几个简单的 mappings,复杂的也实现不了,也没啥必要。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
let g:mapleader = " "

inoremap jk <Esc>
inoremap kj <Esc>
inoremap jjj <Esc>
inoremap ;; <Esc>
nnoremap U <C-r>
noremap ; :
noremap : ,
noremap , ;
noremap ` '
noremap ' `
noremap H 0
noremap L $
noremap k gk
noremap gk k
noremap j gj
noremap gj j

再次看到 jk,触景伤情啊。

打水

之前的杂记就想说了,结果一直忘记了,趁现在还有印象,赶紧写一下。

在数次打水花费 0.03元后,我决定研究一下收费规则。

最终我得出了重要的实验定理:

打水收费第一定理

打水收费 0.01元/10秒。

但同时我还注意到

打水收费第二定理

卡着 10秒时会开启第二次收费。

因此打一次水最好的时间是 8~9秒。

对于我 500mL 的水杯,同时需要较热的水,可以采取以下策略:

  1. 先接冷水。接大概 8~9秒,拔卡。收费 0.01元。
  2. 再接热水。接至壶满为止,拔卡。收费 0.01元。

由此可以实现 500mL 热水 0.02元,可以说是最优策略了。同时这个策略打水,水温也是非常适宜的:8秒热水时可以达到即打即喝的效果,非常滋润;9秒的热水可以有稍热的感觉,也是我高中最常喝的水温,也是无与伦比。

DDL

物理视频

我以为物理视频是期末作业,结果跟小组成员一碰头才知道居然是期中作业,11 月中旬就要交。

为了让我看起来没有摆烂,我主动领了字幕的工作。其实我也没搞过啥字幕,修改过一部分错字,稍微调过一点轴,或者是别的字幕的特效字幕迁移到另一个字幕。因此这个任务对我来说也算是一个挑战。

不过我也没打算做得多好,我初衷就是应付一下得了。不过可惜的是我们的组长相当有野心,只不过他的组员们比较摆烂。

好在一个晚上把拍摄工作完成了,我的垃圾笔记本居然还充当了摄像工作。不过我整理视频时发现笔记本摄像头不仅模糊,音质还不行,有的地方突然没声音了。可怜了我们后期工作的组长了。

字幕文字我已经录进去了,只差成品出来我调一下轴了。不过我们念台词跟剧本稍有不同,但我也懒得改了。

美育

这个月末就要交第一次作业了。而我习惯上将下一周中间的任务在本周周末完成(当然,只是习惯,并不是每次都能做到,相反,很多次都要拖几天),因此,明天实质上就是 DDL 了。而我现在还啥也作业都没写,而明天一定要做的还有英语作业,以及明天还有机试,我还得复习一下什么的。

不过放轻松,分流主要看的是 CPL,微积分,线代和信物。其他几门,我对学分也比较随意,能过就行了,别挂就行了。

微积分 & 线代

马上要期中考试了,笔记差了一大截。补估计是来不及了。

信物

最近讲热学,似乎又回到了讲分析力学的时候。笔记也落后一大截了。而且这个是下周五就考。

误会

上篇博文发牢骚,这篇需要对一些地方进行澄清。

Edge

Ctrl + W 用不了其实是我的问题。

恢复插件键盘映射时,我使用 Ctrl + W 关掉窗口,可能误点击了了某处,导致其被作为一个热键。

但要不是 Edge 吞了我的数据,我回去恢复映射吗?所以还是 Edge 的锅😄。

不过今天 Edge 又抽风了,不知道更新了啥,地址栏会有个红色方框遮住,估计是保护隐私什么的。

但是我没找到具体设置在哪里,搜索也没搜到,找更新日志也没找到。而且红色也太刺眼了吧。

而且这保护隐私功能甚是鸡肋,反而有时候阻碍了我的视线。就是保护隐私,也没起到:

可以看到,下面的提示栏还是应有尽有。

而且如果想要复制地址栏地址的一部分的话,选中的部分会变红,影响视野,也很不舒服。

次日更新

果然是 Edge Insider 的问题,昨天搜太早了还没看到有人反馈,今天就在 Reddit 上看到了:例如这个 Edge search bar has a red highlight blocking text。可惜的是除了回到稳定版外,似乎只能等待 Edge 更新了。

文件资源管理器

上周我还提到了文件资源管理器加载慢的问题,也证实了是 WSL 的问题。

实际上一开始我就怀疑是 WSL 的问题——我把 WSL 的 ~ 文件夹放到了导航栏——删掉就好了。只不过不知为何我迟迟没有尝试,硬是忍耐了好几周。

微信

上周我提到过我开了一个 issue,得到了作者积极的回应。

作者还给我发了一封邮件,让我可以加一下他的微信,一起交流一下。

这也是除了 Anki 前主要译者之外,第二个有人给我发邮件了,不过很简短。

其实说是交流,但我毕竟才疏学浅,只有他对我的指导罢了,我没有什么有意义的见解可以提供给他的。我也只是从一个普通用户的角度给他提的 issue。不过值得高兴的是,他给我 AutoHotkey 脚本的仓库 star 了。也是我目前 star 最多的仓库,虽然只有 2 个(第一个是 cgt 点的)。

说回到这微信,除了这位 showKeyBoard 的作者外,我的好友大部分都是见过面的:有亲人,有小学同学,有初中同学,有高中同学,有大学同学,有高中老师,有南大招生老师,有卖早餐的巩师傅,有照相馆的老板,有志愿服务的志愿者……当然还有几位(其实只有一位)是我没见过面的,我也不知道咋加了微信,也是深中的同学,但不是同班同学,我也不知道是哪个班的。似乎是高中开学前认识的?没什么印象了,算是个例外。

有必要澄清一下,所有我的微信好友都是看不了我的朋友圈的。因为我屏蔽了所有人,每次加好友顺便屏蔽一下。对外的口径就是我不发朋友圈。当然实际上不完全正确,我发了朋友圈,只不过还设置为私密,算是再上一道保险。

总共也就四篇,估计未来不会再发了,毕竟我有私博了(虽然一个多一直没弄摆记了,更何况自己写)。发布日期有一篇是 2022 年,其他三篇都是 2023 年的。2022 年的那篇是 5 月 25 日发的。2023 年的分别是 5 月 23 日、5 月 25 日和 8 月 18 日发的。

那就先这样吧。