分享下我折腾 sway/alacritty/xremap 的经历

首先分享下屏幕截图 其次把我dotfiles 分享出来 dotfiles/linux at main · jixiuf/dotfiles · GitHub , sway/alacritty/xremap 等的相关配置都在这里。

为什么选择sway/而不是hyprland

sway/hyprland 两个都尝试了下,先试用的sway 后试用的hyprland ,后者动画更漂亮一些, 有心要切到hyprland 但由于以下几个原因,暂时放弃了折腾hyprland

  1. 已经在sway上折腾了一段时间,写了太多定制化的脚本,切过去成本太高
  2. 是试用的时候hyprland 崩了几次,
  3. xremap 似乎对hyprland 的支持有点问题,没深究原因,且xremap 是刚需

xremap 是什么

还是先贴我的配置: xremap.yaml

xremap 可以做到以下几点:

  1. 简单的键盘映射,如caplock 当esc用,
  2. 复杂的映射1,如 点按ctrl 当esc用,组合按时依然当ctrl用
  3. 复杂的映射2: 按下某组合键如ctrl-c 执行一条或多条指令,或发送另一组或多组按键
  4. 可以根据不同的app(window class/app_id) 独立进行按键绑定
  5. 支持emacs 按键序列如C-xC-f
  6. 更多用法参见官网readme.

demo:

  - name: dterm                 # dropdown terminal by alacritty
    application:
      only: [dterm]
    remap:
    # 对于 dropdown 形式的 alacritty,spacebar-enter 时,先将当前 term 转成平铺窗口
    # 然后再使用 alacritty 的 SpawnNewInstance 重新打开一个 class=dterm 的窗口
    # 这个新窗口根据 swaywm 的规则,必是 floating 的
      # Super-M-f: { launch: ["swaymsg","floating toggle"] }
      Super-C-Enter:
        - { launch: ["swaymsg","floating toggle"] }
        - Shift-C-Enter
      C-x:
        remap:
          C-x: C-x              # C-xC-x send C-x
          C-c: { launch: ["sway-kill" ] } #C-x C-c: quit

所以我的按键绑定是使用xremap 完成的,而不是在sway的配置文件中, sway的配置文件中的绑定 多是touchpad手势的一些处理.

脚本sway-run-or-raise

https://github.com/jixiuf/dotfiles/blob/main/linux/bin/sway-run-or-raise

无论是mac/linux还是windows ,我切到一个新环境后,对我来说一个不可或缺的功能是 run or raise 的功能。 比如对我来按下: spacebar+e 后的行为如下(通常我会将spacebar 映射为cmd/或cmd+contrl等键):

  1. 如果运行的window中没发现emacs ,此使用指定的命令 运行emacs或emacsclient
  2. 如果当前窗口不是emacs ,则将焦点切到emacs窗口上
  3. 如果当前窗口已经是emacs 则将emacs 隐藏或将焦点切换到上一次聚焦的窗口。

这就是sway-run-or-raise 脚本的功能 当然里面夹带了些特殊逻辑的处理, 如 如果从emacs切换到alacritty 则自动在alacritty 中插入cd default-direcory (需要对frame-title-format 进行定制),具体参见另一个脚本 sway-cwd 中的注释。

脚本 sway-cwd

上面已经提到了sway-cmd 用于从emacs/alacritty 的title 中获取 current working directory

脚本 sway-move-to-prev-workspace/sway-move-to-next-workspace

将当前window 移动下一个workspace

sway-track-prev-focus

  1. 对于floating 的窗口,一旦失去焦点,则自动将其送到scratchpad,可通过 scratchpad show 依次将scratchpad 中的窗口召回。scratchpad可以认为是一个隐藏workspace,里面都是floating 窗口。
#      Super-M-h: { launch: ["swaymsg","move scratchpad"] }
      Super-C-M-h: { launch: ["swaymsg","scratchpad show"] }

这一点 对我来说很有用处,比如在终端中按下C-cC-j, 则我可以使用我的 open-with配合上sway-cwd ,可以实现 dired-jump 的功能,即使用emacsclient 打开dired 跳转到终端中当前目录,同时因为焦点的转移,自动将floating terminal 隐藏了。

  - name: Terminal
    application:
      only: [dterm,Alacritty,alacritty]
    remap:
      C-c:
        remap:
          C-j: { launch: ["open-with"]}
  1. 记录焦点的转移,可以通过以下绑定快速回到上次获得焦点的窗口,
# bindsym $mod+grave [con_mark=_prev] focus

且各个脚本中有通过此脚本进行焦点的转移

open-withec

ec 是对emacsclient 的简单封装,确保使用合适的emacsclient ,并将打开的emacsclient聚焦 open-with 则是对ec 与xdg-open 的封装。

  1. 支持对 /path/to/file:linenum 的文件使用ec 在emacs 打开,并定位到指定行 这一点很有用,配合上alacritty 的 hints功能,可以实现当在alacritty 终端中编译文件时,若遇编译错误,可以很轻松的快速使用emacs打开指定文件、行号
  2. 对http https mailto等则使用xdg-open 来决定使用什么程序打开

alacritty

终端暂时选定了 alacritty ,我的配置文件见 alacritty.yml 还是先回答为何选择 alacritty

  1. 支持vi-mode ,可以在vi-mode 中方便的复制文本
  2. 它的hints 功能很强大,它最原始的功能是在终端匹配http:// 等格式的链接,点击它 可快速在浏览器中打开, 但它支持自定义正则匹配,则我们很容易写一个正则 匹配到 /path/to/file:linenum 的内容,对于匹配的内容,可通过鼠标点击或快捷键的方式 执行我们指定的命令,如下为我的hints 配置
hints:
  #alphabet: "jfkdls;ahgurieowpq"
  enabled:
   - regex: "((ipfs:|ipns:|magnet:|mailto:|gemini:|gopher:|https:|http:|news:|file:|git:|ssh:|ftp:)[^\u0000-\u001F\u007F-\u009F<>\"\\s{-}\\^⟨⟩`]+)|(([\\w\\.\\-_/]+/)*[\\w\\-_\\.]+\\.[\\w]+(:\\d+)?)"
   # - regex: "([\\w\\./]+/)*[\\w]+\\.[\\w]+(:\\d+)?"
     hyperlinks: true
     command: open-with  # 执行我上文提到的open-with
     post_processing: true
     mouse:
       enabled: true
       mods: None
     binding:
       key: M                   # xremap C-cC-e ->C-Shift-M
       mods: Control|Shift

下图 为我按下C-cC-e 后的结果 ,可见 黄色字符标记的 j k f 等,我只需要按下相应的字符 就会使用 open-with脚本 通过emacsclient 打开相应的文件

当然 在 alacritty 的vi-mode 下 将光标移动到相应的位置,直接回车也能直接打应相应的文件 效果如下图 ,会有下划线标示

基本是有在emacs 中使用vterm 的感觉了。

时间太晚,以后再补其他内容(如果大家有兴趣的话)。

6 个赞

alacritty 支持不同語言(中英文)用不同字體了嗎?

有没有试过 keyd ?

不清楚, 我都是用 Sarasa Mono SC Nerd ,等高等宽,看习惯了感觉也还不错。解决选字体的烦恼

没细看过,有时间了解下, xremap 不满足我的一个需要是 将spacebar 映射为 super+ctrl 这样的组合键,我需要 interception / linux / plugins / Dual Function Keys · GitLab 这个配合才行, 但 xremap 与它似乎有时会冲突,需要经常重启其中某个服务才行。

那不太行,估计依然还是不支持 ligatures。

顺便键盘现在有kmonad,可以支持layers,multi tap和 tap hold等等,这个也挺不错的

[ids]
*
[main]
space = timeout(overload(control, space), 500, layer(control))
leftcontrol = space
leftalt = layer(meta)
leftmeta = layer(alt)

自用的 keyd 配置: 空格短按是空格,组合是 Ctrl; LCtrl 是空格; 交换 LAlt 和 LSuper。

原本只需要

space = overload(control, space)

就可以实现,加 timeout 是为了长按放手以后避免输入空格。

1 个赞

它的hints 功能很强大,它最原始的功能是在终端匹配http:// 等格式的链接,点击它 可快速在浏览器中打开, 但它支持自定义正则匹配,则我们很容易写一个正则 匹配到 /path/to/file:linenum 的内容,对于匹配的内容,可通过鼠标点击或快捷键的方式 执行我们指定的命令,如下为我的hints 配置

这个好,我自己给 foot 也糊了糊(官方支持 osc8 和 https 这些协议的)

分享下配置吧

xremap 看起来不错,请问它能解决外部应用和 Emacs 快捷键冲突的问题吗?

比如 C-c C-c 在系统层绑定了 GoldenDict 查词,有什么办法能让它在 Emacs 中单独失效吗?

没配置,直接糊了一个新方法给 foot

  - name: Emacs
    application:
      only: [emacs,Emacs]
    remap:
      C-c: C-c

单独给emacs 绑定C-c就行了。

原来是foot 的开发者,赞,

试用了下, keyd 似乎没法像xremap 支持C-xC-f 类的按绑定吧,不过我用keyd 把我的 interception / linux / plugins / Dual Function Keys · GitLab 与 ydotool

现在的按键是 键盘->keyd->xremap->sway

不是,普通用户。。。

甚至提得 issue 还偷了大佬的图

xremap 是有 hyprland 版本的 https://aur.archlinux.org/packages/xremap-hypr-bin 我现在用的就是这个, 没有什么问题

xremap原来不支持hyprland,我受不了没有emacs按键绑定就随手写了一个,rust当时都不会 :sweat_smile:

现在日常hyprland+xremap,不过我改的键不多。

Arch 的 kernel 没有打开 uinput ,好像没法用。可惜这个是我找到 sway 下看上去最易用的。Keyd 我没找到类似下面这种排除的方式。

application:
  not:

我已经把 xremap 用起来了。CONFIG_INPUT_UINPUT=m也能用/dev/uinput

xremap 真好用,Arch Linux + Gnome,例子中自带了一套 Emacs 按键,把 Console 也加入排除列表就好使了。

1 个赞