目录
认识各种 操作符(operation)、移动指令(motion)和(即时)命令
即时命令3 ctrl f / b ctrl u / d (翻页)
提要
本文只关注于 vim 的基本使用,在以较低成本学习的前提下能够长时间自如运用 vim 。旨在帮助人们能更好地进行文档的各种基本操作,以及更好地理解各种操作并进行合理搭配,并不会涉及其他额外的知识。但是为了便于我们理解和记忆各种操作的标识字母,我会进行英文注解。
读完本文:
你将学到 | 你 不 会学到 |
vim基本概念及基本操作 & 各模式下的基本命令集
|
|
!!!切记本文的操作尽量边看边练习,只是记忆很难达成我们熟练使用 vim 的目的。
NOTE:
- 本文有 <digit> 标识的地方请你键入 任意数字 来进行替代
- 本文有 <letter> 标识的地方请你键入 任意字母 来进行替代
- 本文有 <pattern> 标识的地方请你键入 任意字符串 来进行替代
普通模式(Normal mode)
- 进入方式:启动 Vim 后默认进入,或通过
Esc
键进入。 - 作用:
- 进入其他模式必须从普通模式进入键入 Esc 进入普通模式。
- 进行导航和文本操作,比如移动光标、删除、复制、粘贴等
常见操作(自己实操):
h/j/k/l
:光标(cursor)左/下/上/右移动。
对于 hjkl 作为左下上右的设计,不仅是历史的遗留问题,这样的设计也提高了编辑的效率。在vimtutor上 原话是这样的:
(不想看英文的可以直接看下文翻译)
line 30: The h key is at the left and moves left.
line 31: The l key is at the right and moves right.
line 32: The j key looks like a down arrow.
翻译过来就是,在 hjkl 中 h 居最左, l 最右,那么左和右就是他们俩, j 长得像下箭头就代表下。( 那么剩下的 k 自然就是 向上(up) 了 )
认识各种 操作符(operation)、移动指令(motion)和(即时)命令
操作符:删除--d(delete),复制--y(yank--拉取),更改--c(change)
移动指令(即下文所谓的 motion ) | 含义 |
w(word) | 跳转下一个单词的开头 |
e(end) | 跳转当前单词的末尾 |
$ | 到当前行(line)的尾 |
^ | 到当前句(sentence)的头(该行第一个非空字符) |
0(zero)不是大写o | 到 当前行 的首 |
gg | 跳转 文件 开头 |
G | 跳转 文件 末尾 |
<digit>G | 跳转到 digit 行 |
f <letter>or<digit> | 跳转到当前行下一个键入的字符 |
/<pattern>
?<pattern> | 向下查找输入的字符串并跳转 向上查找输入的字符串并跳转 |
NOTE:
- 还有很多 motion 比如 vim 会记录你的 motion 并允许你使用 ctrl + o 回到上一次跳转的地方或者使用 ctrl + i 回到新跳转的地方,自己试。
- 不知道光标在多少行 可以 按 shift + ; 也就是键入 : 进入末行模式,输入set nu 将会显示行号,或者在普通模式下 按下ctrl + g会显示当前行号。
- 查找(search)的时候 按 n 跳转到下一个匹配(match)项,N 跳转到上一个匹配项。
公式 : operation [<digit>] motion (未输入digit则默认为1
- 比如 d2w 删除接下来的两个word
- d$ 从光标(cursor)处删除一直到行末(不会删除回车换行键)
学习了以上这些,就可以自行进行排列组合形成无数种操作了。但是还有一些操作需要了解
公式 : [<digit>] + dd \ yy \ cc
dd 删除整行,yy 复制整行, cc 删除整行并置为 insert 模式
3dd 删除3行 5yy 复制5行 等等等等
即时命令1 p/x/r
简单点说,命令不能像操作符operation一样和移动指令motion组成一个公式使用,脱离了这些框架,为我们提供简单灵活的粘贴,删除,替换操作
p:(paste、put)直接粘贴刚刚d(删除)的或者y(复制)的到光标处
x: 删除光标位置处的单个字符, x 键作为删除不是直接从英文过来的,而是历史遗留下来的,x也像叉号 × ,我是这么记的。
r: (replace) 敲 r 了再输入一个字符将光标处的字符替换为输入的字符
即时命令2 u/ctrl + r (撤销、撤销之撤销)
u :(undo) 按下后回退到上一次操作前的文档
ctrl + r: undo undo's 意即(否定之否定)撤销之撤销,只可用来撤销已经撤销的操作
实际上还有个 U (shift + u) 用来撤销光标所在行所有的操作,但是我认为没必要记。
即时命令3 ctrl f / b ctrl u / d (翻页)
不卖关子了:
<digit>ctrl f--forward \ b--backward 不跟数字默认一页,前面跟数字就是翻几页 | 向前、向后翻页 |
<digit>ctrl u--up \ d--down 不跟数字默认翻半页,跟数字就是翻几行 | 向前、向后翻页 |
插入模式(Insert mode)
- 进入方式:在普通模式下键入 i / a / o 以及他们的大写 进入
i
:在光标前进入插入模式。
I
:移动光标到当前行的第一个非空字符前插入文本。
a
:在光标后进入插入模式。
A:移动光标到行末(不是句末)后进入插入模式
o
:在当前行下方新建一行并进入插入模式。
O:在当前行上方新建一行进入插入模式
末行模式(Last line mode)
顾名思义该模式就是固定使用者的操作空间在末行。
- 进入方式:(在普通模式下)键入 shift + ; 也就是输入 : 进入末行模式也叫(命令行模式---- Command mode)
常用指令(自己实操)
以下命令都需要 按回车 (hit Enter)才会生效
:set nu(number) :set ic (ignore case) | 显示行号 忽略大小写 比如查找的时候 |
:<digit> | 跳转行号 |
:q! (quit !) | 强制退出 |
:wq (write quit) | 保存退出 |
:w | 保存 |
指令集 1 :s/old/new (s--substitute) 2 :s/old/new/g (g--global) 3 :%s/old/new/ 4 :%s/old/new/g 5 :%s/old/new/gc (c--confirm) | 匹配old 然后替换成new 1 替换当前行的第一个匹配项 2 替换当前行的所有匹配项 3 替换整个文档的第一个匹配项 4 替换整个文档的所有匹配项 5 替换整个文档的所有匹配项但是需要用户进行输入确认 6 范围替换 |
:! + external command | 执行外部命令 |
:w filename | 另存为文件到cwd(当前文件夹)下的filename文件中 (没有该文件则新建) |
:r filename或者其他 (r--retrieve--收回) | 将值拷贝过来,如果输入一个文件名那么拷 贝文件所有内容到vim里面,还可以输入 !ls 这样 的外部指令,可以将指令的输出值拷贝到vim里面来 |
:nohlsearch (no highlight search) | 让查找的结果不会高亮 |
替换模式(Replace mode)
输入 R 进入替换模式,再输入字符串,相当于一连串的 r 命令,可以键入 backspace 进行回退,把刚刚替换的回退掉,使得光标处变成未替换之前的样子
可视模式(Visual mode)
按 v \ V \ ctrl + v 进入 可视模式 \ 行可视模式 \ 块可视模式
区别是 : 可以进行一个段落的自由选择 \ 只能是整行选择 \ 只能是矩形式地选择
相当于word文档里用鼠标框中的一个段落,选择之后,我们可以delete也可以yank也可以change所选择的块
下面讲一下应用:一般我们用 块可视模式 实现对多行的同一列进行相同处理(比如代码的一键注释)
应用:一键注释代码
- ctrl v 进入块可视模式
- 上下左右或者使用motion (比如<digit>G)选择需要注释的行
- 选择好后按shift + i 也就是 I 进入 insert 模式
- 输入 # 或者 // (具体根据语言来)然后按 Esc 退出块可视模式稍等一秒就好了
总结
vim下的基本操作也差不多了,学到这里已经能够正常使用了。vim 模式不止这些,而且还有许多命令前人之述备,这里也不便于过多赘述,只是在网络这一角旮旯发布 vim 的使用,以期能有所造化吧。