Linux/Mac vi/vim使用教程

Linux/Mac vi/vim使用教程

vi/vim简介

vi/vim是Linux上非常常用的编辑器,很多Linux发行版都默认安装了vi(但一般不会默认安装vim),vi/vim用来编译一些配置文件非常方便,如果你愿意也可以配置成用它来写项目代码。vi是visual interface的缩写,vim是vi IMproved(增强版的vi),他们的区别是vim是基于vi的增强版,他们的命令是完全一样的(也许会有不一样,但就基本使用来说,我没有遇到过不一样的),大部分人平时使用,一般都用vim,以下表述全部用vim表示,但命令同样可以用于vi的。

安装vim

Centos/Rehat安装:

yum -y install vim

Debian/Ubuntu安装:

apt-get -y install vim

macOS安装:

brew install vim

如果你的mac没有安装brew,请先安装:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

vim的三种命令模式

1、命令模式(默认模式)

进入vim后,即为命令模式,在该模式下你无法输入文字,只能用命令操作,而且你输入的命令不会显示出来,但会有直接效果(比如dd(即连按两下d键)就是剪切当前光标所在行),在另外两种模式下,按esc键即可回到命令模式。
注意:因为命令模式是vim的默认模式,正是因为这个原因,如果想要进入另外两种模式,首先要退回到命令模式然后才能使用不同的命令进入对应的模式。

2、插入模式

在插入模式下,它就跟任何一个编辑器一样,你可以输入文字,可以用上/下/右/右键控制光标位置。进入插入模式,首先要保证当前模式为命令模式,并且保证当前输入法是英文输入法,然后可以用以下八种方式进入(无论用哪种方式进入,左下角即会显示一个状态-- INSERT --,表示当前处于插入模式):
– 1)小写a:在当前光标后面插入,a表示append,append就是在后面添加的意思,由于是在当前光标后插入,所以光标会右移一格。
– 2)大写A:在光标所在行的行尾插入,其实这个很容易理解,小a表示在当前光标后插入,那大A也是在后面插入,只不过不是当前光标后,而是当前行后面(即行尾)插入。
– 3)小写i:在当前光标前插入,i表示input(由于vim的光标是比较粗的,并且待插入的位置总是在当前光标的左侧位置,所以你按a后,光标不会动)
– 4)大写I(大写i):在光标所在行的行首插入,小i表示在当前光标前插入,大I就表示在当前行的行首插入。
– 5)小写o:在当前光标的下一行插入
– 6)大写O:在当前光标的上一行插入
比较特别的插入模式:
– 7)大写R:从当前光标处开始替换插入,即已存在的文字会被你输入的文字覆盖,直到你按esc退出该模式为止。
– 8)小写r:替换光标所在处的字母,替换后即马上自动返回命令模式
– 更特殊的插入模式:在命令模式下按cc,它会把当前行剪切到缓存区,同时进入插入模式(也就是说此时你已经可以在这一行输入文字了),但是如果你按esc退出插入模式后,按p,又可以把刚才剪切的那一行粘贴出来(粘贴命令的具体用法请往下看)

3、底行命令模式

在命令模式下,按shift+:即可进入底行命令模式(也就是说如果你不在命令模式下,是无法进入底行命令模式的,这时你要先按esc键先返回到命令模式),底行命令模式除了可以做一些命令模式的操作之后,还用于保存和退出vim。

新建/保存/打开/退出文件

新建文件

新建一个不存在的文件,有两种方式,指定文件名或不指定文件名,指定文件名:

vim 文件名

比如以下三种都可以,文件不一定要有后缀,是否要后缀要看你创建的文件是干嘛用的:

vim test.txt
vim index.php
vim testfile

不指定文件名,直接输入以下命令回车即可:

vim

如下图所示,因为没有指定文件名,所以进入后会显示vim的信息,这并不是说你创建的文件会有这些内容,它只是一个提示,只要你进入插入模式后,这些文字自动会消失:

Xnip2018-12-29_17-33-03.jpg

另外,由于未指定文件名,在保存的时候,必须指定文件名(下边保存会说到)。

保存文件

首先要说的是,保存文件必须在底行命令模式下进行,所以下边让你输入什么命令,都是指在底行模式下输入(按shfit+:即可进入底行命令模式)。
保存文件有好几种情况:
– 保存不退出:在底行命令模式下,输入w(表示write),回车即可。
– 保存退出:在底行命令模式下,输入wqx,回车即可(注意其中的wq是w和q两个命令,w表示写入(即保存),q表示退出(即quit),wq表示写入后再退出,但你也可以先输入w保存,再输入q退出,但是如果你输入了内容没有保存直接用q退出,它会提示你No write since last change (add ! to override),意思是文本有改变过,但是你没有保存,如果你不想保存,要强制退出,那么在q后面加感叹号即可,即输入q!后回车,wq和x也都可以加感叹号,一般用于没有权限写入文件时,强制退出)。
wq和x的区别:
wq保存,不管文件是否更新,都会强制更新文件的“更新时间”,即“update time”。
x保存,如果文件没有更新,那么只是退出,不会更新文件的“更新时间”。
– 另存为:不管是保存退出还是保存不退出,都可以另存为,比如w test2.txt表示把当前内容另存为到test2.txt文件,但不退出,或者wq test2.txt,表示另存为test2.txt并且退出vim,需要注意的是,x命令虽然也是保存并退出,但这里不能用x命令,也就是说x不能用于指定文件名,只是单纯的保存并退出。
– 指定文件名保存:如果你是直接输入vim然后按回车进入vim的,那么第一次保存的时候,需要指定文件名,其实就相当于重命名,只不过因为原来并没有文件名,所以说不上是重命名,但命令是一样的w xxx.txt这样就可以保存,当然你要保存退出的话也可以wq xxx.txt,但不能用x xxx.txtx命令只能用于保存并退出,不能用于指定保存文件名。

打开一个已存在文件

很简单,vim 文件名即可,比如以下三种都是打开已存在文件:

vim test.txt
vim index.php
vim testfile

退出文件

在保存文件里已经说了,退出文件需要在底行模式下输入命令来执行,这里再简单的说一次:w保存,wq或x保存并退出,q直接退出,不管是wq或者是x,都可以加感叹号表示强制退出(一般在有修改内容,但是又没有保存权限的情况下使用)

命令模式的命令

前面已经说过,命令模式,是vim的默认模式,且vim绝大部分命令都是在命令模式下执行的(所以该模式才会叫命令模式),大概有以下命令可以使用(不保证列出了所有命令,但基本上该有的都有了),需要注意的是,命令的命令都是看不见的,比如我输入dd就会删除当前行,但它不会显示出你输入了dd这个命令,这点要特别注意。

移动光标命令

移动光标,无非就是上下左右,这里有三套上下左右命令:
– 第一套:h/j/k/l:j下、k上、h左,l右,h和l分别在左右两边,很容易记住他们是左和右,所以只需要记一下j/k即可。
– 第二套:用键盘的上下左右方向键来控制光标上下左右,只是那样你的右手就要离开基准键了。
– 第三套:空格向右、退格键(mac叫delete键)向左、回车键下一行、-键上一行。

以上三套移动光标的方法,最常用第一套(因为手不用离开基准键位),第二套我是比较少用的(因为手要离开基准键位且由于我键盘是笔记本的键盘,上下键比较小,按上下不方便),而第三套是有时候用,毕竟按空格、enter以及退格键都是很容易的,因为这三个按键是非常常用的,而按-上一行,倒是没用过。

复制/粘贴/剪切

特别注意:vim的复制/粘贴/剪切跟系统剪贴板完全没关系,你不要想着用这里的命令复制了,然后用ctrl+V可以粘贴到其他地方,也不要想在其他地方ctrl+C复制了,在这里用p可以粘贴,这都是不可能的。
yy 将当前行复制到缓存区(注意这并没有复制到系统剪贴板,你是无法用ctrl+v来粘贴的,它是只是复制到vim的缓存区而已)
nyy 将当前行向下n行复制到缓冲区
yw 复制从光标开始到词尾的字符
nyw 复制从光标开始的n个单词
yG 从当前行复制到文件最后一行,通过结合gg使用,gg→yG,表示光标先定位到第一行然后复制到最后一行,其实就是复制全部
y^ 复制从光标到行首的内容
y$ 复制从光标到行尾的内容
小写p 粘贴缓存区的内容到当前光标后(如果你复制的是一行(比如用yy复制),那么用小p粘贴是粘贴到光标所在行的下一行,而不是粘贴到光标后)
大写P 粘贴缓存区的内容到当前光标前(如果你复制的是一行(比如用yy复制),那么用大P粘贴是粘贴到光标所在行的上一行,而不是粘贴到光标前)
总结:主要记住yy和小p即可,其他的慢慢记,也未必用的到。

删除及恢复字符或行

x 删除光标所在位置字符
nx 从光标位置开始向后删除n个字符(包括光标所在位置的字符共n个,n是数字,如5x表示删除5个,这5个字符是从光标位置往后数,包括光标位置字符本身共5个)
dd 删除光标所在行(其实是剪切光标所在行,因为你删除后,可以用上边说到的小p/大P来粘贴,dd与p,就相当于windows的ctrl+x / ctrl+v)
dG 从当前行删除到最后一行,如果要删除所有,则gg→dG即可(先把光标定位到第一行,然后再dG就可以从当前行(即第一行)删除到最后一行,也就是清空整个文件)。
ndd 向下删除当前行在内的n行
nd[h/l]dn[h/l] 删除光标左边(h)或右边(l)n个字符(包含光标位置字符),如5dld5l表示删除光标所在位置字符及其右侧4个字符共5个(即从光标所在位置字符开始向右数5个字符都会被删除)
nd[j/k]dn[j/k] 删除光标下边(j)或上边(k)n行(包含光标所在行),如5dkd5k表示删除光标所在行及其上面4行(即从光标所在行开始往上数共5行)
n[h/l] 很容易猜出来,这就是光标向左(h)或向右(l)移动n个字符。
n[j/k] 同理,光标向上或向下移动n行
u 撤消上一步操作(可以一直向前撤消,相当于windows的control+z,或者mac的command+z)
U 撤消当前行的所有操作(注意只是当前行)
ctrl+r 反撤消,按一下就反撤消一次(需要注意,mac也是用control+r,而不是command+r,另外,ctrl+r无法反撤消被大写U撤消的操作,只能反撤消被小写u撤消的操作)

搜索命令

这个有点不一样,搜索的字符会在底行显示(但却不是用冒号的底行命令模式,这个其实就看人为怎么分类了,我认为它还是命令模式,毕竟没有冒号)
/test 搜索当前光标及其下方的test字符串(如果开启了搜索高亮功能,那么所有匹配到的字符串都会亮,但首先选中的依然是光标下方匹配到的第一个字符串,除非光标下方没有而光标上方有,那么光标上方的才会被选中)
?test 搜索当前光标及其上方的test字符串(如果开启了搜索高亮功能,那么所有匹配到的字符串都会亮,但首先选中的依然是光标上方第一个匹配到的字符串,除非光标上方没有而光标下方有,那么光标下方的才会被选中)
n 搜索后,按一下n就会移动到下一个匹配的字符串
N 搜索后,按一下N就会移动到上一个匹配的字符串
底行命令模式:nohl 如果开启了搜索高亮功能,那么你需要用nohl去掉高亮,否则整片都是亮的,你都看不清光标在哪(搜索高亮怎样设置后面会说到)。

跳至指定行/列

^ 光标定位到光标所在行的行首
$ 光标定准到光标所在行的行尾
gg 跳转到文件第一行的行首(光标定位在第一行第一列)
G 跳转到文件最后一行的行尾(光标定位到最后一行第一列(即行首),注意不是最后一行行尾)
nG 跳转到第n行,如果n大于总行数,则跳转到最后一行(这里的G就是go的意思,与此相同的操作还有底行模式输入数字后回车,如:10回车)
n+h/j/k/lh/j/k/l代表的方向移动n次,如果是上行移动肯定是行,如果是左右移动的那就是列,比如10j那就是光标向下走10行,10l就是光标向右走10列(即10格)
n+ n是数字,表示向下跳n行(注意这个+号不能直接按,而是要按shift++号)
n- n是数字,表示向上跳n行(-号直接按即可,不用按shfit)
n| n是数字,表示跳转到第n列(光标所在位置算第一列)
另外,还有一种底行模式跳转,在底行模式下输入数字,回车,即可跳转到指定行。
总结:记住gg、G以及底行命令模式输入数字回车跳转即可,其他慢慢记,未必用的到。

显示/取消行号

set nu 显示行号
set nonu 取消显示行号(一般用于需要复制内容到另的地方,又不想带上行号时)

划选模式(可视选择)

在命令模式下,按一下v键,即进入可视选择模式,此时,你可以按前面说到的方向键(三组方向键的任意一个都可以)来上下左右选择,选中之后,有几个键可以按,按dx都是剪切,按y是复制,不管剪切还是复制,都可用粘贴命令小p或大P来粘贴。
注意可视模式下,同样可以执行n[h/j/k/l]来快速选择,如5l表示向右选择5个。
注意:退出划选模式需要连按两下esc键方可退出到命令模式(但我认为划选模式还是属于命令模式,毕竟它即不是底行模式,也不是插入模式)。

底行命令模式的命令

底行命令模式命令比较,除了前面说过的保存,退出,重命名等命令外,还有以下命令。

替换

: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(百分号表示所有行),如果这里不用g,则每行匹配到的第一个old字符串会被替换,所以要搞清楚,这个g并不是替换所有行的意思,而是替换某一行里的全部匹配到的字符串,而替换哪些行,是由s前面的设置决定的,%就表示所有行,n,m就表示n到m行,如果只是一个数字那就表示一行。
s是substitute,替代的意思,g是global,全局的意思。

例如,用#号注释10-14行(原理就是把行首替换为#号,行首可以用^号表示,熟悉正则的童鞋肯定知道,这其实就是正则匹配而已):
:10,14s/^/#
取消注释10-14行(其实就是把#号替换为空,相当于删除#号):
:10,14s/#/

修改缩进

:7> 第7行向右缩进一个tab
:0,15>> 0-15行向右缩进两个tab
:7< 第7行向左缩进一个tab(相当于shift+tab)
:0,15<< 0-15行向左缩进两个tab

底行模式执行复制删除

事实上这种方式比上面的nyy,ndd还更常用,因为不需要事先把光标定位到要删除或复制的行,而且不用按那么快,命令也清晰显示在底下
:n,md 删除第n行到第m行之间的所有行(包括n和m本身,如:1,5d就是删除第1行到第5行共5行)
:n,my 复制第n行到第m行之间的所有行(包括n和m本身,如:1,5y就是复制第1行到第5行共5行)

粘贴模式

在底行模式下,使用:set paste即可进入粘贴模式,这时再进入插入模式,从其他地方复制的代码之类的粘贴进来就不会乱了,粘贴完成后,再用:set nopaste取消粘贴模式,否则会对代码自动缩进有影响。

编辑其他文件

在不退出vim的情况下,直接编辑其他文件(但当前文件必须先保存),在这里也可以用tab补全文件名哦。

:e otherfilename

修改文件格式

将文件修改为unix格式(如win下面的文本文件在linux下会出现^M)。

:set fileformat=unix

修改vim配置

通过上面的讲解,你已经会使用vim了,那就练个手吧,用vim编译一个vim的配置文件,vim的配置文件,名称叫.vimrc,位于用户家目录(~)。
具体配置,请查看:好用的vim配置

打赏

Leave a Reply

avatar

This site uses Akismet to reduce spam. Learn how your comment data is processed.

  Subscribe  
Notify of

扫码在手机查看
iPhone请用自带相机扫
安卓用UC/QQ浏览器扫

Linux/Mac vi/vim使用教程