1、vim 的三种模式
vim(visual interface improve) 是 vi 的升级版本,也是 linux 中最常见的一种交互式文本编辑器。
三种模式之间的切换如下图所示:
2、vim 的常用操作
下面分别介绍一下vim各个模式的常见操作:
2.1、一般模式(normal mode)
当使用 vim /path/file_name
打开一个文件后,首先见到的就是一般模式(normal),在这个模式下,可以进行文本的复制,粘贴,删除等操作。
在一般模式下,可以使用键盘来控制光标的移动,下面是我在工作中常用的一些按键,掌握了这些,可以大大加快你使用 vim 编辑的速度。
表1:光标移动
按键 | 说明 |
---|---|
k(↑)、j(↓)、h(←)、k(→) | 光标以字符为单位,上下左右移动 |
w | 光标以单词为单位,移动到下一个单词的词首 |
0 | 光标以行为单位,移动到光标所在行的行首 |
$ | 光标以行为单位,移动到光标所在行的行尾 |
ctrl+f | 光标以屏幕为单位,向下翻一屏 |
ctrl+b | 光标以屏幕为单位,向上翻一屏 |
gg 或 1G | 光标以文档为单位,移动到文档开头 |
光标以文档为单位,移动到文档结尾 | G |
在一般模式下可以对文件进行复制、粘贴、删除操作。
表2:编辑操作
按键 | 说明 |
---|---|
y | 复制光标选中的内容 |
p(大P正好是相反,在光标所在行的上面粘贴) | 在光标所在行的下一行,粘贴所选择的内容 |
x(大X的使用效果与backspace相同) | 以字符为单位,删除光标所在处的一个字符 |
d | 删除光标选中的内容 |
当你在 windows 上面,习惯了使用鼠标进行选中时,一下子使用 vim 可能会有不习惯的地方。其实在 vim 中也有类似鼠标选择的功能,而且相较于 windows 上面常见的选择功能可能更加强大。
表3:选中
按键 | 说明 |
---|---|
v | 以字符为单位,光标经过的地方都会被选中 |
shift+v | 以行为单位,光标经过的地方都会被选中 |
ctrl+v | 以列为单位,光标经过的地方都会被选中 |
在 vim 中也有类似 word 中的撤消,恢复等功能
表4:撤消、恢复、重复
按键 | 说明 |
---|---|
u | 撤消上一个动作 |
ctrl+r | 恢复上一个动作 |
. | 重复上一个动作 |
2.2、编辑模式
那当我需要添加一些内容的时候呢,这个时候要以通过以下方式,进入编辑模式。编辑模式有两种一种是插入模式(insert),别一种是改写模式(replace)。改写模式我除了做实验,在生产中从来就没有用过,这边就暂时不列出来了。
表5:进入或退出编辑模式
按键 | 说明 |
---|---|
i(insert) | 以字符为单位,在当前光标所在处进行输入 |
a(append) | 以字符为单位,在当前光标处退后一个字符输入 |
I | 以行为单位,在当前光标所在行的行首输入 |
A | 以行为单位,在当前光标所在行的行尾输入 |
o(open) | 在当前光标所在行的下一行,打开一个新行输入 |
O | 在当前光标所在行的上一行,打开一个新行输入 |
Esc键 | 返回编辑模式 |
2.3 命令模式
当我要对文档内容进行一些查找,替换,保存,退出或临时更改 vim 的属性时,就要使用命令模式,它通常使用 :(冒号)
、/(斜线)
、?(问号)
三种方式进入,而使用 Esc 键返回编辑模式。
下面就介绍一些命令行模式下常用的操作:
注:
以下内容中,如果是用:(冒号)进入的命令模式,那介绍时冒号我就省略了。
表6:查找与替换
按键 | 说明 |
---|---|
/string 使用n(next)代表查找下一个,N代表查找上一个,下同。 | 以光标所在处,向下查找字符串string |
?string | 以光标所在处,向上查找字符串string |
/pattern/ | 使用正则表达式进行模糊匹配 |
n1,n2s/pattern/string/g 如果不加g(global)那么默认只会替换每行查找到的第一个,符合pattern的内容 | 在n1~n2行之间查找,符合模式pattern的内容,并将其替换成字符串string |
1,$s/pattern/string/g;%s/pattern/string/g 两者是等效的,随便用哪个 | 全文替换,有两种表达方式 |
n1,n2s/pattern/string/gc;c(confirm) | 在替换前进行询问确认 |
表7:保存、退出等
按键 | 说明 |
---|---|
w | 对编辑的内容进行保存 |
w file_name | 将当前文档另存为file_name |
w! | 强制保存,当编辑一些只读文件时,需要用到这个 |
q | 退出关闭vim |
q! | 放弃所有编辑,并强制退出 |
x | 保存编辑并退出 |
!command | 在vim中执行bash命令 |
r file_name | 在已经打开一个文件后,还想在当前vim中再打开其它文件,这个功能我很少用,我一般使用下面要介绍的多窗口编辑,两种方式无优劣之分,更多的是使用习惯上的区别。 |
命令模式中可以临时设置 vim 的属性,我常用的有以下几个,更多的内容可以自行查看 vim 的 help 文件或 Google,如果不想每次都进行更改,可以将其写到 vim 的配置文件中。
注:
不推荐直接修改 vim 的默认配置文件 /etc/vimrc 建议在用户的家目录新建 .vimrc 文件,将自己个性化配置记录其中。
表8:临时设置vim的属性
按键 | 说明 |
---|---|
set nu/nonu | 显示或关闭行号 |
set hlsearch/nohlsearch | 打开或关闭搜索结果高亮显示 |
set syntax on/off | 打开或关闭语法着色 |
help | 打开vim的帮助文件 |
到此 vim 一些常见的基础操作就介绍完了,附录为 vim 的多窗口操作。
而 vim 操作的一大特色就是可以进行组合操作,比如说保存退出,可以这样做 :wq
;再比如,我想把1到10行全部删除,可以这样做 :1,10d
,更多的组合操作,就期待大家在实践中慢慢发现了
附A:vim 的多窗口操作
表9:常用分屏操作
按键 | 说明 |
---|---|
sp filename | 用水平分屏的方式打开新文件 |
vsp filename | 用垂直分屏的方式打开新文件 |
ctrl+w+[k(↑)/j(↓)/h(←)/k(→)] | 光标上下左右移动 |
附B:vim使用环境配置
vim的编码设置
vim的全局环境变量的配置文件是 /etc/vimrc,但一般不建议修改这个配置文件,而是在自己用户家目录,新建 .vimrc
文件,在该文件中定义自己个性化的需求。
当我们需要在 windows 与 linux 之间来回复制文件时,因为 windows 默认使用的编码规则是 cp936(基本等同于GBK),而 linux 通常使用的是 utf-8 进行编码。所以常常会出现乱码的情况,为了尽量避免这种情况的发生,我们就需要对 vim 的默认编码环境进行设置。
在 vim 中与字符编码相关的有四个变量,与今天我们配置相关的,主要有两个:fileencodings 和 fileencoding
下面分别对这四个编码变量做个简单说明:
encoding: vim 的内部使用的编码规则,vim 内部所有的 buffer,寄存器,脚本中的字符串等都会使用这个编码。通常我们使用的是 utf-8,并且不建议去修改这个值。当一个文件的编码与 encoding 不一致时,vim 会先将文件编码转换成内部编码,文件中含有没有办法转换成内部编码的字符时,这个字符就会丢失。
termencoding: 是 vim 用于屏幕显示的编码,在显示的时候 vim 会把内部编码转换成显示编码,如果内部编码含有无法转换成屏幕编码的字符时,就会以 ? 号显示。但不会出现字符丢失的情况。
fileencodings: 是一个以逗号分隔的列表,列表的每一项就是一种编码的名称。当 vim 打开一个文件时,会依次用 fileencodings 中的编码方式进行解码,如果解码成功的话,就会用这种方式进行解码,并将 fileencoding 设置为这个值。如果不成功,就继续试验下一个编码方式。如果全不成功的话,默认会用最后一种解码方式对文件内容进行解码。
注:
通常情况下,使用了错误的解码方式,就会造成乱码,为了尽量的避免这种情况发生。
推荐值为:
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1
- fileencoding: vim 在读取文件时,会对文件内容的编码规则进行探测,当现文件编码规则与 encoding 不一致时,就会调用 fileencodings 来尝试解码。当解码成功后,会设置 fileencoding 的值,这个值按我的理解就是一个标识,用于文件编辑完成后存盘时使用。将内部编码转换成 fileencoding 标识的编码后,进行存盘。
vim 是调用外部命令,iconv 来实现编码之间的转换。如果你想手工转换文件的默认编码方式,也可以通过 iconv 来进行。具体的使用方法要以 man 一下。
注1:
只有在对文件正确解码的前提之下,对文件转码才有意义。也就是说,当你已经打开了一个文件,发现文件内容是乱码,这个时候,你通过设置 fileencoding 这个值,是没有办法纠正乱码的。
注2:
如果你不想每次手工设置 vim 环境变量的话,也可以将其写入配置文件,永久保存。除了上面提供的,还有许多可定制的选项,建议自行通过 help 文件,研究一下。
注3:
vim windows 版本初始化:
syntax on
set nobackup
colorscheme darkblue
set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1
附C:vim 的临文件
在使用 vim 编辑一个文件时,vim 会在被编辑文件所在的目录下面,新建一个名为 .file_name.swp 的文件。
有时候当你打开一个文档,发现会有如下提示时
这个提示分成三部分
- 提示发现一个临时文件,以及对临时文件基本情况的一个概述
- 介绍了出现这种情况的两种原因
- 提供了一些处置选项
E325: ATTENTION
Found a swap fileby the name ".vimrc.swp"
owned by: root dated: Sun Aug 3 19:04:49 2014
filename: ~root/.vimrc
modified: no
user name: root host name: localhost.localdomain
process ID: 4344 (still running)
While opening file".vimrc"
dated: Sun Aug 3 12:41:39 2014
(1) Another program may be editing the same file.
If this is the case, be careful not to end up with two
different instances of the same filewhen making changes.
Quit, or continuewith caution.
(2) An edit session forthis filecrashed.
If this is the case, use ":recover"or "vim -r .vimrc"
to recover the changes (see ":help recovery").
If you did this already, delete the swap file".vimrc.swp"
to avoid this message.
Swap file".vimrc.swp"already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort:
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort:
两种情况生成的处置项菜单也是有区别的,第二种情况会多一个 delete 选项
- 对于第一种情况,有其他人或程序也在编辑同一个文件,为保持数据的一致性,最好是选择以只读方式打开,或者干脆就直接退出,等其他人使用完成后,再来编辑。
- 对于第二种情况,由于编辑器崩溃引起,如果你想恢复到崩溃前的状态,可以选择recover。如果你确定这个临时文件已没有用了,可以选择delete。当然你可以直接选择edit。