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 等。 +`. ` | 匹配 a9+ 等。 +`h.o ` | 匹配 hooh2oh/o 等。 +`ring\? ` | 匹配 ring? +`\(quiet\) ` | 匹配(安静) +`c:\\windows ` | 匹配 c:\windows + +使用 `\` 搜索这些特殊字符:
`[ \ ^ $ . | ? * + ( ) { }` + + +### 备择方案 + +范例 | 说明 +:-|- +`cat\|dog ` | 匹配 catdog +`id\|identity ` | 匹配 ididentity +`identity\|id ` | 匹配 ididentity + +当替代品重叠时,命令从长到短 + +### 字符类 + +范例 | 说明 +:-|- +`[aeiou]` | 匹配任何元音 +`[^aeiou]` | 匹配一个非元音 +`r[iau]ng` | 匹配ring、wrangle、sprung等。 +`gr[ae]y` | 匹配 graygrey +`[a-zA-Z0-9]` | 匹配任何字母或数字 + +在 `[ ]` 中总是转义 `. \ ]` 有时是 `^ - .` + + +### 速记类 + +范例 | 说明 +:-|- +`\w ` | “单词”字符
_(字母、数字或下划线)_ +`\d ` | 数字 +`\s ` | 空格
_(空格、制表符、vtab、换行符)_ +`\W, \D, or \S ` | 不是单词、数字或空格 +`[\D\S] ` | 表示不是数字或空格,两者都匹配 +`[^\d\s] ` | 禁止数字和空格 + +### 出现次数 + +范例 | 说明 +:-|- +`colou?r` | 匹配 colorcolor +`[BW]ill[ieamy's]*` | 匹配 BillWillyWilliam'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 ` | 匹配 springswringer +`^\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 ` | 匹配 inputoutput +`\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);