Linux【4】-文本编辑1-vim

目前老被嫌弃慢,既然存在这个情况,就得找原因啊,其中有一个原因就是快捷键用的不是太熟。那好,就一个个的解决罗,今天先来了解一下vim的快捷键。

更多vim用法,请参考: http://c.biancheng.net/linux_tutorial/40/

在讲技术之前,有必要给大家介绍一下 Vi 和 Vim 的发展史,从而更全面地了解 Vi 和 Vim。

Vi 的历史非常悠久,可以追溯到 1976年,那时,一个叫作 Bill Joy 的美国兄弟编写了一款行编辑器工具,叫 ex,在当时非常的出名。但是,经过对用户行为的观察,Joy 发现人们更愿意使用 ex 的可视化模式,而非行编辑模式。因此,Joy 决定在 1979 年发布 Vi 这款编辑器,直接把可视化模式(Visual Mode)呈现给用户。正是这个决定造就了今天家喻户晓的 Vi 编辑器。而 Joy 后来成为了 Sun 公司的创始人之一,并担任公司首席科学家直到 2003 年。

虽然 Vi 历史悠久,但是要说群众基础,还是 Vim 更胜一筹。Vim 是由一位荷兰牛人开发的可视化文本编辑器。起初,他对 Vim 的定位并不高,从他给这款产品命名 Vi IMitation 就能看得出来。而后来由于加入的特性越来越多,也越来越受到人们的喜爱和欢迎,因此他也顺势将 Vim 的名字全称改为了 Vi IMproved,意为 Vi 的增强版本,看来英文也是博大精深啊。

这位开发了 Vim 的荷兰人,叫作布莱姆·米勒(Bram Moolenaar),他不仅一直在不计酬劳地为开源事业做着贡献,而且还持续资助乌干达改善儿童教育和医疗水平。同时,他还是一个相当有趣的人,在他的个人主页上,他用数十种语言写出了他的名字“米勒”。

说到 Vim 与 Vi 的关系,可以确定的是 Vi 的所有功能几乎都已经囊括到了 Vim 中,同时 Vim 较 Vi 的优势和亮点也是不胜枚举的,比如:

  • Vim 支持更多语言的语法高亮。
  • Vim 支持更多的操作系统和平台,包括 UNIX/Linux、Windows、MAC 等。
  • Vim 支持强大的插件功能。
  • Vim 支持通过 SSH/HTTP 方式的远程文本编辑功能。
  • Vim 支持多层级的 undo 和 redo。
  • Vim 可以直接编辑压缩包(gzip、bzip2、zip)中的文件。

如果套用一句苹果的广告语,那就是:“唯一的不同,是处处都不同!”

由于 Vim 使用的广泛性,本文下面内容中出现的 Vi 都是指代 Vim。

一、vim简介

1.安装

在一般情况下,无论何种 Linux 发行版本都是包括 Vim 的,并且在默认会安 装它。当然,万一你的主机上还没安装 VIM,请输入如下命令安装它。

[root@localhost ~]# yum install vim

2.运行 vim

[root@localhost ~]# vim file.txt

无论是哪个 Linux 发行版本,这条命令都会让 Vim 创建名为 file.txt 的文件。 这是个新的文件,所以你会看到一个空白的窗口。如果这个文件已经存在,那么 vim 将会打开这个文件。

3.配置

终端输入:

vim ~/.vimrc

然后把下面的语句加进去

set nu #显示行号
syntax on #语法标亮
#自动缩进
set cindent
set autoindent

我的配置:
set nu
set autoindent
syntax on
set cindent
set smartindent
set expandtab
set smarttab
set mouse=a

set tabstop=4
set shiftwidth=4
set softtabstop=4

set backspace=2
set textwidth=79

我后来没怎么用vim来写代码,所以简单的设置了一下,后面有需要再来补充,详见下面的参考资料

二、vim的编辑

2.1 vim 模式

Vim 是一个模式编辑器,也就是 vim 会根据所处的模式对不同行为作出不同 反应。

  • 一般模式(NORMAL)会在屏幕的底部显示文件名或者是空白;
  • 在输入模式,底部会显示 –INSERT–;
  • 在可视模式,底部显示的是–VISUAL–。

在打开 vim 时默认处于一般模式。

2.2 输入

要输入文字,你要让编辑器进入输入模式。按下 i 键,接着你会发现屏幕左 下方的文字变成了 –INSERT–(意味着编辑器进入了输入模式)。 现在输入一些文字。这些文字会被输入到文件中。不用怕出错,过一会儿你 就可以改正它们了。输入下面这首程序员的打油诗: 命令序列 错误!文档中没有指定样式的文字。-1

输入完,按下键,–INSER–消失了,编辑器又回到了命令模式。此 时你的屏幕应该跟下图相似。

Vim 用户常见的一个问题就是被编辑器的模式所困扰。这常常是因为 不清楚编辑器处在哪个模式,又或者不知道按下了哪个键导致编辑器 进入了另外一个模式引起的。事实上,无论编辑器当前在什么模式, 按下 Esc 键,它都会回到一般模式。有时需要按两次,如果 Vim 以一声蜂鸣回答你,那说明你已经是在一般模式了

默认情况下,vim 里面的文字不会自动换行。如果你不按回车键而一 直不停地输入文字直到它们到了编辑器的右边栏,你所做的只是输入 了非常长的一行文字,vim 不会为你自动换行。要换行的话,你必须 按下回车键(这是正常模式的操作,可以通过配置 vim 来要求 vim 给 你自动换行,不过如何配置在我们的课程中没有提到)。

  • h 的鍵位于左邊,每次按下就會向左移動。
  • l 的鍵位于右邊,每次按下就會向右移動。
  • j 鍵看起來很象一支尖端方向朝下的箭頭。
  • k朝上移动。

0是行首,$是行尾

  1. 請按鍵(這是為了確保您處在正常模式)。
  2. :q! <回車>不保存退出。
  3. :wq <回車>保存并退出。

按下 i 鍵來插入文本。

輸入 dw 可以從光標處刪除至一個單字/單詞的末尾

 w - 從當前光標當前位置直到單字/單詞末尾,包括空格。
 e - 從當前光標當前位置直到單字/單詞末尾,但是 *不* 包括空格。
 $ - 從當前光標當前位置直到當前行末。

各种插入模式:

a → 在光标后插入
o → 在当前行后插入一个新行
O → 在当前行前插入一个新行
cw → 替换从光标所在位置后到一个单词结尾的字符

2.3 删除一行或多行

.輸入 dd 可以刪除整一個當前行。
.輸入 dd 可以刪除整一個當前行。

通过退格键(Backspace)来删除一行代码显然是太麻烦了。可以通过切换到正常模式(编辑模式下按 ESC 键)来进行操作:

dd : (输入两次 d,下同)删除当前行;5dd :删除当前行开始的5行; dG :(先输入d,然后按 shift 键输入 g)删除当前行至最后一行的所以行。

2.4 复制粘贴一块代码

你可能经常需要复制一行或一大块代码,使用 Vim 快捷键来实现此功能是非常简单的:

按 Esc 切换到正常模式;
把光标移到你需要复制的代码行首;
按 V 选择整行,可移动光标选择多行;
按 d 剪切或按 y 复制选择的代码;
移动光标到你需要粘贴的位置,按 p 粘贴代码到光标后的位置,或按 P 粘贴到光标前。

2.6 保存退出

你可以使用“:wq”命令来退出 vim。这个命令会将修改的文件写回硬盘然后 退出。如果你输入了“:wq”,你的修改会被提交而且不可以进行撤销和重复操作, 然后退出 vim。这个命令有三个部分:冒号(:),它会让编辑器进入命令模式; 命令 w,它告诉编辑器保存文件;命令 q,它告诉编辑器退出程序。 某些时候,你可能会在你改了一大堆东西后,突然意识到你就不应该修改这 个文件。不用担心,vim 有一个“退出然后放弃所有修改”的命令。它就是“:q!”。 这个命令同样有三个部分:冒号(:),它会让编辑器进入命令模式;命令 w,它 告诉编辑器保存文件;命令 q,它告诉编辑器退出程序;然后是强制命令修饰符 ——感叹号(!)。感叹号是必须的,它告诉 vim 无需保存文件。 我们也可以通过“ZZ”也即“Shift+z+z”命令来退出 vim,如果文件作过改 动“ZZ”命令就保存文件并退出 vim,如果文件没有作过改动“ZZ”命令就直接 退出 vim。

2.9 帮助

在最后,还有一个重要的命令要提到——帮助命令。要获取帮助,输入“:help”

或者按下 F1 键。

:help 会显示一个帮助的概览窗口。在帮助文档中可以使用 vim 的全部命令。 因此,按下 h、k、j 和 l 会向左、上、下、右移动。同样可以通过“zz”退出帮 助文档。 帮助文档中有些文字是被竖线封闭的(例如|usr_01.txt|)。它表示的是这个文 字是一个链接。如果你将鼠标放在两个竖线的中间然后按下 CTRL+](跳到该标 签),可以进入相应的主题3。可能在跳了几次后,你可能想要回到原来的位置。 CTRL+T(弹出标签)将你带回到之前的屏幕。 如果要完整地获取某个主题的帮助,使用

2.6 代码注释

代码注释:

按 Ctrl+v 切换到可视化模式;
移动光标(j 或 k)选中需要注释的行的开头;
按大写 I,然后输入注释符,如 #;
最后按 Esc。

取消注释:

按 Ctrl+v 切换到可视化模式;
按 j 或 k 选择要删除的注释符;
按 d 或 x 删除注释符

如果使用 // 符号注释,则取消注释时需进行两遍操作。

翻页

Ctrl+f 向下翻页,Ctrl+b 向上翻页

2.7 搜索

搜索在很多时候都是一个非常重要的功能。在文件中搜索一个特定的词,可以切换到正常模式,然后输入斜线( / ),之后跟上要搜索的词,回车即可。

/word-to-be-searched

按 n 显示下一个搜索结果,按 N 显示上一个搜索结果。

2.8 把外部文件读入 Vim

我开始使用 Vim 的时候,经常会打开一个文件、复制内容、关闭文件、打开另一个文件、然后粘贴进去复制到内容。其实 Vim 中读取另一个文件的内容非常方便。切换到正常模式,然后按 :read。使用此快捷键你不需要手动打开文件来复制内容。

:read readme.md

2.9 把命令的结果读入 Vim

有时候你需要把某个命令的结果复制到 Vim 中,这在 Vim 也非常简单。切换到正常模式,然后输入 :read !command 即可把 command 的结果输入到 vim 中。

:read !ls -l

2.10 切换到上次修改的位置

想知道你在文件中做的最后一次修改是在什么位置?切换到正常模式,输入 g; 来即可切换到上次修改的位置。

2.11 移动到文件顶部或底部

当需要移动到文件顶部或底部时,通过 j 或 k 来一行行的移动显得有点麻烦。Vim 提供了一个快捷键可直接实现此功能。切换到正常模式,输入 gg 返回文件顶部,输入 G 返回文件底部。

三、案例详解

接下来,我们来完成一个稍稍复杂一点的任务,当然这个任务也将涉及到vim更加高级的一些命令。我们要完成的任务是这样的:

  1. 请在 /tmp 这个目录下建立一个名为 vimtest 的目录,进入 vimtest 这个目 录当中,将 /etc/man.config 拷贝到本目录底下,使用 vim 打开这个文本文 件;
  2. 在 vim 中设定一下行号;
  3. 移动到第 58 行行首,再向右移动 30 个字符,移动到第 8 行行尾,再向左 移动 3 个单词;
  4. 移动到第一行行首,并且向下搜寻一下『 man 』这个字符串;
  5. 将 50 到 100 行之间的 man 改为 MAN,并且一个一个挑选是否需要修 改
  6. 复制 51 到 60 行这十行的内容,并且贴到最后一行之后;
  7. 删除 11 到 30 行之间的 20 行;
  8. 去第 29 行首,并且删除 15 个字符;
  9. 修改完之后,突然反悔了,要全部复原;
  10. 将这个文件另存成一个 名为 man.config.bak 的文件;
  11. 在最后一行后插入错误!未找到引用源。中所示的字样,并保存;
  12. 在不关闭 man.config.bak 的文件情况下,再次打开 man.config;
  13. 将步骤 11 中在 man.config.bak 中输入的字样的第 1 列到第 10 列拷贝并粘 贴到 man.config 中;
  14. 储存两个文件后离开 vim。

3.1 打开文件

[root@localhost ~]# mkdir /tmp/vimtest
[root@localhost ~]# cd /tmp/vimtest
[root@localhost ~]# cp /etc/man.config .
[root@localhost ~]# vim /tmp/vimtest/man.config

3.2 设置行号

用“:set nu”命令来设置行号,设置后应如下所示,

可以用“:set nonu”来取消行号设置。

3.3 移动

用“数字+移动方向”来进行快捷移动,如我们可以用“3j”来从当前行向下 移动 3 行,也可以用“数字+G”或者“数字+$”指定移动到某行行首或者行尾, 如我们可以用“3G”来移动到第 3 行行首。

  • 用“gg”移动到首行行首,再用“57j”移动到第 58 行行首;也可以使用“58G”直接移动到第 58 行行首;
  • 用“40l”向右移动 40 个字符;
  • 用“7G”移动到第 7 行行首,用“$”移动到本行行尾,“3b”向左移动3 个单词。

vim 移动命令

命令键 命令用途
h 或 (←) 光标向左移动一个字符
j 或 (↓) 光标向下移动一个字符
k 或 (↑) 光标向上移动一个字符
l 或 (→) 光标向右移动一个字符
[Ctrl] + [f] 屏幕『向下』移动一页,相当于 [Page Down]按键(常用)
[Ctrl] + [b] 屏幕『向上』移动一页,相当于 [Page Up] 按键(常用)
[Ctrl] + [d] 屏幕『向下』移动半页
[Ctrl] + [u] 屏幕『向上』移动半页
0 光标移动到这一行的最前面字符处 (常用)
$ 光标移动到这一行的最后面字符处(常用)
H 光标移动到这个屏幕的最上方那一行
M 光标移动到这个屏幕的中央那一行
L 光标移动到这个屏幕的最下方那一行
G 光标移动到这个文件的最后一行(常用)
gg 光标移动到这个文件的第一行 (常用)
< Enter> 光标向下移动 1 行(常用)
w 光标向右移动 1 个单词;到下一个单词的开头。
b 光标向左移动 1 个单词
e 到下一个单词的结尾。

NG → 到第 N 行 (陈皓注:注意命令中的G是大写的,另我一般使用 : N 到第N行,如 :137 到第137行)

其中 h、j、k、l、$、、G、w、b 均可以与数字组成组合键,如 “30j”表示向下移动 30 行,30G 表示移动到本文件的第 30 行。

在当前行上移动光标: 0 ^ $ f F t T , ;

0 → 到行头
^ → 到本行的第一个非blank字符
$ → 到行尾
g_ → 到本行最后一个不是blank字符的位置。
fa → 到下一个为a的字符处,你也可以fs到下一个为s的字符。
t, → 到逗号前的第一个字符。逗号可以变成其它字符。
3fa → 在当前行查找第三个出现的a。
F 和 T → 和 f 和 t 一样,只不过是相反方向。
还有一个很有用的命令是 dt" → 删除所有的内容,直到遇到双引号—— "。

3.4 查找替换

  • 用“gg”移动到首行行首,用键入“/man”来查找“man”字符串,用 “n”和“N”来遍历所有的“man”字符串;
  • 用“:50,100s/man/MAN/gc”来用 MAN 替换 50 到 100 行之间的 man, vim 会逐个在替换前询问你是否替换。

vim 查找和替换命令

命令键 命令用途
a b
/word 从光标所在往下查找一个名为 “word” 的字符串。如要在文件内查找“man”这个字符串,就输入/man (常用)
?word 向光标所在往上查找一个名为 “word” 的字符串。
n 表示重复前一次查找。如果刚刚我们执行 /man 去向下查找“man”这个字符串,则按下 n 后,会向下继续查找下一个名为“man”的字符串“。如果是执行 ?man 的话,那么按下 n 则会向上继续查找名为“man”的字符串
N 表示“反向”执行前一次查找。 例如 /man 后,按下 N 则表示从光标处向上查找 “man” 。
:n1,n2s/word1/word2/g n1 与 n2 为数字。在第 n1 与 n2 行之间查找word1 这个字符串,并用 word2 来替代,例如在100 到 200 行之间搜寻 man 并取代为 MAN 则可以写作:“:100,200s/man/MAN/g”。(常用)
:1,$s/word1/word2/g 在整个文件中查找 word1 这个字符串,并用word2 来替代(常用)
:1,$s/word1/word2/gc 在整个文件中查找 word1 这个字符串,并用word2 来替代,且在取代前显示提示字符给使用者确认 (conform) 是否需要取代!(常用)

在 Vi 的普通模式下,先输入冒号(:),进入命令行模式,这是 Vi 做一切替换操作的前提。

假如我们想将 abc 替换为 xyz,那么就这样:

:s/abc/xyz/

不过要特别注意,这个替换没有你想象得那么顺利,因为它只能针对光标当前所在行进行替换,而且更糟糕的是,它只替换当前行中第一个匹配到的 abc。

举个例子,如果此行内容为“I write abc,I read xyz and abc.”。那么替换后的结果为“I write xyz,I read xyz and abc.”。

接下来,我们的改进方案来了,请注意,我们在替换命令的最后面加上了 g 这个字母:

:s/abc/xyz/g

这样可以实现在光标所在行,对所有匹配到的 abc 都替换为 xyz。继续举这个例子,如果此行内容为“I write abc,I read xyz and abc.”。那么替换后的结果为“I write xyz,I read xyz and xyz.”。

可惜的是,这个方案仍局限在光标所在行,还是无法替换文件中所有行中的 abc。所以,我们的方案继续改进,我们在替换命令的最前面加上了“1,$”的表达式:

:1,$s/abc/xyz/g

其实我们可以在替换命令的最前面加上类似“m,n”格式的表达式,来表示替换动作所能影响到的行范围,1 表示第一行,$ 表示最后一行。当然你也完全可以指定其他行范围,比如,10,50s/abc/xyz/g 就表示只替换第 10 行到第 50 行中的 abc。

在这里再教你一个小技巧,如果你想做全文替换,写 1,$ 要三个字符,而用 % 来代替,只需要一个字符,所以我们的替换命令可以改写为:

:%s/abc/xyz/g

转义替换

如果想将当前行里所有的“S.”替换为“S->”,就需要用到转义符了,正确的写法是这样的:

:s/S\./S->/g

我们假设当前行的内容是:

S.abc and S->bcd and S.aaa and S..abc

替换后会变为:

S->abc and S->bcd and S->aaa and S->.abc

此处因为点号“.”为特殊匹配符,在正则中表示单个字符,所以如果想匹配点号,就需要把“\”放在点号前面,表示取消点号的特殊意义。

连间隔符都可以改变

如果你要匹配和替换 “http://roclinux.cn/index.php” 这样一个 URL,你会发现这很麻烦,正确的写法会吓到你,来看一看:

:%s/http:\/\/roclinux\.cn\/index\.php/https:\/\/www\.baidu\.com/index\.php/g

看都看晕了,里面好多的正斜线“\”和反斜线“/”啊,真是一个反人类的替换表达式。

为了保护人类,Vim 允许我们自定义间隔符,比如我们可以用 # 来替换/,如 s/abc/xyz/ 可以替换为 s#abc#xyz#,或者 s!abc!xyz!都是可以的。

我们再次来改良一下上面那个反人类的替换表达式吧:

:%s#http://roclinux\.cn/index\.php#https://www\.baidu\.com/index\.php#g

最复杂的压轴

如果我希望在含有日期格式(XXXX-XX-XX)的字符串两侧加上一对单引号,即 2008-07-01 变成‘2008-07-01’,应该如何写这个替换表达式呢?

之所以举这个例子,是因为我们可以通过这个例子学到好几个重要的技巧,大家清醒一下头脑,我们一起攻克这最后一个难题。

例如,原来文件内容为:

aaa 2008-07-01 bbb
ccc 2008-07-12 aaa

我们需要用下面的替换命令来实现加引号的效果:

:1,$s/\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\)/'\1'/g

替换后为:

aaa '2008-07-01' bbb
ccc '2008-07-12' aaa

这个替换命令比较复杂,我们要逐步解释一下,这里面共涉及了三个知识点:

  • 第一个知识点:[0-9] 表示 0 到 9 之间的任一个数字,这是正则中表示数字集合的标准写法。
  • 第二个知识点:{n} 表示将此符号前面的元素重复 n 遍,所以 [0-9]{4} 就表示一个四位数的数字。
  • 第三个知识点:如果在匹配方案中用到了(),则表示要暂存括号中所匹配到的内容,而 \1 表示替换为暂存的内容(题外话:如果存在多个括号组,则后面要通过编号来依次对应,如 \1、\2、\3 等)。在本例中,我们匹配的是 2008-07-01,那么加了括号后就会被暂存起来,而在后面的 \1 处就会被替换过来,外面再加一对引号,就完成了!

3.5 复制粘贴

  • 用“50G”来到文本的第 50 行,再用“10yy”复制 51 行到 60 行;
  • 用“G”来到文件的最后 1 行,再用“p”进行粘贴。

vim 复制和粘贴命令

命令键 命令用途
yy 复制游标所在的那一行(常用)
nyy n 为数字。复制光标所在的向下 n 列,例如 20yy 则是复制20 列(常用)
p, P p 为将已复制的数据在光标下一行贴上,P 则为贴在游标上一行! 举例来说,我目前光标在第 20 行,且已经复制了10 行数据。则按下 p 后, 那 10 行数据会贴在原本的 20行之后,亦即由 21 行开始贴。但如果是按下 P 呢? 那么原本的第 20 行会被推到变成 30 行。 (常用)

3.6 删除

  • 用“10G”来到文本的第 10 行,再用“20dd”复制 11 行到 30-行;
  • 用“29G”来到文本的第 29 行首,再用“15x”删除 15 个字符。

vim 删除命令

命令键 命令用途
x, X 在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用)
nx n 为数字,连续向后删除 n 个字符。举例来说,我要连续删除 10 个字符, 『10x』。
dd 删除游标所在的那一整列(常用)
ndd n 为数字。删除光标所在的向下 n 列,例如 20dd 则是删除 20 列 (常用)

3.7 撤销和重复

  • 用“u”来撤销直到所有操作都被恢复(或者直接用“:e!”来恢复);

vim 撤销和重复命令

命令键 命令用途
u 撤销前一个动作。(常用)
[Ctrl]+r 重做上一个动作。(常用)
:e! 将文件还原到最原始的状态

3.8 打开、保存和退出

  • 用“:w man.config.bak”将文件另存;
  • 用“i”切换到编辑模式,将错误!未找到引用源。中所示的字样输入,用“w” 保存;

vim 打开、保存和退出命令

命令键 命令用途
:w 将编辑的数据写入硬盘档案中(常用)后接保存的地址
:w! 若档案属性为『只读』时,强制写入该档案。不过,到底能不能写入, 还是跟您对该档案的档案权限有关啊!
:q 离开 vi (常用)
:q! 若曾修改过档案,又不想储存,使用 ! 为强制离开不储存档案。
:wq 储存后离开,若为 :wq! 则为强制储存后离开 (常用)
ZZ 若文件没有更动,则不储存离开,若文件已经经过更动,则储存后离开
:w [filename] 将编辑的数据储存成另一个文件(类似另存新文件)
:r [filename] 在编辑的数据中,读入另一个文件的数据。亦即将『filename』 这个档案内容加到游标所在行后面
:n1,n2 w [filename] 将 n1 到 n2 的内容储存成 filename 这个文件。

3.9 同时编辑多个文件

vim 提供了同时编辑多个文件的功能,在 vim 后面同时可以接多个文件名, 用户来同时打开多个文件。 vim 同时提供了在多个窗口打开文件的功能,输入 “:sp 文件名”命令即可在不关闭当前文件的情况下打开新文件。

  • 可用“ZZ”先退出 vim,然后用“vim 文件名 1 文件名 2… 文件名 n” 打开多个文件,如这里可以用“vim man.config.bak man.config”同时打 开这两个文件,然后用“:n”和“:N”在这两个文件间切换。
  • 或者用“:sp man.config”直接打开此文件,并用“[ctrl]+wj”和“[ctrl]+wk”, 在这两个文件间切换。

vim 打开多个文件命令

命令键 命令用途
:n 编辑下一个文件
:N 编辑上一个文件
:files 列出目前这个 vim 的打开的所有文件
:sp [filename] 开启一个新窗口,如果有加 filename, 表示在新窗口开启一个新文件,否则表示两个窗口为同一个文件内容(同步显示)。
[ctrl]+wj 按键的按法是:先按下 [ctrl] 不放, 再按下 w 后放开所有的按键,然后再按下 j ,则光标可移动到下方的窗口。
[ctrl]+wk 同上,不过光标移动到上面的窗口。
[ctrl]+wq 要结束下方窗口,那么利用 [ctrl]+wj 移动到下方窗口,按下 :q 即可, 也可以按下 [ctrl]+wq

3.10 可视模式

vim 提供了一种可视模式,按 Esc 键,然后按 Ctrl+v 就进入可视模式。可视 模式为我们提供了极为友好的选取文本范围,以高亮显示;在屏幕的最下方显示 有– 可视 – 或–VISUAL–进入可视模式,我们就可以用前面所说的命令行模式 中的光标移动指令,可以进行文本范围的选取。

  • 切换到 man.config.bak 中;
  • 按下“ctrl+v” 进入可视模式下的区块选择模式,用光标选中要拷贝的区域(这些区域会反白);
  • 按下“y”进行拷贝;
  • 切换到 man.config 中,按“G”来到最后一行,按下“p”进行粘贴。

vim 可视模式下的选择、复制和删除命令

命令键 命令用途
v 字符选择,会将光标经过的地方反白选择
V 行选择,会将光标经过的行反白选择
[Ctrl]+v 区块选择,可以用长方形的方式选择文本
y 将反白的地方复制起来
d 将反白的地方删除掉

3.11 环境配置

vim 提供了环境设定功能,利用 vim 的环境设定,可以给我们的工作提供非 常大的一个帮助。vim 的环境设定参数有很多,可以在一般模式时输入:“ :set all”来查阅,这里仅列出一些平时比较常用的一些简单的设定值。

vim 的环境配置命令

命令键 命令用途
:set nu 设定行号,取消的话,就是 :set nonu
:set hlsearch 是否将搜寻的字符串反白。 默认值就是 hlsearch ,如果不想要反白,就 :set nohlsearch 。
:set autoindent autoindent 就是自动缩排, 不想要缩排就 :setnoautoindent 。
:set backup 是否自动储存备份档,一般是 nobackup 的, 如果设定backup 的话,那么当你更动任何一个档案时,则源文件会被另存成一个档名为 filename~ 的档案。
:set ruler 右下角是否显示状态列说明
:set showmode 这个则是,是否要显示 –INSERT– 之类的字眼在左下角的状态列。
:set all 显示目前所有的环境参数设定值。
:syntax (off|on) 是否依据程序相关语法显示不同颜色? 举例来说,在编辑一个纯文字文件时,如果开头是以 # 开始,那么该行就会变成蓝色。 但是, 如果您仅是编写纯文本文件,要避免颜色对您的屏幕产生的干扰,则可以取消这个设定 :syntax off 。

3.12 暂时存档文件和恢复

当编辑一个文件时,在这个文件所处的目录底下就会有一个临时文件,文件 名为“编辑的文件名.swp”这是一个隐藏文件, 所有修改都会暂时存在这个文件 中。在编辑过程中,系统或者 vi 非正常关闭了,那么再重新用 vi 打开这个文件 时时,系统就会询问要回复『Recovery』。按下 (R) ,就可以将数据回复到修改 过程的样子,再将 swp 文件删除。

四、搜索

  1. 輸入 / 以及尾隨的字符串可以用以在當前文件中查找該字符串。

  2. 块操作

块操作,典型的操作: 0 I– [ESC]

^ → 到行头
→ 开始块操作
→ 向下移动 (你也可以使用hjkl来移动光标,或是使用%,或是别的)
I-- [ESC] → I是插入,插入“--”,按ESC键来为每一行生效。
  1. 在所有被选择的行后加上点东西:

    选中相关的行 (可使用 j 或 或是 /pattern 或是 % 等……) $ 到行最后 A, 输入字符串,按 ESC。

  2. 分屏: :split 和 vsplit.

    :split → 创建分屏 (:vsplit创建垂直分屏) : dir就是方向,可以是 hjkl 或是 ←↓↑→ 中的一个,其用来切换分屏。 _ (或 |) : 最大化尺寸 (| 垂直分屏)

    • (或 -) : 增加尺寸

参考资料

个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn