├── .gitignore
├── README.md
└── quick-start-guide.md
/.gitignore:
--------------------------------------------------------------------------------
1 | tags
2 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Vim 入门资料整理
2 |
3 |
4 | 文章移至: [https://wsdjeg.net/wiki/tools/vim/](https://wsdjeg.net/wiki/tools/vim/)
5 |
--------------------------------------------------------------------------------
/quick-start-guide.md:
--------------------------------------------------------------------------------
1 | # Vim 入门教程
2 |
3 |
4 |
5 | - [简介](#简介)
6 | - [如何退出 vim](#如何退出-vim)
7 | - [什么是模式](#什么是模式)
8 | - [如何在模式之间切换](#如何在模式之间切换)
9 | - [基本概念](#基本概念)
10 | - [基本操作](#基本操作)
11 | - [移动命令](#移动命令)
12 | - [操作命令](#操作命令)
13 | - [操作命令+移动命令](#操作命令移动命令)
14 | - [操作命令二连击 = 行操作](#操作命令二连击--行操作)
15 | - [可视模式下操作命令](#可视模式下操作命令)
16 | - [更多常用命令](#更多常用命令)
17 |
18 |
19 |
20 | ## 简介
21 |
22 | Vim 是一款开源的模式化文本编辑器,项目源码公开在 Github。Windows 用户
23 | 可以从此下载最新的每日构建版: [vim-win32-installer](https://github.com/vim/vim-win32-installer/releases)。
24 |
25 | ### 如何退出 vim
26 |
27 | 别紧张。确保你使用的是英文输入法,然后按如下顺序敲击键盘:
28 |
29 | 1. 按一下 ESC
30 | 2. 输入一个 :
31 | 3. 输入一个 q
32 | 4. 输入一个 !
33 | 5. 按一下回车,即键盘上的 Enter
34 |
35 | 做得很好,你已经安全了。
36 |
37 | ### 什么是模式
38 |
39 | Vim 不同于其他编辑器的主要特点就是模式化。什么叫做模式化?可以理解为
40 | 编辑器的一种状态,不同的状态下对用户的输入采取不同的响应方式。比较常
41 | 见的模式有 Normal(普通模式),Insert(插入模式)和 Visual(可视模式)。
42 |
43 | Vim 打开是默认的模式是 Normal 模式,在这一模式下,按键不能直接将字符插入至文件,而是执行各种命令。比如 `h` 按键不是输入字符 h,而是将光标
44 | 向左移动一个字符位置。
45 |
46 | 插入模式,顾名思义,在这个模式下,按键的字符是直接插入的。
47 |
48 | 可视模式,这一模式有点类似于在普通编辑器里按住鼠标左键移动鼠标,即进行选择。
49 |
50 | ### 如何在模式之间切换
51 |
52 | 普通模式是 Vim 默认模式,任何模式下通过 `` 按键都可以切换到普通模式。
53 | 普通模式想要切换到插入模式,方法有很多。比较常用的按键如下:
54 |
55 | | 按键 | 描述 | 助记 |
56 | |------|----------------------|--------|
57 | | `i` | 在当前光标字符前插入 | insert |
58 | | `a` | 在当前光标字符后插入 | append |
59 | | `I` | 在当前行首插入 | Insert |
60 | | `A` | 在当前行尾插入 | Append |
61 | | `o` | 在下方开一新行,插入 | open |
62 | | `O` | 在上方开一新行,插入 | Open |
63 |
64 | 普通模式切换到可视模式,按键就比较单一了,比较常用的是:
65 |
66 | | 按键 | 描述 | 助记 |
67 | |------------|------------------------------------------|--------|
68 | | `v` | 选中当前光标字符,并进入可视模式 | visual |
69 | | `V` | 不同于小写 `v`,这时移动光标只会按行选择 | Visual |
70 | | `` | 块选择模式,此时移动光标会选择一个矩形块 | |
71 |
72 | 可视模式切换到输入模式一般有以下几种情况:
73 |
74 | | 按键 | 描述 | 助记 |
75 | |------|--------------------------------------|--------|
76 | | `s` | 删除当前已选择的内容,并进入插入模式 | |
77 | | `c` | 删除当前已选择的内容,并进入插入模式 | change |
78 | | `di` | 删除当前已选择的内容,并进入插入模式 | |
79 |
80 | 可视模式回到普通模式也有很多方式,比较直接的就是``,当然,还有其他一些按键:
81 |
82 | | 按键 | 描述 | 助记 |
83 | |------|------------------------------------------|------|
84 | | `y` | 复制当前选择区域,并退出可视模式 | yank |
85 | | `Y` | 复制当前选择区域(按行),并退出可视模式 | Yank |
86 |
87 |
88 | ## 基本概念
89 |
90 | Vim 的各种命令是可以灵活组合变通的,命令是解决问题的手段。
91 |
92 | ## 基本操作
93 |
94 | ### 移动命令
95 |
96 | Vim 的各种移动命令主要是在 Normal 模式下。最基本的移动命令是光标的上下
97 | 左右移动,当然,你可以使用方向键,但是我想更多的 Vim 用户比较喜欢使用
98 | h、j、k、l 按键。
99 |
100 | | 按键 | 描述 |
101 | | ---- | ---------------------------------------- |
102 | | `h` | 光标左移 |
103 | | `j` | 光标下移 |
104 | | `k` | 光标上移 |
105 | | `l` | 光标右移 |
106 |
107 | 学会了这四个移动命令,你就可以自由地移动你的光标了,开始尽情地上下左右!
108 |
109 | 慢着,一个光标一个光标移动多慢啊,电脑上的其他编辑器可以鼠标定位,
110 | 还有那么多触控设备可以直接定位光标,用 Vim 的用户难道是慢吞吞的乌龟么?
111 |
112 | 还记得一开始说的灵活使用命令么?你可以输入“数字+移动命令”,一次性进行多次移动。
113 |
114 | | 按键 | 描述 |
115 | | ---- | ---------------------------------------- |
116 | | n+`h`| 光标左移 n 个位置 ,n(umber) 指数字 |
117 | | n+`j`| 光标下移 n 个位置 ,n(umber) 指数字 |
118 | | n+`k`| 光标上移 n 个位置 ,n(umber) 指数字 |
119 | | n+`l`| 光标右移 n 个位置 ,n(umber) 指数字 |
120 |
121 | 带上了数字后,你发现光标健步如飞,仿佛穿上了跑鞋:)
122 |
123 | 开放思想,当你编辑一个小文件时,正好光标在一行中部,你想跳到行首,你可以`99h`,
124 | 当你在文件中部,你可以`99k`跳到第一行,同理其他移动命令来达成行尾、末行的效果。
125 |
126 | 但如果一个文件有几万行几万列,我们也这样输入一个无穷大的数字来跳转么?
127 |
128 | 放心,Vim 已经内置了这些该有的命令。
129 |
130 | 当然 Vim 还有其他常用的移动光标的按键:
131 |
132 | | 按键 | 描述 | 助记 |
133 | |------|---------------------------------|-----------|
134 | | `0` | 跳到行首,可以理解为无穷大的`h` | |
135 | | `^` | 跳到行首开始的第一个非空白字符 | |
136 | | `$` | 跳到行尾,可以理解为无穷大的`l` | |
137 | | `gg` | 跳到首行,可以理解为无穷大的`k` | |
138 | | `G` | 跳到末行,可以理解为无穷大的`j` | |
139 | | `w` | 跳到下一个词首 | word |
140 | | `b` | 跳到上一个词首 | back-word |
141 | | `e` | 跳到下一个词尾 | end |
142 | | `ge` | 跳到上一个词尾 | |
143 |
144 | 词间跳转中,“上一个词首”的精确断句为“上一个/词首”,即如果当前光标不在词首,则跳到本词词首;
145 | 如果当前光标已经在词首,才跳到上一个词的词首。
146 | “下一个词尾”与此类似。
147 |
148 | 词间跳转也是支持“数字+移动命令”的,比如输入 `5w` 可以向后移动 5 个词。
149 |
150 | 除了 Normal 模式,移动命令也可以在可视模式下使用。
151 | 在可视模式下移动光标时,从**进入可视模式时的光标位置**到**移动后的光标位置**之间的文本将会被选中。
152 |
153 | ### 操作命令
154 |
155 | 编辑文档的过程,实际上就是不断操作特定文本的过程:删除、修改、复制,等等。
156 | Vim 下的操作命令(Operator Commands)即特指一系列针对特定文本的操作。
157 | 常用的操作命令包括:
158 |
159 | | 按键 | 描述 | 助记 |
160 | |------|----------------------|--------|
161 | | `c` | 删除,并进入插入模式 | change |
162 | | `d` | 删除 | delete |
163 | | `y` | 复制 | yank |
164 | | `gu` | 变为小写字母 | |
165 | | `gU` | 变为大写字母 | |
166 | | `g~` | 颠倒字母的大小写 | |
167 | | `>` | 右缩进 | |
168 | | `<` | 左缩进 | |
169 | | `=` | 自动缩进 | |
170 |
171 | 你可能会问,那怎么指定这些操作命令作用的文本对象呢?
172 |
173 | #### 操作命令+移动命令
174 |
175 | 记住我们刚开始所说的,Vim 的各种命令都是可以灵活组合变通的!
176 | 操作特定文本,Vim 的解决方案是"**操作命令+移动命令**",
177 | 即操作命令的对象由移动命令来指定,举例:
178 |
179 | - `dl`:向右删除一个字符(删除当下字符,右侧字符不会被删);
180 | - `dh`:向左删除一个字符(删除左侧字符,当下字符不会被删);
181 | - `d3l`:向右删除 3 个字符(`3dl` 亦有相同效果,下同);
182 | - `d3w`:删除文本至右侧第三个词首之前;
183 | - `de`:删除当下字符至下一个词尾;
184 | - `y2w`:复制当下位置至右侧第二个词首之间的文本;
185 | - `gUe`:将当下字符至下一个词尾变成大写;
186 |
187 | 其他请以此类推。你会发现,由于操作命令和移动命令的多种多样,能够组合出来的文本操作也是多种多样。
188 | 再结合数字,可以实现的功能就更强大了。
189 |
190 | 需要注意的是,一个操作命令只会对紧随其后的一个移动命令有效。所以 `dll` 的作用是
191 | “向右删除一个字符后再右移一位”,而不是“向右删除两个字符”。
192 | 如果要实现“向右删除两个字符”,应使用 `d2l`。
193 | `2l` 虽然相当于移动两次,当应视为单个移动命令(因为单独一个数字不构成一个完整命令)。
194 |
195 | #### 操作命令二连击 = 行操作
196 |
197 | 针对一整行的操作是很常见的。
198 | 比如,如果要删除一整行,应该如何操作呢?
199 | 根据上面的讲解,你可能会回答:先用 `0` 回到行首,再用 `d$` 删至行尾。
200 | 这未免显得繁琐了些。而且,这只是删除了行内字符,并没有将整行删掉。
201 |
202 | Vim 提供了“操作命令二连击”的方式来实现真正的行操作:
203 |
204 | | 按键 | 描述 |
205 | |--------------|----------------------|
206 | | `cc` | 删除整行,并进入 insert (插入)模式 |
207 | | `dd` | 删除整行 |
208 | | `yy` | 复制整行 |
209 | | `guu`/`gugu` | 整行变为小写字母 |
210 | | `gUU`/`gUgU` | 整行变为大写字母 |
211 | | `g~~`/`g~g~` | 颠倒整行字母的大小写 |
212 | | `>>` | 行右缩进 |
213 | | `<<` | 行左缩进 |
214 | | `==` | 行自动缩进 |
215 |
216 | #### 可视模式下操作命令
217 |
218 | 可视模式下使用操作命令则直观得多。
219 | 进入可视模式,用移动命令选择文本,再键入操作命令,指定的操作就会作用在选中文本上。
220 | 操作完成后,会自动退回 Normal 模式。
221 |
222 | 可视模式下“移动指令+操作指令”,和 Normal 模式下“操作指令+移动指令”,各有利弊。
223 |
224 | Normal 模式的好处显而易见,不用切换模式,更快捷。
225 |
226 | 可视模式的好处是操作对象更精准可控,因为选中的文本会被高亮;
227 | 相比之下,Normal 模式下就有点“黑灯瞎火”的感觉,如果移动指令稍微有点复杂,就易出错
228 | (比如 `d7w`,词数太多很可能数错)。
229 | 此外,Normal 模式下,操作命令对光标移动的起始和终末字符是否生效,容易产生混淆,比如
230 | `de` 会连包括词尾在内的字符一起删掉,而 `dw` 却是删到下一个词首之前的字符为止。
231 |
232 | 总之,完成一种操作,在 Vim 下往往有多种解决方案,应在实践中找到适合自己的最佳方案。
233 |
234 | #### 更多常用命令
235 |
236 | 上述操作命令在 Normal 模式都无法单独生效,需要二连击或者配合移动指令之类才能起作用。
237 |
238 | Normal 模式下“一击即中”的常用命令则包括:
239 |
240 | | 按键 | 描述 | 助记 |
241 | |------------|---------------------------------------------------|-----------|
242 | | `p` | 粘贴于当前光标之后 | paste/put |
243 | | `P` | 粘贴于当前光标之前 | Paste/Put |
244 | | `x` | 删除当前字符,相当于 `dl` | |
245 | | `s` | 删除当前字符并插入,相当于 `cl` | |
246 | | `C` | 删除至行尾并插入,相当于 `c$` | |
247 | | `D` | 删除至行尾 | |
248 | | `S` | 从当前行首个非空字符删除至行尾并插入,相当于 `^C` | |
249 | | `u` | 撤销上一次修改 | undo |
250 | | `` | 重做上一次修改,`u` 的逆过程 | redo |
251 | | `.` | 在当前光标处重复上一次修改 | |
252 |
253 | 一个小思考题:`d2w` 和 `dw.` 都可以实现相同的效果,它们本质上一样吗?
254 | 如果它们之后跟着一个 `u` 或 `.`,效果有什么不同?
255 | 考虑一下,如果你要删除接连几个词,大概会使用怎样的键入组合。
256 |
257 | 对了,重做命令是 `` 而非 `r`,因为 `r` 被另一个常用命令占用了,即替代命令:
258 |
259 | | 按键 | 描述 | 助记 |
260 | |------|---------------------------------------------------------------------------------------------|---------|
261 | | `r` | 替代字符,将当前字符替代为紧跟着输入的字符 | replace |
262 | | `R` | 进入替代模式,将当前及之后的字符都替代为紧跟着输入的字符串,直到按 `` 返回 Normal 模式 | Replace |
263 |
--------------------------------------------------------------------------------