最近刚好在搞一些服务器相关的东西,为此需要在linux下做些编辑操作,刚好去学了下vim,顺手记录下来,以防之后一阶段没用的时候又忘掉!
看到vim一大堆的操作命令,刚开始我也吓一跳,不过,还是要硬着头皮上,使用了几次之后发现,其实也就是一个编辑器而已,再多的命令,用多了自然就熟悉了,完全不需要再去记忆,需要用什么指令,手指自然的就能够反应过来了!,所以,学东西最快,最好的方式就是直接去用,管它难不难,用多了,也就不难了!废话不说了,开工!
VIM可以看做是VI的进阶版本,而在所有的类Unix系统中,都会內建VI编辑器,并且在类Unix系统中的个别程序软件的编辑接口都会呼叫VI,不学会使用VI很多的指令都没办法使用,VIM可以使用VI的几乎所有指令,并且做了增强,比如当编辑一个程序文件时,可以自动呼叫改程序的语法判断式,对程序代码进行着色!此外,VIM增加很多额外的功能:多档案编辑、区块复制啥的!
PS:以下介绍所有操作都可以在VI和VIM上使用
VIM共分有三种模式:一般模式、命令模式、编辑模式,三种模式作用分别是:
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 |
. |
这就是小数点!意思是重复前一个动作的意思 |
i,I | 进入插入模式:i为【从目前光标所在处插入】,I为【在目前所在行的第一个非空格符处开始插入】 |
a,A | 进入插入模式:a为【从目前光标所在的下一个字符处开始插入】,A为【从光标所在行的最后一个字符处开始插入】 |
o,O | 进入插入模式:这是英文字母o的大小写,o为【在目前光标所在的下一行处插入新的一行】;O为【在目前光标所在处的上一行插入新的一行】 |
r,R |
进入取代模式:r只会取代光标所在的那一个字符一次;R会一直取代光标所在的文字,直到按下ESC为止 |
ESC |
退出编辑模式,回到一般模式中 |
: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当然也有应对这种情况的机制咯!
当我们在使用vi/vim编辑文件时,vi/vim会在与被编辑文件的同目录下,新建一个名为.filename.swp的文件,这是一个暂存档,所有对源文件的操作都会记录在这个文件中,当遇到突发事故时,这个文件会被保存下来,之后重新编辑文件时就可以使用这个文件来进行恢复。
以下模拟下多用户编辑时的情况:
首先第一个用户编辑~/Shell/hello.sh文件,再使用另一个用户登录系统,查看被编辑文件目录下的所有文件,
确实多出了.hello.sh.swp文件,再使用vi/vim编辑hello.sh文件时
以上是使用多用户编辑的情况,而使用仿真断线停止vim工作则是另一种情况,最底下一行可使用命令多了一个
由于.hello.sh.swp暂存盘存在的关系,vim会提示此文件可能有问题,以上提示说明两个主要可能的问题及解决方案:
1、可能有其他用户或程序在编辑这个文件
Linux是多人多任务的环境,因此可能存在多人同时在编辑同一个文件,为此vim给出提示,解决方案为
2、在上一次使用vim工作时,由于某些原因导致vim工作中断
这是常见的不正常结束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啊! |
vim的预设环境也许和我们所想要的不是很契合,那我们就自己动手做咯,以下是一些可能会用到的参数设置,当然,也可以通过:set all来显示所有的设置项,以下均在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这个文件,预设不存在,需手动建立
在这个文件中,有没有冒号(:)都是一样的结果
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私房菜第三版所得,有啥不对的,敬请指出!