VI/VIM的基础教程和常用命令超细致详解(自己整理的,不算全但很实用)

换了工作环境,没有了台式机,也买了新的便携超薄本作为主要的工作电脑,开始逐渐尝试不用鼠标,尝试习惯用非全尺寸键盘,最重要的,开始尝试入坑VIM。
提醒:文章篇幅可能较长,如果是急需查找某具体命令或使用方法的,直接通过目录链接或者ctrl+f搜索页面内关键字查找,不耽误网友时间,如果有闲情逸致学习参考,深感荣幸。

本文的主要内容来自于自己通过菜鸟教程Linux vi/vim学习并且实践心得整理而来,既给自己当做笔记,也给网友们一些参考。

基础命令——(适合临时用户)

vim编辑器有三种模式,普通模式(简单命令模式)、输入模式、命令模式(底行命令输入模式)
基础篇里将只就最简单的文档编辑和操作做一些介绍,供偶尔或者迫不得已临时使用vim的用户体验(例如新装的系统,gedit不能用,临时需要用系统自带的vi或者vim来查看或修改文档内容如配置文件等)

普通模式
vim进入时的默认模式,这个模式下,键盘的按键都是简单的命令,类似快捷键,最基础的光标移动命令:h, j, k, l分别是将光标进行前、下、上、后移动。(高一点版本的vim好像可以用上下左右的按键来移动了,但是有些vi或者低版本的vim是不行的,这个具体没有研究)

输入模式
在普通模式下按i进入输入模式,就可以在光标所在前一格开始进行字符输入了,这个时候就跟一般的编辑器如记事本一样,输入、退格、回车都是OK的,也可以用上下左右移动光标(貌似有的低版本上下左右键不能用的话,回到普通模式用h,j,k,l也行)

除了按键i以外,普通模式进入输入模式的命令还有几个常用的:
i:进入输入模式并在当前光标所在前一格开始输入
a:进入输入模式并在当前光标所在后一格开始输入
o:进入输入模式并在当前光标所在行的下一行新建一行开始输入

在输入模式中,按下ESC按键即可退出输入模式,进入普通模式

注意:以上(包括本文后面)关于字母按键都是区分大小写的,小写状态和大写状态下同一个按键可能功能是不一样的。另外,普通模式下输入命令是看不到自己所输入的命令的(即使是后面可能说到的组合命令。

命令模式(底行命令)
在普通模式下,按下:按键(冒号),即可进入命令模式,这个时候,在屏幕的最下面(类似状态栏的地方)会显示一个冒号,然后==输入的内容会显示在冒号后面,输入回车以后执行命令==。

命令模式下常用的基础命令有:
:q——退出程序,这时候,如果文档有改动,是会提示错误的
:wq——保存当前文档所做的修改并退出
:w——保存当前文档,但不退出(如果文档不存在或者需要另存为新的文档,需要在命令后面加上文件名,如:w aFile,以创建新的文件)
:q!——退出程序但不保存修改

*如果只是比较粗浅的或者临时使用一下vi/vim,那么到这里,基础篇的内容已经足够使用了,查看、编辑一个简单的文档是没什么问题了,写代码也可以,但是显然离高效还差很远。

进阶篇常用操作

首先说明一下,要想高效使用vim或者说通过vim来提高自己编码或者文档编写的效率,跟熟悉一门新的编程语言类似,是需要一定程度的坚持训练的,不是学习和记忆一些指令或者快捷键就可以的,而且众所周知,vi/vim的学习曲线是比较陡峭的。写这篇文章的主要目的,第一是通过写文章来加深自己对vim命令和一些使用方法的记忆,第二是方便自己使用过程中查找一些常见用法(至少我觉得当我需要的时候,通过自己的博客文章来找,比我上度娘和谷歌搜索要高效),第三才是提供各位网友参考(毕竟网上详细教程一大把,而资深级大佬程序员也不需要看我这个)

个人觉得这个挺重要,因为很多命令都需要用到行号,总不能去数吧。
:set nu:显示行号(注意前面输入冒号进入底行命令模式)
:set nonu:不显示行号

快速定位光标

除了h,j,k,l四个基础的命令以外,还有很多可以快速定位光标位置的方法:

数字控制移动多次光标(光标移动多行、多字符)
通过[数字]+[移动光标命令]的方式进行移动,例子如下:

5j #向下移动5行
10h #向左移动10个字符,到行首会停止
7k #向上移动7行
6l #向右移动6个字符,到行末会停止不会换行

ps:注意在普通模式下,输入的命令并不会显示,所以如果使用组合按键的中途如果中断了又不记得了,最好是按esc按键重置一下,再重新操作,避免误操作执行了别的命令

大范围移动光标
快捷键Ctrl f 『向下』移动一页,相当于 [Page Down]按键 (常用)
快捷键Ctrl b 『向上』移动一页,相当于 [Page Up] 按键 (常用)
快捷键Ctrl d 『向下』移动半页
快捷键Ctrl u 『向上』移动半页

特殊位置快速定位光标
+键:光标移动到下一行首个非空格字符处(个人觉得这个描述比菜鸟教程以及官网的描述更好懂一点,这个在编程修改代码下一行有缩进的时候很实用)
==(注意+=是一个键,这里说+键是指住shift同时按+/=键,即和输入+一样,后面的说明中同理,大小写和符号所对应的命令都是该按shift就要按shift)==
-键:对应+键,光标移动到上一行首个非空格字符处(注意,减号是不需要按shift的,按住啊shift是破折号)
0键(数字零):光标移动到当前行首个字符(包含空格,即如果前面有很多空格,会移动到第一个空格),注意,vim里缩进符号(即输入的时候键入tab进行缩进)与空格是不同的,这个命令不包括缩进符号,举个例子,有一行开始是一个缩进符然后接着三个空格,再后面才是字母或者数字,那么当光标在这一行的时候,按0键,光标会移动到缩进符的后面第一个空格处。
^:光标移动到当前行的软行首(即首个非空格字符处)
$键(即shift+4,后面就不这样说明了,大家应该都明白了):移动光标到当前行的最后一个字符处,与0对应。
H:光标移动到当前屏幕(注意不是当前文档,只是一个屏幕的范围)的第一行第一个字符处。
M:光标移动到当前屏幕中间那一行的第一个非空格字符处。
L:光标移动到当前屏幕最下面一行的第一个非空格字符处。
G:光标移动到整个文档的最后一行第一个非空格字符处。
数字G:移动到文档中对应数字行数的第一个非空格字符处。注意这里的G仍然是大写。
gg:光标移动到文档的第一行第一个非空格字符处,相当于1G
数字回车:光标移动到当前位置向下n(所输入的数字)行的第一个非空格字符,注意这个指令和上面提到的数字控制光标移动方法中的数字j的区别,数字j只是将光标下移,相当于多次按j,而数字回车是向下移动若干行并移动到那一行第一个非空格字符。

根据语义语法来移动定位光标
在vi/vim中,编辑器是知道一些简单语义概念的,如==单词==(字符串前后都有空格),==句子==(句号、感叹号、问号这样一些表示完整一句话结束的,或者是一行空行,都会被视作句子之间的分隔符)。知道了这个概念,就可以用下面的一些命令来控制光标位置了。
w:光标移到下一个单词的首字符。
b:光标移动到上一个单词的首字符。
e:光标移动到单词的词尾,如果已经在单词的词尾,则移动到下一个单词的词尾。
(:光标移动到当前句的句首,如果已经在句首,就移动到上一句的句首。
):光标移动到下一句的句尾。
%:括号匹配,如果当前光标在括号处,按下%键则光标会移动到与之配对的另一个括号处,如果当前光标不在括号处,则不生效。

进入输入模式

前面基础篇说的iao是最基本的和最常用的三种,这里列举出所有会进入输入模式的指令。
说明:输入模式有插入模式和替换模式两种,在这两种模式下,VIM屏幕的左下方(即状态栏)会分别显示【INSERT】和【REPLACE】字样,此时,键盘按键会在文档中输入字符,按esc键则退出输入模式回到普通模式。

i:从光标所在字符前开始进入插入模式
I:从光标所在行的第一个非空格字符之前开始进入插入模式
a:从当前光标所在字符的后面开始进入插入模式(终端中普通模式和输入模式的光标样式是一样的,所以执行a以后会看到光标后移一个字符的现象)
A:从光标所在行的最后一个字符之后开始进入插入模式
o(小写字母):在光标所在行下插入一行,并从新插入行的行首开始进入插入模式
O(大写字母):在光标所在行之上插入新行,并从新插入行的行首开始进入插入模式
s(小写字母):删除当前光标位置的字符,并在当前位置开始进入插入模式
S(大写字母):删除光标所在当前行所有字符,并在该行行首开始进入插入模式
R:从光标所在位置字符开始进入==替换模式==
c(小写字母):删除字符并进入插入模式,这个命令需要光标移动指令一起使用,例如:

cj #删除光标当前行和下一行(删掉两行)并在当前位置建立新行,从行首开始进入插入模式
ch #删除光标当前位置前一个字符并从被删位置开始进入插入模式
cl #删除光标当前位置所在字符并从被删位置开始进入插入模式
cG #删除光标从当前行(整行)到文档末尾所有行的字符并进入插入模式
c3j #删除光标所在行以及向下3行的所有内容,并进入插入模式
3cj #同c3j,但不建议这样用
c28G #删除光标当前行到文档第28行(包含当前行和第28行)的所有内容,并进入插入模式

C(大写字母):删除光标当前所在位置字符到行末的所有字符并在当前位置进入插入模式(注意,光标所在位置字符也会被删除),相当于用上述小写c的指令和$的组合c$的效果。

搜索

/:向光标之后搜索一个字符串,输入/之后,VIM的左下方(即状态栏会有显示,显示"/“字符,之后可以在后面输入想搜索的字符串,然后回车执行搜索命令。
?:向光标之前搜索一个字符串,与上述/对应,用法一样。
注:搜索到字符串后光标会定位到根据搜索方向搜索到的第一个字符串的首个字符
n:根据此命令之前执行过的搜索指令/?,重复前一个搜索动作(搜索方向相同,搜索内容相同),例如之前执行了/abc进行向后搜索字符串"abc"后,再按n,就相当于再执行一遍/abc,注意,这里即使搜索后执行i之类的插入命令进行编辑操作之后再返回普通模式,按n仍然可以有效继续重复之前/abc的指令,除非又进行了别的搜索指令。
N:反方向重复前一个搜索动作,与n对应的,也是根据在这个命令之前执行的搜索指令来确定搜索方向和搜索内容(搜索方向相反,搜索内容相同)。

搜索与替换

r:替换光标当前位置所处的字符,例如ra即将光标当前位置的字符替换为字符”a“。这个命令也可以和数字组合,例如3rc是将当前位置向后3个字符(包括当前位置字符)替换为字符“c”。

搜索并将搜索内容替换
这个恐怕是最常用的命令之一了,需要输入:(冒号)进入底行命令模式完成。语法如下:
:n1,n2s/word1/word2n1n2是数值,表示从n1行到n2行,s是替换命令,word1表示查找的内容,word2表示准备替换word1的内容,该命令执行结果是将n1行到n2行(包含n1,n2行)所有行中每一行的第一次出现的word1替换为word2,==注意每一行只替换一个,有多个word1出现的时候只替换第一个,如果该行没有,则该行不执行==。
:n1,n2s/word1/word2/g:与上述命令的差异是后面多了一个/g,意思是全局执行,结果是将n1行到n2行所有的word1替换为word2。

特别的,经常需要在整个文档中查找并替换,用上面的行号未免有些麻烦,可以用下列命令执行在整个文档中执行搜索和替换:
:1,$s/word1/word2/g
或者
:%s/word1/word2/g
当然,还可以在以上命令的最后加上c(即confirm),使vim在执行替换操作前提示用户确认,如:
:%s/word1/word2/gc

删除

机械的删除当然可以通过上面进入输入模式(或称编辑模式)来进行删除,但是由于鼠标的弃用以及vim中没有选中操作,在编辑模式中要进行大范围删除和修改是十分繁琐的,也“显得不高级“。
以下介绍的删除方式是在普通模式下进行,操作后并不会进入输入模式。
x(小写):删除光标所在位置处的字符,光标位置不动,类似写字板里用del
X(大写):删除光标所在位置处前一个字符,光标前移,类似写字板中用退格键
注:上面这两个命令也可以和数值组合使用,即在命令之前先输入数字,与上面有些命令类似,可以删除光标前或者后若干个字符。
dd:删除光标所在行,这个命令之前也可以加数值,删除光标所在向下若干行(包含当前所在行)
d1G:删除光标所在行到文档第一行的所有内容(包括当前行)
dG:删除光标所在行到文档最后一行的所有内容(包括当前行)
d$:删除光标所在处到行末的所有字符(包括当前处)
d0:删除光标所在处到行首的所有字符(不包括光标当前字符)

复制与粘贴

复制与粘贴也是一个需要常用的功能。
Y或者yy:复制光标所在当前行整行内容
[n]yy[n]表示数值,表示复制光标当前行向下n行的内容(包括当前行)
y1G:复制光标所在行到文档第一行的内容(包括当前行)
yG:复制光标所在行到文档最后一行的所有内容(包括当前行)
y0:复制光标所在处字符到行首的所有字符(包括前面的空格,不包括光标当前所在处字符)
y$:复制光标所在处字符到行末的所有字符(包括光标当前处所在字符)
ps:可以看到上面几个命令对光标控制与前一节删除命令用法一致

p(小写):在光标所在处字符之后粘贴插入复制的内容,如果复制的时候是复制一整行或者多行数据,则是在光标所在行的下一行粘贴。粘贴完成后光标移动到原位置下一行的行首,也就是粘贴内容的首行行首。
P(大写):在黄标所在处字符之前粘贴插入复制的内容,如果复制的时候是复制一整行或者多行数据,则是在光标所在行的上一行粘贴插入,完成后光标移动到粘贴内容的首行行首。

其他常用操作

J(大写):将光标所在行下一行合并到该行,中间有空格间隔,光标移动到该空格处,要想达到在写字板中”[end]+[del]“的效果(即光标移动到行末,然后del使下一行提到该行),可以用Jx组合命令。
u(小写):撤销上一次所做的操作。多次使用 u 命令会一步一步依次撤销之前做过的操作(在一次切换到文本输入模式中输入的所有文本算一次操作)。
U(大写):一次性撤销自上次移动到当前行以来做过的所有操作,再使用一次 U 命令则撤销之前的 U 命令所做的操作,恢复被撤销的内容。所以U命令是不能一直撤销的,相当于只能撤销一步,再使用就是恢复了。
[ctrl]r:按住ctrl键和r,类似快捷键的用法,是恢复操作,与命令u(小写)对应,可以在多次使用u命令撤销多步后,用该命令多次恢复至最新。
.(小数点):重复执行上一次的命令,注意和恢复不一样。例如重复粘贴,重复删除。

文档读写

文档的操作都是在底行命令模式中进行的,主要会用到的命令如下:
:q:退出vim,如果有修改为存储,会报错
:q!:强制退出,不保存修改
:wq:保存文档并退出
:w [filename]:将当前文档另存为文件filename,并不会退出vim
:e [filename]:在vim中打开filename文件。
:e!:放弃本次的所有修改,从上次保存该文件开始重新编辑。

深入原理

以上的常用命令和操作都是基于vim的基本原理形成的,vim的命令很强大,尤其底行命令模式甚至可以类似于一个小型的脚本语言。
vim官网有一个经典的全键位图,如下


在这里插入图片描述

如果英文不好,可以看下面这个翻译过的中文版


在这里插入图片描述
如果觉得这个图太复杂,可以看下面一些分解版的(只有英文的了)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

还有一些网友整理的一些其他便捷教程卡片
入门版:


在这里插入图片描述
进阶版
在这里插入图片描述
增强版
在这里插入图片描述
纯文字版
在这里插入图片描述

欢迎访问博主的个人主页——静叶思的随笔

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容

  • 自我总结篇: 对文件的操作技巧: vim文件一个有三种状态:命令(浏览/输入命令转变末行模式),文本(添加/编辑/...
    小知大知阅读 796评论 0 0
  • 在命令状态下对当前行用== (连按=两次), 或对多行用n==(n是自然数)表示自动缩进从当前行起的下面n行。你可...
    三十儿阅读 419评论 0 1
  • 曾经使用了几年多的Vim,手册也翻过一遍。虽然现在不怎么用vim了,曾经的笔记还是贴出来,与喜欢vim的朋友分享。...
    Sylar丶阅读 885评论 0 0
  • vim 选择文本,删除,复制,粘贴 文本的选择,对于编辑器来说,是很基本的东西,也经常被用到,总结如下: v 从光...
    MiracleJQ阅读 664评论 0 0
  • vi(vim)可以说是linux中用得最多的工具了,不管你配置服务也好,写脚本也好,总会用到它。但是,vim作为一...
    梁世勇阅读 1,573评论 2 12