一,简介
vim编辑器是一个简单易用并且具有强大功能的源程序编辑器。
二,vim工作模式
1,vim共有三种工作模式:
- 命令模式(Command mode)
从shell进入vim时,初始模式为“命令模式”。在这种模式下,所有输入都被当做命令来解释。我们可以通过输入各种vim命令来实现对文本的“复制、粘贴、删除、移动、跳转”等操作。
- 插入模式(Insert mode)
在插入模式下,我们可以对文本进行编辑。
- 末行模式(Last line mode)
在命令模式下输入“:”即可进入末行模式,其特征为“在vim窗口的最下部,显示一个“:”等待输入命令。在此模式下,我们可以输入一些命令来进行“文件保存、退出、查找字符串、文本替换、显示行号”等操作。
2,vim三种模式的任意切换
3,vim的启动
vim 不指定文件名,保存文件是需指定文件名
vim filename 打开或新建文件
vim +n filename 打开文件并跳到第n行行首
vim + filename 打开文件并调到末行行首
vim + /String filename 打开文件并跳到匹配到的第一个String处
4,保存文件、退出
(1)命令模式下,输入"ZZ"
(2)末行模式下,输入以下命令:
w 保存文件但不退出
w filename 以filename为文件名保存为一个新文件
w! filename 强制以filename为文件名保存为一个新文件,若原
文件已存在,则覆盖。
q 退出,若文件改动而未保存,则会产生错误。
q! 强行退出
wq 保存并退出
x 保存退出
三,文本编辑
1,光标的移动(命令模式+插入模式)
在插入模式下使用方向键来移动光标;
在命令模式下的操作如下:
(1)逐字符移动
按键 | 操作 | 按键 | 操作 |
---|---|---|---|
h | 左移 | l | 右移 |
k | 上移 | j | 下移 |
nh、nl | 左/右移n字符 | nk、nj | 上下移n个字符 |
(2)逐单词移动
按键 | 操作 | 按键 | 操作 |
---|---|---|---|
b | 移动到上一个“词首” | w | 移动到下一个“词首” |
e | 移动到下一“词尾” | nb、nw、ne | 移动到第n个词首/词尾 |
(3)句间跳转
按键 | 操作 | 按键 | 操作 |
---|---|---|---|
( | 移动到上一句首 | ) | 移动到下一句首 |
(4)行内跳转
按键 | 操作 | 按键 | 操作 |
---|---|---|---|
0(零) | 移至绝对行首 | ^ | 移至行的第一个非空白字符 |
$ | 移至绝对行尾 |
(5)行间跳转
按键 | 操作 | 按键 | 操作 |
---|---|---|---|
1G | 移至第一行 | gg | 移至第一行 |
nG | 移至第n行 | 末行模式下直接给出行号n | 移至第n行 |
G | 移至最后一行 |
(6)段落间跳转
按键 | 操作 | 按键 | 操作 |
---|---|---|---|
{ | 移动到上一段段首 | } | 移动到下一段段尾 |
(7)翻屏
按键 | 操作 | 按键 | 操作 |
---|---|---|---|
Ctrl+b | 向上翻一屏 | Ctrl+f | 向下翻一屏 |
Ctrl+u | 向上翻半屏 | Ctrl+d | 向下翻半屏 |
2,文本的删除
- 编辑模式下:
按键 | 操作 |
---|---|
x | 删除光标处的字符 |
xp | 交换光标处字符和其后面字符的位置 |
d0 | 删除绝对行首至光标前一个字符的所有字符 |
d$ | 删除光标所在字符到行尾的所有字符 |
db | 删除光标前一字符至上一“词首”字符 |
dw | 删除光标字符至下一“词首”前一个字符 |
de | 删除光标字符至下一“词尾”字符 |
ndb、ndw、nde | 执行n次相应操作 |
dd | 删除光标所在行 |
D | 删除光标所在行,但保留删除后的空白行 |
ndd | 删除光标所在行及其之后的共n行 |
3,文本粘贴
文本粘贴使用的是p/P命令,即put、paste;
p用法如下:
- 当缓冲区中存放的为整行,则粘贴至光标所在行下面一行;
- 当缓冲区存放的不为整行,则粘贴至光标的后方下方;
P用法如下:
- 当缓冲区中存放的为整行,则粘贴至光标位置之后;
- 当缓冲区存放的不为整行,则粘贴至光标的后方下方;
4,文本复制
文本复制使用的是y命令,及yank;
用法与d命令类似;
5,文本修改
文本修改使用的命令是c,即change;
此命令执行后,直接从编辑模式跳转到插入模式;其操作相当于是执行d命令+a,即先删除,再跳到光标下一字符;
用法与d命令类似;
6,可视化模式
按键 | 操作 |
---|---|
v | 按字符选定区域 |
V | 按行选定区域,光标所过之行皆被选中 |
经常与d、y、c结合使用,用于对所选区域进行相应操作;
7,替换模式
替换模式使用命令r/R;
r/R+CHAR:将光标字符替换为CHAR
8,撤销操作
撤销前一次编辑操作:u
撤销前n次编辑操作:nu
重复前一次操作:.
撤销亲一次“撤销”:Ctrl+r
9,vim自带教程
vimtutor是vim中自带的用于新手学习的教程;支持我们以上所学的各种翻屏操作;
打开vimtutor:
[root@localhost /]# vimtutor
10,vim末行模式
(1)地址定界
用法::start_pos,end_pos
按键 | 操作 |
---|---|
:# | 选中第#行并且光标跳转到第#行行首(非空白字符) |
:#1,#2 | 选中第#1行到第#2行 |
:#1,+#2 | 选中第#1行及其之后的#2行 |
:. | 选中当前行 |
:$ | 选中最后一行 |
:. ,$-1 | 选中当前行至倒数第二行及其之间行 |
:% | 选中全文 |
:/PATTERN1/,/PATTERN2/ | 选中PATTERN1第一次匹配到的行到PATTERN2第一次匹配到的行及其之间的行。 |
:#,/PATTERN/ | 选中从第#行开始,到PATTERN第一次匹配到的行结束 |
:/PATTERN/,$ | 选中从PATTERN第一次匹配到的行开始,到最后一行 |
地址定界常与d、y、w、c等编辑命令结合使用,表示对所选中的区域执行相关操作;
例如:
/*将文本第1行到第20行保存到文件/tmp/mytext.txt中*/
:1,20w /tmp/mytext.txt
/*将文件/tmp/mytext.txt中的内容读取到当前文本的第100行*/
:100r /tmp/mytext.txt
(2)查找
按键 | 操作 |
---|---|
:/PATTERN | 从当前光标所在处向文件尾部查找 |
:?PATTERN | 从当前光标所在处向文件首部查找 |
匹配到查找内容后,若查找到多个匹配内容:
n : 与命令同方向查看下一个;
N : 与命令反方向查看下一个;
(3)查找并替换
使用s命令可在末行模式下完成查找替换操作;
用法:
s /查找内容/替换为的内容/修饰符`
- 查找内容:可用PATTERN进行匹配查找;
- 替换为的内容:不可用PATTERN匹配,但可用\1,\2……进行后向引用;还可用"&”引用查找内容;
- 修饰符:g表示全局,i表示不区分大小写;
例:
从当前行到最后一行,搜索以r开头、以t结尾并且中间含有两个字符的字符串;然后将其开头字符r替换为R、替换为T,中间两个字符不变;
:. ,$s/r\(..\)t/R\1T/g
查找替换中使用的分隔符,如/,是可以改变的,可以使用其他特殊字符;
上例可写为:
:. ,$s@r\(..\)t@R\1T@g
下面我们来做几个练习吧!
1,复制/etc/grub2.cfg至/tmp/目录,用查找替换命令删除/tmp/grub2.cfg文件中的行首中的空白字符;
[root@localhost jeffrey]# cp /etc/grub2.cfg /tmp/
[root@localhost jeffrey]# vim /tmp/grub2.cfg
:%s/^[[:space:]]\+//g
2,复制/etc/rc.d/init.d/functions文件至/tmp目录,用查找替换命令为/tmp/functions中以空白字符开头的每行行首添加一个#;
[root@localhost tmp]# cp /etc/rc.d/init.d/functions /tmp/
[root@localhost tmp]# vim /tmp/functions
:%s/^[[:space:]]/#&/g
3,复制/etc/rc.d/init.d/functions文件至/tmp,替换此文件中的/etc/sysconfig/init为/var/log;
[root@localhost tmp]# cp /etc/rc.d/init.d/functions /tmp/
cp: overwrite ‘/tmp/functions’? y
[root@localhost tmp]# vim /tmp/functions
:%s/\/etc\/sysconfig\/init/\/var\/log/g
4,删除/tmp/functions文件中所有以#开头并且#后无空白字符的行行首的#;
[root@localhost tmp]# vim /tmp/functions
:%s/^#\([^[:space:]]\)/\1/g
11,vim多文件编辑及分屏显示
(1)分屏显示一个文件
按键 | 操作 |
---|---|
Ctrl+w,s | 先按Ctrl+w,松开再按s,水平拆分窗口 |
Ctrl+w,v | 先按Ctrl+w,松开再按v,垂直拆分窗口 |
Ctrl+w,方向键 | 先按Ctrl+w,松开再按方向键,在窗口间切换光标 |
:qa | 关闭所有窗口 |
(2)编辑多个文件
用法:~]# vim FILE1 FILE2…
按键 | 操作 |
---|---|
:next | 切换至下一个文件 |
:prev | 切换至上一个文件 |
:last | 切换至最后一个文件 |
:first | 切换至第一个文件 |
:qa | 全部退出 |
:wa | 保存全部 |
(3)分窗口编辑多个文件
用法:
水平分割显示
~]# vim -o FILE1 FILE2…
垂直分隔显示
~]# vim -O FILE1 FILE2…
12,vim配置
我们也可以对vim进行私人定制。
(1)通过配置文件定制vim,特点是永久有效;
配置文件通常包括全局配置文件和当前用户配置文件;
- 全局配置文件:/etc/vimrc
- 当前用户配置文件:~/.vimrc
(2)在末行模式下设置,特点是支队当前vim进程有效;
以下是配置vim的一些具体操作:
1)行号设置
显示行号:set number 简写为 set nu
取消显示:set nonumber 简写为 set nonu
2)括号匹配
启动匹配:set showmatch 简写为 sm
取消匹配:set nosm
3)自动缩进
设置启动:set autoindent 简写为 set ai
设置禁用:set noai
设置C语言语法自动缩进:set cindent
设置缩进宽度为#:set shiftwidth=#
设置tab缩进宽度为#:set tabstop=#
4)高亮搜索
启动:set hlsearch
禁用:set nohlsearch
5)语法高亮
启用:syntax on
禁用:syntax off
6)忽略字符大小写
启用:set ic
禁用:set noic
7)设置vim数值进制识别方式
set nrformats
vim在缺省情况下,会把以0开头的数字默认为八进制数,因此007是用加1后,会变成010,而不是008(读者可以手动验证一下)。此设置加入到文件vimrc中,这时,vim会把所有数字都当成十进制,记住是“所有”。