Vim实用技巧_3.可视模式和命令模式

下面介绍vim的几种常用模式的技巧

  • vim有4种模式普通模式插入模式可视模式命令模式
  • 为什么要分这么多模式?
    想一想我们平时常用的编辑工具word,应该是将上面4种模式融合在一起的;这种做法的优点是上手简单,缺点是离不开鼠标;vim的几种模式都有大量的快捷点,可以脱离鼠标(缺点是上手难)
  • 内容:下面部分先介绍2种模式:可视模式命令模式
  • 提示:想详细学习的,可以看参考的书籍

文章目录

  • 可视模式
    • 技巧020:深入理解可视模式
    • 技巧021:选择高亮选区
    • 技巧022:重复执行面向行的可视命令
    • 技巧023:只要可能,最好用操作符命令,而不是可视命令
    • 技巧024:用面向列块的可视模式编辑表格数据
    • 技巧025:修改列文本
    • 技巧026:在长短不一的高亮块后添加文本
  • 命令模式
    • 技巧027:结识 Vim 的命令行模式
    • 技巧028:在一行或多个`连续行上`执行命令
    • 技巧029:`:t`和`:m`命令复制/移动行
    • 技巧030:在指定范围上执行`普通模式`命令
    • 技巧031:重复上次的 Ex 命令
    • 技巧032:自动补全 Ex 命令
    • 技巧033:把当前单词插入到命令行
    • 技巧034:回溯历史命令
    • 技巧035:运行 Shell 命令
  • 参考

可视模式

Vim 的可视模式允许我们选中一块文本区域并在其上进行操作;Vim 具有 3 种不同的可视模式,分别用于操作字符文本、行文本或块文本

技巧020:深入理解可视模式

可视模式允许我们选中一个文本区域并在其上操作。尽管这看起来似乎很熟悉,但对于所选中的文本,Vim 的视角却有异于其他文本编辑器

在这里插入图片描述

选择模式(输入的可见字符会使所选中的文本被删除)下,删除和修改是同步进行的

Vim实用技巧_3.可视模式和命令模式_第1张图片

技巧021:选择高亮选区

可视模式的 3 个子模式用于处理不同类型的文本;将在本节看到如何激活每种子模式,以及如何在它们之间切换

  • 1.激活可视模式的方法

Vim实用技巧_3.可视模式和命令模式_第2张图片

  • 2.在可视模式之间切换

Vim实用技巧_3.可视模式和命令模式_第3张图片

说明:如果在面向字符的可视模式中再次按 v,就会回到普通模式;另外两种返回类似,其实不用记得那么麻烦了,直接搞定

  • 3.切换选区的活动端

高亮选区的范围由其两个端点界定:一端固定,另一端可以随光标自由移动;o键来切换其活动的端点

Vim实用技巧_3.可视模式和命令模式_第4张图片

技巧022:重复执行面向行的可视命令

当使用 . 命令重复对高亮选区所做的修改时,此修改会重复作用于相同范围的文本

在本节中,我们会对一个面向行的高亮选区做一个修改,然后使用 . 命令重复此修改

示例:python的代码缩进有问题

def fib(n): 
	a, b = 0, 1 
	while a < n: 
print a, 				#要缩进2次
a, b = b, a+b 			#要缩进2次
fib(42)
  • 准备工作:要想让 <> 命令正常工作,先设置好:set shiftwidth=4 softtabstop=4

  • 思路:缩进一次,然后重复

一次高亮选中2行,然后使用>命令进行缩进,但此操作后增加一级缩进就返回普通模式,下面是常用的几种方法,没有好坏之分,看个人喜好

  • 方法1:使用 gv 命令重选相同的文本,然后再次调用缩进命令(不推荐,太麻烦)
  • 方法2:当需要执行重复操作时,.命令是最佳的解决方案;注意:要想达到效果,执行.命令前光标要移到被修改部分左上角

Vim实用技巧_3.可视模式和命令模式_第5张图片

  • 方法3:后移动光标,选择所有问们,然后直接使用2>;或直接V,然后不断输入>或者<更快捷,也省去了要肉眼检查到底要几次>的环节(推荐)

技巧023:只要可能,最好用操作符命令,而不是可视命令

可视模式可能比 Vim 的普通模式操作起来更自然一些,但是它有一个缺点:在这个模式下 . 命令有时会有一些异常的表现

method1:使用可视模式下的命令(出现异常)

问题:在这个模式下 . 命令有时会有一些异常的表现

示例:链接文字转换为大写格式(用可视模式下的命令进行大写转换)

操作:

  • step1.处理第一行

Vim实用技巧_3.可视模式和命令模式_第6张图片

vit:用 vit 来选择标签里的内容。vit 可被解读为高亮选中标签内部的内容(visually select inside the tag),其中,it 命令是一种被称为文本对象(text object)的特殊动作命令

U命令:来把所选中的字符转换为大写

  • step2.处理后续行

执行一下 j. 命令,把光标移到下一行并重复上次的修改,效果如下(第3行出现异常

在这里插入图片描述

分析:当一条可视模式命令被重复执行时,它会影响相同数量的文本;最初的命令影响了一个由 3 个字母组成的单词,当我们想对一个由 5 个字母组成的单词重复此命令时,它只成功转换了其中的前 3 个字母,留下 2 个字母未被转换

method2:使用普通模式下的操作符命令(符合预期)

思路:可视模式下的 U 命令有一个等效的普通模式命令:gU{motion}(参见:h gU

Vim实用技巧_3.可视模式和命令模式_第7张图片

总结:2种模式下的命令对比(根因)

在这里插入图片描述

技巧024:用面向列块的可视模式编辑表格数据

示例:在列间增加分隔竖线

Vim实用技巧_3.可视模式和命令模式_第8张图片

解释:

  • 1.列模式:先使用 进入列块可视模式然后向下移动几行光标,选中一列文本
  • 2.删除部分列:按 x 键删除此列,并用 . 命令重复删除相同范围的文本(也可以把光标向右移动两三次,把列选区扩展为块选区,而后只需删除一次即可)
  • 3.画竖线:先用 gv 命令重选上次的高亮选区,然后输入 r|, 用管道符替换此选区内的字符(技巧25还有更好的方式
  • 4.画横线:先快速地复制顶行并粘贴一份副本(yyp),然后再用连字符替换该行内的所有字符(Vr-

技巧025:修改列文本

用列块可视模式可以同时往若干行中插入文本。列块可视模式不仅仅对表格数据有用,在编程时我们也时常受惠于此功能

提示:一定要等到按了 返回到普通模式后,我们才看到所有修改

示例:向多行插入文本(把文件 sprite.png 从 images/ 目录移到了 components/ 目录,要修改每行内容),操作如下

Vim实用技巧_3.可视模式和命令模式_第9张图片

  • 1.选中区域jje ,其中e命令,到单词尾部;w命令,到下一个单词首部
  • 2.c:所有被选中的文本都消失了,同时我们进入了插入模式
  • 3.替换单词:注意变化,要熟悉
# 现象:插入模式中输入单词“components”时,此单词只出现在顶行,下面的两行没什么变化
# 操作:只有在按了  返回到普通模式后,我们才看到刚才输入的文本出现在下面这两行里

技巧026:在长短不一的高亮块后添加文本

列块可视模式在操作由行列组成的方形代码块时表现得很好,然而,它并不仅限于操作方形的文本区域

method1:常规方法思路

# 操作:`A` -> 输入添加内容 -> `` -> `j`进入下一行 -> `.`命令重复 -> `j.`....

method2:一次全部添加的方式

可视化模式中,有不一样的实现,整体操作流程如下:

Vim实用技巧_3.可视模式和命令模式_第10张图片

  • 1.选中区域:在进入列块可视模式后,我们按 $ 键把选区扩大到每行的行尾(与技巧25的区别,技巧25是整齐的文本而已
  • 2.添加内容:用 A 命令就可以在每行的结尾添加内容;此命令让我们进入插入模式,且使光标停留在顶行

提示:处于插入模式期间,任何输入的内容只出现在顶行,然而一旦返回到普通模式,这些修改就会被扩散到其余选中的行上

区别:从 列块可视 模式切换到 插入模式 的命令中,ia有特殊处理

Vim实用技巧_3.可视模式和命令模式_第11张图片

命令模式

初时,先有 ed,ed 为 ex 之父,ex 为 vi 之父,而vi 为 Vim 之父

对某些基于行的编辑任务来说,Ex 命令仍然是最佳工具。在本章中,我们将学习如何使用命令行模式,这将为我们揭示 ex 编辑器的余风遗韵

提示:一定要注意好命令模式下的命令与普通模式下,同一个功能往往命令是不同的

技巧027:结识 Vim 的命令行模式

在本节,我们将结识一些操作缓冲区中文本的 Ex 命令,并学习一些可在此模式中使用的特殊按键映射项

  • 1.进入命令模式

在按下 : 键时,Vim 会切换到命令行模式。这个模式和 shell 下的命令行有些类似,我们可以输入一条命令,然后按 执行它

其他方式:按 / 调出查找提示符或用 = 访问表达式寄存器(参见技巧 16)时,命令行模式也会被激活

  • 2.离开命令模式

在任意时刻,我们都可以按 键从命令行模式切换回普通模式

  • 3.常规Ex命令

Vim 为几乎所有功能都提供了相应的 Ex 命令(参见:h ex-cmd-index

在这里插入图片描述

Vim实用技巧_3.可视模式和命令模式_第12张图片

  • 4.后续介绍
  • copy 命令对快速复制一行非常好用,在 技巧29 中介绍

  • normal 命令:提供了一种便捷的方式来对指定范围内的行做相同的修改,在 技巧30 中介绍

  • 第 10 章里学到更多关于 :delete:yank:put 命令的知识

一般地说,Ex 命令操作范围更大,并且能够在一次执行中修改多行;或者可以进一步精炼为 Ex 命令影响范围广且距离远

技巧028:在一行或多个连续行上执行命令

很多 Ex 命令可以用 [range] 指定要操作的范围。我们可以用行号、位置标记或是查找模式来指定范围的开始位置及结束位置

提示:一定要注意与普通模式下,符号的意义的区别

  • 1.下表对用来构建 Ex 命令的地址及范围的符号进行了总结

Vim实用技巧_3.可视模式和命令模式_第13张图片

提示:符号的意义不要与普通模式下的意义混淆,比如:$在普通模式下是一行的行尾,0在普通模式下是一行的行首

  • 2.示例的原始内容
    在这里插入图片描述

  • 3.示例1:用行号作为地址

Vim实用技巧_3.可视模式和命令模式_第14张图片

  • 4.示例2:用地址指定一个范围

Vim实用技巧_3.可视模式和命令模式_第15张图片

提示:上面的2到5行,还可以用.,.+3进行表示,因为.是当前行

常用的范围

  • :.,$:代表从当前位置到文件末尾间的所有行
  • %:代表所有行

在这里插入图片描述

技巧029::t:m命令复制/移动行

part0:复制和移动行的2个最常用命令

在这里插入图片描述

  • :copy 命令:简写形式 :t,让我们可以把一行或多行从文档的一部分 复制 到另一部分
  • :move 命令:则可以让我们把一行或多行 移到 文档的其他地方

part1:用:t命令复制行

1.示例:将 第6行 复制到当前行

Vim实用技巧_3.可视模式和命令模式_第16张图片

  • copy的格式::[range]copy {address}
  • 参数解释:[range]是第6行,而 {address} 用的是符号 .,它代表当前行;完整解读 :6copy为“为第 6 行创建一份副本,并放到当前行下方”
  • 简写:简写为两个字母 :co,或者也可以用更加简练的 :t 命令(“复制到(copy TO)”)

2.扩展::t 命令的一些应用实例

Vim实用技巧_3.可视模式和命令模式_第17张图片

  • :t.:会为当前行创建一个副本(复制当前行到当前行,即与普通模式下的yyp产生一样的效果);需要关注的差别:yyp 会使用寄存器,而 :t. 则不会
  • 通常用yyp的流程:先跳到想复制的行上(6G),复制该行(yy),快速跳回原先的位置(),然后再用粘贴命令(p)创建一个副本
  • 取舍?上面可以看到yyp在近距离复制还可以,:t不光高效而且适合长距离的复制

part2:用:m命令移动行

不介绍了,与:t命令类似

技巧030:在指定范围上执行普通模式命令

如果想在一系列连续行上执行一条普通模式命令,我们可以用 :normal 命令

此命令在与 . 命令或宏结合使用时,我们只需花费很少的努力就能完成大量重复性任务

在这里插入图片描述

示例:在文件的每行后都添加一个分号

  • 思路1:添加完一行后,可以使用.命令重复以前的命令,这种缺点就是不是和行数太多的情况

  • 思路2:下面使用在命令行模式中的Ex 命令 :normal, 对整个范围内的所有行同时执行 . 命令

    (技巧26是先选择区块,然后$移动到行尾,然后执行A;

Vim实用技巧_3.可视模式和命令模式_第18张图片

  • 解释:'<,'>normal . 命令可以解读为“对高亮选区中的每一行,对其执行普通模式下的 . 命令”

  • 其中:'<,'>是键盘敲入:后自动添加上的

在这里插入图片描述

  • 思路3:还有一种更常用的方式,直接Ctrl+V切换到面向列块的可视模式,然后用jk按键选中需要处理的行,然后执行:'<,'>normal 具体命令

2种常见的应用

  • :%normal A; :符号 % 代表整个文件范围,因此 :%normal A; 告诉 Vim 在文件每行的结尾都添加一个分号;修改完后 Vim 会自动返回到普通模式
  • :%normal i//:注释所有行

技巧031:重复上次的 Ex 命令

. 命令可以重复上次的普通模式命令。然而,如果想重复上次的 Ex 命令的话,我们得使用 @: 才行。

暂时不需要这个功能,未整理

技巧032:自动补全 Ex 命令

如同在 shell 中一样,在命令行上也可以用 键自动补全命令

暂时不需要这个功能,未整理

技巧033:把当前单词插入到命令行

即使是在命令行模式下,Vim 也始终知道光标位于何处以及哪个分割窗口处于活动状态

为节省时间,我们可以把活动窗口中的当前单词(或字串)插入到命令行中

在 Vim 的命令行下,想要节省输入的话

  • 单词: 映射项会复制光标下的单词并把它插入到命令行中
  • 字串:如果想插入光标下的字串的话,我们可以用

* 命令就可以查找单词出现的每处地方(* 命令等效于输入/\<\> 序列)

技巧034:回溯历史命令

Vim 会记录命令行模式中执行过的命令,并提供了两种方式回溯这些命令,用光标键回滚之前的命令调出命令行窗口查看先前的命令

part1:光标键回滚之前的命令

先按 : 键切换到命令行模式,在保持提示符为空的情况下按 键(按 键是相反方向),此时最后执行的那条 Ex 命令就会被填充到命令行上

  • 过滤:可以先输入部分字符(假设是set),再按键,此时Vim不会显示所有的历史命令,而是会对列表进行过滤,只有以单词“set”开头的 Ex 命令才会被包含在列表中
  • 历史个数:默认是20条,可以使用set history=200设置成200条
  • 历史范围:历史即使在退出 Vim 再重启之后仍然存在(参见 :h viminfo ),因此提高历史记录的数目非常有价值
  • 查找的独特历史:Vim 也会为查找命令单独保存一份历史记录。在按 / 调出查找提示符后,用 键就可以查找历史

part2:打开命令行窗口的几种方式

在这里插入图片描述

  • 命令行窗口

像是一个常规的 Vim 缓冲区,每行内容都对应着命令历史中的一个条目。可以用 kj 键在历史中向前或向后移动,也可以用 Vim 的查找功能查找某一行

在按下 键时,将会把当前行的内容当成 Ex 命令加以执行

  • 关闭

当命令行窗口处于打开状态时,它会始终拥有焦点。这意味着,除非关闭命令行窗口,否则我们无法切换到其他窗口

要想关闭命令行窗口,我们可以执行 :q 命令(就像关闭普通 Vim 窗口那样),或是按

  • 作用

当处于命令行模式下时,我们可以用 映射项切换到命令行窗口中,此前已经输入到命令行上的内容仍然会得以保留

技巧035:运行 Shell 命令

我们不用离开 Vim 就能方便地调用外部程序

更棒的是,我们还可以把缓冲区的内容作为标准输入发送给一个外部命令,或是把外部命令的标准输出导入到缓冲区里

part0:最有用的一些调用外部命令的方式

Vim实用技巧_3.可视模式和命令模式_第19张图片

part1:执行 Shell 中的程序

在 Vim 的命令行模式中,给命令加一个叹号前缀(参见 :h :! )就可以调用外部程序

  • 示例1:执行一条命令
# :!ls 调用的是 shell 中的 ls 命令
  • 示例2:符号 % 代表当前文件名

在 Vim 的命令行中,符号 % 代表当前文件名,在运行那些操作当前文件的外部命令时,我们可以使用它

例如,如果我们正在编辑某个 Ruby 文件,那么可以用下面的方式执行此文件::!ruby %

  • 示例3:想在 shell 中执行几条命令要怎么做?

执行 Vim 的 :shell 命令来启动一个交互的 shell 会话(参见 :h :shell

Vim实用技巧_3.可视模式和命令模式_第20张图片

  • 示例4:把 Vim 置于后台

Vim实用技巧_3.可视模式和命令模式_第21张图片

恢复:上图中vim的的任务号(jobnumber)是1,因此用fg的完整命令是fg %1(一定要有%)

part2:把缓冲区内容作为标准输入或输出

  • :read !{cmd} 命令,把 {cmd} 命令的输出读入当前缓冲区中,即把命令的标准输出重定向到缓冲区

  • :write !{cmd}: 做相反的事,它把缓冲区内容作为指定 {cmd} 的标准输入

Vim实用技巧_3.可视模式和命令模式_第22张图片

part3:使用外部命令过滤缓冲区内容

在这里插入图片描述

示例:想基于第二个字段“姓氏”来重排这些记录

在这里插入图片描述

  • 2,$:文件的第一行是标题信息,想把它们保留在文件顶部,因此第二行开始
  • sort命令:-t标识的是分割符,-k2参数指定按第二个字段进行排序

参考

  • 《Vim实用技巧》,书籍写的很好,强烈建议读一读

你可能感兴趣的:(vim实用技巧,vim,linux,unix)