1、vim 三种基本的工作模式
vim有三种基本的工作模式,分别为:命令模式、末行模式、编辑模式。关于这三种工作模式的介绍,请见下文。
1.1、命令模式
使用vim打开文件之后,首先进入命令模式,它是vim编辑器的入口模式。在命令模式下,通过使用命令对文件进行常规的编辑操作,例如:复制、粘贴、删除、定位、翻页等等。
1.2、末行模式
末行模式是vim编辑器的出口,要退出vim,必须要在末行模式下。在末行模式下,执行退出文件、保存并退出文件等操作。
1.3、编辑模式
正常的编辑文字模式。
2、三种模式的切换操作
(1)vim打开一个文件进入的就是命令模式,另外两种模式需要回到命令模式才能进入彼此。
(2)在命令模式中按下i,I,o,O,a,A,r,R任何一个字母后进入编辑模式,进入编辑模式后,下方会出现INSERT或者REPLACE字样,按Esc键退出编辑模式,回到命令模式。
(3)在命令模式中按下:,/,?中任意一个即可进入末行模式,末行模式可以对文档或者vim环境进行操作,例如查找、读取、存盘、替换、离开、显示行号等。
3、各种模式切换
普通模式 - - NORMAL - - ———> 插入模式 - - INSERT - -
- insert
- i 在光标前插入
- I 在行首插入
- open a new line
- o 在下一行插入
- O 在上一行插入
- append
- a 在光标后插入
- A 在行尾插入
普通模式 - - NORMAL - - <——— 插入模式 - - INSERT - -
- ESC
- jj / CapsLock
普通模式 - - NORMAL - - ———> 可视模式 - - VISUAL - -
- v
普通模式 - - NORMAL - - <——— 可视模式 - - VISUAL - -
- v
- Esc
普通模式 - - NORMAL - - ———> 命令模式
- :
普通模式 - - NORMAL - - <——— 命令模式
- Esc
总结
先区分输入内容与执行命令:普通模式下按键用于移动和编辑,不会直接写入文本;按 i 进入插入模式后才开始输入正文,按 Esc 回到普通模式。若不确定当前状态,先按 Esc 再执行下一步,比连续尝试不同按键更容易判断行为。后续的移动、删除与复制示例,除非另有说明,都以普通模式为起点。
进入插入模式要先选好位置:i 在光标前插入,a 在光标后追加;I 移到当前行第一个非空白字符前插入,A 移到行尾追加。练习时在同一行分别尝试这些入口,输入少量文字后按 Esc,观察光标位置与文本变化。这里的大写和小写是不同命令,不能把 I 简单当作 i 的另一种写法。
需要新增一行时,在普通模式按 o 会在当前行下方打开新行并进入插入模式,按 O 则在上方打开新行。它们不同于只移动光标的命令,也不同于在原行内部插入字符;如果只是想定位到邻行,应使用移动命令。输入完成后按 Esc 返回普通模式,下一次按键才会继续作为编辑指令解释。
可视模式用于先选范围再执行操作:普通模式按 v 开始按字符选择,随后通过移动命令扩大或缩小选区,再决定复制、删除或修改。放弃当前选择时按 Esc 返回普通模式,不必执行破坏性操作来退出。要留意状态栏显示的模式,避免把选择阶段的移动按键误认为已经在插入正文。
普通模式按 : 进入命令行后,可以输入保存、退出或设置命令,按回车执行,按 Esc 取消本次命令输入。jj 或把 CapsLock 当作退出键并不是 Vim 原生的统一行为,它们需要相应映射或系统配置;迁移到新环境时先使用 Esc。单字符替换 r 也不同于持续输入的插入模式,不应把所有编辑入口混为一类。
4、光标移动
光标移动先从 h、j、k、l 开始:分别向左、下、上、右移动。可以在命令前加次数,例如 3j 向下移动三行,这里的数字属于移动次数,不会写入正文。移动只改变位置,不会删改文本;在普通模式熟悉方向后,再把相同的移动范围组合进删除或复制命令,能更清楚地判断操作影响。
按单词移动时,w 去下一个单词开头,b 返回当前或前一个单词开头,e 到当前或下一个单词结尾,ge 向后寻找前一个单词结尾。大写的 W、B、E 以空白分隔的较大文本块为单位,对包含标点的代码行尤其有区别。练习时把光标放在单词中间再比较各命令,注意起始位置会影响实际落点。
解释:
- w : word
- b : begin
- e : end
- ge : 不太常用
行内与文件级定位分开记忆:0 到行的第一个字符,^ 到第一个非空白字符,$ 到行尾;gg 到文件首行,G 到末行,nG 或 ngg 到指定行号。处理有缩进的代码时,0 与 ^ 的落点不同,前者包含缩进位置。先准确到行,再用单词或字符查找细调,通常比重复逐字符移动更容易控制。
当前行内查找字符可用 f{字符} 向前落在目标字符上,t{字符} 向前停在目标字符之前;大写 F 与 T 反向查找。按 ; 沿原方向重复,按 , 反向重复,不需要重新输入目标字符。跨越更大文本结构时,可以使用 (、) 按句子移动,或 {、} 按段落边界移动,先分清搜索范围再选择命令。
| 字符 | 单词 | 行 | 跳转 | 句和段 |
|---|---|---|---|---|
| h 左 | w下一个单词开头 | 0 行首 | f char 跳到char位置 | ( 到句首 |
| j 下 | b本单词或上一个单词开头 | ^ 行首非空字符 | F char 反向 | ) 到句尾 |
| k 上 | e本单词或下一个单词结尾 | $ 行尾 | t char char前一位置 | { 到段首 |
| l 右 | ge上一个单词结尾 | gg 首行 | T char char后一位置 | } 到段尾 |
| W长单词 E长单词 B长单词 | G 尾行 | ; 重复上次的跳转 | ||
| ngg 第n行 | , 反向查找上次的查找 |
5、动作 motion
移动命令描述从当前位置到目标位置的范围,文本对象则描述当前位置所属的一块结构。使用文本对象时通常先输入操作符或进入可视模式,再选择范围,例如 iw 表示单词内部,aw 包含单词及相关空白。把“要做什么”和“作用在哪一块”分开思考,能避免先手动选很长一段文本,再猜测是否漏选边界。
文本对象的 i 表示内部范围,a 通常连同外围分隔或相关空白一起选取。it 面向标签内部,is 面向句子内部,ip 面向段落内部;它们是操作范围,不是普通模式下任意单独敲击就会完成编辑的命令。可以先用 v 配合对象检查选区,再决定执行复制或修改;不同对象的边界规则不同,遇到嵌套结构时尤其要先确认范围。
- it : inner tag
- is : inner sentence
- ip : inner paragraph
6、操作符
操作符按“操作 + 范围”组合:d 删除指定范围,c 删除后进入插入模式,y 复制范围;例如 yy 复制当前行,dd 删除当前行。p 是把寄存器内容放到当前位置之后的命令,不需要再跟一个移动范围。表中的 b、B 可用于特定括号文本对象,而不是通用操作符;e 在原生 Vim 中是移到单词结尾,不能当作默认全选命令。
| 操作符 | 说明 |
|---|---|
| d(delete) | 删除 |
| c(change) | 修改(删除并且进入插入模式) |
| y(yank) | 复制 |
| v(visual) | 选中并且进入 VISUAL 模式 |
| p(paste) | 粘贴 |
| b(bracket) | 小括号的简写 |
| B(Bracket) | 大括号的简写 |
| e(entire) | 全选 |
7、大小写
大小写转换使用明确的操作范围:gU 把范围转为大写,gu 转为小写,g~ 切换大小写;例如 gUw 对当前移动范围执行大写转换,guu 将当前行转为小写。可视模式中先选定文本,再按 U 或 u 也能转换选区。普通模式单独的 u 是撤销,不是转小写;也不要把所有 g 前缀命令都理解成跳转,应按完整命令记忆。
- ‘g’ means goto
- ‘U’ means Uppercase
- ‘u’ 与上一个相反
Tips
- gd : goto definition 跳转到定义
- ctrl + o : 跳回
- gh : goto (mouse) hover 鼠标悬浮
- gt : goto tab 跳转下一个标签页
- gT : 与上一个相反 跳转上一个标签页
- ngt / ngT : 跳转到第n个标签页
VSCode中的Vim
- vscode中默认为space
- S{Charactor} : 寻找某个字符
- xxx : 详见配置
| Motion Command | Description |
|---|---|
<leader><leader> s <char> | Search character |
<leader><leader> f <char> | Find character forwards |
<leader><leader> F <char> | Find character backwards |
<leader><leader> t <char> | Til character forwards |
<leader><leader> T <char> | Til character backwards |
<leader><leader> w | Start of word forwards |
<leader><leader> b | Start of word backwards |
<leader><leader> l | Matches beginning & ending of word, camelCase, after _, and after # forwards |
<leader><leader> h | Matches beginning & ending of word, camelCase, after _, and after # backwards |
<leader><leader> e | End of word forwards |
<leader><leader> ge | End of word backwards |
<leader><leader> j | Start of line forwards |
<leader><leader> k | Start of line backwards |
<leader><leader> / <char>... <CR> | Search n-character |
<leader><leader><leader> bdt | Til character |
<leader><leader><leader> bdw | Start of word |
<leader><leader><leader> bde | End of word |
<leader><leader><leader> bdjk | Start of line |
<leader><leader><leader> j | JumpToAnywhere motion; default behavior matches beginning & ending of word, camelCase, after _ and after # |
<leader><leader> (2s|2f|2F|2t|2T) <char><char> and <leader><leader><leader> bd2t <char>char> are also available. The difference is character count required for search. For example, <leader><leader> 2s <char><char> requires two characters, and search by two characters. This mapping is not a standard mapping, so it is recommended to use your custom mapping.
- surround
| Surround Command | Description |
|---|---|
y s <motion> <desired> | Add desired surround around text defined by <motion> |
d s <existing> | Delete existing surround |
c s <existing> <desired> | Change existing surround to desired |
S <desired> | Surround when in visual modes (surrounds full selection) |
Some examples:
"test"with cursor inside quotes typecs"'to end up with'test'"test"with cursor inside quotes typeds"to end up withtest"test"with cursor inside quotes typecs"tand enter123>to end up with<123>test</123>
多光标功能
🖱️ Multi-Cursor Mode
:warning: Multi-Cursor mode is experimental. Please report issues in our feedback thread.
Enter multi-cursor mode by:
- On OSX,
cmd-d. On Windows,ctrl-d. gb, a new shortcut we added which is equivalent tocmd-d(OSX) orctrl-d(Windows). It adds another cursor at the next word that matches the word the cursor is currently on.- Running “Add Cursor Above/Below” or the shortcut on any platform.
Once you have multiple cursors, you should be able to use Vim commands as you see fit. Most should work; some are unsupported (ref PR#587).
- Each cursor has its own clipboard.
- Pressing Escape in Multi-Cursor Visual Mode will bring you to Multi-Cursor Normal mode. Pressing it again will return you to Normal mode.
vscode中可以使用 cmd + d 批量修改
vim中可以使用 gb 批量膝盖
将光标定位到终端
在settings.json添加如下快捷键
//由editor 转到 terminal{ "before": ["leader", "t"], "commands": ["workbench.action.terminal.focus"]}space + t 即可跳转到终端中
跳转Tab
进入命令模式 :
- 输入 tabn : tab next 即进入下一个标签页
- 输入 tabp : tab prev 即进入下一个标签页