1

我正在尝试将firefox-ctrl-q-workaround转换为也处理 Ctrl-Shift-C。这是因为我一直错误地在 Firefox 中使用 Ctrl-Shift-C 并且一直弹出打开的开发者工具变得乏味。令人难以置信的是,Firefox 没有任何配置快捷方式的方法。

设置大致如下所示:

首先,将 i3 中的密钥绑定到脚本:

# i3 config
bindsym --release Control+Shift+c exec --no-startup-id ~/ctrl_c_map.sh

脚本本身看起来像:

# This is the active window
W="$(xdotool getactivewindow)"

# Get window class
WM_CLASS="$(xprop -id "$W" | awk -F '"' '/WM_CLASS/{print $4}')"

# Succeed if the WM_CLASS is firefox
is_firefox() {
    [ "$WM_CLASS" == "firefox" ] || [ "$WM_CLASS" == "Firefox Developer Edition" ]
}

send_key() {
    keytosend=$1
    xdotool key --clearmodifiers --window "$W" "$keytosend"
}

if is_firefox; then
    # remap to copy (Ctrl+C)
    send_key ctrl+c
else
    # re-send original C-S-c as it was actually useful
    send_key ctrl+shift+c
fi

这在 Firefox 中有效 - 捕获 Ctrl-Shift-C 事件并将其重新映射到 Ctrl-C,并复制任何选定的文本。万岁!

但是,在任何其他程序中(特别是在 Ctrl-Shift-C 真正有用的终端中),都会出现问题。当ctrl+shift+c使用 发送密钥时xdotool,i3 再次捕获它并再次触发脚本,使我们陷入无限循环,您只能通过混合 Ctrl/Shift 来逃脱。此外,目标窗口永远不会得到它的 Ctrl-Shift-C 键:它在 i3 和 bash 之间无休止地循环,但从未真正到达。

如何在没有无限循环的情况下从 i3 触发的脚本中发送相同的绑定键?bindsym

4

2 回答 2

3

使用自动键

[这并不是问题的真正答案(如何停止 xdotool 和 i3 之间的无限循环),但它是一种比 i3bindsym [class="firefox"]方法更灵活的替代方案,以防您需要执行更多可能发送原始密钥的逻辑。如果你知道你永远不会发送原始密钥,@meuh 的答案更简单,这就是我现在正在使用的。]

将新脚本添加到自动键。要完全禁用密钥,请将脚本留空。要发送Ctrl+ C,它很简单:

# Send Ctrl-C instead of Ctrl-Shift-C
keyboard.send_keys('<ctrl>+c')

适当地设置热键<ctrl>+<shift>+c和窗口过滤器。就我而言,Navigator.firefox是它使用内置工具检测到的。

就是这样。

您可以在此脚本中添加逻辑以根据需要向程序分派不同的键,包括原始键(或无键)。

使用 i3/xdotool

如果您永远不会发送与触发器相同的密钥,并且您总是想发送相同的替换密钥,那么您应该使用@meuh 的答案。如果您要发送的密钥可能不同(例如,Firefox 中的 + 或Ctrl其他程序中的 +),您还可以调用脚本来执行密钥调度。CAltC

至关重要的是,就像@meuh 的回答一样,您使用class过滤器来防止在您发送原始密钥的任何时候调用脚本。这是一个正则表达式,所以你可以有多个过滤器:

# i3/config
bindsym --release Control+Shift+c [class="(firefox|other_prog)"] exec ~/myscript.sh

脚本本身基本上与问题中的一样,但它永远不能调用send_key ctrl+shift+c,否则它会循环。您可以发送任何其他密钥(除非您最终在多个脚本的奇怪吸引子之间循环,但这是您的问题!)

于 2020-04-22T10:56:48.927 回答
2

也许您可以Control+Shift+c通过使用仅匹配 Firefox 的条件来限制匹配,例如

bindsym Control+Shift+c [class="Firefox"] exec xdotool key --clearmodifiers ctrl+c
于 2020-04-17T17:06:46.613 回答