高级功能
高级功能
高级功能
虚拟按键
您最多可以定义 767 个虚拟键。这些键不直接映射到任何物理按键的按下或释放。虚拟键可以通过特殊操作激活:
(on-press <操作> <虚拟键名称>)或 on↓
:按下相关输入键时激活虚拟键操作。(on-release <动作> <虚拟键名称>) 或 on↑
:释放关联的输入键时激活虚拟键动作。(on-idle <空闲时间> <操作> <虚拟键名称>)
:当 kanata 空闲至少空闲时间毫秒时激活虚拟键操作。(hold-for-duration <保持时间> <虚拟键名称>)
:按虚拟键保持时间毫秒。如果在释放之前在虚拟键上重新触发按住持续时间,则时间将重置,无需其他按下/释放事件。
<action>
参数可以是以下之一:
- 点击虚拟键| tap-vkey:按下并释放虚拟键。如果该键已被按下,则只会将其释放。
- 按虚拟键 | press-vkey:按虚拟键。在另一个操作触发释放或点击之前,它不会被释放。如果该键已被按下,则不会执行任何操作。
- 发布虚拟键 | release-vkey:释放虚拟密钥。如果尚未按下,则不会执行任何操作。
- 切换虚拟键 | toggle-vkey:如果尚未按下虚拟键,则按下该虚拟键,否则释放它。
虚拟键可以在 defvirtualkeys 配置条目中定义。配置此条目类似于 defalias,但您不能使用内部别名来缩短操作。您可以参考之前定义的虚拟按键。
进一步扩展空闲动作,“kanata”已经空闲的措辞很重要。即使键盘空闲,kanata 也可能还没有空闲。例如,如果正在播放长时间运行的宏,或者 kanata 正在等待大写单词或踢踏舞等操作超时,则 kanata 尚未空闲,并且 <idle time>
参数的滴答计数不会即使您不再按下任何键盘按键,也要进行计数。
例子:
(defvirtualkeys
;; Define some virtual keys that perform modifier actions
ctl lctl
sft lsft
met lmet
alt lalt
;; A virtual key that toggles all modifier virtual keys above
tal (multi
(on-press toggle-virtualkey ctl)
(on-press toggle-virtualkey sft)
(on-press toggle-virtualkey met)
(on-press toggle-virtualkey alt)
)
;; Virtual key that activates a macro
vkmacro (macro h e l l o spc w o r l d)
)
(defalias
psf (on-press press-virtualkey sft)
rsf (on-press release-virtualkey sft)
tal (on-press tap-vkey tal)
mac (on-press tap-vkey vkmacro)
isf (on-idle 1000 tap-vkey sft)
hfd (hold-for-duration 1000 met)
)
(deflayer use-virtual-keys
@psf @rsf @tal @mac a s d f @isf @hfd
)
较旧的假钥匙文档
有关更多背景信息,您可以阅读引发虚拟键创建的问题。
虚拟按键值得注意的一点是,它们并不总是会打断活跃的踢踏舞渴望的状态。如果将宏动作分配给虚拟键,则不会中断踢踏舞。然而,大多数其他动作类型,尤其是像 rsft 这样的“正常”关键动作,仍然会打断踢踏舞。
序列
sldr动作使kanata进入“序列”模式。动作名称是“序列领导者”的缩写。这来自 Vim,它具有可配置序列引导键的概念。在序列模式下,不会键入按键(默认情况下),但会保存按键,直到发生以下情况之一:
- 键入的键与任何序列都不匹配
- 自最近一次按键以来经过的序列超时毫秒数
序列的配置与 defvirtualkey 类似。对的第一个参数必须是定义的虚拟键名称。第二个参数是按键列表,按定义的顺序键入时将激活虚拟按键。更准确地说,触发的动作是:
(按下时 tap-vkey <虚拟键名称>)
例子:
(defseq git-status (g s t))
(defvirtualkeys git-status (macro g i t spc s t a t u s))
(defalias rcl (tap-hold-release 200 200 sldr rctl))
(defseq
dotcom (. S-3)
dotorg (. S-4)
;; The shifted letters in parentheses means a single press of lsft
;; must remain held while both h and then s are pressed.
;; This is not the same as S-h S-s, which means that the lsft key
;; must be released and repressed between the h and s presses.
https (S-(h s))
)
(defvirtualkeys
dotcom (macro . c o m)
dotorg (macro . o r g)
https (macro h t t p s S-; / /)
)
有 10 个特殊键,名称为 nop0-nop9,kanata 特别对待。 Kanata 永远不会发送这些键的操作系统事件,但它们仍然可以参与序列。
请参阅下面使用 nop 键与模板一起定义序列的示例。
例子:
(defsrc f7 f8 f9 f10)
(deflayer base
sldr nop0 nop1 nop2)
(deftemplate seq (vk-name input-keys output-action)
sldr(defvirtualkeys $vk-name $output-action)
sldr(defseq $vk-name $input-keys)
)
;; template-expand has a shortened form: t!
(t! seq dotcom (nop0 nop1) (macro . c o m))
(t! seq dotorg (nop0 nop2) (macro . o r g))
如果 10 个特殊 nop 键看起来不够,您可以对序列进行创意,并将其中一些视为前缀修饰符。例如,您可以通过将 nop0-nop5 视为正常,同时将 nop6-nop9 视为始终后跟第二个 nop 键的前缀来获得 24 个“键”。
例子:
(defalias
nop0 nop0
;; ...
nop5 nop5
nop6 (macro nop6 nop0)
;; ...
nop11 (macro nop6 nop5)
;; ...
nop18 (macro nop9 nop0)
;; ...
nop23 (macro nop9 nop5)
)
以任意顺序重叠键
在 defseq 配置项的按键列表中,特殊的 O-list 前缀可用于表示一组按键,在释放任何按键之前必须先按下这些按键才能匹配序列。
例如,O-(a b c) 等价于 O-(c b a)。
例子:
(defvirtualkey hello (macro h (unshift e l) 5 (unshift l o)))
(defseq hello (O-(h l o)))
警告 | 序列在幕后实现此功能的方式是为重叠键的每个排列生成一个序列。这会使 kanata 占用大量内存。因此,给定 O-(…) 列表中允许的最大键数为 6,但您仍然可以向序列添加更多键,包括更多 O-(…) 列表。执行上述操作可以增加 kanata 的内存消耗。 |
更高级用法的示例
覆盖全局超时和输入模式
使用 sldr 的替代方法是序列操作。语法是(序列<超时>)。这会进入序列模式,序列超时时间与全局配置的不同。
还可以使用第二个参数来调用序列操作。第二个参数是序列输入模式的覆盖:
(sequence <timeout> <input-mode>
)
例子:
;; Enter sequence mode and input . with a timeout of 250
(defalias dot-sequence (macro (sequence 250) 10 .))
;; Enter sequence mode and input . with a timeout of 250 and using hidden-delay-type
(defalias dot-sequence (macro (sequence 250 hidden-delay-type) 10 .))
有关序列的更多信息
有关序列的更多背景信息,您可以阅读序列的设计和动机。您可能还对描述序列中和弦的文档感兴趣,以了解序列中和弦的行为方式。
输入和弦
不要与输出和弦混淆,和弦操作允许您根据同时按下输入键的特定组合来执行各种操作。这种无序的键组合称为“和弦”。每个和弦可以执行不同的动作,允许您将最多 2^n - 1 个不同的动作绑定到 n 个键。
输入和弦的配置与 defalias 类似,在每个 defchords 组的开头有两个额外的参数:组的名称和超时值,在该超时值后,如果不是通过释放按键或按下非和弦来触发和弦,则和弦将被触发超时到期前的密钥。
(defsrc a b c)
(deflayer default
@cha @chb @chc
)
(defalias
cha (chord example a)
chb (chord example b)
chc (chord example c)
)
(defchords example 500
(a ) a
( b ) b
(a c) C-v
(a b c) @three
)
每对的第一项指定组成给定和弦的键。每对的第二项是按下给定和弦时要执行的动作,并且可以是任何常规或高级动作,包括别名。然而,它目前不能包含另一个和弦动作。
请注意,与 defseq 不同,这些键并不直接对应于真实的键,而只是在和弦上下文中有意义的任意标签。通过将层中的键配置为映射到(和弦名称键)动作,将它们映射到层中的真实键,其中名称是和弦组的名称(上面的示例),键是这些任意标签之一。
将这些进入“和弦模式”的和弦动作嵌套在踢踏舞等其他动作中是完全有效的,并且会像人们预期的那样工作。然而,这仅适用于用于进入“和弦模式”的第一个键。一旦“和弦模式”激活,所有其他键将直接由“和弦模式”处理,而不考虑包装器操作;例如如果按下某个键并且将其映射到带有和弦的敲击保持作为其中的保持动作,则该和弦键将立即激活,而不是需要在超时期间保持的键。
释放行为
对于单键操作和输出和弦(如 lctl 或 S-tab)以及按住时的分层,只有当属于输入和弦的所有键都已释放时,输入和弦才会释放操作。换句话说,如果即使为输入和弦按住一个键,那么输出动作将继续被保持,但仅限于提到的动作类别。当在 multi 内部使用但不适用于任何其他操作时,该行为也适用于上述操作。
对于通常适用的动作类别,上述行为的一个例外是发生和弦分解。当您输入不对应于任何动作的和弦时,就会发生和弦分解。发生这种情况时,kanata 会将按键分开,以激活输入和弦组件中的其他操作。在这种情况下,将发生下一段中描述的行为。
对于和弦分解和所有其他动作类别,释放行为更令人困惑:在超时期间释放任何键时输出动作将结束,或者如果超时到期,则在和弦中按下第一个键时输出动作结束被释放。这种不一致是当前实现的限制。在这些情况下,如果您想继续按住,建议按住所有键;如果您想释放,建议释放所有键。这是因为可能很难知道首先按下的是哪个键。
如果您想绕过为和弦输出按住按键的行为,您可以将和弦输出操作更改为宏。使用宏将保证输出键的快速按下+释放。
去混叠环境
笔记 | 该配置项较旧,您可能想使用更新且更通用的环境条件配置。 |
defalias 有一个变体:defaliasenvcond。此变体的解析方式类似,但在所有名称-操作对之前必须有一个额外的列表参数。
该列表必须包含两个字符串。这些字符串依次为:环境变量名称和环境变量值。当启动 kanata 时,名称定义的环境变量具有相应的值,其中的别名将被激活。否则,将跳过别名。
defaliasenvcond 的一个用例是当一个人拥有多个按键布局不同的设备时,例如底行有不同的特殊键。使用环境变量,当这些物理按键位置处的硬件按键不相同时,可以在这些多个设备上使用相同的 kanata 配置,同时更改按键行为以保持多个设备上特定按键位置的行为一致。
例子:
(defaliasenvcond (LAPTOP lp1)
met @lp1met
)
(defaliasenvcond (LAPTOP lp2)
met @lp2met
)
在当前终端进程中设置环境变量:
# powershell
$env:VAR_NAME = "var_value"
# bash
VAR_NAME=var_value
模板
顶级配置项deftemplate声明了一个可以通过列表项template-expand多次展开的模板。 template-expand 的缩写形式是 t!。
deftemplate 的参数按顺序为:
- 模板名称
- 模板变量列表
- 模板内容(列表/字符串的任意组合)
在模板内容中,以 $ 为前缀的变量名称将替换为传递到 template-expand 中的表达式。
列表项 template-expand 可以放置为顶级列表或另一个列表中。其参数按顺序为:
- 模板名称
- 替换到模板中的参数
笔记 | 模板扩展发生在文件包含之后和任何其他解析之前。这种早期解析的结果之一是,在 template-expand 内部使用时,defvar 中定义的变量不会被替换。这会对条件内容产生影响,例如与 if-equal 一起使用。这将在示例 5 中进一步讨论。 |
示例1:
举一个简单的例子,假设您想设置一大组按键,以便在按住 alt 时执行不同的操作。是的,这也可以通过将 alt 重新映射到图层移位来处理,但有些情况下您不希望这样做。您可以像这样模板化它,而不是多次使用 fork 和 unmod (以释放 alt)重新输入代码:
(deftemplate alt-fork (original-action new-action)
(fork $original-action (multi (unmod (ralt lalt) nop0) $new-action) (lalt ralt))
)
(defsrc 1 2 3)
(defalias fn1 (template-expand alt-fork 1 f1))
;; Templates are a simple text substitution, so the above is exactly equivalent to:
;; (defalias fn1 (fork 1 (multi (unmod (ralt lalt) nop0) f1) (lalt ralt)))
(defalias fn2 (template-expand alt-fork 2 f2))
;; You can use t! as a short form of template-expand
(defalias fn3 (t! alt-fork 3 f3))
(deflayer default @fn1 @fn2 @fn3)
示例2:
(defvar chord-timeout 200)
(defcfg process-unmapped-keys yes)
;; This template defines a chord group and aliases that use the chord group.
;; The purpose is to easily define the same chord position behaviour
;; for multiple layers that have different underlying keys.
(deftemplate left-hand-chords (chordgroupname k1 k2 k3 k4 alias1 alias2 alias3 alias4)
(defalias
$alias1 (chord $chordgroupname $k1)
$alias2 (chord $chordgroupname $k2)
$alias3 (chord $chordgroupname $k3)
$alias4 (chord $chordgroupname $k4)
)
(defchords $chordgroupname $chord-timeout
($k1) $k1
($k2) $k2
($k3) $k3
($k4) $k4
($k1 $k2) lctl
($k3 $k4) lsft
)
)
(template-expand left-hand-chords qwerty a s d f qwa qws qwd qwf)
;; t! is short for template-expand
(t! left-hand-chords dvorak a o e u dva dvo dve dvu)
(defsrc a s d f)
(deflayer dvorak @dva @dvo @dve @dvu)
(deflayer qwerty @qwa @qws @qwd @qwf)
示例3:
;; This template defines a home row that customizes a single key's behaviour
(deftemplate home-row (j-behaviour)
a s d f g h $j-behaviour k l ; '
)
(defsrc
grv 1 2 3 4 5 6 7 8 9 0 - = bspc
tab q w e r t y u i o p [ ] \
;; usable even inside defsrc
caps (t! home-row j) ret
lsft z x c v b n m , . / rsft
lctl lmet lalt spc ralt rmet rctl
)
(deflayer base
grv 1 2 3 4 5 6 7 8 9 0 - = bspc
tab q w e r t y u i o p [ ] \
;; lists can be passed in too!
caps (t! home-row (tap-hold 200 200 j lctl)) ret
lsft z x c v b n m , . / rsft
lctl lmet lalt spc ralt rmet rctl
)
如果等于
在模板内,您可以使用列表项 if-equal 来在模板内包含有条件使用的项目。
它至少接受 2 个参数。前两个参数必须是字符串并相互比较。如果它们匹配,则将以下参数插入到模板中代替 if-equal 列表。否则,如果字符串不匹配,则整个 if-equal 列表将从模板中删除。
示例4:
(deftemplate home-row (version)
a s d f g h
(if-equal $version v1 j)
(if-equal $version v2 (tap-hold 200 200 j lctl))
k l ; '
)
(defsrc
grv 1 2 3 4 5 6 7 8 9 0 - = bspc
tab q w e r t y u i o p [ ] \
caps (template-expand home-row v1) ret
lsft z x c v b n m , . / rsft
lctl lmet lalt spc ralt rmet rctl
)
(deflayer base
grv 1 2 3 4 5 6 7 8 9 0 - = bspc
tab q w e r t y u i o p [ ] \
caps (template-expand home-row v2) ret
lsft z x c v b n m , . / rsft
lctl lmet lalt spc ralt rmet rctl
)
与 if-equal 类似的是模板的另外三个条件运算符:
if-not-equal
- 如果前两个字符串参数不相等,则使用内容
if-in-list
- 如果第一个字符串参数存在于第二个字符串列表参数中,则使用该内容
if-not-in-list
- 如果第二个字符串列表参数中不存在第一个字符串参数,则使用该内容
实施例5:
;; defvar is parsed AFTER template expansion occurs.
(defvar a hello)
(deftemplate template1 (var1)
a (if-equal hello $var1 b) c
)
;; Below will expand to: `a c` because the string
;; $a itself is compared against the string hello
;; and they are not equal.
(template-expand template1 $a)
(deftemplate template2 (var1)
a (if-equal $a $var1 b) c
)
;; Below will expand to: `a b c` because the string
;; $a is compared against the string $a and they are equal.
;; But note that the variable $a is still not substituted
;; with its defvar value of: hello.
(template-expand template2 $a)
deftemplate 中的 concat
与 defvar 中的 concat 类似,deftemplate 内容中以 concat 开头的列表将被替换为单个字符串,该字符串由列表中相互连接的所有后续项组成。
自定义点击保持行为
目前,如果不修改源代码,这是无法配置的,但如果您愿意和/或有能力,目前还没有公开点击保持行为。利用这种行为,人们可以通过使用额外的信息来非常明确点击与按住的激活时间和方式。可以使用的可用信息确切地说是按下或释放了哪些键以及按下这些键的时间(以毫秒为单位)。 Tap-hold-release-keys 操作利用了部分功能,但没有充分利用此功能的强大功能。
有关更多背景信息,您可以阅读自定义点击保持行为的动机。
花哨的钥匙符号
您可以使用更短、更明显的键符号,例如 ‹⇧,而不是对特殊键使用相同的 a-z 字母(例如,用 lsft 表示 LeftShift)。
有关更多详细信息,请参阅符号列表和示例配置,它不仅在图层定义中使用这些符号,而且还将 ⎇› 和 ⇧› ⎇› 键重新调整为“符号”键,允许您通过按键插入这些奇特的符号,例如,
- 按住 ⎇› 并点击删除将插入 ␡
仅 Windows:在提升的窗口中启用
默认的 kanata.exe 二进制文件无法在提升的窗口(以管理权限运行)中工作,例如控制面板。但是,您可以使用 AutoHotkey 的“EnableUIAccess”脚本对二进制文件进行自签名,将其移动到“Program Files”,然后从那里启动 kanata 也可以在这些提升的窗口中工作。请参阅包含脚本及其所需库的 EnableUIAccess 文件夹(需要安装 AutoHotkey v2)
如果自己编译,则应添加功能标志 win_manifest 以启用 EnableUIAccess 脚本:
cargo build --win_manifest
仅限 Windows:win 托盘
Kanata 可以编译为带有功能标志 gui 的 Windows GUI 托盘应用程序。通过将 .lnk 放置在 %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup 中,可以简化用户登录时启动应用程序的过程,并根据配置显示自定义图标指示器
以及每层的动态图标指示器(可能需要点击下面的 gif 才能播放)
(仅限 Windows:win-tray)。它还支持(重新)加载配置。
目前唯一支持的配置是每个配置文件的托盘图标,所有其他配置应通过在 .lnk 的目标字段中传递 cli 标志来完成,例如 "C:\Program Files\kanata\kanata.exe" -d -n
启动kanata 在调试模式下没有延迟
从命令行启动时,应用程序会将日志输出到控制台,但除此之外,日志当前只能通过能够查看 OutputDebugString 调试的应用程序(例如 TraceSpy)获得。
测试你的配置
Kanata 有一个 kanata_simulated_input 工具,可以帮助以可预测的方式测试您的配置。
您可以在 GitHub 页面上尝试一下。
CLI 工具的代码可以在simulated_input 下找到。
您可以在 sim.txt 文件中编写一系列按键,然后使用您的配置运行该工具,而不是亲自键入来测试某些内容,并想知道是否因为配置错误或输入错误而没有得到预期结果。并获得输入/输出事件的“时间线”视图,这可以帮助了解 kanata 如何将您的输入转换为各种按键/鼠标按下。
警告 | 此视图的格式可能会更改。表情符号输出可能会破坏垂直对齐。 |
有关更多详细信息,请下载以下文件并运行 kanata_simulated_input -c sim.kbd -s sim.txt
- 具有简单主行 mod 绑定的示例配置
- 输入序列示例
- 示例输出序列
输入序列文件格式:前缀的空格不敏感列表:密钥对,其中前缀是以下之一:
- 🕐、t 或刻度以添加关键事件之间的时间(以毫秒为单位)
- ↓、d、向下或按
- ↑、u、向上或释放
- ⟳、r 或重复
并且键名在 str_to_oscode 函数中定义,例如 1 代表数字键 1 或 kp1/🔢₁ 代表小键盘数字键 1
使用 unicode 符号 🕐,↓,↑,⟳ 可以跳过 : 分隔符,例如 ↓k ≝ ↓:k ≝ d:k
拉链和弦
参考
您可以定义单个 defzippy-experimental 配置项。正如 -experimental 标签所示,此功能相对较新。使用此功能时,出现错误和重大更改的可能性更高。
kanata 配置中的配置语法
(defzippy-experimental
$zippy-filename ;; required
on-first-press-chord-deadline $deadline-millis ;; optional
idle-reactivate-time $idle-time-millis ;; optional
smart-space $smart-space-cfg ;; optional
smart-space-punctuation ( ;; optional
$punc1 $punc2 ... $puncN)
output-character-mappings ( ;; optional
$character1 $output-mapping1
$character2 $output-mapping2
;; ...
$characterN $output-mappingN
)
)
$zippy-文件名 | 相对或绝对文件路径。如果是相对路径,则其路径是相对于包含 kanata 配置文件的目录。这必须是 defzippy-experimental 之后的第一项。 |
$deadline-millis | 毫秒数。启用 zippy 后第一次按下后,如果在配置的时间内没有激活和弦,则暂时禁用 zippy。 |
$空闲时间毫秒 | 毫秒数。输入结束并且经过此配置的毫秒数后,zippy 将从暂时禁用状态重新启用。 |
$智能空间cfg | 确定智能空间行为。选项包括“无”、“仅添加空间”和“完整”。如果没有,输出将按原样键入。使用仅添加空格时,会在输出后自动添加空格,这些输出既不以空格也不以退格键结束。对于 full,仅添加空格行为与其他行为一起应用:在 zippy 激活后键入标点符号(默认字符: , . ;)将删除先前自动添加的空格。 |
$punc | 输出字符映射中定义的字符或已知的键名称,应将其视为标点符号。 smart-space-punctuation 配置将覆盖 smart-space 考虑的默认标点符号列表;如果要包含默认字符,则必须将它们包含在此配置中。 |
$字符 | 用于 zippy 配置文件的输出列中的单个 unicode 代码点。 |
$输出映射 | 键或输出和弦,告诉 kanata 在 zippy 文件输出列中看到时如何键入 $character。必须是单键或输出和弦。输出和弦可能包含 AG- 告诉 kanata 按 AltGr,并且可能包含 S- 告诉 kanata 按 Shift。 列表项 no-erase 和 single-output 也可用于此位置。 |
不擦除 | 接受单个键或输出和弦作为参数。如果超集和弦或后续和弦自动擦除,zippy 系统不会退格该字符。用于死键或组合键。 |
单输出 | 接受一个或多个键或输出和弦作为参数。 zippy 系统仅发送一个退格键,以防被超集和弦或后续和弦自动擦除。用于死键或用一个输出符号组成键序列。 |
关于输出映射,您可以通过以下行配置特殊 Lisp 语法字符 ) ( " 的输出:
")" $right-paren-output
"(" $left-paren-output
r#"""# $double-quote-output
例如,对于美国布局,这些应该是正确的行:
")" S-0
"(" S-9
r#"""# S-'
zippy 配置文件中的配置语法
// This is a comment.
// inputs ↹ outputs
$chord1 $follow-chord1.1...1.M $output1
$chord2 $follow-chord2.1...2.M $output2
// ...
$chordN $follow-chordN.1...N.M $outputN
格式是由一个制表符分隔的两列。第一列是输入,第二列是输出。
$和弦 | 一组字符。您可以通过将空格作为和弦中的第一个字符来使用空格;有关示例,请参阅下面示例中的字母表。对于 0 个可选的跟随和弦,当启用 zippy 并且同时按下所有定义的和弦键时,同一行上的相应输出 ($output) 将激活。按下的顺序并不重要。 |
$和弦跟随 | 0个或多个和弦,使用方式与$chord相同。具有跟随和弦意味着在首次激活同一行中较早的和弦、释放所有键并按下 $chord-followN.M 中的键时,同一行上的 $output 将激活。跟随和弦与前一个和弦之间用空格分隔。如果在跟随和弦中使用空格,则使用两个空格;有关示例,请参阅下面示例中的华盛顿。 |
$输出 | 当用户按下和弦和可选跟随和弦时要输入的字符。它通过一个制表符与输入和弦列分隔开。这些字符按顺序键入,并且必须都是单数键名称,如在 defsrc 中配置的那样。大写的单字符键名将被成功解析,并且这些将与 Shift 一起输出以输出大写的键。此外,输出字符映射配置可用于通知 kanata 可能使用 Shift 或 AltGr 的其他映射。 |
示例
kanata 配置示例
(defzippy-experimental
zippy.txt
on-first-press-chord-deadline 500
idle-reactivate-time 500
smart-space-punctuation (? ! . , ; :)
output-character-mappings (
;; This should work for US international.
! S-1
? S-/
% S-5
"(" S-9
")" S-0
: S-;
< S-,
> S-.
r#"""# S-'
| S-\
_ S--
® AG-r
’ (no-erase `)
é (single-output ' e)
)
)
示例 zippy 文件内容
dy day
dy 1 Monday
dy 2 Tuesday
abc alphabet
w a Washington
gi git
gi f p git fetch -p
描述
Zippychord 是 Kanata 中的另一种和弦机制。其背后的灵感主要来自于 zipchord 项目。名字很相似;它被命名为“zippy”而不是“zip”,因为 Kanata 的实现不是一个端口,也不以 100% 的行为兼容性为目标。
预期的用例是速记,或加速字符输出。在 zippychord 中,输入是键码和弦或序列,输出也是纯粹的键码。换句话说,所有其他操作均不受支持;例如层、切换、一次性。
Zippychord 对输出的键码起作用,即 kanata 完成处理您的输入、图层、开关逻辑和其他配置后的键输出。这与序列的操作方式类似,但与和弦(v1) 和和弦v2 不同。此外,输出都是急切的,就像序列上的可见退格一样。如果发生拉链和弦激活,则键入的键将退格。
举个例子,如果使用如下行配置 zippychord:
gi git
那么以下任一键入事件序列将擦除输入字符,然后继续键入输出“git”,就像它是(宏 bspc bspc g i t)一样。
(press g) (press i)
(press i) (press g)
请注意,没有列出任何发布事件。相比之下,以下事件序列不会导致激活:
(press g) (release g) (press i)
Zippychord 支持完全重叠的和弦和音序。例如,允许这样的配置:
gi git␣
gi s git␣status
gi c git checkout␣
gi c b git checkout -b␣
gi c a git commit --amend␣
gi c n git commit --amend --no-edit
gi c a m git commit --amend -m 'FIX_THIS_COMMIT_MESSAGE'
当您以 (g i) 和弦开始时,您可以跟进各种字符序列以输出不同的 git 命令。这个用例与 git 别名非常相似。 zippychord 的优点之一是它会在您键入时立即向您显示真正的底层命令。