# 在 vim 中进行打字

20210824193823-2021-08-24-19-38-27

i 从正常模式切换到插入模式,当前方块的前面为具体的插入位置: insert

a 从当前位置的后面进入插入模式,一般使用 a 较多 :append

o 光标移动到下一行开始,切换到插入模式

ctrl + [ 退出插入模式,(右手拇指加食指)

:q 退出文件(会有文件临时存储记录,忘记保存也可以)
:w + 文件名 保存文件
:wq + 空格 + 文件名 存档后离开

将 ESC 键映射为两次 j 键

inoremap jj <Esc>

# VIM 的退出

VIM 的最终操作就是 VIM 的退出,命令模式下执行以下操作就可以实现对应的功能

保存当前对文件的修改,但是不退出文件。 :w

强制保存但是不退出文件。 :w!

保存当前的文件修改到 file 文件当中。 :w file
(例如写了一个 cpp 文件,然后执行这个命令就可以将写好的内容放到另一个已经创建好的 cpp 文件,就是 windows 里面的:test.cpp 已存在,是否覆盖?)

退出文件,对文件的修改不做保存。 :q! (相当于强制退出)

退出所有的文件,对所有的文件修改都不做保存。 :qa! (quit all !)

退出文件并保存对文件的修改。 :wq (这个就是最常用的~)

退出文件并保存对文件的修改。 :x (功能等价:wq)

打开另一个文件。 :e file (edit-e)

放弃对文件的所有修改,恢复文件到上次保存的位置。 :e! (代表文件编辑失效,edit !)

另存为 file。 :saveas file (saveas 没有空格)

当打开多个文件的时候可以输入 :bn 和 :bp 进行上一个文件或者下一个文件的切换。 :bn 和 :bp

# 在 vim 中进行移动

h j k l 上下左右,熟练即可

3 + 空格 向后跳三个光标

w 跳单词
W 跳完全匹配的单词
b 往前跳
B 完全匹配往前跳
} 右边的大括号跳一个段落
{ 左边的大括号往左侧跳一个段落

G 跑到文章末尾 Graph (相比滚轮方便很多,5G 跳到文本的第五行)
gg 两个小写 g 字母跑到文章起始点
0 跑到一行的行首
$ 跑到一行的行尾

gk 进行视图层级的上下移动, (编辑器会对超过规定长度的文字进行折行)
gj

在 insert 模式下不需要移动,(虽然上下左右可以实现),
操作流程是:打字,离开,移动,插入,打字 \cdots

# 快速移动光标

几个重要的快捷键

请记住这几个快捷键 h,j,k,l 这几个按键主要是用来快速移动光标的,h 是向左移动光标,l 是向右移动光标,j 是向下移动光标,k 是向上移动光标,h , j , k ,l 在主键盘区完全可以取代键盘上的 ↑ ,↓ ,← , → 的功能(上下左右)。

# 在当前行上移动光标

0 移动到行头 //O 无中央的像素点,而 0 有中间的像素点,正常模式按 0 就可以将光标移动到选中行的行头

^ 移动到本行的第一个不是 blank 字符(TY 中间上方,小键盘 6 对应的位置)

$ 移动到行尾 (4 对应的符号)

g_ 移动到本行最后一个不是 blank 字符的位置

w 光标移动到下一个单词的开头

e 光标移动到下一个单词的结尾 (常用)

fa 移动到本行下一个为 a 的字符处,fb 移动到下一个为 b 的字符处 (find)

nfa 移动到本行光标处开始的第 n 个 字符为 a 的地方(n 是 1,2,3,4 ... 数字)

Fa 同 fa 一样,光标移动方向同 fa 相反

nFa 同 nfa 类似,光标移动方向同 nfa 相反

ta 移动光标至 a 字符的前一个字符

nta 移动到第 n 个 a 字符的前一个字符处

Ta 同 ta 移动光标方向相反

nTanta 移动光标方向相反

; 和,当使用 f, F, t ,T, 关键字指定字符跳转的时候,使用 ;可以快速跳转到下一个指定的字符,, 是跳到前一个指定的字符

# 跨行移动光标

nG 光标定位到第 n 行的行首

gg 光标定位到第一行的行首

G 光标定位到最后一行的行首

H 光标定位到当前屏幕的第一行行首

M 光标移动到当前屏幕的中间

L 光标移动到当前屏幕的尾部

zt 把当前行移动到当前屏幕的最上方,也就是第一行

zz 把当前行移动到当前屏幕的中间 (常用)

zb 把当前行移动到当前屏幕的尾部

% 匹配括号移动,包括 ( , { , [ 需要把光标先移动到括号上

* 和 # 匹配光标当前所在的单词,移动光标到下一个(或者上一个)匹配的单词( * 是下一个,# 是上一个)
8 和 3 对应的额外字符

# 在文件里面搜索文字

编辑器将不会区分大小写,如果你进行该设置之后,进行关键字查询只要是字符相同不会区分大小写都会进行匹配。

:set ic

区分大小写的查询。

:set noic

? + content 触发搜索动作

:set hlsearch 高亮

n 向上跳动搜索结果光标

N 向下跳动搜索结果光标

问号和斜线在同一个位置,使用不同的按键,n 和 N 的作用相反

如果懒得打那个单词的话,就先让光标停留在对应单词位置,使用数字 8 对应的 * 进行查询,编辑器会自动将光标对应单词进行高亮,和这个字母相反的是使用 #

:set nohlsearch

f + 任意字母,光标跳转到行中出现的第一个字母,
F + 任意字母,光标进行向前跳转,

# 替换文字

如果要将搜索的内容进行替换 :{作用范围}s/{目标}/{替换}/{替换的标志}

  • :n1,n2s/word1/word2/g: n1 n2 是数字,在第 n1 行与 n2 行之间寻找 word1 这个字符串,并将这个字符串替换为 word2
  • :1,$s/word1/word2/g 将全文的 word1 替换为 word2
  • :1,$s/word1/word2/gc 将全文的 word1 替换为 word2, 替换每一个字符串之前向用户进行询问

选定一个区域进行替换

在可视模式下选择区域后输入 : ,VIM 会自动补全为 :'<,'> ,(可是模式为鼠标可以操作的那个模式)

:'<,'>s/ugly/handsome/g

选区,在可视模式下选择区域后输入 : ,VIM 会自动补全为 :'<,'> ,(可是模式为鼠标可以操作的那个模式)

:'<,'>s/ugly/handsome/g

这个操作咋一看起来有点懵逼,这个操作是可视模式 (Visual-mode) 下选区中的替换操作(可视模式下文会谈到),可视模式下输入:会自动补全 :'<,'> 这个是可视范围下的操作范围,类似于 % 和 n1,n2,代表操作的文本范围,上面的例子就是替换掉可视区域的 ugly 为 handsome。

下面来谈谈替换的标志。
上文中命令结尾的 g 即是替换标志之一,表示全局 global 替换(即替换目标的所有出现)。 还有很多其他有用的替换标志:

空替换标志表示只替换从光标位置开始,目标的第一次出现

:s/ugly/handsome

作用于当前行,从光标处开始查找替换,仅仅替换第一次匹配 ugly 的地方为 handsome 。

:%s/ugly/handsome

替换掉文件中所有行第一次出现 ugly 的地方为 handsome 。

i 表示大小写不敏感查找,I 表示大小写敏感: :%s/ugly/handsome/i

替换掉所有行第一个出现 ugly (不区分大小写) 为 handsome :%s/ugly/handsome/gi

替换掉所有行出现 ugly (不区分大小写) 为 handsome 。

c 表示需要确认,例如全局查找 "ugly" 替换为 "handsome" 并且需要确认:(用来以防万一手抖等等等)
:%s/ugly/handsome/gc

# 使用 ab(长字符串替换)

:ab email 123@gmail.com

: 后面的 ab 是关键字,该命令执行后,然后切换到编辑模式下,输入 email 会把输入的 email 自动替换成 123@gmail.com

这个命令主要是处理频繁输入同样的长串字符串。

# 撤销操作和恢复

u 撤销刚才的操作

ctrl + r 恢复撤销操作

# 在 vim 中进行复制粘贴

v 进入 visual 模式 然后就可以使用 之前的光标移动操作进行内容选块操作

V 进入 visual line 模式,使用 hjkl 进行移动的时候按照代码块进行移动

y 复制选中的内容 yank: 猛拉

p 粘贴,粘贴的时候不用调回 insert 模式,直接在当前模式下进行粘贴即可 paste

yy 直接 yank 一整行 ,p 进行粘贴即可 yy5p 粘贴五行相同的内容

# 复制粘贴高级操作

  • y 是复制的意思,通常搭配一个字符(复制范围)实现复制的功能,常用的如下:
  • yw 复制一个单词,还有 ynw
  • yfa 复制光标到下一个 a 的字符处,还有 ynfa
  • yy 复制一行,还有 nyy
  • y$ 复制光标到本行的结尾
  • yH 复制屏幕显示的第一行文本到光标所在的行
  • yG 复制光标所在行到文本的结束

  • p ,P 是黏贴的意思,当执行完复制或者黏贴的命令以后,VIM 会把文本寄存起来。
  • p 在光标后开始复制
  • P 大写的 P 光标前开始复制

3yy 复制从光标行之后的三行内容(并不需要选中内容)

y$ 字面意思:把光标到行末的内容 copy 起来

yG 将当前光标开始直到文件末尾的内容全部复制

u 撤回上一步操作:uodo
ctrl + r 撤销撤销操作 redo

"ap 可以调用很多个不同的剪切板
"bp (相对高级的操作,可以自定义用户片段)

:set clipboard=unnamed 将电脑的剪切板和暂存器同步

vim 共有 48 个不同的暂存器,每个暂存器都有不同的效果

# 编辑文字

A 跳到行末 用 I 和 A 来替换 0i 和 $a
O 在当前行上方插入一行并进入插入模式(小写 o 在下一行开始写)

D 将光标后面的行中内容全部删除

x 删除单个字,放到暂存器中

dd 删除当前行
d12 删除当前光标之后的 12 个字符
2dd 删除两行
d + h,l 删除光标左侧的内容或者删除光标右侧的单个字
dG 删除光标之后直到文章末尾

c 删除选中内容并且把内容放到寄存器,直接进入 insert 模式,参数同 d

使用 c 的话删除之后会立即进入 insert 模式,可以少打一下键盘,不用删除文字后再使用

C 和大写 D 的作用相同 (将光标后面的行中内容全部删除,同时进入 insert 模式)

r :replace 替换单个字母,替换之后仍然处于 normal 状态

>> 或者 << 增加或者减少缩进

将所有内容选中之后,进行 = 操作,他们会自动格式化代码

  • i 是在光标所在的字符之前插入需要录入的文本。
  • I 是在光标所在行的行首插入需要录入的文本。
  • a 是在光标所在的字符之后插入需要录入的文本。
  • A 是在光标所在行的行尾插入需要录入的文本。
  • o 是光标所在行的下一行行首插入需要录入的文本。
  • O 是光标所在行的上一行行首插入需要录入的文本。
  • s 删除光标所在处的字符然后插入需要录入的文本。
  • S 删除光标所在行,在当前行的行首开始插入需要录入的文本

  • d 是删除的意思,通常搭配一个字符 (删除范围) 实现删除功能,常用的如下:
  • dw 删除一个单词
  • dnw 删除 n 个单词,
  • dfa 删除光标处到下一个 a 的字符处( fa 定位光标到 a 处 )
  • dnfa 删除光标处到第 n 个 a 的字符处
  • dd 删除一整行
  • ndd 删除光标处开始的 n 行
  • d$ 删除光标到本行的结尾
  • dH 删除屏幕显示的第一行文本到光标所在的行
  • dG 删除光标所在行到文本的结束

# 删除字符操作和替换

  • x 删除光标当前所在的字符
  • r 替换掉光标当前所在的字符
  • R 替换掉从光标开始以后的所有字符,除非 <ESC> 退出

# 大小写转换

  • ~ 将光标下的字母改变大小写
  • 3~ 将光标位置开始的 3 个字母改变其大小写
  • g~~ 改变当前行字母的大小写
  • gUU 将当前行的字母改成大写
  • guu 将当前行的字母全改成小写
  • 3gUU 将从光标开始到下面 3 行字母改成大写
  • gUw 将光标下的单词改成大写。
  • guw 将光标下的单词改成小写

# (Visual-mode)

# 可视化模式下操作文本

可视化模式下选择操作区域以后,
按下 d 会删除选择的区域,
按下 y 会复制选择的区域,按下 p 会黏贴选择的区域。

cw ,删除从光标处开始到该单词结束的所有字符,然后插入需要录入的文本(这个命令是两个字符的合体 cw )。相当于 Windows 窗口下的鼠标双击进行的单词替换

ctrl + v 进入 v-block 模式。可以实现竖着的光标选取,即 shift + alt 样式, (注意先关闭 ctrl v 的粘贴映射)

vw 选取一个单词,vwwwwww 就是按照单词进行光标区的扩充

viw 选取光标所处的单词 常用 + c 字母进行对某一个块进行修改

vaw 按照块区选择单词

vi" 选取一个字符串中的内容,哇哇哇,vscode 中选中的话就很不方便

vit 选取 tag 中的所有内容 例如 html 中的内容

vat 相比于 vit 选取之后包含两边的 tag

v+{ 选取下方文本块 (复制一段函数很方便)
v+}

diw ciw 等操作同理

# vim text object

VIM 的重复命令

. 该命令是重复上一个操作的命令
n<command> 重复某个命令 n 次,
如 10p 复制 10 次,10dd 删除十次。
名词:
w = word , s = sentence, p = paragraph t = tag;
单双引号, 双括号,小括号,中括号,大括号

动词:
y = yank , p = paste, d = delete, c = change,

范围:
i= inner a = around

例如合起来的一个操作 yiw

# 其他使用技巧

gg=G 进行文件格式化

ctrl + q 取消当前正在执行的命令

^ 6 跳到行首,(去除空格部分)更加方便的开始再次写代码 代替 0
正则表达式

ctrlf 往后面翻页
ctrlb 往前面翻页

zf 折叠代码段
zd 展开代码段

zf i p 就可以快捷的把一段文本进行折叠,而不用先选中再折叠

. 重复上一个《大动作》

J选中内容后,将多段文字的回车去除

ctrl w 删除一个 word 在 insert 模式下

ctrl u 前面的所有东西全部删除

:! + 想要执行的指令,就可以在 vim 窗口下面执行一些想要执行的指令

:r! + 指令 复制相应的内容

:h + 想要查询的内容

终端下执行:vimtutor zh 进入官方给出的 vim 教程

在正常模式下,按 @a 执行宏录制的一系列动作,将会在第二行执行插入 tab 。
@@ 是对上一次宏使用的重复操作。n@a 就会执行 n 次一系列的动作。使用宏录制可以一次执行一系列的操作,可以针对一些重复度较高的操作进行宏录制。

# vim 多文件

有 tmux 的存在, vim 的多文件以及分屏已经可以被替代

SHOWMORE

# 用 VIM 一次性打开多个文件

现在有多个文件 file1 ,file2 , ... ,filen.

现在举例打开两个文件 file1,file2

vim file1 file2

该方式打开文件,显示屏默认显示第一个文件也就是 file1,
VIM 的正常模式下按下键盘上的冒号 这时会在显示屏底部出现冒号 (进入了 VIM 的命令模式),
然后在输入 ls (ls 为调出列表命令),
屏幕上会出现打开的所有文件的序号和文件名,我们继续输入冒号 : ,然后输入 bn (这里的 n 需要做一个解释并不是键盘上的 n , 而是文件序号的代指,如 b1 代表显示屏上切换到第一个文件,b2 代表显示屏上切换到第二个文件)。

:ls

上面这个命令将会列出 VIM 打开的所有文件。

:b2

上面的这个命令将会在显示屏上显示第二个文件。

# 在显示屏上一次性显示多个文件

VIM 可以实现分屏操作,一个屏幕被多个文件给分占,有左右和上下两种分屏的方式。

左右分屏如下操作:

vim -On file1 file2 ... filen

这里的 n ( n 是要打开的具体文件的数目:1,2,3 ...)是代表有几个文件需要分屏,从左至右依次显示 n 个文件。

上下分屏如下操作:

vim -on file1 file2 ... filen

这个命令跟上一个命令不同的是其中的参数 -on( n 是要打开的具体文件的数目:1,2,3 ...) 中的 o 是小写,这样将会上下依次显示 n 个文件。

上下分屏显示文件使用小写 o 记号 + n
左右分屏显示文件使用大写 O 记号 + n

vim -O2 test01.cpp test02.cpp

# 分屏操作

SHOWMORE

:e 后面加上文件名,可以在不离开 vim 的情况下打开一个文件

:tabe 多窗口开启一个文件,后面跟文件名就打开那个对应的文件

gt 向后切换 tab 页

gT 向前切换 tab 页

:new 开启页面分割
ctrl w w 循环切换
ctrl w + j 向下切换光标

:vnew 开启右侧页面 (垂直)
ctrl w + l / h 进行切换光标位置

vim -o filename filename 同时打开文档,水平窗口
vim -O filename filename 垂直窗口

vim -p 按照不同的 tab 页打开

可以用 buffer 操作代替多窗口操作
:bp
:bn
:blast \ :bl
:bf
:b filename
:bdelete \ :bd

记住一个重要的组合键 Ctrl + w , 操作分屏离不开这个组合键 (关于窗口的操作 windows-w)

# vim 文件分屏

按住组合键 Ctrl + w ,然后在按下 s

Ctrl + w s

上面这个命令将会上下分割当前打开的文件。

按住冒号 ,紧接着输入 sp , 在键入文件名,如下:

:sp file

上面的这个命令将会上下分割当前文件和新打开的 file 。

按住组合键 Ctrl + w , 然后在按下 v

Ctrl +w v

上面的这个命令将会左右分割当前的文件

按住冒号 ,紧接着输入 vsp , 在键入文件名称,如下:

:vsp file

上面的这个命令将会左右分割当前打开的文件和新打开的文件 file 。

# 切换光标,移动分屏

  1. 切换左右分屏的光标 :

将当前光标定位到左边的屏幕 Ctrl + w h

将当前的光标定位到右边的屏幕 Ctrl + w l

(因为 vim 和 linux 中使用 hjkl 代表上下左右,所以 ctrl+w+h 代表将光标移动到左屏幕,ctrl+w+l 代表将光标移动到右边的屏幕,而不是使用 lr 代表左右,这里的键盘的地理位置和功能也对应,h 在左,l 在右)

  1. 移动左右分屏 :

将当前的分屏移动到左边 Ctrl + w H

将当前的分屏移动到右边 Ctrl + w L

与移动光标操作不同的是,需要 caps 进行锁定,大写字母为分屏的相关操作

  1. 切换上下分屏的光标 :

将当前的光标移动到下面的分屏 Ctrl + w j

将当前光标移动到上面的分屏 Ctrl + w k

  1. 移动上下分屏:

将当前的分屏移动到下面的分屏 Ctrl + w J

将当前的分屏移动到上面的分屏 Ctrl + w K

# 关闭分屏

这个命令是关闭当前的分屏
Ctrl + w c (close)

上面的这个命令也是关闭当前的分屏,如果是最后一个分屏将会退出 VI 不太行
Ctrl + w q

# 参考资料