<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/scripts/pretty-feed-v3.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:h="http://www.w3.org/TR/html4/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Moningf&apos;s Blog</title><description>You Only Live Once</description><link>https://moningf.top</link><item><title>cp、scp 与 rsync 对目录末尾 / 的处理差异</title><link>https://moningf.top/blog/2026/linux/command</link><guid isPermaLink="true">https://moningf.top/blog/2026/linux/command</guid><description>梳理 GNU/BSD cp、scp 与 rsync 在复制目录时对源路径末尾斜杠的不同处理策略。</description><pubDate>Fri, 12 Jun 2026 11:11:03 GMT</pubDate><content:encoded>&lt;p&gt;在 Linux 和 macOS 上，&lt;code&gt;cp&lt;/code&gt; 命令的行为并不完全相同。再加上常用的远程拷贝工具 &lt;code&gt;scp&lt;/code&gt; 和 &lt;code&gt;rsync&lt;/code&gt;，它们对源目录末尾是否带 &lt;code&gt;/&lt;/code&gt; 的处理策略也各有差异。本文梳理一下这些细节，避免在复制文件时踩坑。&lt;/p&gt;
&lt;h2&gt;cp 命令：GNU vs BSD&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;cp&lt;/code&gt; 命令大致分为两类实现：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;GNU 类&lt;/strong&gt;：常见于 Linux 发行版；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BSD 类&lt;/strong&gt;：常见于 macOS。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;两者在大部分场景下表现一致，但在复制目录时，对源目录末尾的 &lt;code&gt;/&lt;/code&gt; 有不同的理解。&lt;/p&gt;
&lt;h3&gt;普通文件或不存在目标目录时&lt;/h3&gt;
&lt;p&gt;如果源是文件，目标是一个新文件或不存在的目录，两者都默认直接覆盖（目标目录不存在时会报错）。行为一致。&lt;/p&gt;
&lt;h3&gt;复制目录时的差异&lt;/h3&gt;
&lt;p&gt;考虑如下命令：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cp source/ target/
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GNU cp（Linux）&lt;/strong&gt;：默认会在 &lt;code&gt;target&lt;/code&gt; 下再生成一层 &lt;code&gt;source&lt;/code&gt; 目录，结果路径为 &lt;code&gt;target/source/...&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BSD cp（macOS）&lt;/strong&gt;：会认为末尾的 &lt;code&gt;/&lt;/code&gt; 表示“用户只想复制该目录下的内容”，于是把 &lt;code&gt;source&lt;/code&gt; 内部的文件直接放入 &lt;code&gt;target&lt;/code&gt;，结果路径为 &lt;code&gt;target/...&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;也就是说，在 BSD 风格下，&lt;code&gt;/&lt;/code&gt; 起到了“拆包”目录的效果。&lt;/p&gt;
&lt;h3&gt;在 Linux 中模拟 BSD 行为&lt;/h3&gt;
&lt;p&gt;如果你习惯了 BSD 的行为，在 Linux 上可以通过以下方式达到类似效果：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cp source/. target/
# 或者
cp source/* target/
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;scp 与 rsync 的处理策略&lt;/h2&gt;
&lt;p&gt;有趣的是，&lt;code&gt;scp&lt;/code&gt; 和 &lt;code&gt;rsync&lt;/code&gt; 对 &lt;code&gt;/&lt;/code&gt; 的处理也不尽相同：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;scp&lt;/code&gt;&lt;/strong&gt;：与 &lt;strong&gt;GNU cp&lt;/strong&gt; 一致，会保留源目录层级；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;rsync&lt;/code&gt;&lt;/strong&gt;：与 &lt;strong&gt;BSD cp&lt;/strong&gt; 一致，会根据末尾是否带 &lt;code&gt;/&lt;/code&gt; 来决定是否“拆包”。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# scp：远程会生成 target/source/
scp -r source/ user@host:target/

# rsync：远程会把 source/ 下的内容直接放进 target/
rsync -av source/ user@host:target/
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;我的理解&lt;/h2&gt;
&lt;p&gt;GNU 系的风格更“稳健”：复制目录就带上目录名，语义明确，不容易误操作, 更适合写 shell 脚本。&lt;/p&gt;
&lt;p&gt;BSD 系则更“细节控”：用末尾的 &lt;code&gt;/&lt;/code&gt; 来区分“复制整个目录”还是“只复制目录内容”，灵活性更高，但也更容易在跨平台时踩坑。&lt;/p&gt;
&lt;h2&gt;小结&lt;/h2&gt;
&lt;p&gt;| 工具              | 末尾带 &lt;code&gt;/&lt;/code&gt; 时的行为             | 风格归属 |
| ----------------- | ------------------------------- | -------- |
| GNU cp / Linux cp | 保留 &lt;code&gt;source&lt;/code&gt; 目录层级          | GNU      |
| BSD cp / macOS cp | 将 &lt;code&gt;source&lt;/code&gt; 下内容放入 &lt;code&gt;target&lt;/code&gt; | BSD      |
| scp               | 保留 &lt;code&gt;source&lt;/code&gt; 目录层级          | GNU      |
| rsync             | 将 &lt;code&gt;source&lt;/code&gt; 下内容放入 &lt;code&gt;target&lt;/code&gt; | BSD      |&lt;/p&gt;
&lt;p&gt;在跨平台或混用这些命令时，建议养成明确写 &lt;code&gt;/&lt;/code&gt; 或测试目标路径的习惯，避免因实现差异导致文件位置不对。&lt;/p&gt;</content:encoded><h:img src="/_astro/feature.Cyn9nv6k.webp"/><enclosure url="/_astro/feature.Cyn9nv6k.webp"/></item><item><title>Linux 下配置 OCS 网课助手</title><link>https://moningf.top/blog/2026/ocs</link><guid isPermaLink="true">https://moningf.top/blog/2026/ocs</guid><description>记录 Linux 环境下配置 OCS 网课助手的过程，包括 Arch Linux 与 Debian 系发行版的安装方式。</description><pubDate>Tue, 28 Apr 2026 06:46:50 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;最近在 Linux 桌面环境下尝试运行 OCS 网课助手时，发现官方教程主要面向普通桌面用户，对 Linux 下不同浏览器路径、扩展权限、脚本管理器兼容性等问题没有展开说明。&lt;/p&gt;
&lt;p&gt;因此，这篇文章主要记录我在 Linux 环境下配置 OCS 网课助手的过程，重点放在安装、路径配置和发行版差异上。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;声明：本文仅记录 Linux 环境下配置浏览器脚本运行环境的过程，不提供绕过课程平台规则、自动完成课程任务或规避学习要求的指导。使用相关工具前，请确认符合所在学校、课程平台与课程教师的规定。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;一、OCS 是什么？&lt;/h2&gt;
&lt;p&gt;OCS，全称 Online Course Script，是一个运行在浏览器脚本管理器中的网课辅助脚本。根据官方说明，它可以通过脚本猫、油猴等脚本管理器运行，并支持多个网课平台。&lt;/p&gt;
&lt;p&gt;本文不展开具体课程平台的使用流程，只关注 Linux 环境下如何使用。&lt;/p&gt;
&lt;p&gt;项目仓库：&lt;a href=&quot;https://github.com/ocsjs/ocsjs&quot;&gt;ocsjs/ocsjs&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;二、如何使用？&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;[!note]使用前须知
需要在设置里将浏览器路径设置为 &lt;code&gt;/opt/ocs-desktop/resources/bin/chrome/chrome/chrome&lt;/code&gt; 才能正常使用。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Arch Linux&lt;/h3&gt;
&lt;p&gt;在这里非常感谢 &lt;a href=&quot;https://github.com/syhanjin&quot;&gt;syhanjin&lt;/a&gt;，打包了 aur 包 &lt;a href=&quot;https://aur.archlinux.org/packages/ocs-desktop-bin&quot;&gt;ocs-desktop-bin&lt;/a&gt;。
当时也是困惑了我很久，最后在 &lt;a href=&quot;https://github.com/ocsjs/ocs-desktop/issues/57&quot;&gt;Issue&lt;/a&gt; 中发现这个包, 目前还可以正常使用。&lt;/p&gt;
&lt;p&gt;通过下面命令安装即可&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;yay -S ocs-desktop-bin
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Debian 系&lt;/h3&gt;
&lt;p&gt;根据 AUR 包中的安装逻辑，我整理了一个 Debian 系发行版可用的配置脚本。该脚本主要用于下载并放置 OCS Desktop 所需文件，同时创建必要的启动入口。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;目前只在我自己的环境中测试过，使用前建议先阅读脚本内容。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 赋予 setup_ocs.sh 有运行权限
chmod +x setup_ocs.sh
# 运行
./setup_ocs.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;/scripts/setup_ocs.sh&quot;&gt;下载脚本文件&lt;/a&gt;&lt;/p&gt;</content:encoded><h:img src="/_astro/feature.C6wRR_IH.png"/><enclosure url="/_astro/feature.C6wRR_IH.png"/></item><item><title>修复 OpenCode 在 tmux 中的滚动问题</title><link>https://moningf.top/blog/2026/opencode/tmux_fix</link><guid isPermaLink="true">https://moningf.top/blog/2026/opencode/tmux_fix</guid><description>通过调整 tmux 鼠标滚轮绑定，修复 OpenCode 中无法正常上下滚动的问题。</description><pubDate>Sat, 14 Mar 2026 13:26:06 GMT</pubDate><content:encoded>&lt;p&gt;问题出现原因：
在 Tmux 中上下移动会进入 Vi 模式，在此模式下，它是将整个页面当成 vi 的一个 buffer 对待，因此可以通过设置发送的信息解决，通过 Ai 有如下配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;bind -n WheelUpPane if-shell -F -t = &quot;#{==:#{pane_current_command},opencode}&quot; \
    &quot;send-keys PgUp&quot; \
    &quot;if-shell -F -t = &apos;#{alternate_on}&apos; \
        &apos;send-keys -M&apos; \
        &apos;select-pane -t =; copy-mode -e; send-keys -M&apos;&quot;

bind -n WheelDownPane if-shell -F -t = &quot;#{==:#{pane_current_command},opencode}&quot; \
    &quot;send-keys PgDn&quot; \
    &quot;if-shell -F -t = &apos;#{alternate_on}&apos; \
        &apos;send-keys -M&apos; \
        &apos;select-pane -t =; send-keys -M&apos;&quot;
&lt;/code&gt;&lt;/pre&gt;</content:encoded><h:img src="/_astro/feature.GFaXyVdK.png"/><enclosure url="/_astro/feature.GFaXyVdK.png"/></item><item><title>B 站换绑实名信息记录</title><link>https://moningf.top/blog/2026/bilibili/authentication</link><guid isPermaLink="true">https://moningf.top/blog/2026/bilibili/authentication</guid><description>记录通过账号注销冷静期处理 B 站实名信息换绑的个人经历与注意事项。</description><pubDate>Mon, 16 Feb 2026 13:09:45 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;B 站不支持直接换绑，于是有了这篇文章。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我准备把账号的实名信息切换到新的账号上，发现无法直接换绑&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://moningf.top/_vercel/image?url=_astro%2Fimage1.lRIn8uDW.jpg&amp;#x26;w=1200&amp;#x26;q=100&quot; alt=&quot;B 站账号实名信息页面&quot;&gt;&lt;/p&gt;
&lt;h2&gt;注销后才能换绑？&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://moningf.top/_vercel/image?url=_astro%2Fimage2.BDLbiucv.png&amp;#x26;w=640&amp;#x26;q=100&quot; alt=&quot;B 站账号注销页面&quot;&gt;
直接发动鬼脑，如果先注销，马上换绑，再取消注销不就可以了&lt;/p&gt;
&lt;p&gt;对，没错，就是这么简单直白。
注销之后有三天冷静期，在这期间重新登录就可以取消注销了&lt;/p&gt;
&lt;p&gt;贴一下 &lt;a href=&quot;https://www.zhihu.com/question/326474707&quot;&gt;知乎的问题&lt;/a&gt; 除了换绑，里面可能有一些你想要的答案。&lt;/p&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>B 站 OBS 直播方法</title><link>https://moningf.top/blog/2026/bilibili/obs</link><guid isPermaLink="true">https://moningf.top/blog/2026/bilibili/obs</guid><description>记录通过浏览器用户脚本在 B 站网页端使用 OBS 开播的配置过程。</description><pubDate>Mon, 16 Feb 2026 11:14:07 GMT</pubDate><content:encoded>&lt;p&gt;通过油猴脚本在网页端直接开播&lt;/p&gt;
&lt;h2&gt;第一步：下载浏览器插件&lt;/h2&gt;
&lt;p&gt;浏览器插件 Tampermonkey ：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.tampermonkey.net/&quot;&gt;Tampermonkey&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第二步：下载用户脚本&lt;/h2&gt;
&lt;p&gt;所需脚本的源码仓库为 &lt;a href=&quot;https://github.com/ProgramRipper/BLiveWeb&quot;&gt;ProgramRipper/BLiveWeb&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ghfast.top/https://raw.githubusercontent.com/ProgramRipper/BLiveWeb/refs/heads/master/lib/index.user.js&quot;&gt;下载用户脚本&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;第三步：直播&lt;/h2&gt;
&lt;p&gt;下载好插件之后就可以在B站网页端正常开播，5000粉丝限制目前没有影响。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://moningf.top/_vercel/image?url=_astro%2Fimage.Dee7hB5f.png&amp;#x26;w=1200&amp;#x26;q=100&quot; alt=&quot;B 站网页端直播界面&quot;&gt;&lt;/p&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>Hugo 博客折腾记录</title><link>https://moningf.top/blog/2026/hugo-blog</link><guid isPermaLink="true">https://moningf.top/blog/2026/hugo-blog</guid><description>记录 Hugo 的安装、站点初始化、内容发布，以及 Blowfish 主题的基础配置。</description><pubDate>Sat, 14 Feb 2026 05:37:12 GMT</pubDate><content:encoded>&lt;h2&gt;Hugo 安装与使用&lt;/h2&gt;
&lt;h3&gt;安装 Hugo&lt;/h3&gt;
&lt;p&gt;先决条件：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Git
&lt;ul&gt;
&lt;li&gt;使用[Hugo Modules] 功能&lt;/li&gt;
&lt;li&gt;将主题作为Git子模块安装&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Go&lt;/li&gt;
&lt;li&gt;Dart Sass
&lt;ul&gt;
&lt;li&gt;使用最新的Sass语言特性时被用于将Sass转换为CSS&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;安装：&lt;/p&gt;
&lt;h4&gt;Arch Linux&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo pacman -S hugo
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;macOS&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;brew install hugo
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Ubuntu&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo snap install hugo
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;快速起步&lt;/h3&gt;
&lt;p&gt;创建目录&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;# 创建站点
hugo new site blog
# 进入目录
cd blog
# Git仓库初始化
git init
# 将主题以 Git 子模块的形式加入
git submodule add https://github.com/theNewDynamic/gohugo-theme-ananke.git themes/anank
# 在配置文件中加入主题配置
echo &quot;theme = &apos;ananke&apos;&quot; &gt;&gt; hugo.toml
# 启动 Hugo 开发服务器
hugo server
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;添加内容&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;# 在 content/posts 文件夹内创建文件
hugo new content/posts/my-first-post.md
# 启动 Hugo 开发服务器（-D 表示显示草稿）
hugo server --buildDrafts
hugo server -D
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置 Hugo&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;baseURL = &apos;https://example.org/&apos;
languageCode = &apos;en-us&apos;
title = &apos;我的新 Hugo 网站&apos;
theme = &apos;ananke&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;为您的生产网站设置 &lt;code&gt;baseURL&lt;/code&gt;。该值必须以协议开头，并以斜杠结尾，如上所示。&lt;/li&gt;
&lt;li&gt;将 &lt;code&gt;languageCode&lt;/code&gt; 设置为您的语言和地区。&lt;/li&gt;
&lt;li&gt;为您的生产网站设置 &lt;code&gt;title&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;启动 Hugo 的开发服务器以查看更改，记得包含草稿内容。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;hugo server -D
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;发布网站&lt;/h3&gt;
&lt;p&gt;发布”网站时，Hugo 会在项目根目录的 &lt;code&gt;public&lt;/code&gt; 目录中创建整个静态网站。其中包括 HTML 文件和像图像、CSS 文件和 JavaScript 文件这样的资源。&lt;/p&gt;
&lt;p&gt;当您发布网站时，通常不希望包含[草稿、将来或过期内容]。命令很简单。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;hugo
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;主题配置&lt;/h2&gt;
&lt;p&gt;我使用的主题是 BlowFish 。&lt;/p&gt;
&lt;h3&gt;基础配置&lt;/h3&gt;
&lt;p&gt;首先，将主题内&lt;code&gt;themes/blowfish/config/_default/&lt;/code&gt;文件夹内的文件复制到&lt;code&gt;config/_default/&lt;/code&gt;文件夹内&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;config
└── _default
    ├── hugo.toml              --核心与基础配置
    ├── languages.zh-CN.toml   --语言与作者信息
    ├── menus.zh-CN.toml       --中文版网站的导航菜单
    ├── markup.toml            --控制 Markdown 如何转换成 HTML
    ├── module.toml            --用于 Hugo Modules（Go 模块）的配置
    └── params.toml            --Blowfish 主题特有的外观和功能配置
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;为什么这样分类？&lt;/strong&gt;
这种分类方式对应 Hugo 配置中的&lt;em&gt;根键 (Root Keys)&lt;/em&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;params.toml 里的内容等同于在主文件中写 [params]。&lt;/li&gt;
&lt;li&gt;markup.toml 里的内容等同于写 [markup]。&lt;/li&gt;
&lt;li&gt;languages.zh-CN.toml 等同于 [languages.zh-CN]。&lt;/li&gt;
&lt;/ul&gt;</content:encoded><h:img src="/_astro/feature.gIWQb_jI.webp"/><enclosure url="/_astro/feature.gIWQb_jI.webp"/></item><item><title>Neovim 运行与配置加载机制简析</title><link>https://moningf.top/blog/2026/neovim</link><guid isPermaLink="true">https://moningf.top/blog/2026/neovim</guid><description>梳理 Neovim 的启动流程、Lua 模块、after 目录、插件加载机制与常用配置 API。</description><pubDate>Wed, 28 Jan 2026 06:32:56 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;在我学习 Neovim 的过程中，逐渐对它的启动流程和配置加载机制有了一些理解，分享一下共大家阅读。
如有理解不对的，欢迎在评论区指正&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;一、Neovim 配置加载结构&lt;/h2&gt;
&lt;p&gt;常见的 Neovim 配置目录结构如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.config/nvim/
├── init.lua                  # Neovim 启动入口
├── lua/
│   ├── config/               # 核心配置
│   │   ├── options.lua       # vim.opt / vim.o
│   │   ├── keymaps.lua       # 快捷键
│   │   ├── autocmds.lua      # 自动命令
│   │   └── lazy.lua          # Lazy.nvim 插件管理器
│   │
│   └── plugins/              # 插件配置
│       ├── ui.lua            # UI 类插件
│       ├── lsp.lua           # LSP / mason
│       ├── cmp.lua           # 自动补全
│       ├── treesitter.lua    # 语法高亮
│       └── init.lua          # 插件入口
│
└── after/                    # 启动后加载
    └── ftplugin/
        └── python.lua
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;二、Neovim 启动时做了什么？&lt;/h2&gt;
&lt;h3&gt;init.lua：启动入口&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;init.lua&lt;/code&gt; 是 Neovim &lt;strong&gt;默认且唯一的启动入口&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;启动后，Neovim 会自动加载：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;~/.config/nvim/init.lua
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在 &lt;code&gt;init.lua&lt;/code&gt; 中写的任何 Lua 代码都会&lt;strong&gt;立即执行&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;lua/ 目录与模块机制&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;lua/&lt;/code&gt; 目录 &lt;strong&gt;本身并不是 runtimepath 的一项&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;但它是 &lt;strong&gt;runtimepath 中目录的子目录&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Neovim 在 &lt;code&gt;require()&lt;/code&gt; 时，会自动在所有 &lt;code&gt;runtimepath/lua/&lt;/code&gt; 下查找模块&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;require(&quot;config.options&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Neovim 实际查找的是：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;~/.config/nvim/lua/config/options.lua
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以通过下面命令查看当前 runtimepath：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-vim&quot;&gt;:set rtp?
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3&gt;after/ 目录的作用&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;after/&lt;/code&gt; 目录用于&lt;strong&gt;覆盖或补充已有配置&lt;/strong&gt;，加载顺序在最后：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在所有 &lt;code&gt;runtimepath&lt;/code&gt; 加载完成后&lt;/li&gt;
&lt;li&gt;自动加载 &lt;code&gt;after/&lt;/code&gt; 目录中的内容&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;三、配置拆分与加载方式&lt;/h2&gt;
&lt;p&gt;在 &lt;code&gt;init.lua&lt;/code&gt; 中，通常只保留最少逻辑：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;require(&quot;config.options&quot;)
require(&quot;config.keymaps&quot;)
require(&quot;config.autocmds&quot;)
require(&quot;config.lazy&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h2&gt;四、插件是如何被加载的？（以 Lazy.nvim 为例）&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;lazy.nvim&lt;/code&gt; 的核心职责是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;自动下载插件&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;将插件路径加入 runtimepath&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;控制插件加载时机（懒加载）&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;require(&quot;lazy&quot;).setup({
  { &quot;nvim-treesitter/nvim-treesitter&quot;, event = &quot;BufReadPost&quot; },
  { &quot;neovim/nvim-lspconfig&quot;, ft = &quot;lua&quot; },
})
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当插件被加载后：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;插件目录会被加入 &lt;code&gt;rtp&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;插件中的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;plugin/*.lua&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lua/*.lua&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;after/*.lua&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;都会按规则参与加载&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;五、Neovim Lua API 简介&lt;/h2&gt;
&lt;p&gt;Neovim 提供了一套完整的底层 API：&lt;/p&gt;
&lt;p&gt;官方文档&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;API 文档：&lt;a href=&quot;https://neovim.io/doc/user/api.html#api&quot;&gt;https://neovim.io/doc/user/api.html#api&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;底层 API 调用方式类似：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;vim.api.nvim_set_keymap(...)
vim.api.nvim_buf_set_lines(...)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3&gt;更推荐的 Lua 高级接口&lt;/h3&gt;
&lt;p&gt;由于底层 API 较为繁琐，Neovim 提供了更友好的 Lua 封装：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;vim.o&lt;/code&gt; / &lt;code&gt;vim.opt&lt;/code&gt;：设置选项&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vim.fn&lt;/code&gt;：调用 Vimscript 函数&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vim.cmd()&lt;/code&gt;：执行 Vim 命令&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vim.keymap.set()&lt;/code&gt;：设置快捷键&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-lua&quot;&gt;vim.opt.number = true
vim.keymap.set(&quot;n&quot;, &quot;&amp;#x3C;leader&gt;w&quot;, &quot;:w&amp;#x3C;CR&gt;&quot;)
# 如果不用vim.o的话,下面的方式过于繁琐
-- 如果不用 vim.o，下面的方式会更繁琐
vim.api.nvim_set_option_value(&apos;number&apos;, true, {})
vim.api.nvim_set_keymap(
  &quot;n&quot;,
  &quot;&amp;#x3C;leader&gt;w&quot;,
  &quot;:w&amp;#x3C;CR&gt;&quot;,
  { noremap = true, silent = true }
)
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;因此，在 Neovim 配置中，更推荐优先使用 Lua API&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;六、小技巧&lt;/h2&gt;
&lt;h3&gt;查看和设置选项&lt;/h3&gt;
&lt;p&gt;是一个非常友好的选项浏览界面,方便配置option&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-vim&quot;&gt;:options
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;</content:encoded><h:img src="/_astro/featured0.BHuKLv5C.png"/><enclosure url="/_astro/featured0.BHuKLv5C.png"/></item><item><title>Cookie、Session 与 JWT：发展与用途</title><link>https://moningf.top/blog/2026/loginauthentication</link><guid isPermaLink="true">https://moningf.top/blog/2026/loginauthentication</guid><description>从 HTTP 无状态问题出发，梳理 Cookie、Session 与 JWT 的工作方式、优缺点和常见组合。</description><pubDate>Sat, 27 Dec 2025 02:50:39 GMT</pubDate><content:encoded>&lt;h2&gt;一、问题背景：HTTP 无状态&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;HTTP 天生无状态：服务器无法区分多次请求是否来自同一用户&lt;/li&gt;
&lt;li&gt;实际需求：登录态、购物车、个性化设置&lt;/li&gt;
&lt;li&gt;解决思路：&lt;strong&gt;在多次请求之间携带或保存“状态”&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;二、Cookie（第一代方案）&lt;/h2&gt;
&lt;h3&gt;1. 出现背景&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;1994 年 Netscape 提出&lt;/li&gt;
&lt;li&gt;目标：让浏览器在多次请求中携带少量信息&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 本质&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;存储位置：&lt;strong&gt;客户端（浏览器）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;形式：键值对（key=value）&lt;/li&gt;
&lt;li&gt;浏览器会自动保存、自动携带&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. 典型用途&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;用户偏好（主题、语言）&lt;/li&gt;
&lt;li&gt;会话标识（如 sessionId）&lt;/li&gt;
&lt;li&gt;访问统计&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;4. 优缺点&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;简单&lt;/li&gt;
&lt;li&gt;浏览器原生支持&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;缺点&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数据在客户端，可被查看和篡改&lt;/li&gt;
&lt;li&gt;不适合存敏感信息&lt;/li&gt;
&lt;li&gt;单个 Cookie 大小有限（约 4KB）&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;结论：&lt;strong&gt;Cookie 本身不适合作为“可信身份存储”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2&gt;三、Session（第二代方案）&lt;/h2&gt;
&lt;h3&gt;1. 出现背景&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;为解决 Cookie 不安全的问题&lt;/li&gt;
&lt;li&gt;目标：状态由服务器统一管理&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 核心思想&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;用户状态存在服务器&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;客户端只保存一个 sessionId（通常通过 Cookie）&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;浏览器：JSESSIONID=ABC123
服务器：ABC123 → 用户信息
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 工作流程&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;用户登录&lt;/li&gt;
&lt;li&gt;服务器创建 Session&lt;/li&gt;
&lt;li&gt;生成 sessionId&lt;/li&gt;
&lt;li&gt;通过 Cookie 返回给浏览器&lt;/li&gt;
&lt;li&gt;后续请求自动携带 sessionId&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;4. 典型用途&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;传统 Web 网站&lt;/li&gt;
&lt;li&gt;后台管理系统&lt;/li&gt;
&lt;li&gt;企业内部系统&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5. 优缺点&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;安全性高（敏感数据在服务器）&lt;/li&gt;
&lt;li&gt;可主动失效、强制下线&lt;/li&gt;
&lt;li&gt;逻辑清晰，易理解&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;缺点&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;服务器有状态&lt;/li&gt;
&lt;li&gt;集群需要 Session 共享（如 Redis）&lt;/li&gt;
&lt;li&gt;扩展成本较高&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;四、Session 的瓶颈（Web 形态变化）&lt;/h2&gt;
&lt;h3&gt;1. 新变化&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;用户规模扩大&lt;/li&gt;
&lt;li&gt;服务器集群化&lt;/li&gt;
&lt;li&gt;前后端分离、移动端兴起&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 暴露的问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;负载均衡下 Session 不一致&lt;/li&gt;
&lt;li&gt;Session 粘性或共享增加复杂度&lt;/li&gt;
&lt;li&gt;不适合纯 API / 微服务场景&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;五、JWT（第三代方案）&lt;/h2&gt;
&lt;h3&gt;1. 出现背景&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;前后端分离&lt;/li&gt;
&lt;li&gt;REST API&lt;/li&gt;
&lt;li&gt;微服务架构&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 核心思想&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;服务器不存用户状态&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;用户每次请求都携带“自包含凭证”&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;从“服务器记住你” → “你自己证明你是谁”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;3. JWT 结构&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Header：算法、类型&lt;/li&gt;
&lt;li&gt;Payload：用户信息、过期时间（Base64 编码）&lt;/li&gt;
&lt;li&gt;Signature：防篡改签名&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Header.Payload.Signature
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. 使用方式&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;登录成功后返回 JWT&lt;/li&gt;
&lt;li&gt;客户端保存（localStorage / Cookie）&lt;/li&gt;
&lt;li&gt;请求时放入 Header&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;Authorization: Bearer &amp;#x3C;token&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;5. 优缺点&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;优点&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;服务器无状态&lt;/li&gt;
&lt;li&gt;天然支持集群、微服务&lt;/li&gt;
&lt;li&gt;适合 API、移动端&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;缺点&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;无法主动失效（只能等过期）&lt;/li&gt;
&lt;li&gt;泄露风险高（必须 HTTPS）&lt;/li&gt;
&lt;li&gt;Payload 不可存敏感信息&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;六、三者对比总结&lt;/h2&gt;
&lt;p&gt;| 维度       | Cookie | Session  | JWT          |
| ---------- | ------ | -------- | ------------ |
| 存储位置   | 客户端 | 服务器   | 客户端       |
| 是否有状态 | 否     | 是       | 否           |
| 安全性     | 低     | 高       | 中           |
| 扩展性     | 高     | 低       | 高           |
| 主动失效   | 否     | 是       | 否           |
| 适用场景   | 辅助   | 传统 Web | API / 微服务 |&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;七、现实中的组合使用&lt;/h2&gt;
&lt;h3&gt;1. Cookie + Session（经典）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;服务端渲染页面&lt;/li&gt;
&lt;li&gt;Java Web / JSP / Thymeleaf&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. JWT + Header（主流）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;前后端分离&lt;/li&gt;
&lt;li&gt;REST API&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. JWT + Refresh Token（常见折中）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;短期 JWT&lt;/li&gt;
&lt;li&gt;长期 Refresh Token 存 Redis / Session&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;八、核心理解&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cookie&lt;/strong&gt;：传递信息的载体&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Session&lt;/strong&gt;：服务器集中管理状态&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JWT&lt;/strong&gt;：客户端自带凭证，服务器只校验&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;三者不是简单的新旧替代，而是不同 Web 时代下的最优解&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded><h:img src="/_astro/featured.aA2F-E0G.png"/><enclosure url="/_astro/featured.aA2F-E0G.png"/></item><item><title>Niri + Noctalia：在 Arch Linux 上搭建桌面环境</title><link>https://moningf.top/blog/2026/linux/niri</link><guid isPermaLink="true">https://moningf.top/blog/2026/linux/niri</guid><description>记录在 Arch Linux 上安装和配置 Niri、Noctalia、输入法与 NVIDIA 环境的过程。</description><pubDate>Fri, 26 Dec 2025 02:12:46 GMT</pubDate><content:encoded>&lt;p&gt;首先,我们要知道: niri作为一个窗口管理器, 是没有完整的桌面环境, 因此需要自己额外配置, 目前有两种主流的方式:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一种是用户自己配置所有所需部件(比如: waybar rofi dunst之类的)&lt;/li&gt;
&lt;li&gt;另一种则是直接使用别人写好的quickshell,实现开箱即用的效果(也是在niri官方&lt;a href=&quot;https://github.com/YaLTeR/niri/wiki/Getting-Started&quot;&gt;快速入门文档&lt;/a&gt;中所推荐的)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;安装&lt;/h2&gt;
&lt;p&gt;这里我们采用的是第二种&lt;a href=&quot;https://github.com/noctalia-dev/noctalia-shell&quot;&gt;noctalia&lt;/a&gt;(和niri推荐的&lt;a href=&quot;https://github.com/AvengeMedia/DankMaterialShell&quot;&gt;dms&lt;/a&gt;类似)
如果你是arch的话,直接运行以下命令即可安装&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;sudo pacman -Syu niri xwayland-satellite xdg-desktop-portal-gnome xdg-desktop-portal-gtk alacritty
yay -S noctalia-shell
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此外,我习惯使用的一些软件如下:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;yay -S kitty timeshift hyprlock swayidle polkit-gnome fcitx5-im fcitx5-chinese-addons
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;kitty 和alacritty类似的终端模拟器&lt;/li&gt;
&lt;li&gt;timeshift 一个系统备份和回溯工具&lt;/li&gt;
&lt;li&gt;hyprlock hyprland下的锁屏软件&lt;/li&gt;
&lt;li&gt;swayidle 用于检测系统长时间操作实现自动休眠等功能&lt;/li&gt;
&lt;li&gt;polkit-gnome 用于身份认证&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;启动&lt;/h2&gt;
&lt;p&gt;在终端下输入&lt;code&gt;niri-session&lt;/code&gt;简单体验一下niri吧~&lt;/p&gt;
&lt;h2&gt;配置 Niri&lt;/h2&gt;
&lt;p&gt;niri的配置文件默认在$HOME目录的.config/niri下,使用的是&lt;a href=&quot;https://kdl.dev/&quot;&gt;kdl语法&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;我习惯使用kitty, 所以进入niri配置文件, 将alacritty修改成kitty&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-vim&quot;&gt;- Mod+Return hotkey-overlay-title=&quot;Open a Terminal: alacritty&quot; { spawn &quot;alacritty&quot;; }
+ Mod+Return hotkey-overlay-title=&quot;Open a Terminal: kitty&quot; { spawn &quot;kitty&quot;; }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置一下niri的开机启动,将下面代码加入niri配置文件中&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-vim&quot;&gt;spawn-at-startup &quot;fcitx5&quot;
spawn-at-startup &quot;/usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1&quot;
spawn-sh-at-startup &quot;qs -c noctalia-shell&quot;
spawn-sh-at-startup &quot;/usr/bin/swayidle -w timeout 601 &apos;niri msg action power-off-monitors&apos; timeout 600 &apos;hyprlock&apos; before-sleep &apos;hyprlock&apos;&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在该配置中,有两点需要注意一下:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;因为n卡的原因,我没有配置长时间自动休眠,如有需要,自行去修改一下swayidle的配置&lt;/li&gt;
&lt;li&gt;hyprlock的锁屏需要自己配置一下&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;配置 Niri 开机自启动&lt;/h2&gt;
&lt;p&gt;我这里使用的是greetd,使用 &lt;code&gt;sudo pacman -S greetd&lt;/code&gt; 安装即可
然后配置一下greetd的配置文件 &lt;code&gt;/etc/greetd/config.toml&lt;/code&gt; 将最后一行的username换成你自己的名字即可&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[terminal]
vt = 1

[default_session]
command = &quot;niri-session&quot;

user = &quot;username&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;greetd的开机自启动&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-shell&quot;&gt;sudo systemctl enable greetd
sudo systemctl disable getty@tty1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在重启就可以体验你全新的 niri 了&lt;/p&gt;
&lt;h2&gt;FAQ&lt;/h2&gt;
&lt;h3&gt;N 卡用户的 Niri 内存占用过高&lt;/h3&gt;
&lt;p&gt;在&lt;code&gt;/etc/nvidia/nvidia-application-profiles-rc.d/50-limit-free-buffer-pool-in-wayland-compositors.json&lt;/code&gt;文件内写入一下内容:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-vim&quot;&gt;{
    &quot;rules&quot;: [
        {
            &quot;pattern&quot;: {
                &quot;feature&quot;: &quot;procname&quot;,
                &quot;matches&quot;: &quot;niri&quot;
            },
            &quot;profile&quot;: &quot;Limit Free Buffer Pool On Wayland Compositors&quot;
        }
    ],
    &quot;profiles&quot;: [
        {
            &quot;name&quot;: &quot;Limit Free Buffer Pool On Wayland Compositors&quot;,
            &quot;settings&quot;: [
                {
                    &quot;key&quot;: &quot;GLVidHeapReuseRatio&quot;,
                    &quot;value&quot;: 0
                }
            ]
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;具体参考niri的&lt;a href=&quot;https://github.com/YaLTeR/niri/wiki/Getting-Started#nvidia&quot;&gt;官方文档&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Noctalia 图标显示异常&lt;/h3&gt;
&lt;p&gt;参考noctalia&lt;a href=&quot;https://docs.noctalia.dev/getting-started/faq/#configuration&quot;&gt;官方文档&lt;/a&gt;
配置 &lt;code&gt;/etc/environment&lt;/code&gt; 文件 ,加入下面一行即可&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-vim&quot;&gt;QT_QPA_PLATFORMTHEME=gtk3
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Fcitx5 输入法问题&lt;/h3&gt;
&lt;p&gt;同样配置 &lt;code&gt;/etc/environment&lt;/code&gt; 文件&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-vim&quot;&gt;# X11或XWayland窗口需要
XMODIFIERS=@im=fcitx
# Qt窗口需要
QT_IM_MODULE=fcitx
&lt;/code&gt;&lt;/pre&gt;</content:encoded><h:img src="/_astro/feature1.Dw_mFmdM.png"/><enclosure url="/_astro/feature1.Dw_mFmdM.png"/></item></channel></rss>