为什么选择sway/而不是hyprland
sway/hyprland 两个都尝试了下,先试用的sway 后试用的hyprland ,后者动画更漂亮一些, 有心要切到hyprland 但由于以下几个原因,暂时放弃了折腾hyprland
- 已经在sway上折腾了一段时间,写了太多定制化的脚本,切过去成本太高
- 是试用的时候hyprland 崩了几次,
- xremap 似乎对hyprland 的支持有点问题,没深究原因,且xremap 是刚需
xremap 是什么
还是先贴我的配置: xremap.yaml
xremap 可以做到以下几点:
- 简单的键盘映射,如caplock 当esc用,
- 复杂的映射1,如 点按ctrl 当esc用,组合按时依然当ctrl用
- 复杂的映射2: 按下某组合键如ctrl-c 执行一条或多条指令,或发送另一组或多组按键
- 可以根据不同的app(window class/app_id) 独立进行按键绑定
- 支持emacs 按键序列如
C-xC-f
- 更多用法参见官网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等键):
- 如果运行的window中没发现emacs ,此使用指定的命令 运行emacs或emacsclient
- 如果当前窗口不是emacs ,则将焦点切到emacs窗口上
- 如果当前窗口已经是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
- 对于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"]}
- 记录焦点的转移,可以通过以下绑定快速回到上次获得焦点的窗口,
# bindsym $mod+grave [con_mark=_prev] focus
且各个脚本中有通过此脚本进行焦点的转移
open-with 与 ec
ec 是对emacsclient 的简单封装,确保使用合适的emacsclient ,并将打开的emacsclient聚焦 open-with 则是对ec 与xdg-open 的封装。
- 支持对 /path/to/file:linenum 的文件使用ec 在emacs 打开,并定位到指定行 这一点很有用,配合上alacritty 的 hints功能,可以实现当在alacritty 终端中编译文件时,若遇编译错误,可以很轻松的快速使用emacs打开指定文件、行号
- 对http https mailto等则使用xdg-open 来决定使用什么程序打开
alacritty
终端暂时选定了 alacritty ,我的配置文件见 alacritty.yml 还是先回答为何选择 alacritty
- 支持vi-mode ,可以在vi-mode 中方便的复制文本
- 它的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 的感觉了。
时间太晚,以后再补其他内容(如果大家有兴趣的话)。