BNU-FZH

fengzhenhua@outlook.com

ArchLinux是一款灵活、强大、可定制的Linux发行版,提供丰富的软件包和工具,支持滚动更新和多种桌面环境,拥有庞大的社区支持和方便的包管理器,适合各种用户需求和使用场景。Endeavour 是一个基于ArchLinux的轻量级和用户友好的发行版,预装了桌面环境和预配置的软件包,旨在提供一个无忧的ArchLinux体验。

阅读全文 »

众所周知 Gnome 桌面环境非常成熟,但是每次大版本升级都会导致大量的插件失效,如果等足够长的时间再更新则不能保证系统处理最新状态,如果不等则无法正常工作,不同的插件需要等的时间也不一样。基于上述考虑,我决定从 Gnome3 切换到 Cosmic 桌面环境,其优点是 Cosmic 从零开始使用 rust 语言创建,所以其安全性高、速度快。但是, Cosmic 是一款可以工作中使用,然而还在发展中的新系统,所以就有了本文,本文的目的是记录从使用到完善过程中的问题。

删除 Gnome 切换到 Cosmic

  1. 启用Cosmic显示管理器cosmic-greeter
1
sudo systemctl enable cosmic-greeter
  1. cosmic-files和Gnome都需要gvfs, 所以需要保留gvfs, 只删除Gnome, 最安全的方法是在删除列表中排除 gvfs, 即
1
sudo pacman -Rns gnome gnome-shell gnome-browser-connector gnome-shell-extension-blur-my-shell obs-gnome-screencast --assume-installed gvfs
  1. 后续清理
1
sudo pacman -Rns $(pacman -Qtdq)
  1. 停用并禁用GDM
1
sudo systemctl disable --now gdm.service

移除WhiteSur主题

  1. 切换到WhiteSur源目录
如果已经删除了源目录,则用下述命令重新下载
1
2
git clone https://github.com/vinceliuice/WhiteSur-gtk-theme.git
cd WhiteSur-gtk-theme
  1. 移除GTK主题: ./install.sh -r

  2. 移除GDM登录主题:sudo ./tweak.sh -g -r

  3. 移除Libadwaita主题: ./install.sh -l -r

  4. 移除Firefox主题: ./tweak.sh -f -r, 需要选关闭Firefox再执行这条命令。

  5. 手动删除残留文件:

1
2
3
4
5
# 删除系统级残留(需要管理员权限)
sudo rm -rf /usr/share/themes/WhiteSur*

# 删除用户级残留
rm -rf ~/.themes/WhiteSur*

多媒体

尽管Cosmic中也有默认的音乐播放器和视频播放器,但是仍然不好用,于是需要安装简洁、轻量级的音乐播放器Amberol和视频播放器Celluloid, 执行命令

1
sudo pacman -S amberol celluloid

设置截屏快捷键

  1. 打开Cosmic设置

  2. 进入输入设备(Input Devices)→键盘(Keyboard)

  3. 点击查看和自定义快捷键(View and customize shortcuts)

  4. 在列表中找到系统快捷键类别,然后在右侧列表向下滚动找到截图(Take a screensh)选项。

  5. 进入截图后,选中添加另一个快捷键 。

  6. 按下F7, 则使用F7打开截图设置完毕。

Cosmic 主题

打开网站Cosmic Themes, 选中合适的主题下载到你想要的目录。然后点击设置→外观→导入,选中下载的主题,则主题设置完毕。

问题汇总

每次开机密钥环总是要求输密码

cosmic-greeter基于greetd, 其PAM 配置文件通常是/etc/pam.d/cosmic-greeter。不过,根据Arch Wiki的讨论,其打包配置有时会复用/etc/pam.d/login这个文件。 因此,为了确保生效,需要同时检查并编辑这两个文件。

  1. 检查两个文件:
1
ls -l /etc/pam.d/cosmic-greeter /etc/pam.d/login

[!WARNING] 如果/etc/pam.d/cosmic-greeter不存在,可以参照其他显示管理器的做法,创建一个指向login的符号链接,或直接编辑/etc/pam.d/login。

  1. 编辑PAM文件以集成gnome-keyring: 向上一步确定的PAM(两个), 中添加pam_gnome_kerying.so模块。在login和cosmic-greeter文件中添加以下两行内容:
  • 在auth部分的末尾添加:
1
auth optional pam_gnome_kerying.so
  • 在session部分的末尾添加:
1
session optional pam_gnome_kerying.so auto_start

[!WARNING] 注意: 添加时请保持文件原有结构,将新行插入到对应区块的末尾。一个配置好的文件示例片段如下:

1
2
3
4
5
6
7
#%PAM-1.0
auth requisite pam_nologin.so
auth include system-local-login
auth optional pam_gnome_keyring.so
account include system-local-login
session include system-local-login
session optional pam_gnome_keyring.so auto_start

[!WARNING] 自动解锁成功的关键:登录系统使用的密码,必须和“登录”密钥环(Login Kerying)的密码完全一致。如果不一致,则需要使用seahorse工具手动修改密钥环的密码,使之与登录密码匹配。事实上我仅修改了login文件,测试成功了。同时,Cosmic桌面环境正在开发自己的原生密钥环服务oo7, 待其成熟后也可以迁移到oo7提供的pam_oo7.so模块用于自动解锁。

文件管理器不显示移动硬盘

这个问题主要是由于原来系统安装的是Gnome3, 当删除Gnome3后也把cosmic-file依赖的gvfs,udisks2和gvfs-mtp卸载了,于是安装这三个命令后问题解决:

1
sudo pacman -S gvfs gvfs-mtp udisks2

Guake终端下Fcitx5输入面板4k显示器下过小的问题

  1. 打开Fcitx5配置

  2. 切换到附加组件

  3. 切换到经典用户界面

  4. 所有字体设置为15

  5. 勾选在X11上针对不同屏幕使用单独的DPI

  6. 固定 Wayland 的字体 DPI 为 192

  7. 不勾选在Wayland下启用分数缩放

  8. 点确定, 然后找到Fcitx5在状态栏中的图标,右键,重新启动Fcitx5.

参考资料

当前稀沃白板在中学普及度很高,教师每天都要讲课并书写板书,将每个阶段的讲义合成为一个PDF文件发给学生是一个非常有意义的工作。为实现此目的我编写了在Linux下合成PDF的Shell脚本seewo.sh, 其源码为

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
34
#! /bin/sh
#
# Program : seewo.sh
# Author : fengzhenhua
# Email : fengzhenhua@outlook.com
# Date : 2026-06-23 11:02
# CopyRight: Copyright (C) 2026-2030 Zhen-Hua Feng(冯振华)
# License : Distributed under terms of the MIT license.
# Seewo Board Synthesizer: Automated Teaching Whiteboard Content Compiler
#
# 调入私有函数库
source ~/.Share_Fun/Share_Fun_KeySudo.sh
source ~/.Share_Fun/Share_Fun_Install.sh
# 保存脚本变量
SW_ARGS=( "$0" "$@" )
SW_VERSION="${SW_ARGS[0]##*/}-V1.7"
SFI_INSTALL ${SW_ARGS[1]} ${SW_ARGS[0]} $SW_VERSION
GIT_DEPEND imagemagick
# 输出PDF文件命名
if [[ ${SW_ARGS[1]} == "" ]] ; then
OUTNAME=${PWD##*/}
else
OUTNAME=${SW_ARGS[1]}
fi
shopt -s globstar nullglob # globstar 确保目录穿透深度,nullglob 确保没有匹配到文件,通配符返回空
SW_FILES=( **/*.{png,jpg,jpeg} )
shopt -u globstar nullglob # 恢复默认设置
# 如果未发现图片则不执行操作,发现图片则合成pdf
if [ ${#SW_FILES[@]} -gt 0 ]; then
readarray -t sorted < <(printf '%s\n' "${SW_FILES[@]}" | sort -V)
magick "${sorted[@]}" "./${OUTNAME}.pdf"
else
echo "当前目录及各级子目录内均未发现PNG、JPG和JPEG格式图片,不执行合成操作!"
fi

[!WARNING] 私有函数库Share_Fun_KeySudo与Share_Fun_Install可以到fungzhenhua/script下载,如果不安装则注释掉source的两行及GIT_DEPEND行,同时自行安装好imagemagick即可。

直接复制Word中的图片可能会因为剪贴板格式转换或Word默认的压缩机制导致画质下降和背景丢失。

docx 文档提取高清图片

为了提取无损且高清的原图,可以将.docx文件修改为.zip后解压。这种方法能够确保图像不失真。这是因为现代的 .docx 文件本质上是一个包含多种资源(包括原始图片)的压缩包。通过解压,可以直接获取未经任何处理的原始高清图片。

操作步骤:

  • 备份文档:建议先复制一份需要提取图片的Word文档。
  • 更改后缀名:将文档的后缀名从 .docx 改为 .zip(如果看不到后缀名,需在文件夹选项中开启“显示文件扩展名”)。
  • 解压文件:使用解压缩软件(如7-Zip、WinRAR等)打开或解压该ZIP文件。
  • 提取图片:在解压出的文件夹中,依次进入 word → media 目录。这里存放了文档中所有的原始图片,您可以直接将它们复制出来。
  • 注:此方法仅适用于 .docx 格式,不适用于老旧的 .doc 格式。

doc 文档提取高清图片

由于老旧的 .doc 格式并非基于 XML 的压缩包结构,因此无法直接使用“修改后缀为 ZIP”的方法。一种最简便的方法是使用MsOffice将.doc文档转换为.docx文档,然后再修改后缀为.zip, 使用解压缩软件解压缩。另一种方法是另存为网页,这是最古老且最可靠的方法,能够很好的保留图片的原始画质。

操作步骤:

  • 用 Word 打开需要提取图片的 .doc 文档。
  • 点击左上角的“文件” → “另存为”。
  • 选择好保存位置,在 “保存类型” 下拉菜单中,选择 “网页 (*.htm; *.html)”(注意:请勿选择 “单个文件网页”),然后点击保存。
  • 保存后,系统会在同目录下自动生成一个名为 “[文档名]_files” 的文件夹。打开该文件夹,里面就整齐排列着文档中的所有原始高清图片。

问题描述

今天使用 Neovim 打开它自己的配置文件时,出现报错信息

1
LSP[lua_ls] Your workspace is set to `/home/foobar`. Lua language server refused to load this directory. Please check your configuration.[learn more here](https://luals.github.io/wiki/faq#why-is-the-server-scanning-the-wrong-folder)

这个错误信息的意思是,Lua 语言服务器(lua_ls)被你的编辑器(如 VS Code 或 Neovim)告知,要将整个 /home/foobar 目录作为工作区进行扫描,而服务器由于性能或安全方面的考量,拒绝了这个指令。这通常是一个配置问题,可以通过正确设置工作区解决。

解决方案

在你的Neovim配置目录下创建.luarc.json文件,明确告诉lua_ls这就是项目根据目录。即

~/.config/nvim/.luarc.json
1
2
3
4
5
6
7
8
9
{
"$schema": "https://raw.githubusercontent.com/LuaLS/vscode-lua/master/setting/schema.json",
"runtime.version": "Lua 5.1",
"workspace.ignoreDir": [
"node_modules",
".git",
"dist"
]
}

其中:runtime.version一行,指明了兼容Lua 5.1版本。同时使用workspace.ignoreDir来忽略无关目录,以提高性能,所以需要配置这个忽略列表。

为什么之前会报错?

  • 默认情况下,nvim-lspconfig 的 lua_ls 如果没有找到项目根目录,会回退到使用当前工作目录(vim.loop.cwd())。如果你是在主目录下启动 Neovim(例如直接运行 nvim ~/.config/nvim/init.lua),那么当前工作目录就是 /home/foobar,导致 lua_ls 被设置为扫描整个主目录,从而触发拒绝。

  • 创建 .luarc.json 后,root_pattern 会优先匹配,从而正确设置工作区。

  • 按上述步骤操作后,错误信息就会消失,LSP 功能也能正常使用。

今天打开msn的网页时,遇到了问题:

[!WARNING] www.msn.cn 启用了被称为 HTTP 严格传输安全(HSTS)的安全策略,Firefox 只能与其建立安全连接。您无法为此网站添加例外,以访问此网站。

这个问题的根源在于网站启用了一项名为 HTTP 严格传输安全 (HSTS) 的安全策略。这本身是一种网站保护用户安全的机制,可以强制浏览器始终使用加密的 HTTPS 连接。简单来说,主要原因是 www.msn.cn 很可能被加入了各大浏览器(包括 Firefox)共同维护的“HSTS 预加载列表”中。这个列表被硬编码在浏览器里,针对列表中的网站,浏览器会强制执行 HTTPS 连接,并且不允许用户添加例外,所以您无法通过常规方式访问。要解决这个问题,您可以尝试以下几个方法

在 Firefox 中清除网站HSTS记录

如果您的电脑本地并没有访问过 www.msn.cn 的历史记录,可以尝试通过“忘记此网站”功能来清除可能存在的 HSTS 策略:

  1. 按下 Ctrl + H 打开 Firefox 浏览器中的历史记录侧边栏。
  2. 在侧边栏的搜索框中输入 msn.cn 查找相关记录。
  3. 右键点击搜索结果并选择“忘记此网站”。
  4. 在弹出的确认框中再次点击“忘记”。

[!WARNING] 此操作会清除 Firefox 本地存储的关于该网站的所有信息,包括强制的 HSTS 规则。

修改高级配置

  1. 在 Firefox 地址栏输入 about:config 并回车。
  2. 点击“接受风险并继续”按钮。
  3. 在搜索框中输入 network.stricttransportsecurity.preloadlist。
  4. 双击找到的首选项,将其值从 true 改为 false。
  5. 修改后,无需重启 Firefox,即可再次尝试访问 msn.cn。

[!WARNING] 如果以上方法都无法解决问题,您可以通过修改 Firefox 的高级配置来强制禁用整个 HSTS 预加载列表。请注意,这会显著降低您浏览器访问其他网站的安全性,请您谨慎操作并自行承担风险。

近期为我的 Neovim 配置了 Ai 功能,但是发现每次打开 LaTeX 文件会有报错,同时语法高亮了会出现问题。今天经过研究发现是 nvim-treesitter 升级后导致了的兼容性问题,具体请参考:https://github.com/nvim-treesitter/nvim-treesitter, 其官方 README.md中说明:

[!CAUTION] This is a full, incompatible, rewrite: Treat this as a different plugin you need to set up from scratch following the instructions below. If you can't or don't want to update, specify the master branch (which is locked but will remain available for backward compatibility with Nvim 0.11).

新版 nvim-treesitter 的配置

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#! /usr/bin/env lua
vim.api.nvim_create_autocmd("FileType",{
pattern = "tex",
callback = function()
-- 配置F4打开模板
vim.api.nvim_set_keymap("n", "<F4>", ":TTemplate<CR>", {noremap = true, silent = true})
-- 配置pdflatex编译,原vim-latex中使用\ll 默认 xelatex 编译, 注意使用%:t:r 截取文件名
vim.api.nvim_set_keymap("n", "<F6>", [[<cmd>!pdflatex % ; bibtex %:t:r.aux ; pdflatex % ; pdflatex % <CR>]], {noremap = true, silent = true})
vim.api.nvim_set_keymap("n", "<F8>", [[<cmd>!xelatex % ; bibtex %:t:r.aux ; xelatex % ; xelatex % <CR>]], {noremap = true, silent = true})
-- 配置F10编译多合一文件时,以当前目录名为主文件,以节省时间
vim.api.nvim_set_keymap("n", "<F10>", [[<cmd>!xelatex $(echo $PWD|awk -F"/" '{print $NF}').tex <CR>]], {noremap = true, silent = true})
end
})
vim.api.nvim_create_autocmd('FileType', {
pattern = 'tex',
callback = function(args)
-- 尝试停止可能存在的旧 Tree-sitter 实例(可选,更保险)
pcall(vim.treesitter.stop, args.buf)
-- 为当前 buffer 启动 Tree-sitter 解析器和高亮
vim.treesitter.start(args.buf, 'latex')
-- 关键步骤:显式关闭 Vim 原生的正则表达式高亮,避免冲突
vim.bo[args.buf].syntax = 'OFF'
end,
})
-- neovim将Shift+F5映射为F17,Shift+F7 映射为F19
vim.api.nvim_set_keymap('n', '<F17>' , '<S-F5>', { })
vim.api.nvim_set_keymap('i', '<F17>' , '<S-F5>', { })
vim.api.nvim_set_keymap('n', '<F19>' , '<S-F7>', { })
vim.api.nvim_set_keymap('i', '<F19>' , '<S-F7>', { })
-- set for vim-latex/latex-suit:winaltkeys
vim.g['Tex_Menus'] = 0
vim.g['Tex_Flavor'] = 'latex'
-- vim.g['Tex_IgnoreLevel'] = 8
-- vim.g['Tex_GotoError'] = 0
vim.g['Tex_DefaultTargetFormat'] = 'pdf'
-- 配置默认编译引擎为 xelatex
vim.g['Tex_CompileRule_pdf'] = 'xelatex -synctex=1 -interaction=nonstopmode -file-line-error-style $*'
-- 获取桌面环境,并根据桌面环境选择默认的PDF阅读器
if os.getenv("DESKTOP_SESSION") == "plasma" then
vim.g['Tex_ViewRule_pdf'] = 'okular'
else
vim.g['Tex_ViewRule_pdf'] = 'papers'
end
-- 控制统计过程中的警告信息
-- vim.g['TCLevel'] = 5
vim.g['Tex_IgnoredWarnings'] = [[
LaTeX Font Warning:
LaTeX Warning:
Warning:
Overfull
]]
vim.g['Tex_IgnoreLevel'] = 4
vim.g['Tex_GotoError'] = 0
-- 配置自定义模板路径
vim.g['Tex_CustomTemplateDirectory'] = "~/.latex-templates/"
-- 取消自动缩进
vim.g['tex_indent_items'] = 0
-- 开启Alt键
vim.g['Tex_AdvancedMath'] = 1
vim.api.nvim_set_option('winaltkeys','no')
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
#! /usr/bin/env lua
require('nvim-treesitter').setup {
-- 确保语法成功安装
ensure_installed = {"bash","python","markdown","latex","vim", "lua", "html", "ssh_config", "yaml", "css", "javascript", "typescript", "c", "cpp","fortran", "haskell", "perl", "json5", "rust", "go" },
-- 启用代码高亮
highlight = {
enable = true,
},
--启用增量选择
incremental_selection = {
enable = true,
keymaps = {
init_selection = '<CR>',
node_incremental = '<CR>',
node_decremental = '<BS>',
scope_incremental = '<TAB>'
}
},
-- 启用基于 Treesitter 的代码格式化(=)
indent = {
enable = true
},
}
-- 开启代码折叠
vim.wo.foldmethod = 'expr'
vim.wo.foldexpr = 'nvim_treesitter#foldexpr()'
-- 默认不折叠
vim.wo.foldlevel = 99

旧版 nvim-treesitter 的配置

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#! /usr/bin/env lua
--绑定快捷键
vim.api.nvim_create_autocmd("FileType",{
pattern = "tex",
callback = function()
-- 配置F4打开模板
vim.api.nvim_set_keymap("n", "<F4>", ":TTemplate<CR>", {noremap = true, silent = true})
-- 配置pdflatex编译,原vim-latex中使用\ll 默认 xelatex 编译, 注意使用%:t:r 截取文件名
vim.api.nvim_set_keymap("n", "<F6>", [[<cmd>!pdflatex % ; bibtex %:t:r.aux ; pdflatex % ; pdflatex % <CR>]], {noremap = true, silent = true})
vim.api.nvim_set_keymap("n", "<F8>", [[<cmd>!xelatex % ; bibtex %:t:r.aux ; xelatex % ; xelatex % <CR>]], {noremap = true, silent = true})
-- 配置F10编译多合一文件时,以当前目录名为主文件,以节省时间
vim.api.nvim_set_keymap("n", "<F10>", [[<cmd>!xelatex $(echo $PWD|awk -F"/" '{print $NF}').tex <CR>]], {noremap = true, silent = true})
end
})
-- 开启treesitter提供的语法高亮
vim.api.nvim_create_autocmd( 'FileType', { pattern = 'tex',
callback = function(args)
vim.treesitter.start(args.buf, 'latex')
vim.bo[args.buf].syntax = 'on' -- only if additional legacy syntax is needed
end
})
-- neovim将Shift+F5映射为F17,Shift+F7 映射为F19
vim.api.nvim_set_keymap('n', '<F17>' , '<S-F5>', { })
vim.api.nvim_set_keymap('i', '<F17>' , '<S-F5>', { })
vim.api.nvim_set_keymap('n', '<F19>' , '<S-F7>', { })
vim.api.nvim_set_keymap('i', '<F19>' , '<S-F7>', { })
-- set for vim-latex/latex-suit:winaltkeys
vim.g['Tex_Menus'] = 0
vim.g['Tex_Flavor'] = 'latex'
-- vim.g['Tex_IgnoreLevel'] = 8
-- vim.g['Tex_GotoError'] = 0
vim.g['Tex_DefaultTargetFormat'] = 'pdf'
-- 配置默认编译引擎为 xelatex
vim.g['Tex_CompileRule_pdf'] = 'xelatex -synctex=1 -interaction=nonstopmode -file-line-error-style $*'
-- 获取桌面环境,并根据桌面环境选择默认的PDF阅读器
if os.getenv("DESKTOP_SESSION") == "plasma" then
vim.g['Tex_ViewRule_pdf'] = 'okular'
else
vim.g['Tex_ViewRule_pdf'] = 'papers'
end
-- 控制统计过程中的警告信息
-- vim.g['TCLevel'] = 5
vim.g['Tex_IgnoredWarnings'] = [[
LaTeX Font Warning:
LaTeX Warning:
Warning:
Overfull
]]
vim.g['Tex_IgnoreLevel'] = 4
vim.g['Tex_GotoError'] = 0
-- 配置自定义模板路径
vim.g['Tex_CustomTemplateDirectory'] = "~/.latex-templates/"
-- 取消自动缩进
vim.g['tex_indent_items'] = 0
-- 开启Alt键
vim.g['Tex_AdvancedMath'] = 1
vim.api.nvim_set_option('winaltkeys','no')
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
34
#! /usr/bin/env lua
for _, config in pairs(require("nvim-treesitter.parsers").get_parser_configs()) do
config.install_info.url = config.install_info.url:gsub("git@github.com:", "something else")
end
require('nvim-treesitter.configs').setup({
-- 支持的语言
ensure_installed = {"bash","python","markdown","latex","vim", "lua", "html", "ssh_config", "yaml", "css", "javascript", "typescript", "c", "cpp","fortran", "haskell", "perl", "json5", "rust", "go" },
-- 启用代码高亮
highlight = {
enable = true,
-- additional_vim_regex_highlighting = true,
disable = { "latex" },
additional_vim_regex_highlighting = { "latex", "markdown" },
},
--启用增量选择
incremental_selection = {
enable = true,
keymaps = {
init_selection = '<CR>',
node_incremental = '<CR>',
node_decremental = '<BS>',
scope_incremental = '<TAB>'
}
},
-- 启用基于 Treesitter 的代码格式化(=)
indent = {
enable = true
},
})
-- 开启代码折叠
vim.wo.foldmethod = 'expr'
vim.wo.foldexpr = 'nvim_treesitter#foldexpr()'
-- 默认不折叠
vim.wo.foldlevel = 99

随着时代的进步和世界的发展,我决定从今天开始在 Neovim 上集成 AI,以增强编辑功能。其中一个为 Neovim 增加 AI 能力的工具是 Gen.nvim,但在安装插件之前,请确保已配置好 ollama 并拉取所需的模型。

安装配置 Gen.nvim

~/.config/nvim/lua/lazy-init.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"David-Kunz/gen.nvim",
opts = {
-- model = "qwen2.5-coder:latest", -- 或您已下载的任意模型
model = "qwen2.5:14b", -- 或您已下载的任意模型
quit_map = "q", -- 关闭响应窗口的快捷键
retry_map = "<c-r>", -- 重试的快捷键
accept_map = "<c-cr>", -- 接受并替换文本的快捷键
host = "localhost",
port = "11434",
display_mode = "float", -- 以浮动窗口展示结果
-- hidden = true, -- 启用无窗口模式,直接替换
},
},

这样,在启动Neovim时,lazy.nvim会自动安装gen.nvim插件。

Gen.nvim 的使用

Gen.nvim 插件提供的核心 AI 功能涵盖了从代码到文本的各种协作场景。插件将这些功能封装为一系列“预设指令 (Prompts)”,用户可以直接在 Neovim 中通过 :Gen 命令调用,无需频繁复制粘贴、切换窗口或手动编写提示词。

功能类别 选项 主要功能与使用场景
理解与获取 Ask 直接向 AI 提问任何问题(如查询概念、解释原理)
Chat 开启一个多轮对话窗口,适合需要上下文连续交流的场景
Summarize 快速总结当前选中的文本或代码,抓住核心内容
Review Code 让 AI 审阅代码,分析可读性、性能和安全问题,并提出改进建议
代码与文本优化 Change Code 根据你的指令直接修改选中的代码,类似于“把这段代码改成……”
Enhance Code 在不改变核心逻辑的前提下,优化选中代码的结构、性能和可读性
Change 选中文本后,让 AI 根据你的自然语言指令进行修改(如“把语气改得更正式”)
Enhance Wording 优化措辞、改善表达,使书面表达更清晰、流畅、专业。
Enhance Grammar Spelling 专门检查并修正文本中的语法和拼写错误
Make Concise 简化冗余的长文本,提炼关键信息,且不改变原意。
生成与整理 Generate 根据你的要求生成全新的内容,不仅限于代码,也可以是邮件、报告大纲等
Make List 将散乱的文本或笔记自动整理成结构化列表
Make Table 将相关数据或信息分析整理后,呈现为表格形式

2026年5月30日将原来的GTX 1660s 升级为GTX 5060 Ti 16G, 于是本机具备了本地运行Ai的能力。今天配置成功了 Ollama, 于是此篇博客正式记录这一配置过程。

安装 Ollama

我的电脑是 ArchLinux, 于是直接使用命令安装即可:

Nvidia 显卡安装ollama-cuda

1
sudo pacman -S ollama-cuda

Amd 显卡安装ollama-rocm

1
sudo pacman -S ollama-rocm

如果直接安装ollama , 默认使用 cpu 工作,所以需要安装 ollama-cuda 版本。

查找支持的大模型

要浏览Ollama支持的所有模型,需要去它的官方模型库网站进行搜索:

  • 访问地址:https://ollama.com/search。
  • 在网站上,你可以按“Most popular”(最受欢迎)等条件排序,或直接搜索你感兴趣的模型。

安装大模型: deepseek-r1:7b

1
ollama pull deepseek-r1:7b

运行大模型: deepseek-r1:7b

1
ollama run deepseek-r1:7b

至上此可以在终端下运动大模型了,但是当涉及到一些 LaTeX 公式时,在终端下无法显示公式,只能显示源码,因此需要下面的配置open webui, 使得浏览器可以使用本地的大模型。

配置open webui

安装 docker

1
sudo pacman -S docker

配置docker国内源

/etc/docker/daemon.json
1
2
3
4
5
6
7
8
{
"registry-mirrors": [
"https://docker.xuanyuan.me",
"https://docker.1ms.run",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.m.daocloud.io"
]
}

重新加载Docker 配置并重启动

1
2
sudo systemctl daemon-reload
sudo systemctl restart docker

验证配置是否生效

1
docker info | grep -A 1 "Registry Mirrors"

如果成功,输出中会显示您配置的其他镜像地址。

使用国内镜像源安装Open WebUI

配置好镜像加速器后,拉取镜像时已无需特殊前缀,Docker 会自动从国内镜像源获取官方镜像。但如果您的网络环境较为特殊,也可以直接指定国内镜像源的完整地址进行拉取。

例如南京大学镜像:

1
docker pull ghcr.nju.edu.cn/open-webui/open-webui:latest

拉取完成后,验证镜像是否已经成功下载:

1
docker images | grep open-webui

看到类似ghcr.nju.edu.cn/open-webui/open-webui:latest的输出即表示成功。

启动 Open WebUI 容器

拉取成功后,启动 Open WebUI 容器。启动前请确认您的 Ollama 服务已正常运行。

1
2
3
4
5
6
docker run -d --network=host \
-v open-webui:/app/backend/data \
-e OLLAMA_BASE_URL=http://127.0.0.1:11434 \
-e WEBUI_PORT=3000 \
--name open-webui --restart always \
ghcr.nju.edu.cn/open-webui/open-webui:latest

在日常工作和运维中,我们经常遇到这样的需求:两个目录 A 和 B 都可能随时新增或修改文件,希望它们最终保持完全一致,同时绝不能删除任何文件。这种场景下,传统的 rsync 单向同步方案显得力不从心,而 Unison 正是解决这一问题的利器。

本文将深入讲解 Unison 的安装、使用、冲突处理机制,以及如何安全地实现双向同步。

一、为什么 rsync 不够用?

很多人首先想到的是 rsync,但它的局限很明显:

1
2
# 这条命令无法实现真正的双向同步
rsync -a --update A/ B/

问题所在

  • rsync 本质是单向 工具,只能从源到目标。
  • --update 只保护目标端的新文件,不会反向同步。
  • 即使执行两次rsync, 也无法安全处理两边同时新增或修改的场景。

结论 纯新增文件(从不修改)的场景可以用两次rsync拼凑,但是只要涉及修改,就需要真正的双向同步工具。

二、Unison 简介

Unison 是一款跨平台的双向文件同步工具,核心特性:

  • 真正的双向同步: 自动检测并传播两边的变更
  • 安全第一: 冲突时不会自动覆盖,需要明确处理
  • 增量传输:只同步差异部分,节省带宽和时间
  • 跨平台:Linux、macOS和Windows均可使用
  • 支持SSH: 可同步远程服务器目录

安装 Uniso

1
sudo pacman -S uniso

基础用法

最简单的双向同步

1
unison /path/to/A/ /path/to/B

执行后,Unison会扫描两个目录,并逐一询问如何处理每个差异。

自动模式(跳过非冲突确认)

1
unison -auto /path/to/A/ /path/to/B/
  • 作用:自动接受所有非冲突的变更(新增、更新、删除)
  • 冲突:仍然会停下等待用户选择

完全静默模式(适合脚本/写明任务)

1
unison -batch /path/to/A/ /path/to/B/
  • 作用:不问任何问题
  • 冲突时:直接跳过,不做任何处理
  • 注意:冲突会导致目录不一致,需配合-prefer newer使用

冲突处理机制

模式 冲突处理方式 适用场景
默认(交互) 停下来询问用户选择 重要数据,需要人工判断
-auto 停下来询问 同上
-batch 直接跳过,不处理 不适合,除非配合-prefer
-batch -prefer newer 自动选择修改时间更新的版本 日志、缓存等可自动决策的数据
-batch -prefer A 始终以A为准覆盖B 有明确主次的同步