BNU-FZH

fengzhenhua@outlook.com

今天获得了一个微形的USB无线网卡,其在Windows下是可以自动安装驱动程序的,因为此USB网卡中包含了Windows版的驱动程序。但是我现在想在Archlinux下使用这个USB无线网卡作为Wifi的发射无线信息供手机上网使用,而windows驱动就无能为力了。通过将USB无线网卡插入到windows电脑上配置好wifi就可以查询到此网卡的具体型号为realtek 8188gu wireless lan 802.11n usb nic linux, 而使用 pacman -Ss无法找到realtek相关驱动,于是使用paru查找:

paru -Ss realtek |grep 8188gu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    Driver for Realtek RTL8188CUS (8188C, 8192C) chipset wireless cards
aur/8188eu-dkms v4.3.0.8_13968-17 [+25 ~0.14]
Driver for Realtek RTL8188EUS (RTL8188EUS, RTL8188ETV) WLAN
aur/8188eu-aircrack-dkms-git 5.3.9.r196.3fae723-5 [+7 ~0.00]
Realtek RTL8188EUS and RTL8188ETV Wi-Fi driver with monitor mode & frame injection support
aur/8188eu-dkms-git 5.2.2.4.r794.53ed527-3 [+5 ~0.00]
Standalone driver for Realtek RTL8188EUS (RTL8188EUS, RTL8188ETV) WLAN
aur/8188fu-kelebek333-dkms-git r115.751882b-1 [+4 ~0.00] [无人维护]
Kernel driver module for Realtek RTL8188FU and RTL8188FTV Wireless 802.11n USB 2.0 adapters (device id 0bda:f179), for kernel versions < 6
aur/8188fu-dkms-git r13.586d795-1 [+3 ~0.00] [无人维护]
Kernel driver module for Realtek RTL8188FU and RTL8188FTV Wireless 802.11n USB 2.0 adapters (device id 0bda:f179), for kernel versions less than 5.8
Kernel module for Realtek RTL8188SU/RTL8191SU/RTL8192SU devices
aur/8188fu-supremegamers-dkms-git r120.40d4a49-1 [+2 ~0.00]
Kernel driver module for Realtek RTL8188FU and RTL8188FTV Wireless 802.11n USB 2.0 adapters (device id 0bda:f179), for kernel versions 6.0 and 6.1
aur/rtl8188gu-dkms-git r10.699d0cc-1 [+2 ~0.00] [已安装:r12.9dec829-1]
Linux driver for Realtek RTL8188GU

rtl8xxxu支持的wifi芯片

1
2
3
4
5
6
7
RTL8188CU/CUS/CTV
RTL8188EU/EUS/ETV
RTL8188FU/FTV
RTL8188GU | RTL8188RU
RTL8191CU | RTL8192CU
RTL8192EU | RTL8192FU
RTL8723AU | RTL8723BU
  • 支持Linux 内核版本: 5.5.x ~ 6.11.x
  • 测试工作良好的Linux发行版:
    • Arch Linux (kernel version: 6.6.39-1-lts)
    • Debian 11.10 (kernel version: 5.10.0-30-amd64 / 6.1.0-0.deb11.21-amd64)
    • Linux Mint 20.3 (kernel version: 5.15.0-113-generic)

安装驱动rtl8xxxu

  1. 克隆下rtl8xxxu的源文件:

    1
    git clone https://github.com/a5a5aa555oo/rtl8xxxu.git

  2. 如果您使用的USB Wifi发射器基于RTL8188GURTL8192FU芯片,您需要首先使用命令usb_modeswitcheject切换到Wifi模式。

  3. 安装构建模块需要的软件包:gcc,make,linux-headers,dkms和其他的依赖软件。

  4. 构建和安装模块

    • 使用传统方式

      make clean modules && sudo make install

    • 使用 DKMS 方式(推荐)

      sudo dkms install $PWD

    • 基于ArchLinux的发行版用户

      AUR中安装软件包: rtl8xxxu-dkms-git

      1
      paru -S rtl8xxxu-dkms-git

  5. 为芯片 RTL8188EU/RTL8188FU/RTL8188GU/RTL8192EU/RTL8192FU 安装固件(关键)

    sudo make install_fw

  6. 载入模块

    sudo modprobe rtl8xxxu_git

安装成功后,可以在设置Wi-Fi中找到网卡 Realtek RTL8188GU,顺利完成无线网卡驱动的安装。

  • 2024年07月17日, 在办公室的台式机90M2CTO1WW (QiTianM428-N000)测试失败,或许是USB版的网卡不稳定?由于时间的关系,不再研究无线wifilinux上的启用。
  • 2024年08月12日, 在办公室的台式90M2CTO1WW(QiTianM428-N000)再次测试,重新安装rtl8188gu-dkms-git之后仍然将网卡识别为光盘,但是执行sudo modprobe rtl8188之后再重启,同时更换的插入的USB接口,发现无线网卡启动成功。
  • 2024年08月13日, 通过rtl8xxxu-dkms官网https://kkgithub.com/a5a5aa555oo/rtl8xxxu安装固件.

安装驱动rtl8xxxu-dkms-git

根据文章RTL8188GU驱动安装, rtl8188gu-dkms-git有已知性能问题,在用户态可以看到一个RTW_CMD_THREAD。我使用时延迟很大并且使用一会就会断开,只能通过拔插恢复。同时也说明rtl8xxxu-dkms-gitLinux主线移植的驱动,性能优异,于是决定卸载rtl8188gu-dkms-git后安装rtl8xxxu-dkms-git

rtl8xxxu驱动安装
1
2
paru -S rtl8xxxu-dkms-git
sudo modprobe rtl8xxxu

如果已经安装了前面的McMCCRU版本的驱动,可以在/etc/modprobe.d/blacklist中添加一行blacklist 8188gu屏蔽旧驱动。

安装 dnsmasq

当安装好rtl8xxxu-dkms-git后,发现使用Gnome自带的开启wifi热成功,但是使用手机连接热点总是失败,同时wifi热点也随之关闭。原因是没有安装dnsmasq,它的主要作用是提供 DNS 缓存和 DHCP 服务功能。作为域名解析服务器(DNS),dnsmasq可以通过缓存 DNS 请求来提高对访问过的网址的连接速度。作为DHCP 服务器,dnsmasq 可以用于为局域网电脑分配内网ip地址和提供路由。DNS和DHCP两个功能可以同时或分别单独实现。dnsmasq轻量且易配置,适用于个人用户或少于50台主机的网络。此外它还自带了一个 PXE 服务器。所以如果没有这个服务,那wifi热点就无法为手机分配 dns, 也就无法启动wifi热点。安装此服务即可:

1
sudo pacman -S dnsmasq

根据文章Arch Linux上简单地创建wifi热点(只用一块无线网卡), 共享wifi需要安装linux-wifi-hotspot, 但是按其配置好我的电脑并不能通过linux-wifi-hotspot共享网络,或许在其文章底部的当然不是用来共享校园网说明了问题。于是果断删除此软件,在安装好dnsmasq之后,使用Gnome自带的创建wifi共享网络成功。

提到M.2,大家都知道它是固态硬盘接口,不过并不是所有M.2接口都能安装各种类型的固态硬盘。为什么有些M.2固态硬盘接口上会有两个缺口,而有些则只有一个?其中的诸多的讲究,让我们一起了解下。

我们平时看到的M.2模块大多是M.2 2242或M.2 2280规格,除此之外M.2还提供了多种标准规格。一个基本的原则是小体积可以安装到大体积插槽内,M.2 2242就比M.2 2280更灵活。

并不是所有的M.2接口都是给固态硬盘使用的,比如下图中的M.2 E Key插槽就是留给无线网卡专用。仔细观察你会发现E Key的缺口位置和普通固态硬盘上的B Key有所不同,M.2插槽就是通过缺口的位置来表达自己能够支持的M.2设备类型。

常见的M.2固态硬盘分为一个缺口(M Key)和两个缺口(B Key)两种类型。下图中从上到下分别是东芝饥饿鲨RD400 NVMe固态硬盘、东芝Q200 240G M.2固态硬盘和东芝RC100 NVMe固态硬盘,分别对应PCIE NVMe、SATA AHCI、PCIE NVMe接口。也就是说,两个缺口的M.2固态硬盘既有可能是NVMe协议,也有可能为SATA协议,而只有一个缺口(M Key)的通常只有NVMe协议一种可能。

与固态硬盘相对应的是,M.2插槽上的卡口位置也有一些不同。下图比较了Socket 2和Socket 3两种最常见M.2插槽。Socket 2插槽支持PCIe x2或SATA通道,而Socket 3插槽则支持PCIe x4或SATA通道。

现在结论就比较明朗了,由于插槽卡口的限制,两个缺口(B+M Key)的固态硬盘可以安装到Socket 2或Socket 3两种形式的M.2插槽中,而一个缺口(M Key)的固态硬盘只能安装到Socket 3插槽。

两个缺口的固态硬盘只能支持PCIe x2通道,在持续读写带宽上会有所限制,但决定日常使用性能的4K随机读写效能却不受影响。

虽说x2通道对性能会有所限制,但也不乏优秀产品。譬如东芝的迷你NVMe SSD——RC100 就使用了B+M Key规格,在保持优良的兼容性的同时,4K随机读取速度达到58.55MB/s,基本和高端的旗舰级NVMe固态硬盘保持一致。

受益于B+M Key的双卡口特点,RC100甚至能够安装到为4GB上网卡(B Key接口)预留的M.2 2242插槽中并正常工作,已有玩家在Thinkpad T470p等机型中验证了这个特殊用法。

总结来说:

  • 从极致性能出发,一个缺口(M Key)的M.2 NVMe固态硬盘最强(不是100%一定,具体还要看主控规格);
  • 从兼容性出发,两个缺口的M.2 SATA固态硬盘更好(如Q200 M.2版);
  • 要兼顾性能和兼容性,两个缺口的M.2 NVMe固态硬盘(如RC100)比较理想。

十七世纪,意大利数学家黎卡提提出如下方程:

\[\begin{equation}\label{eq:riccati} y'=P(x)y^2+Q(x)y+R(x) \end{equation}\]

\(\eqref{eq:riccati}\)称为Riccati方程。1841年法国数学家刘维尔证明了黎卡提(Riccati)方程一般没有初等解法,但是很多实际问题与理论问题又迫切需要求得这个方程的解,这也使得这一方程成为世界著名难题。

黎卡提方程自从十七世纪黎卡提提出以来,历经三百多年一直未有一般解法,虽然有众多特例解法,但是都未能从根本上解决这个方程。但是在物理上它的地位相当重要,所以解决这一方程仍是一个重要的任务。经过简单化简,我们可以给出一个更加简洁对称的形式,即:

\[\begin{equation}\label{eq:riccati1} y'+y^2+R(x)=0 \end{equation}\]

只要能够求解出式\(\eqref{eq:riccati1}\)则式\(\eqref{eq:riccati}\)的解也就可以得到了。由于其异常困难,我将此方程单独放在这里,希望获得式\(\eqref{eq:riccati1}\)的解。2024年07月14日

vim中使用HJKL移动光标,但是有时候人们习惯于使用方向键,这在有一些脚本中实现移动光标选择选项时比较重要。在网络上找到两个方案:

方案一

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash
akey=(0 0 0)

cESC=`echo -ne "\033"`

while :
do
#这里要注意,这里有-n选项,后跟一个数字,指定输入的字符长度最大值,所以不管key变量的值有多少个字符,都是一个值一个值做循环, 有多少个值就循环多少次
#输入键盘的上下左右键时,都有三个字符(ESC键算一个),所以都是做三次循环,每做一次循环,akey的值都会发生改变
read -s -n 1 key

akey[0]=${akey[1]}
akey[1]=${akey[2]}
akey[2]=${key}

if [[ ${key} == ${cESC} && ${akey[1]} == ${cESC} ]]
then
echo "ESC键"
elif [[ ${akey[0]} == ${cESC} && ${akey[1]} == "[" ]]
then
if [[ ${key} == "A" ]];then echo "上键"
elif [[ ${key} == "B" ]];then echo "向下"
elif [[ ${key} == "D" ]];then echo "向左"
elif [[ ${key} == "C" ]];then echo "向右"
fi
fi
done

方案二

因为上下左右键当中分别含有ABDC,可以利用这一点来做while循环控制输出上下左右键的信号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash
key=() #----->自定义一个数组key,为空值
while :
do
read -s -n 1 key #----->这里跟第一种方法类似,就是利用while循环,不过这里有点不一样的地方,就是这个不考虑完整方向键的字符
#的方向键字符组成只要循环中包含A就会输出上键,包含B就会输出下键,以此类推,所以个人觉得这种方法没有第一种方法严谨,第一种方法更适合用来写比较大的脚本

case ${KEY[0]} in
"B")
echo "下键"
;;
"A")
echo "上键"
;;
"D")
echo "左键"
;;
"C")
echo "右键"
;;
*)
continue
esac
done

方案三

通过分析上述两种方案,我们给出第三种方案,即识别[A[B[C[D 也可以区分方向键。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
NEO_ESC=`echo -ne "\033"`
echo -n "请输入按键"; read -s -n 1 key
if [[ $key == ${NEO_ESC} ]]; then
read -sn 2 SubListDo
case "$SubListDo" in
"[A")
echo "向上"
;;
"[B")
echo "向下"
;;
"[C")
echo "向右"
;;
"[D")
echo "向左"
;;
*)
exit
;;
esac
fi
  • 2024年07月13日, 由于在脚本diary.shzugit.sh中菜单使用了单一的vim方案,在没有实现完美的方向键识别前暂不加入方向键移动光标选择功能。
  • 2024年07月14日, 在上述方案中首先检测是否输入特殊字符,若为特殊字符前导符\033[, 则读取后面两个字符,再对后两个字符分类探测。使用此方法成功在diary.shzugit.sh中引入方向键,home,end,pgup,pgdn控制列表显示,使之成为更加友好的同时兼容vim快捷键的脚本程序。

对于解析函数,可以将其Taylor展开为: \[\begin{equation}\label{eq:taylor} f(x_{i+1})=f(x_i)+f'(x_i)h+\frac{f''(x_i)}{2}h^2+\cdots \end{equation}\] 现在据式\(\eqref{eq:taylor}\)来计算多阶导数,取近似到二阶项,则一阶导数为 \[\begin{equation}\label{eq:taylor1} f'(x_i)=\frac{f(x_{i+1})-f(x_i)}{h}+O(h) \end{equation}\] 将式\(\eqref{eq:taylor1}\)中的函数\(f\)替换为相应的导数\(f'\)得二阶导数,然后出现的一阶导数使用式\(\eqref{eq:taylor1}\)替换,从而得到二阶导数用零阶导数表达的算式 \[\begin{equation}\label{eq:taylor2} f''(x_i)=-\frac{f(x_{i+2})-2f(x_{i+1})+f(x_i)}{h^{2}}+O(h) \end{equation}\] 按前述方法可以求出任意阶导数使用零阶导数表达的算式,于是可以将式\(\eqref{eq:taylor}\)取更多的项以提高其导数\(f'(x_i)\)的精度,比如取到二阶项 \[\begin{equation}\label{eq:taylor3} f'(x_i)=\frac{f(x_{i+1})-f(x_i)}{h}-\frac{f(x_{i+2})-2f(x_{i+1})+f(x_i)}{2h^{2}}h+O(h^2) \end{equation}\] 化简式\(\eqref{eq:taylor3}\)\[\begin{equation}\label{eq:taylor4} f'(x_i)=\frac{-f(x_{i+2})+4f(x_{i+1})-3f(x_i)}{2h}+O(h^2) \end{equation}\]

tar的选项参数

1
2
3
4
5
-c: 建立压缩档案
-x:解压
-t:查看内容
-r:向压缩归档文件末尾追加文件
-u:更新原压缩包中的文件

这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。下面的参数是根据需要在压缩或解压档案时可选的。

1
2
3
4
5
-z:有gzip属性的
-j:有bz2属性的
-Z:有compress属性的
-v:显示所有过程
-O:将文件解开到标准输出

--delete从存档中删除 注意是两个减号。

下面的参数-f是必须的
-f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。

举例说明

  1. 压缩一个目录

    1
    eg:  tar -cvzf test.tar.gz  tar  #压缩当前目录下的tar目录,压缩包的名字叫test.tar.gz

  2. 压缩其中某一类型的文件

    1
    eg:  tar -cvzf test.tar.gz  ./*.c #压缩当前目录下的.c为后缀的文件。但是不能压缩以.开头的文件

  3. 查看一个压缩文件的内容

    1
    eg: tar -tvf test.tar.gz   #查看当前目录下test.tar.gz压缩文件中的文件

  4. 解压一个文件

    1
    eg.  tar -xvzf test.tar.gz #解压test.tar.gz到当前目录下面

  5. 文件夹做一个归档文件、备份一个目录、

    1
    eg: tar -cvf test.tar tar #将tar文件夹下的文件生成一个test.tar归档文件

  6. 将某一类型的文件做成归档文件、备份某一类型的文件

    1
    eg:tar -cvf test.tar ./tar/*.c   # 将tar文件夹下所有以.c结尾的文件放到test.tar 文件中,但是以.开头的文件不行

  7. 向归档文件中添加一个文件夹

    1
    eg: tar -rf test.tar  ./test1  #将test1文件夹中的所有文件,添加到test.tar 归档文件中

  8. 删除归档文件中的文件

    1
    eg: tar -f test.tar --delete a.c  #删除test.tar文件中的 a.c文件

  9. 删除归档文件中的某一类的文件

    1
    eg: tar -f test.tar --delete *.c  #删除test.tar文件中的 以.c结尾的文件

  10. 释放归档文件

    1
    eg:  tar  -xvf  test.tar  #释放test.tar归档文件中的内容到 当前目录下

  11. 查看归档文件中的内容

    1
    eg: tar -tvf test.tar 

总结

格式与解压命令
1
2
3
4
5
6
7
8
9
1、*.tar           用 tar –xvf 解压
2、*.gz 用 gzip -d或者gunzip 解压
3、*.tar.gz和*.tgz 用 tar –xzf 解压
4、*.bz2 用 bzip2 -d或者用bunzip2 解压
5、*.tar.bz2 用tar –xjf 解压
6、*.Z 用 uncompress 解压
7、*.tar.Z 用tar –xZf 解压
8、*.rar 用 unrar e解压
9、*.zip 用 unzip 解压
使用举例
1
2
3
4
tar cvf  etcbak.tar etc/      打包一个tar
tar xvf etcbak.tar 解开一个tar
tar cvzf etcbak.tar.gz etc/ 打包压缩一个 tar
tar zxvf etcbak.tar.gz 解压一个tar

LaTeX排版系统主要有CTeX套装TeXLive, 然而我们建议大家尽量使用TeXLive, 原因是:

CTeX套装

CTeX套装是科学院吴凌云研究员的个人作品。在 CTeX套装刚刚问世之时,因其解决了繁琐的中文字体安装工作,所以广受欢迎。但是,一方面 CTeX套装已经很久不更新,内里的宏包、工具陈旧;另一方面,随着 XeLaTeX 的发展,以及 xeCJK 等技术的成熟,上述这些繁琐的工作已经没有必要而失去意义;因此,.

CTeX宏集

虽然它的名字也是「CTeX」,但是 CTeX 宏集和 CTeX 套装是两个不同的东西。CTeX 宏集是集成了中文支持、操作系统判定、字体选择、版式预设为一体的一组宏包和文档类的合集。我们推荐在任何情况下,优先使用 CTeX 宏集处理中文。

TeXLive

TeXLiveTUG (TeX User Group) 维护和发布的 TeX 系统,可说是「官方」的 TeX 系统。我们推荐任何阶段的 TeX 用户,都尽可能使用 TeXLive,以保持在跨操作系统平台、跨用户的一致性。TeXLive 的官方站点是 https://tug.org/texlive/.

归纳总结

  • 不要安装和使用 CTeX 套装!
  • 请在任何情况下优先使用 CTeX 宏集在 LaTeX 中处理中文!
  • 具体安装配置请参考:ArchLinux安装指南

简介

Includes styles for American Physical Society, American Institute of Physics, and Optical Society of America. The distribution consists of the RevTeX class itself, and several support packages.

文献引用显示和隐藏脚注

在使用revtex4编写论文时,发现所有的footnote都会在引用文献中出现,调用其说明文档revtex4.pdf后发现其使用规则并没有详细介绍。于是经过一翻查找得到设置方法:即使用选项footinbib实现在参考文献列表中出现footnote的内容,使用选项nofootinbib则不在参考文献中出现footnote. 即

1
2
\documentclass[footinbib]{revtex4}   %默认启用此选项
\documentclass[nofootinbib]{revtex4} %关闭需手动设置

参考文章

本来我的Outlook邮箱是相当纯净的,但是最近总是收到Start Daily的邮件,有点不能接受。研究后发现解决方法:

  • 登录网页版的Outlook邮箱:Outlook登录
  • 点击右上角您的头象,然后选择我的Microsoft帐户
  • 在左侧点击第二项您的信息
  • 在右侧向下滚动,找到帐户信息, 再点击通信首选项
  • 将所有的订阅取消,然后点击应用,Outlook得归清静。

插件vim-vsnip自带了相当数量的补全插件,但是一般都是通用的片段,对于编写自己常用的文件还需要自定义片段。本文记录自定义片段的具体过程。

安装插件

~/.config/nvim/lua/lazy-init.lua
1
2
3
4
5
6
7
require("lazy").setup({
...
'hrsh7th/cmp-vsnip' ,
'hrsh7th/vim-vsnip' ,
'rafamadriz/friendly-snippets' ,
...
})

编辑片段

这里可以使用命令VsnipOpen, 或者直接编辑~/.vsnip/markdown.json就可以直接添加markdown相应的片段。在编写过程中,为了适应Next博客主题输入数学公式的需要,需要输入$$, 但是这个片段是错误的,因为默认$是变量的符号,于是转义,片段的转义符号为\\, 于是得相应片段为:

~/.vsnip/markdown.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
{
"math-sup": {
"Vsnips.EnableAutoTrigger": true,
"prefix": ["^{"],
"body": [
"^{$1}<++>"
],
"description": "math formular"
},
"math-sub": {
"Vsnips.EnableAutoTrigger": true,
"prefix": ["_{"],
"body": [
"_{$1}<++>"
],
"description": "math formular"
},
"math-dkuohao": {
"Vsnips.EnableAutoTrigger": true,
"prefix": ["{"],
"body": [
"{$1}<++>"
],
"description": "math formular"
},
"math-fkuohao": {
"Vsnips.EnableAutoTrigger": true,
"prefix": ["["],
"body": [
"[$1]<++>"
],
"description": "math formular"
},
"math-ykuohao": {
"Vsnips.EnableAutoTrigger": true,
"prefix": ["("],
"body": [
"($1)<++>"
],
"description": "math formular"
},
"math-sqrt": {
"Vsnips.EnableAutoTrigger": true,
"prefix": ["sqrt"],
"body": [
"\\sqrt{$1}<++>"
],
"description": "math formular"
},
"math-frac": {
"Vsnips.EnableAutoTrigger": true,
"prefix": ["frac"],
"body": [
"\\frac{$1}{<++>}<++>"
],
"description": "math formular"
},
"math-tag": {
"prefix": ["tag"],
"body": [
"\\$\\tag{$1}\\label{tag<++>}\\$<++>"
],
"description": "math referance"
},
"math-eqref": {
"prefix": ["eqref"],
"body": [
"\\$\\eqref{eq:$1}\\$<++>"
],
"description": "math referance"
},
"math-label": {
"prefix": ["eqlabel"],
"body": [
"\\label{eq:$1}<++>"
],
"description": "math labels"
},
"math-multi2": {
"prefix": ["align"],
"body": [
"\\$\\$\\begin{align}",
"$1",
"\\end{align}\\$\\$<++>"
],
"description": "Multi-line Equations"
},
"math-multi1": {
"prefix": ["mequation"],
"body": [
"\\$\\$\\begin{equation}\\label{eq:$1}",
"\\begin{aligned}",
"<++>",
"\\end{aligned}",
"\\end{equation}\\$\\$<++>"
],
"description": "Multi-line Equations"
},
"math-simple": {
"prefix": ["equation"],
"body": [
"\\$\\$\\begin{equation}\\label{eq:$1}",
"<++>",
"\\end{equation}\\$\\$<++>"
],
"description": "Simple Equation"
},
"LinkGrid": {
"prefix": ["linkgrid"],
"body": [
"{% linkgrid %}",
" $1 | https://<+url+> | <+description+> | /Picture/<++>",
"{% endlinkgrid %}"
],
"description": "For diary.sh write"
},
"button": {
"prefix": ["button"],
"body": [
"{% button https://<+url+>, $1 %}"
],
"description": "For diary.sh write"
},
"fold": {
"prefix": ["fold"],
"body": [
"<details><summary>$1</summary>",
"<+contents+>",
"</details>"
],
"description": "For diary.sh write"
},
"more": {
"prefix": ["more"],
"body": [
"<!-- more -->"
],
"description": "For diary.sh write"
},
"arrow": {
"prefix": ["arrow"],
"body": [
"${1|&rarr;,&uarr;,&darr;,&larr;,&harr;|}"
]
},
"picture": {
"prefix": ["picture"],
"body": [
"![$1](/Picture/<+pic+> \"<+title+>\")<++>"
]
},
"centertext": {
"prefix": ["center"],
"body": [
"{% cq %}",
"$1",
"{% endcq %}",
"<++>"
]
},
"textcolor": {
"prefix": ["color"],
"body": [
"<label style=\"color:${1|red,yellow,blue,cyan,gold,green,gray,orange|}\"><++></label><++>"
]
},
"underline": {
"prefix": ["underline"],
"body": [
"<u>$1</u><++>"
]
},
"sub": {
"prefix": ["__"],
"body": [
"<sub>$1</sub><++>"
]
},
"sup": {
"prefix": ["^^"],
"body": [
"<sup>$1</sup><++>"
]
},
"href": {
"prefix": ["ref"],
"body": [
"[$1](/<+year+>/<+month+>/<+day+>/<+article+>)"
],
"description": "Ref the article of my blog"
},
"hurl": {
"prefix": ["url"],
"body": [
"[$1](<+url+>)<++>"
]
},
"delete": {
"prefix": ["delete"],
"body": [
"~~$1~~"
]
},
"code": {
"prefix": ["code"],
"body": [
"{% code <+title+> lang:${1|sh,python,lua,perl,yaml,ruby|} %}",
"<+code+>",
"{% endcode %}",
"<++>"
],
"description": "Next theme environment for Hexo"
},
"codeblock": {
"prefix": ["codeblock"],
"body": [
"{% codeblock <+title+> lang:${1|sh,python,lua,perl,yaml,ruby|} %}",
"<+code+>",
"{% endcodeblock %}",
"<++>"
],
"description": "Next theme environment for Hexo"
},
"```": {
"prefix": ["```"],
"body": [
"```${1|sh,python,lua,perl,yaml,ruby|} <+title+> ",
"<+code+>",
"```",
"<++>"
],
"description": "Next theme environment for Hexo"
},
"note": {
"prefix": ["note"],
"body": [
"{% note ${1|default,primary,success,info,warning,danger|} %}",
"<++>",
"{% endnote %}",
"<++>"
],
"description": "Next theme environment for Hexo"
},
"tabs": {
"prefix": ["tabs"],
"body": [
"{% tabs ${1:<+UniqueName+>} %}",
"<!-- tab ${2:<+tabcaption+>} -->",
"<++>",
"<!-- endtab -->",
"<++>",
"{% endtabs %}",
"<++>"
],
"description": "Next theme environment for Hexo"
},
"tab": {
"prefix": ["tab"],
"body": [
"<!-- tab ${2:<+tabcaption+>} -->",
"<++>",
"<!-- endtab -->",
"<++>"
],
"description": "Next theme environment for Hexo"
},
"label": {
"prefix": ["label"],
"body": [
"{% label ${1|default,primary,success,info,warning,danger|}@${2:<+content+>} %}<++>"
],
"description": "Next theme environment for Hexo"
},
"centerquote": {
"prefix": ["centerquote"],
"body": [
"{% centerquote %}",
"${1:<+content+>}",
"{% endcenterquote %}",
"<++>"
],
"description": "Next theme environment for Hexo"
},
"video": {
"prefix": ["video"],
"body": [
"{% video ${1|/Video/<++>,https://<+website+>|}%}<++>"
],
"description": "Next theme environment for Hexo"
},

"pdf": {
"prefix": ["pdf"],
"body": [
"{% pdf ${1|/PDF/<++>.pdf,https://<+website+>|}%}<++>"
],
"description": "Next theme environment for Hexo"
},
"grouppicture": {
"prefix": ["grouppicture"],
"body": [
"{% grouppicture ${1:<+number+>}-${2:<+layout+>} }%}",
"![${3:<+picturetitle+>}](${4:<+picture+>})",
"{% endgroudpicture %}",
"<++>"
],
"description": "Next theme environment for Hexo"
}
}

参考资料