前言

寒假有空折腾了,先是因为扩充根分区,分区表出现了一些问题。乱修了一遍把保存的系统镜像也整没了。好在最后用testdisk救回来大部分数据,备份到移动硬盘中后被迫重装一次系统。在装完系统后把数据复制回来,这个时候产生了文件权限问题:所有文件都有可执行权限。正好最近在学习go,编写了一个程序来负责重新管理每个文件的权限。

func shouldKeepExecutable(filePath string) bool {
	cmd := exec.Command("file", "--mime", filePath)
	output, err := cmd.Output()
	if err != nil {
		fmt.Printf("Error running file command for %s: %v\n", filePath, err)
		return false
	}

	outputStr := strings.TrimSpace(string(output))
	fileType := strings.Split(outputStr, ": ")[1]
	return strings.Contains(fileType, "executable")
}

func changePermissions(filePath string, wg *sync.WaitGroup) {
	defer wg.Done()

	if !shouldKeepExecutable(filePath) {
		err := os.Chmod(filePath, 0644)
		if err != nil {
			fmt.Printf("Error setting permissions for %s: %v\n", filePath, err)
		}
	} else {
		err := os.Chmod(filePath, 0755)
		if err != nil {
			fmt.Printf("Error setting permissions for %s: %v\n", filePath, err)
		}
	}
}

func processDirectory(rootPath string) {
	var wg sync.WaitGroup

	err := filepath.Walk(rootPath, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			fmt.Printf("Error walking the path %v: %v\n", path, err)
			return nil
		}

		if !info.IsDir() {
			wg.Add(1)
			go changePermissions(path, &wg)
		}
		return nil
	})
	if err != nil {
		fmt.Printf("Error walking the directory: %v\n", err)
		return
	}

	wg.Wait()
}

func main() {
	var dirPath string
	fmt.Print("Enter directory path: ")
	fmt.Scanln(&dirPath)

	processDirectory(dirPath)
}

处理完这些顺便重新参考了一下kde的配置流程,发现自己之前原来一直没装kde-applications,原来一直都在用假的kde。后来把fcitx5的主题也换成了fcitx5-candlelight中的macOS-light,感觉比之前用的simple-theme好看,也是用上mac主题了。

如下图所示:

macOS-light

之前经过群友安利,打算试一试hyprland和yazi,现在有时间了就来折腾一下hyprland吧(yazi不知道之后会不会懒得写配置过程…)。之前用过i3和chadwm(一个定制化的dwm),i3的状态栏配置比较难绷而且美化之后也不是很好看,chadwm窗口开多了就会卡顿,现在对hyprland还是挺有期待的。

安装和配置过程

我使用的linux发行版是archlinux。

首先通过包管理器安装hyprland和相关应用。

yay -S hyprland hyprpaper swaylock-effects waybar mako rofi-lbonn-wayland-git grim slurp swappy wl-clipboard cliphist
  • 这里hyprland有两个版本:hyprlandhyprland-git,带git的版本包含最新的commit,不带的版本则是最新的release,我选择了看上去更稳定的release版。
  • hyprpaper是壁纸应用
  • swaylock-effects是锁屏应用
  • waybar是状态栏
  • mako是通知栏
  • rofi-lbonn-wayland-git是rofi的wayland版
  • grim, slurp, swappy是截屏工具
  • wl-clipboard, cliphist提供了wayland下的历史剪贴板功能

安装程序贴心地为我们自动配置好了Desktop Entry,不说了先hyprland启动!

启动完发现有很多问题,这也是意料之中。

网络

由于在kde中没有使用networkmanager作为网络服务,在wayland下需要重新配置其作为网络服务。
通过systemctl enable NetworkManager.service来自动启动服务,接着通过nmcli device wifi connect ...来连接路由器。

按键绑定

我使用neovim并把ESC键和CapsLock键交换了,这在xorg下直接执行setxkbmap -option caps:swapescape即可。然而在wayland下这并不可行。

参考了一下其他大佬的博文

interception-tools通过在libevdev层修改按键事件响应来完成整个功能,我的需求用提供的插件caps2esc就能解决。

文档中说

/etc/interception/udevmon.d/*.yaml is also read if present

于是将以下配置放进/etc/interception/udevmon.d/caps2esc.yaml即可。

- JOB: intercept -g $DEVNODE | caps2esc | uinput -d $DEVNODE
  DEVICE:
    EVENTS:
      EV_KEY: [KEY_CAPSLOCK, KEY_ESC]

通过systemd自动启动udevmon:sudo systemctl enable udevmon.service

locale

/etc/locale变成en_US.UTF-8了,改为zh_CN.UTF-8即可。

屏幕分辨率

启动非wayland原生的应用时字体会变模糊,需要在.config/hypr/hyprland.conf中设置monitor=,preferred,auto,1,其实就是把最后的scale设置为1即可。

再针对不同类型的程序设置对应的缩放比例:

  • xwayland:执行echo "Xft.dpi: 144 | xrdb -merge
  • QT: 执行export QT_WAYLAND_FORCE_DPI=144
  • fctix5:通过fcitx5-configtool里面的附加组件-经典用户选项-固定wayland DPI来配置,调整为144

具体参考的这篇文章


接下来开始配置快捷键和美化

快捷键绑定

类似i3和chadwm的设置,直接在.config/hypr/hyprland.conf里面写配置即可,基础的语法是bind key action

例如bind = $mainMod, Return, exec, $terminal,其中mainMod = SUPERterminal = kitty,类似bash的语法。其他衍生的绑定功能稍微看一眼也能知道什么意思。

修复声音

折腾了半天,最后发现是pipewire-pulse的配置文件因为重装系统丢失了,重新安装pipewire-pulse添加配置文件就正常了,实在难绷。

waybar美化配置

直接用别的大佬设计好的配置文件吧,以后如果有兴趣再自己设计。

壁纸

动态壁纸暂时还不是很需要,占用资源也比较多,先不折腾了。
写了一个类似chadwm的壁纸切换脚本,改用hyprpaper来切换壁纸。

至此所有的配置都完成了,等到后面使用过程中出现新的问题再来更新吧。


电波交流