# Vi 不完全使用手册 使用 `vimtutor` 进入练习。其中,`vimtutor zh` 为中文。 **`vi` 有三种模式:** - 正常模式(`Normal Mode`): 又称为 命令模式(`Command Mode`): 在这里,您可以执行复制、粘贴、查找或替换等操作,还可以执行命令(`:w` 保存 或 `:q` 退出)。 - 可视模式(`Visual Mode`):在这里您可以选择文本。 - 插入模式(`Insert Mode`):在这里您可以编辑您的文本。 --- ## 命令模式(normal) 要切换到此模式,请键入**Esc** 键。 在这种模式下,您可以在文件中导航,并且可以执行诸如 `dd` 之类的命令来删除光标下的行。 您还可以执行 **复制、粘贴、剪切、查找/替换** 等任务 ### 方向键 | 箭头 | 方向 | 字母 | | :--- | :--- | :--- | | ← | 左 | h | | ↓ | 下 | j | | ↑ | 上 | k | | → | 右 | l | ### 更多命令 | 按键 | 英文 | 功能 | 描述 | | :------- | :------- | :------- | :--------------------- | | y | yank | 复制 | | d | delete | 删除 | | p | paste | 粘贴 | | r | replace | 替换 | | u | undo | 撤销 | | i | insert | 插入 | | a | append | 追加 | 在光标后插入 | | o | open | 打开 | 在下一行插入 | | f | find | 查找 | | w | word | 单词 | 光标跳到下一个单词开头 | | b | back | 字首 | | v | visual | 选择 | 进入可视化模式 | | **按键** | **英文** | **功能** | **描述** | > **基础按键** > `O` : 在上一行插入 > `ZZ` 保存并退出 > `u` : 撤销上一个操作(`ctrl + r` 反撤销) > `U` : 撤销之前对该行的全部操作 > > [进入插入模式] > `i` : 在光标之前,进入插入模式 > `I` : 在本行开头非空处,进入插入模式 > `a` : 在光标之后,进入插入模式 > `A` : 在本行末尾,进入插入模式 > `o` : 在本行之后新增一行,并进入插入模式 > `O` : 在本行之前新增一行,并进入插入模式 > `s` : 删除当前字符,并进入插入模式 > `S` : 删除当前行中的所有文本,并进入插入模式 > > [移动] > `g_`: 光标跳到非空行尾 > `W` : 光标跳到下一个单词开头 (忽略标点) > `w` : 移动到下个单词开始(不忽略标点,从当前光标位置直到下一个单词起始处,不包括它的第一个字符) > `e` : 移动到当前单词的末尾(从当前光标位置直到单词末尾,包括最后一个字符) > `#G` : 光标跳至 `#` 行非空行首 (`#` 为具体数字) > ` `` ` : 返回到上一处 > `''` : 返回到上一行 > `f#` / `F#` : 光标跳到 (**后 / 前**) 一个 `#` 处 > `t#` / `T#` : 光标跳到 (**后 / 前**) 一个 `#` 前 > > [行首与行末] > `^` : 移动到本行的首字符 `Shift + ^` > `0` : 移动到本行行首 > ` ` : 移动到本行的末字符 `Shift + ` > > [单词与内容] > ` ` : 从当前光标位置直到当行行末。 > `b` : 移动到当前单词开始 > `ge` : 移动到上个单词末尾 > `*` : 跳至找到的下个单词(光标所处的) > `#` : 跳至找到的上个单词(光标所处的)`Shift + #` > `gg` / `1G` : 将光标移动到文件**首行的非空**开头 > > `H` : 将光标移动到屏幕上**最高行**(大概在顺 6 行) > `M` : 将光标移动到屏幕的**中间行** > `L` : 将光标移动到屏幕上**最低行**(大概在倒 6 行) > `G` : 将光标移动到文件**末行非空**开头 > `zt` : 将屏幕移至窗口**顶部**(含将光标所在行都上移,光标再处于屏幕**上方**。大概在顺 6 行) > `zz` : 将屏幕移到窗口**中间**(含将光标所在行都上移,光标再处于屏幕**中间**) > `zb` : 将屏幕移至窗口**底部**(含将光标所在行都上移,光标再处于屏幕**底部**。大概在倒 6 行) > > [删除] > `x` : 删除光标处字符 > `X` : 删除光标前一字符 > `dd` : 删除光标所在行,同时复制该行 > `D` : 删除光标到行末 > `dw` : 删除光标到单词末(含后面的空格) > `#x` : 删除含光标在内的后`#`个字符 > `#X` : 删除光标前 `#` 个字符 > `#dd` : 删除含光标所在行的 `#` 行字符,同时复制该 `#` 行 > > `s` : ~~删除当前字符~~ > `S` : ~~删除当前行中的所有文本~~ > > [复制] > `#yw` : 复制 `#` 个单词,其中以光标到单词结束作为首词 > `p` / `P` : 粘贴光标(**后 / 前**) > `y ` : 复制光标所在字符 > `yy` : 复制光标所在行 > `#yy` : 复制含光标所在行在内的下 `#` 行 > `yw` : 复制从光标到单词结束 > `y ` : 复制从光标到本行结束 > > [替换] > `r` : 替换光标所在处的单个字符 > `R` : 替换光标所在处及其后面的字符,直到按下「ESC」键为止 > `cw` : 替换从光标到单词结束 > `c#w` / `#cw` : 替换 `#` 个单词,其中以光标到单词结束作为首词 > > [修改] > `gu` / `gU` ``: 将本行修改为 (**小 / 大**) 写 > > [查找] > `/` : 查找 `Word`。按 `n` 查找下一个;按 `N` 查找上一个 > `/` : 反向查找 `Word`。按 `N` 查找下一个;按 `n` 查找上一个 > `/\c` : 单次查找结果忽略大小写 > `%` : 选择**括号**,再按 `%` 查找配对的括号对。重复按,位置反复跳转 > > **Ctrl 组合键** > `ctrl + r` : 反撤销上一操作,与 `u` 相反 > `ctrl + b` : 屏幕往“前”移动一页 > `ctrl + f` : 屏幕往“后”移动一页 > `ctrl + u` : 屏幕往“前”移动半页 > `ctrl + d` : 屏幕往“后”移动半页 > `ctrl + g` : 显示当前文本的信息 > `ctrl + o` : 跳回较旧的位置 > `ctrl + i` : 跳到较新的位置 > `ctrl + w` : 窗口间切换 ### 末行模式(last line mode) 您需要进入正常模式,然后键入 **`:`** 键。 在此模式下,您将执行命令,如 **更新 VIM 配置、保存、退出、打开新文件、标签、缓冲区** 等… > 部分文档称之为 **命令模式(Command Mode)** > `shift + :` 进入该模式 ```vim # 所有命令,必须以 键结束 : 时,再按 ctrl + D,则显示补全命令。若 :s ,则显示 s 开头的补全命令。按 Tab,则会在其命令列表中切换选择 :help 显示关于的帮助 :! 执行该外部命令 : 跳至 行,与正常模式下的 G 类似 /word 查找 word 字符,按 n 键往『后』查找 ?word 查找 word 字符,按 n 键往『前』查找 # 加 ! 号强制执行 :e 打开文件 :w 保存该文件 :w 另存为 :q 退出 :wq 保存并退出(内容未变更,文件修改时间亦会变更) :x 保存并退出 # 片段处理 移动光标到某行,接着按 v 键,将光标 上下左右 移动。其间的文本会被高亮。即,已选中该内容。 ## 保存片段:选中的内容另存为 TEST 文件 按 : ,屏幕底部会出现 :'<,'> 。输入 w TEST,其中 TEST 是一个未被使用的文件名。最终内容为 :'<,'>w TEST ,按 键。 ## 删除片段:删除选中的内容 按 d 即可删除该选中的内容 # 插入内容 :r 将 Filename 文件中的内容粘贴到光标处 :r ! 将外部命令的显示结果粘贴到光标处 # 替换 :s/old/new 替换本行的首个 `old` 为 `new` :s/old/new/g 替换本行的 所有`old` 为 `new` :#,#s/old/new/g 替换 `1#`行到 `2#` 中的 `old` 为 `new` :%s/old/new/g 替换整个文件中的每个匹配串 :%s/old/new/gc 替换整个文件中的每个匹配串,需确认是否替换 :saveas 另存为 :so % 相当于 source ,使当前文件环境生效 ``` ### 操作指南 **(1)指南** - 复制、移动、删除 1. `yy` 复制当前行 2. `p` 将复制的内容进行粘贴 3. `f;` 跳转到字符 `;` 处,这里其实就是相当于行位 4. `h` 向左移动一个光标 5. `ciw` 删除当前处的词,并进入 **插入模式** - 行选并注释 1. `v (小写)`,进入 **选择模式** 2. `hjkl` 选择内容 3. `x` 删除内容 **(2)案例** - 从当前字符起,复制到第 2 个 test 位置前(不含) ```bash ^abc test home fdst bcfds test fdsa fds test abfdsc ``` > `y2/test`,结果为: `abc test home fdst bcfds` - 删除 `"` 中的字符(不含`"`) ```bash What is it? haha"H^ello World!"bbc ``` > `di"` > 结果:`What is it? haha""bbc` > 或者使用 `ci"` 亦可,但此方式会切换进 `编辑模式` - 删除单词并进入编辑模式 ```bash https://bai^du.com ``` > `cw` 会删除 `du`,并且进入编辑模式 > `ciw` 会删除 `baidu`,并且进入编辑模式 - 删除段落 ```bash What is it? haha""bbc MkDocs is a ^fast, simple and downright gorgeousstatic site generator that's ge ared towards building project documentation. Docum ``` > `cip` 删除全段,结果为: ```bash What is it? haha""bbc ared towards building project documentation. Docum ``` ### 个人理解 1. 空格会作为当前单词的一部分,比如: ```bash # 光标处 ^, 按 w, 则会跳至 d ^abc def ghi # 光标处为 ^, 按 w, 则会跳至 , ^abc,def,ghi # 光标处为 ^, 按 W, 则会跳至 d ^abc,def,ghi ``` --- ## 插入模式 插入模式是您可以 **编写/编辑** 文档的地方。 > `i` : 在光标之前,进入插入模式 > `I` : 在本行开头非空处,进入插入模式 > `a` : 在光标之后,进入插入模式 > `A` : 在本行末尾,进入插入模式 > `o` : 在本行之后新增一行,并进入插入模式 > `O` : 在本行之前新增一行,并进入插入模式 > `s` : 删除当前字符,并进入插入模式 > `S` : 删除当前行中的所有文本,并进入插入模式 ## 可视模式 视觉模式是您可以 **选择单词、行、块** 等的地方。 > `v` : 进入 `VISUAL` 模式,此键从光标下的字符开始切换到可视模式。 > `V` : 进入 `VISUAL LINE` 模式,此键从当前行开始选择整个行切换到可视模式。 > `Ctrl + v` : 进入 `VISUAL BLOCK` 模式,此键切换到视觉模式,允许选择垂直块。 ## Vim 语法 ### 1.1 动词 - `d` 删除 delete - `r` 替换 replace - `c` 修改 change - `y` 复制 yank - `v` 选取 visual select ### 1.2 名词 - `w` 单词 word - `s` 句子 sentence - `p` 段落 paragraph - `t` HTML 标签 tag - 引号或者各种括号所包含的文本称作一个文本块 ### 1.3 介词 - `i` “在…之内” inside - `a` “环绕…” around - `t` “到…位置前” to - `f` “到…位置上” forward ### 1.4 组词为句 文本编辑命令的基本语法如下: **动词+介词+名词** 例子: - 删除一个段落 delete inside paragraph: `dip` - 选取一个句子 visual select inside sentence: `vis` - 修改一个单词 change inside word: `ciw` - 修改一个单词 change around word: `caw` - 删除文本直到字符`x`(不含 `x`)delete to x: `dtx` - 删除文本直到字符`x`(含`x`)delete forward x: `dfx` ### 1.5 数词 数词指定了待编辑文本对象的数量,语法就成了这样: **动词+介词/数词+名词** 例子: - 修改三个单词 change three words: `c3w` - 删除两个单词 delete two words: `d2w` 数词也可以修饰动词,表示将操作执行 n 次。语法: **数词+动词+名词** 例子: - 两次删除单词(等价于删除两个单词) twice delete word: `2dw` - 三次删除字符(等价于删除三个字符)three times delete character: `3x` ## 配置信息 ```vim set ic " ignorecase (Ignore Case) 忽略大小写 set noic " 大小写严格(禁用忽略大小写) set hls " hlsearch 高亮搜索结果 set nohls " 不高亮搜索结果 set is " incsearch 开启实时搜索高亮 ``` --- **文章载自:**https://www.idev.top/d/407