第 24 章 Vim 编辑器

目录

VIM 简介

命令

配置文件

模式行

模式介绍

模式切换

移动

数字参数

浏览

标记

编辑

搜索和替换

正则表达式

寄存器操作

插入模式下的快捷键

键绑定、缩写

单词补全

命令模式

折叠

多栏窗口

标签页

文件管理

加密

版本

VIM 简介

我们使用的大多数编辑器,都可以直接在编辑区输入字符,并且能够通过一些快捷键来完成一些控制功能,比如使用方向键移动光标,使用 BackSpack 或者 Delete 键删除文字,使用 PgUpPgDn 翻页,使用 HomeEnd 来定位行首和行末……

而Vim是一个带模式的编辑器,同样的按键,在不同模式下,具有不同的功能定义。例如 h j k l编辑模式 下输入相应的字符,在 普通模式 下却相当于方向键的作用。

由于需要切换模式,Vim 的使用起来略显繁琐。不过优点也显而易见:您只要把手安安稳稳的放在打字区就可以了,而不需要使用诸如方向键、排版键、小键盘等需要挪开双手的键位,从而提高了您的效率和专注程度。事实上,Vim 的前身 Vi 诞生的时候,键盘上还没有方向键、排版键和小键盘

命令

使用 Vim 编辑文件:

vi [文件名]
vim [文件名]

教学模式:

vimtutor [语言]

vim 教程,相当于使用Vim编辑器以只读模式打开教程文件。您无论对这个文件作了什么,都会在退出后恢复原来的样貌。与只读模式的区别在于,它不会没有眼色的提醒您,现在的状态为只读模式。您可以使用它作一些练习

您可以指定教程文件的语言,如果使用本地语言(ZH_cn)出现乱码,您可以尝试使用英语

vimtutor en

使用 Vim 比较文件区别

vimdiff [文件1] [文件2] [其它文件]……

配置文件

Vim 的全局配置文件为 /etc/vim/vimrc ,用户配置文件为 ~/.vimrc" 起始的行为注释行。我们提供的配置项,您直接加入配置文件就可以了

您可以先对 Vim 进行一些简单的配置:

例 24.1. Vim 配置 /etc/vim/vimrc

"运行在非兼容(VI)模式下(命令模式下 TAB 补全)
set nocompatible

"设定文件编码
set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936

"开启语法加亮
syntax on
"配色风格
colorscheme pablo

"简洁启动模式
set shortmess=atI
"设定 GUI 选项
"set guioptions=gmrLtT  m:菜单 T:工具栏
set guioptions=gmrLt
"命令行高度
set cmdheight=1
"设定行距 ( GUI 界面中生效 )
set linespace=4
"显示标尺
set ruler

"自动折行
"set nowrap
set wrap
"按完整单词折行
set nolinebreak
"set linebreak
"行宽(输入时自动插入换行符)
"set textwidth=80
set textwidth=0

"允许在 虚空间 内操作 (虚空间:不包含任何文本的空间。如换行符之后)
"set virtualedit=all
"禁止在 虚空间 内操作
set virtualedit=

"设定 Tab 键缩进的空格数
set tabstop=4
"设定编辑器将多少空格视为一个缩进
set shiftwidth=4
"将缩进转换为空格
"set expandtab
"设定自动缩进(新行与前一行缩进相同)
set autoindent
"set noautoindent
"插入模式下,“←”如何删除光标前的字符:行首空白、换行符、插入点之前的字符
set backspace=indent,eol,start

"命令行历史纪录
set history=500

"禁用增量搜索
set incsearch
"set noincsearch
"搜索时忽略大小写
set ignorecase
"set noignorecase
"高亮显示搜索结果
set hlsearch

"设定折叠方式
"set foldmethod=manual

"以下字符将被视为单词的一部分 (ASCII):
"set iskeyword+=33-47,58-64,91-96,123-128

模式行

也可以通过“模式行”将配置选项嵌入在普通文件中。打开此文件时,优先使用模式行中的配置:

# **vim:** filetype=sh foldmethod=marker autoindent expandtab shiftwidth=4
模式行可以写在任意位置
但为了不影响文件功能,模式行通常写在注释中
模式行以 **vim:** 起始,前面至少要有一个空白字符(空格、换行符等)
模式行中的设置项以空格分隔
……

这种形式的缺点在于,不能在设置项后添加其它文本。如果有相关需要,可以使用另一种模式行:

<!-- **vim:set** filetype=html**:** 这里可以任意添加文本 -->

模式介绍

Vim 常见的模式有: 普通模式插入模式命令模式 ,另外我们也会经常用到 可视模式

Vim 启动时进入 普通模式 ;或者在其它模式下,按下 Esc 键,便可以回到普通模式。

使用 vimtutor en 命令进入教程,现在是普通模式。随便按几下 jklh 键,您会发现光标的位置发生改变。

按下 i 键,编辑器底部出现了 -- 插入 -- 或者 -- insert -- ,您进入了插入模式。随便按几下 jklh ,您会发现相应的字符出现在编辑区,现在还可以通过方向键来移动光标。可能您觉得使用方向键移动光标不是什么问题,但是习惯了 Vim 后,您反而会认为方向键太麻烦了,简直不能容忍!好了,现在按下 Esc 键回到普通模式,我们又可以使用 jklh 来移动光标了。

在普通模式下,按下 : 键(也就是 Shift+; ),在编辑器底部出现了一个 : ,您进入了命令模式。在 : 后输入一个命令 new ,回车后,编辑器被分割为上下两栏。为了方便起见,我们在命令前加一个 : 来表示命令模式下输入的命令,像这样

:vnew

命令能够以一些规则简化,上面的命令也可以写为这种形式

:vne

现在您的编辑区一定弄的四分五裂,您可以使用命令“:quit”来关闭当前栏,直接用简写就可以了

:q

这个命令是退出编辑器,如果编辑区被分成多栏,则是退出当前栏。

执行完一个命令(按下回车后),编辑器会自动回到普通模式。如果想不执行当前命令,直接回到普通模式,您可以按下 Esc键。

按下 v 键,您进入了可视模式,可以使用 jklh 移动光标,高亮选取文本 。

事实上,可视模式相当于高亮选取文本后的普通模式。

可视模式具有多种模式,以行为单位进行选取的可视行模式,使用 V 键进入(也就是 Shift+v );和以块为单位进行选取的可视块模式,使用 Ctrl+v 键进入。

模式切换

好了,现在我们总结一下模式间切换的方法

其它模式 普通模式 Esc
普通模式 插入模式 i 在光标前插入
I 在行首插入
a 在光标后插入
A 在行末插入
o 在当前行之下新建行
O 在当前行之上新建行
r 替换当前字符
R 从当前字符开始替换
普通模式 命令模式 :
普通模式 可视模式 v 可视模式
V 可视行模式
Ctrl+v 可视块模式

移动

在普通模式中,您可以使用以下方式移动光标

k(上)
h(左) l(右)
j(下)

您可以使用其它更有效率的方式移动光标

表 24.1.

向前 向后
单词 w b
单词,包括特殊符号 W B
单词词尾 e
单词词尾,包括特殊符号 E
0 $
行首文字(不包括空格) ^
H L
页面中部 M

在其它模式中,您可以使用方向键移动光标,不过那样比较麻烦,您可以在配置文件中绑定插入模式下的功能键

noremap! <M-j> <Down>
noremap! <M-k> <Up>
noremap! <M-h> <left>
noremap! <M-l> <Right>
………………
作用范围 键位 功能
  • 其中,map!绑定的键盘映射,作用于所有模式;inoremap!绑定的映射,仅作用于插入模式。

数字参数

您也可以使用数字参数(普通模式),来重复执行。例如

100j
  • 执行 100次 j 键,向下 100行

浏览

表 24.2.

向前 向后
整页 Ctrl+f Ctrl+b
半页 Ctrl+d Ctrl+u
文件 G gg
按行号转到相应行 行号 G
按百分比转到相应的行 1~100%
按行卷动 Ctrl+e Ctrl+y
将光标所在行调整至页面中间 zz
统计字数 g Ctrl+g
显示位置信息 Ctrl+g
刷新屏幕 Ctrl+l

提示:gg 定位到文件首行, V 进入可视行模式, G 定位到文件末行,实现类似“全选”的功能。依次按下 g g V(Shift+v) G(Shift+g)

标记

您可以在当前光标处作一个标记,以便快速返回

m标记名称    定义标记。标记名称为一个字符
`标记名称    返回标记

mx           将当前光标处定义为标记 x
`x           返回标记 x

:marks       查看标记列表

编辑

复制 剪切
字符 y1 x
yy dd

1 需先在可视模式中选取

p 在光标后粘贴
P 在光标前粘贴
u 撤消
Ctrl+r 重做
Ctrl+y 逐字克隆上一行内容
Ctrl+e 逐字克隆下一行内容

搜索和替换

按下 / 键,编辑器底部会出现 / 符号,接着输入字符串,便可以进行搜索

/ 向下搜索 ? 向上搜索
n 搜索下一个 N 搜索上一个
:s/源字符串/目标字符串 将源字符串替换为目标字符串
:s/源字符串/目标字符串/g 替换当前行中所有符合条件的字符串
:行号1,行号2s/源字符串/目标字符串/g 在指定行中进行替换
:%s/源字符串/目标字符串/g 全文替换

正则表达式

第 26 章 正则表达式

寄存器操作

Vim 可以将不同字段剪切或复制到不同寄存器中,您可以从不同寄存器中取出内容后粘贴

"寄存器名称
  • 按下"键和另一个字符键,便可以定义一个寄存器。例如:"a "1

定义寄存器后直接进行操作

"ayy    将当前行复制到寄存器 a 中
"ap     将寄存器 a 中的内容粘贴到光标之后
  • :registers 查看所有寄存器的内容
  • 通常情况下,寄存器 + (先按",再按 Shift+= )对应 X 下的剪贴板。您在其它程序中复制的内容,可以使用 "+p 粘贴到 Vim中;您在 Vim 中,可以使用 "+y 将内容复制到剪贴板,再粘贴到其它程序中
  • 没有指定寄存器时,Vim 使用“无名寄存器”存储内容

您可以将一系列的操作录制为一个宏,然后执行它

q宏名称    开始录制宏。宏名称为一个字符
q         录制中按下“q”键,结束录制

@宏名称    执行宏
  • 可以使用 :registers(寄存器列表) 命令查看已记录的宏

插入模式下的快捷键

Ctrl+r寄存器名称 插入指定寄存器内容
Ctrl+k(2个字符) 输入二合字符
Ctrl+v数字 通过数字编码输入字符
Ctrl+v键位 输入键位的名称

键绑定、缩写

前面我们已经向您介绍了键绑定

map! <M-j> <Down>

尖括号及其中的内容,为 Vim 配置文件的约定,分别描述了按键和功能,表示将功能编写到按键上。如果绑定的只是普通字符,例如:

map! xxx XXXXX

表示将 XXXXX 绑定到 xxx 上。当您键入 xxx 时,编辑器会自动替换为 XXXXX

如果您只是想将字符串绑定为缩写,方便输入,我们建议您使用 iabbrev 来绑定。例如:

iabbrev g google

在插入模式下键入 g ,编辑器会自动替换为 google 。您可以将 iabbrev 命令缩写为 iab ,例如:

iab g google

以上命令,您可以直接在命令模式下输入,临时启用。也可以写入配置文件,永久启用。

单词补全

<Ctrl+n> 下一个匹配项
<Ctrl+p> 上一个匹配项

您可以在配置文件中定义补全的方式

"自动补全方式:(使用逗号分隔)
set complete=k,.

"   .    当前文件
"   b    已被装缓冲区,但是没有在窗口内的文件
"   d    在当前的文件中定义和由 #include 包含进来的文件
"   i    由 #include 包含进来的文件
"   k    由 dictionary 选项定义的文件
"   kfile    名为{file}的文件
"   t    标记(tags)文件
"   u    没有载入的缓冲区
"   w    在其他窗口中的文件

"设定自动补全字典 :
set dictionary=path

命令模式

前面介绍了普通模式和插入模式。我们发现,普通模式主要用来浏览和修改文本内容,而插入模式则用来向文本中添加内容。

而命令模式则多用于操作文本文件(而不是操作文本文件的内容),例如保存文件;或者用来更改编辑器本身的状态,例如设定多栏窗口、标签或者退出编辑器……

w(rote) 将更改写入文件

:w

q(uit) 退出编辑器

:q

某些情况下,编辑器会阻止命令的执行。例如您修改了文件,而没有保存,那么您使用 :q 命令退出时,编辑器就不会执行这条命令,而是提醒您保存文件。

这个时候,您可以在命令末尾追加 ! 来强制执行命令

:命令!

例如 :q! ,即便您没有保存已修改的文件,使用此命令,编辑器也会放弃修改而强行退出

! 引导一个 Shell 命令,则可以从 Vim 临时切换到 Shell 中,执行一个 Shell

:!命令

例如 :!ls

命令模式还可以用来调节一些选项,例如

:set linespace=6
  • 使用 Tab 键补全命令
  • 命令可以直接写入配置文件
  • 在选项后加上一个 & 使用默认值,例如: :set linespace&

折叠

zf数字 创建折叠,数字参数为折叠行数
zo 打开折叠
zc 关闭折叠
zd 删除折叠
:set foldcolumn=4 显示折叠树
:mkview 保存折叠
:loadview 读取折叠
zr 打开同一层级所有折叠
zm 关闭同一层级所有折叠
zO 打开某一行的所有层级折叠
zC 关闭某一行的所有层级折叠
zR 打开所有折叠
zM 关闭所有折叠
:set foldclose=all 光标离开折叠自动关闭
:set foldopen=all 光标遇到折叠自动打开

您可以在配置文件中定义折叠的方式

"设定折叠方式
set foldmethod=manual

" manual 手动折叠
" indent 按缩进折叠
" marker 按标记折叠
" syntax 按语法折叠
" expr   按表达式折叠

按标记折叠的例子:

#起始标记 **{{{** 将标记放到注释里,不会影响文件的功能 

起始标记和结束标记之间的内容折叠
显示为起始标记所在行
#结束标记 **}}}**
###### 将折叠方式写到模式行里 #####
# vim: foldmethod=marker

多栏窗口

您可以使用以下命令,将当前窗口水平分为两栏

:new

新建一栏空白窗口,将当前文件分两栏显示

:split

同理,您可以使用下列命令,将当前窗口垂直分为两栏

:vnew
:vsplit

先按下 ctrl+w 键,再按下方向键 jklh ,您可以切换到其它栏;在当前栏中使用 :q 命令,可以退出当前栏,也可以使用其它命令,对当前栏作出修改

如果您希望当前命令在所有栏中生效,您可以在命令的末尾追加 all

:命令all

例如::qall

如果您希望这条命令强制执行,那么 ! 位于命令的最末,例如::qall! 强行退出所有栏窗口

标签页

Vim 在7以后的版本,开始支持标签页的功能

:tabnew    新建一个标签
:tabnext   转到下一个标签
:tabprevious  转到上一个标签

您也可以使用鼠标点击标签进行切换

文件管理

使用 Vim 编辑目录时,会进入文件管理模式:

vim .

文件管理模式中可以实现一些简单的文件管理功能:

enter 打开文件或文件夹
Ctrl+o 后退
o 新开一栏进行编辑
O 在前一次打开的栏中编辑
p 预览
i 显示/隐藏文件大小、日期
s 切换文件排序方式
r 切换顺序、逆序
- 回到上一级目录
c 将 Vim 执行目录设定为当前目录
R 重命名
D 删除
x 运行
  • :cd 设定所有窗口执行目录 ; :lcd 设定当前栏窗口执行目录

加密

使用 :X 命令为文件设定一个密码

:X
Enter encryption key: ******
Enter same key again: ******
  • 如果要取消加密,可以设置密码为空

可以禁用交换文件,以免泄密

vim -x -n file.txt

如果你已在经编辑这个文件了,那么交换文件 swapfile 可以用下面的命令禁止:

:setlocal noswapfile

由于没了交换文件,文件复原就不可能了。为了避免失去编辑的成果,要比平时更勤快地存盘你的文件

现在你可以像平时一样编辑这个文件并把你所有的秘密放进去。当你编完文件要退出 Vim 时,这个文件就被加密存盘了

当你下次用 Vim 编辑这个文件时,它就会询问你密码

如果你试图用另一个程序来阅读这个文件,你将读到一堆垃圾。如果你用 Vim 来编辑这个文件,但输入了错误的密码,你也只能得到垃圾。Vim 并不具备检验密码正确性的机制 (这一点使得破译密码更为困难)

版本

在 Windows 平台下,请使用 gvim7ole 版本