VIM使用教程

最近刚好在搞一些服务器相关的东西,为此需要在linux下做些编辑操作,刚好去学了下vim,顺手记录下来,以防之后一阶段没用的时候又忘掉!

看到vim一大堆的操作命令,刚开始我也吓一跳,不过,还是要硬着头皮上,使用了几次之后发现,其实也就是一个编辑器而已,再多的命令,用多了自然就熟悉了,完全不需要再去记忆,需要用什么指令,手指自然的就能够反应过来了!,所以,学东西最快,最好的方式就是直接去用,管它难不难,用多了,也就不难了!废话不说了,开工!

1、为什么学VIM?

VIM可以看做是VI的进阶版本,而在所有的类Unix系统中,都会內建VI编辑器,并且在类Unix系统中的个别程序软件的编辑接口都会呼叫VI,不学会使用VI很多的指令都没办法使用,VIM可以使用VI的几乎所有指令,并且做了增强,比如当编辑一个程序文件时,可以自动呼叫改程序的语法判断式,对程序代码进行着色!此外,VIM增加很多额外的功能:多档案编辑、区块复制啥的!

2、VI/VIM的使用

PS:以下介绍所有操作都可以在VI和VIM上使用

2.1、模式

VIM共分有三种模式:一般模式、命令模式、编辑模式,三种模式作用分别是:

  • 一般模式
    直接在命令行输入vi/vim,或者使用vi/vim即进入一般模式(默认模式),在这个模式可以使用【上、下、左、右】【H、J、K、L】进行移动,也可以复制,粘贴,删除
  • 命令模式
    在一般模式下输入[:/?]中的任何一个就会把光标移动到最底下一行,此模式提供【资料搜寻】【读取】【存盘】【大量取代字符】【离开vi/vim】【设置行号】等等
  • 编辑模式
    在一般模式下输入【i、I、o、O、a、A、r、R】任何一个字母时则进入了编辑模式,当按下这些按键时在画面左下角会出现【INSERT/REPLACE】字样

2.2、使用vi/vim

  1. 进入vi/vim一般模式
    直接在命令行输入vi/vim或者输入vi filename/vim filename来进入vi/vim的一般模式
    直接输入vim:


    结果:
    VIM使用教程_第1张图片
    输入vim test.txt(无论test.txt是否存在):VIM使用教程_第2张图片
  2. 编辑文件内容
    按下【i、o、a】任何一个按键皆可进入编辑模式,在编辑模式中,左下角的显示INSERT字样,此时可以输入任何字符,除了【ESC】字符,可以进行任何编辑

    VIM使用教程_第3张图片
  3. 离开编辑模式,返回一般模式
    当我们完成编辑之后,按下【ESC】按键,则可以离开编辑模式,返回一般模式,按下【ESC】之后将会发现左下角的【INSERT】不见了
  4. 保存文件内容,离开vi/vim
    那现在就需要进行存档了,在一般模式下按下【:】(必须要英文标点),则进入命名模式,光标将移动到最下面一行等待输入命令,输入:wq则可以保存文档并离开vi/vim,当然,还可以使用:q!强制退出vi/vim,并放弃所有未保存更改
    PS:若刚才进入vi/vim的时候没有带文件名,则在保存时需要加上文件名,即
    :wq filename
    VIM使用教程_第4张图片

3、vi/vim按键说明

3.1、一般模式

移动光标
h或向左箭头 光标向左移动一个字符
j或向下箭头 光标向下移动一个字符
k或向上箭头 光标向上移动一个字符
l或向右箭头
光标向右移动一个字符
ctrl+f或功能键[PageDown]
向下移动一页
ctrl+b或功能键[PageUp]
向上移动一页
ctrl+d
向下移动半页
ctrl+u
向上移动半页
+
光标移动到非空格符下一列
-
光标移动到非空格符的上一列
n
n是数字,后跟空格键,光标向这一行后移n个字符的距离
0或功能键[HOME]
0是数字0,移动到这一行最前面字符处
$或功能键[END]
移动到这一行最后一个字符处
H
这个屏幕最上方那一行的字符处
M
光标移动到这个屏幕的中央那一行的第一个字符
L
光标移动到这个屏幕的最下方那一行的第一个字符
G
移动到这个档案的最后一行
nG
n为数字,移动到这个档案的第n行
gg
移动到这个档案的第一行
n
n为数字,光标向下移动n行
查找替换
/word 向光标之下寻找一个名称为word的字符串
?word 向光标之上寻找一个字符串名称为word的字符串
n 这个n是英文按键,代表【重复前一个搜寻的动作】
N
这个N是英文按键,与n刚好相反,为【反向】进行前一个搜寻动作。
: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 ,且在取代前显示提示字符给用户确认(confirm)是否需要取代!
复制、粘贴和删除
x,X 在一行字当中,x为向后删除一个字符(相当于[del]按键),X为向前删除一个字符(相当于[backspace]亦即是退格键)
nx n为数字,连续向后删除n个字符
dd 删除光标所在的那一整行
ndd
n为数字,删除光标所在的向下n行
d1G
删除光标所在到第一行的所有数据
dG
删除光标所在到最后一行的所有数据
d$
删除光标所在处,到该行的最后一个字符
d0
那个是数字的0,删除光标所在处,到该行的第一个字符
yy
复制光标所在的那一行
nyy
n为数字,复制光标所在的向下n行
y1G
复制游标所在列到第一行的所有数据
yG
复制游标所在列到最后一行的所有数据
y0
复制光标所在的那个字符到该行行首的所有数据
y$
复制光标所在的那个字符到该行行尾的所有数据
p,P
p为将已复制的数据在光标下一行贴上,P则为贴在游标上一行
J
将光标所在列与下一行的数据结合成同一行
c
重复删除多个数据,例如向下删除10行,[10cj]
u
复原前一个动作,undo
ctrl+r
重做上一个动作,redo
.
这就是小数点!意思是重复前一个动作的意思

3.2、一般模式切换到编辑模式

切换到编辑模式
i,I 进入插入模式:i为【从目前光标所在处插入】,I为【在目前所在行的第一个非空格符处开始插入】
a,A 进入插入模式:a为【从目前光标所在的下一个字符处开始插入】,A为【从光标所在行的最后一个字符处开始插入】
o,O 进入插入模式:这是英文字母o的大小写,o为【在目前光标所在的下一行处插入新的一行】;O为【在目前光标所在处的上一行插入新的一行】
r,R
进入取代模式:r只会取代光标所在的那一个字符一次;R会一直取代光标所在的文字,直到按下ESC为止
ESC
退出编辑模式,回到一般模式中

3.3、一般模式切换到命令模式

切换到编辑模式
:w 将编辑的数据写入硬盘文件中
:w! 若文件属性为【只读】时,强制写入该文件。不过,到底能不能写入,还跟你对该文件的权限有关
:q 离开vi
:q!
若曾修改过文件,又不想储存,使用!为强制离开不储存文件
:wq
储存后离开,若为:wq!则为强制储存后离开
ZZ
这个是大写的Z喔!若文件没有更动,则不储存离开,若文件已经被更动过,则储存后离开
:w [filename]
将编辑的数据储存成另一个文件
:r [filename]
在编辑的数据中,读入另一个文件的数据。亦即将【filename】这个文件内容加到光标所在行后面
:n1,n2 w [filename]
将n1到n2的内容储存成filename这个文件
:! command
暂时离开vi到指令列模式下执行command的显示结果!例如【:! ls /home】即可在vi当中察看/home 底下以ls输出的文件信息
还有一些vi/vim环境变更的指令,下面的vim配置再谈

4、VI/VIM暂存档、事故恢复

有些时候当我们在编辑文件的时候会出现些意外事故,例如:电脑宕机啦,突然断电啦等事故或者有其他用户在编辑这个文件时,这些情况都可能导致未保存文件的丢失或锁定,VI/VIM当然也有应对这种情况的机制咯!

当我们在使用vi/vim编辑文件时,vi/vim会在与被编辑文件的同目录下,新建一个名为.filename.swp的文件,这是一个暂存档,所有对源文件的操作都会记录在这个文件中,当遇到突发事故时,这个文件会被保存下来,之后重新编辑文件时就可以使用这个文件来进行恢复。

以下模拟下多用户编辑时的情况:

首先第一个用户编辑~/Shell/hello.sh文件,再使用另一个用户登录系统,查看被编辑文件目录下的所有文件,

VIM使用教程_第5张图片

确实多出了.hello.sh.swp文件,再使用vi/vim编辑hello.sh文件时

VIM使用教程_第6张图片

以上是使用多用户编辑的情况,而使用仿真断线停止vim工作则是另一种情况,最底下一行可使用命令多了一个

VIM使用教程_第7张图片

由于.hello.sh.swp暂存盘存在的关系,vim会提示此文件可能有问题,以上提示说明两个主要可能的问题及解决方案:

1、可能有其他用户或程序在编辑这个文件

Linux是多人多任务的环境,因此可能存在多人同时在编辑同一个文件,为此vim给出提示,解决方案为

  • 找到另外正在编辑此文件的人员或程序,让其将vim停止编辑此文件
  • 使用vim只读模式,即如上去最后一行提示,输入【O】进入只读模式即可

2、在上一次使用vim工作时,由于某些原因导致vim工作中断

这是常见的不正常结束vim的结果,解决方案:

  • 若之前的工作尚未保存,此时可以按下【R】,进行文件恢复,但.hello.sh.swp文件并不会在vim工作结束之后自动删除,而是需要我们手动删除,否则每次使用vim打开hello.sh文件时都会进行提醒
  • 若确定暂存盘没用,则可以按下【D】直接删除暂存盘,则vim会载入hello.sh并重新建立新的.hello.sh.swp暂存盘

在这个警告信息页面中,总共有六个可用选项:

  • [O]pen Read-Only:使用只读模式打开
  • [E]dit anyway:忽略暂存档内容,正常载入文件,如果有多人编辑,会出现文件混乱
  • [R]ecover:加载暂存档内容,恢复文件,不过,需要手动删除暂存档文件
  • [D]elete it:直接删除暂存档文件
  • [Q]uit:不进行任何操作,直接离开vim
  • [A]bort:忽略这个编辑行为,返回命令提示符界面,与quit类似

5、VIM额外功能

区块选择
v 字符选择,会将光标经过的地方反白选择
V 行选择,会将光标经过的行反白选择
ctrl+v 区块选择,可以用长方形的方式选择资料
y
将反白的地方复制起来
d
将反白的地方删除掉
多文件编辑
:n 编辑下一个档案
:N 编辑上一个档案
:file 列出目前这个 vim 的开启的所有档案
y
将反白的地方复制起来
d
将反白的地方删除掉

PS:多文件编辑可以使用vim filename1 filename2这种形式的命令进入多文件编辑模式

多窗口
:sp [filename] 开启一个新窗口,如果有加filename,表示在新窗口开启一个新档案,否则表示两个窗口为同一个档案内容(同步显示)
ctrl+w+j或ctrl+w+↓ 按键的按法是:先按下ctrl不放, 再按下w后放开所有的按键,然后再按下j(或向下箭头键),则光标可移动到下方的窗口
ctrl+w+k或ctrl+w+↑ 同上,不过光标移动到上面的窗口
ctrl+w+q
其实就是:q结束离开啦!举例来说,如果我想要结束下方的窗口,那么利用ctrl+w+↓移动到下方窗口后,按下:q即可离开,也可以按下ctrl+w+q啊!

6、VIM环境设定参数

vim的预设环境也许和我们所想要的不是很契合,那我们就自己动手做咯,以下是一些可能会用到的参数设置,当然,也可以通过:set all来显示所有的设置项,以下均在vim命令模式下使用

VIM环境设定参数
:set nu
:set nonu
行号的显示与隐藏
:set hlsearch :set nohlsearch 是否高亮显示搜寻的字符串
:set autoindent 
:set noautoindent
是否自动缩排
:set backup
是否自动备份,是则在同目录下生成filename~的备份文件用于存储原文件内容
:set ruler
是否显示右下角状态栏
:set showmode
是否显示左下角【INSERT】字眼的状态栏
:set backspace=(012)
一般来说,进入编辑模式之后,可以使用退格键删除任意字符,但有些发行版则不允许,那就需要设置,backspace值为2是可以删除任意字符,0或1时则只能删除刚刚输入的字符,不能删除原本存在的字符
:set all
显示目前所有的环境参数设定值
:set
显示与系统默认值不同的设定参数
:syntax on
:syntax off
是否依据程序相关语法显示不同颜色
:set bg=dark
:set bg=light
可用以显示不同的颜色色调,相当于着色方式

但是,总不能每次我进入vim都要重新进行设置一遍吧,当然有配置文件可以直接使用啦!整个vim的设定值一般放在/etc/vimrc这个文件,不过,不建议直接修改它,而是使用~/.vimrc这个文件,预设不存在,需手动建立

VIM使用教程_第8张图片

在这个文件中,有没有冒号(:)都是一样的结果

7、其他一些注意事项

DOS与Linux断行符

DOS下的断行符和Linux下的断行符是不同的,可以使用cat -A查看文件以观察其不同

DOS文件:


Linux文件:


可以发现,DOS文件的换行符是^M$,而Linux文件换行符是$,DOS文件多了个^M,这对于shell脚本类的文件而言,会造成系统解析出错,无法执行文件,那怎么办咯?当然是转换啦,不过,可不是使用vim进入文件一个个删除啊,而是使用指令来进行转换啦

dos2unix filename:将dos文件转成linux文件

unix2dos filename:将linux文件转成dos文件

以上两个指令均会直接将原文件转化成相对应的系统断行符文件,其他具体操作指令,请自行查看对应文档

语系编码转换

很多时候我们需要进行语系编码的转换,例如将gb2312改成utf8编码,或者反过来,或者转成其他的一些格式,这时候难道我们要一个个打开文件,然后再进行编码转换吗?当然不是,而是使用iconv这个指令即可

iconv -f 原本编码 -t 新编码 filename [-o newfile]

可以使用以上命令将文件编码进行转换,其他具体操作指令,请自行查看对应文档



以上基本就是vim的大部分基本功能了,咋看起来一大堆的命令,其实,我们常用的也就那些而已,那么多的命令,并不需要我们去背,关键在于要多去使用它,使用的多了,自然所有的命令都能够顺着指尖敲出来,而不用去费时费力想要用什么命令!

好啦,以上就是我的个人使用经验以及参考官方文献及鸟哥的Linux私房菜第三版所得,有啥不对的,敬请指出!




你可能感兴趣的:(vim)