虽然有人推过了, 再来推荐一波xkeysnail, 功能更完善了一点

单纯添加或者去除显示器是没问题的…我这两个是正常使…

拔掉显示器之后按快捷键重新自动布局就行…我设置的mod+r

嗯 插拔确实不好使…

如果是固定的显示器和固定的摆放位置的话可以写脚本啊。

我目前是这样的,有一个笔记本和一个显示器,如果连接它们时,我会把笔记本竖着固定起来(贫穷使我我这样)看 PDF 之类的。

有两个 i3 的配置文件,一个用于笔记本屏幕,一个用于加显示器的。区别主要是一些绑定按键的区别和工作区的分配。

写的脚本思路大概是这样的:

  1. 判断显示器数量( xrandr | grep " connected " | wc -l )
  2. 如果是一个屏幕
    xrandr --output eDP-1 --mode 1920x1080 --pos 0x0 --rotate normal
    xrandr -auto
    ln -sf "$I3_CONFIG_1" $HOME/.config/i3/config

如果是两个屏幕

    xrandr --output eDP-1 --mode 1600x900 --pos 0x0 --rotate left --output HDMI-2 --mode 1920x1080 --pos 1000x0
    ln -sf "$I3_CONFIG_2" $HOME/.config/i3/config
  1. 重启 i3 (i3-msg restart)
  2. 重新设置壁纸

像 eDP-1 之类的好像在不同的显示器上是不同的,包括插不同的线也是。所以这个脚本只能用于一台设备啊。

我这 eDP-1 一直是笔记本屏幕啊,我现在就一个外置显示器,所以需求很简单,如果我设备变多的话,我肯定会考虑在扩充一下脚本的。

1 . 如果用的显示器比较固定,包括摆放位置固定,造成混乱的只有连接线、接口:

1.1 显示屏不一样大,xrandr 的结果有:

eDP-1 connected primary 900x1600+0+0 left (normal left inverted right x axis y axis) 344mm x 193mm

最后的这个实际尺寸可以拿来做做文章。

1.2 其他情况就找 EDID 来识别设备。

2 . 用的显示设备经常不同,摆放位置也不一样的话,我没考虑过,感觉无论用什么桌面/系统都得手动调一下吧。

@nlfiasel 请教下你是怎么设置开机自动启动的,我按照你推荐的这个方法操作,没法成功。 查看状态是报错退出。 手动执行的时候,是可以正常工作的。
系统: Arch Linux + KDE

● xkeysnail.service - xkeysnail
     Loaded: loaded (/home/aqua/.config/systemd/user/xkeysnail.service; enabled; vendor preset: enabled)
     Active: activating (auto-restart) (Result: exit-code) since Wed 2020-10-28 20:51:50 CST; 625ms ago
    Process: 4391 ExecStartPre=/usr/bin/xhost +SI:localuser:root (code=exited, status=0/SUCCESS)
    Process: 4392 ExecStart=/usr/bin/xkeysnail -q ~/.config/xkeysnail/config.py (code=exited, status=1/FAILURE)
   Main PID: 4392 (code=exited, status=1/FAILURE)

我参考另一个帖子设置成功了,这是配置文件

多谢。这个方法之前都试过了。还是没有用。
@Claude-Ray 今天重启后,发现用你的方法竟然成功了。 :smile:

xkeysnail 在 Gnome + Wayland + Arch 下,有一个存在了很久的问题。(排除不同版本的差异, 均有很大机会发生)

在启动 xkeysnail 的时候,会遇到随机某个按键失效。

例如: 第一次重启,空格键失效,下一次重启,a 失效, 再一次, l 失效,

我平常很少重启重启电脑,所以一旦有一次正常,我就用很久,所以还好,

今天因为调试一些东西的目的,多重启了几次,然后,基本上每次进来都这个或那个键不能用

最狠的一次,启动后不行,我就 logout, 再进来另一个键又失效了,再 logout, 我重复了 7 次,都快让整哭了 …

打算明天不用这个了,只用系统集成功能设定 Capslock 为 Ctrl. 右侧 Alt 为 Capslock 算了。

下面是我写的一个脚本,在 Gnome 下可以用的 (无论 X 或 Wayland 均可)

1 个赞

请问下xkeysnail 怎么表示单个Shift 按键。我希望将Shitf 在Emacs 下映射为 C-\。xkeysnail的如下设置没法生效:

define_keymap(re.compile("Emacs"), {
    K("Shift"): K("C-backslash"),
}, "Emacs")

没用xkeynail,不过类似这样的问题我也困惑好久了,emacs识别shift键按下该怎么写?我定义了很多shift开头的快捷键键,都是直接用的大写字母

在 Windows 系统通过 AHK 很容易实现 单个 Shift 或者 Ctrl 映射为其他组合键。 我这样做只是为了在 Linux 系统下输入法的切换方式统一。

define_multipurpose_modmap 可以分别设置一个键单独按下和与其他键一起按下时的行为,我把空格映射到了 Ctrl

define_multipurpose_modmap({
    Key.SPACE: [Key.SPACE, Key.LEFT_CTRL]
})

这种搞法似乎只能映射到 Key.XXX 而不是 K("XXX"),不过你的这个需求可以先把单按 Shift 映射到键盘上没有的键比如 F13,再把 F13 映射到 C-\

多谢。你的这个思路确实可以解决我的问题。再请教下,define_multipurpose_modmap 能否指定只在Emacs 生效?

还有个 define_conditional_multipurpose_modmap,似乎可以指定启用这个映射 condition

:+1: 感谢 @dimlight1998 终于可以在系统和Emacs 都用 Shift来切换输入法了 :grinning:
这里我 映射 左Shift —> F19 ,F19 —> C-\. Xkeysnail 设置如下:

define_conditional_multipurpose_modmap(lambda wm_class: wm_class in ("Emacs"), {
   Key.LEFT_SHIFT: [Key.F19, Key.LEFT_SHIFT],
})

define_keymap(re.compile("Emacs"), {
    K("F19"): K("C-Backslash"),
}, "Emacs")
1 个赞

在终端使用有些组合键识别不了有没有办法处理?比如有个机器按下m+d会被搞成5~

终端中的emacs也是很多组合键无法使用,关了xkeysnail就好了,每次使用都得关了xkeysanil然后各种键位不适应太上头

你可以在通用映射中排除终端,并针对终端进行单独的映射。可以参考下我的配置文件,我在 Arch 下面用的终端是Konsole。

我怎么感觉我俩配置差不多呢?我的配置

你在终端里面用Emacs 的话,就不要在终端用xkesnail 了。 你下面这个设置应该就会影响Emacs的相关按键。 建议注释掉这段。

define_keymap(re.compile("XTerm"), {
    K("C-x"): {
        # C-x C-c (exit)
        K("C-c"): K("M-f4"),
        K("c"): K("M-f4"),},
}, "Xterm")

wo X,草率了。了然,谢