<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://qingliezhiquan.com/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mwroot</id>
	<title>清冽之泉 - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://qingliezhiquan.com/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Mwroot"/>
	<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/blog/Special:Contributions/Mwroot"/>
	<updated>2026-08-07T01:54:54Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=%E4%B8%8A%E4%B8%AA%E6%9C%88%E6%88%91%E5%B9%B2%E4%BA%86%E4%BB%80%E4%B9%88_2026&amp;diff=11572</id>
		<title>上个月我干了什么 2026</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=%E4%B8%8A%E4%B8%AA%E6%9C%88%E6%88%91%E5%B9%B2%E4%BA%86%E4%BB%80%E4%B9%88_2026&amp;diff=11572"/>
		<updated>2026-08-06T16:37:26Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: /* 202608 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;向前看。&lt;br /&gt;
__TOC__&lt;br /&gt;
== 202601 ==&lt;br /&gt;
# 头发变茂密了，发型变帅了&lt;br /&gt;
# 隐约感到肌肉在长了&lt;br /&gt;
# 现在又掌握倒立了&lt;br /&gt;
# 写了份非常有逻辑的代理词&lt;br /&gt;
# 洗了鞋子&lt;br /&gt;
# 拖了地&lt;br /&gt;
# 电脑屏幕老死了，换了个新的，挑到了不错的屏幕&lt;br /&gt;
# 网站流量用超，关站了一天。感觉不太正常，按说我的网站的用户数，不至于能用完这么多流量。找机会排查看是否有人盗刷&lt;br /&gt;
# 看完了《怪奇物语》第四季、第五季&lt;br /&gt;
# 排查出保洁阿姨出现时的巨大损伤型恶臭，是公司的超簿垃圾袋释放的，于是和她商量不用再给我换垃圾袋，自己买了不臭的自己换，一下子拿回了属于自己的时间、专注和健康&lt;br /&gt;
# 封禁了恶意 ip，拯救了我的流量费。[[怎样封禁恶意_ip，避免服务器产生巨额流量费]]&lt;br /&gt;
# 在看《毛骗》团队的新片《[https://qingliezhiquan.com/blog/%E6%B5%B7%E5%B8%82%E8%9C%83%E6%A5%BC%EF%BC%9A%E5%8F%A4%E8%A3%85%E7%BB%8F%E5%85%B8 海市蜃楼]》。“海市蜃楼”多美好的词！快意江湖，难得的江湖气，前三集很有感觉，不过有点像《王国》，后边别被我发现是模仿《王国》。笑死了，有个傻傻的，叫曾信（“真信”）；有个拽拽的，叫曾倩（“真欠”）&lt;br /&gt;
# 徒步了科学岛 3.43 公里，它并不是湖心岛，是半岛，北面与陆地相连。参观了科技馆&lt;br /&gt;
# 买了万用表，研究修电器&lt;br /&gt;
# 买了温湿度计，营造合适室内环境&lt;br /&gt;
# 买了瑜珈垫，在小屋腾出健身场所了&lt;br /&gt;
# 买了腰靠，座椅舒服很重要&lt;br /&gt;
# 买了体重称。长胖这么多还不自觉，必须减重了&lt;br /&gt;
# 写了篇 [[怎样高效地拿回报销款]]&lt;br /&gt;
# 今天四次倒立，之后差点摔了，又做了一次倒立。其实根本不怕摔，只要有预期，快摔时正确卸力，迅速起身把歪坠的惯性，转移成起身的力，就没事了&lt;br /&gt;
# 今年不感觉冷，可能和我穿衣有关：内层聚酯纤维短袖，二层纯棉长袖，三层无袖宽松毛衣，最外加厚皮衣。四层穿搭一点不冷。有时一件 T 恤，二层一件长袖，外加一件棉服大衣，也不冷。下雪天也不冷。可能健身有点效果了&lt;br /&gt;
# 精研了父母的体检报告，并提出了下一步执行策略&lt;br /&gt;
# 写了篇 [[怎样养护头发]]&lt;br /&gt;
# 写了篇 [[电脑屏幕坏了，怎么挑选优质的屏幕]]&lt;br /&gt;
# 有一种对 1 月完结的恐慌。三十未立，事业无成，未来该走哪条路……&lt;br /&gt;
&lt;br /&gt;
== 202602 ==&lt;br /&gt;
# 去了浮槎山，徒步 10.84 公里&lt;br /&gt;
# 惊觉父亲老了，没以前那么犟了&lt;br /&gt;
# 发现立春前后，天光大亮，春天已至，倒春寒要命&lt;br /&gt;
# 和隔壁大吵一架，现在她们弄脏洗手间地面终于知道顺手拖干净了&lt;br /&gt;
# 看了电影《黑鹰坠落》。反战片，没啥感觉。现代战争比剧中高效万倍，黑鹰不会坠落了&lt;br /&gt;
# 看了电影《大逃杀》。日本批着纯爱外衣的变态片。杀着是过瘾，没啥内涵&lt;br /&gt;
# 看完了古装剧《海市蜃楼》。越看越没劲。能搬山移海的外星人却没有智商&lt;br /&gt;
# 把律师的锅甩回去了，他给错了账号，让他自己去变更&lt;br /&gt;
# 主动屏蔽了所有文字媒体、视频媒体，至于社交媒体我压根儿就没有用过&lt;br /&gt;
# 写了篇 [[论躺平与负债]]&lt;br /&gt;
# 写了篇 [[创业是道数学题]]&lt;br /&gt;
# 写了篇 [[办理护照和港澳通行证的经验]]&lt;br /&gt;
# 第一次尝试戴隐形眼镜，tmd，试了十几次，几个小时，恁是戴不进去&lt;br /&gt;
# 看了电影《逃狱惊魂》，非常经典，每个角色都有真实的欲望，动力十足&lt;br /&gt;
# 看了邓紫棋的科幻新书《启示路》。完全超出预期。fashion，浪漫，有趣，略拧巴。邓紫棋比想象中有才一百倍&lt;br /&gt;
# 写了篇 [[怎样用 Calibre 调整 EPUB 的格式使之完美阅读]]&lt;br /&gt;
# 又到了听《天空的颜色》的时候了&lt;br /&gt;
# 通过最正规的渠道，开通了低手续费股票账户，为开港股账户做足了准备&lt;br /&gt;
# 看了电影《出租车司机》美版、韩版&lt;br /&gt;
# 写了篇 [[过年随记]]&lt;br /&gt;
# 例行串串已吃&lt;br /&gt;
# 例行米线已吃 1/2&lt;br /&gt;
# 例行面馆已吃&lt;br /&gt;
# 例行米线已吃 2/2&lt;br /&gt;
# 例行登山徒步 8.32 公里&lt;br /&gt;
# 第一次买了只股票&lt;br /&gt;
# 徒步 11.25 公里&lt;br /&gt;
# 徒步缙云山 7.10 公里&lt;br /&gt;
# 徒步胜天湖 9.02 公里&lt;br /&gt;
&lt;br /&gt;
== 202603 ==&lt;br /&gt;
# 考察了梁平，竟然搞西部预制菜之都，一票否决。双桂湖公园南边的山倒还挺美的&lt;br /&gt;
# 在万州考察，因为买不到返肥火车票，焦头烂额。忘记了撞上学生开学高峰期&lt;br /&gt;
# 万州太窄了。一条主干道通全城的感觉。一种施展不开的感觉。五六根冲天柱，晚上九点多，不知在排放什么烟气，不像是好东西&lt;br /&gt;
# 打网约车旅游了万州之巅，然后急行军到了万州北站高铁站，去了奉节&lt;br /&gt;
# 从奉节坐小红船沿江往巫山走，此时正在船上，水汽扑来。坐了 4 小时&lt;br /&gt;
# 吃了巫山烤鱼&lt;br /&gt;
# 早上 06:00 起床，赶回奉节，参加徒步三峡之巅挑战赛，8.31 公里 2 小时 37 分 51 秒登顶，成功拿到奖牌。去得晚，日第 62 位登顶。日竞速第 16 名。月竞速第 25 名&lt;br /&gt;
# [[File:徒步三峡之巅8.31公里.jpg|100px]][[File:徒步三峡之巅成功领奖.jpg|100px]]&lt;br /&gt;
# 晚上 18:57 夜爬巫山三峡龙脊，乌压压的山上只有我一人，徒步 4.32 公里。下山打车难，结果五分钟内来了一对情侣和他们的弟弟妹妹来夜爬终点看风景，免费把我带到山下了。姓柳&lt;br /&gt;
# 发现眼袋重和眼镜重关系不大。最主要是因为长年睡到八点起，憋尿导致的。若六七点就尿干净，一点眼袋都没了&lt;br /&gt;
# 考察了利川，感觉皱巴巴的，不如奉节、巫山那种干净、舒展的感觉&lt;br /&gt;
# 看了电影《猜火车》，垃圾，毫无内涵，披个青春片的皮，搞宣毒&lt;br /&gt;
# 写了篇 [[渝东游记：地理奇迹，人文情怀]]&lt;br /&gt;
# 把行李箱洗了。它跟了我这么多年了，不忍它脏兮兮的，或许只是我在乎它干净与否。它应该不能水洗，但我还是把它洗干净了。扛过去，它就能再干净几年。扛不过去，就是它的宿命&lt;br /&gt;
# 看了李小龙的电影《龙争虎斗》，李小龙的努力，超出了“信仰”的范畴了&lt;br /&gt;
# 带着行李箱在公园晒了几小时太阳，主要是为了晒干行李箱&lt;br /&gt;
# 研究出了把本站内容发布到微信公众号的较为自动化的方法&lt;br /&gt;
# 看了电影《聚焦》，三流叙事&lt;br /&gt;
# 洗干净所有厨具，规整了厨房，做了 2026 出租屋第一餐&lt;br /&gt;
# [[File:2026 出租屋第一餐.jpg|200px]]&lt;br /&gt;
# 周五宜吃排骨炖冬笋&lt;br /&gt;
# [[File:周五宜吃排骨炖冬笋.jpg|200px]]&lt;br /&gt;
# 看了电影《德州电锯杀人狂》，一群疯子&lt;br /&gt;
# 前几天本站搜索崩了，因为内存不够用。给服务器加了 Swap 空间，内存能支撑更大的负载了。搜索功能恢复&lt;br /&gt;
# 看了电影《千钧一发》，什么人能写出这种优秀的剧本。不遗余力&lt;br /&gt;
# 买了电饭煲、煮蛋器、洗袜机、体态矫正带、公园露营椅、螺蛳粉&lt;br /&gt;
# 徒步紫蓬山 6 公里。去之前以为它很高，很壮观。刚出发时，查了下地图，就知道它爬升只有 200 米。都没喘下气，刚热个身已经爬完了&lt;br /&gt;
# [[File:红烧猪蹄.jpg|200px]]&lt;br /&gt;
# 做了 10 个俯卧撑。惭愧，20 多岁时轻轻松松，30 多岁时人好像变重了一样，好在又找回感觉了&lt;br /&gt;
# 又做了 10 个俯卧撑，感觉真好&lt;br /&gt;
# 网站遭受攻击，下一轮防攻击策略开始实施。网友里面有坏人呐&lt;br /&gt;
# 护照和港澳通行证终于到手了&lt;br /&gt;
# 买了块新的 27 英寸显示器&lt;br /&gt;
# 做了 35 个俯卧撑，手掌开始有力量了。惯例倒立四次&lt;br /&gt;
# [[File:世界上有千千万万碗面.jpg|200px]]&lt;br /&gt;
# 看完了《绝命律师》第一季&lt;br /&gt;
&lt;br /&gt;
== 202604 ==&lt;br /&gt;
# 笑死了，网站防爆破期间，阈值写得低，经常把自己挡在网站之外封一天。赶紧把自己加进白名单&lt;br /&gt;
# 成功搞定一个困扰一周的难题，[https://qingliezhiquan.com/blog/%E4%B8%80%E6%AC%A1_Anki_%E7%99%BB%E5%BD%95%E4%B8%8D%E4%B8%8A%E7%9A%84%E6%89%BE_bug_%E7%BB%8F%E5%8E%86 找 bug 过程]堪称经典&lt;br /&gt;
# 发现自己某些方面还挺厉害的&lt;br /&gt;
# 我代理的一个案子，对方脆败。他的毛病在于，同样的事，重复了三遍，大段大段的用 AI 写的，书记员和法官根本不可能看明白他在表达啥。打官司重在证据清晰明确、语言简明扼要，不然起诉状或答辩状白写了&lt;br /&gt;
# 看完了《绝命律师》第二季。Jimmy 阴了他哥一把，他哥也阴了他一把。Jimmy 与 Kim 共享办公室，开始独立执业。被偏爱的 Jimmy，成佛只需放下屠刀&lt;br /&gt;
# 买了个高压锅（苏泊尔京东自营旗舰店，底直径 24 厘米，7.0L，食品级 304 不锈钢材质）。上气后 28 分钟，就把 2.9 kg 肘子炖到软烂脱骨，骨头都可以轻松嚼碎。解决了切肉洗菜板的麻烦。2.9 kg 太多了，下次控制在 2 kg 以内，上气后 20 分钟炖足够了&lt;br /&gt;
# 炖了一只三黄鸡、两斤鸡爪、两个鸡边腿、一斤鲜板栗。上气后 12 分钟就软烂脱骨了。下次炖鸡 10 分钟足够了&lt;br /&gt;
# 处理去香港玩的所有 [https://qingliezhiquan.com/blog/%E9%A6%99%E6%B8%AF%E6%B8%B8%E8%AE%B0%EF%BC%9A%E5%96%9C%E5%B8%96%E8%A1%97#%E9%80%9A%E7%94%A8%E5%87%86%E5%A4%87 预备事项]，好一通忙碌。所有事情从结果看很简单，到达结果的过程中，需要许多比对时间&lt;br /&gt;
# 买了一双皮鞋，不易起皱，但皮革太次了，放了一周多，还有严重刺鼻劣质塑料味或甲醛味，这 159.6 元白花了。我打算扔掉，钱没有命重要。而且这种劣质塑料，易变形。鞋底比鞋面大了一圈，像踩了个盘子在脚下，以后选款式时避雷。我讨厌这双鞋到什么程度呢？打算晚上丢掉，现在左边鞋带松了一根，我都懒得系一下&lt;br /&gt;
# 买了一件公务式的休闲衣，挺板正，像个程序员了&lt;br /&gt;
# 买了一套扫把，扔掉了房间里旧的脏扫把。时时打扫地面的小渣渣很有必要，而这种易影响氛围的小事，要做得舒服，干净的扫把很有必要&lt;br /&gt;
# 买了 50 厘米宽衣架，保护衣服的肩线&lt;br /&gt;
# 把冬天的衣服全收进行李箱，放到衣柜顶上了，衣柜空出大面积，变得比较整齐&lt;br /&gt;
# 买了套引体向上设备，艰难进阶中&lt;br /&gt;
# 全面规整了我的 Emacs 配置，学会了一个简单的事：如果靠代码要 100 行，靠人只要 4 行，那就别搞什么自动化了，就靠人算了&lt;br /&gt;
&lt;br /&gt;
== 202605 ==&lt;br /&gt;
# 1 kg 排骨，1.5 kg 蹄膀，1.5 kg 白萝卜，一起炖一大锅，出锅三大盘、四中碗、三小碗，足够佐餐十次。食材才 61.5 元。淘洗花了不到 20 分钟，炒制花了不到 15 分钟，高压锅炖了 10 分钟左右，上气后再炖 10 分钟，就放着等开锅了&lt;br /&gt;
# 天气开始炎热，晚上回家都得开空调了&lt;br /&gt;
# 帮朋友干了一个项目，当作感谢&lt;br /&gt;
&lt;br /&gt;
== 202606 ==&lt;br /&gt;
# 处于焦虑之中&lt;br /&gt;
# 二刷浮槎山，不累。体质真的强了很多&lt;br /&gt;
# 爬了蜀山。很多年前我第一次爬的时候，客观上用了 1.5 小时，体感有 3 小时，感觉路漫长没有边际。这次走同样的路，最多只有某个 5 分钟的陡坡接电话时喘了下，其他的 15 分钟不到就毫无压力地到顶点了，非常轻松&lt;br /&gt;
# 常做俯卧撑，胸肌显现。头发留长了。颜值有了巨大提升&lt;br /&gt;
# 成功学会佩戴隐形眼镜&lt;br /&gt;
# 成功实现 15 个标准俯卧撑 + 3 个硬拉引体向上&lt;br /&gt;
# 成功购买 Apple GiftCard&lt;br /&gt;
# 拖了地&lt;br /&gt;
# 发现一家好吃的盖浇饭店&lt;br /&gt;
# 发现一家好吃的烤串店&lt;br /&gt;
# 去学林公园天养了一天，翻了很多次跟头，全靠左肩摔，也不疼，克服了恐惧，有望学会后空翻&lt;br /&gt;
# 成功实现 30 个标准俯卧撑 + 6 个硬拉引体向上&lt;br /&gt;
# 看了电影《新世界》，模仿《无间道》，超越《无间道》&lt;br /&gt;
# 看了电影《大空头》，简而言之：银行放房贷给普通人，银行把债权打包组合后出卖，层层包装组合，全世界银行都持有大量次贷。由于通货膨胀、物价上涨、审核不严，贷款违约的人越来越多，建立在虚空信用上的贷款面临崩塌，而最先发现的人，与银行对赌购买下跌期权。等贷款违约的人数达到临界点，大量银行破产，下跌期权赢了。最先做空的人，把认知变成了巨额财富&lt;br /&gt;
&lt;br /&gt;
== 202607 ==&lt;br /&gt;
# 我写的一个答辩状，获得了完胜。对方要 156827.49 元。法院判了 2880 元。拿着我写的答辩状去开庭的法人，表示完胜非常爽&lt;br /&gt;
# 成功实现 40 个标准俯卧撑 + 7 个硬拉引体向上&lt;br /&gt;
# 成功实现 60 个标准俯卧撑&lt;br /&gt;
# 围棋 9 路已经杀到 2 级；19 路已经杀到 8 级&lt;br /&gt;
# 开始研究 [https://qingliezhiquan.com/blog/%E4%BE%BF%E6%8D%B7%E6%9F%A5%E6%89%BE#%E6%8A%95%E8%B5%84 投资]&lt;br /&gt;
# 初次入市，除了京东方赚了点，其余全部大跌&lt;br /&gt;
# 完成了五月心愿，桌面收纳整洁了，一下氛围不一样了&lt;br /&gt;
# 戴隐形眼镜已经有 90% 的成功率&lt;br /&gt;
# 彻底理解了 elisp 里的递归，理解并应用了 Emacs 里 load-path 的递归，有了成熟的 Emacs 配置，可以确保无侵入式尝新&lt;br /&gt;
# 彻底理解了 ipset 是集合名单，iptables 可以按集合名单干活。netfilter-persistent 使规则永久化&lt;br /&gt;
# 胃被折腾得不好，首先是受凉，其次是经常连续三顿吃同样的食物，最后是经常吃食材不新鲜的饭店。自己做饭必须重视起来了&lt;br /&gt;
# 每天已能比较轻松的完成 60 个标准俯卧撑 + 90 秒倒立&lt;br /&gt;
# 使用 ChatGPT 5.6 Sol Extra High，把《GNU Emacs Lisp Reference Manual》《GNU Emacs Manual》《Specialized Emacs Features》《The Little Schemer》《The King James Version of the Bible》这五本书里的所有单词，制作成了 Anki 词卡：&amp;lt;b&amp;gt;TEBC11276en20260716.txt&amp;lt;/b&amp;gt;。有可能是当前世界上最棒的英汉词卡。Emacs 和 Lisp 负责技术上掌握世界，圣经负责玄学上理解世界，我准备靠这些单词学通英语&lt;br /&gt;
## T 代表选编者&lt;br /&gt;
## E 代表 Emacs 和 Elisp&lt;br /&gt;
## B 代表 Bible&lt;br /&gt;
## C 代表 ChatGPT&lt;br /&gt;
## 11276 代表词头数&lt;br /&gt;
## en 代表英文&lt;br /&gt;
## 20260716 代表完结日期&lt;br /&gt;
# 下班到家后，倾向于把手机用自律盒锁起来。必须戒断短视频和流媒体了&lt;br /&gt;
# 彻底了结一件事&lt;br /&gt;
# 网站卡成一团糟，果断把某网段封了 20 天，效果立竿见影。常规过于频繁访问我网站的 IP，也改为封 3 天&lt;br /&gt;
# 再战爬虫，取得胜利&lt;br /&gt;
&lt;br /&gt;
== 202608==&lt;br /&gt;
# 全面升级了网站架构，从根本上更加高级、更加安全&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=%E4%B8%8A%E4%B8%AA%E6%9C%88%E6%88%91%E5%B9%B2%E4%BA%86%E4%BB%80%E4%B9%88_2026&amp;diff=11571</id>
		<title>上个月我干了什么 2026</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=%E4%B8%8A%E4%B8%AA%E6%9C%88%E6%88%91%E5%B9%B2%E4%BA%86%E4%BB%80%E4%B9%88_2026&amp;diff=11571"/>
		<updated>2026-08-06T16:36:08Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: /* 202607 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;向前看。&lt;br /&gt;
__TOC__&lt;br /&gt;
== 202601 ==&lt;br /&gt;
# 头发变茂密了，发型变帅了&lt;br /&gt;
# 隐约感到肌肉在长了&lt;br /&gt;
# 现在又掌握倒立了&lt;br /&gt;
# 写了份非常有逻辑的代理词&lt;br /&gt;
# 洗了鞋子&lt;br /&gt;
# 拖了地&lt;br /&gt;
# 电脑屏幕老死了，换了个新的，挑到了不错的屏幕&lt;br /&gt;
# 网站流量用超，关站了一天。感觉不太正常，按说我的网站的用户数，不至于能用完这么多流量。找机会排查看是否有人盗刷&lt;br /&gt;
# 看完了《怪奇物语》第四季、第五季&lt;br /&gt;
# 排查出保洁阿姨出现时的巨大损伤型恶臭，是公司的超簿垃圾袋释放的，于是和她商量不用再给我换垃圾袋，自己买了不臭的自己换，一下子拿回了属于自己的时间、专注和健康&lt;br /&gt;
# 封禁了恶意 ip，拯救了我的流量费。[[怎样封禁恶意_ip，避免服务器产生巨额流量费]]&lt;br /&gt;
# 在看《毛骗》团队的新片《[https://qingliezhiquan.com/blog/%E6%B5%B7%E5%B8%82%E8%9C%83%E6%A5%BC%EF%BC%9A%E5%8F%A4%E8%A3%85%E7%BB%8F%E5%85%B8 海市蜃楼]》。“海市蜃楼”多美好的词！快意江湖，难得的江湖气，前三集很有感觉，不过有点像《王国》，后边别被我发现是模仿《王国》。笑死了，有个傻傻的，叫曾信（“真信”）；有个拽拽的，叫曾倩（“真欠”）&lt;br /&gt;
# 徒步了科学岛 3.43 公里，它并不是湖心岛，是半岛，北面与陆地相连。参观了科技馆&lt;br /&gt;
# 买了万用表，研究修电器&lt;br /&gt;
# 买了温湿度计，营造合适室内环境&lt;br /&gt;
# 买了瑜珈垫，在小屋腾出健身场所了&lt;br /&gt;
# 买了腰靠，座椅舒服很重要&lt;br /&gt;
# 买了体重称。长胖这么多还不自觉，必须减重了&lt;br /&gt;
# 写了篇 [[怎样高效地拿回报销款]]&lt;br /&gt;
# 今天四次倒立，之后差点摔了，又做了一次倒立。其实根本不怕摔，只要有预期，快摔时正确卸力，迅速起身把歪坠的惯性，转移成起身的力，就没事了&lt;br /&gt;
# 今年不感觉冷，可能和我穿衣有关：内层聚酯纤维短袖，二层纯棉长袖，三层无袖宽松毛衣，最外加厚皮衣。四层穿搭一点不冷。有时一件 T 恤，二层一件长袖，外加一件棉服大衣，也不冷。下雪天也不冷。可能健身有点效果了&lt;br /&gt;
# 精研了父母的体检报告，并提出了下一步执行策略&lt;br /&gt;
# 写了篇 [[怎样养护头发]]&lt;br /&gt;
# 写了篇 [[电脑屏幕坏了，怎么挑选优质的屏幕]]&lt;br /&gt;
# 有一种对 1 月完结的恐慌。三十未立，事业无成，未来该走哪条路……&lt;br /&gt;
&lt;br /&gt;
== 202602 ==&lt;br /&gt;
# 去了浮槎山，徒步 10.84 公里&lt;br /&gt;
# 惊觉父亲老了，没以前那么犟了&lt;br /&gt;
# 发现立春前后，天光大亮，春天已至，倒春寒要命&lt;br /&gt;
# 和隔壁大吵一架，现在她们弄脏洗手间地面终于知道顺手拖干净了&lt;br /&gt;
# 看了电影《黑鹰坠落》。反战片，没啥感觉。现代战争比剧中高效万倍，黑鹰不会坠落了&lt;br /&gt;
# 看了电影《大逃杀》。日本批着纯爱外衣的变态片。杀着是过瘾，没啥内涵&lt;br /&gt;
# 看完了古装剧《海市蜃楼》。越看越没劲。能搬山移海的外星人却没有智商&lt;br /&gt;
# 把律师的锅甩回去了，他给错了账号，让他自己去变更&lt;br /&gt;
# 主动屏蔽了所有文字媒体、视频媒体，至于社交媒体我压根儿就没有用过&lt;br /&gt;
# 写了篇 [[论躺平与负债]]&lt;br /&gt;
# 写了篇 [[创业是道数学题]]&lt;br /&gt;
# 写了篇 [[办理护照和港澳通行证的经验]]&lt;br /&gt;
# 第一次尝试戴隐形眼镜，tmd，试了十几次，几个小时，恁是戴不进去&lt;br /&gt;
# 看了电影《逃狱惊魂》，非常经典，每个角色都有真实的欲望，动力十足&lt;br /&gt;
# 看了邓紫棋的科幻新书《启示路》。完全超出预期。fashion，浪漫，有趣，略拧巴。邓紫棋比想象中有才一百倍&lt;br /&gt;
# 写了篇 [[怎样用 Calibre 调整 EPUB 的格式使之完美阅读]]&lt;br /&gt;
# 又到了听《天空的颜色》的时候了&lt;br /&gt;
# 通过最正规的渠道，开通了低手续费股票账户，为开港股账户做足了准备&lt;br /&gt;
# 看了电影《出租车司机》美版、韩版&lt;br /&gt;
# 写了篇 [[过年随记]]&lt;br /&gt;
# 例行串串已吃&lt;br /&gt;
# 例行米线已吃 1/2&lt;br /&gt;
# 例行面馆已吃&lt;br /&gt;
# 例行米线已吃 2/2&lt;br /&gt;
# 例行登山徒步 8.32 公里&lt;br /&gt;
# 第一次买了只股票&lt;br /&gt;
# 徒步 11.25 公里&lt;br /&gt;
# 徒步缙云山 7.10 公里&lt;br /&gt;
# 徒步胜天湖 9.02 公里&lt;br /&gt;
&lt;br /&gt;
== 202603 ==&lt;br /&gt;
# 考察了梁平，竟然搞西部预制菜之都，一票否决。双桂湖公园南边的山倒还挺美的&lt;br /&gt;
# 在万州考察，因为买不到返肥火车票，焦头烂额。忘记了撞上学生开学高峰期&lt;br /&gt;
# 万州太窄了。一条主干道通全城的感觉。一种施展不开的感觉。五六根冲天柱，晚上九点多，不知在排放什么烟气，不像是好东西&lt;br /&gt;
# 打网约车旅游了万州之巅，然后急行军到了万州北站高铁站，去了奉节&lt;br /&gt;
# 从奉节坐小红船沿江往巫山走，此时正在船上，水汽扑来。坐了 4 小时&lt;br /&gt;
# 吃了巫山烤鱼&lt;br /&gt;
# 早上 06:00 起床，赶回奉节，参加徒步三峡之巅挑战赛，8.31 公里 2 小时 37 分 51 秒登顶，成功拿到奖牌。去得晚，日第 62 位登顶。日竞速第 16 名。月竞速第 25 名&lt;br /&gt;
# [[File:徒步三峡之巅8.31公里.jpg|100px]][[File:徒步三峡之巅成功领奖.jpg|100px]]&lt;br /&gt;
# 晚上 18:57 夜爬巫山三峡龙脊，乌压压的山上只有我一人，徒步 4.32 公里。下山打车难，结果五分钟内来了一对情侣和他们的弟弟妹妹来夜爬终点看风景，免费把我带到山下了。姓柳&lt;br /&gt;
# 发现眼袋重和眼镜重关系不大。最主要是因为长年睡到八点起，憋尿导致的。若六七点就尿干净，一点眼袋都没了&lt;br /&gt;
# 考察了利川，感觉皱巴巴的，不如奉节、巫山那种干净、舒展的感觉&lt;br /&gt;
# 看了电影《猜火车》，垃圾，毫无内涵，披个青春片的皮，搞宣毒&lt;br /&gt;
# 写了篇 [[渝东游记：地理奇迹，人文情怀]]&lt;br /&gt;
# 把行李箱洗了。它跟了我这么多年了，不忍它脏兮兮的，或许只是我在乎它干净与否。它应该不能水洗，但我还是把它洗干净了。扛过去，它就能再干净几年。扛不过去，就是它的宿命&lt;br /&gt;
# 看了李小龙的电影《龙争虎斗》，李小龙的努力，超出了“信仰”的范畴了&lt;br /&gt;
# 带着行李箱在公园晒了几小时太阳，主要是为了晒干行李箱&lt;br /&gt;
# 研究出了把本站内容发布到微信公众号的较为自动化的方法&lt;br /&gt;
# 看了电影《聚焦》，三流叙事&lt;br /&gt;
# 洗干净所有厨具，规整了厨房，做了 2026 出租屋第一餐&lt;br /&gt;
# [[File:2026 出租屋第一餐.jpg|200px]]&lt;br /&gt;
# 周五宜吃排骨炖冬笋&lt;br /&gt;
# [[File:周五宜吃排骨炖冬笋.jpg|200px]]&lt;br /&gt;
# 看了电影《德州电锯杀人狂》，一群疯子&lt;br /&gt;
# 前几天本站搜索崩了，因为内存不够用。给服务器加了 Swap 空间，内存能支撑更大的负载了。搜索功能恢复&lt;br /&gt;
# 看了电影《千钧一发》，什么人能写出这种优秀的剧本。不遗余力&lt;br /&gt;
# 买了电饭煲、煮蛋器、洗袜机、体态矫正带、公园露营椅、螺蛳粉&lt;br /&gt;
# 徒步紫蓬山 6 公里。去之前以为它很高，很壮观。刚出发时，查了下地图，就知道它爬升只有 200 米。都没喘下气，刚热个身已经爬完了&lt;br /&gt;
# [[File:红烧猪蹄.jpg|200px]]&lt;br /&gt;
# 做了 10 个俯卧撑。惭愧，20 多岁时轻轻松松，30 多岁时人好像变重了一样，好在又找回感觉了&lt;br /&gt;
# 又做了 10 个俯卧撑，感觉真好&lt;br /&gt;
# 网站遭受攻击，下一轮防攻击策略开始实施。网友里面有坏人呐&lt;br /&gt;
# 护照和港澳通行证终于到手了&lt;br /&gt;
# 买了块新的 27 英寸显示器&lt;br /&gt;
# 做了 35 个俯卧撑，手掌开始有力量了。惯例倒立四次&lt;br /&gt;
# [[File:世界上有千千万万碗面.jpg|200px]]&lt;br /&gt;
# 看完了《绝命律师》第一季&lt;br /&gt;
&lt;br /&gt;
== 202604 ==&lt;br /&gt;
# 笑死了，网站防爆破期间，阈值写得低，经常把自己挡在网站之外封一天。赶紧把自己加进白名单&lt;br /&gt;
# 成功搞定一个困扰一周的难题，[https://qingliezhiquan.com/blog/%E4%B8%80%E6%AC%A1_Anki_%E7%99%BB%E5%BD%95%E4%B8%8D%E4%B8%8A%E7%9A%84%E6%89%BE_bug_%E7%BB%8F%E5%8E%86 找 bug 过程]堪称经典&lt;br /&gt;
# 发现自己某些方面还挺厉害的&lt;br /&gt;
# 我代理的一个案子，对方脆败。他的毛病在于，同样的事，重复了三遍，大段大段的用 AI 写的，书记员和法官根本不可能看明白他在表达啥。打官司重在证据清晰明确、语言简明扼要，不然起诉状或答辩状白写了&lt;br /&gt;
# 看完了《绝命律师》第二季。Jimmy 阴了他哥一把，他哥也阴了他一把。Jimmy 与 Kim 共享办公室，开始独立执业。被偏爱的 Jimmy，成佛只需放下屠刀&lt;br /&gt;
# 买了个高压锅（苏泊尔京东自营旗舰店，底直径 24 厘米，7.0L，食品级 304 不锈钢材质）。上气后 28 分钟，就把 2.9 kg 肘子炖到软烂脱骨，骨头都可以轻松嚼碎。解决了切肉洗菜板的麻烦。2.9 kg 太多了，下次控制在 2 kg 以内，上气后 20 分钟炖足够了&lt;br /&gt;
# 炖了一只三黄鸡、两斤鸡爪、两个鸡边腿、一斤鲜板栗。上气后 12 分钟就软烂脱骨了。下次炖鸡 10 分钟足够了&lt;br /&gt;
# 处理去香港玩的所有 [https://qingliezhiquan.com/blog/%E9%A6%99%E6%B8%AF%E6%B8%B8%E8%AE%B0%EF%BC%9A%E5%96%9C%E5%B8%96%E8%A1%97#%E9%80%9A%E7%94%A8%E5%87%86%E5%A4%87 预备事项]，好一通忙碌。所有事情从结果看很简单，到达结果的过程中，需要许多比对时间&lt;br /&gt;
# 买了一双皮鞋，不易起皱，但皮革太次了，放了一周多，还有严重刺鼻劣质塑料味或甲醛味，这 159.6 元白花了。我打算扔掉，钱没有命重要。而且这种劣质塑料，易变形。鞋底比鞋面大了一圈，像踩了个盘子在脚下，以后选款式时避雷。我讨厌这双鞋到什么程度呢？打算晚上丢掉，现在左边鞋带松了一根，我都懒得系一下&lt;br /&gt;
# 买了一件公务式的休闲衣，挺板正，像个程序员了&lt;br /&gt;
# 买了一套扫把，扔掉了房间里旧的脏扫把。时时打扫地面的小渣渣很有必要，而这种易影响氛围的小事，要做得舒服，干净的扫把很有必要&lt;br /&gt;
# 买了 50 厘米宽衣架，保护衣服的肩线&lt;br /&gt;
# 把冬天的衣服全收进行李箱，放到衣柜顶上了，衣柜空出大面积，变得比较整齐&lt;br /&gt;
# 买了套引体向上设备，艰难进阶中&lt;br /&gt;
# 全面规整了我的 Emacs 配置，学会了一个简单的事：如果靠代码要 100 行，靠人只要 4 行，那就别搞什么自动化了，就靠人算了&lt;br /&gt;
&lt;br /&gt;
== 202605 ==&lt;br /&gt;
# 1 kg 排骨，1.5 kg 蹄膀，1.5 kg 白萝卜，一起炖一大锅，出锅三大盘、四中碗、三小碗，足够佐餐十次。食材才 61.5 元。淘洗花了不到 20 分钟，炒制花了不到 15 分钟，高压锅炖了 10 分钟左右，上气后再炖 10 分钟，就放着等开锅了&lt;br /&gt;
# 天气开始炎热，晚上回家都得开空调了&lt;br /&gt;
# 帮朋友干了一个项目，当作感谢&lt;br /&gt;
&lt;br /&gt;
== 202606 ==&lt;br /&gt;
# 处于焦虑之中&lt;br /&gt;
# 二刷浮槎山，不累。体质真的强了很多&lt;br /&gt;
# 爬了蜀山。很多年前我第一次爬的时候，客观上用了 1.5 小时，体感有 3 小时，感觉路漫长没有边际。这次走同样的路，最多只有某个 5 分钟的陡坡接电话时喘了下，其他的 15 分钟不到就毫无压力地到顶点了，非常轻松&lt;br /&gt;
# 常做俯卧撑，胸肌显现。头发留长了。颜值有了巨大提升&lt;br /&gt;
# 成功学会佩戴隐形眼镜&lt;br /&gt;
# 成功实现 15 个标准俯卧撑 + 3 个硬拉引体向上&lt;br /&gt;
# 成功购买 Apple GiftCard&lt;br /&gt;
# 拖了地&lt;br /&gt;
# 发现一家好吃的盖浇饭店&lt;br /&gt;
# 发现一家好吃的烤串店&lt;br /&gt;
# 去学林公园天养了一天，翻了很多次跟头，全靠左肩摔，也不疼，克服了恐惧，有望学会后空翻&lt;br /&gt;
# 成功实现 30 个标准俯卧撑 + 6 个硬拉引体向上&lt;br /&gt;
# 看了电影《新世界》，模仿《无间道》，超越《无间道》&lt;br /&gt;
# 看了电影《大空头》，简而言之：银行放房贷给普通人，银行把债权打包组合后出卖，层层包装组合，全世界银行都持有大量次贷。由于通货膨胀、物价上涨、审核不严，贷款违约的人越来越多，建立在虚空信用上的贷款面临崩塌，而最先发现的人，与银行对赌购买下跌期权。等贷款违约的人数达到临界点，大量银行破产，下跌期权赢了。最先做空的人，把认知变成了巨额财富&lt;br /&gt;
&lt;br /&gt;
== 202607 ==&lt;br /&gt;
# 我写的一个答辩状，获得了完胜。对方要 156827.49 元。法院判了 2880 元。拿着我写的答辩状去开庭的法人，表示完胜非常爽&lt;br /&gt;
# 成功实现 40 个标准俯卧撑 + 7 个硬拉引体向上&lt;br /&gt;
# 成功实现 60 个标准俯卧撑&lt;br /&gt;
# 围棋 9 路已经杀到 2 级；19 路已经杀到 8 级&lt;br /&gt;
# 开始研究 [https://qingliezhiquan.com/blog/%E4%BE%BF%E6%8D%B7%E6%9F%A5%E6%89%BE#%E6%8A%95%E8%B5%84 投资]&lt;br /&gt;
# 初次入市，除了京东方赚了点，其余全部大跌&lt;br /&gt;
# 完成了五月心愿，桌面收纳整洁了，一下氛围不一样了&lt;br /&gt;
# 戴隐形眼镜已经有 90% 的成功率&lt;br /&gt;
# 彻底理解了 elisp 里的递归，理解并应用了 Emacs 里 load-path 的递归，有了成熟的 Emacs 配置，可以确保无侵入式尝新&lt;br /&gt;
# 彻底理解了 ipset 是集合名单，iptables 可以按集合名单干活。netfilter-persistent 使规则永久化&lt;br /&gt;
# 胃被折腾得不好，首先是受凉，其次是经常连续三顿吃同样的食物，最后是经常吃食材不新鲜的饭店。自己做饭必须重视起来了&lt;br /&gt;
# 每天已能比较轻松的完成 60 个标准俯卧撑 + 90 秒倒立&lt;br /&gt;
# 使用 ChatGPT 5.6 Sol Extra High，把《GNU Emacs Lisp Reference Manual》《GNU Emacs Manual》《Specialized Emacs Features》《The Little Schemer》《The King James Version of the Bible》这五本书里的所有单词，制作成了 Anki 词卡：&amp;lt;b&amp;gt;TEBC11276en20260716.txt&amp;lt;/b&amp;gt;。有可能是当前世界上最棒的英汉词卡。Emacs 和 Lisp 负责技术上掌握世界，圣经负责玄学上理解世界，我准备靠这些单词学通英语&lt;br /&gt;
## T 代表选编者&lt;br /&gt;
## E 代表 Emacs 和 Elisp&lt;br /&gt;
## B 代表 Bible&lt;br /&gt;
## C 代表 ChatGPT&lt;br /&gt;
## 11276 代表词头数&lt;br /&gt;
## en 代表英文&lt;br /&gt;
## 20260716 代表完结日期&lt;br /&gt;
# 下班到家后，倾向于把手机用自律盒锁起来。必须戒断短视频和流媒体了&lt;br /&gt;
# 彻底了结一件事&lt;br /&gt;
# 网站卡成一团糟，果断把某网段封了 20 天，效果立竿见影。常规过于频繁访问我网站的 IP，也改为封 3 天&lt;br /&gt;
# 再战爬虫，取得胜利&lt;br /&gt;
&lt;br /&gt;
== 202608==&lt;br /&gt;
# 升级了网站架构，从根本上更加高级、更加安全&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=%E5%A4%B1%E8%B4%A5%E5%8E%9F%E5%9B%A0%E6%80%BB%E7%BB%93&amp;diff=11570</id>
		<title>失败原因总结</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=%E5%A4%B1%E8%B4%A5%E5%8E%9F%E5%9B%A0%E6%80%BB%E7%BB%93&amp;diff=11570"/>
		<updated>2026-07-29T08:02:46Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!日期&lt;br /&gt;
!事实&lt;br /&gt;
!错误&lt;br /&gt;
!解套心得&lt;br /&gt;
|-&lt;br /&gt;
|20260616&lt;br /&gt;
|002692 再买 2000 元的。叫富国，就超稳。政策层面不允许它大跌&lt;br /&gt;
|迷信&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|20260713&lt;br /&gt;
|受光通信、光模块、CPO 先进封装的小作文影响，迷信了金梓才、武阳、郑希这三位基金经理，重仓反复买了多只他们管理的基金&lt;br /&gt;
|迷信、追涨、重复&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|20260713&lt;br /&gt;
|以为跌到 52 周最低价就是好买点，买入小米。实则继续狂跌&lt;br /&gt;
|以为便宜就能抄底&lt;br /&gt;
|20260729 止跌，赚了 166.92 HKD&lt;br /&gt;
|-&lt;br /&gt;
|20260713&lt;br /&gt;
|没想清楚 NFLX 在短视频时代已是强弩之末，大量持仓 NFLX，进去就跌大了&lt;br /&gt;
|不看时代趋势&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|20260702&lt;br /&gt;
|京东方 A 绝对会上 10 元，这是中国人的数字爱好决定的，明天一定 9.5 以上，下周狂欢冲 10 元&lt;br /&gt;
|迷信&lt;br /&gt;
|7.95 卖的，未被套&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=C_%E8%AF%AD%E8%A8%80%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86%E7%82%B9&amp;diff=11569</id>
		<title>C 语言基础知识点</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=C_%E8%AF%AD%E8%A8%80%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86%E7%82%B9&amp;diff=11569"/>
		<updated>2026-07-28T15:03:20Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: Created page with &amp;quot;* 关键字不能当变量名：auto, break, case, char, const, continue, default, do, double, else, enum, extern, floate, for, goto, if, int, long, register, return, short, signed, sizeof, static, struct, switch, typedef, union, unsigned, void, volatile, while, inline, restrict&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* 关键字不能当变量名：auto, break, case, char, const, continue, default, do, double, else, enum, extern, floate, for, goto, if, int, long, register, return, short, signed, sizeof, static, struct, switch, typedef, union, unsigned, void, volatile, while, inline, restrict&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=%E7%94%B5%E8%84%91%E4%B8%AD%E7%BA%A7%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B&amp;diff=11568</id>
		<title>电脑中级使用教程</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=%E7%94%B5%E8%84%91%E4%B8%AD%E7%BA%A7%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B&amp;diff=11568"/>
		<updated>2026-07-28T15:03:00Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: /* C */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MediaWiki ==&lt;br /&gt;
* [[怎样迁移 MediaWiki 站点]]&lt;br /&gt;
* [[怎样为 MediaWiki 网站安装高级搜索拓展 CirrusSearch]]&lt;br /&gt;
* [[怎样安装 MediaWiki Math extension]]&lt;br /&gt;
* [[MediaWiki git 安装指南]]&lt;br /&gt;
* [[MediaWiki 怎么设置缓存]]&lt;br /&gt;
* [[怎样把 Excel 表格转换为 MediaWiki 表格]]&lt;br /&gt;
* [[为什么没放弃 Semantic MediaWiki]]&lt;br /&gt;
* [[怎么设置完整的、完善的 301 跳转]]&lt;br /&gt;
* [[删除英文标题，改为中文标题，之后怎么做 301 跳转]]&lt;br /&gt;
* [[WSL2 Debian MediaWiki 使用体验]]&lt;br /&gt;
* [[怎样使用 MediaWiki 的表格排序]]&lt;br /&gt;
* [[怎样使用 redis 作为 MediaWiki 的缓存后端]]&lt;br /&gt;
* [[MediaWiki 怎么设置各类 Debug 日志]]&lt;br /&gt;
* [[在 Semantic Mediawiki 中带有 subobject 的模板如何创建]]&lt;br /&gt;
* [[Semantic MediaWiki 中的那些符号的意思]]&lt;br /&gt;
* [[怎样保护你的 MediaWiki 站点的安全：权属建议]]&lt;br /&gt;
* [[在 Windows 10 VirtualBox 里的 MediaWiki]]&lt;br /&gt;
* [[怎样让 MediaWiki 生成完美的思维导图]]&lt;br /&gt;
* [[怎样把 MediaWiki 的 wikitext 转换为 GitHub 风格的 markdown]]&lt;br /&gt;
* [[mediawiki-el 出错始末]]&lt;br /&gt;
&lt;br /&gt;
== Emacs ==&lt;br /&gt;
* [[怎样用 Emacs 调电子书格式：格式凌乱通用解决方案]]&lt;br /&gt;
* [[Emacs 初级配置]]&lt;br /&gt;
* [[Emacs 后台自动启动-用户层面]]&lt;br /&gt;
* [[Emacs 后台自动启动-全局层面]]&lt;br /&gt;
* [[怎样在 Emacs 中编辑任意文字区域]]&lt;br /&gt;
* [[一批把法律文本的标题转换为 wikitext 层级标题的 Emacs 函数]]&lt;br /&gt;
* [[一个给内容编号的 Emacs 函数]]&lt;br /&gt;
* [[一个给法律条款文本前加两个全角空格的 Emacs 函数]]&lt;br /&gt;
* [[一个把 wikitext 转换成 markdown 的 Emacs 函数]]&lt;br /&gt;
* [[怎么使用原生 Android 版本的 Emacs]]&lt;br /&gt;
* [[Emacs 从零开始写配置]]&lt;br /&gt;
* [[Manateelazycat 的 Emacs 启动文件 site-start.el 研究]]&lt;br /&gt;
* [[Emacs 完整学习方法]]&lt;br /&gt;
* [[Emacs 字体设置的种种]]&lt;br /&gt;
* [[Git submodule 的精准用法]]&lt;br /&gt;
* [[Emacs 插件大法：几个超有用的插件]]&lt;br /&gt;
* [[两个递归子目录函数的比较]]&lt;br /&gt;
* [[建立正确的 Emacs 概念]]&lt;br /&gt;
* [[use-package 用法]]&lt;br /&gt;
* [[Emacs server 的异常的一次排查]]&lt;br /&gt;
&lt;br /&gt;
== Rime ==&lt;br /&gt;
* [[经典极简 Rime 配置]]&lt;br /&gt;
* [[在手机上从零开始配置 Rime 拼音输入法]]&lt;br /&gt;
* [[怎样使用 fcitx5-rime]]&lt;br /&gt;
&lt;br /&gt;
== Debian ==&lt;br /&gt;
* [[常用软件在 bullseye 与 bookworm 上的版本对比]]&lt;br /&gt;
* [[怎样从 Debian Bullseye 升级至 Debian Bookworm]]&lt;br /&gt;
* [[电脑必备软件名录]]&lt;br /&gt;
* [[怎样在 Debian 上安装围棋 AI Katago]]&lt;br /&gt;
* [[Debian 分区满了怎么办]]&lt;br /&gt;
* [[现在配置 SSL 证书实现 https 非常简单了]]&lt;br /&gt;
* [[Debian 换源方法]]&lt;br /&gt;
* [[在 Debian 上如何挂载一块硬盘]]&lt;br /&gt;
* [[Debian 忘记用户名怎么办]]&lt;br /&gt;
* [[Debian 服务器内存偶尔不够用怎么办]]&lt;br /&gt;
* [[在 Debian 中设置开机自动启动的方法]]&lt;br /&gt;
&lt;br /&gt;
== ArchLinux ==&lt;br /&gt;
* [[怎么使用 ArchLinux]]&lt;br /&gt;
* [[怎么在 ArchLinux 中使用 MediaWiki]]&lt;br /&gt;
* [[怎么在 VirtualBox 中使用 ArchLinux]]&lt;br /&gt;
* [[在 WSL2 中使用 ArchLinux]]&lt;br /&gt;
* [[EndeavourOS 怎么用]]&lt;br /&gt;
* [[一次恢复 ArchLinux 启动项的经历]]&lt;br /&gt;
* [[从 ArchLinux 改回 Debian 的全过程记录]]&lt;br /&gt;
&lt;br /&gt;
== WSL ==&lt;br /&gt;
* [[用 WSL 安装 Linux 发行版的方法]]&lt;br /&gt;
* [[WSLG 趣谈]]&lt;br /&gt;
* [[WSL2 proxy 的方法]]&lt;br /&gt;
* [[怎么在 Windows 上使用 Minder]]&lt;br /&gt;
&lt;br /&gt;
== TTY ==&lt;br /&gt;
* [[怎样令终端更加高效]]&lt;br /&gt;
&lt;br /&gt;
== Virtual ==&lt;br /&gt;
* [[QEMU KVM LIBVIRT 的区别]]&lt;br /&gt;
* [[VirtualBox 安装 Debian 的小 tips]]&lt;br /&gt;
* [[怎么使用 virt-manager]]&lt;br /&gt;
&lt;br /&gt;
== Defense ==&lt;br /&gt;
* [[怎样封禁恶意 ip，避免服务器产生巨额流量费]]&lt;br /&gt;
* [[iptables ipset 使用经验]]&lt;br /&gt;
* [[更智能的 iptables 封禁脚本，令服务器远离恶意攻击]]&lt;br /&gt;
* [[服务器安全防护总论]]&lt;br /&gt;
&lt;br /&gt;
== Anki ==&lt;br /&gt;
* [[怎么在不同平台下载并安装 Anki]]&lt;br /&gt;
* [[最简单的 Anki 同步教程]]&lt;br /&gt;
* [[一次 Anki 同步出问题的调试]]&lt;br /&gt;
* [[一次 Anki 登录不上的找 bug 经历]]&lt;br /&gt;
&lt;br /&gt;
== C ==&lt;br /&gt;
* [[Emacs 写 C 项目步骤]]&lt;br /&gt;
* [[C 语言基础知识点]]&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
* [[程序员成长指南]]&lt;br /&gt;
* [[小代码大作用，电脑开荒代码：有哪些代码非常短但非常有用]]&lt;br /&gt;
* [[一台 apache 服务器托管多个网站的方法]]&lt;br /&gt;
* [[screen 使用指南]]&lt;br /&gt;
* [[Crontab 定时任务不按预计运行怎么办]]&lt;br /&gt;
* [[一段 ahk 脚本，自动移动光标至标签内，仅输入法中文状态下有效]]&lt;br /&gt;
* [[一段 ahk 脚本，在维基网站上自动输入模板内容]]&lt;br /&gt;
* [[读懂 diff]]&lt;br /&gt;
* [[怎样屏蔽某个网站以令自己更专注地面对生活的真实挑战]]&lt;br /&gt;
* [[XAMPP 在 Windows 上 localhost 运行缓慢的解决办法]]&lt;br /&gt;
* [[Msys pacman 用法]]&lt;br /&gt;
* [[Plausible 及 Docker 折腾指北]]&lt;br /&gt;
* [[怎么使用 beancount]]&lt;br /&gt;
* [[用 bash 脚本计算当前文件夹内所有 .docx 文件的 sha1 值]]&lt;br /&gt;
* [[Flatpak 怎么用]]&lt;br /&gt;
* [[酷比魔方刷机方法]]&lt;br /&gt;
* [[常规 Linux 软件快速安装]]&lt;br /&gt;
* [[怎么使用 python 虚拟环境 venv]]&lt;br /&gt;
* [[怎么使用 composer]]&lt;br /&gt;
* [[为什么我需要一台 VPS]]&lt;br /&gt;
* [[LibreOffice Calc 怎么改默认字号]]&lt;br /&gt;
* [[编程基础]]&lt;br /&gt;
* [[Python 学习笔记]]&lt;br /&gt;
* [[极简 git 步骤]]&lt;br /&gt;
* [[Python 环境相关]]&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=%E5%AE%8C%E7%BE%8E%E6%97%A5%E7%94%A8%E5%B0%8F%E5%91%BD%E4%BB%A4&amp;diff=11567</id>
		<title>完美日用小命令</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=%E5%AE%8C%E7%BE%8E%E6%97%A5%E7%94%A8%E5%B0%8F%E5%91%BD%E4%BB%A4&amp;diff=11567"/>
		<updated>2026-07-28T11:56:03Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 目标或作用&lt;br /&gt;
! 对应方法&lt;br /&gt;
|-&lt;br /&gt;
|更换 Terminal 里的默认编辑器&lt;br /&gt;
|在 .bashrc 里&lt;br /&gt;
&lt;br /&gt;
export EDITOR=emacs&lt;br /&gt;
&lt;br /&gt;
export VISUAL=emacs&lt;br /&gt;
|-&lt;br /&gt;
|在 MINGW64 里找二进制文件位置&lt;br /&gt;
|which git&lt;br /&gt;
&lt;br /&gt;
which bash&lt;br /&gt;
&lt;br /&gt;
cygpath -w /mingw64&lt;br /&gt;
&lt;br /&gt;
cygpath -w /usr&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|Emacs 里到底哪个配置偷偷执行了这个函数&lt;br /&gt;
|(debug-on-entry &#039;那个函数)&lt;br /&gt;
|-&lt;br /&gt;
|查某个软件到底安装了些什么&lt;br /&gt;
|dpkg -L beancount | grep /usr/bin&lt;br /&gt;
|-&lt;br /&gt;
|elisp 求值&lt;br /&gt;
|*scratch* 里试验：C-j（eval-print-last-sexp）&lt;br /&gt;
&lt;br /&gt;
.el 文件里现场执行：C-x C-e（eval-last-sexp）&lt;br /&gt;
|-&lt;br /&gt;
|git 极简指南&lt;br /&gt;
|&lt;br /&gt;
本地出生：目录 → git init → .gitignore → add → commit → remote → push&lt;br /&gt;
&lt;br /&gt;
远程出生：GitHub 仓库 → git clone → 修改 → add → commit → push&lt;br /&gt;
|-&lt;br /&gt;
|Emacs 里误删 projects 标记文件&lt;br /&gt;
|打开项目内文件，再运行一次 project-find-file 命令，Emacs 就会重新记住项目&lt;br /&gt;
|-&lt;br /&gt;
|git 文件模式的含义&lt;br /&gt;
|100644 普通文件&lt;br /&gt;
&lt;br /&gt;
100755 可执行文件&lt;br /&gt;
&lt;br /&gt;
160000 Git submodule 的 `gitlink`&lt;br /&gt;
|-&lt;br /&gt;
|打印文件不想手动分份&lt;br /&gt;
|逐份打印，或称自动分页&lt;br /&gt;
[[File:逐份打印.png|400px]][[File:不逐份打印.png|400px]]&lt;br /&gt;
|-&lt;br /&gt;
|svg 字符丢失&lt;br /&gt;
|grep font-family sth.svg 可以查看该 svg 用了什么字体，再在服务器安装该字体，即可&lt;br /&gt;
|-&lt;br /&gt;
| emacs 乱码三部曲&lt;br /&gt;
|&lt;br /&gt;
* 辨别：[http://www.mytju.com/classCode/tools/messyCodeRecover.asp 乱码恢复]&lt;br /&gt;
* 重置：revert-buffer-with-coding-system&lt;br /&gt;
* 另存：set-buffer-file-coding-system&lt;br /&gt;
|-&lt;br /&gt;
| 用关键字查找文件&lt;br /&gt;
| 把这段放入 .bashrc&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
f(){&lt;br /&gt;
    find . -iname &amp;quot;*$1*&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 删除注释，只看已设置的配置。“说人话”&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ren() { sed &#039;/^#/d&#039; &amp;quot;$1&amp;quot; &amp;gt; &amp;quot;ren.$1&amp;quot;; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| Debian 怎么高效截屏&lt;br /&gt;
| 打开 Keyboard → Application Shortcuts，把原来绑定 Print 的命令替换为 flameshot gui&lt;br /&gt;
|-&lt;br /&gt;
| 把命令行提示符改为青色&lt;br /&gt;
| 以下行放入 ~/.bashrc&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
PS1=&#039;\[\033[0;36m\]\u@\h:\w\$ \[\033[00m\]&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 修改文件前先创建备份&lt;br /&gt;
| 建一个 bak 函数：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
bak() { cp -a -- &amp;quot;$1&amp;quot; &amp;quot;$1&amp;quot;.bak.$(date +%Y%m%d%H%M%S); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 查某部门的电话&lt;br /&gt;
| 官网如果查不到，问 114 或有奇效&lt;br /&gt;
|-&lt;br /&gt;
| excel 中给 A1 单元格前后加东西&lt;br /&gt;
| 用 &amp;quot;&amp;quot; 和 &amp;amp;。如 &amp;lt;nowiki&amp;gt;&amp;quot;[[&amp;quot; &amp;amp; A1 &amp;amp; &amp;quot;]]&amp;quot;&amp;lt;/nowiki&amp;gt; 表示在 A1 的内容前后加 &amp;lt;nowiki&amp;gt;[[ 和 ]]&amp;lt;/nowiki&amp;gt;。即小猫，变成 &amp;lt;nowiki&amp;gt;[[小猫]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| mediawiki 批量上传图片&lt;br /&gt;
| php maintenance/run.php importImages ~/sth --comment=&amp;quot;批量导入，新年快乐&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 设置 Debian 电脑时区&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看当前时区与时间状态&lt;br /&gt;
sudo timedatectl status&lt;br /&gt;
# 把时区设为 Asia/Shanghai（UTC+8）&lt;br /&gt;
sudo timedatectl set-timezone Asia/Shanghai&lt;br /&gt;
# 再次确认&lt;br /&gt;
timedatectl status&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 剪映裁切视频&lt;br /&gt;
| 轨道上方的工具栏明晃晃就有个裁剪图标，点它就行&lt;br /&gt;
|-&lt;br /&gt;
| OBS 只采集窗口的一部分&lt;br /&gt;
| 按住 Alt 再推动就行&lt;br /&gt;
|-&lt;br /&gt;
| 打开某个网站，一片乱码&lt;br /&gt;
| 试试按 Alt 键，在出现的菜单栏上，View 有个功能：Repair Text Encoding&lt;br /&gt;
|-&lt;br /&gt;
| base64 解码&lt;br /&gt;
| &amp;lt;code&amp;gt;echo &amp;quot;aHR0cHM6Ly9jbGF1ZGVjb2RlOC5jb20vdjJleDA0&amp;quot; | base64 -d&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 下载 m3u8 视频&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
首先在浏览器安装 cat-catch&lt;br /&gt;
其次在电脑里安装 yt-dlp&lt;br /&gt;
最后在终端里 yt-dlp -o sth.mp4 &amp;quot;url&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Yt-dlp 生效状态.png|300px]]&lt;br /&gt;
|-&lt;br /&gt;
| 查找符合条件的文件后替换&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
find . -type f -name &amp;quot;*.beancount&amp;quot; -exec sed &#039;s/2025-10-01/2024-04-06/g&#039; {} +&lt;br /&gt;
&lt;br /&gt;
find . → 从当前目录开始查找&lt;br /&gt;
-type f → 只查找文件&lt;br /&gt;
-name &amp;quot;*.beancount&amp;quot; → 只匹配后缀为 .beancount 的文件&lt;br /&gt;
-exec ... {} + → 对每个匹配的文件执行后面的命令&lt;br /&gt;
sed -i &#039;s/2025-10-01/2024-04-06/g&#039; →&lt;br /&gt;
-i 表示直接修改文件&lt;br /&gt;
&#039;s/旧/新/g&#039; 表示全局替换&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 找到所有文章&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
curl -s &amp;quot;https://somesite.com/api.php?action=query&amp;amp;format=json&amp;amp;generator=allpages&amp;amp;gapnamespace=0&amp;amp;gaplimit=max&amp;amp;prop=info&amp;amp;inprop=url&amp;quot; | jq .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| emacs 中按行号加序号&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;elisp&amp;quot;&amp;gt;&lt;br /&gt;
M-x replace-regexp RET ^ RET \,(1+ \#). RET&lt;br /&gt;
# ^ → 匹配行首&lt;br /&gt;
# \, → 计算 Lisp 表达式&lt;br /&gt;
# \# → 当前行号&lt;br /&gt;
# 1+ \# → 每行号加 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
整体作用 → 给每行自动生成递增编号&lt;br /&gt;
|-&lt;br /&gt;
| emacs 中插入两个全角空格&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
insert-char 3000 #或者&lt;br /&gt;
&lt;br /&gt;
(global-set-key (kbd &amp;quot;C-c s&amp;quot;)&lt;br /&gt;
		(lambda () (interactive) (insert-char #x3000 2)))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 解决 ssh 断联问题&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 本地 ~/.ssh/config&lt;br /&gt;
Host *&lt;br /&gt;
    ServerAliveInterval 60&lt;br /&gt;
    ServerAliveCountMax 3&lt;br /&gt;
&lt;br /&gt;
# 远程 /etc/ssh/sshd_config&lt;br /&gt;
ClientAliveInterval 60&lt;br /&gt;
ClientAliveCountMax 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 隐藏 MediaWiki 侧边栏&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
/* 隐藏侧边栏 */&lt;br /&gt;
#mw-panel {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* 扩展正文到全屏 */&lt;br /&gt;
#content {&lt;br /&gt;
    margin-left: 0 !important;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| wikitable 中有的想排序有的不想排序&lt;br /&gt;
| 总表 class=&amp;quot;wikitable sortable&amp;quot;，在不想排序的表头设置 class=&amp;quot;unsortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| wikitable 单元格内换行后感觉有点远&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
style=&amp;quot;line-height:1.01;&amp;quot;&lt;br /&gt;
# 这样设置后，单元格里的内容呈块状，亲疏更加令人舒服&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Excel 单元格内换行&lt;br /&gt;
| 替换框里用 Ctrl J 能实现&lt;br /&gt;
|-&lt;br /&gt;
| github 提速方法一则&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# ssh over https&lt;br /&gt;
Host github.com&lt;br /&gt;
HostName ssh.github.com # 默认 ssh，不通过 https&lt;br /&gt;
Port 443&lt;br /&gt;
User git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| github 提速方法一则&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 放 ~/.ssh/config 里&lt;br /&gt;
Host github.com&lt;br /&gt;
  User git&lt;br /&gt;
  HostName github.com&lt;br /&gt;
  ProxyJump proxyserver&lt;br /&gt;
  &lt;br /&gt;
Host proxyserver&lt;br /&gt;
  User root&lt;br /&gt;
  HostName your_server_ip&lt;br /&gt;
  IdentityFile xxx&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 无 GUI 的 Linux 里 less 妙用&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
alias s=&amp;quot;ls -alh --color=auto | less&amp;quot;&lt;br /&gt;
Space 向下翻页&lt;br /&gt;
b 向上翻页&lt;br /&gt;
↑ / ↓ 单行滚动&lt;br /&gt;
q 退出&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 不想上的网课怎么办&lt;br /&gt;
| 去 greasyforks 搜该网课的域名&lt;br /&gt;
|-&lt;br /&gt;
| 怎样在 Emacs query-replace-regex 里使用“或”语义&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;\|&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 怎样让文件总是提示“建议只读”模式打开&lt;br /&gt;
| “保存”时，保存左边有个“工具” - “常规选项” - “建议只读”&lt;br /&gt;
|-&lt;br /&gt;
| mediawiki gd 不支持 webp&lt;br /&gt;
| sudo apt install imagemagick libwebp-dev，再在 LocalSettings.php 里打开 convert&lt;br /&gt;
|-&lt;br /&gt;
| Emacs 密钥过期无法更新 package 时应该怎么做&lt;br /&gt;
| 手动到 [https://elpa.gnu.org/packages/gnu-elpa-keyring-update.html GNU ELPA - gnu-elpa-keyring-update] 下载 gnu-elpa-keyring-update&lt;br /&gt;
在 Emacs 里打开这个 tar 文件，执行 package-install-from-buffer&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 音频转文字&lt;br /&gt;
| &amp;lt;code&amp;gt;whisper ~/S01E01.aac --model turbo -f srt --output_dir ~/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
model: tiny, base, small, medium, large, 或 turbo&lt;br /&gt;
f: format. txt, srt, vtt 等&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 视频提取音频&lt;br /&gt;
| &amp;lt;code&amp;gt;ffmpeg -i ~/S01E01.mp4 -vn -acodec copy ~/S01E01.aac&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i: input&lt;br /&gt;
vn: vedio none 不要视频&lt;br /&gt;
acoder copy: audio copy 直接复制音轨&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 表格中的第一个 # 号不解析&lt;br /&gt;
| #&lt;br /&gt;
# 天空&lt;br /&gt;
# 大地&lt;br /&gt;
# 人间&lt;br /&gt;
# 湖水&lt;br /&gt;
即在左上角先放一个 # 号&lt;br /&gt;
|-&lt;br /&gt;
| Semantic MediaWiki 日期标准化&lt;br /&gt;
| ?开庭日期#ISO&lt;br /&gt;
|-&lt;br /&gt;
| pubkey 不方便往服务器上粘&lt;br /&gt;
| 用 echo &amp;quot;Ctrl V&amp;quot; &amp;gt;&amp;gt; sth&lt;br /&gt;
|-&lt;br /&gt;
| Semantic MediaWiki 网页端清除缓存&lt;br /&gt;
| 在网页端 ?action=purge&lt;br /&gt;
&lt;br /&gt;
在 CLI 端 sduo php extensions/SemanticMediaWiki/maintenance/rebuildData.php&lt;br /&gt;
|-&lt;br /&gt;
| 调整特定页面的某个部分的字体&lt;br /&gt;
| Custom CSS 拓展可以哪里不爽改哪里，如：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
.answer p {&lt;br /&gt;
  font-size: 16px !important;&lt;br /&gt;
  color: #191b1f !important;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 命令替换，在命令中引用其他命令的结果&lt;br /&gt;
| $(command) 即用 $() 把命令括起来。或&lt;br /&gt;
&lt;br /&gt;
`command` 即用反引号把命令括起来&lt;br /&gt;
|-&lt;br /&gt;
| mediawiki 日志调试&lt;br /&gt;
| $wgShowExceptionDetails = true;&lt;br /&gt;
|-&lt;br /&gt;
| grep 用法&lt;br /&gt;
| 在目录下递归找字符串 grep -r string /dir/want&lt;br /&gt;
&lt;br /&gt;
依据后缀找关键字 grep -r &amp;quot;2025-10-01&amp;quot; --include=&amp;quot;*.beancount&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 一个 extension 不适用于当前 mediawiki 较低版本怎么办&lt;br /&gt;
| 别傻乎乎升级 mediawiki 版本，你可以在 extension 的历史记录中，按时间或 tags 找对应 mediawiki 当时的 extension 版本&lt;br /&gt;
|-&lt;br /&gt;
| 查本机图形化协议是 x11 还是 wayland 还是 Hyprland 还是 Sway&lt;br /&gt;
| echo $XDG_SESSION_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| 找源码&lt;br /&gt;
| grep -rn --include=&#039;*.c&#039; --include=&#039;*.h&#039; &#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 显示硬盘及分区&lt;br /&gt;
| lsblk&lt;br /&gt;
|-&lt;br /&gt;
| 查找 uuid&lt;br /&gt;
| sudo blkid /dev/sda&lt;br /&gt;
|-&lt;br /&gt;
| 挂载硬盘&lt;br /&gt;
| 在 /etc/fstab 中写入：UUID=xxxx-xxxx-xxxx  /mnt/data  ext4  defaults  0 2&lt;br /&gt;
|-&lt;br /&gt;
| MediaWiki 某页不要 toc 的数字序号&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 先在 MediaWiki:Common.css 设置：&lt;br /&gt;
.noautonum .tocnumber {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# 后在某页添加：&lt;br /&gt;
&amp;lt;div class=&amp;quot;noautonum&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 设置 Edit With Emacs 打开的窗口的大小&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;elisp&amp;quot;&amp;gt;&lt;br /&gt;
# 写入 early-init.el 中&lt;br /&gt;
(setq initial-frame-alist &#039;((width . 80) (height . 35)))&lt;br /&gt;
(setq default-frame-alist &#039;((top . 30) (left . 320) (width . 180) (height . 60)))&lt;br /&gt;
(setq frame-inhibit-implied-resize t)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| dd 制作安装盘&lt;br /&gt;
| sudo dd if=./EndeavourOS.iso of=/dev/sdc&lt;br /&gt;
|- &lt;br /&gt;
| ventoy 制作安装盘&lt;br /&gt;
| 把 ventoy 安装到 U 盘，再把 iso 文件复制进 U 盘&lt;br /&gt;
|-&lt;br /&gt;
| 添加 sudo 免密&lt;br /&gt;
| su root # 其实新用户没有 sudo 权&lt;br /&gt;
sudo visudo 或者&lt;br /&gt;
&lt;br /&gt;
写入 /etc/sudoer：username ALL=(ALL) NOPASSWD:ALL&lt;br /&gt;
&lt;br /&gt;
(ALL) 只设置用户权限，不管组权限。(ALL:ALL) 既设置用户权限，也设置组权限。按最小化权限原则，设置免密时使用 ALL=(ALL) &lt;br /&gt;
|-&lt;br /&gt;
| 找不到 firefox for android 安装包？&lt;br /&gt;
| https://ftp.mozilla.org/pub/fenix/releases/&lt;br /&gt;
|- &lt;br /&gt;
| 根据 sha256.txt 检测软件下载是否完整&lt;br /&gt;
| sha256sum -c --ignore-missing sha256.txt&lt;br /&gt;
|-&lt;br /&gt;
| 解决 zip 文件解压后文件名乱码&lt;br /&gt;
| unar -e GBK&lt;br /&gt;
|-&lt;br /&gt;
| emacs 中数字通配符&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;[[:digit:]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| mediawiki 上传容量改大&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 改 /etc/php/版本号/cli/php.ini&lt;br /&gt;
post_max_size = 50M&lt;br /&gt;
upload_max_filesize = 50M&lt;br /&gt;
systemctl restart apache2 &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 显示所有进程，且只显示第 12 列&lt;br /&gt;
| ps aux | awk &#039;{print $11}&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 让 apache2 中的 php 代码活起来&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;apache&amp;quot;&amp;gt;&lt;br /&gt;
# Add module for PHP 8&lt;br /&gt;
LoadModule php_module libexec/apache2/libphp.so&lt;br /&gt;
AddHandler php-script .php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 复制东西进另一个地方&lt;br /&gt;
| scp sth.zip host:~&lt;br /&gt;
|-&lt;br /&gt;
| 给当前目录下所有文件夹名字后加加一个 g 字符&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
for dir in */;&lt;br /&gt;
do&lt;br /&gt;
    if [ -d &amp;quot;$dir&amp;quot; ]; then&lt;br /&gt;
        new_dir=&amp;quot;${dir%*/}g&amp;quot;&lt;br /&gt;
        mv &amp;quot;$dir&amp;quot; &amp;quot;$new_dir&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 显示当前文件夹下所有文件、文件夹占用的磁盘容量&lt;br /&gt;
| du -h --max-depth=1&lt;br /&gt;
|-&lt;br /&gt;
| 找找 bin 在哪&lt;br /&gt;
| which phpmyadmin&lt;br /&gt;
|-&lt;br /&gt;
| 查看命令位置&lt;br /&gt;
| where sudo&lt;br /&gt;
|-&lt;br /&gt;
| 找找文件详细路径&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install plocate&lt;br /&gt;
sudo updatedb &lt;br /&gt;
locate file.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 猜猜我是谁&lt;br /&gt;
| whoami&lt;br /&gt;
|-&lt;br /&gt;
| 取出文件名&lt;br /&gt;
| find . -type f -exec basename {} \; &amp;gt; 本文件夹内所有文件名单.txt&lt;br /&gt;
|-&lt;br /&gt;
| 把视频每一秒都导一帧出来形成 png&lt;br /&gt;
| ffmpeg -i screen-20240701-081539.mp4 -vf fps=1 -q:v 2 ./test/dg_%03d.png&lt;br /&gt;
|-&lt;br /&gt;
| Excel 中无脑复制时，怎样让几十字显示时，不超过一个单元格的框框&lt;br /&gt;
| 把它旁边的框框填入一串字符如 yesterday，再把 yesterday 替换为空格。接下来在 A1 单元格填 100 字，它也不会在外观上占用了 B1 单元格，因为 B1 单元格客观上存在一个空格。&lt;br /&gt;
|-&lt;br /&gt;
| 要替换掉指定内容后的换行符&lt;br /&gt;
| 用 emacs，先写指定内容的 regexp，把它括起来当一个 regexp，再加 $。之后，替换内容中执行一个 (delete-forward-char 1) 即可。在 mini buffer 中执行函数的方式是 &amp;lt;code&amp;gt; \,(function) &amp;lt;/code&amp;gt;。&lt;br /&gt;
|-&lt;br /&gt;
| 两台 Windows 如何远程协助&lt;br /&gt;
| Windows 系统有个自带软件叫“快速助手”，英文 quick assist，两人都打开，很容易就能远程协助。&lt;br /&gt;
|-&lt;br /&gt;
| 快速删除 Windows 的服务&lt;br /&gt;
| regedit 导航至 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services，直接按名字删。无有效系统备份恢复手段的读者，不建议尝试此操作&lt;br /&gt;
|-&lt;br /&gt;
| 查看访问本机的 IP，及其所属&lt;br /&gt;
|&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat /var/log/apache2/access.log | awk &#039;{print $1}&#039; | sort | uniq -c | sort -nr | head -300 &amp;gt; success.txt&lt;br /&gt;
whois x.x.x.x&lt;br /&gt;
# awk &#039;{print $1}&#039; access.log：从access.log文件中提取每行的第一个字段（通常是IP地址）。&lt;br /&gt;
# sort：将提取的IP地址排序，为下一步的计数做准备。&lt;br /&gt;
# uniq -c：对排序后的IP地址进行计数，-c选项表示显示计数。&lt;br /&gt;
# sort -nr：再次对计数结果进行排序，-n表示按数值排序，-r表示降序。&lt;br /&gt;
# head -300：选择排序后的前300个IP地址。&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ssh 使远程机器通过 5432 端口连接到本机的 12345 端口&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
本机 ssh -R 25432:127.0.0.1:12345 tx&lt;br /&gt;
远程 export {http,https}_proxy=http://localhost:25432&lt;br /&gt;
验证 echo $https_proxy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 在 Anki 中输入平方毫米&lt;br /&gt;
| \(\text{mm}^2\)&lt;br /&gt;
|-&lt;br /&gt;
| 用 sed 删掉 apache 注释&lt;br /&gt;
| sed &#039;/^#/d&#039; apache2.conf &amp;gt; apache2.conf.nocomments 这行命令有点牛，一下把所有注释删掉了 d 表示删除行&lt;br /&gt;
&lt;br /&gt;
sed &#039;s/old/new/g&#039; file.txt &amp;gt; change.txt 把 file.txt 中的所有 old 替换为 new&lt;br /&gt;
|-&lt;br /&gt;
| 查找文件并执行命令，\; 代表命令结束符&lt;br /&gt;
| find ./images -type d -exec chmod 755 {} \;&lt;br /&gt;
|-&lt;br /&gt;
| apache 使用反代&lt;br /&gt;
| a2enmod proxy proxy_http proxy_wstunnel&lt;br /&gt;
|-&lt;br /&gt;
| 用 tail 显示 apache 错误日志的最后十行&lt;br /&gt;
| sudo tail -f /var/log/apache2/error.log&lt;br /&gt;
|-&lt;br /&gt;
| 查找数据库备份&lt;br /&gt;
| find /var/lib/automysqlbackup/&lt;br /&gt;
|-&lt;br /&gt;
| 用 Emacs 批量改名&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
C-x d 打开文件夹&lt;br /&gt;
M-x dired-do-rename-regexp 使用正则匹配改名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
C-x d 打开文件夹&lt;br /&gt;
C-x C-q 打开可编辑模式&lt;br /&gt;
M-x query-replace-regexp&lt;br /&gt;
C-c C-c 真实应用&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
二者任选其一。&lt;br /&gt;
|-&lt;br /&gt;
| 设置并检测 301 重定向是否配置成功&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 设置&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteCond %{HTTPS} off&lt;br /&gt;
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]&lt;br /&gt;
# 检测&lt;br /&gt;
curl -I http://yourdomain.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 修改主机名&lt;br /&gt;
| sudo hostnamectl set-hostname &amp;quot;new_hostname&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 修改用户名@主机名的显示色&lt;br /&gt;
| 在 .bashrc 找到 PS1 = 那行，把 \033[01;32m 绿色改成 \033[01;33m 黄色即可&lt;br /&gt;
|-&lt;br /&gt;
| 用 Emacs 复制正则结果&lt;br /&gt;
| C-u M-x occur RET regexp&lt;br /&gt;
|-&lt;br /&gt;
| MediaWiki 直接听歌&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$wgFileExtensions[] = &#039;mp3&#039;; &lt;br /&gt;
git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/MP3MediaHandler --branch REL1_XX&lt;br /&gt;
wfLoadExtension( &#039;MP3MediaHandler&#039; );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 一句话让 AI 不要在回答前序号列表的小圆点等&lt;br /&gt;
| 可以把答案放进代码框方便我复制&lt;br /&gt;
|-&lt;br /&gt;
| Linux 时光机&lt;br /&gt;
| Timeshift&lt;br /&gt;
|-&lt;br /&gt;
| 抢救硬盘&lt;br /&gt;
| r-studio&lt;br /&gt;
|-&lt;br /&gt;
| 在 toc 中，对有序号的文本，不采用 wikitext 数字序号&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot;&amp;gt;&lt;br /&gt;
{{#css:&lt;br /&gt;
.tocnumber { display: none; }&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| wsl 遭遇 DNS 污染&lt;br /&gt;
| 改一下 DNS 为 114.114.114.114&lt;br /&gt;
&lt;br /&gt;
打开虚拟化平台时，改的是虚拟网卡&lt;br /&gt;
|-&lt;br /&gt;
| 查某个软件在别的平台是什么版本&lt;br /&gt;
| https://pkgs.org/&lt;br /&gt;
|-&lt;br /&gt;
| 查看代码最近的 5 个 tag&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git tag | sort -V | tail -5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| powershell 中查 sha512&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Get-FileHash -Path &amp;quot;E:\EndeavourOS_Mercury-Neo-2025.03.19.iso&amp;quot; -Algorithm SHA512 | Format-List&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=%E7%81%B5%E6%9C%BA%E4%B8%80%E9%97%AA_2026&amp;diff=11566</id>
		<title>灵机一闪 2026</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=%E7%81%B5%E6%9C%BA%E4%B8%80%E9%97%AA_2026&amp;diff=11566"/>
		<updated>2026-07-28T09:28:57Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;由于最近心思放在别的，网站又恰好改出了一个小 bug，短短几天，访问我站的爬虫，陷入了无间地狱。&lt;br /&gt;
&lt;br /&gt;
简单来说就是爬虫发现这个站有无穷无尽的链接，8000 个 IP 全来找链接。我的小服务器差点被打爆。&lt;br /&gt;
&lt;br /&gt;
感觉这就像股市那句：盈亏同源。&lt;br /&gt;
&lt;br /&gt;
因为 MediaWiki 根本设计上就是每一笔历史都可以追溯查找，这是盈，是好的，是优异。&lt;br /&gt;
&lt;br /&gt;
而对小站 2C4G 的服务器，这是亏，这是性能地狱，堪比小儿抱金过市，8000 人同时来抢流量。&lt;br /&gt;
&lt;br /&gt;
最终，把不该敞开的门关上，就 OK 了。&lt;br /&gt;
&lt;br /&gt;
20260728&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Emacs 写配置时，越具有确定性的，越优先加载。越不具确定性、复杂易变的，越写在后面。&lt;br /&gt;
&lt;br /&gt;
20260722&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
成功的诀窍：对一切月薪、职级、名头、职位、学历、头衔、组织、团体、代码、软件、资金、外貌、身材袪魅，相信慢慢努力的力量。终将抵达。&lt;br /&gt;
&lt;br /&gt;
20260721&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
以前总觉得，她或许有苦衷，她或许在想办法解决。今天才看明白，她就是装问题不存在，就是反复内耗从我这里偷能量。犹豫、反复、易变，就是她性格的底色。评级为：不可靠之人。&lt;br /&gt;
&lt;br /&gt;
必须果断了。一切结束。&lt;br /&gt;
&lt;br /&gt;
好在她的日子也走上了她的正轨。她有适合她的人生。&lt;br /&gt;
&lt;br /&gt;
20260719&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
合租的麻烦在于，傻逼室友会消耗人的精神，什么公区地面肮脏，什么马桶上有尿迹，什么半夜洗衣服，什么高峰期长时间占据洗手间。在室外公共场合，见到傻逼躲远点就行，可以轻松避过；在室内场合，避无可避。这不是说要买房，而是说，不要与人合租。同一小区多加 500 元就能整租。多挣钱，把傻逼从生活中清出去，是很值的。&lt;br /&gt;
&lt;br /&gt;
20260716&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
一切工作都要为了销售。任何工作归根结底都为销售服务。虽然归根结底我们追求的是更好的生活，但它的动力就来自于销售额。直接把能力变现，找机会变现，才是一天之中的时间的正确用法。还需要明确，一个人一天高度专注的时间，不会超过四个小时。&lt;br /&gt;
&lt;br /&gt;
20260716&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
永远不要从事耗材型的工作。&lt;br /&gt;
&lt;br /&gt;
20260715&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
AI 有时会过于炫技，在正则与通配符上栽跟头。用 AI 写脚本，建议不要大而全，而是从小往大写，先写最核心的小功能，一步一步成功。而不要一写一个大箩筐，排错都很难。&lt;br /&gt;
&lt;br /&gt;
20260713&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
读源代码的方法：先吃透它为什么存在、怎样跑通、解决什么问题；细节理解到能继续前进即可；笔记只记录会反复忘、会反复用、会改变理解框架的东西。&lt;br /&gt;
&lt;br /&gt;
20260710&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
我已掌握戴隐形眼镜的焚诀。网络上许多人教戴，都是说，要么硬怼，要么放在下眼皮内，再仰头就行。都不说出其中的关键。&lt;br /&gt;
&lt;br /&gt;
关键在于，上眼皮就像守门员一样，会在异物进入眼睛时，迅速眨眼，把异物碰出眼睛之外，再通过迅速眨眼挤出杂质。&lt;br /&gt;
&lt;br /&gt;
所以戴隐形眼镜，归根结底，不能靠仰头蒙概率，而是要关闭上眼皮的防异物机制。那怎么做呢？&lt;br /&gt;
&lt;br /&gt;
在把隐形眼镜放进下眼皮之内后，腾个手指，严格的、认真的、放松的、结结实实的摁住上眼皮，让它没办法闭眼把隐形眼镜踫出来。这样就 OK 了，成功率提升 95%。&lt;br /&gt;
&lt;br /&gt;
至于为什么要戴隐形眼镜？鼻梁轻松多了。长期戴眼镜，会导致神智笨重，眼袋重。&lt;br /&gt;
&lt;br /&gt;
隐形眼镜的品牌，可以选海昌。在多多或京东买都可以。月抛的就很好。不用戴眼镜的一天，真的太舒服了。&lt;br /&gt;
&lt;br /&gt;
长期戴过重、不合适的眼镜，会导致鼻梁疼、神智含混。隐形眼镜戴太久，也对眼睛不好，引发干涩、眼疾。不要走极端。普通眼镜、隐形眼镜，各戴半天，是最佳的。&lt;br /&gt;
&lt;br /&gt;
20260622&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
# 强壮的身体&lt;br /&gt;
# 完美的颜值&lt;br /&gt;
# 高级的身份&lt;br /&gt;
# 持续的资产&lt;br /&gt;
# 前 1% 的技能&lt;br /&gt;
# 充能式的社会化&lt;br /&gt;
&lt;br /&gt;
20260614&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
去学林公园天养了一天。吃了鸡公煲和沙汤当早饭。骑行 30 分钟到了公园。喝了瓶东鹏特饮。摘了李子。翻了很多次跟头，全靠左肩摔，也不疼，克服了恐惧，有望学会后空翻。对着超绝湖景，吃了个泡椒鸡杂外卖。喝了瓶果粒橙、矿泉水，回到家门口时，全身传来一阵舒服，感觉休息得特别到位，一种生命力被充满的感觉。&lt;br /&gt;
&lt;br /&gt;
打开门，听到空着未租出去的那家，传来了擦桌子的声音，心情瞬间跌落谷底。太多人没有素质，会把公共的卫生间，弄得很脏。以前只用应对对门的两个不讲卫生、踩脏地面不清理、高峰期长时间占用卫生间洗、完澡不开窗透气的老女人，现在又要多应对一户人了。&lt;br /&gt;
&lt;br /&gt;
最让我难过的是，我还在住合租房。灵魂被压抑的感觉。这具身体跟着我，受苦了。&lt;br /&gt;
&lt;br /&gt;
20260614&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
爱情的本质，以前我认为是选择，现在我认为还是选择。&lt;br /&gt;
&lt;br /&gt;
两只小鸟，各有各的翅膀。&lt;br /&gt;
&lt;br /&gt;
如果飞往不同的地方，那注定是没有结果的。&lt;br /&gt;
&lt;br /&gt;
如果一只认为另一只不过如此，爽快各自飞，也算体面。&lt;br /&gt;
&lt;br /&gt;
又有几个人超过如此呢？&lt;br /&gt;
&lt;br /&gt;
如果一只打心底认为另一只不过如此，却还是占着爱情的位置，心里看不起，嘴上说着爱，那几乎可以算闹剧了。&lt;br /&gt;
&lt;br /&gt;
明知对方平凡，还要朝一个目的地飞，那才有结果吧。&lt;br /&gt;
&lt;br /&gt;
20260419&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
仅就影视作品来说，当我看见角色欣喜，我知道他快被锤了。生活中，处于被锤状态，比较无意外。&lt;br /&gt;
&lt;br /&gt;
20260409&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
近期看到最恐怖的一个词：蒸馏。这项技术是指，从一群文件中，训练出一个 AI。有人开玩笑：你的同事虽然被解雇了，但他已经化成 token（词元）在陪伴着你。意思就是把同事的往期工作内容、性格风格，训练成一个 AI。之后，很快出现了“员工.skill”“初恋.skill”“前任.skill”“老板.skill”。&amp;lt;code&amp;gt;.skill&amp;lt;/code&amp;gt; 不是一种标准文件格式，而是一种约定俗成的后缀，通常表示一个由多个文件组成的 AI 技能包（其实就是文件夹），里面包含提示词、说明、脚本和示例，供 AI 按流程复用。看这样子，AI 的发展开始魔怔了，开始抽取人的价值，但把人抛到一边，令他们离开或失业。比美剧《黑镜》里的场景更加冷血。&lt;br /&gt;
&lt;br /&gt;
以前程序员骂人会说：Talk is cheap, show me the fucking code. 言语是廉价的，给老子展示你的代码，代码见真章。现在一切都变了，成了：Code is cheap, show me your talk。代码不重要，展示你和 AI 聊天时的提示词。这件事非常冷幽默。但其实，当下的 AI，在连续性上，还大有不足，长而复杂的任务，AI 是做不好的。&lt;br /&gt;
&lt;br /&gt;
历史的车轮滚滚向前。悲观者认为脑力劳动者都将被 AI 代替，乐观者认为 AI 会带来新的历史机遇。可惜历史机遇，往往是过后方知。&lt;br /&gt;
&lt;br /&gt;
以前人群嘈嘈杂杂，见到年轻人提一个新点子，就拿这句话来 PUA：你这是有个好点子，只缺个程序员了，老弟，好想法一天有一千万人产生一千万个，有种的人应该自己把它写出来。想法很廉价，重在执行。&lt;br /&gt;
&lt;br /&gt;
等我有了一点阅历才发现，那些老气横秋的家伙，根本没有新点子，其实好想法是稀缺的。青春的意愿，其实是人生的礼物。老话说，人不可能同时拥有青春，和对青春的感受，真 TM 遗憾。&lt;br /&gt;
&lt;br /&gt;
想想每天都是人生中最年轻的一天，还是不熬夜早点睡吧。&lt;br /&gt;
&lt;br /&gt;
20260409&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
听着齐豫唱、三毛写的《橄榄树》，想起我有个朋友，帅气明净的短发，女孩，酷酷的。高一第一次化学考试，好像考了班级第一，很多女生说她很帅。她话不多，比较沉默。有一天，我在看三毛的书《送你一匹马》，她看见比较感兴趣，就借过去看了。然后说起过人生的意义。&lt;br /&gt;
&lt;br /&gt;
听说她高考没考好，我不清楚。多年后，听说她，怎么说呢，疯了？傻了？她的心智拒绝长大，一直停在借《送你一匹马》去读那时候：世界广阔，青春鲜活，未来充满梦想。她应该想去很多地方，她畅想着无限的快乐和幸福，总不可能有人希望自己未来活在阴影里吧。&lt;br /&gt;
&lt;br /&gt;
我辗转联系见了她一面。她妈妈送她来的。她傻傻的，比高中的心智更小一点了，像退到了小学生。认识我，但是把我当小学玩伴的感觉。假如带着她在大夏天去山里抓金龟子，估计她会很开心。像那首《捉泥鳅》里唱的那样：“小牛的哥哥带着他捉泥鳅，大哥哥好不好咱们去捉泥鳅”。&lt;br /&gt;
&lt;br /&gt;
她走了三十米路，她妈妈挑了她四五个错。听说我做文字方面的工作，她妈妈痛心疾首地说她爸爸就是诗人、作家，连饭都吃不起。&lt;br /&gt;
&lt;br /&gt;
我不知道她为什么停在旧时间，不肯向走前。能感觉到她活在另一片空间，眼前的她，拒绝了一切。我希望她开心。&lt;br /&gt;
&lt;br /&gt;
20260408&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
齐豫《飞鸟与鱼》里唱到：&lt;br /&gt;
&amp;lt;poem&amp;gt;&lt;br /&gt;
蓝的天 蓝的海&lt;br /&gt;
难为了 难为了我和你&lt;br /&gt;
什么天地啊四季啊 昼夜啊&lt;br /&gt;
什么海天一色&lt;br /&gt;
地狱天堂 暮鼓晨钟&lt;br /&gt;
Always together forever apart&lt;br /&gt;
Always together forever apart&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
人们往往把相恋又分开的人，比作飞鸟与鱼，指两者一个在水里，一个在天上，相伴却相离。&lt;br /&gt;
&lt;br /&gt;
对某些人来说，会有更绝决的比喻，那就是飞鸟与飞鸟，鱼与鱼。本是同类，不是因外在条件而体面分开，而是因内在原因，各有各的欲，更体面地分开。&lt;br /&gt;
&lt;br /&gt;
人各自追求自己的欲，是一种更大的体面。也是一种隐约的残忍，相爱的同类，也会有不同的追求。世界的炫丽多姿，就是因为，人各有所求。&lt;br /&gt;
&lt;br /&gt;
20260408&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
贫穷是最大的慢性毒药。一次次的小成功是最大的慢性补药。挣钱是最大的美德。&lt;br /&gt;
&lt;br /&gt;
20260329&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
3 月 29 日，不到两个月时间，剃光的头发完美地长出来了。左边头发好看的向右斜。右边的头发整体向前向下，也略往右斜。农历二月十一，昨晚盖厚被子已经热得睡不着，换了簿被，今天中午去买裤子，正午的阳光晒身上，已隐约有夏天的感觉。一条西裤 65 元、一条牛仔裤 80 元，31 码的腰，像给我量身定做的。买衣服还是得去实体店，合身，也没想象中贵，省了退货时间。锻炼多了腰细，很健康的感觉，真不敢想像以前买西裤竟然专门买 33 码的腰，为了吃饭后不勒肚子，却没有深入再多想几层，比如是否处于肥胖状态需要减肥，比如是否吃太多需要节制，比如是否裤腰太大有损美观。周一进电梯，有一个来得比较少的同事说我瘦了，是不是在健身，这才刚开始锻炼就被人发现了，心里暗爽。&lt;br /&gt;
&lt;br /&gt;
20260329&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
少有的从睡梦中惊醒，赶紧睁眼看，想弄清楚自己是在午休帽下，还是在温暖的被子里。担心午休睡过头，或者早上睡过头。焦虑也是够够的。让我想起《时间规划局》，时间就是生命。明明知道自己被囚，却并未有效行动改变，那就是蠢材。房间里的大象，为何视而不见？&lt;br /&gt;
&lt;br /&gt;
20260323&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
自媒体的本质，其实是梦想的实现。现在就业市场，很像 80 年代的香港，普通打工人很少有逆天改命的机会，反而是有梦想的、有技艺的人，追求梦想、人人演艺，能闯出一片天。很有种经济水平上来了，社会自然该出现这个阶层的感觉。看周星驰和其他港片里小人物多么努力才能有所成就，与当前我面临的现实一样。&lt;br /&gt;
&lt;br /&gt;
20260323&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
春雨贵如油，可是……&lt;br /&gt;
&lt;br /&gt;
20260317&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
整理了一百件琐碎物品：&lt;br /&gt;
* 第一格，清洁用品：沐浴露替补装，袋装未开封洗发露，消毒液，牙刷，抹布，棉柔纸巾，洗碗擦&lt;br /&gt;
* 第二格，物质食粮和精神食粮：珍贵物品盒。大米，大枣，面粉，玻璃杯装的笔若干支。面粉远离珍贵物品盒&lt;br /&gt;
* 第三格，电器及电线：数据线若干，万用表，充电宝，遥控器，火胶布，小票机，电池若干，充电器若干&lt;br /&gt;
* 第四格，低频次重物：拖把头，旧电器，哑铃片，一次性马桶垫&lt;br /&gt;
* 桌面盒，高频次轻物：长尾夹，充电宝，有线耳机，蓝牙耳机，零钱，卷尺&lt;br /&gt;
&lt;br /&gt;
井井有条，身心舒畅。&lt;br /&gt;
&lt;br /&gt;
20260317&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
注意力是这个时代最宝贵的资产，但往往被人们浪费了，沉迷于短视频算法带来的浅薄快乐。&lt;br /&gt;
&lt;br /&gt;
20260315&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
月薪 8000 元的人，扣除生活费 1500 元、房租 1500 元，月攒 5000 元。月薪 5000 元的人，扣除生活费 1000 元、房租 800 元，月攒 3200 元。5000 / 3200 = 1.56 倍。月薪 8000 元的人，不止攒钱速率是月薪 5000 元的人的 1.56 倍，生活品质也更高。工资真是太重要了啊。&lt;br /&gt;
&lt;br /&gt;
20260314&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
0201 - 0313，41 天，头发长度终于恢复平头水平了。头上分了四个区域。右手边，头发向前。左手边，头发向前。后面，头发先向右手，再向左手边旋。前面，头发向右再向前。难怪自然卷，这天然和别人的直发不一样呐，各个区域有各个区域的个性。以后做发型都顺其自然做。&lt;br /&gt;
&lt;br /&gt;
20260313&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
帅是一种感觉，各方面比别人强一点，就帅了。比别人敢担当一点，比别人体态好一点，比别人多点肌肉，比别人发型好看点，比别人脸干净点，比别人穿得体点，比别人工作好一点，每样好一点点，就能形成碾压式的帅的感觉。&lt;br /&gt;
&lt;br /&gt;
20260313&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
春天的雨，有一种温柔感、生机感，仿佛情侣耍小脾气，因为有爱支撑，可以很安全地等未来的无限可能。秋冬的雨，只有肃杀，寒潮一阵阵加剧，见了心里只有悲凉，以及对万物凋零的预期。&lt;br /&gt;
&lt;br /&gt;
20260311&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
年少时，太自由了。可以很轻易放弃很多东西。年龄大了，选择权收窄了，各种可能性都收窄了。心累，是因为对未来有强烈的不安全感。眼睛看不穿迷雾，怎么会有自由？&lt;br /&gt;
&lt;br /&gt;
曾经皮肤好，随便晒，现在竟也开始做防晒了，因为好像晒了真会有淡斑，虽然会很快消失，但就怕哪天突然不再消失了。曾经牙齿好，不相信网上说的刷两分钟就好，偏要刷十分钟搞个彻底清洁。身边朋友牙齿不好了，昨天刷牙时，突然担忧刷太久把牙给磨坏了，以后也尽快刷干净了事，不再边刷牙边长时间刷手机了。听说刷牙只要去除了食物残渣即可。&lt;br /&gt;
&lt;br /&gt;
夜深忽梦少年事，梦啼妆泪红阑干。&lt;br /&gt;
&lt;br /&gt;
20260310&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Show the results. Show the apps. Show the money.&lt;br /&gt;
&lt;br /&gt;
人们只关心结果、产品和钱。&lt;br /&gt;
&lt;br /&gt;
过程、代码、努力，根本不重要。&lt;br /&gt;
&lt;br /&gt;
20260309&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
老旧港片有一种蒙昧时代天真幻想的气质，很有侠义风范。和《百年孤独》里对现代的幻想，也差不多。&lt;br /&gt;
&lt;br /&gt;
20260307&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
让人生健康的七件小事：&lt;br /&gt;
# 抛弃别人的目标，抛弃等待&lt;br /&gt;
# 固守上午的目标&lt;br /&gt;
# 固守下午的目标&lt;br /&gt;
# 固守晚上的目标&lt;br /&gt;
# 固守周六的目标&lt;br /&gt;
# 固守周日的目标&lt;br /&gt;
# 只管自己的事&lt;br /&gt;
&lt;br /&gt;
20260306&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
真正的安稳，并不是练了多少肌肉，徒了多少步，看了多少风景。没有稳定的工作，没有稳定的经济来源，那些都是沙上之塔，一溃而散。先把钱包装得满满的，才有真的安稳。&lt;br /&gt;
&lt;br /&gt;
20260305&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
10 ℃ 的天，需要一头长发。短发太冷了。&lt;br /&gt;
&lt;br /&gt;
20260305&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
大多数人被圈在十公里以内。&lt;br /&gt;
&lt;br /&gt;
20260302&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
不带电脑，自带拖鞋，轻装出行，老片下好，这样旅行太爽了&lt;br /&gt;
&lt;br /&gt;
20260301&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
在路上，并不用过于焦虑。我因买不到万州去利川的火车票而焦虑，在万州吃饭时，旅馆老板、饭店老板，都跟我说去万州汽车南站全天车次很多。虽然我自己早有此打算，但就算我不知道，只要来到此地，一样会得到这个有用信息。所以在路上总有许多机遇。&lt;br /&gt;
&lt;br /&gt;
20260301&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
人家对自己的痛苦甘之如饴，或者只是随便说说，我却共情了两年，比那本人还痛苦。我真是傻逼。&lt;br /&gt;
&lt;br /&gt;
我找她，站票、硬座、夜车。我接她，13 公里，收拾好花甲和菜。&lt;br /&gt;
&lt;br /&gt;
她找我，顺路。她接待我：不见。买五小时后的车次，见面三分钟就要打车走。&lt;br /&gt;
&lt;br /&gt;
权衡利弊后放弃了我。我无所谓，早就习惯一个人。&lt;br /&gt;
&lt;br /&gt;
只要她是正确的，选择了更阳光明媚的生活，在追寻理想中的幸福，我就可以安心消失。从此，悲喜不相关，人生无瓜葛。&lt;br /&gt;
&lt;br /&gt;
从此，投身于自己的幸福。&lt;br /&gt;
&lt;br /&gt;
20260226&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
别人说了不想就是不想，还打破砂锅问到底，非常不礼貌。爱可能是假的，不爱一定是真的。&lt;br /&gt;
&lt;br /&gt;
20260226&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
预报说没雨，越往山顶，雨却越大。上山时就有小雨，我赌不会下大。若等会儿真的下了大雨，也自己承受。&lt;br /&gt;
&lt;br /&gt;
20260225&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
一件衣服，色彩与配饰，传达的信息量越大越难看，喧宾夺主了，越少越能彰显穿衣人的气质。比如纽扣颜色与衣服主色不一致，或纽扣内面与衣服主色不一致，就有廉价感。裁剪设计，不应该超过两种想法，只有一种思想表达是最好的。材质和颜色，越接近地面与环境里的中性色，越好看，比如水泥色、木材色、高铁站地板的大理石色。颜色不要过于纯净，也不要过于拼色，明度微暗感觉穿起来更生动。&lt;br /&gt;
&lt;br /&gt;
20260224&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
我认为一句“祝你幸福。”是一段感情最完美的结束。&lt;br /&gt;
&lt;br /&gt;
20260223&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
未变现的认知，属于笑话范畴。&lt;br /&gt;
&lt;br /&gt;
20260222&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Act like someone who will succeed.&lt;br /&gt;
&lt;br /&gt;
行为先于身份。你先按成功者的方式行事，成功才会追上你。&lt;br /&gt;
&lt;br /&gt;
20260207&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
不要相信阴暗、无力、无希望的那一面。&lt;br /&gt;
&lt;br /&gt;
20260207&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
有人问，为什么出去旅行要大清早五六点就出发？这是一个早一分钟早半小时，晚一分钟晚两小时的故事。旅游目的地和小城，有的季节人流爆满，有的季节人流缺缺，公交车次就不是轮班制，是定班制，错过一趟要等半小时起步。像今天早上，去吃包子，计划十分钟，然而你怎能料到上一位买三十个包子，且在那里犹豫不定呢，急人。这种意外耽搁多了，就易误车。再者，一日之计在于晨，如果十点前还没完成一些事，就一整天都不容易有动力。15 点之后去多数景点得考虑四个问题：阳光不足，错过入园，排队爆涨，回程无车。所以，早点出发，一切容易按计划运行。此刻，因留足了容错时间，早早出发，按时赶到地铁站了，就能按计划赶上去浮槎山的 09:10 的定班车。&lt;br /&gt;
&lt;br /&gt;
20260201&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Entropy consumes life。熵以生命为食。混乱无序会令人不断下坠。要元气满满，必须对混乱无序主动出击。&lt;br /&gt;
&lt;br /&gt;
20260122&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
话说人生有看山是山，看水是水的阶段；有看山不是山，看水不是水的阶段；有看山是山，看水是水的阶段。意思是人总会经历纯真、革新、质朴三个阶段。年少时，认为钱不重要。初入社会，会觉得钱比一切都重要；受到挫折，又会认为钱不重要。最后，会知道钱是客观交换媒介，开心最重要。一个人需要的是休息，而不是出走职场。所谓的 gap 半年，学点东西，再回职场，如今的职场形势，很容易受到针对 gap 的惩罚。钱花光了，陷入贫困，容易陷入狂热的拜金主义，却又无法面对简历上增长曲线的断崖，难以实现跳跃。不离开职场，找一份双休的、不加班的工作，假日游山玩水，才会最快恢复元气。&lt;br /&gt;
&lt;br /&gt;
协商辞职公司会补偿 N+1，主动辞职公司不补偿。主动辞职，需提前 30 日递交《辞职通知》给公司。七八月大学生涌入市场，最难找工作。三四月是最好找工作的时段，因为企业缺人。&lt;br /&gt;
&lt;br /&gt;
如果上一份工作耗净了元气，太累了，想去云南。多半会失望。世界上没有彼岸，把此岸过好，才会快乐。云南自然风光无敌。可若缺钱，在哪里都过不好。城市切换的成本，至少 5000 元。工作切换的成本，更加高昂。想拿到年终奖再辞职，完全可以理解。不过，健康很重要。金钱诚可贵，元气价更高。&lt;br /&gt;
&lt;br /&gt;
20260119&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
做任何事，都得有点甜头，不然长久不了。比如看英文书，有人推崇全英文原版，但难度太高根本坚持不下去。比如学编程，有人推崇一上来就大部头，掌握底层原理，但没成就感就会饿死在路上。比如健身，有人推崇一上来就标准动作，日做四组，一来就遇到挫折是坚持不下去的。比如让学 Linux，一上来就 Vim Emacs 纯英文文档，也只能半途而废。比日常多轻微些许难度，有许多甜头，才能真的把事情做成。&lt;br /&gt;
&lt;br /&gt;
20260114&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
水面波光粼粼，太阳浮光跃金，我们的爱，像小纸船，飘远了，不见了。&lt;br /&gt;
&lt;br /&gt;
20260112&lt;br /&gt;
----&lt;br /&gt;
最近，门禁卡失灵了，电脑屏幕坏了，饭卡丢了，棉拖被小太阳烤坏了，常去那家现包包子店倒闭了。&lt;br /&gt;
&lt;br /&gt;
门禁卡去物业刷新了。电脑买了新屏幕。饭卡去行政处办张新的。买了新棉拖。早餐多吃鸡蛋。&lt;br /&gt;
&lt;br /&gt;
20260106&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=%E7%81%B5%E6%9C%BA%E4%B8%80%E9%97%AA_2026&amp;diff=11565</id>
		<title>灵机一闪 2026</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=%E7%81%B5%E6%9C%BA%E4%B8%80%E9%97%AA_2026&amp;diff=11565"/>
		<updated>2026-07-28T09:28:46Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;由于最近心思放在别的，网站又恰好改出了一个小 bug，短短几天，访问我站的爬虫，陷入了无间地狱。&lt;br /&gt;
&lt;br /&gt;
简单来说就是爬虫发现这个站有无穷无尽的链接，8000 个 IP 全来找链接。我的小服务器差点被打爆。&lt;br /&gt;
&lt;br /&gt;
感觉这就像股市那句：盈亏同源。&lt;br /&gt;
&lt;br /&gt;
因为 MediaWiki 根本设计上就是每一笔历史都可以追溯查找，这是盈，是好的，是优异。&lt;br /&gt;
&lt;br /&gt;
而对小站 2C4G 的服务器，这是亏，这是性能地狱，堪比小儿抱金过市，8000 人同时来抢流量。&lt;br /&gt;
&lt;br /&gt;
最终，把不该敞开的门关上，就 OK 了&lt;br /&gt;
&lt;br /&gt;
20260728&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Emacs 写配置时，越具有确定性的，越优先加载。越不具确定性、复杂易变的，越写在后面。&lt;br /&gt;
&lt;br /&gt;
20260722&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
成功的诀窍：对一切月薪、职级、名头、职位、学历、头衔、组织、团体、代码、软件、资金、外貌、身材袪魅，相信慢慢努力的力量。终将抵达。&lt;br /&gt;
&lt;br /&gt;
20260721&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
以前总觉得，她或许有苦衷，她或许在想办法解决。今天才看明白，她就是装问题不存在，就是反复内耗从我这里偷能量。犹豫、反复、易变，就是她性格的底色。评级为：不可靠之人。&lt;br /&gt;
&lt;br /&gt;
必须果断了。一切结束。&lt;br /&gt;
&lt;br /&gt;
好在她的日子也走上了她的正轨。她有适合她的人生。&lt;br /&gt;
&lt;br /&gt;
20260719&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
合租的麻烦在于，傻逼室友会消耗人的精神，什么公区地面肮脏，什么马桶上有尿迹，什么半夜洗衣服，什么高峰期长时间占据洗手间。在室外公共场合，见到傻逼躲远点就行，可以轻松避过；在室内场合，避无可避。这不是说要买房，而是说，不要与人合租。同一小区多加 500 元就能整租。多挣钱，把傻逼从生活中清出去，是很值的。&lt;br /&gt;
&lt;br /&gt;
20260716&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
一切工作都要为了销售。任何工作归根结底都为销售服务。虽然归根结底我们追求的是更好的生活，但它的动力就来自于销售额。直接把能力变现，找机会变现，才是一天之中的时间的正确用法。还需要明确，一个人一天高度专注的时间，不会超过四个小时。&lt;br /&gt;
&lt;br /&gt;
20260716&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
永远不要从事耗材型的工作。&lt;br /&gt;
&lt;br /&gt;
20260715&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
AI 有时会过于炫技，在正则与通配符上栽跟头。用 AI 写脚本，建议不要大而全，而是从小往大写，先写最核心的小功能，一步一步成功。而不要一写一个大箩筐，排错都很难。&lt;br /&gt;
&lt;br /&gt;
20260713&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
读源代码的方法：先吃透它为什么存在、怎样跑通、解决什么问题；细节理解到能继续前进即可；笔记只记录会反复忘、会反复用、会改变理解框架的东西。&lt;br /&gt;
&lt;br /&gt;
20260710&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
我已掌握戴隐形眼镜的焚诀。网络上许多人教戴，都是说，要么硬怼，要么放在下眼皮内，再仰头就行。都不说出其中的关键。&lt;br /&gt;
&lt;br /&gt;
关键在于，上眼皮就像守门员一样，会在异物进入眼睛时，迅速眨眼，把异物碰出眼睛之外，再通过迅速眨眼挤出杂质。&lt;br /&gt;
&lt;br /&gt;
所以戴隐形眼镜，归根结底，不能靠仰头蒙概率，而是要关闭上眼皮的防异物机制。那怎么做呢？&lt;br /&gt;
&lt;br /&gt;
在把隐形眼镜放进下眼皮之内后，腾个手指，严格的、认真的、放松的、结结实实的摁住上眼皮，让它没办法闭眼把隐形眼镜踫出来。这样就 OK 了，成功率提升 95%。&lt;br /&gt;
&lt;br /&gt;
至于为什么要戴隐形眼镜？鼻梁轻松多了。长期戴眼镜，会导致神智笨重，眼袋重。&lt;br /&gt;
&lt;br /&gt;
隐形眼镜的品牌，可以选海昌。在多多或京东买都可以。月抛的就很好。不用戴眼镜的一天，真的太舒服了。&lt;br /&gt;
&lt;br /&gt;
长期戴过重、不合适的眼镜，会导致鼻梁疼、神智含混。隐形眼镜戴太久，也对眼睛不好，引发干涩、眼疾。不要走极端。普通眼镜、隐形眼镜，各戴半天，是最佳的。&lt;br /&gt;
&lt;br /&gt;
20260622&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
# 强壮的身体&lt;br /&gt;
# 完美的颜值&lt;br /&gt;
# 高级的身份&lt;br /&gt;
# 持续的资产&lt;br /&gt;
# 前 1% 的技能&lt;br /&gt;
# 充能式的社会化&lt;br /&gt;
&lt;br /&gt;
20260614&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
去学林公园天养了一天。吃了鸡公煲和沙汤当早饭。骑行 30 分钟到了公园。喝了瓶东鹏特饮。摘了李子。翻了很多次跟头，全靠左肩摔，也不疼，克服了恐惧，有望学会后空翻。对着超绝湖景，吃了个泡椒鸡杂外卖。喝了瓶果粒橙、矿泉水，回到家门口时，全身传来一阵舒服，感觉休息得特别到位，一种生命力被充满的感觉。&lt;br /&gt;
&lt;br /&gt;
打开门，听到空着未租出去的那家，传来了擦桌子的声音，心情瞬间跌落谷底。太多人没有素质，会把公共的卫生间，弄得很脏。以前只用应对对门的两个不讲卫生、踩脏地面不清理、高峰期长时间占用卫生间洗、完澡不开窗透气的老女人，现在又要多应对一户人了。&lt;br /&gt;
&lt;br /&gt;
最让我难过的是，我还在住合租房。灵魂被压抑的感觉。这具身体跟着我，受苦了。&lt;br /&gt;
&lt;br /&gt;
20260614&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
爱情的本质，以前我认为是选择，现在我认为还是选择。&lt;br /&gt;
&lt;br /&gt;
两只小鸟，各有各的翅膀。&lt;br /&gt;
&lt;br /&gt;
如果飞往不同的地方，那注定是没有结果的。&lt;br /&gt;
&lt;br /&gt;
如果一只认为另一只不过如此，爽快各自飞，也算体面。&lt;br /&gt;
&lt;br /&gt;
又有几个人超过如此呢？&lt;br /&gt;
&lt;br /&gt;
如果一只打心底认为另一只不过如此，却还是占着爱情的位置，心里看不起，嘴上说着爱，那几乎可以算闹剧了。&lt;br /&gt;
&lt;br /&gt;
明知对方平凡，还要朝一个目的地飞，那才有结果吧。&lt;br /&gt;
&lt;br /&gt;
20260419&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
仅就影视作品来说，当我看见角色欣喜，我知道他快被锤了。生活中，处于被锤状态，比较无意外。&lt;br /&gt;
&lt;br /&gt;
20260409&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
近期看到最恐怖的一个词：蒸馏。这项技术是指，从一群文件中，训练出一个 AI。有人开玩笑：你的同事虽然被解雇了，但他已经化成 token（词元）在陪伴着你。意思就是把同事的往期工作内容、性格风格，训练成一个 AI。之后，很快出现了“员工.skill”“初恋.skill”“前任.skill”“老板.skill”。&amp;lt;code&amp;gt;.skill&amp;lt;/code&amp;gt; 不是一种标准文件格式，而是一种约定俗成的后缀，通常表示一个由多个文件组成的 AI 技能包（其实就是文件夹），里面包含提示词、说明、脚本和示例，供 AI 按流程复用。看这样子，AI 的发展开始魔怔了，开始抽取人的价值，但把人抛到一边，令他们离开或失业。比美剧《黑镜》里的场景更加冷血。&lt;br /&gt;
&lt;br /&gt;
以前程序员骂人会说：Talk is cheap, show me the fucking code. 言语是廉价的，给老子展示你的代码，代码见真章。现在一切都变了，成了：Code is cheap, show me your talk。代码不重要，展示你和 AI 聊天时的提示词。这件事非常冷幽默。但其实，当下的 AI，在连续性上，还大有不足，长而复杂的任务，AI 是做不好的。&lt;br /&gt;
&lt;br /&gt;
历史的车轮滚滚向前。悲观者认为脑力劳动者都将被 AI 代替，乐观者认为 AI 会带来新的历史机遇。可惜历史机遇，往往是过后方知。&lt;br /&gt;
&lt;br /&gt;
以前人群嘈嘈杂杂，见到年轻人提一个新点子，就拿这句话来 PUA：你这是有个好点子，只缺个程序员了，老弟，好想法一天有一千万人产生一千万个，有种的人应该自己把它写出来。想法很廉价，重在执行。&lt;br /&gt;
&lt;br /&gt;
等我有了一点阅历才发现，那些老气横秋的家伙，根本没有新点子，其实好想法是稀缺的。青春的意愿，其实是人生的礼物。老话说，人不可能同时拥有青春，和对青春的感受，真 TM 遗憾。&lt;br /&gt;
&lt;br /&gt;
想想每天都是人生中最年轻的一天，还是不熬夜早点睡吧。&lt;br /&gt;
&lt;br /&gt;
20260409&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
听着齐豫唱、三毛写的《橄榄树》，想起我有个朋友，帅气明净的短发，女孩，酷酷的。高一第一次化学考试，好像考了班级第一，很多女生说她很帅。她话不多，比较沉默。有一天，我在看三毛的书《送你一匹马》，她看见比较感兴趣，就借过去看了。然后说起过人生的意义。&lt;br /&gt;
&lt;br /&gt;
听说她高考没考好，我不清楚。多年后，听说她，怎么说呢，疯了？傻了？她的心智拒绝长大，一直停在借《送你一匹马》去读那时候：世界广阔，青春鲜活，未来充满梦想。她应该想去很多地方，她畅想着无限的快乐和幸福，总不可能有人希望自己未来活在阴影里吧。&lt;br /&gt;
&lt;br /&gt;
我辗转联系见了她一面。她妈妈送她来的。她傻傻的，比高中的心智更小一点了，像退到了小学生。认识我，但是把我当小学玩伴的感觉。假如带着她在大夏天去山里抓金龟子，估计她会很开心。像那首《捉泥鳅》里唱的那样：“小牛的哥哥带着他捉泥鳅，大哥哥好不好咱们去捉泥鳅”。&lt;br /&gt;
&lt;br /&gt;
她走了三十米路，她妈妈挑了她四五个错。听说我做文字方面的工作，她妈妈痛心疾首地说她爸爸就是诗人、作家，连饭都吃不起。&lt;br /&gt;
&lt;br /&gt;
我不知道她为什么停在旧时间，不肯向走前。能感觉到她活在另一片空间，眼前的她，拒绝了一切。我希望她开心。&lt;br /&gt;
&lt;br /&gt;
20260408&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
齐豫《飞鸟与鱼》里唱到：&lt;br /&gt;
&amp;lt;poem&amp;gt;&lt;br /&gt;
蓝的天 蓝的海&lt;br /&gt;
难为了 难为了我和你&lt;br /&gt;
什么天地啊四季啊 昼夜啊&lt;br /&gt;
什么海天一色&lt;br /&gt;
地狱天堂 暮鼓晨钟&lt;br /&gt;
Always together forever apart&lt;br /&gt;
Always together forever apart&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
人们往往把相恋又分开的人，比作飞鸟与鱼，指两者一个在水里，一个在天上，相伴却相离。&lt;br /&gt;
&lt;br /&gt;
对某些人来说，会有更绝决的比喻，那就是飞鸟与飞鸟，鱼与鱼。本是同类，不是因外在条件而体面分开，而是因内在原因，各有各的欲，更体面地分开。&lt;br /&gt;
&lt;br /&gt;
人各自追求自己的欲，是一种更大的体面。也是一种隐约的残忍，相爱的同类，也会有不同的追求。世界的炫丽多姿，就是因为，人各有所求。&lt;br /&gt;
&lt;br /&gt;
20260408&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
贫穷是最大的慢性毒药。一次次的小成功是最大的慢性补药。挣钱是最大的美德。&lt;br /&gt;
&lt;br /&gt;
20260329&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
3 月 29 日，不到两个月时间，剃光的头发完美地长出来了。左边头发好看的向右斜。右边的头发整体向前向下，也略往右斜。农历二月十一，昨晚盖厚被子已经热得睡不着，换了簿被，今天中午去买裤子，正午的阳光晒身上，已隐约有夏天的感觉。一条西裤 65 元、一条牛仔裤 80 元，31 码的腰，像给我量身定做的。买衣服还是得去实体店，合身，也没想象中贵，省了退货时间。锻炼多了腰细，很健康的感觉，真不敢想像以前买西裤竟然专门买 33 码的腰，为了吃饭后不勒肚子，却没有深入再多想几层，比如是否处于肥胖状态需要减肥，比如是否吃太多需要节制，比如是否裤腰太大有损美观。周一进电梯，有一个来得比较少的同事说我瘦了，是不是在健身，这才刚开始锻炼就被人发现了，心里暗爽。&lt;br /&gt;
&lt;br /&gt;
20260329&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
少有的从睡梦中惊醒，赶紧睁眼看，想弄清楚自己是在午休帽下，还是在温暖的被子里。担心午休睡过头，或者早上睡过头。焦虑也是够够的。让我想起《时间规划局》，时间就是生命。明明知道自己被囚，却并未有效行动改变，那就是蠢材。房间里的大象，为何视而不见？&lt;br /&gt;
&lt;br /&gt;
20260323&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
自媒体的本质，其实是梦想的实现。现在就业市场，很像 80 年代的香港，普通打工人很少有逆天改命的机会，反而是有梦想的、有技艺的人，追求梦想、人人演艺，能闯出一片天。很有种经济水平上来了，社会自然该出现这个阶层的感觉。看周星驰和其他港片里小人物多么努力才能有所成就，与当前我面临的现实一样。&lt;br /&gt;
&lt;br /&gt;
20260323&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
春雨贵如油，可是……&lt;br /&gt;
&lt;br /&gt;
20260317&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
整理了一百件琐碎物品：&lt;br /&gt;
* 第一格，清洁用品：沐浴露替补装，袋装未开封洗发露，消毒液，牙刷，抹布，棉柔纸巾，洗碗擦&lt;br /&gt;
* 第二格，物质食粮和精神食粮：珍贵物品盒。大米，大枣，面粉，玻璃杯装的笔若干支。面粉远离珍贵物品盒&lt;br /&gt;
* 第三格，电器及电线：数据线若干，万用表，充电宝，遥控器，火胶布，小票机，电池若干，充电器若干&lt;br /&gt;
* 第四格，低频次重物：拖把头，旧电器，哑铃片，一次性马桶垫&lt;br /&gt;
* 桌面盒，高频次轻物：长尾夹，充电宝，有线耳机，蓝牙耳机，零钱，卷尺&lt;br /&gt;
&lt;br /&gt;
井井有条，身心舒畅。&lt;br /&gt;
&lt;br /&gt;
20260317&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
注意力是这个时代最宝贵的资产，但往往被人们浪费了，沉迷于短视频算法带来的浅薄快乐。&lt;br /&gt;
&lt;br /&gt;
20260315&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
月薪 8000 元的人，扣除生活费 1500 元、房租 1500 元，月攒 5000 元。月薪 5000 元的人，扣除生活费 1000 元、房租 800 元，月攒 3200 元。5000 / 3200 = 1.56 倍。月薪 8000 元的人，不止攒钱速率是月薪 5000 元的人的 1.56 倍，生活品质也更高。工资真是太重要了啊。&lt;br /&gt;
&lt;br /&gt;
20260314&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
0201 - 0313，41 天，头发长度终于恢复平头水平了。头上分了四个区域。右手边，头发向前。左手边，头发向前。后面，头发先向右手，再向左手边旋。前面，头发向右再向前。难怪自然卷，这天然和别人的直发不一样呐，各个区域有各个区域的个性。以后做发型都顺其自然做。&lt;br /&gt;
&lt;br /&gt;
20260313&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
帅是一种感觉，各方面比别人强一点，就帅了。比别人敢担当一点，比别人体态好一点，比别人多点肌肉，比别人发型好看点，比别人脸干净点，比别人穿得体点，比别人工作好一点，每样好一点点，就能形成碾压式的帅的感觉。&lt;br /&gt;
&lt;br /&gt;
20260313&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
春天的雨，有一种温柔感、生机感，仿佛情侣耍小脾气，因为有爱支撑，可以很安全地等未来的无限可能。秋冬的雨，只有肃杀，寒潮一阵阵加剧，见了心里只有悲凉，以及对万物凋零的预期。&lt;br /&gt;
&lt;br /&gt;
20260311&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
年少时，太自由了。可以很轻易放弃很多东西。年龄大了，选择权收窄了，各种可能性都收窄了。心累，是因为对未来有强烈的不安全感。眼睛看不穿迷雾，怎么会有自由？&lt;br /&gt;
&lt;br /&gt;
曾经皮肤好，随便晒，现在竟也开始做防晒了，因为好像晒了真会有淡斑，虽然会很快消失，但就怕哪天突然不再消失了。曾经牙齿好，不相信网上说的刷两分钟就好，偏要刷十分钟搞个彻底清洁。身边朋友牙齿不好了，昨天刷牙时，突然担忧刷太久把牙给磨坏了，以后也尽快刷干净了事，不再边刷牙边长时间刷手机了。听说刷牙只要去除了食物残渣即可。&lt;br /&gt;
&lt;br /&gt;
夜深忽梦少年事，梦啼妆泪红阑干。&lt;br /&gt;
&lt;br /&gt;
20260310&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Show the results. Show the apps. Show the money.&lt;br /&gt;
&lt;br /&gt;
人们只关心结果、产品和钱。&lt;br /&gt;
&lt;br /&gt;
过程、代码、努力，根本不重要。&lt;br /&gt;
&lt;br /&gt;
20260309&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
老旧港片有一种蒙昧时代天真幻想的气质，很有侠义风范。和《百年孤独》里对现代的幻想，也差不多。&lt;br /&gt;
&lt;br /&gt;
20260307&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
让人生健康的七件小事：&lt;br /&gt;
# 抛弃别人的目标，抛弃等待&lt;br /&gt;
# 固守上午的目标&lt;br /&gt;
# 固守下午的目标&lt;br /&gt;
# 固守晚上的目标&lt;br /&gt;
# 固守周六的目标&lt;br /&gt;
# 固守周日的目标&lt;br /&gt;
# 只管自己的事&lt;br /&gt;
&lt;br /&gt;
20260306&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
真正的安稳，并不是练了多少肌肉，徒了多少步，看了多少风景。没有稳定的工作，没有稳定的经济来源，那些都是沙上之塔，一溃而散。先把钱包装得满满的，才有真的安稳。&lt;br /&gt;
&lt;br /&gt;
20260305&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
10 ℃ 的天，需要一头长发。短发太冷了。&lt;br /&gt;
&lt;br /&gt;
20260305&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
大多数人被圈在十公里以内。&lt;br /&gt;
&lt;br /&gt;
20260302&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
不带电脑，自带拖鞋，轻装出行，老片下好，这样旅行太爽了&lt;br /&gt;
&lt;br /&gt;
20260301&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
在路上，并不用过于焦虑。我因买不到万州去利川的火车票而焦虑，在万州吃饭时，旅馆老板、饭店老板，都跟我说去万州汽车南站全天车次很多。虽然我自己早有此打算，但就算我不知道，只要来到此地，一样会得到这个有用信息。所以在路上总有许多机遇。&lt;br /&gt;
&lt;br /&gt;
20260301&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
人家对自己的痛苦甘之如饴，或者只是随便说说，我却共情了两年，比那本人还痛苦。我真是傻逼。&lt;br /&gt;
&lt;br /&gt;
我找她，站票、硬座、夜车。我接她，13 公里，收拾好花甲和菜。&lt;br /&gt;
&lt;br /&gt;
她找我，顺路。她接待我：不见。买五小时后的车次，见面三分钟就要打车走。&lt;br /&gt;
&lt;br /&gt;
权衡利弊后放弃了我。我无所谓，早就习惯一个人。&lt;br /&gt;
&lt;br /&gt;
只要她是正确的，选择了更阳光明媚的生活，在追寻理想中的幸福，我就可以安心消失。从此，悲喜不相关，人生无瓜葛。&lt;br /&gt;
&lt;br /&gt;
从此，投身于自己的幸福。&lt;br /&gt;
&lt;br /&gt;
20260226&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
别人说了不想就是不想，还打破砂锅问到底，非常不礼貌。爱可能是假的，不爱一定是真的。&lt;br /&gt;
&lt;br /&gt;
20260226&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
预报说没雨，越往山顶，雨却越大。上山时就有小雨，我赌不会下大。若等会儿真的下了大雨，也自己承受。&lt;br /&gt;
&lt;br /&gt;
20260225&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
一件衣服，色彩与配饰，传达的信息量越大越难看，喧宾夺主了，越少越能彰显穿衣人的气质。比如纽扣颜色与衣服主色不一致，或纽扣内面与衣服主色不一致，就有廉价感。裁剪设计，不应该超过两种想法，只有一种思想表达是最好的。材质和颜色，越接近地面与环境里的中性色，越好看，比如水泥色、木材色、高铁站地板的大理石色。颜色不要过于纯净，也不要过于拼色，明度微暗感觉穿起来更生动。&lt;br /&gt;
&lt;br /&gt;
20260224&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
我认为一句“祝你幸福。”是一段感情最完美的结束。&lt;br /&gt;
&lt;br /&gt;
20260223&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
未变现的认知，属于笑话范畴。&lt;br /&gt;
&lt;br /&gt;
20260222&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Act like someone who will succeed.&lt;br /&gt;
&lt;br /&gt;
行为先于身份。你先按成功者的方式行事，成功才会追上你。&lt;br /&gt;
&lt;br /&gt;
20260207&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
不要相信阴暗、无力、无希望的那一面。&lt;br /&gt;
&lt;br /&gt;
20260207&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
有人问，为什么出去旅行要大清早五六点就出发？这是一个早一分钟早半小时，晚一分钟晚两小时的故事。旅游目的地和小城，有的季节人流爆满，有的季节人流缺缺，公交车次就不是轮班制，是定班制，错过一趟要等半小时起步。像今天早上，去吃包子，计划十分钟，然而你怎能料到上一位买三十个包子，且在那里犹豫不定呢，急人。这种意外耽搁多了，就易误车。再者，一日之计在于晨，如果十点前还没完成一些事，就一整天都不容易有动力。15 点之后去多数景点得考虑四个问题：阳光不足，错过入园，排队爆涨，回程无车。所以，早点出发，一切容易按计划运行。此刻，因留足了容错时间，早早出发，按时赶到地铁站了，就能按计划赶上去浮槎山的 09:10 的定班车。&lt;br /&gt;
&lt;br /&gt;
20260201&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Entropy consumes life。熵以生命为食。混乱无序会令人不断下坠。要元气满满，必须对混乱无序主动出击。&lt;br /&gt;
&lt;br /&gt;
20260122&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
话说人生有看山是山，看水是水的阶段；有看山不是山，看水不是水的阶段；有看山是山，看水是水的阶段。意思是人总会经历纯真、革新、质朴三个阶段。年少时，认为钱不重要。初入社会，会觉得钱比一切都重要；受到挫折，又会认为钱不重要。最后，会知道钱是客观交换媒介，开心最重要。一个人需要的是休息，而不是出走职场。所谓的 gap 半年，学点东西，再回职场，如今的职场形势，很容易受到针对 gap 的惩罚。钱花光了，陷入贫困，容易陷入狂热的拜金主义，却又无法面对简历上增长曲线的断崖，难以实现跳跃。不离开职场，找一份双休的、不加班的工作，假日游山玩水，才会最快恢复元气。&lt;br /&gt;
&lt;br /&gt;
协商辞职公司会补偿 N+1，主动辞职公司不补偿。主动辞职，需提前 30 日递交《辞职通知》给公司。七八月大学生涌入市场，最难找工作。三四月是最好找工作的时段，因为企业缺人。&lt;br /&gt;
&lt;br /&gt;
如果上一份工作耗净了元气，太累了，想去云南。多半会失望。世界上没有彼岸，把此岸过好，才会快乐。云南自然风光无敌。可若缺钱，在哪里都过不好。城市切换的成本，至少 5000 元。工作切换的成本，更加高昂。想拿到年终奖再辞职，完全可以理解。不过，健康很重要。金钱诚可贵，元气价更高。&lt;br /&gt;
&lt;br /&gt;
20260119&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
做任何事，都得有点甜头，不然长久不了。比如看英文书，有人推崇全英文原版，但难度太高根本坚持不下去。比如学编程，有人推崇一上来就大部头，掌握底层原理，但没成就感就会饿死在路上。比如健身，有人推崇一上来就标准动作，日做四组，一来就遇到挫折是坚持不下去的。比如让学 Linux，一上来就 Vim Emacs 纯英文文档，也只能半途而废。比日常多轻微些许难度，有许多甜头，才能真的把事情做成。&lt;br /&gt;
&lt;br /&gt;
20260114&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
水面波光粼粼，太阳浮光跃金，我们的爱，像小纸船，飘远了，不见了。&lt;br /&gt;
&lt;br /&gt;
20260112&lt;br /&gt;
----&lt;br /&gt;
最近，门禁卡失灵了，电脑屏幕坏了，饭卡丢了，棉拖被小太阳烤坏了，常去那家现包包子店倒闭了。&lt;br /&gt;
&lt;br /&gt;
门禁卡去物业刷新了。电脑买了新屏幕。饭卡去行政处办张新的。买了新棉拖。早餐多吃鸡蛋。&lt;br /&gt;
&lt;br /&gt;
20260106&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=%E7%81%B5%E6%9C%BA%E4%B8%80%E9%97%AA_2026&amp;diff=11564</id>
		<title>灵机一闪 2026</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=%E7%81%B5%E6%9C%BA%E4%B8%80%E9%97%AA_2026&amp;diff=11564"/>
		<updated>2026-07-28T09:25:26Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;由于最近心思放在别的，网站又恰好改出了一个小 bug，短短几天，访问我站的爬虫，陷入了无间地狱。&lt;br /&gt;
&lt;br /&gt;
简单来说就是爬虫发现这个站有无穷无尽的链接，8000 个 IP 全来找链接。我的小服务器差点被打爆。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
“感觉这就像股市那句：盈亏同源。&lt;br /&gt;
因为 MediaWiki 根本设计上就是每一笔历史都可以追溯查找，这是盈，是好的，是优异。&lt;br /&gt;
而对小站 2C4G 的服务器，这是亏，这是性能地狱，堪比小儿抱金过市，8000 人同时来抢流量。”&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
最终，把不该敞开的门关上，就 OK 了&lt;br /&gt;
&lt;br /&gt;
20260728&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Emacs 写配置时，越具有确定性的，越优先加载。越不具确定性、复杂易变的，越写在后面。&lt;br /&gt;
&lt;br /&gt;
20260722&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
成功的诀窍：对一切月薪、职级、名头、职位、学历、头衔、组织、团体、代码、软件、资金、外貌、身材袪魅，相信慢慢努力的力量。终将抵达。&lt;br /&gt;
&lt;br /&gt;
20260721&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
以前总觉得，她或许有苦衷，她或许在想办法解决。今天才看明白，她就是装问题不存在，就是反复内耗从我这里偷能量。犹豫、反复、易变，就是她性格的底色。评级为：不可靠之人。&lt;br /&gt;
&lt;br /&gt;
必须果断了。一切结束。&lt;br /&gt;
&lt;br /&gt;
好在她的日子也走上了她的正轨。她有适合她的人生。&lt;br /&gt;
&lt;br /&gt;
20260719&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
合租的麻烦在于，傻逼室友会消耗人的精神，什么公区地面肮脏，什么马桶上有尿迹，什么半夜洗衣服，什么高峰期长时间占据洗手间。在室外公共场合，见到傻逼躲远点就行，可以轻松避过；在室内场合，避无可避。这不是说要买房，而是说，不要与人合租。同一小区多加 500 元就能整租。多挣钱，把傻逼从生活中清出去，是很值的。&lt;br /&gt;
&lt;br /&gt;
20260716&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
一切工作都要为了销售。任何工作归根结底都为销售服务。虽然归根结底我们追求的是更好的生活，但它的动力就来自于销售额。直接把能力变现，找机会变现，才是一天之中的时间的正确用法。还需要明确，一个人一天高度专注的时间，不会超过四个小时。&lt;br /&gt;
&lt;br /&gt;
20260716&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
永远不要从事耗材型的工作。&lt;br /&gt;
&lt;br /&gt;
20260715&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
AI 有时会过于炫技，在正则与通配符上栽跟头。用 AI 写脚本，建议不要大而全，而是从小往大写，先写最核心的小功能，一步一步成功。而不要一写一个大箩筐，排错都很难。&lt;br /&gt;
&lt;br /&gt;
20260713&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
读源代码的方法：先吃透它为什么存在、怎样跑通、解决什么问题；细节理解到能继续前进即可；笔记只记录会反复忘、会反复用、会改变理解框架的东西。&lt;br /&gt;
&lt;br /&gt;
20260710&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
我已掌握戴隐形眼镜的焚诀。网络上许多人教戴，都是说，要么硬怼，要么放在下眼皮内，再仰头就行。都不说出其中的关键。&lt;br /&gt;
&lt;br /&gt;
关键在于，上眼皮就像守门员一样，会在异物进入眼睛时，迅速眨眼，把异物碰出眼睛之外，再通过迅速眨眼挤出杂质。&lt;br /&gt;
&lt;br /&gt;
所以戴隐形眼镜，归根结底，不能靠仰头蒙概率，而是要关闭上眼皮的防异物机制。那怎么做呢？&lt;br /&gt;
&lt;br /&gt;
在把隐形眼镜放进下眼皮之内后，腾个手指，严格的、认真的、放松的、结结实实的摁住上眼皮，让它没办法闭眼把隐形眼镜踫出来。这样就 OK 了，成功率提升 95%。&lt;br /&gt;
&lt;br /&gt;
至于为什么要戴隐形眼镜？鼻梁轻松多了。长期戴眼镜，会导致神智笨重，眼袋重。&lt;br /&gt;
&lt;br /&gt;
隐形眼镜的品牌，可以选海昌。在多多或京东买都可以。月抛的就很好。不用戴眼镜的一天，真的太舒服了。&lt;br /&gt;
&lt;br /&gt;
长期戴过重、不合适的眼镜，会导致鼻梁疼、神智含混。隐形眼镜戴太久，也对眼睛不好，引发干涩、眼疾。不要走极端。普通眼镜、隐形眼镜，各戴半天，是最佳的。&lt;br /&gt;
&lt;br /&gt;
20260622&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
# 强壮的身体&lt;br /&gt;
# 完美的颜值&lt;br /&gt;
# 高级的身份&lt;br /&gt;
# 持续的资产&lt;br /&gt;
# 前 1% 的技能&lt;br /&gt;
# 充能式的社会化&lt;br /&gt;
&lt;br /&gt;
20260614&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
去学林公园天养了一天。吃了鸡公煲和沙汤当早饭。骑行 30 分钟到了公园。喝了瓶东鹏特饮。摘了李子。翻了很多次跟头，全靠左肩摔，也不疼，克服了恐惧，有望学会后空翻。对着超绝湖景，吃了个泡椒鸡杂外卖。喝了瓶果粒橙、矿泉水，回到家门口时，全身传来一阵舒服，感觉休息得特别到位，一种生命力被充满的感觉。&lt;br /&gt;
&lt;br /&gt;
打开门，听到空着未租出去的那家，传来了擦桌子的声音，心情瞬间跌落谷底。太多人没有素质，会把公共的卫生间，弄得很脏。以前只用应对对门的两个不讲卫生、踩脏地面不清理、高峰期长时间占用卫生间洗、完澡不开窗透气的老女人，现在又要多应对一户人了。&lt;br /&gt;
&lt;br /&gt;
最让我难过的是，我还在住合租房。灵魂被压抑的感觉。这具身体跟着我，受苦了。&lt;br /&gt;
&lt;br /&gt;
20260614&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
爱情的本质，以前我认为是选择，现在我认为还是选择。&lt;br /&gt;
&lt;br /&gt;
两只小鸟，各有各的翅膀。&lt;br /&gt;
&lt;br /&gt;
如果飞往不同的地方，那注定是没有结果的。&lt;br /&gt;
&lt;br /&gt;
如果一只认为另一只不过如此，爽快各自飞，也算体面。&lt;br /&gt;
&lt;br /&gt;
又有几个人超过如此呢？&lt;br /&gt;
&lt;br /&gt;
如果一只打心底认为另一只不过如此，却还是占着爱情的位置，心里看不起，嘴上说着爱，那几乎可以算闹剧了。&lt;br /&gt;
&lt;br /&gt;
明知对方平凡，还要朝一个目的地飞，那才有结果吧。&lt;br /&gt;
&lt;br /&gt;
20260419&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
仅就影视作品来说，当我看见角色欣喜，我知道他快被锤了。生活中，处于被锤状态，比较无意外。&lt;br /&gt;
&lt;br /&gt;
20260409&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
近期看到最恐怖的一个词：蒸馏。这项技术是指，从一群文件中，训练出一个 AI。有人开玩笑：你的同事虽然被解雇了，但他已经化成 token（词元）在陪伴着你。意思就是把同事的往期工作内容、性格风格，训练成一个 AI。之后，很快出现了“员工.skill”“初恋.skill”“前任.skill”“老板.skill”。&amp;lt;code&amp;gt;.skill&amp;lt;/code&amp;gt; 不是一种标准文件格式，而是一种约定俗成的后缀，通常表示一个由多个文件组成的 AI 技能包（其实就是文件夹），里面包含提示词、说明、脚本和示例，供 AI 按流程复用。看这样子，AI 的发展开始魔怔了，开始抽取人的价值，但把人抛到一边，令他们离开或失业。比美剧《黑镜》里的场景更加冷血。&lt;br /&gt;
&lt;br /&gt;
以前程序员骂人会说：Talk is cheap, show me the fucking code. 言语是廉价的，给老子展示你的代码，代码见真章。现在一切都变了，成了：Code is cheap, show me your talk。代码不重要，展示你和 AI 聊天时的提示词。这件事非常冷幽默。但其实，当下的 AI，在连续性上，还大有不足，长而复杂的任务，AI 是做不好的。&lt;br /&gt;
&lt;br /&gt;
历史的车轮滚滚向前。悲观者认为脑力劳动者都将被 AI 代替，乐观者认为 AI 会带来新的历史机遇。可惜历史机遇，往往是过后方知。&lt;br /&gt;
&lt;br /&gt;
以前人群嘈嘈杂杂，见到年轻人提一个新点子，就拿这句话来 PUA：你这是有个好点子，只缺个程序员了，老弟，好想法一天有一千万人产生一千万个，有种的人应该自己把它写出来。想法很廉价，重在执行。&lt;br /&gt;
&lt;br /&gt;
等我有了一点阅历才发现，那些老气横秋的家伙，根本没有新点子，其实好想法是稀缺的。青春的意愿，其实是人生的礼物。老话说，人不可能同时拥有青春，和对青春的感受，真 TM 遗憾。&lt;br /&gt;
&lt;br /&gt;
想想每天都是人生中最年轻的一天，还是不熬夜早点睡吧。&lt;br /&gt;
&lt;br /&gt;
20260409&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
听着齐豫唱、三毛写的《橄榄树》，想起我有个朋友，帅气明净的短发，女孩，酷酷的。高一第一次化学考试，好像考了班级第一，很多女生说她很帅。她话不多，比较沉默。有一天，我在看三毛的书《送你一匹马》，她看见比较感兴趣，就借过去看了。然后说起过人生的意义。&lt;br /&gt;
&lt;br /&gt;
听说她高考没考好，我不清楚。多年后，听说她，怎么说呢，疯了？傻了？她的心智拒绝长大，一直停在借《送你一匹马》去读那时候：世界广阔，青春鲜活，未来充满梦想。她应该想去很多地方，她畅想着无限的快乐和幸福，总不可能有人希望自己未来活在阴影里吧。&lt;br /&gt;
&lt;br /&gt;
我辗转联系见了她一面。她妈妈送她来的。她傻傻的，比高中的心智更小一点了，像退到了小学生。认识我，但是把我当小学玩伴的感觉。假如带着她在大夏天去山里抓金龟子，估计她会很开心。像那首《捉泥鳅》里唱的那样：“小牛的哥哥带着他捉泥鳅，大哥哥好不好咱们去捉泥鳅”。&lt;br /&gt;
&lt;br /&gt;
她走了三十米路，她妈妈挑了她四五个错。听说我做文字方面的工作，她妈妈痛心疾首地说她爸爸就是诗人、作家，连饭都吃不起。&lt;br /&gt;
&lt;br /&gt;
我不知道她为什么停在旧时间，不肯向走前。能感觉到她活在另一片空间，眼前的她，拒绝了一切。我希望她开心。&lt;br /&gt;
&lt;br /&gt;
20260408&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
齐豫《飞鸟与鱼》里唱到：&lt;br /&gt;
&amp;lt;poem&amp;gt;&lt;br /&gt;
蓝的天 蓝的海&lt;br /&gt;
难为了 难为了我和你&lt;br /&gt;
什么天地啊四季啊 昼夜啊&lt;br /&gt;
什么海天一色&lt;br /&gt;
地狱天堂 暮鼓晨钟&lt;br /&gt;
Always together forever apart&lt;br /&gt;
Always together forever apart&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
人们往往把相恋又分开的人，比作飞鸟与鱼，指两者一个在水里，一个在天上，相伴却相离。&lt;br /&gt;
&lt;br /&gt;
对某些人来说，会有更绝决的比喻，那就是飞鸟与飞鸟，鱼与鱼。本是同类，不是因外在条件而体面分开，而是因内在原因，各有各的欲，更体面地分开。&lt;br /&gt;
&lt;br /&gt;
人各自追求自己的欲，是一种更大的体面。也是一种隐约的残忍，相爱的同类，也会有不同的追求。世界的炫丽多姿，就是因为，人各有所求。&lt;br /&gt;
&lt;br /&gt;
20260408&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
贫穷是最大的慢性毒药。一次次的小成功是最大的慢性补药。挣钱是最大的美德。&lt;br /&gt;
&lt;br /&gt;
20260329&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
3 月 29 日，不到两个月时间，剃光的头发完美地长出来了。左边头发好看的向右斜。右边的头发整体向前向下，也略往右斜。农历二月十一，昨晚盖厚被子已经热得睡不着，换了簿被，今天中午去买裤子，正午的阳光晒身上，已隐约有夏天的感觉。一条西裤 65 元、一条牛仔裤 80 元，31 码的腰，像给我量身定做的。买衣服还是得去实体店，合身，也没想象中贵，省了退货时间。锻炼多了腰细，很健康的感觉，真不敢想像以前买西裤竟然专门买 33 码的腰，为了吃饭后不勒肚子，却没有深入再多想几层，比如是否处于肥胖状态需要减肥，比如是否吃太多需要节制，比如是否裤腰太大有损美观。周一进电梯，有一个来得比较少的同事说我瘦了，是不是在健身，这才刚开始锻炼就被人发现了，心里暗爽。&lt;br /&gt;
&lt;br /&gt;
20260329&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
少有的从睡梦中惊醒，赶紧睁眼看，想弄清楚自己是在午休帽下，还是在温暖的被子里。担心午休睡过头，或者早上睡过头。焦虑也是够够的。让我想起《时间规划局》，时间就是生命。明明知道自己被囚，却并未有效行动改变，那就是蠢材。房间里的大象，为何视而不见？&lt;br /&gt;
&lt;br /&gt;
20260323&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
自媒体的本质，其实是梦想的实现。现在就业市场，很像 80 年代的香港，普通打工人很少有逆天改命的机会，反而是有梦想的、有技艺的人，追求梦想、人人演艺，能闯出一片天。很有种经济水平上来了，社会自然该出现这个阶层的感觉。看周星驰和其他港片里小人物多么努力才能有所成就，与当前我面临的现实一样。&lt;br /&gt;
&lt;br /&gt;
20260323&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
春雨贵如油，可是……&lt;br /&gt;
&lt;br /&gt;
20260317&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
整理了一百件琐碎物品：&lt;br /&gt;
* 第一格，清洁用品：沐浴露替补装，袋装未开封洗发露，消毒液，牙刷，抹布，棉柔纸巾，洗碗擦&lt;br /&gt;
* 第二格，物质食粮和精神食粮：珍贵物品盒。大米，大枣，面粉，玻璃杯装的笔若干支。面粉远离珍贵物品盒&lt;br /&gt;
* 第三格，电器及电线：数据线若干，万用表，充电宝，遥控器，火胶布，小票机，电池若干，充电器若干&lt;br /&gt;
* 第四格，低频次重物：拖把头，旧电器，哑铃片，一次性马桶垫&lt;br /&gt;
* 桌面盒，高频次轻物：长尾夹，充电宝，有线耳机，蓝牙耳机，零钱，卷尺&lt;br /&gt;
&lt;br /&gt;
井井有条，身心舒畅。&lt;br /&gt;
&lt;br /&gt;
20260317&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
注意力是这个时代最宝贵的资产，但往往被人们浪费了，沉迷于短视频算法带来的浅薄快乐。&lt;br /&gt;
&lt;br /&gt;
20260315&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
月薪 8000 元的人，扣除生活费 1500 元、房租 1500 元，月攒 5000 元。月薪 5000 元的人，扣除生活费 1000 元、房租 800 元，月攒 3200 元。5000 / 3200 = 1.56 倍。月薪 8000 元的人，不止攒钱速率是月薪 5000 元的人的 1.56 倍，生活品质也更高。工资真是太重要了啊。&lt;br /&gt;
&lt;br /&gt;
20260314&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
0201 - 0313，41 天，头发长度终于恢复平头水平了。头上分了四个区域。右手边，头发向前。左手边，头发向前。后面，头发先向右手，再向左手边旋。前面，头发向右再向前。难怪自然卷，这天然和别人的直发不一样呐，各个区域有各个区域的个性。以后做发型都顺其自然做。&lt;br /&gt;
&lt;br /&gt;
20260313&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
帅是一种感觉，各方面比别人强一点，就帅了。比别人敢担当一点，比别人体态好一点，比别人多点肌肉，比别人发型好看点，比别人脸干净点，比别人穿得体点，比别人工作好一点，每样好一点点，就能形成碾压式的帅的感觉。&lt;br /&gt;
&lt;br /&gt;
20260313&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
春天的雨，有一种温柔感、生机感，仿佛情侣耍小脾气，因为有爱支撑，可以很安全地等未来的无限可能。秋冬的雨，只有肃杀，寒潮一阵阵加剧，见了心里只有悲凉，以及对万物凋零的预期。&lt;br /&gt;
&lt;br /&gt;
20260311&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
年少时，太自由了。可以很轻易放弃很多东西。年龄大了，选择权收窄了，各种可能性都收窄了。心累，是因为对未来有强烈的不安全感。眼睛看不穿迷雾，怎么会有自由？&lt;br /&gt;
&lt;br /&gt;
曾经皮肤好，随便晒，现在竟也开始做防晒了，因为好像晒了真会有淡斑，虽然会很快消失，但就怕哪天突然不再消失了。曾经牙齿好，不相信网上说的刷两分钟就好，偏要刷十分钟搞个彻底清洁。身边朋友牙齿不好了，昨天刷牙时，突然担忧刷太久把牙给磨坏了，以后也尽快刷干净了事，不再边刷牙边长时间刷手机了。听说刷牙只要去除了食物残渣即可。&lt;br /&gt;
&lt;br /&gt;
夜深忽梦少年事，梦啼妆泪红阑干。&lt;br /&gt;
&lt;br /&gt;
20260310&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Show the results. Show the apps. Show the money.&lt;br /&gt;
&lt;br /&gt;
人们只关心结果、产品和钱。&lt;br /&gt;
&lt;br /&gt;
过程、代码、努力，根本不重要。&lt;br /&gt;
&lt;br /&gt;
20260309&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
老旧港片有一种蒙昧时代天真幻想的气质，很有侠义风范。和《百年孤独》里对现代的幻想，也差不多。&lt;br /&gt;
&lt;br /&gt;
20260307&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
让人生健康的七件小事：&lt;br /&gt;
# 抛弃别人的目标，抛弃等待&lt;br /&gt;
# 固守上午的目标&lt;br /&gt;
# 固守下午的目标&lt;br /&gt;
# 固守晚上的目标&lt;br /&gt;
# 固守周六的目标&lt;br /&gt;
# 固守周日的目标&lt;br /&gt;
# 只管自己的事&lt;br /&gt;
&lt;br /&gt;
20260306&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
真正的安稳，并不是练了多少肌肉，徒了多少步，看了多少风景。没有稳定的工作，没有稳定的经济来源，那些都是沙上之塔，一溃而散。先把钱包装得满满的，才有真的安稳。&lt;br /&gt;
&lt;br /&gt;
20260305&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
10 ℃ 的天，需要一头长发。短发太冷了。&lt;br /&gt;
&lt;br /&gt;
20260305&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
大多数人被圈在十公里以内。&lt;br /&gt;
&lt;br /&gt;
20260302&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
不带电脑，自带拖鞋，轻装出行，老片下好，这样旅行太爽了&lt;br /&gt;
&lt;br /&gt;
20260301&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
在路上，并不用过于焦虑。我因买不到万州去利川的火车票而焦虑，在万州吃饭时，旅馆老板、饭店老板，都跟我说去万州汽车南站全天车次很多。虽然我自己早有此打算，但就算我不知道，只要来到此地，一样会得到这个有用信息。所以在路上总有许多机遇。&lt;br /&gt;
&lt;br /&gt;
20260301&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
人家对自己的痛苦甘之如饴，或者只是随便说说，我却共情了两年，比那本人还痛苦。我真是傻逼。&lt;br /&gt;
&lt;br /&gt;
我找她，站票、硬座、夜车。我接她，13 公里，收拾好花甲和菜。&lt;br /&gt;
&lt;br /&gt;
她找我，顺路。她接待我：不见。买五小时后的车次，见面三分钟就要打车走。&lt;br /&gt;
&lt;br /&gt;
权衡利弊后放弃了我。我无所谓，早就习惯一个人。&lt;br /&gt;
&lt;br /&gt;
只要她是正确的，选择了更阳光明媚的生活，在追寻理想中的幸福，我就可以安心消失。从此，悲喜不相关，人生无瓜葛。&lt;br /&gt;
&lt;br /&gt;
从此，投身于自己的幸福。&lt;br /&gt;
&lt;br /&gt;
20260226&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
别人说了不想就是不想，还打破砂锅问到底，非常不礼貌。爱可能是假的，不爱一定是真的。&lt;br /&gt;
&lt;br /&gt;
20260226&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
预报说没雨，越往山顶，雨却越大。上山时就有小雨，我赌不会下大。若等会儿真的下了大雨，也自己承受。&lt;br /&gt;
&lt;br /&gt;
20260225&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
一件衣服，色彩与配饰，传达的信息量越大越难看，喧宾夺主了，越少越能彰显穿衣人的气质。比如纽扣颜色与衣服主色不一致，或纽扣内面与衣服主色不一致，就有廉价感。裁剪设计，不应该超过两种想法，只有一种思想表达是最好的。材质和颜色，越接近地面与环境里的中性色，越好看，比如水泥色、木材色、高铁站地板的大理石色。颜色不要过于纯净，也不要过于拼色，明度微暗感觉穿起来更生动。&lt;br /&gt;
&lt;br /&gt;
20260224&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
我认为一句“祝你幸福。”是一段感情最完美的结束。&lt;br /&gt;
&lt;br /&gt;
20260223&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
未变现的认知，属于笑话范畴。&lt;br /&gt;
&lt;br /&gt;
20260222&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Act like someone who will succeed.&lt;br /&gt;
&lt;br /&gt;
行为先于身份。你先按成功者的方式行事，成功才会追上你。&lt;br /&gt;
&lt;br /&gt;
20260207&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
不要相信阴暗、无力、无希望的那一面。&lt;br /&gt;
&lt;br /&gt;
20260207&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
有人问，为什么出去旅行要大清早五六点就出发？这是一个早一分钟早半小时，晚一分钟晚两小时的故事。旅游目的地和小城，有的季节人流爆满，有的季节人流缺缺，公交车次就不是轮班制，是定班制，错过一趟要等半小时起步。像今天早上，去吃包子，计划十分钟，然而你怎能料到上一位买三十个包子，且在那里犹豫不定呢，急人。这种意外耽搁多了，就易误车。再者，一日之计在于晨，如果十点前还没完成一些事，就一整天都不容易有动力。15 点之后去多数景点得考虑四个问题：阳光不足，错过入园，排队爆涨，回程无车。所以，早点出发，一切容易按计划运行。此刻，因留足了容错时间，早早出发，按时赶到地铁站了，就能按计划赶上去浮槎山的 09:10 的定班车。&lt;br /&gt;
&lt;br /&gt;
20260201&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Entropy consumes life。熵以生命为食。混乱无序会令人不断下坠。要元气满满，必须对混乱无序主动出击。&lt;br /&gt;
&lt;br /&gt;
20260122&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
话说人生有看山是山，看水是水的阶段；有看山不是山，看水不是水的阶段；有看山是山，看水是水的阶段。意思是人总会经历纯真、革新、质朴三个阶段。年少时，认为钱不重要。初入社会，会觉得钱比一切都重要；受到挫折，又会认为钱不重要。最后，会知道钱是客观交换媒介，开心最重要。一个人需要的是休息，而不是出走职场。所谓的 gap 半年，学点东西，再回职场，如今的职场形势，很容易受到针对 gap 的惩罚。钱花光了，陷入贫困，容易陷入狂热的拜金主义，却又无法面对简历上增长曲线的断崖，难以实现跳跃。不离开职场，找一份双休的、不加班的工作，假日游山玩水，才会最快恢复元气。&lt;br /&gt;
&lt;br /&gt;
协商辞职公司会补偿 N+1，主动辞职公司不补偿。主动辞职，需提前 30 日递交《辞职通知》给公司。七八月大学生涌入市场，最难找工作。三四月是最好找工作的时段，因为企业缺人。&lt;br /&gt;
&lt;br /&gt;
如果上一份工作耗净了元气，太累了，想去云南。多半会失望。世界上没有彼岸，把此岸过好，才会快乐。云南自然风光无敌。可若缺钱，在哪里都过不好。城市切换的成本，至少 5000 元。工作切换的成本，更加高昂。想拿到年终奖再辞职，完全可以理解。不过，健康很重要。金钱诚可贵，元气价更高。&lt;br /&gt;
&lt;br /&gt;
20260119&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
做任何事，都得有点甜头，不然长久不了。比如看英文书，有人推崇全英文原版，但难度太高根本坚持不下去。比如学编程，有人推崇一上来就大部头，掌握底层原理，但没成就感就会饿死在路上。比如健身，有人推崇一上来就标准动作，日做四组，一来就遇到挫折是坚持不下去的。比如让学 Linux，一上来就 Vim Emacs 纯英文文档，也只能半途而废。比日常多轻微些许难度，有许多甜头，才能真的把事情做成。&lt;br /&gt;
&lt;br /&gt;
20260114&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
水面波光粼粼，太阳浮光跃金，我们的爱，像小纸船，飘远了，不见了。&lt;br /&gt;
&lt;br /&gt;
20260112&lt;br /&gt;
----&lt;br /&gt;
最近，门禁卡失灵了，电脑屏幕坏了，饭卡丢了，棉拖被小太阳烤坏了，常去那家现包包子店倒闭了。&lt;br /&gt;
&lt;br /&gt;
门禁卡去物业刷新了。电脑买了新屏幕。饭卡去行政处办张新的。买了新棉拖。早餐多吃鸡蛋。&lt;br /&gt;
&lt;br /&gt;
20260106&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=%E7%81%B5%E6%9C%BA%E4%B8%80%E9%97%AA_2026&amp;diff=11563</id>
		<title>灵机一闪 2026</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=%E7%81%B5%E6%9C%BA%E4%B8%80%E9%97%AA_2026&amp;diff=11563"/>
		<updated>2026-07-28T09:25:01Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;由于最近心思放在别的，网站又恰好改出了一个小 bug，短短几天，访问我站的爬虫，陷入了无间地狱。&lt;br /&gt;
&lt;br /&gt;
简单来说就是爬虫发现这个站有无穷无尽的链接，8000 个 IP 全来找链接。我的小服务器差点被打爆。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
“感觉这就像股市那句：盈亏同源。&lt;br /&gt;
因为 MediaWiki 根本设计上就是每一笔历史都可以追溯查找，这是盈，是好的，是优异。&lt;br /&gt;
而对小站 2C4G 的服务器，这是亏，这是性能地狱，堪比小儿抱金过市，8000 人同时来抢流量。&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
最终，把不该敞开的门关上，就 OK 了&lt;br /&gt;
&lt;br /&gt;
20260728&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Emacs 写配置时，越具有确定性的，越优先加载。越不具确定性、复杂易变的，越写在后面。&lt;br /&gt;
&lt;br /&gt;
20260722&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
成功的诀窍：对一切月薪、职级、名头、职位、学历、头衔、组织、团体、代码、软件、资金、外貌、身材袪魅，相信慢慢努力的力量。终将抵达。&lt;br /&gt;
&lt;br /&gt;
20260721&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
以前总觉得，她或许有苦衷，她或许在想办法解决。今天才看明白，她就是装问题不存在，就是反复内耗从我这里偷能量。犹豫、反复、易变，就是她性格的底色。评级为：不可靠之人。&lt;br /&gt;
&lt;br /&gt;
必须果断了。一切结束。&lt;br /&gt;
&lt;br /&gt;
好在她的日子也走上了她的正轨。她有适合她的人生。&lt;br /&gt;
&lt;br /&gt;
20260719&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
合租的麻烦在于，傻逼室友会消耗人的精神，什么公区地面肮脏，什么马桶上有尿迹，什么半夜洗衣服，什么高峰期长时间占据洗手间。在室外公共场合，见到傻逼躲远点就行，可以轻松避过；在室内场合，避无可避。这不是说要买房，而是说，不要与人合租。同一小区多加 500 元就能整租。多挣钱，把傻逼从生活中清出去，是很值的。&lt;br /&gt;
&lt;br /&gt;
20260716&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
一切工作都要为了销售。任何工作归根结底都为销售服务。虽然归根结底我们追求的是更好的生活，但它的动力就来自于销售额。直接把能力变现，找机会变现，才是一天之中的时间的正确用法。还需要明确，一个人一天高度专注的时间，不会超过四个小时。&lt;br /&gt;
&lt;br /&gt;
20260716&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
永远不要从事耗材型的工作。&lt;br /&gt;
&lt;br /&gt;
20260715&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
AI 有时会过于炫技，在正则与通配符上栽跟头。用 AI 写脚本，建议不要大而全，而是从小往大写，先写最核心的小功能，一步一步成功。而不要一写一个大箩筐，排错都很难。&lt;br /&gt;
&lt;br /&gt;
20260713&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
读源代码的方法：先吃透它为什么存在、怎样跑通、解决什么问题；细节理解到能继续前进即可；笔记只记录会反复忘、会反复用、会改变理解框架的东西。&lt;br /&gt;
&lt;br /&gt;
20260710&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
我已掌握戴隐形眼镜的焚诀。网络上许多人教戴，都是说，要么硬怼，要么放在下眼皮内，再仰头就行。都不说出其中的关键。&lt;br /&gt;
&lt;br /&gt;
关键在于，上眼皮就像守门员一样，会在异物进入眼睛时，迅速眨眼，把异物碰出眼睛之外，再通过迅速眨眼挤出杂质。&lt;br /&gt;
&lt;br /&gt;
所以戴隐形眼镜，归根结底，不能靠仰头蒙概率，而是要关闭上眼皮的防异物机制。那怎么做呢？&lt;br /&gt;
&lt;br /&gt;
在把隐形眼镜放进下眼皮之内后，腾个手指，严格的、认真的、放松的、结结实实的摁住上眼皮，让它没办法闭眼把隐形眼镜踫出来。这样就 OK 了，成功率提升 95%。&lt;br /&gt;
&lt;br /&gt;
至于为什么要戴隐形眼镜？鼻梁轻松多了。长期戴眼镜，会导致神智笨重，眼袋重。&lt;br /&gt;
&lt;br /&gt;
隐形眼镜的品牌，可以选海昌。在多多或京东买都可以。月抛的就很好。不用戴眼镜的一天，真的太舒服了。&lt;br /&gt;
&lt;br /&gt;
长期戴过重、不合适的眼镜，会导致鼻梁疼、神智含混。隐形眼镜戴太久，也对眼睛不好，引发干涩、眼疾。不要走极端。普通眼镜、隐形眼镜，各戴半天，是最佳的。&lt;br /&gt;
&lt;br /&gt;
20260622&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
# 强壮的身体&lt;br /&gt;
# 完美的颜值&lt;br /&gt;
# 高级的身份&lt;br /&gt;
# 持续的资产&lt;br /&gt;
# 前 1% 的技能&lt;br /&gt;
# 充能式的社会化&lt;br /&gt;
&lt;br /&gt;
20260614&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
去学林公园天养了一天。吃了鸡公煲和沙汤当早饭。骑行 30 分钟到了公园。喝了瓶东鹏特饮。摘了李子。翻了很多次跟头，全靠左肩摔，也不疼，克服了恐惧，有望学会后空翻。对着超绝湖景，吃了个泡椒鸡杂外卖。喝了瓶果粒橙、矿泉水，回到家门口时，全身传来一阵舒服，感觉休息得特别到位，一种生命力被充满的感觉。&lt;br /&gt;
&lt;br /&gt;
打开门，听到空着未租出去的那家，传来了擦桌子的声音，心情瞬间跌落谷底。太多人没有素质，会把公共的卫生间，弄得很脏。以前只用应对对门的两个不讲卫生、踩脏地面不清理、高峰期长时间占用卫生间洗、完澡不开窗透气的老女人，现在又要多应对一户人了。&lt;br /&gt;
&lt;br /&gt;
最让我难过的是，我还在住合租房。灵魂被压抑的感觉。这具身体跟着我，受苦了。&lt;br /&gt;
&lt;br /&gt;
20260614&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
爱情的本质，以前我认为是选择，现在我认为还是选择。&lt;br /&gt;
&lt;br /&gt;
两只小鸟，各有各的翅膀。&lt;br /&gt;
&lt;br /&gt;
如果飞往不同的地方，那注定是没有结果的。&lt;br /&gt;
&lt;br /&gt;
如果一只认为另一只不过如此，爽快各自飞，也算体面。&lt;br /&gt;
&lt;br /&gt;
又有几个人超过如此呢？&lt;br /&gt;
&lt;br /&gt;
如果一只打心底认为另一只不过如此，却还是占着爱情的位置，心里看不起，嘴上说着爱，那几乎可以算闹剧了。&lt;br /&gt;
&lt;br /&gt;
明知对方平凡，还要朝一个目的地飞，那才有结果吧。&lt;br /&gt;
&lt;br /&gt;
20260419&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
仅就影视作品来说，当我看见角色欣喜，我知道他快被锤了。生活中，处于被锤状态，比较无意外。&lt;br /&gt;
&lt;br /&gt;
20260409&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
近期看到最恐怖的一个词：蒸馏。这项技术是指，从一群文件中，训练出一个 AI。有人开玩笑：你的同事虽然被解雇了，但他已经化成 token（词元）在陪伴着你。意思就是把同事的往期工作内容、性格风格，训练成一个 AI。之后，很快出现了“员工.skill”“初恋.skill”“前任.skill”“老板.skill”。&amp;lt;code&amp;gt;.skill&amp;lt;/code&amp;gt; 不是一种标准文件格式，而是一种约定俗成的后缀，通常表示一个由多个文件组成的 AI 技能包（其实就是文件夹），里面包含提示词、说明、脚本和示例，供 AI 按流程复用。看这样子，AI 的发展开始魔怔了，开始抽取人的价值，但把人抛到一边，令他们离开或失业。比美剧《黑镜》里的场景更加冷血。&lt;br /&gt;
&lt;br /&gt;
以前程序员骂人会说：Talk is cheap, show me the fucking code. 言语是廉价的，给老子展示你的代码，代码见真章。现在一切都变了，成了：Code is cheap, show me your talk。代码不重要，展示你和 AI 聊天时的提示词。这件事非常冷幽默。但其实，当下的 AI，在连续性上，还大有不足，长而复杂的任务，AI 是做不好的。&lt;br /&gt;
&lt;br /&gt;
历史的车轮滚滚向前。悲观者认为脑力劳动者都将被 AI 代替，乐观者认为 AI 会带来新的历史机遇。可惜历史机遇，往往是过后方知。&lt;br /&gt;
&lt;br /&gt;
以前人群嘈嘈杂杂，见到年轻人提一个新点子，就拿这句话来 PUA：你这是有个好点子，只缺个程序员了，老弟，好想法一天有一千万人产生一千万个，有种的人应该自己把它写出来。想法很廉价，重在执行。&lt;br /&gt;
&lt;br /&gt;
等我有了一点阅历才发现，那些老气横秋的家伙，根本没有新点子，其实好想法是稀缺的。青春的意愿，其实是人生的礼物。老话说，人不可能同时拥有青春，和对青春的感受，真 TM 遗憾。&lt;br /&gt;
&lt;br /&gt;
想想每天都是人生中最年轻的一天，还是不熬夜早点睡吧。&lt;br /&gt;
&lt;br /&gt;
20260409&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
听着齐豫唱、三毛写的《橄榄树》，想起我有个朋友，帅气明净的短发，女孩，酷酷的。高一第一次化学考试，好像考了班级第一，很多女生说她很帅。她话不多，比较沉默。有一天，我在看三毛的书《送你一匹马》，她看见比较感兴趣，就借过去看了。然后说起过人生的意义。&lt;br /&gt;
&lt;br /&gt;
听说她高考没考好，我不清楚。多年后，听说她，怎么说呢，疯了？傻了？她的心智拒绝长大，一直停在借《送你一匹马》去读那时候：世界广阔，青春鲜活，未来充满梦想。她应该想去很多地方，她畅想着无限的快乐和幸福，总不可能有人希望自己未来活在阴影里吧。&lt;br /&gt;
&lt;br /&gt;
我辗转联系见了她一面。她妈妈送她来的。她傻傻的，比高中的心智更小一点了，像退到了小学生。认识我，但是把我当小学玩伴的感觉。假如带着她在大夏天去山里抓金龟子，估计她会很开心。像那首《捉泥鳅》里唱的那样：“小牛的哥哥带着他捉泥鳅，大哥哥好不好咱们去捉泥鳅”。&lt;br /&gt;
&lt;br /&gt;
她走了三十米路，她妈妈挑了她四五个错。听说我做文字方面的工作，她妈妈痛心疾首地说她爸爸就是诗人、作家，连饭都吃不起。&lt;br /&gt;
&lt;br /&gt;
我不知道她为什么停在旧时间，不肯向走前。能感觉到她活在另一片空间，眼前的她，拒绝了一切。我希望她开心。&lt;br /&gt;
&lt;br /&gt;
20260408&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
齐豫《飞鸟与鱼》里唱到：&lt;br /&gt;
&amp;lt;poem&amp;gt;&lt;br /&gt;
蓝的天 蓝的海&lt;br /&gt;
难为了 难为了我和你&lt;br /&gt;
什么天地啊四季啊 昼夜啊&lt;br /&gt;
什么海天一色&lt;br /&gt;
地狱天堂 暮鼓晨钟&lt;br /&gt;
Always together forever apart&lt;br /&gt;
Always together forever apart&lt;br /&gt;
&amp;lt;/poem&amp;gt;&lt;br /&gt;
&lt;br /&gt;
人们往往把相恋又分开的人，比作飞鸟与鱼，指两者一个在水里，一个在天上，相伴却相离。&lt;br /&gt;
&lt;br /&gt;
对某些人来说，会有更绝决的比喻，那就是飞鸟与飞鸟，鱼与鱼。本是同类，不是因外在条件而体面分开，而是因内在原因，各有各的欲，更体面地分开。&lt;br /&gt;
&lt;br /&gt;
人各自追求自己的欲，是一种更大的体面。也是一种隐约的残忍，相爱的同类，也会有不同的追求。世界的炫丽多姿，就是因为，人各有所求。&lt;br /&gt;
&lt;br /&gt;
20260408&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
贫穷是最大的慢性毒药。一次次的小成功是最大的慢性补药。挣钱是最大的美德。&lt;br /&gt;
&lt;br /&gt;
20260329&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
3 月 29 日，不到两个月时间，剃光的头发完美地长出来了。左边头发好看的向右斜。右边的头发整体向前向下，也略往右斜。农历二月十一，昨晚盖厚被子已经热得睡不着，换了簿被，今天中午去买裤子，正午的阳光晒身上，已隐约有夏天的感觉。一条西裤 65 元、一条牛仔裤 80 元，31 码的腰，像给我量身定做的。买衣服还是得去实体店，合身，也没想象中贵，省了退货时间。锻炼多了腰细，很健康的感觉，真不敢想像以前买西裤竟然专门买 33 码的腰，为了吃饭后不勒肚子，却没有深入再多想几层，比如是否处于肥胖状态需要减肥，比如是否吃太多需要节制，比如是否裤腰太大有损美观。周一进电梯，有一个来得比较少的同事说我瘦了，是不是在健身，这才刚开始锻炼就被人发现了，心里暗爽。&lt;br /&gt;
&lt;br /&gt;
20260329&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
少有的从睡梦中惊醒，赶紧睁眼看，想弄清楚自己是在午休帽下，还是在温暖的被子里。担心午休睡过头，或者早上睡过头。焦虑也是够够的。让我想起《时间规划局》，时间就是生命。明明知道自己被囚，却并未有效行动改变，那就是蠢材。房间里的大象，为何视而不见？&lt;br /&gt;
&lt;br /&gt;
20260323&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
自媒体的本质，其实是梦想的实现。现在就业市场，很像 80 年代的香港，普通打工人很少有逆天改命的机会，反而是有梦想的、有技艺的人，追求梦想、人人演艺，能闯出一片天。很有种经济水平上来了，社会自然该出现这个阶层的感觉。看周星驰和其他港片里小人物多么努力才能有所成就，与当前我面临的现实一样。&lt;br /&gt;
&lt;br /&gt;
20260323&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
春雨贵如油，可是……&lt;br /&gt;
&lt;br /&gt;
20260317&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
整理了一百件琐碎物品：&lt;br /&gt;
* 第一格，清洁用品：沐浴露替补装，袋装未开封洗发露，消毒液，牙刷，抹布，棉柔纸巾，洗碗擦&lt;br /&gt;
* 第二格，物质食粮和精神食粮：珍贵物品盒。大米，大枣，面粉，玻璃杯装的笔若干支。面粉远离珍贵物品盒&lt;br /&gt;
* 第三格，电器及电线：数据线若干，万用表，充电宝，遥控器，火胶布，小票机，电池若干，充电器若干&lt;br /&gt;
* 第四格，低频次重物：拖把头，旧电器，哑铃片，一次性马桶垫&lt;br /&gt;
* 桌面盒，高频次轻物：长尾夹，充电宝，有线耳机，蓝牙耳机，零钱，卷尺&lt;br /&gt;
&lt;br /&gt;
井井有条，身心舒畅。&lt;br /&gt;
&lt;br /&gt;
20260317&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
注意力是这个时代最宝贵的资产，但往往被人们浪费了，沉迷于短视频算法带来的浅薄快乐。&lt;br /&gt;
&lt;br /&gt;
20260315&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
月薪 8000 元的人，扣除生活费 1500 元、房租 1500 元，月攒 5000 元。月薪 5000 元的人，扣除生活费 1000 元、房租 800 元，月攒 3200 元。5000 / 3200 = 1.56 倍。月薪 8000 元的人，不止攒钱速率是月薪 5000 元的人的 1.56 倍，生活品质也更高。工资真是太重要了啊。&lt;br /&gt;
&lt;br /&gt;
20260314&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
0201 - 0313，41 天，头发长度终于恢复平头水平了。头上分了四个区域。右手边，头发向前。左手边，头发向前。后面，头发先向右手，再向左手边旋。前面，头发向右再向前。难怪自然卷，这天然和别人的直发不一样呐，各个区域有各个区域的个性。以后做发型都顺其自然做。&lt;br /&gt;
&lt;br /&gt;
20260313&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
帅是一种感觉，各方面比别人强一点，就帅了。比别人敢担当一点，比别人体态好一点，比别人多点肌肉，比别人发型好看点，比别人脸干净点，比别人穿得体点，比别人工作好一点，每样好一点点，就能形成碾压式的帅的感觉。&lt;br /&gt;
&lt;br /&gt;
20260313&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
春天的雨，有一种温柔感、生机感，仿佛情侣耍小脾气，因为有爱支撑，可以很安全地等未来的无限可能。秋冬的雨，只有肃杀，寒潮一阵阵加剧，见了心里只有悲凉，以及对万物凋零的预期。&lt;br /&gt;
&lt;br /&gt;
20260311&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
年少时，太自由了。可以很轻易放弃很多东西。年龄大了，选择权收窄了，各种可能性都收窄了。心累，是因为对未来有强烈的不安全感。眼睛看不穿迷雾，怎么会有自由？&lt;br /&gt;
&lt;br /&gt;
曾经皮肤好，随便晒，现在竟也开始做防晒了，因为好像晒了真会有淡斑，虽然会很快消失，但就怕哪天突然不再消失了。曾经牙齿好，不相信网上说的刷两分钟就好，偏要刷十分钟搞个彻底清洁。身边朋友牙齿不好了，昨天刷牙时，突然担忧刷太久把牙给磨坏了，以后也尽快刷干净了事，不再边刷牙边长时间刷手机了。听说刷牙只要去除了食物残渣即可。&lt;br /&gt;
&lt;br /&gt;
夜深忽梦少年事，梦啼妆泪红阑干。&lt;br /&gt;
&lt;br /&gt;
20260310&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Show the results. Show the apps. Show the money.&lt;br /&gt;
&lt;br /&gt;
人们只关心结果、产品和钱。&lt;br /&gt;
&lt;br /&gt;
过程、代码、努力，根本不重要。&lt;br /&gt;
&lt;br /&gt;
20260309&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
老旧港片有一种蒙昧时代天真幻想的气质，很有侠义风范。和《百年孤独》里对现代的幻想，也差不多。&lt;br /&gt;
&lt;br /&gt;
20260307&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
让人生健康的七件小事：&lt;br /&gt;
# 抛弃别人的目标，抛弃等待&lt;br /&gt;
# 固守上午的目标&lt;br /&gt;
# 固守下午的目标&lt;br /&gt;
# 固守晚上的目标&lt;br /&gt;
# 固守周六的目标&lt;br /&gt;
# 固守周日的目标&lt;br /&gt;
# 只管自己的事&lt;br /&gt;
&lt;br /&gt;
20260306&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
真正的安稳，并不是练了多少肌肉，徒了多少步，看了多少风景。没有稳定的工作，没有稳定的经济来源，那些都是沙上之塔，一溃而散。先把钱包装得满满的，才有真的安稳。&lt;br /&gt;
&lt;br /&gt;
20260305&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
10 ℃ 的天，需要一头长发。短发太冷了。&lt;br /&gt;
&lt;br /&gt;
20260305&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
大多数人被圈在十公里以内。&lt;br /&gt;
&lt;br /&gt;
20260302&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
不带电脑，自带拖鞋，轻装出行，老片下好，这样旅行太爽了&lt;br /&gt;
&lt;br /&gt;
20260301&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
在路上，并不用过于焦虑。我因买不到万州去利川的火车票而焦虑，在万州吃饭时，旅馆老板、饭店老板，都跟我说去万州汽车南站全天车次很多。虽然我自己早有此打算，但就算我不知道，只要来到此地，一样会得到这个有用信息。所以在路上总有许多机遇。&lt;br /&gt;
&lt;br /&gt;
20260301&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
人家对自己的痛苦甘之如饴，或者只是随便说说，我却共情了两年，比那本人还痛苦。我真是傻逼。&lt;br /&gt;
&lt;br /&gt;
我找她，站票、硬座、夜车。我接她，13 公里，收拾好花甲和菜。&lt;br /&gt;
&lt;br /&gt;
她找我，顺路。她接待我：不见。买五小时后的车次，见面三分钟就要打车走。&lt;br /&gt;
&lt;br /&gt;
权衡利弊后放弃了我。我无所谓，早就习惯一个人。&lt;br /&gt;
&lt;br /&gt;
只要她是正确的，选择了更阳光明媚的生活，在追寻理想中的幸福，我就可以安心消失。从此，悲喜不相关，人生无瓜葛。&lt;br /&gt;
&lt;br /&gt;
从此，投身于自己的幸福。&lt;br /&gt;
&lt;br /&gt;
20260226&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
别人说了不想就是不想，还打破砂锅问到底，非常不礼貌。爱可能是假的，不爱一定是真的。&lt;br /&gt;
&lt;br /&gt;
20260226&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
预报说没雨，越往山顶，雨却越大。上山时就有小雨，我赌不会下大。若等会儿真的下了大雨，也自己承受。&lt;br /&gt;
&lt;br /&gt;
20260225&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
一件衣服，色彩与配饰，传达的信息量越大越难看，喧宾夺主了，越少越能彰显穿衣人的气质。比如纽扣颜色与衣服主色不一致，或纽扣内面与衣服主色不一致，就有廉价感。裁剪设计，不应该超过两种想法，只有一种思想表达是最好的。材质和颜色，越接近地面与环境里的中性色，越好看，比如水泥色、木材色、高铁站地板的大理石色。颜色不要过于纯净，也不要过于拼色，明度微暗感觉穿起来更生动。&lt;br /&gt;
&lt;br /&gt;
20260224&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
我认为一句“祝你幸福。”是一段感情最完美的结束。&lt;br /&gt;
&lt;br /&gt;
20260223&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
未变现的认知，属于笑话范畴。&lt;br /&gt;
&lt;br /&gt;
20260222&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Act like someone who will succeed.&lt;br /&gt;
&lt;br /&gt;
行为先于身份。你先按成功者的方式行事，成功才会追上你。&lt;br /&gt;
&lt;br /&gt;
20260207&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
不要相信阴暗、无力、无希望的那一面。&lt;br /&gt;
&lt;br /&gt;
20260207&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
有人问，为什么出去旅行要大清早五六点就出发？这是一个早一分钟早半小时，晚一分钟晚两小时的故事。旅游目的地和小城，有的季节人流爆满，有的季节人流缺缺，公交车次就不是轮班制，是定班制，错过一趟要等半小时起步。像今天早上，去吃包子，计划十分钟，然而你怎能料到上一位买三十个包子，且在那里犹豫不定呢，急人。这种意外耽搁多了，就易误车。再者，一日之计在于晨，如果十点前还没完成一些事，就一整天都不容易有动力。15 点之后去多数景点得考虑四个问题：阳光不足，错过入园，排队爆涨，回程无车。所以，早点出发，一切容易按计划运行。此刻，因留足了容错时间，早早出发，按时赶到地铁站了，就能按计划赶上去浮槎山的 09:10 的定班车。&lt;br /&gt;
&lt;br /&gt;
20260201&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Entropy consumes life。熵以生命为食。混乱无序会令人不断下坠。要元气满满，必须对混乱无序主动出击。&lt;br /&gt;
&lt;br /&gt;
20260122&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
话说人生有看山是山，看水是水的阶段；有看山不是山，看水不是水的阶段；有看山是山，看水是水的阶段。意思是人总会经历纯真、革新、质朴三个阶段。年少时，认为钱不重要。初入社会，会觉得钱比一切都重要；受到挫折，又会认为钱不重要。最后，会知道钱是客观交换媒介，开心最重要。一个人需要的是休息，而不是出走职场。所谓的 gap 半年，学点东西，再回职场，如今的职场形势，很容易受到针对 gap 的惩罚。钱花光了，陷入贫困，容易陷入狂热的拜金主义，却又无法面对简历上增长曲线的断崖，难以实现跳跃。不离开职场，找一份双休的、不加班的工作，假日游山玩水，才会最快恢复元气。&lt;br /&gt;
&lt;br /&gt;
协商辞职公司会补偿 N+1，主动辞职公司不补偿。主动辞职，需提前 30 日递交《辞职通知》给公司。七八月大学生涌入市场，最难找工作。三四月是最好找工作的时段，因为企业缺人。&lt;br /&gt;
&lt;br /&gt;
如果上一份工作耗净了元气，太累了，想去云南。多半会失望。世界上没有彼岸，把此岸过好，才会快乐。云南自然风光无敌。可若缺钱，在哪里都过不好。城市切换的成本，至少 5000 元。工作切换的成本，更加高昂。想拿到年终奖再辞职，完全可以理解。不过，健康很重要。金钱诚可贵，元气价更高。&lt;br /&gt;
&lt;br /&gt;
20260119&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
做任何事，都得有点甜头，不然长久不了。比如看英文书，有人推崇全英文原版，但难度太高根本坚持不下去。比如学编程，有人推崇一上来就大部头，掌握底层原理，但没成就感就会饿死在路上。比如健身，有人推崇一上来就标准动作，日做四组，一来就遇到挫折是坚持不下去的。比如让学 Linux，一上来就 Vim Emacs 纯英文文档，也只能半途而废。比日常多轻微些许难度，有许多甜头，才能真的把事情做成。&lt;br /&gt;
&lt;br /&gt;
20260114&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
水面波光粼粼，太阳浮光跃金，我们的爱，像小纸船，飘远了，不见了。&lt;br /&gt;
&lt;br /&gt;
20260112&lt;br /&gt;
----&lt;br /&gt;
最近，门禁卡失灵了，电脑屏幕坏了，饭卡丢了，棉拖被小太阳烤坏了，常去那家现包包子店倒闭了。&lt;br /&gt;
&lt;br /&gt;
门禁卡去物业刷新了。电脑买了新屏幕。饭卡去行政处办张新的。买了新棉拖。早餐多吃鸡蛋。&lt;br /&gt;
&lt;br /&gt;
20260106&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=%E4%B8%8A%E4%B8%AA%E6%9C%88%E6%88%91%E5%B9%B2%E4%BA%86%E4%BB%80%E4%B9%88_2026&amp;diff=11562</id>
		<title>上个月我干了什么 2026</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=%E4%B8%8A%E4%B8%AA%E6%9C%88%E6%88%91%E5%B9%B2%E4%BA%86%E4%BB%80%E4%B9%88_2026&amp;diff=11562"/>
		<updated>2026-07-28T09:23:53Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: /* 202607 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;向前看。&lt;br /&gt;
__TOC__&lt;br /&gt;
== 202601 ==&lt;br /&gt;
# 头发变茂密了，发型变帅了&lt;br /&gt;
# 隐约感到肌肉在长了&lt;br /&gt;
# 现在又掌握倒立了&lt;br /&gt;
# 写了份非常有逻辑的代理词&lt;br /&gt;
# 洗了鞋子&lt;br /&gt;
# 拖了地&lt;br /&gt;
# 电脑屏幕老死了，换了个新的，挑到了不错的屏幕&lt;br /&gt;
# 网站流量用超，关站了一天。感觉不太正常，按说我的网站的用户数，不至于能用完这么多流量。找机会排查看是否有人盗刷&lt;br /&gt;
# 看完了《怪奇物语》第四季、第五季&lt;br /&gt;
# 排查出保洁阿姨出现时的巨大损伤型恶臭，是公司的超簿垃圾袋释放的，于是和她商量不用再给我换垃圾袋，自己买了不臭的自己换，一下子拿回了属于自己的时间、专注和健康&lt;br /&gt;
# 封禁了恶意 ip，拯救了我的流量费。[[怎样封禁恶意_ip，避免服务器产生巨额流量费]]&lt;br /&gt;
# 在看《毛骗》团队的新片《[https://qingliezhiquan.com/blog/%E6%B5%B7%E5%B8%82%E8%9C%83%E6%A5%BC%EF%BC%9A%E5%8F%A4%E8%A3%85%E7%BB%8F%E5%85%B8 海市蜃楼]》。“海市蜃楼”多美好的词！快意江湖，难得的江湖气，前三集很有感觉，不过有点像《王国》，后边别被我发现是模仿《王国》。笑死了，有个傻傻的，叫曾信（“真信”）；有个拽拽的，叫曾倩（“真欠”）&lt;br /&gt;
# 徒步了科学岛 3.43 公里，它并不是湖心岛，是半岛，北面与陆地相连。参观了科技馆&lt;br /&gt;
# 买了万用表，研究修电器&lt;br /&gt;
# 买了温湿度计，营造合适室内环境&lt;br /&gt;
# 买了瑜珈垫，在小屋腾出健身场所了&lt;br /&gt;
# 买了腰靠，座椅舒服很重要&lt;br /&gt;
# 买了体重称。长胖这么多还不自觉，必须减重了&lt;br /&gt;
# 写了篇 [[怎样高效地拿回报销款]]&lt;br /&gt;
# 今天四次倒立，之后差点摔了，又做了一次倒立。其实根本不怕摔，只要有预期，快摔时正确卸力，迅速起身把歪坠的惯性，转移成起身的力，就没事了&lt;br /&gt;
# 今年不感觉冷，可能和我穿衣有关：内层聚酯纤维短袖，二层纯棉长袖，三层无袖宽松毛衣，最外加厚皮衣。四层穿搭一点不冷。有时一件 T 恤，二层一件长袖，外加一件棉服大衣，也不冷。下雪天也不冷。可能健身有点效果了&lt;br /&gt;
# 精研了父母的体检报告，并提出了下一步执行策略&lt;br /&gt;
# 写了篇 [[怎样养护头发]]&lt;br /&gt;
# 写了篇 [[电脑屏幕坏了，怎么挑选优质的屏幕]]&lt;br /&gt;
# 有一种对 1 月完结的恐慌。三十未立，事业无成，未来该走哪条路……&lt;br /&gt;
&lt;br /&gt;
== 202602 ==&lt;br /&gt;
# 去了浮槎山，徒步 10.84 公里&lt;br /&gt;
# 惊觉父亲老了，没以前那么犟了&lt;br /&gt;
# 发现立春前后，天光大亮，春天已至，倒春寒要命&lt;br /&gt;
# 和隔壁大吵一架，现在她们弄脏洗手间地面终于知道顺手拖干净了&lt;br /&gt;
# 看了电影《黑鹰坠落》。反战片，没啥感觉。现代战争比剧中高效万倍，黑鹰不会坠落了&lt;br /&gt;
# 看了电影《大逃杀》。日本批着纯爱外衣的变态片。杀着是过瘾，没啥内涵&lt;br /&gt;
# 看完了古装剧《海市蜃楼》。越看越没劲。能搬山移海的外星人却没有智商&lt;br /&gt;
# 把律师的锅甩回去了，他给错了账号，让他自己去变更&lt;br /&gt;
# 主动屏蔽了所有文字媒体、视频媒体，至于社交媒体我压根儿就没有用过&lt;br /&gt;
# 写了篇 [[论躺平与负债]]&lt;br /&gt;
# 写了篇 [[创业是道数学题]]&lt;br /&gt;
# 写了篇 [[办理护照和港澳通行证的经验]]&lt;br /&gt;
# 第一次尝试戴隐形眼镜，tmd，试了十几次，几个小时，恁是戴不进去&lt;br /&gt;
# 看了电影《逃狱惊魂》，非常经典，每个角色都有真实的欲望，动力十足&lt;br /&gt;
# 看了邓紫棋的科幻新书《启示路》。完全超出预期。fashion，浪漫，有趣，略拧巴。邓紫棋比想象中有才一百倍&lt;br /&gt;
# 写了篇 [[怎样用 Calibre 调整 EPUB 的格式使之完美阅读]]&lt;br /&gt;
# 又到了听《天空的颜色》的时候了&lt;br /&gt;
# 通过最正规的渠道，开通了低手续费股票账户，为开港股账户做足了准备&lt;br /&gt;
# 看了电影《出租车司机》美版、韩版&lt;br /&gt;
# 写了篇 [[过年随记]]&lt;br /&gt;
# 例行串串已吃&lt;br /&gt;
# 例行米线已吃 1/2&lt;br /&gt;
# 例行面馆已吃&lt;br /&gt;
# 例行米线已吃 2/2&lt;br /&gt;
# 例行登山徒步 8.32 公里&lt;br /&gt;
# 第一次买了只股票&lt;br /&gt;
# 徒步 11.25 公里&lt;br /&gt;
# 徒步缙云山 7.10 公里&lt;br /&gt;
# 徒步胜天湖 9.02 公里&lt;br /&gt;
&lt;br /&gt;
== 202603 ==&lt;br /&gt;
# 考察了梁平，竟然搞西部预制菜之都，一票否决。双桂湖公园南边的山倒还挺美的&lt;br /&gt;
# 在万州考察，因为买不到返肥火车票，焦头烂额。忘记了撞上学生开学高峰期&lt;br /&gt;
# 万州太窄了。一条主干道通全城的感觉。一种施展不开的感觉。五六根冲天柱，晚上九点多，不知在排放什么烟气，不像是好东西&lt;br /&gt;
# 打网约车旅游了万州之巅，然后急行军到了万州北站高铁站，去了奉节&lt;br /&gt;
# 从奉节坐小红船沿江往巫山走，此时正在船上，水汽扑来。坐了 4 小时&lt;br /&gt;
# 吃了巫山烤鱼&lt;br /&gt;
# 早上 06:00 起床，赶回奉节，参加徒步三峡之巅挑战赛，8.31 公里 2 小时 37 分 51 秒登顶，成功拿到奖牌。去得晚，日第 62 位登顶。日竞速第 16 名。月竞速第 25 名&lt;br /&gt;
# [[File:徒步三峡之巅8.31公里.jpg|100px]][[File:徒步三峡之巅成功领奖.jpg|100px]]&lt;br /&gt;
# 晚上 18:57 夜爬巫山三峡龙脊，乌压压的山上只有我一人，徒步 4.32 公里。下山打车难，结果五分钟内来了一对情侣和他们的弟弟妹妹来夜爬终点看风景，免费把我带到山下了。姓柳&lt;br /&gt;
# 发现眼袋重和眼镜重关系不大。最主要是因为长年睡到八点起，憋尿导致的。若六七点就尿干净，一点眼袋都没了&lt;br /&gt;
# 考察了利川，感觉皱巴巴的，不如奉节、巫山那种干净、舒展的感觉&lt;br /&gt;
# 看了电影《猜火车》，垃圾，毫无内涵，披个青春片的皮，搞宣毒&lt;br /&gt;
# 写了篇 [[渝东游记：地理奇迹，人文情怀]]&lt;br /&gt;
# 把行李箱洗了。它跟了我这么多年了，不忍它脏兮兮的，或许只是我在乎它干净与否。它应该不能水洗，但我还是把它洗干净了。扛过去，它就能再干净几年。扛不过去，就是它的宿命&lt;br /&gt;
# 看了李小龙的电影《龙争虎斗》，李小龙的努力，超出了“信仰”的范畴了&lt;br /&gt;
# 带着行李箱在公园晒了几小时太阳，主要是为了晒干行李箱&lt;br /&gt;
# 研究出了把本站内容发布到微信公众号的较为自动化的方法&lt;br /&gt;
# 看了电影《聚焦》，三流叙事&lt;br /&gt;
# 洗干净所有厨具，规整了厨房，做了 2026 出租屋第一餐&lt;br /&gt;
# [[File:2026 出租屋第一餐.jpg|200px]]&lt;br /&gt;
# 周五宜吃排骨炖冬笋&lt;br /&gt;
# [[File:周五宜吃排骨炖冬笋.jpg|200px]]&lt;br /&gt;
# 看了电影《德州电锯杀人狂》，一群疯子&lt;br /&gt;
# 前几天本站搜索崩了，因为内存不够用。给服务器加了 Swap 空间，内存能支撑更大的负载了。搜索功能恢复&lt;br /&gt;
# 看了电影《千钧一发》，什么人能写出这种优秀的剧本。不遗余力&lt;br /&gt;
# 买了电饭煲、煮蛋器、洗袜机、体态矫正带、公园露营椅、螺蛳粉&lt;br /&gt;
# 徒步紫蓬山 6 公里。去之前以为它很高，很壮观。刚出发时，查了下地图，就知道它爬升只有 200 米。都没喘下气，刚热个身已经爬完了&lt;br /&gt;
# [[File:红烧猪蹄.jpg|200px]]&lt;br /&gt;
# 做了 10 个俯卧撑。惭愧，20 多岁时轻轻松松，30 多岁时人好像变重了一样，好在又找回感觉了&lt;br /&gt;
# 又做了 10 个俯卧撑，感觉真好&lt;br /&gt;
# 网站遭受攻击，下一轮防攻击策略开始实施。网友里面有坏人呐&lt;br /&gt;
# 护照和港澳通行证终于到手了&lt;br /&gt;
# 买了块新的 27 英寸显示器&lt;br /&gt;
# 做了 35 个俯卧撑，手掌开始有力量了。惯例倒立四次&lt;br /&gt;
# [[File:世界上有千千万万碗面.jpg|200px]]&lt;br /&gt;
# 看完了《绝命律师》第一季&lt;br /&gt;
&lt;br /&gt;
== 202604 ==&lt;br /&gt;
# 笑死了，网站防爆破期间，阈值写得低，经常把自己挡在网站之外封一天。赶紧把自己加进白名单&lt;br /&gt;
# 成功搞定一个困扰一周的难题，[https://qingliezhiquan.com/blog/%E4%B8%80%E6%AC%A1_Anki_%E7%99%BB%E5%BD%95%E4%B8%8D%E4%B8%8A%E7%9A%84%E6%89%BE_bug_%E7%BB%8F%E5%8E%86 找 bug 过程]堪称经典&lt;br /&gt;
# 发现自己某些方面还挺厉害的&lt;br /&gt;
# 我代理的一个案子，对方脆败。他的毛病在于，同样的事，重复了三遍，大段大段的用 AI 写的，书记员和法官根本不可能看明白他在表达啥。打官司重在证据清晰明确、语言简明扼要，不然起诉状或答辩状白写了&lt;br /&gt;
# 看完了《绝命律师》第二季。Jimmy 阴了他哥一把，他哥也阴了他一把。Jimmy 与 Kim 共享办公室，开始独立执业。被偏爱的 Jimmy，成佛只需放下屠刀&lt;br /&gt;
# 买了个高压锅（苏泊尔京东自营旗舰店，底直径 24 厘米，7.0L，食品级 304 不锈钢材质）。上气后 28 分钟，就把 2.9 kg 肘子炖到软烂脱骨，骨头都可以轻松嚼碎。解决了切肉洗菜板的麻烦。2.9 kg 太多了，下次控制在 2 kg 以内，上气后 20 分钟炖足够了&lt;br /&gt;
# 炖了一只三黄鸡、两斤鸡爪、两个鸡边腿、一斤鲜板栗。上气后 12 分钟就软烂脱骨了。下次炖鸡 10 分钟足够了&lt;br /&gt;
# 处理去香港玩的所有 [https://qingliezhiquan.com/blog/%E9%A6%99%E6%B8%AF%E6%B8%B8%E8%AE%B0%EF%BC%9A%E5%96%9C%E5%B8%96%E8%A1%97#%E9%80%9A%E7%94%A8%E5%87%86%E5%A4%87 预备事项]，好一通忙碌。所有事情从结果看很简单，到达结果的过程中，需要许多比对时间&lt;br /&gt;
# 买了一双皮鞋，不易起皱，但皮革太次了，放了一周多，还有严重刺鼻劣质塑料味或甲醛味，这 159.6 元白花了。我打算扔掉，钱没有命重要。而且这种劣质塑料，易变形。鞋底比鞋面大了一圈，像踩了个盘子在脚下，以后选款式时避雷。我讨厌这双鞋到什么程度呢？打算晚上丢掉，现在左边鞋带松了一根，我都懒得系一下&lt;br /&gt;
# 买了一件公务式的休闲衣，挺板正，像个程序员了&lt;br /&gt;
# 买了一套扫把，扔掉了房间里旧的脏扫把。时时打扫地面的小渣渣很有必要，而这种易影响氛围的小事，要做得舒服，干净的扫把很有必要&lt;br /&gt;
# 买了 50 厘米宽衣架，保护衣服的肩线&lt;br /&gt;
# 把冬天的衣服全收进行李箱，放到衣柜顶上了，衣柜空出大面积，变得比较整齐&lt;br /&gt;
# 买了套引体向上设备，艰难进阶中&lt;br /&gt;
# 全面规整了我的 Emacs 配置，学会了一个简单的事：如果靠代码要 100 行，靠人只要 4 行，那就别搞什么自动化了，就靠人算了&lt;br /&gt;
&lt;br /&gt;
== 202605 ==&lt;br /&gt;
# 1 kg 排骨，1.5 kg 蹄膀，1.5 kg 白萝卜，一起炖一大锅，出锅三大盘、四中碗、三小碗，足够佐餐十次。食材才 61.5 元。淘洗花了不到 20 分钟，炒制花了不到 15 分钟，高压锅炖了 10 分钟左右，上气后再炖 10 分钟，就放着等开锅了&lt;br /&gt;
# 天气开始炎热，晚上回家都得开空调了&lt;br /&gt;
# 帮朋友干了一个项目，当作感谢&lt;br /&gt;
&lt;br /&gt;
== 202606 ==&lt;br /&gt;
# 处于焦虑之中&lt;br /&gt;
# 二刷浮槎山，不累。体质真的强了很多&lt;br /&gt;
# 爬了蜀山。很多年前我第一次爬的时候，客观上用了 1.5 小时，体感有 3 小时，感觉路漫长没有边际。这次走同样的路，最多只有某个 5 分钟的陡坡接电话时喘了下，其他的 15 分钟不到就毫无压力地到顶点了，非常轻松&lt;br /&gt;
# 常做俯卧撑，胸肌显现。头发留长了。颜值有了巨大提升&lt;br /&gt;
# 成功学会佩戴隐形眼镜&lt;br /&gt;
# 成功实现 15 个标准俯卧撑 + 3 个硬拉引体向上&lt;br /&gt;
# 成功购买 Apple GiftCard&lt;br /&gt;
# 拖了地&lt;br /&gt;
# 发现一家好吃的盖浇饭店&lt;br /&gt;
# 发现一家好吃的烤串店&lt;br /&gt;
# 去学林公园天养了一天，翻了很多次跟头，全靠左肩摔，也不疼，克服了恐惧，有望学会后空翻&lt;br /&gt;
# 成功实现 30 个标准俯卧撑 + 6 个硬拉引体向上&lt;br /&gt;
# 看了电影《新世界》，模仿《无间道》，超越《无间道》&lt;br /&gt;
# 看了电影《大空头》，简而言之：银行放房贷给普通人，银行把债权打包组合后出卖，层层包装组合，全世界银行都持有大量次贷。由于通货膨胀、物价上涨、审核不严，贷款违约的人越来越多，建立在虚空信用上的贷款面临崩塌，而最先发现的人，与银行对赌购买下跌期权。等贷款违约的人数达到临界点，大量银行破产，下跌期权赢了。最先做空的人，把认知变成了巨额财富&lt;br /&gt;
&lt;br /&gt;
== 202607 ==&lt;br /&gt;
# 我写的一个答辩状，获得了完胜。对方要 156827.49 元。法院判了 2880 元。拿着我写的答辩状去开庭的法人，表示完胜非常爽&lt;br /&gt;
# 成功实现 40 个标准俯卧撑 + 7 个硬拉引体向上&lt;br /&gt;
# 成功实现 60 个标准俯卧撑&lt;br /&gt;
# 围棋 9 路已经杀到 2 级；19 路已经杀到 8 级&lt;br /&gt;
# 开始研究 [https://qingliezhiquan.com/blog/%E4%BE%BF%E6%8D%B7%E6%9F%A5%E6%89%BE#%E6%8A%95%E8%B5%84 投资]&lt;br /&gt;
# 初次入市，除了京东方赚了点，其余全部大跌&lt;br /&gt;
# 完成了五月心愿，桌面收纳整洁了，一下氛围不一样了&lt;br /&gt;
# 戴隐形眼镜已经有 90% 的成功率&lt;br /&gt;
# 彻底理解了 elisp 里的递归，理解并应用了 Emacs 里 load-path 的递归，有了成熟的 Emacs 配置，可以确保无侵入式尝新&lt;br /&gt;
# 彻底理解了 ipset 是集合名单，iptables 可以按集合名单干活。netfilter-persistent 使规则永久化&lt;br /&gt;
# 胃被折腾得不好，首先是受凉，其次是经常连续三顿吃同样的食物，最后是经常吃食材不新鲜的饭店。自己做饭必须重视起来了&lt;br /&gt;
# 每天已能比较轻松的完成 60 个标准俯卧撑 + 90 秒倒立&lt;br /&gt;
# 使用 ChatGPT 5.6 Sol Extra High，把《GNU Emacs Lisp Reference Manual》《GNU Emacs Manual》《Specialized Emacs Features》《The Little Schemer》《The King James Version of the Bible》这五本书里的所有单词，制作成了 Anki 词卡：&amp;lt;b&amp;gt;TEBC11276en20260716.txt&amp;lt;/b&amp;gt;。有可能是当前世界上最棒的英汉词卡。Emacs 和 Lisp 负责技术上掌握世界，圣经负责玄学上理解世界，我准备靠这些单词学通英语&lt;br /&gt;
## T 代表选编者&lt;br /&gt;
## E 代表 Emacs 和 Elisp&lt;br /&gt;
## B 代表 Bible&lt;br /&gt;
## C 代表 ChatGPT&lt;br /&gt;
## 11276 代表词头数&lt;br /&gt;
## en 代表英文&lt;br /&gt;
## 20260716 代表完结日期&lt;br /&gt;
# 下班到家后，倾向于把手机用自律盒锁起来。必须戒断短视频和流媒体了&lt;br /&gt;
# 彻底了结一件事&lt;br /&gt;
# 网站卡成一团糟，果断把某网段封了 20 天，效果立竿见影。常规过于频繁访问我网站的 IP，也改为封 3 天&lt;br /&gt;
# 再战爬虫，取得胜利&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=Emacs_%E5%86%99_C_%E9%A1%B9%E7%9B%AE%E6%AD%A5%E9%AA%A4&amp;diff=11561</id>
		<title>Emacs 写 C 项目步骤</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=Emacs_%E5%86%99_C_%E9%A1%B9%E7%9B%AE%E6%AD%A5%E9%AA%A4&amp;diff=11561"/>
		<updated>2026-07-26T15:40:41Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;gcc 编译器。&lt;br /&gt;
&lt;br /&gt;
gdb 调试器。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Emacs 写 C 项目的步骤&lt;br /&gt;
!命令 / 工具&lt;br /&gt;
!实质&lt;br /&gt;
!解决的痛点&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;sudo apt install build-essential&amp;lt;/code&amp;gt;&lt;br /&gt;
|安装基础 C/C++ 构建工具集合，包含 GCC、Make 等&lt;br /&gt;
|Emacs 本身不负责把 C 源码编译成程序&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;sudo apt install gdb&amp;lt;/code&amp;gt;&lt;br /&gt;
|安装 &#039;&#039;&#039;GDB 调试器&#039;&#039;&#039;&lt;br /&gt;
|Emacs 本身没有 C 程序的底层调试能力&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;M-x compile&amp;lt;/code&amp;gt;&lt;br /&gt;
|在当前 buffer 的 &amp;lt;code&amp;gt;default-directory&amp;lt;/code&amp;gt; 中启动一个异步编译命令&lt;br /&gt;
|不必离开 Emacs 去终端编译；编译结果还能被 Emacs 解析&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;gcc -std=c17 -Wall -Wextra -Wpedantic -g -O0 main.c -o hello&amp;lt;/code&amp;gt;&lt;br /&gt;
|一条具体的 GCC 编译命令&lt;br /&gt;
|明确使用什么标准、警告、调试信息和输出文件&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;M-x project-shell&amp;lt;/code&amp;gt;&lt;br /&gt;
|在&#039;&#039;&#039;项目根目录&#039;&#039;&#039;启动 Shell&lt;br /&gt;
|不管当前文件藏在 &amp;lt;code&amp;gt;src/&amp;lt;/code&amp;gt; 多深，都能直接从项目根运行 &amp;lt;code&amp;gt;./hello&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; 等&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;M-x shell&amp;lt;/code&amp;gt;&lt;br /&gt;
|在当前 buffer 的 &amp;lt;code&amp;gt;default-directory&amp;lt;/code&amp;gt; 启动 Shell&lt;br /&gt;
|在 Emacs 内直接使用普通 Shell&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;M-x project-compile&amp;lt;/code&amp;gt;&lt;br /&gt;
|在&#039;&#039;&#039;项目根目录&#039;&#039;&#039;启动 Compilation&lt;br /&gt;
|避免当前文件位于 &amp;lt;code&amp;gt;src/&amp;lt;/code&amp;gt; 时，从错误目录执行 &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;M-x recompile&amp;lt;/code&amp;gt;&lt;br /&gt;
|重复最近一次 Compilation 命令&lt;br /&gt;
|避免反复输入 &amp;lt;code&amp;gt;make -k&amp;lt;/code&amp;gt;、GCC 参数等&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt;&lt;br /&gt;
|描述构建目标、依赖关系和构建规则&lt;br /&gt;
|不再手写长串 GCC 命令；项目只重新编译必要部分，并让构建方法可重复&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;M-x gdb&amp;lt;/code&amp;gt;&lt;br /&gt;
|启动 &#039;&#039;&#039;GDB 调试器&#039;&#039;&#039;，并进入 Emacs 的图形化 GDB 界面&lt;br /&gt;
|在 Emacs 中调试已经编译出来的程序&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;M-x gud-break&amp;lt;/code&amp;gt;&lt;br /&gt;
|【源码 buffer】在当前代码行设置断点&lt;br /&gt;
|让程序运行到指定位置时暂停，方便观察当时的变量、调用栈和状态&lt;br /&gt;
|-&lt;br /&gt;
|点击 fringe 红点&lt;br /&gt;
|【GDB 管理的源码 buffer】图形化设置/删除 breakpoint&lt;br /&gt;
|和 &amp;lt;code&amp;gt;gud-break&amp;lt;/code&amp;gt; 本质一样，只是鼠标操作更直观&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;M-g n&amp;lt;/code&amp;gt;（&amp;lt;code&amp;gt;next-error&amp;lt;/code&amp;gt;）&lt;br /&gt;
|跳到下一条已解析的错误/警告对应源码位置&lt;br /&gt;
|不必看着 &amp;lt;code&amp;gt;main.c:37:5&amp;lt;/code&amp;gt; 再手工寻找第 37 行&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;M-x gud-next&amp;lt;/code&amp;gt;&lt;br /&gt;
|【源码 buffer】执行下一行，但&#039;&#039;&#039;不进入&#039;&#039;&#039;被调用函数&lt;br /&gt;
|想逐行观察流程，但暂时不关心函数内部&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;M-x gud-step&amp;lt;/code&amp;gt;&lt;br /&gt;
|【源码 buffer】执行下一步，并&#039;&#039;&#039;进入&#039;&#039;&#039;被调用函数&lt;br /&gt;
|怀疑某个函数内部出了问题，需要钻进去看&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;M-x gud-cont&amp;lt;/code&amp;gt;&lt;br /&gt;
|【源码 buffer】继续运行，直到下一个断点/异常&lt;br /&gt;
|不需要一行一行走完整个程序&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;M-x gud-finish&amp;lt;/code&amp;gt;&lt;br /&gt;
|【源码 buffer】运行到当前函数返回&lt;br /&gt;
|已经确认这个函数没问题，快速退出它&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;M-x gud-up&amp;lt;/code&amp;gt;&lt;br /&gt;
|【源码/GDB 调试上下文】切换到调用栈的上一层 stack frame&lt;br /&gt;
|查看“是谁调用了当前函数”，以及调用者当时的变量&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;(gdb) print numerator&amp;lt;/code&amp;gt;&lt;br /&gt;
|【GDB buffer】计算并显示一个表达式当前的值&lt;br /&gt;
|查看程序暂停这一刻变量到底是什么&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;(gdb) backtrace&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;bt&amp;lt;/code&amp;gt;&lt;br /&gt;
|【GDB buffer】显示整个调用栈&lt;br /&gt;
|搞清楚程序是沿着哪条函数调用路径走到当前位置的&lt;br /&gt;
|}&lt;br /&gt;
                写 C&lt;br /&gt;
&lt;br /&gt;
                  │&lt;br /&gt;
&lt;br /&gt;
              main.c&lt;br /&gt;
&lt;br /&gt;
                  │&lt;br /&gt;
&lt;br /&gt;
          GCC / Make&lt;br /&gt;
&lt;br /&gt;
        【负责构建】&lt;br /&gt;
&lt;br /&gt;
                  │&lt;br /&gt;
&lt;br /&gt;
                hello&lt;br /&gt;
&lt;br /&gt;
             可执行程序&lt;br /&gt;
&lt;br /&gt;
                  │&lt;br /&gt;
&lt;br /&gt;
          ┌───────┴────────┐&lt;br /&gt;
&lt;br /&gt;
          ↓                ↓&lt;br /&gt;
&lt;br /&gt;
       直接运行            GDB&lt;br /&gt;
&lt;br /&gt;
      ./hello           【负责调试】&lt;br /&gt;
&lt;br /&gt;
                           │&lt;br /&gt;
&lt;br /&gt;
                   breakpoint&lt;br /&gt;
&lt;br /&gt;
                   next / step&lt;br /&gt;
&lt;br /&gt;
                   print / bt&lt;br /&gt;
&lt;br /&gt;
Emacs 把这一切包起来：&lt;br /&gt;
&lt;br /&gt;
源码 buffer&lt;br /&gt;
&lt;br /&gt;
    ↕&lt;br /&gt;
&lt;br /&gt;
Compilation buffer&lt;br /&gt;
&lt;br /&gt;
    ↕&lt;br /&gt;
&lt;br /&gt;
Shell buffer&lt;br /&gt;
&lt;br /&gt;
    ↕&lt;br /&gt;
&lt;br /&gt;
GDB buffer&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=Emacs_%E5%86%99_C_%E9%A1%B9%E7%9B%AE%E6%AD%A5%E9%AA%A4&amp;diff=11560</id>
		<title>Emacs 写 C 项目步骤</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=Emacs_%E5%86%99_C_%E9%A1%B9%E7%9B%AE%E6%AD%A5%E9%AA%A4&amp;diff=11560"/>
		<updated>2026-07-26T15:38:17Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: Created page with &amp;quot;{| class=&amp;quot;wikitable&amp;quot; !命令 / 工具 !实质 !解决的痛点 |- |&amp;lt;code&amp;gt;sudo apt install build-essential&amp;lt;/code&amp;gt; |安装基础 C/C++ 构建工具集合，包含 GCC、Make 等 |Emacs 本身不负责把 C 源码编译成程序 |- |&amp;lt;code&amp;gt;sudo apt install gdb&amp;lt;/code&amp;gt; |安装 &amp;#039;&amp;#039;&amp;#039;GDB 调试器&amp;#039;&amp;#039;&amp;#039; |Emacs 本身没有 C 程序的底层调试能力 |- |&amp;lt;code&amp;gt;M-x compile&amp;lt;/code&amp;gt; |在当前 buffer 的 &amp;lt;code&amp;gt;default-directory&amp;lt;/code&amp;gt; 中启动一个异步编译命令 |不必离开 Ema...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!命令 / 工具&lt;br /&gt;
!实质&lt;br /&gt;
!解决的痛点&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;sudo apt install build-essential&amp;lt;/code&amp;gt;&lt;br /&gt;
|安装基础 C/C++ 构建工具集合，包含 GCC、Make 等&lt;br /&gt;
|Emacs 本身不负责把 C 源码编译成程序&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;sudo apt install gdb&amp;lt;/code&amp;gt;&lt;br /&gt;
|安装 &#039;&#039;&#039;GDB 调试器&#039;&#039;&#039;&lt;br /&gt;
|Emacs 本身没有 C 程序的底层调试能力&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;M-x compile&amp;lt;/code&amp;gt;&lt;br /&gt;
|在当前 buffer 的 &amp;lt;code&amp;gt;default-directory&amp;lt;/code&amp;gt; 中启动一个异步编译命令&lt;br /&gt;
|不必离开 Emacs 去终端编译；编译结果还能被 Emacs 解析&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;gcc -std=c17 -Wall -Wextra -Wpedantic -g -O0 main.c -o hello&amp;lt;/code&amp;gt;&lt;br /&gt;
|一条具体的 GCC 编译命令&lt;br /&gt;
|明确使用什么标准、警告、调试信息和输出文件&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;M-x project-shell&amp;lt;/code&amp;gt;&lt;br /&gt;
|在&#039;&#039;&#039;项目根目录&#039;&#039;&#039;启动 Shell&lt;br /&gt;
|不管当前文件藏在 &amp;lt;code&amp;gt;src/&amp;lt;/code&amp;gt; 多深，都能直接从项目根运行 &amp;lt;code&amp;gt;./hello&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt; 等&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;M-x shell&amp;lt;/code&amp;gt;&lt;br /&gt;
|在当前 buffer 的 &amp;lt;code&amp;gt;default-directory&amp;lt;/code&amp;gt; 启动 Shell&lt;br /&gt;
|在 Emacs 内直接使用普通 Shell&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;M-x project-compile&amp;lt;/code&amp;gt;&lt;br /&gt;
|在&#039;&#039;&#039;项目根目录&#039;&#039;&#039;启动 Compilation&lt;br /&gt;
|避免当前文件位于 &amp;lt;code&amp;gt;src/&amp;lt;/code&amp;gt; 时，从错误目录执行 &amp;lt;code&amp;gt;make&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;M-x recompile&amp;lt;/code&amp;gt;&lt;br /&gt;
|重复最近一次 Compilation 命令&lt;br /&gt;
|避免反复输入 &amp;lt;code&amp;gt;make -k&amp;lt;/code&amp;gt;、GCC 参数等&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;Makefile&amp;lt;/code&amp;gt;&lt;br /&gt;
|描述构建目标、依赖关系和构建规则&lt;br /&gt;
|不再手写长串 GCC 命令；项目只重新编译必要部分，并让构建方法可重复&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;M-x gdb&amp;lt;/code&amp;gt;&lt;br /&gt;
|启动 &#039;&#039;&#039;GDB 调试器&#039;&#039;&#039;，并进入 Emacs 的图形化 GDB 界面&lt;br /&gt;
|在 Emacs 中调试已经编译出来的程序&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;M-x gud-break&amp;lt;/code&amp;gt;&lt;br /&gt;
|【源码 buffer】在当前代码行设置断点&lt;br /&gt;
|让程序运行到指定位置时暂停，方便观察当时的变量、调用栈和状态&lt;br /&gt;
|-&lt;br /&gt;
|点击 fringe 红点&lt;br /&gt;
|【GDB 管理的源码 buffer】图形化设置/删除 breakpoint&lt;br /&gt;
|和 &amp;lt;code&amp;gt;gud-break&amp;lt;/code&amp;gt; 本质一样，只是鼠标操作更直观&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;M-g n&amp;lt;/code&amp;gt;（&amp;lt;code&amp;gt;next-error&amp;lt;/code&amp;gt;）&lt;br /&gt;
|跳到下一条已解析的错误/警告对应源码位置&lt;br /&gt;
|不必看着 &amp;lt;code&amp;gt;main.c:37:5&amp;lt;/code&amp;gt; 再手工寻找第 37 行&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;M-x gud-next&amp;lt;/code&amp;gt;&lt;br /&gt;
|【源码 buffer】执行下一行，但&#039;&#039;&#039;不进入&#039;&#039;&#039;被调用函数&lt;br /&gt;
|想逐行观察流程，但暂时不关心函数内部&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;M-x gud-step&amp;lt;/code&amp;gt;&lt;br /&gt;
|【源码 buffer】执行下一步，并&#039;&#039;&#039;进入&#039;&#039;&#039;被调用函数&lt;br /&gt;
|怀疑某个函数内部出了问题，需要钻进去看&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;M-x gud-cont&amp;lt;/code&amp;gt;&lt;br /&gt;
|【源码 buffer】继续运行，直到下一个断点/异常&lt;br /&gt;
|不需要一行一行走完整个程序&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;M-x gud-finish&amp;lt;/code&amp;gt;&lt;br /&gt;
|【源码 buffer】运行到当前函数返回&lt;br /&gt;
|已经确认这个函数没问题，快速退出它&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;M-x gud-up&amp;lt;/code&amp;gt;&lt;br /&gt;
|【源码/GDB 调试上下文】切换到调用栈的上一层 stack frame&lt;br /&gt;
|查看“是谁调用了当前函数”，以及调用者当时的变量&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;(gdb) print numerator&amp;lt;/code&amp;gt;&lt;br /&gt;
|【GDB buffer】计算并显示一个表达式当前的值&lt;br /&gt;
|查看程序暂停这一刻变量到底是什么&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;(gdb) backtrace&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;bt&amp;lt;/code&amp;gt;&lt;br /&gt;
|【GDB buffer】显示整个调用栈&lt;br /&gt;
|搞清楚程序是沿着哪条函数调用路径走到当前位置的&lt;br /&gt;
|}&lt;br /&gt;
                写 C&lt;br /&gt;
&lt;br /&gt;
                  │&lt;br /&gt;
&lt;br /&gt;
              main.c&lt;br /&gt;
&lt;br /&gt;
                  │&lt;br /&gt;
&lt;br /&gt;
          GCC / Make&lt;br /&gt;
&lt;br /&gt;
        【负责构建】&lt;br /&gt;
&lt;br /&gt;
                  │&lt;br /&gt;
&lt;br /&gt;
                hello&lt;br /&gt;
&lt;br /&gt;
             可执行程序&lt;br /&gt;
&lt;br /&gt;
                  │&lt;br /&gt;
&lt;br /&gt;
          ┌───────┴────────┐&lt;br /&gt;
&lt;br /&gt;
          ↓                ↓&lt;br /&gt;
&lt;br /&gt;
       直接运行            GDB&lt;br /&gt;
&lt;br /&gt;
      ./hello           【负责调试】&lt;br /&gt;
&lt;br /&gt;
                           │&lt;br /&gt;
&lt;br /&gt;
                   breakpoint&lt;br /&gt;
&lt;br /&gt;
                   next / step&lt;br /&gt;
&lt;br /&gt;
                   print / bt&lt;br /&gt;
&lt;br /&gt;
Emacs 把这一切包起来：&lt;br /&gt;
&lt;br /&gt;
源码 buffer&lt;br /&gt;
&lt;br /&gt;
    ↕&lt;br /&gt;
&lt;br /&gt;
Compilation buffer&lt;br /&gt;
&lt;br /&gt;
    ↕&lt;br /&gt;
&lt;br /&gt;
Shell buffer&lt;br /&gt;
&lt;br /&gt;
    ↕&lt;br /&gt;
&lt;br /&gt;
GDB buffer&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=%E7%94%B5%E8%84%91%E4%B8%AD%E7%BA%A7%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B&amp;diff=11559</id>
		<title>电脑中级使用教程</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=%E7%94%B5%E8%84%91%E4%B8%AD%E7%BA%A7%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B&amp;diff=11559"/>
		<updated>2026-07-26T15:27:31Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: /* Anki */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MediaWiki ==&lt;br /&gt;
* [[怎样迁移 MediaWiki 站点]]&lt;br /&gt;
* [[怎样为 MediaWiki 网站安装高级搜索拓展 CirrusSearch]]&lt;br /&gt;
* [[怎样安装 MediaWiki Math extension]]&lt;br /&gt;
* [[MediaWiki git 安装指南]]&lt;br /&gt;
* [[MediaWiki 怎么设置缓存]]&lt;br /&gt;
* [[怎样把 Excel 表格转换为 MediaWiki 表格]]&lt;br /&gt;
* [[为什么没放弃 Semantic MediaWiki]]&lt;br /&gt;
* [[怎么设置完整的、完善的 301 跳转]]&lt;br /&gt;
* [[删除英文标题，改为中文标题，之后怎么做 301 跳转]]&lt;br /&gt;
* [[WSL2 Debian MediaWiki 使用体验]]&lt;br /&gt;
* [[怎样使用 MediaWiki 的表格排序]]&lt;br /&gt;
* [[怎样使用 redis 作为 MediaWiki 的缓存后端]]&lt;br /&gt;
* [[MediaWiki 怎么设置各类 Debug 日志]]&lt;br /&gt;
* [[在 Semantic Mediawiki 中带有 subobject 的模板如何创建]]&lt;br /&gt;
* [[Semantic MediaWiki 中的那些符号的意思]]&lt;br /&gt;
* [[怎样保护你的 MediaWiki 站点的安全：权属建议]]&lt;br /&gt;
* [[在 Windows 10 VirtualBox 里的 MediaWiki]]&lt;br /&gt;
* [[怎样让 MediaWiki 生成完美的思维导图]]&lt;br /&gt;
* [[怎样把 MediaWiki 的 wikitext 转换为 GitHub 风格的 markdown]]&lt;br /&gt;
* [[mediawiki-el 出错始末]]&lt;br /&gt;
&lt;br /&gt;
== Emacs ==&lt;br /&gt;
* [[怎样用 Emacs 调电子书格式：格式凌乱通用解决方案]]&lt;br /&gt;
* [[Emacs 初级配置]]&lt;br /&gt;
* [[Emacs 后台自动启动-用户层面]]&lt;br /&gt;
* [[Emacs 后台自动启动-全局层面]]&lt;br /&gt;
* [[怎样在 Emacs 中编辑任意文字区域]]&lt;br /&gt;
* [[一批把法律文本的标题转换为 wikitext 层级标题的 Emacs 函数]]&lt;br /&gt;
* [[一个给内容编号的 Emacs 函数]]&lt;br /&gt;
* [[一个给法律条款文本前加两个全角空格的 Emacs 函数]]&lt;br /&gt;
* [[一个把 wikitext 转换成 markdown 的 Emacs 函数]]&lt;br /&gt;
* [[怎么使用原生 Android 版本的 Emacs]]&lt;br /&gt;
* [[Emacs 从零开始写配置]]&lt;br /&gt;
* [[Manateelazycat 的 Emacs 启动文件 site-start.el 研究]]&lt;br /&gt;
* [[Emacs 完整学习方法]]&lt;br /&gt;
* [[Emacs 字体设置的种种]]&lt;br /&gt;
* [[Git submodule 的精准用法]]&lt;br /&gt;
* [[Emacs 插件大法：几个超有用的插件]]&lt;br /&gt;
* [[两个递归子目录函数的比较]]&lt;br /&gt;
* [[建立正确的 Emacs 概念]]&lt;br /&gt;
* [[use-package 用法]]&lt;br /&gt;
* [[Emacs server 的异常的一次排查]]&lt;br /&gt;
&lt;br /&gt;
== Rime ==&lt;br /&gt;
* [[经典极简 Rime 配置]]&lt;br /&gt;
* [[在手机上从零开始配置 Rime 拼音输入法]]&lt;br /&gt;
* [[怎样使用 fcitx5-rime]]&lt;br /&gt;
&lt;br /&gt;
== Debian ==&lt;br /&gt;
* [[常用软件在 bullseye 与 bookworm 上的版本对比]]&lt;br /&gt;
* [[怎样从 Debian Bullseye 升级至 Debian Bookworm]]&lt;br /&gt;
* [[电脑必备软件名录]]&lt;br /&gt;
* [[怎样在 Debian 上安装围棋 AI Katago]]&lt;br /&gt;
* [[Debian 分区满了怎么办]]&lt;br /&gt;
* [[现在配置 SSL 证书实现 https 非常简单了]]&lt;br /&gt;
* [[Debian 换源方法]]&lt;br /&gt;
* [[在 Debian 上如何挂载一块硬盘]]&lt;br /&gt;
* [[Debian 忘记用户名怎么办]]&lt;br /&gt;
* [[Debian 服务器内存偶尔不够用怎么办]]&lt;br /&gt;
* [[在 Debian 中设置开机自动启动的方法]]&lt;br /&gt;
&lt;br /&gt;
== ArchLinux ==&lt;br /&gt;
* [[怎么使用 ArchLinux]]&lt;br /&gt;
* [[怎么在 ArchLinux 中使用 MediaWiki]]&lt;br /&gt;
* [[怎么在 VirtualBox 中使用 ArchLinux]]&lt;br /&gt;
* [[在 WSL2 中使用 ArchLinux]]&lt;br /&gt;
* [[EndeavourOS 怎么用]]&lt;br /&gt;
* [[一次恢复 ArchLinux 启动项的经历]]&lt;br /&gt;
* [[从 ArchLinux 改回 Debian 的全过程记录]]&lt;br /&gt;
&lt;br /&gt;
== WSL ==&lt;br /&gt;
* [[用 WSL 安装 Linux 发行版的方法]]&lt;br /&gt;
* [[WSLG 趣谈]]&lt;br /&gt;
* [[WSL2 proxy 的方法]]&lt;br /&gt;
* [[怎么在 Windows 上使用 Minder]]&lt;br /&gt;
&lt;br /&gt;
== TTY ==&lt;br /&gt;
* [[怎样令终端更加高效]]&lt;br /&gt;
&lt;br /&gt;
== Virtual ==&lt;br /&gt;
* [[QEMU KVM LIBVIRT 的区别]]&lt;br /&gt;
* [[VirtualBox 安装 Debian 的小 tips]]&lt;br /&gt;
* [[怎么使用 virt-manager]]&lt;br /&gt;
&lt;br /&gt;
== Defense ==&lt;br /&gt;
* [[怎样封禁恶意 ip，避免服务器产生巨额流量费]]&lt;br /&gt;
* [[iptables ipset 使用经验]]&lt;br /&gt;
* [[更智能的 iptables 封禁脚本，令服务器远离恶意攻击]]&lt;br /&gt;
* [[服务器安全防护总论]]&lt;br /&gt;
&lt;br /&gt;
== Anki ==&lt;br /&gt;
* [[怎么在不同平台下载并安装 Anki]]&lt;br /&gt;
* [[最简单的 Anki 同步教程]]&lt;br /&gt;
* [[一次 Anki 同步出问题的调试]]&lt;br /&gt;
* [[一次 Anki 登录不上的找 bug 经历]]&lt;br /&gt;
&lt;br /&gt;
== C ==&lt;br /&gt;
* [[Emacs 写 C 项目步骤]]&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
* [[程序员成长指南]]&lt;br /&gt;
* [[小代码大作用，电脑开荒代码：有哪些代码非常短但非常有用]]&lt;br /&gt;
* [[一台 apache 服务器托管多个网站的方法]]&lt;br /&gt;
* [[screen 使用指南]]&lt;br /&gt;
* [[Crontab 定时任务不按预计运行怎么办]]&lt;br /&gt;
* [[一段 ahk 脚本，自动移动光标至标签内，仅输入法中文状态下有效]]&lt;br /&gt;
* [[一段 ahk 脚本，在维基网站上自动输入模板内容]]&lt;br /&gt;
* [[读懂 diff]]&lt;br /&gt;
* [[怎样屏蔽某个网站以令自己更专注地面对生活的真实挑战]]&lt;br /&gt;
* [[XAMPP 在 Windows 上 localhost 运行缓慢的解决办法]]&lt;br /&gt;
* [[Msys pacman 用法]]&lt;br /&gt;
* [[Plausible 及 Docker 折腾指北]]&lt;br /&gt;
* [[怎么使用 beancount]]&lt;br /&gt;
* [[用 bash 脚本计算当前文件夹内所有 .docx 文件的 sha1 值]]&lt;br /&gt;
* [[Flatpak 怎么用]]&lt;br /&gt;
* [[酷比魔方刷机方法]]&lt;br /&gt;
* [[常规 Linux 软件快速安装]]&lt;br /&gt;
* [[怎么使用 python 虚拟环境 venv]]&lt;br /&gt;
* [[怎么使用 composer]]&lt;br /&gt;
* [[为什么我需要一台 VPS]]&lt;br /&gt;
* [[LibreOffice Calc 怎么改默认字号]]&lt;br /&gt;
* [[编程基础]]&lt;br /&gt;
* [[Python 学习笔记]]&lt;br /&gt;
* [[极简 git 步骤]]&lt;br /&gt;
* [[Python 环境相关]]&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=%E5%AE%8C%E7%BE%8E%E6%97%A5%E7%94%A8%E5%B0%8F%E5%91%BD%E4%BB%A4&amp;diff=11558</id>
		<title>完美日用小命令</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=%E5%AE%8C%E7%BE%8E%E6%97%A5%E7%94%A8%E5%B0%8F%E5%91%BD%E4%BB%A4&amp;diff=11558"/>
		<updated>2026-07-24T07:38:14Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 目标或作用&lt;br /&gt;
! 对应方法&lt;br /&gt;
|-&lt;br /&gt;
|在 MINGW64 里找二进制文件位置&lt;br /&gt;
|which git&lt;br /&gt;
&lt;br /&gt;
which bash&lt;br /&gt;
&lt;br /&gt;
cygpath -w /mingw64&lt;br /&gt;
&lt;br /&gt;
cygpath -w /usr&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
|Emacs 里到底哪个配置偷偷执行了这个函数&lt;br /&gt;
|(debug-on-entry &#039;那个函数)&lt;br /&gt;
|-&lt;br /&gt;
|查某个软件到底安装了些什么&lt;br /&gt;
|dpkg -L beancount | grep /usr/bin&lt;br /&gt;
|-&lt;br /&gt;
|elisp 求值&lt;br /&gt;
|*scratch* 里试验：C-j（eval-print-last-sexp）&lt;br /&gt;
&lt;br /&gt;
.el 文件里现场执行：C-x C-e（eval-last-sexp）&lt;br /&gt;
|-&lt;br /&gt;
|git 极简指南&lt;br /&gt;
|&lt;br /&gt;
本地出生：目录 → git init → .gitignore → add → commit → remote → push&lt;br /&gt;
&lt;br /&gt;
远程出生：GitHub 仓库 → git clone → 修改 → add → commit → push&lt;br /&gt;
|-&lt;br /&gt;
|Emacs 里误删 projects 标记文件&lt;br /&gt;
|打开项目内文件，再运行一次 project-find-file 命令，Emacs 就会重新记住项目&lt;br /&gt;
|-&lt;br /&gt;
|git 文件模式的含义&lt;br /&gt;
|100644 普通文件&lt;br /&gt;
&lt;br /&gt;
100755 可执行文件&lt;br /&gt;
&lt;br /&gt;
160000 Git submodule 的 `gitlink`&lt;br /&gt;
|-&lt;br /&gt;
|打印文件不想手动分份&lt;br /&gt;
|逐份打印，或称自动分页&lt;br /&gt;
[[File:逐份打印.png|400px]][[File:不逐份打印.png|400px]]&lt;br /&gt;
|-&lt;br /&gt;
|svg 字符丢失&lt;br /&gt;
|grep font-family sth.svg 可以查看该 svg 用了什么字体，再在服务器安装该字体，即可&lt;br /&gt;
|-&lt;br /&gt;
| emacs 乱码三部曲&lt;br /&gt;
|&lt;br /&gt;
* 辨别：[http://www.mytju.com/classCode/tools/messyCodeRecover.asp 乱码恢复]&lt;br /&gt;
* 重置：revert-buffer-with-coding-system&lt;br /&gt;
* 另存：set-buffer-file-coding-system&lt;br /&gt;
|-&lt;br /&gt;
| 用关键字查找文件&lt;br /&gt;
| 把这段放入 .bashrc&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
f(){&lt;br /&gt;
    find . -iname &amp;quot;*$1*&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 删除注释，只看已设置的配置。“说人话”&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ren() { sed &#039;/^#/d&#039; &amp;quot;$1&amp;quot; &amp;gt; &amp;quot;ren.$1&amp;quot;; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| Debian 怎么高效截屏&lt;br /&gt;
| 打开 Keyboard → Application Shortcuts，把原来绑定 Print 的命令替换为 flameshot gui&lt;br /&gt;
|-&lt;br /&gt;
| 把命令行提示符改为青色&lt;br /&gt;
| 以下行放入 ~/.bashrc&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
PS1=&#039;\[\033[0;36m\]\u@\h:\w\$ \[\033[00m\]&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 修改文件前先创建备份&lt;br /&gt;
| 建一个 bak 函数：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
bak() { cp -a -- &amp;quot;$1&amp;quot; &amp;quot;$1&amp;quot;.bak.$(date +%Y%m%d%H%M%S); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 查某部门的电话&lt;br /&gt;
| 官网如果查不到，问 114 或有奇效&lt;br /&gt;
|-&lt;br /&gt;
| excel 中给 A1 单元格前后加东西&lt;br /&gt;
| 用 &amp;quot;&amp;quot; 和 &amp;amp;。如 &amp;lt;nowiki&amp;gt;&amp;quot;[[&amp;quot; &amp;amp; A1 &amp;amp; &amp;quot;]]&amp;quot;&amp;lt;/nowiki&amp;gt; 表示在 A1 的内容前后加 &amp;lt;nowiki&amp;gt;[[ 和 ]]&amp;lt;/nowiki&amp;gt;。即小猫，变成 &amp;lt;nowiki&amp;gt;[[小猫]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| mediawiki 批量上传图片&lt;br /&gt;
| php maintenance/run.php importImages ~/sth --comment=&amp;quot;批量导入，新年快乐&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 设置 Debian 电脑时区&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看当前时区与时间状态&lt;br /&gt;
sudo timedatectl status&lt;br /&gt;
# 把时区设为 Asia/Shanghai（UTC+8）&lt;br /&gt;
sudo timedatectl set-timezone Asia/Shanghai&lt;br /&gt;
# 再次确认&lt;br /&gt;
timedatectl status&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 剪映裁切视频&lt;br /&gt;
| 轨道上方的工具栏明晃晃就有个裁剪图标，点它就行&lt;br /&gt;
|-&lt;br /&gt;
| OBS 只采集窗口的一部分&lt;br /&gt;
| 按住 Alt 再推动就行&lt;br /&gt;
|-&lt;br /&gt;
| 打开某个网站，一片乱码&lt;br /&gt;
| 试试按 Alt 键，在出现的菜单栏上，View 有个功能：Repair Text Encoding&lt;br /&gt;
|-&lt;br /&gt;
| base64 解码&lt;br /&gt;
| &amp;lt;code&amp;gt;echo &amp;quot;aHR0cHM6Ly9jbGF1ZGVjb2RlOC5jb20vdjJleDA0&amp;quot; | base64 -d&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 下载 m3u8 视频&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
首先在浏览器安装 cat-catch&lt;br /&gt;
其次在电脑里安装 yt-dlp&lt;br /&gt;
最后在终端里 yt-dlp -o sth.mp4 &amp;quot;url&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Yt-dlp 生效状态.png|300px]]&lt;br /&gt;
|-&lt;br /&gt;
| 查找符合条件的文件后替换&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
find . -type f -name &amp;quot;*.beancount&amp;quot; -exec sed &#039;s/2025-10-01/2024-04-06/g&#039; {} +&lt;br /&gt;
&lt;br /&gt;
find . → 从当前目录开始查找&lt;br /&gt;
-type f → 只查找文件&lt;br /&gt;
-name &amp;quot;*.beancount&amp;quot; → 只匹配后缀为 .beancount 的文件&lt;br /&gt;
-exec ... {} + → 对每个匹配的文件执行后面的命令&lt;br /&gt;
sed -i &#039;s/2025-10-01/2024-04-06/g&#039; →&lt;br /&gt;
-i 表示直接修改文件&lt;br /&gt;
&#039;s/旧/新/g&#039; 表示全局替换&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 找到所有文章&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
curl -s &amp;quot;https://somesite.com/api.php?action=query&amp;amp;format=json&amp;amp;generator=allpages&amp;amp;gapnamespace=0&amp;amp;gaplimit=max&amp;amp;prop=info&amp;amp;inprop=url&amp;quot; | jq .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| emacs 中按行号加序号&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;elisp&amp;quot;&amp;gt;&lt;br /&gt;
M-x replace-regexp RET ^ RET \,(1+ \#). RET&lt;br /&gt;
# ^ → 匹配行首&lt;br /&gt;
# \, → 计算 Lisp 表达式&lt;br /&gt;
# \# → 当前行号&lt;br /&gt;
# 1+ \# → 每行号加 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
整体作用 → 给每行自动生成递增编号&lt;br /&gt;
|-&lt;br /&gt;
| emacs 中插入两个全角空格&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
insert-char 3000 #或者&lt;br /&gt;
&lt;br /&gt;
(global-set-key (kbd &amp;quot;C-c s&amp;quot;)&lt;br /&gt;
		(lambda () (interactive) (insert-char #x3000 2)))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 解决 ssh 断联问题&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 本地 ~/.ssh/config&lt;br /&gt;
Host *&lt;br /&gt;
    ServerAliveInterval 60&lt;br /&gt;
    ServerAliveCountMax 3&lt;br /&gt;
&lt;br /&gt;
# 远程 /etc/ssh/sshd_config&lt;br /&gt;
ClientAliveInterval 60&lt;br /&gt;
ClientAliveCountMax 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 隐藏 MediaWiki 侧边栏&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
/* 隐藏侧边栏 */&lt;br /&gt;
#mw-panel {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* 扩展正文到全屏 */&lt;br /&gt;
#content {&lt;br /&gt;
    margin-left: 0 !important;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| wikitable 中有的想排序有的不想排序&lt;br /&gt;
| 总表 class=&amp;quot;wikitable sortable&amp;quot;，在不想排序的表头设置 class=&amp;quot;unsortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| wikitable 单元格内换行后感觉有点远&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
style=&amp;quot;line-height:1.01;&amp;quot;&lt;br /&gt;
# 这样设置后，单元格里的内容呈块状，亲疏更加令人舒服&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Excel 单元格内换行&lt;br /&gt;
| 替换框里用 Ctrl J 能实现&lt;br /&gt;
|-&lt;br /&gt;
| github 提速方法一则&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# ssh over https&lt;br /&gt;
Host github.com&lt;br /&gt;
HostName ssh.github.com # 默认 ssh，不通过 https&lt;br /&gt;
Port 443&lt;br /&gt;
User git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| github 提速方法一则&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 放 ~/.ssh/config 里&lt;br /&gt;
Host github.com&lt;br /&gt;
  User git&lt;br /&gt;
  HostName github.com&lt;br /&gt;
  ProxyJump proxyserver&lt;br /&gt;
  &lt;br /&gt;
Host proxyserver&lt;br /&gt;
  User root&lt;br /&gt;
  HostName your_server_ip&lt;br /&gt;
  IdentityFile xxx&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 无 GUI 的 Linux 里 less 妙用&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
alias s=&amp;quot;ls -alh --color=auto | less&amp;quot;&lt;br /&gt;
Space 向下翻页&lt;br /&gt;
b 向上翻页&lt;br /&gt;
↑ / ↓ 单行滚动&lt;br /&gt;
q 退出&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 不想上的网课怎么办&lt;br /&gt;
| 去 greasyforks 搜该网课的域名&lt;br /&gt;
|-&lt;br /&gt;
| 怎样在 Emacs query-replace-regex 里使用“或”语义&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;\|&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 怎样让文件总是提示“建议只读”模式打开&lt;br /&gt;
| “保存”时，保存左边有个“工具” - “常规选项” - “建议只读”&lt;br /&gt;
|-&lt;br /&gt;
| mediawiki gd 不支持 webp&lt;br /&gt;
| sudo apt install imagemagick libwebp-dev，再在 LocalSettings.php 里打开 convert&lt;br /&gt;
|-&lt;br /&gt;
| Emacs 密钥过期无法更新 package 时应该怎么做&lt;br /&gt;
| 手动到 [https://elpa.gnu.org/packages/gnu-elpa-keyring-update.html GNU ELPA - gnu-elpa-keyring-update] 下载 gnu-elpa-keyring-update&lt;br /&gt;
在 Emacs 里打开这个 tar 文件，执行 package-install-from-buffer&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 音频转文字&lt;br /&gt;
| &amp;lt;code&amp;gt;whisper ~/S01E01.aac --model turbo -f srt --output_dir ~/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
model: tiny, base, small, medium, large, 或 turbo&lt;br /&gt;
f: format. txt, srt, vtt 等&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 视频提取音频&lt;br /&gt;
| &amp;lt;code&amp;gt;ffmpeg -i ~/S01E01.mp4 -vn -acodec copy ~/S01E01.aac&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i: input&lt;br /&gt;
vn: vedio none 不要视频&lt;br /&gt;
acoder copy: audio copy 直接复制音轨&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 表格中的第一个 # 号不解析&lt;br /&gt;
| #&lt;br /&gt;
# 天空&lt;br /&gt;
# 大地&lt;br /&gt;
# 人间&lt;br /&gt;
# 湖水&lt;br /&gt;
即在左上角先放一个 # 号&lt;br /&gt;
|-&lt;br /&gt;
| Semantic MediaWiki 日期标准化&lt;br /&gt;
| ?开庭日期#ISO&lt;br /&gt;
|-&lt;br /&gt;
| pubkey 不方便往服务器上粘&lt;br /&gt;
| 用 echo &amp;quot;Ctrl V&amp;quot; &amp;gt;&amp;gt; sth&lt;br /&gt;
|-&lt;br /&gt;
| Semantic MediaWiki 网页端清除缓存&lt;br /&gt;
| 在网页端 ?action=purge&lt;br /&gt;
&lt;br /&gt;
在 CLI 端 sduo php extensions/SemanticMediaWiki/maintenance/rebuildData.php&lt;br /&gt;
|-&lt;br /&gt;
| 调整特定页面的某个部分的字体&lt;br /&gt;
| Custom CSS 拓展可以哪里不爽改哪里，如：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
.answer p {&lt;br /&gt;
  font-size: 16px !important;&lt;br /&gt;
  color: #191b1f !important;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 命令替换，在命令中引用其他命令的结果&lt;br /&gt;
| $(command) 即用 $() 把命令括起来。或&lt;br /&gt;
&lt;br /&gt;
`command` 即用反引号把命令括起来&lt;br /&gt;
|-&lt;br /&gt;
| mediawiki 日志调试&lt;br /&gt;
| $wgShowExceptionDetails = true;&lt;br /&gt;
|-&lt;br /&gt;
| grep 用法&lt;br /&gt;
| 在目录下递归找字符串 grep -r string /dir/want&lt;br /&gt;
&lt;br /&gt;
依据后缀找关键字 grep -r &amp;quot;2025-10-01&amp;quot; --include=&amp;quot;*.beancount&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 一个 extension 不适用于当前 mediawiki 较低版本怎么办&lt;br /&gt;
| 别傻乎乎升级 mediawiki 版本，你可以在 extension 的历史记录中，按时间或 tags 找对应 mediawiki 当时的 extension 版本&lt;br /&gt;
|-&lt;br /&gt;
| 查本机图形化协议是 x11 还是 wayland 还是 Hyprland 还是 Sway&lt;br /&gt;
| echo $XDG_SESSION_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| 找源码&lt;br /&gt;
| grep -rn --include=&#039;*.c&#039; --include=&#039;*.h&#039; &#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 显示硬盘及分区&lt;br /&gt;
| lsblk&lt;br /&gt;
|-&lt;br /&gt;
| 查找 uuid&lt;br /&gt;
| sudo blkid /dev/sda&lt;br /&gt;
|-&lt;br /&gt;
| 挂载硬盘&lt;br /&gt;
| 在 /etc/fstab 中写入：UUID=xxxx-xxxx-xxxx  /mnt/data  ext4  defaults  0 2&lt;br /&gt;
|-&lt;br /&gt;
| MediaWiki 某页不要 toc 的数字序号&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 先在 MediaWiki:Common.css 设置：&lt;br /&gt;
.noautonum .tocnumber {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# 后在某页添加：&lt;br /&gt;
&amp;lt;div class=&amp;quot;noautonum&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 设置 Edit With Emacs 打开的窗口的大小&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;elisp&amp;quot;&amp;gt;&lt;br /&gt;
# 写入 early-init.el 中&lt;br /&gt;
(setq initial-frame-alist &#039;((width . 80) (height . 35)))&lt;br /&gt;
(setq default-frame-alist &#039;((top . 30) (left . 320) (width . 180) (height . 60)))&lt;br /&gt;
(setq frame-inhibit-implied-resize t)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| dd 制作安装盘&lt;br /&gt;
| sudo dd if=./EndeavourOS.iso of=/dev/sdc&lt;br /&gt;
|- &lt;br /&gt;
| ventoy 制作安装盘&lt;br /&gt;
| 把 ventoy 安装到 U 盘，再把 iso 文件复制进 U 盘&lt;br /&gt;
|-&lt;br /&gt;
| 添加 sudo 免密&lt;br /&gt;
| su root # 其实新用户没有 sudo 权&lt;br /&gt;
sudo visudo 或者&lt;br /&gt;
&lt;br /&gt;
写入 /etc/sudoer：username ALL=(ALL) NOPASSWD:ALL&lt;br /&gt;
&lt;br /&gt;
(ALL) 只设置用户权限，不管组权限。(ALL:ALL) 既设置用户权限，也设置组权限。按最小化权限原则，设置免密时使用 ALL=(ALL) &lt;br /&gt;
|-&lt;br /&gt;
| 找不到 firefox for android 安装包？&lt;br /&gt;
| https://ftp.mozilla.org/pub/fenix/releases/&lt;br /&gt;
|- &lt;br /&gt;
| 根据 sha256.txt 检测软件下载是否完整&lt;br /&gt;
| sha256sum -c --ignore-missing sha256.txt&lt;br /&gt;
|-&lt;br /&gt;
| 解决 zip 文件解压后文件名乱码&lt;br /&gt;
| unar -e GBK&lt;br /&gt;
|-&lt;br /&gt;
| emacs 中数字通配符&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;[[:digit:]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| mediawiki 上传容量改大&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 改 /etc/php/版本号/cli/php.ini&lt;br /&gt;
post_max_size = 50M&lt;br /&gt;
upload_max_filesize = 50M&lt;br /&gt;
systemctl restart apache2 &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 显示所有进程，且只显示第 12 列&lt;br /&gt;
| ps aux | awk &#039;{print $11}&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 让 apache2 中的 php 代码活起来&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;apache&amp;quot;&amp;gt;&lt;br /&gt;
# Add module for PHP 8&lt;br /&gt;
LoadModule php_module libexec/apache2/libphp.so&lt;br /&gt;
AddHandler php-script .php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 复制东西进另一个地方&lt;br /&gt;
| scp sth.zip host:~&lt;br /&gt;
|-&lt;br /&gt;
| 给当前目录下所有文件夹名字后加加一个 g 字符&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
for dir in */;&lt;br /&gt;
do&lt;br /&gt;
    if [ -d &amp;quot;$dir&amp;quot; ]; then&lt;br /&gt;
        new_dir=&amp;quot;${dir%*/}g&amp;quot;&lt;br /&gt;
        mv &amp;quot;$dir&amp;quot; &amp;quot;$new_dir&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 显示当前文件夹下所有文件、文件夹占用的磁盘容量&lt;br /&gt;
| du -h --max-depth=1&lt;br /&gt;
|-&lt;br /&gt;
| 找找 bin 在哪&lt;br /&gt;
| which phpmyadmin&lt;br /&gt;
|-&lt;br /&gt;
| 查看命令位置&lt;br /&gt;
| where sudo&lt;br /&gt;
|-&lt;br /&gt;
| 找找文件详细路径&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install plocate&lt;br /&gt;
sudo updatedb &lt;br /&gt;
locate file.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 猜猜我是谁&lt;br /&gt;
| whoami&lt;br /&gt;
|-&lt;br /&gt;
| 取出文件名&lt;br /&gt;
| find . -type f -exec basename {} \; &amp;gt; 本文件夹内所有文件名单.txt&lt;br /&gt;
|-&lt;br /&gt;
| 把视频每一秒都导一帧出来形成 png&lt;br /&gt;
| ffmpeg -i screen-20240701-081539.mp4 -vf fps=1 -q:v 2 ./test/dg_%03d.png&lt;br /&gt;
|-&lt;br /&gt;
| Excel 中无脑复制时，怎样让几十字显示时，不超过一个单元格的框框&lt;br /&gt;
| 把它旁边的框框填入一串字符如 yesterday，再把 yesterday 替换为空格。接下来在 A1 单元格填 100 字，它也不会在外观上占用了 B1 单元格，因为 B1 单元格客观上存在一个空格。&lt;br /&gt;
|-&lt;br /&gt;
| 要替换掉指定内容后的换行符&lt;br /&gt;
| 用 emacs，先写指定内容的 regexp，把它括起来当一个 regexp，再加 $。之后，替换内容中执行一个 (delete-forward-char 1) 即可。在 mini buffer 中执行函数的方式是 &amp;lt;code&amp;gt; \,(function) &amp;lt;/code&amp;gt;。&lt;br /&gt;
|-&lt;br /&gt;
| 两台 Windows 如何远程协助&lt;br /&gt;
| Windows 系统有个自带软件叫“快速助手”，英文 quick assist，两人都打开，很容易就能远程协助。&lt;br /&gt;
|-&lt;br /&gt;
| 快速删除 Windows 的服务&lt;br /&gt;
| regedit 导航至 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services，直接按名字删。无有效系统备份恢复手段的读者，不建议尝试此操作&lt;br /&gt;
|-&lt;br /&gt;
| 查看访问本机的 IP，及其所属&lt;br /&gt;
|&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat /var/log/apache2/access.log | awk &#039;{print $1}&#039; | sort | uniq -c | sort -nr | head -300 &amp;gt; success.txt&lt;br /&gt;
whois x.x.x.x&lt;br /&gt;
# awk &#039;{print $1}&#039; access.log：从access.log文件中提取每行的第一个字段（通常是IP地址）。&lt;br /&gt;
# sort：将提取的IP地址排序，为下一步的计数做准备。&lt;br /&gt;
# uniq -c：对排序后的IP地址进行计数，-c选项表示显示计数。&lt;br /&gt;
# sort -nr：再次对计数结果进行排序，-n表示按数值排序，-r表示降序。&lt;br /&gt;
# head -300：选择排序后的前300个IP地址。&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ssh 使远程机器通过 5432 端口连接到本机的 12345 端口&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
本机 ssh -R 25432:127.0.0.1:12345 tx&lt;br /&gt;
远程 export {http,https}_proxy=http://localhost:25432&lt;br /&gt;
验证 echo $https_proxy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 在 Anki 中输入平方毫米&lt;br /&gt;
| \(\text{mm}^2\)&lt;br /&gt;
|-&lt;br /&gt;
| 用 sed 删掉 apache 注释&lt;br /&gt;
| sed &#039;/^#/d&#039; apache2.conf &amp;gt; apache2.conf.nocomments 这行命令有点牛，一下把所有注释删掉了 d 表示删除行&lt;br /&gt;
&lt;br /&gt;
sed &#039;s/old/new/g&#039; file.txt &amp;gt; change.txt 把 file.txt 中的所有 old 替换为 new&lt;br /&gt;
|-&lt;br /&gt;
| 查找文件并执行命令，\; 代表命令结束符&lt;br /&gt;
| find ./images -type d -exec chmod 755 {} \;&lt;br /&gt;
|-&lt;br /&gt;
| apache 使用反代&lt;br /&gt;
| a2enmod proxy proxy_http proxy_wstunnel&lt;br /&gt;
|-&lt;br /&gt;
| 用 tail 显示 apache 错误日志的最后十行&lt;br /&gt;
| sudo tail -f /var/log/apache2/error.log&lt;br /&gt;
|-&lt;br /&gt;
| 查找数据库备份&lt;br /&gt;
| find /var/lib/automysqlbackup/&lt;br /&gt;
|-&lt;br /&gt;
| 用 Emacs 批量改名&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
C-x d 打开文件夹&lt;br /&gt;
M-x dired-do-rename-regexp 使用正则匹配改名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
C-x d 打开文件夹&lt;br /&gt;
C-x C-q 打开可编辑模式&lt;br /&gt;
M-x query-replace-regexp&lt;br /&gt;
C-c C-c 真实应用&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
二者任选其一。&lt;br /&gt;
|-&lt;br /&gt;
| 设置并检测 301 重定向是否配置成功&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 设置&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteCond %{HTTPS} off&lt;br /&gt;
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]&lt;br /&gt;
# 检测&lt;br /&gt;
curl -I http://yourdomain.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 修改主机名&lt;br /&gt;
| sudo hostnamectl set-hostname &amp;quot;new_hostname&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 修改用户名@主机名的显示色&lt;br /&gt;
| 在 .bashrc 找到 PS1 = 那行，把 \033[01;32m 绿色改成 \033[01;33m 黄色即可&lt;br /&gt;
|-&lt;br /&gt;
| 用 Emacs 复制正则结果&lt;br /&gt;
| C-u M-x occur RET regexp&lt;br /&gt;
|-&lt;br /&gt;
| MediaWiki 直接听歌&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$wgFileExtensions[] = &#039;mp3&#039;; &lt;br /&gt;
git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/MP3MediaHandler --branch REL1_XX&lt;br /&gt;
wfLoadExtension( &#039;MP3MediaHandler&#039; );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 一句话让 AI 不要在回答前序号列表的小圆点等&lt;br /&gt;
| 可以把答案放进代码框方便我复制&lt;br /&gt;
|-&lt;br /&gt;
| Linux 时光机&lt;br /&gt;
| Timeshift&lt;br /&gt;
|-&lt;br /&gt;
| 抢救硬盘&lt;br /&gt;
| r-studio&lt;br /&gt;
|-&lt;br /&gt;
| 在 toc 中，对有序号的文本，不采用 wikitext 数字序号&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot;&amp;gt;&lt;br /&gt;
{{#css:&lt;br /&gt;
.tocnumber { display: none; }&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| wsl 遭遇 DNS 污染&lt;br /&gt;
| 改一下 DNS 为 114.114.114.114&lt;br /&gt;
&lt;br /&gt;
打开虚拟化平台时，改的是虚拟网卡&lt;br /&gt;
|-&lt;br /&gt;
| 查某个软件在别的平台是什么版本&lt;br /&gt;
| https://pkgs.org/&lt;br /&gt;
|-&lt;br /&gt;
| 查看代码最近的 5 个 tag&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git tag | sort -V | tail -5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| powershell 中查 sha512&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Get-FileHash -Path &amp;quot;E:\EndeavourOS_Mercury-Neo-2025.03.19.iso&amp;quot; -Algorithm SHA512 | Format-List&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=Python_%E7%8E%AF%E5%A2%83%E7%9B%B8%E5%85%B3&amp;diff=11557</id>
		<title>Python 环境相关</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=Python_%E7%8E%AF%E5%A2%83%E7%9B%B8%E5%85%B3&amp;diff=11557"/>
		<updated>2026-07-23T16:57:43Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: Created page with &amp;quot;{| class=&amp;quot;wikitable&amp;quot; !我要干什么 !用什么 |- |给 Debian 装软件 |&amp;lt;code&amp;gt;apt&amp;lt;/code&amp;gt; |- |装一个 Python 写成的现成应用 |&amp;lt;code&amp;gt;pipx&amp;lt;/code&amp;gt; |- |给自己的 Python 项目装库 |&amp;lt;code&amp;gt;.venv&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt; |}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!我要干什么&lt;br /&gt;
!用什么&lt;br /&gt;
|-&lt;br /&gt;
|给 Debian 装软件&lt;br /&gt;
|&amp;lt;code&amp;gt;apt&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|装一个 Python 写成的现成应用&lt;br /&gt;
|&amp;lt;code&amp;gt;pipx&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|给自己的 Python 项目装库&lt;br /&gt;
|&amp;lt;code&amp;gt;.venv&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;pip&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=%E7%94%B5%E8%84%91%E4%B8%AD%E7%BA%A7%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B&amp;diff=11556</id>
		<title>电脑中级使用教程</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=%E7%94%B5%E8%84%91%E4%B8%AD%E7%BA%A7%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B&amp;diff=11556"/>
		<updated>2026-07-23T16:57:25Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: /* Other */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MediaWiki ==&lt;br /&gt;
* [[怎样迁移 MediaWiki 站点]]&lt;br /&gt;
* [[怎样为 MediaWiki 网站安装高级搜索拓展 CirrusSearch]]&lt;br /&gt;
* [[怎样安装 MediaWiki Math extension]]&lt;br /&gt;
* [[MediaWiki git 安装指南]]&lt;br /&gt;
* [[MediaWiki 怎么设置缓存]]&lt;br /&gt;
* [[怎样把 Excel 表格转换为 MediaWiki 表格]]&lt;br /&gt;
* [[为什么没放弃 Semantic MediaWiki]]&lt;br /&gt;
* [[怎么设置完整的、完善的 301 跳转]]&lt;br /&gt;
* [[删除英文标题，改为中文标题，之后怎么做 301 跳转]]&lt;br /&gt;
* [[WSL2 Debian MediaWiki 使用体验]]&lt;br /&gt;
* [[怎样使用 MediaWiki 的表格排序]]&lt;br /&gt;
* [[怎样使用 redis 作为 MediaWiki 的缓存后端]]&lt;br /&gt;
* [[MediaWiki 怎么设置各类 Debug 日志]]&lt;br /&gt;
* [[在 Semantic Mediawiki 中带有 subobject 的模板如何创建]]&lt;br /&gt;
* [[Semantic MediaWiki 中的那些符号的意思]]&lt;br /&gt;
* [[怎样保护你的 MediaWiki 站点的安全：权属建议]]&lt;br /&gt;
* [[在 Windows 10 VirtualBox 里的 MediaWiki]]&lt;br /&gt;
* [[怎样让 MediaWiki 生成完美的思维导图]]&lt;br /&gt;
* [[怎样把 MediaWiki 的 wikitext 转换为 GitHub 风格的 markdown]]&lt;br /&gt;
* [[mediawiki-el 出错始末]]&lt;br /&gt;
&lt;br /&gt;
== Emacs ==&lt;br /&gt;
* [[怎样用 Emacs 调电子书格式：格式凌乱通用解决方案]]&lt;br /&gt;
* [[Emacs 初级配置]]&lt;br /&gt;
* [[Emacs 后台自动启动-用户层面]]&lt;br /&gt;
* [[Emacs 后台自动启动-全局层面]]&lt;br /&gt;
* [[怎样在 Emacs 中编辑任意文字区域]]&lt;br /&gt;
* [[一批把法律文本的标题转换为 wikitext 层级标题的 Emacs 函数]]&lt;br /&gt;
* [[一个给内容编号的 Emacs 函数]]&lt;br /&gt;
* [[一个给法律条款文本前加两个全角空格的 Emacs 函数]]&lt;br /&gt;
* [[一个把 wikitext 转换成 markdown 的 Emacs 函数]]&lt;br /&gt;
* [[怎么使用原生 Android 版本的 Emacs]]&lt;br /&gt;
* [[Emacs 从零开始写配置]]&lt;br /&gt;
* [[Manateelazycat 的 Emacs 启动文件 site-start.el 研究]]&lt;br /&gt;
* [[Emacs 完整学习方法]]&lt;br /&gt;
* [[Emacs 字体设置的种种]]&lt;br /&gt;
* [[Git submodule 的精准用法]]&lt;br /&gt;
* [[Emacs 插件大法：几个超有用的插件]]&lt;br /&gt;
* [[两个递归子目录函数的比较]]&lt;br /&gt;
* [[建立正确的 Emacs 概念]]&lt;br /&gt;
* [[use-package 用法]]&lt;br /&gt;
* [[Emacs server 的异常的一次排查]]&lt;br /&gt;
&lt;br /&gt;
== Rime ==&lt;br /&gt;
* [[经典极简 Rime 配置]]&lt;br /&gt;
* [[在手机上从零开始配置 Rime 拼音输入法]]&lt;br /&gt;
* [[怎样使用 fcitx5-rime]]&lt;br /&gt;
&lt;br /&gt;
== Debian ==&lt;br /&gt;
* [[常用软件在 bullseye 与 bookworm 上的版本对比]]&lt;br /&gt;
* [[怎样从 Debian Bullseye 升级至 Debian Bookworm]]&lt;br /&gt;
* [[电脑必备软件名录]]&lt;br /&gt;
* [[怎样在 Debian 上安装围棋 AI Katago]]&lt;br /&gt;
* [[Debian 分区满了怎么办]]&lt;br /&gt;
* [[现在配置 SSL 证书实现 https 非常简单了]]&lt;br /&gt;
* [[Debian 换源方法]]&lt;br /&gt;
* [[在 Debian 上如何挂载一块硬盘]]&lt;br /&gt;
* [[Debian 忘记用户名怎么办]]&lt;br /&gt;
* [[Debian 服务器内存偶尔不够用怎么办]]&lt;br /&gt;
* [[在 Debian 中设置开机自动启动的方法]]&lt;br /&gt;
&lt;br /&gt;
== ArchLinux ==&lt;br /&gt;
* [[怎么使用 ArchLinux]]&lt;br /&gt;
* [[怎么在 ArchLinux 中使用 MediaWiki]]&lt;br /&gt;
* [[怎么在 VirtualBox 中使用 ArchLinux]]&lt;br /&gt;
* [[在 WSL2 中使用 ArchLinux]]&lt;br /&gt;
* [[EndeavourOS 怎么用]]&lt;br /&gt;
* [[一次恢复 ArchLinux 启动项的经历]]&lt;br /&gt;
* [[从 ArchLinux 改回 Debian 的全过程记录]]&lt;br /&gt;
&lt;br /&gt;
== WSL ==&lt;br /&gt;
* [[用 WSL 安装 Linux 发行版的方法]]&lt;br /&gt;
* [[WSLG 趣谈]]&lt;br /&gt;
* [[WSL2 proxy 的方法]]&lt;br /&gt;
* [[怎么在 Windows 上使用 Minder]]&lt;br /&gt;
&lt;br /&gt;
== TTY ==&lt;br /&gt;
* [[怎样令终端更加高效]]&lt;br /&gt;
&lt;br /&gt;
== Virtual ==&lt;br /&gt;
* [[QEMU KVM LIBVIRT 的区别]]&lt;br /&gt;
* [[VirtualBox 安装 Debian 的小 tips]]&lt;br /&gt;
* [[怎么使用 virt-manager]]&lt;br /&gt;
&lt;br /&gt;
== Defense ==&lt;br /&gt;
* [[怎样封禁恶意 ip，避免服务器产生巨额流量费]]&lt;br /&gt;
* [[iptables ipset 使用经验]]&lt;br /&gt;
* [[更智能的 iptables 封禁脚本，令服务器远离恶意攻击]]&lt;br /&gt;
* [[服务器安全防护总论]]&lt;br /&gt;
&lt;br /&gt;
== Anki ==&lt;br /&gt;
* [[怎么在不同平台下载并安装 Anki]]&lt;br /&gt;
* [[最简单的 Anki 同步教程]]&lt;br /&gt;
* [[一次 Anki 同步出问题的调试]]&lt;br /&gt;
* [[一次 Anki 登录不上的找 bug 经历]]&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
* [[程序员成长指南]]&lt;br /&gt;
* [[小代码大作用，电脑开荒代码：有哪些代码非常短但非常有用]]&lt;br /&gt;
* [[一台 apache 服务器托管多个网站的方法]]&lt;br /&gt;
* [[screen 使用指南]]&lt;br /&gt;
* [[Crontab 定时任务不按预计运行怎么办]]&lt;br /&gt;
* [[一段 ahk 脚本，自动移动光标至标签内，仅输入法中文状态下有效]]&lt;br /&gt;
* [[一段 ahk 脚本，在维基网站上自动输入模板内容]]&lt;br /&gt;
* [[读懂 diff]]&lt;br /&gt;
* [[怎样屏蔽某个网站以令自己更专注地面对生活的真实挑战]]&lt;br /&gt;
* [[XAMPP 在 Windows 上 localhost 运行缓慢的解决办法]]&lt;br /&gt;
* [[Msys pacman 用法]]&lt;br /&gt;
* [[Plausible 及 Docker 折腾指北]]&lt;br /&gt;
* [[怎么使用 beancount]]&lt;br /&gt;
* [[用 bash 脚本计算当前文件夹内所有 .docx 文件的 sha1 值]]&lt;br /&gt;
* [[Flatpak 怎么用]]&lt;br /&gt;
* [[酷比魔方刷机方法]]&lt;br /&gt;
* [[常规 Linux 软件快速安装]]&lt;br /&gt;
* [[怎么使用 python 虚拟环境 venv]]&lt;br /&gt;
* [[怎么使用 composer]]&lt;br /&gt;
* [[为什么我需要一台 VPS]]&lt;br /&gt;
* [[LibreOffice Calc 怎么改默认字号]]&lt;br /&gt;
* [[编程基础]]&lt;br /&gt;
* [[Python 学习笔记]]&lt;br /&gt;
* [[极简 git 步骤]]&lt;br /&gt;
* [[Python 环境相关]]&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=%E6%80%8E%E4%B9%88%E4%BD%BF%E7%94%A8_beancount&amp;diff=11555</id>
		<title>怎么使用 beancount</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=%E6%80%8E%E4%B9%88%E4%BD%BF%E7%94%A8_beancount&amp;diff=11555"/>
		<updated>2026-07-23T16:45:00Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: /* Debian 13 安装 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beancount 是一款简洁、可靠的财务记账软件。本文讲述如何使用它。想要财务自由的人，可以学一下。&lt;br /&gt;
&lt;br /&gt;
== Debian 12 安装 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
# 如果安装很很慢，请学会换用清华 apt 源&lt;br /&gt;
sudo apt install pipx&lt;br /&gt;
mkdir -p ~/.pip&lt;br /&gt;
echo &amp;quot;[global]&lt;br /&gt;
index-url = https://pypi.tuna.tsinghua.edu.cn/simple&amp;quot; &amp;gt; ~/.pip/pip.conf&lt;br /&gt;
pipx install beancount&lt;br /&gt;
pipx ensurepath&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
pipx install fava&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 语法检测 bean-check file.beancount&lt;br /&gt;
* 账本展示 fava file.beancount 之后根据提示，一般是在 http://127.0.0.1:5000 查看&lt;br /&gt;
&lt;br /&gt;
== Debian 13 安装 ==&lt;br /&gt;
sudo apt install beancount&lt;br /&gt;
which bean-check&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Debian&lt;br /&gt;
│&lt;br /&gt;
├── apt&lt;br /&gt;
│   │&lt;br /&gt;
│   └── Beancount&lt;br /&gt;
│       └── /usr/bin/bean-check&lt;br /&gt;
│&lt;br /&gt;
└── pipx&lt;br /&gt;
    │&lt;br /&gt;
    └── Fava 的独立 venv&lt;br /&gt;
        └── ~/.local/share/pipx/venvs/fava/&lt;br /&gt;
                 │&lt;br /&gt;
                 └── ~/.local/bin/fava&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 账本 ==&lt;br /&gt;
* 微信可导出 3 个月的 Excel 账单。每次只能导出三个月的账单，如果需要导出一年的账单，需要分四次导出？&lt;br /&gt;
* 支付宝电脑端导出的 Excel 账单无付款方式信息。支付宝 APP 端导出的账单，有付款方式信息。所以支付宝账单要用手机 APP 导出。&lt;br /&gt;
&lt;br /&gt;
== 心得 ==&lt;br /&gt;
* 一切皆账户，有出必有入。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|损&lt;br /&gt;
|益&lt;br /&gt;
|-&lt;br /&gt;
|Income&lt;br /&gt;
|Expenses&lt;br /&gt;
|-&lt;br /&gt;
| -+&lt;br /&gt;
| +-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|负债&lt;br /&gt;
|资产&lt;br /&gt;
|-&lt;br /&gt;
|Liabilities&lt;br /&gt;
|Assets&lt;br /&gt;
|-&lt;br /&gt;
| -+&lt;br /&gt;
| +-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Equity 也有增减。&lt;br /&gt;
&lt;br /&gt;
== 模范 ==&lt;br /&gt;
只要在账单表格内搞清楚了流入账户、流出账户，再用 Emacs 稍做编辑，即可。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;交易时间&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;确定性&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;交易对方&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;商品&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;流入账户&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;金额(元)&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;币种&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;流出账户&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
|2025-02-12 &lt;br /&gt;
|* &lt;br /&gt;
|&amp;quot; 李明轩 &amp;quot; &lt;br /&gt;
|&amp;quot; 转账备注:微信转账 &amp;quot; &lt;br /&gt;
|Assets:Wechat:Work:LingQian &lt;br /&gt;
|300&lt;br /&gt;
|CNY &lt;br /&gt;
|Assets:Wechat:Life:LingQian &lt;br /&gt;
|-&lt;br /&gt;
|2025-02-11 &lt;br /&gt;
|* &lt;br /&gt;
|&amp;quot; 张雅静 &amp;quot; &lt;br /&gt;
|&amp;quot; 收款方备注:二维码收款 &amp;quot; &lt;br /&gt;
|Assets:Wechat:Life:LingQian &lt;br /&gt;
|0.1&lt;br /&gt;
|CNY &lt;br /&gt;
|Assets:Wechat:Work:LingQian &lt;br /&gt;
|-&lt;br /&gt;
|2025-02-10 &lt;br /&gt;
|* &lt;br /&gt;
|&amp;quot; 王浩然 &amp;quot; &lt;br /&gt;
|&amp;quot; 转账备注:到付费 &amp;quot; &lt;br /&gt;
|Expenses:Misc:Myself &lt;br /&gt;
|19&lt;br /&gt;
|CNY &lt;br /&gt;
|Assets:Wechat:Work:LingQian &lt;br /&gt;
|-&lt;br /&gt;
|2025-02-10 &lt;br /&gt;
|* &lt;br /&gt;
|&amp;quot; 陈思琪 &amp;quot; &lt;br /&gt;
|&amp;quot; 转账备注:微信转账 &amp;quot; &lt;br /&gt;
|Assets:Wechat:Work:LingQian &lt;br /&gt;
|300&lt;br /&gt;
|CNY &lt;br /&gt;
|Assets:Wechat:Life:LingQian &lt;br /&gt;
|-&lt;br /&gt;
|2025-01-23 &lt;br /&gt;
|* &lt;br /&gt;
|&amp;quot; 刘宇航 &amp;quot; &lt;br /&gt;
|&amp;quot; 高德打车订单 &amp;quot; &lt;br /&gt;
|Expenses:Transport:Myself &lt;br /&gt;
|10.9&lt;br /&gt;
|CNY &lt;br /&gt;
|Assets:Wechat:Work:LingQian &lt;br /&gt;
|-&lt;br /&gt;
|2025-01-22 &lt;br /&gt;
|* &lt;br /&gt;
|&amp;quot; 赵婉婷 &amp;quot; &lt;br /&gt;
|&amp;quot; 转账备注:微信转账 &amp;quot; &lt;br /&gt;
|Assets:Wechat:Work:LingQian &lt;br /&gt;
|20&lt;br /&gt;
|CNY &lt;br /&gt;
|Assets:Wechat:Life:LingQian &lt;br /&gt;
|-&lt;br /&gt;
|2025-01-18 &lt;br /&gt;
|* &lt;br /&gt;
|&amp;quot; 黄子豪 &amp;quot; &lt;br /&gt;
|&amp;quot; 转账备注:微信转账 &amp;quot; &lt;br /&gt;
|Assets:Wechat:Life:LingQian &lt;br /&gt;
|121&lt;br /&gt;
|CNY &lt;br /&gt;
|Assets:Wechat:Work:LingQian &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 文件 ==&lt;br /&gt;
结构如下：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
├── accounts.beancount&lt;br /&gt;
├── balances.beancount&lt;br /&gt;
├── config.beancount&lt;br /&gt;
├── main.beancount&lt;br /&gt;
└── transactions&lt;br /&gt;
    └── 2025-10.beancount&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 账户 ==&lt;br /&gt;
分为五类：&lt;br /&gt;
# Assets 资产&lt;br /&gt;
# Liabilities 负债&lt;br /&gt;
# Equity 权益（净资产）&lt;br /&gt;
# Expenses 支出&lt;br /&gt;
# Income 收入&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=%E6%80%8E%E4%B9%88%E4%BD%BF%E7%94%A8_beancount&amp;diff=11554</id>
		<title>怎么使用 beancount</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=%E6%80%8E%E4%B9%88%E4%BD%BF%E7%94%A8_beancount&amp;diff=11554"/>
		<updated>2026-07-23T16:44:43Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: /* Debian 13 安装 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beancount 是一款简洁、可靠的财务记账软件。本文讲述如何使用它。想要财务自由的人，可以学一下。&lt;br /&gt;
&lt;br /&gt;
== Debian 12 安装 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
# 如果安装很很慢，请学会换用清华 apt 源&lt;br /&gt;
sudo apt install pipx&lt;br /&gt;
mkdir -p ~/.pip&lt;br /&gt;
echo &amp;quot;[global]&lt;br /&gt;
index-url = https://pypi.tuna.tsinghua.edu.cn/simple&amp;quot; &amp;gt; ~/.pip/pip.conf&lt;br /&gt;
pipx install beancount&lt;br /&gt;
pipx ensurepath&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
pipx install fava&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 语法检测 bean-check file.beancount&lt;br /&gt;
* 账本展示 fava file.beancount 之后根据提示，一般是在 http://127.0.0.1:5000 查看&lt;br /&gt;
&lt;br /&gt;
== Debian 13 安装 ==&lt;br /&gt;
sudo apt install beancount&lt;br /&gt;
which bean-check&lt;br /&gt;
&lt;br /&gt;
Debian&lt;br /&gt;
│&lt;br /&gt;
├── apt&lt;br /&gt;
│   │&lt;br /&gt;
│   └── Beancount&lt;br /&gt;
│       └── /usr/bin/bean-check&lt;br /&gt;
│&lt;br /&gt;
└── pipx&lt;br /&gt;
    │&lt;br /&gt;
    └── Fava 的独立 venv&lt;br /&gt;
        └── ~/.local/share/pipx/venvs/fava/&lt;br /&gt;
                 │&lt;br /&gt;
                 └── ~/.local/bin/fava&lt;br /&gt;
&lt;br /&gt;
== 账本 ==&lt;br /&gt;
* 微信可导出 3 个月的 Excel 账单。每次只能导出三个月的账单，如果需要导出一年的账单，需要分四次导出？&lt;br /&gt;
* 支付宝电脑端导出的 Excel 账单无付款方式信息。支付宝 APP 端导出的账单，有付款方式信息。所以支付宝账单要用手机 APP 导出。&lt;br /&gt;
&lt;br /&gt;
== 心得 ==&lt;br /&gt;
* 一切皆账户，有出必有入。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|损&lt;br /&gt;
|益&lt;br /&gt;
|-&lt;br /&gt;
|Income&lt;br /&gt;
|Expenses&lt;br /&gt;
|-&lt;br /&gt;
| -+&lt;br /&gt;
| +-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|负债&lt;br /&gt;
|资产&lt;br /&gt;
|-&lt;br /&gt;
|Liabilities&lt;br /&gt;
|Assets&lt;br /&gt;
|-&lt;br /&gt;
| -+&lt;br /&gt;
| +-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Equity 也有增减。&lt;br /&gt;
&lt;br /&gt;
== 模范 ==&lt;br /&gt;
只要在账单表格内搞清楚了流入账户、流出账户，再用 Emacs 稍做编辑，即可。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;交易时间&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;确定性&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;交易对方&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;商品&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;流入账户&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;金额(元)&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;币种&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;流出账户&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
|2025-02-12 &lt;br /&gt;
|* &lt;br /&gt;
|&amp;quot; 李明轩 &amp;quot; &lt;br /&gt;
|&amp;quot; 转账备注:微信转账 &amp;quot; &lt;br /&gt;
|Assets:Wechat:Work:LingQian &lt;br /&gt;
|300&lt;br /&gt;
|CNY &lt;br /&gt;
|Assets:Wechat:Life:LingQian &lt;br /&gt;
|-&lt;br /&gt;
|2025-02-11 &lt;br /&gt;
|* &lt;br /&gt;
|&amp;quot; 张雅静 &amp;quot; &lt;br /&gt;
|&amp;quot; 收款方备注:二维码收款 &amp;quot; &lt;br /&gt;
|Assets:Wechat:Life:LingQian &lt;br /&gt;
|0.1&lt;br /&gt;
|CNY &lt;br /&gt;
|Assets:Wechat:Work:LingQian &lt;br /&gt;
|-&lt;br /&gt;
|2025-02-10 &lt;br /&gt;
|* &lt;br /&gt;
|&amp;quot; 王浩然 &amp;quot; &lt;br /&gt;
|&amp;quot; 转账备注:到付费 &amp;quot; &lt;br /&gt;
|Expenses:Misc:Myself &lt;br /&gt;
|19&lt;br /&gt;
|CNY &lt;br /&gt;
|Assets:Wechat:Work:LingQian &lt;br /&gt;
|-&lt;br /&gt;
|2025-02-10 &lt;br /&gt;
|* &lt;br /&gt;
|&amp;quot; 陈思琪 &amp;quot; &lt;br /&gt;
|&amp;quot; 转账备注:微信转账 &amp;quot; &lt;br /&gt;
|Assets:Wechat:Work:LingQian &lt;br /&gt;
|300&lt;br /&gt;
|CNY &lt;br /&gt;
|Assets:Wechat:Life:LingQian &lt;br /&gt;
|-&lt;br /&gt;
|2025-01-23 &lt;br /&gt;
|* &lt;br /&gt;
|&amp;quot; 刘宇航 &amp;quot; &lt;br /&gt;
|&amp;quot; 高德打车订单 &amp;quot; &lt;br /&gt;
|Expenses:Transport:Myself &lt;br /&gt;
|10.9&lt;br /&gt;
|CNY &lt;br /&gt;
|Assets:Wechat:Work:LingQian &lt;br /&gt;
|-&lt;br /&gt;
|2025-01-22 &lt;br /&gt;
|* &lt;br /&gt;
|&amp;quot; 赵婉婷 &amp;quot; &lt;br /&gt;
|&amp;quot; 转账备注:微信转账 &amp;quot; &lt;br /&gt;
|Assets:Wechat:Work:LingQian &lt;br /&gt;
|20&lt;br /&gt;
|CNY &lt;br /&gt;
|Assets:Wechat:Life:LingQian &lt;br /&gt;
|-&lt;br /&gt;
|2025-01-18 &lt;br /&gt;
|* &lt;br /&gt;
|&amp;quot; 黄子豪 &amp;quot; &lt;br /&gt;
|&amp;quot; 转账备注:微信转账 &amp;quot; &lt;br /&gt;
|Assets:Wechat:Life:LingQian &lt;br /&gt;
|121&lt;br /&gt;
|CNY &lt;br /&gt;
|Assets:Wechat:Work:LingQian &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 文件 ==&lt;br /&gt;
结构如下：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
├── accounts.beancount&lt;br /&gt;
├── balances.beancount&lt;br /&gt;
├── config.beancount&lt;br /&gt;
├── main.beancount&lt;br /&gt;
└── transactions&lt;br /&gt;
    └── 2025-10.beancount&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 账户 ==&lt;br /&gt;
分为五类：&lt;br /&gt;
# Assets 资产&lt;br /&gt;
# Liabilities 负债&lt;br /&gt;
# Equity 权益（净资产）&lt;br /&gt;
# Expenses 支出&lt;br /&gt;
# Income 收入&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=%E5%AE%8C%E7%BE%8E%E6%97%A5%E7%94%A8%E5%B0%8F%E5%91%BD%E4%BB%A4&amp;diff=11553</id>
		<title>完美日用小命令</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=%E5%AE%8C%E7%BE%8E%E6%97%A5%E7%94%A8%E5%B0%8F%E5%91%BD%E4%BB%A4&amp;diff=11553"/>
		<updated>2026-07-23T16:28:23Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 目标或作用&lt;br /&gt;
! 对应方法&lt;br /&gt;
|-&lt;br /&gt;
|Emacs 里到底哪个配置偷偷执行了这个函数&lt;br /&gt;
|(debug-on-entry &#039;那个函数)&lt;br /&gt;
|-&lt;br /&gt;
|查某个软件到底安装了些什么&lt;br /&gt;
|dpkg -L beancount | grep /usr/bin&lt;br /&gt;
|-&lt;br /&gt;
|elisp 求值&lt;br /&gt;
|*scratch* 里试验：C-j（eval-print-last-sexp）&lt;br /&gt;
&lt;br /&gt;
.el 文件里现场执行：C-x C-e（eval-last-sexp）&lt;br /&gt;
|-&lt;br /&gt;
|git 极简指南&lt;br /&gt;
|&lt;br /&gt;
本地出生：目录 → git init → .gitignore → add → commit → remote → push&lt;br /&gt;
&lt;br /&gt;
远程出生：GitHub 仓库 → git clone → 修改 → add → commit → push&lt;br /&gt;
|-&lt;br /&gt;
|Emacs 里误删 projects 标记文件&lt;br /&gt;
|打开项目内文件，再运行一次 project-find-file 命令，Emacs 就会重新记住项目&lt;br /&gt;
|-&lt;br /&gt;
|git 文件模式的含义&lt;br /&gt;
|100644 普通文件&lt;br /&gt;
&lt;br /&gt;
100755 可执行文件&lt;br /&gt;
&lt;br /&gt;
160000 Git submodule 的 `gitlink`&lt;br /&gt;
|-&lt;br /&gt;
|打印文件不想手动分份&lt;br /&gt;
|逐份打印，或称自动分页&lt;br /&gt;
[[File:逐份打印.png|400px]][[File:不逐份打印.png|400px]]&lt;br /&gt;
|-&lt;br /&gt;
|svg 字符丢失&lt;br /&gt;
|grep font-family sth.svg 可以查看该 svg 用了什么字体，再在服务器安装该字体，即可&lt;br /&gt;
|-&lt;br /&gt;
| emacs 乱码三部曲&lt;br /&gt;
|&lt;br /&gt;
* 辨别：[http://www.mytju.com/classCode/tools/messyCodeRecover.asp 乱码恢复]&lt;br /&gt;
* 重置：revert-buffer-with-coding-system&lt;br /&gt;
* 另存：set-buffer-file-coding-system&lt;br /&gt;
|-&lt;br /&gt;
| 用关键字查找文件&lt;br /&gt;
| 把这段放入 .bashrc&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
f(){&lt;br /&gt;
    find . -iname &amp;quot;*$1*&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 删除注释，只看已设置的配置。“说人话”&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ren() { sed &#039;/^#/d&#039; &amp;quot;$1&amp;quot; &amp;gt; &amp;quot;ren.$1&amp;quot;; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| Debian 怎么高效截屏&lt;br /&gt;
| 打开 Keyboard → Application Shortcuts，把原来绑定 Print 的命令替换为 flameshot gui&lt;br /&gt;
|-&lt;br /&gt;
| 把命令行提示符改为青色&lt;br /&gt;
| 以下行放入 ~/.bashrc&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
PS1=&#039;\[\033[0;36m\]\u@\h:\w\$ \[\033[00m\]&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 修改文件前先创建备份&lt;br /&gt;
| 建一个 bak 函数：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
bak() { cp -a -- &amp;quot;$1&amp;quot; &amp;quot;$1&amp;quot;.bak.$(date +%Y%m%d%H%M%S); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 查某部门的电话&lt;br /&gt;
| 官网如果查不到，问 114 或有奇效&lt;br /&gt;
|-&lt;br /&gt;
| excel 中给 A1 单元格前后加东西&lt;br /&gt;
| 用 &amp;quot;&amp;quot; 和 &amp;amp;。如 &amp;lt;nowiki&amp;gt;&amp;quot;[[&amp;quot; &amp;amp; A1 &amp;amp; &amp;quot;]]&amp;quot;&amp;lt;/nowiki&amp;gt; 表示在 A1 的内容前后加 &amp;lt;nowiki&amp;gt;[[ 和 ]]&amp;lt;/nowiki&amp;gt;。即小猫，变成 &amp;lt;nowiki&amp;gt;[[小猫]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| mediawiki 批量上传图片&lt;br /&gt;
| php maintenance/run.php importImages ~/sth --comment=&amp;quot;批量导入，新年快乐&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 设置 Debian 电脑时区&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看当前时区与时间状态&lt;br /&gt;
sudo timedatectl status&lt;br /&gt;
# 把时区设为 Asia/Shanghai（UTC+8）&lt;br /&gt;
sudo timedatectl set-timezone Asia/Shanghai&lt;br /&gt;
# 再次确认&lt;br /&gt;
timedatectl status&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 剪映裁切视频&lt;br /&gt;
| 轨道上方的工具栏明晃晃就有个裁剪图标，点它就行&lt;br /&gt;
|-&lt;br /&gt;
| OBS 只采集窗口的一部分&lt;br /&gt;
| 按住 Alt 再推动就行&lt;br /&gt;
|-&lt;br /&gt;
| 打开某个网站，一片乱码&lt;br /&gt;
| 试试按 Alt 键，在出现的菜单栏上，View 有个功能：Repair Text Encoding&lt;br /&gt;
|-&lt;br /&gt;
| base64 解码&lt;br /&gt;
| &amp;lt;code&amp;gt;echo &amp;quot;aHR0cHM6Ly9jbGF1ZGVjb2RlOC5jb20vdjJleDA0&amp;quot; | base64 -d&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 下载 m3u8 视频&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
首先在浏览器安装 cat-catch&lt;br /&gt;
其次在电脑里安装 yt-dlp&lt;br /&gt;
最后在终端里 yt-dlp -o sth.mp4 &amp;quot;url&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Yt-dlp 生效状态.png|300px]]&lt;br /&gt;
|-&lt;br /&gt;
| 查找符合条件的文件后替换&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
find . -type f -name &amp;quot;*.beancount&amp;quot; -exec sed &#039;s/2025-10-01/2024-04-06/g&#039; {} +&lt;br /&gt;
&lt;br /&gt;
find . → 从当前目录开始查找&lt;br /&gt;
-type f → 只查找文件&lt;br /&gt;
-name &amp;quot;*.beancount&amp;quot; → 只匹配后缀为 .beancount 的文件&lt;br /&gt;
-exec ... {} + → 对每个匹配的文件执行后面的命令&lt;br /&gt;
sed -i &#039;s/2025-10-01/2024-04-06/g&#039; →&lt;br /&gt;
-i 表示直接修改文件&lt;br /&gt;
&#039;s/旧/新/g&#039; 表示全局替换&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 找到所有文章&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
curl -s &amp;quot;https://somesite.com/api.php?action=query&amp;amp;format=json&amp;amp;generator=allpages&amp;amp;gapnamespace=0&amp;amp;gaplimit=max&amp;amp;prop=info&amp;amp;inprop=url&amp;quot; | jq .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| emacs 中按行号加序号&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;elisp&amp;quot;&amp;gt;&lt;br /&gt;
M-x replace-regexp RET ^ RET \,(1+ \#). RET&lt;br /&gt;
# ^ → 匹配行首&lt;br /&gt;
# \, → 计算 Lisp 表达式&lt;br /&gt;
# \# → 当前行号&lt;br /&gt;
# 1+ \# → 每行号加 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
整体作用 → 给每行自动生成递增编号&lt;br /&gt;
|-&lt;br /&gt;
| emacs 中插入两个全角空格&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
insert-char 3000 #或者&lt;br /&gt;
&lt;br /&gt;
(global-set-key (kbd &amp;quot;C-c s&amp;quot;)&lt;br /&gt;
		(lambda () (interactive) (insert-char #x3000 2)))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 解决 ssh 断联问题&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 本地 ~/.ssh/config&lt;br /&gt;
Host *&lt;br /&gt;
    ServerAliveInterval 60&lt;br /&gt;
    ServerAliveCountMax 3&lt;br /&gt;
&lt;br /&gt;
# 远程 /etc/ssh/sshd_config&lt;br /&gt;
ClientAliveInterval 60&lt;br /&gt;
ClientAliveCountMax 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 隐藏 MediaWiki 侧边栏&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
/* 隐藏侧边栏 */&lt;br /&gt;
#mw-panel {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* 扩展正文到全屏 */&lt;br /&gt;
#content {&lt;br /&gt;
    margin-left: 0 !important;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| wikitable 中有的想排序有的不想排序&lt;br /&gt;
| 总表 class=&amp;quot;wikitable sortable&amp;quot;，在不想排序的表头设置 class=&amp;quot;unsortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| wikitable 单元格内换行后感觉有点远&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
style=&amp;quot;line-height:1.01;&amp;quot;&lt;br /&gt;
# 这样设置后，单元格里的内容呈块状，亲疏更加令人舒服&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Excel 单元格内换行&lt;br /&gt;
| 替换框里用 Ctrl J 能实现&lt;br /&gt;
|-&lt;br /&gt;
| github 提速方法一则&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# ssh over https&lt;br /&gt;
Host github.com&lt;br /&gt;
HostName ssh.github.com # 默认 ssh，不通过 https&lt;br /&gt;
Port 443&lt;br /&gt;
User git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| github 提速方法一则&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 放 ~/.ssh/config 里&lt;br /&gt;
Host github.com&lt;br /&gt;
  User git&lt;br /&gt;
  HostName github.com&lt;br /&gt;
  ProxyJump proxyserver&lt;br /&gt;
  &lt;br /&gt;
Host proxyserver&lt;br /&gt;
  User root&lt;br /&gt;
  HostName your_server_ip&lt;br /&gt;
  IdentityFile xxx&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 无 GUI 的 Linux 里 less 妙用&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
alias s=&amp;quot;ls -alh --color=auto | less&amp;quot;&lt;br /&gt;
Space 向下翻页&lt;br /&gt;
b 向上翻页&lt;br /&gt;
↑ / ↓ 单行滚动&lt;br /&gt;
q 退出&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 不想上的网课怎么办&lt;br /&gt;
| 去 greasyforks 搜该网课的域名&lt;br /&gt;
|-&lt;br /&gt;
| 怎样在 Emacs query-replace-regex 里使用“或”语义&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;\|&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 怎样让文件总是提示“建议只读”模式打开&lt;br /&gt;
| “保存”时，保存左边有个“工具” - “常规选项” - “建议只读”&lt;br /&gt;
|-&lt;br /&gt;
| mediawiki gd 不支持 webp&lt;br /&gt;
| sudo apt install imagemagick libwebp-dev，再在 LocalSettings.php 里打开 convert&lt;br /&gt;
|-&lt;br /&gt;
| Emacs 密钥过期无法更新 package 时应该怎么做&lt;br /&gt;
| 手动到 [https://elpa.gnu.org/packages/gnu-elpa-keyring-update.html GNU ELPA - gnu-elpa-keyring-update] 下载 gnu-elpa-keyring-update&lt;br /&gt;
在 Emacs 里打开这个 tar 文件，执行 package-install-from-buffer&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 音频转文字&lt;br /&gt;
| &amp;lt;code&amp;gt;whisper ~/S01E01.aac --model turbo -f srt --output_dir ~/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
model: tiny, base, small, medium, large, 或 turbo&lt;br /&gt;
f: format. txt, srt, vtt 等&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 视频提取音频&lt;br /&gt;
| &amp;lt;code&amp;gt;ffmpeg -i ~/S01E01.mp4 -vn -acodec copy ~/S01E01.aac&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i: input&lt;br /&gt;
vn: vedio none 不要视频&lt;br /&gt;
acoder copy: audio copy 直接复制音轨&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 表格中的第一个 # 号不解析&lt;br /&gt;
| #&lt;br /&gt;
# 天空&lt;br /&gt;
# 大地&lt;br /&gt;
# 人间&lt;br /&gt;
# 湖水&lt;br /&gt;
即在左上角先放一个 # 号&lt;br /&gt;
|-&lt;br /&gt;
| Semantic MediaWiki 日期标准化&lt;br /&gt;
| ?开庭日期#ISO&lt;br /&gt;
|-&lt;br /&gt;
| pubkey 不方便往服务器上粘&lt;br /&gt;
| 用 echo &amp;quot;Ctrl V&amp;quot; &amp;gt;&amp;gt; sth&lt;br /&gt;
|-&lt;br /&gt;
| Semantic MediaWiki 网页端清除缓存&lt;br /&gt;
| 在网页端 ?action=purge&lt;br /&gt;
&lt;br /&gt;
在 CLI 端 sduo php extensions/SemanticMediaWiki/maintenance/rebuildData.php&lt;br /&gt;
|-&lt;br /&gt;
| 调整特定页面的某个部分的字体&lt;br /&gt;
| Custom CSS 拓展可以哪里不爽改哪里，如：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
.answer p {&lt;br /&gt;
  font-size: 16px !important;&lt;br /&gt;
  color: #191b1f !important;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 命令替换，在命令中引用其他命令的结果&lt;br /&gt;
| $(command) 即用 $() 把命令括起来。或&lt;br /&gt;
&lt;br /&gt;
`command` 即用反引号把命令括起来&lt;br /&gt;
|-&lt;br /&gt;
| mediawiki 日志调试&lt;br /&gt;
| $wgShowExceptionDetails = true;&lt;br /&gt;
|-&lt;br /&gt;
| grep 用法&lt;br /&gt;
| 在目录下递归找字符串 grep -r string /dir/want&lt;br /&gt;
&lt;br /&gt;
依据后缀找关键字 grep -r &amp;quot;2025-10-01&amp;quot; --include=&amp;quot;*.beancount&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 一个 extension 不适用于当前 mediawiki 较低版本怎么办&lt;br /&gt;
| 别傻乎乎升级 mediawiki 版本，你可以在 extension 的历史记录中，按时间或 tags 找对应 mediawiki 当时的 extension 版本&lt;br /&gt;
|-&lt;br /&gt;
| 查本机图形化协议是 x11 还是 wayland 还是 Hyprland 还是 Sway&lt;br /&gt;
| echo $XDG_SESSION_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| 找源码&lt;br /&gt;
| grep -rn --include=&#039;*.c&#039; --include=&#039;*.h&#039; &#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 显示硬盘及分区&lt;br /&gt;
| lsblk&lt;br /&gt;
|-&lt;br /&gt;
| 查找 uuid&lt;br /&gt;
| sudo blkid /dev/sda&lt;br /&gt;
|-&lt;br /&gt;
| 挂载硬盘&lt;br /&gt;
| 在 /etc/fstab 中写入：UUID=xxxx-xxxx-xxxx  /mnt/data  ext4  defaults  0 2&lt;br /&gt;
|-&lt;br /&gt;
| MediaWiki 某页不要 toc 的数字序号&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 先在 MediaWiki:Common.css 设置：&lt;br /&gt;
.noautonum .tocnumber {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# 后在某页添加：&lt;br /&gt;
&amp;lt;div class=&amp;quot;noautonum&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 设置 Edit With Emacs 打开的窗口的大小&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;elisp&amp;quot;&amp;gt;&lt;br /&gt;
# 写入 early-init.el 中&lt;br /&gt;
(setq initial-frame-alist &#039;((width . 80) (height . 35)))&lt;br /&gt;
(setq default-frame-alist &#039;((top . 30) (left . 320) (width . 180) (height . 60)))&lt;br /&gt;
(setq frame-inhibit-implied-resize t)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| dd 制作安装盘&lt;br /&gt;
| sudo dd if=./EndeavourOS.iso of=/dev/sdc&lt;br /&gt;
|- &lt;br /&gt;
| ventoy 制作安装盘&lt;br /&gt;
| 把 ventoy 安装到 U 盘，再把 iso 文件复制进 U 盘&lt;br /&gt;
|-&lt;br /&gt;
| 添加 sudo 免密&lt;br /&gt;
| su root # 其实新用户没有 sudo 权&lt;br /&gt;
sudo visudo 或者&lt;br /&gt;
&lt;br /&gt;
写入 /etc/sudoer：username ALL=(ALL) NOPASSWD:ALL&lt;br /&gt;
&lt;br /&gt;
(ALL) 只设置用户权限，不管组权限。(ALL:ALL) 既设置用户权限，也设置组权限。按最小化权限原则，设置免密时使用 ALL=(ALL) &lt;br /&gt;
|-&lt;br /&gt;
| 找不到 firefox for android 安装包？&lt;br /&gt;
| https://ftp.mozilla.org/pub/fenix/releases/&lt;br /&gt;
|- &lt;br /&gt;
| 根据 sha256.txt 检测软件下载是否完整&lt;br /&gt;
| sha256sum -c --ignore-missing sha256.txt&lt;br /&gt;
|-&lt;br /&gt;
| 解决 zip 文件解压后文件名乱码&lt;br /&gt;
| unar -e GBK&lt;br /&gt;
|-&lt;br /&gt;
| emacs 中数字通配符&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;[[:digit:]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| mediawiki 上传容量改大&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 改 /etc/php/版本号/cli/php.ini&lt;br /&gt;
post_max_size = 50M&lt;br /&gt;
upload_max_filesize = 50M&lt;br /&gt;
systemctl restart apache2 &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 显示所有进程，且只显示第 12 列&lt;br /&gt;
| ps aux | awk &#039;{print $11}&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 让 apache2 中的 php 代码活起来&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;apache&amp;quot;&amp;gt;&lt;br /&gt;
# Add module for PHP 8&lt;br /&gt;
LoadModule php_module libexec/apache2/libphp.so&lt;br /&gt;
AddHandler php-script .php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 复制东西进另一个地方&lt;br /&gt;
| scp sth.zip host:~&lt;br /&gt;
|-&lt;br /&gt;
| 给当前目录下所有文件夹名字后加加一个 g 字符&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
for dir in */;&lt;br /&gt;
do&lt;br /&gt;
    if [ -d &amp;quot;$dir&amp;quot; ]; then&lt;br /&gt;
        new_dir=&amp;quot;${dir%*/}g&amp;quot;&lt;br /&gt;
        mv &amp;quot;$dir&amp;quot; &amp;quot;$new_dir&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 显示当前文件夹下所有文件、文件夹占用的磁盘容量&lt;br /&gt;
| du -h --max-depth=1&lt;br /&gt;
|-&lt;br /&gt;
| 找找 bin 在哪&lt;br /&gt;
| which phpmyadmin&lt;br /&gt;
|-&lt;br /&gt;
| 查看命令位置&lt;br /&gt;
| where sudo&lt;br /&gt;
|-&lt;br /&gt;
| 找找文件详细路径&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install plocate&lt;br /&gt;
sudo updatedb &lt;br /&gt;
locate file.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 猜猜我是谁&lt;br /&gt;
| whoami&lt;br /&gt;
|-&lt;br /&gt;
| 取出文件名&lt;br /&gt;
| find . -type f -exec basename {} \; &amp;gt; 本文件夹内所有文件名单.txt&lt;br /&gt;
|-&lt;br /&gt;
| 把视频每一秒都导一帧出来形成 png&lt;br /&gt;
| ffmpeg -i screen-20240701-081539.mp4 -vf fps=1 -q:v 2 ./test/dg_%03d.png&lt;br /&gt;
|-&lt;br /&gt;
| Excel 中无脑复制时，怎样让几十字显示时，不超过一个单元格的框框&lt;br /&gt;
| 把它旁边的框框填入一串字符如 yesterday，再把 yesterday 替换为空格。接下来在 A1 单元格填 100 字，它也不会在外观上占用了 B1 单元格，因为 B1 单元格客观上存在一个空格。&lt;br /&gt;
|-&lt;br /&gt;
| 要替换掉指定内容后的换行符&lt;br /&gt;
| 用 emacs，先写指定内容的 regexp，把它括起来当一个 regexp，再加 $。之后，替换内容中执行一个 (delete-forward-char 1) 即可。在 mini buffer 中执行函数的方式是 &amp;lt;code&amp;gt; \,(function) &amp;lt;/code&amp;gt;。&lt;br /&gt;
|-&lt;br /&gt;
| 两台 Windows 如何远程协助&lt;br /&gt;
| Windows 系统有个自带软件叫“快速助手”，英文 quick assist，两人都打开，很容易就能远程协助。&lt;br /&gt;
|-&lt;br /&gt;
| 快速删除 Windows 的服务&lt;br /&gt;
| regedit 导航至 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services，直接按名字删。无有效系统备份恢复手段的读者，不建议尝试此操作&lt;br /&gt;
|-&lt;br /&gt;
| 查看访问本机的 IP，及其所属&lt;br /&gt;
|&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat /var/log/apache2/access.log | awk &#039;{print $1}&#039; | sort | uniq -c | sort -nr | head -300 &amp;gt; success.txt&lt;br /&gt;
whois x.x.x.x&lt;br /&gt;
# awk &#039;{print $1}&#039; access.log：从access.log文件中提取每行的第一个字段（通常是IP地址）。&lt;br /&gt;
# sort：将提取的IP地址排序，为下一步的计数做准备。&lt;br /&gt;
# uniq -c：对排序后的IP地址进行计数，-c选项表示显示计数。&lt;br /&gt;
# sort -nr：再次对计数结果进行排序，-n表示按数值排序，-r表示降序。&lt;br /&gt;
# head -300：选择排序后的前300个IP地址。&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ssh 使远程机器通过 5432 端口连接到本机的 12345 端口&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
本机 ssh -R 25432:127.0.0.1:12345 tx&lt;br /&gt;
远程 export {http,https}_proxy=http://localhost:25432&lt;br /&gt;
验证 echo $https_proxy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 在 Anki 中输入平方毫米&lt;br /&gt;
| \(\text{mm}^2\)&lt;br /&gt;
|-&lt;br /&gt;
| 用 sed 删掉 apache 注释&lt;br /&gt;
| sed &#039;/^#/d&#039; apache2.conf &amp;gt; apache2.conf.nocomments 这行命令有点牛，一下把所有注释删掉了 d 表示删除行&lt;br /&gt;
&lt;br /&gt;
sed &#039;s/old/new/g&#039; file.txt &amp;gt; change.txt 把 file.txt 中的所有 old 替换为 new&lt;br /&gt;
|-&lt;br /&gt;
| 查找文件并执行命令，\; 代表命令结束符&lt;br /&gt;
| find ./images -type d -exec chmod 755 {} \;&lt;br /&gt;
|-&lt;br /&gt;
| apache 使用反代&lt;br /&gt;
| a2enmod proxy proxy_http proxy_wstunnel&lt;br /&gt;
|-&lt;br /&gt;
| 用 tail 显示 apache 错误日志的最后十行&lt;br /&gt;
| sudo tail -f /var/log/apache2/error.log&lt;br /&gt;
|-&lt;br /&gt;
| 查找数据库备份&lt;br /&gt;
| find /var/lib/automysqlbackup/&lt;br /&gt;
|-&lt;br /&gt;
| 用 Emacs 批量改名&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
C-x d 打开文件夹&lt;br /&gt;
M-x dired-do-rename-regexp 使用正则匹配改名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
C-x d 打开文件夹&lt;br /&gt;
C-x C-q 打开可编辑模式&lt;br /&gt;
M-x query-replace-regexp&lt;br /&gt;
C-c C-c 真实应用&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
二者任选其一。&lt;br /&gt;
|-&lt;br /&gt;
| 设置并检测 301 重定向是否配置成功&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 设置&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteCond %{HTTPS} off&lt;br /&gt;
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]&lt;br /&gt;
# 检测&lt;br /&gt;
curl -I http://yourdomain.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 修改主机名&lt;br /&gt;
| sudo hostnamectl set-hostname &amp;quot;new_hostname&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 修改用户名@主机名的显示色&lt;br /&gt;
| 在 .bashrc 找到 PS1 = 那行，把 \033[01;32m 绿色改成 \033[01;33m 黄色即可&lt;br /&gt;
|-&lt;br /&gt;
| 用 Emacs 复制正则结果&lt;br /&gt;
| C-u M-x occur RET regexp&lt;br /&gt;
|-&lt;br /&gt;
| MediaWiki 直接听歌&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$wgFileExtensions[] = &#039;mp3&#039;; &lt;br /&gt;
git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/MP3MediaHandler --branch REL1_XX&lt;br /&gt;
wfLoadExtension( &#039;MP3MediaHandler&#039; );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 一句话让 AI 不要在回答前序号列表的小圆点等&lt;br /&gt;
| 可以把答案放进代码框方便我复制&lt;br /&gt;
|-&lt;br /&gt;
| Linux 时光机&lt;br /&gt;
| Timeshift&lt;br /&gt;
|-&lt;br /&gt;
| 抢救硬盘&lt;br /&gt;
| r-studio&lt;br /&gt;
|-&lt;br /&gt;
| 在 toc 中，对有序号的文本，不采用 wikitext 数字序号&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot;&amp;gt;&lt;br /&gt;
{{#css:&lt;br /&gt;
.tocnumber { display: none; }&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| wsl 遭遇 DNS 污染&lt;br /&gt;
| 改一下 DNS 为 114.114.114.114&lt;br /&gt;
&lt;br /&gt;
打开虚拟化平台时，改的是虚拟网卡&lt;br /&gt;
|-&lt;br /&gt;
| 查某个软件在别的平台是什么版本&lt;br /&gt;
| https://pkgs.org/&lt;br /&gt;
|-&lt;br /&gt;
| 查看代码最近的 5 个 tag&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git tag | sort -V | tail -5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| powershell 中查 sha512&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Get-FileHash -Path &amp;quot;E:\EndeavourOS_Mercury-Neo-2025.03.19.iso&amp;quot; -Algorithm SHA512 | Format-List&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=%E6%80%8E%E4%B9%88%E4%BD%BF%E7%94%A8_beancount&amp;diff=11552</id>
		<title>怎么使用 beancount</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=%E6%80%8E%E4%B9%88%E4%BD%BF%E7%94%A8_beancount&amp;diff=11552"/>
		<updated>2026-07-23T15:57:54Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: /* Debian 13 安装 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beancount 是一款简洁、可靠的财务记账软件。本文讲述如何使用它。想要财务自由的人，可以学一下。&lt;br /&gt;
&lt;br /&gt;
== Debian 12 安装 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
# 如果安装很很慢，请学会换用清华 apt 源&lt;br /&gt;
sudo apt install pipx&lt;br /&gt;
mkdir -p ~/.pip&lt;br /&gt;
echo &amp;quot;[global]&lt;br /&gt;
index-url = https://pypi.tuna.tsinghua.edu.cn/simple&amp;quot; &amp;gt; ~/.pip/pip.conf&lt;br /&gt;
pipx install beancount&lt;br /&gt;
pipx ensurepath&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
pipx install fava&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 语法检测 bean-check file.beancount&lt;br /&gt;
* 账本展示 fava file.beancount 之后根据提示，一般是在 http://127.0.0.1:5000 查看&lt;br /&gt;
&lt;br /&gt;
== Debian 13 安装 ==&lt;br /&gt;
sudo apt install beancount&lt;br /&gt;
which bean-check&lt;br /&gt;
&lt;br /&gt;
== 账本 ==&lt;br /&gt;
* 微信可导出 3 个月的 Excel 账单。每次只能导出三个月的账单，如果需要导出一年的账单，需要分四次导出？&lt;br /&gt;
* 支付宝电脑端导出的 Excel 账单无付款方式信息。支付宝 APP 端导出的账单，有付款方式信息。所以支付宝账单要用手机 APP 导出。&lt;br /&gt;
&lt;br /&gt;
== 心得 ==&lt;br /&gt;
* 一切皆账户，有出必有入。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|损&lt;br /&gt;
|益&lt;br /&gt;
|-&lt;br /&gt;
|Income&lt;br /&gt;
|Expenses&lt;br /&gt;
|-&lt;br /&gt;
| -+&lt;br /&gt;
| +-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|负债&lt;br /&gt;
|资产&lt;br /&gt;
|-&lt;br /&gt;
|Liabilities&lt;br /&gt;
|Assets&lt;br /&gt;
|-&lt;br /&gt;
| -+&lt;br /&gt;
| +-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Equity 也有增减。&lt;br /&gt;
&lt;br /&gt;
== 模范 ==&lt;br /&gt;
只要在账单表格内搞清楚了流入账户、流出账户，再用 Emacs 稍做编辑，即可。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;交易时间&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;确定性&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;交易对方&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;商品&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;流入账户&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;金额(元)&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;币种&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;流出账户&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
|2025-02-12 &lt;br /&gt;
|* &lt;br /&gt;
|&amp;quot; 李明轩 &amp;quot; &lt;br /&gt;
|&amp;quot; 转账备注:微信转账 &amp;quot; &lt;br /&gt;
|Assets:Wechat:Work:LingQian &lt;br /&gt;
|300&lt;br /&gt;
|CNY &lt;br /&gt;
|Assets:Wechat:Life:LingQian &lt;br /&gt;
|-&lt;br /&gt;
|2025-02-11 &lt;br /&gt;
|* &lt;br /&gt;
|&amp;quot; 张雅静 &amp;quot; &lt;br /&gt;
|&amp;quot; 收款方备注:二维码收款 &amp;quot; &lt;br /&gt;
|Assets:Wechat:Life:LingQian &lt;br /&gt;
|0.1&lt;br /&gt;
|CNY &lt;br /&gt;
|Assets:Wechat:Work:LingQian &lt;br /&gt;
|-&lt;br /&gt;
|2025-02-10 &lt;br /&gt;
|* &lt;br /&gt;
|&amp;quot; 王浩然 &amp;quot; &lt;br /&gt;
|&amp;quot; 转账备注:到付费 &amp;quot; &lt;br /&gt;
|Expenses:Misc:Myself &lt;br /&gt;
|19&lt;br /&gt;
|CNY &lt;br /&gt;
|Assets:Wechat:Work:LingQian &lt;br /&gt;
|-&lt;br /&gt;
|2025-02-10 &lt;br /&gt;
|* &lt;br /&gt;
|&amp;quot; 陈思琪 &amp;quot; &lt;br /&gt;
|&amp;quot; 转账备注:微信转账 &amp;quot; &lt;br /&gt;
|Assets:Wechat:Work:LingQian &lt;br /&gt;
|300&lt;br /&gt;
|CNY &lt;br /&gt;
|Assets:Wechat:Life:LingQian &lt;br /&gt;
|-&lt;br /&gt;
|2025-01-23 &lt;br /&gt;
|* &lt;br /&gt;
|&amp;quot; 刘宇航 &amp;quot; &lt;br /&gt;
|&amp;quot; 高德打车订单 &amp;quot; &lt;br /&gt;
|Expenses:Transport:Myself &lt;br /&gt;
|10.9&lt;br /&gt;
|CNY &lt;br /&gt;
|Assets:Wechat:Work:LingQian &lt;br /&gt;
|-&lt;br /&gt;
|2025-01-22 &lt;br /&gt;
|* &lt;br /&gt;
|&amp;quot; 赵婉婷 &amp;quot; &lt;br /&gt;
|&amp;quot; 转账备注:微信转账 &amp;quot; &lt;br /&gt;
|Assets:Wechat:Work:LingQian &lt;br /&gt;
|20&lt;br /&gt;
|CNY &lt;br /&gt;
|Assets:Wechat:Life:LingQian &lt;br /&gt;
|-&lt;br /&gt;
|2025-01-18 &lt;br /&gt;
|* &lt;br /&gt;
|&amp;quot; 黄子豪 &amp;quot; &lt;br /&gt;
|&amp;quot; 转账备注:微信转账 &amp;quot; &lt;br /&gt;
|Assets:Wechat:Life:LingQian &lt;br /&gt;
|121&lt;br /&gt;
|CNY &lt;br /&gt;
|Assets:Wechat:Work:LingQian &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 文件 ==&lt;br /&gt;
结构如下：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
├── accounts.beancount&lt;br /&gt;
├── balances.beancount&lt;br /&gt;
├── config.beancount&lt;br /&gt;
├── main.beancount&lt;br /&gt;
└── transactions&lt;br /&gt;
    └── 2025-10.beancount&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 账户 ==&lt;br /&gt;
分为五类：&lt;br /&gt;
# Assets 资产&lt;br /&gt;
# Liabilities 负债&lt;br /&gt;
# Equity 权益（净资产）&lt;br /&gt;
# Expenses 支出&lt;br /&gt;
# Income 收入&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=%E5%AE%8C%E7%BE%8E%E6%97%A5%E7%94%A8%E5%B0%8F%E5%91%BD%E4%BB%A4&amp;diff=11551</id>
		<title>完美日用小命令</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=%E5%AE%8C%E7%BE%8E%E6%97%A5%E7%94%A8%E5%B0%8F%E5%91%BD%E4%BB%A4&amp;diff=11551"/>
		<updated>2026-07-23T15:40:50Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class = &amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 目标或作用&lt;br /&gt;
! 对应方法&lt;br /&gt;
|-&lt;br /&gt;
|查某个软件到底安装了些什么&lt;br /&gt;
|dpkg -L beancount | grep /usr/bin&lt;br /&gt;
|-&lt;br /&gt;
|elisp 求值&lt;br /&gt;
|*scratch* 里试验：C-j（eval-print-last-sexp）&lt;br /&gt;
&lt;br /&gt;
.el 文件里现场执行：C-x C-e（eval-last-sexp）&lt;br /&gt;
|-&lt;br /&gt;
|git 极简指南&lt;br /&gt;
|&lt;br /&gt;
本地出生：目录 → git init → .gitignore → add → commit → remote → push&lt;br /&gt;
&lt;br /&gt;
远程出生：GitHub 仓库 → git clone → 修改 → add → commit → push&lt;br /&gt;
|-&lt;br /&gt;
|Emacs 里误删 projects 标记文件&lt;br /&gt;
|打开项目内文件，再运行一次 project-find-file 命令，Emacs 就会重新记住项目&lt;br /&gt;
|-&lt;br /&gt;
|git 文件模式的含义&lt;br /&gt;
|100644 普通文件&lt;br /&gt;
&lt;br /&gt;
100755 可执行文件&lt;br /&gt;
&lt;br /&gt;
160000 Git submodule 的 `gitlink`&lt;br /&gt;
|-&lt;br /&gt;
|打印文件不想手动分份&lt;br /&gt;
|逐份打印，或称自动分页&lt;br /&gt;
[[File:逐份打印.png|400px]][[File:不逐份打印.png|400px]]&lt;br /&gt;
|-&lt;br /&gt;
|svg 字符丢失&lt;br /&gt;
|grep font-family sth.svg 可以查看该 svg 用了什么字体，再在服务器安装该字体，即可&lt;br /&gt;
|-&lt;br /&gt;
| emacs 乱码三部曲&lt;br /&gt;
|&lt;br /&gt;
* 辨别：[http://www.mytju.com/classCode/tools/messyCodeRecover.asp 乱码恢复]&lt;br /&gt;
* 重置：revert-buffer-with-coding-system&lt;br /&gt;
* 另存：set-buffer-file-coding-system&lt;br /&gt;
|-&lt;br /&gt;
| 用关键字查找文件&lt;br /&gt;
| 把这段放入 .bashrc&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
f(){&lt;br /&gt;
    find . -iname &amp;quot;*$1*&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 删除注释，只看已设置的配置。“说人话”&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ren() { sed &#039;/^#/d&#039; &amp;quot;$1&amp;quot; &amp;gt; &amp;quot;ren.$1&amp;quot;; }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| Debian 怎么高效截屏&lt;br /&gt;
| 打开 Keyboard → Application Shortcuts，把原来绑定 Print 的命令替换为 flameshot gui&lt;br /&gt;
|-&lt;br /&gt;
| 把命令行提示符改为青色&lt;br /&gt;
| 以下行放入 ~/.bashrc&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
PS1=&#039;\[\033[0;36m\]\u@\h:\w\$ \[\033[00m\]&#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 修改文件前先创建备份&lt;br /&gt;
| 建一个 bak 函数：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
bak() { cp -a -- &amp;quot;$1&amp;quot; &amp;quot;$1&amp;quot;.bak.$(date +%Y%m%d%H%M%S); }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 查某部门的电话&lt;br /&gt;
| 官网如果查不到，问 114 或有奇效&lt;br /&gt;
|-&lt;br /&gt;
| excel 中给 A1 单元格前后加东西&lt;br /&gt;
| 用 &amp;quot;&amp;quot; 和 &amp;amp;。如 &amp;lt;nowiki&amp;gt;&amp;quot;[[&amp;quot; &amp;amp; A1 &amp;amp; &amp;quot;]]&amp;quot;&amp;lt;/nowiki&amp;gt; 表示在 A1 的内容前后加 &amp;lt;nowiki&amp;gt;[[ 和 ]]&amp;lt;/nowiki&amp;gt;。即小猫，变成 &amp;lt;nowiki&amp;gt;[[小猫]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| mediawiki 批量上传图片&lt;br /&gt;
| php maintenance/run.php importImages ~/sth --comment=&amp;quot;批量导入，新年快乐&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 设置 Debian 电脑时区&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 查看当前时区与时间状态&lt;br /&gt;
sudo timedatectl status&lt;br /&gt;
# 把时区设为 Asia/Shanghai（UTC+8）&lt;br /&gt;
sudo timedatectl set-timezone Asia/Shanghai&lt;br /&gt;
# 再次确认&lt;br /&gt;
timedatectl status&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 剪映裁切视频&lt;br /&gt;
| 轨道上方的工具栏明晃晃就有个裁剪图标，点它就行&lt;br /&gt;
|-&lt;br /&gt;
| OBS 只采集窗口的一部分&lt;br /&gt;
| 按住 Alt 再推动就行&lt;br /&gt;
|-&lt;br /&gt;
| 打开某个网站，一片乱码&lt;br /&gt;
| 试试按 Alt 键，在出现的菜单栏上，View 有个功能：Repair Text Encoding&lt;br /&gt;
|-&lt;br /&gt;
| base64 解码&lt;br /&gt;
| &amp;lt;code&amp;gt;echo &amp;quot;aHR0cHM6Ly9jbGF1ZGVjb2RlOC5jb20vdjJleDA0&amp;quot; | base64 -d&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 下载 m3u8 视频&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
首先在浏览器安装 cat-catch&lt;br /&gt;
其次在电脑里安装 yt-dlp&lt;br /&gt;
最后在终端里 yt-dlp -o sth.mp4 &amp;quot;url&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Yt-dlp 生效状态.png|300px]]&lt;br /&gt;
|-&lt;br /&gt;
| 查找符合条件的文件后替换&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
find . -type f -name &amp;quot;*.beancount&amp;quot; -exec sed &#039;s/2025-10-01/2024-04-06/g&#039; {} +&lt;br /&gt;
&lt;br /&gt;
find . → 从当前目录开始查找&lt;br /&gt;
-type f → 只查找文件&lt;br /&gt;
-name &amp;quot;*.beancount&amp;quot; → 只匹配后缀为 .beancount 的文件&lt;br /&gt;
-exec ... {} + → 对每个匹配的文件执行后面的命令&lt;br /&gt;
sed -i &#039;s/2025-10-01/2024-04-06/g&#039; →&lt;br /&gt;
-i 表示直接修改文件&lt;br /&gt;
&#039;s/旧/新/g&#039; 表示全局替换&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 找到所有文章&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
curl -s &amp;quot;https://somesite.com/api.php?action=query&amp;amp;format=json&amp;amp;generator=allpages&amp;amp;gapnamespace=0&amp;amp;gaplimit=max&amp;amp;prop=info&amp;amp;inprop=url&amp;quot; | jq .&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| emacs 中按行号加序号&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;elisp&amp;quot;&amp;gt;&lt;br /&gt;
M-x replace-regexp RET ^ RET \,(1+ \#). RET&lt;br /&gt;
# ^ → 匹配行首&lt;br /&gt;
# \, → 计算 Lisp 表达式&lt;br /&gt;
# \# → 当前行号&lt;br /&gt;
# 1+ \# → 每行号加 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
整体作用 → 给每行自动生成递增编号&lt;br /&gt;
|-&lt;br /&gt;
| emacs 中插入两个全角空格&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
insert-char 3000 #或者&lt;br /&gt;
&lt;br /&gt;
(global-set-key (kbd &amp;quot;C-c s&amp;quot;)&lt;br /&gt;
		(lambda () (interactive) (insert-char #x3000 2)))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 解决 ssh 断联问题&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 本地 ~/.ssh/config&lt;br /&gt;
Host *&lt;br /&gt;
    ServerAliveInterval 60&lt;br /&gt;
    ServerAliveCountMax 3&lt;br /&gt;
&lt;br /&gt;
# 远程 /etc/ssh/sshd_config&lt;br /&gt;
ClientAliveInterval 60&lt;br /&gt;
ClientAliveCountMax 3&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 隐藏 MediaWiki 侧边栏&lt;br /&gt;
| &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
/* 隐藏侧边栏 */&lt;br /&gt;
#mw-panel {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* 扩展正文到全屏 */&lt;br /&gt;
#content {&lt;br /&gt;
    margin-left: 0 !important;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| wikitable 中有的想排序有的不想排序&lt;br /&gt;
| 总表 class=&amp;quot;wikitable sortable&amp;quot;，在不想排序的表头设置 class=&amp;quot;unsortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| wikitable 单元格内换行后感觉有点远&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
style=&amp;quot;line-height:1.01;&amp;quot;&lt;br /&gt;
# 这样设置后，单元格里的内容呈块状，亲疏更加令人舒服&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Excel 单元格内换行&lt;br /&gt;
| 替换框里用 Ctrl J 能实现&lt;br /&gt;
|-&lt;br /&gt;
| github 提速方法一则&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# ssh over https&lt;br /&gt;
Host github.com&lt;br /&gt;
HostName ssh.github.com # 默认 ssh，不通过 https&lt;br /&gt;
Port 443&lt;br /&gt;
User git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| github 提速方法一则&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 放 ~/.ssh/config 里&lt;br /&gt;
Host github.com&lt;br /&gt;
  User git&lt;br /&gt;
  HostName github.com&lt;br /&gt;
  ProxyJump proxyserver&lt;br /&gt;
  &lt;br /&gt;
Host proxyserver&lt;br /&gt;
  User root&lt;br /&gt;
  HostName your_server_ip&lt;br /&gt;
  IdentityFile xxx&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 无 GUI 的 Linux 里 less 妙用&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
alias s=&amp;quot;ls -alh --color=auto | less&amp;quot;&lt;br /&gt;
Space 向下翻页&lt;br /&gt;
b 向上翻页&lt;br /&gt;
↑ / ↓ 单行滚动&lt;br /&gt;
q 退出&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 不想上的网课怎么办&lt;br /&gt;
| 去 greasyforks 搜该网课的域名&lt;br /&gt;
|-&lt;br /&gt;
| 怎样在 Emacs query-replace-regex 里使用“或”语义&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;\|&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 怎样让文件总是提示“建议只读”模式打开&lt;br /&gt;
| “保存”时，保存左边有个“工具” - “常规选项” - “建议只读”&lt;br /&gt;
|-&lt;br /&gt;
| mediawiki gd 不支持 webp&lt;br /&gt;
| sudo apt install imagemagick libwebp-dev，再在 LocalSettings.php 里打开 convert&lt;br /&gt;
|-&lt;br /&gt;
| Emacs 密钥过期无法更新 package 时应该怎么做&lt;br /&gt;
| 手动到 [https://elpa.gnu.org/packages/gnu-elpa-keyring-update.html GNU ELPA - gnu-elpa-keyring-update] 下载 gnu-elpa-keyring-update&lt;br /&gt;
在 Emacs 里打开这个 tar 文件，执行 package-install-from-buffer&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| 音频转文字&lt;br /&gt;
| &amp;lt;code&amp;gt;whisper ~/S01E01.aac --model turbo -f srt --output_dir ~/&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
model: tiny, base, small, medium, large, 或 turbo&lt;br /&gt;
f: format. txt, srt, vtt 等&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 视频提取音频&lt;br /&gt;
| &amp;lt;code&amp;gt;ffmpeg -i ~/S01E01.mp4 -vn -acodec copy ~/S01E01.aac&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i: input&lt;br /&gt;
vn: vedio none 不要视频&lt;br /&gt;
acoder copy: audio copy 直接复制音轨&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 表格中的第一个 # 号不解析&lt;br /&gt;
| #&lt;br /&gt;
# 天空&lt;br /&gt;
# 大地&lt;br /&gt;
# 人间&lt;br /&gt;
# 湖水&lt;br /&gt;
即在左上角先放一个 # 号&lt;br /&gt;
|-&lt;br /&gt;
| Semantic MediaWiki 日期标准化&lt;br /&gt;
| ?开庭日期#ISO&lt;br /&gt;
|-&lt;br /&gt;
| pubkey 不方便往服务器上粘&lt;br /&gt;
| 用 echo &amp;quot;Ctrl V&amp;quot; &amp;gt;&amp;gt; sth&lt;br /&gt;
|-&lt;br /&gt;
| Semantic MediaWiki 网页端清除缓存&lt;br /&gt;
| 在网页端 ?action=purge&lt;br /&gt;
&lt;br /&gt;
在 CLI 端 sduo php extensions/SemanticMediaWiki/maintenance/rebuildData.php&lt;br /&gt;
|-&lt;br /&gt;
| 调整特定页面的某个部分的字体&lt;br /&gt;
| Custom CSS 拓展可以哪里不爽改哪里，如：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
.answer p {&lt;br /&gt;
  font-size: 16px !important;&lt;br /&gt;
  color: #191b1f !important;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 命令替换，在命令中引用其他命令的结果&lt;br /&gt;
| $(command) 即用 $() 把命令括起来。或&lt;br /&gt;
&lt;br /&gt;
`command` 即用反引号把命令括起来&lt;br /&gt;
|-&lt;br /&gt;
| mediawiki 日志调试&lt;br /&gt;
| $wgShowExceptionDetails = true;&lt;br /&gt;
|-&lt;br /&gt;
| grep 用法&lt;br /&gt;
| 在目录下递归找字符串 grep -r string /dir/want&lt;br /&gt;
&lt;br /&gt;
依据后缀找关键字 grep -r &amp;quot;2025-10-01&amp;quot; --include=&amp;quot;*.beancount&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 一个 extension 不适用于当前 mediawiki 较低版本怎么办&lt;br /&gt;
| 别傻乎乎升级 mediawiki 版本，你可以在 extension 的历史记录中，按时间或 tags 找对应 mediawiki 当时的 extension 版本&lt;br /&gt;
|-&lt;br /&gt;
| 查本机图形化协议是 x11 还是 wayland 还是 Hyprland 还是 Sway&lt;br /&gt;
| echo $XDG_SESSION_TYPE&lt;br /&gt;
|-&lt;br /&gt;
| 找源码&lt;br /&gt;
| grep -rn --include=&#039;*.c&#039; --include=&#039;*.h&#039; &#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 显示硬盘及分区&lt;br /&gt;
| lsblk&lt;br /&gt;
|-&lt;br /&gt;
| 查找 uuid&lt;br /&gt;
| sudo blkid /dev/sda&lt;br /&gt;
|-&lt;br /&gt;
| 挂载硬盘&lt;br /&gt;
| 在 /etc/fstab 中写入：UUID=xxxx-xxxx-xxxx  /mnt/data  ext4  defaults  0 2&lt;br /&gt;
|-&lt;br /&gt;
| MediaWiki 某页不要 toc 的数字序号&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 先在 MediaWiki:Common.css 设置：&lt;br /&gt;
.noautonum .tocnumber {&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# 后在某页添加：&lt;br /&gt;
&amp;lt;div class=&amp;quot;noautonum&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 设置 Edit With Emacs 打开的窗口的大小&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;elisp&amp;quot;&amp;gt;&lt;br /&gt;
# 写入 early-init.el 中&lt;br /&gt;
(setq initial-frame-alist &#039;((width . 80) (height . 35)))&lt;br /&gt;
(setq default-frame-alist &#039;((top . 30) (left . 320) (width . 180) (height . 60)))&lt;br /&gt;
(setq frame-inhibit-implied-resize t)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| dd 制作安装盘&lt;br /&gt;
| sudo dd if=./EndeavourOS.iso of=/dev/sdc&lt;br /&gt;
|- &lt;br /&gt;
| ventoy 制作安装盘&lt;br /&gt;
| 把 ventoy 安装到 U 盘，再把 iso 文件复制进 U 盘&lt;br /&gt;
|-&lt;br /&gt;
| 添加 sudo 免密&lt;br /&gt;
| su root # 其实新用户没有 sudo 权&lt;br /&gt;
sudo visudo 或者&lt;br /&gt;
&lt;br /&gt;
写入 /etc/sudoer：username ALL=(ALL) NOPASSWD:ALL&lt;br /&gt;
&lt;br /&gt;
(ALL) 只设置用户权限，不管组权限。(ALL:ALL) 既设置用户权限，也设置组权限。按最小化权限原则，设置免密时使用 ALL=(ALL) &lt;br /&gt;
|-&lt;br /&gt;
| 找不到 firefox for android 安装包？&lt;br /&gt;
| https://ftp.mozilla.org/pub/fenix/releases/&lt;br /&gt;
|- &lt;br /&gt;
| 根据 sha256.txt 检测软件下载是否完整&lt;br /&gt;
| sha256sum -c --ignore-missing sha256.txt&lt;br /&gt;
|-&lt;br /&gt;
| 解决 zip 文件解压后文件名乱码&lt;br /&gt;
| unar -e GBK&lt;br /&gt;
|-&lt;br /&gt;
| emacs 中数字通配符&lt;br /&gt;
| &amp;lt;nowiki&amp;gt;[[:digit:]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| mediawiki 上传容量改大&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 改 /etc/php/版本号/cli/php.ini&lt;br /&gt;
post_max_size = 50M&lt;br /&gt;
upload_max_filesize = 50M&lt;br /&gt;
systemctl restart apache2 &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 显示所有进程，且只显示第 12 列&lt;br /&gt;
| ps aux | awk &#039;{print $11}&#039;&lt;br /&gt;
|-&lt;br /&gt;
| 让 apache2 中的 php 代码活起来&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;apache&amp;quot;&amp;gt;&lt;br /&gt;
# Add module for PHP 8&lt;br /&gt;
LoadModule php_module libexec/apache2/libphp.so&lt;br /&gt;
AddHandler php-script .php&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 复制东西进另一个地方&lt;br /&gt;
| scp sth.zip host:~&lt;br /&gt;
|-&lt;br /&gt;
| 给当前目录下所有文件夹名字后加加一个 g 字符&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
for dir in */;&lt;br /&gt;
do&lt;br /&gt;
    if [ -d &amp;quot;$dir&amp;quot; ]; then&lt;br /&gt;
        new_dir=&amp;quot;${dir%*/}g&amp;quot;&lt;br /&gt;
        mv &amp;quot;$dir&amp;quot; &amp;quot;$new_dir&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 显示当前文件夹下所有文件、文件夹占用的磁盘容量&lt;br /&gt;
| du -h --max-depth=1&lt;br /&gt;
|-&lt;br /&gt;
| 找找 bin 在哪&lt;br /&gt;
| which phpmyadmin&lt;br /&gt;
|-&lt;br /&gt;
| 查看命令位置&lt;br /&gt;
| where sudo&lt;br /&gt;
|-&lt;br /&gt;
| 找找文件详细路径&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo apt install plocate&lt;br /&gt;
sudo updatedb &lt;br /&gt;
locate file.txt&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 猜猜我是谁&lt;br /&gt;
| whoami&lt;br /&gt;
|-&lt;br /&gt;
| 取出文件名&lt;br /&gt;
| find . -type f -exec basename {} \; &amp;gt; 本文件夹内所有文件名单.txt&lt;br /&gt;
|-&lt;br /&gt;
| 把视频每一秒都导一帧出来形成 png&lt;br /&gt;
| ffmpeg -i screen-20240701-081539.mp4 -vf fps=1 -q:v 2 ./test/dg_%03d.png&lt;br /&gt;
|-&lt;br /&gt;
| Excel 中无脑复制时，怎样让几十字显示时，不超过一个单元格的框框&lt;br /&gt;
| 把它旁边的框框填入一串字符如 yesterday，再把 yesterday 替换为空格。接下来在 A1 单元格填 100 字，它也不会在外观上占用了 B1 单元格，因为 B1 单元格客观上存在一个空格。&lt;br /&gt;
|-&lt;br /&gt;
| 要替换掉指定内容后的换行符&lt;br /&gt;
| 用 emacs，先写指定内容的 regexp，把它括起来当一个 regexp，再加 $。之后，替换内容中执行一个 (delete-forward-char 1) 即可。在 mini buffer 中执行函数的方式是 &amp;lt;code&amp;gt; \,(function) &amp;lt;/code&amp;gt;。&lt;br /&gt;
|-&lt;br /&gt;
| 两台 Windows 如何远程协助&lt;br /&gt;
| Windows 系统有个自带软件叫“快速助手”，英文 quick assist，两人都打开，很容易就能远程协助。&lt;br /&gt;
|-&lt;br /&gt;
| 快速删除 Windows 的服务&lt;br /&gt;
| regedit 导航至 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services，直接按名字删。无有效系统备份恢复手段的读者，不建议尝试此操作&lt;br /&gt;
|-&lt;br /&gt;
| 查看访问本机的 IP，及其所属&lt;br /&gt;
|&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat /var/log/apache2/access.log | awk &#039;{print $1}&#039; | sort | uniq -c | sort -nr | head -300 &amp;gt; success.txt&lt;br /&gt;
whois x.x.x.x&lt;br /&gt;
# awk &#039;{print $1}&#039; access.log：从access.log文件中提取每行的第一个字段（通常是IP地址）。&lt;br /&gt;
# sort：将提取的IP地址排序，为下一步的计数做准备。&lt;br /&gt;
# uniq -c：对排序后的IP地址进行计数，-c选项表示显示计数。&lt;br /&gt;
# sort -nr：再次对计数结果进行排序，-n表示按数值排序，-r表示降序。&lt;br /&gt;
# head -300：选择排序后的前300个IP地址。&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| ssh 使远程机器通过 5432 端口连接到本机的 12345 端口&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
本机 ssh -R 25432:127.0.0.1:12345 tx&lt;br /&gt;
远程 export {http,https}_proxy=http://localhost:25432&lt;br /&gt;
验证 echo $https_proxy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 在 Anki 中输入平方毫米&lt;br /&gt;
| \(\text{mm}^2\)&lt;br /&gt;
|-&lt;br /&gt;
| 用 sed 删掉 apache 注释&lt;br /&gt;
| sed &#039;/^#/d&#039; apache2.conf &amp;gt; apache2.conf.nocomments 这行命令有点牛，一下把所有注释删掉了 d 表示删除行&lt;br /&gt;
&lt;br /&gt;
sed &#039;s/old/new/g&#039; file.txt &amp;gt; change.txt 把 file.txt 中的所有 old 替换为 new&lt;br /&gt;
|-&lt;br /&gt;
| 查找文件并执行命令，\; 代表命令结束符&lt;br /&gt;
| find ./images -type d -exec chmod 755 {} \;&lt;br /&gt;
|-&lt;br /&gt;
| apache 使用反代&lt;br /&gt;
| a2enmod proxy proxy_http proxy_wstunnel&lt;br /&gt;
|-&lt;br /&gt;
| 用 tail 显示 apache 错误日志的最后十行&lt;br /&gt;
| sudo tail -f /var/log/apache2/error.log&lt;br /&gt;
|-&lt;br /&gt;
| 查找数据库备份&lt;br /&gt;
| find /var/lib/automysqlbackup/&lt;br /&gt;
|-&lt;br /&gt;
| 用 Emacs 批量改名&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
C-x d 打开文件夹&lt;br /&gt;
M-x dired-do-rename-regexp 使用正则匹配改名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
C-x d 打开文件夹&lt;br /&gt;
C-x C-q 打开可编辑模式&lt;br /&gt;
M-x query-replace-regexp&lt;br /&gt;
C-c C-c 真实应用&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
二者任选其一。&lt;br /&gt;
|-&lt;br /&gt;
| 设置并检测 301 重定向是否配置成功&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 设置&lt;br /&gt;
RewriteEngine On&lt;br /&gt;
RewriteCond %{HTTPS} off&lt;br /&gt;
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]&lt;br /&gt;
# 检测&lt;br /&gt;
curl -I http://yourdomain.com&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 修改主机名&lt;br /&gt;
| sudo hostnamectl set-hostname &amp;quot;new_hostname&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 修改用户名@主机名的显示色&lt;br /&gt;
| 在 .bashrc 找到 PS1 = 那行，把 \033[01;32m 绿色改成 \033[01;33m 黄色即可&lt;br /&gt;
|-&lt;br /&gt;
| 用 Emacs 复制正则结果&lt;br /&gt;
| C-u M-x occur RET regexp&lt;br /&gt;
|-&lt;br /&gt;
| MediaWiki 直接听歌&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$wgFileExtensions[] = &#039;mp3&#039;; &lt;br /&gt;
git clone https://gerrit.wikimedia.org/r/mediawiki/extensions/MP3MediaHandler --branch REL1_XX&lt;br /&gt;
wfLoadExtension( &#039;MP3MediaHandler&#039; );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 一句话让 AI 不要在回答前序号列表的小圆点等&lt;br /&gt;
| 可以把答案放进代码框方便我复制&lt;br /&gt;
|-&lt;br /&gt;
| Linux 时光机&lt;br /&gt;
| Timeshift&lt;br /&gt;
|-&lt;br /&gt;
| 抢救硬盘&lt;br /&gt;
| r-studio&lt;br /&gt;
|-&lt;br /&gt;
| 在 toc 中，对有序号的文本，不采用 wikitext 数字序号&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;wikitext&amp;quot;&amp;gt;&lt;br /&gt;
{{#css:&lt;br /&gt;
.tocnumber { display: none; }&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| wsl 遭遇 DNS 污染&lt;br /&gt;
| 改一下 DNS 为 114.114.114.114&lt;br /&gt;
&lt;br /&gt;
打开虚拟化平台时，改的是虚拟网卡&lt;br /&gt;
|-&lt;br /&gt;
| 查某个软件在别的平台是什么版本&lt;br /&gt;
| https://pkgs.org/&lt;br /&gt;
|-&lt;br /&gt;
| 查看代码最近的 5 个 tag&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git tag | sort -V | tail -5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| powershell 中查 sha512&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
Get-FileHash -Path &amp;quot;E:\EndeavourOS_Mercury-Neo-2025.03.19.iso&amp;quot; -Algorithm SHA512 | Format-List&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=%E6%80%8E%E4%B9%88%E4%BD%BF%E7%94%A8_beancount&amp;diff=11550</id>
		<title>怎么使用 beancount</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=%E6%80%8E%E4%B9%88%E4%BD%BF%E7%94%A8_beancount&amp;diff=11550"/>
		<updated>2026-07-23T14:11:06Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: /* 安装 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beancount 是一款简洁、可靠的财务记账软件。本文讲述如何使用它。想要财务自由的人，可以学一下。&lt;br /&gt;
&lt;br /&gt;
== Debian 12 安装 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
# 如果安装很很慢，请学会换用清华 apt 源&lt;br /&gt;
sudo apt install pipx&lt;br /&gt;
mkdir -p ~/.pip&lt;br /&gt;
echo &amp;quot;[global]&lt;br /&gt;
index-url = https://pypi.tuna.tsinghua.edu.cn/simple&amp;quot; &amp;gt; ~/.pip/pip.conf&lt;br /&gt;
pipx install beancount&lt;br /&gt;
pipx ensurepath&lt;br /&gt;
source ~/.bashrc&lt;br /&gt;
pipx install fava&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 语法检测 bean-check file.beancount&lt;br /&gt;
* 账本展示 fava file.beancount 之后根据提示，一般是在 http://127.0.0.1:5000 查看&lt;br /&gt;
&lt;br /&gt;
== Debian 13 安装 ==&lt;br /&gt;
sudo apt install beancount&lt;br /&gt;
&lt;br /&gt;
== 账本 ==&lt;br /&gt;
* 微信可导出 3 个月的 Excel 账单。每次只能导出三个月的账单，如果需要导出一年的账单，需要分四次导出？&lt;br /&gt;
* 支付宝电脑端导出的 Excel 账单无付款方式信息。支付宝 APP 端导出的账单，有付款方式信息。所以支付宝账单要用手机 APP 导出。&lt;br /&gt;
&lt;br /&gt;
== 心得 ==&lt;br /&gt;
* 一切皆账户，有出必有入。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|损&lt;br /&gt;
|益&lt;br /&gt;
|-&lt;br /&gt;
|Income&lt;br /&gt;
|Expenses&lt;br /&gt;
|-&lt;br /&gt;
| -+&lt;br /&gt;
| +-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|负债&lt;br /&gt;
|资产&lt;br /&gt;
|-&lt;br /&gt;
|Liabilities&lt;br /&gt;
|Assets&lt;br /&gt;
|-&lt;br /&gt;
| -+&lt;br /&gt;
| +-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Equity 也有增减。&lt;br /&gt;
&lt;br /&gt;
== 模范 ==&lt;br /&gt;
只要在账单表格内搞清楚了流入账户、流出账户，再用 Emacs 稍做编辑，即可。&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|&#039;&#039;&#039;交易时间&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;确定性&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;交易对方&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;商品&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;流入账户&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;金额(元)&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;币种&#039;&#039;&#039; &lt;br /&gt;
|&#039;&#039;&#039;流出账户&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
|2025-02-12 &lt;br /&gt;
|* &lt;br /&gt;
|&amp;quot; 李明轩 &amp;quot; &lt;br /&gt;
|&amp;quot; 转账备注:微信转账 &amp;quot; &lt;br /&gt;
|Assets:Wechat:Work:LingQian &lt;br /&gt;
|300&lt;br /&gt;
|CNY &lt;br /&gt;
|Assets:Wechat:Life:LingQian &lt;br /&gt;
|-&lt;br /&gt;
|2025-02-11 &lt;br /&gt;
|* &lt;br /&gt;
|&amp;quot; 张雅静 &amp;quot; &lt;br /&gt;
|&amp;quot; 收款方备注:二维码收款 &amp;quot; &lt;br /&gt;
|Assets:Wechat:Life:LingQian &lt;br /&gt;
|0.1&lt;br /&gt;
|CNY &lt;br /&gt;
|Assets:Wechat:Work:LingQian &lt;br /&gt;
|-&lt;br /&gt;
|2025-02-10 &lt;br /&gt;
|* &lt;br /&gt;
|&amp;quot; 王浩然 &amp;quot; &lt;br /&gt;
|&amp;quot; 转账备注:到付费 &amp;quot; &lt;br /&gt;
|Expenses:Misc:Myself &lt;br /&gt;
|19&lt;br /&gt;
|CNY &lt;br /&gt;
|Assets:Wechat:Work:LingQian &lt;br /&gt;
|-&lt;br /&gt;
|2025-02-10 &lt;br /&gt;
|* &lt;br /&gt;
|&amp;quot; 陈思琪 &amp;quot; &lt;br /&gt;
|&amp;quot; 转账备注:微信转账 &amp;quot; &lt;br /&gt;
|Assets:Wechat:Work:LingQian &lt;br /&gt;
|300&lt;br /&gt;
|CNY &lt;br /&gt;
|Assets:Wechat:Life:LingQian &lt;br /&gt;
|-&lt;br /&gt;
|2025-01-23 &lt;br /&gt;
|* &lt;br /&gt;
|&amp;quot; 刘宇航 &amp;quot; &lt;br /&gt;
|&amp;quot; 高德打车订单 &amp;quot; &lt;br /&gt;
|Expenses:Transport:Myself &lt;br /&gt;
|10.9&lt;br /&gt;
|CNY &lt;br /&gt;
|Assets:Wechat:Work:LingQian &lt;br /&gt;
|-&lt;br /&gt;
|2025-01-22 &lt;br /&gt;
|* &lt;br /&gt;
|&amp;quot; 赵婉婷 &amp;quot; &lt;br /&gt;
|&amp;quot; 转账备注:微信转账 &amp;quot; &lt;br /&gt;
|Assets:Wechat:Work:LingQian &lt;br /&gt;
|20&lt;br /&gt;
|CNY &lt;br /&gt;
|Assets:Wechat:Life:LingQian &lt;br /&gt;
|-&lt;br /&gt;
|2025-01-18 &lt;br /&gt;
|* &lt;br /&gt;
|&amp;quot; 黄子豪 &amp;quot; &lt;br /&gt;
|&amp;quot; 转账备注:微信转账 &amp;quot; &lt;br /&gt;
|Assets:Wechat:Life:LingQian &lt;br /&gt;
|121&lt;br /&gt;
|CNY &lt;br /&gt;
|Assets:Wechat:Work:LingQian &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 文件 ==&lt;br /&gt;
结构如下：&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
.&lt;br /&gt;
├── accounts.beancount&lt;br /&gt;
├── balances.beancount&lt;br /&gt;
├── config.beancount&lt;br /&gt;
├── main.beancount&lt;br /&gt;
└── transactions&lt;br /&gt;
    └── 2025-10.beancount&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 账户 ==&lt;br /&gt;
分为五类：&lt;br /&gt;
# Assets 资产&lt;br /&gt;
# Liabilities 负债&lt;br /&gt;
# Equity 权益（净资产）&lt;br /&gt;
# Expenses 支出&lt;br /&gt;
# Income 收入&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=Emacs_%E6%8F%92%E4%BB%B6%E5%A4%A7%E6%B3%95%EF%BC%9A%E5%87%A0%E4%B8%AA%E8%B6%85%E6%9C%89%E7%94%A8%E7%9A%84%E6%8F%92%E4%BB%B6&amp;diff=11549</id>
		<title>Emacs 插件大法：几个超有用的插件</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=Emacs_%E6%8F%92%E4%BB%B6%E5%A4%A7%E6%B3%95%EF%BC%9A%E5%87%A0%E4%B8%AA%E8%B6%85%E6%9C%89%E7%94%A8%E7%9A%84%E6%8F%92%E4%BB%B6&amp;diff=11549"/>
		<updated>2026-07-22T15:50:53Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!插件名&lt;br /&gt;
!解决痛点&lt;br /&gt;
!核心功能&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Vertico&#039;&#039;&#039;&lt;br /&gt;
|Emacs 默认候选列表不够直观，选择文件、Buffer、命令时不方便浏览&lt;br /&gt;
|把 minibuffer 候选项纵向排列，方便用 &amp;lt;code&amp;gt;C-n&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;C-p&amp;lt;/code&amp;gt; 选择&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Consult&#039;&#039;&#039;&lt;br /&gt;
|原生命令能查找、切换、搜索，但功能分散，预览和交互体验较弱&lt;br /&gt;
|增强 Buffer 切换、文件查找、项目搜索、行跳转、历史记录等功能，并支持实时预览&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Marginalia&#039;&#039;&#039;&lt;br /&gt;
|只看到候选名称，不知道候选具体是什么&lt;br /&gt;
|在候选项旁显示补充说明，例如命令简介、文件权限、Buffer 模式、变量类型&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Orderless&#039;&#039;&#039;&lt;br /&gt;
|搜索时必须记住准确名称和字符顺序，输入稍有偏差就匹配不到&lt;br /&gt;
|允许用多个关键词进行无顺序匹配，例如输入 &amp;lt;code&amp;gt;find file&amp;lt;/code&amp;gt; 匹配 &amp;lt;code&amp;gt;project-find-file&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;which-key&#039;&#039;&#039;&lt;br /&gt;
|按下 &amp;lt;code&amp;gt;C-x&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;C-c&amp;lt;/code&amp;gt; 等前缀键后，不知道后面还能接什么键&lt;br /&gt;
|自动显示当前前缀键下可继续使用的快捷键及其命令说明&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
找源码依赖时常用的几个命令：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
grep -Rnw ~/.emacs.d -e &#039;set-local&#039; ;; 搜报错关键字 set-local&lt;br /&gt;
(locate-library &amp;quot;compat&amp;quot;) ;; 定位某依赖的源码位置及版本&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compat 的作用，是把新版 Emacs 的一部分 Elisp API 回填给旧版 Emacs，让现代插件能用较新的写法，同时继续支持旧 Emacs。&lt;br /&gt;
&lt;br /&gt;
命令 rg 里 ripgrep 这个包提供。&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=Emacs_%E6%8F%92%E4%BB%B6%E5%A4%A7%E6%B3%95%EF%BC%9A%E5%87%A0%E4%B8%AA%E8%B6%85%E6%9C%89%E7%94%A8%E7%9A%84%E6%8F%92%E4%BB%B6&amp;diff=11548</id>
		<title>Emacs 插件大法：几个超有用的插件</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=Emacs_%E6%8F%92%E4%BB%B6%E5%A4%A7%E6%B3%95%EF%BC%9A%E5%87%A0%E4%B8%AA%E8%B6%85%E6%9C%89%E7%94%A8%E7%9A%84%E6%8F%92%E4%BB%B6&amp;diff=11548"/>
		<updated>2026-07-22T15:20:25Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!插件名&lt;br /&gt;
!解决痛点&lt;br /&gt;
!核心功能&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Vertico&#039;&#039;&#039;&lt;br /&gt;
|Emacs 默认候选列表不够直观，选择文件、Buffer、命令时不方便浏览&lt;br /&gt;
|把 minibuffer 候选项纵向排列，方便用 &amp;lt;code&amp;gt;C-n&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;C-p&amp;lt;/code&amp;gt; 选择&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Consult&#039;&#039;&#039;&lt;br /&gt;
|原生命令能查找、切换、搜索，但功能分散，预览和交互体验较弱&lt;br /&gt;
|增强 Buffer 切换、文件查找、项目搜索、行跳转、历史记录等功能，并支持实时预览&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Marginalia&#039;&#039;&#039;&lt;br /&gt;
|只看到候选名称，不知道候选具体是什么&lt;br /&gt;
|在候选项旁显示补充说明，例如命令简介、文件权限、Buffer 模式、变量类型&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Orderless&#039;&#039;&#039;&lt;br /&gt;
|搜索时必须记住准确名称和字符顺序，输入稍有偏差就匹配不到&lt;br /&gt;
|允许用多个关键词进行无顺序匹配，例如输入 &amp;lt;code&amp;gt;find file&amp;lt;/code&amp;gt; 匹配 &amp;lt;code&amp;gt;project-find-file&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;which-key&#039;&#039;&#039;&lt;br /&gt;
|按下 &amp;lt;code&amp;gt;C-x&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;C-c&amp;lt;/code&amp;gt; 等前缀键后，不知道后面还能接什么键&lt;br /&gt;
|自动显示当前前缀键下可继续使用的快捷键及其命令说明&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
找源码依赖时常用的几个命令：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
grep -Rnw ~/.emacs.d -e &#039;set-local&#039; ;; 搜报错关键字 set-local&lt;br /&gt;
(locate-library &amp;quot;compat&amp;quot;) ;; 定位某依赖的源码位置及版本&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Compat 的作用，是把新版 Emacs 的一部分 Elisp API 回填给旧版 Emacs，让现代插件能用较新的写法，同时继续支持旧 Emacs。&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=Emacs_%E6%8F%92%E4%BB%B6%E5%A4%A7%E6%B3%95%EF%BC%9A%E5%87%A0%E4%B8%AA%E8%B6%85%E6%9C%89%E7%94%A8%E7%9A%84%E6%8F%92%E4%BB%B6&amp;diff=11547</id>
		<title>Emacs 插件大法：几个超有用的插件</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=Emacs_%E6%8F%92%E4%BB%B6%E5%A4%A7%E6%B3%95%EF%BC%9A%E5%87%A0%E4%B8%AA%E8%B6%85%E6%9C%89%E7%94%A8%E7%9A%84%E6%8F%92%E4%BB%B6&amp;diff=11547"/>
		<updated>2026-07-22T15:12:12Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!插件名&lt;br /&gt;
!解决痛点&lt;br /&gt;
!核心功能&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Vertico&#039;&#039;&#039;&lt;br /&gt;
|Emacs 默认候选列表不够直观，选择文件、Buffer、命令时不方便浏览&lt;br /&gt;
|把 minibuffer 候选项纵向排列，方便用 &amp;lt;code&amp;gt;C-n&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;C-p&amp;lt;/code&amp;gt; 选择&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Consult&#039;&#039;&#039;&lt;br /&gt;
|原生命令能查找、切换、搜索，但功能分散，预览和交互体验较弱&lt;br /&gt;
|增强 Buffer 切换、文件查找、项目搜索、行跳转、历史记录等功能，并支持实时预览&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Marginalia&#039;&#039;&#039;&lt;br /&gt;
|只看到候选名称，不知道候选具体是什么&lt;br /&gt;
|在候选项旁显示补充说明，例如命令简介、文件权限、Buffer 模式、变量类型&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;Orderless&#039;&#039;&#039;&lt;br /&gt;
|搜索时必须记住准确名称和字符顺序，输入稍有偏差就匹配不到&lt;br /&gt;
|允许用多个关键词进行无顺序匹配，例如输入 &amp;lt;code&amp;gt;find file&amp;lt;/code&amp;gt; 匹配 &amp;lt;code&amp;gt;project-find-file&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;which-key&#039;&#039;&#039;&lt;br /&gt;
|按下 &amp;lt;code&amp;gt;C-x&amp;lt;/code&amp;gt;、&amp;lt;code&amp;gt;C-c&amp;lt;/code&amp;gt; 等前缀键后，不知道后面还能接什么键&lt;br /&gt;
|自动显示当前前缀键下可继续使用的快捷键及其命令说明&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
找源码依赖时常用的几个命令：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
grep -Rnw ~/.emacs.d -e &#039;set-local&#039; ;; 搜报错关键字 set-local&lt;br /&gt;
(locate-library &amp;quot;compat&amp;quot;) ;; 定位某依赖的源码位置及版本&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=%E9%BB%84%E5%B1%B1%E6%B8%B8%E8%AE%B0%EF%BC%9A%E7%88%B1%E8%80%8C%E4%B8%8D%E6%98%93&amp;diff=11546</id>
		<title>黄山游记：爱而不易</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=%E9%BB%84%E5%B1%B1%E6%B8%B8%E8%AE%B0%EF%BC%9A%E7%88%B1%E8%80%8C%E4%B8%8D%E6%98%93&amp;diff=11546"/>
		<updated>2026-07-22T14:26:25Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;上周周末，和朋友一起，来了一场说走就走的旅行。周五中午决定要去，周五下午做了一下攻略，周六早晨 05:50 起床，06:25 打车后火速买了两份水煎包带着，06:30 已经在网约车上了。去之前种种担心，因为整个行程，只规划好了去时车票、回时车票、黄山风景区旅行地图意愿项目、预估各项目游玩时间，对买票点、乘车点、几点到哪里、住哪里等一些细节，并未有详细路书。抱着出发即是成功的心态，直截了当买票出发了。只要出发了，路上就有无数种可能，所有的问题都能够解决。过于迟疑、犹豫、内耗，是没有意义的。&lt;br /&gt;
&lt;br /&gt;
以下为一些攻略和心得。&lt;br /&gt;
&lt;br /&gt;
[[File:黄山风景区导游图20250718.jpg|300px|黄山风景区导游图，查看原图可下载大图]]&lt;br /&gt;
== 黄山旅游交通攻略 ==&lt;br /&gt;
首先，黄山现有五个入口：&lt;br /&gt;
# 东入口：在建。还未开通索道及步道&lt;br /&gt;
# 西入口：钓桥庵（无索道）。不流行&lt;br /&gt;
# 南一入口：云谷寺（云谷索道）。49% 的人选这个入口。超值，风景绝美&lt;br /&gt;
# 南二入口：慈光阁（玉屏索道）。39% 的人选这个入口。上山就能看到迎客松&lt;br /&gt;
# 北入口：松谷庵（太平索道）。12% 的人选这个入口。不了解&lt;br /&gt;
&lt;br /&gt;
不用担心交通问题。开车去，我不太了解，不过看到过许多人自驾到景区入口。如果坐火车、高铁等，车站有很方便的去“黄山南大门换乘中心”的汽车，高铁“黄山北”站去“黄山南大门换乘中心”汽车站，约 30 元，耗时约 50 分钟。&lt;br /&gt;
&lt;br /&gt;
一般购票，都选“黄山南大门换乘中心” - 索道下站 - 索道上站 - 景区大门票的联票，即摆渡车会把人从“黄山南大门换乘中心”拉到索道下站，直接乘索道上山就行。摆渡车就是传说中的新国线，没去之前我还纳闷新国线是什么意思，我以为是公交、地铁、高铁、汽车、城轨之外的某种列车，去了才知道“新国线”是黄山景区摆渡车的所属公司名。你的真正旅程，可以说是从索道入口处开始的。&lt;br /&gt;
&lt;br /&gt;
[[File:黄山 新国线景区大巴线路.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
对于普通人，建议索道上山、索道下山。对于犟种，建议索道上山、走路下山。对于大神，可以考虑走路上山、走路下山。我和朋友是索道上山、走路下山，膝盖差点没走废。本人可是曾参加过跑山赛的，上山 5km，下山 7km，一小时五十分左右跑完。在黄山旅程中，平均 1km 要耗时 1 小时。普通人一定不要犟：走路上山几乎都要三小时以上，没有必要。索道上看风景，视野内很美。&lt;br /&gt;
&lt;br /&gt;
没有任何黑科技，汽车站就挨着高铁站，引导标识清晰明确。你只管买车票：黄山北站汽车站 - 黄山南大门换乘中心汽车站，几乎都是 30 分钟一班，（回程）甚至客满即走，全是正规统一的，可以把索道入口，当旅程的起点。&lt;br /&gt;
&lt;br /&gt;
== 黄山旅游路线攻略 ==&lt;br /&gt;
[[File:黄山旅游路线图.png|1000px]]&lt;br /&gt;
&lt;br /&gt;
以下对路线图逐一讲解。&lt;br /&gt;
&lt;br /&gt;
;- 1，从家里出发，直至黄山云谷索道入口。&lt;br /&gt;
:可以说是垃圾时间，其疲累是为旅程付出的代价。&lt;br /&gt;
&lt;br /&gt;
[[File:黄山 索道后望.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
;- 2，这一段在索道上观景。&lt;br /&gt;
:约 11:57 到达索道入口。云谷索道上行行程约十分钟，视野内超美。像电影镜头。追求鸟类视角，是人类刻在基因里的飞行梦想的表达。&lt;br /&gt;
&lt;br /&gt;
[[File:黄山 美丽女友.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
;- 3，下了索道，走到始信峰。&lt;br /&gt;
:轻微下坡，轻微上坡。视野开阔，与众不同。一目千里的感觉，很开阔心胸。在这里可以大口呼吸，心情在这一刻开始畅快起来。石笋峰附近绝谷对面的高山，有一种很高的等腰三角形，披了无数石片的感觉。石头被风割成一片一片的。望眼是万年的时光。这是我最喜欢的部分之一。很像是和万年前的地理对话，不知当年有多少生物生活在这片山谷，或许当年是海底也未可知，地貌相当神奇，与别处的山完全不一样，令我惊叹。在始信峰，朋友说：哈哈，到始信峰了，是不是该使个性子了。在我们的方言里，使性就是普通话里的“耍小脾气”的意思。始信峰不高，但风景奇佳，能看到远处群山怀抱里的小镇，可能是谭家桥镇。很温柔大气的感觉，大象免成，天利万物而不争。&lt;br /&gt;
&lt;br /&gt;
[[File:黄山 石片.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
[[File:黄山 远方的小镇.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
[[File:黄山 远古地貌.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
;- 7，从始信峰走到猴子观海。&lt;br /&gt;
:其实已经很累了，要吃东西补充体力。轻下坡，微重上坡。5 曙光亭朋友喂了小松鼠。这里确实适合看日出。其实东边的这一溜高峰，都很适合看日出。&lt;br /&gt;
&lt;br /&gt;
;- 9，从猴子观海到北海宾馆附近。&lt;br /&gt;
:9 处有个洗手间，休整一下要爬一段上坡。轻下坡，上洗手间，好好休息一下。黄山上一般的旅游公厕外，都会有 40 度的直饮水，但是要自己带玻璃或不锈钢水杯，第二天我的百岁山喝完后，用塑料瓶子接了一瓶，口感极差，塑料味非常浓。理论上玻璃或不锈钢水杯接来喝，口感应该不错。黄山上的 550 ml 的矿泉水，都是 8 元一瓶。黄山南大门换乘中心上车前，是最后一次能买到 3 元矿泉水的机会。&lt;br /&gt;
&lt;br /&gt;
;- 10，从北海宾馆到西海饭店附近&lt;br /&gt;
:。一段闷热的上坡下坡。没有特色，只有赶路。&lt;br /&gt;
&lt;br /&gt;
;- 11，从西海饭店到排云型旅宾馆。&lt;br /&gt;
:重上坡，累瘫。丹霞峰去看日落，要 20 分钟上山再返回来，因为较日落还早，我们没上丹霞峰。&lt;br /&gt;
&lt;br /&gt;
;- 12，从排云型旅宾馆，到回音壁。&lt;br /&gt;
:非常好玩。晚云丁达尔效应明显，西海大峡谷无比状阔，纯粹的视觉享受。重上坡。回音壁非常好玩，几乎 80% 的人到这里都自动唤醒猿猴模式，开始大喊特喊。什么“奥特曼，加油”“我要考第一”“我想静静了”“王宇飞，回家吃饭了”“啊”“喂”“你好”，都有人喊。非常有趣。这里还能看到西海大峡谷，那风景令人拍案叫绝，言语无法形容那种大自然的美，阳光穿过云层形成丁达尔效应，远处的山群像小猫排排坐，安静的，从容的，瑰丽的，接受阳光的洗礼，云朵在天空悠闲地像在打盹，可可爱爱。这一刻，你像在和大自然对话，心跳同频。&lt;br /&gt;
&lt;br /&gt;
[[File:黄山 西海大峡谷.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
;- 13，从回音壁到飞来石。&lt;br /&gt;
:微下坡，重上坡。这段路有一片高峰上的大石头。躺在上面看蓝天上的轻云加速流过，那种感觉无法形容。那些云，有点像赶着打卡的上班族，跑得很快。迅速流向远方，直到看不清。到这里，普通人的体力消耗，已经接近极限了。&lt;br /&gt;
&lt;br /&gt;
[[File:黄山 轻云.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
[[File:黄山 晚霞.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
[[File:黄山 浓云.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
;- 14，从飞来石到群峰顶。&lt;br /&gt;
:重上坡。许多走不同路线的人会从光明顶赶到群峰顶看日落一群人，排排坐在群峰顶上的一块石头上，望着天边的夕阳、云层，感慨不休。&lt;br /&gt;
&lt;br /&gt;
;- 15，从群峰顶到光明顶。&lt;br /&gt;
:此时天马上要黑了。光明顶是大多数游客的住宿锚点。微上坡。此时天已经黑了，光明顶乌泱泱的人。大家的兴奋劲还没过。&lt;br /&gt;
&lt;br /&gt;
;- 16，从光明顶到白云宾馆。&lt;br /&gt;
:下坡。晚间住宿于此。不要想着上午上黄山、下午下黄山，不可能，除非风景不看了。任何人去黄山，都应该至少留出两天时间观景，想看日出日落，最好的住宿点就是白云宾馆。当然，对有钱人，以及身体不便的老年人和小孩，可以考虑其他几个酒店。&lt;br /&gt;
&lt;br /&gt;
;- 15，从白云宾馆返回光明顶等日出。&lt;br /&gt;
:次日 03:30，大部队开始准备登光明顶占位置看日出。我和朋友也不能免俗，出发。等到 06:30，吹了无尽的妖风，当天雾太大，没看到日出，不过拍了几张朝霞。&lt;br /&gt;
&lt;br /&gt;
;- 17，从光明顶到鳌鱼峰。&lt;br /&gt;
:下坡。这一段，风还很大。此时目标已经是迎客松。&lt;br /&gt;
&lt;br /&gt;
[[File:黄山 地貌.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
;- 20，从鳌鱼峰到一线天，再去莲花洞。&lt;br /&gt;
:上坡，下坡，上坡，下坡。这一段地图有问题。总之，鳌鱼峰看远山，有点好看，能明显看见山风化的痕迹，像绿色沙拉间，洒了可口的白糖。更远处的山群郁郁葱葱，与黄山这种常年大风刮过的山明显不一样，别的山都是被大树覆盖的，黄山会有风凿的各种痕迹。此处鳌鱼洞虽小，但挺有意思的，有种原始森林探秘的氛围，估计是两边的扶手绳太可爱了，而且鳌鱼峰的山景、凉风、蓝天白云，令人心旷神怡。一线天可以说是迷你版的天都峰，适合亲子游玩，值得一试，单向通行，只能上、不能下，所以对从光明顶过来的游客，想玩一线天，就得从鳌鱼峰先下山，再玩一线天，再从鳌鱼峰下山，去莲花洞。&lt;br /&gt;
&lt;br /&gt;
[[File:黄山 盆景地貌.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
;- 21，从鳌鱼峰到莲花洞。&lt;br /&gt;
:下坡。我经过那天，莲花洞有股尿骚味。估计是太远没有旅游厕所，有人在里面不讲素质了。墙壁有疑似硝积淀。必经路，没什么好看的，导游们一致忽悠年轻人去爬莲花亭而自己不去，也就十来分钟的事，不太感兴趣就没去。这段有个百步云梯来着。&lt;br /&gt;
&lt;br /&gt;
;- 22，从莲花洞到莲花峰。&lt;br /&gt;
:上坡。这段有两块石头很有趣，一块很像大哥大，导游们几乎都说“黄山真伟大,自古就有大哥大。”笑死了，很有趣。也有人说它像块梨，或者像竖手指骂人呢。另一块石头，像一只趴睡的大耳朵狗子。莲花峰海拔 1864.8，本也是一个打卡点，但近期在闭关维护中。&lt;br /&gt;
&lt;br /&gt;
;- 24，从莲花峰到迎客松。&lt;br /&gt;
:微上坡。迎客松广场 55 元一份的盖饭，令我印象深刻。迎客松也不如想象中那么惊艳。来看了，也算满足了一种情结。在我想象中，迎客松是长在山崖上，山崖下有路，路人可以在小径上抬头看雄伟的迎客松。实际观感，感觉迎客松没想象中大，也不如画报中精神。主打一个“累”字。估计每天与这么多人合影，迎客松也会累吧。&lt;br /&gt;
&lt;br /&gt;
[[File:黄山 迎客松.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
;- 26，从迎客松开始走路下山。&lt;br /&gt;
:下坡。蒲团石很有意思，能直接看到天都峰攀爬的游客，可以躺石头上望望天空。&lt;br /&gt;
&lt;br /&gt;
;- 27，从蒲团石到立马桥。&lt;br /&gt;
:微上坡，大部分下坡。膝盖痛死了。立马桥附近挺有意思，1939年由几位工匠在简单保护措施之下，从山顶放绳到半空中，耗时半年才完工。下坡这一段，是赏巨石的好地段，大片大片的巨石山。黄山整体给人的感觉异常干净，没有腐败的垃圾，没有塑料袋乱扔，每个垃圾桶都恰到好处又别致，地面比案板还干净的感觉。这或许是黄山风景区管理人员对保洁的高要求、黄山的大风、黄山独特的花岗岩和大理石不易脏、游客的高素质，共同作用的结果。整体卫生环境非常舒适。&lt;br /&gt;
&lt;br /&gt;
[[File:黄山 立马桥.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
;- 28，从立马桥到慈光阁。&lt;br /&gt;
:下坡。与朋友在小溪里泡了会儿脚，溪水冰冷，很难忘，很有趣。&lt;br /&gt;
&lt;br /&gt;
== 黄山旅游住宿攻略 ==&lt;br /&gt;
&lt;br /&gt;
住宿是黄山风景区旅行最大的问题。做攻略前，我见到“黄山旅游官方平台”微信小程序里，2025-07-15 14:58:46 官方发的：《黄山风景区关于开放山顶帐篷租赁服务的公告》，载明：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
尊敬的游客朋友们：&lt;br /&gt;
为丰富您的黄山游览体验，黄山风景区将在清凉夏日自 2025 年 7 月 16 日起，开放山顶指定区域帐篷租赁服务。&lt;br /&gt;
&lt;br /&gt;
现将有关事项公告如下：&lt;br /&gt;
&lt;br /&gt;
一、开放区域与时间&lt;br /&gt;
&lt;br /&gt;
1.开放区域：本次开放的山顶帐篷租赁区域为西海饭店、排云型旅酒店、白云宾馆、玉屏楼宾馆、白鹅山庄核心游览景区 5 个帐篷租赁点。&lt;br /&gt;
&lt;br /&gt;
2.每日时段：帐篷租赁时间为当日下午 18:00 后至次日早上 5:30 前，请游客使用完毕帐篷后完好归还。&lt;br /&gt;
&lt;br /&gt;
二、销售与使用方式&lt;br /&gt;
&lt;br /&gt;
1.销售方式：帐篷租赁服务严格实行线下实名制销售，游客直接前往指定帐篷租赁点问询，随到随订。&lt;br /&gt;
&lt;br /&gt;
2.数量限制：为保障安全和环境容量，各酒店根据天气情况确定开放帐篷数量，线下售满即止，请务必提前规划。&lt;br /&gt;
&lt;br /&gt;
3.费用说明：130 元/顶/晚，每顶帐篷标准宿营人数为 2 人，超 1 人另收费 50 元，每顶帐篷宿营人数最多不得超过 3 人，实行“统一定价、明码标价”，提供规范税务发票，租赁者在酒店登记时需缴纳 300 元/顶押金，租赁结束酒店检查无破损后全额退还。&lt;br /&gt;
&lt;br /&gt;
……&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
看这公告，妥妥地误以为帐篷是景区官方正规管理，18:00 后去不至于租不到帐篷。哪知我去到现场，告知我：租完了。问有房吗，答曰：客满了。问：帐篷一共有多少顶？答曰：70 顶。问几点开始租的，答曰：12 点开租，18:00 办理入住。我嘞个去。&lt;br /&gt;
&lt;br /&gt;
我一查酒店价格，2600 元以上。写这篇游记时我查提前预订的话，白云宾馆价格是 1700 元左右。&lt;br /&gt;
&lt;br /&gt;
急得我满头大汗。这咋整，上山花了一天，没地可住，原路返回下山，根本不现实。&lt;br /&gt;
&lt;br /&gt;
再一查，一公里外有青旅，360 元左右，8 人间或 12 人间，一个床位。把我给气死了。写这篇游记时我查提前预订的话，床位有 180 元 - 255 元的，今天是周二。到山顶再看价格，会让你知道什么叫“残忍”，哈哈。&lt;br /&gt;
&lt;br /&gt;
要不是官方公告的烟雾弹，给我一种山顶帐篷带有公益性质、正规好租的错觉，我绝对会为住宿做好充分的准备。不想住多人床位，可以自带睡袋。不允许自带帐篷，又没说不允许自带睡袋。&lt;br /&gt;
&lt;br /&gt;
但冷静下来，我就不急了。因为我看到大批人没有住处。我心想有保底选择：最差自己找个山石避风处躲一晚；其次宾馆大厅坐一晚也能避寒；最后我不信大把人没住处，黄山风景区管理处不解决。然后我去了搭帐篷的地方，问登记员：没住处怎么解决？答曰：去饭店消费，应该会给一个避风的位置。&lt;br /&gt;
&lt;br /&gt;
最终，去饭店，点了一碗 60 元的肥肠面，一碗 60 元的广式烧腊。吃完给了张消费券，饭店工作人员带着一群人浩浩荡荡去白云宾馆 B1 层一间大房子里，像一间教室，平均一人一张椅子，半张桌子，晚上可以避寒。温度适宜，空气不太新鲜。凑合住到凌晨三点半，与大部队一起，返回上坡登光明顶看日出。&lt;br /&gt;
&lt;br /&gt;
往好里想，那 120 元买到了吃的与避寒资格。吃的还真挺好吃。把人先“骗”上山，也算阴谋了。没上山前告诉你：1700 以上才有宾馆，200 左右只有床位，60 只有桌椅，估计许多人就不来了。再客观想想，山顶平台有限，放一千顶帐篷也不现实，为了营利和持续发展，有此等阴谋也能理解。&lt;br /&gt;
&lt;br /&gt;
再怎么不顺，黄山的风景，值得人爱。&lt;br /&gt;
&lt;br /&gt;
== 黄山旅游费用攻略 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!项目&lt;br /&gt;
!总额&lt;br /&gt;
!份数&lt;br /&gt;
!单价&lt;br /&gt;
!备注&lt;br /&gt;
|-&lt;br /&gt;
|去程车票&lt;br /&gt;
|281&lt;br /&gt;
|2&lt;br /&gt;
|140.5&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|回程车票&lt;br /&gt;
|328&lt;br /&gt;
|2&lt;br /&gt;
|164&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|黄山票务&lt;br /&gt;
|598&lt;br /&gt;
|2&lt;br /&gt;
|299&lt;br /&gt;
|门票190，南门至索道19，索道80，保险10&lt;br /&gt;
|-&lt;br /&gt;
|超市零食&lt;br /&gt;
|106.2&lt;br /&gt;
|1&lt;br /&gt;
|106.2&lt;br /&gt;
|牛肉、牛筋、酱鸭&lt;br /&gt;
|-&lt;br /&gt;
|来优品零食&lt;br /&gt;
|74.99&lt;br /&gt;
|1&lt;br /&gt;
|74.99&lt;br /&gt;
|各类小零食&lt;br /&gt;
|-&lt;br /&gt;
|水煎包&lt;br /&gt;
|10&lt;br /&gt;
|2&lt;br /&gt;
|5&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|去程打车&lt;br /&gt;
|21.7&lt;br /&gt;
|1&lt;br /&gt;
|21.7&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|黄山北 - 南大门&lt;br /&gt;
|60&lt;br /&gt;
|2&lt;br /&gt;
|30&lt;br /&gt;
|座位号 13 14&lt;br /&gt;
|-&lt;br /&gt;
|矿泉水&lt;br /&gt;
|12&lt;br /&gt;
|4&lt;br /&gt;
|3&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|山顶吃饭&lt;br /&gt;
|120&lt;br /&gt;
|2&lt;br /&gt;
|60&lt;br /&gt;
|肥肠小面，广式烧腊&lt;br /&gt;
|-&lt;br /&gt;
|山顶烤肠&lt;br /&gt;
|20&lt;br /&gt;
|2&lt;br /&gt;
|10&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|帐篷处矿泉水&lt;br /&gt;
|8&lt;br /&gt;
|1&lt;br /&gt;
|8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|迎客广场矿泉水&lt;br /&gt;
|8&lt;br /&gt;
|1&lt;br /&gt;
|8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|下山矿泉水&lt;br /&gt;
|16&lt;br /&gt;
|2&lt;br /&gt;
|8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|下山包子&lt;br /&gt;
|16&lt;br /&gt;
|2&lt;br /&gt;
|8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|慈光阁 - 黄山北&lt;br /&gt;
|98&lt;br /&gt;
|2&lt;br /&gt;
|49&lt;br /&gt;
|发车时间 5:20 pm&lt;br /&gt;
|-&lt;br /&gt;
|下山吃饭&lt;br /&gt;
|111&lt;br /&gt;
|2&lt;br /&gt;
|55.5&lt;br /&gt;
|汪丫鱼，煎豆腐，丝瓜汤，矿泉水&lt;br /&gt;
|-&lt;br /&gt;
|回程打车&lt;br /&gt;
|23.95&lt;br /&gt;
|1&lt;br /&gt;
|23.95&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|共计&lt;br /&gt;
|1912.8&lt;br /&gt;
|2&lt;br /&gt;
|956.42&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
黄山上矿泉水 8 元一瓶，烤肠 10 元一根，盖浇饭 55 元一份，自助餐 160 元一位。建议自备自热小火锅，在山上接点水就能加热吃饱。带好自己的不锈钢或玻璃水杯，能接到免费的 40 摄氏度的直饮水；用矿泉水瓶接热水口感极差。另外，带一把好雨伞非常有用，凌晨四五点等日出时，雨伞可以扛住山顶的妖风。如果能带个防风救生毯，也挺好的；带棉袄、羽绒服的话，性价比不高，没那么冷，但背着很重。我就一件长袖衬衫，加朋友的雨伞，就扛下来了。越热的天，越适合去黄山，等日出时不冷。而且，山上温度比山下，冷 8 摄氏度左右，总之 7 月份 8 月份无雨的天气去，很值得。&lt;br /&gt;
&lt;br /&gt;
== 黄山旅游深刻记忆 ==&lt;br /&gt;
# 最值得看的：始信峰一带的远古地貌；回音壁俯瞰西海大峡谷；飞来石附近大石头躺着时天空的云朵&lt;br /&gt;
# 最觉遗憾的：没注意到天都峰预约时间。去之前，不太想爬；去之后现场看见，还挺想爬的&lt;br /&gt;
# 最该避免的：没带睡袋；没带自热米饭；没带水杯；没坐索道下山&lt;br /&gt;
# 最觉有趣的：朋友在蒲团石小憩了 30 分钟，对面就是天都峰鲤鱼背。引发了许多人跟风上蒲团石&lt;br /&gt;
# 最有用Tips：光明顶小商店左侧（大约是西南角）有个避风岗亭，是过夜避寒、凌晨避风的绝佳位置&lt;br /&gt;
# 最想尝试的：下山去西海大峡谷，再坐小火车上山。因为远观西海大峡谷实在美丽。当时时间与体力不允许了&lt;br /&gt;
&lt;br /&gt;
总共耗时，周六 05:50 起床开始，周日 22:50 左右到家，中途除了交通，都在黄山观景，所以两天时间安排是比较紧凑的。&lt;br /&gt;
&lt;br /&gt;
为什么说是“黄山游记，爱而不易”呢？山顶住宿、餐食的昂贵，对普通人，不“容易”；连接两天不间断的跋涉，平均 1 km 要花费 1 小时，殊为“不易”；然而，尽管有种种不快，黄山恢宏、别致的，仿若远古盆景般的，大气磅礡、气吞山河、流云如诗的景色，值得一看，对其喜爱，不会变易。&lt;br /&gt;
&lt;br /&gt;
[[File:黄山 天都峰.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
== 重新评判 ==&lt;br /&gt;
过了几周，重新评判，当真“五岳归来不看山，黄山归来不看岳”？&lt;br /&gt;
&lt;br /&gt;
这句诗还是有较大宣传成分在的。黄山的奇松、怪石、云海、温泉、冬雪：&lt;br /&gt;
* 松奇在枝干基本被风刮得横着生长，而别处的松枝干缓向上的比较多。迎客松没想象中的飞扬神彩，像营业累了；&lt;br /&gt;
* 石怪在类形的石头比较多，什么猴子观海、小灵通石、鳌鱼峰等，确实好看；&lt;br /&gt;
* 云海也确实算是奇观，日出日落也比较令人喜欢，但并不是别处见不到的；&lt;br /&gt;
* 黄山的水很冰，至少近几年我认为是不存在真地热温泉的；&lt;br /&gt;
* 冬雪估计是黄山最令人震惊的景色。&lt;br /&gt;
&lt;br /&gt;
[[File:黄山 奇松怪石.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
不同的山，有不同的美。我更喜欢我老家那种，人深入生活于其中的亲肤的山。黄山这种干净、奇异的山，也极具特色。作为一个景点，黄山的景区建造、游览服务，超过一流水准。&lt;br /&gt;
&lt;br /&gt;
最美的黄山，存在于没去过之前的想象中。&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=%E4%B8%8A%E4%B8%AA%E6%9C%88%E6%88%91%E5%B9%B2%E4%BA%86%E4%BB%80%E4%B9%88_2026&amp;diff=11545</id>
		<title>上个月我干了什么 2026</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=%E4%B8%8A%E4%B8%AA%E6%9C%88%E6%88%91%E5%B9%B2%E4%BA%86%E4%BB%80%E4%B9%88_2026&amp;diff=11545"/>
		<updated>2026-07-22T14:10:03Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: /* 202607 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;向前看。&lt;br /&gt;
__TOC__&lt;br /&gt;
== 202601 ==&lt;br /&gt;
# 头发变茂密了，发型变帅了&lt;br /&gt;
# 隐约感到肌肉在长了&lt;br /&gt;
# 现在又掌握倒立了&lt;br /&gt;
# 写了份非常有逻辑的代理词&lt;br /&gt;
# 洗了鞋子&lt;br /&gt;
# 拖了地&lt;br /&gt;
# 电脑屏幕老死了，换了个新的，挑到了不错的屏幕&lt;br /&gt;
# 网站流量用超，关站了一天。感觉不太正常，按说我的网站的用户数，不至于能用完这么多流量。找机会排查看是否有人盗刷&lt;br /&gt;
# 看完了《怪奇物语》第四季、第五季&lt;br /&gt;
# 排查出保洁阿姨出现时的巨大损伤型恶臭，是公司的超簿垃圾袋释放的，于是和她商量不用再给我换垃圾袋，自己买了不臭的自己换，一下子拿回了属于自己的时间、专注和健康&lt;br /&gt;
# 封禁了恶意 ip，拯救了我的流量费。[[怎样封禁恶意_ip，避免服务器产生巨额流量费]]&lt;br /&gt;
# 在看《毛骗》团队的新片《[https://qingliezhiquan.com/blog/%E6%B5%B7%E5%B8%82%E8%9C%83%E6%A5%BC%EF%BC%9A%E5%8F%A4%E8%A3%85%E7%BB%8F%E5%85%B8 海市蜃楼]》。“海市蜃楼”多美好的词！快意江湖，难得的江湖气，前三集很有感觉，不过有点像《王国》，后边别被我发现是模仿《王国》。笑死了，有个傻傻的，叫曾信（“真信”）；有个拽拽的，叫曾倩（“真欠”）&lt;br /&gt;
# 徒步了科学岛 3.43 公里，它并不是湖心岛，是半岛，北面与陆地相连。参观了科技馆&lt;br /&gt;
# 买了万用表，研究修电器&lt;br /&gt;
# 买了温湿度计，营造合适室内环境&lt;br /&gt;
# 买了瑜珈垫，在小屋腾出健身场所了&lt;br /&gt;
# 买了腰靠，座椅舒服很重要&lt;br /&gt;
# 买了体重称。长胖这么多还不自觉，必须减重了&lt;br /&gt;
# 写了篇 [[怎样高效地拿回报销款]]&lt;br /&gt;
# 今天四次倒立，之后差点摔了，又做了一次倒立。其实根本不怕摔，只要有预期，快摔时正确卸力，迅速起身把歪坠的惯性，转移成起身的力，就没事了&lt;br /&gt;
# 今年不感觉冷，可能和我穿衣有关：内层聚酯纤维短袖，二层纯棉长袖，三层无袖宽松毛衣，最外加厚皮衣。四层穿搭一点不冷。有时一件 T 恤，二层一件长袖，外加一件棉服大衣，也不冷。下雪天也不冷。可能健身有点效果了&lt;br /&gt;
# 精研了父母的体检报告，并提出了下一步执行策略&lt;br /&gt;
# 写了篇 [[怎样养护头发]]&lt;br /&gt;
# 写了篇 [[电脑屏幕坏了，怎么挑选优质的屏幕]]&lt;br /&gt;
# 有一种对 1 月完结的恐慌。三十未立，事业无成，未来该走哪条路……&lt;br /&gt;
&lt;br /&gt;
== 202602 ==&lt;br /&gt;
# 去了浮槎山，徒步 10.84 公里&lt;br /&gt;
# 惊觉父亲老了，没以前那么犟了&lt;br /&gt;
# 发现立春前后，天光大亮，春天已至，倒春寒要命&lt;br /&gt;
# 和隔壁大吵一架，现在她们弄脏洗手间地面终于知道顺手拖干净了&lt;br /&gt;
# 看了电影《黑鹰坠落》。反战片，没啥感觉。现代战争比剧中高效万倍，黑鹰不会坠落了&lt;br /&gt;
# 看了电影《大逃杀》。日本批着纯爱外衣的变态片。杀着是过瘾，没啥内涵&lt;br /&gt;
# 看完了古装剧《海市蜃楼》。越看越没劲。能搬山移海的外星人却没有智商&lt;br /&gt;
# 把律师的锅甩回去了，他给错了账号，让他自己去变更&lt;br /&gt;
# 主动屏蔽了所有文字媒体、视频媒体，至于社交媒体我压根儿就没有用过&lt;br /&gt;
# 写了篇 [[论躺平与负债]]&lt;br /&gt;
# 写了篇 [[创业是道数学题]]&lt;br /&gt;
# 写了篇 [[办理护照和港澳通行证的经验]]&lt;br /&gt;
# 第一次尝试戴隐形眼镜，tmd，试了十几次，几个小时，恁是戴不进去&lt;br /&gt;
# 看了电影《逃狱惊魂》，非常经典，每个角色都有真实的欲望，动力十足&lt;br /&gt;
# 看了邓紫棋的科幻新书《启示路》。完全超出预期。fashion，浪漫，有趣，略拧巴。邓紫棋比想象中有才一百倍&lt;br /&gt;
# 写了篇 [[怎样用 Calibre 调整 EPUB 的格式使之完美阅读]]&lt;br /&gt;
# 又到了听《天空的颜色》的时候了&lt;br /&gt;
# 通过最正规的渠道，开通了低手续费股票账户，为开港股账户做足了准备&lt;br /&gt;
# 看了电影《出租车司机》美版、韩版&lt;br /&gt;
# 写了篇 [[过年随记]]&lt;br /&gt;
# 例行串串已吃&lt;br /&gt;
# 例行米线已吃 1/2&lt;br /&gt;
# 例行面馆已吃&lt;br /&gt;
# 例行米线已吃 2/2&lt;br /&gt;
# 例行登山徒步 8.32 公里&lt;br /&gt;
# 第一次买了只股票&lt;br /&gt;
# 徒步 11.25 公里&lt;br /&gt;
# 徒步缙云山 7.10 公里&lt;br /&gt;
# 徒步胜天湖 9.02 公里&lt;br /&gt;
&lt;br /&gt;
== 202603 ==&lt;br /&gt;
# 考察了梁平，竟然搞西部预制菜之都，一票否决。双桂湖公园南边的山倒还挺美的&lt;br /&gt;
# 在万州考察，因为买不到返肥火车票，焦头烂额。忘记了撞上学生开学高峰期&lt;br /&gt;
# 万州太窄了。一条主干道通全城的感觉。一种施展不开的感觉。五六根冲天柱，晚上九点多，不知在排放什么烟气，不像是好东西&lt;br /&gt;
# 打网约车旅游了万州之巅，然后急行军到了万州北站高铁站，去了奉节&lt;br /&gt;
# 从奉节坐小红船沿江往巫山走，此时正在船上，水汽扑来。坐了 4 小时&lt;br /&gt;
# 吃了巫山烤鱼&lt;br /&gt;
# 早上 06:00 起床，赶回奉节，参加徒步三峡之巅挑战赛，8.31 公里 2 小时 37 分 51 秒登顶，成功拿到奖牌。去得晚，日第 62 位登顶。日竞速第 16 名。月竞速第 25 名&lt;br /&gt;
# [[File:徒步三峡之巅8.31公里.jpg|100px]][[File:徒步三峡之巅成功领奖.jpg|100px]]&lt;br /&gt;
# 晚上 18:57 夜爬巫山三峡龙脊，乌压压的山上只有我一人，徒步 4.32 公里。下山打车难，结果五分钟内来了一对情侣和他们的弟弟妹妹来夜爬终点看风景，免费把我带到山下了。姓柳&lt;br /&gt;
# 发现眼袋重和眼镜重关系不大。最主要是因为长年睡到八点起，憋尿导致的。若六七点就尿干净，一点眼袋都没了&lt;br /&gt;
# 考察了利川，感觉皱巴巴的，不如奉节、巫山那种干净、舒展的感觉&lt;br /&gt;
# 看了电影《猜火车》，垃圾，毫无内涵，披个青春片的皮，搞宣毒&lt;br /&gt;
# 写了篇 [[渝东游记：地理奇迹，人文情怀]]&lt;br /&gt;
# 把行李箱洗了。它跟了我这么多年了，不忍它脏兮兮的，或许只是我在乎它干净与否。它应该不能水洗，但我还是把它洗干净了。扛过去，它就能再干净几年。扛不过去，就是它的宿命&lt;br /&gt;
# 看了李小龙的电影《龙争虎斗》，李小龙的努力，超出了“信仰”的范畴了&lt;br /&gt;
# 带着行李箱在公园晒了几小时太阳，主要是为了晒干行李箱&lt;br /&gt;
# 研究出了把本站内容发布到微信公众号的较为自动化的方法&lt;br /&gt;
# 看了电影《聚焦》，三流叙事&lt;br /&gt;
# 洗干净所有厨具，规整了厨房，做了 2026 出租屋第一餐&lt;br /&gt;
# [[File:2026 出租屋第一餐.jpg|200px]]&lt;br /&gt;
# 周五宜吃排骨炖冬笋&lt;br /&gt;
# [[File:周五宜吃排骨炖冬笋.jpg|200px]]&lt;br /&gt;
# 看了电影《德州电锯杀人狂》，一群疯子&lt;br /&gt;
# 前几天本站搜索崩了，因为内存不够用。给服务器加了 Swap 空间，内存能支撑更大的负载了。搜索功能恢复&lt;br /&gt;
# 看了电影《千钧一发》，什么人能写出这种优秀的剧本。不遗余力&lt;br /&gt;
# 买了电饭煲、煮蛋器、洗袜机、体态矫正带、公园露营椅、螺蛳粉&lt;br /&gt;
# 徒步紫蓬山 6 公里。去之前以为它很高，很壮观。刚出发时，查了下地图，就知道它爬升只有 200 米。都没喘下气，刚热个身已经爬完了&lt;br /&gt;
# [[File:红烧猪蹄.jpg|200px]]&lt;br /&gt;
# 做了 10 个俯卧撑。惭愧，20 多岁时轻轻松松，30 多岁时人好像变重了一样，好在又找回感觉了&lt;br /&gt;
# 又做了 10 个俯卧撑，感觉真好&lt;br /&gt;
# 网站遭受攻击，下一轮防攻击策略开始实施。网友里面有坏人呐&lt;br /&gt;
# 护照和港澳通行证终于到手了&lt;br /&gt;
# 买了块新的 27 英寸显示器&lt;br /&gt;
# 做了 35 个俯卧撑，手掌开始有力量了。惯例倒立四次&lt;br /&gt;
# [[File:世界上有千千万万碗面.jpg|200px]]&lt;br /&gt;
# 看完了《绝命律师》第一季&lt;br /&gt;
&lt;br /&gt;
== 202604 ==&lt;br /&gt;
# 笑死了，网站防爆破期间，阈值写得低，经常把自己挡在网站之外封一天。赶紧把自己加进白名单&lt;br /&gt;
# 成功搞定一个困扰一周的难题，[https://qingliezhiquan.com/blog/%E4%B8%80%E6%AC%A1_Anki_%E7%99%BB%E5%BD%95%E4%B8%8D%E4%B8%8A%E7%9A%84%E6%89%BE_bug_%E7%BB%8F%E5%8E%86 找 bug 过程]堪称经典&lt;br /&gt;
# 发现自己某些方面还挺厉害的&lt;br /&gt;
# 我代理的一个案子，对方脆败。他的毛病在于，同样的事，重复了三遍，大段大段的用 AI 写的，书记员和法官根本不可能看明白他在表达啥。打官司重在证据清晰明确、语言简明扼要，不然起诉状或答辩状白写了&lt;br /&gt;
# 看完了《绝命律师》第二季。Jimmy 阴了他哥一把，他哥也阴了他一把。Jimmy 与 Kim 共享办公室，开始独立执业。被偏爱的 Jimmy，成佛只需放下屠刀&lt;br /&gt;
# 买了个高压锅（苏泊尔京东自营旗舰店，底直径 24 厘米，7.0L，食品级 304 不锈钢材质）。上气后 28 分钟，就把 2.9 kg 肘子炖到软烂脱骨，骨头都可以轻松嚼碎。解决了切肉洗菜板的麻烦。2.9 kg 太多了，下次控制在 2 kg 以内，上气后 20 分钟炖足够了&lt;br /&gt;
# 炖了一只三黄鸡、两斤鸡爪、两个鸡边腿、一斤鲜板栗。上气后 12 分钟就软烂脱骨了。下次炖鸡 10 分钟足够了&lt;br /&gt;
# 处理去香港玩的所有 [https://qingliezhiquan.com/blog/%E9%A6%99%E6%B8%AF%E6%B8%B8%E8%AE%B0%EF%BC%9A%E5%96%9C%E5%B8%96%E8%A1%97#%E9%80%9A%E7%94%A8%E5%87%86%E5%A4%87 预备事项]，好一通忙碌。所有事情从结果看很简单，到达结果的过程中，需要许多比对时间&lt;br /&gt;
# 买了一双皮鞋，不易起皱，但皮革太次了，放了一周多，还有严重刺鼻劣质塑料味或甲醛味，这 159.6 元白花了。我打算扔掉，钱没有命重要。而且这种劣质塑料，易变形。鞋底比鞋面大了一圈，像踩了个盘子在脚下，以后选款式时避雷。我讨厌这双鞋到什么程度呢？打算晚上丢掉，现在左边鞋带松了一根，我都懒得系一下&lt;br /&gt;
# 买了一件公务式的休闲衣，挺板正，像个程序员了&lt;br /&gt;
# 买了一套扫把，扔掉了房间里旧的脏扫把。时时打扫地面的小渣渣很有必要，而这种易影响氛围的小事，要做得舒服，干净的扫把很有必要&lt;br /&gt;
# 买了 50 厘米宽衣架，保护衣服的肩线&lt;br /&gt;
# 把冬天的衣服全收进行李箱，放到衣柜顶上了，衣柜空出大面积，变得比较整齐&lt;br /&gt;
# 买了套引体向上设备，艰难进阶中&lt;br /&gt;
# 全面规整了我的 Emacs 配置，学会了一个简单的事：如果靠代码要 100 行，靠人只要 4 行，那就别搞什么自动化了，就靠人算了&lt;br /&gt;
&lt;br /&gt;
== 202605 ==&lt;br /&gt;
# 1 kg 排骨，1.5 kg 蹄膀，1.5 kg 白萝卜，一起炖一大锅，出锅三大盘、四中碗、三小碗，足够佐餐十次。食材才 61.5 元。淘洗花了不到 20 分钟，炒制花了不到 15 分钟，高压锅炖了 10 分钟左右，上气后再炖 10 分钟，就放着等开锅了&lt;br /&gt;
# 天气开始炎热，晚上回家都得开空调了&lt;br /&gt;
# 帮朋友干了一个项目，当作感谢&lt;br /&gt;
&lt;br /&gt;
== 202606 ==&lt;br /&gt;
# 处于焦虑之中&lt;br /&gt;
# 二刷浮槎山，不累。体质真的强了很多&lt;br /&gt;
# 爬了蜀山。很多年前我第一次爬的时候，客观上用了 1.5 小时，体感有 3 小时，感觉路漫长没有边际。这次走同样的路，最多只有某个 5 分钟的陡坡接电话时喘了下，其他的 15 分钟不到就毫无压力地到顶点了，非常轻松&lt;br /&gt;
# 常做俯卧撑，胸肌显现。头发留长了。颜值有了巨大提升&lt;br /&gt;
# 成功学会佩戴隐形眼镜&lt;br /&gt;
# 成功实现 15 个标准俯卧撑 + 3 个硬拉引体向上&lt;br /&gt;
# 成功购买 Apple GiftCard&lt;br /&gt;
# 拖了地&lt;br /&gt;
# 发现一家好吃的盖浇饭店&lt;br /&gt;
# 发现一家好吃的烤串店&lt;br /&gt;
# 去学林公园天养了一天，翻了很多次跟头，全靠左肩摔，也不疼，克服了恐惧，有望学会后空翻&lt;br /&gt;
# 成功实现 30 个标准俯卧撑 + 6 个硬拉引体向上&lt;br /&gt;
# 看了电影《新世界》，模仿《无间道》，超越《无间道》&lt;br /&gt;
# 看了电影《大空头》，简而言之：银行放房贷给普通人，银行把债权打包组合后出卖，层层包装组合，全世界银行都持有大量次贷。由于通货膨胀、物价上涨、审核不严，贷款违约的人越来越多，建立在虚空信用上的贷款面临崩塌，而最先发现的人，与银行对赌购买下跌期权。等贷款违约的人数达到临界点，大量银行破产，下跌期权赢了。最先做空的人，把认知变成了巨额财富&lt;br /&gt;
&lt;br /&gt;
== 202607 ==&lt;br /&gt;
# 我写的一个答辩状，获得了完胜。对方要 156827.49 元。法院判了 2880 元。拿着我写的答辩状去开庭的法人，表示完胜非常爽&lt;br /&gt;
# 成功实现 40 个标准俯卧撑 + 7 个硬拉引体向上&lt;br /&gt;
# 成功实现 60 个标准俯卧撑&lt;br /&gt;
# 围棋 9 路已经杀到 2 级；19 路已经杀到 8 级&lt;br /&gt;
# 开始研究 [https://qingliezhiquan.com/blog/%E4%BE%BF%E6%8D%B7%E6%9F%A5%E6%89%BE#%E6%8A%95%E8%B5%84 投资]&lt;br /&gt;
# 初次入市，除了京东方赚了点，其余全部大跌&lt;br /&gt;
# 完成了五月心愿，桌面收纳整洁了，一下氛围不一样了&lt;br /&gt;
# 戴隐形眼镜已经有 90% 的成功率&lt;br /&gt;
# 彻底理解了 elisp 里的递归，理解并应用了 Emacs 里 load-path 的递归，有了成熟的 Emacs 配置，可以确保无侵入式尝新&lt;br /&gt;
# 彻底理解了 ipset 是集合名单，iptables 可以按集合名单干活。netfilter-persistent 使规则永久化&lt;br /&gt;
# 胃被折腾得不好，首先是受凉，其次是经常连续三顿吃同样的食物，最后是经常吃食材不新鲜的饭店。自己做饭必须重视起来了&lt;br /&gt;
# 每天已能比较轻松的完成 60 个标准俯卧撑 + 90 秒倒立&lt;br /&gt;
# 使用 ChatGPT 5.6 Sol Extra High，把《GNU Emacs Lisp Reference Manual》《GNU Emacs Manual》《Specialized Emacs Features》《The Little Schemer》《The King James Version of the Bible》这五本书里的所有单词，制作成了 Anki 词卡：&amp;lt;b&amp;gt;TEBC11276en20260716.txt&amp;lt;/b&amp;gt;。有可能是当前世界上最棒的英汉词卡。Emacs 和 Lisp 负责技术上掌握世界，圣经负责玄学上理解世界，我准备靠这些单词学通英语&lt;br /&gt;
## T 代表选编者&lt;br /&gt;
## E 代表 Emacs 和 Elisp&lt;br /&gt;
## B 代表 Bible&lt;br /&gt;
## C 代表 ChatGPT&lt;br /&gt;
## 11276 代表词头数&lt;br /&gt;
## en 代表英文&lt;br /&gt;
## 20260716 代表完结日期&lt;br /&gt;
# 下班到家后，倾向于把手机用自律盒锁起来。必须戒断短视频和流媒体了&lt;br /&gt;
# 彻底了结一件事&lt;br /&gt;
# 网站卡成一团糟，果断把某网段封了 20 天，效果立竿见影。常规过于频繁访问我网站的 IP，也改为封 3 天&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=%E4%B8%8A%E4%B8%AA%E6%9C%88%E6%88%91%E5%B9%B2%E4%BA%86%E4%BB%80%E4%B9%88_2026&amp;diff=11544</id>
		<title>上个月我干了什么 2026</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=%E4%B8%8A%E4%B8%AA%E6%9C%88%E6%88%91%E5%B9%B2%E4%BA%86%E4%BB%80%E4%B9%88_2026&amp;diff=11544"/>
		<updated>2026-07-22T14:04:18Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: /* 202607 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;向前看。&lt;br /&gt;
__TOC__&lt;br /&gt;
== 202601 ==&lt;br /&gt;
# 头发变茂密了，发型变帅了&lt;br /&gt;
# 隐约感到肌肉在长了&lt;br /&gt;
# 现在又掌握倒立了&lt;br /&gt;
# 写了份非常有逻辑的代理词&lt;br /&gt;
# 洗了鞋子&lt;br /&gt;
# 拖了地&lt;br /&gt;
# 电脑屏幕老死了，换了个新的，挑到了不错的屏幕&lt;br /&gt;
# 网站流量用超，关站了一天。感觉不太正常，按说我的网站的用户数，不至于能用完这么多流量。找机会排查看是否有人盗刷&lt;br /&gt;
# 看完了《怪奇物语》第四季、第五季&lt;br /&gt;
# 排查出保洁阿姨出现时的巨大损伤型恶臭，是公司的超簿垃圾袋释放的，于是和她商量不用再给我换垃圾袋，自己买了不臭的自己换，一下子拿回了属于自己的时间、专注和健康&lt;br /&gt;
# 封禁了恶意 ip，拯救了我的流量费。[[怎样封禁恶意_ip，避免服务器产生巨额流量费]]&lt;br /&gt;
# 在看《毛骗》团队的新片《[https://qingliezhiquan.com/blog/%E6%B5%B7%E5%B8%82%E8%9C%83%E6%A5%BC%EF%BC%9A%E5%8F%A4%E8%A3%85%E7%BB%8F%E5%85%B8 海市蜃楼]》。“海市蜃楼”多美好的词！快意江湖，难得的江湖气，前三集很有感觉，不过有点像《王国》，后边别被我发现是模仿《王国》。笑死了，有个傻傻的，叫曾信（“真信”）；有个拽拽的，叫曾倩（“真欠”）&lt;br /&gt;
# 徒步了科学岛 3.43 公里，它并不是湖心岛，是半岛，北面与陆地相连。参观了科技馆&lt;br /&gt;
# 买了万用表，研究修电器&lt;br /&gt;
# 买了温湿度计，营造合适室内环境&lt;br /&gt;
# 买了瑜珈垫，在小屋腾出健身场所了&lt;br /&gt;
# 买了腰靠，座椅舒服很重要&lt;br /&gt;
# 买了体重称。长胖这么多还不自觉，必须减重了&lt;br /&gt;
# 写了篇 [[怎样高效地拿回报销款]]&lt;br /&gt;
# 今天四次倒立，之后差点摔了，又做了一次倒立。其实根本不怕摔，只要有预期，快摔时正确卸力，迅速起身把歪坠的惯性，转移成起身的力，就没事了&lt;br /&gt;
# 今年不感觉冷，可能和我穿衣有关：内层聚酯纤维短袖，二层纯棉长袖，三层无袖宽松毛衣，最外加厚皮衣。四层穿搭一点不冷。有时一件 T 恤，二层一件长袖，外加一件棉服大衣，也不冷。下雪天也不冷。可能健身有点效果了&lt;br /&gt;
# 精研了父母的体检报告，并提出了下一步执行策略&lt;br /&gt;
# 写了篇 [[怎样养护头发]]&lt;br /&gt;
# 写了篇 [[电脑屏幕坏了，怎么挑选优质的屏幕]]&lt;br /&gt;
# 有一种对 1 月完结的恐慌。三十未立，事业无成，未来该走哪条路……&lt;br /&gt;
&lt;br /&gt;
== 202602 ==&lt;br /&gt;
# 去了浮槎山，徒步 10.84 公里&lt;br /&gt;
# 惊觉父亲老了，没以前那么犟了&lt;br /&gt;
# 发现立春前后，天光大亮，春天已至，倒春寒要命&lt;br /&gt;
# 和隔壁大吵一架，现在她们弄脏洗手间地面终于知道顺手拖干净了&lt;br /&gt;
# 看了电影《黑鹰坠落》。反战片，没啥感觉。现代战争比剧中高效万倍，黑鹰不会坠落了&lt;br /&gt;
# 看了电影《大逃杀》。日本批着纯爱外衣的变态片。杀着是过瘾，没啥内涵&lt;br /&gt;
# 看完了古装剧《海市蜃楼》。越看越没劲。能搬山移海的外星人却没有智商&lt;br /&gt;
# 把律师的锅甩回去了，他给错了账号，让他自己去变更&lt;br /&gt;
# 主动屏蔽了所有文字媒体、视频媒体，至于社交媒体我压根儿就没有用过&lt;br /&gt;
# 写了篇 [[论躺平与负债]]&lt;br /&gt;
# 写了篇 [[创业是道数学题]]&lt;br /&gt;
# 写了篇 [[办理护照和港澳通行证的经验]]&lt;br /&gt;
# 第一次尝试戴隐形眼镜，tmd，试了十几次，几个小时，恁是戴不进去&lt;br /&gt;
# 看了电影《逃狱惊魂》，非常经典，每个角色都有真实的欲望，动力十足&lt;br /&gt;
# 看了邓紫棋的科幻新书《启示路》。完全超出预期。fashion，浪漫，有趣，略拧巴。邓紫棋比想象中有才一百倍&lt;br /&gt;
# 写了篇 [[怎样用 Calibre 调整 EPUB 的格式使之完美阅读]]&lt;br /&gt;
# 又到了听《天空的颜色》的时候了&lt;br /&gt;
# 通过最正规的渠道，开通了低手续费股票账户，为开港股账户做足了准备&lt;br /&gt;
# 看了电影《出租车司机》美版、韩版&lt;br /&gt;
# 写了篇 [[过年随记]]&lt;br /&gt;
# 例行串串已吃&lt;br /&gt;
# 例行米线已吃 1/2&lt;br /&gt;
# 例行面馆已吃&lt;br /&gt;
# 例行米线已吃 2/2&lt;br /&gt;
# 例行登山徒步 8.32 公里&lt;br /&gt;
# 第一次买了只股票&lt;br /&gt;
# 徒步 11.25 公里&lt;br /&gt;
# 徒步缙云山 7.10 公里&lt;br /&gt;
# 徒步胜天湖 9.02 公里&lt;br /&gt;
&lt;br /&gt;
== 202603 ==&lt;br /&gt;
# 考察了梁平，竟然搞西部预制菜之都，一票否决。双桂湖公园南边的山倒还挺美的&lt;br /&gt;
# 在万州考察，因为买不到返肥火车票，焦头烂额。忘记了撞上学生开学高峰期&lt;br /&gt;
# 万州太窄了。一条主干道通全城的感觉。一种施展不开的感觉。五六根冲天柱，晚上九点多，不知在排放什么烟气，不像是好东西&lt;br /&gt;
# 打网约车旅游了万州之巅，然后急行军到了万州北站高铁站，去了奉节&lt;br /&gt;
# 从奉节坐小红船沿江往巫山走，此时正在船上，水汽扑来。坐了 4 小时&lt;br /&gt;
# 吃了巫山烤鱼&lt;br /&gt;
# 早上 06:00 起床，赶回奉节，参加徒步三峡之巅挑战赛，8.31 公里 2 小时 37 分 51 秒登顶，成功拿到奖牌。去得晚，日第 62 位登顶。日竞速第 16 名。月竞速第 25 名&lt;br /&gt;
# [[File:徒步三峡之巅8.31公里.jpg|100px]][[File:徒步三峡之巅成功领奖.jpg|100px]]&lt;br /&gt;
# 晚上 18:57 夜爬巫山三峡龙脊，乌压压的山上只有我一人，徒步 4.32 公里。下山打车难，结果五分钟内来了一对情侣和他们的弟弟妹妹来夜爬终点看风景，免费把我带到山下了。姓柳&lt;br /&gt;
# 发现眼袋重和眼镜重关系不大。最主要是因为长年睡到八点起，憋尿导致的。若六七点就尿干净，一点眼袋都没了&lt;br /&gt;
# 考察了利川，感觉皱巴巴的，不如奉节、巫山那种干净、舒展的感觉&lt;br /&gt;
# 看了电影《猜火车》，垃圾，毫无内涵，披个青春片的皮，搞宣毒&lt;br /&gt;
# 写了篇 [[渝东游记：地理奇迹，人文情怀]]&lt;br /&gt;
# 把行李箱洗了。它跟了我这么多年了，不忍它脏兮兮的，或许只是我在乎它干净与否。它应该不能水洗，但我还是把它洗干净了。扛过去，它就能再干净几年。扛不过去，就是它的宿命&lt;br /&gt;
# 看了李小龙的电影《龙争虎斗》，李小龙的努力，超出了“信仰”的范畴了&lt;br /&gt;
# 带着行李箱在公园晒了几小时太阳，主要是为了晒干行李箱&lt;br /&gt;
# 研究出了把本站内容发布到微信公众号的较为自动化的方法&lt;br /&gt;
# 看了电影《聚焦》，三流叙事&lt;br /&gt;
# 洗干净所有厨具，规整了厨房，做了 2026 出租屋第一餐&lt;br /&gt;
# [[File:2026 出租屋第一餐.jpg|200px]]&lt;br /&gt;
# 周五宜吃排骨炖冬笋&lt;br /&gt;
# [[File:周五宜吃排骨炖冬笋.jpg|200px]]&lt;br /&gt;
# 看了电影《德州电锯杀人狂》，一群疯子&lt;br /&gt;
# 前几天本站搜索崩了，因为内存不够用。给服务器加了 Swap 空间，内存能支撑更大的负载了。搜索功能恢复&lt;br /&gt;
# 看了电影《千钧一发》，什么人能写出这种优秀的剧本。不遗余力&lt;br /&gt;
# 买了电饭煲、煮蛋器、洗袜机、体态矫正带、公园露营椅、螺蛳粉&lt;br /&gt;
# 徒步紫蓬山 6 公里。去之前以为它很高，很壮观。刚出发时，查了下地图，就知道它爬升只有 200 米。都没喘下气，刚热个身已经爬完了&lt;br /&gt;
# [[File:红烧猪蹄.jpg|200px]]&lt;br /&gt;
# 做了 10 个俯卧撑。惭愧，20 多岁时轻轻松松，30 多岁时人好像变重了一样，好在又找回感觉了&lt;br /&gt;
# 又做了 10 个俯卧撑，感觉真好&lt;br /&gt;
# 网站遭受攻击，下一轮防攻击策略开始实施。网友里面有坏人呐&lt;br /&gt;
# 护照和港澳通行证终于到手了&lt;br /&gt;
# 买了块新的 27 英寸显示器&lt;br /&gt;
# 做了 35 个俯卧撑，手掌开始有力量了。惯例倒立四次&lt;br /&gt;
# [[File:世界上有千千万万碗面.jpg|200px]]&lt;br /&gt;
# 看完了《绝命律师》第一季&lt;br /&gt;
&lt;br /&gt;
== 202604 ==&lt;br /&gt;
# 笑死了，网站防爆破期间，阈值写得低，经常把自己挡在网站之外封一天。赶紧把自己加进白名单&lt;br /&gt;
# 成功搞定一个困扰一周的难题，[https://qingliezhiquan.com/blog/%E4%B8%80%E6%AC%A1_Anki_%E7%99%BB%E5%BD%95%E4%B8%8D%E4%B8%8A%E7%9A%84%E6%89%BE_bug_%E7%BB%8F%E5%8E%86 找 bug 过程]堪称经典&lt;br /&gt;
# 发现自己某些方面还挺厉害的&lt;br /&gt;
# 我代理的一个案子，对方脆败。他的毛病在于，同样的事，重复了三遍，大段大段的用 AI 写的，书记员和法官根本不可能看明白他在表达啥。打官司重在证据清晰明确、语言简明扼要，不然起诉状或答辩状白写了&lt;br /&gt;
# 看完了《绝命律师》第二季。Jimmy 阴了他哥一把，他哥也阴了他一把。Jimmy 与 Kim 共享办公室，开始独立执业。被偏爱的 Jimmy，成佛只需放下屠刀&lt;br /&gt;
# 买了个高压锅（苏泊尔京东自营旗舰店，底直径 24 厘米，7.0L，食品级 304 不锈钢材质）。上气后 28 分钟，就把 2.9 kg 肘子炖到软烂脱骨，骨头都可以轻松嚼碎。解决了切肉洗菜板的麻烦。2.9 kg 太多了，下次控制在 2 kg 以内，上气后 20 分钟炖足够了&lt;br /&gt;
# 炖了一只三黄鸡、两斤鸡爪、两个鸡边腿、一斤鲜板栗。上气后 12 分钟就软烂脱骨了。下次炖鸡 10 分钟足够了&lt;br /&gt;
# 处理去香港玩的所有 [https://qingliezhiquan.com/blog/%E9%A6%99%E6%B8%AF%E6%B8%B8%E8%AE%B0%EF%BC%9A%E5%96%9C%E5%B8%96%E8%A1%97#%E9%80%9A%E7%94%A8%E5%87%86%E5%A4%87 预备事项]，好一通忙碌。所有事情从结果看很简单，到达结果的过程中，需要许多比对时间&lt;br /&gt;
# 买了一双皮鞋，不易起皱，但皮革太次了，放了一周多，还有严重刺鼻劣质塑料味或甲醛味，这 159.6 元白花了。我打算扔掉，钱没有命重要。而且这种劣质塑料，易变形。鞋底比鞋面大了一圈，像踩了个盘子在脚下，以后选款式时避雷。我讨厌这双鞋到什么程度呢？打算晚上丢掉，现在左边鞋带松了一根，我都懒得系一下&lt;br /&gt;
# 买了一件公务式的休闲衣，挺板正，像个程序员了&lt;br /&gt;
# 买了一套扫把，扔掉了房间里旧的脏扫把。时时打扫地面的小渣渣很有必要，而这种易影响氛围的小事，要做得舒服，干净的扫把很有必要&lt;br /&gt;
# 买了 50 厘米宽衣架，保护衣服的肩线&lt;br /&gt;
# 把冬天的衣服全收进行李箱，放到衣柜顶上了，衣柜空出大面积，变得比较整齐&lt;br /&gt;
# 买了套引体向上设备，艰难进阶中&lt;br /&gt;
# 全面规整了我的 Emacs 配置，学会了一个简单的事：如果靠代码要 100 行，靠人只要 4 行，那就别搞什么自动化了，就靠人算了&lt;br /&gt;
&lt;br /&gt;
== 202605 ==&lt;br /&gt;
# 1 kg 排骨，1.5 kg 蹄膀，1.5 kg 白萝卜，一起炖一大锅，出锅三大盘、四中碗、三小碗，足够佐餐十次。食材才 61.5 元。淘洗花了不到 20 分钟，炒制花了不到 15 分钟，高压锅炖了 10 分钟左右，上气后再炖 10 分钟，就放着等开锅了&lt;br /&gt;
# 天气开始炎热，晚上回家都得开空调了&lt;br /&gt;
# 帮朋友干了一个项目，当作感谢&lt;br /&gt;
&lt;br /&gt;
== 202606 ==&lt;br /&gt;
# 处于焦虑之中&lt;br /&gt;
# 二刷浮槎山，不累。体质真的强了很多&lt;br /&gt;
# 爬了蜀山。很多年前我第一次爬的时候，客观上用了 1.5 小时，体感有 3 小时，感觉路漫长没有边际。这次走同样的路，最多只有某个 5 分钟的陡坡接电话时喘了下，其他的 15 分钟不到就毫无压力地到顶点了，非常轻松&lt;br /&gt;
# 常做俯卧撑，胸肌显现。头发留长了。颜值有了巨大提升&lt;br /&gt;
# 成功学会佩戴隐形眼镜&lt;br /&gt;
# 成功实现 15 个标准俯卧撑 + 3 个硬拉引体向上&lt;br /&gt;
# 成功购买 Apple GiftCard&lt;br /&gt;
# 拖了地&lt;br /&gt;
# 发现一家好吃的盖浇饭店&lt;br /&gt;
# 发现一家好吃的烤串店&lt;br /&gt;
# 去学林公园天养了一天，翻了很多次跟头，全靠左肩摔，也不疼，克服了恐惧，有望学会后空翻&lt;br /&gt;
# 成功实现 30 个标准俯卧撑 + 6 个硬拉引体向上&lt;br /&gt;
# 看了电影《新世界》，模仿《无间道》，超越《无间道》&lt;br /&gt;
# 看了电影《大空头》，简而言之：银行放房贷给普通人，银行把债权打包组合后出卖，层层包装组合，全世界银行都持有大量次贷。由于通货膨胀、物价上涨、审核不严，贷款违约的人越来越多，建立在虚空信用上的贷款面临崩塌，而最先发现的人，与银行对赌购买下跌期权。等贷款违约的人数达到临界点，大量银行破产，下跌期权赢了。最先做空的人，把认知变成了巨额财富&lt;br /&gt;
&lt;br /&gt;
== 202607 ==&lt;br /&gt;
# 我写的一个答辩状，获得了完胜。对方要 156827.49 元。法院判了 2880 元。拿着我写的答辩状去开庭的法人，表示完胜非常爽&lt;br /&gt;
# 成功实现 40 个标准俯卧撑 + 7 个硬拉引体向上&lt;br /&gt;
# 成功实现 60 个标准俯卧撑&lt;br /&gt;
# 围棋 9 路已经杀到 2 级；19 路已经杀到 8 级&lt;br /&gt;
# 开始研究 [https://qingliezhiquan.com/blog/%E4%BE%BF%E6%8D%B7%E6%9F%A5%E6%89%BE#%E6%8A%95%E8%B5%84 投资]&lt;br /&gt;
# 初次入市，除了京东方赚了点，其余全部大跌&lt;br /&gt;
# 完成了五月心愿，桌面收纳整洁了，一下氛围不一样了&lt;br /&gt;
# 戴隐形眼镜已经有 90% 的成功率&lt;br /&gt;
# 彻底理解了 elisp 里的递归，理解并应用了 Emacs 里 load-path 的递归，有了成熟的 Emacs 配置，可以确保无侵入式尝新&lt;br /&gt;
# 彻底理解了 ipset 是集合名单，iptables 可以按集合名单干活。netfilter-persistent 使规则永久化&lt;br /&gt;
# 胃被折腾得不好，首先是受凉，其次是经常连续三顿吃同样的食物，最后是经常吃食材不新鲜的饭店。自己做饭必须重视起来了&lt;br /&gt;
# 每天已能比较轻松的完成 60 个标准俯卧撑 + 90 秒倒立&lt;br /&gt;
# 使用 ChatGPT 5.6 Sol Extra High，把《GNU Emacs Lisp Reference Manual》《GNU Emacs Manual》《Specialized Emacs Features》《The Little Schemer》《The King James Version of the Bible》这五本书里的所有单词，制作成了 Anki 词卡：&amp;lt;b&amp;gt;TEBC11276en20260716.txt&amp;lt;/b&amp;gt;。有可能是当前世界上最棒的英汉词卡。Emacs 和 Lisp 负责技术上掌握世界，圣经负责玄学上理解世界，我准备靠这些单词学通英语&lt;br /&gt;
## T 代表选编者&lt;br /&gt;
## E 代表 Emacs 和 Elisp&lt;br /&gt;
## B 代表 Bible&lt;br /&gt;
## C 代表 ChatGPT&lt;br /&gt;
## 11276 代表词头数&lt;br /&gt;
## en 代表英文&lt;br /&gt;
## 20260716 代表完结日期&lt;br /&gt;
# 下班到家后，倾向于把手机用自律盒锁起来。必须戒断短视频和流媒体了&lt;br /&gt;
# 彻底了结一件事&lt;br /&gt;
# 网站卡成一团糟，果断把某网段封了 20 天，效果立竿见影&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=Iptables_ipset_%E4%BD%BF%E7%94%A8%E7%BB%8F%E9%AA%8C&amp;diff=11543</id>
		<title>Iptables ipset 使用经验</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=Iptables_ipset_%E4%BD%BF%E7%94%A8%E7%BB%8F%E9%AA%8C&amp;diff=11543"/>
		<updated>2026-07-22T14:02:20Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: /* 黑名单 网段 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;iptables 加上 ipset，对大批量地屏蔽恶意 ip，非常有用。ipset 负责建立一个 ip 集合，比如白名单集合、黑名单集合；iptables 规则负责对该集合做放行或封禁处理。&lt;br /&gt;
&lt;br /&gt;
== 总框架 ==&lt;br /&gt;
前提是先安装好用到的软件：&amp;lt;code&amp;gt;apt install ipset iptables netfilter-persistent ipset-persistent iptables-persistent&amp;lt;/code&amp;gt;&lt;br /&gt;
# 临时&lt;br /&gt;
## ipset create：创建一个名单容器，如 mw_white&lt;br /&gt;
## ipset add：往名单里加 IP，立即生效&lt;br /&gt;
## iptables -C：检查规则是否已存在，只检查，不修改&lt;br /&gt;
## iptables -I：改内存里的防火墙规则，让 iptables 引用 ipset 名单&lt;br /&gt;
# 持久化&lt;br /&gt;
## ipset save &amp;gt; /etc/iptables/ipsets：把名单名字、成员持久化&lt;br /&gt;
## iptables-save &amp;gt; /etc/iptables/rules.v4：把防火墙规则持久化&lt;br /&gt;
## netfilter-persistent save：统一保存当前 ipset / iptables 状态&lt;br /&gt;
# 开机重生&lt;br /&gt;
## systemctl enable netfilter-persistent：让开机时自动读取上述文件并恢复&lt;br /&gt;
&lt;br /&gt;
== 白名单 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
ipset create mw_white hash:ip family inet hashsize 4096 maxelem 131072 -exist&lt;br /&gt;
iptables -C INPUT -m set --match-set mw_white src -j ACCEPT 2&amp;gt;/dev/null || iptables -I INPUT 1 -m set --match-set mw_white src -j ACCEPT&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 黑名单 IP ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
ipset create mw_ban hash:ip family inet hashsize 4096 maxelem 131072 timeout 86400 -exist&lt;br /&gt;
iptables -C INPUT -m set --match-set mw_ban src -j DROP 2&amp;gt;/dev/null || iptables -I INPUT 2 -m set --match-set mw_ban src -j DROP&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 黑名单 网段 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
ipset create mw_ban_net hash:net family inet hashsize 4096 maxelem 131072 timeout 1728000 -exist # 恶意网段，封 20 天&lt;br /&gt;
iptables -C INPUT -m set --match-set mw_ban_net src -j DROP 2&amp;gt;/dev/null || iptables -I INPUT 3 -m set --match-set mw_ban_net src -j DROP&lt;br /&gt;
ipset add mw_ban_net 1.2.3.0/24&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 常规操作 ==&lt;br /&gt;
日常操作，主要改集合名和具体 IP。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
ipset list mw_white&lt;br /&gt;
ipset test mw_white 1.2.3.4 # 改动前先检查自己有没有在白名单&lt;br /&gt;
ipset add mw_white 1.2.3.4 -exist&lt;br /&gt;
ipset del mw_white 1.2.3.4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 反向操作 ==&lt;br /&gt;
有时，也需要把错误规则清除。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
iptables -L INPUT -n --line-numbers # 查看&lt;br /&gt;
iptables -D INPUT -m set --match-set mw_ban_net src -j DROP # 删除&lt;br /&gt;
ipset destroy mw_ban_net # 销毁&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 持久化 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
# 单独手动保存&lt;br /&gt;
ipset save &amp;gt; /etc/iptables/ipsets&lt;br /&gt;
iptables-save &amp;gt; /etc/iptables/rules.v4&lt;br /&gt;
&lt;br /&gt;
# 统一保存当前 netfilter 状态&lt;br /&gt;
netfilter-persistent save&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
不确定时，不要统一保存。确切无误了，再统一保存。&lt;br /&gt;
&lt;br /&gt;
== 开机重生 ==&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl enable netfilter-persistent&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== 未来巡查 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
systemctl status netfilter-persistent&lt;br /&gt;
systemctl is-enabled netfilter-persistent # 问下有没有开机自启&lt;br /&gt;
iptables -L INPUT -n --line-numbers | head -30&lt;br /&gt;
&lt;br /&gt;
ls -l /etc/iptables/ipsets&lt;br /&gt;
ls -l /etc/iptables/rules.v4&lt;br /&gt;
ls -l /usr/lib/systemd/system/netfilter-persistent.service&lt;br /&gt;
ls -l /usr/share/netfilter-persistent/plugins.d/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个运维心法：内存状态、文件状态、开机恢复状态，三者必须对齐。&lt;br /&gt;
&lt;br /&gt;
任何命令、结果，都不是孤立的，一定有实体存在于某处。&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=Iptables_ipset_%E4%BD%BF%E7%94%A8%E7%BB%8F%E9%AA%8C&amp;diff=11542</id>
		<title>Iptables ipset 使用经验</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=Iptables_ipset_%E4%BD%BF%E7%94%A8%E7%BB%8F%E9%AA%8C&amp;diff=11542"/>
		<updated>2026-07-22T14:01:45Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: /* 常规操作 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;iptables 加上 ipset，对大批量地屏蔽恶意 ip，非常有用。ipset 负责建立一个 ip 集合，比如白名单集合、黑名单集合；iptables 规则负责对该集合做放行或封禁处理。&lt;br /&gt;
&lt;br /&gt;
== 总框架 ==&lt;br /&gt;
前提是先安装好用到的软件：&amp;lt;code&amp;gt;apt install ipset iptables netfilter-persistent ipset-persistent iptables-persistent&amp;lt;/code&amp;gt;&lt;br /&gt;
# 临时&lt;br /&gt;
## ipset create：创建一个名单容器，如 mw_white&lt;br /&gt;
## ipset add：往名单里加 IP，立即生效&lt;br /&gt;
## iptables -C：检查规则是否已存在，只检查，不修改&lt;br /&gt;
## iptables -I：改内存里的防火墙规则，让 iptables 引用 ipset 名单&lt;br /&gt;
# 持久化&lt;br /&gt;
## ipset save &amp;gt; /etc/iptables/ipsets：把名单名字、成员持久化&lt;br /&gt;
## iptables-save &amp;gt; /etc/iptables/rules.v4：把防火墙规则持久化&lt;br /&gt;
## netfilter-persistent save：统一保存当前 ipset / iptables 状态&lt;br /&gt;
# 开机重生&lt;br /&gt;
## systemctl enable netfilter-persistent：让开机时自动读取上述文件并恢复&lt;br /&gt;
&lt;br /&gt;
== 白名单 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
ipset create mw_white hash:ip family inet hashsize 4096 maxelem 131072 -exist&lt;br /&gt;
iptables -C INPUT -m set --match-set mw_white src -j ACCEPT 2&amp;gt;/dev/null || iptables -I INPUT 1 -m set --match-set mw_white src -j ACCEPT&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 黑名单 IP ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
ipset create mw_ban hash:ip family inet hashsize 4096 maxelem 131072 timeout 86400 -exist&lt;br /&gt;
iptables -C INPUT -m set --match-set mw_ban src -j DROP 2&amp;gt;/dev/null || iptables -I INPUT 2 -m set --match-set mw_ban src -j DROP&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 黑名单 网段 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
ipset create mw_ban_net hash:net family inet hashsize 4096 maxelem 131072 timeout 86400 -exist&lt;br /&gt;
iptables -C INPUT -m set --match-set mw_ban_net src -j DROP 2&amp;gt;/dev/null || iptables -I INPUT 3 -m set --match-set mw_ban_net src -j DROP&lt;br /&gt;
ipset add mw_ban_net 1.2.3.0/24 timeout 86400 -exist&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 常规操作 ==&lt;br /&gt;
日常操作，主要改集合名和具体 IP。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
ipset list mw_white&lt;br /&gt;
ipset test mw_white 1.2.3.4 # 改动前先检查自己有没有在白名单&lt;br /&gt;
ipset add mw_white 1.2.3.4 -exist&lt;br /&gt;
ipset del mw_white 1.2.3.4&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 反向操作 ==&lt;br /&gt;
有时，也需要把错误规则清除。&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
iptables -L INPUT -n --line-numbers # 查看&lt;br /&gt;
iptables -D INPUT -m set --match-set mw_ban_net src -j DROP # 删除&lt;br /&gt;
ipset destroy mw_ban_net # 销毁&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 持久化 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
# 单独手动保存&lt;br /&gt;
ipset save &amp;gt; /etc/iptables/ipsets&lt;br /&gt;
iptables-save &amp;gt; /etc/iptables/rules.v4&lt;br /&gt;
&lt;br /&gt;
# 统一保存当前 netfilter 状态&lt;br /&gt;
netfilter-persistent save&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
不确定时，不要统一保存。确切无误了，再统一保存。&lt;br /&gt;
&lt;br /&gt;
== 开机重生 ==&lt;br /&gt;
&amp;lt;code&amp;gt;systemctl enable netfilter-persistent&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== 未来巡查 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
systemctl status netfilter-persistent&lt;br /&gt;
systemctl is-enabled netfilter-persistent # 问下有没有开机自启&lt;br /&gt;
iptables -L INPUT -n --line-numbers | head -30&lt;br /&gt;
&lt;br /&gt;
ls -l /etc/iptables/ipsets&lt;br /&gt;
ls -l /etc/iptables/rules.v4&lt;br /&gt;
ls -l /usr/lib/systemd/system/netfilter-persistent.service&lt;br /&gt;
ls -l /usr/share/netfilter-persistent/plugins.d/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
一个运维心法：内存状态、文件状态、开机恢复状态，三者必须对齐。&lt;br /&gt;
&lt;br /&gt;
任何命令、结果，都不是孤立的，一定有实体存在于某处。&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11541</id>
		<title>Git submodule 的精准用法</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11541"/>
		<updated>2026-07-22T13:43:24Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Git submodule 适合这种情况：主项目需要别的子项目，主项目需要管理子项目的版本。git clone 的子项目只是碰巧存在于这台电脑；而 Git submodule，子项目是主项目正式声明的一项依赖，正式记录插件的 URL、保存路径和准确版本。Git submodule 的本质是，放弃包管理器的一部分自动化，换取透明、固定、可控和可复现。对于大量、频繁更新的子项目，手工管理会比较繁琐；对于少量精选、长期固定、谨慎升级的子项目，非常合适。&lt;br /&gt;
&lt;br /&gt;
== 概念 ==&lt;br /&gt;
在 Emacs 配置中，可以把 ~/.emacs.d/ 视为主仓库。把 Vertico Consult Magit 等视为子仓库。&lt;br /&gt;
&lt;br /&gt;
单凭 git clone 子仓库，Emacs 也可以用。但主仓库对子仓库的完整细节缺乏了解。&lt;br /&gt;
&lt;br /&gt;
而 git submodule add 可以解决&lt;br /&gt;
* Vertico 从哪个 URL 下载&lt;br /&gt;
* 应该保存在哪个目录&lt;br /&gt;
* 应该使用哪个 commit&lt;br /&gt;
* 换电脑后应该怎样恢复&lt;br /&gt;
* 主配置回滚时，Vertico 应该回到哪个版本&lt;br /&gt;
&lt;br /&gt;
.gitmodules 内容大致如下：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[submodule &amp;quot;travel/packages/vertico&amp;quot;]&lt;br /&gt;
    path = travel/packages/vertico&lt;br /&gt;
    url = https://github.com/minad/vertico.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
submodule 还会记录一条指向某个 commit 的 gitlink。&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 仓库&lt;br /&gt;
! 负责记录什么&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;~/.emacs.d&amp;lt;/code&amp;gt; 主仓库&lt;br /&gt;
|自己的配置文件，以及每个插件应使用哪个 commit&lt;br /&gt;
|-&lt;br /&gt;
|Vertico 子仓库&lt;br /&gt;
|Vertico 源码和 Vertico 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Consult 子仓库&lt;br /&gt;
|Consult 源码和 Consult 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Magit 子仓库&lt;br /&gt;
|Magit 源码和 Magit 自己的完整开发历史&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这种设计有两个好处：&lt;br /&gt;
* 不把别人写的几百个插件源码文件伪装成自己的文件&lt;br /&gt;
* 又能让配置仓库精确声明自己依赖哪个插件版本&lt;br /&gt;
&lt;br /&gt;
submodule 最重要的价值：&lt;br /&gt;
; 固定插件版本&lt;br /&gt;
: 它记录的不是模糊的“使用最新版”，而是，这套配置经过测试时，各插件分别停留在哪个准确版本。这相当于给插件环境加了一把版本锁。&lt;br /&gt;
; 整体回滚&lt;br /&gt;
: 主仓库回滚到过去某个 commit 后，再执行 &amp;lt;code&amp;gt;git submodule update --init --recursive&amp;lt;/code&amp;gt;，各子仓库会恢复到该主仓库 commit 当时所记录的版本。普通嵌套 &amp;lt;code&amp;gt;git clone&amp;lt;/code&amp;gt; 做不到这一点。&lt;br /&gt;
; 异地完整复现&lt;br /&gt;
: &amp;lt;code&amp;gt;git clone --recurse-submodules URL PATH&amp;lt;/code&amp;gt;，恢复出来的插件环境与原电脑一致。&lt;br /&gt;
; 明确记录插件升级&lt;br /&gt;
: 使用 submodule 后，升级插件会被主仓库识别为一次正式变化，这让插件升级变成一种可查看、可测试、可提交、可撤销的操作。&lt;br /&gt;
&lt;br /&gt;
== 工作流 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
## 配置&lt;br /&gt;
git config diff.submodule log&lt;br /&gt;
git config status.submodulesummary 1&lt;br /&gt;
&lt;br /&gt;
## 添加&lt;br /&gt;
cd ~/.emacs.d&lt;br /&gt;
git init -b main&lt;br /&gt;
git submodule add https://github.com/minad/vertico.git travel/packages/vertico&lt;br /&gt;
git status&lt;br /&gt;
git commit -m &amp;quot;Add Vertico submodule&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## 查看&lt;br /&gt;
git -C travel/packages/vertico log --oneline --decorate -10&lt;br /&gt;
git submodule status&lt;br /&gt;
&lt;br /&gt;
## 升级 &lt;br /&gt;
git submodule update --remote -- travel/packages/vertico&lt;br /&gt;
git diff --submodule=log&lt;br /&gt;
&lt;br /&gt;
## 保留&lt;br /&gt;
git add travel/packages/vertico&lt;br /&gt;
git commit -m &amp;quot;Update Vertico&amp;quot; # commit 了才正式获得了主仓库的承认&lt;br /&gt;
&lt;br /&gt;
## 放弃 &lt;br /&gt;
git submodule update --checkout --force -- travel/packages/vertico # 未提交时，放弃，或&lt;br /&gt;
git revert 7ac39fe &amp;amp;&amp;amp; git submodule update --init --recursive # 错提交后，放弃&lt;br /&gt;
&lt;br /&gt;
## 删除 &lt;br /&gt;
git rm travel/packages/vertico&lt;br /&gt;
git rm travel/40-test/init-vertico.el&lt;br /&gt;
git commit -m &amp;quot;Remove Vertico&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## 暂停&lt;br /&gt;
git submodule deinit -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
## 不暂停&lt;br /&gt;
git submodule update --init -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
## 移机&lt;br /&gt;
git clone --recurse-submodules 主仓库URL ~/.emacs.d&lt;br /&gt;
&lt;br /&gt;
## 同步&lt;br /&gt;
git pull&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 经验 ==&lt;br /&gt;
* 不要修改插件原始仓库。不应把自己的配置写进子仓库。&lt;br /&gt;
* 一次升级一个插件，一个插件形成一个独立提交。&lt;br /&gt;
* submodule 经常处于 detached HEAD 是正常的。这是版本锁定的正常状态。&lt;br /&gt;
* Git submodule 只管理源码仓库及其版本关系，它不是 Emacs 包管理器；插件依赖仍需自己检查并安装或加入 submodule。&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11540</id>
		<title>Git submodule 的精准用法</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11540"/>
		<updated>2026-07-22T13:32:43Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: /* 概念 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Git submodule 适合这种情况：主项目需要别的子项目，主项目需要管理子项目的版本。git clone 的子项目只是碰巧存在于这台电脑；而 Git submodule，子项目是主项目正式声明的一项依赖，正式记录插件的 URL、保存路径和准确版本。Git submodule 的本质是，放弃包管理器的一部分自动化，换取透明、固定、可控和可复现。对于大量、频繁更新的子项目，手工管理会比较繁琐；对于少量精选、长期固定、谨慎升级的子项目，非常合适。&lt;br /&gt;
&lt;br /&gt;
== 概念 ==&lt;br /&gt;
在 Emacs 配置中，可以把 ~/.emacs.d/ 视为主仓库。把 Vertico Consult Magit 等视为子仓库。&lt;br /&gt;
&lt;br /&gt;
单凭 git clone 子仓库，Emacs 也可以用。但主仓库对子仓库的完整细节缺乏了解。&lt;br /&gt;
&lt;br /&gt;
而 git submodule add 可以解决&lt;br /&gt;
* Vertico 从哪个 URL 下载&lt;br /&gt;
* 应该保存在哪个目录&lt;br /&gt;
* 应该使用哪个 commit&lt;br /&gt;
* 换电脑后应该怎样恢复&lt;br /&gt;
* 主配置回滚时，Vertico 应该回到哪个版本&lt;br /&gt;
&lt;br /&gt;
.gitmodules 内容大致如下：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[submodule &amp;quot;travel/packages/vertico&amp;quot;]&lt;br /&gt;
    path = travel/packages/vertico&lt;br /&gt;
    url = https://github.com/minad/vertico.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
submodule 还会记录一条指向某个 commit 的 gitlink。&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 仓库&lt;br /&gt;
! 负责记录什么&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;~/.emacs.d&amp;lt;/code&amp;gt; 主仓库&lt;br /&gt;
|自己的配置文件，以及每个插件应使用哪个 commit&lt;br /&gt;
|-&lt;br /&gt;
|Vertico 子仓库&lt;br /&gt;
|Vertico 源码和 Vertico 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Consult 子仓库&lt;br /&gt;
|Consult 源码和 Consult 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Magit 子仓库&lt;br /&gt;
|Magit 源码和 Magit 自己的完整开发历史&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这种设计有两个好处：&lt;br /&gt;
* 不把别人写的几百个插件源码文件伪装成自己的文件&lt;br /&gt;
* 又能让配置仓库精确声明自己依赖哪个插件版本&lt;br /&gt;
&lt;br /&gt;
submodule 最重要的价值：&lt;br /&gt;
; 固定插件版本&lt;br /&gt;
: 它记录的不是模糊的“使用最新版”，而是，这套配置经过测试时，各插件分别停留在哪个准确版本。这相当于给插件环境加了一把版本锁。&lt;br /&gt;
; 整体回滚&lt;br /&gt;
: 主仓库回滚到 abc1234，子仓库也会恢复到当时的状态。普通嵌套 &amp;lt;code&amp;gt;git clone&amp;lt;/code&amp;gt; 做不到这一点。即使主配置回到一个月前，插件仍可能停留在今天的新版本。&lt;br /&gt;
; 异地完整复现&lt;br /&gt;
: &amp;lt;code&amp;gt;git clone --recurse-submodules URL PATH&amp;lt;/code&amp;gt;，恢复出来的插件环境与原电脑一致。&lt;br /&gt;
; 明确记录插件升级&lt;br /&gt;
: 使用 submodule 后，升级插件会被主仓库识别为一次正式变化，这让插件升级变成一种可查看、可测试、可提交、可撤销的操作。&lt;br /&gt;
&lt;br /&gt;
== 工作流 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
## 配置&lt;br /&gt;
git config diff.submodule lo&lt;br /&gt;
git config status.submodulesummary 1&lt;br /&gt;
&lt;br /&gt;
## 添加&lt;br /&gt;
cd ~/.emacs.d&lt;br /&gt;
git init -b main&lt;br /&gt;
git submodule add https://github.com/minad/vertico.git travel/packages/vertico&lt;br /&gt;
git status&lt;br /&gt;
git commit -m &amp;quot;Add Vertico submodule&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## 查看&lt;br /&gt;
git -C travel/packages/vertico log --oneline --decorate -10&lt;br /&gt;
git submodule status&lt;br /&gt;
&lt;br /&gt;
## 升级 &lt;br /&gt;
git submodule update --remote -- travel/packages/vertico&lt;br /&gt;
git diff --submodule=log&lt;br /&gt;
&lt;br /&gt;
## 保留&lt;br /&gt;
git add travel/packages/vertico&lt;br /&gt;
git commit -m &amp;quot;Update Vertico&amp;quot; # commit 了才正式获得了主仓库的承认&lt;br /&gt;
&lt;br /&gt;
## 放弃 &lt;br /&gt;
git submodule update --checkout --force -- travel/packages/vertico # 未提交时，放弃，或&lt;br /&gt;
git revert 7ac39fe &amp;amp;&amp;amp; git submodule update --init --recursive # 错提交后，放弃&lt;br /&gt;
&lt;br /&gt;
## 删除 &lt;br /&gt;
git rm travel/packages/vertico&lt;br /&gt;
git rm travel/40-test/init-vertico.el&lt;br /&gt;
git commit -m &amp;quot;Remove Vertico&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## 暂停&lt;br /&gt;
git submodule deinit -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
## 不暂停&lt;br /&gt;
git submodule update --init -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
## 移机&lt;br /&gt;
git clone --recurse-submodules 主仓库URL ~/.emacs.d # 一次搞定，或&lt;br /&gt;
git pull &amp;amp;&amp;amp; git submodule update --init --recursive # 两次搞定&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 经验 ==&lt;br /&gt;
* 不要修改插件原始仓库。不应把自己的配置写进子仓库。&lt;br /&gt;
* 一次升级一个插件，一个插件形成一个独立提交。&lt;br /&gt;
* submodule 经常处于 detached HEAD 是正常的。这是版本锁定的正常状态。&lt;br /&gt;
* git submodule 搞定源码仓库的版本关系，它不是包管理器，依赖项需要各软件自行安装&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11539</id>
		<title>Git submodule 的精准用法</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11539"/>
		<updated>2026-07-22T13:31:56Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: /* 概念 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Git submodule 适合这种情况：主项目需要别的子项目，主项目需要管理子项目的版本。git clone 的子项目只是碰巧存在于这台电脑；而 Git submodule，子项目是主项目正式声明的一项依赖，正式记录插件的 URL、保存路径和准确版本。Git submodule 的本质是，放弃包管理器的一部分自动化，换取透明、固定、可控和可复现。对于大量、频繁更新的子项目，手工管理会比较繁琐；对于少量精选、长期固定、谨慎升级的子项目，非常合适。&lt;br /&gt;
&lt;br /&gt;
== 概念 ==&lt;br /&gt;
在 Emacs 配置中，可以把 ~/.emacs.d/ 视为主仓库。把 Vertico Consult Magit 等视为子仓库。&lt;br /&gt;
&lt;br /&gt;
单凭 git clone 子仓库，Emacs 也可以用。但主仓库对子仓库的完整细节缺乏了解。&lt;br /&gt;
&lt;br /&gt;
而 git submodule add 可以解决&lt;br /&gt;
* Vertico 从哪个 URL 下载&lt;br /&gt;
* 应该保存在哪个目录&lt;br /&gt;
* 应该使用哪个 commit&lt;br /&gt;
* 换电脑后应该怎样恢复&lt;br /&gt;
* 主配置回滚时，Vertico 应该回到哪个版本&lt;br /&gt;
&lt;br /&gt;
.gitmodules 内容大致如下：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[submodule &amp;quot;travel/packages/vertico&amp;quot;]&lt;br /&gt;
    path = travel/packages/vertico&lt;br /&gt;
    url = https://github.com/minad/vertico.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
submodule 还会记录一条指向某个 commit 的 gitlink。&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 仓库&lt;br /&gt;
! 负责记录什么&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;~/.emacs.d&amp;lt;/code&amp;gt; 主仓库&lt;br /&gt;
|自己的配置文件，以及每个插件应使用哪个 commit&lt;br /&gt;
|-&lt;br /&gt;
|Vertico 子仓库&lt;br /&gt;
|Vertico 源码和 Vertico 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Consult 子仓库&lt;br /&gt;
|Consult 源码和 Consult 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Magit 子仓库&lt;br /&gt;
|Magit 源码和 Magit 自己的完整开发历史&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这种设计有两个好处：&lt;br /&gt;
# 不把别人写的几百个插件源码文件伪装成自己的文件&lt;br /&gt;
# 又能让配置仓库精确声明自己依赖哪个插件版本&lt;br /&gt;
&lt;br /&gt;
submodule 最重要的价值：&lt;br /&gt;
; 固定插件版本&lt;br /&gt;
: 它记录的不是模糊的“使用最新版”，而是，这套配置经过测试时，各插件分别停留在哪个准确版本。这相当于给插件环境加了一把版本锁。&lt;br /&gt;
; 整体回滚&lt;br /&gt;
: 主仓库回滚到 abc1234，子仓库也会恢复到当时的状态。普通嵌套 &amp;lt;code&amp;gt;git clone&amp;lt;/code&amp;gt; 做不到这一点。即使主配置回到一个月前，插件仍可能停留在今天的新版本。&lt;br /&gt;
; 异地完整复现&lt;br /&gt;
: &amp;lt;code&amp;gt;git clone --recurse-submodules URL PATH&amp;lt;/code&amp;gt;，恢复出来的插件环境与原电脑一致。&lt;br /&gt;
; 明确记录插件升级&lt;br /&gt;
: 使用 submodule 后，升级插件会被主仓库识别为一次正式变化，这让插件升级变成一种可查看、可测试、可提交、可撤销的操作。&lt;br /&gt;
&lt;br /&gt;
== 工作流 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
## 配置&lt;br /&gt;
git config diff.submodule lo&lt;br /&gt;
git config status.submodulesummary 1&lt;br /&gt;
&lt;br /&gt;
## 添加&lt;br /&gt;
cd ~/.emacs.d&lt;br /&gt;
git init -b main&lt;br /&gt;
git submodule add https://github.com/minad/vertico.git travel/packages/vertico&lt;br /&gt;
git status&lt;br /&gt;
git commit -m &amp;quot;Add Vertico submodule&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## 查看&lt;br /&gt;
git -C travel/packages/vertico log --oneline --decorate -10&lt;br /&gt;
git submodule status&lt;br /&gt;
&lt;br /&gt;
## 升级 &lt;br /&gt;
git submodule update --remote -- travel/packages/vertico&lt;br /&gt;
git diff --submodule=log&lt;br /&gt;
&lt;br /&gt;
## 保留&lt;br /&gt;
git add travel/packages/vertico&lt;br /&gt;
git commit -m &amp;quot;Update Vertico&amp;quot; # commit 了才正式获得了主仓库的承认&lt;br /&gt;
&lt;br /&gt;
## 放弃 &lt;br /&gt;
git submodule update --checkout --force -- travel/packages/vertico # 未提交时，放弃，或&lt;br /&gt;
git revert 7ac39fe &amp;amp;&amp;amp; git submodule update --init --recursive # 错提交后，放弃&lt;br /&gt;
&lt;br /&gt;
## 删除 &lt;br /&gt;
git rm travel/packages/vertico&lt;br /&gt;
git rm travel/40-test/init-vertico.el&lt;br /&gt;
git commit -m &amp;quot;Remove Vertico&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## 暂停&lt;br /&gt;
git submodule deinit -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
## 不暂停&lt;br /&gt;
git submodule update --init -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
## 移机&lt;br /&gt;
git clone --recurse-submodules 主仓库URL ~/.emacs.d # 一次搞定，或&lt;br /&gt;
git pull &amp;amp;&amp;amp; git submodule update --init --recursive # 两次搞定&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 经验 ==&lt;br /&gt;
* 不要修改插件原始仓库。不应把自己的配置写进子仓库。&lt;br /&gt;
* 一次升级一个插件，一个插件形成一个独立提交。&lt;br /&gt;
* submodule 经常处于 detached HEAD 是正常的。这是版本锁定的正常状态。&lt;br /&gt;
* git submodule 搞定源码仓库的版本关系，它不是包管理器，依赖项需要各软件自行安装&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11538</id>
		<title>Git submodule 的精准用法</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11538"/>
		<updated>2026-07-22T13:29:43Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Git submodule 适合这种情况：主项目需要别的子项目，主项目需要管理子项目的版本。git clone 的子项目只是碰巧存在于这台电脑；而 Git submodule，子项目是主项目正式声明的一项依赖，正式记录插件的 URL、保存路径和准确版本。Git submodule 的本质是，放弃包管理器的一部分自动化，换取透明、固定、可控和可复现。对于大量、频繁更新的子项目，手工管理会比较繁琐；对于少量精选、长期固定、谨慎升级的子项目，非常合适。&lt;br /&gt;
&lt;br /&gt;
== 概念 ==&lt;br /&gt;
在 Emacs 配置中，可以把 ~/.emacs.d/ 视为主仓库。把 Vertico Consult Magit 等视为子仓库。&lt;br /&gt;
&lt;br /&gt;
单凭 git clone 子仓库，Emacs 也可以用。但主仓库对子仓库的完整细节缺乏了解。&lt;br /&gt;
&lt;br /&gt;
而 git submodule add 可以解决&lt;br /&gt;
* Vertico 从哪个 URL 下载&lt;br /&gt;
* 应该保存在哪个目录&lt;br /&gt;
* 应该使用哪个 commit&lt;br /&gt;
* 换电脑后应该怎样恢复&lt;br /&gt;
* 主配置回滚时，Vertico 应该回到哪个版本&lt;br /&gt;
&lt;br /&gt;
.gitmodules 内容大致如下：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[submodule &amp;quot;travel/packages/vertico&amp;quot;]&lt;br /&gt;
    path = travel/packages/vertico&lt;br /&gt;
    url = https://github.com/minad/vertico.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
submodule 还会记录一条指向某个 commit 的 gitlink。&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 仓库&lt;br /&gt;
! 负责记录什么&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;~/.emacs.d&amp;lt;/code&amp;gt; 主仓库&lt;br /&gt;
|自己的配置文件，以及每个插件应使用哪个 commit&lt;br /&gt;
|-&lt;br /&gt;
|Vertico 子仓库&lt;br /&gt;
|Vertico 源码和 Vertico 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Consult 子仓库&lt;br /&gt;
|Consult 源码和 Consult 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Magit 子仓库&lt;br /&gt;
|Magit 源码和 Magit 自己的完整开发历史&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这种设计避免了两个问题：&lt;br /&gt;
&lt;br /&gt;
# 不把别人写的几百个插件源码文件伪装成自己的文件&lt;br /&gt;
# 又能让配置仓库精确声明自己依赖哪个插件版本&lt;br /&gt;
&lt;br /&gt;
submodule 最重要的价值&lt;br /&gt;
# 固定插件版本。它记录的不是模糊的“使用最新版”，而是，这套配置经过测试时，各插件分别停留在哪个准确版本。这相当于给插件环境加了一把版本锁。&lt;br /&gt;
# 整体回滚。主仓库回滚到 abc1234，子仓库也会恢复到当时的状态。普通嵌套 &amp;lt;code&amp;gt;git clone&amp;lt;/code&amp;gt; 做不到这一点。即使主配置回到一个月前，插件仍可能停留在今天的新版本。&lt;br /&gt;
# 异地完整复现。&amp;lt;code&amp;gt;git clone --recurse-submodules URL PATH&amp;lt;/code&amp;gt;，恢复出来的插件环境与原电脑一致。&lt;br /&gt;
# 明确记录插件升级。使用 submodule 后，升级插件会被主仓库识别为一次正式变化，这让插件升级变成一种可查看、可测试、可提交、可撤销的操作。&lt;br /&gt;
&lt;br /&gt;
== 工作流 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
## 配置&lt;br /&gt;
git config diff.submodule lo&lt;br /&gt;
git config status.submodulesummary 1&lt;br /&gt;
&lt;br /&gt;
## 添加&lt;br /&gt;
cd ~/.emacs.d&lt;br /&gt;
git init -b main&lt;br /&gt;
git submodule add https://github.com/minad/vertico.git travel/packages/vertico&lt;br /&gt;
git status&lt;br /&gt;
git commit -m &amp;quot;Add Vertico submodule&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## 查看&lt;br /&gt;
git -C travel/packages/vertico log --oneline --decorate -10&lt;br /&gt;
git submodule status&lt;br /&gt;
&lt;br /&gt;
## 升级 &lt;br /&gt;
git submodule update --remote -- travel/packages/vertico&lt;br /&gt;
git diff --submodule=log&lt;br /&gt;
&lt;br /&gt;
## 保留&lt;br /&gt;
git add travel/packages/vertico&lt;br /&gt;
git commit -m &amp;quot;Update Vertico&amp;quot; # commit 了才正式获得了主仓库的承认&lt;br /&gt;
&lt;br /&gt;
## 放弃 &lt;br /&gt;
git submodule update --checkout --force -- travel/packages/vertico # 未提交时，放弃，或&lt;br /&gt;
git revert 7ac39fe &amp;amp;&amp;amp; git submodule update --init --recursive # 错提交后，放弃&lt;br /&gt;
&lt;br /&gt;
## 删除 &lt;br /&gt;
git rm travel/packages/vertico&lt;br /&gt;
git rm travel/40-test/init-vertico.el&lt;br /&gt;
git commit -m &amp;quot;Remove Vertico&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## 暂停&lt;br /&gt;
git submodule deinit -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
## 不暂停&lt;br /&gt;
git submodule update --init -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
## 移机&lt;br /&gt;
git clone --recurse-submodules 主仓库URL ~/.emacs.d # 一次搞定，或&lt;br /&gt;
git pull &amp;amp;&amp;amp; git submodule update --init --recursive # 两次搞定&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 经验 ==&lt;br /&gt;
* 不要修改插件原始仓库。不应把自己的配置写进子仓库。&lt;br /&gt;
* 一次升级一个插件，一个插件形成一个独立提交。&lt;br /&gt;
* submodule 经常处于 detached HEAD 是正常的。这是版本锁定的正常状态。&lt;br /&gt;
* git submodule 搞定源码仓库的版本关系，它不是包管理器，依赖项需要各软件自行安装&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11537</id>
		<title>Git submodule 的精准用法</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11537"/>
		<updated>2026-07-22T13:27:45Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Git submodule 适合这种情况：主项目需要别的子项目，主项目需要管理子项目的版本。git clone 的子项目只是碰巧存在于这台电脑。Git submodule，子项目是主项目正式声明的一项依赖，正式记录插件的 URL、保存路径和准确版本。Git submodule 的本质是，放弃包管理器的一部分自动化，换取透明、固定、可控和可复现。对于大量、频繁更新的子项目，手工管理会比较繁琐；对于少量精选、长期固定、谨慎升级的子项目，非常合适。&lt;br /&gt;
&lt;br /&gt;
== 概念 ==&lt;br /&gt;
在 Emacs 配置中，可以把 ~/.emacs.d/ 视为主仓库。把 Vertico Consult Magit 等视为子仓库。&lt;br /&gt;
&lt;br /&gt;
单凭 git clone 子仓库，Emacs 也可以用。但主仓库对子仓库的完整细节缺乏了解。&lt;br /&gt;
&lt;br /&gt;
而 git submodule add 可以解决&lt;br /&gt;
* Vertico 从哪个 URL 下载&lt;br /&gt;
* 应该保存在哪个目录&lt;br /&gt;
* 应该使用哪个 commit&lt;br /&gt;
* 换电脑后应该怎样恢复&lt;br /&gt;
* 主配置回滚时，Vertico 应该回到哪个版本&lt;br /&gt;
&lt;br /&gt;
.gitmodules 内容大致如下：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[submodule &amp;quot;travel/packages/vertico&amp;quot;]&lt;br /&gt;
    path = travel/packages/vertico&lt;br /&gt;
    url = https://github.com/minad/vertico.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
submodule 还会记录一条指向某个 commit 的 gitlink。&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 仓库&lt;br /&gt;
! 负责记录什么&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;~/.emacs.d&amp;lt;/code&amp;gt; 主仓库&lt;br /&gt;
|自己的配置文件，以及每个插件应使用哪个 commit&lt;br /&gt;
|-&lt;br /&gt;
|Vertico 子仓库&lt;br /&gt;
|Vertico 源码和 Vertico 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Consult 子仓库&lt;br /&gt;
|Consult 源码和 Consult 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Magit 子仓库&lt;br /&gt;
|Magit 源码和 Magit 自己的完整开发历史&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这种设计避免了两个问题：&lt;br /&gt;
&lt;br /&gt;
# 不把别人写的几百个插件源码文件伪装成自己的文件&lt;br /&gt;
# 又能让配置仓库精确声明自己依赖哪个插件版本&lt;br /&gt;
&lt;br /&gt;
submodule 最重要的价值&lt;br /&gt;
# 固定插件版本。它记录的不是模糊的“使用最新版”，而是，这套配置经过测试时，各插件分别停留在哪个准确版本。这相当于给插件环境加了一把版本锁。&lt;br /&gt;
# 整体回滚。主仓库回滚到 abc1234，子仓库也会恢复到当时的状态。普通嵌套 &amp;lt;code&amp;gt;git clone&amp;lt;/code&amp;gt; 做不到这一点。即使主配置回到一个月前，插件仍可能停留在今天的新版本。&lt;br /&gt;
# 异地完整复现。&amp;lt;code&amp;gt;git clone --recurse-submodules URL PATH&amp;lt;/code&amp;gt;，恢复出来的插件环境与原电脑一致。&lt;br /&gt;
# 明确记录插件升级。使用 submodule 后，升级插件会被主仓库识别为一次正式变化，这让插件升级变成一种可查看、可测试、可提交、可撤销的操作。&lt;br /&gt;
&lt;br /&gt;
== 工作流 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
## 配置&lt;br /&gt;
git config diff.submodule lo&lt;br /&gt;
git config status.submodulesummary 1&lt;br /&gt;
&lt;br /&gt;
## 添加&lt;br /&gt;
cd ~/.emacs.d&lt;br /&gt;
git init -b main&lt;br /&gt;
git submodule add https://github.com/minad/vertico.git travel/packages/vertico&lt;br /&gt;
git status&lt;br /&gt;
git commit -m &amp;quot;Add Vertico submodule&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## 查看&lt;br /&gt;
git -C travel/packages/vertico log --oneline --decorate -10&lt;br /&gt;
git submodule status&lt;br /&gt;
&lt;br /&gt;
## 升级 &lt;br /&gt;
git submodule update --remote -- travel/packages/vertico&lt;br /&gt;
git diff --submodule=log&lt;br /&gt;
&lt;br /&gt;
## 保留&lt;br /&gt;
git add travel/packages/vertico&lt;br /&gt;
git commit -m &amp;quot;Update Vertico&amp;quot; # commit 了才正式获得了主仓库的承认&lt;br /&gt;
&lt;br /&gt;
## 放弃 &lt;br /&gt;
git submodule update --checkout --force -- travel/packages/vertico # 未提交时，放弃，或&lt;br /&gt;
git revert 7ac39fe &amp;amp;&amp;amp; git submodule update --init --recursive # 错提交后，放弃&lt;br /&gt;
&lt;br /&gt;
## 删除 &lt;br /&gt;
git rm travel/packages/vertico&lt;br /&gt;
git rm travel/40-test/init-vertico.el&lt;br /&gt;
git commit -m &amp;quot;Remove Vertico&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## 暂停&lt;br /&gt;
git submodule deinit -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
## 不暂停&lt;br /&gt;
git submodule update --init -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
## 移机&lt;br /&gt;
git clone --recurse-submodules 主仓库URL ~/.emacs.d # 一次搞定，或&lt;br /&gt;
git pull &amp;amp;&amp;amp; git submodule update --init --recursive # 两次搞定&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 经验 ==&lt;br /&gt;
* 不要修改插件原始仓库。不应把自己的配置写进子仓库。&lt;br /&gt;
* 一次升级一个插件，一个插件形成一个独立提交。&lt;br /&gt;
* submodule 经常处于 detached HEAD 是正常的。这是版本锁定的正常状态。&lt;br /&gt;
* git submodule 搞定源码仓库的版本关系，它不是包管理器，依赖项需要各软件自行安装&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11536</id>
		<title>Git submodule 的精准用法</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11536"/>
		<updated>2026-07-22T13:27:37Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Git submodule 适合这种情况：主项目需要别的子项目，主项目需要管理子项目的版本。普通 git clone 的子项目只是碰巧存在于这台电脑。Git submodule，子项目是主项目正式声明的一项依赖，正式记录插件的 URL、保存路径和准确版本。Git submodule 的本质是，放弃包管理器的一部分自动化，换取透明、固定、可控和可复现。对于大量、频繁更新的子项目，手工管理会比较繁琐；对于少量精选、长期固定、谨慎升级的子项目，非常合适。&lt;br /&gt;
&lt;br /&gt;
== 概念 ==&lt;br /&gt;
在 Emacs 配置中，可以把 ~/.emacs.d/ 视为主仓库。把 Vertico Consult Magit 等视为子仓库。&lt;br /&gt;
&lt;br /&gt;
单凭 git clone 子仓库，Emacs 也可以用。但主仓库对子仓库的完整细节缺乏了解。&lt;br /&gt;
&lt;br /&gt;
而 git submodule add 可以解决&lt;br /&gt;
* Vertico 从哪个 URL 下载&lt;br /&gt;
* 应该保存在哪个目录&lt;br /&gt;
* 应该使用哪个 commit&lt;br /&gt;
* 换电脑后应该怎样恢复&lt;br /&gt;
* 主配置回滚时，Vertico 应该回到哪个版本&lt;br /&gt;
&lt;br /&gt;
.gitmodules 内容大致如下：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[submodule &amp;quot;travel/packages/vertico&amp;quot;]&lt;br /&gt;
    path = travel/packages/vertico&lt;br /&gt;
    url = https://github.com/minad/vertico.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
submodule 还会记录一条指向某个 commit 的 gitlink。&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 仓库&lt;br /&gt;
! 负责记录什么&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;~/.emacs.d&amp;lt;/code&amp;gt; 主仓库&lt;br /&gt;
|自己的配置文件，以及每个插件应使用哪个 commit&lt;br /&gt;
|-&lt;br /&gt;
|Vertico 子仓库&lt;br /&gt;
|Vertico 源码和 Vertico 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Consult 子仓库&lt;br /&gt;
|Consult 源码和 Consult 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Magit 子仓库&lt;br /&gt;
|Magit 源码和 Magit 自己的完整开发历史&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这种设计避免了两个问题：&lt;br /&gt;
&lt;br /&gt;
# 不把别人写的几百个插件源码文件伪装成自己的文件&lt;br /&gt;
# 又能让配置仓库精确声明自己依赖哪个插件版本&lt;br /&gt;
&lt;br /&gt;
submodule 最重要的价值&lt;br /&gt;
# 固定插件版本。它记录的不是模糊的“使用最新版”，而是，这套配置经过测试时，各插件分别停留在哪个准确版本。这相当于给插件环境加了一把版本锁。&lt;br /&gt;
# 整体回滚。主仓库回滚到 abc1234，子仓库也会恢复到当时的状态。普通嵌套 &amp;lt;code&amp;gt;git clone&amp;lt;/code&amp;gt; 做不到这一点。即使主配置回到一个月前，插件仍可能停留在今天的新版本。&lt;br /&gt;
# 异地完整复现。&amp;lt;code&amp;gt;git clone --recurse-submodules URL PATH&amp;lt;/code&amp;gt;，恢复出来的插件环境与原电脑一致。&lt;br /&gt;
# 明确记录插件升级。使用 submodule 后，升级插件会被主仓库识别为一次正式变化，这让插件升级变成一种可查看、可测试、可提交、可撤销的操作。&lt;br /&gt;
&lt;br /&gt;
== 工作流 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
## 配置&lt;br /&gt;
git config diff.submodule lo&lt;br /&gt;
git config status.submodulesummary 1&lt;br /&gt;
&lt;br /&gt;
## 添加&lt;br /&gt;
cd ~/.emacs.d&lt;br /&gt;
git init -b main&lt;br /&gt;
git submodule add https://github.com/minad/vertico.git travel/packages/vertico&lt;br /&gt;
git status&lt;br /&gt;
git commit -m &amp;quot;Add Vertico submodule&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## 查看&lt;br /&gt;
git -C travel/packages/vertico log --oneline --decorate -10&lt;br /&gt;
git submodule status&lt;br /&gt;
&lt;br /&gt;
## 升级 &lt;br /&gt;
git submodule update --remote -- travel/packages/vertico&lt;br /&gt;
git diff --submodule=log&lt;br /&gt;
&lt;br /&gt;
## 保留&lt;br /&gt;
git add travel/packages/vertico&lt;br /&gt;
git commit -m &amp;quot;Update Vertico&amp;quot; # commit 了才正式获得了主仓库的承认&lt;br /&gt;
&lt;br /&gt;
## 放弃 &lt;br /&gt;
git submodule update --checkout --force -- travel/packages/vertico # 未提交时，放弃，或&lt;br /&gt;
git revert 7ac39fe &amp;amp;&amp;amp; git submodule update --init --recursive # 错提交后，放弃&lt;br /&gt;
&lt;br /&gt;
## 删除 &lt;br /&gt;
git rm travel/packages/vertico&lt;br /&gt;
git rm travel/40-test/init-vertico.el&lt;br /&gt;
git commit -m &amp;quot;Remove Vertico&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## 暂停&lt;br /&gt;
git submodule deinit -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
## 不暂停&lt;br /&gt;
git submodule update --init -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
## 移机&lt;br /&gt;
git clone --recurse-submodules 主仓库URL ~/.emacs.d # 一次搞定，或&lt;br /&gt;
git pull &amp;amp;&amp;amp; git submodule update --init --recursive # 两次搞定&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 经验 ==&lt;br /&gt;
* 不要修改插件原始仓库。不应把自己的配置写进子仓库。&lt;br /&gt;
* 一次升级一个插件，一个插件形成一个独立提交。&lt;br /&gt;
* submodule 经常处于 detached HEAD 是正常的。这是版本锁定的正常状态。&lt;br /&gt;
* git submodule 搞定源码仓库的版本关系，它不是包管理器，依赖项需要各软件自行安装&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11535</id>
		<title>Git submodule 的精准用法</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11535"/>
		<updated>2026-07-22T13:27:18Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Git submodule 适合这种情况：主项目需要别的子项目，主项目需要管理子项目的版本。普通 git clone 子项目只是碰巧存在于这台电脑。Git submodule，子项目是主项目正式声明的一项依赖，正式记录插件的 URL、保存路径和准确版本。Git submodule 的本质是，放弃包管理器的一部分自动化，换取透明、固定、可控和可复现。对于大量、频繁更新的子项目，手工管理会比较繁琐；对于少量精选、长期固定、谨慎升级的子项目，非常合适。&lt;br /&gt;
&lt;br /&gt;
== 概念 ==&lt;br /&gt;
在 Emacs 配置中，可以把 ~/.emacs.d/ 视为主仓库。把 Vertico Consult Magit 等视为子仓库。&lt;br /&gt;
&lt;br /&gt;
单凭 git clone 子仓库，Emacs 也可以用。但主仓库对子仓库的完整细节缺乏了解。&lt;br /&gt;
&lt;br /&gt;
而 git submodule add 可以解决&lt;br /&gt;
* Vertico 从哪个 URL 下载&lt;br /&gt;
* 应该保存在哪个目录&lt;br /&gt;
* 应该使用哪个 commit&lt;br /&gt;
* 换电脑后应该怎样恢复&lt;br /&gt;
* 主配置回滚时，Vertico 应该回到哪个版本&lt;br /&gt;
&lt;br /&gt;
.gitmodules 内容大致如下：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[submodule &amp;quot;travel/packages/vertico&amp;quot;]&lt;br /&gt;
    path = travel/packages/vertico&lt;br /&gt;
    url = https://github.com/minad/vertico.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
submodule 还会记录一条指向某个 commit 的 gitlink。&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 仓库&lt;br /&gt;
! 负责记录什么&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;~/.emacs.d&amp;lt;/code&amp;gt; 主仓库&lt;br /&gt;
|自己的配置文件，以及每个插件应使用哪个 commit&lt;br /&gt;
|-&lt;br /&gt;
|Vertico 子仓库&lt;br /&gt;
|Vertico 源码和 Vertico 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Consult 子仓库&lt;br /&gt;
|Consult 源码和 Consult 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Magit 子仓库&lt;br /&gt;
|Magit 源码和 Magit 自己的完整开发历史&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这种设计避免了两个问题：&lt;br /&gt;
&lt;br /&gt;
# 不把别人写的几百个插件源码文件伪装成自己的文件&lt;br /&gt;
# 又能让配置仓库精确声明自己依赖哪个插件版本&lt;br /&gt;
&lt;br /&gt;
submodule 最重要的价值&lt;br /&gt;
# 固定插件版本。它记录的不是模糊的“使用最新版”，而是，这套配置经过测试时，各插件分别停留在哪个准确版本。这相当于给插件环境加了一把版本锁。&lt;br /&gt;
# 整体回滚。主仓库回滚到 abc1234，子仓库也会恢复到当时的状态。普通嵌套 &amp;lt;code&amp;gt;git clone&amp;lt;/code&amp;gt; 做不到这一点。即使主配置回到一个月前，插件仍可能停留在今天的新版本。&lt;br /&gt;
# 异地完整复现。&amp;lt;code&amp;gt;git clone --recurse-submodules URL PATH&amp;lt;/code&amp;gt;，恢复出来的插件环境与原电脑一致。&lt;br /&gt;
# 明确记录插件升级。使用 submodule 后，升级插件会被主仓库识别为一次正式变化，这让插件升级变成一种可查看、可测试、可提交、可撤销的操作。&lt;br /&gt;
&lt;br /&gt;
== 工作流 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
## 配置&lt;br /&gt;
git config diff.submodule lo&lt;br /&gt;
git config status.submodulesummary 1&lt;br /&gt;
&lt;br /&gt;
## 添加&lt;br /&gt;
cd ~/.emacs.d&lt;br /&gt;
git init -b main&lt;br /&gt;
git submodule add https://github.com/minad/vertico.git travel/packages/vertico&lt;br /&gt;
git status&lt;br /&gt;
git commit -m &amp;quot;Add Vertico submodule&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## 查看&lt;br /&gt;
git -C travel/packages/vertico log --oneline --decorate -10&lt;br /&gt;
git submodule status&lt;br /&gt;
&lt;br /&gt;
## 升级 &lt;br /&gt;
git submodule update --remote -- travel/packages/vertico&lt;br /&gt;
git diff --submodule=log&lt;br /&gt;
&lt;br /&gt;
## 保留&lt;br /&gt;
git add travel/packages/vertico&lt;br /&gt;
git commit -m &amp;quot;Update Vertico&amp;quot; # commit 了才正式获得了主仓库的承认&lt;br /&gt;
&lt;br /&gt;
## 放弃 &lt;br /&gt;
git submodule update --checkout --force -- travel/packages/vertico # 未提交时，放弃，或&lt;br /&gt;
git revert 7ac39fe &amp;amp;&amp;amp; git submodule update --init --recursive # 错提交后，放弃&lt;br /&gt;
&lt;br /&gt;
## 删除 &lt;br /&gt;
git rm travel/packages/vertico&lt;br /&gt;
git rm travel/40-test/init-vertico.el&lt;br /&gt;
git commit -m &amp;quot;Remove Vertico&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## 暂停&lt;br /&gt;
git submodule deinit -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
## 不暂停&lt;br /&gt;
git submodule update --init -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
## 移机&lt;br /&gt;
git clone --recurse-submodules 主仓库URL ~/.emacs.d # 一次搞定，或&lt;br /&gt;
git pull &amp;amp;&amp;amp; git submodule update --init --recursive # 两次搞定&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 经验 ==&lt;br /&gt;
* 不要修改插件原始仓库。不应把自己的配置写进子仓库。&lt;br /&gt;
* 一次升级一个插件，一个插件形成一个独立提交。&lt;br /&gt;
* submodule 经常处于 detached HEAD 是正常的。这是版本锁定的正常状态。&lt;br /&gt;
* git submodule 搞定源码仓库的版本关系，它不是包管理器，依赖项需要各软件自行安装&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11534</id>
		<title>Git submodule 的精准用法</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11534"/>
		<updated>2026-07-22T13:22:51Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: /* 概念 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Git submodule 适合这种情况：&lt;br /&gt;
* 主项目需要别的子项目&lt;br /&gt;
* 主项目管理子项目的版本&lt;br /&gt;
&lt;br /&gt;
== 概念 ==&lt;br /&gt;
在 Emacs 配置中，可以把 ~/.emacs.d/ 视为主仓库。把 Vertico Consult Magit 等视为子仓库。&lt;br /&gt;
&lt;br /&gt;
单凭 git clone 子仓库，Emacs 也可以用。但主仓库对子仓库的完整细节缺乏了解。&lt;br /&gt;
&lt;br /&gt;
而 git submodule add 可以解决&lt;br /&gt;
* Vertico 从哪个 URL 下载&lt;br /&gt;
* 应该保存在哪个目录&lt;br /&gt;
* 应该使用哪个 commit&lt;br /&gt;
* 换电脑后应该怎样恢复&lt;br /&gt;
* 主配置回滚时，Vertico 应该回到哪个版本&lt;br /&gt;
&lt;br /&gt;
.gitmodules 内容大致如下：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[submodule &amp;quot;travel/packages/vertico&amp;quot;]&lt;br /&gt;
    path = travel/packages/vertico&lt;br /&gt;
    url = https://github.com/minad/vertico.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
submodule 还会记录一条指向某个 commit 的 gitlink。&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 仓库&lt;br /&gt;
! 负责记录什么&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;~/.emacs.d&amp;lt;/code&amp;gt; 主仓库&lt;br /&gt;
|自己的配置文件，以及每个插件应使用哪个 commit&lt;br /&gt;
|-&lt;br /&gt;
|Vertico 子仓库&lt;br /&gt;
|Vertico 源码和 Vertico 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Consult 子仓库&lt;br /&gt;
|Consult 源码和 Consult 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Magit 子仓库&lt;br /&gt;
|Magit 源码和 Magit 自己的完整开发历史&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这种设计避免了两个问题：&lt;br /&gt;
&lt;br /&gt;
# 不把别人写的几百个插件源码文件伪装成自己的文件&lt;br /&gt;
# 又能让配置仓库精确声明自己依赖哪个插件版本&lt;br /&gt;
&lt;br /&gt;
submodule 最重要的价值&lt;br /&gt;
# 固定插件版本。它记录的不是模糊的“使用最新版”，而是，这套配置经过测试时，各插件分别停留在哪个准确版本。这相当于给插件环境加了一把版本锁。&lt;br /&gt;
# 整体回滚。主仓库回滚到 abc1234，子仓库也会恢复到当时的状态。普通嵌套 &amp;lt;code&amp;gt;git clone&amp;lt;/code&amp;gt; 做不到这一点。即使主配置回到一个月前，插件仍可能停留在今天的新版本。&lt;br /&gt;
# 异地完整复现。&amp;lt;code&amp;gt;git clone --recurse-submodules URL PATH&amp;lt;/code&amp;gt;，恢复出来的插件环境与原电脑一致。&lt;br /&gt;
# 明确记录插件升级。使用 submodule 后，升级插件会被主仓库识别为一次正式变化，这让插件升级变成一种可查看、可测试、可提交、可撤销的操作。&lt;br /&gt;
&lt;br /&gt;
== 工作流 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
## 配置&lt;br /&gt;
git config diff.submodule lo&lt;br /&gt;
git config status.submodulesummary 1&lt;br /&gt;
&lt;br /&gt;
## 添加&lt;br /&gt;
cd ~/.emacs.d&lt;br /&gt;
git init -b main&lt;br /&gt;
git submodule add https://github.com/minad/vertico.git travel/packages/vertico&lt;br /&gt;
git status&lt;br /&gt;
git commit -m &amp;quot;Add Vertico submodule&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## 查看&lt;br /&gt;
git -C travel/packages/vertico log --oneline --decorate -10&lt;br /&gt;
git submodule status&lt;br /&gt;
&lt;br /&gt;
## 升级 &lt;br /&gt;
git submodule update --remote -- travel/packages/vertico&lt;br /&gt;
git diff --submodule=log&lt;br /&gt;
&lt;br /&gt;
## 保留&lt;br /&gt;
git add travel/packages/vertico&lt;br /&gt;
git commit -m &amp;quot;Update Vertico&amp;quot; # commit 了才正式获得了主仓库的承认&lt;br /&gt;
&lt;br /&gt;
## 放弃 &lt;br /&gt;
git submodule update --checkout --force -- travel/packages/vertico # 未提交时，放弃，或&lt;br /&gt;
git revert 7ac39fe &amp;amp;&amp;amp; git submodule update --init --recursive # 错提交后，放弃&lt;br /&gt;
&lt;br /&gt;
## 删除 &lt;br /&gt;
git rm travel/packages/vertico&lt;br /&gt;
git rm travel/40-test/init-vertico.el&lt;br /&gt;
git commit -m &amp;quot;Remove Vertico&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## 暂停&lt;br /&gt;
git submodule deinit -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
## 不暂停&lt;br /&gt;
git submodule update --init -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
## 移机&lt;br /&gt;
git clone --recurse-submodules 主仓库URL ~/.emacs.d # 一次搞定，或&lt;br /&gt;
git pull &amp;amp;&amp;amp; git submodule update --init --recursive # 两次搞定&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 经验 ==&lt;br /&gt;
* 不要修改插件原始仓库。不应把自己的配置写进子仓库。&lt;br /&gt;
* 一次升级一个插件，一个插件形成一个独立提交。&lt;br /&gt;
&lt;br /&gt;
== detached ==&lt;br /&gt;
git status 时发现 submodule 经常处于 detached HEAD？这在 submodule 中通常是正常现象。主仓库需要插件准确停在某个 commit，而不是随时变化。对只使用插件、不直接参与开发插件的人而言，这不是故障，而是版本锁定的正常状态。submodule 应该少升级、慢升级、一次一个、稳定后再提交。submodule 最大的价值不是方便追逐最新版，而是方便长期固定已验证版本。&lt;br /&gt;
&lt;br /&gt;
== 边界 == &lt;br /&gt;
Git submodule 只负责源码仓库和版本关系，不是完整的 Emacs 包管理器。它不会自动完成：&lt;br /&gt;
* 把插件加入 &amp;lt;code&amp;gt;load-path&amp;lt;/code&amp;gt;&lt;br /&gt;
* 执行 &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt;&lt;br /&gt;
* 安装插件依赖&lt;br /&gt;
* 生成 autoload&lt;br /&gt;
* 字节编译&lt;br /&gt;
* native compilation&lt;br /&gt;
* 编写 &amp;lt;code&amp;gt;setq&amp;lt;/code&amp;gt;&lt;br /&gt;
* 添加 hook&lt;br /&gt;
* 配置快捷键&lt;br /&gt;
&lt;br /&gt;
例如 Consult 依赖其他插件时，Git 不会自动读取 Emacs 的 &amp;lt;code&amp;gt;Package-Requires&amp;lt;/code&amp;gt; 并安装依赖。需要自己继续添加依赖：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git submodule add 依赖仓库URL travel/packages/依赖名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git submodule 的本质是，放弃包管理器的一部分自动化，换取透明、固定、可控和可复现。对于大量、频繁更新的插件，手工管理会比较繁琐；对于少量精选、长期固定、谨慎升级的插件，非常合适。&lt;br /&gt;
&lt;br /&gt;
普通 clone 插件只是碰巧存在于这台电脑。Git submodule，插件是主项目正式声明的一项依赖，正式记录插件的 URL、保存路径和准确版本。&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11533</id>
		<title>Git submodule 的精准用法</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11533"/>
		<updated>2026-07-22T13:22:29Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: /* 概念 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Git submodule 适合这种情况：&lt;br /&gt;
* 主项目需要别的子项目&lt;br /&gt;
* 主项目管理子项目的版本&lt;br /&gt;
&lt;br /&gt;
== 概念 ==&lt;br /&gt;
在 Emacs 配置中，可以把 ~/.emacs.d/ 视为主仓库。把 Vertico Consult Magit 等视为子仓库。&lt;br /&gt;
&lt;br /&gt;
单凭 git clone 子仓库，Emacs 也可以用。但主仓库对子仓库的完整细节缺乏了解。&lt;br /&gt;
&lt;br /&gt;
而 git submodule add 可以解决&lt;br /&gt;
* Vertico 从哪个 URL 下载&lt;br /&gt;
* 应该保存在哪个目录&lt;br /&gt;
* 应该使用哪个 commit&lt;br /&gt;
* 换电脑后应该怎样恢复&lt;br /&gt;
* 主配置回滚时，Vertico 应该回到哪个版本&lt;br /&gt;
&lt;br /&gt;
.gitmodules 内容大致如下：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[submodule &amp;quot;travel/packages/vertico&amp;quot;]&lt;br /&gt;
    path = travel/packages/vertico&lt;br /&gt;
    url = https://github.com/minad/vertico.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
submodule 还会记录一条指向某个 commit 的 gitlink。&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 仓库&lt;br /&gt;
! 负责记录什么&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;~/.emacs.d&amp;lt;/code&amp;gt; 主仓库&lt;br /&gt;
|自己的配置文件，以及每个插件应使用哪个 commit&lt;br /&gt;
|-&lt;br /&gt;
|Vertico 子仓库&lt;br /&gt;
|Vertico 源码和 Vertico 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Consult 子仓库&lt;br /&gt;
|Consult 源码和 Consult 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Magit 子仓库&lt;br /&gt;
|Magit 源码和 Magit 自己的完整开发历史&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这种设计避免了两个问题：&lt;br /&gt;
&lt;br /&gt;
# 不把别人写的几百个插件源码文件伪装成自己的文件&lt;br /&gt;
# 又能让配置仓库精确声明自己依赖哪个插件版本&lt;br /&gt;
&lt;br /&gt;
submodule 最重要的价值&lt;br /&gt;
# 固定插件版本，它记录的不是模糊的“使用最新版”，而是，这套配置经过测试时，各插件分别停留在哪个准确版本。这相当于给插件环境加了一把版本锁。&lt;br /&gt;
# 整体回滚。主仓库回滚到 abc1234，子仓库也会恢复到当时的状态。普通嵌套 &amp;lt;code&amp;gt;git clone&amp;lt;/code&amp;gt; 做不到这一点。即使主配置回到一个月前，插件仍可能停留在今天的新版本。&lt;br /&gt;
# 异地完整复现。&amp;lt;code&amp;gt;git clone --recurse-submodules URL PATH&amp;lt;/code&amp;gt;，恢复出来的插件环境与原电脑一致。&lt;br /&gt;
# 明确记录插件升级。使用 submodule 后，升级插件会被主仓库识别为一次正式变化，这让插件升级变成一种可查看、可测试、可提交、可撤销的操作。&lt;br /&gt;
&lt;br /&gt;
== 工作流 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
## 配置&lt;br /&gt;
git config diff.submodule lo&lt;br /&gt;
git config status.submodulesummary 1&lt;br /&gt;
&lt;br /&gt;
## 添加&lt;br /&gt;
cd ~/.emacs.d&lt;br /&gt;
git init -b main&lt;br /&gt;
git submodule add https://github.com/minad/vertico.git travel/packages/vertico&lt;br /&gt;
git status&lt;br /&gt;
git commit -m &amp;quot;Add Vertico submodule&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## 查看&lt;br /&gt;
git -C travel/packages/vertico log --oneline --decorate -10&lt;br /&gt;
git submodule status&lt;br /&gt;
&lt;br /&gt;
## 升级 &lt;br /&gt;
git submodule update --remote -- travel/packages/vertico&lt;br /&gt;
git diff --submodule=log&lt;br /&gt;
&lt;br /&gt;
## 保留&lt;br /&gt;
git add travel/packages/vertico&lt;br /&gt;
git commit -m &amp;quot;Update Vertico&amp;quot; # commit 了才正式获得了主仓库的承认&lt;br /&gt;
&lt;br /&gt;
## 放弃 &lt;br /&gt;
git submodule update --checkout --force -- travel/packages/vertico # 未提交时，放弃，或&lt;br /&gt;
git revert 7ac39fe &amp;amp;&amp;amp; git submodule update --init --recursive # 错提交后，放弃&lt;br /&gt;
&lt;br /&gt;
## 删除 &lt;br /&gt;
git rm travel/packages/vertico&lt;br /&gt;
git rm travel/40-test/init-vertico.el&lt;br /&gt;
git commit -m &amp;quot;Remove Vertico&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## 暂停&lt;br /&gt;
git submodule deinit -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
## 不暂停&lt;br /&gt;
git submodule update --init -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
## 移机&lt;br /&gt;
git clone --recurse-submodules 主仓库URL ~/.emacs.d # 一次搞定，或&lt;br /&gt;
git pull &amp;amp;&amp;amp; git submodule update --init --recursive # 两次搞定&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 经验 ==&lt;br /&gt;
* 不要修改插件原始仓库。不应把自己的配置写进子仓库。&lt;br /&gt;
* 一次升级一个插件，一个插件形成一个独立提交。&lt;br /&gt;
&lt;br /&gt;
== detached ==&lt;br /&gt;
git status 时发现 submodule 经常处于 detached HEAD？这在 submodule 中通常是正常现象。主仓库需要插件准确停在某个 commit，而不是随时变化。对只使用插件、不直接参与开发插件的人而言，这不是故障，而是版本锁定的正常状态。submodule 应该少升级、慢升级、一次一个、稳定后再提交。submodule 最大的价值不是方便追逐最新版，而是方便长期固定已验证版本。&lt;br /&gt;
&lt;br /&gt;
== 边界 == &lt;br /&gt;
Git submodule 只负责源码仓库和版本关系，不是完整的 Emacs 包管理器。它不会自动完成：&lt;br /&gt;
* 把插件加入 &amp;lt;code&amp;gt;load-path&amp;lt;/code&amp;gt;&lt;br /&gt;
* 执行 &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt;&lt;br /&gt;
* 安装插件依赖&lt;br /&gt;
* 生成 autoload&lt;br /&gt;
* 字节编译&lt;br /&gt;
* native compilation&lt;br /&gt;
* 编写 &amp;lt;code&amp;gt;setq&amp;lt;/code&amp;gt;&lt;br /&gt;
* 添加 hook&lt;br /&gt;
* 配置快捷键&lt;br /&gt;
&lt;br /&gt;
例如 Consult 依赖其他插件时，Git 不会自动读取 Emacs 的 &amp;lt;code&amp;gt;Package-Requires&amp;lt;/code&amp;gt; 并安装依赖。需要自己继续添加依赖：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git submodule add 依赖仓库URL travel/packages/依赖名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git submodule 的本质是，放弃包管理器的一部分自动化，换取透明、固定、可控和可复现。对于大量、频繁更新的插件，手工管理会比较繁琐；对于少量精选、长期固定、谨慎升级的插件，非常合适。&lt;br /&gt;
&lt;br /&gt;
普通 clone 插件只是碰巧存在于这台电脑。Git submodule，插件是主项目正式声明的一项依赖，正式记录插件的 URL、保存路径和准确版本。&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11532</id>
		<title>Git submodule 的精准用法</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11532"/>
		<updated>2026-07-22T13:21:56Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Git submodule 适合这种情况：&lt;br /&gt;
* 主项目需要别的子项目&lt;br /&gt;
* 主项目管理子项目的版本&lt;br /&gt;
&lt;br /&gt;
== 概念 ==&lt;br /&gt;
在 Emacs 配置中，可以把 ~/.emacs.d/ 视为主仓库。把 Vertico Consult Magit 等视为子仓库。&lt;br /&gt;
&lt;br /&gt;
单凭 git clone 子仓库，Emacs 也可以用。但主仓库对子仓库的完整细节缺乏了解。&lt;br /&gt;
&lt;br /&gt;
而 git submodule add 可以解决&lt;br /&gt;
* Vertico 从哪个 URL 下载&lt;br /&gt;
* 应该保存在哪个目录&lt;br /&gt;
* 应该使用哪个 commit&lt;br /&gt;
* 换电脑后应该怎样恢复&lt;br /&gt;
* 主配置回滚时，Vertico 应该回到哪个版本&lt;br /&gt;
&lt;br /&gt;
.gitmodules 内容大致如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[submodule &amp;quot;travel/packages/vertico&amp;quot;]&lt;br /&gt;
    path = travel/packages/vertico&lt;br /&gt;
    url = https://github.com/minad/vertico.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
submodule 还会记录一条指向某个 commit 的 gitlink。&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 仓库&lt;br /&gt;
! 负责记录什么&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;~/.emacs.d&amp;lt;/code&amp;gt; 主仓库&lt;br /&gt;
|自己的配置文件，以及每个插件应使用哪个 commit&lt;br /&gt;
|-&lt;br /&gt;
|Vertico 子仓库&lt;br /&gt;
|Vertico 源码和 Vertico 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Consult 子仓库&lt;br /&gt;
|Consult 源码和 Consult 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Magit 子仓库&lt;br /&gt;
|Magit 源码和 Magit 自己的完整开发历史&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这种设计避免了两个问题：&lt;br /&gt;
&lt;br /&gt;
# 不把别人写的几百个插件源码文件伪装成自己的文件&lt;br /&gt;
# 又能让配置仓库精确声明自己依赖哪个插件版本&lt;br /&gt;
&lt;br /&gt;
submodule 最重要的价值&lt;br /&gt;
# 固定插件版本，它记录的不是模糊的“使用最新版”，而是，这套配置经过测试时，各插件分别停留在哪个准确版本。这相当于给插件环境加了一把版本锁。&lt;br /&gt;
# 整体回滚。主仓库回滚到 abc1234，子仓库也会恢复到当时的状态。普通嵌套 &amp;lt;code&amp;gt;git clone&amp;lt;/code&amp;gt; 做不到这一点。即使主配置回到一个月前，插件仍可能停留在今天的新版本。&lt;br /&gt;
# 异地完整复现。&amp;lt;code&amp;gt;git clone --recurse-submodules URL PATH&amp;lt;/code&amp;gt;，恢复出来的插件环境与原电脑一致。&lt;br /&gt;
# 明确记录插件升级。使用 submodule 后，升级插件会被主仓库识别为一次正式变化，这让插件升级变成一种可查看、可测试、可提交、可撤销的操作。&lt;br /&gt;
&lt;br /&gt;
== 工作流 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
## 配置&lt;br /&gt;
git config diff.submodule lo&lt;br /&gt;
git config status.submodulesummary 1&lt;br /&gt;
&lt;br /&gt;
## 添加&lt;br /&gt;
cd ~/.emacs.d&lt;br /&gt;
git init -b main&lt;br /&gt;
git submodule add https://github.com/minad/vertico.git travel/packages/vertico&lt;br /&gt;
git status&lt;br /&gt;
git commit -m &amp;quot;Add Vertico submodule&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## 查看&lt;br /&gt;
git -C travel/packages/vertico log --oneline --decorate -10&lt;br /&gt;
git submodule status&lt;br /&gt;
&lt;br /&gt;
## 升级 &lt;br /&gt;
git submodule update --remote -- travel/packages/vertico&lt;br /&gt;
git diff --submodule=log&lt;br /&gt;
&lt;br /&gt;
## 保留&lt;br /&gt;
git add travel/packages/vertico&lt;br /&gt;
git commit -m &amp;quot;Update Vertico&amp;quot; # commit 了才正式获得了主仓库的承认&lt;br /&gt;
&lt;br /&gt;
## 放弃 &lt;br /&gt;
git submodule update --checkout --force -- travel/packages/vertico # 未提交时，放弃，或&lt;br /&gt;
git revert 7ac39fe &amp;amp;&amp;amp; git submodule update --init --recursive # 错提交后，放弃&lt;br /&gt;
&lt;br /&gt;
## 删除 &lt;br /&gt;
git rm travel/packages/vertico&lt;br /&gt;
git rm travel/40-test/init-vertico.el&lt;br /&gt;
git commit -m &amp;quot;Remove Vertico&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## 暂停&lt;br /&gt;
git submodule deinit -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
## 不暂停&lt;br /&gt;
git submodule update --init -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
## 移机&lt;br /&gt;
git clone --recurse-submodules 主仓库URL ~/.emacs.d # 一次搞定，或&lt;br /&gt;
git pull &amp;amp;&amp;amp; git submodule update --init --recursive # 两次搞定&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 经验 ==&lt;br /&gt;
* 不要修改插件原始仓库。不应把自己的配置写进子仓库。&lt;br /&gt;
* 一次升级一个插件，一个插件形成一个独立提交。&lt;br /&gt;
&lt;br /&gt;
== detached ==&lt;br /&gt;
git status 时发现 submodule 经常处于 detached HEAD？这在 submodule 中通常是正常现象。主仓库需要插件准确停在某个 commit，而不是随时变化。对只使用插件、不直接参与开发插件的人而言，这不是故障，而是版本锁定的正常状态。submodule 应该少升级、慢升级、一次一个、稳定后再提交。submodule 最大的价值不是方便追逐最新版，而是方便长期固定已验证版本。&lt;br /&gt;
&lt;br /&gt;
== 边界 == &lt;br /&gt;
Git submodule 只负责源码仓库和版本关系，不是完整的 Emacs 包管理器。它不会自动完成：&lt;br /&gt;
* 把插件加入 &amp;lt;code&amp;gt;load-path&amp;lt;/code&amp;gt;&lt;br /&gt;
* 执行 &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt;&lt;br /&gt;
* 安装插件依赖&lt;br /&gt;
* 生成 autoload&lt;br /&gt;
* 字节编译&lt;br /&gt;
* native compilation&lt;br /&gt;
* 编写 &amp;lt;code&amp;gt;setq&amp;lt;/code&amp;gt;&lt;br /&gt;
* 添加 hook&lt;br /&gt;
* 配置快捷键&lt;br /&gt;
&lt;br /&gt;
例如 Consult 依赖其他插件时，Git 不会自动读取 Emacs 的 &amp;lt;code&amp;gt;Package-Requires&amp;lt;/code&amp;gt; 并安装依赖。需要自己继续添加依赖：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git submodule add 依赖仓库URL travel/packages/依赖名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git submodule 的本质是，放弃包管理器的一部分自动化，换取透明、固定、可控和可复现。对于大量、频繁更新的插件，手工管理会比较繁琐；对于少量精选、长期固定、谨慎升级的插件，非常合适。&lt;br /&gt;
&lt;br /&gt;
普通 clone 插件只是碰巧存在于这台电脑。Git submodule，插件是主项目正式声明的一项依赖，正式记录插件的 URL、保存路径和准确版本。&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11531</id>
		<title>Git submodule 的精准用法</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11531"/>
		<updated>2026-07-22T13:20:22Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: /* 工作流 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Git submodule 适合这种情况：&lt;br /&gt;
* 主项目需要别的子项目&lt;br /&gt;
* 主项目管理别的子项目的版本&lt;br /&gt;
&lt;br /&gt;
== 概念 ==&lt;br /&gt;
在 Emacs 配置中，可以把 ~/.emacs.d/ 视为主仓库。把 Vertico Consult Magit 等视为子仓库。&lt;br /&gt;
&lt;br /&gt;
单凭 git clone 子仓库，Emacs 也可以用。但主仓库对子仓库的完整细节缺乏了解。&lt;br /&gt;
&lt;br /&gt;
而 git submodule add 可以解决&lt;br /&gt;
* Vertico 从哪个 URL 下载&lt;br /&gt;
* 应该保存在哪个目录&lt;br /&gt;
* 应该使用哪个 commit&lt;br /&gt;
* 换电脑后应该怎样恢复&lt;br /&gt;
* 主配置回滚时，Vertico 应该回到哪个版本&lt;br /&gt;
&lt;br /&gt;
.gitmodules 内容大致如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[submodule &amp;quot;travel/packages/vertico&amp;quot;]&lt;br /&gt;
    path = travel/packages/vertico&lt;br /&gt;
    url = https://github.com/minad/vertico.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
submodule 还会记录一条指向某个 commit 的 gitlink。&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 仓库&lt;br /&gt;
! 负责记录什么&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;~/.emacs.d&amp;lt;/code&amp;gt; 主仓库&lt;br /&gt;
|自己的配置文件，以及每个插件应使用哪个 commit&lt;br /&gt;
|-&lt;br /&gt;
|Vertico 子仓库&lt;br /&gt;
|Vertico 源码和 Vertico 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Consult 子仓库&lt;br /&gt;
|Consult 源码和 Consult 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Magit 子仓库&lt;br /&gt;
|Magit 源码和 Magit 自己的完整开发历史&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这种设计避免了两个问题：&lt;br /&gt;
&lt;br /&gt;
# 不把别人写的几百个插件源码文件伪装成自己的文件&lt;br /&gt;
# 又能让配置仓库精确声明自己依赖哪个插件版本&lt;br /&gt;
&lt;br /&gt;
submodule 最重要的价值&lt;br /&gt;
# 固定插件版本，它记录的不是模糊的“使用最新版”，而是，这套配置经过测试时，各插件分别停留在哪个准确版本。这相当于给插件环境加了一把版本锁。&lt;br /&gt;
# 整体回滚。主仓库回滚到 abc1234，子仓库也会恢复到当时的状态。普通嵌套 &amp;lt;code&amp;gt;git clone&amp;lt;/code&amp;gt; 做不到这一点。即使主配置回到一个月前，插件仍可能停留在今天的新版本。&lt;br /&gt;
# 异地完整复现。&amp;lt;code&amp;gt;git clone --recurse-submodules URL PATH&amp;lt;/code&amp;gt;，恢复出来的插件环境与原电脑一致。&lt;br /&gt;
# 明确记录插件升级。使用 submodule 后，升级插件会被主仓库识别为一次正式变化，这让插件升级变成一种可查看、可测试、可提交、可撤销的操作。&lt;br /&gt;
&lt;br /&gt;
== 工作流 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
## 配置&lt;br /&gt;
git config diff.submodule lo&lt;br /&gt;
git config status.submodulesummary 1&lt;br /&gt;
&lt;br /&gt;
## 添加&lt;br /&gt;
cd ~/.emacs.d&lt;br /&gt;
git init -b main&lt;br /&gt;
git submodule add https://github.com/minad/vertico.git travel/packages/vertico&lt;br /&gt;
git status&lt;br /&gt;
git commit -m &amp;quot;Add Vertico submodule&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## 查看&lt;br /&gt;
git -C travel/packages/vertico log --oneline --decorate -10&lt;br /&gt;
git submodule status&lt;br /&gt;
&lt;br /&gt;
## 升级 &lt;br /&gt;
git submodule update --remote -- travel/packages/vertico&lt;br /&gt;
git diff --submodule=log&lt;br /&gt;
&lt;br /&gt;
## 保留&lt;br /&gt;
git add travel/packages/vertico&lt;br /&gt;
git commit -m &amp;quot;Update Vertico&amp;quot; # commit 了才正式获得了主仓库的承认&lt;br /&gt;
&lt;br /&gt;
## 放弃 &lt;br /&gt;
git submodule update --checkout --force -- travel/packages/vertico # 未提交时，放弃，或&lt;br /&gt;
git revert 7ac39fe &amp;amp;&amp;amp; git submodule update --init --recursive # 错提交后，放弃&lt;br /&gt;
&lt;br /&gt;
## 删除 &lt;br /&gt;
git rm travel/packages/vertico&lt;br /&gt;
git rm travel/40-test/init-vertico.el&lt;br /&gt;
git commit -m &amp;quot;Remove Vertico&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## 暂停&lt;br /&gt;
git submodule deinit -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
## 不暂停&lt;br /&gt;
git submodule update --init -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
## 移机&lt;br /&gt;
git clone --recurse-submodules 主仓库URL ~/.emacs.d # 一次搞定，或&lt;br /&gt;
git pull &amp;amp;&amp;amp; git submodule update --init --recursive # 两次搞定&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 经验 ==&lt;br /&gt;
* 不要修改插件原始仓库。不应把自己的配置写进子仓库。&lt;br /&gt;
* 一次升级一个插件，一个插件形成一个独立提交。&lt;br /&gt;
&lt;br /&gt;
== detached ==&lt;br /&gt;
git status 时发现 submodule 经常处于 detached HEAD？这在 submodule 中通常是正常现象。主仓库需要插件准确停在某个 commit，而不是随时变化。对只使用插件、不直接参与开发插件的人而言，这不是故障，而是版本锁定的正常状态。submodule 应该少升级、慢升级、一次一个、稳定后再提交。submodule 最大的价值不是方便追逐最新版，而是方便长期固定已验证版本。&lt;br /&gt;
&lt;br /&gt;
== 边界 == &lt;br /&gt;
Git submodule 只负责源码仓库和版本关系，不是完整的 Emacs 包管理器。它不会自动完成：&lt;br /&gt;
* 把插件加入 &amp;lt;code&amp;gt;load-path&amp;lt;/code&amp;gt;&lt;br /&gt;
* 执行 &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt;&lt;br /&gt;
* 安装插件依赖&lt;br /&gt;
* 生成 autoload&lt;br /&gt;
* 字节编译&lt;br /&gt;
* native compilation&lt;br /&gt;
* 编写 &amp;lt;code&amp;gt;setq&amp;lt;/code&amp;gt;&lt;br /&gt;
* 添加 hook&lt;br /&gt;
* 配置快捷键&lt;br /&gt;
&lt;br /&gt;
例如 Consult 依赖其他插件时，Git 不会自动读取 Emacs 的 &amp;lt;code&amp;gt;Package-Requires&amp;lt;/code&amp;gt; 并安装依赖。需要自己继续添加依赖：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git submodule add 依赖仓库URL travel/packages/依赖名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git submodule 的本质是，放弃包管理器的一部分自动化，换取透明、固定、可控和可复现。对于大量、频繁更新的插件，手工管理会比较繁琐；对于少量精选、长期固定、谨慎升级的插件，非常合适。&lt;br /&gt;
&lt;br /&gt;
普通 clone 插件只是碰巧存在于这台电脑。Git submodule，插件是主项目正式声明的一项依赖，正式记录插件的 URL、保存路径和准确版本。&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11530</id>
		<title>Git submodule 的精准用法</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11530"/>
		<updated>2026-07-22T13:20:13Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: /* 工作流 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Git submodule 适合这种情况：&lt;br /&gt;
* 主项目需要别的子项目&lt;br /&gt;
* 主项目管理别的子项目的版本&lt;br /&gt;
&lt;br /&gt;
== 概念 ==&lt;br /&gt;
在 Emacs 配置中，可以把 ~/.emacs.d/ 视为主仓库。把 Vertico Consult Magit 等视为子仓库。&lt;br /&gt;
&lt;br /&gt;
单凭 git clone 子仓库，Emacs 也可以用。但主仓库对子仓库的完整细节缺乏了解。&lt;br /&gt;
&lt;br /&gt;
而 git submodule add 可以解决&lt;br /&gt;
* Vertico 从哪个 URL 下载&lt;br /&gt;
* 应该保存在哪个目录&lt;br /&gt;
* 应该使用哪个 commit&lt;br /&gt;
* 换电脑后应该怎样恢复&lt;br /&gt;
* 主配置回滚时，Vertico 应该回到哪个版本&lt;br /&gt;
&lt;br /&gt;
.gitmodules 内容大致如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[submodule &amp;quot;travel/packages/vertico&amp;quot;]&lt;br /&gt;
    path = travel/packages/vertico&lt;br /&gt;
    url = https://github.com/minad/vertico.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
submodule 还会记录一条指向某个 commit 的 gitlink。&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 仓库&lt;br /&gt;
! 负责记录什么&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;~/.emacs.d&amp;lt;/code&amp;gt; 主仓库&lt;br /&gt;
|自己的配置文件，以及每个插件应使用哪个 commit&lt;br /&gt;
|-&lt;br /&gt;
|Vertico 子仓库&lt;br /&gt;
|Vertico 源码和 Vertico 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Consult 子仓库&lt;br /&gt;
|Consult 源码和 Consult 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Magit 子仓库&lt;br /&gt;
|Magit 源码和 Magit 自己的完整开发历史&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这种设计避免了两个问题：&lt;br /&gt;
&lt;br /&gt;
# 不把别人写的几百个插件源码文件伪装成自己的文件&lt;br /&gt;
# 又能让配置仓库精确声明自己依赖哪个插件版本&lt;br /&gt;
&lt;br /&gt;
submodule 最重要的价值&lt;br /&gt;
# 固定插件版本，它记录的不是模糊的“使用最新版”，而是，这套配置经过测试时，各插件分别停留在哪个准确版本。这相当于给插件环境加了一把版本锁。&lt;br /&gt;
# 整体回滚。主仓库回滚到 abc1234，子仓库也会恢复到当时的状态。普通嵌套 &amp;lt;code&amp;gt;git clone&amp;lt;/code&amp;gt; 做不到这一点。即使主配置回到一个月前，插件仍可能停留在今天的新版本。&lt;br /&gt;
# 异地完整复现。&amp;lt;code&amp;gt;git clone --recurse-submodules URL PATH&amp;lt;/code&amp;gt;，恢复出来的插件环境与原电脑一致。&lt;br /&gt;
# 明确记录插件升级。使用 submodule 后，升级插件会被主仓库识别为一次正式变化，这让插件升级变成一种可查看、可测试、可提交、可撤销的操作。&lt;br /&gt;
&lt;br /&gt;
== 工作流 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
## 配置&lt;br /&gt;
git config diff.submodule lo&lt;br /&gt;
git config status.submodulesummary 1&lt;br /&gt;
&lt;br /&gt;
## 添加&lt;br /&gt;
cd ~/.emacs.d&lt;br /&gt;
git init -b main&lt;br /&gt;
git submodule add https://github.com/minad/vertico.git travel/packages/vertico&lt;br /&gt;
git status&lt;br /&gt;
git commit -m &amp;quot;Add Vertico submodule&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## 查看&lt;br /&gt;
git -C travel/packages/vertico log --oneline --decorate -10&lt;br /&gt;
git submodule status&lt;br /&gt;
&lt;br /&gt;
## 升级 &lt;br /&gt;
git submodule update --remote -- travel/packages/vertico&lt;br /&gt;
git diff --submodule=log&lt;br /&gt;
&lt;br /&gt;
## 保留&lt;br /&gt;
git add travel/packages/vertico&lt;br /&gt;
git commit -m &amp;quot;Update Vertico&amp;quot; # commit 了才正式获得了主仓库的承认&lt;br /&gt;
&lt;br /&gt;
## 放弃 &lt;br /&gt;
git submodule update --checkout --force -- travel/packages/vertico # 未提交时，放弃，或&lt;br /&gt;
git revert 7ac39fe &amp;amp;&amp;amp; git submodule update --init --recursive # 错提交后，放弃&lt;br /&gt;
&lt;br /&gt;
## 删除 &lt;br /&gt;
git rm travel/packages/vertico&lt;br /&gt;
git rm travel/40-test/init-vertico.el&lt;br /&gt;
git commit -m &amp;quot;Remove Vertico&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## 暂停&lt;br /&gt;
git submodule deinit -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
## 不暂停&lt;br /&gt;
git submodule update --init -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
## 移机&lt;br /&gt;
git clone --recurse-submodules 主仓库URL ~/.emacs.d # 一次搞定，或&lt;br /&gt;
git pull &amp;amp;&amp;amp; git submodule update --init --recursive # 两次搞定&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 经验 ==&lt;br /&gt;
* 不要修改插件原始仓库。不应把自己的配置写进子仓库。&lt;br /&gt;
* 一次升级一个插件，一个插件形成一个独立提交。&lt;br /&gt;
&lt;br /&gt;
== detached ==&lt;br /&gt;
git status 时发现 submodule 经常处于 detached HEAD？这在 submodule 中通常是正常现象。主仓库需要插件准确停在某个 commit，而不是随时变化。对只使用插件、不直接参与开发插件的人而言，这不是故障，而是版本锁定的正常状态。submodule 应该少升级、慢升级、一次一个、稳定后再提交。submodule 最大的价值不是方便追逐最新版，而是方便长期固定已验证版本。&lt;br /&gt;
&lt;br /&gt;
== 边界 == &lt;br /&gt;
Git submodule 只负责源码仓库和版本关系，不是完整的 Emacs 包管理器。它不会自动完成：&lt;br /&gt;
* 把插件加入 &amp;lt;code&amp;gt;load-path&amp;lt;/code&amp;gt;&lt;br /&gt;
* 执行 &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt;&lt;br /&gt;
* 安装插件依赖&lt;br /&gt;
* 生成 autoload&lt;br /&gt;
* 字节编译&lt;br /&gt;
* native compilation&lt;br /&gt;
* 编写 &amp;lt;code&amp;gt;setq&amp;lt;/code&amp;gt;&lt;br /&gt;
* 添加 hook&lt;br /&gt;
* 配置快捷键&lt;br /&gt;
&lt;br /&gt;
例如 Consult 依赖其他插件时，Git 不会自动读取 Emacs 的 &amp;lt;code&amp;gt;Package-Requires&amp;lt;/code&amp;gt; 并安装依赖。需要自己继续添加依赖：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git submodule add 依赖仓库URL travel/packages/依赖名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git submodule 的本质是，放弃包管理器的一部分自动化，换取透明、固定、可控和可复现。对于大量、频繁更新的插件，手工管理会比较繁琐；对于少量精选、长期固定、谨慎升级的插件，非常合适。&lt;br /&gt;
&lt;br /&gt;
普通 clone 插件只是碰巧存在于这台电脑。Git submodule，插件是主项目正式声明的一项依赖，正式记录插件的 URL、保存路径和准确版本。&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11529</id>
		<title>Git submodule 的精准用法</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11529"/>
		<updated>2026-07-22T13:18:56Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: /* 工作流 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Git submodule 适合这种情况：&lt;br /&gt;
* 主项目需要别的子项目&lt;br /&gt;
* 主项目管理别的子项目的版本&lt;br /&gt;
&lt;br /&gt;
== 概念 ==&lt;br /&gt;
在 Emacs 配置中，可以把 ~/.emacs.d/ 视为主仓库。把 Vertico Consult Magit 等视为子仓库。&lt;br /&gt;
&lt;br /&gt;
单凭 git clone 子仓库，Emacs 也可以用。但主仓库对子仓库的完整细节缺乏了解。&lt;br /&gt;
&lt;br /&gt;
而 git submodule add 可以解决&lt;br /&gt;
* Vertico 从哪个 URL 下载&lt;br /&gt;
* 应该保存在哪个目录&lt;br /&gt;
* 应该使用哪个 commit&lt;br /&gt;
* 换电脑后应该怎样恢复&lt;br /&gt;
* 主配置回滚时，Vertico 应该回到哪个版本&lt;br /&gt;
&lt;br /&gt;
.gitmodules 内容大致如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[submodule &amp;quot;travel/packages/vertico&amp;quot;]&lt;br /&gt;
    path = travel/packages/vertico&lt;br /&gt;
    url = https://github.com/minad/vertico.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
submodule 还会记录一条指向某个 commit 的 gitlink。&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 仓库&lt;br /&gt;
! 负责记录什么&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;~/.emacs.d&amp;lt;/code&amp;gt; 主仓库&lt;br /&gt;
|自己的配置文件，以及每个插件应使用哪个 commit&lt;br /&gt;
|-&lt;br /&gt;
|Vertico 子仓库&lt;br /&gt;
|Vertico 源码和 Vertico 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Consult 子仓库&lt;br /&gt;
|Consult 源码和 Consult 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Magit 子仓库&lt;br /&gt;
|Magit 源码和 Magit 自己的完整开发历史&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这种设计避免了两个问题：&lt;br /&gt;
&lt;br /&gt;
# 不把别人写的几百个插件源码文件伪装成自己的文件&lt;br /&gt;
# 又能让配置仓库精确声明自己依赖哪个插件版本&lt;br /&gt;
&lt;br /&gt;
submodule 最重要的价值&lt;br /&gt;
# 固定插件版本，它记录的不是模糊的“使用最新版”，而是，这套配置经过测试时，各插件分别停留在哪个准确版本。这相当于给插件环境加了一把版本锁。&lt;br /&gt;
# 整体回滚。主仓库回滚到 abc1234，子仓库也会恢复到当时的状态。普通嵌套 &amp;lt;code&amp;gt;git clone&amp;lt;/code&amp;gt; 做不到这一点。即使主配置回到一个月前，插件仍可能停留在今天的新版本。&lt;br /&gt;
# 异地完整复现。&amp;lt;code&amp;gt;git clone --recurse-submodules URL PATH&amp;lt;/code&amp;gt;，恢复出来的插件环境与原电脑一致。&lt;br /&gt;
# 明确记录插件升级。使用 submodule 后，升级插件会被主仓库识别为一次正式变化，这让插件升级变成一种可查看、可测试、可提交、可撤销的操作。&lt;br /&gt;
&lt;br /&gt;
== 工作流 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
## 配置&lt;br /&gt;
git config diff.submodule lo&lt;br /&gt;
git config status.submodulesummary 1&lt;br /&gt;
&lt;br /&gt;
## 添加&lt;br /&gt;
cd ~/.emacs.d&lt;br /&gt;
git init -b main&lt;br /&gt;
git submodule add https://github.com/minad/vertico.git travel/packages/vertico&lt;br /&gt;
git status&lt;br /&gt;
git commit -m &amp;quot;Add Vertico submodule&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## 查看&lt;br /&gt;
git -C travel/packages/vertico log --oneline --decorate -10&lt;br /&gt;
git submodule status&lt;br /&gt;
&lt;br /&gt;
## 升级 &lt;br /&gt;
git submodule update --remote -- travel/packages/vertico&lt;br /&gt;
git diff --submodule=log&lt;br /&gt;
&lt;br /&gt;
## 保留&lt;br /&gt;
git add travel/packages/vertico&lt;br /&gt;
git commit -m &amp;quot;Update Vertico&amp;quot; # commit 了才正式获得了主仓库的承认&lt;br /&gt;
&lt;br /&gt;
## 放弃 &lt;br /&gt;
git submodule update --checkout --force -- travel/packages/vertico # 未提交时，放弃，或&lt;br /&gt;
git revert 7ac39fe &amp;amp;&amp;amp; git submodule update --init --recursive # 错提交后，放弃&lt;br /&gt;
&lt;br /&gt;
## 删除 &lt;br /&gt;
git rm travel/packages/vertico&lt;br /&gt;
git rm travel/40-test/init-vertico.el&lt;br /&gt;
git commit -m &amp;quot;Remove Vertico&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## 暂停&lt;br /&gt;
git submodule deinit -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
## 不暂停&lt;br /&gt;
git submodule update --init -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
## 移机&lt;br /&gt;
git clone --recurse-submodules 主仓库URL ~/.emacs.d # 一次搞定，或&lt;br /&gt;
git pull &amp;amp;&amp;amp; git submodule update --init --recursive # 两次搞定&lt;br /&gt;
&lt;br /&gt;
## 初始化&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 经验 ==&lt;br /&gt;
* 不要修改插件原始仓库。不应把自己的配置写进子仓库。&lt;br /&gt;
* 一次升级一个插件，一个插件形成一个独立提交。&lt;br /&gt;
&lt;br /&gt;
== detached ==&lt;br /&gt;
git status 时发现 submodule 经常处于 detached HEAD？这在 submodule 中通常是正常现象。主仓库需要插件准确停在某个 commit，而不是随时变化。对只使用插件、不直接参与开发插件的人而言，这不是故障，而是版本锁定的正常状态。submodule 应该少升级、慢升级、一次一个、稳定后再提交。submodule 最大的价值不是方便追逐最新版，而是方便长期固定已验证版本。&lt;br /&gt;
&lt;br /&gt;
== 边界 == &lt;br /&gt;
Git submodule 只负责源码仓库和版本关系，不是完整的 Emacs 包管理器。它不会自动完成：&lt;br /&gt;
* 把插件加入 &amp;lt;code&amp;gt;load-path&amp;lt;/code&amp;gt;&lt;br /&gt;
* 执行 &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt;&lt;br /&gt;
* 安装插件依赖&lt;br /&gt;
* 生成 autoload&lt;br /&gt;
* 字节编译&lt;br /&gt;
* native compilation&lt;br /&gt;
* 编写 &amp;lt;code&amp;gt;setq&amp;lt;/code&amp;gt;&lt;br /&gt;
* 添加 hook&lt;br /&gt;
* 配置快捷键&lt;br /&gt;
&lt;br /&gt;
例如 Consult 依赖其他插件时，Git 不会自动读取 Emacs 的 &amp;lt;code&amp;gt;Package-Requires&amp;lt;/code&amp;gt; 并安装依赖。需要自己继续添加依赖：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git submodule add 依赖仓库URL travel/packages/依赖名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git submodule 的本质是，放弃包管理器的一部分自动化，换取透明、固定、可控和可复现。对于大量、频繁更新的插件，手工管理会比较繁琐；对于少量精选、长期固定、谨慎升级的插件，非常合适。&lt;br /&gt;
&lt;br /&gt;
普通 clone 插件只是碰巧存在于这台电脑。Git submodule，插件是主项目正式声明的一项依赖，正式记录插件的 URL、保存路径和准确版本。&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11528</id>
		<title>Git submodule 的精准用法</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11528"/>
		<updated>2026-07-22T13:17:45Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Git submodule 适合这种情况：&lt;br /&gt;
* 主项目需要别的子项目&lt;br /&gt;
* 主项目管理别的子项目的版本&lt;br /&gt;
&lt;br /&gt;
== 概念 ==&lt;br /&gt;
在 Emacs 配置中，可以把 ~/.emacs.d/ 视为主仓库。把 Vertico Consult Magit 等视为子仓库。&lt;br /&gt;
&lt;br /&gt;
单凭 git clone 子仓库，Emacs 也可以用。但主仓库对子仓库的完整细节缺乏了解。&lt;br /&gt;
&lt;br /&gt;
而 git submodule add 可以解决&lt;br /&gt;
* Vertico 从哪个 URL 下载&lt;br /&gt;
* 应该保存在哪个目录&lt;br /&gt;
* 应该使用哪个 commit&lt;br /&gt;
* 换电脑后应该怎样恢复&lt;br /&gt;
* 主配置回滚时，Vertico 应该回到哪个版本&lt;br /&gt;
&lt;br /&gt;
.gitmodules 内容大致如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[submodule &amp;quot;travel/packages/vertico&amp;quot;]&lt;br /&gt;
    path = travel/packages/vertico&lt;br /&gt;
    url = https://github.com/minad/vertico.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
submodule 还会记录一条指向某个 commit 的 gitlink。&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 仓库&lt;br /&gt;
! 负责记录什么&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;~/.emacs.d&amp;lt;/code&amp;gt; 主仓库&lt;br /&gt;
|自己的配置文件，以及每个插件应使用哪个 commit&lt;br /&gt;
|-&lt;br /&gt;
|Vertico 子仓库&lt;br /&gt;
|Vertico 源码和 Vertico 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Consult 子仓库&lt;br /&gt;
|Consult 源码和 Consult 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Magit 子仓库&lt;br /&gt;
|Magit 源码和 Magit 自己的完整开发历史&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这种设计避免了两个问题：&lt;br /&gt;
&lt;br /&gt;
# 不把别人写的几百个插件源码文件伪装成自己的文件&lt;br /&gt;
# 又能让配置仓库精确声明自己依赖哪个插件版本&lt;br /&gt;
&lt;br /&gt;
submodule 最重要的价值&lt;br /&gt;
# 固定插件版本，它记录的不是模糊的“使用最新版”，而是，这套配置经过测试时，各插件分别停留在哪个准确版本。这相当于给插件环境加了一把版本锁。&lt;br /&gt;
# 整体回滚。主仓库回滚到 abc1234，子仓库也会恢复到当时的状态。普通嵌套 &amp;lt;code&amp;gt;git clone&amp;lt;/code&amp;gt; 做不到这一点。即使主配置回到一个月前，插件仍可能停留在今天的新版本。&lt;br /&gt;
# 异地完整复现。&amp;lt;code&amp;gt;git clone --recurse-submodules URL PATH&amp;lt;/code&amp;gt;，恢复出来的插件环境与原电脑一致。&lt;br /&gt;
# 明确记录插件升级。使用 submodule 后，升级插件会被主仓库识别为一次正式变化，这让插件升级变成一种可查看、可测试、可提交、可撤销的操作。&lt;br /&gt;
&lt;br /&gt;
== 工作流 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; line&amp;gt;&lt;br /&gt;
## 配置&lt;br /&gt;
git config diff.submodule lo&lt;br /&gt;
git config status.submodulesummary 1&lt;br /&gt;
&lt;br /&gt;
## 添加&lt;br /&gt;
cd ~/.emacs.d&lt;br /&gt;
git init -b main&lt;br /&gt;
git submodule add https://github.com/minad/vertico.git travel/packages/vertico&lt;br /&gt;
git status&lt;br /&gt;
git commit -m &amp;quot;Add Vertico submodule&amp;quot;&lt;br /&gt;
&lt;br /&gt;
## 查看&lt;br /&gt;
git -C travel/packages/vertico log --oneline --decorate -10&lt;br /&gt;
git submodule status&lt;br /&gt;
&lt;br /&gt;
## 升级 &lt;br /&gt;
git submodule update --remote -- travel/packages/vertico&lt;br /&gt;
git diff --submodule=log&lt;br /&gt;
&lt;br /&gt;
## 保留&lt;br /&gt;
git add travel/packages/vertico&lt;br /&gt;
git commit -m &amp;quot;Update Vertico&amp;quot; # commit 了才正式获得了主仓库的承认&lt;br /&gt;
&lt;br /&gt;
## 放弃 &lt;br /&gt;
git submodule update --checkout --force -- travel/packages/vertico # 未提交时，放弃，或&lt;br /&gt;
git revert 7ac39fe &amp;amp;&amp;amp; git submodule update --init --recursive # 错提交后，放弃&lt;br /&gt;
&lt;br /&gt;
## 删除 &lt;br /&gt;
git rm travel/packages/vertico&lt;br /&gt;
git rm travel/40-test/init-vertico.el&lt;br /&gt;
git commit -m &amp;quot;Remove Vertico&amp;quot; &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
## 暂停&lt;br /&gt;
git submodule deinit -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
## 不暂停&lt;br /&gt;
git submodule update --init -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
## 移机&lt;br /&gt;
git clone --recurse-submodules 主仓库URL ~/.emacs.d # 一次搞定，或&lt;br /&gt;
git pull &amp;amp;&amp;amp; git submodule update --init --recursive # 两次搞定&lt;br /&gt;
&lt;br /&gt;
## 初始化&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 经验 ==&lt;br /&gt;
* 不要修改插件原始仓库。不应把自己的配置写进子仓库。&lt;br /&gt;
* 一次升级一个插件，一个插件形成一个独立提交。&lt;br /&gt;
&lt;br /&gt;
== detached ==&lt;br /&gt;
git status 时发现 submodule 经常处于 detached HEAD？这在 submodule 中通常是正常现象。主仓库需要插件准确停在某个 commit，而不是随时变化。对只使用插件、不直接参与开发插件的人而言，这不是故障，而是版本锁定的正常状态。submodule 应该少升级、慢升级、一次一个、稳定后再提交。submodule 最大的价值不是方便追逐最新版，而是方便长期固定已验证版本。&lt;br /&gt;
&lt;br /&gt;
== 边界 == &lt;br /&gt;
Git submodule 只负责源码仓库和版本关系，不是完整的 Emacs 包管理器。它不会自动完成：&lt;br /&gt;
* 把插件加入 &amp;lt;code&amp;gt;load-path&amp;lt;/code&amp;gt;&lt;br /&gt;
* 执行 &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt;&lt;br /&gt;
* 安装插件依赖&lt;br /&gt;
* 生成 autoload&lt;br /&gt;
* 字节编译&lt;br /&gt;
* native compilation&lt;br /&gt;
* 编写 &amp;lt;code&amp;gt;setq&amp;lt;/code&amp;gt;&lt;br /&gt;
* 添加 hook&lt;br /&gt;
* 配置快捷键&lt;br /&gt;
&lt;br /&gt;
例如 Consult 依赖其他插件时，Git 不会自动读取 Emacs 的 &amp;lt;code&amp;gt;Package-Requires&amp;lt;/code&amp;gt; 并安装依赖。需要自己继续添加依赖：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git submodule add 依赖仓库URL travel/packages/依赖名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Git submodule 的本质是，放弃包管理器的一部分自动化，换取透明、固定、可控和可复现。对于大量、频繁更新的插件，手工管理会比较繁琐；对于少量精选、长期固定、谨慎升级的插件，非常合适。&lt;br /&gt;
&lt;br /&gt;
普通 clone 插件只是碰巧存在于这台电脑。Git submodule，插件是主项目正式声明的一项依赖，正式记录插件的 URL、保存路径和准确版本。&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11527</id>
		<title>Git submodule 的精准用法</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11527"/>
		<updated>2026-07-22T12:53:43Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: /* 日常更新 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Git submodule 适合这种情况：&lt;br /&gt;
* 主项目需要别的子项目&lt;br /&gt;
* 主项目管理别的子项目的版本&lt;br /&gt;
&lt;br /&gt;
== 概念 ==&lt;br /&gt;
在 Emacs 配置中，可以把 ~/.emacs.d/ 视为主仓库。把 Vertico Consult Magit 等视为子仓库。&lt;br /&gt;
&lt;br /&gt;
单凭 git clone 子仓库，Emacs 也可以用。但主仓库对子仓库的完整细节缺乏了解。&lt;br /&gt;
&lt;br /&gt;
而 git submodule add 可以解决&lt;br /&gt;
* Vertico 从哪个 URL 下载&lt;br /&gt;
* 应该保存在哪个目录&lt;br /&gt;
* 应该使用哪个 commit&lt;br /&gt;
* 换电脑后应该怎样恢复&lt;br /&gt;
* 主配置回滚时，Vertico 应该回到哪个版本&lt;br /&gt;
&lt;br /&gt;
.gitmodules 内容大致如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[submodule &amp;quot;travel/packages/vertico&amp;quot;]&lt;br /&gt;
    path = travel/packages/vertico&lt;br /&gt;
    url = https://github.com/minad/vertico.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
submodule 还会记录一条指向某个 commit 的 gitlink。&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 仓库&lt;br /&gt;
! 负责记录什么&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;~/.emacs.d&amp;lt;/code&amp;gt; 主仓库&lt;br /&gt;
|自己的配置文件，以及每个插件应使用哪个 commit&lt;br /&gt;
|-&lt;br /&gt;
|Vertico 子仓库&lt;br /&gt;
|Vertico 源码和 Vertico 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Consult 子仓库&lt;br /&gt;
|Consult 源码和 Consult 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Magit 子仓库&lt;br /&gt;
|Magit 源码和 Magit 自己的完整开发历史&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这种设计避免了两个问题：&lt;br /&gt;
&lt;br /&gt;
# 不把别人写的几百个插件源码文件伪装成自己的文件&lt;br /&gt;
# 又能让配置仓库精确声明自己依赖哪个插件版本&lt;br /&gt;
&lt;br /&gt;
submodule 最重要的价值&lt;br /&gt;
# 固定插件版本，它记录的不是模糊的“使用最新版”，而是，这套配置经过测试时，各插件分别停留在哪个准确版本。这相当于给插件环境加了一把版本锁。&lt;br /&gt;
# 整体回滚。主仓库回滚到 abc1234，子仓库也会恢复到当时的状态。普通嵌套 &amp;lt;code&amp;gt;git clone&amp;lt;/code&amp;gt; 做不到这一点。即使主配置回到一个月前，插件仍可能停留在今天的新版本。&lt;br /&gt;
# 异地完整复现。&amp;lt;code&amp;gt;git clone --recurse-submodules URL PATH&amp;lt;/code&amp;gt;，恢复出来的插件环境与原电脑一致。&lt;br /&gt;
# 明确记录插件升级。使用 submodule 后，升级插件会被主仓库识别为一次正式变化，这让插件升级变成一种可查看、可测试、可提交、可撤销的操作。&lt;br /&gt;
&lt;br /&gt;
== 工作流 ==&lt;br /&gt;
=== 配置 ===&lt;br /&gt;
# git config diff.submodule log&lt;br /&gt;
# git config status.submodulesummary 1&lt;br /&gt;
&lt;br /&gt;
=== 添加 ===&lt;br /&gt;
# cd ~/.emacs.d&lt;br /&gt;
# git init -b main&lt;br /&gt;
# git submodule add https://github.com/minad/vertico.git travel/packages/vertico&lt;br /&gt;
# git status&lt;br /&gt;
# git commit -m &amp;quot;Add Vertico submodule&amp;quot;&lt;br /&gt;
# git submodule status&lt;br /&gt;
&lt;br /&gt;
不要修改插件原始仓库。不应把自己的配置写进子仓库。&lt;br /&gt;
&lt;br /&gt;
=== 查看 ===&lt;br /&gt;
# git -C travel/packages/vertico log --oneline --decorate -10&lt;br /&gt;
&lt;br /&gt;
=== 升级 ===&lt;br /&gt;
# git submodule update --remote -- travel/packages/vertico&lt;br /&gt;
# git diff --submodule=log&lt;br /&gt;
&lt;br /&gt;
=== 保留 ===&lt;br /&gt;
# git add travel/packages/vertico&lt;br /&gt;
# git commit -m &amp;quot;Update Vertico&amp;quot; ;; commit 了才正式获得了主仓库的承认&lt;br /&gt;
&lt;br /&gt;
一次升级一个插件，一个插件形成一个独立提交。&lt;br /&gt;
&lt;br /&gt;
=== 未提交+放弃 ===&lt;br /&gt;
如果执行升级后发现新版本有问题，而且还没有提交：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git submodule update \&lt;br /&gt;
  --checkout \&lt;br /&gt;
  --force \&lt;br /&gt;
  -- travel/packages/vertico&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这就是最简单的“升级失败，退回旧版”。&lt;br /&gt;
&lt;br /&gt;
=== 已提交+放弃 ===&lt;br /&gt;
假设升级 Vertico 的提交是：7ac39fe Update Vertico&lt;br /&gt;
&lt;br /&gt;
可以在主仓库运行：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git revert 7ac39fe&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git revert&amp;lt;/code&amp;gt; 会新增一个提交，撤销那次插件升级；随后 &amp;lt;code&amp;gt;git submodule update&amp;lt;/code&amp;gt; 让磁盘上的插件切回旧 commit。&lt;br /&gt;
&lt;br /&gt;
这种做法比随意修改子仓库历史更清楚，因为决定插件正式版本的是主仓库中的 gitlink，而不是子仓库当前碰巧停留在哪里。&lt;br /&gt;
&lt;br /&gt;
=== detached ===&lt;br /&gt;
git status 时发现 submodule 经常处于 detached HEAD？&lt;br /&gt;
&lt;br /&gt;
这在 submodule 中通常是正常现象。&lt;br /&gt;
&lt;br /&gt;
主仓库需要插件准确停在某个 commit，而不是随时变化。对只使用插件、不直接参与开发插件的人而言，这不是故障，而是版本锁定的正常状态。&lt;br /&gt;
&lt;br /&gt;
submodule 应该少升级、慢升级、一次一个、稳定后再提交。submodule 最大的价值不是方便追逐最新版，而是方便长期固定已验证版本。&lt;br /&gt;
&lt;br /&gt;
=== 删除 ===&lt;br /&gt;
# git rm travel/packages/vertico&lt;br /&gt;
# git rm travel/40-test/init-vertico.el&lt;br /&gt;
# git commit -m &amp;quot;Remove Vertico&amp;quot; &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git rm&amp;lt;/code&amp;gt; 会同时更新主仓库索引和 &amp;lt;code&amp;gt;.gitmodules&amp;lt;/code&amp;gt; 中相应的 submodule 记录。&lt;br /&gt;
&lt;br /&gt;
=== 暂停 ===&lt;br /&gt;
# git submodule deinit -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
=== 不暂停 ===&lt;br /&gt;
# git submodule update --init -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
=== 移机 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
;; 一次性移机主仓库和子仓库&lt;br /&gt;
git clone --recurse-submodules \&lt;br /&gt;
  主仓库URL \&lt;br /&gt;
  ~/.emacs.d&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
或者，&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
;; 先移机主仓库&lt;br /&gt;
;; 再移机子仓库&lt;br /&gt;
git clone 主仓库URL ~/.emacs.d&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 日常更新 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git pull&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第二条命令让本机插件真正切换到主仓库指定的版本。&lt;br /&gt;
&lt;br /&gt;
单纯运行第一条命令不太够。&lt;br /&gt;
&lt;br /&gt;
== 边界 == &lt;br /&gt;
Git submodule 只负责源码仓库和版本关系，不是完整的 Emacs 包管理器。&lt;br /&gt;
&lt;br /&gt;
它不会自动完成：&lt;br /&gt;
* 把插件加入 &amp;lt;code&amp;gt;load-path&amp;lt;/code&amp;gt;&lt;br /&gt;
* 执行 &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt;&lt;br /&gt;
* 安装插件依赖&lt;br /&gt;
* 生成 autoload&lt;br /&gt;
* 字节编译&lt;br /&gt;
* native compilation&lt;br /&gt;
* 编写 &amp;lt;code&amp;gt;setq&amp;lt;/code&amp;gt;&lt;br /&gt;
* 添加 hook&lt;br /&gt;
* 配置快捷键&lt;br /&gt;
&lt;br /&gt;
例如 Consult 依赖其他插件时，Git 不会自动读取 Emacs 的 &amp;lt;code&amp;gt;Package-Requires&amp;lt;/code&amp;gt; 并安装依赖。&lt;br /&gt;
&lt;br /&gt;
需要自己继续添加依赖：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git submodule add 依赖仓库URL travel/packages/依赖名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后自己配置加载关系。&lt;br /&gt;
&lt;br /&gt;
Git submodule 的本质是，放弃包管理器的一部分自动化，换取透明、固定、可控和可复现。对于大量、频繁更新的插件，手工管理会比较繁琐；对于少量精选、长期固定、谨慎升级的插件，非常合适。&lt;br /&gt;
&lt;br /&gt;
== 对比 ==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 能力&lt;br /&gt;
! 普通嵌套 git clone&lt;br /&gt;
! Git submodule&lt;br /&gt;
|-&lt;br /&gt;
|插件能否运行&lt;br /&gt;
|能&lt;br /&gt;
|能&lt;br /&gt;
|-&lt;br /&gt;
|插件保持独立仓库&lt;br /&gt;
|能&lt;br /&gt;
|能&lt;br /&gt;
|-&lt;br /&gt;
|主仓库记录插件 URL&lt;br /&gt;
|否&lt;br /&gt;
|是&lt;br /&gt;
|-&lt;br /&gt;
|主仓库记录插件路径&lt;br /&gt;
|否&lt;br /&gt;
|是&lt;br /&gt;
|-&lt;br /&gt;
|主仓库锁定插件 commit&lt;br /&gt;
|否&lt;br /&gt;
|是&lt;br /&gt;
|-&lt;br /&gt;
|换电脑后一条命令恢复&lt;br /&gt;
|否&lt;br /&gt;
|是&lt;br /&gt;
|-&lt;br /&gt;
|主配置和插件整体回滚&lt;br /&gt;
|否&lt;br /&gt;
|是&lt;br /&gt;
|-&lt;br /&gt;
|正式记录插件升级&lt;br /&gt;
|否&lt;br /&gt;
|是&lt;br /&gt;
|-&lt;br /&gt;
|保留插件自己的完整历史&lt;br /&gt;
|是&lt;br /&gt;
|是&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
最核心的区别是，普通 clone 插件只是碰巧存在于这台电脑。Git submodule，插件是主项目正式声明的一项依赖。&lt;br /&gt;
&lt;br /&gt;
== 工作流 ==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 目的&lt;br /&gt;
! 命令&lt;br /&gt;
|-&lt;br /&gt;
|添加插件&lt;br /&gt;
|&amp;lt;code&amp;gt;git submodule add URL PATH&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|查看所有插件版本&lt;br /&gt;
|&amp;lt;code&amp;gt;git submodule status&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|升级一个插件&lt;br /&gt;
|&amp;lt;code&amp;gt;git submodule update --remote -- PATH&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|查看插件升级内容&lt;br /&gt;
|&amp;lt;code&amp;gt;git diff --submodule=log&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|接受插件升级&lt;br /&gt;
|&amp;lt;code&amp;gt;git add PATH &amp;amp;&amp;amp; git commit&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|放弃未提交的升级&lt;br /&gt;
|&amp;lt;code&amp;gt;git submodule update --checkout --force -- PATH&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|初始化全部插件&lt;br /&gt;
|&amp;lt;code&amp;gt;git submodule update --init --recursive&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|克隆主仓库和全部插件&lt;br /&gt;
|&amp;lt;code&amp;gt;git clone --recurse-submodules URL&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|暂时停用本机插件&lt;br /&gt;
|&amp;lt;code&amp;gt;git submodule deinit -- PATH&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|永久删除插件&lt;br /&gt;
|&amp;lt;code&amp;gt;git rm PATH &amp;amp;&amp;amp; git commit&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|查看插件自己的日志&lt;br /&gt;
|&amp;lt;code&amp;gt;git -C PATH log --oneline&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git submodule update \&lt;br /&gt;
  --remote \&lt;br /&gt;
  -- travel/packages/插件名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 查看升级内容 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git diff --submodule=log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 测试失败，恢复旧版 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git submodule update \&lt;br /&gt;
  --checkout \&lt;br /&gt;
  --force \&lt;br /&gt;
  -- travel/packages/插件名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 测试成功，接受新版 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git add travel/packages/插件名&lt;br /&gt;
git commit -m &amp;quot;Update 插件名&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 删除插件 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git rm travel/packages/插件名&lt;br /&gt;
git rm travel/对应状态目录/init-插件名.el&lt;br /&gt;
git commit -m &amp;quot;Remove 插件名&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 换电脑完整恢复 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone --recurse-submodules \&lt;br /&gt;
  主仓库URL \&lt;br /&gt;
  ~/.emacs.d&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 总结 ==&lt;br /&gt;
&lt;br /&gt;
普通 &amp;lt;code&amp;gt;git clone&amp;lt;/code&amp;gt; 只是：&lt;br /&gt;
&lt;br /&gt;
:把插件下载到了当前电脑。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git submodule add&amp;lt;/code&amp;gt; 则是：&lt;br /&gt;
&lt;br /&gt;
:让主仓库正式记录插件的 URL、保存路径和准确版本。&lt;br /&gt;
&lt;br /&gt;
Git submodule 对 Emacs 插件管理最大的意义是：&lt;br /&gt;
&lt;br /&gt;
:对插件版本状态进行精确控制，使整套配置可以稳定锁定、明确升级、快速回滚，并在其他电脑上一键复现。&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11526</id>
		<title>Git submodule 的精准用法</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11526"/>
		<updated>2026-07-22T12:53:23Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: /* 移机 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Git submodule 适合这种情况：&lt;br /&gt;
* 主项目需要别的子项目&lt;br /&gt;
* 主项目管理别的子项目的版本&lt;br /&gt;
&lt;br /&gt;
== 概念 ==&lt;br /&gt;
在 Emacs 配置中，可以把 ~/.emacs.d/ 视为主仓库。把 Vertico Consult Magit 等视为子仓库。&lt;br /&gt;
&lt;br /&gt;
单凭 git clone 子仓库，Emacs 也可以用。但主仓库对子仓库的完整细节缺乏了解。&lt;br /&gt;
&lt;br /&gt;
而 git submodule add 可以解决&lt;br /&gt;
* Vertico 从哪个 URL 下载&lt;br /&gt;
* 应该保存在哪个目录&lt;br /&gt;
* 应该使用哪个 commit&lt;br /&gt;
* 换电脑后应该怎样恢复&lt;br /&gt;
* 主配置回滚时，Vertico 应该回到哪个版本&lt;br /&gt;
&lt;br /&gt;
.gitmodules 内容大致如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[submodule &amp;quot;travel/packages/vertico&amp;quot;]&lt;br /&gt;
    path = travel/packages/vertico&lt;br /&gt;
    url = https://github.com/minad/vertico.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
submodule 还会记录一条指向某个 commit 的 gitlink。&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 仓库&lt;br /&gt;
! 负责记录什么&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;~/.emacs.d&amp;lt;/code&amp;gt; 主仓库&lt;br /&gt;
|自己的配置文件，以及每个插件应使用哪个 commit&lt;br /&gt;
|-&lt;br /&gt;
|Vertico 子仓库&lt;br /&gt;
|Vertico 源码和 Vertico 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Consult 子仓库&lt;br /&gt;
|Consult 源码和 Consult 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Magit 子仓库&lt;br /&gt;
|Magit 源码和 Magit 自己的完整开发历史&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这种设计避免了两个问题：&lt;br /&gt;
&lt;br /&gt;
# 不把别人写的几百个插件源码文件伪装成自己的文件&lt;br /&gt;
# 又能让配置仓库精确声明自己依赖哪个插件版本&lt;br /&gt;
&lt;br /&gt;
submodule 最重要的价值&lt;br /&gt;
# 固定插件版本，它记录的不是模糊的“使用最新版”，而是，这套配置经过测试时，各插件分别停留在哪个准确版本。这相当于给插件环境加了一把版本锁。&lt;br /&gt;
# 整体回滚。主仓库回滚到 abc1234，子仓库也会恢复到当时的状态。普通嵌套 &amp;lt;code&amp;gt;git clone&amp;lt;/code&amp;gt; 做不到这一点。即使主配置回到一个月前，插件仍可能停留在今天的新版本。&lt;br /&gt;
# 异地完整复现。&amp;lt;code&amp;gt;git clone --recurse-submodules URL PATH&amp;lt;/code&amp;gt;，恢复出来的插件环境与原电脑一致。&lt;br /&gt;
# 明确记录插件升级。使用 submodule 后，升级插件会被主仓库识别为一次正式变化，这让插件升级变成一种可查看、可测试、可提交、可撤销的操作。&lt;br /&gt;
&lt;br /&gt;
== 工作流 ==&lt;br /&gt;
=== 配置 ===&lt;br /&gt;
# git config diff.submodule log&lt;br /&gt;
# git config status.submodulesummary 1&lt;br /&gt;
&lt;br /&gt;
=== 添加 ===&lt;br /&gt;
# cd ~/.emacs.d&lt;br /&gt;
# git init -b main&lt;br /&gt;
# git submodule add https://github.com/minad/vertico.git travel/packages/vertico&lt;br /&gt;
# git status&lt;br /&gt;
# git commit -m &amp;quot;Add Vertico submodule&amp;quot;&lt;br /&gt;
# git submodule status&lt;br /&gt;
&lt;br /&gt;
不要修改插件原始仓库。不应把自己的配置写进子仓库。&lt;br /&gt;
&lt;br /&gt;
=== 查看 ===&lt;br /&gt;
# git -C travel/packages/vertico log --oneline --decorate -10&lt;br /&gt;
&lt;br /&gt;
=== 升级 ===&lt;br /&gt;
# git submodule update --remote -- travel/packages/vertico&lt;br /&gt;
# git diff --submodule=log&lt;br /&gt;
&lt;br /&gt;
=== 保留 ===&lt;br /&gt;
# git add travel/packages/vertico&lt;br /&gt;
# git commit -m &amp;quot;Update Vertico&amp;quot; ;; commit 了才正式获得了主仓库的承认&lt;br /&gt;
&lt;br /&gt;
一次升级一个插件，一个插件形成一个独立提交。&lt;br /&gt;
&lt;br /&gt;
=== 未提交+放弃 ===&lt;br /&gt;
如果执行升级后发现新版本有问题，而且还没有提交：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git submodule update \&lt;br /&gt;
  --checkout \&lt;br /&gt;
  --force \&lt;br /&gt;
  -- travel/packages/vertico&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这就是最简单的“升级失败，退回旧版”。&lt;br /&gt;
&lt;br /&gt;
=== 已提交+放弃 ===&lt;br /&gt;
假设升级 Vertico 的提交是：7ac39fe Update Vertico&lt;br /&gt;
&lt;br /&gt;
可以在主仓库运行：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git revert 7ac39fe&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git revert&amp;lt;/code&amp;gt; 会新增一个提交，撤销那次插件升级；随后 &amp;lt;code&amp;gt;git submodule update&amp;lt;/code&amp;gt; 让磁盘上的插件切回旧 commit。&lt;br /&gt;
&lt;br /&gt;
这种做法比随意修改子仓库历史更清楚，因为决定插件正式版本的是主仓库中的 gitlink，而不是子仓库当前碰巧停留在哪里。&lt;br /&gt;
&lt;br /&gt;
=== detached ===&lt;br /&gt;
git status 时发现 submodule 经常处于 detached HEAD？&lt;br /&gt;
&lt;br /&gt;
这在 submodule 中通常是正常现象。&lt;br /&gt;
&lt;br /&gt;
主仓库需要插件准确停在某个 commit，而不是随时变化。对只使用插件、不直接参与开发插件的人而言，这不是故障，而是版本锁定的正常状态。&lt;br /&gt;
&lt;br /&gt;
submodule 应该少升级、慢升级、一次一个、稳定后再提交。submodule 最大的价值不是方便追逐最新版，而是方便长期固定已验证版本。&lt;br /&gt;
&lt;br /&gt;
=== 删除 ===&lt;br /&gt;
# git rm travel/packages/vertico&lt;br /&gt;
# git rm travel/40-test/init-vertico.el&lt;br /&gt;
# git commit -m &amp;quot;Remove Vertico&amp;quot; &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git rm&amp;lt;/code&amp;gt; 会同时更新主仓库索引和 &amp;lt;code&amp;gt;.gitmodules&amp;lt;/code&amp;gt; 中相应的 submodule 记录。&lt;br /&gt;
&lt;br /&gt;
=== 暂停 ===&lt;br /&gt;
# git submodule deinit -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
=== 不暂停 ===&lt;br /&gt;
# git submodule update --init -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
=== 移机 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
;; 一次性移机主仓库和子仓库&lt;br /&gt;
git clone --recurse-submodules \&lt;br /&gt;
  主仓库URL \&lt;br /&gt;
  ~/.emacs.d&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
或者，&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
;; 先移机主仓库&lt;br /&gt;
;; 再移机子仓库&lt;br /&gt;
git clone 主仓库URL ~/.emacs.d&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 日常更新 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git pull&lt;br /&gt;
git submodule update --init --recursive &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第二条命令让本机插件真正切换到主仓库指定的版本。&lt;br /&gt;
&lt;br /&gt;
单纯运行第一条命令不太够。&lt;br /&gt;
&lt;br /&gt;
== 边界 == &lt;br /&gt;
Git submodule 只负责源码仓库和版本关系，不是完整的 Emacs 包管理器。&lt;br /&gt;
&lt;br /&gt;
它不会自动完成：&lt;br /&gt;
* 把插件加入 &amp;lt;code&amp;gt;load-path&amp;lt;/code&amp;gt;&lt;br /&gt;
* 执行 &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt;&lt;br /&gt;
* 安装插件依赖&lt;br /&gt;
* 生成 autoload&lt;br /&gt;
* 字节编译&lt;br /&gt;
* native compilation&lt;br /&gt;
* 编写 &amp;lt;code&amp;gt;setq&amp;lt;/code&amp;gt;&lt;br /&gt;
* 添加 hook&lt;br /&gt;
* 配置快捷键&lt;br /&gt;
&lt;br /&gt;
例如 Consult 依赖其他插件时，Git 不会自动读取 Emacs 的 &amp;lt;code&amp;gt;Package-Requires&amp;lt;/code&amp;gt; 并安装依赖。&lt;br /&gt;
&lt;br /&gt;
需要自己继续添加依赖：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git submodule add 依赖仓库URL travel/packages/依赖名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后自己配置加载关系。&lt;br /&gt;
&lt;br /&gt;
Git submodule 的本质是，放弃包管理器的一部分自动化，换取透明、固定、可控和可复现。对于大量、频繁更新的插件，手工管理会比较繁琐；对于少量精选、长期固定、谨慎升级的插件，非常合适。&lt;br /&gt;
&lt;br /&gt;
== 对比 ==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 能力&lt;br /&gt;
! 普通嵌套 git clone&lt;br /&gt;
! Git submodule&lt;br /&gt;
|-&lt;br /&gt;
|插件能否运行&lt;br /&gt;
|能&lt;br /&gt;
|能&lt;br /&gt;
|-&lt;br /&gt;
|插件保持独立仓库&lt;br /&gt;
|能&lt;br /&gt;
|能&lt;br /&gt;
|-&lt;br /&gt;
|主仓库记录插件 URL&lt;br /&gt;
|否&lt;br /&gt;
|是&lt;br /&gt;
|-&lt;br /&gt;
|主仓库记录插件路径&lt;br /&gt;
|否&lt;br /&gt;
|是&lt;br /&gt;
|-&lt;br /&gt;
|主仓库锁定插件 commit&lt;br /&gt;
|否&lt;br /&gt;
|是&lt;br /&gt;
|-&lt;br /&gt;
|换电脑后一条命令恢复&lt;br /&gt;
|否&lt;br /&gt;
|是&lt;br /&gt;
|-&lt;br /&gt;
|主配置和插件整体回滚&lt;br /&gt;
|否&lt;br /&gt;
|是&lt;br /&gt;
|-&lt;br /&gt;
|正式记录插件升级&lt;br /&gt;
|否&lt;br /&gt;
|是&lt;br /&gt;
|-&lt;br /&gt;
|保留插件自己的完整历史&lt;br /&gt;
|是&lt;br /&gt;
|是&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
最核心的区别是，普通 clone 插件只是碰巧存在于这台电脑。Git submodule，插件是主项目正式声明的一项依赖。&lt;br /&gt;
&lt;br /&gt;
== 工作流 ==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 目的&lt;br /&gt;
! 命令&lt;br /&gt;
|-&lt;br /&gt;
|添加插件&lt;br /&gt;
|&amp;lt;code&amp;gt;git submodule add URL PATH&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|查看所有插件版本&lt;br /&gt;
|&amp;lt;code&amp;gt;git submodule status&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|升级一个插件&lt;br /&gt;
|&amp;lt;code&amp;gt;git submodule update --remote -- PATH&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|查看插件升级内容&lt;br /&gt;
|&amp;lt;code&amp;gt;git diff --submodule=log&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|接受插件升级&lt;br /&gt;
|&amp;lt;code&amp;gt;git add PATH &amp;amp;&amp;amp; git commit&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|放弃未提交的升级&lt;br /&gt;
|&amp;lt;code&amp;gt;git submodule update --checkout --force -- PATH&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|初始化全部插件&lt;br /&gt;
|&amp;lt;code&amp;gt;git submodule update --init --recursive&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|克隆主仓库和全部插件&lt;br /&gt;
|&amp;lt;code&amp;gt;git clone --recurse-submodules URL&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|暂时停用本机插件&lt;br /&gt;
|&amp;lt;code&amp;gt;git submodule deinit -- PATH&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|永久删除插件&lt;br /&gt;
|&amp;lt;code&amp;gt;git rm PATH &amp;amp;&amp;amp; git commit&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|查看插件自己的日志&lt;br /&gt;
|&amp;lt;code&amp;gt;git -C PATH log --oneline&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git submodule update \&lt;br /&gt;
  --remote \&lt;br /&gt;
  -- travel/packages/插件名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 查看升级内容 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git diff --submodule=log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 测试失败，恢复旧版 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git submodule update \&lt;br /&gt;
  --checkout \&lt;br /&gt;
  --force \&lt;br /&gt;
  -- travel/packages/插件名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 测试成功，接受新版 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git add travel/packages/插件名&lt;br /&gt;
git commit -m &amp;quot;Update 插件名&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 删除插件 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git rm travel/packages/插件名&lt;br /&gt;
git rm travel/对应状态目录/init-插件名.el&lt;br /&gt;
git commit -m &amp;quot;Remove 插件名&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 换电脑完整恢复 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone --recurse-submodules \&lt;br /&gt;
  主仓库URL \&lt;br /&gt;
  ~/.emacs.d&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 总结 ==&lt;br /&gt;
&lt;br /&gt;
普通 &amp;lt;code&amp;gt;git clone&amp;lt;/code&amp;gt; 只是：&lt;br /&gt;
&lt;br /&gt;
:把插件下载到了当前电脑。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git submodule add&amp;lt;/code&amp;gt; 则是：&lt;br /&gt;
&lt;br /&gt;
:让主仓库正式记录插件的 URL、保存路径和准确版本。&lt;br /&gt;
&lt;br /&gt;
Git submodule 对 Emacs 插件管理最大的意义是：&lt;br /&gt;
&lt;br /&gt;
:对插件版本状态进行精确控制，使整套配置可以稳定锁定、明确升级、快速回滚，并在其他电脑上一键复现。&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11525</id>
		<title>Git submodule 的精准用法</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11525"/>
		<updated>2026-07-22T12:53:01Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: /* 暂停 = */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Git submodule 适合这种情况：&lt;br /&gt;
* 主项目需要别的子项目&lt;br /&gt;
* 主项目管理别的子项目的版本&lt;br /&gt;
&lt;br /&gt;
== 概念 ==&lt;br /&gt;
在 Emacs 配置中，可以把 ~/.emacs.d/ 视为主仓库。把 Vertico Consult Magit 等视为子仓库。&lt;br /&gt;
&lt;br /&gt;
单凭 git clone 子仓库，Emacs 也可以用。但主仓库对子仓库的完整细节缺乏了解。&lt;br /&gt;
&lt;br /&gt;
而 git submodule add 可以解决&lt;br /&gt;
* Vertico 从哪个 URL 下载&lt;br /&gt;
* 应该保存在哪个目录&lt;br /&gt;
* 应该使用哪个 commit&lt;br /&gt;
* 换电脑后应该怎样恢复&lt;br /&gt;
* 主配置回滚时，Vertico 应该回到哪个版本&lt;br /&gt;
&lt;br /&gt;
.gitmodules 内容大致如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[submodule &amp;quot;travel/packages/vertico&amp;quot;]&lt;br /&gt;
    path = travel/packages/vertico&lt;br /&gt;
    url = https://github.com/minad/vertico.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
submodule 还会记录一条指向某个 commit 的 gitlink。&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 仓库&lt;br /&gt;
! 负责记录什么&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;~/.emacs.d&amp;lt;/code&amp;gt; 主仓库&lt;br /&gt;
|自己的配置文件，以及每个插件应使用哪个 commit&lt;br /&gt;
|-&lt;br /&gt;
|Vertico 子仓库&lt;br /&gt;
|Vertico 源码和 Vertico 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Consult 子仓库&lt;br /&gt;
|Consult 源码和 Consult 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Magit 子仓库&lt;br /&gt;
|Magit 源码和 Magit 自己的完整开发历史&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这种设计避免了两个问题：&lt;br /&gt;
&lt;br /&gt;
# 不把别人写的几百个插件源码文件伪装成自己的文件&lt;br /&gt;
# 又能让配置仓库精确声明自己依赖哪个插件版本&lt;br /&gt;
&lt;br /&gt;
submodule 最重要的价值&lt;br /&gt;
# 固定插件版本，它记录的不是模糊的“使用最新版”，而是，这套配置经过测试时，各插件分别停留在哪个准确版本。这相当于给插件环境加了一把版本锁。&lt;br /&gt;
# 整体回滚。主仓库回滚到 abc1234，子仓库也会恢复到当时的状态。普通嵌套 &amp;lt;code&amp;gt;git clone&amp;lt;/code&amp;gt; 做不到这一点。即使主配置回到一个月前，插件仍可能停留在今天的新版本。&lt;br /&gt;
# 异地完整复现。&amp;lt;code&amp;gt;git clone --recurse-submodules URL PATH&amp;lt;/code&amp;gt;，恢复出来的插件环境与原电脑一致。&lt;br /&gt;
# 明确记录插件升级。使用 submodule 后，升级插件会被主仓库识别为一次正式变化，这让插件升级变成一种可查看、可测试、可提交、可撤销的操作。&lt;br /&gt;
&lt;br /&gt;
== 工作流 ==&lt;br /&gt;
=== 配置 ===&lt;br /&gt;
# git config diff.submodule log&lt;br /&gt;
# git config status.submodulesummary 1&lt;br /&gt;
&lt;br /&gt;
=== 添加 ===&lt;br /&gt;
# cd ~/.emacs.d&lt;br /&gt;
# git init -b main&lt;br /&gt;
# git submodule add https://github.com/minad/vertico.git travel/packages/vertico&lt;br /&gt;
# git status&lt;br /&gt;
# git commit -m &amp;quot;Add Vertico submodule&amp;quot;&lt;br /&gt;
# git submodule status&lt;br /&gt;
&lt;br /&gt;
不要修改插件原始仓库。不应把自己的配置写进子仓库。&lt;br /&gt;
&lt;br /&gt;
=== 查看 ===&lt;br /&gt;
# git -C travel/packages/vertico log --oneline --decorate -10&lt;br /&gt;
&lt;br /&gt;
=== 升级 ===&lt;br /&gt;
# git submodule update --remote -- travel/packages/vertico&lt;br /&gt;
# git diff --submodule=log&lt;br /&gt;
&lt;br /&gt;
=== 保留 ===&lt;br /&gt;
# git add travel/packages/vertico&lt;br /&gt;
# git commit -m &amp;quot;Update Vertico&amp;quot; ;; commit 了才正式获得了主仓库的承认&lt;br /&gt;
&lt;br /&gt;
一次升级一个插件，一个插件形成一个独立提交。&lt;br /&gt;
&lt;br /&gt;
=== 未提交+放弃 ===&lt;br /&gt;
如果执行升级后发现新版本有问题，而且还没有提交：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git submodule update \&lt;br /&gt;
  --checkout \&lt;br /&gt;
  --force \&lt;br /&gt;
  -- travel/packages/vertico&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这就是最简单的“升级失败，退回旧版”。&lt;br /&gt;
&lt;br /&gt;
=== 已提交+放弃 ===&lt;br /&gt;
假设升级 Vertico 的提交是：7ac39fe Update Vertico&lt;br /&gt;
&lt;br /&gt;
可以在主仓库运行：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git revert 7ac39fe&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git revert&amp;lt;/code&amp;gt; 会新增一个提交，撤销那次插件升级；随后 &amp;lt;code&amp;gt;git submodule update&amp;lt;/code&amp;gt; 让磁盘上的插件切回旧 commit。&lt;br /&gt;
&lt;br /&gt;
这种做法比随意修改子仓库历史更清楚，因为决定插件正式版本的是主仓库中的 gitlink，而不是子仓库当前碰巧停留在哪里。&lt;br /&gt;
&lt;br /&gt;
=== detached ===&lt;br /&gt;
git status 时发现 submodule 经常处于 detached HEAD？&lt;br /&gt;
&lt;br /&gt;
这在 submodule 中通常是正常现象。&lt;br /&gt;
&lt;br /&gt;
主仓库需要插件准确停在某个 commit，而不是随时变化。对只使用插件、不直接参与开发插件的人而言，这不是故障，而是版本锁定的正常状态。&lt;br /&gt;
&lt;br /&gt;
submodule 应该少升级、慢升级、一次一个、稳定后再提交。submodule 最大的价值不是方便追逐最新版，而是方便长期固定已验证版本。&lt;br /&gt;
&lt;br /&gt;
=== 删除 ===&lt;br /&gt;
# git rm travel/packages/vertico&lt;br /&gt;
# git rm travel/40-test/init-vertico.el&lt;br /&gt;
# git commit -m &amp;quot;Remove Vertico&amp;quot; &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git rm&amp;lt;/code&amp;gt; 会同时更新主仓库索引和 &amp;lt;code&amp;gt;.gitmodules&amp;lt;/code&amp;gt; 中相应的 submodule 记录。&lt;br /&gt;
&lt;br /&gt;
=== 暂停 ===&lt;br /&gt;
# git submodule deinit -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
=== 不暂停 ===&lt;br /&gt;
# git submodule update --init -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
== 移机 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
;; 一次性移机主仓库和子仓库&lt;br /&gt;
git clone --recurse-submodules \&lt;br /&gt;
  主仓库URL \&lt;br /&gt;
  ~/.emacs.d&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
或者，&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
;; 先移机主仓库&lt;br /&gt;
;; 再移机子仓库&lt;br /&gt;
git clone 主仓库URL ~/.emacs.d&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 日常更新 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git pull&lt;br /&gt;
git submodule update --init --recursive &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第二条命令让本机插件真正切换到主仓库指定的版本。&lt;br /&gt;
&lt;br /&gt;
单纯运行第一条命令不太够。&lt;br /&gt;
&lt;br /&gt;
== 边界 == &lt;br /&gt;
Git submodule 只负责源码仓库和版本关系，不是完整的 Emacs 包管理器。&lt;br /&gt;
&lt;br /&gt;
它不会自动完成：&lt;br /&gt;
* 把插件加入 &amp;lt;code&amp;gt;load-path&amp;lt;/code&amp;gt;&lt;br /&gt;
* 执行 &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt;&lt;br /&gt;
* 安装插件依赖&lt;br /&gt;
* 生成 autoload&lt;br /&gt;
* 字节编译&lt;br /&gt;
* native compilation&lt;br /&gt;
* 编写 &amp;lt;code&amp;gt;setq&amp;lt;/code&amp;gt;&lt;br /&gt;
* 添加 hook&lt;br /&gt;
* 配置快捷键&lt;br /&gt;
&lt;br /&gt;
例如 Consult 依赖其他插件时，Git 不会自动读取 Emacs 的 &amp;lt;code&amp;gt;Package-Requires&amp;lt;/code&amp;gt; 并安装依赖。&lt;br /&gt;
&lt;br /&gt;
需要自己继续添加依赖：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git submodule add 依赖仓库URL travel/packages/依赖名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后自己配置加载关系。&lt;br /&gt;
&lt;br /&gt;
Git submodule 的本质是，放弃包管理器的一部分自动化，换取透明、固定、可控和可复现。对于大量、频繁更新的插件，手工管理会比较繁琐；对于少量精选、长期固定、谨慎升级的插件，非常合适。&lt;br /&gt;
&lt;br /&gt;
== 对比 ==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 能力&lt;br /&gt;
! 普通嵌套 git clone&lt;br /&gt;
! Git submodule&lt;br /&gt;
|-&lt;br /&gt;
|插件能否运行&lt;br /&gt;
|能&lt;br /&gt;
|能&lt;br /&gt;
|-&lt;br /&gt;
|插件保持独立仓库&lt;br /&gt;
|能&lt;br /&gt;
|能&lt;br /&gt;
|-&lt;br /&gt;
|主仓库记录插件 URL&lt;br /&gt;
|否&lt;br /&gt;
|是&lt;br /&gt;
|-&lt;br /&gt;
|主仓库记录插件路径&lt;br /&gt;
|否&lt;br /&gt;
|是&lt;br /&gt;
|-&lt;br /&gt;
|主仓库锁定插件 commit&lt;br /&gt;
|否&lt;br /&gt;
|是&lt;br /&gt;
|-&lt;br /&gt;
|换电脑后一条命令恢复&lt;br /&gt;
|否&lt;br /&gt;
|是&lt;br /&gt;
|-&lt;br /&gt;
|主配置和插件整体回滚&lt;br /&gt;
|否&lt;br /&gt;
|是&lt;br /&gt;
|-&lt;br /&gt;
|正式记录插件升级&lt;br /&gt;
|否&lt;br /&gt;
|是&lt;br /&gt;
|-&lt;br /&gt;
|保留插件自己的完整历史&lt;br /&gt;
|是&lt;br /&gt;
|是&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
最核心的区别是，普通 clone 插件只是碰巧存在于这台电脑。Git submodule，插件是主项目正式声明的一项依赖。&lt;br /&gt;
&lt;br /&gt;
== 工作流 ==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 目的&lt;br /&gt;
! 命令&lt;br /&gt;
|-&lt;br /&gt;
|添加插件&lt;br /&gt;
|&amp;lt;code&amp;gt;git submodule add URL PATH&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|查看所有插件版本&lt;br /&gt;
|&amp;lt;code&amp;gt;git submodule status&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|升级一个插件&lt;br /&gt;
|&amp;lt;code&amp;gt;git submodule update --remote -- PATH&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|查看插件升级内容&lt;br /&gt;
|&amp;lt;code&amp;gt;git diff --submodule=log&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|接受插件升级&lt;br /&gt;
|&amp;lt;code&amp;gt;git add PATH &amp;amp;&amp;amp; git commit&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|放弃未提交的升级&lt;br /&gt;
|&amp;lt;code&amp;gt;git submodule update --checkout --force -- PATH&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|初始化全部插件&lt;br /&gt;
|&amp;lt;code&amp;gt;git submodule update --init --recursive&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|克隆主仓库和全部插件&lt;br /&gt;
|&amp;lt;code&amp;gt;git clone --recurse-submodules URL&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|暂时停用本机插件&lt;br /&gt;
|&amp;lt;code&amp;gt;git submodule deinit -- PATH&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|永久删除插件&lt;br /&gt;
|&amp;lt;code&amp;gt;git rm PATH &amp;amp;&amp;amp; git commit&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|查看插件自己的日志&lt;br /&gt;
|&amp;lt;code&amp;gt;git -C PATH log --oneline&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git submodule update \&lt;br /&gt;
  --remote \&lt;br /&gt;
  -- travel/packages/插件名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 查看升级内容 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git diff --submodule=log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 测试失败，恢复旧版 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git submodule update \&lt;br /&gt;
  --checkout \&lt;br /&gt;
  --force \&lt;br /&gt;
  -- travel/packages/插件名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 测试成功，接受新版 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git add travel/packages/插件名&lt;br /&gt;
git commit -m &amp;quot;Update 插件名&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 删除插件 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git rm travel/packages/插件名&lt;br /&gt;
git rm travel/对应状态目录/init-插件名.el&lt;br /&gt;
git commit -m &amp;quot;Remove 插件名&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 换电脑完整恢复 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone --recurse-submodules \&lt;br /&gt;
  主仓库URL \&lt;br /&gt;
  ~/.emacs.d&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 总结 ==&lt;br /&gt;
&lt;br /&gt;
普通 &amp;lt;code&amp;gt;git clone&amp;lt;/code&amp;gt; 只是：&lt;br /&gt;
&lt;br /&gt;
:把插件下载到了当前电脑。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git submodule add&amp;lt;/code&amp;gt; 则是：&lt;br /&gt;
&lt;br /&gt;
:让主仓库正式记录插件的 URL、保存路径和准确版本。&lt;br /&gt;
&lt;br /&gt;
Git submodule 对 Emacs 插件管理最大的意义是：&lt;br /&gt;
&lt;br /&gt;
:对插件版本状态进行精确控制，使整套配置可以稳定锁定、明确升级、快速回滚，并在其他电脑上一键复现。&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11524</id>
		<title>Git submodule 的精准用法</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11524"/>
		<updated>2026-07-22T12:52:24Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: /* 升级 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Git submodule 适合这种情况：&lt;br /&gt;
* 主项目需要别的子项目&lt;br /&gt;
* 主项目管理别的子项目的版本&lt;br /&gt;
&lt;br /&gt;
== 概念 ==&lt;br /&gt;
在 Emacs 配置中，可以把 ~/.emacs.d/ 视为主仓库。把 Vertico Consult Magit 等视为子仓库。&lt;br /&gt;
&lt;br /&gt;
单凭 git clone 子仓库，Emacs 也可以用。但主仓库对子仓库的完整细节缺乏了解。&lt;br /&gt;
&lt;br /&gt;
而 git submodule add 可以解决&lt;br /&gt;
* Vertico 从哪个 URL 下载&lt;br /&gt;
* 应该保存在哪个目录&lt;br /&gt;
* 应该使用哪个 commit&lt;br /&gt;
* 换电脑后应该怎样恢复&lt;br /&gt;
* 主配置回滚时，Vertico 应该回到哪个版本&lt;br /&gt;
&lt;br /&gt;
.gitmodules 内容大致如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[submodule &amp;quot;travel/packages/vertico&amp;quot;]&lt;br /&gt;
    path = travel/packages/vertico&lt;br /&gt;
    url = https://github.com/minad/vertico.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
submodule 还会记录一条指向某个 commit 的 gitlink。&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 仓库&lt;br /&gt;
! 负责记录什么&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;~/.emacs.d&amp;lt;/code&amp;gt; 主仓库&lt;br /&gt;
|自己的配置文件，以及每个插件应使用哪个 commit&lt;br /&gt;
|-&lt;br /&gt;
|Vertico 子仓库&lt;br /&gt;
|Vertico 源码和 Vertico 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Consult 子仓库&lt;br /&gt;
|Consult 源码和 Consult 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Magit 子仓库&lt;br /&gt;
|Magit 源码和 Magit 自己的完整开发历史&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这种设计避免了两个问题：&lt;br /&gt;
&lt;br /&gt;
# 不把别人写的几百个插件源码文件伪装成自己的文件&lt;br /&gt;
# 又能让配置仓库精确声明自己依赖哪个插件版本&lt;br /&gt;
&lt;br /&gt;
submodule 最重要的价值&lt;br /&gt;
# 固定插件版本，它记录的不是模糊的“使用最新版”，而是，这套配置经过测试时，各插件分别停留在哪个准确版本。这相当于给插件环境加了一把版本锁。&lt;br /&gt;
# 整体回滚。主仓库回滚到 abc1234，子仓库也会恢复到当时的状态。普通嵌套 &amp;lt;code&amp;gt;git clone&amp;lt;/code&amp;gt; 做不到这一点。即使主配置回到一个月前，插件仍可能停留在今天的新版本。&lt;br /&gt;
# 异地完整复现。&amp;lt;code&amp;gt;git clone --recurse-submodules URL PATH&amp;lt;/code&amp;gt;，恢复出来的插件环境与原电脑一致。&lt;br /&gt;
# 明确记录插件升级。使用 submodule 后，升级插件会被主仓库识别为一次正式变化，这让插件升级变成一种可查看、可测试、可提交、可撤销的操作。&lt;br /&gt;
&lt;br /&gt;
== 工作流 ==&lt;br /&gt;
=== 配置 ===&lt;br /&gt;
# git config diff.submodule log&lt;br /&gt;
# git config status.submodulesummary 1&lt;br /&gt;
&lt;br /&gt;
=== 添加 ===&lt;br /&gt;
# cd ~/.emacs.d&lt;br /&gt;
# git init -b main&lt;br /&gt;
# git submodule add https://github.com/minad/vertico.git travel/packages/vertico&lt;br /&gt;
# git status&lt;br /&gt;
# git commit -m &amp;quot;Add Vertico submodule&amp;quot;&lt;br /&gt;
# git submodule status&lt;br /&gt;
&lt;br /&gt;
不要修改插件原始仓库。不应把自己的配置写进子仓库。&lt;br /&gt;
&lt;br /&gt;
=== 查看 ===&lt;br /&gt;
# git -C travel/packages/vertico log --oneline --decorate -10&lt;br /&gt;
&lt;br /&gt;
=== 升级 ===&lt;br /&gt;
# git submodule update --remote -- travel/packages/vertico&lt;br /&gt;
# git diff --submodule=log&lt;br /&gt;
&lt;br /&gt;
=== 保留 ===&lt;br /&gt;
# git add travel/packages/vertico&lt;br /&gt;
# git commit -m &amp;quot;Update Vertico&amp;quot; ;; commit 了才正式获得了主仓库的承认&lt;br /&gt;
&lt;br /&gt;
一次升级一个插件，一个插件形成一个独立提交。&lt;br /&gt;
&lt;br /&gt;
=== 未提交+放弃 ===&lt;br /&gt;
如果执行升级后发现新版本有问题，而且还没有提交：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git submodule update \&lt;br /&gt;
  --checkout \&lt;br /&gt;
  --force \&lt;br /&gt;
  -- travel/packages/vertico&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这就是最简单的“升级失败，退回旧版”。&lt;br /&gt;
&lt;br /&gt;
=== 已提交+放弃 ===&lt;br /&gt;
假设升级 Vertico 的提交是：7ac39fe Update Vertico&lt;br /&gt;
&lt;br /&gt;
可以在主仓库运行：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git revert 7ac39fe&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git revert&amp;lt;/code&amp;gt; 会新增一个提交，撤销那次插件升级；随后 &amp;lt;code&amp;gt;git submodule update&amp;lt;/code&amp;gt; 让磁盘上的插件切回旧 commit。&lt;br /&gt;
&lt;br /&gt;
这种做法比随意修改子仓库历史更清楚，因为决定插件正式版本的是主仓库中的 gitlink，而不是子仓库当前碰巧停留在哪里。&lt;br /&gt;
&lt;br /&gt;
=== detached ===&lt;br /&gt;
git status 时发现 submodule 经常处于 detached HEAD？&lt;br /&gt;
&lt;br /&gt;
这在 submodule 中通常是正常现象。&lt;br /&gt;
&lt;br /&gt;
主仓库需要插件准确停在某个 commit，而不是随时变化。对只使用插件、不直接参与开发插件的人而言，这不是故障，而是版本锁定的正常状态。&lt;br /&gt;
&lt;br /&gt;
submodule 应该少升级、慢升级、一次一个、稳定后再提交。submodule 最大的价值不是方便追逐最新版，而是方便长期固定已验证版本。&lt;br /&gt;
&lt;br /&gt;
=== 删除 ===&lt;br /&gt;
# git rm travel/packages/vertico&lt;br /&gt;
# git rm travel/40-test/init-vertico.el&lt;br /&gt;
# git commit -m &amp;quot;Remove Vertico&amp;quot; &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git rm&amp;lt;/code&amp;gt; 会同时更新主仓库索引和 &amp;lt;code&amp;gt;.gitmodules&amp;lt;/code&amp;gt; 中相应的 submodule 记录。&lt;br /&gt;
&lt;br /&gt;
=== 暂停 ====&lt;br /&gt;
# git submodule deinit -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
=== 不暂停 ===&lt;br /&gt;
# git submodule update --init -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
== 移机 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
;; 一次性移机主仓库和子仓库&lt;br /&gt;
git clone --recurse-submodules \&lt;br /&gt;
  主仓库URL \&lt;br /&gt;
  ~/.emacs.d&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
或者，&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
;; 先移机主仓库&lt;br /&gt;
;; 再移机子仓库&lt;br /&gt;
git clone 主仓库URL ~/.emacs.d&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 日常更新 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git pull&lt;br /&gt;
git submodule update --init --recursive &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第二条命令让本机插件真正切换到主仓库指定的版本。&lt;br /&gt;
&lt;br /&gt;
单纯运行第一条命令不太够。&lt;br /&gt;
&lt;br /&gt;
== 边界 == &lt;br /&gt;
Git submodule 只负责源码仓库和版本关系，不是完整的 Emacs 包管理器。&lt;br /&gt;
&lt;br /&gt;
它不会自动完成：&lt;br /&gt;
* 把插件加入 &amp;lt;code&amp;gt;load-path&amp;lt;/code&amp;gt;&lt;br /&gt;
* 执行 &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt;&lt;br /&gt;
* 安装插件依赖&lt;br /&gt;
* 生成 autoload&lt;br /&gt;
* 字节编译&lt;br /&gt;
* native compilation&lt;br /&gt;
* 编写 &amp;lt;code&amp;gt;setq&amp;lt;/code&amp;gt;&lt;br /&gt;
* 添加 hook&lt;br /&gt;
* 配置快捷键&lt;br /&gt;
&lt;br /&gt;
例如 Consult 依赖其他插件时，Git 不会自动读取 Emacs 的 &amp;lt;code&amp;gt;Package-Requires&amp;lt;/code&amp;gt; 并安装依赖。&lt;br /&gt;
&lt;br /&gt;
需要自己继续添加依赖：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git submodule add 依赖仓库URL travel/packages/依赖名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后自己配置加载关系。&lt;br /&gt;
&lt;br /&gt;
Git submodule 的本质是，放弃包管理器的一部分自动化，换取透明、固定、可控和可复现。对于大量、频繁更新的插件，手工管理会比较繁琐；对于少量精选、长期固定、谨慎升级的插件，非常合适。&lt;br /&gt;
&lt;br /&gt;
== 对比 ==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 能力&lt;br /&gt;
! 普通嵌套 git clone&lt;br /&gt;
! Git submodule&lt;br /&gt;
|-&lt;br /&gt;
|插件能否运行&lt;br /&gt;
|能&lt;br /&gt;
|能&lt;br /&gt;
|-&lt;br /&gt;
|插件保持独立仓库&lt;br /&gt;
|能&lt;br /&gt;
|能&lt;br /&gt;
|-&lt;br /&gt;
|主仓库记录插件 URL&lt;br /&gt;
|否&lt;br /&gt;
|是&lt;br /&gt;
|-&lt;br /&gt;
|主仓库记录插件路径&lt;br /&gt;
|否&lt;br /&gt;
|是&lt;br /&gt;
|-&lt;br /&gt;
|主仓库锁定插件 commit&lt;br /&gt;
|否&lt;br /&gt;
|是&lt;br /&gt;
|-&lt;br /&gt;
|换电脑后一条命令恢复&lt;br /&gt;
|否&lt;br /&gt;
|是&lt;br /&gt;
|-&lt;br /&gt;
|主配置和插件整体回滚&lt;br /&gt;
|否&lt;br /&gt;
|是&lt;br /&gt;
|-&lt;br /&gt;
|正式记录插件升级&lt;br /&gt;
|否&lt;br /&gt;
|是&lt;br /&gt;
|-&lt;br /&gt;
|保留插件自己的完整历史&lt;br /&gt;
|是&lt;br /&gt;
|是&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
最核心的区别是，普通 clone 插件只是碰巧存在于这台电脑。Git submodule，插件是主项目正式声明的一项依赖。&lt;br /&gt;
&lt;br /&gt;
== 工作流 ==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 目的&lt;br /&gt;
! 命令&lt;br /&gt;
|-&lt;br /&gt;
|添加插件&lt;br /&gt;
|&amp;lt;code&amp;gt;git submodule add URL PATH&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|查看所有插件版本&lt;br /&gt;
|&amp;lt;code&amp;gt;git submodule status&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|升级一个插件&lt;br /&gt;
|&amp;lt;code&amp;gt;git submodule update --remote -- PATH&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|查看插件升级内容&lt;br /&gt;
|&amp;lt;code&amp;gt;git diff --submodule=log&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|接受插件升级&lt;br /&gt;
|&amp;lt;code&amp;gt;git add PATH &amp;amp;&amp;amp; git commit&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|放弃未提交的升级&lt;br /&gt;
|&amp;lt;code&amp;gt;git submodule update --checkout --force -- PATH&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|初始化全部插件&lt;br /&gt;
|&amp;lt;code&amp;gt;git submodule update --init --recursive&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|克隆主仓库和全部插件&lt;br /&gt;
|&amp;lt;code&amp;gt;git clone --recurse-submodules URL&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|暂时停用本机插件&lt;br /&gt;
|&amp;lt;code&amp;gt;git submodule deinit -- PATH&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|永久删除插件&lt;br /&gt;
|&amp;lt;code&amp;gt;git rm PATH &amp;amp;&amp;amp; git commit&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|查看插件自己的日志&lt;br /&gt;
|&amp;lt;code&amp;gt;git -C PATH log --oneline&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git submodule update \&lt;br /&gt;
  --remote \&lt;br /&gt;
  -- travel/packages/插件名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 查看升级内容 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git diff --submodule=log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 测试失败，恢复旧版 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git submodule update \&lt;br /&gt;
  --checkout \&lt;br /&gt;
  --force \&lt;br /&gt;
  -- travel/packages/插件名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 测试成功，接受新版 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git add travel/packages/插件名&lt;br /&gt;
git commit -m &amp;quot;Update 插件名&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 删除插件 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git rm travel/packages/插件名&lt;br /&gt;
git rm travel/对应状态目录/init-插件名.el&lt;br /&gt;
git commit -m &amp;quot;Remove 插件名&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 换电脑完整恢复 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone --recurse-submodules \&lt;br /&gt;
  主仓库URL \&lt;br /&gt;
  ~/.emacs.d&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 总结 ==&lt;br /&gt;
&lt;br /&gt;
普通 &amp;lt;code&amp;gt;git clone&amp;lt;/code&amp;gt; 只是：&lt;br /&gt;
&lt;br /&gt;
:把插件下载到了当前电脑。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git submodule add&amp;lt;/code&amp;gt; 则是：&lt;br /&gt;
&lt;br /&gt;
:让主仓库正式记录插件的 URL、保存路径和准确版本。&lt;br /&gt;
&lt;br /&gt;
Git submodule 对 Emacs 插件管理最大的意义是：&lt;br /&gt;
&lt;br /&gt;
:对插件版本状态进行精确控制，使整套配置可以稳定锁定、明确升级、快速回滚，并在其他电脑上一键复现。&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
	<entry>
		<id>https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11523</id>
		<title>Git submodule 的精准用法</title>
		<link rel="alternate" type="text/html" href="https://qingliezhiquan.com/mediawiki/index.php?title=Git_submodule_%E7%9A%84%E7%B2%BE%E5%87%86%E7%94%A8%E6%B3%95&amp;diff=11523"/>
		<updated>2026-07-22T12:51:32Z</updated>

		<summary type="html">&lt;p&gt;Mwroot: /* 工作流 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Git submodule 适合这种情况：&lt;br /&gt;
* 主项目需要别的子项目&lt;br /&gt;
* 主项目管理别的子项目的版本&lt;br /&gt;
&lt;br /&gt;
== 概念 ==&lt;br /&gt;
在 Emacs 配置中，可以把 ~/.emacs.d/ 视为主仓库。把 Vertico Consult Magit 等视为子仓库。&lt;br /&gt;
&lt;br /&gt;
单凭 git clone 子仓库，Emacs 也可以用。但主仓库对子仓库的完整细节缺乏了解。&lt;br /&gt;
&lt;br /&gt;
而 git submodule add 可以解决&lt;br /&gt;
* Vertico 从哪个 URL 下载&lt;br /&gt;
* 应该保存在哪个目录&lt;br /&gt;
* 应该使用哪个 commit&lt;br /&gt;
* 换电脑后应该怎样恢复&lt;br /&gt;
* 主配置回滚时，Vertico 应该回到哪个版本&lt;br /&gt;
&lt;br /&gt;
.gitmodules 内容大致如下：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[submodule &amp;quot;travel/packages/vertico&amp;quot;]&lt;br /&gt;
    path = travel/packages/vertico&lt;br /&gt;
    url = https://github.com/minad/vertico.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
submodule 还会记录一条指向某个 commit 的 gitlink。&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 仓库&lt;br /&gt;
! 负责记录什么&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;~/.emacs.d&amp;lt;/code&amp;gt; 主仓库&lt;br /&gt;
|自己的配置文件，以及每个插件应使用哪个 commit&lt;br /&gt;
|-&lt;br /&gt;
|Vertico 子仓库&lt;br /&gt;
|Vertico 源码和 Vertico 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Consult 子仓库&lt;br /&gt;
|Consult 源码和 Consult 自己的完整开发历史&lt;br /&gt;
|-&lt;br /&gt;
|Magit 子仓库&lt;br /&gt;
|Magit 源码和 Magit 自己的完整开发历史&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
这种设计避免了两个问题：&lt;br /&gt;
&lt;br /&gt;
# 不把别人写的几百个插件源码文件伪装成自己的文件&lt;br /&gt;
# 又能让配置仓库精确声明自己依赖哪个插件版本&lt;br /&gt;
&lt;br /&gt;
submodule 最重要的价值&lt;br /&gt;
# 固定插件版本，它记录的不是模糊的“使用最新版”，而是，这套配置经过测试时，各插件分别停留在哪个准确版本。这相当于给插件环境加了一把版本锁。&lt;br /&gt;
# 整体回滚。主仓库回滚到 abc1234，子仓库也会恢复到当时的状态。普通嵌套 &amp;lt;code&amp;gt;git clone&amp;lt;/code&amp;gt; 做不到这一点。即使主配置回到一个月前，插件仍可能停留在今天的新版本。&lt;br /&gt;
# 异地完整复现。&amp;lt;code&amp;gt;git clone --recurse-submodules URL PATH&amp;lt;/code&amp;gt;，恢复出来的插件环境与原电脑一致。&lt;br /&gt;
# 明确记录插件升级。使用 submodule 后，升级插件会被主仓库识别为一次正式变化，这让插件升级变成一种可查看、可测试、可提交、可撤销的操作。&lt;br /&gt;
&lt;br /&gt;
== 工作流 ==&lt;br /&gt;
=== 配置 ===&lt;br /&gt;
# git config diff.submodule log&lt;br /&gt;
# git config status.submodulesummary 1&lt;br /&gt;
&lt;br /&gt;
=== 添加 ===&lt;br /&gt;
# cd ~/.emacs.d&lt;br /&gt;
# git init -b main&lt;br /&gt;
# git submodule add https://github.com/minad/vertico.git travel/packages/vertico&lt;br /&gt;
# git status&lt;br /&gt;
# git commit -m &amp;quot;Add Vertico submodule&amp;quot;&lt;br /&gt;
# git submodule status&lt;br /&gt;
&lt;br /&gt;
不要修改插件原始仓库。不应把自己的配置写进子仓库。&lt;br /&gt;
&lt;br /&gt;
=== 查看 ===&lt;br /&gt;
# git -C travel/packages/vertico log --oneline --decorate -10&lt;br /&gt;
&lt;br /&gt;
=== 升级 ===&lt;br /&gt;
git submodule update --remote -- travel/packages/vertico&lt;br /&gt;
git diff --submodule=log&lt;br /&gt;
&lt;br /&gt;
=== 保留 ===&lt;br /&gt;
# git add travel/packages/vertico&lt;br /&gt;
# git commit -m &amp;quot;Update Vertico&amp;quot; ;; commit 了才正式获得了主仓库的承认&lt;br /&gt;
&lt;br /&gt;
一次升级一个插件，一个插件形成一个独立提交。&lt;br /&gt;
&lt;br /&gt;
=== 未提交+放弃 ===&lt;br /&gt;
如果执行升级后发现新版本有问题，而且还没有提交：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git submodule update \&lt;br /&gt;
  --checkout \&lt;br /&gt;
  --force \&lt;br /&gt;
  -- travel/packages/vertico&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
这就是最简单的“升级失败，退回旧版”。&lt;br /&gt;
&lt;br /&gt;
=== 已提交+放弃 ===&lt;br /&gt;
假设升级 Vertico 的提交是：7ac39fe Update Vertico&lt;br /&gt;
&lt;br /&gt;
可以在主仓库运行：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git revert 7ac39fe&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git revert&amp;lt;/code&amp;gt; 会新增一个提交，撤销那次插件升级；随后 &amp;lt;code&amp;gt;git submodule update&amp;lt;/code&amp;gt; 让磁盘上的插件切回旧 commit。&lt;br /&gt;
&lt;br /&gt;
这种做法比随意修改子仓库历史更清楚，因为决定插件正式版本的是主仓库中的 gitlink，而不是子仓库当前碰巧停留在哪里。&lt;br /&gt;
&lt;br /&gt;
=== detached ===&lt;br /&gt;
git status 时发现 submodule 经常处于 detached HEAD？&lt;br /&gt;
&lt;br /&gt;
这在 submodule 中通常是正常现象。&lt;br /&gt;
&lt;br /&gt;
主仓库需要插件准确停在某个 commit，而不是随时变化。对只使用插件、不直接参与开发插件的人而言，这不是故障，而是版本锁定的正常状态。&lt;br /&gt;
&lt;br /&gt;
submodule 应该少升级、慢升级、一次一个、稳定后再提交。submodule 最大的价值不是方便追逐最新版，而是方便长期固定已验证版本。&lt;br /&gt;
&lt;br /&gt;
=== 删除 ===&lt;br /&gt;
# git rm travel/packages/vertico&lt;br /&gt;
# git rm travel/40-test/init-vertico.el&lt;br /&gt;
# git commit -m &amp;quot;Remove Vertico&amp;quot; &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git rm&amp;lt;/code&amp;gt; 会同时更新主仓库索引和 &amp;lt;code&amp;gt;.gitmodules&amp;lt;/code&amp;gt; 中相应的 submodule 记录。&lt;br /&gt;
&lt;br /&gt;
=== 暂停 ====&lt;br /&gt;
# git submodule deinit -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
=== 不暂停 ===&lt;br /&gt;
# git submodule update --init -- travel/packages/vertico&lt;br /&gt;
&lt;br /&gt;
== 移机 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
;; 一次性移机主仓库和子仓库&lt;br /&gt;
git clone --recurse-submodules \&lt;br /&gt;
  主仓库URL \&lt;br /&gt;
  ~/.emacs.d&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
或者，&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
;; 先移机主仓库&lt;br /&gt;
;; 再移机子仓库&lt;br /&gt;
git clone 主仓库URL ~/.emacs.d&lt;br /&gt;
git submodule update --init --recursive&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 日常更新 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git pull&lt;br /&gt;
git submodule update --init --recursive &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
第二条命令让本机插件真正切换到主仓库指定的版本。&lt;br /&gt;
&lt;br /&gt;
单纯运行第一条命令不太够。&lt;br /&gt;
&lt;br /&gt;
== 边界 == &lt;br /&gt;
Git submodule 只负责源码仓库和版本关系，不是完整的 Emacs 包管理器。&lt;br /&gt;
&lt;br /&gt;
它不会自动完成：&lt;br /&gt;
* 把插件加入 &amp;lt;code&amp;gt;load-path&amp;lt;/code&amp;gt;&lt;br /&gt;
* 执行 &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt;&lt;br /&gt;
* 安装插件依赖&lt;br /&gt;
* 生成 autoload&lt;br /&gt;
* 字节编译&lt;br /&gt;
* native compilation&lt;br /&gt;
* 编写 &amp;lt;code&amp;gt;setq&amp;lt;/code&amp;gt;&lt;br /&gt;
* 添加 hook&lt;br /&gt;
* 配置快捷键&lt;br /&gt;
&lt;br /&gt;
例如 Consult 依赖其他插件时，Git 不会自动读取 Emacs 的 &amp;lt;code&amp;gt;Package-Requires&amp;lt;/code&amp;gt; 并安装依赖。&lt;br /&gt;
&lt;br /&gt;
需要自己继续添加依赖：&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git submodule add 依赖仓库URL travel/packages/依赖名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后自己配置加载关系。&lt;br /&gt;
&lt;br /&gt;
Git submodule 的本质是，放弃包管理器的一部分自动化，换取透明、固定、可控和可复现。对于大量、频繁更新的插件，手工管理会比较繁琐；对于少量精选、长期固定、谨慎升级的插件，非常合适。&lt;br /&gt;
&lt;br /&gt;
== 对比 ==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 能力&lt;br /&gt;
! 普通嵌套 git clone&lt;br /&gt;
! Git submodule&lt;br /&gt;
|-&lt;br /&gt;
|插件能否运行&lt;br /&gt;
|能&lt;br /&gt;
|能&lt;br /&gt;
|-&lt;br /&gt;
|插件保持独立仓库&lt;br /&gt;
|能&lt;br /&gt;
|能&lt;br /&gt;
|-&lt;br /&gt;
|主仓库记录插件 URL&lt;br /&gt;
|否&lt;br /&gt;
|是&lt;br /&gt;
|-&lt;br /&gt;
|主仓库记录插件路径&lt;br /&gt;
|否&lt;br /&gt;
|是&lt;br /&gt;
|-&lt;br /&gt;
|主仓库锁定插件 commit&lt;br /&gt;
|否&lt;br /&gt;
|是&lt;br /&gt;
|-&lt;br /&gt;
|换电脑后一条命令恢复&lt;br /&gt;
|否&lt;br /&gt;
|是&lt;br /&gt;
|-&lt;br /&gt;
|主配置和插件整体回滚&lt;br /&gt;
|否&lt;br /&gt;
|是&lt;br /&gt;
|-&lt;br /&gt;
|正式记录插件升级&lt;br /&gt;
|否&lt;br /&gt;
|是&lt;br /&gt;
|-&lt;br /&gt;
|保留插件自己的完整历史&lt;br /&gt;
|是&lt;br /&gt;
|是&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
最核心的区别是，普通 clone 插件只是碰巧存在于这台电脑。Git submodule，插件是主项目正式声明的一项依赖。&lt;br /&gt;
&lt;br /&gt;
== 工作流 ==&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 目的&lt;br /&gt;
! 命令&lt;br /&gt;
|-&lt;br /&gt;
|添加插件&lt;br /&gt;
|&amp;lt;code&amp;gt;git submodule add URL PATH&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|查看所有插件版本&lt;br /&gt;
|&amp;lt;code&amp;gt;git submodule status&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|升级一个插件&lt;br /&gt;
|&amp;lt;code&amp;gt;git submodule update --remote -- PATH&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|查看插件升级内容&lt;br /&gt;
|&amp;lt;code&amp;gt;git diff --submodule=log&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|接受插件升级&lt;br /&gt;
|&amp;lt;code&amp;gt;git add PATH &amp;amp;&amp;amp; git commit&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|放弃未提交的升级&lt;br /&gt;
|&amp;lt;code&amp;gt;git submodule update --checkout --force -- PATH&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|初始化全部插件&lt;br /&gt;
|&amp;lt;code&amp;gt;git submodule update --init --recursive&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|克隆主仓库和全部插件&lt;br /&gt;
|&amp;lt;code&amp;gt;git clone --recurse-submodules URL&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|暂时停用本机插件&lt;br /&gt;
|&amp;lt;code&amp;gt;git submodule deinit -- PATH&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|永久删除插件&lt;br /&gt;
|&amp;lt;code&amp;gt;git rm PATH &amp;amp;&amp;amp; git commit&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|查看插件自己的日志&lt;br /&gt;
|&amp;lt;code&amp;gt;git -C PATH log --oneline&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git submodule update \&lt;br /&gt;
  --remote \&lt;br /&gt;
  -- travel/packages/插件名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 查看升级内容 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git diff --submodule=log&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 测试失败，恢复旧版 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git submodule update \&lt;br /&gt;
  --checkout \&lt;br /&gt;
  --force \&lt;br /&gt;
  -- travel/packages/插件名&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 测试成功，接受新版 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git add travel/packages/插件名&lt;br /&gt;
git commit -m &amp;quot;Update 插件名&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 删除插件 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git rm travel/packages/插件名&lt;br /&gt;
git rm travel/对应状态目录/init-插件名.el&lt;br /&gt;
git commit -m &amp;quot;Remove 插件名&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 换电脑完整恢复 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git clone --recurse-submodules \&lt;br /&gt;
  主仓库URL \&lt;br /&gt;
  ~/.emacs.d&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 总结 ==&lt;br /&gt;
&lt;br /&gt;
普通 &amp;lt;code&amp;gt;git clone&amp;lt;/code&amp;gt; 只是：&lt;br /&gt;
&lt;br /&gt;
:把插件下载到了当前电脑。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;git submodule add&amp;lt;/code&amp;gt; 则是：&lt;br /&gt;
&lt;br /&gt;
:让主仓库正式记录插件的 URL、保存路径和准确版本。&lt;br /&gt;
&lt;br /&gt;
Git submodule 对 Emacs 插件管理最大的意义是：&lt;br /&gt;
&lt;br /&gt;
:对插件版本状态进行精确控制，使整套配置可以稳定锁定、明确升级、快速回滚，并在其他电脑上一键复现。&lt;/div&gt;</summary>
		<author><name>Mwroot</name></author>
	</entry>
</feed>