行动
行动
行动
kanata 提供的操作使其真正可定制。本节介绍可用的操作。
实时重新加载 (lrld)
参考
实时重新加载变体:
前线 | 实时重新加载当前使用的配置文件的字符串操作。 |
LRLD-下一个 | 实时重新加载随后按命令行顺序连续指定的配置文件的字符串操作。如果当前使用最后指定的文件,则循环到第一个指定的文件。 |
前一个 LRLD | 实时重新加载之前按命令行顺序连续指定的配置文件的字符串操作。如果当前使用指定的第一个文件,则循环到最后指定的文件。 |
(lrld-num $n) | 列出按命令行顺序指定的实时重新加载第 n 个文件的操作。指定的第一个文件是 n=1。 |
实时重新加载不会读取或应用对设备相关配置的更改。设备相关配置示例:linux-dev、macos-dev-names-include、linux-use-trackpoint-property、windows-only-windows-interception-keyboard-hwids。
描述
您可以将 lrld 操作放在一个键上以实时重新加载您的配置文件。如果kanata无法解析该文件,则继续使用之前的配置。当激活实时重新加载时,活动的 kanata 层将是配置中定义的第一个 deflayer。
例子:
(deflayer has-live-reload
lrld a s d f
)
lrld 有多种变体:lrld-prev 和 lrld-next。这些将循环使用您在 kanata 启动时指定的不同配置文件。指定的第一个配置文件将是启动时加载的配置文件。 prev/next 变体也可以与 lrpv 和 lrnx 的缩写名称一起使用。
另一个变体是列表操作 lrld-num。这将根据配置文件参数传递到 kanata 启动命令的顺序重新加载由编号指定的配置文件。
例子:
(deflayer has-live-reloads
lrld lrpv lrnx (lrld-num 3)
)
在命令行中指定多个配置文件的示例:
kanata -c startup.cfg -c 2nd.cfg -c 3rd.cfg
给定上述启动命令,激活 (lrld-num 2) 将重新加载 2nd.cfg 文件。
层交换 (layer-switch)
参考
更改活动基础层的列表操作。
句法:
(layer-switch $layer-name)
$图层名称 | 要切换到的层名称。 |
描述
此操作允许您切换到另一个“基础”层。这是永久性的,直到激活到另一层的层切换为止。当考虑下一个动作时,基础层的概念更有意义:按住时分层。
此操作接受单个后续字符串,该字符串必须是 deflayer 条目中定义的图层名称。
例子:
(defalias dvk (layer-switch dvorak))
分层同时持有 (layer-while-held)
参考
按住该键时更改活动层的列表操作。
句法:
(layer-while-held $layer-name)
$图层名称 | 按住按键时激活的图层名称。 |
描述
此操作允许您在按住键的同时暂时更改到另一层。释放按键后,您将返回到当前活动的“基础”层。
此操作接受单个后续字符串,该字符串必须是 deflayer 条目中定义的图层名称。
例子:
(defalias nav (layer-while-held navigation))
您还可以使用图层切换来代替图层保持;他们的行为完全一样。图层切换名称稍短,但其含义有点不准确。
透明钥匙
参考
_ | 字符串操作,激活活动图层“下方”的图层的操作。 |
描述
如果您对键 _ 使用单个下划线,则它在 deflayer 中充当“透明”键。该行为取决于 _ 是在基础层还是在保持层上。当在活动基础层上按下 _ 时,该键将默认为相应的 defsrc 键。如果在按住时在活动层上按下_,则基础层的行为将激活。
定义源按键 (defsrc)
参考
使用defsrc | 输出相应的 defsrc 输入键的字符串操作。 |
描述
与透明密钥类似的概念是 use-defsrc 操作。激活后,底层的 defsrc 键将成为输出操作。
例子:
(defsrc a b c d)
(defalias src use-defsrc)
(deflayer remap-only-c-to-d
_ _ d @src)
无操作
参考
XX | 不会输出任何内容的字符串操作。 |
描述
您可以使用动作 XX 作为“无操作”键,这意味着按下该键不会执行任何操作。这可能是理想的,可以代替未完全映射的层上的透明键,这样故意未映射的键将不会执行任何操作,而不是键入字母。
或者,您可以使用 ✗ ∅ • 表示无操作。
例子:
(deflayer contains-no-ops
XX ✗ ∅ •)
统一码 (unicode)
参考
输出单个 unicode 代码点的列表操作。如果按住该键,则不会重复键入 unicode 代码点。
句法:
(unicode $unicode-codepoint)
$unicode-代码点 | 一个 unicode 代码点。请注意,许多表情符号/字形/字素由多个代码点组成。 |
描述
unicode(或 🔣)操作接受单个 unicode 字符(但不是组合字符,因此是 🤲,但不是 🤲🏿)。如果要输出由多个代码点组成的字形,可以将宏与多个 unicode 操作结合使用。
如果需要,您可以使用 unicode 字符作为别名,或者使用其简化形式 🔣😀(相对于通常的 (🔣 😀))。
笔记 | 活动应用程序可能无法正确接受 unicode 操作。 |
笔记 | 如果使用 Linux,请确保查看 defcfg 中的 unicode 行为自定义。 |
例子:
(defalias
sml (unicode 😀)
😀 (🔣 😀)
🙁 (unicode 🙁)
)
(deflayer has-happy-sad
@sml @🙁 @😀 🔣😀 d f
)
如果您想通过 unicode 输出括号 ( ),您可以引用它们。
带括号的示例
(defalias
lp (unicode "(")
rp (unicode ")")
)
如果你想通过 unicode 输出双引号,你需要一个特殊的引用语法。
在字符串中使用双引号的示例
(defalias
dq (unicode r#"""#)
)
输出和弦/组合 (快捷键/修饰键)
翻译备注:这里的
chords
和弦应该指的是同时按下多个按键
参考
使用以下字符串作为已知键名称的前缀将在指定的修饰符旁边输出该键。可以组合多个前缀以向同一键输出添加更多修饰符。不允许有重复的前缀。
C- | 左控制 |
RC- | 右控制 |
A- | 左 Alt |
RA- | 右 Alt,也称为 AltGr |
AG- | 也表示右 Alt/AltGr |
S- | 左移 |
RS- | 右移 |
M- | 左元 |
RM- | 正确的元数据 |
输出和弦的一个特殊行为是,如果按下另一个键,则在新按下的键操作激活之前,所有和弦键都将被释放。后续操作通常不需要修改键,如果没有这种行为,快速打字可能会导致不期望的修改按键。如果您希望按键保持按下状态,请使用 multi。
描述
您可能需要重新映射一个键,以便与 Control 或 Shift 等修饰符组合自动按下。输出和弦是实现这一目标的一种方法。
输出和弦通常用于执行一次性操作,例如:
- 输入一个符号,例如S-1输出!为美国布局。
- 输入重音字符,例如RA-a 输出 á 为美国国际布局。
- 执行特殊操作(如 C-c)在终端中发送 SIGTERM
需要注意的是,输出和弦并非在所有配置项中都可用。如果您在预期输出和弦可用的情况下出现未知键错误,则必须将输出和弦拆分为其组件键。例如,(unmod C-l) 是一个错误;相反,你应该使用(unmod lctl l)。
输出和弦前缀字符串为:
- C-:左控制(也有 ←⎈ ←⌃ 或没有 ← 侧指示器)
- RC-:右控制(也⎈›⌃›)
- A-:左 Alt(也有 ←⎇ ←⌥ 或没有 ← 侧指示符))
- RA-:右 Alt,又名 AltGr(也称为 AG ⎇› ⌥›)
- S-:左移(也有 ←⇧ 或没有 ← 侧指示器))
- RS-:右移(也⇧›)
- M-:左元,又名 Windows、GUI、Command、Super(也称为 ←⌘ ←❖ ←◆ 或没有 ← 侧指示器))
- RM-:右元(也⌘› ❖› ◆›)
例子:
(defalias
;; Type exclamation mark (US layout)
ex! S-1
;; Ctrl+C: send SIGINT to a Linux terminal program
int C-c
;; Win+Tab: open Windows' Task View
tsk M-tab
;; Ctrl+Shift+(C|V): copy or paste from certain terminal programs
cpy C-S-c
pst C-S-v
)
重复键
参考
报告 | 输出最近键入的单个键的字符串操作。 |
任何rpt | 输出最近输出的操作的字符串操作。 |
描述
操作 rpt 重复最近键入的键。按住该键不会重复发送该密钥。预期的用例是能够使用不同的手指甚至拇指按键来重复键入的按键,而不是双击按键。
例子:
(deflayer has-repeat
rpt a s d f
)
rpt 操作仅重复最后一个按键输出。例如,如果上一个按下的键是 C-c,则不会输出像 ctrl+c 这样的和弦。在这种情况下,rpt 操作将仅输出 c。
有一个变体 rpt-any ,它将重复之前的任何操作,并在示例中输出 ctrl+c 。
(deflayer has-repeat-any
rpt-any a s d f
)
释放关键点或图层 (release-key)
参考
(释放键 $key) | 列出从输出操作中释放定义的键的操作。值得注意的是,这不会作用于关键输入。 |
(发布层$层名称) | 列出给定图层名称释放图层保持激活的操作。 |
描述
您可以通过以下操作释放保持的键或图层:
- release-key 或 key↑:释放键,接受 defsrc 兼容名称
- 释放层或层↑:释放保持的层
这些操作的底层细节是它们在输出状态上操作,而不是虚拟地释放输入键。这确实有一定的现实意义。例如,如果操作(宏重复 50)位于 a 键上,则激活(释放键 a)将不会停止重复宏。
释放密钥的实际用例示例可以在下面的多部分中看到。
目前还没有已知的释放层实际用例,但它仍然存在。
多个操作
按顺序激活多个操作
参考
按顺序激活多个操作。
句法:
(multi $action1 $action2 ... $actionN)
$行动 | 一个输出动作。 |
描述
多操作按顺序但同时执行多个键或操作。它接受一项或多项操作。
一个示例用例是按“Alt”键,同时激活另一个层。
在下面的示例中,按住物理“Alt”键将导致激活按住的图层,同时按住“Alt”本身。保持层的操作几乎与标准键盘相同,因此例如序列(按住 Alt)+(Tab+Tab+Tab)将按预期工作。这与 Tab 映射到 A-tab 的层形成鲜明对比,后者会导致重复按下+释放两个键,并且具有与预期不同的行为。一些特殊键会释放“Alt”键并执行一些其他需要释放“Alt”的操作。换句话说,“Alt”键具有双重用途,即仍然履行某些按钮按下(例如 Tab)的“Alt”键角色,但也作为通常不与“Alt”一起使用的键的新层添加了有用的功能。
(defalias
atl (multi alt (layer-while-held alted-with-exceptions))
lft (multi (release-key alt) left) ;; release alt if held and also press left
rgt (multi (release-key alt) rght) ;; release alt if held and also press rght
)
(defsrc
alt a s d f
)
(deflayer base
@atl _ _ _ _
)
(deflayer alted-with-exceptions
_ _ _ @lft @rgt
)
警告 | 就动作的同时性和顺序而言,此动作有时会以令人惊讶的方式表现。例如,像 (multi sldr ') 这样的操作将不会按预期运行。由于实现细节的原因,sldr 将在 ' 之后激活,即使它之前已列出。该示例可以写为 (macro sldr 10 '),并且可以按预期工作。如果可以用不同的动作(如宏或输出和弦)替换它,建议避免使用多重。 |
反向释放顺序
参考
可以在 (multi ...) 内部使用的字符串项,以反转作为 multi 一部分按下的任何键的释放顺序。
句法:
(multi ... reverse-release-order)
描述
在 multi 中,您可以使用 include reverse-release-order 来执行操作规定的操作:如果在 multi 中有多个键,则反转典型的释放顺序。
例如,按下然后释放带有以下操作的键:(multi a b c) 将按指定顺序按 a b c,然后按指定顺序释放 a b c。将其更改为(multi a b c 反向释放顺序)将按指定顺序按下 a b c,然后按指定顺序释放 c b a。
例子:
(defalias
S-a-reversed (multi lsft a reverse-release-order)
)
鼠标操作
您可以使用假名动作单击左、中、右按钮,进行垂直/水平滚动,以及移动鼠标。
鼠标按钮
参考
您可以使用下面的字符串操作激活鼠标操作。
MLFT | 按住鼠标左键。 |
中号 | 按住鼠标中键。 |
先生 | 按住鼠标右键。 |
MFWD | 按住向前的鼠标按钮。 |
姆贝克 | 按住向后鼠标按钮。 |
MLTP | 点击鼠标左键。 |
MMTP | 点击鼠标中键。 |
MRTP | 点击鼠标右键。 |
ftp | 点击鼠标前进按钮。 |
MBTP | 点击向后鼠标按钮。 |
在 Linux 和 Windows-Interception 中,可以在 defsrc 和 deflayermap 中使用按住操作来重新映射鼠标按钮,如键盘按键。
描述
鼠标按钮的操作是:
- mft:鼠标左键
- mmid:鼠标中键
- mrgt:鼠标右键
- mfwd:鼠标前进按钮
- mbck:鼠标后退按钮
将按住鼠标按钮,同时按住映射到它的键。使用 Linux 和 Windows 拦截,上述操作也可在 defsrc 中使用,以启用在图层中重新映射指定的鼠标操作,就像使用键盘按键一样。
如果单个多重操作中有多个鼠标单击操作,例如 (multi mrgt mlft)
那么除了最后一个按钮之外的所有按钮都将被单击然后取消单击。最后一个按钮将保持按住状态,直到松开按键为止。在上面的示例中,按下然后释放映射到此操作的键将导致以下事件序列:
- 按键映射到多
- 单击鼠标右键
- 取消单击鼠标右键
- 单击鼠标左键
- 释放键映射到多
- 释放鼠标左键
标准鼠标按钮有多种变体,可以“点击”按钮。不是在按住键的同时按住按钮,而是单击鼠标后立即释放。松开按键后什么也不会发生。行动如下:
- mltp:点击鼠标左键
- mmtp:点击鼠标中键
- mrtp:点击鼠标右键
- mftp:点击鼠标前进按钮
- mbtp:向后点击鼠标按钮
鼠标滚轮
参考
mwheel-* 操作允许您模拟鼠标滚轮。按住动作会根据动作配置重复滚动。
句法:
(mwheel-$variant $interval $distance)
$变体 | 上下左右之一代表要使用的滚动方向。 |
$间隔 | 滚动操作之间的毫秒数。 |
$距离 | 每次激活的行驶距离。数字 120 代表标准分辨率鼠标的完整等级,在某些环境中,应该使用 120 或其倍数。 |
您可以在 defsrc 中使用这些键名称来重新映射滚动事件,就好像它们是键一样,分别对应于上、下、左、右:mwu、mwd、mwl、mwr。
描述
鼠标滚轮的动作有:
- mwheel-up 或 🖱☸↑:垂直向上滚动
- mwheel-down 或 🖱☸↓:垂直向下滚动
- mwheel-left 或 🖱☸←:向左水平滚动
- mwheel-right 或 🖱☸→:水平向右滚动
所有这些操作都接受两个数字字符串。第一个是滚动动作之间的间隔(单位:ms)。第二个数字是距离(单位:任意)。在 Windows 和 Linux 中,120 个距离单位相当于物理轮子上的一个凹口移动。您可以调整这些参数,看看什么对您来说是正确的。两个数字必须在 [1,65535] 范围内。
笔记 | 在 Linux 中,并非所有桌面环境都支持 REL_WHEEL_HI_RES 事件。如果您的情况如此,那么使用 120 倍数的距离值可能会获得更好的体验。 |
在 Linux 和 Interception 上,您还可以选择从鼠标设备读取。执行此操作时,使用 defsrc 中的 mwu、mwd、mwl、mwr 键名称允许您重新映射鼠标向上/向下/向左/向右滚动操作,就像使用键盘按键一样。
笔记 | 如果您在 Linux 中使用高分辨率鼠标,则只有滚轮的完整“凹口”才能激活该操作。 |
笔记 | 如果您使用具有拦截功能的高分辨率鼠标,您可能会收到比您预期更多的事件。 |
鼠标移动
参考
movemouse-* 操作允许您移动鼠标光标。按住该操作将根据配置重复移动光标。
句法:
(movemouse-$variant $interval $distance)
$变体 | 上下左右之一代表移动方向。 |
$间隔 | 移动激活之间的毫秒数。 |
$距离 | 每次激活的行进距离(以像素为单位)。 |
有一种移动鼠标变体,可以以恒定的速率增加每次激活的距离,直到达到最大值。
句法:
(movemouse-accel-$variant $interval $acceleration-time $min $max)
$变体 | 上下左右之一代表移动方向。 |
$间隔 | 移动激活之间的毫秒数。 |
$加速时间 | 达到每次激活最大距离之前的毫秒数。 |
分钟$ | 每次激活的初始行进距离(以像素为单位)。 |
最高$ | 每次激活的最大行进距离(以像素为单位)。 |
描述
鼠标移动动作有:
- 向上移动鼠标或 🖱↑
- 向下移动鼠标或 🖱↓
- 向左移动鼠标或🖱←
- 向右移动鼠标或🖱→
与鼠标滚轮操作类似,所有这些操作都接受两个数字字符串。第一个是移动动作之间的间隔(单位:毫秒),第二个数字是每次移动的距离(单位:像素)。
以下是上述鼠标移动的变体,这些移动在按住映射键时应用从最小距离到最大距离的线性鼠标加速度。
- movemouse-accel-up 或 🖱accel↑
- movemouse-accel-down 或 🖱accel↓
- movemouse-accel-left 或 🖱accel←
- 向右移动鼠标加速或🖱加速→
所有这些操作都接受四个数字字符串。第一个数字是移动动作之间的间隔(单位:ms)。第二个数字是从最小距离线性上升到最大距离所需的时间(单位:毫秒)。第三个和第四个数字是每次移动的最小和最大距离(单位:像素)。
有一个与 movemouse-accel - movemouse-inherit-accel-state 相关的可切换 defcfg 选项。您可能想要启用它,特别是如果您来自 QMK。
设置鼠标绝对位置
setmouse 或 set🖱 操作设置绝对鼠标位置。
警告 | 目前仅 Windows 支持此功能。对于 Linux 中有趣的以键盘为中心的鼠标解决方案,请尝试查看 warpd。 |
此列表操作采用两个参数,即绝对运动的 x 和 y 位置。这些值从屏幕左上角的 0,0 到屏幕右下角的 65535,65535。如果您有多个显示器,setmouse 会将它们全部视为一个大屏幕。这可能会使如何设置 x、y 值以获得所需的位置变得有点混乱。需要进行实验。
修改鼠标移动速度
动作 movemouse-speed 或 🖱speed 修改 movemouse 和 movemouse-accel 函数在运行时的速度。它通过按下操作键时扩大或缩小 min_distance 和 max_distance 来实现此目的。
此操作接受一个数字(单位:百分比),通过该数字,鼠标移动将加速。
警告 | 由于像素是整数的性质,某些值(例如 33)可能不会精确到距离的三分之一。 |
例子:
(defalias
fst (movemouse-speed 200)
slw (movemouse-speed 50)
)
鼠标所有操作示例
(defalias
mwu (mwheel-up 50 120)
mwd (mwheel-down 50 120)
mwl (mwheel-left 50 120)
mwr (mwheel-right 50 120)
ms↑ (movemouse-up 1 1)
ms← (movemouse-left 1 1)
ms↓ (movemouse-down 1 1)
ms→ (movemouse-right 1 1)
ma↑ (movemouse-accel-up 1 1000 1 5)
ma← (movemouse-accel-left 1 1000 1 5)
ma↓ (movemouse-accel-down 1 1000 1 5)
ma→ (movemouse-accel-right 1 1000 1 5)
sm (setmouse 32228 32228)
fst (movemouse-speed 200)
)
(deflayer mouse
_ @mwu @mwd @mwl @mwr _ _ _ _ _ @ma↑ _ _ _
_ pgup bck _ fwd _ _ _ _ @ma← @ma↓ @ma→ _ _
_ pgdn mlft _ mrgt mmid _ mbck mfwd _ @ms↑ _ _
@fst _ mltp _ mrtp mmtp _ mbtp mftp @ms← @ms↓ @ms→
_ _ _ _ _ _ _
)
连续点击 (tap-dance)
参考
踢踏舞动作允许根据同一键的连续敲击次数来执行不同的动作。
句法:
(tap-dance $timeout $action-list)
$超时 | 踢踏舞结束之前的毫秒数。 |
$动作列表 | 可以选择的操作列表,按点击次数排序。 |
踢踏舞热切变体会热切地执行动作。使用宏和 bspc 可以帮助回溯到第二次点击之后。
句法:
(tap-dance-eager $timeout $action-list)
描述
踢踏舞动作允许重复敲击某个键以产生不同的动作。接下来是超时(单位:毫秒)和按键或操作列表。每次按下该键,其超时都会重置。如果发生以下事件之一,将选择该操作:
- 超时到期
- 按下了不同的键
- 重复按键直到最后的动作
您可以在踢踏舞中放置普通键或其他动作。
例子:
(defalias
;; 1 tap : "A" key
;; 2 taps: Control+C
;; 3 taps: Switch to another layer
;; 4 taps: Escape key
td (tap-dance 200 (a C-c (layer-switch l2) esc))
)
踢踏舞有一种变体,名为踢踏舞渴望。该变体的解析方式相同,但不同之处在于,随着点击的进行,它将激活序列中的每个操作。
在下面的示例中,重复点击将按顺序:
- 类型a
- 删除 a 并输入 bb
- 删除 bb 并输入 ccc
(defalias
td2 (tap-dance-eager 500 (
(macro a) ;; use macro to prevent auto-repeat of the key
(macro bspc b b)
(macro bspc bspc c c c)
))
)
一击 (one-shot-xxx)
参考
在不按住输入键的情况下激活键或图层一段时间,以获取后续键。当一个或多个已处于活动状态时,激活其他一次性操作将重置超时,并与一次性操作重叠。
句法:
($one-shot-variant $timeout $action)
$variant 的值:
one-shot-press | 第一次按下另一个键时结束。这也是被称为one-shot的变体。 |
one-shot-release | 在第一次释放新按下的键时结束。 |
one-shot-press-pcancel | 第一次按下另一个键或再次按下另一个活动的一次性键时结束 |
one-shot-release-pcancel | 第一次释放新按下的键或重新按下另一个活动的一次性键时结束。 |
其他项目:
$timeout | 毫秒数,如果未因用户输入而停用,则一次性将自行停用。 |
$action | 分层动作、键或输出和弦。 |
描述
如果你知道那是什么的话,一键操作类似于“粘滞键”。这将激活操作或密钥,直到超时到期或使用不同的密钥。单次操作后必须有一个超时(单位:毫秒)和另一个按键或操作。
一些预期的用例是:
- 按下修饰键后恰好按下一次按键
- 恰好在按下一次按键后切换到另一层
如果按住一次性键,则它将充当常规键。例如。在下面的示例中,按住分配有 @os2 的键将使每个键(而不仅仅是一个键)保持左 Shift 键,只要它仍然被物理按下。
在超时时间内连续按下多个一次性按键将组合这些按键的操作,并将超时重置为最近按下的一次性按键的值。
一击动作有四种变体:
- one-shot-press 或 one-shot↓:第一次按下另一个键时结束
- one-shot-release 或 one-shot↑:在第一次释放另一个键时结束
- one-shot-press-pcancel 或 one-shot↓⤫:第一次按下另一个键或再次按下另一个活动的一次性键时结束
- one-shot-release-pcancel 或 one-shot↑⤫:在第一次释放另一个键或重新按下另一个活动单次键时结束
值得注意的是,一次性按键的第一次激活决定了所有后续一次性按键激活的 4 个变体的行为,即使后续一次性按键的配置与按下的初始按键不同。
默认名称 one-shot 对应于 one-shot-press。
笔记 | 当使用一次性按键来触发 defoverride 时,您可能需要在 defcfg 中将 override-release-on-activation 调整为 yes 。 |
例子:
(defalias
os1 (one-shot 500 (layer-while-held another-layer))
os2 (one-shot-press 2000 lsft)
os3 (one-shot-release 2000 lctl)
os4 (one-shot-press-pcancel 2000 lalt)
os5 (one-shot-release-pcancel 2000 lmet)
)
一次性暂停处理
参考
暂停新输入按键的一次性处理一段时间,以允许发生不打算消耗一次性的操作。
句法:
(one-shot-pause-processing $time)
时间 | 忽略处理的毫秒数。值得注意的是,一次虚拟按键按下或释放(点击是单独的按下和随后的释放)将需要 1 毫秒来处理。如果使用虚拟键,该数字必须大于正在发生的虚拟键事件的数量。 |
描述
一次性暂停处理列表操作允许您暂停一次性激活的按键处理。以下序列是有用的示例:
- 按住时激活图层
- 激活该层上的一次性操作
- 释放按住的层键,该键具有与其关联的(释放时……)操作。
- 释放动作并不打算消耗一次性激活
在上述场景中,默认情况下,释放时激活将触发一次性停用;因此必须使用暂停处理操作来阻止这种情况的发生。
点击保持 (tap-hold)
警告 | 在 Linux 上,点击保持操作和所有变体可能会因重复先前的按键而表现出意外。完整的上下文在讨论 #422 中。简而言之,解决方法是在 multi 内部使用 tap-hold,并结合另一个像 f24 一样无操作的按键操作。 示例:(multi f24(点击按住...))。如果随后可能会按下多个点击保持操作(全部使用 f24 解决方法),则您可能需要在同一多重操作中释放 f24,以避免重复双击点击保持操作,然后再执行另一个不同的点击保持操作。示例: (defvirtualkeys relf24 (release-key f24)) … (multi f24 (tap-hold …) (macro 5 (on-press tap-vkey relf24))) |
参考
点击按住操作可让您激活不同的操作,具体取决于点击或按住某个键。
句法:
(tap-hold $tap-timeout $hold-timeout $tap-action $hold-action)
$tap-超时 | 轻按并按住会导致 $tap-action 被保留的窗口的毫秒数。 |
$保持超时 | $hold-action 激活之前的毫秒数。在这段时间之前释放按键会导致 $tap-action 激活。 |
$点击动作 | 当输入被确定为“点击”时激活的操作。 |
$保持动作 | 当输入被确定为“保持”时激活的操作。 |
变种:
(tap-hold-press $tap-timeout $hold-timeout $tap-action $hold-action)
(tap-hold-release $tap-timeout $hold-timeout $tap-action $hold-action)
(tap-hold-press-timeout $tap-timeout $hold-timeout $tap-action $hold-action $timeout-action)
(tap-hold-release-timeout $tap-timeout $hold-timeout $tap-action $hold-action $timeout-action)
(tap-hold-release-keys $tap-timeout $hold-timeout $tap-action $hold-action $tap-keys)
(tap-hold-except-keys $tap-timeout $hold-timeout $tap-action $hold-action $tap-keys)
点击按住按下 | 如果按住并按下另一个输入键,则尽早激活 $hold-action。 |
点击-保持-释放 | 如果按住并按下并释放另一个输入键,则尽早激活 $hold-action。 |
点击-按住-按下-超时 | 如果按住并按下另一个输入键,则激活 timeout-action 将激活。 |
点击-保持-释放-超时 | 如果按住并按下并释放另一个输入键,则尽早激活 timeout-action 将激活。 |
点击-按住-释放键 | 如果按住并按下并释放另一个输入键,则尽早激活 $hold-action。 $tap-keys 参数是键名称列表。如果在保持激活之前按下 $tap-keys 中的某个键,则提前激活 $tap-action。 |
点击按住除键之外的按键 | $tap-keys 参数是键名称列表。如果按下 $tap-keys 中的某个键或者在保持超时之前释放操作键,则激活 $tap-action。在释放操作键或按下另一个键之前,不会输出任何键,这与默认的点击保持行为不同。 |
描述
点击-保持操作允许您使用一个操作/键来“点击”,并使用不同的操作/键来“按住”。点击是快速按下然后释放按键,而按住是长按。
该操作按列出的顺序采用 4 个参数:
- 点击超时(单位:ms)
- 保持超时(单位:ms)
- 点击动作
- 保持动作
点击超时是指快速按下+释放+按下某个键将导致点击动作被保持而不是激活保持动作的毫秒数。
更详细地点击超时
保持超时是指保持操作激活之前的毫秒数。
点击保持还有两种其他变体:
- 点击按住按下或点击⬓↓
- 如果按下不同的键,即使保持超时尚未到期,也会激活保持操作
- 点击-按住-释放或点击⬓↑
- 如果按下+释放不同的键,即使保持超时尚未到期,也会激活保持操作
如果您想要更灵敏的点击保持键,这些变体可能会很有用,但您应该警惕无意中激活保持操作。
例子:
(defalias
anm (tap-hold 200 200 a @num) ;; tap: a hold: numbers layer
oar (tap-hold-press 200 200 o @arr) ;; tap: o hold: arrows layer
ech (tap-hold-release 200 200 e @chr) ;; tap: e hold: chords layer
)
点击-保持-按下和点击-保持-释放还有其他变体:
- 点击-按住-按下-超时或点击⬓↓超时
- 点击-按住-释放-超时或点击⬓↑超时
除了与其他变体相同的 4 个参数之外,这些变体还采用第 5 个参数。第 5 个参数是另一个操作,如果保持超时到期,它将激活,而不是由其他按键操作触发,而非超时变体将在两种情况下激活保持操作。
- 点击按住释放键或点击⬓↑键
此变体采用第 5 个参数,它是一个按键列表,当在点击-按住-释放-按键操作等待时按下这些按键时,这些按键会触发早期点击。否则,这表现为点击-保持-释放。
第5个参数中的按键对应于物理输入按键,或者说对应于defsrc的按键。这与 fork 和 switch 操作形成对比,fork 和 switch 操作对输出的键进行操作,或者换句话说,对应 defsrc 键的 deflayer、defalias 等中的输出。
例子:
(defalias
;; tap: o hold: arrows layer timeout: backspace
oat (tap-hold-press-timeout 200 200 o @arr bspc)
;; tap: e hold: chords layer timeout: esc
ect (tap-hold-release-timeout 200 200 e @chr esc)
;; tap: u hold: misc layer early tap if any of: (a o e) are pressed
umk (tap-hold-release-keys 200 200 u @msc (a o e))
)
- Tap-hold- except-keys 或 tap-hold⤫ 键
此变体采用第 5 个参数,它是一个按键列表,当点击保持除外按键操作等待时按下这些按键时,这些按键始终会触发点击。在释放该键或按下任何其他键之前,不会输出任何键。这与点击保持行为不同。
第5个参数中的按键对应于物理输入按键,或者说对应于defsrc的按键。这与 fork 和 switch 操作形成对比,fork 和 switch 操作对输出的键进行操作,或者换句话说,对应 defsrc 键的 deflayer、defalias 等中的输出。
例子:
(defalias
;; tap: o hold: arrows layer timeout: backspace
oat (tap-hold-press-timeout 200 200 o @arr bspc)
;; tap: e hold: chords layer timeout: esc
ect (tap-hold-release-timeout 200 200 e @chr esc)
;; tap: u hold: misc layer always tap if any of: (a o e) are pressed
umk (tap-hold-except-keys 200 200 u @msc (a o e))
)
宏 (macro)
参考
宏操作点击配置的按键或操作序列。数字可用于将序列延迟定义的毫秒数。
句法:
(macro $macro-action1 $macro-action2 ... $macro-actionN)
$宏观行动 | 宏中允许的子集中的延迟、键、操作,或者更多宏操作的输出和弦前缀列表。 |
变种:
(macro-release-cancel ...)
(macro-cancel-on-press ...)
(macro-release-cancel-and-cancel-on-press ...)
(macro-repeat ...)
(macro-repeat-$cancel-variant ...)
宏发布取消 | 如果释放该键,则取消所有活动的宏。 |
按下宏取消 | 如果按下不同的键,则取消所有活动的宏。 |
宏发布取消和按下时取消 | 如果释放该键或按下不同的键,则取消所有活动的宏。 |
宏重复 | 按住时重复宏。 |
宏重复-$cancel-variant | 按住时重复宏。根据以下变体之一的行为取消最终重复:释放取消、按时取消、按时释放取消和取消。 |
描述
宏操作将点击一系列带有可选延迟的按键。这与多重操作不同,因为在多重操作中,所有按键都被按住,而在宏操作中,按键被按下然后释放。
这意味着,通过宏,您可以将某些字母大写,而另一些字母则不大写。这对于多重来说是不可能的。
宏动作接受一个或多个键、一些动作、和弦和延迟(单位:毫秒)。它还接受以输出和弦修饰符为前缀的列表,其中该列表受到上述限制。
重要的 | 数字键 0-9 将被解析为毫秒延迟,而在其他上下文中它们将被解析为键名称。要使用编号键,它们必须具有别名,或者使用键名 Digit0-Digit9。 |
最多可以同时激活 4 个宏。
宏中支持的操作有:
笔记 | 其中一些操作之间可能需要短暂的延迟。例如,(宏 a (unmod b) 5 (unmod c) d)) 需要延迟 5 才能正常工作。 |
例子:
(defalias
: S-;
8 8
0 0
🙃 (unicode 🙃)
;; Type "http://localhost:8080"
lch (macro h t t p @: / / 100 l o c a l h o s t @: @8 @0 @8 @0)
;; Type "I am HAPPY my FrIeNd 🙃"
hpy (macro S-i spc a m spc S-(h a p p y) spc m y S-f r S-i e S-n d spc @🙃)
;; alt-tab(x3) and alt-shift-tab(x3) with macro
tfd (macro A-(tab 200 tab 200 tab))
tbk (macro A-S-(tab 200 tab 200 tab))
)
宏发布取消
宏操作的宏释放取消变体将在释放按键时取消所有活动的宏。较短的 unicode 变体:macro↑⤫。此变体的解析方式与非取消版本相同。此操作的一个示例用例是按住一个键以获得不同的输出,类似于踢踏舞,但可以看到正在输出哪些键。
例如。在下面的示例中,按住该键时,首先键入 1,然后替换为 ! 500ms后,最后再过500ms后被@替换。但是,如果释放该键,则将保留最后键入的字符,并且宏的其余部分不会运行。
(defalias
1 1
;; macro-release-cancel to output different characters with visual feedback
;; after holding for different amounts of time.
1!@ (macro-release-cancel @1 500 bspc S-1 500 bspc S-2)
)
按下宏取消
宏操作的按下宏取消变体可以为包括其自身在内的所有活动宏启用取消触发器,当物理按下任何其他键时,该宏就会被激活。宏执行过程中会启用触发器。
(defalias
1 1
1!@ (macro-cancel-on-press @1 500 bspc S-1 500 bspc S-2)
)
宏发布取消和按下时取消
宏释放取消和按下时取消变体结合了释放取消和按下时取消的取消行为。
(defalias
1 1
1!@ (macro-release-cancel-and-cancel-on-press @1 500 bspc S-1 500 bspc S-2)
)
宏重复
前面描述的三个宏操作还有更多的宏重复变体。这些变体在按住时会重复。仅当所有宏完成后才会发生重复,包括保持的宏键。如果同时保持多个重复宏,则仅重复最近按下的宏。
(defalias
mr1 (macro-repeat mltp)
mr2 (macro-repeat-release-cancel mltp)
mr3 (macro-repeat-cancel-on-press mltp)
mr4 (macro-repeat-release-cancel-and-cancel-on-press mltp)
)
动态宏 (dynamic-macro-xxx)
参考
记录并重放按键输入。
句法:
(dynamic-macro-record $id)
(dynamic-macro-play $id)
(dynamic-macro-record-stop)
(dynamic-macro-record-stop-truncate $count)
动态宏记录 | 记录一个动态宏,该宏将使用定义的 $id 保存。 |
动态宏播放 | 播放用定义的 $id 保存的宏。 |
动态宏记录停止 | 停止并保存宏录制。这也可以通过录制新的宏或使用相同的 $id 重新按下记录来实现。 |
动态宏记录停止截断 | 停止并保存宏录制,同时从录制末尾截断 $count 事件。如果录制/停止按钮位于不同的层,这会很有用。 |
描述
动态宏操作允许记录和播放按键。动态宏记录物理按键,而不是 kanata 的输出。这允许动态宏复制任何操作,但这意味着如果宏在不同层上开始和结束,则宏可能无法正确重复。
动作dynamic-macro-record接受一个数字(0-65535),它代表宏ID。激活此操作将开始记录物理按键输入。如果再次按下相同 ID 的动态宏记录,录制将结束并被保存。如果按下具有不同 ID 的动态宏记录,则当前录制将结束并保存,然后将开始具有新 ID 的新录制。
动作“dynamic-macro-record-stop”将停止并保存任何活动录制。有一个变体:dynamic-macro-record-stop-truncate 这是一个带有单个参数的列表操作:在动态宏末尾要删除的关键操作的数量。如果宏停止按钮位于不同的图层上,则此变体非常有用。
动作dynamic-macro-play接受一个数字(0-65535),它代表宏ID。激活此操作将播放具有相同宏 ID 的先前动态宏记录(如果存在)中保存的物理按键记录。
动态宏可以相互嵌套,例如在使用 (dynamic-macro-record 0) 录制时激活 (dynamic-macro-play 1)。然而,动态宏不能递归;例如使用 (dynamic-macro-record 0) 录制时激活 (dynamic-macro-play 0) 将被忽略。
例子:
(defalias
dr0 (dynamic-macro-record 0)
dr1 (dynamic-macro-record 1)
dr2 (dynamic-macro-record 2)
dp0 (dynamic-macro-play 0)
dp1 (dynamic-macro-play 1)
dp2 (dynamic-macro-play 2)
dms dynamic-macro-record-stop
dst (dynamic-macro-record-stop-truncate 1)
)
大写单词
参考
大写单词操作使 Kanata 进入一种状态,其中键入的键会自动按 lsft 移动。该状态将持续存在,直到因超时或键入结束该状态的键而终止。键入非终止键会刷新超时持续时间。
如果在 caps-word 处于活动状态时按下 -toggle 变体,则将结束 caps-word 状态,而重新按下标准变体将保持状态处于活动状态并刷新超时持续时间。
句法:
(caps-word $timeout)
(caps-word-toggle $timeout)
(caps-word-custom $timeout $shifted-list $non-terminal-list)
(caps-word-custom-toggle $timeout $shifted-list $non-terminal-list)
$超时 | 大写字状态结束之前的毫秒数。输入非终止字符后,持续时间就会刷新。 |
$shifted-列表 | 将自动移动的键列表。 |
$非终端列表 | 不移动但不终止大写字状态的键列表。 |
描述
caps-word 或 word⇪ 操作会触发一种状态,当一组特定键处于活动状态时,lsft 键将被添加到活动键列表中。键为:a-z 和 -,使用 US 布局时将分别输出为 A-Z 和 _。
有用的示例是将单个重要单词大写,例如“重要!”或者在代码中定义一个常量,如 const P99_99_VALUE: ...。这比常规大写锁定有一个优势,因为它会自动结束,因此不需要手动关闭,并且它还会切换到大写锁定不会执行的操作。
当键盘在定义的超时(第一个参数)时间内处于空闲状态或按下终止键时,大写字状态结束。除了大写的键和此列表中的额外键之外,每个键都是终止键:
0-9
kp0-kp9
删除
上 下 左 右
如果您想手动定义哪些键大写(第二个参数)以及额外的非终端+非大写键应该是什么(第三个参数),您可以使用 caps-word-custom 或 word⇪-custom 代替 caps-word 。
例子:
(defalias
cw (caps-word 2000)
;; This example is similar to the default caps-word behaviour but it moves the
;; 0-9 keys to the capitalized key list from the extra non-terminating key list.
cwc (caps-word-custom
2000
(a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9)
(kp0 kp1 kp2 kp3 kp4 kp5 kp6 kp7 kp8 kp9 bspc del up down left rght)
)
)
大写单词切换
大写单词操作有 -toggle 变体。默认情况下,重新按下 caps-word 将使 caps-word 保持活动状态。如果当前处于活动状态,-toggle 变体将结束 caps-word,否则 caps-word 将正常激活。
例子:
(defalias
cwt (caps-word-toggle 2000)
cct (caps-word-custom-toggle
2000
(a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9)
(kp0 kp1 kp2 kp3 kp4 kp5 kp6 kp7 kp8 kp9 bspc del up down left rght)
)
)
取消修改 (unmod)
参考
unmod 操作将停用修改键,同时输出一个或多个已定义的键。
句法:
(unmod $key1 $key2 ... $keyN)
(unmod ($mod1 $mod2 ... $modN) $key1 $key2 ... $keyN)
$键 | 未修改时输出的键名。 |
$mod | 默认情况下 unmod 将停用所有修饰键。作为第一个参数的可选列表允许指定要在操作期间停用的修饰符子集。 |
描述
unmod 操作将暂时释放所有修改器并发送一个或多个键。释放 unmod 键后,再次按下释放的修饰键。受影响的修饰符有:lsft、rsft、lctl、rctl、lmet、rmet、lalt、ralt。
unmod 的一个变体是 unshift 或 un⇧。此操作仅释放 lsft、rsft 键。这对于在仍按住 AltGr 的情况下强制不移动键非常有用。
笔记 | 如果要撤消的修饰符不是 defsrc 的一部分,则需要在 defcfg 中启用 process-unmapped-keys 以便正确跟踪它们的状态。 |
例子:
(defalias
;; holding shift and tapping a @um1 key will still output 1.
um1 (unmod 1)
;; dead keys é (as opposed to using AltGr) that outputs É when shifted
dké (macro (unmod ') e)
;; In ISO German QWERTZ, force unshifted symbols even if shift is held
{ (unshift ralt 7)
[ (unshift ralt 8)
)
可以选择使用列表作为 unmod 的第一个参数。该列表必须非空,并且必须仅包含修饰符键,这些修饰符键是本文档前面部分中受影响的修饰符列表中的键。
当此列表存在时,该操作将暂时仅释放列出的键而不是所有修饰符。
例子:
(defalias
;; only unshift the alt keys
unalt-a (unmod (lalt ralt) a)
)
叉 (fork)
参考
分叉操作允许根据特定键是否处于活动状态在默认操作和备用操作之间进行选择。 fork 相当于 switch 中的基本键检查,不使用任何列表逻辑项,即不支持虚拟键。
句法:
(fork $left-action $right-action $right-trigger-keys)
$left-action | 默认激活的操作。 |
$right-action | 如果任何 $right-trigger-keys 处于活动状态,则激活操作。 |
$right-trigger-keys | 键列表,如果在 fork 激活时处于活动状态,则会导致 $right-action 发生而不是 $left-action。 |
提示 | 键 nop0-nop9 可以用作无操作输出,仍然可以在 fork 内检查,这与 XX 所做的不同。 |
分支 (switch)
参考
开关操作允许有条件地激活 0 个或多个操作,具体取决于条件检查。
句法:
(switch
$logic-check1 $action1 $post-activate1
$logic-check2 $action2 $post-activate2
...
$logic-checkN $actionN $post-activateN)
$logic-check | 如果条件评估为 true,则将触发相应的操作。 |
$action | 当逻辑评估为 true 时激活的操作。 |
$post-activate | 有效值是失败和突破。通过失败,当操作激活时,开关将继续评估进一步的逻辑检查并可能触发更多操作。中断后,将不会激活进一步的操作。 |
逻辑检查是一个列表。列表中的项目可以是键名称或特殊列表检查。如果在激活开关时该键名称是 Kanata 当前活动的键输出,则该键名称项目的评估结果为 true。如果任何项目评估为 true,最外层列表的评估结果为 true。
逻辑检查语法:
($item1 $item2 ... $itemN)
特殊检查的语法:
(or $item1 $item2 ... $itemN)
(and $item1 $item2 ... $itemN)
(not $item1 $item2 ... $itemN)
(key-history $key-name $key-recency)
(key-timing $key-recency $comparator $time)
(input $input-type $key-name)
(input-history $input-type $key-name $input-recency)
(layer $layer-name)
(base-layer $layer-name)
or | 如果任何 $item 为 true,则计算结果为 true。 |
and | 如果所有 $item 都为 true,则计算结果为 true。 |
not | 如果所有 $item 都为 false,则计算结果为 true。 |
key-history | 如果新近度槽中的键与 key-recency 为 1 是最近按下的键。最大新近度为 8。 |
key-timing | $comparator 的有效值是小于和大于,如果需要,可以使用 lt 和 gt 作为简写。如果按下具有相应新近度的键(对于 lt 来说比最近,或者对于 gt 比比)晚于定义的 $time(以毫秒为单位),则此项评估为 true。 |
input | 如果当前按下了 $key-name,则计算结果为 true。 $input-type 必须是真实的或虚拟的。如果使用 real,这将检查 defsrc 输入。如果使用虚拟,这将检查虚拟密钥激活。 |
input-history | 如果 $input-recency 槽中的输入与 $key-name 匹配,则求值为 true。两种输入类型使用相同的新近度槽历史记录。新近度 1 是最近的输入,即输入激活开关本身。最大新近度为 8。 |
layer | 如果活动图层与 $layer-name 匹配,则求值为 true。 |
base-layer | 如果层切换操作中最近切换到的层与 $layer-name 匹配,则评估结果为 true。 |
描述
从概念上讲,switch 操作与 fork 类似,但具有更多功能和更复杂性。 switch 操作接受多种情况。一种情况是以下的三重:
- 逻辑检查
- 操作:如果逻辑检查评估为 true,则激活
- Fallthrough|break:选择继续还是停止评估案例
逻辑检查的默认使用行为与 fork 类似。
例如,如果当前按下 a、b 或 c 中的任何一个,逻辑检查 (a b c) 将激活相应的操作。
提示 | 键 nop0-nop9 可以用作无操作输出,仍然可以在 switch 内检查,这与 XX 所做的不同。 |
逻辑检查还接受布尔运算符和|或|不允许更复杂的用例。
案例的顺序很重要。例如,如果两个不同的情况与当前按下的键匹配,则配置中前面列出的情况将首先激活。如果第一个case使用了break,第二个case将不会激活。否则,如果使用fallthrough,则第二种情况将在第一种情况之后依次激活。这个想法可以推广到两个以上的案例,但这两个案例的例子希望足够简单和有效。
例子:
(defalias
swt (switch
;; case 1
((and a b (or c d) (or e f))) @ac1 break
;; case 2
(a b c) @ac2 fallthrough
;; case 3
() @ac3 break
)
)
下面描述了该示例的行为方式。
案例一
((and a b (or c d) (or e f))) a break
将案例 1 的逻辑检查转换为其他一些常见语言可能如下所示:
(a && b && (c || d) && (e || f))
如果逻辑检查通过,则操作 @ac1 将激活。由于使用了中断,因此不会激活其他操作。
案例2和案例3
(a b c) c fallthrough
() b break
情况 2 的密钥检查行为类似于分叉,即
(or a b c)
或者对于其他一些常见语言:
a || b || c
如果此逻辑检查通过,而情况 1 未通过,则操作 @ac2 将首先激活。由于情况 3 的逻辑检查总是通过,@ac3 接下来将激活。
如果情况 1 或情况 2 均未通过逻辑检查,则情况 3 将始终使用 @ac3 激活。
按键历史和按键计时
除了简单的按键之外,还有两个列表项可以在案例逻辑检查中使用,与您键入的按键历史记录进行比较:
key-history
key-timing
按键历史记录项比较按键的键入顺序。它按顺序接受:
- a key
- the key recency
按键新近度必须在 1-8 范围内,其中 1 是最近按下的按键,8 是最近按下的第 8 个按键。
例子:
(defalias
swh (switch
((key-history a 1)) S-a break
((key-history b 1)) S-b break
((key-history c 1)) S-c break
((key-history d 8)) (macro d d d) break
() XX break
)
)
按键时间比较最近的按键输入事件发生的时间。它按顺序接受,
- 关键新近度
- 比较字符串,是以下之一:小于|大于|lt|gt
- 要比较的毫秒数
按键新近度必须在 1-8 范围内,其中 1 是最近按下的按键,8 是最近按下的第 8 个按键。大多数用例预计会为此参数使用值 1,但也许您可以找到其他值的创造性用途。
比较字符串确定如何将实际按键事件计时与提供的计时进行比较。
毫秒数必须为 0-65535。
警告 | 整个配置中此配置项的最大毫秒值将是 kanata 变得空闲并每大约 1 毫秒停止处理其状态机所需时间的下限。 |
例子:
(defalias
swh (switch
((key-timing 1 less-than 200)) S-a break
((key-timing 1 greater-than 500)) S-b break
((key-timing 2 lt 1000)) S-c break
((key-timing 8 gt 2000)) (macro d d d) break
() XX break
)
)
不是
到目前为止提供的示例尚未包括非布尔运算符。现在将讨论该运算符。在语法上,not 运算符的使用与 or|and 类似。从功能上讲,它意味着“不是任何”列表元素。
例子:
(defalias
swn (switch
((not x y z)) S-a break
;; the above and below cases are equivalent in logic
((not (or x y z))) S-a break
)
)
用可能更熟悉的表示法来说,这两种情况都有这样的逻辑:
!(x || y || z)
输入
到目前为止,所有开关逻辑都与按键代码输出相关联。也可以对输入进行操作。输入可以是真实按键或“虚拟”(假)按键。
例子:
(defalias switch-input-example
(switch
((input real lctl)) $ac1 break
((input virtual vk1)) $ac2 break
() $ac3 break
)
)
与常规活动键的键历史记录类似,输入历史记录也存在。与按键历史记录相比,输入历史记录的一个可能令人惊讶但希望符合逻辑的行为是,在开关激活时,新近度 1 的输入历史记录的历史将是刚刚按下的输入。换句话说,新近度 1 是激活开关动作本身的输入。而对于按键历史记录来说,下一个输出的按键可能由开关逻辑本身确定,因此不在历史记录中。这样做的结果是,在引用之前按下的输入时,您应该使用新近度 2,因为当前输入位于新近度 1 插槽中。
例子:
(defalias switch-input-history-example
(switch
((input-history real lsft 2)) $var1 break
((input-history virtual vk2 2)) $var1 break
() $ac3 break
)
)
层
图层列表项可用于切换逻辑中以对活动图层进行操作。它接受单个图层名称,如果配置的图层名称是活动图层,则计算结果为 true,否则计算结果为 false。
例子:
(defalias switch-layer-example
(switch
((layer base)) x break
((layer other)) y break
() z break
)
)
基础层
如果配置的层名称是基础层,则基础层列表项的值为 true。基础层是最近从层切换操作切换到的层,或者是配置中定义的第一层(如果从未激活层切换)。
例子:
(defalias switch-layer-example
(switch
((base-layer base)) x break
((base-layer other)) y break
() z break
)
)
指令
除非您使用适当的二进制文件或(如果您自己编译)适当的功能标志,否则此操作不起作用。此外,您还必须添加危险启用cmd defcfg 选项。
参考
cmd 操作允许您使用任意参数执行任意二进制文件。 cmd-log 变体的行为类似,但允许在 Kanata 的输出日志记录中自定义 stdout 和 stderr 日志级别。 cmd-output-keys 与 cmd 类似,但命令的 stdout 将被解析为键列表、输出和弦和类似于宏的延迟,并键入为 kanata 输出。
句法:
(cmd $binary $arg1 $arg2 ... $argN)
(cmd-log $stdout-log-level $stderr-log-level)
(cmd-output-keys $binary $arg1 $arg2 ... $argN)
$二进制 | 要运行的可执行二进制文件。 |
$arg | 参数传递到二进制文件中。 |
$stdout-日志级别 | 命令的标准输出的日志级别。必须是调试、信息、警告、错误或无。 |
$stdout-日志级别 | 命令的 stderr 日志级别。必须是调试、信息、警告、错误或无。 |
描述
cmd 操作执行带参数的程序。它接受一个或多个字符串。第一个字符串是将要运行的程序,以下字符串是该程序的参数。参数按照配置文件中写入的顺序提供给程序。列表也可以在 cmd 中使用,您可能希望通过 defvar 进行重用。列表将被展平,以便按照配置文件中写入的顺序向程序提供参数,而不管列表嵌套如何。从技术角度来说,这将是深度优先扁平化(类似于 DFS)。
命令是直接执行的,而不是通过 shell,因此您不能使用具有特殊含义的环境变量或符号。例如,Linux 中的 ~ 或 $HOME 不会替换为您的主目录。如果您想使用 shell 程序执行,请使用 shell 作为第一个参数,例如bash 或 powershell.exe。
执行该命令的用户是启动 kanata 时使用的用户。例如,如果 kanata 由 root 启动,则该命令将由 root 用户运行。如果您需要以不同的用户身份执行,在 Unix 平台上,您可以在其余命令之前使用 sudo -u USER 来实现此目的。
例子:
(defalias
cm1 (cmd rm -fr /tmp/testing)
;; You can use bash -c and then a quoted string to execute arbitrary text in
;; bash. All text within double-quotes is treated as a single string.
cm2 (cmd bash -c "echo hello world")
;; You can prefix commands with sudo -u USER
;; to execute commands as a different user.
cm3 (cmd sudo -u other_user bash -c "echo goodbye")
)
默认情况下,cmd 记录命令的开始、命令的完成、stdout 和 stderr。使用变体 cmd-log,可以更改甚至禁用这些日志级别。它需要两个参数:<log_level> 和 <error_log_level>。 <log_level> 将是记录要运行的命令、stdout 和 stderr 的级别。仅当运行命令失败时才会记录错误通道(通常是找不到命令,或者生成命令时遇到问题)。
有效级别为 debug、info、warn、error 和 none。
例子:
(defalias
;; The first two arguments are the log levels, then just the normal command
;; This will only error if `bash` is not found or something else goes
;; wrong with the initial execution. Any logs produced by bash will not
;; be shown.
noisy-cmd (cmd-log none error bash -c "echo hello this produces a log")
;; This will only log the output of the command, but it won't start
;; because the command doesn't exist.
ignore-failure-cmd (cmd-log info none thiscmddoesnotexist)
verbose-only-log (cmd-log verbose verbose bash -c "echo yo")
)
cmd 有一个变体:cmd-output-keys。此变体读取已执行程序的输出并将其读取为 S 表达式,类似于宏操作。然而,与宏不同的是,仅支持延迟、调、和弦和和弦列表。不支持其他操作。
(defalias
;; bash: type date-time as YYYY-MM-DD HH:MM
pdb (cmd-output-keys bash -c "date +'%F %R' | sed 's/./& /g' | sed 's/:/S-;/g' | sed 's/\(.\{20\}\)\(.*\)/\(\1 spc \2\)/'")
;; powershell: type date-time as YYYY-MM-DD HH:MM
pdp (cmd-output-keys powershell.exe "echo '(' (((Get-Date -Format 'yyyy-MM-dd HH:mm').toCharArray() -join ' ').insert(20, ' spc ') -replace ':','S-;') ')'")
)
剪切板操作
笔者 (LincZero) 备注: 这部分是我提交的issue让作者加的,所以你得更新到 v1.8.0+ 才有这个功能
参考
剪贴板操作可以与“保存 ID”一起操作操作系统剪贴板。要粘贴,您可以使用诸如 的操作C-v
;Kanata 没有内置粘贴操作。
句法:
(clipboard-set $clipboard-string) ;; 将剪贴板设置为指定的字符串
(clipboard-save $save-id) ;; 使用指定的ID保存当前剪贴板内容
(clipboard-restore $save-id) ;; 将剪贴板设置为使用指定 ID 保存的内容。如果保存 ID 内容为空,则此操作不执行任何操作。
(clipboard-save-swap $save-id $save-id) ;; 交换两个保存 ID 的内容
(clipboard-cmd-set $binary $arg1 $arg2 ... $argN)
(clipboard-save-cmd-set $save-id $binary $arg1 $arg2 ... $argN)
clipboard-set | 将剪贴板设置为指定的字符串。 |
clipboard-save | 使用指定的ID保存当前剪贴板内容。 |
clipboard-restore | 将剪贴板设置为使用指定 ID 保存的内容。如果保存 ID 内容为空,则此操作不执行任何操作。 |
clipboard-save-swap | 交换两个保存 ID 的内容。 |
clipboard-cmd-set | 将剪贴板 设置为命令的输出。如果当前内容是文本,则剪贴板的当前内容将传递到命令的标准输入。如果内容是图像,则不会将任何内容传递到标准输入。 |
clipboard-save-cmd-set | 将保存 ID 内容 设置为命令的输出。如果当前内容是文本,则保存 ID 的当前内容将传递到命令的标准输入。如果内容是图像,则不会将任何内容传递到标准输入。 |
$clipboard-string | 用于设置操作系统剪贴板的固定字符串。 |
$save-id | 0-65535 代表已保存的剪贴板内容的 ID 的数字。 |
$binary | 要运行的可执行二进制文件。 |
$arg | 参数传递到二进制文件中。 |
描述
您可以使用剪贴板操作保存剪贴板内容、粘贴任意内容,然后恢复原始剪贴板内容。此功能类似于某些文本扩展器的功能。您还可以使用 shell 命令以任意方式操作剪贴板内容。所有这些都可以通过宏在单个命令中完成。
请注意,您可能需要在组件之间添加延迟,因为剪贴板系统需要一些时间来传播更新。
下面的示例是一个宏,它两次粘贴剪贴板的内容,中间有一个空格,同时在末尾恢复原始剪贴板内容。值得注意的是,该示例使用C-v
但这可能不适合您。如果您有操作系统级重新映射,则v
可能不同才能有效粘贴。也可能有效的是S-ins
例子:
(defcfg
danger-enable-cmd yes
)
(macro
(clipboard-save 0)
20
(clipboard-cmd-set powershell.exe -c r#"$v = ($Input | Select-Object -First 1); Write-Host -NoNewLine "$v $v""#)
300
C-v
(clipboard-restore 0)
)
我 (LincZero) 的个人补充:
注
前面的 (clipboard-cmd-set powershell.exe -c r#"$v = ($Input | Select-Object -First 1); Write-Host -NoNewLine "$v $v""#)
可以自己实现一下:
先保存一个powershell脚本文件:script.ps1
$v = ($Input | Select-Object -First 1)
Write-Host -NoNewLine "$v $v"
然后执行
"Your input here" | .\script.ps1
我这边直接使用是正常的,但是在脚本中却报错,很奇怪……
个人脚本
(macro
(clipboard-save 0)
20
$0
300
C-v
(clipboard-restore 0)
)
任意代码
任意代码操作允许将任意数字发送到 kanata 的输出机制。按下时发送按下,释放时发送释放。此操作对于测试尚未在 kanata 中命名或映射的键非常有用。请在 GitHub 问题或拉取请求中贡献包含名称和映射的发现!
这不是跨平台的
使用拦截驱动程序时,此操作仍通过 SendInput 发送
(defalias ab1 (arbitrary-code 700))