2021-05-27 Vim使用教程

目录

2021-05-27 Vim使用教程

Vim

最近学习所以记录下

vi/vim 的使用

基本上 vi/vim 共分为三种模式,分别是

  • 命令模式(Command mode)
  • 输入模式(Insert mode)
  • 底线命令模式(Last line mode)

这三种模式的作用分别是:


命令模式:

用户刚刚启动 vi/vim,便进入了命令模式。

此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。比如我们此时按下i,并不会输入一个字符,i被当作了一个命令。

以下是常用的几个命令:

i 切换到输入模式,以输入字符。
x 删除当前光标所在处的字符。
: 切换到底线命令模式,以在最底一行输入命令。

若想要编辑文本:启动Vim,进入了命令模式,按下i,切换到输入模式。

命令模式只有一些最基本的命令,因此仍要依靠底线命令模式输入更多命令。


输入模式

在命令模式下按下i就进入了输入模式。

在输入模式中,可以使用以下按键:

字符按键以及Shift组合,输入字符
ENTER,回车键,换行
BACK SPACE,退格键,删除光标前一个字符
DEL,删除键,删除光标后一个字符
方向键,在文本中移动光标
HOME/END,移动光标到行首/行尾
Page Up/Page Down,上/下翻页
Insert,切换光标为输入/替换模式,光标将变成竖线/下划线
ESC,退出输入模式,切换到命令模式

底线命令模式

在命令模式下按下:(英文冒号)就进入了底线命令模式。

底线命令模式可以输入单个或多个字符的命令,可用的命令非常多。

在底线命令模式中,基本的命令有(已经省略了冒号):

q 退出程序
w 保存文件

按ESC键可随时退出底线命令模式。


一、打开文件、保存、关闭文件(vi命令模式下使用)

vi filename //打开filename文件
:w //保存文件
:w vpser.net //保存至vpser.net文件
:q //退出编辑器,如果文件已修改请使用下面的命令
:q! //退出编辑器,且不保存
:wq //退出编辑器,且保存文件

二、插入文本或行(vi命令模式下使用,执行下面命令后将进入插入模式,按ESC键可退出插入模式)

i   " 在光标前进入 insert 模式
I   " 在当前行左边第一个非空字符前进入 insert 模式,类似其他编辑器的 <c-a> 快捷键
a   " 在光标后进入 insert 模式
A   " 在当前行右边第一个非空字符前进入 insert 模式,类似其他编辑器的 <c-e> 快捷键
o   " 在光标的下一行插入
O   " 在光标的上一行插入
s   " 删除当前字符,并进入 insert 模式"
S   " 删除当前行,并进入插入模式
cc  " 删除当前行,并进入插入模式
R //替换(覆盖)当前光标位置及后面的若干文本
J //合并光标所在行及下一行为一行(依然在命令模式)

三、键位操作

1)移动光标(vi命令模式下使用)

1、使用上下左右方向键

2、命令模式下:h 向左、j 向下 、k 向上、l 向右。
空格键 向右、Backspace 向左、Enter 移动到下一行首、- 移动到上一行首。

3、借助数字键可以更快的做到光标跳转,5l 表示向右移动 5 个字符,5j 表示向下移动 5 行,其他依次类推

2)翻页

<ctrl> + f 的组合键可以向下翻一页,这类的组合键以后我会用<c-f>形式表示。

<c-f>   //向下移动一页
<c-d>   //向下移动半页
<c-b>   //向上移动一页
<c-u>   //向上移动半页
3)行首行尾
0   " 快速跳到行首
$   " 快速跳到行尾
g_  " 快速跳到行尾最后一个非空字符(后面讨论它跟 $ 的区别)
跳到指定行
方法1:
输入:n,代表跳转到第n行,如:79,就跳转到第79行。
方法2:
输入nG,代表跳转到第n行,如79G,就跳转到第79行。
4)页头页尾
gg  " 快速跳到第一行
G   " 快速跳到最后一行

四、删除、恢复字符或行(vi命令模式下使用)

x //删除当前字符
nx //删除从光标开始的n个字符
dd //删除当前行
ndd //向下删除当前行在内的n行
u //撤销上一步操作
U //撤销对当前行的所有操作

五、搜索(vi命令模式下使用)

1)行内查找

在目标行内按下功能键 f,此时界面无变化,但是右下角会出现字母 f 表示等待下一步操作,然后按下 n,光标便会移动到 native 的首字母上

fx      " 从当前光标开始向右查找字符 x,x 为目标字符
nfx     " 从当前广告开始向右查找第 n 个字符 x,n 为数字
Fx      " 从当前光标开始向左查找字符 x,x 为目标字符
nfx     " 从当前广告开始向左查找第 n 个字符 x,n 为数字

同样的,在这里我建议大家开始只使用向右查找即可,这样也比较符合我们由左到右的阅读习惯,顶多每次先按一下 0 跳到行首就可以了。

2)全文查找

如果你想要把全文的 native 都找到,可以按下 / 进入 command 模式,随后输入 native 然后回车,此时光标会定位在第一个目标上,并高亮所有找到的目标单词。

此时按下 n 光标就会向下在高亮的单词上依次跳转,N 则会反方向跳转。值得注意的地方时,Native 也会被找到,说明默认情况下查找对小写是不敏感的,在以后的章节我们会来讨论怎么处理,但是它对大写是敏感的,你可以用 Native 查找试试。

最后一点,现在所有的目标区域都是高亮的,怎么取消呢?输入 :nohls 即可,为什么,我们以后再讲。

/word   " 输入 / 会进入 command 模式,再输入先要搜索的单词并回车进行搜索
?word   " / 是向光标以后搜索,? 是向前搜索
n       " 英文字母 n,根据 / 或 ? 搜索的方向定位到下一个匹配目标
N       " 与 n 相反,定位匹配目标
3)替换

替换一般都是和查找绑定在一起的操作,Vim 中提供了两种替换方式

将 4 到 10 行内的 code 替换为 name

:4,10s/code/name/g
4)全文替换
:1,$s/code/name/g

不难理解,其实全文替换你也可以理解为替换 1 行到 $ 最后一行,唯一需要注意的是,第二个数字后面要记得跟上 s

:n1,n2s/word1/word2/g   " n1, n2 表示数字,替换 n1 行到 n2 行的单词
:1,$s/word1/word2/g     " 全文替换,也可以写成 :%s/word1/word2/g
:1,$s/word1/word2/gc    " 全文替换,并出现确认提示

替换光标所在的行

:s/word1/word2/g        " 替换光标当前所在行的内容,不需要输入行号
/vpser //向光标下搜索vpser字符串
?vpser //向光标上搜索vpser字符串
n //向下搜索前一个搜素动作
N //向上搜索前一个搜索动作

六、跳至指定行(vi命令模式下使用)

n+ //向下跳n行
n- //向上跳n行
nG //跳到行号为n的行
G //跳至文件的底部

七、设置行号(vi命令模式下使用)

:set nu //显示行号
:set nonu //取消显示行号

八、复制、粘贴(vi命令模式下使用)

yy //将当前行复制到缓存区,也可以用 "ayy 复制,"a 为缓冲区,a也可以替换为a到z的任意字母,可以完成多个复制任务。
nyy //将当前行向下n行复制到缓冲区,也可以用 "anyy 复制,"a 为缓冲区,a也可以替换为a到z的任意字母,可以完成多个复制任务。
yw //复制从光标开始到词尾的字符。
nyw //复制从光标开始的n个单词。
y^ //复制从光标到行首的内容。 VPS侦探
y$ //复制从光标到行尾的内容。
p //粘贴剪切板里的内容在光标后,如果使用了前面的自定义缓冲区,建议使用"ap 进行粘贴。
P //粘贴剪切板里的内容在光标前,如果使用了前面的自定义缓冲区,建议使用"aP 进行粘贴。
dd          " 删除当前行
ndd         " 向下删除 n 行
d1G / dgg   " 删除第一行到当前行的数据
dG          " 删除当前行到最后一行的数据
d$          " 删除当前字符到行尾
d0          " 从行首删除到当前字符
yy          " 复制当前行
nyy         " 从当前行开始复制 n 行
y1G / ygg   " 从第一行复制到当前行
yG          " 从当前行复制到最后一行
y0          " 从行首复制到当前字符
y$          " 从当前字符复制到行尾
p, P        " 黏贴,p 黏贴到光标下一行,P 黏贴到光标上一行

九、替换(vi命令模式下使用)

:s/old/new //用new替换行中首次出现的old
:s/old/new/g //用new替换行中所有的old
:n,m s/old/new/g //用new替换从n到m行里所有的old
:%s/old/new/g //用new替换当前文件里所有的old

十、编辑其他文件

:e otherfilename //编辑文件名为otherfilename的文件。

十一、修改文件格式

:set fileformat=unix //将文件修改为unix格式,如win下面的文本文件在linux下会出现^M。

十二、Vim 键位整理

1)写入、保存、退出
:q[uit]                 " 退出
:q!                     " 强制退出
:w[rite]                " 保存
:w!                     " 强制保存,能不能保存成功取决于用户对文件的权限
:w ! sudo tee %         " 如果没有权限保存,试试这个命令
ZZ                      " 两个大写的 Z,没有修改直接退出,有修改保存后退出

:w newfilename          " 另存为新文件
:1, 10 w newfilename    " 将 1 到 10 行的内容另存为新文件
:1, 10 w >> filename    " 将 1 到 10 行的内容另存为新文件
:r filename             " 将目标文件的内容追加到当前光标下一行
:3 r filename           " 将目标文件的内容追加到第 3 行一下

:! ls                   " 暂时离开 Vim 查看当前目录的文件,回车后返回 Vim
2)光标移动
h           " 方向键 ←
j           " 方向键 ↓
k           " 方向键 ↑
l           " 方向键 →

0           " 移动到行首
$           " 移动到行尾的回车符
g_          " 移动到行尾最后一个非空字符
gg          " 移动到第一行
G           " 移动到最后一行"

w           " 移动到下一个单词开头
e           " 移动到单词的结尾
b           " 移动到单词的开头

" 不常用
nh          " 向左移动 n 格,n 为数字
nl          " 向右移动 n 格
nj          " 向下移动 n 行
nk          " 向上移动 n 行
n<space>    " 向右移动 n 格,同 nl

H            " 移动到当前屏幕第一行的第一个字符
M            " 移动到当前屏幕中间行的第一个字符
L            " 移动到当前屏幕最后一行的第一个字符
+            " 移动到非空白字符的下一行
-            " 移动到非空白字符的上一行

:n<cr>      " 跳转到第 n 行
3)翻页
<c-f>   " 向下移动一页
<c-d>   " 向下移动半页
<c-b>   " 向上移动一页
<c-u>   " 向上移动半页
4)查找与替换
/word   " 从光标位置向下搜索 word 单词
?word   " 从光标位置向上搜索 word 单词
n       " 英文字母 n,根据 / 或 ? 搜索的方向定位到下一个匹配目标
N       " 与 n 相反,定位匹配目标

:n1,n2s/word1/word2/g   " n1, n2 表示数字,替换 n1 行到 n2 行的单词
:1,$s/word1/word2/g     " 全文替换,也可以写成 :%s/word1/word2/g
:1,$s/word1/word2/gc    " 全文替换,并出现确认提示
5)复制、粘贴、删除
x           " 向后删除一个字符
nx          " 向后删除 n 个字符
X           " 向前删除一个字符
nX          " 向前删除 n 个字符

dd          " 删除当前行
ndd         " 向下删除 n 行
d1G / dgg   " 删除第一行到当前行的数据
dG          " 删除当前行到最后一行的数据
d$          " 删除当前字符到行尾
D           " 删除当前字符到行尾
d0          " 从行首删除到当前字符

yy          " 复制当前行
Y           " 复制当前行
nyy         " 从当前行开始复制 n 行
y1G / ygg   " 从第一行复制到当前行
yG          " 从当前行复制到最后一行
y0          " 从行首复制到当前字符
y$          " 从当前字符复制到行尾

p, P        " 黏贴,p 黏贴到光标下一行,P 黏贴到光标上一行
yyp         " 复制并粘贴
ddp         " 删除并粘贴,相当于下移当前行


"+y         " 复制本文到系统剪切板
"+p         " 粘贴系统剪切板到 Vim(不会影响文本格式)
6)插入
i   " 在光标前进入 insert 模式
I   " 在当前行左边第一个非空字符前进入 insert 模式,类似其他编辑器的 <c-a> 快捷键
a   " 在光标后进入 insert 模式
A   " 在当前行右边第一个非空字符前进入 insert 模式,类似其他编辑器的 <c-e> 快捷键
o   " 在光标的下一行插入
O   " 在光标的上一行插入
s   " 删除当前字符,并进入 insert 模式
S   " 删除当前行,并进入插入模式

vc  " 删除当前字符,并进入 insert 模式
cc  " 删除当前行,并进入插入模式
c0  " 删除光标位置到行首,并进入 insert 模式
cg_ " 删除光标位置到行尾最后一个非空字符,并进入 insert 模式
ce  " 删除光标位置到单词末尾,并进入 insert 模式
cw  " 删除光标位置到单词末尾,并进入 insert 模式
ciw " 删除当前单词,并进入 insert 模式
cip " 删除整个段落,并进入 insert 模式
ci( " 删除当前括号内的内容,并进入 insert 模式 适用于 ([{<'` 等所有成对的标签
7)撤销重做
u       " 撤销
<c-r>   " 重做
.       " 重复完成操作
8)替换
r   " 替换单个字符,自动返回 normal 模式
R   " 连续替换多个字符,手动 <esc> 返回 normal 模式
9)大小写
~       " 当前字符大小写反转
g~~     " 正行字符大小写反转
vu      " 当前字符小写
vU      " 当前字符大写
vU      " 当前字符大写
viwu    " 当前字符小写
viwU    " 当前字符大写
ggguG   " 文本所有字符小写
gggUG   " 文本所有字符大写

:%s/\<./\u&/g       " 将所有单词首字母大写(需要使用 :nohls 去掉高亮)
:%s/\<./\l&/g       " 将所有单词首字母小写
:%s/.*/\u&          " 将每行第一个字母大写
:%s/.*/\l&          " 将每行第一个字母小写
10)多窗口操作
:sp filename        " 上下分割窗口
:vs[p] filename     " 左右分割窗口

<c-w>h[j[k[l]]]     " 根据方向键移动光标到该方向的窗口上

<c-w>[N]>           " N 位数字,可选,增加当前窗口 N 列宽"
<c-w>[N]<           " N 位数字,可选,减少当前窗口 N 列宽"
<c-w>[N]+           " N 位数字,可选,增加当前窗口 N 行高"
<c-w>[N]-           " N 位数字,可选,减少当前窗口 N 行高"
<c-w>=              " 将所有窗口设置等宽高

<c-w>[N]n           " N 位数字,可选,打开一个新窗口 N 行高,默认为整个窗口的一半"
<c-w>[N]s           " N 位数字,可选,将当前窗口垂直分割为上下两个窗口展示"
                    " 新窗口可以为 N 行高,默认为整个窗口的一半"
                    " 类似于 :sp current_file"
<c-w>[N]v           " N 位数字,可选,将当前窗口水平分割为左右两个窗口展示"
                    " 新窗口可以为 N 列宽,默认为整个窗口的一半"
                    " 类似于 :vs current_file"


<c-w>o              " 关闭除当前窗口外的所有窗口

<c-w>r              " 顺时针转动窗口
<c-w>R              " 逆时针转动窗口
<c-w>x              " 对调左右或上下两个对应的窗口

<c-w>q              " 退出窗口
:q                  " 退出窗口
11)多文件编辑
vim file1 file2     " 同时打开两个文件

:files              " 查看现在编辑的文件列表,%a 代表正在操作哪个文件
  1 %a   "file1"                        line 1
  2      "file2"                        line 0

:n                  " 跳到下一个文件,这里的 n 就是字母
:N                  " 跳到上一个文件

参考Vim 练级手册learn-vim

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦