Linux --- vim 常用操作

1、vim 的三种模式

vim(visual interface improve) 是 vi 的升级版本,也是 linux 中最常见的一种交互式文本编辑器。

三种模式之间的切换如下图所示:

image

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 的文件。

有时候当你打开一个文档,发现会有如下提示时
这个提示分成三部分

  1. 提示发现一个临时文件,以及对临时文件基本情况的一个概述
  2. 介绍了出现这种情况的两种原因
  3. 提供了一些处置选项
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。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容