kmonad主要解决的是键盘的布局问题。
因为键盘的一般布局大量使用小拇指,来按esc
等按键,kmonad可以缓解这个问题。
还有一些小键盘,缺少一些按键,或者你的键盘有一些按键坏了,都可以用kmonad。
kmonad也可以让那些不具备改键等功能的键盘实现复杂的功能。
kmonad也可以在linux,mac运行,但是需要稍微调整配置文件。
kmonad主要难点是配置文件,这里简单介绍一下,并提供一个windows下可以快速使用的配置。
基础配置
我们主要关注deflayer default
(defcfg
;; For Linux
;; input (device-file "/dev/input/by-id/usb-04d9_daskeyboard-event-kbd")
;; output (uinput-sink "My KMonad output"
;; To understand the importance of the following line, see the section on
;; Compose-key sequences at the near-bottom of this file.
;; "/run/current-system/sw/bin/sleep 1 && /run/current-system/sw/bin/setxkbmap -option compose:ralt")
;; cmp-seq ralt ;; Set the compose key to `RightAlt'
;; cmp-seq-delay 5 ;; 5ms delay between each compose-key sequence press
;; For Windows
input (low-level-hook)
output (send-event-sink)
;; For MacOS
;; input (iokit-name "my-keyboard-product-string")
;; output (kext)
;; Comment this is you want unhandled events not to be emitted
fallthrough true
;; Set this to false to disable any command-execution in KMonad
allow-cmd true
)
(deflayer default
_ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _
)
(defsrc
esc f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12
grv 1 2 3 4 5 6 7 8 9 0 - = bspc
tab q w e r t y u i o p [ ] \
caps a s d f g h j k l ; ' ret
lsft z x c v b n m , . / rsft
lctl lmet lalt spc ralt rmet cmp rctl
)
注意,如果你的键盘没有f功能键,需要在deflayer和defsrc删除对应的按键。如果你的键盘没有数字键也要删除对应的按键。你可以去仓库找一些现成的键位。kmonad/keymap at master · kmonad/kmonad (github.com)
调换caps和lctl
(deflayer default
_ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _
lctl _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _
caps _ _ _ _ _ _ _
)
很简单,调换两个键的位置,非常直观。
单击lctl输出esc
esc
太远了,还有按错的问题,kmonad区分按下弹起和按住两个行为,这样一个键就实现了两个功能。
(defalias
ce (tap-next-release esc lctl)
)
(deflayer default
_ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _
@ce _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _
caps _ _ _ _ _ _ _
)
顺便一说,这个配置文件是lisp语言,主要语法是(func arg1 arg2)。
加层
但是这样键位还是不够,特别是对于60键位之类的键盘,这个就需要加一层键位,通过一个按键启动这个层,不当的层设置可能会导致你回不到原来的层,这里只介绍按下时触发的层。
(deflayer default
_ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _
@ce _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _
caps _ _ @spc _ _ _ _
)
...
;; ---- Space ----- {{{
(defalias spc (tap-hold 200 spc (layer-toggle space)))
(deflayer space
_ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ left down up rght _ _ _
_ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _
)
;; ---------------- }}}
我们先定义了一个别名,spc,它在200毫秒完成单击空格的时候会发送空格,按住的时候跳转到space
层
再定义了一个space
的层,在上面将hjkl变成上下左右。
最后我们用@spc
替换原来的空格。
之后可以参考仓库中其它的布局,比如下面这个mac的布局。
因为winodws的空格比较长,把右alt改成退格并不是很方便,这也是传统键盘的通病,就是太不能利用大拇指。
但是把数字键和标点集中在主键盘区可以参考。
最后,配置文件就为这样。
(defcfg
;; For Linux
;; input (device-file "/dev/input/by-id/usb-04d9_daskeyboard-event-kbd")
;; output (uinput-sink "My KMonad output"
;; To understand the importance of the following line, see the section on
;; Compose-key sequences at the near-bottom of this file.
;; "/run/current-system/sw/bin/sleep 1 && /run/current-system/sw/bin/setxkbmap -option compose:ralt")
;; cmp-seq ralt ;; Set the compose key to `RightAlt'
;; cmp-seq-delay 5 ;; 5ms delay between each compose-key sequence press
;; For Windows
input (low-level-hook)
output (send-event-sink)
;; For MacOS
;; input (iokit-name "my-keyboard-product-string")
;; output (kext)
;; Comment this is you want unhandled events not to be emitted
fallthrough true
;; Set this to false to disable any command-execution in KMonad
allow-cmd true
)
(defalias
ce (tap-next-release esc lctl)
)
(deflayer default
_ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _
@ce _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ @lw _ _ _ @rs _ _ _ _
caps _ _ @spc _ _ _ _
)
(defsrc
esc f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12
grv 1 2 3 4 5 6 7 8 9 0 - = bspc
tab q w e r t y u i o p [ ] \
caps a s d f g h j k l ; ' ret
lsft z x c v b n m , . / rsft
lctl lmet lalt spc ralt rmet cmp rctl
)
;; ---- Space ----- {{{
(defalias spc (tap-hold 200 spc (layer-toggle space)))
(deflayer space
_ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ left down up rght _ _ _
_ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _
)
;; ---------------- }}}
;; ---- Raise ----- {{{
(defalias rs (tap-hold 150 m (layer-toggle raise)))
(deflayer raise
_ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ & _ _ _ ^ \_ + _ _ _
_ ! @ # $ % ^ & * \( \) | _
_ _ ` _ _ _ _ _ _ { } _
_ _ _ _ _ _ _ _
)
;; ---- Lower ----- {{{
(defalias lw (tap-hold 150 c (layer-toggle lower)))
(deflayer lower
_ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ _ _ _ _ _ _ _ _
_ _ _ _ _ _ 1 2 3 - = _ _ _
_ _ _ _ _ _ 4 5 6 _ _ \\ _
_ _ ~ _ _ _ 7 8 9 [ ] _
_ _ _ _ _ _ _ _
)
;; ---------------- }}}
你也可以尝试去运行命令,类似dat (cmd-button "date >> test.txt")
,但是不太推荐滥用就是了。
你可以参考仓库中其他键位,甚至是其他软件的改键方式。如果这些不能满足你的需求,可以看看仓库的配置文件说明。
也欢迎分享你的配置文件和思路。
对了,kmonad也是类似AHK通过发送消息来实现按键的,这和原来单击按键不同,有些软件可能不能响应按键。至少我发现listary不能响应ctrl触发。