├── sanguo.txt
├── oeasy.py
├── oeasy.html
├── oeasy.css
├── oeasy.java
├── dos.java
├── markdown
├── README.md
├── 31-53102-文字区块.sy.md
├── 96-548430-自动配对_auto_pairs.sy.md
├── 13-52280-大词小词.sy.md
├── 03-50043-打开文件.sy.md
├── 14-52281-行头行尾.sy.md
├── 94-548426-路径管理_nerdtree.sy.md
├── 88-183444-内容查找grep命令.sy.md
├── 67-157478-vimdiff.sy.md
├── 87-182677-外部命令_external_Command.sy.md
├── 83-182654-函数_function.sy.md
├── 11-52121-向前向后.sy.md
├── 92-548424-源码编译安装vim.sy.md
├── 09-50226-换行插入.sy.md
├── 12-52241-词头词尾.sy.md
├── 01-49420-存活下来.sy.md
├── 06-50210-保存修改.sy.md
├── 46-81024-范围控制.sy.md
├── 98-183639-编程入门.sy.md
├── 22-52895-配置文件.sy.md
├── 95-548427-新插件平台_coc.sy.md
├── 16-52485-行内贴靠.sy.md
├── 34-53112-查找进阶.sy.md
├── 30-53107-屏位行号.sy.md
├── 08-50213-追加文本.sy.md
├── 07-50211-从头插入.sy.md
├── 33-53108-查找文本.sy.md
├── 02-50041-使用帮助.sy.md
├── 18-52611-跳到某行.sy.md
├── 47-81025-使用标记.sy.md
├── 19-79636-使用标记.sy.md
├── 81-182652-宏_macro.sy.md
├── 43-80099-替换模式.sy.md
├── 40-79930-复制粘贴.sy.md
├── 17-52557-向上向下.sy.md
├── 45-80115-按行编辑.sy.md
├── 79-181968-操作系统文件格式_fileformat.sy.md
├── 25-157153-更多颜色.sy.md
├── 35-79644-正则表达.sy.md
├── 05-50084-插入模式.sy.md
├── 49-81336-命令进阶.sy.md
├── 82-182653-宏_macro_进阶.sy.md
├── 78-174121-保留环境_viminfo.sy.md
├── 57-81629-行可视化.sy.md
├── 61-81781-vim选项.sy.md
├── 37-79727-删除字符.sy.md
├── 32-82618-函数跳转.sy.md
├── 93-548425-插件管理_vim-plug.sy.md
├── 44-80100-综合练习.sy.md
├── 29-53103-垂直翻页.sy.md
├── 84-182657-表达式_Expression.sy.md
├── 23-52975-配色方案.sy.md
├── 53-81564-批量替换.sy.md
├── 75-170734-功能键_Fn_映射_map_进阶.sy.md
├── 68-81968-批量替换.sy.md
├── 15-52282-行内查找.sy.md
├── 73-170714-缩写_abbreviation.sy.md
├── 24-52977-自定颜色.sy.md
├── 50-81338-命令行效率.sy.md
├── 60-81715-编辑总结.sy.md
├── 76-170982-组合键映射_map.sy.md
├── 21-52894-状态横条.sy.md
├── 70-86848-折叠_folding.sy.md
├── 66-81945-批处理操作.sy.md
├── 20-52885-显示标尺.sy.md
├── 69-82621-标签页_tab.sy.md
├── 41-79953-各寄存器.sy.md
└── 85-182673-命令_command.sy.md
├── raokouling.txt
├── myview
└── index.md
/sanguo.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/overmind1980/oeasy-vim-tutorial/HEAD/sanguo.txt
--------------------------------------------------------------------------------
/oeasy.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/python3
2 | def max(a, b):
3 | if a > b:
4 | return a
5 | else:
6 | return b
7 | a = 4
8 | b = 5
9 | print(max(a, b))
10 |
--------------------------------------------------------------------------------
/oeasy.html:
--------------------------------------------------------------------------------
1 |
2 |
3 | oeasy's web
4 |
5 |
6 | this is oeasy
7 | that is o2z
8 |
9 |
10 |
--------------------------------------------------------------------------------
/oeasy.css:
--------------------------------------------------------------------------------
1 | #oeasy{
2 | font-size:40px;
3 | background:lightblue;
4 | color:darkblue;
5 | float:left;
6 | }
7 | #o2z{
8 | font-size:30px;
9 | background:lightgreen;
10 | color:darkgreen;
11 | float:left;
12 | }
13 | #o3z{
14 | font-size:20px;
15 | background:pink;
16 | color:red;
17 | float:left;
18 | }
19 |
--------------------------------------------------------------------------------
/oeasy.java:
--------------------------------------------------------------------------------
1 | public class oeasy{
2 | public static void o2z(){
3 | System.out.println("oeasy");
4 | System.out.println("o2z");
5 | System.out.println("o3z");
6 | }
7 | public static void main(String[] args){
8 | System.out.println("========before oeasy==========");
9 | o2z();
10 | System.out.println("========after oeasy==========");
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/dos.java:
--------------------------------------------------------------------------------
1 | public class oeasy{
2 | public static void o2z(){
3 | System.out.println("oeasy");
4 | System.out.println("o2z");
5 | System.out.println("o3zz");
6 | }
7 | public static void main(String[] args){
8 | System.out.println("========before oeasy==========");
9 | o2z();
10 | System.out.println("========after oeasy==========");
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/markdown/README.md:
--------------------------------------------------------------------------------
1 | # oeasy 教您零基础玩转编辑神器 vim
2 |
3 | 本课面向的零基础 Linux 新手,从最简单的地方出发,通过一系列操作,逐渐入手 Vim。本实验课包括基本编辑、光标运动、查找替换三个部分,每个实验只需要简单的几个步骤,就能让能够真正运用 Vim 这个超级玩具。本教程同步到https://github.com/overmind1980/oeasy-vim-tutorial,欢迎关注与参与。
4 |
5 | - 作者: [oeasy](https://www.lanqiao.cn/users/1190679/)
6 | - 链接: https://www.lanqiao.cn/courses/2840
7 |
8 | 
--------------------------------------------------------------------------------
/raokouling.txt:
--------------------------------------------------------------------------------
1 | 12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
2 | 打南边来了一个喇嘛,手里提着五斤鳎(tǎ)蚂,打北边来了一个哑巴,腰里别着一个喇叭。
3 | 提搂鳎蚂的喇嘛要拿鳎蚂去换别着喇叭的哑巴的喇叭,别着喇叭的哑巴不愿意拿喇叭去换提搂鳎蚂的喇嘛的鳎蚂。 提搂鳎蚂的喇嘛抡起鳎蚂就给了别着喇叭的哑巴一鳎蚂,别着喇叭的哑巴抽出喇叭就给了提搂鳎蚂的喇嘛一喇叭,也不知是提搂鳎蚂的喇嘛打了别着喇叭的哑巴,还是别着喇叭的哑巴打了提搂鳎蚂的喇嘛。 喇嘛回家炖鳎蚂,哑巴回家滴滴答答吹喇叭。
4 |
--------------------------------------------------------------------------------
/markdown/31-53102-文字区块.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 文字区块
8 |
9 | ## 回忆上节课内容🤔
10 |
11 | - 上上次讲的翻页
12 | - 上次先让屏幕位置固定,移动光标
13 | - H - `Head` 移动到屏幕的顶端
14 | - M - `Middle` 移动到屏幕的中间
15 | - L - `Low` 移动到屏幕的底部
16 |
17 | - 然后让光标固定,移动屏幕的相对位置
18 | - z t - `top`
19 | - z z - 光标在屏幕中间
20 | - z b - `bottom`
21 |
22 | ## 逐段移动
23 |
24 | ```bash
25 | #首先下载文本找到tomsawyer.txt
26 | git clone http://gitee.com/overmind1980/oeasyvim.git
27 | #然后把文本打开
28 | cd oeasyvim
29 | vi tomsawyer.txt
30 | ```
31 | - 使用大括号
32 | - }
33 | - 让光标向后移动一段
34 | - {
35 | - 让光标向前移动一段
36 | - 段落是用回车符区分的一段段的文字
37 | - 可以使用 `[count]` 翻倍
38 | - `:h }` 来查看文档
39 |
40 | 
41 |
42 | ### 逐句移动
43 | - 使用小括号
44 | - )
45 | - 让光标向后移动一句
46 | - (
47 | - 让光标向前移动一句
48 | - 句子是靠 `.` 区分的文字块
49 | - 可以使用 `[count]` 翻倍
50 | - `:h )` 来查看文档
51 |
52 | 
53 |
54 | ## 总结
55 | - 这次内容很简单,主要针对文本类素材
56 | - 移动段落
57 | - { 向前
58 | - } 向后
59 | - 移动句子
60 | - ( 向前
61 | - ) 向后
62 | - 如果我想在程序中快速移动
63 | - 怎么办呢?🤔
64 | - 下次再说 👋
65 |
--------------------------------------------------------------------------------
/markdown/96-548430-自动配对_auto_pairs.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 插件管理器vim-plug
8 |
9 | ## 回忆
10 |
11 | - 我们上次研究了新插件平台Coc
12 | - Coc可以用vim-plug安装
13 | - 安装之后
14 | - 可以在Coc之上再安装各种插件
15 | - 比如coc-json
16 | - 可以进行
17 | - 报错
18 | - 补全
19 | - 提示
20 | - 各种操作
21 | - 好像真的不错?还有啥好玩的?🤔
22 |
23 | ### 查找插件
24 |
25 | - auto-pairs
26 |
27 | 
28 |
29 | - 还有其他插件么?
30 |
31 | ### 对比
32 |
33 | 
34 |
35 | - 有很多方式可以比较插件
36 | - 除了star
37 | - 还有关键字
38 | - 所用语言
39 | - 更新时间
40 | - 等等
41 |
42 | ### 安装
43 |
44 | 
45 |
46 | - PlugInstall
47 | - 插入模式下确实好使了
48 | - 开始标签结束标签这种可以成对添加么
49 |
50 | ### 安装coc-html
51 |
52 | - CocInstall coc-html
53 |
54 | 
55 |
56 | - CocUpdate 可以更新目前的Coc插件
57 |
58 | ### 成对标签
59 |
60 | 
61 |
62 | - 开始标签的尖括号<>是ok的
63 |
64 | 
65 |
66 | - 在上图位置输入/
67 | - 自动生成结束标签
68 |
69 | ## 总结
70 | - 这次安装了自动配对(coc-pairs)
71 | - CocInstall coc-pairs 安装
72 | - CocUpdate 更新
73 | - 还有什么好玩的么🤔
74 | - 下次再说!👋
75 |
76 |
77 |
78 |
79 |
80 |
--------------------------------------------------------------------------------
/markdown/13-52280-大词小词.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 大词小词
8 |
9 | ## 回忆上节课内容🤔
10 |
11 | - 我们上次学习了 e
12 | - e 代表 `end` 词尾
13 |
14 | 
15 |
16 | ### 自有跳跃
17 |
18 | - 还可以成倍次数的跳跃 🤸
19 |
20 | 
21 |
22 | - 但其实我是想以一个一个属性地跳跃,有没有方法呢?
23 |
24 | ## 查询帮助
25 |
26 | - 没思路的话我们还是得继续查询 `:h w`
27 | - 除了 w 之外
28 | - 还有一个 W
29 | - 小 `w` 对应 `word`
30 | - 大 `W` 对应 `WORD`
31 | - 都是什么意思?
32 | - 继续查询呗!!️📕
33 | - `:h word`
34 | - 关于大小词的介绍还是在 `motion` 里面
35 |
36 | 
37 |
38 | ### 对比分析
39 |
40 | 
41 |
42 | - 可以看到小 w 认为 `=`、`"` 都是 `word` 的分割字符
43 | - 大 W 认为 `=`、`"` 都不是 `WORD` 的分割字符
44 | - 只有空格、tab、换行是 `WORD` 的分割字符。
45 | - 这个 W 还是很舒服的,直接就可以跳属性了
46 | - 爽🫖
47 |
48 | ### 相关移动命令
49 |
50 | 
51 |
52 | - 不光是 w 有大词小词
53 | - e、b 也有大词这回事儿
54 | - E 向前到下一个 `大` 词尾
55 | - B 向后到上一个 `大` 词头
56 | - 大词的分割字符还是空格、tab、换行
57 | - 仔细观察上图
58 |
59 | ## 总结
60 | - 我们这次了解了 `大词` 和 `小词`
61 | - `小词` 就是我们常规意义的词,被 `=`、`"` 等标点分开的词
62 | - `大词` 里面包括了 `=`、`"` 等标点,只能被空格、tab、换行分割
63 | - W、E、B 都可以有大词移动
64 | - 但如果我想一步就跳到行头或行尾
65 | - 这不一步登天么?
66 | - 可能么🤔
67 | - 下次再说 👋
68 |
69 |
--------------------------------------------------------------------------------
/markdown/03-50043-打开文件.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 打开文件🔖
8 |
9 | ## 回忆上节课内容
10 |
11 | - 什么不会,就 `:help` 什么
12 | - 命令有完整和简写两种模式
13 | - `:help` 和 `:h`
14 | - `:quit` 和 `:q`
15 | - 注意`:`是左右手小拇指配合输入的
16 | - `vim` 有 `6` 种基本模式
17 | - 但是我们还没有打开过文件
18 |
19 | ## 创建一个文件📒
20 |
21 | - 在终端里面直接运行
22 |
23 | 
24 |
25 | ```bash
26 | #首先对于当前文件夹进行 ls 列表操作
27 | ls -l .
28 | #然后把ls的结果,输出到 oeasy.txt 中
29 | ls -l . > oeasy.txt
30 | #使用cat查看 oeasy.txt 的内容
31 | cat oeasy.txt
32 | ```
33 |
34 | 
35 |
36 | ## 打开
37 |
38 | #### 用 `vim` 打开一个 `oeasy.txt`
39 |
40 | ```bash
41 | vim oeasy.txt
42 | ```
43 |
44 | - 我们可以看到在`标准屏幕(80*24)`上
45 | - 显示出了 `oeasy.txt`
46 | - 当前 `vim` 处于 `正常模式(Normal mode)`
47 |
48 | 
49 |
50 | - 我怎么才能知道 vim 当前编辑的是哪个文件呢?🤔
51 |
52 |
53 | ### 使用帮助命令
54 |
55 | - 键入 :
56 | - 把模式从正常(Normal)切换到命令行(Command-Line)
57 | - 使用 `:file`
58 | - 可以在状态栏看到当前文件的信息
59 | - `:file` 有详细的帮助吗?
60 | - 输入命令 `:h :file`,查一下
61 |
62 | 
63 |
64 |
65 | - `:f[ile]`可简写为
66 | - `:fi`
67 | - `:f`
68 | - 使用 ctrl+G 也有同样的作用
69 |
70 |
71 | ## 总结
72 |
73 | - 我们制作了 `oeasy.txt`
74 | - 我们用 `vim` 打开了 `oeasy.txt`
75 | - 我们分析了 `vi` 环境基本结构
76 | - 我们用 `:f[ile]` 查询了当前文件的信息
77 | - 这个帮助系统好像挺有用
78 | - 还可以获得更多的帮助吗?🤔
79 | - 下次再说!👋
--------------------------------------------------------------------------------
/markdown/14-52281-行头行尾.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 行头行尾
8 |
9 | ## 回忆上节课内容🤔
10 |
11 | - 我们这次了解了 `大词` 和 `小词`
12 | - `小词` 就是我们常规意义的词
13 | - 被 `=`、`"` 等标点分开的词
14 | - `大词` 里面包括了 `=`、`"` 等标点
15 | - 只能被空格、tab、换行分割
16 | - W、E、B 都可以有大词移动
17 |
18 | 
19 |
20 | - 但如果我想一步就跳到行头或行尾
21 | - 这不一步登天么?
22 | - 可能么🤔
23 |
24 | ## 查阅文档📕
25 |
26 | - 还是从 `:h w`,开始查找起
27 | - 还是在 `motion` 里面查找
28 | - 应该和 W 都属于左右移动的部分
29 | - 找到这样两个命令
30 |
31 | 
32 |
33 | ### 行首和行尾
34 |
35 | 
36 |
37 | - ^,也就是 shift+6
38 | - 作用是移动到行首
39 | - 或者说移动到本行第一个非空字符
40 | - $,也就是shift + 4
41 | - 作用是移动到本行行尾
42 | - `^`、`$` 也分别对应正则表达式中的 `开头` 和 `结尾`
43 |
44 | ### 深入细节
45 |
46 | - 如果本行开头第一个字符是空格
47 | - 那^无法到第一个字符啊?
48 | - 如果我就想去第一个字符
49 | - 无论他是空格还是tab
50 | - 应该怎么办呢?
51 | - 这个命令应该离 `^` 不远
52 | - 应该也在 `motion` 的 左右移动部分
53 | - 找到了 `0`
54 |
55 | 
56 |
57 | ### 行头区别
58 |
59 | - ^ 是到本行第一个非空字符
60 | - 0 是到本行第一个字符,不管是不是空格
61 |
62 | 
63 |
64 | - 那结尾如果有空格会如何呢?
65 |
66 | ### 结尾细节
67 |
68 | - 相关命令肯定也在左右移动这部分
69 | - 找到 `g_`
70 |
71 | 
72 |
73 | - g_ 是到本行最后一个非空字符
74 | - 两个按键要依次按下
75 | - $ 跳到本行最后一个字符,即使他是空格
76 |
77 | ## 总结
78 |
79 | - 我们这次学会了直接跳到开头和结尾
80 | - 最重要的就是 `^`、`$`
81 | - ^ 到开头
82 | - $ 到结尾
83 | - 还有什么好玩的吗?🤔
84 | - 下次再说 👋
85 |
86 |
87 |
88 |
89 |
90 |
--------------------------------------------------------------------------------
/markdown/94-548426-路径管理_nerdtree.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 插件管理器vim-plug
8 |
9 | ## 回忆
10 |
11 | - 上次研究了插件管理器vim-plug
12 | - 这个插件可以管理插件
13 | - 添加
14 | - 删除
15 | - 升级
16 | - 每个插件在自己的文件夹里
17 | - 一般在~/.vim/plugged
18 | - 默认安装了nerdtree
19 | - 这个nerdtree干什么的呢?
20 |
21 | ### 查看本地结构
22 |
23 | 
24 |
25 | - 好多的vim文件
26 | - 远程在什么位置呢?
27 |
28 | ### 查看位置
29 |
30 | 
31 |
32 | - github.com/scrooloose/nerdtree.git
33 | - 放到浏览器里面
34 |
35 | ### 跳转
36 |
37 | 
38 |
39 | - 从时间看这个项目不是很活跃了
40 |
41 | ### 安装方式
42 |
43 | 
44 |
45 | - 有五种插件管理器
46 | - 我们上次选的是vim-plug
47 |
48 | ### 运行
49 |
50 | - :NERDTree
51 |
52 | 
53 |
54 | - 上下可移动
55 | - 回车可打开关闭文件夹
56 | - 如何查看隐藏文件和文件夹
57 |
58 | ### 查看帮助
59 |
60 | - :h NERDTree
61 |
62 | 
63 |
64 | - 自我描述
65 |
66 | 
67 |
68 | - 还是不知道怎么查看隐藏文件
69 |
70 | ### 搜索
71 | - /hid
72 |
73 | 
74 |
75 | - 好像是I
76 |
77 | ### 隐藏/显示
78 |
79 | 
80 |
81 | - 确实可以切换
82 |
83 | 
84 |
85 | ## 总结
86 | - 这次了解了nerdtree
87 | - 老牌的资源管理器
88 | - 但是好像好久不更新了
89 | - 有什么替代品么?
90 |
91 | 
92 |
93 | - 好像是一个叫做coc-explorer的东西
94 | - 那是个啥?🤔
95 | - 下次再说!👋
96 |
97 |
98 |
99 |
100 |
101 |
--------------------------------------------------------------------------------
/markdown/88-183444-内容查找grep命令.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 内容查找 grep
8 |
9 | ## 回忆
10 |
11 | - 上次我们尝试了一下各种在vi中执行外部程序
12 | - 可以排序
13 | - 可以改大小写
14 | - 还可以用管道
15 | - 直接对于缓冲buffer文件进行操作
16 | - 还是很方便的
17 | - 其实还有一个外部命令很重要
18 | - 根据内容搜索grep
19 | - 这个怎么和vim配合呢?🤔
20 |
21 | ### 在终端的grep
22 |
23 | - 写一个oeasy.txt
24 |
25 | 
26 |
27 | - 保存并退出
28 | - 复制粘贴出来两份
29 |
30 | 
31 |
32 | - 内容查询grep
33 |
34 | 
35 |
36 | - 可以在三个文件中找到`oeasy`
37 | - 去打开其中一个文件
38 | - `vim oeasy.txt +1`
39 | - 打开`oeasy.txt` 并且光标位于第1行
40 |
41 | ### 在vim中用grep
42 | - 打开vim
43 | - `:grep oeasy *.*`
44 | - 搜索到好多匹配之后
45 | - 放到一个prefix的列表中
46 |
47 | 
48 |
49 | - 还是查到了3个包含oeasy的文件
50 | - 查询结果的展现形式来自于`grepformat`这个选项
51 |
52 | 
53 |
54 | ### 在结果列表中跳转
55 |
56 | - 匹配结果列表
57 | - `:copen` 新窗口打开列表
58 | - `:cclose` 关闭列表窗口
59 | - `:cc N` 跳到第N项
60 | - 在匹配结果间跳转
61 | - `:cfirst`
62 | - `:cprev`
63 | - `:cnext`
64 | - `:clast`
65 |
66 | ### 执行命令
67 |
68 | - `:cdo {cmd}`
69 | - 在每一个匹配的行执行命令{cmd}
70 |
71 | 
72 |
73 | - `:cfdo {cmd}`
74 | - 在每一个匹配的文件上执行命令{cmd}
75 |
76 | 
77 |
78 | - 回忆一下
79 | - `:bufdo`
80 | - `:argdo`
81 | - `:windo`
82 |
83 | ## 总结
84 | - 这次我们研究的是外部命令grep
85 | - 可以在vim中使用grep
86 | - 搜索的结果进入了列表
87 | - 可以打开、遍历、跳转、关闭这个列表
88 | - 也可以给列表中的匹配行或者每个文件执行命令
89 | - 到此为止学了很多的命令
90 | - 有内部的也有外部的
91 | - 有的在命令行模式里面执行
92 | - 还有的映射到一组键盘在正常模式下执行
93 | - 但是都需要按下些什么按键才能支持
94 | - 能否什么都不按自动就执行呢?🤔
95 | - 下次再说!
96 |
97 |
98 |
99 |
100 |
101 |
--------------------------------------------------------------------------------
/markdown/67-157478-vimdiff.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # vimdiff
8 |
9 | ## 回忆上次
10 |
11 | - 上次有三种批量替换,分别是
12 | - `:windo`
13 | - `:bufdo`
14 | - `:argdo`
15 | - 执行的`{cmd}`可以用`|`按顺序增加
16 | - `update` 自动更新
17 | - `:set autowrite` 自动写入
18 | - `:set hidden` 可以隐藏未保存 `buffer`
19 | - 分别对应的`window`、`buffers`、`arguments`
20 | - 各有各自的列表、切换、删除、增加的方式
21 | - 多文件多窗口还有什么可玩的么?🤔
22 | - 下次再说 👋
23 |
24 | ### 观察对比
25 |
26 | - 首先编辑一个`go.java`
27 |
28 | 
29 |
30 | - 连续数字产生方法
31 | - ctrl-v进入块·可视化
32 | - 纵向选中1
33 | - g之后ctrl-a
34 | - 完成加法操作
35 |
36 | ### 进行修改
37 | - 对于这个`go.java`复制粘贴出一个副本
38 | - `:saveas go2.java`
39 | - `:e go2.java`
40 | - 新增一行
41 | - 修改一行
42 | - 删除一行
43 | - 然后保存并退出vim
44 |
45 | ### 进行比较
46 |
47 | - `vimdiff go.java go2.java`
48 | - `vimdiff` 就是专门用比较的
49 | - 后面两个参数是待比较的文件
50 |
51 | 
52 |
53 | - {1..9}行被折叠了
54 | - 因为都是相同的
55 | - 16行有修改
56 | - 紫色的
57 | - 19行被删除了
58 | - 左蓝色右青色
59 | - 右边是`-----------`
60 | - 22行是增加的一行
61 | - 左青右蓝
62 | - 左边是`-----------`
63 |
64 |
65 | ### 编辑的时候比较
66 | - `:vi go.java`
67 | - 如果文件已经打开
68 | - `:vertical diffsplit go2.java` 可以开启比较
69 | - 如果`vertical`被省略
70 | - 就会横向打开文件
71 | - 同步滚动
72 | - 属性为`scrollbind`
73 | - 默认同步滚动
74 | - 可取消同步
75 | - 遍历所有的修改change
76 | - `]c` 下一条修改
77 | - `[c` 上一条修改
78 | - 其中
79 | - `[]` 指的是跳转
80 | - `c` 指的是 `change` 变化
81 | - 根据当前光标位置
82 | - 把当前的改成对比的
83 | - `do`
84 | - `diff obtain`
85 | - 把对比的改成当前的
86 | - `dp`
87 | - `diff put`
88 |
89 | ### 总结
90 | - 我们可以用vimdiff快速的比较文件
91 | - 这很实用!!!
92 | - 实用的一些跳转方式
93 | - 遍历所有的修改change
94 | - `]c` 下一条修改
95 | - `[c` 上一条修改
96 | - 遍历所有的函数method
97 | - `]m` 下一条修改
98 | - `[m` 上一条修改
99 | - 面对不同点
100 | - 把当前的改成对比的 - do - diff obtain
101 | - 把对比的改成当前的 - dp - diff put
102 | - 关于多窗口
103 | - 还有什么好玩的吗?🤔
104 | - 下次再说 👋
105 |
106 |
107 |
108 |
109 |
110 |
111 |
--------------------------------------------------------------------------------
/markdown/87-182677-外部命令_external_Command.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 外部命令 external
8 |
9 | ## 回忆
10 |
11 | - 上次研究的是global
12 | - `:[range]global/{pattern}/{command}`
13 | - `range` 是执行的范围
14 | - `pattern` 是搜索的模式
15 | - `command` 执行的命令
16 | - 命令有很多
17 | - d 删除
18 | - m 移动
19 | - t 拷贝
20 | - p 打印
21 | - s 替换
22 | - sort 排序
23 | - update 更新
24 | - `global` 是很好用的内部命令
25 | - 据说vim还可以执行外部命令呢?!
26 | - 怎么玩呢?🤔
27 |
28 | ### 回忆外部命令
29 |
30 | - `:!ls`
31 | - 在命令行列表
32 | - `:!python %`
33 | - 运行python程序额
34 | - `:!javac %`
35 | - 编译java程序
36 |
37 | ### r读取
38 |
39 | - `:r oeasy.txt`
40 | - `:r !ls`
41 | - `:r !ls -lah`
42 | - `:r !cat oeasy.txt`
43 | - `:r !curl -s 'http://oeasy.org'`
44 | - 这样就可以把各种信息直接读到vim中了
45 |
46 | ### 我杀死我自己
47 | - `:!ps`
48 |
49 | 
50 |
51 | - `:!kill -9 341`
52 |
53 | ### tr命令translate
54 |
55 | 
56 |
57 | - `:.!tr '[:lower:]' '[:upper:]'`
58 | - `.!`
59 | - 当前行执行外部命令`
60 | - `!tr '[:lower:]' '[:upper:]'`
61 | - 调用外部命令把小写字母translate成大写字母
62 | - `:%!tr '[:lower:]' '[:upper:]'`
63 | - 全部行都执行
64 | - `:1,2!tr '[:lower:]' '[:upper:]'`
65 | - 1、2行执行
66 |
67 | ### awk
68 | - awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan
69 |
70 | 
71 |
72 | - `:%!awk '{print $1}'`
73 | - u回来
74 | - 再试试`:%!awk '{print $2}'`
75 |
76 | ### 管道pipe
77 |
78 | 
79 |
80 | - `:%!awk 'NR > 1' | sort -nk 3 | column -t`
81 | - `%!` 执行范围range是所有行
82 | - `awk 'NR > 1'` 从第二行开始awk
83 | - `|` 管道
84 | - `sort -nk 3` 使用第3列进行排序
85 | - `column -t` 用空格隔开
86 |
87 | ## 总结
88 | - 这次我们尝试了一下各种在vi中执行外部程序
89 | - 可以排序
90 | - 可以改大小写
91 | - 还可以用管道
92 | - 直接对于缓冲buffer文件进行操作
93 | - 还是很方便的
94 | - 其实还有一个外部命令很重要
95 | - 根据内容搜索grep
96 | - 这个怎么和vim配合呢?🤔
97 | - 下次再说!
98 |
99 |
100 |
--------------------------------------------------------------------------------
/markdown/83-182654-函数_function.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 函数 function
8 |
9 | ## 回忆
10 |
11 | - 关于宏,我们回忆一下
12 | - `qa` 开始录制宏
13 | - `q` 结束录制宏
14 | - `@a` 应用宏
15 | - `qA` 追加录制宏
16 | - 控制寄存器内容其实就是控制宏
17 | - 宏还有一些特性
18 | - 可以多文件执行宏
19 | - 可以并发运行宏
20 | - 可以递归执行宏
21 | - 宏是随录随用的的
22 | - 我想把一些东西固定下来,让他到时候不用定义就能执行
23 | - 可以么?🤔
24 |
25 | ### 函数function
26 |
27 | - `:function` 可以看到目前已有的函数
28 |
29 | 
30 |
31 | ### 查询所有可以调用的函数
32 |
33 | - `:call ` tab
34 |
35 | 
36 |
37 | - 我可以自己定一个 函数`function` 么
38 |
39 | ### 定义函数function
40 | - 特别要注意首字母大写
41 | - `:function Oeasy()`
42 | - ` echo "oeasy function called!!!!"`
43 | - `endfunction`
44 |
45 | 
46 |
47 | - `:function Oeasy`
48 | - 查看函数function
49 |
50 | 
51 |
52 | ### 调用函数function
53 | - `:call Oeasy()`
54 |
55 | 
56 |
57 | ### 删除函数
58 |
59 | - `:delfun Oeasy`
60 |
61 | 
62 |
63 | ### 查询各种函数
64 |
65 | - 在用户手册的41里面有大量的各种的函数
66 |
67 | 
68 |
69 | - 可以用
70 | - ctrl+]跳入
71 | - ctrl+]跳出
72 | - 还可以用 `:h` 查函数细节
73 | - `:h nr2char()`
74 | - 如果我想总是可以自动调Oeasy()
75 | - 不用每次手动定义
76 | - 应该怎么办?
77 |
78 | ### 默认函数
79 |
80 | - 在`~/.vimrc`中写下这个函数
81 |
82 | 
83 |
84 | - 然后再次启动vi
85 | - `:call Oeasy()`
86 |
87 | ## 总结
88 |
89 | - 关于 `函数function `,我们回忆一下
90 | - 可以查询
91 | - 可以新建
92 | - 可以调用
93 | - 还可以删除
94 | - 我想用 `函数function` 往 `buffuer` 里面写点东西
95 | - 比如写一个java的基本程序框架
96 | - 这样一调用就好使了
97 | - 省的自己打了
98 | - 可以么?🤔
99 | - 下次再说!
100 |
101 |
102 |
103 |
104 |
105 |
--------------------------------------------------------------------------------
/markdown/11-52121-向前向后.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 向前向后
8 |
9 | ## 回忆上节课内容🤔
10 |
11 |
12 | 
13 |
14 | - 我们上次强化了起手势🧘
15 | - 回忆了基本的移动方式 `hjkl`
16 | - 除 `hjkl` 外,据说还有更厉害的移动方式
17 | - 是什么呢?
18 |
19 | ## 下素材
20 |
21 | ```bash
22 | #这个素材,我们下载过,重温一下
23 | wget gitee.com/overmind1980
24 | #然后看看下载了个啥
25 | ls
26 | #最后用vim打开这个网页
27 | vim overmind1980
28 | ```
29 |
30 | 
31 |
32 | ## 使用帮助学习
33 |
34 | - 其他的移动命令应该和 `hjkl` 离得不远
35 | - 可以使用 `:h h`先找到 `h` 的帮助📕
36 | - 注意是 `:h h` ,而不是 `:h :h`
37 | - `:h h` 查找的是 正常模式下 h 命令的帮助手册
38 | - `:h :h` 查找的是 命令行模式下 `:h` 命令的帮助手册
39 | - 找到这个文件叫做 `motion.txt`
40 | - 对应的位置叫做 `2.Left-right motion`
41 |
42 | 
43 |
44 | - 点击上图可放大
45 |
46 | ### 在帮助中查找单词
47 |
48 | - 我希望按照`单词`进行移动
49 | - 单词的英文是 `word`
50 | - 在`vim`打开的 `motion.txt` 帮助手册中
51 | - 使用 `/word`
52 | - 查找 `motion.txt` 中关于 `word` 的单词
53 | - 找到这个命令叫做 `w`
54 | - 退出帮助 `:q` 试试 `w`
55 |
56 | 
57 |
58 | ### word
59 |
60 | 
61 |
62 | - `w` 可以移动到下一个单词的开头
63 | - `w` 比 `l` 效率要高好多
64 | - 让我们在环境中爽起来➡️➡️➡️
65 | - `w` `w` `w`...
66 | - 但是只有向前,没有回去吗?🤔
67 |
68 | ### 搜索 backward🔙
69 |
70 | - 可以使用 `:h w`先找到 `w` 的帮助
71 | - 还是 `motion.txt`
72 | - 可以使用 `/backward` 查找向前之类的单词
73 | - 找到我们需要的命令 `b`
74 |
75 | 
76 |
77 | ### backward
78 |
79 | 
80 |
81 | - `b` 就是向前一个单词
82 | - `b` 来到前一个单词的词头
83 | - 有来就有去
84 | - 有阴就有阳
85 | - 我们可以使用 `w` 和 `b` 反复横跳🤸
86 |
87 | ## 总结
88 |
89 | - 我们这次学了向前一个单词
90 | - w
91 | - 意思是 `word`
92 |
93 | 
94 |
95 | - 还学习了向后一个单词
96 | - b
97 | - 意思是 `backward`
98 |
99 |
100 | 
101 |
102 | - 这俩命令都落在单词的第一个字母
103 | - 还有什么好玩的命令吗?🤔
104 | - 下次再说 👋
105 |
106 |
--------------------------------------------------------------------------------
/markdown/92-548424-源码编译安装vim.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 内容查找 grep
8 |
9 | ## 回忆
10 |
11 | - 上次我们彻底研究了vim高亮的原理
12 | - 各种语法项syntax item
13 | - 关键字keyword
14 | - 匹配模式match
15 | - 区域region
16 | - 定义好了之后还可以设置链接成组
17 | - `hi def link javaComment Comment`
18 | - 然后就可以在颜色文件中具体配色了
19 | - 比如murphy中对于Comment的定义
20 | - `hi Comment ctermfg=yellow`
21 | - 不同的语言可以有不同的语法定义
22 | - 这就是vim的语法高亮体系
23 | - 当然vim还有各种好玩的插件
24 | - 怎么玩呢?
25 |
26 | ### 当前版本
27 |
28 | 
29 |
30 | - 当前是8.1
31 | - 我希望从github下载最新的源码安装vim
32 |
33 | ### 卸载vim
34 | ```
35 | sudo apt remove vim vim-runtime vim-tiny vim-common vim-scripts vim-doc
36 | ```
37 |
38 | - 卸了之后就找不到了
39 |
40 | 
41 |
42 | ### 下载源码
43 |
44 | ```
45 | git clone https://github.com/vim/vim.git
46 | ```
47 |
48 | - 从github下载最新的vim源码
49 |
50 | 
51 |
52 | ### 配置代码
53 | ```
54 | cd vim
55 | ./configure --with-features=huge --enable-pythoninterp=yes --enable-python3interp=yes
56 | ```
57 |
58 |
59 | 
60 |
61 | ### 编译生成
62 |
63 | ```
64 | sudo make install
65 | ```
66 |
67 | 
68 |
69 | ### 尝试运行
70 |
71 | 
72 |
73 | - vim可以用
74 | - 但是vi不可用了
75 |
76 | ### 添加软连接
77 |
78 | 
79 |
80 | - vi 就又可以用了
81 | - 配置一下vim环境
82 |
83 | ### ~/.vimrc
84 |
85 | 
86 |
87 | - 可以添加一些配置信息
88 | - 236行往下应该都是关于插件的
89 | - 应该调整颜色配置的位置
90 |
91 | ### 颜色配置
92 |
93 | - 搜索color
94 | - 找到颜色配置合理的位置
95 |
96 | 
97 |
98 | - 整体结束
99 |
100 | ## 总结
101 | - 我们把vim升级了
102 | - 用的是源码编译的方法
103 | - 主流程
104 | - 直接下载源码
105 | - 配置
106 | - 编译并安装
107 | - 后续
108 | - 然后设置了软连接
109 | - 配置了颜色方案
110 | - 配置里面最后一部分是关于插件的
111 | - 插件怎么玩呢?🤔
112 | - 下次再说!👋
113 |
114 |
115 |
116 |
117 |
118 |
--------------------------------------------------------------------------------
/markdown/09-50226-换行插入.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 插入新行
8 |
9 | ## 回忆上节课内容🤔
10 |
11 | - 上上次是 `i`、`I` 在光标前面插入
12 | - 又加了 `a`、`A` 可以在光标后面插入
13 | - `a` 是在光标后插入
14 | - `A` 是在当前行最后插入
15 |
16 | 
17 |
18 | - 关于插入,还有什么命令吗?🤔
19 | - 我们继续去查阅 help
20 |
21 | ```bash
22 | :h i
23 | ```
24 |
25 | ## 我们发现有这样一组命令
26 |
27 | 
28 |
29 | #### 看起来的意思是
30 |
31 | - `o` 在
32 | - 当前行 **下面** 插入一个空行
33 | - 然后切换到插入模式
34 | - `O`
35 | - 在当前行 **上面** 插入一个空行
36 | - 然后切换到插入模式
37 | - 一个上面 👆,一个 👇
38 |
39 |
40 | ### **上方** 插新行
41 |
42 | 
43 |
44 | - 当前绿色的光标在第6行中间
45 | - 如果不显示行号,就输入 `:set nu`
46 | - 当前模式是正常模式
47 | - 如果我按下 o
48 | - 就会在第 7 行插入一个新行
49 | - 并且模式进入插入模式
50 | - 按 ctrl+c
51 | - 可以回正常模式
52 | - o、ctrl+c
53 | - 可以反复切换
54 |
55 | ### 思考
56 | - 编辑一个新文件
57 | - 在正常模式下输入`oeasy`
58 | - 会发生什么?
59 |
60 | ### **下方** 插新行
61 | - u 回到最初
62 | - 回到第 6 行中间位置
63 | - 我按下 O
64 | - 就在第 6 行插入一个空行
65 | - 原来的第 7 行,变成了第 6 行
66 | - 并把模式改为输入模式
67 |
68 | ### 回忆以前学的切换
69 |
70 | - i、I和a、A
71 | 都可以进入插入模式
72 | - i 在光标前插入
73 | - I 在本行最前插入
74 | - a 在光标后插入
75 | - A 在本行最后插入
76 | - ctrl+ c退回到正常模式
77 | - 现在又加了 o、O
78 | - o 本行下方插入一个新行
79 | - O 本行上方插入一个新行
80 | - 再练练重复、撤销、重做
81 | - 按几次 . 重复插入操作
82 | - u 可以撤销
83 | - ctrl+r 可以重做
84 |
85 |
86 |
87 | ### 保存并退出
88 |
89 | - 用 `:wq` 保存并退出
90 | - `:w` 是保存
91 | - `:q` 是退出
92 | - 和在一起就是 `:wq`
93 | - 保存并退出
94 | - 我们可以使用 `:help :wq` 查看帮助
95 |
96 | 
97 |
98 | ## 总结
99 |
100 | - 我们这次学了两个新的东西 `o` 和 `O`
101 | - `o` 是在当前行下方插入新行
102 | - `O` 是在当前行上方插入新行
103 | - 这样我们就有大小写的 `i`、`a`、`o` 可以从正常模式切换到输入模式了。
104 |
105 | 
106 |
107 |
108 | - 我们还把 `:w`、`:q` 合成了 `:wq`
109 | - 现在基本上简单的编辑没有什么问题了
110 | - 下一步就是提高效率,用最快的方式在屏幕上移动
111 | - 怎么做呢?
112 | - 我们下次再说!👋
--------------------------------------------------------------------------------
/markdown/12-52241-词头词尾.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 词头词尾
8 |
9 | ## 回忆上节课内容🤔
10 |
11 | - 我们这次学了向前一个单词
12 | - w
13 | - 意思是 `word`
14 |
15 | 
16 |
17 | - 还学习了向后一个单词
18 | - b
19 | - 意思是 `backward`
20 |
21 |
22 | 
23 |
24 | - 这俩命令都落在单词的第一个字母
25 | - 还有什么好玩的命令吗?🤔
26 |
27 |
28 | ### 动手练习
29 | - 我们可以一路向前
30 | - 也可以反复横跳
31 | - w、b 附近还有什么?🤔
32 | - 去 `:h w` 附近再转悠转悠
33 |
34 | ### 查询帮助
35 |
36 | 
37 |
38 | - 我们看到 w、b 中间有个 e
39 | - 说是
40 | - Forward to the end of word [count] inclusive.
41 | - Does not stop in an empty line.
42 | - 意思
43 | - 向前到单词的结尾
44 | - 空行不停留
45 | - 直到这个文档的尽头
46 | - 也不停留~~~
47 | - e 对应单词是 `end`
48 | - 我们来试一下🤪
49 |
50 | ## 跳到词尾
51 |
52 | 
53 |
54 | - 我们可以看到 e 是向 `前` 跳到 `本词尾`
55 | - 而 w 是向 `前` 跳到 `下词头`
56 | - b 则是向 `后` 跳回到 `上词头`
57 | - 如果我的光标不在 `本词头` 的位置,又如何呢?
58 |
59 |
60 | ### 光标位于词中
61 |
62 | 
63 |
64 | - 我们可以看到,如果光标位于 `词中` 时
65 | - e 不变,还是跳到 `本词尾`
66 | - w 还是跳到 `下词头`
67 | - 而b 有变化,向 `后` 跳没变,但是跳回到了 `本词头`
68 | - w、b
69 | - 都是跳到 `词头`
70 | - 一个向 `前` 一个向 `后`
71 | - e是向 `后` 跳到 `词尾`
72 | - 如果我想向前跳到词尾呢?
73 |
74 | ### 向前跳到词尾
75 |
76 | - ge 向前跳到词尾
77 |
78 | 
79 |
80 | 
81 |
82 | ### 连续跳跃
83 |
84 | - `wbe` 比 `hjkl` 效率高得多
85 | - 但是还可以更高 🤸
86 | - 方法就是使用数字
87 | - 从帮助中,我们可以发现可以选择使用 `[count]` 次数
88 |
89 | 
90 |
91 | - 意思就是可以向前 n 个单词
92 |
93 | ### 跳起来吧🤾♀️
94 |
95 | 
96 |
97 | - 在方向前面加上数字
98 | - `3b`、`5e` 这样都可以
99 | - 甚至 `hjkl` 都可以使用
100 | - 比如 `4h`、`10l`
101 | - 这样快得多!!!✊
102 |
103 | ## 总结
104 |
105 | - 我们这次学习了 e
106 | - e 代表`end` 词尾
107 | - 我们了解到在词中时,b退到本词头
108 | - 还可以成倍的跳跃
109 | - 但是当前单词和我的理解有点不一样啊?
110 | - 我想直接跳到href属性,怎么办🤔
111 | - 下次再说 👋
112 |
113 |
--------------------------------------------------------------------------------
/markdown/01-49420-存活下来.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 存活下来🥊
8 |
9 | ## 更新 apt 源,升级 vim
10 |
11 | #### `vim` 是什么
12 |
13 | - `vim` 是类 `unix` 系统上的一个文本编辑神器,在 `Linux` 系统环境中也被许多程序员使用,书写程序和文档。
14 |
15 | - 我们本次课程将围绕 `Vim` 进行全面的介绍及学习。
16 |
17 | #### 工欲善其事,必先利其器
18 |
19 | - `vim` 在环境中,已经默认安装好了,我们可以直接使用。在使用前,我们先对它进行升级,升级后会有更好的功能体验。
20 |
21 | - 下面打开终端
22 |
23 | 
24 |
25 | - 输入以下命令
26 | - 进行升级:
27 |
28 | ```shell
29 | #首先是更新源
30 | sudo apt update
31 |
32 | #然后是升级vim
33 | sudo apt install vim
34 | ```
35 |
36 | ## 运行vim
37 |
38 | 在升级完成后,我们再通过命令运行 `vim`。
39 |
40 | ```shell
41 | vim
42 | ```
43 |
44 | #### 进入 `vim` 的基本界面
45 |
46 | 
47 |
48 | - `vim` 默认的模式 是 `Normal mode(正常模式)`
49 | - 这个时候你会发现按 回车、空格 等按键,都是没有用的
50 |
51 | ## 退出vim
52 |
53 | #### 我想要退出vim
54 |
55 | - 我输入 ctrl+c 尝试退出
56 | - 系统进行如下提示📕
57 |
58 | 
59 |
60 | - 左下角可以看到系统的提示
61 | - 下面我们只需按照系统提示进行操作
62 | - 输入 `:qa`
63 | - 注意`:`是半角的
64 | - 就是回车键
65 | - 这样就可以退出 `vim`
66 |
67 | ### 尝试退出 `vim`
68 |
69 | - 按照提示依次输入 `:quit`
70 | - 输入 `:` 时,输入的内容显示在屏幕的左下角
71 | - `:` 的输入,让 vim 的模式从 `Normal mode(正常模式)`,变成了 `Command-Line mode(命令行模式)`
72 | - 如果输入内容在主编辑窗口的话,需要先 esc 进入 `Normal mode(正常模式)`
73 | - `:` 的输入让左上角的绿色光标消失
74 | - 左下角随着键盘的输入,将显示字符
75 | - 注意 vim 对于大小写是敏感的,我们使用半角英文字符
76 | - 输入完 `:qa` 后,按 回车 执行这个 `:qa` 命令
77 | - 执行命令 `:qa` 命令
78 | - 退回到 `shell`
79 | - 别小看这一步
80 |
81 | ### 多少人倒在了这里
82 |
83 | 
84 |
85 |
86 | ### 第一步
87 |
88 | - 迈出第一步是最难的
89 | - 截止到2021/8/3
90 | - 8年多来,239万人卡在vim里
91 | - 退出Vim编辑器甚至成为了开发者之间的一个笑话
92 |
93 | ### 发展趋势
94 |
95 | - 国内趋势
96 |
97 | 
98 |
99 | - 国外趋势
100 |
101 | 
102 |
103 | - 那些图形界面还是占用资源过多
104 | - 还需要系统gui的支持
105 | - 微软拥抱开源只是姿态
106 | - 商业巨头还是想垄断行业、标准、语言、思想
107 |
108 | ## 总结
109 |
110 | - 升级了 vim
111 | - 进入了 vim
112 | - 退出了 vim
113 | - 多少人倒在了这一步
114 |
115 | 
116 |
117 | #### 这就是我们对于 vim 最初的接触。恭喜您存活了下来!
118 |
119 | - vim 还有什么好玩的呢?🤔
120 | - 我们下次再说!👋
--------------------------------------------------------------------------------
/markdown/06-50210-保存修改.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 另存与保存
8 |
9 | ## 回忆上节课内容🤔
10 |
11 | 
12 |
13 | - 我们上次进入了插入模式
14 | - 从正常模式,按i,进插入模式
15 | - 从插入模式,按ctrl+c 退回到正常模式
16 | - 这次我们想想应该如何保存这个文件
17 |
18 | ```bash
19 | ls -l . > oeasy.txt
20 | vi oeasy.txt
21 | ```
22 |
23 | ## 保存文件
24 |
25 | - 首先要查询 `save` 相关的帮助📕
26 | - `:h save`
27 | - 只是找到了 `saveas {file}`
28 | - 这一看就是 `另存为` 啊
29 |
30 | 
31 |
32 | - 我们来试一下 i 进入插入模式
33 | - 随便打字 🅰️
34 | - 然后另存为 `:saveas o2z.txt`
35 | - 这个 `o2z.txt` 是 `saveas` 的参数,也就是保存的文件名
36 | - 然后退出 `:q`
37 |
38 | ```bash
39 | cat o2z.txt
40 | ```
41 |
42 | **可以看到另存的 `o2z.txt` 真的被保存下来了!🤪,但是能否直接保存当前文件呢?**
43 |
44 | ## 直接存储
45 |
46 | - 我们再次打开 `oeasy.txt`
47 | - 我们继续查帮助 `:h save`
48 | - 往上翻
49 |
50 | 
51 |
52 | ### write 命令
53 |
54 | - 找到了一个 `:w[rite]` 命令
55 | - 复杂写法是 `:write`
56 | - 简单写法是 `:w`
57 | - 我们再对文件进行修改
58 | - 注意文件名 `oeasy.txt[+]` 中那个 `[+]`,就是有修改但是未保存的标志
59 |
60 | 
61 |
62 | - 如果不保存直接退出
63 | - `vim` 就会报错
64 |
65 | ### vim的报错
66 | - 再修改一下文件
67 | - `[+]` 又出来了
68 | - 如果没有保存文件就想`:q`的话
69 | - 会报 `E37` 错误
70 | - 这是啥意思?
71 | - 什么不会就 `:h` 什么
72 |
73 | 
74 |
75 | - 面对报错怎么办呢?
76 |
77 | ### 查询报错
78 |
79 | - 我们明确地知道错误是E37
80 | - 那么我们就查询报错信息
81 | - 我们可以直接`:h E37`查询这个错误的详细信息
82 |
83 | 
84 |
85 | - 报错是好事
86 | - 能让我们知道错在哪里
87 | - 知道了之后
88 | - `:q` 退出报错子窗口
89 | - 这次再来存储
90 |
91 | ### 保存细节
92 |
93 | 
94 |
95 | - 状态横条的上有
96 | - 文件名
97 | - oeasy.txt
98 | - 未保存标记
99 | - [+]
100 | - :w回车之后
101 |
102 | ### 保存后
103 |
104 | - 在最下面一行:
105 | - 文件名
106 | - oeasy.txt
107 | - 行数
108 | - 6L
109 | - 字符数
110 | - 337C
111 |
112 | 
113 |
114 | #### 这时候我们再退出
115 |
116 | - 先执行操作 `:q`
117 | - 再执行 `cat`查看 `oeasy.txt`
118 | - 真的已经被修改了!!!🤪
119 |
120 |
121 | ## 总结
122 |
123 | - 这次我们学会了另存为命令 `:saveas {file}`
124 | - 还有直接保存命令 `:w`
125 | - 真的可以把修改的内容保存了😃
126 | - 还有什么可玩的?🤔
127 | - 我们下次再说!👋
--------------------------------------------------------------------------------
/markdown/46-81024-范围控制.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 范围控制
8 |
9 | ## 回忆上节课内容🤔
10 | - 这次我们主要就是看命令行
11 | - 首先是选择一个 `[range]` 这个范围
12 | - 然后进行相应的操作
13 | - `:11,30d`
14 | - `:2,7y`
15 | - 还可以指定寄存器
16 | - `:3,40y a`
17 | - `:"aP`
18 | - 甚至可以用一行就复制或者剪切内容
19 | - `:12,30t50`,12-30行复制到50行
20 | - `:3,6m30`, 3-6行移动到30行
21 | - 这个 `[range]` 还有什么说法吗?🤔
22 |
23 | 
24 |
25 | ### 查看手册📕
26 |
27 | 
28 |
29 | - `:h range` 可以查看相应的细节
30 |
31 | ### 范围定义
32 |
33 | - `{number}`,比如`1,4,7`等具体数字
34 | - `:3` 就是去第`3`行
35 | - `.` 当前行
36 | - `1,.`从第1行到当前行
37 | - `$` 最后一行
38 | - `.,$`从当前行到最后1行
39 | - `1,$`从第1行到最后1行
40 | - `:1,$d`
41 | - `%` 所有行
42 | - 相当于`1,$`
43 | - `:%d`
44 |
45 | ### 匹配相关的范围
46 |
47 | - `/{pattern}[/]` 向下查找到的匹配`{pattern}`的那行
48 | - 比如下图中,光标在第1行
49 | - `:1,/asdf.*/y`就会把从第1行到`asdf`行的内容复制进入剪切板
50 |
51 | 
52 |
53 | - `?`就是向上搜索
54 | - 如果光标在第7行
55 | - `:?asdf?,3d`
56 | - 就是向上搜索到asdf的匹配行也就是第2行
57 | - 删除的就是2-3行
58 |
59 |
60 | ### 例子展示
61 |
62 | 
63 |
64 | - `.+3`
65 | - 光标之下 `3` 行
66 | - `/that/+1`
67 | - 向下找到匹配`/that/`的那行的下 `1` 行
68 | - `.,$`
69 | - 从头到尾相当于`%`
70 | - `0;/oeasy/`
71 | - 从第 `1` 行往后找到的第一个 `oeasy`,包括第一行
72 | - `1;/oeasy/`
73 | - 从第 `1` 行,开始往后找的第一个 `oeasy`,不包括第一行
74 | - 我们经常用到/、?、,
75 | - 什么才是正确的输入方法呢?
76 |
77 | ### 小细节
78 | - 输入/
79 | - 右手小指往下点一下
80 | - 注意这个时候右手的食指还在j的凸起上
81 | - 只挪动小指
82 | - ,
83 | - 右手中指往下点一下
84 | - 注意这个时候右手的食指还在j的凸起上
85 | - 只挪动中指
86 | - 保持基本手型基本架子
87 | - 坐姿或站姿保证尾闾中正
88 | - 调整呼吸
89 | - ?
90 | - 左手小指按下Shift
91 | - 右手小指按下/
92 | - :
93 | - 左手小指按下Shift
94 | - 右手小指按下;
95 | - 这种左右配合感觉非常美妙
96 | - Shift 尽量都左右配合
97 | - 以后可以强制练习一下
98 | - 比如`http://oeasy.org`
99 | - `:`用小指
100 | - `/`也用小指的,左右配合
101 | - `.`用的是无名指
102 | - 无名指也叫药师指
103 | - 感觉多用的话可以提高灵感
104 |
105 | ## 总结
106 | - 有了这个`range`、`address`我们可以做很多事情
107 | - 跳转`:44`
108 | - 复制和剪切
109 | - `1,3d`
110 | - `3,$y`
111 | - `%d o`
112 | - 配合搜索
113 | - `/oeasy/,$y`
114 | - `5;/oeasy/d`
115 | - 其实还有一种`address`
116 | - 是 `mark` 标记
117 | - 还记得 `mark`标记 是什么意思?🤔
118 | - 下次再说 👋
119 |
120 |
121 |
122 |
123 |
124 |
125 |
--------------------------------------------------------------------------------
/markdown/98-183639-编程入门.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # vim脚本编程展望
8 |
9 | ## 回忆
10 |
11 | - 上次我们彻底研究了vim高亮的原理
12 | - 各种语法项syntax item
13 | - 关键字keyword
14 | - 匹配模式match
15 | - 区域region
16 | - 定义好了之后还可以设置链接成组
17 | - `hi def link javaComment Comment`
18 | - 然后就可以在颜色文件中具体配色了
19 | - 比如murphy中对于Comment的定义
20 | - `hi Comment ctermfg=yellow`
21 | - 不同的语言可以有不同的语法定义
22 | - 其实,vim也是门语言
23 | - vimscript也是可以编程的
24 | - 怎么玩呢?🤔
25 |
26 | ### 编写脚本
27 | - `vi oeasy.vim`
28 | - 在`oeasy.vim`中写下
29 | - `echo "hello vim script"`
30 | - `:w`
31 | - `:source %`
32 |
33 | 
34 |
35 | - 这就是vim程序的编写和运行的基本方法
36 | - vim既是编辑器,也是解释器
37 | - 不过现在vim9script要有一个比较具大的改变
38 | - 这个改编还要从2014年说起
39 |
40 | ### 分支
41 | - 缘起
42 | - 2014年vim还处于7.4版
43 | - Thiago de Arruda为Vim提交了一个补丁,以引入多线程的功能
44 | - 不过最终没有采纳
45 | - 于是Thiago创建了一个分支NeoVim,并且筹集到了33万美元的资金
46 | - 2015年末,Thiago不再领导相关的工作
47 | - 而且neovim的社会化程度明显比vim高
48 | - 提交代码的人数多691个人
49 | - 而且每个人都提交好多代码
50 | - 不过其实问题也不少
51 |
52 | 
53 |
54 | ### 老根的演化
55 | - vim这边
56 | - 基本上还是非常稳妥
57 | - 或者说比较缓慢的运动着
58 | - 基本上是brammool一个人的世界
59 | - 有其他的代码提供者
60 | - 但是都是非常少的代码量
61 | - 自从2018年开始,neovim的事情无疑刺激了brammool
62 | - github的提交变得非常活跃
63 |
64 | 
65 |
66 | - 2016年9月12日,brammool提交了vim8
67 | - vim8支持了异步和timer
68 |
69 | ### vim9
70 |
71 | 
72 |
73 | - Bram Mool是真勤劳啊
74 | - 谁看得出这位61年出生的老大爷已经进入了花甲之年
75 | - vim9的项目已经成了只读的档案
76 | - 现在的新提交的东西都在vim里面
77 | - 不过我们可以从一些方面看到他对于vim9的企图心
78 |
79 | ### vim9Script
80 | - 这个新的脚本要加速运行
81 | - 就要变更原来的一些模式
82 | - 函数的参数只是名字,而不是来自于字典的东西,类似a:000列表之类的
83 | - 本地变量不再放在一个字典里
84 | - 异常处理的细节
85 | - 速度能有多快呢?
86 |
87 | 
88 |
89 | - 感觉已经是脚本语言的极限了
90 | - 据说函数是要编译成本地的指令的
91 | - 而且要义无反顾地做一个不向前兼容的vim9script!!!
92 | - 而且可以使用类库
93 | - 总之,我们现在的脚本可能会发生改变
94 | - 我们还是等vim9script发布出来之后再讲吧
95 |
96 | ### 预告
97 |
98 | - 关于vim9现在有个预告
99 | - https://vimhelp.org/vim9.txt.html#vim9.txt
100 | - 我感觉这脚本离不开vim
101 | - 而且一定可以很方便地使用缓存buf、寄存器reg、标签tab之类的东西
102 | - 双方已经上场对战
103 | - 也许会杀出个第三方比如SpaceVim之类的
104 | - 本教程先告一段落
105 |
106 |
107 | ## 总结
108 | - vim历史悠久
109 | - neovim前来挑战
110 | - vim及时调整
111 | - vim9script令人期待
112 | - 到底什么时候更新
113 | - 要等vim9script出来🤔
114 | - 之后再说!
115 |
116 |
117 |
118 |
119 |
120 |
--------------------------------------------------------------------------------
/markdown/22-52895-配置文件.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 配置文件
8 |
9 | ## 回忆上节课内容🤔
10 |
11 | - 我们上次了解到了状态横条
12 | - 通过转义表示 `item`
13 | - 控制 `item` 宽度的方法
14 | - 将 `item` 成组的方法
15 | - 还有一个总开关 `laststatus`
16 |
17 | - 但是每次都要写很长的一段话来配置很麻烦啊
18 | - 我们能否写一个配置文件,让 `vim` 每次自动配置好呢?🤔
19 |
20 | 
21 |
22 | ### 配置文件
23 |
24 | ```bash
25 | #首先打开原来的配置文件,~代表用户文件夹
26 | vi ~/.vimrc
27 | #可以用/statusline找到状态条的写法
28 | ```
29 |
30 | 
31 |
32 |
33 | ### ~/.vimrc
34 | - 可以发现 `~/.vimrc` 就是 `vi` 的 `配置文件`
35 | - 如果这个配置文件找不到了 `vi` 会变成什么样子呢?
36 | - 试试!👊
37 |
38 | ```bash
39 | #原配置文件改名
40 | mv ~/.vimrc ~/.vimrc_old
41 | #重新书写配置文件
42 | vi ~/.vimrc
43 | ```
44 |
45 | ### 书写配置文件
46 |
47 | - 配置文件清空后
48 | - 配置信息全丢
49 | - 没关系,从头写
50 | - 首先设置一个状态栏在 `~/.vimrc` 里面写两句话
51 | - `set statusline=oeasy`
52 | - `set laststatus=2`
53 | - 注意这里就不用 `:` 了
54 | - 保留并退出
55 | - 重新编辑 `vi ~/.vimrc`
56 | - 发现状态栏已经生效🤪
57 | - 更新状态栏
58 | - `set statusline=%-040.40(%F%m%)%-030.30([%l,%c]%)%p%%`
59 | - `set laststatus=2`
60 | - `set ru nu sc`
61 |
62 | 
63 |
64 | - `:h options` 查询更多实用开关
65 |
66 | ### 各种实用开关
67 |
68 | - `set number` 显示行号
69 | - `set relativenumber` 显示相对行号
70 | - `set cursorline` 光标所在的当前行高亮
71 | - `set cursorcolumn` 光标所在的当前列高亮
72 | - `set nocompatible` 使用 `vim` 模式,不与 `Vi` 兼容
73 | - `syntax on` 打开语法高亮
74 | - `set showmode` 在底部显示,当前所处模式
75 | - `set showcmd` 命令模式下,在底部显示键入指令
76 | - `set mouse-=a` 纯键盘操作
77 | - `set encoding=utf-8` 使用 utf-8 编码
78 | - `set autoread` 硬盘文件变化后,自动读取
79 | - 把上述这些存储到 `~/.vimrc` 之后,以后这些配置就会自动起作用了
80 | - 也可以去 `github` 搜索 `.vimrc` 找到关于配置的更多信息
81 |
82 | ### 查询开关 `option` 细节
83 |
84 | - 查询某个设置的帮助可以加上单引号
85 | - `:h 'number'` 可以查找 `number` 相关的设定
86 | - `:h 'mouse'` 可以查找 `mouse` 相关的设定
87 | - `:h 'autoread'` 可以查找 `autoread` 相关的设定
88 |
89 | 
90 |
91 | ### 最终的设定
92 |
93 | - `set statusline=%-040.40(%F%m%)%-030.30([%l,%c]%)%p%%`
94 | - `set laststatus=2`
95 | - `set ruler`
96 | - `set number`
97 | - `set showcmd`
98 | - `set nocompatible`
99 | - `set showmode`
100 | - `set history=100`
101 |
102 | - 你能把他们的含义都说清楚吗?🤪
103 |
104 | ## 总结
105 |
106 | - 找到配置文件的位置 `~/.vimrc`
107 | - 了解各种配置开关
108 | - 修改配置文件并应用
109 | - 不过这个颜色究竟是怎么配置的呢?🤔
110 | - 下次再说 👋
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
--------------------------------------------------------------------------------
/markdown/95-548427-新插件平台_coc.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 插件管理器coc
8 |
9 | ## 回忆
10 |
11 | - 上次了解了nerdtree
12 | - 老牌的资源管理器
13 | - 但是好像好久不更新了
14 | - 有什么替代品么?
15 |
16 | 
17 |
18 | - 好像是一个叫做coc-explorer的东西
19 | - 那是个啥?
20 |
21 | ### 分析
22 |
23 | 
24 |
25 | - 找到仓库
26 |
27 | 
28 |
29 | - 这个coc-explore又基于coc
30 |
31 | 
32 |
33 | ### 插件平台
34 |
35 | 
36 |
37 | - 这样好像是个插件平台
38 | - 我们选择编译安装
39 |
40 | 
41 |
42 | ### 安装
43 |
44 | 
45 |
46 | - 先保存并运行 ~/.vimrc
47 | - 如果提示报错了的话
48 | - 先新建文件夹
49 | - mkdir -p ~/.vim/plugged
50 |
51 | 
52 |
53 | ### 查看状态
54 | - PlugStatus
55 |
56 | 
57 |
58 | - 这样就装上了coc这个插件平台
59 | - 首先可以进行一些默认配置
60 |
61 |
62 | ### 配置
63 |
64 | 
65 |
66 | - 把README中的推荐配置
67 | - 粘贴到~/.vimrc结尾
68 | - 然后又应该如何安装插件呢?
69 |
70 | ### 运行配置
71 |
72 | 
73 |
74 | - 左边会加一个侧边栏
75 |
76 | ### 安装插件
77 |
78 | - `:q` 先退出左边这个浮动窗口
79 | - `:CocInstall coc-json`
80 | - 安装json插件
81 |
82 | 
83 |
84 | ### 找到插件位置
85 |
86 | 
87 |
88 | - 我们写一个json
89 |
90 | ### 报错
91 |
92 | - 写一个错误的json
93 |
94 | 
95 |
96 | - 他会报错
97 | - 报错文本如果看不清楚的话
98 | - 在~/.vimrc中
99 | - :highlight CocErrorFloat ctermfg=White guifg=#ffffff
100 | - 除了coc-json外
101 | - coc还给各种文件格式提供
102 | - 报错
103 | - 补全
104 | - 提示
105 | - 基于vscode的lsp
106 | - 效果和vscode一致
107 |
108 | ## 总结
109 | - 我们这次研究了新插件平台Coc
110 | - Coc可以用vim-plug安装
111 | - 安装之后
112 | - 可以在Coc之上再安装各种插件
113 | - 比如coc-json
114 | - 可以进行
115 | - 报错
116 | - 补全
117 | - 提示
118 | - 各种操作
119 | - 好像真的不错?还有啥好玩的?🤔
120 | - 下次再说!👋
121 |
122 |
123 |
124 |
125 |
126 |
--------------------------------------------------------------------------------
/markdown/16-52485-行内贴靠.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 行头行尾
8 |
9 | ## 回忆上节课内容🤔
10 |
11 | 
12 |
13 | - 跳跃
14 | - 向前跳跃是 f
15 | - 向后跳跃是 F
16 | - 继续
17 | - 保持方向是 ;
18 | - 改变方向是 ,
19 | - 可以加上 `[count]` 来加速
20 | - 还有什么好玩的吗?🤔
21 |
22 | ### 动手
23 |
24 | ```bash
25 | #这次还是用无配置的方式启动
26 | vi -u NONE oeasy.java
27 | ```
28 |
29 | - `:h f` 继续查找周围的命令
30 | - f 旁边还有
31 | - t
32 | - T
33 | - 这两个是干什么用的?
34 | - 我们来看一看👀
35 |
36 | ## 查看帮助
37 |
38 | 
39 |
40 | - 含义不同
41 | - f 对应的单词是 `find` 找到
42 | - t 对应的单词是 `till` 贴靠
43 | - 位置不同
44 | - f 光标直接跳到查找的字符上
45 | - t 光标跳到查找字符的前一个字符上,贴靠着查找字符
46 |
47 | ### 试一试
48 |
49 | 
50 |
51 | - fe 是把光标移动到 `e` 上面
52 | - te 是把光标移动到 `e` 之前的字符上面
53 | - ; 还可以继续吗?
54 | - 好像不行,怎么办?
55 |
56 | ### 继续移动
57 |
58 | - 小拇指直接落在 ;
59 | - `till` 下一个 `e`
60 | - 再 l 把光标移动到 `e` 上面
61 | - 再小拇指落 ;
62 | - `till` 下一个 `e`
63 | - 在 ; 的过程中
64 | - 重复的操作仍然是 `till`
65 | - `till` 的对象仍然是 `e`
66 |
67 | 
68 |
69 | - 我们是否可以反方向 , 呢?
70 |
71 | ### 继续反向 till
72 |
73 | 
74 |
75 | - , 改变查找方向
76 | - 模式仍然是 `till` 模式
77 | - 字符仍然是 `e`
78 | - 找到左边最近的 `e` 的前一个字符的位置
79 | - 还想继续不可能
80 | - 还是因为已经到达了 `e` 的前一个字符的位置
81 | - 于是要向左到 `e`
82 | - 这样就可以继续向左查找了
83 |
84 | ### 直接反向
85 |
86 | 
87 |
88 |
89 | - T 向左进行贴靠
90 | - ; 保持方向
91 | - , 改变方向
92 | - 反向的反向就是正向
93 | - 可以反复横跳
94 |
95 | 
96 |
97 | ### 翻倍
98 |
99 | - 2 t o `till` 第2个 `o`
100 | - ; 保持查找方向不变,继续向前 `till` 下一个 `o`
101 | - , 反向 `till` 上一个 `o`
102 | - 2 ; 保持查找方向不变,向前 `till` 到第 2 个 `o`
103 | - 2 , 改变方向,`till` 第 2 个 `o`
104 |
105 | 
106 |
107 | ## 总结
108 |
109 | - 贴靠
110 | - 向前贴靠是 t
111 | - 向后贴靠是 T
112 | - 继续
113 | - 保持方向是 ;
114 | - 改变方向是 ,
115 | - 可以加上 `[count]` 来加速
116 | - 行内左右移动好像,到这里接结束了?后面还有什么呢?
117 | - 下次再说 👋
118 |
119 |
120 |
121 |
122 |
123 |
--------------------------------------------------------------------------------
/markdown/34-53112-查找进阶.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 查找进阶
8 |
9 | ## 回忆上节课内容🤔
10 |
11 | - 上次是搜索,是全文搜索
12 | - 和我们以前的行内有点像
13 | - / 正向,? 反向
14 | - n 保持方向,N 改变方向
15 | - `hls` 让搜索结果高亮
16 | - `wrapscan` 可以从头搜索
17 | - `noh` 取消本次高亮
18 |
19 | ## 实时搜索
20 |
21 | - `:set incsearch`
22 | - 实时匹配搜索输入
23 | - `:set noincsearch`
24 | - 不实时匹配搜索输入
25 |
26 | 
27 |
28 | ### 大写小写
29 |
30 | - 如果查找要忽略大小写的话
31 | - 就用 `ignorecase`
32 | - `:set ignorecase`
33 | - 简写为 `:se ic`
34 | - 取消为 `:se noic`
35 | - `:se ic` 可以和 `:set smartcase` 智慧大小写配合
36 | - 如果搜索模式里面有 `大写字母` 就完全匹配
37 | - 如果没有 `大写字母` 就忽略大小写
38 | - 还可以直接在搜索项里加开关
39 | - `/oeasy\c` 不区分大小写的 `oeasy`
40 | - `/oeasy\C` 区分大小写的 `oeasy`
41 | - 具体可以 `:h ignorecase`
42 |
43 | 
44 |
45 | ### 查找当前
46 |
47 | - 如果我们在一个单词上面的时候
48 | - 按下 *
49 | - 就是查找当前光标所在的单词
50 | - 这很适合查找某个函数名
51 | - 或者查找变量名的引用
52 | - 继续遍历搜索
53 | - n 保持方向
54 | - N 改变方向
55 | - #
56 | - 向上进行查找
57 | - *、#
58 | - 刚好是电话按键中的对称两个
59 |
60 | 
61 |
62 |
63 | ### 明确头尾的单词
64 |
65 | - 如果我查找的是 `/as`
66 | - `as` 符合要求
67 | - `ask` 符合要求
68 | - `has` 也符号要求
69 | - `oeasy` 都符合要求
70 | - 要以 `as` 为单词结尾
71 | - `/as\>`
72 | - `as` 符合
73 | - `has` 符合
74 | - 要以 `as` 为单词开头
75 | - `/\`
80 | - 只有 `as` 符合
81 |
82 | 
83 |
84 | ### 快速不按单词查找
85 |
86 | - 如果我们使用 * 的话
87 | - 是按照整个单词查找的
88 | - 比如放到 `as` 的 `a` 上
89 | - 就是说查到的一定得是个完整单词
90 | - `/\`
91 | - 如何不按照单词查找呢?
92 | - 比如放到 `as` 的 `a` 上,
93 | - g*、g#进行查找
94 | - 只要有 `as` 就算
95 | - `oeasy` 也符合要求
96 |
97 | 
98 |
99 | ### 设置 vim
100 |
101 | - 如果关于搜索高亮的这些设置你想每次打开 `vim` 就设置好
102 | - 那需要设置当前用户的vim配置文件 `vi ~/.vimrc`
103 | - G 到文件的尾部
104 | - o 在下面新建一行
105 | - `set hlsearch` 设置搜索高亮
106 | - `set wrapscan` 设置从头搜索
107 | - 然后重启这些配置就永远保存在你这个当前用户的 `vim` 里面了
108 | - 当然,如果是实验楼重启新环境的话会消失
109 |
110 | ## 总结
111 |
112 | - 实时搜索
113 | - `:set incsearch`
114 | - 大写小写
115 | - `ignorecase`
116 | - 查找当前单词
117 | - * 正向按单词完全匹配
118 | - # 反向按单词完全匹配
119 | - g* 正向不按单词匹配
120 | - g# 反向不按单词匹配
121 |
122 | - 继续查找
123 | - n保持方向
124 | - N改变方向
125 |
126 | - 这个搜索可以做一些模糊匹配吗?
127 | - 下次再说吧 👋
128 |
129 |
130 |
131 |
132 |
133 |
134 |
--------------------------------------------------------------------------------
/markdown/30-53107-屏位行号.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 屏位行号
8 |
9 | ## 回忆上节课内容🤔
10 |
11 | - 上次我们主要讲的翻页
12 | - `:set scrolloff=2` 控制上下留天留地
13 | - 上下翻页(这个最常用)
14 | - ctrl + f 向下一屏
15 | - ctrl + b 向上一屏
16 |
17 | - 上下移屏一行
18 | - ctrl + e 屏幕向上一行
19 | - ctrl + y 屏幕向下一行
20 |
21 | - 上下移屏一段
22 | - ctrl + u 向上半屏
23 | - ctrl + d 向下半屏
24 | - 移动数量和 `scroll` 相关
25 | - 上述翻页都可以用 `[count]` 翻倍
26 |
27 | ### 屏幕位置
28 |
29 | - `:h H` 可以找到在屏幕位置不动时,移动光标的办法
30 | - H - `Head` 移动到屏幕的顶端
31 | - M - `Middle` 移动到屏幕的中间
32 | - L - `Low` 移动到屏幕的底部
33 | - 会保持屏幕位置不变,把光标移动到允许的高中低位置
34 | 
35 |
36 | ### 到达底端
37 |
38 | 
39 |
40 | - L无法到底?
41 | - `:set scrolloff?`
42 | - `:set scrolloff=0`
43 | - L到底
44 |
45 | ### 计算偏移
46 | - 2 H 会移动到距离屏幕最顶端 第2行 的位置
47 | - 3 L 会移动到距离屏幕最底端 倒数第3行 的位置
48 |
49 | 
50 |
51 | ### 光标固定
52 |
53 | - `:h zt`
54 | - 可以光标保持当前位置,移动屏幕,让光标出现在顶部
55 | - z t
56 | - 出现在光标在屏幕顶部
57 | - `top`
58 | - 光标在函数名上
59 | - 直接看到函数的函数体
60 | - z z
61 | - 光标在屏幕中间
62 | - z b
63 | - 光标出现在屏幕底部
64 | - `bottom`
65 | - 光标位置受到 `scrolloff` 影响
66 | - 屏位和光标所在行还有一个小细节
67 |
68 | ### 位置细节
69 |
70 | - 下图最下面一行百分比为32%
71 |
72 | 
73 |
74 | - 在只移动光标不移动屏位的情况下
75 | - 下图最下面一行百分比为34%
76 |
77 | 
78 |
79 | - 上面两图屏位相同
80 | - 但是光标在不同的位置时ctrl-g得到的位置百分比不同
81 | - 这应该如何理解呢?
82 |
83 | ### 状态横条
84 |
85 | - 我们看一下定义
86 |
87 | 
88 |
89 | - 状态横条的百分比是当前屏位在整个文档中行的相对位置
90 | - 那我们在来看一下ctrl-g
91 |
92 | ### ctrl-g
93 |
94 | 
95 |
96 | - ctrl-g中输出的是光标所在位置在整体文件中的相对比例
97 | - 这些东西一般不会遇到
98 | - 遇到就像这样查文档就可以解决疑问
99 |
100 | ## 总结
101 |
102 | - 上次讲的翻页
103 | - 这次先让屏幕位置固定,移动光标
104 | - H - `Head` 移动到屏幕的顶端
105 | - M - `Middle` 移动到屏幕的中间
106 | - L - `Low` 移动到屏幕的底部
107 |
108 | - 然后让光标固定,移动屏幕的位置
109 | - z t - `top`
110 | - z z - 光标在屏幕中间
111 | - z b - `bottom`
112 | - 还有什么快速移动的方法吗?🤔
113 | - 下次再说 👋
114 |
115 |
116 |
117 |
118 |
119 |
120 |
--------------------------------------------------------------------------------
/markdown/08-50213-追加文本.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 追加文本
8 |
9 | ## 回忆上节课内容🤔
10 |
11 | - 我们这次深入了 i 命令
12 | - i 在当前的光标之前插入
13 | - I 在本行文本的最前面插入
14 | - 还有一些常用的编辑命令
15 | - . 重做
16 | - u 撤销
17 | - ctrl+r 还原
18 | - 关于插入,还有什么讲究吗?🤔
19 |
20 | 
21 |
22 | ### 类似的命令
23 |
24 | - 还有没有和插入相关的的命令呢??🤔
25 | - 相类似的命令一定在手册的同一个地方!🤨
26 | - 我们得还在插入命令的附近找找
27 |
28 | ## 插入命令
29 |
30 | - 首先我们找到插入命令的帮助📕
31 | - `:help insert`
32 | - 简写为 `:h i`
33 |
34 | 
35 |
36 | **我们向上翻可以找到 `a` 命令。**
37 |
38 | ## 追加文本
39 |
40 | 
41 |
42 | - `i` 和 `a` 都是 `Insert mode commands`
43 | - 插入位置
44 | - `i` 是 `before cursor` 在光标前插
45 | - `a` 是 `after cursor` 在光标后插
46 | - 对应命令
47 | - `i` 意思是 `insert`
48 | - `a` 意思是 `append`
49 |
50 | ### 切换模式
51 |
52 | - 我们可以 a 进入插入模式
53 | - esc 回到正常模式
54 | - 然后反复切换 a、esc
55 | - 观察左下角提示
56 | - 左下角有`--插入--` 就是插入模式
57 | - 左下角啥都没有就是正常模式
58 | - 这就和 i、I 很像
59 |
60 | ### 重复、撤销、重做
61 |
62 | - 我们可以 i 进入插入模式
63 | - 输入 `oeasy 空格`
64 | - ctrl+c 回到正常模式
65 | - 按几次 . 重复一下插入操作
66 | - u 可以撤销
67 | - ctrl+r 可以重做
68 |
69 | ### 练习
70 |
71 | - 如果我有个网页源文件如下图
72 | - 光标在当前绿色的位置
73 | - 如果我想在上个感叹句之后插文字,应该用什么命令呢?
74 |
75 | 
76 |
77 | - 应该用 `i`
78 | - 在当前的光标之前插入
79 | - 如果我想在整行文本之前插入呢?应该用什么?
80 | - 用 `I`
81 | - 在光标所在行文本的最前面插入
82 | - `:h I`
83 |
84 | ### 继续练习
85 |
86 | - 但如果我的光标在下图的位置呢?
87 | - 我想在叹号后面插入内容
88 |
89 | 
90 |
91 | - 这个时候应该用 `a`
92 | - `after cursor` 在光标之后所在的叹号之后插入文字
93 | - 如果我想在本行最后插入呢?
94 | - 用 `A` 在本行 **最后** 插入
95 | - `:h A`
96 | - 就像用 `I` 在本行最前面插入一样
97 |
98 | ### 追加写入
99 |
100 | - 如果我们保存了当前文件 `oeasy.log`
101 | - 然后退出了 vi
102 | - 然后重新进入 vi
103 | - 在一个未命名文件中写一些东西,比如
104 | - `oeasyo2zo3z`
105 | - `:w >> oeasy.log`
106 | - 这就是用追加的方式去写这个log文件
107 | - log中的东西还都有
108 | - 最新的追加在最后
109 | - 与 `:w oeasy.log` 对比
110 | - `:w oeasy` 是覆盖写入
111 | - `>>` 意味着追加写入
112 | - 试试追加
113 | - 我们可以新建一个
114 | - 然后追加一些东西写入`oeasy.txt`
115 | - 然后我们看看这个`oeasy.txt`
116 | - 是不是写进去了
117 |
118 | ## 总结
119 |
120 | - 除了 `i`、`I` 在前面插入文本之外
121 | - 我们了解到 `a`、`A` 可以在行末插入文本
122 | - `a` 也可以从正常模式切换到插入模式
123 |
124 | 
125 |
126 | - `a` 插在光标之后
127 | - `A` 插在本行最后
128 | - 关于插入,还玩点儿什么吗?🤔
129 | - 我们下次再说!👋
--------------------------------------------------------------------------------
/markdown/07-50211-从头插入.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 从头插入
8 |
9 | ## 回忆上节课内容🤔
10 |
11 | - 上次我们学会了另存为命令 `: saveas {file}`
12 | - 还有这个直接保存命令 `: w`
13 | - 真的可以把修改存了 😀
14 |
15 | 
16 |
17 | **下面我们来研究插入命令的细节。**
18 |
19 | ## 插入命令
20 |
21 | - 首先我们可以查询这个插入命令的帮助📕
22 | - `:help insert`
23 | - 简写为 `:h i`
24 |
25 | 
26 |
27 | - 我们可以看到小写 `i` 是在当前光标的前面插入
28 |
29 | ### 切换模式
30 |
31 | - 我们可以 i 进入插入模式
32 | - esc 回到正常模式
33 | - 然后反复切换
34 | - 观察状态栏下面的提示
35 | - `--插入--` 就是插入模式
36 | - 啥都没有就是正常模式
37 |
38 | ### 重复插入
39 |
40 | - 我们可以先点击 i 进入插入模式
41 | - 输入 `oeasy 空格`
42 | - ctrl+c 回到正常模式
43 | - 在正常模式下,按下 . 可以重复刚才的操作
44 | - 再按下 . 可以再重复刚才的操作
45 | - 还按下 . 可以还重复刚才的操作
46 | - 这个 . 是什么意思
47 | - `:h .`
48 |
49 | 
50 |
51 | ### 撤销插入
52 |
53 | - 在正常状态下按下u可撤销操作
54 | - 按一次u撤销一步
55 | - 再按u再撤销
56 | - 还按u还撤销
57 | - 一直u按到头,就撤销到头
58 | - 查询帮助
59 | - `:h u`
60 |
61 | 
62 |
63 | - 撤销了之后又反悔了可以么?
64 |
65 | ### 重做
66 |
67 | - 反悔是重做
68 | - 就在 `u` 的帮助下面有介绍
69 | - ctrl+r
70 | - 在正常状态下按 ctrl+r 可撤销撤销操作
71 | - 就是重做
72 | - 按一次 u 撤销一步
73 | - 再 ctrl+r 再撤销撤销
74 | - 按一次 u 撤销一步
75 | - 再 ctrl+r 再撤销撤销
76 | - 好像可以来回来去拉锯
77 |
78 | ## 在前方插入
79 |
80 | - 比如我们的光标当前所在的位置,在 `用` 字的位置
81 | - 按下 i 进入到插入模式
82 | - 然后就在绿色的光标前面插入字符
83 | - 这就是所谓的 `before cursor` 的意思
84 | - 就是插在光标之前
85 |
86 | 
87 |
88 | - 帮助手册怎么说的呢?
89 |
90 | ### 帮助手册
91 |
92 | - `:h i` 可以查询帮助手册
93 |
94 | 
95 |
96 | - 周围还有些什么呢?
97 |
98 | ### 插在最前面
99 |
100 | - 在 `:h i` 帮助的周围可以有命令 `I`
101 | - 如果我们使用大写的 `I`,不管你的光标在什么位置
102 | - 插入位置在光标所在行所有文本的 **最** 前面
103 | - 然后切换到插入模式
104 |
105 | 
106 |
107 | - 但是如果我想要在 `最最` 前面插入呢?
108 |
109 | ### 在第一列插入
110 |
111 | 
112 |
113 | - 这就是各种从头插入的方式
114 | - 我们来总结一下
115 |
116 | ## 总结
117 |
118 | - 我们这次深入了 i 命令
119 | - i 在当前的光标之前插入
120 | - I 在本行文本的最前面插入
121 | - 还有一些常用的编辑命令
122 | - . 重做
123 | - u 撤销
124 | - ctrl+r 还原
125 | - 关于插入,还有什么讲究吗?🤔
126 | - 我们下次再说!👋
--------------------------------------------------------------------------------
/markdown/33-53108-查找文本.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 文字区块
8 | ## 回忆上节课内容🤔
9 | - 括号间跳转
10 | - 成对括号间跳转 `%`
11 | - 不成对括号间跳转
12 | - `[(` 跳转到上一个没配对的 `(`
13 | - `])` 跳转到下一个没配对的 `)`
14 | - `[{` 跳转到上一个没配对的 `{`
15 | - `[}` 跳转到下一个没配对的 `}`
16 |
17 | - 函数间跳转
18 | - `]m` 下一个函数开头
19 | - `[m` 上一个函数结尾
20 | - `]M` 下一个函数开头
21 | - `[M` 上一个函数结尾
22 | - `#if`、`#else`、`#endif` 没有配对的
23 | - `[#` 上一个没有配对的 `#if`、`#else`
24 | - `]#` 下一个没有配对的 `#else`、`#endif`
25 |
26 | - 注释的头尾
27 | - `[/`、`[*`上一个注释`/* .... */` 的头
28 | - `]*`、`]/`下一个注释`/* .... */` 的头
29 |
30 | - 这次我想自定义跳转,就是查找某些东西
31 |
32 | ## 查找帮助
33 |
34 | - 用无模式打开 `tomsawyer.txt`
35 | - `vi -u NONE tomsawyer.txt`
36 | - 开启行号 `:se nu`
37 | - 按下 /
38 | - 会在左下角显示
39 | - 就像 `:` 等待输入命令一样
40 | - 输入待搜索字符串
41 | - `/TOM` 会从光标位置向后查找 `TOM`
42 | - 然后光标跳转到 `TOM` 的位置
43 | - 可以 `h /` 查阅手册
44 |
45 | 
46 |
47 | ### 设置高亮
48 |
49 | - 设置高亮开关
50 | - `:set hlsearch`
51 | - 简写为 `:set hls`
52 | - 可以看到查找的单词已经高亮显示出来
53 | - 设置高亮色
54 | - `:hi Search ctermbg=red ctermfg=black` 注意大小写
55 | - `/TOM` 再次搜索 `TOM`
56 | - 搜索结果会高亮显示
57 | - 可以使用 `:h 'hls'` 查找搜索高亮手册
58 |
59 | 
60 |
61 | ### 取消高亮
62 |
63 | - 如果你看到高亮显示太乱
64 | - 你可以反过来设置一下
65 | - `:set nohlsearch` 把搜索高亮的开关关掉
66 | - 当然下次你要想显示的话
67 | - 就需要再次打开开关 `:set hls`
68 | - 如果你只想要眼下这把关了高亮
69 | - 下次搜索的时候还是高亮的话
70 | - `:noh[lsearch]`
71 | - 注意这是执行一个命令,而不是设置一个开关
72 |
73 | 
74 |
75 | ### 正向反向
76 | - 遍历匹配
77 | - n 下一个匹配项
78 | - N 上一个匹配项
79 | - n、N 可使用 `count` 翻倍
80 | - `:h n` 查阅相关手册
81 | - 一路 n
82 | - 可以显示查阅到文档结尾
83 | - 如果想要重头查询的话
84 | - 需要设置 `:set wrapscan`
85 | - 这样就可以重头开始再查一次了
86 | - `w[rap]s[can]` 可以简写为 `ws`
87 | - 关掉开关用 `:set now[rap]s[can]` 可以简写为 `:set nows`
88 |
89 | 
90 |
91 | ### 反向查询
92 |
93 | - 使用 ? 可以反向查询单词
94 | - 比如 `?TOM` 就可以从后往前查询 `TOM`
95 | - 遍历匹配
96 | - n 保持方向,从下往上查询下一个
97 | - N 改变方向,从上往下查询下一个
98 | - 如果用 `?TOM` 配合 N 就是往前查找
99 | - 因为负负得正?🤪
100 | - 到头了 `wrapscan` 让他可以从头再来
101 |
102 | ### 回顾行内搜索
103 | - 总结行内搜索规律
104 | - f 正向,F 反向
105 | - t 正向,T 反向
106 | - ; 保持方向,, 改变方向
107 | - `[count]` 可翻倍
108 |
109 | ## 总结
110 |
111 | - 这次是搜索
112 | - / 正向,? 反向
113 | - n 保持方向,N 改变方向
114 | - `hls` 让搜索结果高亮
115 | - `noh` 取消本次高亮
116 | - `wrapscan` 可以从头搜索
117 | - 查找还有什么好玩的呢?
118 | - 下次再说 👋
119 |
120 |
121 |
122 |
123 |
124 |
125 |
--------------------------------------------------------------------------------
/markdown/02-50041-使用帮助.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 使用帮助🥊
8 |
9 | ## 回忆上节课内容
10 |
11 | - 更新和运行 vim
12 | - 进入和退出 vim
13 | - 存活了下来
14 | - 从中我们知道 vim 有两种模式:正常模式(Normal mode)和命令行模式 (Command-Line mode)
15 | - 为了您能更好在 `vim` 中生存,必须给您更强大的工具🔧 -- 帮助手册
16 | - vim 有没有可以用的帮助系统呢
17 |
18 | ```bash
19 | #首先进入vim
20 | vim
21 | ```
22 |
23 | ### 使用帮助文件📕
24 |
25 | - 进入 `vim` 之后,我们面对的是正常模式
26 | - 输入半角 : 进入 `命令行` 模式
27 | - 什么不会,就 `:help` 什么
28 | - 比如说 `:qa` 不会
29 | - 就 `:help` 这个 `:qa`
30 | - 输入 `:help :qa`
31 | - `:help` 的对象是 `:qa`,中间留了一个空格
32 | - 回车 之后执行命令
33 |
34 | 
35 |
36 | - 我们查到 `:qa[ll]` 就是退出全部窗口
37 | - 方括号中的内容可以省略
38 | - 当前其实我只有一个窗口
39 | - 我可以直接把a也省略了么?
40 | - 也就是说
41 | - 可以用 `:q` 这种简写形式来退出么?
42 | ### 尝试
43 |
44 | - `:h :q` 查询 关于 `:q` 的帮助
45 |
46 | 
47 |
48 | - 可以用 `:q` 先退出当前帮助📕
49 | - 再用 `:q` 退出 vim
50 | - 注意输入 `:` 的时候
51 | - 左手的小拇指先按下Shift
52 | - 右手的小拇指再按一下;
53 | - 左手小拇指抬起
54 | - 记住这个手法
55 | - 多练几次
56 |
57 | ### 查看一下关于 :help 自己的帮助
58 |
59 | - 我们上次 `:help` 了 `:quit`
60 | - `:help :quit` 可以查询什么是 `:quit`
61 | - 原则就是
62 | - 什么不会,就 `:help` 什么
63 | - 那么 `:help` 本身不会怎么办呢?
64 | - 什么不会就 `:help` 什么
65 | - `:help` 不会就 `:help :help`
66 | - `:help :help` 可以查询 `:help` 自己的帮助
67 |
68 | 
69 |
70 | - `:help` 完整写法位为 `:h[elp]`
71 | - 中括号里面的东西是可以省略的
72 | - 可以简写为 `:h`
73 | - 我们可以 `:q` 退出帮助
74 | - 然后 `:h` 再进入帮助
75 | - `:help :help` 可以简写为 `:h :h`
76 | - 那我能问问关于正常模式 `(Normal mode)` 的事情吗?🤔
77 | - 行动起来!!!👊
78 |
79 | ### 查看关于模式的帮助
80 |
81 | - `vim` 是有状态的编辑器 `(modal editor)`
82 | - 所处的状态不同
83 | - 进行同样键盘录入
84 | - 具体执行的效果不同
85 |
86 | ```bash
87 | #使用 help 查询帮助
88 | :help Normal
89 | #或者把 help 简写成 h
90 | :h Normal
91 | ```
92 |
93 | 
94 |
95 | ### 我们可以看到 vim 总共有 6 种基本模式
96 |
97 | - 正常模式 `(Normal mode) `
98 | - 也叫默认模式。
99 | - 进入 `vim` 时默认的模式所有输入的键都直接对应着命令
100 | - 也被叫做命令模式.
101 | - 插入模式 `(Insert mode)`
102 | - 任何键盘录入都会插入到当前文档中
103 | - 可视模式 `(Visual mode)`
104 | - 很像正常模式
105 | - 但是移动命令会改变选中的一块高亮区域
106 | - 执行的命令会对选定范围进行
107 | - 选择模式 `(Select mode)`
108 | - 可以用鼠标或光标键高亮选择文本
109 | - 任何输入都会替换选择的高亮文本
110 | - 并进入插入模式
111 | - 命令行模式 `(Command-Line mode)`
112 | - 可以窗口下方执行一条命令
113 | - 一般是通过 : 执行单行命令
114 | - 通过 / 和 ? 进行搜索
115 | - Ex mode `(多行命令执行模式)`
116 | - `Ex` 指的是 `Execute`
117 | - 在 `Normal` 正常模式下使用 gQ 进入
118 | - 使用 `:visual` 退出
119 |
120 | ## 总结
121 |
122 | #### 我们这次了解了基本的帮助操作
123 |
124 | - 什么不会就 `:help` 什么
125 | - `:help` 命令有两种写法
126 | - 完整 `:help`
127 | - 简写 `:h`
128 | - `vim` 有六种基本模式
129 | - 我们现在还没有写过文件呢呀,怎么写呢?🤔
130 | - 还得下次再说!👋
131 |
--------------------------------------------------------------------------------
/markdown/18-52611-跳到某行.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 跳到某行
8 |
9 | ## 回忆上节课内容🤔
10 |
11 | - 上下行
12 | - 向 `下` 是 j👇
13 | - 向 `上` 是 k👆
14 | - 上下行首
15 | - 向 `下` 到行首非空字符 +
16 | - 向 `上` 到行首非空字符 -
17 | - 这些 `motion` 都可以加上 `[count]` 来翻倍
18 | - 首尾行
19 | - 首行是 g g
20 | - 尾行是 G
21 | - g g = G 是全部自动缩进
22 | - G 好像还有其他用法?
23 | - 什么用法呢?
24 | - 先用 `无配置` 的 `vi` 打开 `oeasy.java`
25 |
26 | ## 直接跳转到某行
27 |
28 | 
29 |
30 | - 直接跳到某行Goto Line
31 | - 2 G 跳到第`2`行
32 | - 3G 跳到第`3`行
33 | - 4G 跳到第`4`行
34 | - gg 跳到第`1`行
35 | - G 跳到最后一行
36 | - 这个真的很方便
37 | - 尤其编译报错某行出问题的时候
38 | - 直接就 `Goto` 过去了
39 | - 如果行数多了
40 | - 怎么才能使到我要去第几行呢?
41 | - 这就需要显示行号
42 |
43 | ### 显示行号
44 |
45 | - `:set number` 是显示行号
46 | - `:set` 是命令,可以设置各种属性
47 | - `number` 是 `:set` 的参数option
48 | - 是一个负责显示行号的开关属性
49 | - 我们可以通过 `:h :set` 来查看各种属性
50 | - 这些帮助手册都在 `options.txt` 中
51 |
52 | 
53 |
54 | - 我们不但可以打开 `number` 开关
55 | - `:set number` 打开 `number`开关
56 | - 显示行号
57 | - 也可以关闭`number`开关
58 | - `number` 前面加上 `no` 代表关闭该开关
59 | - `:set nonumber` 关闭 `number`,不显示行号
60 | - 简写
61 | - `:se[t] nu[mber]` 可简写为 `:se nu`
62 | - `:se[t] nonu[mber]` 可简写为 `se nonu`
63 |
64 | ### 显示相对行号
65 |
66 | - 我们不但可以显示绝对的行号
67 | - 也可以显示相对的行号
68 | - 也在 `options.txt` 这文件里
69 | - 这个开关叫做 `relativenumber`
70 | - 相对行号
71 | - `:set relativenumber`
72 |
73 | 
74 |
75 | - 可以看到当前光标位置对应 `0` 行
76 | - 向上👆的行号是从当前行行计算的
77 | - 向下👇的行号也是从当前行计算的
78 | - 这样上下运动就会更精确一点
79 | - `4j` 就能知道光标落在下面标 `4` 的那行
80 | - `5k` 就能知道光标落在上面标 `5` 的那行
81 | - 如果我同时设置 `se nu` 会如何呢?
82 | - 当前行显示绝对行号,上下部分显示相对行号
83 | - 相对行号简写
84 | - `set relativenumber` 简写为 `se rnu`
85 | - `set norelativenumber` 简写为 `se nornu`
86 |
87 | ### 行命令模式跳转
88 |
89 | 
90 |
91 | - 我们还可以使用行命令的模式跳转
92 | - `:30` 跳到第 `30` 行
93 | - `:40` 跳到第 `40` 行
94 | - `:40` 跳到第 `50` 行
95 | - `:6000000` 跳到结尾,如果整篇文字没有 `6000000` 行的话
96 | - 如何知道当前文件有多少行呢?
97 | - 还记得 `:f[ile]` 吗?
98 | - 快捷键是 ctrl g
99 |
100 | ### 显示位置
101 |
102 | 
103 |
104 | - 我们可以通过ctrl g看到:
105 | - 文件名
106 | - 当前行号
107 | - 总行数
108 | - 当前位置百分比
109 | - 当前列位置
110 |
111 | ## 总结
112 |
113 | - 跳转到第200行
114 | - `200G`
115 | - 设置行号选项
116 | - 显示行号 `:se nu`
117 | - 显示相对行号 `:se rnu`
118 | - 如何用命令行跳转 `:100`
119 | - 但是我如何有的时候记不住到底跳到多少行
120 | - 能否做个标记留个记号呢?
121 | - 下次再说 👋
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
--------------------------------------------------------------------------------
/markdown/47-81025-使用标记.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 使用标记
8 |
9 | ## 回忆上节课内容🤔
10 | - 有了这个`range`、`address`我们可以做很多事情
11 | - 跳转`:44`
12 | - 复制和剪切
13 | - `1,3d`
14 | - `3,$y`
15 | - `%d o`
16 | - 配合搜索
17 | - `/oeasy/,$y`
18 | - `5;/oeasy/d`
19 | - 其实还有一种`address`
20 | - 是 `mark` 标记
21 | - 还记得 `mark`标记 是什么意思?🤔
22 |
23 | ### 查看手册📕
24 | - `:h mark` 可以查看相应的细节
25 |
26 | 
27 |
28 | - 我们可以使用m来定义一个标记
29 | - 比如我们在第 `3` 行 ma
30 | - 我们就在 第 `3` 行 标记了一个 `mark` 叫做 `a`
31 | - 这个标记能看见么?
32 |
33 | ### 查看标记
34 | - 我们用`:marks`
35 | - 就可以看到里面有了一个新`mark`
36 | - 名字叫做`a`
37 | - 注意这个`a`包括
38 | - 行、列坐标
39 | - 还有具体文本
40 |
41 | 
42 |
43 | ### 查看具体标记
44 | - `:marks abc`
45 | - 查看具体abc这三个mark
46 |
47 | 
48 |
49 | ### 跳转到引用
50 |
51 | - ma
52 | - 定义了一个名字叫 `a` 的 `mark`
53 | - 'a
54 | - 可以将光标从任意位置跳转到 标记`a`
55 | - 注意
56 | - 单引号是跳转到标记
57 | - 寄存器是放在后面的
58 | - 这个也可以配合行命令来操作
59 |
60 | 
61 |
62 | - `'ay` 就是把`a`标记那行,放入默认寄存器
63 | - 可以用`:reg`查看
64 | - `'a,'b`就是把从`a`标记那行,到`b`标记那行
65 | - `'a,'b` 相当于 `3,5` 是 {range}
66 | - 如果我想使用标记
67 | - 也想使用寄存器怎么办?
68 |
69 | ### 单双引号
70 | - `:'a,'by"o`
71 | - `'a,'b` 是 {range}
72 | - `y` 是 yank复制
73 | - `o` 是指定的寄存器
74 |
75 | 
76 |
77 | - 如下是寄存器情况
78 |
79 | 
80 |
81 | - `^J` 是换行的标记
82 |
83 | ### 操控marks
84 |
85 | 
86 |
87 | - `marks`不可见,但是可以存储文件信息
88 | - 小写字母`ma`
89 | - 用于当前文件 `内部`
90 | - 大写字母`mA`
91 | - 可以 `跨文件` 定义 `marks`
92 | - `0-9` 的数字标记
93 | - 可以预先放到`~/.viminfo`的配置文件中
94 | - 可以查看指定的标记`:marks a`
95 | - 也可以删除标记
96 | - `:delm(arks) a`
97 | - 甚至清空所有标记,`:delm(arks)!`
98 |
99 | ### 常用标记
100 |
101 | - `'[ `上一次修改或复制的第一行或第一个字符
102 | - `'] ` 上一次修改或复制的最后一行或最后一个字符
103 | - `'< ` 上一次在可视模式下选取的第一行或第一个字符
104 | - `'> ` 上一次在可视模式下选取的最后一行或最后一个字符
105 | - `''` 上一次跳转之前的光标位置
106 | - `'"` 上一次关闭当前缓冲区时的光标位置
107 | - `'^` 上一次插入字符后的光标位置
108 | - `'.` 上一次修改文本后的光标位置
109 | - `'(` 当前句子的开头
110 | - `')` 当前句子的结尾
111 | - `'{` 当前段落的开头
112 | - `'}` 当前段落的结尾
113 |
114 | ## 总结
115 | - 我们这次研究了`mark`的定义和使用
116 | - `mb`定义
117 | - `'b`跳转
118 | - 可以对`marks`查询
119 | - `:delm(arks)!` 删除
120 | - 三种`marks`
121 | - 小写 本文件内
122 | - 大写 跨文件
123 | - 数字 配置文件中
124 | - 可以在命令行中,使用标记
125 | - `'a,'by`从标记a的行复制到标记b的行
126 | - `'a,'bt.`把从a到b的行复制当前行的下方
127 | - `'a,'bm$`把从a到b的行移动到文档最后
128 | - 命令行模式可真是太方便了!
129 | - 可是,你知道吗?
130 | - 命令行模式来自于ed
131 | - 本是当时的无奈之举?
132 | - 怎么回事?🤔
133 | - 下次再说 👋
134 |
135 |
136 |
137 |
138 |
139 |
140 |
--------------------------------------------------------------------------------
/markdown/19-79636-使用标记.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 使用标记
8 |
9 | #### 回忆上节课内容🤔
10 |
11 | - 跳转到行号
12 | - `200G`
13 | - 设置行号选项
14 | - 显示行号 `:se nu`
15 | - 显示相对行号 `:se rnu`
16 | - 如何用命令行跳转 `:100`
17 | - 但是我如何有的时候记不住到底跳到多少行
18 | - 能否做个标记留个记号呢?
19 |
20 |
21 | ## 跳回原地
22 |
23 | - 如果我使用 G 跳转到最终行
24 | - 然后我想要回到跳转之前的位置
25 | - 不只是 G 对应的跳转包
26 | - 还括行跳转、搜索等
27 | - 那这个跳前位置在哪里呢?
28 | - 我们可以使用 **``** 回到跳转之前的位置
29 | - ` 位置在键盘 **1** 前面
30 | - 这个字符就是我们的反引号
31 | - 叫做 `open single quote chararcter`
32 | - 可以试着玩玩
33 | - 跳过来再跳过去
34 | - 反复横跳
35 | - 但是这个只能在两个位置之间来回来去的跳
36 |
37 | 
38 |
39 | - 我想要跳到更久之前的位置
40 | - 怎么办呢?
41 |
42 | ### 跳转列表
43 |
44 | - 所有曾经的跳转都在跳转列表里面
45 | - 比如我们从
46 | - 第一行跳到 `33` 行
47 | - 然后再跳到以 ^The 开头的行
48 |
49 | 
50 |
51 | - ctrl-o 跳转到
52 | - Older position
53 | - 上一次
54 | - 上一次的上一次
55 | - ctrl-i跳转到
56 | - 下一次
57 | - 下一次的下一次
58 |
59 | 
60 |
61 | - 这里跳转的位置我们使用了 `标记 mark`
62 |
63 | ## 查询帮助
64 |
65 | 
66 |
67 | - 使用 `h(elp) m(arks)` 查询关于标记的帮助
68 | - 可以使用 `ma` 来做一个标记 `a`
69 | - 然后可以用 `'a` 或者 `` `a `` 进行跳转
70 |
71 | ### 进行定义并进行试验
72 |
73 | - `:se nu` 设置显示行号
74 | - 使用 `ma` 把当前光标的位置做一个标记 `a`
75 | - 然后 G 跳转到最终行
76 | - 这个标记你在文档里面看不见
77 | - `:marks` 来查看所有标记
78 | - 注意这个 mark 都是包含行和列的具体位置的
79 | - a 对应795行 6列
80 |
81 | 
82 |
83 | ### 其他标记
84 |
85 | - `ma` 是我们自己定义的 `a` 标记
86 | - 其他的标记是什么意思呢?
87 | - 我们可以用 `:h ''` 来看 `''` 的含义
88 |
89 | 
90 |
91 | # 更多标记
92 |
93 | - `''` 是上次跳转操作光标所在的位置
94 | - `'"` 是上次退出当前文件的位置
95 | - `'[` 是上次编辑(删除修改等)的开始位置
96 | - `']` 是上次编辑(删除修改等)的结束位置
97 | - `'.` 是上次编辑(删除修改等)的最后的操作位置
98 |
99 | 
100 |
101 | - 那么,这个大写、小写、数字的标记有什么不同呢?
102 |
103 | ### 标记细节
104 |
105 | 
106 |
107 | - 小写 `a-z` 可以标记本文件内部的位置坐标
108 | - 大写 `A-Z` 可以跨文件标记位置坐标
109 | - 数字 `0-9` 在配置文件 `.viminfo` 中,可以保留标记
110 | - 我们还可以用 `:delm(arks) a` 来删除 `a` 标记
111 |
112 | ## 总结
113 | - 定义标记 a `ma`
114 | - 删除标记 a `:delm a`
115 | - 跳转到标记 a `'a`
116 | - `a 跳到 a 对应的行和列
117 | - 'a 跳到 a 对应的行
118 | - 查看所有标记 `:marks`
119 | - 各种标记类型
120 | - `''` 是上次跳转操作光标所在的位置
121 | - `'"` 是上次退出当前文件的位置
122 | - `'[` 是上次编辑(删除修改等)的开始位置
123 | - `']` 是上次编辑(删除修改等)的结束位置
124 | - 小写 `a-z` 可以标记本文件内部的位置坐标
125 | - 大写 `A-Z` 可以跨文件标记位置坐标
126 | - 数字 `0-9` 在配置文件 `~/.viminfo` 中,可以保留标记
127 | - 每次都需要 ctrl + g 显示坐标
128 | - 能否一直显示坐标呢?
129 | - 下次再说 👋
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
--------------------------------------------------------------------------------
/markdown/81-182652-宏_macro.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 宏 macro
8 |
9 | ## 回忆
10 |
11 | - 这次我们了解了编码格式
12 | - 屏幕显示的encoding
13 | - 文件保存的fileencoding
14 | - 不能搞乱了
15 | - 一般用什么编的就用什么解
16 | - 解铃还须系铃人
17 | - 打开不正确的话,就要切到正确的上面
18 | - 保存成任何自己想要的编码方式
19 | - vim还有什么能帮助我们快速操作的方法么?🤔
20 |
21 | ### 建立环境
22 |
23 | - `vi oeasy.c`
24 | - 输入以下内容
25 |
26 | 
27 |
28 | ### 录制宏macro
29 | - `qa`
30 | - 录制叫做`a`的宏
31 |
32 | 
33 |
34 | - 这个记录中 @a 就录制进了vim的宏库
35 | - 可以随时调用录制完成的宏
36 | - 比如
37 | - I#include "
38 | - 在本行前面插入内容
39 | - q
40 | - 结束录制
41 |
42 | - 划重点
43 | - qa 开始录制宏
44 | - q 结束录制宏
45 | - 录制了宏之后怎么应用呢?
46 |
47 | ### 应用宏macro @
48 | - @a
49 | - 在本行应用这个宏
50 | - 2@a
51 | - 应用这个macro宏a两次
52 | - uuuu
53 | - 撤销4次
54 | - 4@a
55 | - 应用这个marcro宏a4次
56 |
57 | - 划重点
58 | - qa 开始录制宏
59 | - q 结束录制宏
60 | - @a 应用宏
61 | - 我们做一个复杂点的
62 |
63 |
64 | ### 复杂的宏
65 |
66 | - I#inclcude "^[A"^[j
67 | - I#include " 在行头插入引用头
68 | - `^[`就是esc 从插入模式到正常模式
69 | - A" 在结尾处插入引号
70 | - `^[`就是esc 从插入模式到正常模式
71 | - j跳转到下一行
72 |
73 | - 然后来两行.h的库
74 |
75 | 
76 |
77 | - `2@a`
78 | - 执行两次a宏
79 | - 执行结果如下
80 |
81 | 
82 |
83 | - 我可以看看宏长什么样子么?
84 |
85 | ### 查看宏macro
86 | - `:reg`
87 |
88 | 
89 |
90 | - "a寄存器里面就是macro宏a的内容
91 | - `^[`就是esc
92 | - 不过好像这里面可以进行修改
93 |
94 | ### 修改宏macro
95 |
96 | - 到最底下找一个空地
97 | - "ap把a寄存器里面的东西粘贴出来
98 | - 进行修改
99 |
100 | 
101 |
102 | - `"byy`
103 | - 再把本行复制到b寄存器
104 | - 一路u撤销到一个合适的位置
105 | - `@b`
106 | - 执行宏b一次
107 | - 好像仍然是好使的
108 | - `3@b`
109 | - 执行b宏3次
110 |
111 | ### 宏的直接赋值
112 |
113 | - `:let @z = @a`
114 | - 这样就可以直接把a寄存器里面的东西直接给z寄存器
115 | - 也就相当于宏的赋值
116 | - `:reg`也可以看到宏z赋值之后的状态
117 |
118 | ### 追加寄存器
119 |
120 | 
121 |
122 | - qA
123 | - 追加录制a宏
124 | - kA//this is lib.^[jq
125 | - k 向上一行
126 | - A 在本行尾部追加
127 | - //this is lib 写下注释
128 | - ^[ 退出插入模式
129 | - j 向下一行
130 | - q结束录制
131 | - 追加的内容会追加到a宏里面
132 |
133 | 
134 |
135 |
136 | ### 优化宏
137 |
138 | - 这里有个jk先向下再向上
139 |
140 | 
141 |
142 | - 可以先粘贴出来然后修改
143 | - 最后再复制到a寄存器
144 | - "ayy
145 | - 相当于优化了宏
146 |
147 | ## 总结
148 |
149 | - 关于宏,这次有4个要点
150 | - qa 开始录制宏
151 | - q 结束录制宏
152 | - @a 应用宏
153 | - qA 追加录制宏
154 | - 甚至可以编辑宏
155 | - "ap 把宏作为文本粘贴出来
156 | - 编辑之后
157 | - "ayy把新的宏装在进入a寄存器reg
158 | - 这个宏还可以怎么玩呢?🤔
159 | - 下次再说!
160 |
161 |
162 |
163 |
164 |
165 |
--------------------------------------------------------------------------------
/markdown/43-80099-替换模式.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 替换模式
8 |
9 | ## 回忆上节课内容🤔
10 |
11 | - 上次我们学到的最有用的就是c
12 | - 他和d的区别就是删除之后进入到插入模式
13 | - c可以配合`motion`
14 | - 可以用ciw来快速删除当前光标所在的单词
15 | - 可i和a 配合的文字块
16 | - `w` word 小词
17 | - `W` Word 大词
18 | - `s` sentence 句子
19 | - `p` paragraph 段落
20 | - `(` 、`)` 小括号
21 | - `[` 、`]` 中括号
22 | - `{` 、`}` 大括号
23 | - `t` tag 标签
24 | - `it` 标签内部 不包含标签
25 | - `at` 标签外部 包含标签
26 | - `"`、`'` 引号
27 | - 还有没有更快速的办法进行编辑吗?🤔
28 |
29 | ### 动手练习
30 |
31 | 
32 |
33 | - 当前光标在`e`上面,如上图
34 | - 如果我们dfo,会如何?
35 | - esc撤回来
36 | - 如果我们dto,会如何?
37 | - esc撤回来
38 | - 如果我们di{,会如何?
39 | - esc撤回来
40 | - 如果我们dFo,会如何?
41 | - esc撤回来
42 | - 如果我们d2fo,会如何?
43 | - 这些都可以试一下,玩一下?
44 | - 还有什么可以很神奇的操作吗?
45 | - 各种试试,把结果告诉我!
46 | - 这次我们要研究更快速的模式,替换模式
47 |
48 | ### 找到手册📕
49 |
50 | - 还是在`change.txt`里面上下翻,找到了r
51 | - 可以用`:h r`
52 |
53 | 
54 |
55 | - 看起来是什么不对,就直接放到那个位置
56 | - 然后 r 成想要的
57 |
58 | ### 来试一下
59 | - 可以用r来进行修改
60 |
61 | 
62 |
63 |
64 | ### 再试试
65 |
66 | - 把光标放在`oeasy`中的`a`上,模式处于普通模式
67 | - r1
68 | - 就会把原来的`a`替换为`1`
69 | - 如果要把`1`替换为一个回车换行
70 | - 就要r回车
71 | - 支持`[count]`,比如`4r2`,替换4个字符,都变成2
72 | - 就像下面这样
73 |
74 | 
75 |
76 | ### 替换模式
77 |
78 | - 这次我们来看看大写R
79 | - `:h R`
80 |
81 | 
82 |
83 | - 在正常模式下,用R进入改写模式
84 | - 可以在左下角状态栏观察到
85 | - 然后光标在`oeasy`的`a`上面
86 | - 写入`1234`
87 | - 我们看到原来的文字被替换掉了
88 |
89 | ### 大小写的改写
90 |
91 | - 我们常用的其实还有个人物
92 | - 就是改大小写
93 | - 这个是 `~`
94 | - 可以 `:h ~` 查询手册
95 |
96 | 
97 |
98 | ### tilde
99 |
100 | - 这个符号叫做~波浪号(tilde)
101 | - 把光标放在某个字符上
102 | - 摁下~
103 | - 大写变小写,小写变大写
104 | - 这个~还支持 `[count]`
105 | - 比如2~
106 | - 把两个字符都设置~
107 | - g ~ 就支持`motion`
108 | - 这个很实用
109 | - 如果设置`:set tildeop`
110 | - ~ 就支持`motion`
111 | - 比如~e
112 | - 但是单个字母的大小写修改就不管用了
113 | - 需要~l
114 | - 其实我们平时还是控制字母大写的情况多
115 | - 所以`:se notildeop`
116 |
117 | ## 总结
118 |
119 | - 这次我们学到了各种的替换模式
120 | - r,替换当前光标的字符
121 | - R,进入替换模式
122 | - ~,改变大小写
123 | - 这个东西很多,我们需要巩固一下
124 | - 下次来个综合练习吧!
125 | - 啥综合练习?🤔
126 | - 下次再说 👋
127 |
--------------------------------------------------------------------------------
/markdown/40-79930-复制粘贴.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 复制粘贴
8 |
9 | ## 回忆上节课内容🤔
10 |
11 | - 我们上次的内容是粘贴
12 | - 小写p意味着在光标下面或者后面粘贴
13 | - 大写P意味着在光标上面或者前面粘贴
14 | - `p`的意思是`放上去`,就是`put`
15 | - 把什么放上去呢?
16 | - 把 `reg` 中 `""` 的内容 放上去
17 | - 如果`reg`剪切的是一整行或者多行
18 | - 那么粘贴的时候就在当前行上面或者下面粘贴
19 | - 如果`reg`剪切的是不包含换行
20 | - 那么粘贴的时候就在当前行前面或者后面粘贴
21 | - 有了 删除d 和 粘贴p
22 | - 我们其实可以做剪切的操作了
23 | - 但是如果我想要复制粘贴
24 | - 那应该怎么办呢?🤔
25 |
26 | ### 关于复制
27 |
28 | - 复制其实就在粘贴上面一点点
29 | - 往上翻就可以找到
30 | - 命令是y
31 | - 对应的单词是 `yank`
32 | - 什么意思呢
33 | - "to pull, jerk," 1822, Scottish, of unknown origin. Related: Yanked; yanking. The noun is 1818 in sense of "sudden blow, cuff;" 1856 (American English) as "a sudden pull."
34 | - 来自于苏格兰语
35 | - 意思是猛的拉过来
36 | - 拉到哪里?
37 | - 拉到默认寄存器register `""`
38 |
39 | 
40 |
41 | ### 具体操作
42 |
43 | - 找到一行 然后进行yy操作
44 | - 观察`:reg`发现这一行已经进入了寄存器
45 | - 找到一个合适的地方p
46 | - 可以把寄存器里面的内容放到当前行下面
47 | - 再找到一个位置P
48 | - 可以把寄存器里面的内容放到当前行上面
49 | - 加上`[count]`翻倍因素
50 | - 来他个`10yy`
51 | - 再观察`:reg`
52 | - 注意换行标识符为`^J`
53 |
54 | 
55 |
56 | ### 配合移动
57 |
58 | - y之后加一个`motion`
59 | - `motion` 那一大套还是都可以用的
60 | - 我们再来重温一遍👁
61 | - 首行g g 、末行G 、第n行n G
62 | - 光标运动的方式是h j k l
63 | - 单词运动`wbe`
64 | - w 是到下一个`word`的开头
65 | - b 是到当前`word`的开头
66 | - e 是到当前`word`的结尾
67 | - 除了`word`之外还有`WORD`
68 | - 行头行尾
69 | - ^ 是到本行第一个非空字符
70 | - 0 是到本行第一个字符,不管是不是空格
71 | - g_ 是到本行最后一个非空字符
72 | - $ 跳到本行最后一个字符,即使他是空格
73 | - 行内跳跃和贴靠
74 | - 向`前`跳跃是f
75 | - 向`后`跳跃是F
76 | - 向`前`贴靠是t
77 | - 向`后`贴靠是T
78 | - 全文查找
79 | - 查找的话就是/
80 | - 反向查找的话就是?
81 | - 文本区块
82 | - {、}按段落移动
83 | - (、)按句子移动
84 |
85 | ### 具体复制
86 | - 比如我们可以
87 | - `y$`
88 | - `y4j`
89 | - `yf(`
90 | - `yt)`
91 | - `y/}`
92 | - 具体啥意思
93 | - 注意复制内容中有没有换行的区别
94 | - 其实就和d到的寄存器内容是一样的
95 |
96 | ### 跨服务器复制粘贴
97 | - 还有一种复制粘贴是跨服务器的复制粘贴
98 | - 内容在本机的系统剪贴板上
99 | - 在终端上用粘贴命令进行粘贴
100 | - 或者在一个终端上把内容选择复制到终端所在机器的系统剪切板
101 | - 然后再粘贴到别的机器上
102 | - 这个时候注意两点
103 | - `:set paste?`
104 | - 看看粘贴选项是什么
105 | - 如果缩进有问题
106 | - 那就调整一下再试
107 | - `:se nonu`
108 | - 如果把行号也复制进入去了
109 | - 那就需要取消行号显示
110 | - 如果所需要复制的东西超过终端的容量
111 | - 那就需要用scp命令远程拷贝
112 | - 可以参见oeasy教您玩转linux 000222话
113 |
114 | ## 总结
115 |
116 | - 我们这次的内容是复制
117 | - d就是把东西`delete`到寄存器里,就是剪切
118 | - y就是把东西`yank`到寄存器里,就是复制
119 | - `yank`也可以配合`motion`
120 | - 不管是`yank`、`delete`都是把东西放到默认寄存器
121 | - 到底什么是寄存器
122 | - 有什么可玩的呢?🤔
123 | - 下次再说 👋
124 |
125 |
126 |
127 |
128 |
129 |
130 |
--------------------------------------------------------------------------------
/markdown/17-52557-向上向下.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 向上向下
8 |
9 | ## 回忆上节课内容🤔
10 |
11 | - 和 `f` 相关的是跳到
12 | - 向 `前` 跳到是 f
13 | - 向 `后` 跳到是 F
14 | - 和 `t` 相关的是贴靠
15 | - 向 `前` 贴靠是 t
16 | - 向 `后` 贴靠是 T
17 | - 和 `小写` 相关的是 `向前`
18 | - `向前` 跳跃是 f
19 | - `向前` 贴靠是 t
20 | - 和 `大写` 相关的是 `向后`
21 | - `向后` 跳跃是 F
22 | - `向后` 贴靠是 T
23 |
24 | - 和继续 `查找方向` 相关的是 ;、,
25 | - `保持方向` 是 ;
26 | - `改变方向` 是 ,
27 |
28 |
29 | ### 向上向下
30 |
31 | - 本次启动的时候还是无参数模式
32 | - `:set nocompatible` 设置为不兼容 `vi`
33 | - 意思是使用 `vim`的方式处理命令
34 | - `motion` 的 `左右移动` 之后是 `上下移动`
35 | - 可以使用 回车 换行
36 | - 也可以使用方向键向上或向下
37 | - 更常见的还是 j、k,因为他们基于基本位置
38 | - j 是向下 👇
39 | - k 是向上 👆
40 | - 5 j 就是让光标向下👇 5 行
41 | - 5 k 就是让光标向上👆 5 行
42 | - 继续向下翻
43 |
44 | 
45 |
46 | ### 上下行首
47 |
48 | 
49 |
50 | - 加号 `plus` 对应 +
51 | - 对应键盘 shift + =
52 | - 减号 `minus` 对应 -
53 | - 上下行跳到行首
54 | - + 向 `下` 并且到行 `首` 非空字符
55 | - - 向 `上` 并且到行 `首` 非空字符
56 | - 对应关系
57 | - + 相当于 j ^
58 | - - 相当于 k ^
59 |
60 | ### 首行尾行
61 |
62 | 
63 |
64 | - g g 对应 `首行`
65 | - G 对应 `尾行`
66 | - 如果文章很长的话,直接跳就很方便
67 | - 一个 G 直接就到了 `Ground`
68 | - 想回开头的话可以用 g g
69 | - 不知道为什么这两个字母格外熟练
70 | - 熟练的让人心痛!
71 | - 另外还有一个组合 `Go`
72 | - 比如追加一个很长的配置文件的话 G o
73 | - `G` 直接到最后
74 | - `o` 在下面一行插入
75 | - 两个按键 `Go` 起来
76 | - ctrl+c回到正常模式
77 | - `gg` 就回开头
78 | - 重来一局
79 |
80 | ### 自动缩进
81 |
82 | - 当然也不都是痛苦回忆
83 | - g g 配 G 是我见过最方便的自动缩进方式
84 | - g g = G 从首行到尾行自动缩进
85 | - 这个文件可能有 500 行,
86 | - 但是一把就全都缩进好了
87 | - 不只是程序、网页、css、配置文件都可以自动缩紧
88 | - 这样整理代码就非常迅速了
89 | - 程序员更多的时候工作在 normal 模式
90 | - 浏览、搜索、跳跃、复制、粘贴
91 | - 真正聚焦下来写代码再切换到插入状态。
92 | - 其他编辑器永远只有一个插入状态
93 | - 其实是浪费了很多键盘功能的
94 | - 这也是 Normal 模式被称作 Normal 正常模式
95 | - 被当作默认模式的原因。
96 | - g g = G这非常爽!!!🤪
97 |
98 | 
99 |
100 | ## 总结
101 | - 上下行
102 | - 向 `下` 是 j👇
103 | - 向 `上` 是 k👆
104 | - 上下行首
105 | - 向 `下` 到行首非空字符 +
106 | - 向 `上` 到行首非空字符 -
107 | - 这些 `motion` 都可以加上 `[count]` 来翻倍
108 | - 首尾行
109 | - 首行是 g g
110 | - 尾行是 G
111 | - g g = G 是全部自动缩进
112 | - G 好像还有其他用法?
113 | - 什么用法呢?
114 | - 下次再说 👋
115 |
116 |
117 |
118 |
119 |
120 |
--------------------------------------------------------------------------------
/markdown/45-80115-按行编辑.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 按行编辑
8 |
9 | ## 回忆上节课内容🤔
10 |
11 |
12 | - 上次我们主要就是综合运用
13 | - 很好玩的,更快速的解决问题
14 | - 进行计算
15 | - ctrl+a,将具体的数字加1
16 | - ctrl+x,将具体的数字减1
17 | - 5ctrl+a,将具体的数字加5
18 | - 一次命令模式
19 | - ctrl+o
20 | - 可以进入执行一次命令
21 | - 然后回到插入模式
22 | - 这次我们进入新的领域
23 | - 命令行编辑~
24 |
25 | ### 光标的运动
26 | - 命令行是什么?
27 | - 命令行就是我们熟悉的冒号`:`
28 | - 比如`:h :`
29 | - 可以查询命令行的帮助
30 | - 在命令行上如何控制光标运动呢?
31 | - 比如已经打出了 `:oeasy o2z o3z`
32 | - 左右方向键 ⬅️、➡️️ctrl+⬅️、ctrl+➡️️按单词左右运动
34 | - shift+⬅️、shift+➡️️按单词左右运动
35 | - ctrl+b 回到命令行开头begin
36 | - ctrl+e️ 回到命令行结尾end
37 | - ctrl+w 删除光标之前的单词word
38 | - 编辑好命令之后
39 | - 命令行模式是通过最后的回车
40 | - 完成命令的输入的
41 |
42 | ### 命令行的操作
43 |
44 | - `d` 是 `normal` 模式下的删除命令
45 | - `:d` 是 `命令行` 模式下的删除命令
46 | - 关于命令行命令
47 | - 我们可以使用`:h :d`
48 | - 来观察一下d命令是如何按行进行 `删除` 的
49 |
50 | 
51 |
52 | - 我们来试试
53 | - `:d` 可以删除当前行
54 | - 帮助中这个`[range]` 是干什么用的呢?🤔
55 | - 什么不会就 `h` 什么呀!
56 | - 可以 `:h range`
57 |
58 |
59 | ### `[range]`范围
60 |
61 | 
62 |
63 | - 最常见的就是 `范围`
64 | - 比如 `1,4` 就是从第 `1-4` 行
65 | - 然后再后面加上 `d` 操作
66 | - `:1,4d` 就是 `1 - 4` 行都删除
67 | - 可以把行号列出来`:se nu`
68 | - `range` 可以复制 `yank` 吗?
69 | - 查一下帮助啊
70 |
71 | ### `[range]yank` 范围复制
72 | - `:h :y`
73 |
74 | 
75 |
76 | - `2,5y` 从 `2-5` 行都 `yank` 下来
77 | - `yank`到了什么?
78 | - 可以用 `:reg` 看一下
79 | - 如果想用制定寄存器`"a`呢?
80 | - 那就`:2,5y a`
81 | - 粘贴的时候
82 | - 就需要指定寄存器 `"ap`
83 | - 这样我们就可以快速的完成行的复制和删除
84 | - 其实还有效率更好的方法!!!
85 |
86 | ### 直接复制
87 |
88 | 
89 |
90 | - `:h :copy`可以看到相关的帮助,如上图
91 | - 更快速的写法是`:t`
92 | - `:5,8t20`可以把5-8行拷贝到第20行下面
93 | - 试一下
94 | - 这很爽
95 | - 如果我要移动到20行
96 | - 但是文本中只有10行会如何
97 |
98 | ### 范围
99 |
100 | - 移动的目标要注意范围
101 | - 同时文本中必须要存在20行的范围
102 | - 否则报错范围不存在
103 |
104 | 
105 |
106 | ### 直接剪切
107 |
108 | - `:h m`可以查询`:move`的用法
109 | - `:5,8m2`可以把5-8行移动到第2行
110 |
111 | 
112 |
113 | - 这也很爽👊
114 | - 不过前提是
115 | - 目标m{address}范围满足
116 | - 如果满足的话
117 | - 就移动到address下面
118 |
119 |
120 | ## 总结
121 |
122 | - 这次我们主要就是看看行编辑命令
123 | - `d` 是删除
124 | - `y` 是复制
125 | - 可以选择一个`[range]`范围
126 | - 然后进行相应的操作
127 | - `:11,30d`
128 | - `:2,7y`
129 | - 还可以指定寄存器
130 | - `:3,40y a`
131 | - `:"aP`
132 | - 甚至可以用一行就复制或者剪切内容
133 | - `:12,30t50`,12-30行复制到50行
134 | - `:3,6m30`,3-6行移动到30行
135 | - 这个 `[range]` 还有什么说法吗?🤔
136 | - 下次再说 👋
137 |
138 |
139 |
140 |
141 |
142 |
143 |
--------------------------------------------------------------------------------
/markdown/79-181968-操作系统文件格式_fileformat.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 文件系统换行格式 fileformat
8 |
9 | ## 回忆保留环境的细节
10 |
11 | - 上次我们了解了viminfo
12 | - 他能够保存
13 | - 命令行历史
14 | - 标记
15 | - 寄存器
16 | - 把他和 `:mksession` 一起使用就可以完美复原环境了
17 | - 还有什么是和环境相关的东西呢?🤔
18 |
19 | ### 文件系统换行格式
20 |
21 | 
22 |
23 | - 我们可以看到不同的文件系统是有不同的换行符符号的
24 | - 主要有三种
25 | - `unix` - `` - 对应0x0d
26 | - `mac` - `` - 对应0x0a
27 | - `windows` - `` - 对应0x0a0d
28 | - 系统想要解释换行符的时候
29 | - 怎么才能知道我用的到底是什么系统呢?
30 | - 我们新建并打开一个文档 `oeasy.txt`
31 |
32 | ### 文件系统格式列表 `fileformats`
33 |
34 | - 可以设定一个 `fileformats` 文件系统格式选项
35 | - 是一个字符串
36 | - vim就以此按照字符串中的系统去分析当前文档
37 | - `:set fileformats?`
38 |
39 | 
40 |
41 | ### 文件系统格式fileformat
42 |
43 | - 但是最终具体是那种文件系统格式呢?
44 | - `:set fileformat?`
45 | - 注意这个没有`s`
46 |
47 | 
48 |
49 | - 文件默认是按照unix的方式保存文件的
50 |
51 | 
52 |
53 | ### 在文件里面写上三行
54 | - 写上三行
55 | - oeasy
56 | - o2z
57 | - o3z
58 |
59 | 
60 |
61 |
62 | ### 二进制形态观察
63 | - `:%!xxd`
64 | - `%`所有的行
65 | - 强制转化为二进制形态
66 |
67 | 
68 |
69 | 我们来分析一下
70 |
71 | 
72 |
73 | - `%!xxd -r`可以变回去
74 |
75 | ### 修改字符
76 |
77 | - `:%!xxd`
78 | - 找到`6f32`这个位置
79 | - 对应着`o2`两个字符
80 | - 用r 9把`6f32`变成`6f39`
81 | - 把 `2` 变成了 `9`
82 |
83 | 
84 |
85 | - 再变回来观察
86 | - `:!xxd -r`
87 |
88 | 
89 |
90 | ### 修改系统格式
91 |
92 | - `:set fileformat=dos`
93 | - 把系统格式设置为`dos`
94 |
95 | 
96 |
97 | - `:%!xxd`
98 | - 转化成二进制形态
99 |
100 | 
101 |
102 | - 我们可以注意到这个时候换行符被解释为`0d0a`
103 | - 我们一般都是本地编辑本地看
104 | - 什么时候需要跨系统呢?
105 |
106 | ### 跨系统
107 |
108 | - 我们可能从网上下载各种各样的文件
109 | - 或者我们在linux上编辑的文件被windows系统打开之后一看
110 | - 全都没有回车
111 | - 这就很麻烦
112 | - 所以我们可以指定当前文件的系统格式
113 | - 说起来vi有个快速打开网上文件的方式
114 |
115 | ### 直接打开网络文件
116 |
117 | 
118 |
119 | - 把光标放到链接上
120 | - `gf`
121 | - 就可以gotoFile了
122 | - 下面这些协议都支持
123 | - http
124 | - ftp
125 | - scp
126 | - rcp
127 | - 回忆一下,跳转到函数定义`gd`
128 |
129 | ### 总结文件格式
130 | - 这次我们了解了文件格式
131 | - unix
132 | - dos
133 | - mac
134 | - 不同文件格式对应的换行符不同
135 | - 可以修改当前文件的文件格式
136 | - 也可以用二进制来观察
137 | - 不同文件格式下
138 | - 具体换行符的样子
139 | - 为什么'6f'就对应字母`o`?
140 | - 因为这是ascii基本的编码设定
141 | - 可中文字符又是如何编码的呢?🤔
142 | - 下次再说!✋
143 |
144 |
145 |
--------------------------------------------------------------------------------
/markdown/25-157153-更多颜色.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 更多颜色
8 |
9 | ## 回忆上节课内容🤔
10 |
11 | - 我们上次深入了配色方案
12 | - 定义了自己的配色方案 `oeasy`
13 | - 建立了自己的配色 `oeasy`
14 | - 在状态栏应用了自己的配色
15 |
16 | 
17 |
18 | ### 明确能用的颜色
19 | - 先胡乱地尝试一下修改颜色代码
20 | - `hi Normal ctermfg=1`
21 | - `hi Normal ctermfg=2`
22 | - `hi Normal ctermfg=3`
23 |
24 | - 首先看看有多少能用的颜色
25 | - `:set t_Co?`
26 |
27 | - 设置为 256 色的有颜色终端(cterm)显示模式
28 | - `:set t_Co=256`
29 |
30 | - 那么这 256 种颜色都有什么呢?
31 | - 我们尝试把他显示出来
32 |
33 | ### 显示某种颜色
34 |
35 | - 显示某种颜色
36 |
37 | ```bash
38 | echo -e "\033[48;5;1moeasy[0m"
39 | echo -e "\033[48;5;2moeasy[0m"
40 | echo -e "\033[48;5;3moeasy[0m"
41 | echo -e "\033[48;5;4moeasy[0m"
42 | echo -e "\033[48;5;5moeasy[0m"
43 | ```
44 |
45 | 
46 |
47 | ### 尝试把所有颜色遍历出来
48 |
49 | ```bash
50 | #!/bin/bash
51 | for c in {0..255}
52 | do
53 | printf "\033[48;5;"$c"m%5d\033[0m" $c
54 | done
55 | ```
56 |
57 | - 保存并运行当前程序
58 | - `:w|!sh %`
59 |
60 | 
61 |
62 | - 确实符合ansi的规则
63 | - 这不废话么?🤪
64 |
65 | ### 修改确认
66 |
67 | - `:hi Normal ctermbg=196`
68 | - `:hi Normal ctermbg=214`
69 | - `:hi Normal ctermbg=124`
70 | - 经过确认颜色基本能够对应上
71 | - 这样我们就可以使用全部256种颜色了
72 | - 哈哈哈哈
73 | - 开心😁
74 |
75 | ### 更多颜色
76 | - 当我打开了下载的color文件
77 | - 就是上上次从vimcolors.com下载的
78 | - git clone https://github.com/gryf/wombat256grf.git
79 | - 发现了这个
80 |
81 | 
82 |
83 | - 看起来我们可以使用rgb颜色编码方式!!
84 | - 怎么做的呢?看代码
85 |
86 | ### 转化过程
87 | - 需要在代码里定义从rgb颜色模式到ansi颜色模式的转化函数
88 | - 首先把rgb拆分为三个本地的分量
89 |
90 | 
91 |
92 | - 得到三个分量近似的灰阶值
93 |
94 | 
95 |
96 | - 如果三个分量相等
97 |
98 | 
99 |
100 | - 映射到相应具体的灰阶的值
101 |
102 | 
103 |
104 | - 彩色怎么办呢?
105 |
106 | ### 彩色映射
107 | 
108 |
109 | - rgb三个分量已经得到了
110 | - 得到近似颜色
111 |
112 | 
113 |
114 | - 然后再得到彩色的值
115 |
116 | 
117 |
118 | - 这样我们就可以使用rgb颜色了
119 | - 而且不论我们使不使用颜色映射
120 | - 都可以用代码当前的配色方案直接生成颜色网页
121 |
122 | ### 生成网页
123 |
124 | 
125 |
126 | - 可以用自定义的颜色方案生成网页
127 | - `:TOhtml`
128 | - 或者 `:source $VIMRUNTIME/syntax/2html.vim`
129 | - 然后在浏览器里打开他
130 | - `:firefox %`
131 | 
132 |
133 |
134 | ## 总结
135 |
136 | - 这次了解了颜色的细节
137 | - 设置 256 色模式
138 | - `:set t_Co=256`
139 | - 然后确定了具体的各种颜色
140 | - 还可以生成网页
141 | - 还有什么好玩的么?🤔
142 | - 下次再说 👋
143 |
--------------------------------------------------------------------------------
/markdown/35-79644-正则表达.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 查找进阶
8 |
9 | ## 回忆上节课内容🤔
10 |
11 | - 实时搜索 `:set incsearch`
12 | - 大写小写 `ignorecase`
13 | - 查找当前单词
14 | - * 正向按单词
15 | - # 反向按单词
16 | - g* 正向不按单词
17 | - g# 反向不按单词
18 |
19 | - 继续查找
20 | - n 保持方向
21 | - N改变方向
22 |
23 | - 这个搜索可以做一些模糊匹配吗?
24 | - 应该在哪里查询呢?
25 |
26 | ## 模式匹配
27 |
28 | - `:h /` 可以找到关于搜索相关的帮助
29 | - 我们可以打开 `patterns.txt`
30 | - 找到关于比较简单的解释 `03.9` 的超链接位置
31 | - ctrl + ] 跳转文档
32 |
33 | 
34 |
35 | ### 行头行尾
36 |
37 | 
38 |
39 | - `/include` 匹配所有的 `include`
40 | - `^` 意味着行开头
41 | - `/^include` 只匹配 `include` 在行头的
42 | - `/^#` 只匹配 `#` 在行头的
43 | - `$` 意味着行结尾
44 | - `/the.$` 只匹配 `the.` 在行尾的
45 | - `/^End$` 匹配行头接着 `End`,然后就是行尾的一行
46 | - `:g/^$/d` 删除所有空行
47 |
48 | - 行头行尾和词头词尾很像
49 | - `^` 本身就是跳到行头
50 | - `$` 本身就是跳到行尾
51 |
52 | ### 任意字符
53 |
54 | - `.` 可以匹配任意字符,作为通配符来使用
55 | - 比如 `/c.m`
56 | - 第一个字符为 `c`
57 | - 第二个字符为 `.` 就是任意字符
58 | - 第三个字符为 `m`
59 | - 可以匹配 `company` 中的 `com`
60 | - 也可以匹配 `camera` 中的 `cam`
61 |
62 | 
63 |
64 | ### 任意字符
65 |
66 | - `ter.` 匹配 `ter` 后面加一个字符
67 |
68 | 
69 |
70 | - 如果想要正常匹配一个真的 `.`
71 | - 就要加上一个反斜杠 `\`
72 | - 写做 `\.`
73 | - 使用反斜杠 `\` 转义之后
74 | - `.`就不再代表任意字符了
75 | - 比如搜索 `/ter\.` 就是寻找 `ter.`
76 |
77 | ### 更多字符
78 |
79 | - `.` 代表任意字符
80 | - `/c.m` 匹配 `c和m中间有一个字符` 的情况
81 | - `/c..m` 匹配 `c和m中间有两个字符` 的情况
82 | - `/c...m` 匹配 `c和m中间有三个字符` 的情况
83 |
84 | - 如果我想查找 c 和 m 中间有任意多个字符怎么办?
85 | - 使用 `*` 通配符
86 | - `/a*` 意味着出现 0 到任意多个 a
87 | - `/c.*m` 在 `c` 和 `m` 中间出现 0 到任意多个 `.`(任意字符)
88 | - 如果我希望出现任意多次的是小写字母怎么办?
89 | - `/c[a-z]*m` 这样就是中间出现任意多个 `[a-z]小写字母` 了
90 | - `:g/^\s*$/d` 删除搜有只有空格和tab的行
91 | - `\s`代表空格和tab
92 |
93 | 
94 |
95 | ### 词头词尾
96 |
97 | - `^` 和 `$` 分别代表着行头和行尾
98 | - 再回一下词头词尾
99 | - 如果我想找出单词的开头结尾是某些字符的怎么办呢?
100 |
101 | 
102 |
103 |
104 | - `\<` 意味着单词开头
105 | - `\`意味着单词结尾
107 | - `b\>` 意味着 `b` 结尾的单词
108 | - `\`
109 | - 意味着以 a 开头,b 结尾,ab 之间可能有零到任意多个小写字符的单词
110 |
111 | ### 搜索历史
112 | - 我们使用 `*`、`#` 查找的时候就自动给加上这个词头词尾
113 | - 可以 * 之后
114 | - /
115 | - 配合上下方向键看到
116 | - 曾经的搜索记录
117 |
118 | 
119 |
120 | ### 推荐网站
121 |
122 | - 推荐一个好玩的网站
123 | - https://blog.robertelder.org/regular-expression-visualizer/
124 | - 可以可视化的观察正则匹配的过程
125 |
126 | ## 总结
127 |
128 | - 行头行尾
129 | - `^` 意味着行开头
130 | - `$` 意味着行结尾
131 |
132 | - 任意字符
133 | - `.` 代表任意字符
134 | - `[a-z]` 代表任意小写字母
135 |
136 | - 字符数量
137 | - `*` 代表 0 到任意多个前字符
138 | - `+` 代表 1 到任意多个前字符
139 | - `?` 代表 0 或 1 个前字符
140 |
141 | - 行头行尾
142 | - `\<` 意味着单词开头
143 | - `\>` 意味着单词结尾
144 | - 正则表达式的初步规则先介绍到这里
145 | - 我们掌握了在 vi 中光标运动的各种方法
146 | - 但如何编辑文本呢?🤪
147 | - 下次再说 👋
148 |
149 |
150 |
151 |
152 |
153 |
154 |
--------------------------------------------------------------------------------
/markdown/05-50084-插入模式.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 插入模式
8 |
9 | ## 回忆上节课内容
10 |
11 | 
12 |
13 | - 我们总结了,模式切换的方式
14 | - 命令模式 `Normal mode`
15 | - 底线命令行模式 `Command mode`
16 | - 帮助文件的正确打开方式
17 | - `:h`
18 | - 在文档中使用鼠标
19 | - `set mouse=a`
20 | - 建议不用鼠标
21 | - 使用全键盘方式跳入跳出超链接
22 | - ctrl+]
23 | - ctrl+o
24 | - 帮助文件的两种手册
25 | - 用户帮助手册
26 | - 引用帮助手册
27 | - 这次我们来插入内容,修改文档
28 |
29 | ## 插入模式
30 |
31 | #### 想要插入内容的话,应该进入插入模式 `(Insert mode)`
32 |
33 | - 首先我们还是打开上次的那个 `oeasy.txt`
34 |
35 | ```bash
36 | ls -l . > oeasy.txt
37 | vi oeasy.txt
38 | ```
39 |
40 | - 然后如何进入插入模式呢?
41 | - 我们使用 `:help insert` 看看是否有什么命令
42 |
43 | 
44 |
45 |
46 | - 我们需要先退出帮助模式
47 | - `:q`
48 | - 然后按下 i 进入插入模式
49 | - 进入插入模式后
50 | - `左下角` 状态栏会显示 **`-- 插入 --`**
51 | - 这意味着已经进入了插入模式
52 | - 时刻留意左下角
53 | - 左下角就像小地图一样
54 | - 是统管全局的所在
55 |
56 | 
57 |
58 | - 如果没有进入插入模式的话
59 | - 可能因为处在新开的帮助中
60 | - 先 `:q` 退出帮助
61 |
62 | ### 插入文字🅰️
63 |
64 | - 插入模式下我们可以任意打字
65 | - 按键不再是命令而是输入字符
66 | - 冒号回车都能打出来🤪
67 |
68 | 
69 |
70 | - 输入完成之后,又想要移动位置怎么办呢?
71 | - esc 退回到命令模式 `Normal mode`
72 | - 或者 ctrl+c 回到命令模式 `Normal mode`
73 | - 尽量选择 ctrl+c 因为可以让双手保持正位
74 | - 左手小指 ctrl + 右手食指 c
75 | - 注意退回到命令模式后
76 | - 左下角状态栏不再显示 **`-- 插入 --`**
77 | - 而是变回空白
78 | - 观察左下角
79 | - 时刻注意
80 |
81 | ### 文件细节
82 |
83 | 
84 |
85 | - 注意有内容的地方是具体的文字内容
86 | - 在没有内容的地方
87 | - 前面会有 `tilder(~)` 进行提示
88 | - `tilder(~)` 意味着空行,就是啥都没有
89 |
90 | ### 使用 `i` 命令进入插入模式
91 |
92 | - 按 i 再次进入插入模式
93 | - 按 esc 或 ctrl+c 退回到命令模式
94 |
95 | 
96 |
97 | - 可以用 i 和 ctrl+c 反复切换模式
98 | - 观察左下角
99 |
100 | ### 帮助细节
101 |
102 | - `i` 到底什么意思?
103 | - 可以 `:h` 他一下
104 | - `:h i` 就是 `help` 一下 `i` 命令究竟做些什么
105 |
106 | 
107 |
108 | - 那 ctrl+c 是啥意思?
109 |
110 | ### 查询快捷键
111 |
112 | - 什么不会就 `:h` 什么
113 | - `:h ctrl-c` 就是帮助我们查找一下 `ctrl-c` 快捷键究竟做些什么
114 |
115 | 
116 |
117 | - 同理还有 `:h ctrl-g`
118 |
119 | 
120 |
121 | - CTRL+G 对应着 `:f[ile]` 命令
122 | - 可以查看当前文件信息
123 |
124 | ### 尝试退出
125 |
126 | - 输入 `:q` 希望退出
127 | - 但是屏幕 📟 显示如下
128 |
129 | 
130 |
131 | - 按照他的要求输入 `:q!`
132 | - `cat oeasy.txt` 显示文件并未修改😧
133 | - 原来 `:q!` 只是不保存,强制quit退出
134 | - 囧,虽然还没成功保存...
135 | - 但是曾经真的插入文字了!😃
136 | - 我们先总结一下📘
137 |
138 | ## 总结
139 |
140 | - 我们这一次进入了插入模式
141 | - 在正常模式下使用命令 i
142 | - 在插入模式下使用 esc 退回到正常模式
143 | - 使用 `:q!` 不保存强制退出
144 | - 哎~看来保存只能下次再说了 😅
145 | - 我们下次再说!👋
146 |
--------------------------------------------------------------------------------
/markdown/49-81336-命令进阶.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 命令进阶
8 |
9 | ## 回忆上节课内容🤔
10 |
11 | - 我们上次研究vim的历史
12 | - 为什么会有行编辑器这种东西
13 | - 竟然是当年
14 | - 没有显示器只有纸的时代的无奈之举
15 | - vim进化到今天
16 | - 依然还有好多人使用
17 | - 而且ssh连接的时候直接vim就很方便
18 | - 命令行还有什么好玩的么?🤔
19 |
20 | ### 缩进控制
21 |
22 | - 我们学习过用<<、>>控制缩进
23 | - << 向左一个`shiftwidth`
24 | - >>向右一个`shiftwidth`
25 | - 如果忘了的话,可以`:h 'shiftwidth'`
26 | - 如果我们想要多行进行控制呢?
27 | - `:20,40>`
28 | - `20-40` 行向右一个 `shiftwidth`
29 | - `:'a,$>`
30 | - `a标记` 到 `结尾` 向右一个 `shiftwidth`
31 | - `%<`
32 | - 所有行向左一个 `shiftwidth`
33 |
34 | 
35 |
36 | ### 范围添加分号结尾
37 |
38 | - 我们如果想要给从4到10行添加分号结尾,应该如何呢?
39 | - `:4,10normal A;`
40 | - 首先是`range`,先打上`:4,10`
41 | - 然后让这个范围内的东西进入 `normal` 格式再
42 | - `:4,10normal`切换为`normal`模式
43 | - 打一个空格,后面打上命令`A;`
44 | - A是normal模式下的命令在行尾进入插入模式
45 | - 在最后的位置插入`;`
46 | - 整体的命令为`:4,10normal A;`
47 | - 思考
48 | - 如果我想在`8,15`行添加`//`应该如何做呢?
49 | - 动手试一试!
50 |
51 | - 但是这些都是执行 `vim` 的内部命令
52 | - 我想要执行外部命令
53 | - 比如 `shell` 中的 `ls` 可以么?
54 |
55 | ### 直接执行外部命令
56 |
57 | - 要直接执行外面的命令比如 `ls`
58 | - 我们在前面加上`!`就可以
59 | - 比如`:!ls`
60 | - 更复杂一些的
61 | - `!javac oeasy.java`
62 | - `!source o2z.sh`
63 | - `!python3 %`
64 | - 这很方便,直接在vi里面就可以执行命令了
65 | - 而且编译运行能看到报错的结果🤩
66 | - 直接G跳到出错那行就可以!
67 | - 可以直接修改,很爽!!!
68 | - 超爽!!!
69 | - 不过这一行命令执行完了就没了
70 | - 看不见前面执行的结果了
71 | - 我想一直看见前面的命令和执行结果
72 | - 可以么?
73 |
74 | ### 进入命令模式 ex-mode
75 |
76 | - 在 `Normal` 模式下直接按下Q
77 | - 进入Ex-mode
78 | - 全屏执行命令格式
79 | - 可以执行各种命令行
80 | - `:ls`
81 | - `:1,3d`
82 | - `:1,7p`
83 | - `:visual` 退回到正常模式
84 | - 可视化模式 `visual` 是 `vi` 名字的来源
85 | - `vi` 就是`ed` + 可视化模式 `visual`
86 |
87 | 
88 |
89 | - 能直接挂起vim运行命令么?
90 |
91 | ### 跳到shell
92 | - 我们知道我们是从 `shell` 运行 `vim` 然后进来的
93 | - 如果我们想退出 `vim` 的话需要保存并退出`:wq`
94 | - 如果我不想保存并退出
95 | - 就想切到外面
96 | - 把 `vim` 整个进程先挂起放到后台
97 | - 我们就 ctrl+z
98 | - 我们就挂起 `vim` 切出去了
99 | - 在 `shell` 运行完命令之后
100 | - `fg`就可以把`vim`切回到前台
101 | - fg的意思是foreground前台
102 |
103 | 
104 |
105 | - 但是我们可以直接不挂起 `vim` 的情况下
106 | - 执行 `shell` 命令么?
107 |
108 | ### 分屏终端 `:term`
109 | - `:term`
110 | - 上面切出一个窗口
111 | - 执行命令
112 | - `exit` 退出 `shell`
113 |
114 | 
115 |
116 | - 上下切换
117 | - ctrl+w j 切换到下方窗口
118 | - ctrl+w k 切换到上方窗口
119 | - 可以切来切去
120 | - 一边修改一边运行
121 | - 这个 `:term` 什么意思
122 |
123 | ### :term 帮助
124 | - 什么不会,`:h`什么
125 | - `:h :term`
126 |
127 | 
128 |
129 | ### 软件彩蛋
130 | - `:h :smile` 可以找到关于 `smile` 命令的帮助
131 |
132 | 
133 |
134 | - 这好像是个彩蛋
135 |
136 | ## 总结
137 | - 我们这次研究范围命令执行方法
138 | - 批量控制缩进
139 | - `:20,40>`
140 | - 批量执行普通模式下的命令
141 | - `:4,10normal A;`
142 | - 直接切换到`全屏命令模式` `ex-mode`
143 | - `Q`
144 | - 执行外部命令
145 | - `!javac oeasy.java`
146 | - 新开一个termianl窗格
147 | - `:term`
148 | - 这个方式真的很爽!
149 | - 在 `vi` 什么都干了!
150 | - 命令模式本身可以再提高效率吗?🤔
151 | - 下次再说 👋
152 |
153 |
154 |
155 |
156 |
157 |
158 |
--------------------------------------------------------------------------------
/markdown/82-182653-宏_macro_进阶.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 宏的进阶 macro
8 |
9 | ## 回忆
10 |
11 | - 关于宏,上次有4个要点
12 | - qa 开始录制宏
13 | - q 结束录制宏
14 | - @a 应用宏
15 | - qA 追加录制宏
16 | - 甚至可以编辑宏
17 | - "ap 把宏作为文本粘贴出来
18 | - 编辑之后
19 | - "ayy把新的宏装在进入a寄存器reg
20 | - 这个宏还可以怎么玩呢?🤔
21 |
22 | ### 建立环境
23 |
24 | - vi `oeasy.txt`
25 | - 插入一下内容
26 | - a. oeasy
27 | - b. o2z
28 | - c. o3z
29 | - d. o9z
30 |
31 | 
32 |
33 | ### 录制新宏
34 |
35 | - `qa0W~hjq`
36 | - qa 在a寄存器里面开始录制
37 | - 0 到行头
38 | - W 跳一个大词
39 | - ~ 改变当前光标位置字符的大小写
40 | - j 向下一行
41 | - q 停止录制
42 |
43 | - 查看宏
44 | - `:reg a`
45 |
46 | ### 应用宏
47 |
48 | - 正常模式下直接命令的方式
49 | - `@a`
50 | - 应用到当前行
51 | - `99@a`
52 | - 应用99行
53 | - u回来
54 | - 用命令行的方式
55 | - `:normal @a`
56 | - 切换到normal模式并对当前行执行@a
57 | - `:2,4 normal @a`
58 | - 切换模式并对2-4行执行@a
59 | - u回来
60 |
61 | ### 追加宏
62 | - `gg` 回到最初
63 | - `qAkA.jq`
64 | - `qA `追加录制宏到a寄存器
65 | - `k` 是为了抵消上面的 `j`
66 | - `A `追加在本行最后
67 | - `.`写一个`.`
68 | - `` 退回到正常模式
69 | - `j` 向下一行
70 | - `q` 退出录制
71 | - 这部分内容,就被追加到宏a里面
72 | - 可以`:reg a`看到
73 | - `0W~hjkA.j`
74 | - `:% normal @a`
75 | - u回来
76 |
77 | ### 修改宏 macro
78 | - `:reg a`
79 | - 目前`0W~hjkA.j` 中
80 | - `jk`彼此抵消
81 | - 在文档最后把寄存器a中的存储的宏粘贴出来
82 | - Go"ap出来
83 | - 修改为`0W~A.j`
84 | - 重新定义宏a
85 | - `"ay$`
86 | - 观察宏a
87 | - `:reg a`
88 | - 批量执行
89 | - `:% normal @a`
90 |
91 | ### 多文件执行
92 |
93 | - 除了`oeasy.txt`之外
94 | - 还有`o2z.txt`、`o3z.txt`
95 | - `:!cp oeasy.txt o2z.txt`
96 | - `:!cp oeasy.txt o3z.txt`
97 | - 批量执行
98 | - `:arga *.txt`
99 | - 添加当前文件夹下的所有txt文档
100 | - `:args `
101 | - 列出所有参数
102 | - `:argdo g/.*/normal @a `
103 | - 对于args中的每个文件中的每一行执行a这个宏
104 | - g global全局执行
105 | - 匹配任何字符匹配每一行.*
106 | - 如果是`o.*`对应的是以o开头的每一行
107 | - normal @a 正常模式下执行@a
108 | - `:argdo w`
109 | - 保存所有文件修改
110 |
111 | ### 快速执行
112 | - `@@`
113 | - 执行上一条宏
114 | - `:2,5@`
115 | - 第2-5行执行上一条宏
116 |
117 | ### 递归执行宏
118 | - 文件还是这样的`oeasy.txt`
119 | - a. oeasy
120 | - b. o2z
121 | - c. o3z
122 | - d. o9z
123 | - `qaqqa0W~j@aq`
124 | - qaq
125 | - 把a宏清空
126 | - qa
127 | - 开始录制a
128 | - 0
129 | - 到第一列
130 | - W
131 | - 跳大词
132 | - ~
133 | - 改变大小写
134 | - j
135 | - 往下跳一行
136 | - @a
137 | - 执行宏a
138 | - q
139 | - 停止录制
140 |
141 | - 然后运行
142 | - 这样他就是自己执行自己
143 | - 直到最后一行无法再递归调用
144 | - 就自动跳出了
145 |
146 | ### 并行执行
147 |
148 | - 有素材如下
149 | - import { FUNC1 } from "oeasy";
150 | - import { FUNC2 } from "o2z";
151 | - import { FUNC3 } from "o3z";
152 | - import function from "o9z";
153 | - import { FUNC4 } from "o9z";
154 | - import { FUNC5 } from "orz";
155 | -录制宏
156 | - qa0f{gui{jq
157 | - qa
158 | - 开始录制宏a
159 | - 0
160 | - 到第1列
161 | - f{
162 | - 跳到{
163 | - gui{
164 | - 把{}里面的内容小写
165 | - j
166 | - 往下一行
167 | - q 停止录制
168 | - 运行宏
169 | - 99@a
170 | - 会卡到第4行
171 | - 因为找不到{
172 |
173 | - 这个时候可以并发执行
174 | - `:1,$ normal @a`
175 | - 从第1行到最后一行每一行都在normal模式下执行@a
176 |
177 | ## 总结
178 |
179 | - 关于宏,我们回忆一下
180 | - qa 开始录制宏
181 | - q 结束录制宏
182 | - @a 应用宏
183 | - qA 追加录制宏
184 | - 控制寄存器内容其实就是控制宏
185 | - 宏还有一些特性
186 | - 可以多文件执行宏
187 | - 可以并发运行宏
188 | - 可以递归执行宏
189 | - 宏是随录随用的的
190 | - 我想把一些东西固定下来,让他到时候不用定义就能执行
191 | - 可以么?🤔
192 | - 下次再说!
193 |
194 |
195 |
196 |
197 |
198 |
--------------------------------------------------------------------------------
/markdown/78-174121-保留环境_viminfo.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 保留环境viminfo
8 |
9 | ## 回忆组合键映射的细节
10 |
11 | - 上次我们定义了`session`
12 | - `:mks`
13 | - 还可以加载会话`session`
14 | - `:source Session.vim`
15 | - `vim -S Session.vim`
16 | - 基本上确立`:mksession`可以替代`:mkview`
17 | - 谁知又出来一个`viminfo`?!😨
18 | - 上面这哥俩儿都成了有益补充?
19 | - 什么情况?🤔
20 |
21 | ### 直奔主题
22 |
23 | - `:h viminfo`
24 |
25 | 
26 |
27 | - 好家伙,里面东西着实不少
28 | - 命令行历史
29 | - 搜索历史
30 | - 输入历史
31 | - 非空寄存器
32 | - 标记
33 | - 跨文件标记
34 | - 搜索和替换的模式
35 | - 这些都是 `:mksession` 保存不了的
36 | - 工作区存的是工作环境的状态
37 | - `viminfo` 存的是提高效率的一些东西
38 | - 跨文件跳转标记
39 | - 命令行历史
40 | - 搜索历史
41 | - 好不容易建立的
42 | - 跳转标记
43 | - 命令历史
44 | - 睡一觉就没了?不合理!
45 | - 说了这么半天
46 | - `viminfo` 怎么读写呢?
47 |
48 | ### 读写viminfo
49 |
50 | 
51 |
52 | - 写`viminfo`
53 | - `:wv` 写默认viminfo
54 | - 读`viminfo`
55 | - `:rv` 写默认viminfo
56 | - 这一读一写还是挺方便的
57 | - 我们写一个试试
58 | - 没报错
59 | - `:e ~/.viminfo`
60 |
61 | ### viminfo内容
62 |
63 | 
64 |
65 | - 398行
66 | - 上来是软件版本和编码格式
67 | - 然后就是命令行历史记录
68 | - 这样就能用了么?
69 | - 退出去
70 | - `vi`
71 | - `:rv`
72 | - :⬆️
73 | - 好像真的可以用以前的命令了
74 | - 可以指定写到具体文件么?
75 |
76 | ### 指定viminfo文件
77 |
78 | - `:wv ~/oeasy/oeasy.vim`
79 | - 这样就可以把viminfo保存到具体的目录底下了
80 | - 如果`~/oeasy/oeasy.vim`已经有了
81 | - `:wv! ~/oeasy/oeasy.vim`
82 | - `!`强制写入
83 | - `:rv ~/oeasy/oeasy.vim`
84 | - 也可以从指定的目录恢复viminfo
85 | - 不过要注意安全性的问题
86 | - 一般来说这个里面有很多关于链接、密码、数据库表结构等信息
87 | - 会看的人可以找到蛛丝马迹
88 | - 带来安全隐患
89 | - 千万不能把它存在工程文件里
90 | - 然后直接push到github
91 | - 那就危了
92 | - 不过我敲的命令行那么多
93 | - 他记得过来么?
94 |
95 | ### viminfo文件的容量设置
96 |
97 | 
98 |
99 | - `:set viminfo='50,<1000,s100,:0,n~/vim/viminfo`
100 | - `'50` 保留marker标记的文件数:50
101 | - `<1000` 寄存器register行数:1000
102 | - `s100` 超过100Kbyte的寄存器中的文本会被忽略
103 | - `:0` 命令行的历史记录数:0
104 | - `no /`搜索历史记录数:0
105 | - `no %` 不记录buffers:0
106 | - `no h` 不记录高亮`hlsearch`为0
107 |
108 | ### 多人共用viminfo
109 |
110 | 
111 |
112 | - 如果有一个viminfo是公用的
113 | - 下面A、B写的是同一个 `.viminfo` 文件
114 | - 下面的事情按顺序发生
115 | - A读取了原始的数据,读取了START公有变量
116 | - B做了同样的事
117 | - A设置了AAA和BOTH变量
118 | - B设置了BBB和BOTH变量
119 | - 结果在viminfo中
120 | - START是开始就有的,没有改变
121 | - AAA 是 A写的 ,B保留了他
122 | - BBB 是B 写的
123 | - BOTH是B写的,A写的值被丢弃
124 | - 这总有点偷窥的感觉?
125 | - 一般寄存器里放什么还是有点隐私的
126 | - 别互相之间搅和了
127 | - 设置好你的viminfo文件的读权限
128 | - 别走光了
129 |
130 | ### 映射map
131 |
132 | - 原来的映射
133 | - `:map :waexe "mksession! " . v:this_session`
134 | - `:map :so ~/oeasy/oeasy.vim`
135 | - 新的映射
136 | - `:map :waexe "mksession! " . v:this_session:wv ~/oeasy/oeasyviminfo.vim`
137 | - `:map :so ~/oeasy/oeasy.vim:so ~/oeasy/oeasyviminfo.vim`
138 | - 这个`viminfo`就在你的工程文件夹`oeasy`里面
139 | - 如果git分享的话,一定设置gitignore
140 | - 拷贝出来的之前,记得要删除
141 |
142 | ## 总结
143 |
144 | - 这次我们了解了viminfo
145 | - 他能够保存
146 | - 命令行历史
147 | - 标记
148 | - 寄存器
149 | - 把他和`:mksession`一起使用就可以完美复原环境了
150 | - 还有什么是和环境相关的东西呢?🤔
151 | - 下次再说!
152 |
153 |
154 |
155 |
156 |
157 |
--------------------------------------------------------------------------------
/markdown/57-81629-行可视化.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 可视化编辑
8 |
9 | ## 回忆上节课内容🤔
10 | - 上次我们了解到可视模式
11 | - 其实可视化对应三种子模式
12 | - 字符可视模式 v
13 | - 行可视模式 大写V
14 | - 块可视模式ctrl+v
15 | - 我们先来了解字符可视化模式
16 | - 快捷键 v
17 | - 可配合各种`motion`
18 | - o切换首尾
19 | - 快速操作
20 | - 选中了之后可以进行以下操作
21 | - d
22 | - c
23 | - y
24 | - 可以用"a使用指定寄存器
25 | - 可以用`i`和`a`快速选择范围
26 | - w 小词 W 大词
27 | - ()[] {} 各种括号
28 | - t 标签,编写网页的时候很有用
29 | - s 句子 p 段落
30 | - b 小括号,这个编写程序的时候很有用
31 | - B 大括号,编写程序的时候很有用
32 | - " ' `引号内
33 | - 以上是 `字符` 可视化模式
34 | - 那么 `行` 可视化模式是什么意思呢?
35 |
36 | ### 切换模式
37 |
38 | - 我们上次从正常模式切换到字符可视化模式用的是小写v
39 | - 如果想切回来呢?
40 | - 再摁下一下v
41 | - 或者esc
42 | - 或者ctrl+c
43 | - 这次我们切换到行编辑模式,用大写V
44 | - 可以看到左下角提示,"--- 可视·`行` ---"
45 | - 切换过来之后可以快速的使用`motion`控制结束行的位置
46 | - 可以使用`33G`跳转位置
47 | - 也可以用o,切换选区首尾字符
48 | - 选区选好之后可以做操作了
49 |
50 | ### 操作方法
51 |
52 | 
53 |
54 | - 行可视化模式选择的内容是`行`
55 | - Vjj可以选中3行
56 | - V 选中当前行
57 | - j 加选下面一行
58 | - j 再加选一行
59 |
60 | ### 基本操作
61 | - 我们选择好了很多行之后怎么办呢?
62 | - 我们选好选取之后,就可以
63 | - d
64 | - c
65 | - y
66 | - 这和字符可视化模式一样的
67 | - 可以使用
68 | - D
69 | - C
70 | - Y
71 | - 对 `行` 可视化模式,大小写没什么区别
72 | - 不过对 `字符` 可视化模式,还是有区别的
73 |
74 | ### 使用命令行
75 | - 用命令行模式
76 | - 就像字符可视化模式一样
77 | - 比如我:
78 | - 左下角会出现:'<,'>就是从选区开头,到选区结尾
79 | - '< 选区开头
80 | - '> 选区结尾
81 | - 然后我们摁下d回车
82 | - 就把选区范围内都删除了
83 | - 我们可以`:h '<` 查看相应手册
84 |
85 | 
86 |
87 | - `'<` 这种形式很像标记啊
88 | - 就像ma做标记、'a跳转到标记那样
89 | - 能否看看'<是否也是一个标记
90 |
91 |
92 | ### 选区标记
93 |
94 | - 做好选区
95 | - `:marks <>`查看标记
96 | - 可以查找到选区的开始和结束标记mark
97 |
98 | 
99 |
100 | - 这刚好标记在了选取的开始结束位置
101 | - 想要恢复选区应该怎么办?
102 |
103 | ### 恢复选区
104 |
105 | - 做好了选区
106 | - 进入了命令行模式
107 | - ctrl+c 丢失了选区
108 | - 想要恢复
109 | - `'`
110 | - `'<` 跳到原选区开头
111 | - `v` 进入字符可视化模式
112 | - `'>` 跳到原选区结尾
113 |
114 | ### 选区内替换
115 |
116 | - 在选择好文本范围后,可以在选区范围内控制查找替换
117 | - 也就是说把`:'<,'>`作为`range`来使用
118 | - `:'<,'>s/shiyanlou/oeasy/g`
119 | - 范围内批量替换subtitute
120 | - `:'<,'>s/shiyanlou/oeasy/gc`
121 | - 范围内批量替换并需要确认confirm
122 | - `:'<,'>g/^.*drwxwr.*$/d`
123 | - 范围内有`drwxwr`的直接删除delete
124 |
125 | ### 合并多行
126 |
127 | - 可以用J把这好多行合并成`1`行
128 | - 可以查询帮助`:h v_J` 可视模式下的J的作用
129 | - 除了行可视化之外,字符可视化也可以J将多行合成一行
130 | - 简单说就是把回车换行删除掉
131 |
132 | 
133 |
134 | ## 总结
135 | - 这次我们了解到行可视模式
136 | - 行可视模式 V
137 | - 也可配合各种`motion`
138 | - o切换首尾
139 | - 选区的开头和结尾是`mark标记`
140 | - 开头是 '<
141 | - 结尾是 '>
142 | - 可以在选区内进行替换和删除
143 | - `:'<,'>s/shiyanlou/oeasy/g` 范围内批量替换
144 | - `:'<,'>s/shiyanlou/oeasy/gc` 范围内批量替换待确认
145 | - `:'<,'>g/^.*drwxwr.*$/d` 范围内有`drwxwr`的直接删除
146 | - 选中了之后可以进行d、c、y等操作
147 | - 可以用"a使用指定寄存器
148 | - 可以合并多行
149 | - 用J把这好多行合并成`1`行
150 | - 这次是`行`可视化模式
151 | - 那么`块`可视化模式又是什么意思呢?🤔
152 | - 下次再说 👋
153 |
154 |
155 |
156 |
157 |
158 |
159 |
--------------------------------------------------------------------------------
/markdown/61-81781-vim选项.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # vim选项
8 |
9 | ## 从头开始
10 |
11 | - 这次我们从头开始
12 | - 从进入vim之前开始
13 | - 我们可以在终端里面给`vim`怎么样的参数呢?
14 | - `man vim`
15 | - 这个如果不行的话
16 | - 要先运行`unminimize`更新manual
17 | - 也可以在vim中运行命令行
18 | - `:h starting`
19 | - 我们可以看到我们
20 | - 除了把 `oeasy.txt` 作为文件名参数给 `vim` 之外
21 | - 还可以给 `vim` 一些选项开关
22 |
23 | ### 添加参数进行跳转
24 |
25 | 
26 |
27 | - 我们首先`ls -lah > oeasy.txt`
28 | - 然后`vi +4 oeasy.txt`
29 | - 光标会出现在第`4`行
30 | - 比如某位置有个关键参数
31 | - 可以这样直接跳到那一行
32 | - 执行之后
33 | - 退出vim,回到终端
34 | - 运行`vi +/shiyanlou`
35 | - 进入后
36 | - 光标在搜索到的第一个`shiyanlou`
37 | - 执行之后
38 | - 回到终端
39 | - 命令行参数除了能快速跳转
40 | - 还能干什么呢?
41 |
42 | ### 执行命令
43 | - 运行命令
44 | - `vi +%s/shiyanlou/oeasy/g oeasy.txt`
45 | - 先用`vim`打开文件`oeasy.txt`
46 | - 再运行命令`:%s/shiyanlou/oeasy/g`
47 | - 这用的是 +{command} 的形式
48 | - `%s/shiyanlou/oeasy/g` 就是 `+` 的 `{command}`
49 | - `vi +%s/shiyanlou/oeasy/g +%s/4.0K/o2z/g oeasy.txt`
50 | - 先用`vim`打开文件`oeasy.txt`
51 | - 再运行命令`:%s/shiyanlou/oeasy/g`
52 | - 再运行命令`:%s/4.0K/o2z/g`
53 | - 这样就可以执行两条命令
54 | - 也可以运行命令 `-c`
55 | - `vi -c %s/shiyanlou/oeasy/g oeasy.txt`
56 | - 相当于`vi +%s/shiyanlou/oeasy/g oeasy.txt`
57 | - 这用的是 -c {command}的形式
58 | - 动手试试
59 |
60 | ### 管道传入
61 | - `vi -`可以接受到`stdin`传过来的数据
62 | - 我们可以使用管道`|`
63 | - `ls -lah | vi -`
64 |
65 | 
66 |
67 | ### ex-mode
68 |
69 | - `vi -e oeasy.txt`可以用`ex`模式打开`oeasy.txt`
70 | - 也可直接`ex oeasy.txt`
71 | - 进入ex-mode之后,可以执行命令行,不用再打冒号
72 | - `:1`
73 | - `:%p`
74 | - `:2,9d`
75 | - `:1,$`
76 | - `:q`退出
77 |
78 | 
79 |
80 | - 可以退回到正常模式
81 | - `:visual`
82 | - 还可以切换出ex-mode子窗口
83 | - `Q`
84 |
85 | ### 只读模式
86 | - 可以使用`vi -R oeasy.txt`
87 | - 也就是`view oeasy.txt`
88 | - 在这种模式下,只能查看不能修改
89 |
90 | 
91 |
92 | - 但是如果你强制写`:w!`
93 | - 还是可以写进去的
94 | - 如果你想要彻底不能写
95 | - 无论是否加叹号都不能写
96 | - 应该怎么办呢?
97 |
98 | ### 想要彻底不能写的话
99 |
100 | - 那你需要使用`vi -M oeasy.txt`
101 | - 这样你想要做任何写的操作
102 | - 都无法进行修改
103 | - 原因是E21
104 |
105 | 
106 |
107 | ### 设置可编辑
108 |
109 | 
110 |
111 | - `:set modifiable`
112 | - 设置当前文档可以修改
113 | - 然后可以对文件进行修改
114 | - 但是如果想要`:w`还是不行
115 | - `:h E142`
116 |
117 | ### 设置可写
118 |
119 | 
120 |
121 | - `:set write`
122 | - 把这个开关设置好之后
123 | - 就可以顺利`w`了
124 | - 只要你有sudo的权限
125 | - 一切开关你都可以打开
126 | - 透过各种蓝布棉门帘
127 | - 就可以控制起整个面铺😋
128 |
129 | ### 常用mode
130 |
131 | 
132 |
133 | - ex 可以对应这vim -e
134 | - view 可以对应着vim -R
135 | - vimdiff 可以对应着 vim -d
136 |
137 | ## 总结
138 | - `vi`可以加各种选项
139 | - `vi +4 oeasy.txt`
140 | - `vi +/shiyanlou`
141 | - `vi +%s/shiyanlou/oeasy/g oeasy.txt`
142 | - `vi`可以接收`stdin`的参数
143 | - `ls -lah | vi -`
144 | - `vi`还有各种模式
145 | - 命令行模式`ex oeasy.txt`或者`vi -e oeasy.txt`
146 | - 只读模式`vi -R oeasy.txt`或者`view oeasy.txt`
147 |
148 | 
149 |
150 | - 如果加一个 `-r` 的参数可以么
151 | - 帮助手册说什么`swap`是什么意思?🤔
152 | - 下次再说 👋
153 |
154 |
155 |
156 |
157 |
158 |
159 |
--------------------------------------------------------------------------------
/myview:
--------------------------------------------------------------------------------
1 | let s:so_save = &g:so | let s:siso_save = &g:siso | setg so=0 siso=0 | setl so=-1 siso=-1
2 | argglobal
3 | enew
4 | setlocal keymap=
5 | setlocal noarabic
6 | setlocal autoindent
7 | setlocal backupcopy=
8 | setlocal balloonexpr=
9 | setlocal nobinary
10 | setlocal nobreakindent
11 | setlocal breakindentopt=
12 | setlocal bufhidden=
13 | setlocal buflisted
14 | setlocal buftype=
15 | setlocal nocindent
16 | setlocal cinkeys=0{,0},0),0],:,0#,!^F,o,O,e
17 | setlocal cinoptions=
18 | setlocal cinwords=if,else,while,do,for,switch
19 | setlocal colorcolumn=
20 | setlocal comments=s1:/*,mb:*,ex:*/,://,b:#,:%,:XCOMM,n:>,fb:-
21 | setlocal commentstring=/*%s*/
22 | setlocal complete=.,w,b,u,t,i
23 | setlocal concealcursor=
24 | setlocal conceallevel=2
25 | setlocal completefunc=
26 | setlocal nocopyindent
27 | setlocal cryptmethod=
28 | setlocal nocursorbind
29 | setlocal nocursorcolumn
30 | setlocal cursorline
31 | setlocal cursorlineopt=both
32 | setlocal define=
33 | setlocal dictionary=
34 | setlocal nodiff
35 | setlocal equalprg=
36 | setlocal errorformat=
37 | setlocal expandtab
38 | if &filetype != ''
39 | setlocal filetype=
40 | endif
41 | setlocal fixendofline
42 | setlocal foldcolumn=0
43 | setlocal foldenable
44 | setlocal foldexpr=0
45 | setlocal foldignore=#
46 | setlocal foldlevel=10
47 | setlocal foldmarker={{{,}}}
48 | setlocal foldmethod=indent
49 | setlocal foldminlines=1
50 | setlocal foldnestmax=20
51 | setlocal foldtext=foldtext()
52 | setlocal formatexpr=
53 | setlocal formatoptions=tcq
54 | setlocal formatlistpat=^\\s*\\d\\+[\\]:.)}\\t\ ]\\s*
55 | setlocal formatprg=
56 | setlocal grepprg=
57 | setlocal iminsert=0
58 | setlocal imsearch=-1
59 | setlocal include=
60 | setlocal includeexpr=
61 | setlocal indentexpr=
62 | setlocal indentkeys=0{,0},0),0],:,0#,!^F,o,O,e
63 | setlocal noinfercase
64 | setlocal iskeyword=@,48-57,_,192-255
65 | setlocal keywordprg=
66 | setlocal nolinebreak
67 | setlocal nolisp
68 | setlocal lispwords=
69 | setlocal nolist
70 | setlocal makeencoding=
71 | setlocal makeprg=
72 | setlocal matchpairs=(:),{:},[:]
73 | setlocal modeline
74 | setlocal modifiable
75 | setlocal nrformats=bin,octal,hex
76 | setlocal number
77 | setlocal numberwidth=4
78 | setlocal omnifunc=
79 | setlocal path=
80 | setlocal nopreserveindent
81 | setlocal nopreviewwindow
82 | setlocal quoteescape=\\
83 | setlocal noreadonly
84 | setlocal norelativenumber
85 | setlocal norightleft
86 | setlocal rightleftcmd=search
87 | setlocal noscrollbind
88 | setlocal scrolloff=-1
89 | setlocal shiftwidth=4
90 | setlocal noshortname
91 | setlocal showbreak=
92 | setlocal sidescrolloff=-1
93 | setlocal signcolumn=auto
94 | setlocal nosmartindent
95 | setlocal softtabstop=4
96 | setlocal nospell
97 | setlocal spellcapcheck=[.?!]\\_[\\])'\"\ \ ]\\+
98 | setlocal spellfile=
99 | setlocal spelllang=en
100 | setlocal spelloptions=
101 | setlocal statusline=
102 | setlocal suffixesadd=
103 | setlocal swapfile
104 | setlocal synmaxcol=3000
105 | if &syntax != ''
106 | setlocal syntax=
107 | endif
108 | setlocal tabstop=4
109 | setlocal tagcase=
110 | setlocal tagfunc=
111 | setlocal tags=
112 | setlocal termwinkey=
113 | setlocal termwinscroll=10000
114 | setlocal termwinsize=
115 | setlocal textwidth=0
116 | setlocal thesaurus=
117 | setlocal noundofile
118 | setlocal undolevels=-123456
119 | setlocal varsofttabstop=
120 | setlocal vartabstop=
121 | setlocal wincolor=
122 | setlocal nowinfixheight
123 | setlocal nowinfixwidth
124 | setlocal wrap
125 | setlocal wrapmargin=0
126 | let &g:so = s:so_save | let &g:siso = s:siso_save
127 | doautoall SessionLoadPost
128 | " vim: set ft=vim :
129 |
--------------------------------------------------------------------------------
/markdown/37-79727-删除字符.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 删除字符
8 |
9 | ## 回忆上节课内容🤔
10 |
11 | - 通过十进制的 ascii 值输入字符
12 | - 在输入模式下
13 | - 输入 ctrl + v
14 | - 然后再输入 065
15 |
16 | - 通过十六进制的 unicode
17 | - 在输入模式下
18 | - 输入 ctrl + v
19 | - 然后再输入 `u2642` 就可以通过 `uncode` 编码输入字符
20 |
21 | - 通过二合字符的方式插入
22 | - 在输入模式下
23 | - 输入 ctrl + k
24 | - 输入 `Co` 可以得到 `©`
25 | - 输入 13 可以得到 ⅓
26 | - `:digraphs` 查看二合字符列表
27 |
28 | - 寄存器计算
29 | - 在插入状态下
30 | - 输入 ctrl + r
31 | - 输入 `=3+3`(注意要有 `=`)
32 | - 得到结果 6
33 |
34 | - 我们掌握了在 vi 中插入字符的各种方法
35 | - 如何 vim 可以删除字符吗?🤔
36 |
37 | ## 删除字符
38 |
39 | - 我们应该如何删除字符呢?
40 | - 如果是插入状态下 del 、BackSpace 就可以删除了
41 | - 那假如我不想切换到插入模式,我想在普通模式下就直接删除呢?
42 | - `:h delete` 找到在 `change.txt` 里面有个 `delete`
43 | - 从默认的帮助位置,向上翻,翻到头😡
44 |
45 | 
46 |
47 | - 这个命令叫做 `x`
48 | - 我理解就是 `execute` 处死当前字符😱
49 | - 我们先在终端里面 `ls -lah > 1.txt`
50 | - 然后 `vi 1.txt`
51 |
52 | ### 删除当前 x
53 |
54 | - 在正常状态下,使用 x,删除当前字符
55 | - 效果和 插入模式下 BackSpace 一样
56 | - 尽量用x 而不用 BackSpace,因为:
57 | - 1. 正常模式移动迅速
58 | - 2. 用x 手指不离开键盘核心区
59 | - 3. 体会左右无名指,他会给你带来药师的灵感
60 | - 如果想要删除多个字符的话
61 | - 就在前面加上数字
62 | - 比如 `10x` 就是删除 `10` 个字符
63 | - 对应帮助中的 `[count]`
64 | - 而且删除了的字符,会放到寄存器 `""` 中
65 | - 可以使用 `:reg` 查看寄存器
66 |
67 | 
68 |
69 | ### 退格删除 X
70 | - 帮助手册里,在 `x` 后面还有个 `X`
71 | - `X` 的意思是 `向前退格`
72 | - 使用 `h X` 查询手册
73 |
74 | 
75 |
76 | - 最新删除的字符仍然放在 `""` 寄存器里面
77 | - 其实就像 BackSpace 效果一样
78 | - 只不过在摁像 x 顺手了之后,像 Shift+x 也很方便
79 | - 而且前后都能删
80 | - 下面这个就更厉害了
81 |
82 | ### 退格删词
83 |
84 | - 搜索插入模式下的 CTRL + w
85 | - `:h i_CTRL-w`
86 | - `:h`是查询帮助
87 | - 查询谁的帮助呢?
88 | - `i_CTRL-w`的
89 | - `i_CTRL-w`什么意思呢?
90 | - `i`代表insert插入模式
91 | - `CTRL-w`代表CTRL+w
92 | - 要注意小写`w`
93 |
94 | 
95 |
96 | ### 具体操作
97 |
98 | - 注意模式是插入模式
99 |
100 | 
101 |
102 | - CTRL+w之后
103 |
104 | 
105 |
106 | - 再CTRL+w之后
107 |
108 | 
109 |
110 | - 再 CTRL + w 之后
111 |
112 | 
113 |
114 | - 彻底删到头儿了
115 | - 可以切回到正常模式试试 `db`
116 | - u回来
117 | - 再试试 `d^`
118 |
119 | ### 两行连在一起
120 |
121 | 
122 |
123 |
124 |
125 | - 想要把两行 `Join` 连接在一起?
126 | - 我们原来用的是插入模式下的BackSpace
127 | - 现在试试 J(大写J)
128 | - 这是一个正常模式下的命令
129 | - 光标在上一行的任何位置
130 | - 命令模式下按下J(大写J)
131 | - 下一行和上一行连接在一起
132 | - 然后下一行的缩进消失
133 | - 和上一行之间有个空格
134 |
135 | ## 总结
136 |
137 | - 以前知道可以在插入状态下使用 del 、BackSpace 进行删除
138 | - 现在知道了默认状态下使用通过 `x` 删除字符
139 | - 可以在 `x` 前面使用 `[count]` 进行翻倍
140 | - 如 `10x`
141 | - 删除的字符存储在 `""` 寄存器中
142 | - 可以用 `:reg` 查看寄存器状态
143 | - 默认状态可以使用 `X` 退格
144 | - 删除的字符也在 `""` 寄存器中
145 | - 我们掌握了在 vi 中删除字符的各种方法
146 | - 还有没有更快速删除字符的方法呢?🤔
147 | - 下次再说 👋
148 |
149 |
150 |
151 |
152 |
153 |
154 |
--------------------------------------------------------------------------------
/markdown/32-82618-函数跳转.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 程序移动
8 |
9 | ## 回忆上节课内容🤔
10 |
11 | - 上次内容很简单,主要针对文本类素材
12 | - 移动段落
13 | - { 向前
14 | - } 向后
15 | - 移动句子
16 | - ( 向前
17 | - ) 向后
18 | - 如果我想程序中快速移动
19 | - 怎么办?🤔
20 |
21 | ```bash
22 | #首先下载文本找到tomsawyer.txt
23 | git clone http://gitee.com/overmind1980/oeasyvim.git
24 | #然后把文本打开
25 | cd oeasyvim
26 | vi oeasy.java
27 | ```
28 |
29 | ## 括号间跳转 %
30 |
31 | - 当我们的鼠标在小括号内部时
32 | - 比如在 `public static void main(String[] args)` 中的 小括号`(` 上
33 | - 我们可以使用 `%` 跳转到括号对的前半部分
34 | - 然后我们可以使用 `%` 在这对儿括号的两个位置指间跳转
35 | - 这个 `%` 不但对于小括号有用,对于成对的大括号、中括号也都有用
36 | - 对于c语言的 /* ... */ 注释的头尾 ୧(﹒︠ᴗ﹒︡ )୨有用
37 | - 对于 #if,#ifdef,#else,#elif,#endif 也有用
38 | - 这个 `%` 不支持 `[count]`
39 |
40 | 
41 |
42 | ### 小括号跳转
43 |
44 | 
45 |
46 | - 方向
47 | - [ 往上
48 | - [( 进挨着的上一个(
49 | - ] 往下
50 | - ]) 近挨着的下一个)
51 |
52 | - 如果是大括号呢?
53 |
54 | ### 括号跳转
55 |
56 | 
57 |
58 | - `[(` 跳转到上一个没配对的 `(`
59 | - `])` 跳转到下一个没配对的 `)`
60 | - `[{` 跳转到上一个没配对的 `{`
61 | - `]}` 跳转到下一个没配对的 `}`
62 | - 支持 `[count]`
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 | - `]m`下一个函数开头
94 | - `]M`下一个函数结尾
95 | - `[m`上一个函数开头
96 | - `[M`上一个函数结尾
97 | - 支持 `[count]`
98 | - `3]m` 可以往下跳到第 `3` 个函数开头
99 | - `[m`、`]m` 这两个其实还挺好用的
100 |
101 | ### 跳到定义
102 |
103 | 
104 |
105 | - 找到本地定义
106 | - gd - goto global declaration
107 |
108 | 
109 |
110 | - 和 * 不一样的是它会往前找到第一个
111 | - 在 `[[` 的范围内的第一个
112 |
113 | ### 没有配对的 #if 宏定义
114 |
115 | - 这个是针对宏定义里面的内容来的
116 | - `[#` 上一个没有配对的 `#if`、`#else`
117 | - `]#` 下一个没有配对的 `#else`、`#endif`
118 |
119 | 
120 |
121 | ### 标签跳转
122 |
123 | ```
124 | #查找matchit.vim
125 | sudo find / -name matchit.vim
126 | # 把match.vim插件放到系统插件文件夹
127 | sudo cp /usr/share/vim/vim81/macros/matchit.vim /usr/share/vim/vim81/plugin
128 | #打开一个网页
129 | vi oeasy.html
130 | ```
131 |
132 | 
133 |
134 | - 这个matchit可以支持标签的跳转
135 | - 比如在 `` 处按下 `%` 就可以到配对的 ``
136 | - 挺好玩的
137 | - 试试吧 🤪
138 |
139 |
140 | ## 总结
141 |
142 | - 括号间跳转
143 | - 成对括号间跳转 `%`
144 | - 不成对括号间跳转
145 | - `[[` 跳转到本块第一行
146 | - `]]` 跳转到本块最后一行
147 | - `[{` 跳转到上一个的 `{`
148 | - `]}` 跳转到下一个的 `}`
149 |
150 | - 函数间跳转
151 | - `]m` 下一个函数开头
152 | - `[m` 上一个函数开头
153 | - `]M` 下一个函数开头
154 | - `[M` 上一个函数结尾
155 |
156 | - `#if`、`#else`、`#endif` 没有配对的
157 | - `[#` 上一个没有配对的 `#if`、`#else`
158 | - `]#` 下一个没有配对的 `#else`、`#endif`
159 |
160 | - 注释的头尾
161 | - `[/`、`[*` 上一个注释 `/* .... */` 的头
162 | - `]*`、`]/` 下一个注释 `/* .... */` 的头
163 | - 如果我想快速找到某个东西怎么办呢?🤔
164 | - 下次再说 👋
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
--------------------------------------------------------------------------------
/markdown/93-548425-插件管理_vim-plug.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 插件管理器vim-plug
8 |
9 | ## 回忆
10 |
11 | - 上次我们把vim升级了
12 | - 用的是源码编译的方法
13 | - 主流程
14 | - 直接下载源码
15 | - 配置
16 | - 编译并安装
17 | - 后续
18 | - 然后设置了软连接
19 | - 配置了颜色方案
20 | - 配置里面最后一部分是关于插件的
21 | - 插件怎么玩呢?
22 |
23 | ### 查看配置
24 |
25 | - 这里好像注释掉了一个函数
26 |
27 | 
28 |
29 | - 所使用的语法就是vim-plug的语法
30 | - plug的意思是插
31 | - 负责的是一些插件
32 |
33 | ### 查看插件源码
34 |
35 | 
36 |
37 | - 我们按照说明文档提供的方法
38 | - 准备安装vim-plug
39 |
40 | 
41 |
42 | ### 安装插件
43 |
44 | ```
45 | curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
46 | https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
47 | ```
48 |
49 | - 只有一个文件
50 | - 很快就装进来了
51 |
52 | 
53 |
54 | ### 取消注释
55 |
56 | 
57 |
58 | - 将244行以后
59 | - 取消注释
60 |
61 | 
62 |
63 | - 目前有一个nerdtree的插件
64 | - 保存并运行当前vim文件
65 | - 怎么安装插件呢
66 |
67 | 
68 |
69 | ### 安装插件
70 |
71 | - PlugInstall
72 |
73 | 
74 |
75 | - 命令运行后
76 | - 会在左边添加一个浮动窗口
77 | - 显示安装情况
78 |
79 | 
80 |
81 | - 装完了也会有个提示
82 |
83 | 
84 |
85 | - 还有什么样的命令呢
86 |
87 | ### 更多命令
88 |
89 | 
90 |
91 | - 我们可以试试这个:PlugStatus
92 | - 查看插件状态
93 |
94 | 
95 |
96 | - 确实查看了状态为ok
97 | - 如果要删除呢?
98 |
99 | ### 调整
100 |
101 | 
102 |
103 | - 可以删除没有列出的插件
104 | - 先把246行注释掉
105 |
106 | 
107 |
108 | - 尝试删除
109 |
110 | ### 删除
111 |
112 | 
113 |
114 | - 这回就真删除了
115 | - 因为不在列表里了
116 | - 当然还可以再添加
117 | - 前提是把注释去掉
118 |
119 | 
120 |
121 | - 这个特征字符串什么意思?
122 | - scrooloose/nerdtree
123 |
124 | ### 特征字符串
125 |
126 | - 特征显然是可以连接到一个github地址的
127 |
128 | 
129 |
130 | - 在最初的时候
131 | - 人们从vim.org下载插件的tarball文件
132 | - 解压并手动安装
133 | - 插件多了、版本多了容易乱
134 | - 不清楚对应关系
135 | - 后来
136 | - 人们从github下载
137 | - 还可以查看文档和交互
138 | - 但是下载到本地之后还是容易乱
139 | - 升级的时候不知道对应关系
140 | - 不知道删哪个
141 | - 目前
142 | - 使用vim-plug之类的插件管理器
143 | - 来自动化地管理插件
144 | - 每个插件一个文件夹
145 | - 非常清晰
146 | - 易于管理
147 | - 具体在那个文件夹呢?
148 |
149 | ### 具体位置
150 |
151 | 
152 |
153 | - 自动化还有什么好处呢?
154 |
155 | ### 自动更新
156 |
157 | - :PlugUpgrade
158 | - 可以更新本体
159 |
160 | 
161 |
162 | - :PlugUpdate
163 | - 可以更新所选定的插件
164 |
165 | - :PlugDiff
166 | - 查看更新了的插件有什么差别
167 |
168 |
169 | ## 总结
170 | - 我们这次研究了插件管理器vim-plug
171 | - 这个插件可以管理插件
172 | - 添加
173 | - 删除
174 | - 升级
175 | - 每个插件在自己的文件夹里
176 | - 一般在~/.vim/plugged
177 | - 有什么好玩的插件可以装呢?🤔
178 | - 下次再说!👋
179 |
180 |
181 |
182 |
183 |
184 |
--------------------------------------------------------------------------------
/markdown/44-80100-综合练习.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 综合练习
8 |
9 | ## 回忆上节课内容🤔
10 |
11 | - 上次我们学到了各种的替换模式
12 | - r,替换当前光标的字符
13 | - R,进入替换模式
14 | - ~,改变大小写
15 | - 这次来个综合练习吧!
16 | - 我们这次要完成这样一个任务
17 | - 我们有的时候需要写日志
18 | - System.out.println("[debug]1=====");
19 | - 但是这些日志,如何快速插入
20 | - 并且自动编号呢?
21 | - 我们来试试
22 |
23 | ### 加法操作
24 |
25 | 
26 |
27 | - 首先输入好基本内容,如上图
28 | - 并且在System那一行yy
29 | - 然后p进行粘贴
30 | - 然后ctrl+a
31 | - 将具体的数字加1
32 | - 这到底是为什么?🧐
33 |
34 | ### 查询帮助
35 | - `h CTRL-A`查询快捷键作用
36 |
37 | 
38 |
39 | - 然后再p进行粘贴
40 | - 然后3ctrl+a,将原来的1加3得到4
41 | - 如果是减法的话,可以用ctrl+x实现
42 |
43 | ### 减法操作
44 | - 首先是已经存在的内容,如图
45 |
46 | 
47 |
48 | - 我希望快速添加一条 .news 的记录,其中 margin:30px;
49 | - 首先y2j复制3行
50 | - 然后G到最后一行
51 | - 小写p把新内容粘贴在后面
52 | - l向右移动到`b`字符
53 | - cw,剪切blog
54 | - 并把模式切换到插入模式
55 | - 输入newsesc
56 | - j,向下1行
57 | - f4,光标跳转到`4`
58 | - r3,光标所在字符修改为`3`
59 |
60 | ### 还是刚才的操作
61 | - u撤销回来
62 | - 在margin行的任意位置
63 | - 最后一步变成 10ctrl+x
64 | - 试一下效果
65 | - 查看帮助
66 |
67 | 
68 |
69 | - ctrl+a都在Normal正常模式下做的
70 | - 如果是在插入模式下做
71 | - 什么效果呢
72 |
73 | ### 重复插入
74 |
75 | - 先来搜索一下
76 | - `:h i_CTRL-a`
77 |
78 | 
79 |
80 | - 我们来试试
81 |
82 | ### 来试试
83 | - 打开`oeasy.java`
84 |
85 | 
86 |
87 | - i进入插入模式
88 | - 插入` oeasy `
89 | - ctrl+c结束插入模式
90 | - 这个时候寄存器`".`中的内容为` oeasy `
91 | - 正常模式下把光标移动到下面位置
92 | - 再进入插入模式
93 |
94 | 
95 |
96 | - 然后ctrl+a就可以把`".`寄存器的内容插上去了
97 | - 相当于插入模式下ctrl+r .
98 | - 也相当于正常模式下`".p`
99 | - 就是把.寄存器里面的东西粘贴上来
100 |
101 | ### 一次命令
102 |
103 | - 插入模式下有一种 `一次命令模式`
104 | - 快捷键是 ctrl+o
105 | - `:h i_ctrl-o`
106 |
107 | 
108 |
109 | - 插入模式下,执行一次命令
110 | - 然后回到插入模式
111 | - 比如光标在如下位置,模式为插入
112 |
113 | 
114 |
115 | - 原来的方法是
116 | - ctrl+c
117 | - 先退回到正常模式
118 | - `d2w`可以把两个单词删除
119 | - i并进入插入模式
120 | - 不止一种思路
121 | - 灵活多变
122 |
123 | ### 试试一次命令模式
124 |
125 | - ctrl+o
126 |
127 | 
128 |
129 | - 执行一次正常模式命令`d2w`
130 | - 执行之后还是保持在插入模式
131 |
132 | 
133 |
134 | - 如果想删到oeasy之前的位置就可以
135 | - ctrl+o
136 | - d/oeasy 回车
137 | - 然后会自动回到插入模式
138 | - 也许你可试试如何才能让按键更少
139 | - 就像用更少的杆数让高尔夫球进洞一样
140 | - http://www.vimgolf.com/
141 |
142 | ## 总结
143 |
144 | - 这次我们主要就是综合运用
145 | - 很好玩的,更快速的解决问题
146 | - 进行计算
147 | - ctrl+a,将具体的数字加1
148 | - ctrl+x,将具体的数字减1
149 | - 5ctrl+a,将具体的数字加5
150 | - 一次命令模式
151 | - ctrl+o
152 | - 插入模式下执行一次命令,然后回到插入模式
153 | - 下次我们进入新的领域
154 | - 命令行编辑~
155 | - 下次再说 👋
--------------------------------------------------------------------------------
/markdown/29-53103-垂直翻页.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 垂直翻页
8 |
9 | ## 回忆上节课内容🤔
10 |
11 | - 我们上次了解了横向滚动的相关信息
12 | - 横滚幅度 - `sidescroll`
13 | - 横滚留位 - `sidescrolloff`
14 | - 自动换行 - `wrap`
15 | - g j、g k 可以逐行上下移动
16 | - 可以控制切换行的控制键 `whichwrap`
17 | - 这就是横向移动的内容
18 | - 不过程序中一般一行不会超过80个字符
19 | - 纵向移动更为普遍
20 | - 纵向移动有什么好玩的吗?🤔
21 | - 我们先下载个长点的文档
22 | - `git clone http://gitee.com/overmind1980/oeasyvim.git`
23 | - 然后用无模式的方式打开他
24 | - `vi -u NONE tomsawyer.txt`
25 |
26 | ### 边缘移动
27 |
28 | - 首先设置非兼容 `:set nocompatible`
29 | - 然后设置显示行号 `:se nu`
30 | - 2 3 G 到 23 行
31 | - j 再向下的时候
32 | - 屏幕发生滚动,光标位置如图
33 |
34 | 
35 |
36 | ### 上下留边
37 |
38 | - 上下留边的话就要用 `:set scrolloff=2`
39 | - 这样的话上下翻动的话,都会有 `2` 行的预留
40 | - `:h scrolloff` 查看帮助
41 | - `s`[croll]`o`[ff] 管的纵向保留边距
42 | - 俗称留天留地
43 |
44 | 
45 |
46 | ### 留边细节
47 |
48 | - `scrolloff` 是一个 `option`
49 | - 可以设定最小值
50 | - 还可以查询细节 `:h 'scrolloff'`
51 |
52 | 
53 |
54 | - `scrolloff` 管的是 `纵向` 留天留地
55 | - `sidescrolloff` 管的是 `横向` 留天留地
56 | - 也可以用 `HML` 命令测试一下
57 | - H 到当前屏幕能到的最上行 High
58 | - M 到当前屏幕正中 Middle
59 | - L 到当前屏幕能到的最下行 Low
60 |
61 | ### 百分比的细节
62 |
63 | - 为了明确这个百分比的细节
64 | - 我们写个python文件写一个1000行的文件
65 |
66 | 
67 |
68 | - 然后运行他
69 | - !python %
70 | - 最后打开运行得到的文本文件
71 |
72 | ### 打开文件
73 |
74 | - 可以看到原来33%时
75 | - 左下角显示32%
76 |
77 | 
78 |
79 | - 并不相符
80 | - 这是为什么呢?
81 |
82 | ### 调整scrolloff
83 |
84 | - `:set scrolloff=0`
85 |
86 | 
87 |
88 | - 再调整当前行位置
89 | - 可以看到右下角的百分比是和左上角的行号相关联的
90 |
91 | ### 上下翻页
92 |
93 | 
94 |
95 | - 在 `scroll.txt` 可以找到 `:h CTRL-F`
96 | - 使用 ctrl + f 可以向下走
97 | - `f` 的含义是 `forward` 向下走
98 | - 同理`b` 的含义是 `backward` 向上走
99 | - ctrl + b 可以向上走
100 | - 在翻页之前加上数字 [count] 可以实现一次翻 10 页
101 | - 如1 0 ctrl + f
102 | - 或1 0 ctrl + b
103 | - 注意观察cmd的位置
104 |
105 | ### 向上 N 行
106 |
107 | - 我们可以用 ctrl + e 向下 1 行
108 | - ctrl + e 和 j 的不同是
109 | - ctrl + e 光标所在文件位置不变,整个屏幕向上,除非到了边缘,光标位置才改变
110 | - j 是屏幕整个位置不变,光标位置向下,除非到了边缘,屏幕位置才改变
111 |
112 | 
113 |
114 | - 同理可以ctrl + y 屏幕向下移动
115 | - 他们都可以使用 `[count]` 来翻倍
116 |
117 | ### 翻过半屏
118 |
119 | - ctrl + d 可以向下走 翻半屏 d 代表 Down
120 | - ctrl + u 可以向上走 翻半屏 u 代表 Up
121 | - 默认翻的是半屏,但是也可以通过 `scroll` 来设置
122 | - `:set scroll=5` 来明确翻的行数
123 | - 翻页的时候,光标在屏幕的相对位置不变,屏幕整体向上或向下移动
124 |
125 | 
126 |
127 | ## 总结
128 |
129 | - 这次我们主要讲的翻页
130 | - `:set scrolloff=2` 控制留天留地
131 | - 上下翻页(这个最常用)
132 | - ctrl + f 屏幕向上走一屏
133 | - ctrl + b 屏幕向下走一屏
134 | - 上下移屏一行
135 | - ctrl + e 屏幕向上走一行
136 | - ctrl + y 屏幕向下走一行
137 | - 上下移屏一段
138 | - ctrl + u 向上走半屏
139 | - ctrl + d 向下走半屏
140 | - 移动数量和 `scroll` 相关
141 | - 上述翻页都可以用 `[count]` 翻倍
142 | - 如果想屏幕相对文件位置不动
143 | - 只移动光标
144 | - 可以么?🤔
145 | - 下次再说 👋
146 |
--------------------------------------------------------------------------------
/markdown/84-182657-表达式_Expression.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 表达式 expression
8 |
9 | ## 回忆
10 |
11 | - 关于 `函数function `,我们回忆一下
12 | - 可以查询
13 | - 可以新建
14 | - 可以调用
15 | - 还可以删除
16 | - 我想用 `函数function` 往 `buffuer` 里面写点东西
17 | - 比如写一个java的基本程序框架
18 | - 这样一调用就好使了
19 | - 省的自己打了
20 | - 可以么?🤔
21 |
22 | ### 追加函数
23 |
24 | - 应该如何去找关于写 `buffer` 的函数呢?
25 | - `:h`
26 | - 找到用户手册41.6
27 | - 找到这一类的函数
28 | - 属于text-functions
29 | - 文本函数
30 |
31 | 
32 |
33 | ### 追加函数
34 | - `:h append()`
35 |
36 | 
37 |
38 | - 帮助中提到了{lnum}可以是0
39 | - 我来试试
40 |
41 | ### 函数初试
42 |
43 | - `:call append(0,"oeasy o2z o3z")`
44 | - `:call append(0,"111oeasy o2z o3z o4z")`
45 | - `:call append(0,"222oeasy o2z o3z o4z")`
46 | - `:call append(1,"3333oeasy o2z o3z o4z")`
47 |
48 | - 结论是可以插入
49 | - 一次在指定位置插一行
50 | - 如果想要插入最上面一行
51 | - 使用`:call append(0,"在第一行插入")`
52 |
53 |
54 | ### 插入框架
55 |
56 | 
57 |
58 | - 再重新进入vi
59 | - `:call Oeasy()`
60 | - 试验成功
61 | - 但是这个应该是只对于java文件起作用的?
62 | - 应该如何写?
63 | - 先把这段函数复制下来
64 |
65 | ### ftplugin文件类型插件
66 | - 使用文件类型插件有两种方式
67 | - 所有用户共享文件类型插件
68 | - `vi /usr/share/vim/vim81/ftplugin/java.vim`
69 | - 当前用户独有的文件类型插件
70 | - `mkdir -p ~/.vim/ftplugin`
71 | - `vi ~/.vim/ftplugin/java.vim`
72 |
73 | 
74 |
75 | - 函数名改成Initial
76 | - 保存并退出
77 |
78 | ### 文件类型初始化
79 | - 在css文件中调用函数
80 | - `vi Oeasy.css`
81 | - `:call Initial()`
82 | - 找不到函数
83 | - 在java文件中调用函数
84 | - `vi Oeasy.java`
85 | - `:call Initial()`
86 | - 插入成功
87 | - 但是这个不够通用
88 | - 要是能关联当前文件的文件名作为类名就好了
89 |
90 | ### 使用文件名
91 |
92 | 
93 |
94 | - `:echo expand('%:t:r')`
95 | - 这是可以显示当前的文件名的
96 |
97 | 
98 |
99 | - 这原理是什么呢?
100 | - `:h %:t`
101 |
102 | 
103 |
104 |
105 | ### 整合
106 |
107 | - 把这个整合到Initial函数里面
108 |
109 | 
110 |
111 | - 试验成功
112 | - 我想要调整整个buffer的缩进,怎么办呢?
113 | - `gg=G`
114 | - 但是我想把这条命令整合到Intial函数里面可能么?
115 |
116 | ### 表达式
117 | - 怎么执行正常模式的命令呢?
118 | - `:h :normal`
119 |
120 | 
121 |
122 | - `:normal gg=G`
123 | - 试验成功
124 | - `normal gg=G`是一个命令表达式
125 | - 但是怎么在函数里面执行这个表达式呢?
126 |
127 | ### 执行命令表达式
128 |
129 | - 先u回来
130 | - `:h execute`
131 |
132 | 
133 |
134 | - 可以在函数里面执行表达式
135 | - 什么是表达式呢?
136 | - 就是刚才的Ex command
137 | - `:execute "normal gg=G"`
138 | - 试验成功
139 | - 缩进之后我可以保存么?
140 |
141 | - `:execute "w"`
142 | - 试验成功
143 | - `:call execute("w")`
144 | - 也试验成功
145 | - 下面尝试放到函数里
146 |
147 | ### 在函数里执行表达式
148 |
149 | 
150 |
151 | - `:call Init()`
152 | - 调用成功!
153 | - 缩进和保存都是ok的!
154 |
155 | ### 建立映射
156 | 
157 |
158 | - `:source %`
159 | - `:call Id()`
160 | - `:map ... :call Id()`
161 | - `:10,30>>`
162 | - `...`
163 |
164 | ## 总结
165 |
166 | - 关于 函数`function`
167 | - 可以调用别的函数
168 | - `:call append(0,"oeasy o2z o3z")`
169 | - 还可以执行表达式
170 | - `:call execute("normal gg=G")`
171 | - 这样就可以把一系列的操作封装到一个函数里面
172 | - 然后在命令行模式调用就可以了
173 | - 但如果我想不用`:call Init()"
174 | - 而是像`:ls`一样执行`:init`,可能么?🤔
175 | - 下次再说!
176 |
177 |
178 |
179 |
180 |
181 |
--------------------------------------------------------------------------------
/markdown/23-52975-配色方案.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 配色方案
8 |
9 | ## 回忆上节课内容🤔
10 |
11 | - 我们上次找到配置文件的位置 `~/.vimrc`
12 | - 了解各种配置开关
13 | - 修改配置文件并应用
14 | - 这次想了解和配色方案相关的内容
15 |
16 | ## colorscheme
17 |
18 | - `vi ~/.vimrc.old` 中发现 `colorscheme` 属性
19 |
20 | 
21 |
22 | - 可以选择 `blue` 试试
23 | - `:colorscheme blue`
24 |
25 |
26 | ### 智能提示
27 |
28 | - 配色方案 `colorscheme` 的提示是怎么来的?
29 | - 如果没有提示的话
30 | - `:set wildmode?` 看一下
31 | - 默认是 `longest,list,full`
32 | - 如果`:set wildmod=`
33 | - 智能提示就没有了
34 | - `:set wildmode=longest,list,full`
35 | - 又会出现
36 |
37 | - 还可以调出菜单 `:set wildmenu`
38 | - 如果 `:set nowildmenu` 就没有菜单了
39 | - 再`:colorscheme` tab 就没有用了
40 | - tab 其实就是 `wildchar`
41 | - 用来获取提示的
42 |
43 | 
44 |
45 | ### 选择配色方案
46 | - 在命令行模式中输入 `:colorscheme` tab
47 | - 看到提示的配色方案
48 | - 用 tab 列出可选项
49 | - 然后选择一个配色方案
50 | - 其实各种颜色可以来一个个的试试
51 |
52 | ### 配色方案举例
53 |
54 | 
55 |
56 | - 你觉得哪个好看呢?
57 |
58 | ### 色彩模式选择
59 |
60 | - 都试了一遍,觉得 `murphy` 或 `blue` 还行
61 | - `:set t_Co?` 查看当前色彩模式
62 | - `:set t_Co=256` 色彩模式设置为 256 色
63 | - `:set t_Co&` 色彩模式设置为默认
64 | - 观察颜色的细微变化
65 | - `:h 't_Co'` 查询帮助
66 |
67 | 
68 |
69 | - `t` 是 `terminal终端`
70 | - `Co` 是 `Color颜色`
71 | - 我们把这些写进配置文件 `~/.vimrc`
72 | - `set t_Co=256`
73 | - `colorscheme blue`
74 | - 前后顺序不能错
75 | - 有的时候tmux颜色不对
76 | - 这样可以解决
77 |
78 | ### 颜色模式的作用
79 | - 这对于软件界面改变很大
80 | - 我们可以比较清晰地看到关键字、字符串、函数名等
81 | - 但是对于编写的程序和文本本身的内容
82 | - 并没有什么影响
83 | - 只是比较好看的蓝布棉门帘
84 |
85 | ### 配置文件
86 |
87 | - `set statusline=%-040.40(%F%m%)%-030.30([%l,%c]%)%p%%`
88 | - `set laststatus=2`
89 | - `set ruler`
90 | - `set number`
91 | - `set showcmd`
92 | - `set nocompatible`
93 | - `set showcmd`
94 | - `set showmode`
95 | - `set history=100`
96 | - `set t_Co=256`
97 | - `colorscheme blue`
98 |
99 | ### 更多细节
100 |
101 | - `:h colorscheme` 可以找到配色方案的帮助
102 |
103 | 
104 |
105 | ### 配色文件夹
106 | ```bash
107 | #找到vim的位置
108 | whereis vim
109 | #找到colors的位置
110 | find /usr/share/vim -name "colors"
111 | ```
112 |
113 | 
114 |
115 | ### 网上寻找合适的配色方案
116 |
117 | 
118 |
119 | - 网址是 https://vimcolors.com/
120 | - 选到合适的配色之后可以进入 `github` 去下载相应的配色文件
121 | - 把下载的 `.vim` 文件放进 `colors` 文件夹就可以了
122 | - 使用 `:colorscheme XXX` 应用该配色方案
123 |
124 | ### 下载颜色方案
125 |
126 | ```shell
127 | #下载颜色方案
128 | git clone https://github.com/gryf/wombat256grf.git
129 | #放到相应文件夹里
130 | sudo cp ./wombat256grf/colors/wombat256grf.vim /usr/share/vim/vim81/colors
131 | #运行
132 | vi oeasy.java
133 | ```
134 |
135 | - `:colorscheme wombat256grf`
136 | - 颜色设置成功
137 |
138 | ### 把当前配色方案输出到 html
139 |
140 | - `:TOhtml`
141 | - 可以把当前的配色方案输出为网页格式
142 | - `:w oeasy.html`
143 |
144 | 
145 |
146 | - 转化过程是一个vim文件
147 | - 也可以直接运行
148 | - `:source $VIMRUNTIME/syntax/2html.vim`
149 |
150 | ### 增加自己的配色方案
151 |
152 | 
153 |
154 | ```bash
155 | #找到colors的位置
156 | cd /usr/share/vim/vim81/colors
157 | #列出所有配色方案
158 | ls
159 | #复制出自己的配色方案
160 | sudo cp murphy.vim oeasy.vim
161 | ```
162 |
163 | ## 总结
164 |
165 | - 这次我们研究了配色方案
166 | - 找到了 `colors` 的位置
167 | - 下载并应用了颜色方案
168 | - 制作了自己的配色方案
169 | - 下面我想修改配色方案的颜色🤔
170 | - 最后在vim中尝试 `:colorscheme oeasy`
171 | - 是否能成功???
172 | - 下次再说 👋
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
--------------------------------------------------------------------------------
/markdown/53-81564-批量替换.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 查找细节
8 |
9 | ## 回忆上节课内容🤔
10 | - 我们温习了关于搜索的相关内容
11 | - /正向,?反向
12 | - n保持方向,N改变方向
13 | - 可以设置
14 | - 是否忽略大写小写
15 | - 是否从头开始查找
16 | - 是否高亮显示
17 | - 还有一些正则表达式的使用方法
18 | - 行头行尾 `^$`
19 | - 词头词尾 `\<\>`
20 | - 字符列表`[a-z]`、`[A-Za-z_]`
21 | - 包含回车`one\_stwo`
22 | - 数量
23 | - 数量`*`、`?`、`=`
24 | - 具体数量 `\{1,3}`
25 | - 非贪婪 `\{-}`
26 | - 不以什么为开头结尾
27 | - 不以什么为开头 `\@:⬆️
50 | - 找到上一条命令
51 | - 然后再回车执行
52 | - 我想把下一行的`2`个`oeasy`一把都换掉
53 | - 这就要加`flag`
54 |
55 | ### 添加`flag`
56 |
57 | - 哪个`flag`呢?
58 | - 我们可以在`:h :s`的时候,使用`/flag`
59 | - 也可以`:h s_flags`
60 |
61 | 
62 |
63 | - 我们这次的flag是`g`
64 | - 换一行
65 | - `:s/shiyanlou/oeasy/g`
66 | - 可以把这一行所有的 `shiyanlou` 换成 `oeasy`
67 | - 我理解这个g指的是行内所有的
68 | - 如果我想默认g-flag就开着呢?
69 |
70 | ### 默认g-flag
71 |
72 | 
73 |
74 | - 如果 `:se gdefault`
75 | - 可以设置`g`为默认
76 | - 但是这个只能替换一行
77 | - 我想在某些行的范围内替换怎么办呢?
78 | - 加 `range`
79 |
80 | ### 添加`range`
81 | - 精准控制
82 | - `:3,8s/shiyanlou/oeasy/g`
83 | - 只替换3-8行的
84 | - 而且开了`g` flag
85 | - 3,8行
86 | - 每行的都全部替换
87 | - 全部替换
88 | - `%` 相当于 `1,$`
89 | - `:%s/shiyanlou/oeasy/g`
90 | - `:1,$s/shiyanlou/oeasy/g`
91 | - 就会把所有的都替换了
92 |
93 | - 但是这个一把都替换了
94 | - 有的时候我还是想具体一个个确认怎么办?
95 |
96 | 
97 |
98 | ### 逐个确认
99 |
100 | 
101 |
102 | - `:h s_flags`找到一个`c`
103 | - `c`的意思是`confirm`确认
104 | - `:%s/shiyanlou/oeasy/gc`
105 | - 行里的都替换
106 | - 每一个都需要确认
107 | - 每个逐个确认
108 | - y替换当前匹配
109 | - l替换当前匹配,并退出
110 | - n跳过当前匹配
111 | - esc直接退出
112 | - q直接退出
113 | - a全部替换
114 | - 体会一下 `a` 的快乐😛
115 | - 除了g和c之外还有什么flag呢?
116 |
117 | ### n
118 |
119 | 
120 |
121 | - n的作用就是计数
122 | - 并不替换
123 | - 但是可以统计数量
124 | - `:%s/oeasy//gn`
125 | - 话说回来,关于替换有什么小技巧么?
126 |
127 | ### 小技巧
128 |
129 | 
130 |
131 | - `/let`
132 | - 搜索let
133 | - `cwconst`esc
134 | - 把当前单词变成const
135 | - 跳
136 | - n跳过当前匹配
137 | - n再跳过当前匹配
138 | - n还跳过当前匹配
139 | - N往回跳
140 | - 重做
141 | - .
142 | - 需要替换的就替换
143 | - n
144 | - 需要跳过的就跳过
145 | - N
146 | - 跳错了就跳回来
147 |
148 | - 如果遇到了转义字符应该怎么办呢?
149 |
150 | ### 转义字符
151 | - 比如我希望在所有玲珑塔的前面添加回车
152 |
153 | 
154 |
155 | - 回车在这里用的是转义字符\r
156 |
157 | 
158 |
159 | - 我们来总结一下
160 |
161 | ## 总结
162 | - 我们学习了
163 | - 替换 `substitude`
164 | - 替换单行
165 | - `:s/shiyanlou/oeasy`
166 | - 加上`range`
167 | - `:3,5s/shiyanlou/oeasy`
168 | - `:%s/shiyanlou/oeasy`
169 | - 加上`flag`
170 | - `:3,5s/shiyanlou/oeasy/g` 多个替换
171 | - `:3,5s/shiyanlou/oeasy/gc` 多个替换且逐个确认
172 | - 替换还是很方便的
173 | - 但是我想替换中使用正则表达式
174 | - 可以么?🤔
175 | - 下次再说 👋
176 |
177 |
178 |
179 |
180 |
181 |
182 |
--------------------------------------------------------------------------------
/markdown/75-170734-功能键_Fn_映射_map_进阶.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 映射map
8 |
9 | ## 回忆上次缩写的细节
10 |
11 | - 上次了解到了`:map`映射
12 | - 可以定义映射
13 | - `:map ; :`
14 | - 查询映射
15 | - `:map`
16 | - `:map ;`
17 | - 还可以取消映射
18 | - `:unmap`
19 | - 可以映射到指定的模式
20 | - `:map` 所有模式
21 | - `:vmap` 可视化模式 visual
22 | - `:nmap` 正常模式 normal
23 | - `:omap` operartor-pending 被定义的键可以作为一个motion来使用
24 | - `:map!` 插入和命令行模式
25 | - `:imap` 插入模式 insert
26 | - `:cmap` 命令行模式 command
27 |
28 | - 可以映射到什么也不做
29 | - `:nmap h `
30 | - 还可以避免再次映射
31 | - `:noreabbrev o1z oeasy`
32 | - 最后我们比较了缩写和映射的异同
33 | - 这 `缩写` 和 `映射` 都是可以`:mkview`保存的
34 | - 也可以写到`~/.vimrc`作为基础映射
35 | - 还可以写到具体的 `filetype` 中做一些专门的操作
36 | - 但是其实101键盘上面很多功能键
37 | - f1-f12
38 | - 我们还没有用上
39 | - 可以给他们映射上么?🤔
40 |
41 | ### 功能键映射
42 | - 第一个f1是有映射的
43 | - 如果在终端模式下运行就会到帮助文件
44 | - 如果在图形化的终端模式下运行就会到terminal的帮助
45 | - f2我们可以映射么?
46 | - `:map gg=G`
47 | - 注意这个时候map空格之后
48 | - 可以直接按下f2
49 | - 就直接输入
50 | - 很好使!
51 | - 但是我们应该再限制一下,映射只会出现在Normal模式
52 | - `:nmap gg=G`
53 | - 我们再试一个
54 |
55 | ### 快速插入日期
56 | - 我们需要在文章最后写一个日期时间
57 | - `:map oDate: :read !date`
58 | - o的意思是换行插入
59 | - 插入的内容就是`Date:`
60 | - esc退回到正常模式
61 | - `:`进入命令模式
62 | - 执行`:read !date`
63 | - 把外部命令`date`的结果read到buffer上
64 | - 然后是回车Carriage
65 | - 退回到正常模式
66 | - 整个操作完成
67 | - 真的能用!!!
68 | - 这样就可以快速插入落款日期了
69 | - 还可以进行一些修改
70 | - `:map oDate: :read !datekJ`
71 | - `k`向上一行
72 | - `J`把当前行和下一行链接
73 | - 如果要求在文本最后插入的话
74 | - `:map GoDate: :read !date`
75 | - 其实我们常用的就是程序的编译运行之类的
76 | - 这个映射能干么?
77 |
78 | ### 运行python程序
79 | - 这次我们用来干这个事情
80 | - 我们先在命令行里面走一遍
81 | - `:!python3 %`
82 | - 其中%是当前文件名
83 | - 相当于`:!python3 oeasy.py`
84 | - `:h c_%`
85 |
86 | 
87 |
88 | - 把他转化为映射
89 | - `:map :!python3 %`
90 | - 先保存
91 | - `:map :w:!python3 %`
92 | - 以后就可以一键运行python程序了
93 |
94 | ### 编译并运行java程序
95 |
96 | - 仿照上次
97 | - `:map :w:!javac %`
98 | - 这样是可以完成编译的
99 | - 然而运行的时候我需要
100 | - `:!java oeasy`
101 | - 这就得去掉后缀
102 | - `:!java %:t:r`
103 |
104 | 
105 |
106 | - 最终的映射语句是
107 | - `:map :w:!javac %!java %:t:r`
108 |
109 | - 保存、编译、运行一气呵成
110 | - 不过python、java、html都映射到了F5
111 | - 能否根据文件类型进行区分呢?
112 |
113 | ### 文件类型映射
114 | - 观察文件类型检测
115 | - `:filetype`
116 |
117 | 
118 |
119 | - 具体的文件应该放在哪儿呢?
120 |
121 | 
122 |
123 | ### 具体操作
124 |
125 | - 在`~/.vim/ftplugin/`下面放入文件类型的配置文件
126 | - `~/.vim/ftplugin/java.vim`对应java文件
127 | - `~/.vim/ftplugin/python.vim`对应python文件
128 |
129 | 
130 |
131 | - 现在我们就分别对于java和python文件定义了F5这个操作
132 | - 其实网页编辑也很常见
133 | - 如何在网页中一键预览?
134 |
135 | ### 一键预览火狐
136 | - 本终端开火狐
137 | - `firefox`
138 | - `!firefox`
139 | - 首先在终端上可以另开一个火狐进程
140 | - `xfce4-terminal -e 'firefox'`
141 | - 我们的终端是xfce的
142 | - 如果是gnome的话也类似
143 | - 这可以在终端中新开一个终端
144 | - 新终端中运行火狐
145 | - `xfce4-terminal -e 'firefox oeasy.html'`
146 | - 让火狐浏览你的网页
147 | - 把这套放到vim里面跑一下
148 | - `:!xfce4-terminal -e 'firefox %'`
149 | - 成功在vim里跑了起来
150 | - 然后就是映射map
151 | - `:map :!xfce4-terminal -e 'firefox %'`
152 | - 可以的!
153 | - 然后把这句话写到 `html` 的 `ftplugin` 中
154 |
155 | ## 总结
156 |
157 | - 这次我们定义了一系列的功能键
158 | - 让他们可以起到作用
159 | - 比如保存、编译、运行一键完成
160 | - 但是不同的文件类型应该有不同的处理方式
161 | - 我们用 `filetype` 的机制解决了这个问题
162 | - 这些映射就像缩写和折叠一样
163 | - 可以`:mkview`保存着
164 | - 除了功能键之外
165 | - 组合键能映射么?
166 | - 比如ctrl+s之类的?🤔
167 | - 下次再说!
168 |
169 |
170 |
171 |
172 |
173 |
--------------------------------------------------------------------------------
/markdown/68-81968-批量替换.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 批量替换
8 |
9 | ## 回忆上次
10 |
11 | - 我们可以用vimdiff快速的比较文件
12 | - 这很实用!!!
13 | - 实用的一些跳转方式
14 | - 遍历所有的修改change
15 | - `]c` 下一条修改
16 | - `[c` 上一条修改
17 | - 遍历所有的函数method
18 | - `]m` 下一条修改
19 | - `[m` 上一条修改
20 | - 面对不同点
21 | - 把当前的改成对比的 - do - diff obtain
22 | - 把对比的改成当前的 - dp - diff put
23 | - 关于多窗口
24 | - 还有什么好玩的吗?🤔
25 |
26 | ### 回忆同时打开2个文件执行windo
27 |
28 | - `vi -o o1 o2`
29 | - `:windo normal Ioeasy`
30 | - `windo` 所有窗口都执行
31 | - `normal` 进入普通模式
32 | - `Ioeasy` 插入`oeasy`
33 | - `:windo normal o`
34 | - `windo` 所有窗口都执行
35 | - `normal` 进入普通模式
36 | - `o` 换行
37 | - `:windo normal "%p`
38 | - `windo` 所有窗口都执行
39 | - `normal` 进入普通模式
40 | - `"%p` 粘贴各自文件名
41 |
42 | ### 批量替换
43 |
44 | - `:windo %s/oeasy/o2z/g`
45 | - `windo` 所有`window`窗口都进行
46 | - `%s/oeasy/o2z/g` 把 `oeasy` 替换为 `o2z`
47 | - 然后可以`:wqall` 全部保存
48 |
49 | ### 批量细节
50 |
51 | - 可以设置`range`,这个指的是`window`编号
52 | - `:1,3windo normal Ioeasy`
53 | - 可以执行批处理序列,用`|`隔开各个命令
54 | - `:windo %s/oeasy/o2z/g| %s/o2z/o3z/g`
55 | - 这样就可以执行两条替换命令了
56 | - `:windo set nolist nofoldcolumn | colorscheme blue `
57 |
58 | ### bufdo
59 |
60 | - 除了`windo`
61 | - 我们还可以对每一个`buffer`执行命令
62 | - `:bufdo %s/oeasy/o2z/g| %s/o2z/o3z/g`
63 | - 可以设置 autowrite 自动保存
64 | - 也可以设置 hidden 支持未修改buffer隐藏
65 | - 还可以 `:bufdo %s/oeasy/o2z/g| %s/o2z/o3z/g|update` 自动更新
66 | - 可`:ls`、`:buffers` 查看当前的`buffers`列表
67 | - `:bd1`、`:bd o2z.txt` 可删除`buffers`
68 | - `e .`可打开新的`buffer`缓冲
69 | - 可以用`:b1`选择缓存
70 |
71 | ### argdo
72 |
73 | - 我们还有一种批量执行命令的方式
74 | - `:argdo %s/oeasy/o2z/g| %s/o2z/o3z/g`
75 | - 打开.c文件,设置文件格式并更新
76 | - `:args *.c`
77 | - `:argdo set ff=unix | update`
78 | - 打开`.c`或`.h`文件,批量替换并更新
79 | - `:args *.[ch] `
80 | - `:argdo %s/\/My_Foo/ge | update `
81 | - 可以用`:args`查看相应的参数列表
82 | - 可以用`:argd`删除参数
83 | - 可以用`:arga`添加参数
84 |
85 | ### 把网页文件批量替换md文件
86 | - `vi **/*.html`
87 | - 把2级目录下所有html用vim打开
88 | - `:args`
89 | - 观察所有参数
90 | - `:argdo %s/
/[!\2]\1 | update`
91 | - 替换img标签
92 | - `:argdo %s/\(.\{-\}\)<\/a>/[\2]\1/g | update`
93 | - 替换a标签
94 | - `:%s/\(.*\)
/- \1/gc`
95 | - 替换h1标签
96 | - `:%s/\(.*\)
/ - \1/g`
97 | - 替换h2标签
98 |
99 | ### 之前 - zs
100 | - 要求
101 | - 把 `oeasy.org` 替换为 `oeasy.io`
102 | - 但是 `vim.org` 不替换
103 |
104 | 
105 |
106 | - `/oeasy\zs.org`
107 | - 查找前面有`oeasy` 的 `.org`
108 | - `:%s/oeasy\zs.org/.io/g`
109 | - 前面是` oeasy `的 `.org `换成 `.io`
110 | - `:%s/\^ 到开头
14 | - $ 到结尾
15 | - I
16 | - 相当于^i
17 | - A
18 | - 相当于$a
19 |
20 | 
21 |
22 | ## 查找帮助
23 |
24 | - 还有什么呢?
25 | - 还是继续在 `motion` 里面
26 | - ^ 、$ 之后找
27 | - 还是在左右移动这里面发现有个 f
28 | - 看起来是查找某个字符的样子
29 |
30 | 
31 |
32 |
33 | ### 查找字符
34 | 
35 |
36 | - 看起来就像
37 | - f谁就跳到谁那里
38 | - 我们来试一下
39 | - 先下载个素材
40 |
41 | ```bash
42 | #下载素材
43 | git clone http://gitee.com/overmind1980/oeasyvim.git
44 | # 进入目录
45 | cd oeasyvim
46 | #需要注意这次用无配置文件的方式启动vi
47 | vi -u NONE oeasy.java
48 | ```
49 |
50 | ### 行内查找
51 |
52 | 
53 |
54 | - 通过 fo
55 | - 直接跳到了到了右边邻近的的 `o` 字符
56 | - f 的意思是
57 | - `find` 查找
58 | - 并让光标跳跃过去
59 | - o 的意思是
60 | - 字符 `o`
61 | - 查的不是别的
62 | - 是字符 `o`
63 | - 前面还有 `o`
64 | - 想要找下一个咋办?
65 | - 还能咋办?
66 | - 查帮助呗!
67 | - 一定在 `f` 附近
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 | - 帮助里面还提到的 F 是干什么用的?
95 |
96 | ### 反向跳跃
97 |
98 | 
99 |
100 | - F 和 f 一样
101 | - 都是行内跳跃
102 | - 但是 F 是反向跳跃
103 | - 往左查找
104 |
105 | ### 反向跳跃练习
106 |
107 | 
108 |
109 | - 这个时候如果 ;
110 | - 就是继续反向查找
111 | - 保持跳跃的方向不变
112 | - 只要是方向不变就是 ;
113 | - 保持小拇指的感觉
114 | - 方向改变的话
115 | - 就是 ,
116 | - 体验中指的感觉
117 | - 帮助里面还提到了 `[count]`
118 | - 这个怎么用
119 |
120 | ### 跳跃查找
121 |
122 | - 回忆 `[count]`
123 | - 这东西是翻子
124 | - 可以翻倍
125 | - `3w` 就是跳跃3个小词
126 | - `4j` 就是向下4行
127 | - f 2 o 肯定不行
128 | - 因为 f 2 查找到 `2` 字符
129 | - o 下方插入一个空行,并切换到插入模式
130 | - 2 f o
131 | - 找到第 `2` 个 `o`
132 | - ;
133 | - 保持查找方向不变
134 | - 继续向前
135 | - ,
136 | - 反向查找`o`
137 | - 2 ;
138 | - 保持查找方向不变
139 | - 向前移动到第 `2` 个 `o`
140 | - 2 ,
141 | - 反向查找
142 | - 第 `2` 个 `o`
143 |
144 | 
145 |
146 | - 这个;确实很好用
147 | - 但是前提是得要加上参数
148 | - -u None
149 | - 如果在默认情况下进入
150 |
151 | ### 默认情况
152 |
153 | 
154 |
155 | - 一按;
156 | - 就到了命令行模式
157 |
158 | ### 映射回来
159 | - 配置文件做了映射
160 | - 把;映射到了:
161 | - 所以;失效了
162 |
163 | 
164 |
165 | - 映射回来
166 | - `:map ; ;`
167 | - 再试试
168 | - ; 、, 的感觉
169 | - 但是每次都要进行映射
170 | - `:map ; ;`
171 | - 好麻烦
172 |
173 | ### 找到根源
174 |
175 | - 可以修改.vimrc配置文件
176 |
177 | 
178 |
179 | - 225行的问题
180 | - 删除掉之后
181 | - 重开vim就可以了使用;了
182 |
183 | ## 总结
184 | - 跳跃
185 | - 向前跳跃是 f
186 | - 向后跳跃是 F
187 | - 继续
188 | - 保持方向是 ;
189 | - 改变方向是 ,
190 | - 可以加上 `[count]` 来加速
191 | - 还有什么好玩的吗?🤔
192 | - 下次再说 👋
193 |
194 |
195 |
196 |
197 |
198 |
--------------------------------------------------------------------------------
/markdown/73-170714-缩写_abbreviation.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 缩写abbreviation
8 |
9 | ## 回忆上次折叠的细节
10 |
11 | - 这次了解到了`:mkview`、`:loadview`
12 | - 保存和加载视图
13 | - 可以把当前的状态保存下来
14 | - 可以在 `viewoption` 中配置保存选项,设置哪些需要保存
15 | - 还可以保存多个视图
16 | - 在整个文档中跳来跳去
17 | - 视图里面可以有很多本地窗口的设置
18 | - 折叠
19 | - 缩写
20 | - 映射
21 | - 那么到底什么是缩写(`abbreviations`)和映射(`mappings`)呢?🤔
22 |
23 | ### 缩写就是`abbreviations`
24 | - 缩写之类的东西我们早就见过
25 | - `:se nu`
26 | - `:se[t] nu[mber]`
27 | - 不用都打上,打上缩写形式就自动能好使
28 |
29 | 
30 |
31 | - 类似的还有
32 | - `:%s`
33 | - 等价于`:%substitute`
34 |
35 | 
36 |
37 |
38 | ### 缩写abbreviation
39 | - 我们可以快速地定义缩写
40 | - `:abbreviate hi hello`
41 | - 这个时候如果输入`hi`空格
42 | - hi就自动变成了hello
43 | - 不过目前系统配置有点问题
44 |
45 | ### 调整设置
46 | - 当前系统配置有点问题
47 | - 需要看一下 `~/.vimrc`
48 |
49 | 
50 |
51 | - 把177这句 `set paste` 是控制粘贴用的
52 | - 有的时候粘贴出来时对不齐就用 `:set paste`
53 | - 粘贴完之后 `:set nopaste`
54 | - 现在我们 `:set nopaste` 确保缩写可以用起来
55 |
56 | 
57 |
58 | ### 设置缩写
59 | - 这有点像颜文字转化工具
60 | - `:abbreviate sml ヾ(❀╹◡╹)ノ~`
61 | - 还挺好使 哈哈
62 | - 还可以使用缩写形式`ab`
63 | - `:ab o1z oeasy`
64 | - 还可以用来改错
65 | - `:ab teh the`
66 |
67 | - 不论是在插入模式下,还是在命令行模式下
68 | - 只要输入缩写形态,然后加一个空格
69 | - 就自动完成切换
70 |
71 | 
72 |
73 |
74 | - 这个东西其实还是有一定实用性的
75 | - `:ab sysout System.out.println();`
76 | - 不过我可以控制最终的光标位置么?
77 |
78 | ### 光标的控制
79 |
80 | - 定义新的缩写
81 | - `:ab sysout System.out.println("");`
82 | - 这样就可以在快速得到输出语句之后
83 | - 还把光标放在最合适的位置
84 |
85 | 
86 |
87 | - 这样就可以快速插入一些复杂的语句
88 | - 那么这个可以换行么?
89 |
90 | ### 添加换行符号
91 |
92 | - `:ab htmlbase `
93 |
94 | 
95 |
96 | - 这样就可以快速插入一些更大规模的模板之类的内容
97 | - 目前有什么缩写abbreviate
98 | - 可以列表出来么
99 |
100 | ### 列出所有的缩写abbreviate
101 | - `ab[breviate]`可以列出所有的缩写
102 |
103 | 
104 |
105 | - 第一列代表使用范围
106 | - `!` - 全部模式包括输入和命令行
107 | - `i `- 输入模式 insert
108 | - `c `- 命令行模式 command
109 | - 单独定义某模式下的ab
110 | - `:iab o1z oeasy` 只在插入模式下进行缩写替换
111 | - `:cab o1z oeasy` 只在命令模式下进行缩写替换
112 | - `:ab o1z oeasy` 在全部模式下都能进行缩写替换
113 |
114 | ### 取消缩写
115 |
116 | - `:ab`先看看有啥
117 | - `:una o1z`
118 |
119 | 
120 |
121 | - 再 `:ab` 发现这个`o1z`已经删除了
122 | - 清空 `clear`
123 | - `:iabc[lear]`
124 | - 清空输入(insert)状态下的缩写abbreviate
125 | - `:cabc[lear]`
126 | - 清空命令(command)状态下的缩写abbreviate
127 | - `:abc[lear]`
128 | - 清空一切状态下的缩写abbreviate
129 |
130 | 
131 |
132 |
133 | - 一个个定义映射有点麻烦
134 | - 我能直接利用曾经写过的单词么?
135 |
136 | ### 自动补全
137 |
138 | 
139 |
140 | - 我们的缓冲中有很多已经写出来的单词
141 | - 我们可以用这些来做自动补全
142 | - 我们写下S然后按下ctrlp
143 | - 出现一个提示框我们可以选择里面的单词
144 | - ctrlp - previous
145 | - ctrln - next
146 | - 随着输入的进行还可以缩小查找范围
147 |
148 | 
149 |
150 | - 这个东西也是非常实用的小技巧
151 |
152 | ## 总结
153 |
154 | - 这次了解到了`:abbrivate`缩写
155 | - 可以定义缩写
156 | - `:ab o1z oeasy`
157 | - 这里面还可以包括方向键、回车键之类的东西
158 | - 可以定义到指定的模式
159 | - `iab`
160 | - `cab`
161 | - 查看缩写
162 | - `:ab` - 所有的
163 | - `:ab o1z` - o1z
164 | - 自动补全
165 | - ctrlp
166 | - ctrln
167 | - 这些缩写都可以保存在视图里
168 | - 保存的选项在`viewoption`中
169 | - 可以保存的除了 `缩写abbreviate` 还有个 `映射map`
170 | - `映射map` 什么意思呢?🤔
171 | - 下次再说!
--------------------------------------------------------------------------------
/markdown/24-52977-自定颜色.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 自定颜色
8 |
9 | ## 回忆上节课内容🤔
10 |
11 | - 这次我们研究了配色方案
12 | - 找到了 `colors` 的位置
13 | - 下载并应用了颜色方案
14 | - 制作了自己的配色方案
15 | - 下面我想修改配色方案的颜色🤔
16 | - 是否能成功???
17 |
18 | ### 首先得有自己的颜色方案
19 |
20 | 
21 |
22 | ```bash
23 | #找到colors的位置
24 | cd /usr/share/vim/vim81/colors
25 | #列出所有配色方案
26 | ls
27 | #复制出自己的配色方案
28 | sudo cp murphy.vim oeasy.vim
29 | #查看配色方案信息
30 | sudo vi oeasy.vim
31 | ```
32 |
33 | ### 修改配色方案
34 |
35 | 
36 |
37 | - 前 5 行是注释
38 | - 第 7 行取消原来的配色
39 | - 第 8 行设置背景
40 | - 第 9-11 行重设语法高亮
41 | - 第 12 行命名此配色方案,可以修改为 `oeasy`
42 | - 第 14 行开始设置各种高亮组的颜色
43 | - 我们先修改第一个高亮组 `Normal`
44 | - `Normal`的意思是`一般文字`
45 | - 这类的文字都属于这个高亮组
46 | - 与此类似的还有
47 | - 注释`Comment`
48 | - 常量`Constant`等
49 |
50 | ### 改变 Normal 高亮组颜色
51 |
52 | - 首先把配色方案名称改为 `oeasy`
53 | - 找到 `Normal` 组
54 | - 把 `Normal` 组的背景色`ctermbg` 改为 `blue`
55 | - 把 `Normal` 组的前景色 `ctermfg` 改为 `yellow`
56 | - `:w` 保存配色文件
57 | - `colorscheme oeasy` 重新设定配色文件
58 |
59 | 
60 |
61 | ### 查看配色
62 |
63 | - `:hi Normal` 可以查看 `Normal` 组的配色
64 | - `:hi` 可以查看当前色彩方案所有的配色
65 | - `xxx` 就是效果预览
66 |
67 | 
68 |
69 | ### 配色细节
70 |
71 | - `hi` 是 `highlight` 的缩写
72 | - `:h hi` 可以查询帮助
73 |
74 | 
75 |
76 | ### 字体特征
77 |
78 | - `:hi StatusLine`
79 | - `:hi StatusLine cterm=bold`
80 | - `:hi StatusLine cterm=bold,italic`
81 | - `:hi StatusLine cterm=bold,italic`
82 | - `:hi StatusLine cterm=bold,italic,underline`
83 | - `:hi StatusLine`
84 |
85 | 
86 |
87 | - `term`
88 | - 意思是`terminal`
89 | - 效果之间可以加逗号
90 | - 对应黑白终端
91 | - 在此无效
92 |
93 | - `cterm`
94 | - bold 加粗
95 | - underline 下划线
96 | - italic 倾斜
97 | - NONE 取消任何效果
98 |
99 | ### 设置颜色
100 |
101 | - `hi StatusLine`
102 | - `hi StatusLine ctermfg=red ctermbg=blue`
103 | - `hi StatusLine`
104 |
105 | - `ctermfg`
106 | - 意思是`c`olor `ter`minal `f`oreground `c`olor
107 | - 前景色设置
108 | - ctermfg=white
109 |
110 | - `ctermbg`
111 | - 意思是`c`olor `ter`minal `b`ackground `c`olor
112 | - 被景色设置
113 | - ctermfg=red
114 |
115 | - `gui`相关的属性呢
116 | - 与`gui`相关
117 | - 当前终端中无效果
118 |
119 | - 颜色对应的色号是来自系统的ansi对应的颜色值
120 |
121 | ### 定义光标所在行的颜色效果
122 |
123 | - 设置光标行高亮显示
124 | - `:set cursorline`
125 | - `:h 'cursorline'`
126 | - `:hi CursorLine`
127 | - `:hi CursorLine ctermbg=red ctermfg=white`
128 | - `:hi CursorLine`
129 | - 随着光标的运动,CursorLine 也会移动
130 |
131 | ### 定义光标所在列的颜色效果
132 |
133 | - 设置光标行高亮显示
134 | - `:set cursorcolumn`
135 | - `:h 'cursorcolumn'`
136 | - `:hi CursorColumn`
137 | - `:hi CursorColumn ctermbg=red ctermfg=white`
138 | - `:hi CursorColumn`
139 | - 随着光标的运动,CursorColumn 也会移动
140 | - 如果有换行问题的话
141 | - `:set nowrap`
142 |
143 | 
144 |
145 | ### 自定义颜色名
146 |
147 | - 定义 `oeasy` 组
148 | - `:hi oeasy ctermbg=white ctermfg=red`
149 | - 查看 `oeasy` 组
150 | - `:hi oeasy`
151 | - 应用 `oeasy` 组
152 | - `:set statusline=%#oeasy#%F%*`
153 |
154 | 
155 |
156 | ### 配置文件
157 |
158 | - `set statusline=%-040.40(%F%m%)%-030.30([%l,%c]%)%p%%`
159 | - `set laststatus=2`
160 | - `set ruler`
161 | - `set number`
162 | - `set showcmd`
163 | - `set nocompatible`
164 | - `set showcmd`
165 | - `set showmode`
166 | - `set history=100`
167 | - `set t_Co=256`
168 | - `colorscheme blue`
169 | - `set cursorline`
170 | - `hi CursorLine ctermbg=red ctermfg=white`
171 | - `set cursorcolumn`
172 | - `hi CursorColumn ctermbg=red ctermfg=white`
173 |
174 | ## 总结
175 | - 我们这次深入了配色方案
176 | - 修改了方案中的具体配色
177 | - 建立了自己的配色
178 | - 应用了自己的配色
179 | - 配置里面还有什么好玩的吗?🤔
180 | - 用来用去就是红绿蓝
181 | - 可以有更多颜色吗?
182 | - 下次再说 👋
183 |
184 |
185 |
186 |
187 |
188 |
189 |
--------------------------------------------------------------------------------
/markdown/50-81338-命令行效率.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 命令行效率
8 |
9 | ## 回忆上节课内容🤔
10 |
11 | ## 总结
12 | - 我们上次研究的是范围命令执行方法
13 | - 批量控制缩进
14 | - `:20,40>`
15 | - 批量执行普通模式下的命令
16 | - `:4,10normal A;`
17 | - 直接切换到`全屏命令模式` `ex-mode`
18 | - `Q`
19 | - 执行外部命令
20 | - `!javac oeasy.java`
21 | - 这个方式真的很爽!
22 | - 在 `vi` 什么都干了!
23 | - 命令模式本身可以再提高效率吗?🤔
24 |
25 | ### 列出历史
26 |
27 | ### 使用历史命令
28 | - 在输出命令时
29 | - 方向键⬅️️➡️️️可以控制左右移动
30 | - shift+⬅️️➡️️️按照word左右移动光标
31 | - ctrl+b 到开头begin
32 | - ctrl+e 到结尾end
33 | - ctrl+w 向前删除一个word
34 | - 这个要特别注意,有的浏览器关闭标签页
35 | - 我用火狐🦊一点问题没有
36 | - ctrl+u 删除到开头
37 | - 方向键↑️↓️️️可以翻阅历史命令
38 | - 也可以先输入`:h s`再按下↑️
39 | - 可以根据已经有的内容找出
40 | - `:h scrolloff`
41 | - `:h shiftwidth`
42 | - 想要列出所有命令历史怎么办?
43 |
44 | ### 命令历史
45 | - 我们可以列出所有执行过的命令`:history`
46 |
47 | 
48 |
49 | - `:h his[tory]`可以找到 `commandline.txt`
50 | - 可以按照类型查看历史
51 | - `:his c` 或`:his :` 命令类历史
52 | - `:his s` 或`:his /` 或 `:his ?` 搜索类历史
53 | - `:his e` 或`:his =` 表达式寄存器类
54 | - `:his i` 或`:his @` 输入行类
55 | - `:his d` 或`:his >` debug类
56 | - 可以加范围
57 | - `:his 2,5` `2-5`行命令历史
58 | - `:his / 3,9` 查询类命令历史的`3-9`条
59 | - `his -5,-1` 最新的`5`条
60 | - 总共可以保存多少条命令呢?
61 |
62 | ### 命令数量
63 | - `:set history&`
64 | - 还原为默认历史命令
65 | - `:set history?`
66 | - 查看这数量是多少?
67 | - 50
68 | - 设置更多命令历史记录
69 | - `:set history=1000`
70 |
71 | 
72 |
73 | ### 直接修改命令
74 |
75 | - 命令行模式下 ctrl+f
76 | - 或者正常模式下
77 | - q: 列出历史命令
78 | - / 在历史命令中搜索
79 |
80 | 
81 |
82 | ### 新窗口
83 | - 这个窗口有历史的命令
84 | - 可以移动
85 | - 可以修改
86 | - 回车后执行光标所在行的命令
87 | - 执行后
88 | - 历史的命令不被修改
89 | - 新增一条最新的命令历史记录
90 | - 我能在命令行里复制粘贴么?
91 |
92 | ### 使用寄存器
93 | - 我能在命令行里复制粘贴么?
94 | - 可以查询手册`:h c_ctrl-r`
95 | - 查询命令模式下的ctrl+r
96 | - 这和插入模式下使用寄存器一致
97 | - 都是ctrl+r
98 | - 然后再指定寄存器
99 | - 这样我们就可以在命令行里面使用寄存器了
100 |
101 | 
102 |
103 | - 我们先看看寄存器里面有什么?
104 | - `:reg`
105 |
106 | ### 使用默认寄存器
107 |
108 | - 先`:`进入命令行模式"
109 | - 然后ctrl+r
110 | - 然后如果我们这个时候摁下"
111 | - 就把默认寄存器里面的内容放入了命令行中
112 |
113 | 
114 |
115 | ### 使用当前文件名寄存器%
116 |
117 | - 如果我们再`:`
118 | - 然后ctrl+r
119 | - 摁下%就把文件名放入了命令行中
120 | - 比如`:!javac`的时候
121 | - 可以用这种方法把当前文件名输入到命令行中
122 |
123 | 
124 |
125 | - 不过还是直接最简单`:!python3 %`
126 |
127 | ### 复制路径和文件名
128 |
129 | - 读取当前目录并写入当前缓存
130 |
131 | 
132 |
133 | - yiW 复制当前大词
134 |
135 | 
136 |
137 | - 确实已经进入默认寄存器
138 |
139 | 
140 |
141 | - :e 之后
142 | - 按下ctrl + r
143 | - 然后选用缺省寄存器"
144 | - 就可以把缺省寄存器中存储的数据
145 | - 放到命令行编辑器里面
146 |
147 | ## 总结
148 | - 命令行的运行光标控制
149 | - 方向键⬅️️➡️️️可以控制左右移动
150 | - shift+⬅️️➡️️️按照word左右移动光标
151 | - ctrl+b 到开头begin
152 | - ctrl+e 到结尾end
153 | - ctrl+w 向前删除一个word
154 | - 小心关闭窗口!😱
155 | - ctrl+u 删除到开头
156 | - 历史命令的遍历
157 | - 方向键↑️↓️️️
158 | - 命令行的历史记录
159 | - `:history`
160 | - `:his -5`
161 | - `:his s`
162 | - 进入命令历史记录编辑
163 | - 命令行状态下 ctrl+f
164 | - 或者正常模式下 q:
165 | - 选择、编辑、回车
166 | - 使用寄存器
167 | - 命令行状态下 ctrl+r
168 | - 然后输入寄存器的名称就可以了
169 | - 命令模式可以读写文件吗?🤔
170 | - 下次再说 👋
171 |
172 |
173 |
174 |
175 |
176 |
177 | -
178 |
179 |
--------------------------------------------------------------------------------
/markdown/60-81715-编辑总结.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 可视化编辑
8 |
9 | ## 总结
10 |
11 | - vim表面上是一个软件
12 | - 其实他也有深厚的历史
13 | - 跨越了时代、项目和版本
14 | - 在年代的穿透中有一种源远流长的感觉
15 | - 新芽必发于陈
16 | - 让我想到一句老话
17 | - 孰能浊以止,静之徐清?
18 | - 孰能安以久,动之徐生?
19 | - 保此道者不欲盈
20 | - 夫唯不盈
21 | - 故能敝而新成
22 | - 总结一下前几节学习的可视化模式吧?🤔
23 |
24 | ### 可视化模式
25 | - 上上次了解到块可视模式
26 | -ctrl+v
27 | - 左下角`-- 可视 块 --`
28 | - 然后配合`motion`
29 | - o切换首尾
30 | - 这个块可以有四个顶点
31 | - O横向切换
32 | - 可以在选区内进行编辑和替换
33 | - 可以直接d、c、y
34 | - 或者D、C、Y
35 | - 也可以直接编辑
36 | - `:'<,'>d`
37 | - `:'<,'>s/shiyanlou/oeasy/g` 范围内批量替换
38 | - 可以在块·可视化模式下替换
39 | - `:'<,'>s/\%Vg/graphic/g`
40 | - '<,'>表示范围
41 | - s表示substitute
42 | - \%V表示在块内
43 | - 文本编辑终于告一段落🤔
44 | - 这次来总结总结
45 |
46 | ### 基本模式
47 |
48 | - 我们现在了解到有`5`种模式
49 | - 默认模式 也叫正常模式 这是基础
50 | - 想要从别的模式回到正常模式
51 | - ctrl+c
52 | - esc
53 | - 从正常模式到命令行模式
54 | - :
55 | - 从正常模式到插入模式者
56 | - i 前插
57 | - I 最前插
58 | - a 后插
59 | - A 最后插
60 | - o 下面插一新行
61 | - O 上面插一新行
62 | - 从正常模式到替换模式
63 | - R
64 | - 从正常模式到可视模式,分成三种
65 | - v 字符可视
66 | - V 行·可视
67 | - ctrl+ v 块·可视
68 |
69 | ### 基本编辑
70 | - 基本的编辑是`基本操作`+`基本运动`
71 | - 常用的基本操作都是动作
72 | - 小写操作的是{range}
73 | - 大写操作的是行
74 | - 具体命令
75 | - 删除
76 | - d、D
77 | - x、X
78 | - 复制
79 | - y
80 | - 粘贴
81 | - p、P
82 | - 剪切并切换到插入模式
83 | - c、C
84 | - 基本运动都是方向
85 | - 首行g g 、末行G 、第n行n G
86 | - 光标运动的方式是h j k l
87 | - 这些方向都可以加上`[count]`翻倍
88 | - 单词运动`wbe`
89 | - w 是到下一个`word`的开头
90 | - b 是到当前`word`的开头
91 | - e 是到当前`word`的结尾
92 | - 除了`word`之外还有`WORD`
93 | - 行头行尾
94 | - ^ 是到本行第一个非空字符
95 | - 0 是到本行第一个字符,不管是不是空格
96 | - g_ 是到本行最后一个非空字符
97 | - $ 跳到本行最后一个字符,即使他是空格
98 | - 行内跳跃和贴靠
99 | - 向`前`跳跃是f
100 | - 向`后`跳跃是F
101 | - 向`前`贴靠是t
102 | - 向`后`贴靠是T
103 | - 全文查找
104 | - 查找的话就是/
105 | - 反向查找的话就是?
106 | - 文本区块
107 | - {、}按段落移动
108 | - (、)按句子移动
109 | - 以in为范围的操作
110 | - ciw
111 | - dit
112 | - yib
113 | - di"
114 |
115 | ### 命令行模式
116 | - 可以进行基本编辑
117 | - 在:下可以运行命令
118 | - d、D、x、X
119 | - 可以在前面加上`range`
120 | - `:3,6d`
121 | - 可以操作文件 (读、写、编辑)
122 | - `:3,5w oeasy.txt`
123 | - `:1,3r oeasy.txt`
124 | - `:3,9w oeasy.txt`
125 | - `:3,9w oeasy.txt >>`
126 | - `:e .`
127 | - 查找
128 | - `/oeasy`
129 | - `/^a.*b$` a开头b结束的行
130 | - `/\` a开头b结束的单词
131 | - 替换
132 | - `:%s/shiyanlou/oeasy/gc`
133 | - `:3,9s/\//gc` 3-9行中a开头b结束的单词都删除
134 | - `:g/oeasy/d`带oeasy的都删除
135 |
136 | ### 可视化模式
137 |
138 | - 可视模式的首尾切换
139 | - o
140 | - O
141 | - 可以用`in`的方式制作选择范围
142 | - `vit`
143 | - `vi}`
144 | - `vib`
145 | - 总共有三种可视化模式
146 | - 字符可视化
147 | - 行·可视化
148 | - 块·可视化
149 | - 可以在选区里面进行编辑操作
150 | - d、c、y、p
151 | - 还可以进行替换
152 | - 也可以在命令模式下对范围进行操作
153 | - `:'<,'>d`
154 |
155 | ### 插入题头
156 |
157 | - `:r !ls -lah`
158 | - 使用命令`:2,15normal I001.`
159 | - 注意是`001`,而不是1
160 | - ctrl+v选中`3-5`行的开头字符
161 | - g之后ctrl+a
162 | - `1111`变成`1234`
163 |
164 |
165 |
166 | ## 总结
167 | - 包括5种模式
168 | - 正常、插入、命令行、可视化、替换
169 | - 许多编辑命令
170 | - d、c、y、p
171 | - 编辑命令可以配合`motion`和`in`
172 | - 文本可以进行搜索和替换
173 | - 基本就这些吧!!!🧘🏻♂️
174 | - 真是全面地大总结啊
175 | - 可以在终端里面玩开了
176 | - `shell` 下 运行 `vimtutor zh`
177 | - 看看自己多久能够通关
178 | - 这是一个重大的关卡
179 | - 做完了之后
180 | - 我们继续向前 👋
181 |
182 |
183 |
184 |
185 |
186 |
187 |
--------------------------------------------------------------------------------
/markdown/76-170982-组合键映射_map.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 组合键映射map
8 |
9 | ## 回忆功能键映射的细节
10 |
11 | - 上次我们定义了一系列的功能键
12 | - 让他们可以起到作用
13 | - 比如保存、编译、运行一键完成
14 | - 但是不同的文件类型应该有不同编译运行处理方式
15 | - 我们用 `filetype` 的机制解决了这个问题
16 | - 这些映射就像缩写和折叠一样
17 | - 可以`:mkview`保存着
18 | - 除了功能键之外
19 | - 组合键能映射么?
20 | - 比如ctrl+s之类的?🤔
21 |
22 | ### 上手就干
23 | - `:echo "oeasy"`
24 | - 显示oeasy
25 | - `:map echo "oeasy"`
26 | - ctrl+o
27 | - 映射到`:echo "oeasy"`
28 |
29 | ### 功能键映射
30 |
31 | - 我想给markdown某单词文本加粗
32 | - 语法是 `**加粗**`
33 | - 我想用 ctrl+b
34 | - ctrl+b 在 `vim` 里面表示为``
35 | - 我们先看看ctrl+b的帮助手册
36 | - `:h Ctrl-b`
37 | - 这个已经有了
38 | - 如果强制映射就把原来翻页的那个给抹没了
39 | - 除非是再 `:unmap `
40 | - 找一个没有用过的快捷键
41 | - `:h Ctrl-s` 没有
42 | - 我们换成
43 | - `:map i**ea**`
44 | - 这个只能在本地的vim上实现
45 | - 在蓝桥的vim中无效
46 |
47 | ### 代码分析
48 |
49 | - `:map i**ea**`
50 | - 当光标在单词的开头时
51 | - `i` 进入插入模式
52 | - 在单词前面插入两个*
53 | - esc退到正常模式
54 | - e到单词的 `end`
55 | - a在后面进行 `append`
56 | - 再插两个`*`
57 | - esc 退出
58 | - 试验成功
59 | - 但是这个东西是基于 `markdown` 这种 `filetype` 的
60 | - 我们需要在 `~/.vim/ftplugin/md.vim` 完成相关映射的定义
61 | - 而且模式特指是正常模式
62 | - 需要 `nmap`
63 | - 如果我要映射的内容也有 `ctrl` 组合键之类的东西呢?
64 |
65 | ### 窗口切换
66 | - 我们把原来窗口切换的快捷键简化一下
67 | - `map j`
68 | - `map k`
69 | - `map h`
70 | - `map l`
71 | - 这样就摁下两个键就可以切换窗口了
72 | - 很方便
73 | - 这其实可以设置在~/.vimrc中
74 |
75 | 
76 |
77 | - 其实还可以再把`:only` 和 `:split`之类的
78 | - 也重映射一下
79 |
80 |
81 |
82 | ### 选项卡切换
83 | - `:tabnew`新建几个
84 | - 我们控制一下ctrl+⬅️和ctrl+➡️️
85 | - `map :tabn`
86 | - `map :tabp`
87 | - 但是失败了
88 | - 修改一下
89 | - `map :tabn`
90 | - `map :tabp`
91 | - 这样就可以通过ctrl+⬅️和ctrl+➡️️控制选项卡tab了
92 | - 但是如果有很多选项卡的话呢?能否直接切过去?
93 | - 其实默认的`gt`、`gT`切换也还挺方便的
94 | - `1gt`
95 | - `2gt`
96 | - `3gt`
97 | - `9gt`
98 |
99 | ### Shift
100 |
101 | - 组合键除了ctrl之外,还有
102 | - shift
103 | - alt
104 | - `:map ioeasy` 等价于
105 | - `:map T ioeasy`
106 | - `:map `、 `:map T`
107 | - 结果一样
108 | - 可以看到这两个都可以定义
109 | - shift+t就是T
110 |
111 | ### 更多按键
112 |
113 | 
114 |
115 | - 理论上是这样的
116 | - 不过实际上并不如ctrl好用
117 |
118 |
119 | ### 批量替换
120 |
121 | - 我们打开一系列文件
122 | - `:vim oeasy.java oeasy.html oeasy.css`
123 | - 建立映射关系
124 | - `map :%s/5.1/5.2/g:wnext`
125 | - ctrl+s映射到
126 | - `:%s/5.1/5.2/g`替换所有
127 | - `:wnext` 保存并切换到下一个buffer缓存
128 | - 有流水线那意思,一个完了就弄下一个
129 | - 这样就可以批量替换一堆打开的文件了
130 | - ctrl+c可以终止
131 | - 但是如果ctrl+c被映射为空会如何?
132 |
133 | ### 胡思乱想
134 |
135 | - `noremap :echo "oeasy"`
136 | - 好像真的可以
137 | - 这样就没法打断了吗?
138 | - 但是如果你再插入模式的话
139 | - 还是可以通过ctrl+c切换到正常模式的
140 | - 感觉上是失败了。。。😫
141 |
142 | ### 关于注释的细节
143 | - 我们定义的映射一般都有注释
144 | - 注释有一点点小细节
145 | - `:map gg=G |"F4 for indent`
146 | - `|`把后面屏蔽
147 | - `"`意味着不执行的注释
148 | - 其实`G`后面的空格是有可能出问题的
149 | - 因为F4映射的是gg=G包括后面跟的4个空格
150 | - 最好改为`:map gg=G|" F4 for indent`
151 | - 在取消映射的时候也有同样的问题
152 | - 比如
153 | - `:unmap a |"unmap a`
154 | - 其实 `unmap` 的不是 `a`
155 | - 而是`a空格`
156 | - 这些细节都需要注意
157 |
158 | ## 总结
159 |
160 | - 这次我们定义了一系列的复合键
161 | - 主要是和ctrl键一起
162 | - 快速跳转window窗口
163 | - `map j`
164 | - `map k`
165 | - `map h`
166 | - `map l`
167 | - 快速跳转tab选项卡
168 | - `map :tabn`
169 | - `map :tabp`
170 | - 还可以流水作业
171 | - `map :%s/5.1/5.2/g:wnext`
172 | - 最后要注意注释说明的小细节
173 | - `:unmap a|" unmap a`
174 | - 组合键和功能键Fn一样
175 | - 都可以做各种映射map
176 | - 映射map和缩写abbreviate和折叠、本地options一样
177 | - 都可以通过`:mkview`、`:loadview`来保存读取
178 | - 但是如果我的环境里面有tab选项卡
179 | - tab选项卡里面还有各种切分好的各个窗口
180 | - 一觉醒来还得重新切分
181 | - 还得重新`:tabnew`
182 | - 我想把这个多选项卡tabs多窗口windows的状态整个存储起来
183 | - 可能么?🤔
184 | - 下次再说!
185 |
--------------------------------------------------------------------------------
/markdown/21-52894-状态横条.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 状态横条
8 |
9 | ## 回忆上节课内容🤔
10 |
11 | - 我们上次研究了标尺
12 | - 标尺
13 | - 开启 `se ru`
14 | - 关闭 `se noru`
15 | - 行号
16 | - 开启 `se nu`
17 | - 关闭 `se nonu`
18 | - 命令位置
19 | - 开启 `se showcmd`
20 | - 关闭 `se noshowcmd`
21 | - 跳转
22 | - 用 29 G 跳转行号
23 | - 用 19 | 跳转列号
24 | - 用 29 % 跳到整个文件 29% 的位置
25 |
26 | ### 准备环境
27 |
28 | ```bash
29 | # 下载素材
30 | git clone http://gitee.com/overmind1980/oeasyvim.git
31 | #进入目录
32 | cd oeasyvim
33 | #还是从最简单的vim开始设置起
34 | vi -u NONE oeasy.java
35 | ```
36 |
37 | ### 设置光标行
38 |
39 | - 来看一个开关option
40 | - 光标行 `cursorline`
41 | - 光标 `cursor`
42 | - 行 `line`
43 | - `:set cursorline`
44 |
45 | 
46 |
47 | - `h 'cursorline'`
48 | - 给 `cursorline` 加了单引号
49 | - 说明 `cursorline` 是一个属性 `option`
50 |
51 | 
52 |
53 | ### 设置光标列
54 |
55 | - 有行就有列
56 | - 光标列 `cursorcolumn`
57 | - 光标 `cursor`
58 | - 列 `column`
59 | - `:set cursorcolumn`
60 |
61 | 
62 |
63 | - `h 'cursorcolumn'`
64 | - 给 `cursorcolumn` 加了单引号
65 | - 说明 `cursorcolumn` 是一个属性 `option`
66 |
67 | 
68 |
69 | ### 改变底下的状态横条
70 |
71 | - 有了行列位置
72 | - 再配合标尺ruler
73 | - 光标位置就很明确了
74 | - 在 `:h ruler` 的时候
75 | - 偶然发现了一个新天地 `statusline`
76 | - `statusline` 意思是状态横条
77 | - 在倒数第 2 行
78 | - `statusline` 也是一个可以 `set` 的东西
79 | - 我们来查看一下手册
80 | - `:h statusline`
81 | - 好像可以直接给 `statusline` 赋值
82 | - 我直接赋一个 `oeasy`
83 | - `:set statusline=oeasy`
84 |
85 | - 然后还需要设置 `laststatus`
86 | - 设置 laststatus = 0,不显式状态行
87 | - 设置 laststatus = 1,仅当窗口多于一个时,显示状态行
88 | - 设置 laststatus = 2,总是显式状态行
89 | - `:set laststatus=2`
90 |
91 | ### statusline上可以放什么呢?
92 | - `:h 'statusline'`
93 |
94 | 
95 |
96 | ### 显示属性
97 |
98 | - 除了字符串常量之外是否能显示一些别的属性呢?
99 | - 继续翻帮助手册
100 | - 找到相关的 `items`
101 | - 各种 `items` 有不同的属性(数字、文本、标志)
102 | - 每个 `item` 对应一个字母
103 | - 这个字母需要通过 `%` 来进行转义
104 | - `F` 对应文件名
105 | - `:set statusline=[oeasy]%F`
106 | - 此时,状态条就显示 `[oeasy]当前文件名`
107 |
108 | 
109 |
110 | ### 标志属性
111 |
112 | - 继续翻看属性
113 | - `Flag` 是标志位
114 | - `m` 是一个关于是否已经修改的标志位
115 | - 把 `%m` 追加进入 `statusline`
116 | - `:set statusline=[oeasy]%F%m`
117 | - 修改文件后会显示未保存的 `[+]`
118 | - 观察效果
119 | - 保存后 `[+]` 会消失
120 | - 暗中观察...
121 |
122 | 
123 |
124 | ### 数值属性
125 |
126 | - 查到状态栏细节
127 | - `N` 代表 `Number` 代表 `item` 是一个数值类型
128 | - 行号 `l`、列号 `c`、百分比 `p` 都是数值类型
129 | - 用 `[`、`]` 把数值型变量分开
130 | - `%%` 可以把 `%` 转义显示出来
131 | - `:set statusline=[oeasy]%F%m[%l,%c]%p%%`
132 |
133 | 
134 |
135 | - 状态栏数值还可以随着光标变化😆
136 |
137 | ### 控制宽度
138 |
139 | 
140 |
141 | - 可以用格式来控制宽度
142 | - `%-0{MinWidth}.{MaxWidth}{item}`
143 | - `%-040.40F`就是用 `40` 的固定宽度显示`F`
144 | - 如果超过范围的话就会把前面部分隐藏
145 | - `:set statusline=[oeasy]%-040.40F%m[%l,%c]%p%%`
146 | - 一行总共 `80` 字符
147 | - 后面的部分怎么办?
148 |
149 | ### 成组
150 |
151 | 
152 |
153 | - 我们可以把行和列组成一个 `items group`
154 | - 用 `(`、`)` 来封装这个组
155 | - 用 `%` 对 `(`、`)` 进行转义
156 | - `:set statusline=%([%l,%c]%)`
157 | - 这样就可以统一设置这个标尺组的宽度
158 | - `:set statusline=%-010.10([%l,%c]%)`
159 | - 标尺组的宽度固定为10
160 | - 同理文件名和文件是否修改也可以编成一组
161 | - `:set statusline=%(%F%m%)`
162 |
163 | ### 最终整合
164 |
165 | 
166 |
167 | - 最终整合总共分为三部分
168 | - 文件 `%-040.40(%F%m%)`
169 | - 标尺 `%-030.30([%l,%c]%)`
170 | - 比例 `%p%%`
171 |
172 | - 关于状态横条还有一个总开关
173 | - `:set laststatus=0` 关闭
174 | - `:set laststatus=2` 开启
175 |
176 | ## 总结
177 |
178 | - 我们这次了解到了状态横条
179 | - 通过转义表示 `item`
180 | - 控制 `item` 宽度的方法
181 | - 将 `item` 成组的方法
182 | - 还有一个总开关 `laststatus`
183 |
184 | - 但是每次都要写很长的一段话来配置很麻烦啊
185 | - 我们能否写一个配置文件,让 `vim` 每次自动配置好呢?🤔
186 | - 下次再说 👋
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
--------------------------------------------------------------------------------
/markdown/70-86848-折叠_folding.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 折叠入门
8 |
9 | ## 回忆上次
10 |
11 | - 上次学习了一种新的容器 `tabs`选项卡
12 | - `tabs`选项卡 包含多个选项卡`tab`
13 | - 可以列两个`tab`
14 | - 一个编写文件
15 | - 一个执行指令
16 | - 互不影响
17 | - 每个 `tab`选项卡 还可以对应多个`window`
18 | - 可以开两个 `window` 对比不同
19 | - 或者在很长的文档上下对比
20 | - 新建`tab` - `:tabnew`
21 | - 切换`tab` - gt、gT
22 | - 指定`tab` - `1gt` `2gt` `3gt`
23 | - 关闭`tab` - `:tabc`
24 | - 列表`tab` - `:tabs`
25 | - 除了这些之外还有别的容器吗?🤔
26 | - 还是有的!
27 |
28 | ### 折叠folding
29 | - 这次的容器不在 `buffer`缓存 之外
30 | - 而在 `buffer`缓存 内部
31 | - 是折叠文字
32 | - 怎么折叠呢?
33 |
34 | 
35 |
36 | - 好比说我们这里有个 `css` 文件
37 | - 在`http://github.com/overmind1980/oeasyvim.git`里面
38 | - 找到 `oeasy.css`
39 |
40 | ### 创建折叠
41 |
42 | 
43 | - `zf6G`
44 | - 报错了
45 |
46 | 
47 |
48 | - `:h E350`
49 |
50 | ### E350
51 |
52 | 
53 |
54 | - `:set foldmethod?`
55 | - `:h foldmethod`
56 |
57 | 
58 |
59 | ### 手动模式
60 | - 把折叠模式设置为manual
61 | - `:set foldmethod=manual`
62 | - 我们的`folding`折叠都和字母z相关
63 | - 因为 `z` 就像一摞纸张打包之后的样子
64 | - `zf` 就是打包 `fold`
65 | - `zf` 后面可以加 `motion`
66 | - `zf4G`
67 | - 从光标位置到第4行
68 | - 打一个包
69 | - 然后我们就可以看到这几行变成了一行
70 | - 真的发生了折叠! 😝
71 |
72 | 
73 |
74 | ### 开关折叠
75 |
76 | - 我们可以把光标放到折叠之后的那一行
77 | - `zo` 可以打开折叠
78 | - 第一个`z` 是折叠
79 | - 第二个`o` 是 `open`打开
80 | - `zc` 可以关闭
81 | - 第一个`z` 是折叠
82 | - 第二个`c` 是 `close`关闭
83 |
84 | - 这两个是折叠最常用的命令
85 | - 打开
86 | - 关闭
87 |
88 | ### 折叠树
89 | - 我们可以设置左侧折叠树`foldcolumn`
90 | - `:set foldcolumn=4`
91 | - 就在最左边有4列专门负责打开和关闭折叠的显示
92 | - +是关闭
93 | - -是打开
94 | - 可以反复横跳来玩
95 | - 只要有+、-的地方就可以zc、zo
96 | - 多重折叠
97 | - 可以折叠带有折叠的行
98 | - 也就是折叠的嵌套
99 | - 折叠多了容易乱
100 | - 我们要手动删除折叠
101 |
102 | 
103 |
104 | ### 取消和再次折叠
105 |
106 | 
107 |
108 | - 删除折叠的快捷键是 `zd`
109 | - 顾名思义
110 | -` z` 是折叠
111 | - `d` 是删除
112 | - 来试试
113 | - 在左侧`foldcolumn`是`+`的地方
114 | - 使用命令zd删除当前光标位置对应的折叠
115 | - 如果折叠是嵌套的
116 | - 先删除内层的折叠
117 | - `zD` 是递归地删除折叠
118 | - 可以把当前光标的递归折叠都删除
119 |
120 | 
121 |
122 | - 如果折叠都被删没有了
123 | - 可以先 `zf2j` 创建一些折叠
124 | - 好,我们把所有的折叠都删干净了
125 | - 然后我们试试创建折叠更好的方法
126 |
127 | ### 利用{}创建折叠
128 |
129 | - `zf`是创建折叠
130 | - `zf2j`中的`2j`是`motion`
131 | - 可以在{}内使用`zfa{`创建当前标记的折叠
132 | - 可用`zfi{`创建折叠
133 | - 效果如下图
134 | - 试一下
135 |
136 | 
137 |
138 | - 能不能一把打开所有的折叠呢?
139 |
140 | ### 折叠层次
141 |
142 | - 有这样一个属性叫做`foldlevel`
143 | - 折叠层次
144 | - 到底怎么用呢?
145 | - `:set foldlevel=0`
146 | - 折叠都关了
147 | - `:set foldlevel=1`
148 | - 折叠都开了
149 | - 还是挺方便的
150 | - 不过每个大括号都要自己创造折叠
151 | - 是否能够自动创建折叠呢?
152 |
153 | 
154 |
155 | ### 缩进折叠
156 |
157 | - 首先我们退出当前这个文件
158 | - 然后重新打开
159 | - 打开之后先观察当前的折叠模式
160 | - `:set foldmethod?`
161 | - 如果是manual
162 | - `:set foldmethod=indent`
163 | - 把他强制设置为缩进折叠
164 | - 可以把这句话写进`~/.vimrc`这样每次都是缩进折叠了
165 | - 我觉得缩进折叠还是很方便的
166 | - `:set foldcolumn=4`
167 | - 出现折叠树
168 | - `:set foldlevel=0`
169 | - 全部隐藏
170 | - `:set foldlevel=1`
171 | - 全部打开
172 | - indent折叠要求缩进必须严格符合要求
173 | - `gg=G`可以帮助你控制缩进
174 |
175 | ## 总结
176 |
177 | - 这次我们讲的是折叠
178 | - 这是vim6.0时候提供的功能
179 | - 目的是把细节忽略
180 | - 只显示文档的主干
181 | - 折叠有很多options
182 | - `foldlevel` - 显示折叠层次
183 | - `foldcolumn` - 折叠树宽度
184 | - `foldmethod` - 折叠方式
185 | - `manual` - 手动
186 | - `indent` - 缩进
187 | - 折叠的定义
188 | - `zf2j`
189 | - 当前行和下面两行建立折叠
190 | - `zfa{`
191 | - 用大括号(包含)建立折叠
192 | - `zfi{`
193 | - 用大括号(不包含)建立折叠
194 | - 折叠的删除
195 | - `zd`
196 | - 折叠的打开和关闭
197 | - `zo` open
198 | - `zc` close
199 | - `:set foldlevel=1` 设置折叠层次
200 | - 这个缩进折叠可以对于程序文件使用么?🤔
201 | - 下次再说!
202 |
203 | 
204 |
205 |
206 |
207 |
--------------------------------------------------------------------------------
/markdown/66-81945-批处理操作.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 批处理操作
8 |
9 | ## 回忆上次
10 |
11 | - 我们上次参数列表 `arguments list`
12 | - 所谓参数列表指的是 `vim` 打开的 `参数列表`
13 | - 参数会加载到内存中成为 `buffer`
14 | - 参数的控制
15 | - `:arga filename `添加 `参数`
16 | - 此操作支持*可以打开多个文件
17 | - `:argd filename`来删除`参数`
18 | - `:args` 查询参数列表
19 | - 缓冲的控制
20 | - `:bd filename`来删除`缓存`
21 | - `:e filename`来打开`缓存`
22 | - `ls`可以列出缓存列表
23 | - 可以在`terminal`中配合`find`来找到文件
24 | - 然后作为参数给`vim`
25 | - ` sudo find / -mindepth 3 -maxdepth 4 -name passwd | xargs vi`
26 | - 精准地控制了参数列表或者缓冲列表
27 | - 这两个列表可以怎么用呢?🤔
28 |
29 |
30 | ### 做实验
31 |
32 | - 新建一个文件夹 test
33 | - mkdir test
34 | - 进入 test 目录
35 | - cd test
36 | - 新建两个文件
37 | - i.py 负责输入 input
38 | - o.py 负责输出 output
39 | - `vi -o i.py o.py`
40 | - -o 的意思是同时打开两个窗口
41 | - 两个窗口分别打开两个文件
42 |
43 | 
44 |
45 | ### 同时插入
46 |
47 | - `:windo normal I#!/usr/bin/python3`
48 | - 两个窗口同时插入 `#!/usr/bin/python3`
49 | - `:` 进入命令行模式
50 | - `windo` 在每个窗口都执行命令
51 | - `normal I#!/usr/bin/python3` 执行的命令是正常模式下 `I#!/usr/bin/python3`
52 | - `I` 在行头插入文本
53 | - `#!/usr/bin/python3` 插入的具体文本
54 |
55 | 
56 |
57 | - 插入默认打开方式
58 | - 然后分别输出i、o
59 |
60 | ### 分别输出
61 |
62 | - `:windo normal oprint("i")`
63 | - 两个窗口同时再插入新行 print("i")
64 | - `:` 进入命令行模式
65 | - `windo` 在每个窗口都执行命令
66 | - `normal oprint("i")` 执行的命令执行的命令是正常模式下 `oprint("i")`
67 | - `o` 换行并插入文本
68 | - `print("i")` 插入的具体文本
69 |
70 | 
71 |
72 | ### 切换窗口
73 | - ctrl+k 切换到上方windows
74 | - ctrl+j 切换到下方windows
75 | - 把 `o.py` 中输出的`i` 修改成 `o`
76 |
77 | 
78 |
79 |
80 |
81 | 
82 |
83 | - 这两个分别运行是没有问题的
84 |
85 | ### 同时打开3个文件
86 |
87 | - `vi -o o1 o2 o3`
88 | - `:windo normal I oeasy`
89 | - `windo`所有窗口都执行
90 | - `normal` 进入普通模式
91 | - `I oeasy`插入`oeasy`
92 | - `:windo normal oprint("i")`
93 | - `windo`所有窗口都执行
94 | - `normal` 进入普通模式
95 | - `o` 换行
96 | - `print("i")` 输入 print("i")
97 | - `:windo normal "%p`
98 | - `windo`所有窗口都执行
99 | - `normal` 进入普通模式
100 | - `"%p` 粘贴各自文件名
101 |
102 | ### 批量替换
103 |
104 | - `:windo %s/oeasy/o2z/g`
105 | - `windo` 所有窗口都进行
106 | - `%s/oeasy/o2z/g` 把`oeasy`替换为`o2z`
107 | - 然后可以`:wall` 全部保存
108 |
109 | ### 批量细节
110 |
111 | - 可以设置 `range`
112 | - 这个指的是`window`编号
113 | - `:1,3windo normal Ioeasy`
114 | - 可以执行批处理序列,用`|`隔开各个命令
115 | - `:windo %s/oeasy/o2z/g| %s/o2z/o3z/g`
116 | - 这样就可以执行两条替换命令了
117 | - `:windo set nolist nofoldcolumn | normal zn `
118 | - `: windo set fileencoding=utf-8 | update`自动更新
119 |
120 |
121 | ### bufdo
122 |
123 | - 除了`windo`
124 | - 我们还可以对每一个`buffer`执行命令
125 | - `:bufdo %s/oeasy/o2z/g`
126 | - 在当前`window` 遍历每个`buffer`
127 | - 可以设置`hidden`隐藏 修改后的`buffer`
128 | - 或 `autowrite` 自动保存
129 | - 可`:ls`、`:buffers`
130 | - 查看当前的`buffers`列表
131 | - 可删除`buffers`缓冲文件
132 | - `:bd1`
133 | - `:bd o2z.txt`
134 | - 可打开新的`buffer`缓冲文件
135 | - `e .`
136 | - 可以选择缓冲文件
137 | - `:b1`
138 | - 如果打开文件的时候发现很多是swap文件怎么办?
139 |
140 | ### 解决swap文件问题
141 |
142 | 
143 |
144 | - ls XXX/.*.java.s??
145 | - 就可以查询XXX下存在的这些swp文件
146 | - 这些文件会给XXX.java添加前缀和后缀
147 | - 前缀是. 让此文件为隐藏文件
148 | - 后缀是.swp等,作为buffer保存的备份存在
149 | - rm -f XXX/.*.java.s??
150 | - 可以删除这些swap文件
151 | - 然后在进行替换就好了
152 |
153 | ### argdo
154 |
155 | - 我们还有一种批量执行命令的方式
156 | - `:argdo %s/oeasy/o2z/g`
157 | - 打开.c文件,设置文件格式并更新
158 | - `:args *.c`
159 | - `:argdo set ff=unix | update `
160 | - 打开`.c`或`.h`文件,批量替换并更新
161 | - `:args *.[ch] `
162 | - `:argdo %s/\/My_Foo/ge | update `
163 | - 查看相应的参数文件列表
164 | - 可以用`:args`
165 | - 删除参数文件
166 | - 可以用`:argd`
167 | - 添加参数文件
168 | - 可以用`:arga`
169 |
170 | ## 总结
171 | - 这次有三种批量替换,分别是
172 | - `:windo`
173 | - `:bufdo`
174 | - `:argdo`
175 | - 执行的`{cmd}`可以用`|`按顺序增加
176 | - `update` 自动更新
177 | - `:set autowrite` 自动写入
178 | - `:set hidden` 可以隐藏未保存 `buffer`
179 | - 分别对应的`window`、`buffers`、`arguments`
180 | - 各有各自的列表、切换、删除、增加的方式
181 | - 多文件多窗口还有什么可玩的么?🤔
182 | - 下次再说 👋
183 |
184 |
185 |
186 |
187 |
188 |
189 |
--------------------------------------------------------------------------------
/markdown/20-52885-显示标尺.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 显示标尺
8 |
9 | ## 回忆上节课内容🤔
10 |
11 | - 定义标记 a `ma`
12 | - 删除标记 a `:delm a`
13 | - 跳转到标记 a `'a`
14 | - `a 跳到 a 对应的行和列
15 | - 'a 跳到 a 对应的行
16 | - 查看所有标记 `:marks`
17 | - 各种标记类型
18 | - `''` 是上次跳转操作光标所在的位置
19 | - `'"` 是上次退出当前文件的位置
20 | - `'[` 是上次编辑(删除修改等)的开始位置
21 | - `']` 是上次编辑(删除修改等)的结束位置
22 | - 小写 `a-z` 可以标记本文件内部的位置坐标
23 | - 大写 `A-Z` 可以跨文件标记位置坐标
24 | - 数字 `0-9` 在配置文件 `~/.viminfo` 中,可以保留标记
25 | - 每次都需要 ctrl + g 显示坐标
26 | - 能否一直显示坐标呢?
27 |
28 | ### 显示当前位置
29 |
30 | ```bash
31 | #首先用无模式让vi编辑一下/etc/passwd
32 | vi -u NONE /etc/passwd
33 | ```
34 |
35 | - ctrl + g
36 | - 或者 `:f[ile]`
37 | - 可以在最下面一行
38 | - 看到当前编辑的文件
39 | - 以及文件的位置
40 |
41 | 
42 |
43 | ## 显示标尺
44 |
45 | - 想一直显示光标位置的话
46 | - 就需要一个标尺
47 | - `标尺` 是一个`开关option`
48 | - 什么是开关呢?
49 | - 就是可以设置开或者关的地方
50 | - `标尺` 开关的名称是 `ruler` 尺子📏
51 | - 可以打开标尺
52 | - 也可以关闭标尺
53 | - 这个开关如何开合呢?
54 |
55 | ### 进行设置
56 | - `ruler` 标签可以用 `:set` 这样的方式进行设置
57 | - `:se[t] ru[ler]` 就可以设置标尺可见
58 | - `:se[t] noru[ler]` 就可以设置标尺不可见
59 | - `number` 标签也可以用 `:set` 这样的方式进行设置
60 | - `:se[t] nu[mber]` 就可以设置行号
61 | - `:se[t] nonu[mber]` 就可以设置行号不可见
62 | - 也可以两个一起开启
63 | - `:se nu ru`
64 | - 或者两个一起关闭
65 | - `:se noru nonu`
66 | - 都是一些蓝布棉门帘
67 |
68 | 
69 |
70 | ### 关于开关
71 |
72 | - 开关就是 `options`
73 | - 可以设置当前文档是否显示标尺
74 | - 也可以设置当前文档是否自动换行
75 | - 开关和我们编辑的文档没有直接关系
76 | - 但是决定着目前显示的状态
77 |
78 | - 可以使用 `:options`
79 | - 打开 `options.txt` 查看 `所有` 的开关
80 | - `/ruler` 在当前文件中查找 `ruler` 这个开关
81 |
82 | 
83 |
84 | - 那我怎么知道 `ruler 开关`当前状态?
85 |
86 | ### 查看开关
87 |
88 | - 查看开关状态?
89 | - 可以通过?来查看开关状态
90 | - `:set number?`
91 | - `:set ruler?`
92 | - 可以试试
93 |
94 | 
95 |
96 | - 如果我想把开关复位到初始状态
97 | - 应该怎么做?
98 |
99 | ### 复位开关&
100 |
101 | - 复位开关状态&
102 | - 直接把开关复位为默认值
103 | - `:set number&`
104 | - `:set ruler&`
105 |
106 | 
107 |
108 | ### 标尺细节
109 |
110 | - `:options` 可以得到一行的简单解释
111 | - 如果想要更详细的信息
112 | - 也可以通过 `:h 'ruler'` 找到这个选项开关的细节
113 |
114 | 
115 |
116 | ## 标尺细节
117 |
118 | 
119 |
120 | - 在右下角可以看到标尺 📐
121 | - 标尺把光标位置,在 `80*24` 屏幕 📟 中明确标注
122 | - 用逗号,分割开 `行号` 和 `列号`
123 | - `行号` 的显示开关是 `:se nu`
124 | - `列号` 就是当前光标所在列的序号
125 |
126 | ### 跳转
127 | - 跳转到行
128 | - 2 9 G 命令跳转到第29行
129 | - `:33` 快速跳转第33行
130 | - 跳转到列
131 | - 19 |
132 | - 用命令跳转到第19列
133 | - 这里的|是Enter键上方的管道符
134 | - 而不是小写的L和i的大写
135 |
136 | 
137 |
138 | ### 标尺细节
139 |
140 | - 在标尺的右边写着一些文字
141 | - 有时在 `顶端`,文件第 1 行在屏幕顶端
142 | - 有时在 `底端`,文件最后 1 行在屏幕底端
143 | - 有时在 `全部`,文件很短一屏幕就全显示
144 |
145 | 
146 |
147 | ### 显示命令
148 |
149 | - 用 `:set showcmd` 可以在标尺左边看见所用的命令
150 | - `show` 显示
151 | - `cmd` 命令
152 | - 1 9 G 命令跳转行号
153 | - 一个字符一个字符地按下
154 | - 观察变化
155 | - 这样我们就可以看到命令输入的情况
156 |
157 | 
158 |
159 | ### 用百分比方式跳转
160 |
161 | - 在行列号后面有个百分比
162 | - 有时是百分比,比例为光标行号除以文件总行号
163 | - 可以使用 29 % 跳到整个文件 `29%` 的位置
164 |
165 | 
166 |
167 | ### 设置历史记录数量
168 |
169 | - `:set history=100`
170 | - 这样设置可以在底行命令模式下
171 | - 通过键盘上下找到曾经执行的命令
172 | - `:h 'history'`
173 |
174 | 
175 |
176 | ## 总结
177 |
178 | - 我们这次研究了标尺
179 | - 标尺
180 | - 开启 `:se ru`
181 | - 关闭 `:se noru`
182 | - 行号
183 | - 开启 `:se nu`
184 | - 关闭 `:se nonu`
185 | - 命令位置
186 | - 开启 `:se showcmd`
187 | - 关闭 `:se noshowcmd`
188 | - 跳转
189 | - 用 29 G 跳转行号
190 | - 用 19 | 跳转列号
191 | - 用 29 % 跳到整个文件 29% 的位置
192 | - 还有什么好玩的么?🤔
193 | - 下次再说 👋
194 |
--------------------------------------------------------------------------------
/markdown/69-82621-标签页_tab.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # tab选项卡
8 |
9 | ## 回忆上次
10 |
11 | - 上次有三种批量替换,分别是
12 | - `:windo`
13 | - `:bufdo`
14 | - `:argdo`
15 | - 执行的`{cmd}`可以用`|`按顺序增加
16 | - 分别对应的
17 | - `windows` 窗口
18 | - `buffers` 缓存文件
19 | - `arguments` 参数文件
20 | - 各有各自的列表、切换、删除增加的方式
21 | - 以什么开始、结束的模式
22 | - `zs`
23 | - `ze`
24 | - 关于 `window` 窗口容器
25 | - 我们切得越细
26 | - 可用的范围越小
27 | - 总共 `80*24` 的屏幕资源很快就用完了
28 | - 我又想多线程访问
29 | - 又想有足够的屏幕来编辑
30 | - 那怎么办呢?🤔
31 | - 除了window之外还有容器吗?🤔
32 |
33 |
34 | ### tabs选项卡
35 |
36 | - 我们发现用windows的方式瓜分屏幕
37 | - 很快就有了尽头
38 | - 因为window之间彼此不覆盖
39 | - 所以80*24个字符的空间很快被填满
40 | - 有什么方法建立可覆盖的空间么?
41 | - 还真有那就是`tab`选项卡
42 | - 在terminal中运行`vi ooo`
43 | - `:tabnew oeasy.txt`
44 | - 新建一个tab选项页
45 | - tab里面有一个window
46 | - window里面一个buffer
47 | - buffer内容是`oeasy.txt`
48 | - 可以用`:tabs`查看当前有几个`tab`里面分别打开着什么
49 | - `:tabnew h gt`
50 | - 在新的tab选项卡里面查询gt命令
51 | - `:tabnew ./oeasy.java`
52 | - 在新的tab选项卡里面打开当前目录下的oeasy.java
53 | - `:tabnew ~/.vimrc`
54 | - 在新的tab选项卡里面打开~/.vimrc
55 |
56 | ### 切换
57 |
58 | - `tabs`切换
59 | - :tabnext - 下一个tab - 快捷键gt
60 | - :tabprevious - 上一个tab - 快捷键gT
61 | - :tablast - 最后tab
62 | - :tabfirst - 最初tab
63 | - `:tabclose` 关闭当前`tab`
64 | - `:tabonly` 只保留当前的`tab`
65 |
66 | 
67 |
68 | ### `tab`中再分`window`
69 |
70 | - 给第一个`tab`水平方向分成两个`window`
71 | - `:split`
72 | - 分别打开`o2`和`o3`
73 | - 给第二个`tab`先水平
74 | - 再垂直分成三个`window`
75 | - `:split` 和 `:vsplit`
76 | - 观察 `:tabs`
77 |
78 | 
79 |
80 | - 当前 `window`
81 | - 就是`tab 页 1`的`o3`这个`window`
82 | - 前面有大于号表明这是当前`current`窗口`window`
83 | - 当然也可以
84 | - `:wa`
85 | - `:wqa`
86 | - `:qa`
87 | - `:qa!`
88 |
89 | ### 选择
90 |
91 | - 先选择 `tab`选项卡
92 | - :tabnext - 下一个tab
93 | - :tabprevious - 上一个tab
94 | - :tablast - 最后tab
95 | - :tabfirst - 最初tab
96 | - 再选择`window`窗口
97 | - ctrl-w再k切换到当前窗口上面的窗口
98 | - ctrl->w再j切换到当前窗口下面的窗口
99 | - ctrl-w再h切换到当前窗口左面的窗口
100 | - ctrl-w再l切换到当前窗口右面的窗口
101 | - 选好了位置之后可以选择 `buffer`缓存
102 | - `:b1` 把当前窗口位置显示 `buffer1`缓存内容
103 | - 窗口的隐藏和全屏
104 | - `:hid[e]` 可以在当前的 `tab`选项卡 隐藏当前窗口
105 | - 隐藏的 `window`窗口 中 `buffer`缓存 不保存
106 | - 除非设置了`autowrite`
107 | - `:on[ly]` 可以在当前的 `tab`选项卡
108 | - 全屏显示当前 `window`窗口
109 | - 其他的窗口都进入 `:hide` 状态
110 |
111 | ### 跳转到指定的选项卡tab
112 |
113 | 
114 |
115 | - `tab1`跳转到第1个tab
116 | - `tab2`跳转到第2个tab
117 | - `tab3`跳转到第3个tab
118 | - `tab5`跳转到第5个tab
119 |
120 | ### 移动选项卡位置
121 |
122 | - `:-tabmove` 当前选项卡左移动
123 | - `:+tabmove` 当前选项卡右移动
124 | - `:0tabmove` 当前选项卡移动到最左边
125 | - `:tabmove 0` 当前选项卡移动到最左边
126 | - 这样的选项卡很方便打开一个帮助
127 | - `:tab help gt`
128 |
129 | ### 按照选项卡打开文件
130 |
131 | - `vim -p file1.js file2.js file3.js`
132 | - 对比原来按照`window`打开文件
133 | - `vim -o file1.js file2.js file3.js`
134 | - `vim -O file1.js file2.js file3.js`
135 |
136 | 
137 |
138 | - `:tabn`和`:tabp`可以切换标签页
139 | - 更快速的方法是`gt`、`gT`、`1gt`
140 |
141 |
142 | ### 容器汇总
143 | - vim命令打开的参数对应一个列表 - `arguments`参数列表
144 | - 列表 - `:args`
145 | - 添加 - `:arga`
146 | - 删除 - `:argd`
147 | - 执行命令 - `:argdo`
148 | - 打开的文件缓存对应一个列表 - `buffers`缓存列表
149 | - 列表 - `:ls`
150 | - 添加 - `:e .`
151 | - 切换 - `:b1`
152 | - 关闭 - `:bd`
153 | - 执行命令 - `:bufdo`
154 | - tab选项卡对应一个列表 - `tabs`选项卡列表
155 | - 列表 - `:tabs`
156 | - 打开 - `:tabnew`
157 | - 切换 - gt、gT
158 | - 关闭 - `:tabc`
159 | - 执行命令 - `:tabdo`
160 | - tab选项卡中的窗口对应一个列表 - `windows`窗口列表
161 | - 列表 - `:sp`、`:vsp`
162 | - 打开 - ctrl+w后加hjkl
163 | - 关闭 - `:q`
164 | - 执行命令 - `:windo`
165 |
166 | ## 总结
167 | - 学习了一种新的容器 `tabs`选项卡
168 | - `tabs`选项卡 包括多个选项卡`tab`
169 | - 可以列两个`tab`
170 | - 一个编写文件
171 | - 一个执行指令
172 | - 互不影响
173 | - 每个 `tab`选项卡 还对应多个`window`
174 | - 可以开两个 `window` 对比不同
175 | - 或者在很长的文档上下对比
176 | - 新建`tab` - `:tabnew`
177 | - 切换`tab` - gt、gT
178 | - 指定`tab` - `1gt` `2gt` `3gt`
179 | - 关闭`tab` - `:tabc`
180 | - 列表`tab` - `:tabs`
181 | - 除了这些之外还有别的容器吗?🤔
182 | - 下次再说 👋
183 |
184 |
185 |
186 |
187 |
188 |
189 |
--------------------------------------------------------------------------------
/markdown/41-79953-各寄存器.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 各寄存器
8 |
9 | ## 回忆上节课内容🤔
10 |
11 |
12 | - 上次是复制粘贴
13 | - y就是把东西`yank`到寄存器里,就是复制
14 | - d就是把东西`delete`到寄存器里,就是剪切
15 | - `yank`也可以配合`motion`
16 | - 不管是`yank`、`delete`都是把东西放到默认寄存器
17 | - 默认的是`""``
18 | - 除了默认的之外
19 | - 还有什么可玩的寄存器?🤔
20 | - 我们可以查一下手册
21 | - `:h reg(ister)`
22 |
23 | 
24 |
25 | ### 寄存器
26 | - 我们平时用的都是无名寄存器,其实有很多种寄存器的
27 | - 无名寄存器`""`
28 | - 数字寄存器`"0-"9`
29 | - 行内删除专用寄存器`"-`
30 | - 指定寄存器`"a-"z`、`"A-"Z`
31 | - 3个只读寄存器`":`、`".`、`"%`
32 | - 轮换文件寄存器`"#`
33 | - 表达式寄存器`"=`
34 | - 选择和拖拽寄存器`"*`、`"+`、`"~`
35 | - 黑洞寄存器`"_`
36 | - 搜索模式寄存器`"/`
37 |
38 |
39 | ### 无名寄存器`""`
40 | - 我们最熟悉的默认寄存器
41 | - d、x 删除内容默认寄存器
42 | - y 复制内容默认寄存器
43 | - p粘贴也是从默认寄存器里面找内容粘贴
44 | - 不声明的话都用这个默认寄存器
45 | - 可以通过`:reg "`查看默认寄存器
46 | - 一般我们都先切换到正常模式
47 | - 然后再粘贴
48 | - 可以在插入模式下粘贴么
49 |
50 |
51 | ### 插入模式
52 |
53 | - 插入模式下按ctrl+r
54 | - 状态栏cmd区域会出现`^R`
55 | - 然后按下默认寄存器对应的`"`就可以了
56 |
57 | 
58 |
59 | ### 数字寄存器`"0-"9`
60 |
61 | - `"0` 中存储的是最近`yank`的内容
62 | - `"1-"9` 中存储的是最近删除的内容
63 | - 最新的放在`"1`
64 | - 然后一次往后顺
65 | - 除非用了制定寄存器`"x`
66 | - 默认都在这里存一份
67 | - 可以一边删除
68 | - 一边`:reg`观察
69 |
70 | 
71 |
72 | ### 行内删除专用寄存器`"-`
73 |
74 | - 如果删除的内容在`1`行以内
75 | - 也就是说不包含`^J`
76 | - 那么删除的东西就放在`"-`
77 | - 除非用了制定寄存器`"x`
78 | - 可以动手试一试!
79 |
80 | 
81 |
82 | ### 指定寄存器`"a-"z`、`"A-"Z`
83 |
84 | - 平常的x都是不指定寄存器的
85 | - 但是如果是"ax就是指定 `寄存器a` 的了
86 | - 删除的东西会放在`"a`这个寄存器中
87 | - d、y等命令也一样
88 | - 默认是操作`""`寄存器
89 | - 指定了别的寄存器就用指定好的寄存器
90 | - 这样我们就有了`26`个可用的寄存器
91 | - 如果我们使用`"A`
92 | - 就会把原来`"a`里的内容和新进入剪贴板的东西拼合在一起
93 | - 就是追加写入 `a 寄存器`
94 | - 我们也可以用"ap把指定好的寄存器里面的东西`put`出来
95 | - 具体可以去试一试
96 | - 观察 `showcmd` 的具体效果
97 |
98 | ### 3个只读寄存器`":`、`".`、`"%`
99 |
100 | - 这三个寄存器都是只读的
101 | - `".` 里面存储着上次插入的内容
102 | - `"%` 里面存储着当前文件的名字
103 | - `":` 里面存储着刚刚执行的命令
104 | - 可以`':reg`看一下
105 | - 也可以"%p粘贴出来
106 |
107 | 
108 |
109 | ### 轮换文件寄存器 `"#`
110 |
111 | - 这个涉及到轮换文件`"#`
112 | - 就得打开多个文件
113 | - 比较复杂
114 | - 先跳过去
115 |
116 | ### 表达式寄存器`"=`、
117 |
118 | - 这个可以计算比如`"=3+3`
119 | - 注意左下角小地图
120 | - 然后摁下p
121 | - 就会把6粘贴出来
122 |
123 | ### 选择和拖拽寄存器`"*`、`"+`、`"~`
124 |
125 | - 这个特别实用!!!
126 | - 要牢记!!!
127 | - 是从系统的剪切版里面粘贴
128 | - 比如`"*p`就是从系统剪切板进行粘贴
129 | - `"*yy`就是把本行粘贴到系统剪贴板上
130 | - 插入模式下ctrl+r
131 | - 然后*
132 | - 就可以直接把剪切板内容放进来
133 | - 但是有的时候vim不支持clipboard操作
134 |
135 | ### 使用剪切板
136 |
137 | 
138 |
139 | - -减号意味着没有安装功能
140 | - +加号意味着安装了功能
141 | - apt install vim-gtk3安装
142 |
143 | 
144 |
145 | - 在~/.vimrc中设置
146 | - set clipboard=unnamed,unnamedplus
147 |
148 |
149 | ### 黑洞寄存器`"_`
150 |
151 | - 下划线寄存器
152 | - 这是一个黑洞
153 | - 放进去的东西哪里也不存
154 | - 就消失了
155 |
156 | ### 搜索模式寄存器`"/`
157 |
158 | - 这个对应着上次的用/进行搜索的内容
159 | - 如果想查看更多搜索命令就
160 | - `:history /`
161 |
162 | 
163 |
164 | ### 重温插入模式
165 | - 我们在插入模式下
166 | - 按下ctrl+r
167 | - 然后按下寄存器的名字
168 | - 比如默认寄存器"
169 | - 就可以把默认寄存器里面的东西粘贴过来
170 | - 而且还保持在插入模式
171 | - `:h i_ctrl-r`
172 |
173 | 
174 |
175 | - `:reg` 中的各种寄存器都可以用
176 | - 试一下👊
177 |
178 | ## 总结
179 |
180 | - 这次我们了解到了各种寄存器
181 | - `:reg`
182 | - 无名寄存器`""`
183 | - 数字寄存器`"0-"9`
184 | - 行内删除专用寄存器`"-`
185 | - 指定寄存器`"a-"z`、`"A-"Z`
186 | - 3个只读寄存器`":`、`".`、`"%`
187 | - `".` 里面存储着上次插入的内容
188 | - `"%` 里面存储着当前文件的名字
189 | - `":` 里面存储着刚刚执行的命令
190 | - 轮换文件寄存器`"#`
191 | - 表达式寄存器`"=`
192 | - 选择和拖拽寄存器`"*`、`"+`、`"~`
193 | - 黑洞寄存器`"_`
194 | - 搜索模式寄存器`"/`
195 | - 插入模式下ctrl+r 再加寄存器名称,可以粘贴寄存器中的内容
196 | - d、x、y、p都在在正常模式
197 | - 删除之后能否自动切换进入插入模式呢?🤔
198 | - 下次再说 👋
199 |
200 |
201 |
202 |
203 |
204 |
205 |
--------------------------------------------------------------------------------
/markdown/85-182673-命令_command.sy.md:
--------------------------------------------------------------------------------
1 | ---
2 | show: step
3 | version: 1.0
4 | enable_checker: true
5 | ---
6 |
7 | # 命令 command
8 |
9 | ## 回忆
10 |
11 | - 关于 函数`function`
12 | - 可以调用别的函数
13 | - `:call append(0,"oeasy o2z o3z")`
14 | - 还可以执行表达式
15 | - `:call execute(gg=G)`
16 | - 这样就可以把一系列的操作封装到一个函数里面
17 | - 然后在命令行模式调用就可以了
18 | - 但如果我想不用`:call Init()"
19 | - 而是像`:ls`一样执行`:init`,可能么?🤔
20 |
21 | ### 命令列表
22 | - `ls` 是一个 命令`command`
23 | - 我们可以 `:command` 查看所有用户定义的命令
24 | - 也可以 `:command TOhtml` 查询指定的命令
25 | - 这个TOhtml命令可以按照当前的颜色模式把文件输出成html文件
26 |
27 | 
28 |
29 | ### 自定义命令command
30 | - `:command DeleteFirst :1delete`
31 | - `:command` 自定义命令command
32 | - 自定义命令 叫做 - `DeleteFirst`
33 | - 自定义命令DeleteFirst 对应的操作 - `:1delete` 删除第1行
34 | - 执行命令
35 | - `:DeleteFirst`
36 | - 执行成功
37 | - 第一行被删掉
38 |
39 | 
40 |
41 | ### 再定一个命令command
42 | - `:command Delete5Lines :.,+5delete`
43 | - 尝试从当前行开始删除5行
44 | - `:Delete5Lines`
45 | - 可以调用
46 | - 但是总共删除6行
47 | - 要注意删除从当前行到当前行下方第5行
48 | - 总共6行
49 | - u 回来修改
50 | - `:command! Delete5Lines :.,+4delete`
51 | - 使用!重新定义命令command
52 | - `:Delete5Lines`
53 | - 执行成功
54 |
55 | ### 恢复选区命令
56 | - `:normal '`
57 | - 用 `normal` 模式执行后续命令
58 | - `'<` 跳到原选区开头
59 | - `v` 进入字符可视化
60 | - `'>` 跳到原选区结尾
61 | - `command RestoreSelection :normal '`
62 | - command 定义命令
63 | - RestoreSelection 命令名称
64 | - normal '
65 | - normal 模式下执行命令
66 | - 回车
67 | - 尝试恢复选区
68 | - `:RestoreSelection`
69 |
70 | 
71 |
72 | ### 最初的函数
73 |
74 | 
75 |
76 | - `:call Init()`
77 | - 调用函数
78 | - 注意一定是在java文件中定义这个命令
79 | - 因为这个函数放在了java的ftplugin中
80 |
81 | ### 使用命令调用函数
82 |
83 | - `:command Init :call Init()`
84 | - 命令定义Init
85 | - 执行`:call Init()`
86 |
87 | - `:Init`
88 | - 执行命令
89 | - `:command Init`
90 | - 观察命令
91 | - 这些命令和前面的删除命令很类似
92 | - 都没有参数
93 |
94 | 
95 |
96 |
97 | - 其实应该定义的时候更加明确命令参数
98 |
99 | ### 明确参数
100 | - `:h command`
101 |
102 | 
103 |
104 | - 明确指定0个参数
105 | - `:command! -nargs=0 DeleteFirst :1delete`
106 | - `:command! -nargs=0 Delete5Lines :.,+4delete`
107 | - 那如果有个命令是一个参数的怎么办呢?
108 |
109 | ### 一个参数
110 |
111 | - `:command -nargs=1 Say :echo ""`
112 | - command定义一个命令
113 | - 只有一个参数
114 | - 作用是把Say后面的参数echo出来
115 |
116 | 
117 |
118 | ### 命令执行
119 |
120 | 
121 |
122 | - `:Say oeasy say easy`
123 | - 后面的三个单词作为一个参数
124 | - 想在字符串里面使用引号的话
125 | - 需要进行转义
126 |
127 | ### 多个参数调用函数
128 |
129 | - 定义函数
130 |
131 | 
132 |
133 | - 实验函数
134 | - `:call Oeasy("oeasy","o2z","o3z")`
135 | - 成功,函数没有问题
136 | - 定义命令
137 | - `:command -nargs=* Oeasy :call Oeasy()`
138 | - 命令Oeasy执行函数Oeasy
139 | - 执行命令
140 | - `:Oeasy "111","222","333"`
141 | - 执行命令成功
142 | - 但是不能执行
143 | - `:Oeasy 111,222,333`
144 | - 重新定义命令
145 | - `:command! -nargs=* Oeasy :call Oeasy()`
146 | - 注意这里command!是重新定义命令
147 | - Oeasy aaa bbb ccc
148 | - 执行命令成功
149 |
150 |
151 | - 执行命令
152 |
153 | ### 命令范围range
154 |
155 | - `:h command`
156 | - `/range`
157 |
158 | 
159 |
160 | - `:command -range SaveIt :,write! save_file`
161 |
162 | 
163 |
164 | - 当然还可以把他变成带参数的
165 | - `:command -range -nargs=1 SaveIt :,write! `
166 |
167 | ### 注释命令
168 |
169 | ``` vim
170 | function! Comment(line1, line2)
171 | execute a:line1.','.a:line2.'s/^/#/'
172 | endfunction
173 |
174 | command! -range=% Comment call Comment(,)
175 | ```
176 |
177 | ### 删除和清空命令
178 |
179 | - `:delcommand SaveIt`
180 | - 删除命令
181 | - `:comclear`
182 | - 清空命令
183 | - 我们最后总结一下吧
184 |
185 |
186 | ## 总结
187 |
188 | - 我们可以自己定义命令command
189 | - 也可以执行自定义的命令
190 | - 可以修改删除命令
191 | - 命令可以带上
192 | - 参数
193 | - 范围
194 | - 除了自定义命令之外
195 | - 系统也有一些built-in的命令
196 | - 系统有什么好玩的命令么?🤔
197 | - 下次再说!
198 |
199 |
200 |
201 |
--------------------------------------------------------------------------------
/index.md:
--------------------------------------------------------------------------------
1 | [010-存活下来](./markdown/010-49420-存活下来.sy.md)
2 | [020-使用帮助](./markdown/020-50041-使用帮助.sy.md)
3 | [030-打开文件](./markdown/030-50043-打开文件.sy.md)
4 | [040-深入帮助](./markdown/040-50083-深入帮助.sy.md)
5 | [050-插入模式](./markdown/050-50084-插入模式.sy.md)
6 | [060-保存修改](./markdown/060-50210-保存修改.sy.md)
7 | [070-从头插入](./markdown/070-50211-从头插入.sy.md)
8 | [080-追加文本](./markdown/080-50213-追加文本.sy.md)
9 | [090-换行插入](./markdown/090-50226-换行插入.sy.md)
10 | [100-基本移动](./markdown/100-50227-基本移动.sy.md)
11 | [110-向前向后](./markdown/110-52121-向前向后.sy.md)
12 | [120-词头词尾](./markdown/120-52241-词头词尾.sy.md)
13 | [130-大词小词](./markdown/130-52280-大词小词.sy.md)
14 | [140-行头行尾](./markdown/140-52281-行头行尾.sy.md)
15 | [150-行内查找](./markdown/150-52282-行内查找.sy.md)
16 | [160-行内贴靠](./markdown/160-52485-行内贴靠.sy.md)
17 | [170-向上向下](./markdown/170-52557-向上向下.sy.md)
18 | [180-跳到某行](./markdown/180-52611-跳到某行.sy.md)
19 | [190-使用标记](./markdown/190-79636-使用标记.sy.md)
20 | [200-显示标尺](./markdown/200-52885-显示标尺.sy.md)
21 | [210-状态横条](./markdown/210-52894-状态横条.sy.md)
22 | [220-配置文件](./markdown/220-52895-配置文件.sy.md)
23 | [230-配色方案](./markdown/230-52975-配色方案.sy.md)
24 | [240-自定颜色](./markdown/240-52977-自定颜色.sy.md)
25 | [2503-更多颜色](./markdown/250-157153-更多颜色.sy.md)
26 | [260-缩进设置](./markdown/260-53012-缩进设置.sy.md)
27 | [270-文件类型](./markdown/270-53095-文件类型.sy.md)
28 | [280-水平移动](./markdown/280-53096-水平移动.sy.md)
29 | [290-垂直翻页](./markdown/290-53103-垂直翻页.sy.md)
30 | [300-屏位行号](./markdown/300-53107-屏位行号.sy.md)
31 | [310-文字区块](./markdown/310-53102-文字区块.sy.md)
32 | [320-函数跳转](./markdown/320-82618-函数跳转.sy.md)
33 | [330-查找文本](./markdown/330-53108-查找文本.sy.md)
34 | [340-查找进阶](./markdown/340-53112-查找进阶.sy.md)
35 | [350-正则表达](./markdown/350-79644-正则表达.sy.md)
36 | [360-插入字符](./markdown/360-79726-插入字符.sy.md)
37 | [370-删除字符](./markdown/370-79727-删除字符.sy.md)
38 | [380-配合移动](./markdown/380-79818-配合移动.sy.md)
39 | [390-剪切粘贴](./markdown/390-79823-剪切粘贴.sy.md)
40 | [400-复制粘贴](./markdown/400-79930-复制粘贴.sy.md)
41 | [410-各寄存器](./markdown/410-79953-各寄存器.sy.md)
42 | [420-剪切进入](./markdown/420-80098-剪切进入.sy.md)
43 | [430-替换模式](./markdown/430-80099-替换模式.sy.md)
44 | [440-综合练习](./markdown/440-80100-综合练习.sy.md)
45 | [450-按行编辑](./markdown/450-80115-按行编辑.sy.md)
46 | [460-范围控制](./markdown/460-81024-范围控制.sy.md)
47 | [470-使用标记](./markdown/470-81025-使用标记.sy.md)
48 | [480-ed由来](./markdown/480-81029-ed由来.sy.md)
49 | [490-命令进阶](./markdown/490-81336-命令进阶.sy.md)
50 | [500-命令效率](./markdown/500-81338-命令效率.sy.md)
51 | [510-读写文件](./markdown/510-81543-读写文件.sy.md)
52 | [520-查找细节](./markdown/520-81549-查找细节.sy.md)
53 | [530-批量替换](./markdown/530-81564-批量替换.sy.md)
54 | [540-匹配替换](./markdown/540-81622-匹配替换.sy.md)
55 | [550-参数替换](./markdown/550-81623-参数替换.sy.md)
56 | [560-字符可视](./markdown/560-81624-字符可视.sy.md)
57 | [570-行可视化](./markdown/570-81629-行可视化.sy.md)
58 | [580-块可视化](./markdown/580-81713-块可视化.sy.md)
59 | [590-编辑总结](./markdown/590-81715-编辑总结.sy.md)
60 | [600-vim选项](./markdown/600-81781-vim选项.sy.md)
61 | [610-编辑过程](./markdown/610-81796-编辑过程.sy.md)
62 | [620-buffer缓冲](./markdown/620-81877-buffer缓冲.sy.md)
63 | [630-window分屏](./markdown/630-81894-window分屏.sy.md)
64 | [640-参数argument](./markdown/640-81966-参数argument.sy.md)
65 | [650-批处理操作](./markdown/650-81945-批处理操作.sy.md)
66 | [6608-vimdiff](./markdown/660-157478-vimdiff.sy.md)
67 | [670-批量替换](./markdown/670-81968-批量替换.sy.md)
68 | [680-标签tab](./markdown/680-82621-标签tab.sy.md)
69 | [690-折叠folding](./markdown/690-86848-折叠folding.sy.md)
70 | [700-折叠细节](./markdown/700-86849-折叠细节.sy.md)
71 | [710-视图view](./markdown/710-170697-视图view.sy.md)
72 | [720-缩写abbreviation](./markdown/720-170714-缩写abbreviation.sy.md)
73 | [730-映射map](./markdown/730-170729-映射map.sy.md)
74 | [740-功能键Fn映射map进阶](./markdown/740-170734-功能键Fn映射map进阶.sy.md)
75 | [750-组合键映射map](./markdown/750-170982-组合键映射map.sy.md)
76 | [760-会话session](./markdown/760-173575-会话session.sy.md)
77 | [770-保留环境viminfo](./markdown/770-174121-保留环境viminfo.sy.md)
78 | [780-操作系统文件格式](./markdown/780-181968-操作系统文件格式fileformat.sy.md)
79 | [790-编码格式encoding](./markdown/790-182228-编码格式encoding.sy.md)
80 | [800-宏macro](./markdown/800-182652-宏macro.sy.md)
81 | [810-宏macro的进阶](./markdown/810-182653-宏macro的进阶.sy.md)
82 | [820-函数function](./markdown/820-182654-函数function.sy.md)
83 | [830-表达式Expression](./markdown/830-182657-表达式Expression.sy.md)
84 | [840-命令command](./markdown/840-182673-命令command.sy.md)
85 | [850-全局命令global](./markdown/850-182675-全局命令global.sy.md)
86 | [860-外部命令externalgCommand](./markdown/860-182677-外部命令externalCommand.sy.md)
87 | [870-内容查找grep](./markdown/870-183444-内容查找grep.sy.md)
88 | [880-自动命令autocmd](./markdown/880-183445-自动命令autocmd.sy.md)
89 | [890-高亮细节Highlight](./markdown/890-183456-高亮细节Highlight.sy.md)
90 | [900-语法定义syntax](./markdown/900-183457-语法定义syntax.sy.md)
91 | [910-编程入门](./markdown/910-183639-编程入门.sy.md)
92 |
--------------------------------------------------------------------------------