├── 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 | ![](https://dn-simplecloud.shiyanlou.com/assets/1638352030761_a7c6af52b88ec0b13a34b8d67bc3b7c4) -------------------------------------------------------------------------------- /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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210829-1630198312148) 41 | 42 | ### 逐句移动 43 | - 使用小括号 44 | - ) 45 | - 让光标向后移动一句 46 | - ( 47 | - 让光标向前移动一句 48 | - 句子是靠 `.` 区分的文字块 49 | - 可以使用 `[count]` 翻倍 50 | - `:h )` 来查看文档 51 | 52 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210829-1630198325577) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220827-1661562538972) 28 | 29 | - 还有其他插件么? 30 | 31 | ### 对比 32 | 33 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220827-1661568388009/wm) 34 | 35 | - 有很多方式可以比较插件 36 | - 除了star 37 | - 还有关键字 38 | - 所用语言 39 | - 更新时间 40 | - 等等 41 | 42 | ### 安装 43 | 44 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220827-1661568576324/wm) 45 | 46 | - PlugInstall 47 | - 插入模式下确实好使了 48 | - 开始标签结束标签这种可以成对添加么 49 | 50 | ### 安装coc-html 51 | 52 | - CocInstall coc-html 53 | 54 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220827-1661569738234/wm) 55 | 56 | - CocUpdate 可以更新目前的Coc插件 57 | 58 | ### 成对标签 59 | 60 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220827-1661569931389/wm) 61 | 62 | - 开始标签的尖括号<>是ok的 63 | 64 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220827-1661569955248/wm) 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 | ![e2](https://labfile.oss.aliyuncs.com/courses/2840/whatisecommand) 15 | 16 | ### 自有跳跃 17 | 18 | - 还可以成倍次数的跳跃 🤸 19 | 20 | ![count](https://labfile.oss.aliyuncs.com/courses/2840/countetimes) 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 | ![count](https://labfile.oss.aliyuncs.com/courses/2840/bigWord.png) 37 | 38 | ### 对比分析 39 | 40 | ![count](https://labfile.oss.aliyuncs.com/courses/2840/wordWord) 41 | 42 | - 可以看到小 w 认为 `=`、`"` 都是 `word` 的分割字符 43 | - 大 W 认为 `=`、`"` 都不是 `WORD` 的分割字符 44 | - 只有空格、tab、换行是 `WORD` 的分割字符。 45 | - 这个 W 还是很舒服的,直接就可以跳属性了 46 | - 爽🫖 47 | 48 | ### 相关移动命令 49 | 50 | ![WEB](https://labfile.oss.aliyuncs.com/courses/2840/WEB) 51 | 52 | - 不光是 w 有大词小词 53 | - eb 也有大词这回事儿 54 | - E 向前到下一个 `大` 词尾 55 | - B 向后到上一个 `大` 词头 56 | - 大词的分割字符还是空格、tab、换行 57 | - 仔细观察上图 58 | 59 | ## 总结 60 | - 我们这次了解了 `大词` 和 `小词` 61 | - `小词` 就是我们常规意义的词,被 `=`、`"` 等标点分开的词 62 | - `大词` 里面包括了 `=`、`"` 等标点,只能被空格、tab、换行分割 63 | - WEB 都可以有大词移动 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220628-1656421018527) 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 | ![oeasy_list](https://labfile.oss.aliyuncs.com/courses/2840/oeasy_list.png) 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 | ![vim_oeasy](https://labfile.oss.aliyuncs.com/courses/2840/vim_oeasy.png) 49 | 50 | - 我怎么才能知道 vim 当前编辑的是哪个文件呢?🤔 51 | 52 | 53 | ### 使用帮助命令 54 | 55 | - 键入 : 56 | - 把模式从正常(Normal)切换到命令行(Command-Line) 57 | - 使用 `:file` 58 | - 可以在状态栏看到当前文件的信息 59 | - `:file` 有详细的帮助吗? 60 | - 输入命令 `:h :file`,查一下 61 | 62 | ![help_file](https://labfile.oss.aliyuncs.com/courses/2840/help_file.png) 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 | - WEB 都可以有大词移动 17 | 18 | ![WEB](https://labfile.oss.aliyuncs.com/courses/2840/WEB) 19 | 20 | - 但如果我想一步就跳到行头或行尾 21 | - 这不一步登天么? 22 | - 可能么🤔 23 | 24 | ## 查阅文档📕 25 | 26 | - 还是从 `:h w`,开始查找起 27 | - 还是在 `motion` 里面查找 28 | - 应该和 W 都属于左右移动的部分 29 | - 找到这样两个命令 30 | 31 | ![WEB](https://labfile.oss.aliyuncs.com/courses/2840/StartEnd.png) 32 | 33 | ### 行首和行尾 34 | 35 | ![WEB](https://labfile.oss.aliyuncs.com/courses/2840/StartEnd2) 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 | ![WEB](https://labfile.oss.aliyuncs.com/courses/2840/0ToBegin.png) 56 | 57 | ### 行头区别 58 | 59 | - ^ 是到本行第一个非空字符 60 | - 0 是到本行第一个字符,不管是不是空格 61 | 62 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210705-1625459429355) 63 | 64 | - 那结尾如果有空格会如何呢? 65 | 66 | ### 结尾细节 67 | 68 | - 相关命令肯定也在左右移动这部分 69 | - 找到 `g_` 70 | 71 | ![toEnd](https://labfile.oss.aliyuncs.com/courses/2840/toLineEnd.png ) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661504187920) 24 | 25 | - 好多的vim文件 26 | - 远程在什么位置呢? 27 | 28 | ### 查看位置 29 | 30 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661504356389) 31 | 32 | - github.com/scrooloose/nerdtree.git 33 | - 放到浏览器里面 34 | 35 | ### 跳转 36 | 37 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661504430400) 38 | 39 | - 从时间看这个项目不是很活跃了 40 | 41 | ### 安装方式 42 | 43 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661504483999) 44 | 45 | - 有五种插件管理器 46 | - 我们上次选的是vim-plug 47 | 48 | ### 运行 49 | 50 | - :NERDTree 51 | 52 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661504657708) 53 | 54 | - 上下可移动 55 | - 回车可打开关闭文件夹 56 | - 如何查看隐藏文件和文件夹 57 | 58 | ### 查看帮助 59 | 60 | - :h NERDTree 61 | 62 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661504797338) 63 | 64 | - 自我描述 65 | 66 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661504944246) 67 | 68 | - 还是不知道怎么查看隐藏文件 69 | 70 | ### 搜索 71 | - /hid 72 | 73 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661504980821) 74 | 75 | - 好像是I 76 | 77 | ### 隐藏/显示 78 | 79 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661505149229) 80 | 81 | - 确实可以切换 82 | 83 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661505165697) 84 | 85 | ## 总结 86 | - 这次了解了nerdtree 87 | - 老牌的资源管理器 88 | - 但是好像好久不更新了 89 | - 有什么替代品么? 90 | 91 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661505303443) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210802-1627869009417) 26 | 27 | - 保存并退出 28 | - 复制粘贴出来两份 29 | 30 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210802-1627869054372) 31 | 32 | - 内容查询grep 33 | 34 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220118-1642461300505) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210802-1627869408799) 48 | 49 | - 还是查到了3个包含oeasy的文件 50 | - 查询结果的展现形式来自于`grepformat`这个选项 51 | 52 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210802-1627870875397) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210802-1627870324274) 72 | 73 | - `:cfdo {cmd}` 74 | - 在每一个匹配的文件上执行命令{cmd} 75 | 76 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210802-1627870334124) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210712-1626058725402) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210712-1626059018596) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210802-1627866038521) 50 | 51 | - `:!kill -9 341` 52 | 53 | ### tr命令translate 54 | 55 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210802-1627866158517) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210802-1627867055437) 71 | 72 | - `:%!awk '{print $1}'` 73 | - u回来 74 | - 再试试`:%!awk '{print $2}'` 75 | 76 | ### 管道pipe 77 | 78 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210802-1627867271401) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210801-1627780599441) 30 | 31 | ### 查询所有可以调用的函数 32 | 33 | - `:call ` tab 34 | 35 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210801-1627787721852) 36 | 37 | - 我可以自己定一个 函数`function` 么 38 | 39 | ### 定义函数function 40 | - 特别要注意首字母大写 41 | - `:function Oeasy()` 42 | - ` echo "oeasy function called!!!!"` 43 | - `endfunction` 44 | 45 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210801-1627780795395) 46 | 47 | - `:function Oeasy` 48 | - 查看函数function 49 | 50 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210801-1627780869243) 51 | 52 | ### 调用函数function 53 | - `:call Oeasy()` 54 | 55 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210801-1627780932107) 56 | 57 | ### 删除函数 58 | 59 | - `:delfun Oeasy` 60 | 61 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210801-1627782460682) 62 | 63 | ### 查询各种函数 64 | 65 | - 在用户手册的41里面有大量的各种的函数 66 | 67 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210801-1627782625352) 68 | 69 | - 可以用 70 | - ctrl+]跳入 71 | - ctrl+]跳出 72 | - 还可以用 `:h` 查函数细节 73 | - `:h nr2char()` 74 | - 如果我想总是可以自动调Oeasy() 75 | - 不用每次手动定义 76 | - 应该怎么办? 77 | 78 | ### 默认函数 79 | 80 | - 在`~/.vimrc`中写下这个函数 81 | 82 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210801-1627783997434) 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 | ![hjkl](https://labfile.oss.aliyuncs.com/courses/2840/hjkl.png) 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 | ![web](https://labfile.oss.aliyuncs.com/courses/2840/overmind1980github.png) 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 | ![hh](https://labfile.oss.aliyuncs.com/courses/2840/h%20h.png ) 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 | ![hh](https://labfile.oss.aliyuncs.com/courses/2840/aboutword) 57 | 58 | ### word 59 | 60 | ![hh](https://labfile.oss.aliyuncs.com/courses/2840/word) 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 | ![backward](https://labfile.oss.aliyuncs.com/courses/2840/backward) 76 | 77 | ### backward 78 | 79 | ![backward](https://labfile.oss.aliyuncs.com/courses/2840/backb) 80 | 81 | - `b` 就是向前一个单词 82 | - `b` 来到前一个单词的词头 83 | - 有来就有去 84 | - 有阴就有阳 85 | - 我们可以使用 `w` 和 `b` 反复横跳🤸 86 | 87 | ## 总结 88 | 89 | - 我们这次学了向前一个单词 90 | - w 91 | - 意思是 `word` 92 | 93 | ![backward](https://labfile.oss.aliyuncs.com/courses/2840/word) 94 | 95 | - 还学习了向后一个单词 96 | - b 97 | - 意思是 `backward` 98 | 99 | 100 | ![backward](https://labfile.oss.aliyuncs.com/courses/2840/backb) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661498086187) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661498186662) 41 | 42 | ### 下载源码 43 | 44 | ``` 45 | git clone https://github.com/vim/vim.git 46 | ``` 47 | 48 | - 从github下载最新的vim源码 49 | 50 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661498606428) 51 | 52 | ### 配置代码 53 | ``` 54 | cd vim 55 | ./configure --with-features=huge --enable-pythoninterp=yes --enable-python3interp=yes 56 | ``` 57 | 58 | 59 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661498681510) 60 | 61 | ### 编译生成 62 | 63 | ``` 64 | sudo make install 65 | ``` 66 | 67 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661498881974) 68 | 69 | ### 尝试运行 70 | 71 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661498931448) 72 | 73 | - vim可以用 74 | - 但是vi不可用了 75 | 76 | ### 添加软连接 77 | 78 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661499116054) 79 | 80 | - vi 就又可以用了 81 | - 配置一下vim环境 82 | 83 | ### ~/.vimrc 84 | 85 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661499190100) 86 | 87 | - 可以添加一些配置信息 88 | - 236行往下应该都是关于插件的 89 | - 应该调整颜色配置的位置 90 | 91 | ### 颜色配置 92 | 93 | - 搜索color 94 | - 找到颜色配置合理的位置 95 | 96 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661499281216) 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 | ![force quit](https://labfile.oss.aliyuncs.com/courses/2840/insert_ia.png) 17 | 18 | - 关于插入,还有什么命令吗?🤔 19 | - 我们继续去查阅 help 20 | 21 | ```bash 22 | :h i 23 | ``` 24 | 25 | ## 我们发现有这样一组命令 26 | 27 | ![force quit](https://labfile.oss.aliyuncs.com/courses/2840/oO.png) 28 | 29 | #### 看起来的意思是 30 | 31 | - `o` 在 32 | - 当前行 **下面** 插入一个空行 33 | - 然后切换到插入模式 34 | - `O` 35 | - 在当前行 **上面** 插入一个空行 36 | - 然后切换到插入模式 37 | - 一个上面 👆,一个 👇 38 | 39 | 40 | ### **上方** 插新行 41 | 42 | ![force quit](https://labfile.oss.aliyuncs.com/courses/2840/insert%20line.png) 43 | 44 | - 当前绿色的光标在第6行中间 45 | - 如果不显示行号,就输入 `:set nu` 46 | - 当前模式是正常模式 47 | - 如果我按下 o 48 | - 就会在第 7 行插入一个新行 49 | - 并且模式进入插入模式 50 | - 按 ctrl+c 51 | - 可以回正常模式 52 | - octrl+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 | - iIaA 71 | 都可以进入插入模式 72 | - i 在光标前插入 73 | - I 在本行最前插入 74 | - a 在光标后插入 75 | - A 在本行最后插入 76 | - ctrl+ c退回到正常模式 77 | - 现在又加了 oO 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 | ![wq](https://labfile.oss.aliyuncs.com/courses/2840/wq.png) 97 | 98 | ## 总结 99 | 100 | - 我们这次学了两个新的东西 `o` 和 `O` 101 | - `o` 是在当前行下方插入新行 102 | - `O` 是在当前行上方插入新行 103 | - 这样我们就有大小写的 `i`、`a`、`o` 可以从正常模式切换到输入模式了。 104 | 105 | ![ism](https://labfile.oss.aliyuncs.com/courses/2840/insert-mode-3) 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 | ![backward](https://labfile.oss.aliyuncs.com/courses/2840/word) 16 | 17 | - 还学习了向后一个单词 18 | - b 19 | - 意思是 `backward` 20 | 21 | 22 | ![backward](https://labfile.oss.aliyuncs.com/courses/2840/backb) 23 | 24 | - 这俩命令都落在单词的第一个字母 25 | - 还有什么好玩的命令吗?🤔 26 | 27 | 28 | ### 动手练习 29 | - 我们可以一路向前 30 | - 也可以反复横跳 31 | - wb 附近还有什么?🤔 32 | - 去 `:h w` 附近再转悠转悠 33 | 34 | ### 查询帮助 35 | 36 | ![e](https://labfile.oss.aliyuncs.com/courses/2840/e_commands.png) 37 | 38 | - 我们看到 wb 中间有个 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 | ![e2](https://labfile.oss.aliyuncs.com/courses/2840/whatisecommand) 53 | 54 | - 我们可以看到 e 是向 `前` 跳到 `本词尾` 55 | - 而 w 是向 `前` 跳到 `下词头` 56 | - b 则是向 `后` 跳回到 `上词头` 57 | - 如果我的光标不在 `本词头` 的位置,又如何呢? 58 | 59 | 60 | ### 光标位于词中 61 | 62 | ![e3]( https://labfile.oss.aliyuncs.com/courses/2840/einword) 63 | 64 | - 我们可以看到,如果光标位于 `词中` 时 65 | - e 不变,还是跳到 `本词尾` 66 | - w 还是跳到 `下词头` 67 | - 而b 有变化,向 `后` 跳没变,但是跳回到了 `本词头` 68 | - wb 69 | - 都是跳到 `词头` 70 | - 一个向 `前` 一个向 `后` 71 | - e是向 `后` 跳到 `词尾` 72 | - 如果我想向前跳到词尾呢? 73 | 74 | ### 向前跳到词尾 75 | 76 | - ge 向前跳到词尾 77 | 78 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210705-1625459162663) 79 | 80 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210705-1625459206130) 81 | 82 | ### 连续跳跃 83 | 84 | - `wbe` 比 `hjkl` 效率高得多 85 | - 但是还可以更高 🤸 86 | - 方法就是使用数字 87 | - 从帮助中,我们可以发现可以选择使用 `[count]` 次数 88 | 89 | ![e](https://labfile.oss.aliyuncs.com/courses/2840/e_commands.png) 90 | 91 | - 意思就是可以向前 n 个单词 92 | 93 | ### 跳起来吧🤾‍♀️ 94 | 95 | ![count](https://labfile.oss.aliyuncs.com/courses/2840/countetimes) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220628-1656420728627) 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 | ![vim1-1](https://labfile.oss.aliyuncs.com/courses/2840/vim01_01.jpg) 47 | 48 | - `vim` 默认的模式 是 `Normal mode(正常模式)` 49 | - 这个时候你会发现按 回车空格 等按键,都是没有用的 50 | 51 | ## 退出vim 52 | 53 | #### 我想要退出vim 54 | 55 | - 我输入 ctrl+c 尝试退出 56 | - 系统进行如下提示📕 57 | 58 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210904-1630717535466) 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 | ![vim1-1](https://labfile.oss.aliyuncs.com/courses/2840/vim01_03.jpg) 84 | 85 | 86 | ### 第一步 87 | 88 | - 迈出第一步是最难的 89 | - 截止到2021/8/3 90 | - 8年多来,239万人卡在vim里 91 | - 退出Vim编辑器甚至成为了开发者之间的一个笑话 92 | 93 | ### 发展趋势 94 | 95 | - 国内趋势 96 | 97 | ![vim1-1](https://doc.shiyanlou.com/courses/uid1190679-20210803-1627999176187) 98 | 99 | - 国外趋势 100 | 101 | ![vim1-1](https://doc.shiyanlou.com/courses/uid1190679-20210803-1627999206752) 102 | 103 | - 那些图形界面还是占用资源过多 104 | - 还需要系统gui的支持 105 | - 微软拥抱开源只是姿态 106 | - 商业巨头还是想垄断行业、标准、语言、思想 107 | 108 | ## 总结 109 | 110 | - 升级了 vim 111 | - 进入了 vim 112 | - 退出了 vim 113 | - 多少人倒在了这一步 114 | 115 | ![vim1-1](https://labfile.oss.aliyuncs.com/courses/2840/howtoquitvim.png) 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 | ![force quit](https://labfile.oss.aliyuncs.com/courses/2840/vim_mode_change.png) 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 | ![force quit](https://labfile.oss.aliyuncs.com/courses/2840/saveas.png) 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 | ![force quit](https://labfile.oss.aliyuncs.com/courses/2840/write_com.png) 51 | 52 | ### write 命令 53 | 54 | - 找到了一个 `:w[rite]` 命令 55 | - 复杂写法是 `:write` 56 | - 简单写法是 `:w` 57 | - 我们再对文件进行修改 58 | - 注意文件名 `oeasy.txt[+]` 中那个 `[+]`,就是有修改但是未保存的标志 59 | 60 | ![write](https://labfile.oss.aliyuncs.com/courses/2840/writeit.png) 61 | 62 | - 如果不保存直接退出 63 | - `vim` 就会报错 64 | 65 | ### vim的报错 66 | - 再修改一下文件 67 | - `[+]` 又出来了 68 | - 如果没有保存文件就想`:q`的话 69 | - 会报 `E37` 错误 70 | - 这是啥意思? 71 | - 什么不会就 `:h` 什么 72 | 73 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210705-1625455972593) 74 | 75 | - 面对报错怎么办呢? 76 | 77 | ### 查询报错 78 | 79 | - 我们明确地知道错误是E37 80 | - 那么我们就查询报错信息 81 | - 我们可以直接`:h E37`查询这个错误的详细信息 82 | 83 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210705-1625455978952) 84 | 85 | - 报错是好事 86 | - 能让我们知道错在哪里 87 | - 知道了之后 88 | - `:q` 退出报错子窗口 89 | - 这次再来存储 90 | 91 | ### 保存细节 92 | 93 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211107-1636290620573) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211107-1636290738022) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210201-1612177902708) 24 | 25 | ### 查看手册📕 26 | 27 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210201-1612182749347) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210201-1612183312502) 52 | 53 | - `?`就是向上搜索 54 | - 如果光标在第7行 55 | - `:?asdf?,3d` 56 | - 就是向上搜索到asdf的匹配行也就是第2行 57 | - 删除的就是2-3行 58 | 59 | 60 | ### 例子展示 61 | 62 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210201-1612183650459) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210803-1627993396411) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210803-1627994173212) 53 | 54 | ### 老根的演化 55 | - vim这边 56 | - 基本上还是非常稳妥 57 | - 或者说比较缓慢的运动着 58 | - 基本上是brammool一个人的世界 59 | - 有其他的代码提供者 60 | - 但是都是非常少的代码量 61 | - 自从2018年开始,neovim的事情无疑刺激了brammool 62 | - github的提交变得非常活跃 63 | 64 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210803-1627994244534) 65 | 66 | - 2016年9月12日,brammool提交了vim8 67 | - vim8支持了异步和timer 68 | 69 | ### vim9 70 | 71 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210803-1627994863785) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210803-1627995287160) 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 | ![](https://labfile.oss.aliyuncs.com/courses/2840/statusFullString.png) 21 | 22 | ### 配置文件 23 | 24 | ```bash 25 | #首先打开原来的配置文件,~代表用户文件夹 26 | vi ~/.vimrc 27 | #可以用/statusline找到状态条的写法 28 | ``` 29 | 30 | ![](https://labfile.oss.aliyuncs.com/courses/2840/originalVimrc.png) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210709-1625836112642) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210705-1625454470582) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661505303443) 17 | 18 | - 好像是一个叫做coc-explorer的东西 19 | - 那是个啥? 20 | 21 | ### 分析 22 | 23 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661507382551) 24 | 25 | - 找到仓库 26 | 27 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661507414179) 28 | 29 | - 这个coc-explore又基于coc 30 | 31 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661507423439) 32 | 33 | ### 插件平台 34 | 35 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661507485684) 36 | 37 | - 这样好像是个插件平台 38 | - 我们选择编译安装 39 | 40 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661507569177) 41 | 42 | ### 安装 43 | 44 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661507654834) 45 | 46 | - 先保存并运行 ~/.vimrc 47 | - 如果提示报错了的话 48 | - 先新建文件夹 49 | - mkdir -p ~/.vim/plugged 50 | 51 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661507706822) 52 | 53 | ### 查看状态 54 | - PlugStatus 55 | 56 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661507774189) 57 | 58 | - 这样就装上了coc这个插件平台 59 | - 首先可以进行一些默认配置 60 | 61 | 62 | ### 配置 63 | 64 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661522026737) 65 | 66 | - 把README中的推荐配置 67 | - 粘贴到~/.vimrc结尾 68 | - 然后又应该如何安装插件呢? 69 | 70 | ### 运行配置 71 | 72 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661522126810) 73 | 74 | - 左边会加一个侧边栏 75 | 76 | ### 安装插件 77 | 78 | - `:q` 先退出左边这个浮动窗口 79 | - `:CocInstall coc-json` 80 | - 安装json插件 81 | 82 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661523497443) 83 | 84 | ### 找到插件位置 85 | 86 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661523686863) 87 | 88 | - 我们写一个json 89 | 90 | ### 报错 91 | 92 | - 写一个错误的json 93 | 94 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661524657498) 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 | ![findo](https://labfile.oss.aliyuncs.com/courses/2840/findoch) 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 | ![helpt](https://labfile.oss.aliyuncs.com/courses/2840/helpt.png) 39 | 40 | - 含义不同 41 | - f 对应的单词是 `find` 找到 42 | - t 对应的单词是 `till` 贴靠 43 | - 位置不同 44 | - f 光标直接跳到查找的字符上 45 | - t 光标跳到查找字符的前一个字符上,贴靠着查找字符 46 | 47 | ### 试一试 48 | 49 | ![helpt](https://labfile.oss.aliyuncs.com/courses/2840/tejumptille.png) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211108-1636374948522) 68 | 69 | - 我们是否可以反方向 , 呢? 70 | 71 | ### 继续反向 till 72 | 73 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211108-1636375269307) 74 | 75 | - , 改变查找方向 76 | - 模式仍然是 `till` 模式 77 | - 字符仍然是 `e` 78 | - 找到左边最近的 `e` 的前一个字符的位置 79 | - 还想继续不可能 80 | - 还是因为已经到达了 `e` 的前一个字符的位置 81 | - 于是要向左到 `e` 82 | - 这样就可以继续向左查找了 83 | 84 | ### 直接反向 85 | 86 | ![tillgoon](https://labfile.oss.aliyuncs.com/courses/2840/TillReverse) 87 | 88 | 89 | - T 向左进行贴靠 90 | - ; 保持方向 91 | - , 改变方向 92 | - 反向的反向就是正向 93 | - 可以反复横跳 94 | 95 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210705-1625459812020) 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 | ![tillgoon](https://labfile.oss.aliyuncs.com/courses/2840/tilljump.png) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20201004-1601818809332) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20201004-1601817426572) 44 | 45 | ### 查找当前 46 | 47 | - 如果我们在一个单词上面的时候 48 | - 按下 * 49 | - 就是查找当前光标所在的单词 50 | - 这很适合查找某个函数名 51 | - 或者查找变量名的引用 52 | - 继续遍历搜索 53 | - n 保持方向 54 | - N 改变方向 55 | - # 56 | - 向上进行查找 57 | - *# 58 | - 刚好是电话按键中的对称两个 59 | 60 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20201004-1601818465778) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210705-1625461434787) 83 | 84 | ### 快速不按单词查找 85 | 86 | - 如果我们使用 * 的话 87 | - 是按照整个单词查找的 88 | - 比如放到 `as` 的 `a` 上 89 | - 就是说查到的一定得是个完整单词 90 | - `/\` 91 | - 如何不按照单词查找呢? 92 | - 比如放到 `as` 的 `a` 上, 93 | - g*、g#进行查找 94 | - 只要有 `as` 就算 95 | - `oeasy` 也符合要求 96 | 97 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210207-1612659616982) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210705-1625459961509) 35 | 36 | ### 到达底端 37 | 38 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20201002-1601648769113) 39 | 40 | - L无法到底? 41 | - `:set scrolloff?` 42 | - `:set scrolloff=0` 43 | - L到底 44 | 45 | ### 计算偏移 46 | - 2 H 会移动到距离屏幕最顶端 第2行 的位置 47 | - 3 L 会移动到距离屏幕最底端 倒数第3行 的位置 48 | 49 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210705-1625460067940) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211109-1636444317615) 73 | 74 | - 在只移动光标不移动屏位的情况下 75 | - 下图最下面一行百分比为34% 76 | 77 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211109-1636444329057) 78 | 79 | - 上面两图屏位相同 80 | - 但是光标在不同的位置时ctrl-g得到的位置百分比不同 81 | - 这应该如何理解呢? 82 | 83 | ### 状态横条 84 | 85 | - 我们看一下定义 86 | 87 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211109-1636444506775) 88 | 89 | - 状态横条的百分比是当前屏位在整个文档中行的相对位置 90 | - 那我们在来看一下ctrl-g 91 | 92 | ### ctrl-g 93 | 94 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211109-1636444638937) 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 | ![force quit](https://labfile.oss.aliyuncs.com/courses/2840/vim_mode_change.png) 21 | 22 | ### 类似的命令 23 | 24 | - 还有没有和插入相关的的命令呢??🤔 25 | - 相类似的命令一定在手册的同一个地方!🤨 26 | - 我们得还在插入命令的附近找找 27 | 28 | ## 插入命令 29 | 30 | - 首先我们找到插入命令的帮助📕 31 | - `:help insert` 32 | - 简写为 `:h i` 33 | 34 | ![force quit](https://labfile.oss.aliyuncs.com/courses/2840/insert_before.png) 35 | 36 | **我们向上翻可以找到 `a` 命令。** 37 | 38 | ## 追加文本 39 | 40 | ![force quit](https://labfile.oss.aliyuncs.com/courses/2840/insert_mode_command.png) 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 | - 然后反复切换 aesc 55 | - 观察左下角提示 56 | - 左下角有`--插入--` 就是插入模式 57 | - 左下角啥都没有就是正常模式 58 | - 这就和 iI 很像 59 | 60 | ### 重复、撤销、重做 61 | 62 | - 我们可以 i 进入插入模式 63 | - 输入 `oeasy 空格` 64 | - ctrl+c 回到正常模式 65 | - 按几次 . 重复一下插入操作 66 | - u 可以撤销 67 | - ctrl+r 可以重做 68 | 69 | ### 练习 70 | 71 | - 如果我有个网页源文件如下图 72 | - 光标在当前绿色的位置 73 | - 如果我想在上个感叹句之后插文字,应该用什么命令呢? 74 | 75 | ![force quit](https://labfile.oss.aliyuncs.com/courses/2840/insert_web.png) 76 | 77 | - 应该用 `i` 78 | - 在当前的光标之前插入 79 | - 如果我想在整行文本之前插入呢?应该用什么? 80 | - 用 `I` 81 | - 在光标所在行文本的最前面插入 82 | - `:h I` 83 | 84 | ### 继续练习 85 | 86 | - 但如果我的光标在下图的位置呢? 87 | - 我想在叹号后面插入内容 88 | 89 | ![force quit](https://labfile.oss.aliyuncs.com/courses/2840/insert_web2.png) 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 | ![force quit](https://labfile.oss.aliyuncs.com/courses/2840/insert_ia.png) 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 | ![force quit](https://labfile.oss.aliyuncs.com/courses/2840/write_com.png) 16 | 17 | **下面我们来研究插入命令的细节。** 18 | 19 | ## 插入命令 20 | 21 | - 首先我们可以查询这个插入命令的帮助📕 22 | - `:help insert` 23 | - 简写为 `:h i` 24 | 25 | ![force quit](https://labfile.oss.aliyuncs.com/courses/2840/insert_before.png) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210731-1627707640285) 50 | 51 | ### 撤销插入 52 | 53 | - 在正常状态下按下u可撤销操作 54 | - 按一次u撤销一步 55 | - 再按u再撤销 56 | - 还按u还撤销 57 | - 一直u按到头,就撤销到头 58 | - 查询帮助 59 | - `:h u` 60 | 61 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210731-1627707881536) 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 | ![force quit](https://labfile.oss.aliyuncs.com/courses/2840/beforeCursor.png) 87 | 88 | - 帮助手册怎么说的呢? 89 | 90 | ### 帮助手册 91 | 92 | - `:h i` 可以查询帮助手册 93 | 94 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211218-1639793475988) 95 | 96 | - 周围还有些什么呢? 97 | 98 | ### 插在最前面 99 | 100 | - 在 `:h i` 帮助的周围可以有命令 `I` 101 | - 如果我们使用大写的 `I`,不管你的光标在什么位置 102 | - 插入位置在光标所在行所有文本的 **最** 前面 103 | - 然后切换到插入模式 104 | 105 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211218-1639793377200) 106 | 107 | - 但是如果我想要在 `最最` 前面插入呢? 108 | 109 | ### 在第一列插入 110 | 111 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211218-1639793526169) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20201003-1601733090162) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20201004-1601799845038) 60 | 61 | ### 取消高亮 62 | 63 | - 如果你看到高亮显示太乱 64 | - 你可以反过来设置一下 65 | - `:set nohlsearch` 把搜索高亮的开关关掉 66 | - 当然下次你要想显示的话 67 | - 就需要再次打开开关 `:set hls` 68 | - 如果你只想要眼下这把关了高亮 69 | - 下次搜索的时候还是高亮的话 70 | - `:noh[lsearch]` 71 | - 注意这是执行一个命令,而不是设置一个开关 72 | 73 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210705-1625479209909) 74 | 75 | ### 正向反向 76 | - 遍历匹配 77 | - n 下一个匹配项 78 | - N 上一个匹配项 79 | - nN 可使用 `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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20201004-1601800631414) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210904-1630718128946) 35 | 36 | - 我们查到 `:qa[ll]` 就是退出全部窗口 37 | - 方括号中的内容可以省略 38 | - 当前其实我只有一个窗口 39 | - 我可以直接把a也省略了么? 40 | - 也就是说 41 | - 可以用 `:q` 这种简写形式来退出么? 42 | ### 尝试 43 | 44 | - `:h :q` 查询 关于 `:q` 的帮助 45 | 46 | ![vim-help-1](https://labfile.oss.aliyuncs.com/courses/2840/vim_help1.png ) 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 | ![vim-help-1](https://labfile.oss.aliyuncs.com/courses/2840/vim_help2.png) 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 | ![vim-help-1](https://labfile.oss.aliyuncs.com/courses/2840/vim_help3.png) 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 | ![updown](https://labfile.oss.aliyuncs.com/courses/2840/ggG.png) 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 | ![updown](https://labfile.oss.aliyuncs.com/courses/2840/helpsetno.png) 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 | ![updown](https://labfile.oss.aliyuncs.com/courses/2840/relativeNumber) 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 | ![updown](https://labfile.oss.aliyuncs.com/courses/2840/relativeNumber) 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 | ![updown](https://labfile.oss.aliyuncs.com/courses/2840/helpoptionnumber.png) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210202-1612228156060) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210202-1612228321562) 42 | 43 | ### 查看具体标记 44 | - `:marks abc` 45 | - 查看具体abc这三个mark 46 | 47 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210723-1627046852446) 48 | 49 | ### 跳转到引用 50 | 51 | - ma 52 | - 定义了一个名字叫 `a` 的 `mark` 53 | - 'a 54 | - 可以将光标从任意位置跳转到 标记`a` 55 | - 注意 56 | - 单引号是跳转到标记 57 | - 寄存器是放在后面的 58 | - 这个也可以配合行命令来操作 59 | 60 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210202-1612228601425) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210922-1632267423839) 76 | 77 | - 如下是寄存器情况 78 | 79 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210922-1632267457809) 80 | 81 | - `^J` 是换行的标记 82 | 83 | ### 操控marks 84 | 85 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210202-1612229513841) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210705-1625481287791) 38 | 39 | - 我想要跳到更久之前的位置 40 | - 怎么办呢? 41 | 42 | ### 跳转列表 43 | 44 | - 所有曾经的跳转都在跳转列表里面 45 | - 比如我们从 46 | - 第一行跳到 `33` 行 47 | - 然后再跳到以 ^The 开头的行 48 | 49 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210705-1625481789393) 50 | 51 | - ctrl-o 跳转到 52 | - Older position 53 | - 上一次 54 | - 上一次的上一次 55 | - ctrl-i跳转到 56 | - 下一次 57 | - 下一次的下一次 58 | 59 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210705-1625481856071) 60 | 61 | - 这里跳转的位置我们使用了 `标记 mark` 62 | 63 | ## 查询帮助 64 | 65 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210128-1611793827749) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210128-1611794963053) 82 | 83 | ### 其他标记 84 | 85 | - `ma` 是我们自己定义的 `a` 标记 86 | - 其他的标记是什么意思呢? 87 | - 我们可以用 `:h ''` 来看 `''` 的含义 88 | 89 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210128-1611795271314) 90 | 91 | # 更多标记 92 | 93 | - `''` 是上次跳转操作光标所在的位置 94 | - `'"` 是上次退出当前文件的位置 95 | - `'[` 是上次编辑(删除修改等)的开始位置 96 | - `']` 是上次编辑(删除修改等)的结束位置 97 | - `'.` 是上次编辑(删除修改等)的最后的操作位置 98 | 99 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210709-1625829522831) 100 | 101 | - 那么,这个大写、小写、数字的标记有什么不同呢? 102 | 103 | ### 标记细节 104 | 105 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210128-1611796448274) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210731-1627726592458) 27 | 28 | ### 录制宏macro 29 | - `qa` 30 | - 录制叫做`a`的宏 31 | 32 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210731-1627726811173) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211222-1640176268082) 76 | 77 | - `2@a` 78 | - 执行两次a宏 79 | - 执行结果如下 80 | 81 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211222-1640176275386) 82 | 83 | - 我可以看看宏长什么样子么? 84 | 85 | ### 查看宏macro 86 | - `:reg` 87 | 88 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210731-1627727214484) 89 | 90 | - "a寄存器里面就是macro宏a的内容 91 | - `^[`就是esc 92 | - 不过好像这里面可以进行修改 93 | 94 | ### 修改宏macro 95 | 96 | - 到最底下找一个空地 97 | - "ap把a寄存器里面的东西粘贴出来 98 | - 进行修改 99 | 100 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210731-1627727611624) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211222-1640180402031) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211222-1640181112311) 134 | 135 | 136 | ### 优化宏 137 | 138 | - 这里有个jk先向下再向上 139 | 140 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210731-1627732315985) 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 | - 可ia 配合的文字块 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210131-1612080964312) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210131-1612095573659) 54 | 55 | - 看起来是什么不对,就直接放到那个位置 56 | - 然后 r 成想要的 57 | 58 | ### 来试一下 59 | - 可以用r来进行修改 60 | 61 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210706-1625536164760) 62 | 63 | 64 | ### 再试试 65 | 66 | - 把光标放在`oeasy`中的`a`上,模式处于普通模式 67 | - r1 68 | - 就会把原来的`a`替换为`1` 69 | - 如果要把`1`替换为一个回车换行 70 | - 就要r回车 71 | - 支持`[count]`,比如`4r2`,替换4个字符,都变成2 72 | - 就像下面这样 73 | 74 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210706-1625536175720) 75 | 76 | ### 替换模式 77 | 78 | - 这次我们来看看大写R 79 | - `:h R` 80 | 81 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210131-1612096055820) 82 | 83 | - 在正常模式下,用R进入改写模式 84 | - 可以在左下角状态栏观察到 85 | - 然后光标在`oeasy`的`a`上面 86 | - 写入`1234` 87 | - 我们看到原来的文字被替换掉了 88 | 89 | ### 大小写的改写 90 | 91 | - 我们常用的其实还有个人物 92 | - 就是改大小写 93 | - 这个是 `~` 94 | - 可以 `:h ~` 查询手册 95 | 96 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210131-1612096295044) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210131-1612057613329) 40 | 41 | ### 具体操作 42 | 43 | - 找到一行 然后进行yy操作 44 | - 观察`:reg`发现这一行已经进入了寄存器 45 | - 找到一个合适的地方p 46 | - 可以把寄存器里面的内容放到当前行下面 47 | - 再找到一个位置P 48 | - 可以把寄存器里面的内容放到当前行上面 49 | - 加上`[count]`翻倍因素 50 | - 来他个`10yy` 51 | - 再观察`:reg` 52 | - 注意换行标识符为`^J` 53 | 54 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210131-1612059248826) 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 | - 更常见的还是 jk,因为他们基于基本位置 38 | - j 是向下 👇 39 | - k 是向上 👆 40 | - 5 j 就是让光标向下👇 5 行 41 | - 5 k 就是让光标向上👆 5 行 42 | - 继续向下翻 43 | 44 | ![updown](https://labfile.oss.aliyuncs.com/courses/2840/updownkj.png ) 45 | 46 | ### 上下行首 47 | 48 | ![updown](https://labfile.oss.aliyuncs.com/courses/2840/plusminus.png) 49 | 50 | - 加号 `plus` 对应 + 51 | - 对应键盘 shift + = 52 | - 减号 `minus` 对应 - 53 | - 上下行跳到行首 54 | - + 向 `下` 并且到行 `首` 非空字符 55 | - - 向 `上` 并且到行 `首` 非空字符 56 | - 对应关系 57 | - + 相当于 j ^ 58 | - - 相当于 k ^ 59 | 60 | ### 首行尾行 61 | 62 | ![updown](https://labfile.oss.aliyuncs.com/courses/2840/ggG.png) 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 gG 是我见过最方便的自动缩进方式 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 | ![updown](https://labfile.oss.aliyuncs.com/courses/2840/ggEqualG.png) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210201-1612173619112) 51 | 52 | - 我们来试试 53 | - `:d` 可以删除当前行 54 | - 帮助中这个`[range]` 是干什么用的呢?🤔 55 | - 什么不会就 `h` 什么呀! 56 | - 可以 `:h range` 57 | 58 | 59 | ### `[range]`范围 60 | 61 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210201-1612173821588) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210201-1612174190249) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210201-1612177212803) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211115-1636937241469) 105 | 106 | ### 直接剪切 107 | 108 | - `:h m`可以查询`:move`的用法 109 | - `:5,8m2`可以把5-8行移动到第2行 110 | 111 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210201-1612177212803) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210731-1627709896045) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210731-1627710011521) 40 | 41 | ### 文件系统格式fileformat 42 | 43 | - 但是最终具体是那种文件系统格式呢? 44 | - `:set fileformat?` 45 | - 注意这个没有`s` 46 | 47 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210731-1627710299149) 48 | 49 | - 文件默认是按照unix的方式保存文件的 50 | 51 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210731-1627710569426) 52 | 53 | ### 在文件里面写上三行 54 | - 写上三行 55 | - oeasy 56 | - o2z 57 | - o3z 58 | 59 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210731-1627710616433) 60 | 61 | 62 | ### 二进制形态观察 63 | - `:%!xxd` 64 | - `%`所有的行 65 | - 强制转化为二进制形态 66 | 67 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210731-1627711008280) 68 | 69 | 我们来分析一下 70 | 71 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210731-1627711068599) 72 | 73 | - `%!xxd -r`可以变回去 74 | 75 | ### 修改字符 76 | 77 | - `:%!xxd` 78 | - 找到`6f32`这个位置 79 | - 对应着`o2`两个字符 80 | - 用r 9把`6f32`变成`6f39` 81 | - 把 `2` 变成了 `9` 82 | 83 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210731-1627711137801) 84 | 85 | - 再变回来观察 86 | - `:!xxd -r` 87 | 88 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210731-1627711351520) 89 | 90 | ### 修改系统格式 91 | 92 | - `:set fileformat=dos` 93 | - 把系统格式设置为`dos` 94 | 95 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210731-1627711720279) 96 | 97 | - `:%!xxd` 98 | - 转化成二进制形态 99 | 100 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210731-1627711509158) 101 | 102 | - 我们可以注意到这个时候换行符被解释为`0d0a` 103 | - 我们一般都是本地编辑本地看 104 | - 什么时候需要跨系统呢? 105 | 106 | ### 跨系统 107 | 108 | - 我们可能从网上下载各种各样的文件 109 | - 或者我们在linux上编辑的文件被windows系统打开之后一看 110 | - 全都没有回车 111 | - 这就很麻烦 112 | - 所以我们可以指定当前文件的系统格式 113 | - 说起来vi有个快速打开网上文件的方式 114 | 115 | ### 直接打开网络文件 116 | 117 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210731-1627711928624) 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 | ![图片描述](https://doc.shiyanlou.com/courses/2840/1190679/66e7f69d6cf33d257ea6ffa1803391b4-0) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210710-1625894243656) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210710-1625904229996) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210805-1628151215268) 82 | 83 | - 看起来我们可以使用rgb颜色编码方式!! 84 | - 怎么做的呢?看代码 85 | 86 | ### 转化过程 87 | - 需要在代码里定义从rgb颜色模式到ansi颜色模式的转化函数 88 | - 首先把rgb拆分为三个本地的分量 89 | 90 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210823-1629677239120) 91 | 92 | - 得到三个分量近似的灰阶值 93 | 94 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210823-1629674301384) 95 | 96 | - 如果三个分量相等 97 | 98 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210823-1629674332117) 99 | 100 | - 映射到相应具体的灰阶的值 101 | 102 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210823-1629674393989) 103 | 104 | - 彩色怎么办呢? 105 | 106 | ### 彩色映射 107 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210823-1629674519671) 108 | 109 | - rgb三个分量已经得到了 110 | - 得到近似颜色 111 | 112 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210823-1629674034157) 113 | 114 | - 然后再得到彩色的值 115 | 116 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210823-1629674784417) 117 | 118 | - 这样我们就可以使用rgb颜色了 119 | - 而且不论我们使不使用颜色映射 120 | - 都可以用代码当前的配色方案直接生成颜色网页 121 | 122 | ### 生成网页 123 | 124 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210712-1626051983876) 125 | 126 | - 可以用自定义的颜色方案生成网页 127 | - `:TOhtml` 128 | - 或者 `:source $VIMRUNTIME/syntax/2html.vim` 129 | - 然后在浏览器里打开他 130 | - `:firefox %` 131 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210712-1626052000639) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210128-1611806284371) 34 | 35 | ### 行头行尾 36 | 37 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210128-1611808182156) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210128-1611809141432) 63 | 64 | ### 任意字符 65 | 66 | - `ter.` 匹配 `ter` 后面加一个字符 67 | 68 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210705-1625480848298) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210128-1611810518869) 94 | 95 | ### 词头词尾 96 | 97 | - `^` 和 `$` 分别代表着行头和行尾 98 | - 再回一下词头词尾 99 | - 如果我想找出单词的开头结尾是某些字符的怎么办呢? 100 | 101 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210128-1611810673432) 102 | 103 | 104 | - `\<` 意味着单词开头 105 | - `\`意味着单词结尾 107 | - `b\>` 意味着 `b` 结尾的单词 108 | - `\` 109 | - 意味着以 a 开头,b 结尾,ab 之间可能有零到任意多个小写字符的单词 110 | 111 | ### 搜索历史 112 | - 我们使用 `*`、`#` 查找的时候就自动给加上这个词头词尾 113 | - 可以 * 之后 114 | - / 115 | - 配合上下方向键看到 116 | - 曾经的搜索记录 117 | 118 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210207-1612659762671) 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 | ![mode](https://labfile.oss.aliyuncs.com/courses/2840/vim-vi-mode00.png) 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 | ![insert mode](https://labfile.oss.aliyuncs.com/courses/2840/vim_insert_mode.png) 44 | 45 | 46 | - 我们需要先退出帮助模式 47 | - `:q` 48 | - 然后按下 i 进入插入模式 49 | - 进入插入模式后 50 | - `左下角` 状态栏会显示 **`-- 插入 --`** 51 | - 这意味着已经进入了插入模式 52 | - 时刻留意左下角 53 | - 左下角就像小地图一样 54 | - 是统管全局的所在 55 | 56 | ![insert mode](https://labfile.oss.aliyuncs.com/courses/2840/insert_bt_line.png) 57 | 58 | - 如果没有进入插入模式的话 59 | - 可能因为处在新开的帮助中 60 | - 先 `:q` 退出帮助 61 | 62 | ### 插入文字🅰️ 63 | 64 | - 插入模式下我们可以任意打字 65 | - 按键不再是命令而是输入字符 66 | - 冒号回车都能打出来🤪 67 | 68 | ![insert oeasy](https://labfile.oss.aliyuncs.com/courses/2840/insert_oeasy_file.png) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210703-1625309264239) 84 | 85 | - 注意有内容的地方是具体的文字内容 86 | - 在没有内容的地方 87 | - 前面会有 `tilder(~)` 进行提示 88 | - `tilder(~)` 意味着空行,就是啥都没有 89 | 90 | ### 使用 `i` 命令进入插入模式 91 | 92 | - 按 i 再次进入插入模式 93 | - 按 escctrl+c 退回到命令模式 94 | 95 | ![force quit](https://labfile.oss.aliyuncs.com/courses/2840/vim_mode_change.png) 96 | 97 | - 可以用 ictrl+c 反复切换模式 98 | - 观察左下角 99 | 100 | ### 帮助细节 101 | 102 | - `i` 到底什么意思? 103 | - 可以 `:h` 他一下 104 | - `:h i` 就是 `help` 一下 `i` 命令究竟做些什么 105 | 106 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210705-1625454066261) 107 | 108 | - 那 ctrl+c 是啥意思? 109 | 110 | ### 查询快捷键 111 | 112 | - 什么不会就 `:h` 什么 113 | - `:h ctrl-c` 就是帮助我们查找一下 `ctrl-c` 快捷键究竟做些什么 114 | 115 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210804-1628038534369) 116 | 117 | - 同理还有 `:h ctrl-g` 118 | 119 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210705-1625454235744) 120 | 121 | - CTRL+G 对应着 `:f[ile]` 命令 122 | - 可以查看当前文件信息 123 | 124 | ### 尝试退出 125 | 126 | - 输入 `:q` 希望退出 127 | - 但是屏幕 📟 显示如下 128 | 129 | ![force quit](https://labfile.oss.aliyuncs.com/courses/2840/force_quit.png) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210202-1612236787087) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210727-1627391724057) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210727-1627391261299) 104 | 105 | - 但是我们可以直接不挂起 `vim` 的情况下 106 | - 执行 `shell` 命令么? 107 | 108 | ### 分屏终端 `:term` 109 | - `:term` 110 | - 上面切出一个窗口 111 | - 执行命令 112 | - `exit` 退出 `shell` 113 | 114 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210807-1628301785283) 115 | 116 | - 上下切换 117 | - ctrl+w j 切换到下方窗口 118 | - ctrl+w k 切换到上方窗口 119 | - 可以切来切去 120 | - 一边修改一边运行 121 | - 这个 `:term` 什么意思 122 | 123 | ### :term 帮助 124 | - 什么不会,`:h`什么 125 | - `:h :term` 126 | 127 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210807-1628302621060) 128 | 129 | ### 软件彩蛋 130 | - `:h :smile` 可以找到关于 `smile` 命令的帮助 131 | 132 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211001-1633097777608) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210731-1627734221490) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210726-1627265544162) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210726-1627266636366) 51 | 52 | - 写`viminfo` 53 | - `:wv` 写默认viminfo 54 | - 读`viminfo` 55 | - `:rv` 写默认viminfo 56 | - 这一读一写还是挺方便的 57 | - 我们写一个试试 58 | - 没报错 59 | - `:e ~/.viminfo` 60 | 61 | ### viminfo内容 62 | 63 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210726-1627271329949) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210726-1627277732348) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210726-1627289243595) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210706-1625537036387) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210203-1612319096194) 86 | 87 | - `'<` 这种形式很像标记啊 88 | - 就像ma做标记、'a跳转到标记那样 89 | - 能否看看'<是否也是一个标记 90 | 91 | 92 | ### 选区标记 93 | 94 | - 做好选区 95 | - `:marks <>`查看标记 96 | - 可以查找到选区的开始和结束标记mark 97 | 98 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210807-1628334324285) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210203-1612324004732) 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 | - 选中了之后可以进行dcy等操作 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210203-1612342407567) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211108-1636329991974) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211108-1636330137333) 79 | 80 | - 可以退回到正常模式 81 | - `:visual` 82 | - 还可以切换出ex-mode子窗口 83 | - `Q` 84 | 85 | ### 只读模式 86 | - 可以使用`vi -R oeasy.txt` 87 | - 也就是`view oeasy.txt` 88 | - 在这种模式下,只能查看不能修改 89 | 90 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210710-1625918181747) 91 | 92 | - 但是如果你强制写`:w!` 93 | - 还是可以写进去的 94 | - 如果你想要彻底不能写 95 | - 无论是否加叹号都不能写 96 | - 应该怎么办呢? 97 | 98 | ### 想要彻底不能写的话 99 | 100 | - 那你需要使用`vi -M oeasy.txt` 101 | - 这样你想要做任何写的操作 102 | - 都无法进行修改 103 | - 原因是E21 104 | 105 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210710-1625920312707) 106 | 107 | ### 设置可编辑 108 | 109 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211108-1636330451477) 110 | 111 | - `:set modifiable` 112 | - 设置当前文档可以修改 113 | - 然后可以对文件进行修改 114 | - 但是如果想要`:w`还是不行 115 | - `:h E142` 116 | 117 | ### 设置可写 118 | 119 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210710-1625920430355) 120 | 121 | - `:set write` 122 | - 把这个开关设置好之后 123 | - 就可以顺利`w`了 124 | - 只要你有sudo的权限 125 | - 一切开关你都可以打开 126 | - 透过各种蓝布棉门帘 127 | - 就可以控制起整个面铺😋 128 | 129 | ### 常用mode 130 | 131 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210705-1625454789993) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210203-1612344137448) 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 | - 如果是插入状态下 delBackSpace 就可以删除了 41 | - 那假如我不想切换到插入模式,我想在普通模式下就直接删除呢? 42 | - `:h delete` 找到在 `change.txt` 里面有个 `delete` 43 | - 从默认的帮助位置,向上翻,翻到头😡 44 | 45 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210128-1611841683592) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210128-1611842268388) 68 | 69 | ### 退格删除 X 70 | - 帮助手册里,在 `x` 后面还有个 `X` 71 | - `X` 的意思是 `向前退格` 72 | - 使用 `h X` 查询手册 73 | 74 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210128-1611842375648) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210726-1627295208556) 95 | 96 | ### 具体操作 97 | 98 | - 注意模式是插入模式 99 | 100 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210726-1627295303920) 101 | 102 | - CTRL+w之后 103 | 104 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210726-1627295346840) 105 | 106 | - 再CTRL+w之后 107 | 108 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210726-1627295381246) 109 | 110 | - 再 CTRL + w 之后 111 | 112 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210726-1627295410776) 113 | 114 | - 彻底删到头儿了 115 | - 可以切回到正常模式试试 `db` 116 | - u回来 117 | - 再试试 `d^` 118 | 119 | ### 两行连在一起 120 | 121 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210703-1625321615948) 122 | 123 | 124 | 125 | - 想要把两行 `Join` 连接在一起? 126 | - 我们原来用的是插入模式下的BackSpace 127 | - 现在试试 J(大写J) 128 | - 这是一个正常模式下的命令 129 | - 光标在上一行的任何位置 130 | - 命令模式下按下J(大写J) 131 | - 下一行和上一行连接在一起 132 | - 然后下一行的缩进消失 133 | - 和上一行之间有个空格 134 | 135 | ## 总结 136 | 137 | - 以前知道可以在插入状态下使用 delBackSpace 进行删除 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210206-1612573344032) 41 | 42 | ### 小括号跳转 43 | 44 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210728-1627455209006) 45 | 46 | - 方向 47 | - [ 往上 48 | - [( 进挨着的上一个( 49 | - ] 往下 50 | - ]) 近挨着的下一个) 51 | 52 | - 如果是大括号呢? 53 | 54 | ### 括号跳转 55 | 56 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210206-1612573610537) 57 | 58 | - `[(` 跳转到上一个没配对的 `(` 59 | - `])` 跳转到下一个没配对的 `)` 60 | - `[{` 跳转到上一个没配对的 `{` 61 | - `]}` 跳转到下一个没配对的 `}` 62 | - 支持 `[count]` 63 | 64 | - 向上就是[ 65 | - 向下就是] 66 | 67 | 68 | ### 函数中的跳转 69 | 70 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210728-1627454539956) 71 | 72 | - 方向 73 | - [ 往上 74 | - [{ 紧挨着的上一个{ 75 | - [[ 本块的第一行 76 | - ] 往下 77 | - ]} 近挨着的下一个} 78 | - ]] 本块的最后一行 79 | 80 | 81 | ### 注释的头尾 82 | - 注释跳转 83 | - `[/`、`[*`上一个注释`/* .... */`的头 84 | - `]*`、`]/`下一个注释`/* .... */`的头 85 | 86 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210206-1612574328403) 87 | 88 | 89 | ### 函数间跳转 90 | 91 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210206-1612573757496) 92 | - 函数跳转 93 | - `]m`下一个函数开头 94 | - `]M`下一个函数结尾 95 | - `[m`上一个函数开头 96 | - `[M`上一个函数结尾 97 | - 支持 `[count]` 98 | - `3]m` 可以往下跳到第 `3` 个函数开头 99 | - `[m`、`]m` 这两个其实还挺好用的 100 | 101 | ### 跳到定义 102 | 103 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210728-1627455616188) 104 | 105 | - 找到本地定义 106 | - gd - goto global declaration 107 | 108 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210728-1627455706874) 109 | 110 | - 和 * 不一样的是它会往前找到第一个 111 | - 在 `[[` 的范围内的第一个 112 | 113 | ### 没有配对的 #if 宏定义 114 | 115 | - 这个是针对宏定义里面的内容来的 116 | - `[#` 上一个没有配对的 `#if`、`#else` 117 | - `]#` 下一个没有配对的 `#else`、`#endif` 118 | 119 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210206-1612574270810) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210806-1628213800556) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661500094877) 28 | 29 | - 所使用的语法就是vim-plug的语法 30 | - plug的意思是插 31 | - 负责的是一些插件 32 | 33 | ### 查看插件源码 34 | 35 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661500234858) 36 | 37 | - 我们按照说明文档提供的方法 38 | - 准备安装vim-plug 39 | 40 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661500247528) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661500344271) 53 | 54 | ### 取消注释 55 | 56 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661500384272) 57 | 58 | - 将244行以后 59 | - 取消注释 60 | 61 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661500460642) 62 | 63 | - 目前有一个nerdtree的插件 64 | - 保存并运行当前vim文件 65 | - 怎么安装插件呢 66 | 67 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661500931418) 68 | 69 | ### 安装插件 70 | 71 | - PlugInstall 72 | 73 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661500564578) 74 | 75 | - 命令运行后 76 | - 会在左边添加一个浮动窗口 77 | - 显示安装情况 78 | 79 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661500571877) 80 | 81 | - 装完了也会有个提示 82 | 83 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661500781028) 84 | 85 | - 还有什么样的命令呢 86 | 87 | ### 更多命令 88 | 89 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661500998798) 90 | 91 | - 我们可以试试这个:PlugStatus 92 | - 查看插件状态 93 | 94 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661501029289) 95 | 96 | - 确实查看了状态为ok 97 | - 如果要删除呢? 98 | 99 | ### 调整 100 | 101 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661501286600) 102 | 103 | - 可以删除没有列出的插件 104 | - 先把246行注释掉 105 | 106 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661501374932) 107 | 108 | - 尝试删除 109 | 110 | ### 删除 111 | 112 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661501441412) 113 | 114 | - 这回就真删除了 115 | - 因为不在列表里了 116 | - 当然还可以再添加 117 | - 前提是把注释去掉 118 | 119 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661501539144) 120 | 121 | - 这个特征字符串什么意思? 122 | - scrooloose/nerdtree 123 | 124 | ### 特征字符串 125 | 126 | - 特征显然是可以连接到一个github地址的 127 | 128 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661501962929) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661502913495) 152 | 153 | - 自动化还有什么好处呢? 154 | 155 | ### 自动更新 156 | 157 | - :PlugUpgrade 158 | - 可以更新本体 159 | 160 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220826-1661502186479) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210131-1612101778185) 26 | 27 | - 首先输入好基本内容,如上图 28 | - 并且在System那一行yy 29 | - 然后p进行粘贴 30 | - 然后ctrl+a 31 | - 将具体的数字加1 32 | - 这到底是为什么?🧐 33 | 34 | ### 查询帮助 35 | - `h CTRL-A`查询快捷键作用 36 | 37 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210705-1625455124299) 38 | 39 | - 然后再p进行粘贴 40 | - 然后3ctrl+a,将原来的1加3得到4 41 | - 如果是减法的话,可以用ctrl+x实现 42 | 43 | ### 减法操作 44 | - 首先是已经存在的内容,如图 45 | 46 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210131-1612102206977) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210705-1625455417982) 68 | 69 | - ctrl+a都在Normal正常模式下做的 70 | - 如果是在插入模式下做 71 | - 什么效果呢 72 | 73 | ### 重复插入 74 | 75 | - 先来搜索一下 76 | - `:h i_CTRL-a` 77 | 78 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210726-1627306345119) 79 | 80 | - 我们来试试 81 | 82 | ### 来试试 83 | - 打开`oeasy.java` 84 | 85 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210726-1627306628326) 86 | 87 | - i进入插入模式 88 | - 插入` oeasy ` 89 | - ctrl+c结束插入模式 90 | - 这个时候寄存器`".`中的内容为` oeasy ` 91 | - 正常模式下把光标移动到下面位置 92 | - 再进入插入模式 93 | 94 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210726-1627306792103) 95 | 96 | - 然后ctrl+a就可以把`".`寄存器的内容插上去了 97 | - 相当于插入模式下ctrl+r . 98 | - 也相当于正常模式下`".p` 99 | - 就是把.寄存器里面的东西粘贴上来 100 | 101 | ### 一次命令 102 | 103 | - 插入模式下有一种 `一次命令模式` 104 | - 快捷键是 ctrl+o 105 | - `:h i_ctrl-o` 106 | 107 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210727-1627395771154) 108 | 109 | - 插入模式下,执行一次命令 110 | - 然后回到插入模式 111 | - 比如光标在如下位置,模式为插入 112 | 113 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210727-1627395720447) 114 | 115 | - 原来的方法是 116 | - ctrl+c 117 | - 先退回到正常模式 118 | - `d2w`可以把两个单词删除 119 | - i并进入插入模式 120 | - 不止一种思路 121 | - 灵活多变 122 | 123 | ### 试试一次命令模式 124 | 125 | - ctrl+o 126 | 127 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210727-1627395882556) 128 | 129 | - 执行一次正常模式命令`d2w` 130 | - 执行之后还是保持在插入模式 131 | 132 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210727-1627395975125) 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 jg 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20201001-1601560524243) 35 | 36 | ### 上下留边 37 | 38 | - 上下留边的话就要用 `:set scrolloff=2` 39 | - 这样的话上下翻动的话,都会有 `2` 行的预留 40 | - `:h scrolloff` 查看帮助 41 | - `s`[croll]`o`[ff] 管的纵向保留边距 42 | - 俗称留天留地 43 | 44 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20201001-1601560942872) 45 | 46 | ### 留边细节 47 | 48 | - `scrolloff` 是一个 `option` 49 | - 可以设定最小值 50 | - 还可以查询细节 `:h 'scrolloff'` 51 | 52 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210709-1625794746424) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211109-1636444041920) 67 | 68 | - 然后运行他 69 | - !python % 70 | - 最后打开运行得到的文本文件 71 | 72 | ### 打开文件 73 | 74 | - 可以看到原来33%时 75 | - 左下角显示32% 76 | 77 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211109-1636419860913) 78 | 79 | - 并不相符 80 | - 这是为什么呢? 81 | 82 | ### 调整scrolloff 83 | 84 | - `:set scrolloff=0` 85 | 86 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211109-1636420080462) 87 | 88 | - 再调整当前行位置 89 | - 可以看到右下角的百分比是和左上角的行号相关联的 90 | 91 | ### 上下翻页 92 | 93 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20201002-1601631356061) 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 + ej 的不同是 109 | - ctrl + e 光标所在文件位置不变,整个屏幕向上,除非到了边缘,光标位置才改变 110 | - j 是屏幕整个位置不变,光标位置向下,除非到了边缘,屏幕位置才改变 111 | 112 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20201002-1601631968782) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210705-1625460669366) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210801-1627784650635) 32 | 33 | ### 追加函数 34 | - `:h append()` 35 | 36 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210801-1627784729955) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210801-1627785793099) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210801-1627786108823) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220101-1641049209210) 93 | 94 | - `:echo expand('%:t:r')` 95 | - 这是可以显示当前的文件名的 96 | 97 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220101-1641049218305) 98 | 99 | - 这原理是什么呢? 100 | - `:h %:t` 101 | 102 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220101-1641049350051) 103 | 104 | 105 | ### 整合 106 | 107 | - 把这个整合到Initial函数里面 108 | 109 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210801-1627787583282) 110 | 111 | - 试验成功 112 | - 我想要调整整个buffer的缩进,怎么办呢? 113 | - `gg=G` 114 | - 但是我想把这条命令整合到Intial函数里面可能么? 115 | 116 | ### 表达式 117 | - 怎么执行正常模式的命令呢? 118 | - `:h :normal` 119 | 120 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210801-1627788217688) 121 | 122 | - `:normal gg=G` 123 | - 试验成功 124 | - `normal gg=G`是一个命令表达式 125 | - 但是怎么在函数里面执行这个表达式呢? 126 | 127 | ### 执行命令表达式 128 | 129 | - 先u回来 130 | - `:h execute` 131 | 132 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210801-1627788021975) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210801-1627795332877) 150 | 151 | - `:call Init()` 152 | - 调用成功! 153 | - 缩进和保存都是ok的! 154 | 155 | ### 建立映射 156 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210801-1627822846347) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210709-1625838558260) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210726-1627305312535) 44 | 45 | ### 选择配色方案 46 | - 在命令行模式中输入 `:colorscheme` tab 47 | - 看到提示的配色方案 48 | - 用 tab 列出可选项 49 | - 然后选择一个配色方案 50 | - 其实各种颜色可以来一个个的试试 51 | 52 | ### 配色方案举例 53 | 54 | ![](https://labfile.oss.aliyuncs.com/courses/2840/colorschemes.png) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210709-1625838972495) 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 | ![](https://labfile.oss.aliyuncs.com/courses/2840/helpColorScheme.png) 104 | 105 | ### 配色文件夹 106 | ```bash 107 | #找到vim的位置 108 | whereis vim 109 | #找到colors的位置 110 | find /usr/share/vim -name "colors" 111 | ``` 112 | 113 | ![](https://labfile.oss.aliyuncs.com/courses/2840/colorPosition.png) 114 | 115 | ### 网上寻找合适的配色方案 116 | 117 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20200928-1601289844844) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210723-1627049194335) 145 | 146 | - 转化过程是一个vim文件 147 | - 也可以直接运行 148 | - `:source $VIMRUNTIME/syntax/2html.vim` 149 | 150 | ### 增加自己的配色方案 151 | 152 | ![](https://labfile.oss.aliyuncs.com/courses/2840/addMyColor.png) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210202-1612260205142) 62 | 63 | - 我们这次的flag是`g` 64 | - 换一行 65 | - `:s/shiyanlou/oeasy/g` 66 | - 可以把这一行所有的 `shiyanlou` 换成 `oeasy` 67 | - 我理解这个g指的是行内所有的 68 | - 如果我想默认g-flag就开着呢? 69 | 70 | ### 默认g-flag 71 | 72 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211003-1633265778236) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210202-1612259869235) 97 | 98 | ### 逐个确认 99 | 100 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210202-1612263843722) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211210-1639094693096) 120 | 121 | - n的作用就是计数 122 | - 并不替换 123 | - 但是可以统计数量 124 | - `:%s/oeasy//gn` 125 | - 话说回来,关于替换有什么小技巧么? 126 | 127 | ### 小技巧 128 | 129 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210802-1627871464712) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220505-1651751557552) 154 | 155 | - 回车在这里用的是转义字符\r 156 | 157 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220505-1651751450203) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210725-1627179943223) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210725-1627180987033) 105 | 106 | - 最终的映射语句是 107 | - `:map :w:!javac %!java %:t:r` 108 | 109 | - 保存、编译、运行一气呵成 110 | - 不过python、java、html都映射到了F5 111 | - 能否根据文件类型进行区分呢? 112 | 113 | ### 文件类型映射 114 | - 观察文件类型检测 115 | - `:filetype` 116 | 117 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210725-1627184348586) 118 | 119 | - 具体的文件应该放在哪儿呢? 120 | 121 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210725-1627192582101) 122 | 123 | ### 具体操作 124 | 125 | - 在`~/.vim/ftplugin/`下面放入文件类型的配置文件 126 | - `~/.vim/ftplugin/java.vim`对应java文件 127 | - `~/.vim/ftplugin/python.vim`对应python文件 128 | 129 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210725-1627184389264) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210808-1628414344861) 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 | ![WEB](https://labfile.oss.aliyuncs.com/courses/2840/StartEnd2) 21 | 22 | ## 查找帮助 23 | 24 | - 还有什么呢? 25 | - 还是继续在 `motion` 里面 26 | - ^$ 之后找 27 | - 还是在左右移动这里面发现有个 f 28 | - 看起来是查找某个字符的样子 29 | 30 | ![WEB](https://labfile.oss.aliyuncs.com/courses/2840/Findfind) 31 | 32 | 33 | ### 查找字符 34 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210705-1625459606491) 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 | ![findo](https://labfile.oss.aliyuncs.com/courses/2840/findoch) 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 | ![findhelp](https://labfile.oss.aliyuncs.com/courses/2840/findnexthelp.png) 73 | 74 | - 帮助说 ; 75 | - 可以让查找继续 76 | 77 | ### 动手练习 78 | 79 | ![findnext](https://labfile.oss.aliyuncs.com/courses/2840/findogoon.png) 80 | 81 | - 好像真的可以 82 | - 小拇指直接落下去就可以 83 | - 查找范围到本行末尾,不能跨行 84 | - 帮助里,还有个和 ; 配对的 , 是干什么用的? 85 | - 试试 86 | 87 | ### 反向继续查找 88 | 89 | ![findnext](https://labfile.oss.aliyuncs.com/courses/2840/findback.png) 90 | 91 | - 中指向下找到 , 92 | - 确实可以让他反向 93 | - 搜索范围还是被限制在了本行 94 | - 帮助里面还提到的 F 是干什么用的? 95 | 96 | ### 反向跳跃 97 | 98 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210705-1625459713964) 99 | 100 | - Ff 一样 101 | - 都是行内跳跃 102 | - 但是 F 是反向跳跃 103 | - 往左查找 104 | 105 | ### 反向跳跃练习 106 | 107 | ![findnext](https://labfile.oss.aliyuncs.com/courses/2840/findFFF) 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 | ![2fo](https://labfile.oss.aliyuncs.com/courses/2840/2findogoon) 145 | 146 | - 这个;确实很好用 147 | - 但是前提是得要加上参数 148 | - -u None 149 | - 如果在默认情况下进入 150 | 151 | ### 默认情况 152 | 153 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220811-1660215588169/wm) 154 | 155 | - 一按; 156 | - 就到了命令行模式 157 | 158 | ### 映射回来 159 | - 配置文件做了映射 160 | - 把;映射到了: 161 | - 所以;失效了 162 | 163 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220811-1660215522800/wm) 164 | 165 | - 映射回来 166 | - `:map ; ;` 167 | - 再试试 168 | - ;, 的感觉 169 | - 但是每次都要进行映射 170 | - `:map ; ;` 171 | - 好麻烦 172 | 173 | ### 找到根源 174 | 175 | - 可以修改.vimrc配置文件 176 | 177 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211107-1636297871382) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211220-1639960265439) 30 | 31 | - 类似的还有 32 | - `:%s` 33 | - 等价于`:%substitute` 34 | 35 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211220-1639960300497) 36 | 37 | 38 | ### 缩写abbreviation 39 | - 我们可以快速地定义缩写 40 | - `:abbreviate hi hello` 41 | - 这个时候如果输入`hi`空格 42 | - hi就自动变成了hello 43 | - 不过目前系统配置有点问题 44 | 45 | ### 调整设置 46 | - 当前系统配置有点问题 47 | - 需要看一下 `~/.vimrc` 48 | 49 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210724-1627118976197) 50 | 51 | - 把177这句 `set paste` 是控制粘贴用的 52 | - 有的时候粘贴出来时对不齐就用 `:set paste` 53 | - 粘贴完之后 `:set nopaste` 54 | - 现在我们 `:set nopaste` 确保缩写可以用起来 55 | 56 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211220-1639960942492) 57 | 58 | ### 设置缩写 59 | - 这有点像颜文字转化工具 60 | - `:abbreviate sml ヾ(❀╹◡╹)ノ~` 61 | - 还挺好使 哈哈 62 | - 还可以使用缩写形式`ab` 63 | - `:ab o1z oeasy` 64 | - 还可以用来改错 65 | - `:ab teh the` 66 | 67 | - 不论是在插入模式下,还是在命令行模式下 68 | - 只要输入缩写形态,然后加一个空格 69 | - 就自动完成切换 70 | 71 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211220-1639960593417) 72 | 73 | 74 | - 这个东西其实还是有一定实用性的 75 | - `:ab sysout System.out.println();` 76 | - 不过我可以控制最终的光标位置么? 77 | 78 | ### 光标的控制 79 | 80 | - 定义新的缩写 81 | - `:ab sysout System.out.println("");` 82 | - 这样就可以在快速得到输出语句之后 83 | - 还把光标放在最合适的位置 84 | 85 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211220-1639963186729) 86 | 87 | - 这样就可以快速插入一些复杂的语句 88 | - 那么这个可以换行么? 89 | 90 | ### 添加换行符号 91 | 92 | - `:ab htmlbase ` 93 | 94 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211220-1639963228069) 95 | 96 | - 这样就可以快速插入一些更大规模的模板之类的内容 97 | - 目前有什么缩写abbreviate 98 | - 可以列表出来么 99 | 100 | ### 列出所有的缩写abbreviate 101 | - `ab[breviate]`可以列出所有的缩写 102 | 103 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210724-1627115680457) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210724-1627117290994) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210724-1627117122470) 131 | 132 | 133 | - 一个个定义映射有点麻烦 134 | - 我能直接利用曾经写过的单词么? 135 | 136 | ### 自动补全 137 | 138 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210725-1627174405321) 139 | 140 | - 我们的缓冲中有很多已经写出来的单词 141 | - 我们可以用这些来做自动补全 142 | - 我们写下S然后按下ctrlp 143 | - 出现一个提示框我们可以选择里面的单词 144 | - ctrlp - previous 145 | - ctrln - next 146 | - 随着输入的进行还可以缩小查找范围 147 | 148 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210725-1627174613432) 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 | ![](https://labfile.oss.aliyuncs.com/courses/2840/addMyColor.png) 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 | ![](https://labfile.oss.aliyuncs.com/courses/2840/oeasyvim) 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 | ![](https://labfile.oss.aliyuncs.com/courses/2840/modifiedVim.png) 60 | 61 | ### 查看配色 62 | 63 | - `:hi Normal` 可以查看 `Normal` 组的配色 64 | - `:hi` 可以查看当前色彩方案所有的配色 65 | - `xxx` 就是效果预览 66 | 67 | ![](https://labfile.oss.aliyuncs.com/courses/2840/showColors.png) 68 | 69 | ### 配色细节 70 | 71 | - `hi` 是 `highlight` 的缩写 72 | - `:h hi` 可以查询帮助 73 | 74 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210709-1625839962834) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210709-1625840276836) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210709-1625841300802) 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 | ![图片描述](https://doc.shiyanlou.com/courses/2840/1190679/66e7f69d6cf33d257ea6ffa1803391b4-0) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210202-1612238999169) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210807-1628303408587) 72 | 73 | ### 直接修改命令 74 | 75 | - 命令行模式下 ctrl+f 76 | - 或者正常模式下 77 | - q: 列出历史命令 78 | - / 在历史命令中搜索 79 | 80 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210807-1628304811057) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210202-1612255335506) 102 | 103 | - 我们先看看寄存器里面有什么? 104 | - `:reg` 105 | 106 | ### 使用默认寄存器 107 | 108 | - 先`:`进入命令行模式" 109 | - 然后ctrl+r 110 | - 然后如果我们这个时候摁下" 111 | - 就把默认寄存器里面的内容放入了命令行中 112 | 113 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210202-1612255634458) 114 | 115 | ### 使用当前文件名寄存器% 116 | 117 | - 如果我们再`:` 118 | - 然后ctrl+r 119 | - 摁下%就把文件名放入了命令行中 120 | - 比如`:!javac`的时候 121 | - 可以用这种方法把当前文件名输入到命令行中 122 | 123 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20221231-1672453724904) 124 | 125 | - 不过还是直接最简单`:!python3 %` 126 | 127 | ### 复制路径和文件名 128 | 129 | - 读取当前目录并写入当前缓存 130 | 131 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20221231-1672495870794) 132 | 133 | - yiW 复制当前大词 134 | 135 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20221231-1672495925566) 136 | 137 | - 确实已经进入默认寄存器 138 | 139 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20221231-1672495965722) 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 | - 可以直接dcy 34 | - 或者DCY 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 | - dD 77 | - xX 78 | - 复制 79 | - y 80 | - 粘贴 81 | - pP 82 | - 剪切并切换到插入模式 83 | - cC 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 | - dDxX 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 | - dcyp 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 | - dcyp 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211221-1640065168780) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210725-1627201023530) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210805-1628145706714) 46 | 47 | - `h 'cursorline'` 48 | - 给 `cursorline` 加了单引号 49 | - 说明 `cursorline` 是一个属性 `option` 50 | 51 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210805-1628145808345) 52 | 53 | ### 设置光标列 54 | 55 | - 有行就有列 56 | - 光标列 `cursorcolumn` 57 | - 光标 `cursor` 58 | - 列 `column` 59 | - `:set cursorcolumn` 60 | 61 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210805-1628146050682) 62 | 63 | - `h 'cursorcolumn'` 64 | - 给 `cursorcolumn` 加了单引号 65 | - 说明 `cursorcolumn` 是一个属性 `option` 66 | 67 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210805-1628146058038) 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 | ![](https://labfile.oss.aliyuncs.com/courses/2840/helpStatusLine.png) 95 | 96 | ### 显示属性 97 | 98 | - 除了字符串常量之外是否能显示一些别的属性呢? 99 | - 继续翻帮助手册 100 | - 找到相关的 `items` 101 | - 各种 `items` 有不同的属性(数字、文本、标志) 102 | - 每个 `item` 对应一个字母 103 | - 这个字母需要通过 `%` 来进行转义 104 | - `F` 对应文件名 105 | - `:set statusline=[oeasy]%F` 106 | - 此时,状态条就显示 `[oeasy]当前文件名` 107 | 108 | ![](https://labfile.oss.aliyuncs.com/courses/2840/statuslineItem) 109 | 110 | ### 标志属性 111 | 112 | - 继续翻看属性 113 | - `Flag` 是标志位 114 | - `m` 是一个关于是否已经修改的标志位 115 | - 把 `%m` 追加进入 `statusline` 116 | - `:set statusline=[oeasy]%F%m` 117 | - 修改文件后会显示未保存的 `[+]` 118 | - 观察效果 119 | - 保存后 `[+]` 会消失 120 | - 暗中观察... 121 | 122 | ![](https://labfile.oss.aliyuncs.com/courses/2840/helpstatusflag.png) 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 | ![](https://labfile.oss.aliyuncs.com/courses/2840/statusNumber.png) 134 | 135 | - 状态栏数值还可以随着光标变化😆 136 | 137 | ### 控制宽度 138 | 139 | ![](https://labfile.oss.aliyuncs.com/courses/2840/statuswidth.png) 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 | ![](https://labfile.oss.aliyuncs.com/courses/2840/statuslineGroupItems ) 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 | ![](https://labfile.oss.aliyuncs.com/courses/2840/statusFullString.png) 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` - gtgT 22 | - 指定`tab` - `1gt` `2gt` `3gt` 23 | - 关闭`tab` - `:tabc` 24 | - 列表`tab` - `:tabs` 25 | - 除了这些之外还有别的容器吗?🤔 26 | - 还是有的! 27 | 28 | ### 折叠folding 29 | - 这次的容器不在 `buffer`缓存 之外 30 | - 而在 `buffer`缓存 内部 31 | - 是折叠文字 32 | - 怎么折叠呢? 33 | 34 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210723-1627051713865) 35 | 36 | - 好比说我们这里有个 `css` 文件 37 | - 在`http://github.com/overmind1980/oeasyvim.git`里面 38 | - 找到 `oeasy.css` 39 | 40 | ### 创建折叠 41 | 42 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210723-1627051997859) 43 | - `zf6G` 44 | - 报错了 45 | 46 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211123-1637668672985) 47 | 48 | - `:h E350` 49 | 50 | ### E350 51 | 52 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211123-1637668704806) 53 | 54 | - `:set foldmethod?` 55 | - `:h foldmethod` 56 | 57 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211123-1637671539589) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210723-1627052411049) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211123-1637676564114) 103 | 104 | ### 取消和再次折叠 105 | 106 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210724-1627084786031) 107 | 108 | - 删除折叠的快捷键是 `zd` 109 | - 顾名思义 110 | -` z` 是折叠 111 | - `d` 是删除 112 | - 来试试 113 | - 在左侧`foldcolumn`是`+`的地方 114 | - 使用命令zd删除当前光标位置对应的折叠 115 | - 如果折叠是嵌套的 116 | - 先删除内层的折叠 117 | - `zD` 是递归地删除折叠 118 | - 可以把当前光标的递归折叠都删除 119 | 120 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210724-1627085128856) 121 | 122 | - 如果折叠都被删没有了 123 | - 可以先 `zf2j` 创建一些折叠 124 | - 好,我们把所有的折叠都删干净了 125 | - 然后我们试试创建折叠更好的方法 126 | 127 | ### 利用{}创建折叠 128 | 129 | - `zf`是创建折叠 130 | - `zf2j`中的`2j`是`motion` 131 | - 可以在{}内使用`zfa{`创建当前标记的折叠 132 | - 可用`zfi{`创建折叠 133 | - 效果如下图 134 | - 试一下 135 | 136 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20211123-1637676740595) 137 | 138 | - 能不能一把打开所有的折叠呢? 139 | 140 | ### 折叠层次 141 | 142 | - 有这样一个属性叫做`foldlevel` 143 | - 折叠层次 144 | - 到底怎么用呢? 145 | - `:set foldlevel=0` 146 | - 折叠都关了 147 | - `:set foldlevel=1` 148 | - 折叠都开了 149 | - 还是挺方便的 150 | - 不过每个大括号都要自己创造折叠 151 | - 是否能够自动创建折叠呢? 152 | 153 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210724-1627086064715) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220430-1651290723832) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220520-1653040848818) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220520-1653040988682) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220520-1653041067970) 71 | 72 | ### 切换窗口 73 | - ctrl+k 切换到上方windows 74 | - ctrl+j 切换到下方windows 75 | - 把 `o.py` 中输出的`i` 修改成 `o` 76 | 77 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220520-1653041197073) 78 | 79 | 80 | 81 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220520-1653041309186) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20220607-1654579568837) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210709-1625832548135) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210709-1625833145809) 69 | 70 | ### 关于开关 71 | 72 | - 开关就是 `options` 73 | - 可以设置当前文档是否显示标尺 74 | - 也可以设置当前文档是否自动换行 75 | - 开关和我们编辑的文档没有直接关系 76 | - 但是决定着目前显示的状态 77 | 78 | - 可以使用 `:options` 79 | - 打开 `options.txt` 查看 `所有` 的开关 80 | - `/ruler` 在当前文件中查找 `ruler` 这个开关 81 | 82 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210709-1625793832071) 83 | 84 | - 那我怎么知道 `ruler 开关`当前状态? 85 | 86 | ### 查看开关 87 | 88 | - 查看开关状态? 89 | - 可以通过?来查看开关状态 90 | - `:set number?` 91 | - `:set ruler?` 92 | - 可以试试 93 | 94 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210723-1627045153666) 95 | 96 | - 如果我想把开关复位到初始状态 97 | - 应该怎么做? 98 | 99 | ### 复位开关& 100 | 101 | - 复位开关状态& 102 | - 直接把开关复位为默认值 103 | - `:set number&` 104 | - `:set ruler&` 105 | 106 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210723-1627045264423) 107 | 108 | ### 标尺细节 109 | 110 | - `:options` 可以得到一行的简单解释 111 | - 如果想要更详细的信息 112 | - 也可以通过 `:h 'ruler'` 找到这个选项开关的细节 113 | 114 | ![](https://labfile.oss.aliyuncs.com/courses/2840/helpRuler.png) 115 | 116 | ## 标尺细节 117 | 118 | ![](https://labfile.oss.aliyuncs.com/courses/2840/RulerDetail ) 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 | ![](https://labfile.oss.aliyuncs.com/courses/2840/setCursorColumn.png ) 137 | 138 | ### 标尺细节 139 | 140 | - 在标尺的右边写着一些文字 141 | - 有时在 `顶端`,文件第 1 行在屏幕顶端 142 | - 有时在 `底端`,文件最后 1 行在屏幕底端 143 | - 有时在 `全部`,文件很短一屏幕就全显示 144 | 145 | ![](https://labfile.oss.aliyuncs.com/courses/2840/ScreenPosition.png) 146 | 147 | ### 显示命令 148 | 149 | - 用 `:set showcmd` 可以在标尺左边看见所用的命令 150 | - `show` 显示 151 | - `cmd` 命令 152 | - 1 9 G 命令跳转行号 153 | - 一个字符一个字符地按下 154 | - 观察变化 155 | - 这样我们就可以看到命令输入的情况 156 | 157 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210709-1625833976466) 158 | 159 | ### 用百分比方式跳转 160 | 161 | - 在行列号后面有个百分比 162 | - 有时是百分比,比例为光标行号除以文件总行号 163 | - 可以使用 29 % 跳到整个文件 `29%` 的位置 164 | 165 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210709-1625834834199) 166 | 167 | ### 设置历史记录数量 168 | 169 | - `:set history=100` 170 | - 这样设置可以在底行命令模式下 171 | - 通过键盘上下找到曾经执行的命令 172 | - `:h 'history'` 173 | 174 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210709-1625835624551) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210712-1626076834731) 67 | 68 | ### `tab`中再分`window` 69 | 70 | - 给第一个`tab`水平方向分成两个`window` 71 | - `:split` 72 | - 分别打开`o2`和`o3` 73 | - 给第二个`tab`先水平 74 | - 再垂直分成三个`window` 75 | - `:split` 和 `:vsplit` 76 | - 观察 `:tabs` 77 | 78 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210206-1612590571046) 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-wk切换到当前窗口上面的窗口 98 | - ctrl->wj切换到当前窗口下面的窗口 99 | - ctrl-wh切换到当前窗口左面的窗口 100 | - ctrl-wl切换到当前窗口右面的窗口 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210725-1627208348833) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210207-1612672945587) 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 | - 切换 - gtgT 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` - gtgT 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210908-1631064752839) 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 | - dx 删除内容默认寄存器 42 | - y 复制内容默认寄存器 43 | - p粘贴也是从默认寄存器里面找内容粘贴 44 | - 不声明的话都用这个默认寄存器 45 | - 可以通过`:reg "`查看默认寄存器 46 | - 一般我们都先切换到正常模式 47 | - 然后再粘贴 48 | - 可以在插入模式下粘贴么 49 | 50 | 51 | ### 插入模式 52 | 53 | - 插入模式下按ctrl+r 54 | - 状态栏cmd区域会出现`^R` 55 | - 然后按下默认寄存器对应的`"`就可以了 56 | 57 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210908-1631066199292) 58 | 59 | ### 数字寄存器`"0-"9` 60 | 61 | - `"0` 中存储的是最近`yank`的内容 62 | - `"1-"9` 中存储的是最近删除的内容 63 | - 最新的放在`"1` 64 | - 然后一次往后顺 65 | - 除非用了制定寄存器`"x` 66 | - 默认都在这里存一份 67 | - 可以一边删除 68 | - 一边`:reg`观察 69 | 70 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210806-1628255825410) 71 | 72 | ### 行内删除专用寄存器`"-` 73 | 74 | - 如果删除的内容在`1`行以内 75 | - 也就是说不包含`^J` 76 | - 那么删除的东西就放在`"-` 77 | - 除非用了制定寄存器`"x` 78 | - 可以动手试一试! 79 | 80 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210806-1628255888831) 81 | 82 | ### 指定寄存器`"a-"z`、`"A-"Z` 83 | 84 | - 平常的x都是不指定寄存器的 85 | - 但是如果是"ax就是指定 `寄存器a` 的了 86 | - 删除的东西会放在`"a`这个寄存器中 87 | - dy等命令也一样 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210806-1628256167274) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210926-1632662165838) 138 | 139 | - -减号意味着没有安装功能 140 | - +加号意味着安装了功能 141 | - apt install vim-gtk3安装 142 | 143 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210926-1632662248152) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210908-1631066352923) 163 | 164 | ### 重温插入模式 165 | - 我们在插入模式下 166 | - 按下ctrl+r 167 | - 然后按下寄存器的名字 168 | - 比如默认寄存器" 169 | - 就可以把默认寄存器里面的东西粘贴过来 170 | - 而且还保持在插入模式 171 | - `:h i_ctrl-r` 172 | 173 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210806-1628260567356) 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 | - dxyp都在在正常模式 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210801-1627796439440) 28 | 29 | ### 自定义命令command 30 | - `:command DeleteFirst :1delete` 31 | - `:command` 自定义命令command 32 | - 自定义命令 叫做 - `DeleteFirst` 33 | - 自定义命令DeleteFirst 对应的操作 - `:1delete` 删除第1行 34 | - 执行命令 35 | - `:DeleteFirst` 36 | - 执行成功 37 | - 第一行被删掉 38 | 39 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210801-1627797060452) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210807-1628335051867) 71 | 72 | ### 最初的函数 73 | 74 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210801-1627795332877) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210801-1627797402691) 95 | 96 | 97 | - 其实应该定义的时候更加明确命令参数 98 | 99 | ### 明确参数 100 | - `:h command` 101 | 102 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210801-1627797731872) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210801-1627798562784) 117 | 118 | ### 命令执行 119 | 120 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210801-1627798848239) 121 | 122 | - `:Say oeasy say easy` 123 | - 后面的三个单词作为一个参数 124 | - 想在字符串里面使用引号的话 125 | - 需要进行转义 126 | 127 | ### 多个参数调用函数 128 | 129 | - 定义函数 130 | 131 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210801-1627803257931) 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 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210801-1627799345398) 159 | 160 | - `:command -range SaveIt :,write! save_file` 161 | 162 | ![图片描述](https://doc.shiyanlou.com/courses/uid1190679-20210801-1627799505465) 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 | --------------------------------------------------------------------------------