vi/vim基础使用教程

vi/vim基础使用教程

vi/vim简介

vi/vim是Linux上非常常用的文本编辑器,Linux发行版默认都安装了vi(但一般不会默认安装vim,也有的会安装),vi/vim用来编辑一些配置文件非常方便,如果你愿意也可以配置成用它来写项目代码(通过一定的配置可媲美IDE)。

vi是“visual interface”的缩写,vim是“Vi IMproved”的缩写(取vi中的首字母“v”和“improved”的前两个字母“im”组成“vim”),“improved”这个单词的意思是“改良的;改进过的”,所以“vim”其实就是“改良版vi”,不过我一般称它为“增强版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或者你不知道什么是brew,请先安装:Mac安装Homebrew并更换国内镜像源

vim的三种命令模式

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

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

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:替换光标所在处的字母,替换后即马上自动返回命令模式,也就是说,它跟大写R的区别就在于它只会替换光标所在处一个字符,而大写R则会一直替换。
– 更特殊的插入模式:在命令模式下按cc,它会删除当前行并进入插入模式(也就是说此时你已经可以在这一行输入文字了)。当然它的本质是把当前行剪切到缓存区(而不是简单的删除),所以如果你按esc退出插入模式后,再按p,是可以把刚才剪切的那一行粘贴出来的(粘贴命令的具体用法请往下看)。

3、底行命令模式

在命令模式下,shift+:(其实就是输入冒号,注意当前输入法要在英文状态)即可进入底行命令模式(也就是说如果你不在命令模式下,是无法进入底行命令模式的,这时你要先按esc键先返回到命令模式再来进入),底行命令模式除了可以做一些命令模式的操作之外,还用于保存和退出vim。

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

新建文件

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

vim 文件名

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

vim test.txt
vim /www/test.txt
vim index.php
vim /data/www/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

文件路径: 文件路径有“绝对路径”和“相对路径”。绝对路径 就是从根目录/开始直接文件名结束的整个路径,比如nginx.conf文件的绝对路径:

/usr/local/etc/nginx/nginx.conf

使用vim /usr/local/etc/nginx/nginx.conf即可打开“nginx.conf”文件(使用绝对路径时,与你当前在哪个目录中无关。)

相对路径 就是相对当前目录的路径,既然是相对当前目录,那就要先知道当前目录,linux/mac使用pwd命令获取当前目录,使用.表示当前目录(当然很多时候不用.,而是直接输入文件名),使用..表示上级目录。
比如:vim ./test.php表示打开当前目录下的test.php文件,但我们习惯上不会写./,即直接写vim test.php即可,而vim ../test.php就表示打开上级目录中的test.php文件了。

退出文件

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

另外,用快捷键ctrl+z也可强制退出(要在命令模式下按该快捷键),注意macOS也一样用ctrl+z

命令模式的命令

前面已经说过,命令模式,是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行复制到缓冲区(注意n是一个数字,不要傻傻的直接输入字母n)
yw 复制从光标开始到词尾的字符
nyw 复制从光标开始的n个单词
yG 从当前行复制到文件最后一行,通过结合gg使用,gg→yG,表示光标先定位到第一行然后复制到最后一行,其实就是复制全部
y^ 复制从光标到行首的内容(不包含光标所在字符,实际按的时候,先按y,再按shift+6)
y$ 复制从光标到行尾的内容(包含光标所在字符实际按的时候,先按y,再按shift+4)
小写p 粘贴缓存区的内容到当前光标后(如果你复制的是一行(比如用yy复制),那么用小p粘贴是粘贴到光标所在行的下一行,而不是粘贴到光标后)
大写P 粘贴缓存区的内容到当前光标前(如果你复制的是一行(比如用yy复制),那么用大P粘贴是粘贴到光标所在行的上一行,而不是粘贴到光标前)
总结:主要记住yy和小p即可,其他的慢慢记,也未必用的到。

由以上命令可摸出规律:^表示行首,$表示行尾,学过正则的童鞋对这个应该很熟悉。

删除及恢复字符或行

x 删除光标所在位置字符
nx 从光标位置开始向后删除n个字符(包括光标所在位置的字符共n个,n是数字,如5x表示删除5个,这5个字符是从光标位置往后数,包括光标位置字符本身共5个)
d^删除光标所在位置到行首的所有字符(不包含光标所在位置的字符)
d$删除光标所在位置到行尾的所有字符(包含光标所在位置的字符)
dd 删除光标所在行(其实本质是剪切光标所在行,因为你删除后,可以用上边说到的小p/大P来粘贴,dd与p,就相当于windows的ctrl+x / ctrl+v,注意,这个剪切是vim的剪贴板,跟系统剪贴板不互通)
dG 从当前行删除到最后一行,如果要删除所有,则gg→dG即可(先把光标定位到第一行gg,然后再用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撤消的操作)

删除单词:
dw (delete word)删除到下一个单词开头
de (delete end) 删除到本单词末尾
dE (delete end)删除到本单词末尾包括标点在内
db (delete back)删除到前一个单词
dB (delete back)删除到前一个单词包括标点在内
dt (delete till)删除到下一个逗号(不包括逗号)
df (delete of)删除到下一个逗号(包括逗号)

搜索命令

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

跳至指定行/列

w移动到下一个单词(w是word的首字母)
b移动到上一个单词(b是backward的首字母,是w的反向操作)
e移动到下一个单词的结尾(e是end的首字母)
ge移动到上一个单词的结尾
w大写W,与小写w类似,不过它是按空格移动,所以跳的更远
B大写B,与小写b类似,不过它是按空格移动,所以跳的更远
E大写E,与小写e类似,不过它是按空格移动,所以跳的更远
^ 光标定位到光标所在行的行首
$ 光标定准到光标所在行的行尾
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
关于一个tab是几个空格,请查看:好用的vim配置中的“关于tabstop和softtabstop”。

底行模式执行复制删除

事实上这种方式比上面的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配置

vim替代工具nano

nano也是大部分Linux自带的编辑工具,它比vim的操作简单,更像普通的编辑器,如果没有自带,那可以自己安装:

yum -y install nano
打赏

订阅评论
提醒
guest

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x

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

vi/vim基础使用教程