煮字为药

欢迎来到我的博客!

视频教程:【从「Linuxmint入门」到「ArchLinux安装详解」桌面端Linux入门的最佳路径】

两种安装方式,按需选择。脚本安装可能会出现意想不到的报错。新手建议先手动安装,把脚本安装当作重装系统的便利工具,否则日后出现问题自己不会解决。如果手动安装太难,就先使用开箱即用的Arch,比如CachyOS。

重要概念讲解

太长不看的总结:ESP(启动分区)的挂载点通常是/boot,但是本文为了使用btrfs快照功能将其挂载到了/efi。grub安装路径从默认的/boot/grub移动到了/efi/grub

  • Linux目录结构

    Linux的目录是由/左斜杠开头的树状结构,所以/被称为根目录(root目录)。例如/home就是根目录下的home目录,/home/shorin就是根目录下的home目录里面的shorin目录。

  • 挂载

    意思是把硬盘分区对应到某个目录。

  • 挂载点(mount point)

    假设把/dev/nvme0n1这个设备挂载到/home目录,那就称/dev/nvme0n1的挂载点为/home

  • 文件系统

    archwiki file system

    文件系统决定了文件的存放和检索方式,不同的文件系统有不同的功能和特性。本文使用btrfs文件系统,最大的特点是快照(相当于存档和回档)。

  • Bootloader引导程序

    archwiki_arch_boot_process

    引导程序,用来引导系统启动。Grub最为常用。

  • EFI系统分区(ESP)

    efi system partition

    一个特殊的分区,用于存放.efi文件,这是启动系统的“第一把钥匙”,文件系统必须是FAT。

ESP挂载点

常用挂载点为/boot/boot/efi/efi。具体挂载到哪里要看情况。

  • 因素一:硬盘空间

    /boot是最典型的挂载点,很多Bootloader程序只有ESP挂载点为/boot时才能正常工作,但是/boot存放着系统启动和初始化相关的文件,在多内核的情况下需要1g甚至2g空间。

  • 因素二:文件系统

    ESP是FAT文件系统,无法被btrfs快照记录和恢复,所以使用btrfs文件系统时ESP不能挂载到/boot

    假设创建快照时的内核版本是6.16,然后更新到了6.17,然后用快照回档。此时你的系统文件会被恢复到6.16,但是/boot里的内核文件和initramfs因为存储在FAT文件系统导致没能回档,版本仍然是6.17。两者版本不一致导致系统无法正常启动。为了避免这种情况,使用btrfs时ESP的挂载点应该是/boot/efi或者/efi。因为/efi是扁平布局更加简洁,所以此时的推荐挂载点为/efi

手动安装

参考链接:

archlinux 简明指南

安装指南 - Arch Linux 中文维基

可选:调大字体

1
setfont ter-v32n

或者

1
setfont -d

确认是UEFI固件

1
cat /sys/firmware/efi/fw_platform_size

cat命令将文件内容打印在终端

/sys/firmware/efi/fw_platform_size这是一个文件的绝对路径

如果输出64,说明主板是64位x64 UEFI固件;如果输出32,说明是32位UEFI;如果提示No such file or directory没有文件或目录,说明是BIOS。本文只涉及x64 UEFI情况下安装,如果你不是的话安装引导的步骤会不一样,可以查阅ArchWiki_Grub

如果你是虚拟机,并且是BIOS固件,推荐在虚拟机设置里调整为UEFI。

连接网络

有线网自动连接,还可以用数据线分享手机的网络。

确认网络连接使用:

1
2
ip a #查看网络连接信息,如果出现了紫色的ip地址说明成功连接
ping bilibili.com #确认网络正常

Ctrl+C可以中止正在运行的命令。

  • 使用iwctl命令行工具连接wifi(此工具由iwd提供)

    1. 启动

      1
      iwctl

      此时会进入iwctl,提示符会产生变化。

    2. 连接

      1
      2
      3
      4
      5
      6
      7
      device list #列出设备

      station wlan0 scan #扫描网络

      station wlan0 get-networks #列出所有扫描的的wifi

      station wlan0 connect 【此处是你的wifi名字(不能是中文)】
    3. 退出iwctl

      1
      exit

确认开启了NTP(网络时间协议)

运行timedatectl,应该会在输出看到NTP已经开启,否则在安装时可能会出现验证方面的报错:

1
NTP service: active

手动开启使用:

1
timedatectl set-ntp true 

reflector自动设置镜像源

reflector配置最快最新的镜像源,大幅提高软件下载速度。

1
2
3
4
5
6
7
8
reflector -p https -a 12 -c cn --v --sort rate --save /etc/pacman.d/mirrorlist 

# -p(protocol) https 指定https协议的链接
# -a(age) 12 指定最近24小时更新过的源
# -c(country) cn 指定国家为中国(可以增加邻国)
# --v(verbose) 过程可视化
# --sort rate 按照下载速度排序(经过前面几道筛选,镜像源通常已经足够稳定,所以这里直接按照速度排序即可)
# --save /etc/pacman.d/mirrorlist 将结果保存到/etc/pacman.d/mirrorlist

然后同步软件列表数据

1
pacman -Sy

可选:探索Linux文件

我们从u盘加载的其实也是一个archlinux系统,称为live环境。如果你有兴趣,可以安装一个终端管理器查看当前Live环境的目录。(btw,我把live环境称作icu)

1
pacman -S yazi

yazi是好用的终端文档管理器,功能方便的同时内存占用也很低。如果yazi出现依赖问题安装失败可以试试同时安装luayazi,或者使用ranger

yazi命令开启鸭子(ranger使用ranger命令开启)

1
yazi

此时应该会处在一个空的/root目录,按左方向键切换到上级目录。

左中右三块区域,左边是上级目录,中间是当前目录,右边是下级目录。上下左右键切换(或者使用vim key,jkhl对应上下左右)。

我重点提几个。

  • /bin 存放二进制可执行文件,可以找到我们之前运行过的pacman timedatectl reflector之类的命令

  • /dev 存放硬件设备对应的文件。(是的,硬件在linux上也以文件的形式存在)

  • /etc 系统级配置文件。比如pacman包管理器的配置、grub引导程序的配置等等。

  • /home 普通用户的家目录,存放用户数据。如果新建了一个名叫shorin的用户,那么他的所有文件都会存放在/home/shorin

  • /boot 存放内核、initramfs(系统初始化相关)等文件。这个目录下的文件和系统的启动息息相关。

  • /mnt 用来手动临时挂在外部存储设备,比如我们接下来安装系统要使用的系统分区。

  • /tmp 这里面的数据存储在内存中,重启后会消失。

其他的目录有兴趣的可以自己了解一下。

q键退出yazi。ctrl+L清屏。

硬盘分区

1
2
lsblk -pf  #查看当前分区情况
fdisk -l /dev/想要查询详细情况的硬盘 #小写字母l,查看详细分区信息
1
cfdisk /dev/nvme0n1 #选择自己要使用的硬盘进行分区
  1. 如果是新硬盘的话会弹出选项,选GPT。

  2. efi分区

    上下方向键选中空闲空间,左右方向键选择NEW创建512MB的分区,类型(type)选择efi system。

    PS:如果你的类型里没有efi system说明你的硬盘不是gpt分区表,可以使用cfdisk -z 设备名以空分区表打开硬盘,选择gpt分区表即可。⚠️警告⚠️ 这个操作会清空硬盘上的分区。

    PS:也可以直接使用windows的efi,如果使用win的efi分区的话跳过下面格式化efi分区的步骤(windows更新会搞坏linux的引导,建议给linux单独创建efi分区)。

  3. 根分区

    其余空间全部分到一个分区里,类型linux filesystem不需要更改。

  4. 保存

    选择write,输入yes保存。quit退出。

格式化分区

通过格式化创建需要的文件系统

  1. 再次查看分区情况

    1
    2
    lsblk -pf #查看分区情况
    fdisk -l /dev/想要查询详细情况的硬盘 #小写字母l,查看详细分区信息
  2. 格式化efi分区

    1
    mkfs.fat -F 32 /dev/nvme0n1p1(EFI分区名)
  3. 格式化btrfs根分区

    1
    2
    3
    mkfs.btrfs /dev/nvme0n1p2(根分区名)

    #加上-f参数可以强制格式化

创建btrfs子卷

子卷是btrfs的一个特性,跟快照有关。通常至少要创建root子卷(存放系统文件)和home子卷(存放用户文件),根据命名规范取名为@@home。由于这两者是平级关系,所以创建@快照时不会包含@home中的内容。这样就可以只恢复系统文件,不影响用户数据。

  • 挂载

    1
    mount -t btrfs /dev/nvme0n1p2(根分区名) /mnt

    mount挂载命令;

    -t指定文件系统;

    这条命令把/dev/nvme0n1p2分区挂载到了/mnt目录,而/dev/nvme0n1p2是我们将要安装的系统的根分区,这意味着/mnt成为了我们将要安装的系统的

  • 创建子卷

    1
    2
    3
    btrfs subvolume create /mnt/@
    btrfs subvolume create /mnt/@home
    btrfs subvolume create /mnt/@swap #不需要休眠到硬盘功能的话跳过这个
  • 可选:确认

    1
    btrfs subvolume list /mnt
  • 取消挂载

    1
    umount /mnt

正式挂载

  1. 挂载root子卷

    1
    2
    3
    4
    mount -t btrfs -o subvol=/@,compress=zstd /dev/nvme0n1p2 /mnt

    # -o 指定额外的挂载参数
    # compress=zstd 指定透明压缩,zstd是压缩算法

    和刚刚的挂载是一样的操作,不过这次是把/dev/nvme0n1p2上@子卷挂载到了/mnt,而不是把/dev/nvme0n1p2挂载到/mnt

    compress是btrfs的另一个特性,透明压缩。在数据写入磁盘前先进行压缩,提升读写性能,节省空间,延长寿命。可以像这样zstd:3指定压缩等级,最高15。默认为3,在意cpu性能可以设置成1。

  2. 挂载home子卷

    1
    mount --mkdir -t btrfs -o subvol=/@home,compress=zstd /dev/nvme0n1p2 /mnt/home

    由于/mnt下没有/mnt/home这个目录,所以要加上--mkdir命令创建/mnt/home用来挂载。把@home子卷挂载到了/mnt/home

  3. 可选:挂载swap子卷(不需要休眠功能的话跳过这一步)

    1
    mount --mkdir -t btrfs -o subvol=/@swap,compress=zstd /dev/nvme0n1p2 /mnt/swap
  4. 挂载efi分区(ESP)

    1
    mount --mkdir /dev/nvme0n1p1 /mnt/efi

    记得把/dev/nvme0n1p1替换为自己对应的efi分区设备名。

  5. 可选:复查挂载情况

    1
    df -h

安装系统

1
2
3
4
5
6
7
8
9
10
11
pacstrap -K /mnt base base-devel linux linux-firmware btrfs-progs networkmanager vim sudo amd-ucode

# -K 初始化密钥
# base-devel是编译其他软件的时候用的
# linux是内核,可以更换
# linux-firmware是固件
# btrfs-progs是btrfs文件系统的管理工具
# networkmanager 是联网用的,是各个桌面环境标配的联网工具
# vim 是文本编辑器,也可以换成别的,比如nano、neovim
# sudo 和权限管理有关
# amd-ucode 是微码,用来修复和优化cpu,intel用户安装intel-ucode

pacstrap命令是把软件安装到指定的根目录下。

注意:如果你使用的是marvell的无线网卡,这里要额外安装linux-firmware-marvell,否则进系统找不到网卡。

⚠️没有联网软件的话一会安装完系统连不了网⚠️

vim文本编辑器基础操作

vim是以键盘操作为核心理念的文本编辑器,很陌生,但是绝对值得一学。

i键进入编辑模式;

esc 回到普通模式;

u 撤销;

/左斜杠进入搜索模式,回车跳转到搜索到的第一个,nn键跳转到搜索到的下一个,Shift+n跳转到搜索到的上一个;

:w 冒号小写w写入;

:q 冒号小写q退出;

:wq冒号小写wq保存并退出;

!命令后加上感叹号代表强制执行。

知道这些就可以开始使用了。不习惯的话可以安装nanonano的基础操作只需要记住Ctrl+F搜索、Ctrl+S保存和Ctrl+X退出即可。你也可以选择安装neovim,vim的加强版,更现代更好用。如果安装neovim的话后面所有vim命令都改成nvim

可选:swap交换空间

参考链接:

电源管理/挂起与睡眠 - Arch Linux 中文维基

Swap - ArchWiki

Swap - Manjaro

swap用来存放内存中的冷数据,提高电脑的运行速度。还能把硬盘当作虚拟内存使用。设置了硬盘swap还可以使用休眠功能。休眠指的是把系统当前状态写入硬盘,然后电脑完全断电,下一次开机恢复到休眠前的状态。硬盘swap有swap分区或者swap文件两种方式,前者配置更简单,后者配置稍复杂,但是更加灵活。这里采用交换文件的方式。

内存swap比硬盘swap更合适现代设备,如果你不需要休眠功能的话跳过这一步,后续会有将内存用作swap的设置(zram)。

swap大小参考:

内存(GB) 不需要休眠(GB) 需要休眠(GB) 不建议超过(GB)
1 1 2 2
2 2 3 4
3 3 5 6
4 4 6 8
5 2 7 10
6 2 8 12
8 3 11 16
12 3 15 24
16 4 20 32
24 5 29 48
32 6 38 64
64 8 72 128
128 11 139 256
256 16 272 512
  1. 创建swap文件

    此处的64g应该是你实际需求的swap大小

    1
    btrfs filesystem mkswapfile --size 64g --uuid clear /mnt/swap/swapfile
  2. 启动swap

    1
    swapon /mnt/swap/swapfile

生成fstab文件

系统会根据fstab中的内容自动进行挂载。

1
2
3
4
5
6
7
genfstab -U /mnt > /mnt/etc/fstab


# genfstab(生成文件系统表)
# -U 用uuid指定分区
# > 大于号代表输出结果覆盖写入到有右边的文件里
# 如果是>>两个大于号则代表追加写入

更换根目录(change root)

进入刚刚安装的系统

1
arch-chroot /mnt

此时根目录从live环境变成了/mnt,可以注意到提示符的变化。

设置时间和时区

1
timedatectl set-timezone Asia/Shanghai
1
hwclock --systohc 

hwclock --systohc生成调节时间误差的文件。

除了timedatectl命令,还可以手动创建链接。

1
2
3
4
5
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# ln 是link的缩写
# -s代表跨文件系统的软链接
# -f代表强制执行

本地化设置

  1. 编辑配置文件

    1
    vim /etc/locale.gen

    左斜杠键进行搜索;x键剪贴掉en_US.UTF-8 UTF-8zh_CN.UTF-8 UTF-8的前面代表注释的井号;:wq保存并退出。

  2. 生成本地化配置

    1
    locale-gen
  3. 设置系统语言

    1
    vim /etc/locale.conf

    i键进入编辑模式;写入LANG=en_US.UTF-8设置系统语言为英文;

    1
    LANG=en_US.UTF-8

    esc退出编辑模式;:wq保存并退出。

    /etc/locale.conf这个文件是系统级的语言设置,zh_CN.UTF-8是中文,但是会导致tty的中文字符全部变成豆腐块,所以不建议这么做。后续安装完桌面环境后在用户空间修改系统语言。

设置主机名

1
vim /etc/hostname

i键进入编辑模式;取一个自己喜欢的主机名,比如archlinuxesc退出编辑模式;:wq保存并退出。

PS:此时你应该已经相当熟悉vim编辑器最基本的操作了,所以后面我会省略vim的操作讲解。

设置root密码

1
passwd 

输入过程不显示,直接输入回车即可。

安装引导程序

这是uefi引导的安装方式,如果你是bios设备请看archwiki的grub页面。

就像前面重要概念讲解部分说的那样,根据ESP挂载点和个人需求的不同,bootloader的选择也会不同。这里安装最常用的grub,采用的是ESP挂载点为/efigrub装进ESP的方案。

  1. 安装必要的软件包

    1
    pacman -S grub efibootmgr os-prober exfat-utils

    efibootmgr 管理uefi启动项;

    os-proberexfat-utils 用来搜索win11(不配置双系统的话可以不装)。

  2. 安装grub

    1
    grub-install --target=x86_64-efi --efi-directory=/efi --boot-directory=/efi --bootloader-id=ARCH 

    grub-install安装grub;

    --target 指定架构;

    --efi-directory 指定ESP位置;

    --boot-directory 指定grub的安装目录;

    --bootloader-id 任意取一个启动项名字;

    PS:如果是移动设备或者主板只支持默认的efi路径要加上--removable选项。

  3. 编辑grub的源文件

    1
    vim /etc/default/grub

    这是生成grub的配置文件时需要用到的东西。

    • 启动项记忆功能

      GRUB_DEFAULT=0改成=saved,再取消GRUB_SAVEDEFAULT=true的注释。

    • 显示开机日志

      GRUB_CMDLINE_LINUX_DEFAULT里面去掉quiet以显示开机日志。再设置loglevel=5把日志等级为5。loglevel共7级,5级是一个信息量的平衡点。

    • 禁用watchdog

      GRUB_CMDLINE_LINUX_DEFAULT里添加nowatchdog以及modprobe.blacklist=sp5100_tco。intelcpu用户把sp5100_tco换成iTCO_wdt

      watchdog的目的简单来说是在系统死机的时候自动重启系统。对个人用户来说没有意义,禁用以节省系统资源、提高开机和关机速度。

    • 允许使用os-prober搜索其他系统

      取消最后一行GRUB_DISABLE_OS_PROBER=false的注释。

  4. 在grub的默认安装位置创建链接

    1
    ln -sf /efi/grub /boot/grub

    大多数程序会默认检测/boot/grub作为grub的安装位置,所以创建一个链接方便使用。

  5. 生成grub的配置文件

    1
    grub-mkconfig -o /boot/grub/grub.cfg

以上的grub配置方法已经足够使用,但存储在FAT文件系统上的grub.cfg无法被btrfs快照回档,极端情况下仍会出现问题,例如在快照启动项里生成了grub.cfg导致永远启动进快照启动项。如果你想要绝对稳定的回档,看进阶内容:可选:grub在btrfs文件系统下的最佳配置方法

zram

zswap - ArchWiki

zram - ArchWiki

zram将内存的一部分空间用作交换空间,如果你没有配置swap,请一定配置zram。

  1. 安装zram-generator

    1
    pacman -S zram-generator
  2. 编辑配置文件

    1
    vim  /etc/systemd/zram-generator.conf
    1
    2
    3
    [zram0]
    zram-size = ram
    compression-algorithm = zstd

    zram-size设置最多存储多少数据,注意这里设置的是压缩之前的大小。

    compression-algorithm这一行设置使用zstd算法。

  3. 禁用zswap

    zswap是swap的缓存。需要交换的数据在存入交换空间之前会先被zswap压缩后暂时放进内存里。和zram功能重复且引入了复杂性,故禁用。

    1
    vim /etc/default/grub

    在GRUB_CMDLINE_LINUX_DEFAULT=""里写入zswap.enabled=0

    1
    GRUB_CMDLINE_LINUX_DEFAULT="... zswap.enabled=0 ... "
  4. 重新生成grub的配置文件

    1
    grub-mkconfig -o /efi/grub/grub.cfg

启用网络服务

开启新系统的NetworkManager服务,注意大小写

1
systemctl enable NetworkManager 

systemctl调用systemd进行操作

enbale代表从下一次开机开始自动启动

  • 可选:替换网络后端为iwd

    NetworkManager的无线网默认后端是wpa_supplicant,可以更换为更现代的iwd。注意:部分设备更换iwd后端可能无法正常联网。

    1. 安装iwd

      1
      pacman -S iwd impala

      impalaiwd的tui

    2. 编辑配置文件

      1
      2
      3
      4
      5
      # 创建配置文件目录,-p代表如果已经存在就跳过
      mkdir -p /etc/NetworkManager/conf.d

      # 新建配置文件并用vim进行编辑
      vim /etc/NetworkManager/conf.d/iwd.conf

      写入:

      1
      2
      [device]
      wifi.backend=iwd

退出chroot

1
exit

此时就回到了live环境,可以注意到提示符的变化。

重启电脑

1
reboot

此时会自动取消所有的挂载。

拔掉系统u盘

如果u盘没拔掉的话记得拔掉

选择BIOS启动项

通常默认就是刚刚安装的arch,如果不是的话选择一下启动项。有的电脑的启动项可能埋在子菜单里,仔细找一下。

如果没有出现archlinux的启动项,看这个页面:https://wiki.archlinux.org/title/GRUB

登录root账户

用户名为root,密码刚刚设置过了。

连接网络

  1. 验证是否有网

    1
    2
    ip a
    ping bilibili.com
  2. 连接wifi

    1
    nmtui

    nmtui是networkmanager提供的TUI(终端用户交互程序)。如果你使用的是iwd后端还可以用impala连接wifi。

    • 选择activate a connection
    • 选择自己的wifi进行连接
    • esc退出
    • Ctrl+L或者clear清屏

放松一下吧

恭喜你成功手动安装了archlinux,现在小小地奖励一下自己吧。

1
pacman -S fastfetch lolcat cmatrix

不做讲解,自己运行命令试试吧。

1
fastfetch
1
fastfetch | lolcat 
1
cmatrix
1
2
3
cmatrix | lolcat

cmatrix -r

|竖线叫作pipeline管道符,作用是把左边程序的输出结果输入到右边的程序里。

下一节:安装桌面环境前的准备


脚本安装

这部分是arch自带的archinstall脚本使用教程。这部分只介绍必要的选项,没提到的选项保持默认。想研究的话可以自己看看。

开启archinstall

新版本archinstall脚本提供了连接网络的功能,可以进iso之后直接运行archinstall命令,失败的话重试一下。

1
archinstall

第一项是脚本语言,第二项是系统本地化,保持英文就行,改了会乱码,等进桌面之后再改中文。直接看第三项。

Mirrors and repositories 设置镜像源

  1. 选择第一项Select regions设置自己的所在地。加载会比较慢,耐心等一等。左斜杠可以搜索。

  2. 选择第三项optional repositories回车激活multilib。这是32位程序的源。

Disk configuration 磁盘分区

选择partitioning进入磁盘分区

第一项是自动分区,默认格式化整块硬盘,ESP挂载到/boot

我要把ESP挂载到/efi,所以使用手动分区,具体原因看重要概念讲解

选择第二项手动分区 > 要使用的硬盘

  1. 创建启动分区

    选中要使用的空闲空间 > Size(分区大小)512MB > Filesystem(文件系统)fat32 > Mountpoint(挂载点)/efi

    选中刚刚创建的分区,回车设置bootableESP

  2. 可选:创建swap分区

    如果你不需要休眠功能的话跳过这一步。休眠指的是把系统当前状态写入硬盘,然后电脑完全断电,下一次开机恢复到休眠前的状态。

    swap交换空间与虚拟内存和休眠有关。有swap分区或者swap文件两种方式,前者配置更简单,后者配置稍复杂,但是更加灵活。这里采用交换分区的方式。

    内存(GB) 不需要休眠(GB) 需要休眠(GB) 不建议超过(GB)
    1 1 2 2
    2 2 3 4
    3 3 5 6
    4 4 6 8
    5 2 7 10
    6 2 8 12
    8 3 11 16
    12 3 15 24
    16 4 20 32
    24 5 29 48
    32 6 38 64
    64 8 72 128
    128 11 139 256
    256 16 272 512

    Size参考上面的表 > Filesystem选linux-swap

  3. 创建root分区

    Size部分直接回车分配全部空间 > Filesystem选btrfs

    选中刚刚创建的btrfs,回车。选择Mark/Unmark as compressed设置透明压缩;再选择Set subvolumes(创建子卷)> 选Add subvolume添加子卷

    第一个子卷Subvolume name输入@,回车设置Subvolume mountpoint是/

    第二个子卷name是@home,mountpoint是/home

    confirm and exit > confirm and exit > back 完成硬盘分区

    关于子卷是什么,可以看创建btrfs子卷

Bootloader引导系统

如果你不知道选什么的话选Grub

Kernels

tab键勾选需要的内核,通常使用linux即可。台式机可以选linux-zen以些许功耗为代价提高性能,

Hostname主机名

设置一个自己想要的主机名

Authentication身份认证

  • Root password设置管理员密码

  • User account > Add a user 创建普通用户

    Should "你的用户名" be a superuser(sudo)是问你要不要给这个用户管理员权限,选yes就行。

Profile

Type > Minimal 是最小化安装。

Desktop可以自动安装桌面,如果不知道装什么桌面就装KDE Plasma。选择自动安装桌面的话还会出现Graphics driver选项,可以自动安装显卡驱动。

  • 关于N卡驱动

    CodeNames · freedesktop.org这个页面搜索你的显卡型号,确认对应的NV family;NV160以后的显卡选Nvidia (open kernel module ...);NV110~NV140的选Nvidia (proprietary);其他的看ArchWiki_NVIDIA

Applications(蓝牙和音视频)

  • Audio > pipewire 自动安装音视频服务

  • Bluetooth > Yes 自动安装蓝牙

  • Print service > yes 安装打印机驱动

Network configuration (网络配置)

不知道选什么就选第四项 NetworkManager(iwd backend)

Additional packages(自定义安装其他软件包)

左斜杠键搜索,tab键选择。

  • 必须安装

    vim(任意终端文本编辑器)

    如果你使用的是marvell的无线网卡,这里要额外安装linux-firmware-marvell,否则进系统找不到网卡。

Timezone(时区)

左斜杠键搜索Shanghai

Install

选择install安装

双系统

安装完成后配置windows和linux的双系统。

  1. archinstall安装完成后选择chroot

  2. 安装需要的组件

    1
    pacman -S os-prober exfat-utils
  3. 编辑grub的源文件

    1
    vim /etc/default/grub

    方向键移动光标;i键进入编辑模式;取消最后一行GRUB_DISABLE_OS_PROBER=false的注释;esc退出编辑模式;:wq保存并退出。

    还有一些其他的设置:

    • 启动项记忆功能

      GRUB_DEFAULT=0改成=saved,再取消GRUB_SAVEDEFAULT=true的注释。

    • 显示开机日志

      GRUB_CMDLINE_LINUX_DEFAULT里面去掉quiet以显示开机日志。再设置loglevel=5把日志等级为5。loglevel共7级,5级是一个信息量的平衡点。

    • 禁用watchdog

      GRUB_CMDLINE_LINUX_DEFAULT里添加nowatchdog以及modprobe.blacklist=sp5100_tco。intelcpu用户把sp5100_tco换成iTCO_wdt

      watchdog的目的简单来说是在系统死机的时候自动重启系统。对个人用户来说没有意义,禁用以节省系统资源、提高开机和关机速度。

  4. 生成grub的配置文件

    1
    grub-mkconfig -o /efi/grub/grub.cfg
  5. 在grub的默认安装位置创建链接

    1
    ln -sf /efi/grub /boot/grub

    我们的grub在/efi/grub,大多数程序会默认检测/boot/grub作为grub的安装位置,所以创建一个链接方便使用。

  6. 退出chroot

    1
    exit
  7. 重启

    1
    reboot
  8. 选择bios启动项

如果没有出现archlinux的启动项,看这个页面:https://wiki.archlinux.org/title/GRUB

以上的grub配置方法已经足够使用,但存储在FAT文件系统上的grub.cfg无法被btrfs快照回档,极端情况下仍会出现问题,例如在快照启动项里生成了grub.cfg导致永远启动进快照启动项。如果你想要绝对稳定的回档,看进阶内容:可选:grub在btrfs文件系统下的最佳配置方法

下一节:安装桌面环境前的准备

以上文章来自 Shorin

Linux Man Page 汉化教程

本文档介绍如何将 man 手册页翻译成中文。

原理

Linux 的 man 手册页存储在 /usr/share/man/ 目录下,按语言分类:

  • man1/ - 程序手册
  • man5/ - 文件格式手册
  • 等等
    中文手册放在 zh_CN 子目录下,例如:
  • /usr/share/man/zh_CN/man1/ - 中文程序手册

以 fish 为例汉化

步骤 1:查找原手册位置

1
2
man -w fish
# 输出: /usr/share/man/man1/fish.1.gz

步骤 2:解压手册文件

1
2
3
4
# 解压 .gz 文件
gunzip /usr/share/man/man1/fish.1.gz
# 或者不解压直接读取内容
gunzip -c /usr/share/man/man1/fish.1.gz > /tmp/fish.1

步骤 3:翻译内容

man 手册使用 roff/troff 格式,主要命令:

命令 说明
.TH 标题
.SH 章节标题(NAME, SYNOPSIS, DESCRIPTION 等)
.TP 缩进段落
.nf / .fi 无格式 / 恢复格式
\fB 粗体
\fI 斜体
翻译时保留格式标记,只翻译文字内容。

步骤 4:创建中文手册目录

1
sudo mkdir -p /usr/share/man/zh_CN/man1

步骤 5:安装中文手册

1
2
3
4
5
6
# 移动翻译好的文件
sudo cp fish_zh.1 /usr/share/man/zh_CN/man1/fish.1
# 压缩(可选,man 会自动处理)
sudo gzip /usr/share/man/zh_CN/man1/fish.1
# 更新 man 数据库
sudo mandb

步骤 6:查看中文手册

1
2
3
4
5
6
# 临时指定语言
man -L zh_CN fish
# 设置默认语言(添加到 ~/.bashrc 或 ~/.zshrc)
export MANOPT="-L zh_CN"
# 查看中文手册
man fish

常用命令

1
2
3
4
5
6
7
8
# 查看手册所属包
pacman -Qo /usr/share/man/man1/fish.1.gz # Arch
dpkg -S /usr/share/man/man1/fish.1.gz # Debian/Ubuntu
rpm -qf /usr/share/man/man1/fish.1.gz # RHEL/CentOS
# 列出所有 fish 相关手册
ls /usr/share/man/man1/*fish*
# 查看中文手册目录
ls /usr/share/man/zh_CN/man1/

注意事项

  1. 软件更新:软件更新后手册会被覆盖,需要重新翻译
  2. 权限:安装到系统目录需要 sudo 权限
  3. 备用方案:可以放到用户目录,但需要手动指定路径
  4. 格式保留:翻译时务必保留 roff 格式标记,否则无法正常显示

故障排除

1
2
3
4
5
6
7
8
# 手动刷新 man 数据库
sudo mandb
# 清除 man 缓存
sudo rm -rf /var/cache/man/*
# 指定手册路径
MANPATH=/usr/share/man/zh_CN:$MANPATH man fish
# 查看所有可用语言
locale -a | grep zh

相关文件

  • 已翻译的 fish 手册: /tmp/fish_zh.1

注意

  • <leader> (前缀键) 默认为 空格键 (<Space>)
  • <localleader> 默认为 反斜杠 (\)
  • 模式说明n=普通模式, i=插入模式, v/x=可视模式, t=终端模式。

1. 通用操作 (General)

最常用的基础操作,包括窗口移动、保存、注释等。

快捷键 功能描述 模式
j / k 向下 / 向上移动 n, x
<C-h/j/k/l> 将光标切换到 左/下/上/右 窗口 n
<C-Up/Down/Left/Right> 调整窗口大小 (高/宽) n
<A-j> / <A-k> 向下 / 向上移动当前行 (代码搬移) n, i, v
<S-h> / <S-l> 上一个 / 下一个 Buffer (缓冲区) n
[b / ]b 上一个 / 下一个 Buffer n
<leader>bb 切换到最近的另一个 Buffer n
<leader>bd 删除当前 Buffer n
<leader>bo 删除其他 Buffer (只留当前) n
<C-s> 保存文件 n, i, v
<esc> 退出并清除搜索高亮 n, i
<leader>ur 强制重绘 / 清除高亮 / 更新 Diff n
gco / gcO 在 下方/上方 添加注释 n
<leader>l 打开 Lazy 插件管理器 n
<leader>fn 新建文件 n
<leader>qq 退出所有 (Quit All) n
<leader>wd 删除当前窗口 n
<leader>- / <leader>| 向下 / 向右 分割窗口 n

2. LSP (代码智能辅助)

基于语言服务器的代码跳转、重命名和诊断。

快捷键 功能描述 模式
gd 转到定义 (Goto Definition) n
gr 查看引用 (References) n
gI 转到实现 (Implementation) n
gy 转到类型定义 (Type Definition) n
K 查看文档悬停 (Hover) n
gK 查看函数签名帮助 n
<leader>ca 代码操作 (Code Action) n, v
<leader>cr 重命名 (Rename) n
<leader>cf 格式化代码 (Format) n, v
<leader>cd 查看当前行诊断信息 n
[d / ]d 上一个 / 下一个 诊断信息 n
[e / ]e 上一个 / 下一个 错误 n

3. 搜索与文件查找 (Snacks.nvim / Telescope)

LazyVim 新版主要使用 snacks.nvim 作为查找器。

快捷键 功能描述 模式
<leader><space> 查找文件 (Root Dir) n
<leader>ff 查找文件 (Root Dir) n
<leader>fF 查找文件 (当前目录 cwd) n
<leader>/ 全局搜索关键词 (Grep Root Dir) n
<leader>sg 全局搜索关键词 (Grep Root Dir) n
<leader>sb 搜索当前打开的 Buffer 内容 n
<leader>fr 最近打开的文件 (Recent) n
<leader>fb / <leader>, 切换 Buffer 列表 n
<leader>e 打开文件资源管理器 (Explorer) n
<leader>s" 搜索寄存器内容 n
<leader>sk 搜索快捷键映射 (Keymaps) n

4. Git 版本控制

快捷键 功能描述 模式
<leader>gg 打开 LazyGit (或 GitUI) n
<leader>gb 查看当前行 Blame 信息 n
<leader>gf 查看当前文件 Git 历史 n
<leader>gl 查看 Git Log n
<leader>gd 查看 Diff (Hunks) n
<leader>gs Git Status n

5. 界面开关 (UI Toggles)

<leader>u 开头,用于快速开启/关闭某些功能。

快捷键 功能描述
<leader>uf 开启/关闭 自动格式化 (Auto Format)
<leader>us 开启/关闭 拼写检查 (Spelling)
<leader>uw 开启/关闭 自动换行 (Wrap)
<leader>ul 开启/关闭 行号
<leader>uL 开启/关闭 相对行号
<leader>ud 开启/关闭 诊断信息 (Diagnostics)
<leader>uh 开启/关闭 内嵌提示 (Inlay Hints)
<leader>uz 开启/关闭 禅模式 (Zen Mode)

6. 常用插件功能

根据文件中列出的插件,整理出高频使用的功能。

Flash.nvim (快速跳转)

快捷键 功能
s 启动 Flash 快速跳转 (屏幕内搜索字符跳转)
S Flash Treesitter 跳转 (选中代码块)

Mini.surround (包围修改)

快捷键 功能 (示例)
gsa 添加 包围 (Add) - 例如 gsaiw" 给单词加引号
gsd 删除 包围 (Delete) - 例如 gsd" 删除引号
gsr 替换 包围 (Replace) - 例如 gsr"' 将双引号改为单引号

Trouble.nvim (问题面板)

快捷键 功能
<leader>xx 打开/关闭 诊断面板 (Diagnostics)
<leader>xX 打开/关闭 当前 Buffer 诊断面板
<leader>cs 查看 LSP 符号列表 (Symbols)

Yanky.nvim (剪贴板历史)

快捷键 功能
<leader>p 打开剪贴板历史记录
p / P 粘贴 (Put)
y 复制 (Yank)

Todo-comments (待办高亮)

快捷键 功能
<leader>st 搜索所有 Todo 注释
]t / [t 下一个 / 上一个 Todo

Grug-far (搜索替换)

快捷键 功能
<leader>sr 全局搜索并替换 (Search and Replace)

7. 调试 (DAP - Debug Adapter Protocol)

如果安装了调试相关的 Extra。

快捷键 功能
<leader>db 切换断点 (Toggle Breakpoint)
<leader>dc 继续运行 (Continue)
<leader>di 单步步入 (Step Into)
<leader>do 单步步出 (Step Out)
<leader>dO 单步跳过 (Step Over)
<leader>dt 终止调试 (Terminate)
<leader>du 打开调试界面 (Dap UI)

8. 测试 (Neotest)

快捷键 功能
<leader>tt 运行当前文件测试
<leader>tr 运行最近一次测试 (Run Nearest)
<leader>ts 查看测试概览 (Summary)
<leader>to 查看输出 (Output)

9. 终端 (Terminal)

快捷键 功能 模式
<leader>ft 打开浮动终端 (项目根目录) n
<leader>fT 打开浮动终端 (当前目录) n
<c-/> (Ctrl+/) 切换浮动终端 n, t

🚀 跨系统分区扩容实战指南:从 Windows 匀空间给 Arch Linux

第一部分:前期准备与 Windows 端操作

在动手术之前,请确保你已经完成了以下心理和技术准备。

0. 核心警告 (Vim 用户的严谨)

  • 数据无价:请将 ~/Myblog~/.config 等重要数据备份至外置 U 盘或云端。
  • 环境要求:笔记本必须接通电源,防止中途断电。
  • 工具准备:确保你的 Ventoy U 盘里有 GParted Live ISO(推荐)或最新的 Arch ISO

1. Windows 端的必要预处理

Windows 的一些特性会“锁定”磁盘,导致 Linux 无法移动分区。

  1. 彻底关闭 BitLocker
    • 进入 Windows 设置 -> 隐私与安全性 -> 设备加密。
    • 必须关闭并等待解密完成。如果磁盘是加密状态,GParted 将无法识别文件系统。
  2. 关闭“快速启动 (Fast Startup)”
    • 进入控制面板 -> 电源选项 -> 选择电源按钮的功能。
    • 取消勾选“启用快速启动”。(这能确保 Windows 彻底关机,释放磁盘挂载权)。
  3. 执行磁盘压缩
    • 右键“此电脑” -> 管理 -> 磁盘管理。
    • 右键点击 C 盘 (p3),选择 压缩卷
    • 输入你想给 Linux 的空间(例如:102400 MB,即 100G)。
    • 结果:C 盘右侧会出现一整块黑色的 “未分配空间”

第二部分:GParted Live “推箱子”接力

这是整个手术的核心。你需要利用 GParted 就像推箱子一样,把那块空地往右移动,直到它挨着 / 分区。

手术逻辑:

目前的格局:[Win] [空地] [p4:boot] [p5:swap] [p6:root]
我们的目标:[Win] [p4:boot] [p5:swap] [空地] [p6:root] -> 最终合并。

操作步骤:

  1. 启动 GParted
    • 重启电脑,通过 F12 (或你的快捷键) 进入 Ventoy,选择 GParted Live 启动。
  2. 移动 p4 (/boot)
    • 找到 nvme0n1p4。右键点击,选择 Resize/Move
    • 在弹出的窗口中,用鼠标拖动整个分区的“条状块”向左拉到底
    • 你会发现 [空地] 跑到了 p4 的右边。
  3. 移动 p5 (Swap)
    • 找到 nvme0n1p5。同样右键 Resize/Move
    • 将分区块整体向左拖动,贴住 p4。
    • 此时 [空地] 跑到了 p5 和 p6 (根目录) 之间。
  4. 真正扩容 p6 (/)
    • 找到 nvme0n1p6。右键 Resize/Move
    • 注意:这次不是移动整个块,而是按住该块的 左侧边缘,向左拉满,吃掉所有空地。
  5. 应用变更
    • 点击工具栏上方的 Apply All Operations (打钩图标)
    • 漫长的等待:GParted 会开始物理搬运数据。此时严禁强制关机

第三部分:引导修复与系统验证

完成 GParted 的物理搬运后,大概率可以直接进入系统。但由于你移动了 /boot 分区的起始物理扇区,GRUB 可能会暂时“找不到北”。

1. 如果无法启动(进入了 grub rescue)

不要惊慌,这是由于磁盘的物理索引改变导致的。请使用 Ventoy 启动进入 Arch ISO 环境:

  1. 挂载你的分区(按照你之前的 lsblk 布局):
    1
    2
    3
    4
    # 挂载根目录
    mount /dev/nvme0n1p6 /mnt
    # 挂载引导分区
    mount /dev/nvme0n1p4 /mnt/boot
  2. 进入 Chroot 环境(Arch 用户的常规操作):
    1
    arch-chroot /mnt
  3. 重刷 GRUB 配置(让它重新寻找内核位置):
    1
    2
    3
    4
    # 重新安装引导信息
    grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB
    # 重新生成配置文件
    grub-mkconfig -o /boot/grub/grub.cfg
  4. 退出并重启
    1
    2
    exit
    reboot

2. 进入系统后的验证 (The Post-Op Check)

成功回到 Hyprland 后,第一件事是确认根分区是否真的变大了。

  1. 使用极客工具查看
    运行你喜欢的 gdu

    1
    gdu /
  2. 经典命令查看

    1
    df -h /

    此时你应该能看到 / 分区的容量已经从 40G 增长到了你设定的数值(例如 140G),且“可用空间”不再是红色的几百 MB。


3. 可能遇到的意外情况 (Troubleshooting)

情况 A:文件系统自检 (fsck)

  • 现象:开机时屏幕狂跳代码,显示 recovering journalclean, ... blocks
  • 对策:这是正常的。因为你改动了分区大小,内核会自动进行一次文件系统完整性自检,等它跑完即可。

情况 B:UUID 冲突或失效

  • 现象:启动时卡在 A start job is running for dev-disk-by...
  • 对策:如果你的 /etc/fstab 是基于 UUID 挂载的(Arch 默认如此),通常没问题。如果报错,请在 TTY 运行 blkid 查看新 UUID,并同步修改 /etc/fstab

情况 C:Windows 无法引导

  • 现象:GRUB 菜单里的 Windows 选项失效。
  • 对策:回到 Arch 终端,运行 sudo os-prober。如果能搜到 Windows,再运行 sudo grub-mkconfig -o /boot/grub/grub.cfg 即可。

🎙️ 结语:空间自由后的建议

现在你已经拥有了宽裕的根目录空间,建议:

  1. 定期清理:即便空间大了,也要养成 sudo pacman -Sc 清理缓存的习惯。
  2. 快照习惯:由于你还没有安装 Timeshift,既然现在空间够了,建议安装并创建一个备份,以后动磁盘前先打个快照。
  3. 独立数据盘:如果未来 Windows 依然有富余,可以考虑建立一个 exFAT 格式 的公共分区,让 Windows 和 Arch 共享大文件(如虚拟机镜像或视频素材)。

本文记录于 2026年1月,是一次成功的分区接力扩容实战记录。

祝你手术顺利,重启后看到满格的磁盘空间!

1. 背景:一个常见的 Hexo 部署“事故”

在 Arch Linux 上折腾 Hexo 博客是一件很爽的事情,但很多新手(PS: Me)都会遇到一个尴尬的情况:

  • 运行 hexo d 提示成功了。- 仓库里莫名其妙多了一个 gh-pages 分支。
  • 自己的自定义域名突然失效,或者显示的还是旧内容。
  • Cloudflare Pages 报错:Could not read package.json

这背后的本质原因在于:部署逻辑的混乱

2. 传统模式 vs 现代模式

在深入解决办法前,我们需要理解两种不同的部署逻辑:

传统模式:本地构建 (Local Build)

  • 流程:你在本地运行 hexo g(把 Markdown 转为 HTML),然后通过 hexo d 把这些 HTML 推送到 GitHub 的某个分支(通常是 gh-pages)。
  • 缺点
    • 容易忘记推送源码(master 分支),导致换台电脑就没法写博客。
    • 频繁覆盖远程分支,导致 CNAME 文件丢失,自定义域名失效。
    • 依赖本地环境(Node.js 版本、主题依赖等),环境一变就报错。

现代模式:云端构建 (CI/CD)

  • 流程:你只管把源码(.md 文件、配置文件)git push 到 GitHub。剩下的构建工作交给 Cloudflare Pages 或 GitHub Actions。
  • 优点
    • 源码即版本:仓库里存的是人能读懂的源码,而不是乱糟糟的 HTML。
    • 环境无关:不管你是在 Arch、Windows 还是手机上改代码,云端环境都是一致的。
    • 自动备份:只要提交代码,源码就自动备份到了 GitHub。

3. 避坑指南:从本地构建转向云端自动化

如果你也遇到了 gh-pages 分支冲突或者 Cloudflare 构建失败,建议按照以下步骤重构你的工作流:

第一步:统一分支

停止使用 hexo d。将你的 master 分支作为唯一的真理来源(Source of Truth),确保它包含了所有的源文件:

  • source/ 文件夹(你的文章)
  • themes/ 文件夹(你的主题)或者是/node_modules/hexo-theme-<theme-name>
  • _config.yml (Hexo 配置)
  • package.json (依赖配置)

通过自定义 cloudflare 脚本(位置:package.json/scripts:)并配合 --legacy-peer-deps 参数,我们可以解决不同环境下插件版本冲突的玄学问题,让 CI/CD 流程更加鲁棒。

第二步:配置 Cloudflare Pages 接管

不要让 Cloudflare 去监控 gh-pages 分支,因为它里面只有 HTML,没法运行命令。

  1. 在 Cloudflare 设置中,将 Production branch 设置为 master
  2. Framework preset 选择 Hexo
  3. Build command 设置为 npx hexo generatenpm install --legacy-peer-deps && npm run cloudflare(前提是在package.json中定义好script:cloudflare选项)。
  4. Build output directory 设置为 public

第三步:解决域名持久化

在本地 source/ 目录下创建一个 CNAME 文件,写上你的域名。这样无论云端如何构建,自定义域名永远不会丢失。

4. 延伸思考:为什么开发者应该追求自动化?

对于 Arch Linux 用户来说,我们习惯了高度定制和掌握底层逻辑。但在博客部署这件事上,**“无感化”**才是高级追求。

  1. 基础设施即代码 (IaC):你的博客不再是一堆网页,而是一个可以随时重新构建的项目。
  2. 解耦:将“内容创作”与“网页渲染”解耦。我只需要在 GitHub 网页版点一下“编辑”,剩下的渲染、部署、CDN 刷新全自动完成。
  3. 容灾:如果哪天我的 Arch 环境滚挂了(虽然概率很低),我的所有博客源码都在 GitHub 上,换台机器拉下来就能用,这才是真正的安全感。

5. 总结

删掉那个混乱的 gh-pages 分支吧!回归到最纯粹的 git push origin master

一句话工作流:

写文章 -> git push -> 关机睡觉 -> 博客自动更新。


推荐博客发布步骤(本篇博客为例):

  1. 新建文章hexo new "hexo-deployment-guide"
  2. 粘贴内容:将上面的 Markdown 内容贴进去。
  3. 发布源码
    1
    2
    3
    git add .
    git commit -m "feat: 迁移到 Cloudflare Pages 自动构建并添加避坑指南"
    git push origin master
  4. 检查结果:去 Cloudflare Pages 看看那个代表成功的绿色小勾。

环境声明:Arch Linux | Hyprland (JaKooLit) | Kitty | Zsh (agnosterzak) | Neovim

第一章:Zsh Vi-Mode

1. 核心状态切换

  • 插入模式 (Insert):默认状态,光标为 竖线 |,左侧显示 -- INSERT --。此时正常打字。
  • 退出到命令模式 (Normal):快速连按 jk 或按 ESC
    • 状态变化:光标变 方块 ,左侧变红显示 -- NORMAL --
  • 重回输入:在 Normal 模式下按 i (当前位置) 或 a (后移一格)。

2. Normal 模式

按下 jk 进入 Normal 模式:

  • 单词跳跃:按 w 跳到下个单词开头,按 b 回跳。
  • 首尾跳转:按 0 (零) 回行首,按 $ 到行尾。
  • 修改
    • x:删除当前光标下的字符。
    • dw:删除当前光标后的整个单词。
    • dd:清空当前整行命令。
  • 撤销:按 u 撤销刚才的删除。

3. 历史命令搜索

  • 上下翻找:进入模式后,直接按 k 向上翻,j 向下翻。
  • 高级过滤:先输入 git,再按 jk 进入模式按 k,它只会翻出你以前输入过的 git 相关命令。

4. v 编辑长命令

  • 场景:一个很长的脚本或带有复杂嵌套引号的 Shell 命令。
  • 操作:在 Normal 模式下按下 v
  • 效果:系统会进入 -- VISUAL-- 模式 。

第二章:Hyprland 窗口管理

1. 焦点切换 (Super + HJKL)

  • 场景:终端,文档同时打开。
  • 操作:按住 Super 不放,按 h 往左跳,按 l 往右跳。

2. 窗口位移 (Super + Ctrl + HJKL)

  • 场景:当你想把当前屏幕中间的终端移动到最左侧。
  • 操作Super + Ctrl + h。窗口会物理性地向左侧“平移”。

3. 丝滑缩放 (Super + Shift + HJKL)

  • 场景:觉得终端太窄,想拉宽一点。
  • 操作:按住 Super + Shift + hjkl

第三章:Kitty 历史回溯

1. 进入回溯模式

  • 按下 Alt + h

2. 复制屏幕上的报错信息

  • 场景:终端打印了一大堆报错,你需要复制其中一段。
  • 步骤
    1. Alt + h。此时整个终端变成了一个 Neovim 只读文件。
    2. hjkl 找到报错行,或者按 / 输入关键词搜索。
    3. v 进入视觉模式,选中文字。
    4. 按下 y
    5. q 退出。
  • 结果:内容已在你的系统剪切板,直接在浏览器里 Ctrl+v 即可。

第四章:Rofi 菜单

  • 启动:按 Super + Space (或你的 Rofi 键)。
  • 选择
    • 输入 brave
    • 向上/下:按住 Ctrl,点击 jk 进行挑选。
  • 确认:按下 Ctrl + mEnter 启动。


🛠️ 五、 核心配置汇总

1. Hyprland:系统级窗口管理

配置文件~/.config/hypr/UserConfigs/UserKeybinds.conf
将方向键逻辑 1:1 映射到 HJKL,利用 binde 实现丝滑缩放。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 移动窗口焦点 (Move Focus) -> Super + HJKL
bind = $mainMod, H, movefocus, l
bind = $mainMod, L, movefocus, r
bind = $mainMod, K, movefocus, u
bind = $mainMod, J, movefocus, d

# 调整窗口大小 (Resize Window) -> Super + Shift + HJKL
# binde 确保长按时连续缩放
binde = $mainMod SHIFT, H, resizeactive, -40 0
binde = $mainMod SHIFT, L, resizeactive, 40 0
binde = $mainMod SHIFT, K, resizeactive, 0 -40
binde = $mainMod SHIFT, J, resizeactive, 0 40

# 移动窗口物理位置 (Move Window) -> Super + Ctrl + HJKL
bind = $mainMod CTRL, H, movewindow, l
bind = $mainMod CTRL, L, movewindow, r
bind = $mainMod CTRL, K, movewindow, u
bind = $mainMod CTRL, J, movewindow, d

2. Zsh:高性能 Vi 模式

配置文件~/.zshrc
优化重点:解决了 agnosterzak 主题下猛按回车卡顿的问题,并实现了状态同步。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 启用 Vi 模式与 jk 映射
bindkey -v
export KEYTIMEOUT=15
bindkey -M viins 'jk' vi-cmd-mode

# 状态显示函数 (右侧 RPROMPT)
function vi_mode_prompt_info() {
[[ ${KEYMAP} == vicmd ]] && echo "%F{red}-- NORMAL --%f" || echo "%F{green}-- INSERT --%f"
}
RPROMPT='$(vi_mode_prompt_info)'

# 模式切换钩子:同步光标形状与状态显示
function zle-keymap-select() {
if [[ ${KEYMAP} == vicmd ]]; then
echo -ne '\e[1 q' # 方块
else
echo -ne '\e[5 q' # 竖线
fi
zle reset-prompt # 仅在模式切换时重绘,保证性能
}
zle -N zle-keymap-select

# 初始行钩子:防止猛按回车掉帧
function zle-line-init() { echo -ne '\e[5 q' }
zle -N zle-line-init
precmd() { echo -ne '\e[5 q' }

# 补全菜单 HJKL 导航
zmodload zsh/complist
bindkey -M menuselect 'h' vi-backward-char
bindkey -M menuselect 'k' vi-up-line-or-history
bindkey -M menuselect 'j' down-line-or-history
bindkey -M menuselect 'l' vi-forward-char

3. Kitty + Neovim:历史回溯与复制

配置文件~/.config/kitty/kitty.conf
利用 Neovim 的威力处理终端滚动缓存。

1
2
3
4
5
# 设置 nvim 为分页器
scrollback_pager nvim -c "set signcolumn=no showtabline=0" -c "silent! write! /tmp/kitty_scrollback_buffer | te cat /tmp/kitty_scrollback_buffer - " -c "normal G"

# 快捷键:Alt + H 进入回溯模式
map alt+h show_scrollback

4. Rofi:应用导航

配置文件~/.config/rofi/config.rasi
强制释放被占用的快捷键。

1
2
3
4
5
6
7
8
9
10
11
12
13
configuration {
kb-remove-char-back: "BackSpace"; // 释放 Ctrl+h
kb-remove-to-eol: ""; // 释放 Ctrl+k
kb-mode-complete: ""; // 释放 Ctrl+l
kb-mode-next: "Shift+Right"; // 释放 Right
kb-mode-previous: "Shift+Left"; // 释放 Left

kb-row-up: "Up,Control+k";
kb-row-down: "Down,Control+j";
kb-row-left: "Control+h";
kb-row-right: "Control+l";
kb-accept-entry: "Control+m,Return,KP_Enter";
}

📖 六、 使用指南

1. 窗口管理 (Hyprland)

  • 切换窗口Super + h/j/k/l。无需鼠标,直接在窗口间穿梭。
  • 调整尺寸Super + Shift + h/j/k/l。长按 L 键,窗口向右丝滑变宽。

2. 终端编辑 (Zsh)

  • 进入/退出模式:默认打字模式(竖线光标),快速输入 jk 进入命令模式(方块光标,右侧变红)。
  • 高效移动:在命令模式下用 w / b 按单词跳跃,用 0 / $ 跳到行首行尾。
  • 长命令编辑:模式下按 v,自动在 Neovim 中打开当前行,编辑完 :wq 即可回填。

3. 历史搜索与复制 (Kitty + Nvim)

  • 场景:需要复制屏幕上方几百行前的报错 ID。
  • 操作:按 Alt + H。现在你处于一个 Neovim 窗口中:
    1. / 搜索关键字。
    2. v 选中,y 复制(已同步系统剪切板)。
    3. q 退出,回到终端粘贴。

4. 应用启动 (Rofi)

  • 按下启动快捷键,输入名字,按 Ctrl + j/k 上下挑选,Ctrl + m 确认。

💡 常见问题排查 (FAQ)

  1. 卡顿问题:如果长按回车卡顿,请检查 .zshrczle-line-init 函数内是否包含了 zle reset-prompt必须删掉它
  2. 按键冲突:如果 Super + H 无效,终端运行 grep -r "bind.*H" ~/.config/hypr/ 找出占用它的配置并注释掉(JaKooLit 默认通常将其用于帮助面板)。
  3. 剪切板无效:确保 Neovim 配置文件中包含 vim.opt.clipboard = "unnamedplus",否则 Alt + H 模式下的复制无法传给浏览器。

💡 肌肉记忆训练建议 (训练计划)

为了在一周内彻底习惯这套系统,请尝试以下练习:

  1. 第一天:强制自己只用 jk 退出插入模式,删掉脑子里的 ESC
  2. 第二天:在终端需要修改命令时,严禁使用方向键。进入 Normal 模式,用 w/b 定位,用 x 删除。
  3. 第三天:练习 Super + HJKL 切换窗口。如果发现自己去摸鼠标,立刻把手缩回来。
  4. 第四天:尝试用 Alt + h 复制一次终端里的文本,感受 Neovim 处理滚动缓存的威力。

核心心法当你想动方向键或鼠标时,停顿 0.5 秒,想想对应的 HJKL 组合键是什么。

Vi 习惯指南: Zsh

环境声明:Arch Linux | Kitty 0.44 | Zsh (Vi-mode) | Neovim v0.11.5 | Hyprland (JaKooLit)

本指南旨在将 HJKL 的肌肉记忆贯穿整个系统:从窗口管理到终端编辑,再到历史回溯。


1. 终端级:Zsh Vi-Mode 核心操作

在终端执行 bindkey -v 后, Zsh 变成了“单行 Vim”。

🔹 模式切换

  • 进入命令模式 (Normal):输入 jk (自定义) 或 ESC
    • 视觉提示:光标变为 方块 █
  • 进入插入模式 (Insert):按 i (前插)、a (后插)、I (行首)、A (行尾)。
    • 视觉提示:光标变为 竖线 |

🔹 移动与快速定位 (Normal Mode)

  • 基础h j k l (左 下 上 右)。
  • 单词w (跳至下个单词头), b (跳至上个单词头), e (跳至单词尾)。
  • 行缘0 (行首), $ (行尾)。
  • 历史翻阅j / k/ 后输入关键词回车。

🔹 极速编辑

  • 删除x (删字符), dw (删单词), dd (清空行)。
  • 修改cw (改单词), C (改至行尾)。
  • 撤销u (Undo)。

2. 跨维度:Kitty + Neovim 联动

通过配置 scrollback_pager,我们可以用 Neovim 的威力来处理终端历史输出。

🔹 历史回溯 (Alt + H)

  1. 按下 Alt + H:当前终端所有输出在一个临时的 Neovim 缓冲区打开。
  2. 搜索:输入 /关键词 快速定位报错信息或日志。
  3. 复制:按 v 选中,按 y 复制(已同步至系统剪切板)。
  4. 退出:输入 :q 瞬间回到直播终端。

🔹 长命令编辑 (Normal Mode -> v)

  1. 在输入复杂命令时,按 jk 进入命令模式。
  2. 按下 v
  3. 在弹出的全屏 Neovim 中编写脚本。
  4. :wq 保存退出,命令自动回填并准备执行。

3. 系统级:Hyprland 窗口管理

利用 Super (Windows 键) 配合 HJKL 实现无感窗口切换。

  • Super + H/J/K/L:在当前工作区切换窗口焦点。
  • Super + Shift + H/J/K/L:物理移动当前窗口的位置。

💡 核心配置备忘 (Configuration Cheat-sheet)

Zsh (~/.zshrc)

1
2
3
4
5
bindkey -v
export KEYTIMEOUT=15
bindkey -M viins 'jk' vi-cmd-mode
bindkey -M vicmd 'k' up-line-or-beginning-search # 带记忆的搜索
bindkey -M vicmd 'j' down-line-or-beginning-search

Kitty (~/.config/kitty/kitty.conf)

1
2
scrollback_pager nvim -c "set signcolumn=no showtabline=0" -c "silent! write! /tmp/kitty_scrollback_buffer | te cat /tmp/kitty_scrollback_buffer - " -c "normal G"
map alt+h show_scrollback

Hyprland (~/.config/hypr/UserConfigs/UserKeybinds.conf)

1
2
3
4
bind = $mainMod, H, movefocus, l
bind = $mainMod, L, movefocus, r
bind = $mainMod, K, movefocus, u
bind = $mainMod, J, movefocus, d

📋 常用快捷键速查表

功能维度 快捷键 动作描述
模式切换 jk 退出插入模式
命令编辑 v 在 Neovim 中编辑当前行
屏幕复制 Alt + H 像编辑文件一样复制终端历史
历史命令 k / j 向上/下翻阅历史
窗口聚焦 Super + HJKL 切换当前工作区窗口
窗口位移 Super + Shift + HJKL 调整窗口布局

Generated by Arch_z Config Reference

qutebrowser 的核心逻辑是 Vim 风格,它极其强调“模式”(Mode)。在普通模式下,每一个按键都是一个功能命令。

1. 访问与地址栏 (URL & Commands)

这部分是你之前比较关心的核心操作。

按键 功能 说明
o 打开网页 弹出命令行,输入网址或搜索词
O 新标签页打开网页 在新标签页打开输入的内容
xo 修改当前 URL 自动填充当前地址供你编辑修改
xO 修改并在新标签打开 基于当前地址修改,在新页打开
go 重新载入当前 URL 填充当前地址,类似于刷新前的确认
r 刷新 相当于浏览器刷新按钮
R 强制刷新 忽略缓存刷新 (Ctrl+F5)
yy 复制 URL 复制当前网页地址到剪贴板

2. 标签页管理 (Tab Management)

qutebrowser 处理标签页非常高效。

按键 功能 说明
J / K 下/上一个标签 快速在不同标签页间左右切换 (高频!)
d 关闭当前标签 Delete
u 撤销关闭 恢复最近关闭的一个网页 (Undo)
T 标签切换器 弹出一个列表搜索并跳转标签页
g0 / g$ 跳至首/尾标签 快速跳转到第一个或最后一个标签
Ctrl-p 切换到上一个活跃标签 在最近使用的两个标签间来回横跳

3. 页面内导航 (Navigation)

不需要鼠标,像操作 Vim 一样滚动页面。

按键 功能 说明
j / k 向下/向上滚动 小幅度滚动
h / l 向左/向右滚动 页面左右移动
gg / G 回到顶部/去到底部 快速长距离移动
Space 向下翻页 相当于 PageDown
H / L 后退/前进 浏览历史的前进后退 (大写字母)
f 点击模式 (Hint) 给所有链接打上字母标签,按字母即点击 (核心!)
F 后台打开链接 同上,但在后台新标签页打开 (相当于 open -b)

按键 功能 说明
/ 页面内搜索 输入文字开始在当前页查找
n / N 下一个 / 上一个 循环跳转搜索到的匹配项
? 百度/谷歌搜索 (视配置而定) 快捷搜索选中文字

5. 缩放与显示 (Zoom & Display)

按键 功能 说明
+ / - / = 放大 / 缩小 / 恢复 页面缩放控制
i 输入模式 进入文本框填写内容,按 Esc 退出回普通模式
v 视觉模式 像在编辑器里一样选择网页文本
w p 切换代理 如果你配了多代理,这是常用的快捷命令 (视配置)
b b 隐藏/显示状态栏 极致简洁模式

6. 进阶小建议

  1. 分不清模式时按 Esc:如果你发现按什么键都没反应(或者在打字),说明你在“输入模式”,按 Esc 回到“普通模式”是所有操作的前提。
  2. 善用 F:这是用 qutebrowser 的灵魂。看新闻或搜东西时,按一下 F,然后看准链接上的字母,按下对应按键,网页就在后台打开了,手不需要离开键盘。
  3. :help 是最好的文档:在底部命令行输入 :help 回车,会打开一个非常详尽且带搜索功能的本地文档。
  4. 组合键:如果想给特定网页写规则(比如你之前问的 Hyprland 规则),可以用 :set 临时测试属性。

如果你想自定义按键:
可以编辑 config.py,使用 config.bind('你的按键', '命令') 来随心所欲定制。例如:
config.bind('tt', 'open -b') 就可以把 tt 设为在后台打开。

1. 基础导航 (Navigation)

这些命令让你在目录间自由穿梭:

  • j / k:向下 / 向上移动
  • h:返回上一级目录
  • l:进入选中的目录或打开文件
  • gg:跳到目录顶部
  • G:跳到目录底部
  • Ctrl + u / Ctrl + d:向上 / 向下翻半页
  • H:后退(历史记录)
  • L:前进(历史记录)
  • Enter:打开选中的文件

2. 文件操作 (File Operations)

Ranger 的文件操作类似 Vim 的文本编辑:

  • i:全屏预览文件内容
  • E:编辑文件(调用环境变量 $EDITOR,通常是 Vim/Nano)
  • yy:复制文件(Copy/Yank)
  • dd:剪切文件(Cut)
  • pp:粘贴文件(Paste)
  • po:粘贴并覆盖重名文件
  • cw:重命名文件(Rename)
  • delete:删除文件(注意:通常是直接删除,不进回收站,需确认)
  • da:全选文件(在某些配置中)
  • /:在当前目录下搜索文件

3. 标记与多选 (Marking/Selection)

处理多个文件时非常有用:

  • space(空格):选中当前文件,并移动到下一行
  • v:反转选择(或进入可视化模式,类似 Vim)
  • uv:取消所有选中
  • V:进入可视化模式(按 j/k 批量选择)

4. 视图与显示 (View & Display)

调整界面展示效果:

  • zh:切换显示隐藏文件(以 . 开头的文件)
  • zp:切换文件预览功能的开启/关闭
  • zi:切换显示/隐藏侧边栏
  • R:刷新当前目录
  • z:打开设置菜单(可以配合其他字母快速调整,如 zn 切换行号)

5. 标签页管理 (Tabs)

像浏览器一样管理多个路径:

  • gnCtrl + n:新建标签页
  • gt / gT:切换到 下一个 / 上一个 标签页
  • Alt + [1-9]:直接跳转到指定数字的标签页
  • gcCtrl + w:关闭当前标签页

6. 执行命令与 Shell (Execution)

在 Ranger 中直接运行外部命令:

  • s:在当前目录下打开 Shell(退出 Shell 后返回 Ranger)
  • ::输入控制台命令(如 :rename newname
  • !:运行外部 Shell 命令。例如 !unzip test.zip
  • @:针对选中的文件运行外部命令
  • f:快速跳转(输入字符后会自动过滤当前目录下的文件)

7. 排序 (Sorting)

  • on:按名称排序 (Name)
  • os:按大小排序 (Size)
  • om:按修改时间排序 (MTime)
  • oc:按改变时间排序 (CTime)
  • oa:按访问时间排序 (ATime)
  • ot:按类型排序 (Type)
  • or:反向排序 (Reverse)

8. 系统操作

  • q:退出 Ranger
  • W:打开当前目录的控制台日志
  • ?:打开帮助手册(按 ? 后再按 k 查看快捷键列表)

💡 小贴士:

  1. 书签功能:按 m 后加一个字母(如 ma)标记当前目录;按 ' 后加该字母(如 'a)即可快速跳转回来。
  2. 配置路径
    • 主配置文件:~/.config/ranger/rc.conf(可修改快捷键)
    • 快捷键定义:~/.config/ranger/rifle.conf(定义用什么软件打开什么文件)
  3. 安装预览增强:为了更好的预览效果,建议安装 highlight (代码高亮)、img2txtw3m (图片预览)。

可以在 Ranger 中输入 :help 或者直接查看其 Man Page

2026-02-04:前两天又看了下jakoolit的youtube频道,发现其实有些时候不用调QT_SCALE_FACTOR(缩放),可以用GTK Setting来设置全局字体的缩放

0. 发现问题

在 2.5K 屏幕、系统缩放 1.25 倍的 Hyprland 环境下,WPS Office 默认显示效果不佳。
我首先尝试了常见的局部环境变量修改:
QT\_SCALE\_FACTOR=1.25 /usr/bin/wps &
结果: 界面虽然变大了,但文字明显变模糊,存在像素拉伸感。

1. 坚持“局部修改”原则

我不希望修改 UserSettings.conf 中的全局 XWayland 设置,因为那会影响到系统所有 X11 程序的默认表现。我希望找到一种只针对特定软件生效、且不破坏系统全局配置的方法。

2. 解决方案:从 Scale Factor 转向 DPI 调整

经过测试,我发现调整 DPI(Dots Per Inch)对于处理文字密集的办公软件效果更好。

2.1 终端先行测试

在正式修改配置文件前,我先在终端通过命令进行验证:

1
2
# 测试以 120 DPI (即 96 * 1.25) 启动 WPS 表格
env QT_FONT_DPI=120 et

结果: 软件界面大小符合预期,且文字渲染比使用 Scale Factor 更加清晰锐利。

2.2 局部修改启动入口

验证成功后,我将此配置应用到软件的快捷方式中,而不触碰任何系统全局配置。

操作步骤:

  1. 复制系统默认快捷方式到本地目录(防止更新覆盖):

    1
    2
    mkdir -p ~/.local/share/applications/
    cp /usr/share/applications/wps-office-*.desktop ~/.local/share/applications/
  2. 修改 .desktop 文件中的 Exec 启动行。
    以 WPS 文字为例,将 Exec 修改为:
    Exec=env QT_FONT_DPI=120 /usr/bin/wps %f

    (我使用了 sed 批量完成了这个操作,并运行 update-desktop-database 刷新了缓存。)

    我发现不刷新缓存也是可以的

3. 经验总结

作为一个系统小白,这次折腾让我学到了两点:

  1. 测试先行:在终端通过 env 命令临时启动软件是最好的测试方式,行得通再改文件。
  2. 局部优先:尽量不去动影响全局的配置文件。通过调整特定软件的 DPI,既解决了显示模糊,又维持了系统其他部分的稳定性。

记录时间:2025年12月


2. 本次调优命令总结

命令 作用说明 为什么用它
env QT_SCALE_FACTOR=1.25 wps 终端测试:比例缩放启动 验证发现界面变大但模糊,故放弃
env QT_FONT_DPI=120 et 终端测试:DPI 缩放启动 验证成功,文字清晰且大小合适
cp /usr/share/applications/wps* ~/.local/share/applications/ 备份快捷方式到用户目录 遵循局部修改原则,不影响系统全局文件
sed -i 's/^Exec=/Exec=env QT_FONT_DPI=120 /g' 批量注入 DPI 环境变量 固化测试结果,使点击图标也能生效
update-desktop-database ~/.local/share/applications 刷新本地应用数据库 确保修改后的快捷方式立即被系统识别
echo $? 查看命令退出状态 养成好习惯,确认手动启动的程序是否报错

💡 提示词补充:

如果以后再遇到软件显示或运行问题,可以对 AI 说:

“我遇到一个软件显示问题。我的原则是:不修改全局配置,优先在终端使用 env 尝试局部解决。请基于这个前提,为我提供针对 [软件名] 的调试参数或 .desktop 修改方案。”

这种提问方式能让 AI 直接跳过那些“大动干戈”的建议,直接给你最符合你习惯的“手术刀式”方案。

0%