From 9ff36a3ac341e79c26adbceb1912e3da9ef2ceda Mon Sep 17 00:00:00 2001
From: jaywcjlove <398188662@qq.com>
Date: Sun, 2 Oct 2022 03:23:32 +0800
Subject: [PATCH] feat: add `vim.md` `regex.md` cheatsheet.
---
README.md | 2 +
docs/jest.md | 18 +-
docs/quickreference.md | 29 ++
docs/regex.md | 923 +++++++++++++++++++++++++++++++++++++++
docs/semver.md | 13 +-
docs/sketch.md | 9 +-
docs/typescript.md | 4 +-
docs/vim.md | 773 ++++++++++++++++++++++++++++++++
docs/vscode.md | 11 +-
package.json | 1 -
scripts/assets/regex.svg | 3 +
scripts/assets/vim.svg | 3 +
scripts/create.mjs | 2 -
scripts/style.css | 23 +-
14 files changed, 1788 insertions(+), 26 deletions(-)
create mode 100644 docs/regex.md
create mode 100644 docs/vim.md
create mode 100644 scripts/assets/regex.svg
create mode 100644 scripts/assets/vim.svg
diff --git a/README.md b/README.md
index d9ee6f9..2e4690c 100644
--- a/README.md
+++ b/README.md
@@ -23,7 +23,9 @@ Quick Reference
[Semver](./docs/semver.md)
[Sketch](./docs/sketch.md)
[Jest](./docs/jest.md)
+[RegEx](./docs/regex.md)
[VSCode](./docs/vscode.md)
+[Vim](./docs/vim.md)
[XPath](./docs/xpath.md)
diff --git a/docs/jest.md b/docs/jest.md
index 4fc93b3..7d43276 100644
--- a/docs/jest.md
+++ b/docs/jest.md
@@ -10,11 +10,11 @@ Jest 是一款优雅、简洁的 JavaScript 测试框架。
[Jest](https://jestjs.io/) 是一款优雅、简洁的 JavaScript 测试框架。
-- 无需配置,大多数 JS 项目中即装即用,无需配置
-- 优秀接口,从 it 到 expect - Jest 将工具包整合在一处。文档齐全、不断维护,非常不错。
-- 隔离的,并行进行测试,发挥每一丝算力。
-- 快照, 轻松编写持续追踪大型对象的测试,并在测试旁或代码内显示实时快照。
-- 代码覆盖, 无需其他操作,您仅需添加 --coverage 参数来生成代码覆盖率报告。
+- `无需配置` 大多数 JS 项目中即装即用,无需配置
+- `优秀接口` 从 `it` 到 `expect` - Jest 将工具包整合在一处。文档齐全、不断维护,非常不错。
+- `隔离的` 并行进行测试,发挥每一丝算力。
+- `快照` 轻松编写持续追踪大型对象的测试,并在测试旁或代码内显示实时快照。
+- `代码覆盖` 无需其他操作,您仅需添加 `--coverage` 参数来生成代码覆盖率报告。
### 测试结构
@@ -347,7 +347,7 @@ test('async test', (done) => {
})
```
-将断言包装在 try/catch 块中,否则 Jest 将忽略失败
+将断言包装在 `try/catch` 块中,否则 `Jest` 将忽略失败
### Promises
@@ -361,7 +361,7 @@ test('async test', () => {
})
```
-从你的测试中 _返回_ 一个 Promise
+从你的测试中 _返回_ 一个 `Promise`
## 模拟
@@ -628,7 +628,7 @@ describe.each([
})
```
-[describe.each() 文档](https://jestjs.io/docs/en/api#describeeachtablename-fn-timeout)、[test.each() 文档](https://jestjs.io/docs/en/api#testeachtablename-fn-timeout),
+[describe.each()](https://jestjs.io/docs/en/api#describeeachtablename-fn-timeout) 文档、[test.each()](https://jestjs.io/docs/en/api#testeachtablename-fn-timeout) 文档
跳过测试
----
@@ -671,7 +671,7 @@ test('第二个文本', () => {
})
```
-Node.js 和 Jest 会缓存你需要的模块。 要测试具有副作用的模块,您需要在测试之间重置模块注册表
+`Node.js` 和 `Jest` 会缓存你需要的模块。 要测试具有副作用的模块,您需要在测试之间重置模块注册表
另见
diff --git a/docs/quickreference.md b/docs/quickreference.md
index b945152..076be63 100644
--- a/docs/quickreference.md
+++ b/docs/quickreference.md
@@ -147,6 +147,35 @@ function () {}
```
+### 快捷键样式
+
+| Key | value |
+| ---- | ---- |
+| `快捷键` | 说明 |
+| `快捷键` | 说明 |
+
+
+列表添加 `` 样式类,展示快捷键样式。
+
+### 内置类样式
+
+:- | -
+:- | -
+`shortcuts` | 快捷键样式
+`wrap-text` | 超出换行
+`show-header` | 展示表头
+
+
+### 颜色标签
+
+:- | -
+:- | -
+`` | 黄色
+`` | 紫色
+`` 或 \`\`
| 绿色
+
+
+
布局
---
diff --git a/docs/regex.md b/docs/regex.md
new file mode 100644
index 0000000..d307354
--- /dev/null
+++ b/docs/regex.md
@@ -0,0 +1,923 @@
+RegEX 备忘清单
+===
+
+正则表达式 (regex) 的快速参考,包括符号、范围、分组、断言和一些示例模式,以帮助您入门。
+
+入门
+--------
+
+### 介绍
+
+这是开始使用正则表达式(Regex)的快速备忘单。
+
+- [Python 中的 Regex](#python-中的正则表达式) _(Quick Reference)_
+- [JavaScript 中的 Regex](#javascript-中的正则表达式) _(Quick Reference)_
+- [PHP 中的 Regex](#php中的正则表达式) _(Quick Reference)_
+- [Java 中的 Regex](#java-中的正则表达式) _(Quick Reference)_
+- [MySQL 中的 Regex](#mysql中的正则表达式) _(Quick Reference)_
+- [Vim 中的 Regex](./vim#vim-搜索和替换) _(Quick Reference)_
+- [在线 Regex 测试器](https://regex101.com/) _(regex101.com)_
+
+
+### 字符类
+
+范例 | 说明
+:-|-
+`[abc]` | 单个字符:a、b 或 c
+`[^abc]` | 一个字符,除了:a、b 或 c
+`[a-z]` | 范围内的字符:a-z
+`[^a-z]` | 不在范围内的字符:a-z
+`[0-9]` | 范围内的数字:0-9
+`[a-zA-Z]` | 范围内的字符:
a-z 或 A-Z
+`[a-zA-Z0-9]` | 范围内的字符:
a-z、A-Z 或 0-9
+
+
+### 量词
+
+范例 | 说明
+:-|-
+`a?` | 零个或一个`a`
+`a*` | 零个或多个 `a`
+`a+` | 一个或多个`a`
+`[0-9]+` | `0-9`中的一个或多个
+`a{3}` | 正好 `3` 个 `a`
+`a{3,}` | 3个或更多的`a`
+`a{3,6}` | `a` 的 `3` 到 `6` 之间
+`a*` | 贪心量词
+`a*?` | 惰性量词
+`a*+` | 占有量词
+
+### 常用元字符
+
+- \^
+- \{
+- \+
+- \<
+- \[
+- \*
+- \)
+- \>
+- \.
+- \(
+- \|
+- \$
+- \\
+- \?
+
+
+使用 `\` 转义这些特殊字符
+
+### 元序列
+
+
+范例 | 说明
+:-|-
+`.` | 任何单个字符
+`\s` | 任何空白字符
+`\S` | 任何非空白字符
+`\d` | 任何数字,与 `[0-9]` 相同
+`\D` | 任何非数字,与 `[^0-9]` 相同
+`\w` | 任何单词字符
+`\W` | 任何非单词字符
+`\X` | 任何 Unicode 序列,包括换行符
+`\C` | 匹配一个数据单元
+`\R` | Unicode 换行符
+`\v` | 垂直空白字符
+`\V` | `\v` 的否定 - 除了换行符和垂直制表符之外的任何内容
+`\h` | 水平空白字符
+`\H` | `\h` 的否定
+`\K` | 重置匹配
+`\n` | 匹配第 `n` 个子模式
+`\pX` | `Unicode` 属性 `X`
+`\p{...}` | `Unicode` 属性或脚本类别
+`\PX` | `\pX` 的否定
+`\P{...}` | `\p` 的否定
+`\Q...\E` | 引用;视为文字
+`\k` | 匹配子模式`name`
+`\k'name'` | 匹配子模式`name`
+`\k{name}` | 匹配子模式`name`
+`\gn` | 匹配第 n 个子模式
+`\g{n}` | 匹配第 n 个子模式
+`\g` | 递归第 n 个捕获组
+`\g'n'` | 递归第 n 个捕获组。
+`\g{-n}` | 匹配第 n 个相对前一个子模式
+`\g<+n>` | 递归第 n 个相对即将到来的子模式
+`\g'+n'` | 匹配第 n 个相对即将到来的子模式
+`\g'letter'` | 递归命名捕获组 `字母`
+`\g{letter}` | 匹配先前命名的捕获组 `字母`
+`\g` | 递归命名捕获组 `字母`
+`\xYY` | 十六进制字符 `YY`
+`\x{YYYY}` | 十六进制字符 `YYYY`
+`\ddd` | 八进制字符`ddd`
+`\cY` | 控制字符 `Y`
+`[\b]` | 退格字符
+`\` | 使任何字符文字
+
+
+### 锚点
+
+范例 | 说明
+:-|-
+`\G` | 比赛开始
+`^` | 字符串的开始
+`$` | 字符串结束
+`\A` | 字符串的开始
+`\Z` | 字符串结束
+`\z` | 字符串的绝对结尾
+`\b` | 一个词的边界
+`\B` | 非单词边界
+
+
+### 替代
+
+范例 | 说明
+:-|-
+`\0` | 完整的比赛内容
+`\1` | 捕获组 `1` 中的内容
+`$1` | 捕获组 `1` 中的内容
+`${foo}` | 捕获组 `foo` 中的内容
+`\x20` | 十六进制替换值
+`\x{06fa}` | 十六进制替换值
+`\t` | 标签
+`\r` | 回车
+`\n` | 新队
+`\f` | 换页
+`\U` | 大写转换
+`\L` | 小写转换
+`\E` | 终止任何转换
+
+### 组构造
+
+范例 | 说明
+:-|-
+`(...)` | 捕获所有封闭的东西
+`(a\|b)` | 匹配 `a` 或 `b`
+`(?:...)` | 匹配随附的所有内容
+`(?>...)` | 原子组(非捕获)
+`(?\|...)` | 重复的子模式组号
+`(?#...)` | 注解
+`(?'name'...)` | 命名捕获组
+`(?...)` | 命名捕获组
+`(?P...)` | 命名捕获组
+`(?imsxXU)` | 内联修饰符
+`(?(DEFINE)...)` | 在使用它们之前预定义模式
+
+### 断言
+
+:-|-
+:-|-
+`(?(1)yes\|no)` | 条件语句
+`(?(R)yes\|no)` | 条件语句
+`(?(R#)yes\|no)` | 递归条件语句
+`(?(R&name)yes\|no)` | 条件语句
+`(?(?=...)yes\|no)` | 有条件的前瞻
+`(?(?<=...)yes\|no)` | 有条件的往后看
+
+### 零宽度断言
+
+:-|-
+:-|-
+`(?=...)` | 正先行断言
+`(?!...)` | 负先行断言
+`(?<=...)` | 正后发断言
+`(?name)` | 递归子模式`name`
+
+
+### POSIX 字符类
+
+
+字符类 | 如同 | 意义
+:-|-|-
+| `[[:alnum:]]` | `[0-9A-Za-z]` | 字母和数字
+| `[[:alpha:]]` | `[A-Za-z]` | 字母
+| `[[:ascii:]]` | `[\x00-\x7F]` | ASCII 码 0-127
+| `[[:blank:]]` | `[\t ]` | 仅空格或制表符
+| `[[:cntrl:]]` | `[\x00-\x1F\x7F]` | 控制字符
+| `[[:digit:]]` | `[0-9]` | 十进制数字
+| `[[:graph:]]` | `[[:alnum:][:punct:]]` | 可见字符(不是空格)
+| `[[:lower:]]` | `[a-z]` | 小写字母
+| `[[:print:]]` | `[ -~] == [ [:graph:]]` | 可见字符
+| `[[:punct:]]` | [!"#$%&’()*+,-./:;<=>?@[]^_\`{\|}~]
| 可见标点符号
+| `[[:space:]]` | [\t\n\v\f\r ]
| 空白
+| `[[:upper:]]` | `[A-Z]` | 大写字母
+| `[[:word:]]` | `[0-9A-Za-z_]` | 单词字符
+| `[[:xdigit:]]` | `[0-9A-Fa-f]` | 十六进制数字
+| `[[:<:]]` | `[\b(?=\w)]` | 词的开头
+| `[[:>:]]` | `[\b(?<=\w)]` | 词尾
+
+
+### 控制动词
+
+:-|-
+:-|-
+`(*ACCEPT)` | 控制动词
+`(*FAIL)` | 控制动词
+`(*MARK:NAME)` | 控制动词
+`(*COMMIT)` | 控制动词
+`(*PRUNE)` | 控制动词
+`(*SKIP)` | 控制动词
+`(*THEN)` | 控制动词
+`(*UTF)` | 图案修饰符
+`(*UTF8)` | 图案修饰符
+`(*UTF16)` | 图案修饰符
+`(*UTF32)` | 图案修饰符
+`(*UCP)` | 图案修饰符
+`(*CR)` | 换行修饰符
+`(*LF)` | 换行修饰符
+`(*CRLF)` | 换行修饰符
+`(*ANYCRLF)` | 换行修饰符
+`(*ANY)` | 换行修饰符
+`\R` | 换行修饰符
+`(*BSR_ANYCRLF)` | 换行修饰符
+`(*BSR_UNICODE)` | 换行修饰符
+`(*LIMIT_MATCH=x)` | 正则表达式引擎修饰符
+`(*LIMIT_RECURSION=d)` | 正则表达式引擎修饰符
+`(*NO_AUTO_POSSESS)` | 正则表达式引擎修饰符
+`(*NO_START_OPT)` | 正则表达式引擎修饰符
+
+正则表达式示例
+--------------
+
+### 字符串
+
+范例 | 说明
+:-|-
+`ring ` | 匹配 ring springboard 等。
+`. ` | 匹配 a、9、+ 等。
+`h.o ` | 匹配 hoo、h2o、h/o 等。
+`ring\? ` | 匹配 ring?
+`\(quiet\) ` | 匹配(安静)
+`c:\\windows ` | 匹配 c:\windows
+
+使用 `\` 搜索这些特殊字符:
`[ \ ^ $ . | ? * + ( ) { }`
+
+
+### 备择方案
+
+范例 | 说明
+:-|-
+`cat\|dog ` | 匹配 cat 或 dog
+`id\|identity ` | 匹配 id 或 identity
+`identity\|id ` | 匹配 id 或 identity
+
+当替代品重叠时,命令从长到短
+
+### 字符类
+
+范例 | 说明
+:-|-
+`[aeiou]` | 匹配任何元音
+`[^aeiou]` | 匹配一个非元音
+`r[iau]ng` | 匹配ring、wrangle、sprung等。
+`gr[ae]y` | 匹配 gray 或 grey
+`[a-zA-Z0-9]` | 匹配任何字母或数字
+
+在 `[ ]` 中总是转义 `. \ ]` 有时是 `^ - .`
+
+
+### 速记类
+
+范例 | 说明
+:-|-
+`\w ` | “单词”字符
_(字母、数字或下划线)_
+`\d ` | 数字
+`\s ` | 空格
_(空格、制表符、vtab、换行符)_
+`\W, \D, or \S ` | 不是单词、数字或空格
+`[\D\S] ` | 表示不是数字或空格,两者都匹配
+`[^\d\s] ` | 禁止数字和空格
+
+### 出现次数
+
+范例 | 说明
+:-|-
+`colou?r` | 匹配 color 或 color
+`[BW]ill[ieamy's]*` | 匹配 Bill、Willy、William's 等。
+`[a-zA-Z]+` | 匹配 1 个或多个字母
+`\d{3}-\d{2}-\d{4}` | 匹配 SSN
+`[a-z]\w{1,7}` | 匹配 UW NetID
+
+### 贪婪与懒惰
+
+范例 | 说明
+:-|-
+`* + {n,}`
_greedy_ | 尽可能匹配
+`<.+> ` | 在 \bold\<\/b> 中找到 1 个大匹配项
+`*? +? {n,}?`
_lazy_ | 尽可能少匹配
+`<.+?>` | 在 \<b>bold\<\/b> 中找到 2 个匹配项
+
+
+### 范围
+
+
+范例 | 说明
+:-|-
+`\b ` | “单词”边缘(非“单词”字符旁边)
+`\bring ` | 单词以“ring”开头,例如 ringtone
+`ring\b ` | 单词以“ring”结尾,例如 spring
+`\b9\b ` | 匹配单个数字 9,而不是 19、91、99 等。
+`\b[a-zA-Z]{6}\b ` | 匹配 6 个字母的单词
+`\B ` | 不是字边
+`\Bring\B ` | 匹配 springs 和 wringer
+`^\d*$ ` | 整个字符串必须是数字
+`^[a-zA-Z]{4,20}$` | 字符串必须有 4-20 个字母
+`^[A-Z] ` | 字符串必须以大写字母开头
+`[\.!?"')]$ ` | 字符串必须以终端标点结尾
+
+
+### 修饰
+
+范例 | 说明
+:-|-
+`(?i)`[a-z]*`(?-i)` | 忽略大小写开/关
+`(?s)`.*`(?-s)` | 匹配多行(导致 . 匹配换行符)
+`(?m)`^.*;$`(?-m)` | ^ & $ 匹配行不是整个字符串
+`(?x)` | #free-spacing 模式,此 EOL 注释被忽略
+`(?-x)` | 自由空间模式关闭
+/regex/`ismx` | 修改整个字符串的模式
+
+
+### 组
+
+范例 | 说明
+:-|-
+`(in\|out)put ` | 匹配 input 或 output
+`\d{5}(-\d{4})?` | 美国邮政编码 _(“+ 4”可选)_
+
+如果组后匹配失败,解析器会尝试每个替代方案。
+
+可能导致灾难性的回溯。
+
+### 反向引用
+
+范例 | 说明
+:-|-
+`(to) (be) or not \1 \2` | 匹配 to be or not to be
+`([^\s])\1{2}` | 匹配非空格,然后再相同两次 aaa, ...
+`\b(\w+)\s+\1\b` | 匹配双字
+
+### 非捕获组
+
+范例 | 说明
+:-|-
+`on(?:click\|load)` | 快于:
`on(click\|load)`
+
+尽可能使用非捕获或原子组
+
+### 原子组
+
+范例 | 说明
+:-|-
+`(?>red\|green\|blue)` | 比非捕获更快
+`(?>id\|identity)\b` | 匹配 id,但不匹配 identity
+
+"id" 匹配,但 `\b` 在原子组之后失败,
+解析器不会回溯到组以重试“身份”
+
+
+如果替代品重叠,请从长到短命令。
+
+
+
+### 零宽度断言 Lookaround(前后预查)
+
+
+范例 | 说明
+:-|-
+`(?= )` | 向前看,如果你能提前找到
+`(?! )` | 向前看,如果你找不到前面
+`(?<= )` | 向后看,如果你能找到后面
+`(?warbl
ing, string, fishing, ...
+`\b(?!\w+ing\b)\w+\b` | 不以“ing”结尾的单词
+`(?<=\bpre).*?\b ` | 匹配 pretend、present、prefix、...
+`\b\w{3}(?
+
+#### re.search()
+
+```python
+>>> sentence = 'This is a sample string'
+>>> bool(re.search(r'this', sentence, flags=re.I))
+True
+>>> bool(re.search(r'xyz', sentence))
+False
+```
+
+#### re.findall()
+
+```python
+>>> re.findall(r'\bs?pare?\b', 'par spar apparent spare part pare')
+['par', 'spar', 'spare', 'pare']
+>>> re.findall(r'\b0*[1-9]\d{2,}\b', '0501 035 154 12 26 98234')
+['0501', '154', '98234']
+```
+
+#### re.finditer()
+
+```python
+>>> m_iter = re.finditer(r'[0-9]+', '45 349 651 593 4 204')
+>>> [m[0] for m in m_iter if int(m[0]) < 350]
+['45', '349', '4', '204']
+```
+
+#### re.split()
+
+```python
+>>> re.split(r'\d+', 'Sample123string42with777numbers')
+['Sample', 'string', 'with', 'numbers']
+```
+
+#### re.sub()
+
+```python
+>>> ip_lines = "catapults\nconcatenate\ncat"
+>>> print(re.sub(r'^', r'* ', ip_lines, flags=re.M))
+* catapults
+* concatenate
+* cat
+```
+
+#### re.compile()
+
+```python
+>>> pet = re.compile(r'dog')
+>>> type(pet)
+
+>>> bool(pet.search('They bought a dog'))
+True
+>>> bool(pet.search('A cat crossed their path'))
+False
+```
+
+### 函数
+
+函数 | 说明
+:-|-
+`re.findall` | 返回包含所有匹配项的列表
+`re.finditer` | 返回一个可迭代的匹配对象(每个匹配一个)
+`re.search` | 如果字符串中的任何位置存在匹配项,则返回 Match 对象
+`re.split` | 返回一个列表,其中字符串在每次匹配时被拆分
+`re.sub` | 用字符串替换一个或多个匹配项
+`re.compile` | 编译正则表达式模式供以后使用
+`re.escape` | 返回所有非字母数字反斜杠的字符串
+
+
+
+### Flags 标志
+
+
+:- | - | -
+:- | - | -
+`re.I` | `re.IGNORECASE` | 忽略大小写
+`re.M` | `re.MULTILINE` | 多行
+`re.L` | `re.LOCALE` | 使 `\w`、`\b`、`\s` _locale 依赖_
+`re.S` | `re.DOTALL` | 点匹配所有 _(包括换行符)_
+`re.U` | `re.UNICODE` | 使 `\w`、`\b`、`\d`、`\s` _unicode 依赖_
+`re.X` | `re.VERBOSE` | 可读风格
+
+
+
+JavaScript 中的正则表达式
+---------------
+
+### test()
+
+```javascript
+let textA = 'I like APPles very much';
+let textB = 'I like APPles';
+let regex = /apples$/i
+
+// Output: false
+console.log(regex.test(textA));
+
+// Output: true
+console.log(regex.test(textB));
+```
+
+### search()
+
+```javascript
+let text = 'I like APPles very much';
+let regexA = /apples/;
+let regexB = /apples/i;
+
+// Output: -1
+console.log(text.search(regexA));
+
+// Output: 7
+console.log(text.search(regexB));
+```
+
+
+### exec()
+
+```javascript
+let text = 'Do you like apples?';
+let regex= /apples/;
+
+// Output: apples
+console.log(regex.exec(text)[0]);
+
+// Output: Do you like apples?
+console.log(regex.exec(text).input);
+```
+
+
+### match()
+
+```javascript
+let text = 'Here are apples and apPleS';
+let regex = /apples/gi;
+
+// Output: [ "apples", "apPleS" ]
+console.log(text.match(regex));
+```
+
+
+### split()
+
+
+```javascript
+let text = 'This 593 string will be brok294en at places where d1gits are.';
+let regex = /\d+/g
+
+// Output: [ "This ", " string will be brok", "en at places where d", "gits are." ]
+console.log(text.split(regex))
+```
+
+### matchAll()
+
+```javascript
+let regex = /t(e)(st(\d?))/g;
+let text = 'test1test2';
+let array = [...text.matchAll(regex)];
+// Output: ["test1", "e", "st1", "1"]
+console.log(array[0]);
+// Output: ["test2", "e", "st2", "2"]
+console.log(array[1]);
+```
+
+### replace()
+
+```javascript {.wrap}
+let text = 'Do you like aPPles?';
+let regex = /apples/i
+
+// Output: Do you like mangoes?
+let result = text.replace(regex, 'mangoes');
+console.log(result);
+```
+
+
+### replaceAll()
+
+```javascript
+let regex = /apples/gi;
+let text = 'Here are apples and apPleS';
+// Output: Here are mangoes and mangoes
+let result = text.replaceAll(regex, "mangoes");
+console.log(result);
+```
+
+
+
+PHP中的正则表达式
+------------
+
+### 函数
+
+
+
+:- | -
+:- | -
+`preg_match()` | 执行正则表达式匹配
+`preg_match_all()` | 执行全局正则表达式匹配
+`preg_replace_callback()` | 使用回调执行正则表达式搜索和替换
+`preg_replace()` | 执行正则表达式搜索和替换
+`preg_split()` | 按正则表达式模式拆分字符串
+`preg_grep()` | 返回与模式匹配的数组条目
+
+
+### preg_replace
+
+```php
+$str = "Visit Microsoft!";
+$regex = "/microsoft/i";
+// Output: Visit QuickRef!
+echo preg_replace($regex, "QuickRef", $str);
+```
+
+
+
+### preg_match
+
+```php
+$str = "Visit QuickRef";
+$regex = "#quickref#i";
+// Output: 1
+echo preg_match($regex, $str);
+```
+
+
+### preg_matchall
+
+
+```php
+$regex = "/[a-zA-Z]+ (\d+)/";
+$input_str = "June 24, August 13, and December 30";
+if (preg_match_all($regex, $input_str, $matches_out)) {
+ // Output: 2
+ echo count($matches_out);
+ // Output: 3
+ echo count($matches_out[0]);
+ // Output: Array("June 24", "August 13", "December 30")
+ print_r($matches_out[0]);
+ // Output: Array("24", "13", "30")
+ print_r($matches_out[1]);
+}
+```
+
+
+### preg_grep
+
+```php
+$arr = ["Jane", "jane", "Joan", "JANE"];
+$regex = "/Jane/";
+// Output: Jane
+echo preg_grep($regex, $arr);
+```
+
+
+### preg_split
+
+
+```php
+$str = "Jane\tKate\nLucy Marion";
+$regex = "@\s@";
+// Output: Array("Jane", "Kate", "Lucy", "Marion")
+print_r(preg_split($regex, $str));
+```
+
+
+Java 中的正则表达式
+-------------
+
+### 风格
+
+
+#### 第一种方式
+
+```java
+Pattern p = Pattern.compile(".s", Pattern.CASE_INSENSITIVE);
+Matcher m = p.matcher("aS");
+boolean s1 = m.matches();
+System.out.println(s1); // Outputs: true
+```
+
+#### 第二种方式
+
+```java
+boolean s2 = Pattern.compile("[0-9]+").matcher("123").matches();
+System.out.println(s2); // Outputs: true
+```
+
+#### 第三种方式
+
+```java
+boolean s3 = Pattern.matches(".s", "XXXX");
+System.out.println(s3); // Outputs: false
+```
+
+
+### 模式字段
+
+
+:- | -
+:- | -
+`CANON_EQ` | 规范等价
+`CASE_INSENSITIVE` | 不区分大小写的匹配
+`COMMENTS` | 允许空格和注释
+`DOTALL` | 圆点模式
+`MULTILINE` | 多行模式
+`UNICODE_CASE` | Unicode 感知大小写折叠
+`UNIX_LINES` | Unix 行模式
+
+
+### 方法
+
+#### Pattern
+
+- 模式编译 compile(字符串正则表达式 [,int flags])
+- 布尔匹配 matches([字符串正则表达式,] CharSequence 输入)
+- String[] 拆分 split(字符串正则表达式 [,int 限制])
+- 字符串引用 quote(字符串 s)
+
+#### 匹配器
+
+- int start([int group | 字符串名称])
+- int end([int group | 字符串名称])
+- 布尔 find([int start])
+- 字符 group([int 组 | 字符串名称])
+- 匹配器重置 reset()
+
+#### String
+
+- boolean matches(String regex)
+- String replaceAll(String regex, 字符串替换)
+- String[] split(String regex[, int limit])
+
+还有更多方法...
+
+
+### 例子
+
+
+替换句子:
+
+```java
+String regex = "[A-Z\n]{5}$";
+String str = "I like APP\nLE";
+Pattern p = Pattern.compile(regex, Pattern.MULTILINE);
+Matcher m = p.matcher(str);
+// Outputs: I like Apple!
+System.out.println(m.replaceAll("pple!"));
+```
+
+所有匹配的数组:
+
+```java
+String str = "She sells seashells by the Seashore";
+String regex = "\\w*se\\w*";
+Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
+Matcher m = p.matcher(str);
+List matches = new ArrayList<>();
+while (m.find()) {
+ matches.add(m.group());
+}
+// Outputs: [sells, seashells, Seashore]
+System.out.println(matches);
+```
+
+
+MySQL中的正则表达式
+-------------
+
+
+### 函数
+
+函数名称 | 说明
+:- | -
+`REGEXP ` | 字符串是否匹配正则表达式
+`REGEXP_INSTR() ` | 匹配正则表达式的子字符串的起始索引
_(注意:仅限 MySQL 8.0+)_
+`REGEXP_LIKE() ` | 字符串是否匹配正则表达式
_(注意:仅 MySQL 8.0+)_
+`REGEXP_REPLACE()` | 替换匹配正则表达式的子字符串
_(注意:仅限 MySQL 8.0+)_
+`REGEXP_SUBSTR() ` | 返回匹配正则表达式的子字符串
_(注意:仅 MySQL 8.0+)_
+
+
+
+### REGEXP
+```sql {.wrap}
+expr REGEXP pat
+```
+
+#### Examples
+
+```sql
+mysql> SELECT 'abc' REGEXP '^[a-d]';
+1
+mysql> SELECT name FROM cities WHERE name REGEXP '^A';
+mysql> SELECT name FROM cities WHERE name NOT REGEXP '^A';
+mysql> SELECT name FROM cities WHERE name REGEXP 'A|B|R';
+mysql> SELECT 'a' REGEXP 'A', 'a' REGEXP BINARY 'A';
+1 0
+```
+
+
+### REGEXP_REPLACE
+
+```
+REGEXP_REPLACE(expr, pat, repl[, pos[, occurrence[, match_type]]])
+```
+
+#### 例子
+
+```sql
+mysql> SELECT REGEXP_REPLACE('a b c', 'b', 'X');
+a X c
+mysql> SELECT REGEXP_REPLACE('abc ghi', '[a-z]+', 'X', 1, 2);
+abc X
+```
+
+
+### REGEXP_SUBSTR
+
+```
+REGEXP_SUBSTR(expr, pat[, pos[, occurrence[, match_type]]])
+```
+
+#### 例子
+
+```sql
+mysql> SELECT REGEXP_SUBSTR('abc def ghi', '[a-z]+');
+abc
+mysql> SELECT REGEXP_SUBSTR('abc def ghi', '[a-z]+', 1, 3);
+ghi
+```
+
+
+### REGEXP_LIKE
+
+```
+REGEXP_LIKE(expr, pat[, match_type])
+```
+
+#### 例子
+
+```sql
+mysql> SELECT regexp_like('aba', 'b+')
+1
+mysql> SELECT regexp_like('aba', 'b{2}')
+0
+mysql> # i: case-insensitive
+mysql> SELECT regexp_like('Abba', 'ABBA', 'i');
+1
+mysql> # m: multi-line
+mysql> SELECT regexp_like('a\nb\nc', '^b$', 'm');
+1
+```
+
+
+### REGEXP_INSTR
+
+``` {.wrap}
+REGEXP_INSTR(expr, pat[, pos[, occurrence[, return_option[, match_type]]]])
+```
+
+#### 例子
+
+```sql
+mysql> SELECT regexp_instr('aa aaa aaaa', 'a{3}');
+2
+mysql> SELECT regexp_instr('abba', 'b{2}', 2);
+2
+mysql> SELECT regexp_instr('abbabba', 'b{2}', 1, 2);
+5
+mysql> SELECT regexp_instr('abbabba', 'b{2}', 1, 3, 1);
+7
+```
diff --git a/docs/semver.md b/docs/semver.md
index 63a3b73..08d9091 100644
--- a/docs/semver.md
+++ b/docs/semver.md
@@ -15,7 +15,6 @@ Semver 备忘清单
### Semver
-
| - | - |
|-----------------|------------------------|
| `主版本号(MAJOR)` | 当你做了不兼容的 API 修改 |
@@ -52,6 +51,7 @@ Semver 备忘清单
| `1` | 相同的 | |
| `*` | 任何版本 | |
| `x` | 相同的 | |
+
### 连字符范围
@@ -59,20 +59,22 @@ Semver 备忘清单
| 范围 | 描述 |
| --- | --- |
| `1.2.3 - 2.3.4` | 是 `>=1.2.3 <=2.3.4` |
-
+
#### 部分向右
-| 范围 | 描述 |
-| --- | --- |
+| 范围 | 描述 |
+| --- | --- |
| `1.2.3 - 2.3` | 是 `>=1.2.3 <2.4.0` |
| `1.2.3 - 2` | 是 `>=1.2.3 <3.0.0` |
+
#### 部分向左
| 范围 | 描述 |
| --- | --- |
| `1.2 - 2.3.0` | 是 `1.2.0 - 2.3.0` |
+
当右侧为部分(例如,`2.3`)时,假定缺失的部分为`x`(例如,` 2.3.x`)。
@@ -84,7 +86,7 @@ Semver 备忘清单
| --- | --- |
| `>=0.14 <16` | 和 (空格分隔) |
| `0.14.x \|\| 15.x.x` | 或 (双竖线分隔) |
-
+
### 预发布
@@ -100,6 +102,7 @@ Semver 备忘清单
| `~` | 意思是“相当接近” |
| `0.x.x` | 用于“初始开发” |
| `1.x.x` | 表示定义了公共 API |
+
另见
diff --git a/docs/sketch.md b/docs/sketch.md
index ca0b4dc..02438b7 100644
--- a/docs/sketch.md
+++ b/docs/sketch.md
@@ -20,6 +20,7 @@ Sketch 备忘清单
| `v` | (Vector Point) 向量点 |
| `p` | (Pencil) 铅笔 |
| `t` | (Text) 文本 |
+
### 类型
@@ -40,6 +41,7 @@ Sketch 备忘清单
| `Cmd + Shift + \` | 居中对齐 |
| `Cmd + Shift + }` | 右对齐 |
| `Control + Cmd + Space` | 特殊字符 |
+
### 画布视图
@@ -50,7 +52,7 @@ Sketch 备忘清单
| `Cmd (+) +` | 放大 |
| `Cmd (+) -` | 缩小 |
| `Cmd + 0` | 实际尺寸 |
-| `Cmd + 1` | 中心帆布 |
+| `Cmd + 1` | 中心画布 |
| `Cmd + 2` | 缩放选择 |
| `Cmd + 3` | 中心选择 |
| `§` | 临时缩放到实际大小 |
@@ -62,6 +64,7 @@ Sketch 备忘清单
| `Control + H` | 切换选择手柄 |
| `Control + X` | 切换像素网格 |
| `Space + Drag` | 移动画布 |
+
### 窗口
@@ -74,6 +77,7 @@ Sketch 备忘清单
| `Alt + Cmd + T` | 切换工具栏 |
| `Cmd + .` | 演示模式 |
| `Control + Cmd + F` | 进入全屏 |
+
### 编辑形状
@@ -88,6 +92,7 @@ Sketch 备忘清单
| `Cmd + Arrows` | 更改对象大小 |
| `Shift + Cmd + Arrows` | 将单位更改 10 |
| `1, 2, 3, 4` | 更改矢量点样式 |
+
### 编辑图层
@@ -103,6 +108,7 @@ Sketch 备忘清单
| `Shift + Cmd + R` | 旋转 |
| `F` | 切换填充 |
| `B` | 切换边框 |
+
### 排列图层、组和画板
@@ -123,6 +129,7 @@ Sketch 备忘清单
| `Cmd + F` | 按名称查找图层 |
| `Fn + ↑` | 选择上方页面 |
| `Fn + ↓` | 选择下面的页面 |
+
另见
diff --git a/docs/typescript.md b/docs/typescript.md
index 5ca1503..a9dcac8 100644
--- a/docs/typescript.md
+++ b/docs/typescript.md
@@ -457,12 +457,12 @@ switch(response.status) {
```
### 断言函数
+
描述影响当前范围的 CFA 更改的函数,因为它抛出而不是返回 false。
```ts
-function assertResponse(obj: any):
- asserts obj is SuccessResponse {
+function assertResponse(obj: any): asserts obj is SuccessResponse {
if (!(obj instanceof SuccessResponse)) {
throw new Error('Not a success!')
}
diff --git a/docs/vim.md b/docs/vim.md
new file mode 100644
index 0000000..daf9e56
--- /dev/null
+++ b/docs/vim.md
@@ -0,0 +1,773 @@
+Vim 备忘清单
+===
+
+[Vim](http://www.vim.org/) 8.2 快速参考备忘单的有用集合,可帮助您更快地学习 vim 编辑器。
+
+入门
+---------------
+
+### 运动图
+
+
+```bash
+▼/▶ 光标 ▽/▷ 目标
+```
+
+#### 左右动作
+
+```bash
+╭┈┈┈┈┈┈┈┈┈┈┈┈┈ |
+├┈┈┈┈┈┈┈┈┈┈┈┈┈ 0 $ ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈╮
+┆ ╭┈┈┈┈┈┈┈┈┈┈ ^ fe ┈┈┈┈┈┈┈┈╮ ┆
+┆ ┆ ╭┈┈┈┈┈┈┈ Fo te ┈┈┈┈┈┈┈╮┆ ┆
+┆ ┆ ┆╭┈┈┈┈┈┈ To 30| ┈┈┈╮ ┆┆ ┆
+┆ ┆ ┆┆ ╭┈┈┈┈ ge w ┈┈┈╮ ┆ ┆┆ ┆
+┆ ┆ ┆┆ ┆ ╭┈┈ b e ┈╮ ┆ ┆ ┆┆ ┆
+┆ ┆ ┆┆ ┆ ┆ ╭h l╮ ┆ ┆ ┆ ┆┆ ┆
+▽ ▽ ▽▽ ▽ ▽ ▽▼ ▼▽ ▽ ▽ ▽ ▽▽ ▽
+ echo "A cheatsheet from quickReference"
+```
+
+#### 上下动作
+
+```bash
+ - SCREEN 1 START
+ ╭┈┬┈┈┈┈┈┈┈┈┈▷ #!/usr/bin/python
+ ┆ ┆ ╭┈┈┈▷
+ ┆ ┆ ┆ print("Hello")
+ ┆ ┆ { } ▶ print("Vim")
+ ┆ ┆ ┆ print("!")
+ ┆ ┆ └┈▷
+ ┆ ┆ ╭┈┈┈┬┈┈┈▷ print("Welcome")
+G gg H M L k j ▶ print("to")
+┆ ┆ └┈▷ print("Quick Reference")
+┆ ┆ print("/vim")
+┆ ┆
+┆ ╰┈┈┈┈┈▷
+┆ - SCREEN 1 END
+╰┈┈┈┈┈┈┈┈┈┈┈┈┈┈▷ print("SCREEN 2")
+```
+
+### 动作
+
+
+快捷方式 | 说明
+:- | -
+`h` \| `j` \| `k` \| `l` | 方向键
+`` _/_ `` | 上/下半页
+`` _/_ `` | 向上/向下翻页
+
+
+#### 字(词)
+
+快捷方式 | 说明
+:- | -
+`b` _/_ `w` | 上一个/下一个单词
+`ge` _/_ `e` | 上一个/下一个词尾
+
+
+#### 行
+
+快捷方式 | 说明
+:- | -
+`0` _(zero)_ _/_ `$` | 行的开始/结束
+`^` | 行开头 _(非空白)_
+
+
+#### 字符串
+
+快捷方式 | 说明
+:- | -
+`Fe` _/_ `fe` | 移动到上一个/下一个`e`
+`To` _/_ `to` | 在上一个/下一个`o`之前/之后移动
+`\|` _/_ `n\|` | 转到第一个/`n`列
+
+
+#### 文档
+
+快捷方式 | 说明
+:- | -
+`gg` _/_ `G` | 第一行/最后一行
+`:n` \| `nG` | 转到第 `n` 行
+`}` _/_ `{` | 下一个/上一个空行
+
+
+#### 窗口
+
+快捷方式 | 说明
+:- | -
+`H` _/_ `M` _/_ `L` | 上/中/下屏幕
+`zt` _/_ `zz` _/_ `zb` | 上/中/下这条线
+
+
+### 插入模式
+
+快捷方式 | 说明
+:- | -
+`i` _/_ `a` | 在光标之前/之后插入
+`I` _/_ `A` | 插入行的开始/结束
+`o` _/_ `O` _(letter)_ | 在下方/上方插入新行
+`s` _/_ `S` | 删除字符/行并插入
+`C` _/_ `cc` | 更改到/当前行的结尾
+`gi` | 在最后一个插入点插入
+`Esc` \| `` | 退出插入模式
+
+
+### 保存和退出
+
+快捷方式 | 说明
+:- | -
+`:w` | 保存
+`:q` | 关闭文件
+`:wq` \| `:x` \| `ZZ` | 保存并退出
+`:wqa` | 保存并退出所有文件
+`:q!` \| `ZQ` | 强制退出
+`:qa` | 关闭所有文件
+`:qa!` | 强制退出所有文件
+`:w` new.txt | 写入`new.txt`
+`:sav` new.txt | 保存并编辑`new.txt`
+`:w` !sudo tee % | 写入只读文件
+
+
+### 正常模式
+
+快捷方式 | 说明
+:- | -
+`r` | 替换一个字符
+`R` | 进入替换模式
+`u` _/_ `3u` | 撤消更改`1`/`3`次
+`U` | 在一行上撤消更改
+`J` | 加入下一行
+`` _/_ 5 `` | 重做更改`1`/`5`次
+
+
+### 剪切和粘贴
+
+
+快捷方式 | 说明
+:- | -
+`x` | 删除字符 _(剪切)_
+`p` _/_ `P` | 在之后/之前粘贴
+`xp` | 交换两个字符
+`D` | 删除到行尾 _(剪切)_
+`dw` | 删除单词 _(剪切)_
+`dd` | 删除线 _(剪切)_
+`ddp` | 交换两条线
+`yy` | 拉线 _(复制)_
+`"*p` \| `"+p` | 从系统剪贴板粘贴
+`"*y` \| `"+y` | 粘贴到系统剪贴板
+
+
+#### 在可视化模式下
+
+快捷方式 | 说明
+:- | -
+| `d` _\|_ `x` | 删除选择 _(剪切)_
+| `s` | 替换选择
+| `y` | Yank 选择 _(复制)_
+
+
+### 重复
+
+快捷方式 | 说明
+:- | -
+`.` | 重复上一个命令
+`;` | 重复最新的 `f`、`t`、`F` 或 `T`
+`,` | 重复最新的`f`、`t`、`F`或`T`颠倒
+`&` | 重复最后一个`:s`
+`@:` | 重复命令行命令
+
+
+### 可视化模式
+
+快捷方式 | 说明
+:- | -
+`v` | 进入可视化模式
+`V` | 进入视线模式
+`` | 进入可视化阻挡模式
+`ggVG` | 选择所有文本
+`>` _/_ `<` | 向右/向左移动文本
+
+
+### 宏
+
+:- | -
+:- | -
+`qi` | 录制宏 `i`
+`q` | 停止录制宏
+`@i` | 运行宏`i`
+`7@i` | 运行宏 `i` 7 次
+`@@` | 重复上一个宏
+
+
+您可以为任何字母保存宏,而不仅仅是 `i`
+
+Vim 运算符
+---------
+
+### 用法
+
+
+快捷方式 | 说明
+:- | -
+`d` | w
+运算符 | 动作
+
+
+将 [可用运算符](#可用运算符) 与 [动作](#动作) 结合使用以使用它们
+
+### 可用运算符
+
+
+快捷方式 | 说明
+:- | -
+`d` | 删除
+`y` | Yank _(复制)_
+`c` | 更改 _(删除然后插入)_
+`p` | 粘贴
+`=` | 格式代码
+`g~` | 切换案例
+`gU` | 大写
+`gu` | 小写
+`>` | 右缩进
+`<` | 左缩进
+`!` | 通过外部程序过滤
+
+
+### 例子
+
+
+组合 | 说明
+:- | -
+`d`d | 删除当前行
+`d`j | 删除两行
+`d`w | 删除到下一个单词
+`d`b | 删除到单词的开头
+`d`fa | 删除直到 `a` 字符
+`d`/hello | 删除直到 `hello`
+`c`c | 更改当前行,与 `S` 同义
+`y`y | 复制当前行
+`>`j | 缩进 2 行
+gg`d`G | 删除完整的文档
+gg`=`G | 缩进一个完整的文档
+gg`y`G | 复制整个文档
+
+
+### 计数
+
+```shell
+[数字] <运算符> <动作>
+<运算符> [数字] <动作>
+```
+
+---
+
+组合 | 说明
+:- | -
+2`d`d | 删除 `2` 行
+6`y`y | 复制 `6` 行
+`d`3w | 删除 `3` 字
+`d`5j | 向下删除 `5` 行
+`>`4k | 向上缩进 `4` 行
+
+Vim 文本对象
+------------
+
+### 用法
+
+
+
+快捷方式 | 说明
+:- | -
+`v` | i _/_ a | p
+Operator | inner(内部) _/_ around(周围) | 文本对象
+
+
+文本块内部或周围使用 [operator](#可用运算符) 进行操作
+
+### 文本对象
+
+
+快捷方式 | 说明
+:- | -
+p | 段落
+w | 单词
+W | WORD
_(被空格包围)_
+s | 句子
+[ ( { \< | []、() 或 {} 块
+] ) } \> | []、() 或 {} 块
+' " \` | 带引号的字符串
+b | 一个块 [(
+B | [{中的一个块
+t | 一个 HTML 标签块
+
+查看 `:help text-objects`
+
+### 删除
+
+快捷方式 | 说明
+:- | -
+`d`iw | 删除内词
+`d`is | 删除内句
+`d`i" | 引号中删除
+`d`a" | 删除引号 _(包括引号)_
+`d`ip | 删除段落
+
+### 选择
+
+快捷方式 | 说明
+:- | -
+`v`i" | 选择内引号“`...`{.underline}”
+`v`a" | 选择引号`"..."`{.underline}
+`v`i[ | 选择内括号 [`...`{.underline}]
+`v`a[ | 选择括号`[...]`{.underline}
+`v`iw | 选择内词
+`v`ip | 选择内部段落
+`v`ipip | 选择更多段落
+
+### 杂项
+
+快捷方式 | 说明
+:- | -
+`c`iw | 换内字
+`c`i" | 更改内部引号
+`c`it | 更改内部标签 (HTML)
+`c`ip | 更改内部段落
+`y`ip | Yank 段落
+`y`ap | Yank 段落 _(包括换行符)_
+
+Vim 多个文件
+-------------
+
+### Buffers (缓冲器)
+
+:- | -
+:- | -
+`:e file` | 在新缓冲区中编辑文件
+`:bn` | 转到下一个缓冲区
+`:bp` | 转到上一个缓冲区
+`:bd` | 从缓冲区列表中删除文件
+`:b 5` | 打开缓冲区 #5
+`:b file` | 按文件转到缓冲区
+`:ls` | 列出所有打开的缓冲区
+`:sp file` | 打开和拆分窗口
+`:vs file` | 打开和垂直拆分窗口
+`:hid` | 隐藏此缓冲区
+`:wn` | 写入文件并移至下一个
+`:tab ba` | 将所有缓冲区编辑为选项卡
+
+### 窗口
+
+:- | -
+:- | -
+`` `s` | 拆分窗口
+`` `v` | 垂直拆分窗口
+`` `w` | 切换窗口
+`` `q` | 退出一个窗口
+`` `T` | 拆分成一个新标签
+`` `x` | 用下一个交换当前
+`` `-` _/_ `+` | 减少/增加高度
+`` `<` _/_ `>` | 减少/增加宽度
+`` `\|` | 最大宽度
+`` `=` | 同样高和宽
+`` `h` _/_ `l` | 转到左/右窗口
+`` `j` _/_ `k` | 转到上/下窗口
+
+
+### 选项卡
+
+快捷方式 | 说明
+:- | -
+`:tabe [file]` | E在新选项卡中编辑文件
+`:tabf [file]` | 如果在新选项卡中存在则打开
+`:tabc` | C失去当前选项卡
+`:tabo` | 关闭o其他选项卡
+`:tabs` | 列出所有标签
+`:tabr` | 转到第一个r标签
+`:tabl` | 转到 last 选项卡
+`:tabm 0` | 我转到位置 `0`
+`:tabn` | 转到 next 选项卡
+`:tabp` | 转到p上一个标签
+
+#### 正常模式
+
+快捷方式 | 说明
+:- | -
+`gt` | 转到 next 选项卡
+`gT` | 转到p上一个标签
+`2gt` | 转到标签编号 `2`
+
+Vim 搜索和替换
+------------------
+
+### 搜索
+
+:- | -
+:- | -
+`/foo` | 向前搜索
+`/foo\c` | 向前搜索 _(不区分大小写)_
+`?foo` | 向后搜索
+`/\v\d+` | 使用 [regex](./regex.md) 搜索
+`n` | 下一个匹配的搜索模式
+`N` | 上一场比赛
+`*` | 向前搜索当前单词
+`#` | 向后搜索当前单词
+
+### 更换行
+
+```vim
+:[range]s/{pattern}/{str}/[flags]
+```
+
+---
+
+:- | -
+:- | -
+`:s/old/new` | 先更换
+`:s/old/new/g` | 全部替换
+`:s/\vold/new/g` | 全部替换为 [regex](./regex.md)
+`:s/old/new/gc` | 全部替换_(确认)_
+`:s/old/new/i` | 先忽略大小写替换
+`:2,6s/old/new/g` | 在 `2`-`6` 行之间替换
+
+### 替换文件
+
+```vim
+:%s/{pattern}/{str}/[flags]
+```
+---
+
+:- | -
+:- | -
+`:%s/old/new` | 先更换
+`:%s/old/new/g` | 全部替换
+`:%s/old/new/gc` | 全部替换 _(确认)_
+`:%s/old/new/gi` | 全部替换 _(忽略大小写)_
+`:%s/\vold/new/g` | 全部替换为 [regex](./regex.md)
+
+### 范围
+
+
+:- | -
+:- | -
+`%` | 整个文件
+`’<,’>` | 当前选择
+`5` | 第 `5` 行
+`5,10` | 第 `5` 行到第 `10` 行
+`$` | 最后一行
+`2,$` | 第 `2` 行到最后
+`.` | 当前行
+`,3` | 接下来的 `3` 行
+`-3,` | 转发 `3` 行
+
+### 全局命令
+
+
+```vim
+:[range]g/{pattern}/[command]
+```
+
+---
+
+:- | -
+:- | -
+`:g/foo/d` | 删除包含 `foo` 的行
+`:g!/foo/d` | 删除不包含 `foo` 的行
+`:g/^\s*$/d` | 删除所有空行
+`:g/foo/t$` | 将包含 `foo` 的行复制到 EOF
+`:g/foo/m$` | 将包含 `foo` 的行移动到 EOF
+`:g/^/m0` | 反转文件
+`:g/^/t.` | 复制每一行
+
+### Inverse(逆) :g
+
+```vim
+:[range]v/{pattern}/[command]
+```
+
+---
+
+:- | -
+:- | -
+`:v/foo/d` | 删除不包含`foo`的行
_(还有`:g!/foo/d`)_
+
+### Flags(标志)
+
+:- | -
+:- | -
+`g` | 替换所有出现
+`i` | 忽略大小写
+`I` | 不要忽略大小写
+`c` | 确认每个替换
+
+### 替换表达式(魔术)
+
+:- | -
+:- | -
+`&` _\|_ `\0` | 替换为整个匹配的
+`\1`...`\9` | 替换为 0-9 组
+`\u` | 大写下一个字母
+`\U` | 后面的大写字符
+`\l` | 小写下一个字母
+`\L` | 后面的字符小写
+`\e` | `\u`、`\U`、`\l` 和 `\L` 的结尾
+`\E` | `\u`、`\U`、`\l` 和 `\L` 的结尾
+
+### 例子
+
+
+
+```shell
+:s/a\|b/xxx\0xxx/g # 将 "a b" 修改为 "xxxaxxx xxxbxxx"
+:s/test/\U& file/ # 将 "test" 修改为 "TEST FILE"
+:s/\(test\)/\U\1\e file/ # 将 "test" 修改为 "TEST file"
+:s/\v([abc])([efg])/\2\1/g # 将 "af fa bg" 修改为 "fa fa gb"
+:s/\v\w+/\u\0/g # 将 "bla bla" 修改为 "Bla Bla"
+:s/\v([ab])|([cd])/\1x/g # 将 "a b c d" 修改为 "ax bx x x"
+:%s/.*/\L&/ # 将 "HTML" 修改为 "html"
+:s/\v<(.)(\w*)/\u\1\L\2/g # 将单词的每个首字母大写
+:%s/^\(.*\)\n\1/\1/ # 删除重复行
+:%s/<\/\=\(\w\+\)\>/\U&/g # 将 HTML 标记转换为大写
+:g/^pattern/s/$/mytext # 查找文本并将其附加到末尾
+:g/pattern/norm! @i # 在匹配行上运行宏
+/^\(.*\)\(\r\?\n\1\)\+$ # 查看重复行
+/\v^(.*)(\r?\n\1)+$ # 查看重复行(非常神奇)
+:v/./,/./-j # 将空行压缩成空行
+:g//,//d # 从 到 包含删除
+```
+
+Vimdiff
+-------
+
+### 用法
+
+
+```shell script
+$ vimdiff file1 file2 [file3]
+$ vim -d file1 file2 [file3]
+```
+
+### 编辑
+
+
+```
+:[range]diffget [bufspec]
+:[range]diffput [bufspec]
+```
+
+---
+
+快捷方式 | 说明
+:- | -
+`do` _/_ `:diffget` | 获取(get)差异
+`dp` _/_ `:diffput` | 放差价
+`:dif` | 重新扫描差异
+`:diffo` | 关闭差异模式
+`:1,$+1diffget` | 获取所有差异
+`ZQ` | 不做改动就退出
+
+
+请参阅:[范围](#范围)
+
+### 折叠
+
+
+快捷方式 | 说明
+:- | -
+`zo` _/_ `zO` | 打开
+`zc` _/_ `zC` | 关
+`za` _/_ `zA` | 切换
+`zv` | 这条线的打开折叠
+`zM` | 关闭所有
+`zR` | 打开所有
+`zm` | 折叠更多 _(折叠级别 += 1)_
+`zr` | 少折叠 _(折叠级别 -= 1)_
+`zx` | 更新折叠
+
+
+### 跳跃
+
+快捷方式 | 说明
+:- | -
+`]c` | 下一个区别
+`[c` | 以前的区别
+
+
+各种各样的
+-------------
+
+### Case
+
+
+快捷方式 | 说明
+:- | -
+`vU` | _大写_ 字母
+`vu` | _小写_ 字符
+`~` | _切换案例_ 字符
+`viw` `U` | _大写_ 字
+`viw` `u` | _小写_ 字
+`viw` `~` | _切换案例_ 字
+`VU` _/_ `gUU` | _大写_ 行
+`Vu` _/_ `guu` | _小写_ 行
+`V~` _/_ `g~~` | _切换案例_ 线
+`gggUG` | _大写_ 所有文本
+`ggguG` | _小写_ 所有文本
+`ggg~G` | _切换大小写_ 所有文本
+
+
+### 跳跃
+
+快捷方式 | 说明
+:- | -
+| `` | 返回上一个
+| `` | 向前
+| `gf` | 转到光标中的文件
+| `ga` | 显示十六进制、ASCII值
+
+
+### 其他命令行
+
+
+:- | -
+:- | -
+`:h` | 帮助打开帮助视图
+`:edit!` | 重新加载当前文件
+`:2,8m0` | 将行 `2`-`8` 移动到 `0`
+`:noh` | 清除搜索亮点
+`:sort` | 排序行
+`:ter` | 打开终端窗口
+`:set paste` | 启用插入粘贴子模式
+`:set nopaste` | 禁用插入粘贴子模式
+`:cq` | 退出并出现错误
_(正在中止 Git)_
+
+### 导航
+
+快捷方式 | 说明
+:- | -
+`%` | 最近/匹配的`{[()]}`
+`[(` _\|_ `[{` | 上一个 `(` 或 `{`
+`])` _\|_ `]{` | 下一个`)`或`}`
+`[m` | 上一个方法开始
+`[M` | 上一个方法结束
+
+
+### 计数器
+
+快捷方式 | 说明
+:- | -
+`` | 增加数量
+`` | 减少数量
+
+
+### 选项卡
+
+
+快捷方式 | 说明
+:- | -
+`:tag Classname` | 跳转到 Classname 的第一个定义
+`` | 跳转到定义
+`g]` | 查看所有定义
+`` | 回到最后一个标签
+` ` | 后退前进
+`:tselect Classname` | 查找类名的定义
+`:tjump Classname` | 查找类名的定义 _(自动选择第一个)_
+
+
+### 格式化
+
+:- | -
+:- | -
+| `:ce 8` | `8` 列之间的中心线 |
+| `:ri 4` | 在 `4` 列右对齐行 |
+| `:le` | 左对齐线 |
+
+查看 `:help formatting`
+
+### 标记
+
+
+快捷方式 | 说明
+:- | -
+\`^
| 插入模式下光标的最后位置
+\`.
| 当前缓冲区的最后更改
+\`"
| 最后退出的当前缓冲区
+\`0
| 在上次编辑的文件中
+''
| 返回当前缓冲区中跳出的行
+\`\`
| 返回当前缓冲区中跳转的位置
+\`[
| 到先前更改或拉出的文本的开头
+\`]
| 到之前更改或拉出的文本的结尾
+\`<
| 到最后一个可视化选择的开始
+\`>
| 到最后一个可视化选择的结尾
+`ma` | 将此光标位置标记为`a`
+\`a
| 跳转到光标位置`a`
+`'a` | 跳转到位置为 `a` 的行首
+d'a
| 从当前行删除到标记 `a` 的行
+d\`a
| 从当前位置删除到标记 `a` 的位置
+c'a
| 将文本从当前行更改为 `a` 行
+y\`a
| 将文本从当前位置拉到 `a` 的位置
+`:marks` | 列出所有当前标记
+`:delm a` | 删除标记`a`
+`:delm a-d` | 删除标记`a`、`b`、`c`、`d`
+`:delm abc` | 删除标记`a`、`b`、`c`
+
+
+### 计算器
+
+快捷方式 | 说明
+:- | -
+| `` `=` 7*7 | 显示结果|
+| `` `=` 10/2 | 显示结果|
+
+
+在 INSERT 模式下执行此操作
+
+### Shell
+
+:- | -
+:- | -
+`:!` | 解释 Shell 命令
+`:r!` | 读入shell的输出
+`:r!date` | 插入日期
+`:!!date` | 用日期替换当前行
+
+### 命令行
+
+快捷方式 | 说明
+:- | -
+`` | 将当前单词插入命令行
+`"` | 从 `注册` 粘贴
+`` | 在插入模式下自动完成路径
+
+
+### 技巧
+
+删除重复行
+
+```shell
+:sort | %!uniq -u
+```
+
+对文件中的行进行编号
+
+```shell
+:%!cat -n
+```
+
+将整个文档复制到剪贴板
+
+```shell
+:%w !pbcopy # Mac OS X
+:%w !xclip -i -sel c # GNU/Linux
+:%w !xsel -i -b # GNU/Linux
+```
+
+
+另见
+---
+
+- [搞得像IDE一样的 Vim](https://jaywcjlove.github.io/vim-web) _(github.io)_
+- [Vim 官方网站](http://www.vim.org/) _(vim.org)_
+- [Devhints](https://devhints.io/vim) _(devhints.io)_
+- [Vim cheatsheet](https://vim.rtorr.com/) _(vim.rotrr.com)_
+- [Vim documentation](http://vimdoc.sourceforge.net/htmldoc/) _(vimdoc.sourceforge.net)_
+- [Interactive Vim tutorial](http://openvim.com/) _(openvim.com)_
\ No newline at end of file
diff --git a/docs/vscode.md b/docs/vscode.md
index 2a899b0..22998cb 100644
--- a/docs/vscode.md
+++ b/docs/vscode.md
@@ -15,6 +15,7 @@ VSCode 备忘清单
| `Ctrl` `Shift` `W` | 关闭窗口 |
| `Ctrl` `,` | 用户设置 |
| `Ctrl` `K` `Ctrl` `S` | 键盘快捷键 |
+
### 基本编辑
@@ -46,6 +47,7 @@ VSCode 备忘清单
| `Ctrl` `/` | 切换行注释 |
| `Shift` `Alt` `A` | 切换块评论 |
| `Alt` `Z` | 切换自动换行 |
+
### 导航
@@ -61,6 +63,7 @@ VSCode 备忘清单
| `Ctrl` `Shift` `Tab` | 浏览编辑组历史 |
| `Alt` ` ←` _/_ `→` | 后退/前进 |
| `Ctrl` `M` | 切换 Tab 移动焦点 |
+
### 搜索和替换
@@ -74,6 +77,7 @@ VSCode 备忘清单
| `Ctrl` `D` | 将选择添加到下一个查找匹配项 |
| `Ctrl` `K` `Ctrl` `D` | 将最后一个选择移动到下一个查找匹配项 |
| `Alt` `C` _/_ `R` _/_ `W` | 切换区分大小写/正则表达式/整个单词 |
+
### 多光标和选择
@@ -91,6 +95,7 @@ VSCode 备忘清单
| `Shift` `Alt` `` | 列(框)选择 |
| `Ctrl` `Shift` `Alt` `` | 列(框)选择 |
| `Ctrl` `Shift` `Alt` `PgUp` _/_ `PgDn` | 列(框)选择页上/下 |
+
### 丰富的语言编辑
@@ -108,6 +113,7 @@ VSCode 备忘清单
| `F2` | 重命名符号 |
| `Ctrl` `K` `Ctrl` `X` | 修剪尾随空格 |
| `Ctrl` `K` `M` | 更改文件语言 |
+
### 编辑管理
@@ -121,7 +127,7 @@ VSCode 备忘清单
| `Ctrl` `K` `Ctrl` `←` _/_ `→` | 专注于上一个/下一个编辑组 |
| `Ctrl` `Shift` `PgUp` _/_ `PgDn` | 向左/向右移动编辑器 |
| `Ctrl` `K` `←` _/_ `→` | 移动活动编辑器组 |
-
+
### 文件管理
@@ -141,6 +147,7 @@ VSCode 备忘清单
| `Ctrl` `K` `P` | 复制活动文件的路径 |
| `Ctrl` `K` `R` | 在资源管理器中显示活动文件 |
| `Ctrl` `K` `O` | 在新窗口/实例中显示活动文件 |
+
### 展示
@@ -161,6 +168,7 @@ VSCode 备忘清单
| `Ctrl` `Shift` `V` | 打开 Markdown 预览 |
| `Ctrl` `K` `V` | 打开 Markdown 预览到一边 |
| `Ctrl` `K` `Z` | Zen 模式(Esc Esc 退出) |
+
### 调试
@@ -180,3 +188,4 @@ VSCode 备忘清单
| `Ctrl` `↑` _/_ `↓` | 向上/向下滚动 |
| `Shift` `PgUp` _/_ `PgDn` | 向上/向下滚动页面 |
| `Ctrl` `Home` _/_ `End` | 滚动到顶部/底部 |
+
diff --git a/package.json b/package.json
index 887593d..82a13fe 100644
--- a/package.json
+++ b/package.json
@@ -25,7 +25,6 @@
"recursive-readdir-files": "^2.3.0",
"rehype-autolink-headings": "^6.1.1",
"rehype-document": "^6.1.0",
- "rehype-format": "^4.0.1",
"rehype-slug": "^5.0.1",
"remark-gemoji": "^7.0.1"
}
diff --git a/scripts/assets/regex.svg b/scripts/assets/regex.svg
new file mode 100644
index 0000000..2d13531
--- /dev/null
+++ b/scripts/assets/regex.svg
@@ -0,0 +1,3 @@
+
diff --git a/scripts/assets/vim.svg b/scripts/assets/vim.svg
new file mode 100644
index 0000000..cfd9009
--- /dev/null
+++ b/scripts/assets/vim.svg
@@ -0,0 +1,3 @@
+
diff --git a/scripts/create.mjs b/scripts/create.mjs
index d7cab9e..a8b3d0c 100644
--- a/scripts/create.mjs
+++ b/scripts/create.mjs
@@ -1,6 +1,5 @@
import markdown from '@wcj/markdown-to-html';
import rehypeDocument from 'rehype-document';
-import rehypeFormat from 'rehype-format';
import remarkGemoji from 'remark-gemoji';
import rehypeAutolinkHeadings from 'rehype-autolink-headings';
import rehypeSlug from 'rehype-slug';
@@ -26,7 +25,6 @@ export function create(str = '', options = {}) {
rehypePlugins: [
rehypeSlug,
rehypeAutolinkHeadings,
- rehypeFormat,
[rehypeDocument, {
title: `${title ? `${title} & ` : ''} ${subTitle} Quick Reference`,
css: [ ...options.css ],
diff --git a/scripts/style.css b/scripts/style.css
index f1f1d1f..d5c60ca 100644
--- a/scripts/style.css
+++ b/scripts/style.css
@@ -27,7 +27,7 @@ body {
--color-prettylights-syntax-entity-tag: #116329;
--color-prettylights-syntax-keyword: #cf222e;
--color-prettylights-syntax-string: #0a3069;
- --color-prettylights-syntax-variable: #953800;
+ --color-prettylights-syntax-variable: #d15104;
--color-prettylights-syntax-brackethighlighter-unmatched: #82071e;
--color-prettylights-syntax-invalid-illegal-text: #f6f8fa;
--color-prettylights-syntax-invalid-illegal-bg: #82071e;
@@ -136,19 +136,33 @@ ol, ul, menu {
padding: 0;
}
-.wrap-body > p > code {
+yel {
+ color: var(--color-prettylights-syntax-variable);
+}
+pur {
+ color: var(--color-prettylights-syntax-entity);
+}
+
+.wrap-body > p > code, .wrap-body > ul li > code, .wrap-body tbody td code {
--text-opacity: 1;
color: rgb(5 150 105/var(--text-opacity));
}
+.wrap-body em, .wrap-body sup, .wrap-body sub {
+ color: var(--color-prettylights-syntax-sublimelinter-gutter-mark);
+}
+
table {
width: 100%;
text-indent: 0;
border-color: inherit;
border-collapse: collapse
}
+table td:first-child {
+ white-space: nowrap;
+}
-table td:not(:last-child)>code, table td:not(:last-child)>del>code, ul li > code, kbd {
+table.shortcuts td:not(:last-child)>code, table.shortcuts td:not(:last-child)>del>code, ul.shortcuts li > code, kbd {
background-color: var(--color-neutral-muted);
color: var(--color-fg-subtle);
box-shadow: 0 0 #0000, 0 0 #0000, 0 0 #0000;
@@ -570,7 +584,6 @@ body:not(.home) .h2wrap > h2 a::after {
.h2wrap-body {
font-size: 0.925rem;
- line-height: 1.325rem;
grid-template-columns: repeat(3,minmax(0,1fr));
flex-direction: column;
}
@@ -690,7 +703,7 @@ body:not(.home) .h2wrap > h2 a::after {
color: var(--color-prettylights-syntax-constant);
}
.token.punctuation {
- color: var(--color-prettylights-syntax-markup-bold);
+ color: var(--color-prettylights-syntax-markup-ignored-bg);
}
.code-line .token.deleted {
background-color: var(--color-prettylights-syntax-markup-deleted-bg);