基础设施

终端(zsh)

想让 Linux 系统好用,没有一个好的终端肯定是不行的,自带的 bash 一遇到彩色 prompt 就抽风,补全功能也不够强大,相比之下我更喜欢将 zsh 作为默认的 shell 来使用

  • 安装并切换到 zsh
sudo apt install zsh
chsh -s zsh

注销并重新登录,就能看到 zsh 已经作为默认终端出现了

插件 & 主题

个人并不是很喜欢 oh-my-zsh,原因是这玩意的启动速度太慢了,所以接下来这些插件、主题都会采用手动配置的方式。首先创建一个文件夹作为容器:

mkdir ~/.zsh

下载插件的时候,全部 git clone 到此文件夹即可

  • 主题(p10k)

比起 oh-my-zsh 里面那一堆自带的主题,p10k 简直是通杀全场,高度可定制性和傻瓜式的 configuration wizard 能够很好地帮助你选择一个适合自己的风格

它同时还集成了 git、系统监视器、统计命令运行时长等许多小功能……

git clone --depth=1 https://gitee.com/romkatv/powerlevel10k.git ~/.zsh/powerlevel10k
echo 'source ~/.zsh/powerlevel10k/powerlevel10k.zsh-theme' >>~/.zshrc
  • 自动补全

zsh-autosuggestions 可以根据历史命令显示自动完成提示,实打实的终端效率神器,用过就再也回不去了

  • 语法高亮

zsh-syntax-highlighting 可以让输入的命令呈现语法高亮显示,对理清较长 shell 命令的层次结构很有帮助

Aliases

合理配置一些 alias 能够极大地提升终端使用效率,下面贴出我的部分配置:

alias zshrc="vim ~/.zshrc && source ~/.zshrc"  # 快速编辑 zsh 配置

alias grep="grep --color"  # 使 grep 高亮标记结果

# 使用 Rust 编写的高性能文件查找工具(强烈推荐!)
# 仓库地址:https://github.com/sharkdp/fd
alias find="fdfind"  

# 在当前目录打开 dolphin
alias ::="LANGUAGE=zh_CN:en_US dolphin . >/dev/null 2>&1 &"

# 快捷复制
alias copy='tee $(tty) | xclip -selection clipboard -r'

alias ls="ls --color=tty"  # 使 ls 根据文件属性显示不同的颜色
alias ll="ls -l"
alias la="ls -a"

alias rm="rm -I"  # 防止误操作
alias cp="cp -i"
alias mv="mv -i"

Clash For Windows(闭源)

科学上网工具,虽然名字带个「Windows」,但实际上是全平台的,Linux 下载解压后运行文件夹内的 cfw 即可。

DNS Hijack

按照熟悉的流程配置好 TUN Mode,却发现终端内 git clone 速度依然极慢,直接 curl google.com 也会被重置连接,只有 Chrome 走的 SwitchyOmega Socks5 能正常代理

查看日志,发现连接虽然能够被 TUN 捕获,规则却走的直连,推测可能是 DNS Hijack 出了问题,在终端中测试:

nslookup google.com  # 返回真实地址(或被 GFW 污染后的地址)
nslookup google.com -s 1.1.1.1  # 返回 fake-ip

再执行 sudo netstat -tunlp | grep 53 发现 53 端口被一个名为 systemd-resolved 的进程占用

COMMAND  PID            USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
dnsmasq 1234 libvirt-dnsmasq    5u  IPv4  29249      0t0  UDP 192.168.122.1:domain 
dnsmasq 1234 libvirt-dnsmasq    6u  IPv4  29250      0t0  TCP 192.168.122.1:domain (LISTEN)

使用 man 8 systemd-resolved.service 查看其手册页,手册上是这样描述该服务的:

systemd-resolved is a system service that provides network name resolution to local applications. It implements a caching and validating DNS/DNSSEC stub resolver, as well as an LLMNR and MulticastDNS resolver and responder. Local applications may submit network name resolution requests via three interfaces.

在仓库 issues 中搜索,果然有人 提到 了相关问题。根据前人的指引,可以用 这里 提到的方法来禁止 systemd-resolveed 监听 53 端口,只需要一个配置文件:

  • /etc/systemd/resolved.conf.d/stub-listener.conf
[Resolve]
DNSStubListener=no

规则混入

另外,像 Telegram 这种自己走 DoH 然后直连 ip 的应用可能还是会被漏掉,所以需要 混入 相应的 PROCESS-NAME 规则:

const ProcessList = [
    'Telegram'
]

module.exports = {
    parse({ content, name, url }, { yaml, axios, notify }) {
        if ('rules' in content) {
            for (const proc of ProcessList) {
                content['rules'].unshift(['PROCESS-NAME', proc, name].join(','))
            }
        }
        return content
    }
}

(似乎有个 Parser 更适合用于处理这种问题?)

输入法

输入法采用 fcitx5 + rime 的配置(貌似 fcitx5-rime 并不是官方维护?)方案,Ubuntu 下直接 apt 安装即可:

sudo apt install fcitx5 fcitx5-rime

我习惯于「明月拼音」加「小鹤双拼」的输入方案,日常聊天的时候用朙月拼音和 emoji 输入,写文章的时候再切换到双拼加快速度(虽然现在双拼打得比全拼还慢

双拼方案

sudo apt install librime-data-double-pinyin # 安装双拼方案

然后在 ~/.local/share/fcitx5/rime 下创建配置文件,选择你需要的输入方案:

  • default.custom.yaml
patch:
  menu/page_size: 7
  schema_list:
    - schema: luna_pinyin  # 全拼方案
    - schema: double_pinyin_flypy  # 双拼方案

Emoji 支持

参照 rime-emoji 的安装方式,同样在 ~/.local/share/fcitx5/rime 下创建配置文件:

  • luna_pinyin.custom.yaml
patch:
  switches/@next:
    name: emoji_suggestion
    reset: 1
    states: [ "🈚️️\uFE0E", "🈶️️\uFE0F" ]
  'engine/filters/@before 0':
    simplifier@emoji_suggestion
  emoji_suggestion:
    opencc_config: emoji.json
    option_name: emoji_suggestion
    tips: all

fcitx5 -rd 重新部署

主题配置

git clone https://github.com/thep0y/fcitx5-themes
ls -d fcitx5-themes/*/ | xargs -I {} mv {} .  # 将所有主题配置移出来
rm -rf fcitx5-themes

开发环境

NeoVim

增强版的 vim,拥有强大的插件系统,目前已经全面拥抱 neovim

  • Ubuntu 下使用 apt 即可安装
sudo apt install neovim

再写一些基本配置:

  • /home/mufanc/.config/nvim/init.vim
" 自动将 <Tab> 转换为 4 个空格
set tabstop=4
set shiftwidth=0
set expandtab

" 展示行号  
set number

" 使用 Ctrl + S 保存
imap <C-S> <ESC>:w<CR>i<RIGHT>

" 使用 Ctrl + 斜杠 运行命令
nmap <C-_> :!
imap <C-_> <ESC>:!

Docker

官方文档

我个人不是很喜欢 Docker Desktop,在终端里就能完成的事情,何必大费周章去搞一个图形界面呢?

安装

  • 更新软件源
sudo apt update
sudo apt install ca-certificates curl gnupg lsb-release
  • 设置存储库
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
  • 安装 Docker Engine
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

安装完成之后,可以用命令 sudo docker run hello-world 来测试一下 docker 是否已经正确安装

添加到 docker 用户组

建议将当前用户添加到 docker 用户组中,可以避免每次运行 docker 时都需要 sudo

sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker

再次运行 docker run --rm hello-world,现在不需要添加 sudo 应该也可以正常工作

JetBrains Toolbox

管理 JetBrains 系列 IDE 最方便的工具,直接到 官网 下载、解压、运行即可快速完成安装

  • 软件截图

效率工具

uTools

官网 可以下载到 uTools 的 .deb 安装包,用 apt 安装即可。安装完成后先从终端启动测试一下,可能会报找不到 libcrypto.so.1.1

参考网上的解决方案,自己编译一个 openssl,然后把 so 文件复制进去给它:

git clone https://github.com/openssl/openssl \
  --depth 1 --branch OpenSSL_1_1_1-stable
./config
make -j16 && make test
sudo cp libcrypto.so.1.1 /opt/uTools

Krita

强大的开源绘图工具,基础功能相当齐全,对于我这种非专业人士来说,用来做一些裁剪图片之类的工作,完全足以替代 PhotoShop,从 KDE 自带的 Discover 软件中心即可下载安装 Krita

  • 软件截图

安装后语言设置里可能会找不到中文,需要用下面的命令安装语言包:

sudo apt install krita-l10n  # L10N: localization, 本地化

娱乐相关

BBDown

全平台的哔哩哔哩下载器,功能齐全。我基于 Google 的 zx 给它搓了个自动更新脚本,将脚本和 BBDown 可执行文件放在同一文件夹下,执行 ./update.mjs 即可自动完成更新:

  • update.mjs
#!/usr/bin/env zx

cd(__dirname)

const info = await (await fetch('https://api.github.com/repos/nilaoda/BBDown/releases/latest')).json()
const target = info.assets.find(it => it.name.includes('linux-x64'))

await $`curl -LO ${target.browser_download_url}`
await $`unzip -o ${target.name}`
await Promise.all([
    $`chmod u+x BBDown`,
    $`rm ${target.name}`
])

网易云音乐

Linux 平台的网易云音乐客户端?那必须是 netease-cloud-music-gtk!相比官方臃肿的 Electron 版本,这个客户端只有 3MB 大小。另外其在最近的更新中完善了登录状态保持功能,再也没有理由使用官方客户端

Bottles

Bottles 对 Wine 进行了深度的封装,带来直观的图形用户界面,并提供一些高级选项和沙盒支持,如果有在 Linux 运行 Windows 应用的需求,十分推荐下载尝试:

KDE 美化

视觉风格

这里贴一下我的主题配置:

Wallpaper Engine

作者重新实现了一个壁纸引擎,能够将 Wallpaper Engine 库中的壁纸显示在 KDE 原生桌面上

参照 README 中的 说明 安装依赖:

sudo apt install build-essential libvulkan-dev plasma-workspace-dev gstreamer1.0-libav \
liblz4-dev libmpv-dev python3-websockets qtbase5-private-dev \
libqt5x11extras5-dev \
qml-module-qtwebchannel qml-module-qtwebsockets cmake

然而加载壁纸之后,报 TypeError: As of 3.10, the *loop* parameter was removed fron Lock() since is is no longer necessary 错误。这种问题显然不会只有我一个人会遇到,于是搜索 issues,找到如下 解决方案

pip install --upgrade websockets

(其实就是简单更新一下 websockets)

  • 启用场景和 mpv 支持

如果需要额外的场景和 mpv 支持,则需要自己编译插件,按照 README 中的 说明 来做就行了:

# Download source
git clone https://github.com/catsout/wallpaper-engine-kde-plugin.git
cd wallpaper-engine-kde-plugin

# Download submodule (glslang)
git submodule update --init

# Configure
# 'USE_PLASMAPKG=ON': using plasmapkg2 tool to install plugin
mkdir build && cd build
cmake .. -DUSE_PLASMAPKG=ON

# Build
make -j$nproc

# Install package (ignore if USE_PLASMAPKG=OFF for system-wide installation)
make install_pkg
# install lib
sudo make install