实验 2 VIM 编辑器的使用

要跳过开头扯淡,往下拉直到看到分隔线。

我先给在座的各位说一句话:

你们这是自寻死路!

玩笑归玩笑。但是 VIM 的高起手是出了名的。因为最早的 vi 是基于远古编辑器 ed 的。有多远古呢?就是,当时 Unix 还是运行在大型机,大家都用热敏纸终端连接到大型机上进行操作。什么是热敏纸终端?就是,想象一个打小票的机器,但是里面装的是 A4 宽度的纸而且还带个键盘,这就是热敏纸终端。

所以没法从终端上读取字符——你甚至只能指定在第几列打字。ed 因而就没有所谓「可视化界面」,其一切编辑方式都是按照如下的交互式命令执行的( 为了便于区分,用户输入以 |< 开头,程序输出以 |> 开头,-- 后面是注释):

|<  a -- 进入追加模式
|<  ed 是标准的 Unix 编辑器
|<  这一行是第 2 行
|<  . -- 这个点结束输入模式,进入命令模式
|<  2i -- 这里的 2 表示移动到第 2 行, i 表示进入插入模式
|<  -- 空白行就是空白行,会插入到文件中
|<  . -- 这个点结束输入模式,进入命令模式
|<  ,l -- 这里的逗号表示选择所有行, l 表示打印行
|>  ed 是标准的 Unix 编辑器$ -- 行尾会由 $ 表示
|>  $
|>  这一行是第二行$ -- 我们之前插入了一个空行
|<  w file -- 写入到 file 文件中
|>  39 -- 写入的字节数
|<  q -- 退出

哦对了,热敏纸终端的打印速度很慢,所以程序的提示也是尽可能的简短。ed 的错误提示只有一种:?.

所以你知道你面对的是谁了。尽管 vim 已经改良了 vi, 而 vi 又改良了 ed, 但是它仍旧是脱不开这样晦涩的命令模式的——但是命令模式确实又很强大,所以并不能算是遗毒。

不过,反正还有 nano. 这个编辑器就比较新手友好了。所以如果你觉得自己可能无法掌握 vim, 你还可以换用 nano.

对了,emacs 不是编辑器,这是一个什么都很好但就是缺一个好用的编辑器的操作系统(手动滑稽)。


注意:本文中的按键格式遵循序言与排版约定中提及的按键格式一致。由于本文的特殊性,将不按照指导书中的顺序介绍 vim 所提供的功能。此处列出步骤所对应的编辑功能,善用 [@Ctrl][f][%Any].

  1. 启动 vim
  2. 查找与替换
  3. 查找与替换
  4. 查找与替换
  5. 查找与替换
  6. 查找与替换
  7. 查找与替换
  8. :g 命令
  9. 调用外部指令
  10. 从异常中恢复

安装 vim

vim 可以直接用包管理器安装。如果你不知道什么是包管理器的话,见扩展 1.4.

启动 vim

要启动 vim, 使用此命令:

$ vim <文件名?>

如果给定文件不存在,则会在保存时创建文件;如果给定的文件存在,则会打开该文件。

退出 vim

要退出 vim, 按 [Esc], 然后 [:][q][!][Enter]。如果你觉得 [Esc] 太远够不着,你也可以用 [^[ ], 这两个在大多数情况下是一致的。

这会丢弃对文件作出的任何更改,并退出编辑器。

理解 vim 的输入模式

在继续往下进行前,需要了解 vim 的三个主要模式。

vim 在启动时会进入命令模式(又称普通模式、正常模式、师范模式(误),英文为 Normal Mode)。在命令模式下不能打字,所有按键都会被视作命令输入。命令输入一般不会显示在屏幕上,除非是在冒号命令模式下(即先按 [:] 再打字的命令)。下文中提到的命令均为在该模式下输入的内容。

通过按下 [a], [i][o] 即可进入输入模式 (Insert Mode)。此时的输入将会视作对文件的修改。要回到命令模式,按 [Esc].

通过按下 [v] 即可进入可视模式 (或称光标模式,英文为 Visual Mode)。此时光标将进入高亮选中模式,可以通过方向键移动光标来选择文字。之后的输入将会视作对被选文字的操作命令。要回到命令模式,按 [Esc] 或者 [v]

导航和编辑

保存更改和丢弃更改

要保存更改,在命令模式下键入 :w[Enter]. 如果你在启动 vim 没有指定文件名,则使用 :w <文件名>[Enter] 保存到给定文件名。

要丢弃更改,在命令模式下键入 :q![Enter].

移动光标

在编辑模式下,你可以使用方向键来移动光标;在命令模式下,你不仅可以用方向键移动光标,你还可以用[h], [j], [k], [l] 移动光标,这四个键分别对应「左」、「下」、「右」和「上」。

使用字母移动光标的功能可以和其他编辑指令结合,来进行批量编辑操作。

移动到行

要快速移动到给定一行而不是疯狂地按方向键,使用命令 :<行号><Enter> 即可到指定行;或者使用 [G] 命令:直接输入行号,再按 [G] 。当 [G] 命令没有指定行号时,则直接移动到文件尾部。

使用 [$] 命令可以将光标快速移动到行尾, [0] 或者 [|] 命令可以将光标快速移动到行首。

要快速移动到文件头部(第一行最左侧),使用 [g][g] 命令。

光标处插入、光标处追加、新行插入、替换模式

虽然按下 [a], [i], [o], [R] (以及你随机按键试出来的其他奇怪的按键)都可以进入编辑模式,但是其行为是不一致的。这里我们介绍一些常用的进入编辑模式的方式及其行为。

  • [i] - 在光标处插入。abc|de[i] 后,打字内容将进入 cd 之间
  • [a] - 在光标之后插入。abc|de[a] 后,打字内容将进入 de 之间
  • [o] - 插入到新行。无论光标在哪个位置,在 [o] 后,均将在光标之下插入一行空行,并将光标移动到空行
  • [R] - 替换模式。在此模式下,打字将不会插入存在的内容而是覆盖内容,如在 abc|de[R] 后,打字内容将会覆盖 de

删除内容

可以使用 [d] 指令来删除内容。[d] 指令接受一个范围作为要删除的内容,其形式如下:

d<要删除的范围>

其中要删除的范围可以是如下形式:

  • [d] - 当前行
  • <数字>[G] - 删除从光标行到给定行
  • <数字?>[w] - 删除光标后的给定个单词,不指定数字则为 1 个单词
  • [Enter] - 当前行和下一行
  • <数字?>[j] - 当前行和下 n 行,不指定数字则为 1 行
  • <数字?>[k] - 当前行和上 n 行,不指定数字则为 1 行

删除的内容将进入内部剪贴板。

撤销编辑和重做编辑

[u] 可以撤销上一次编辑,反复按 [u] 可以撤销更早的编辑,直到上一次保存。

[@Ctrl][r][%Any] 可以重做下一次编辑,[@Ctrl] 再反复按 [r] 可以重做更晚的编辑,直到最晚作出的更改。

复制粘帖

在可视模式中,可以使用 [y] 复制高亮的内容。或者可以直接使用 [y] 命令,其格式如下:

y<要复制的范围>

这里要复制的范围的格式与要删除的范围的格式是一样的(见上文),此处不再赘述。

[p] 可以将内部剪贴板的内容粘帖到光标处。

查找与替换

要查找一个字符串或正则表达式,使用 [/] 命令。按下 [/] 后输入的内容即为需要查找的内容;要查找下一处,则输入 [/][Enter]. [/] 命令的查找方向是光标下一行以及之后的内容(向后查找),要查找光标上一行以及之前的内容(向前查找),则使用 [?] 命令,用法与 [/] 命令相同。

要高亮文件中所有匹配的项目,则使用此指令 :set hlsearch. 要关闭高亮,则使用 :nohlsearch.

要进行替换,则使用 [:][s] 命令。这个命令的语法如下:

:<范围选择子>s/<需要被替换的内容>/<替换内容>/<替换选项>

默认的范围选择子为当前行;需要被替换的内容则为一个正则表达式;替换内容是直白的;常用的替换选项如下:

  • g - 整行替换,而不只是替换第一个匹配内容
  • c - 替换前确认
  • i - 忽略大小写,当且仅当在非正则模式下可用
  • d - 删除匹配行

常用的范围选择子如下:

  • % - 整个文件
  • <数字>,<数字> - 从左侧数字开始到右侧数字,单位为行
  • '<.'> - 此处的尖括号不是参数,而是实际的尖括号,表示在可视模式下高亮的内容

注意到在查找与替换中,正则表达式的判别是自动的。这就意味着有些字符的判定是特殊的,具体而言包括 .[]()?*/\. 当要使用这些字符时,需要使用 \ 转义。

查找与替换命令均支持正则表达式。要了解正则表达式,见扩展 2.1. 虽然正则表达式是在实验指导书中明确要求的,但限于篇幅写入了扩展章节。

但是由于 vim 的限制,这里需要补充一点:如果要使用正儿八经的正则表达式进行匹配,则必须用 \v 开头(即启用超级魔法模式)之后跟表达式才可以正常使用。

:g 命令

[:][g] 命令具有十分多的功能。这里的 g 取自 grep, 其命令形式如下:

:<范围选择子>g/<要匹配的内容>/<要进行的操作>

此处范围选择子同查找与替换中提到的范围选择子,要匹配的内容支持正则表达式,要进行的操作有以下常用操作:

  • d - 删除匹配的行
  • m<数字?> - 移动匹配的行,如果不指定则默认为移动到文件尾部
  • t<剪贴板名?> - 复制匹配的行,如果不制定则为默认剪贴板
  • s/<子匹配内容>/<替换内容> - 在匹配的行内执行此替换指令

要进行反选,将 [g] 改为 [v] 即可对不匹配的行进行操作。

调用外部指令

[:][!] 命令可以调用外部指而不离开编辑器,其形式如下:

:!<要执行的命令>

这个命令将会在用户 Shell 中执行,工作目录继承 vim 的工作目录。

要将外部命令的输出插入文件,则可以使用 [:][r][e][a][d] 命令,其形式如下:

:read !<要执行的命令>

从异常中恢复

默认情况下,vim 会进行实时备份。如果编辑器或系统崩溃,未保存的工作不会完全丢失。

要从备份中恢复,启动 vim 时使用 -r 参数即可。vim 在启动时也会自动检查是否有尚未保存的工作,并提示是否恢复。

键盘功能图和常用功能参考

下图所示即为在命令模式下对应的各按键的功能。

vim.png

常用功能参考

参考资料

[1] Wikipedia. Learing the vi editor [EB/OL]. https://en.wikibooks.org/wiki/Learning_the_vi_Editor/Vim/Modes

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

推荐阅读更多精彩内容

  • 1. 关于Vim vim是我最喜欢的编辑器,也是linux下第二强大的编辑器。 虽然emacs是公认的世界第一,我...
    Dyworldhua阅读 1,352评论 0 2
  • Vim几句话介绍Vim是Unix系统上的文本编辑软件(你该不会不知道什么是文本编辑软件吧!),在windows上也...
    何必遠方阅读 3,121评论 0 3
  • 一.vi的基本概念文本编辑器有很多,图形模式下有gedit、kwrite等编辑器,文本模式下的编辑器有vi、vim...
    一线码农阅读 728评论 0 0
  • 命令历史 以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令。 启动vim 在命令...
    im蚂蚁阅读 30,719评论 3 48
  • 走自己的路,背后的是全世界。 我想迈开脚,却忘了我是一棵根茎密布的枯树。 身边的小草带着我的渴望,望着天空的方向攀...
    石凹叙年阅读 147评论 0 0