文本处理三剑客之vim

由于Linux中的配置文件都是以文本方式存在的,所以在Linux的系统中使用文本编辑器来配置系统是一件很重要的事情。而vim由于程序简单、编辑速度快且能够检查编程中的语法错误,所以已成为最常用也最重要的文本处理工具。下面我们就来介绍一下。


一、vim的模式


Vim在使用过程中,基本上分为三种模式:命令模式、编辑模式与扩展命令模式。在三种模式下,我们可以执行的操作大致如下:

u  命令模式:在此模式中可以进行删除、复制、粘贴、移动光标等操作,但无法编辑文件内容;

u  编辑模式:在此模式中可以修改文本

u  扩展命令模式:在此模式中,可查找替换数据,读取、保存、替换字符,离开vim,相关设置等;

需要注意的是,命令模式与编辑模式及扩展命令模式可相互切换,但编辑模式与扩展命令模式之间不可互相切换,各模式之间的切换如下图所示:

blob.png


二、vim命令语法


vim稍作了解之后,我们来看 一下vim一些具体的命令与选项。

vim [options] [file ..]

+#:打开文件后,直接让光标处于第#行的行首

+/PATTERN:打开文件后,直接让光标处于第一个被PATTERN匹配到的行的行首

+:直接打开文件,光标处在最后一行行首

-b:以二进制方式打开文件

-d:比较多个文件

-m:以只读方式打开文件,不能强制写入

-e:直接进入命令行模式,与命令ex file相同

需要注意的是,对于vim命令而言,如果要编辑的文件存在,则文件被打开并显示内容;如果文件不存在,则会在编辑后第一次存盘时创建它;


三、vim的按键操作


vim中,我们通过按键来进行相关的编辑操作,而且在不同的模式下,按键的作用可能也并不相同,下面列出一些常用按键的作用。

移动光标的方法 备注
h或左箭头
或<backspace>
光标向左移动一个字符;<backspace>移动到行首时可自动切换至上一行 如果想要进行多次移动的话,可以使用nCOMMAND,即加上想要进行的次数(数字)后,按下操作即可
j或下箭头 光标向下移动一个字符
k或上箭头 光标向上移动一个字符
l或右箭头或<space> 光标向右移动一个字符;<space>移动到行尾时可自动换至下一行
Ctrl+f 屏幕向下移动一页,相当于PgDn
Ctrl+b 屏幕向上移动一页,相当于PgUp
Ctrl+d 屏幕向下移动半页
Ctrl+u 屏幕向上移动半页
+ 光标移动到下一行的第一个非空白字符
光标移动到上一行的第一个非空白字符
0或Home 光标移动至这一行的绝对行首
^ 光标移动至这一行行首的第一个非空白字符
$ 光标移动至这一行的最后字符处
H 光标移动到这个屏幕的最上方那一行的第一个字符
M 光标移动到这个屏幕的中央那一行的第一个字符
L 光标移动到这个屏幕的最下方那一行的第一个字符
G 光标移动到这个文件的最后一行的第一个非空白字符
nG n为数字,光标移动至此文件的第n行的第一个非空白字符
gg 光标移动至此文件的第一行的第一个非空白字符,相当于1G
nEnter n为数字,光标向下移动n行,至m+n行的第一个非空白字符(m为当前行)
) 光标移动至下一句的第一个非空白字符
( 光标移动至上一句的第一个非空白字符
} 光标移动至下一段的第一个字符
{ 光标移动至上一段的第一个字符
查找
/word 从当前光标开始向下寻找包含word的字符串
?word 从当前光标开始向上寻找包含word的字符串
n 重复前一个查找的操作,与搜索命令同方向
N 反向进行前一个查找的操作,与搜索命令反方向
删除、复制、粘贴与编辑
x,X x为删除当前光标所在字符,X为删除当前光标所在字符的前一个字符
nx n为数字,从当前光标所在字符连续向后删除n个字符(含当前光标所在字符)
xp 交换光标所在处的字符及其后面字符的位置
dd 删除光标所在的那一整行 vim中的删除命令为d,后面可结合光标跳转字符,实现范围删除
ndd n为数字,从当前光标所在行连续向下删除n行(含当前光标所在行)
d1G 删除从光标所在行至第一行的所有数据
dG 删除从光标所在行至最后一行的所有数据
d$ 删除从光标所在处到该行的最后一个字符,等同于D
d0 删除从光标所在处的前一个字符到该行的第一个字符(包含空白字符)
d^ 删除从光标所在处的前一个字符到该行的第一个非空白字符
yy 复制光标所在的行 vim中的复制命令为y,后面可结合光标跳转字符,实现范围复制
nyy n为数字,复制从光标所在行向下的n行(含光标所在行)
y1G,ygg 复制从光标所在行到第一行的所有数据
yG 复制从光标所在行到最后一行的所有数据
y0 复制从光标所处的前一个字符至该行第一个字符(包含空白字符)的所有数据
y^ 复制从光标所在处的前一个字符至该行的第一个非空白字符的所有数据
y$ 复制从光标所在处字符到该行行尾的所有数据
Y 复制当前光标所在的行
cc 删除当前光标所在行并切换为插入模式 vim中的改变命令为c,后面可结合光标跳转字符,实现范围改变
ncc n为数字,删除从光标所在行向下的共n行(含光标所在行)并切换为插入模式
cgg,c1G 删除从光标所在行到第一行的所有数据并切换为插入模式
cG 删除从光标所在行到最后一行的所有数据并切换为插入模式
c0 删除从光标所在处的前一个字符至第一个字符(包含空白字符)的所有数据并切换为插入模式
c^ 删除从光标所在处的前一个字符至第一个非空白字符的所有数据并切换为插入模式
c$ 删除从光标所在处字符到该行行尾的所有数据并切换为插入模式,等同于C
p,P p:缓冲区存的如果为整行,则粘贴在当前光标所在行的下方;否则,则粘贴至当前光标所在处的后面
    P:缓冲区存的如果为整行,则粘贴在当前光标所在行的上方;否则,则粘贴至当前光标所在处的前方
~ 将当前光标所在字符改变大小写
n~ n为数字,将从当前光标所在字符开始的n个字符改变其大小写
g~~ 改变当前光标所在行字母的大小写
U 将可视化模式下选择的字母全部改成大写 vim中大小写转换的命令是gu和gU,gu代表转化为小写,gU代表转化为大写,后面跟光标跳转字符(对这两个命令的地址界定),代表从当前光标所在处(行)到指定位置进行转换
u 将可视化模式下选择的字母全部改成小写
gUU 将当前光标所在行字母全部改成大写
ngUU n为数字,将从当前光标所在行向下共n行的字母全部改成大写
nguu n为数字,将从当前光标所在行向下共n行的字母全部改成小写
J 将当前光标所在行与下一行的数据结合成同一行
u 撤销最近的更改
nu n为数字,撤销最近的n次更改
U 撤销光标落在这行后所有此行的更改
Ctrl+r 重做撤销的更改
. 重复前一个操作
n. n为数字,重复前一个操作n次
ZZ 保存后离开
ZQ 不保存而退出
进入插入或替换的编辑模式
i,I 进入插入模式,i为从当前光标所在处插入,I为从当前所在行的第一个非空格字符处开始插入
a,A 进入插入模式,a为从当前光标所在处的下一个字符开始插入,A为从光标所在行的最后一个字符(包含空白字符)处开始插入
o,O 进入插入模式,o为在当前光标所在处的下一行插入新的一行;O为在目前光标所在处的上一行插入新的一行
r 进入替换模式,只替换光标所在处的字符一次
R 进入替换模式,会一直替换光标所在的文字,直到按下Esc键
Esc 退出编辑模式,回到一般模式中
命令行模式的保存、离开等命令
:w 将编辑的数据写入硬盘文件中
:w! 若文件属性为“只读”时,强制写入该文件,不过,到底能不能写入,与文件权限有关;
    若对文件所在目录有写权限,当对文件没有写权限而强制写入时,会将原文件删除,并创建与原文件同名的新文件
:q 离开vim
:q! 若曾修改过文件,又不想保存,使用:q!为强制离开不保存文件
:wq,:wq! wq为保存后离开;wq!为强制保存后离开
:x,:x! :x为保存后离开;:x!为强制保存后离开
:w/PATH/TO/FILE 将编辑后的数据保存为另一个文件;但若再次编辑仍是在原文件上编辑
:r/PATH/TO/FILE 在编辑的数据中,读入另一个文件的数据,即将FILE这个文件的内容追加到光标所在行的下一行
:地址定界 w /PATH/TO/FILE 将地址定界中的内容保存为另一个文件
:!COMMAND 暂时离开vim到命令行模式下执行COMMAND;按Enter返回vim
:r!COMMAND 在编辑的数据中,读入COMMAND命令的执行结果,即将COMMAND这个命令的执行结果追加到光标所在行的下一行
:e!,:edit! 撤销对文件做的所有更改,回到上一次保存的状态
vim环境的更改
:set nu 显示行号,设置之后,会在每行的前缀显示该行的行号
:set nonu 与set nu相反,为取消行号


四、地址定界与查找替换


1、地址定界

vim中,我们通常需要对范围内的数据进行操作,那么如何进行范围确定呢?这时,就需要用到vim中的地址定界了,其常用的有以下几种

#:具体第#

m,n:从第m行的绝对行首至第n行的行尾

m,+n:从第m行的绝对行首至m+n行的行尾

.:当前行

$:最后一行整行

%:全文,相当于1,$

/part/:从光标所在处向文件尾部,第一次被模式所匹配到的行

/pat1/,/part2/:从第一次被part1模式匹配到的行的绝对行首开始,一直到第一次被part2匹配到的行的行尾结束

m,/part/:从m行的绝对行首开始,一直到第一次被part匹配到的行的行尾结束


2、查找与替换

在进行地址定界之后,我们就可以在后面跟一些操作命令来实现范围操作,其中的查找与替换时我们比较常用的编辑命令,其具体命令与用法如下:

s:在扩展命令行模式下完成查找替换操作

格式:s/要替换的内容/替换为的内容/修饰符

需要注意的是:

u  要替换的内容可用正则表达式;

u  替换为的内容,不能使用模式,但可以使用\1,\2,…等后向引用符号引用要替换的内容中的组;还可以使用&引用要替换的内容查找到的整个内容;

u  分隔符/可替换为其他字符, 常用的有#@

修饰符:

i:忽略大小写

g:全局替换;默认情况下,每一行至替换第一次出现;

c:每次替换前询问


五、可视化与多窗口


1、可视化模式

我们上面介绍了使用vim的地址定界来实现范围操作,而除了地址定界之外,vim还提供了可视化模式来实现连续范围选取,共有三种选择方式:

u  v:字符选择,会将光标经过的字符选择

u  V:行选择,会将光标经过的行选择

u  Ctrl+v:块选择,可以用长方形的方式选择数据

我们可以对被选择的突出显示的数据进行删除,复制,变更,过滤,搜索替换等。


2、多文件切换

vim的命令 语法中,我们知道vim可以打开多个文件,那么我们如何在各文件间切换呢?vim对于多文件在扩展命令模式下有特定的命令,下面来看一下:

:next,:n 下一个文件

:prev,:N 前以上文件

:first 第一个文件

:last 最后一个文件

:wall 保存所有文件

:qall 退出所有文件

:file 列出目前这个vim打开的所有文件

:wqall 保存并退出所有文件


3、多窗口分割

在一般窗口界面下的编辑软件大多有切割窗口或是冻结窗口的功能来将一个文件切割成多个窗口,vim同样具有这个功能,这就是vim的多窗口功能。

当我们对多文件进行多窗口分割时,我们可以使用如下的命令:

vim -o|-O FILE1 FILE2…

其中-o表示水平分割;-O表示竖直分割。

对于单文件同样可以分割窗口,分割按键如下

:sp [filename]:打开一个新窗口(水平分割),如果有加filename,表示在新窗口打开一个新文件,否则表示两个窗口为同一个文件内容(同步显示)

Ctrl+w,ssplit,水平分割窗口

Ctrl+w,vvertical,竖直分割窗口

Ctrl+w,q:取消相邻窗口

Ctrl+w,o:取消全部窗口

:wqall:保存并退出

而在vim的多窗口分割后,在窗口间切换时的按键为:Ctrl+wArrow

六、vim的环境设置与记录


我们会发现,我们在vim中对字符进行查找、复制、替换等操作时,总会有一些特定的显示格式,而这些格式就是vim的环境设置了。

vim中分别 有针对全局和和个人进行设置的配置文件,其中全局配置文件为/etc/vimrc,个人配置文件为~/.vimrc。对于全局配置文件,我们一般不建议修改,一般建议将配置写到个人配置文件。

同样的,如果我们仅希望一些配置只在当前vim中生效,那么我们可以在扩展命令模式下通过命令来进行设置,在扩展命令模式下的设置仅对当前vim进程有效;在扩展命令模式下可使用:set all来显示目前所有的环境参数设置值;用:set来显示与系统默认值不同的设置参数。

原创文章,作者:luoliumeng,如若转载,请注明出处:http://www.178linux.com/33343

(0)
luoliumengluoliumeng
上一篇 2016-08-12
下一篇 2016-08-12

相关推荐

  • Linux发展史

    简述 Linux于1991年10月5日诞生,由Linus torvalds和后面陆续加入的众多爱好者共同开发完成的操作系统 Linux只表示Linux kernl,但由于习惯用Linux来形容整个基于Linux kernl,使用GNU计划的各种工具和数据库的操作系统 Linux的标志 一只名为Tux的企鹅 大家要Linus Torvalds想一只吉祥物,他想…

    2017-03-26
  • 推荐-运维学习笔记-Puppet应用配置的工作原理

    背景知识 Puppet的核心功能是配置管理。一般来说,用户在master上集中做配置,同时,被管理节点上的agent会定期从master上下载配置数据,再应用(apply)到本地,从而使管理节点的状态(用户,组,文件,安装包,服务等的设置和运行状态)与masters上定义的保持一致。 有时,出于测试的目的,并不希望真的应用配置,那么就需要执行puppet a…

    2016-06-01
  • 马哥网络21-第5周作业

    1、显示/boot/grub/grub.conf中以至少一个空白字符开头的行; [root@localhost proc]# grep "^[[:space:]]\{1,\}" /boot/grub/grub.conf root (hd0,0) kernel /vmlinuz-2…

    Linux干货 2016-08-08
  • 磁盘管理

    CHS cylinder-head-sector cylinder柱面=track*head=512*63*256=8M  磁盘分区 为什么是分区? • 优化I/O 性能 • 实现磁盘空间配额限制 • 提高修复速度 • 隔离系统和程序 • 安装多个OS • 采用不同文件系统   MBR:使用32位表示扇区数量,按每扇区512字节计算,每个…

    Linux干货 2016-08-29
  • 学会在命令行中获取帮助

    在命令行中获取帮助是学习Linux必须get的一项技能,学会之后受益多多。  Linux中的命令有内部命令和外部命令之分,通常使用 type 命令来区分 除此之外还可以使用 enable 命令来查看内部命令 enable命令后的许多option可以对这些内部命令了解更多,比如: 想要知道内部命令有多少个 enable -a |wc -l 禁用某个内…

    2017-07-15

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-12 09:06

    关于vim文本编辑器的用法总结的很全面。排版也有很用心哦,