vim 从嫌弃到依赖(7)——可视模式
vim 的可视模式下可以选择一个区域,然后针对区域进行操作。可视模式有点类似于在其他编辑器上使用鼠标选中一块区域然后针对区域进行操作。
vim中有3种可视模式,分别用来处理不同范围的文本:
- 处理字符的可视模式
- 处理行的可视模式
- 处理列块的可视模式
在普通的文本编辑器中,例如在写博客的时候会发现有些地方表述不太正确,这个时候一般会选择先用鼠标选择一句或者一段,然后按退格或者删除键删除所选内容。vim的可视模式也是相同的逻辑,先选区然后对选区进行操作。选区时可以使用之前介绍的motion 来移动光标进行选区,操作选区的时候可以使用 operator 进行。
直接说可能有点抽象,下面看一个例子:我们将 there is one more line 改为 there is one line。

在上述例子中,我们使用 v 进入可视模式,在处理字符的可视模式下会在左下方显示 VISUAL 字样表示进入了处理字符的可视模式。在该模式中使用e 选中一个单词,然后使用d 删除它
我们发现在可视模式下操作的逻辑与在普通模式下的操作逻辑不太相同,可视模式下先使用motion 移动光标选中部分内容,然后调用operator 来对选中部分做操作。而普通模式下先调用 operator 声明需要进行的操作,再使用motion 传入要操作的文本范围。但是可视模式下的操作逻辑确与一般的文本编辑器类似,都是现选中一个部分,然后再针对这部分进行操作。
选择模式
在一般的编辑器中,选中一段文本后,输入任意字符会先删除选中部分然后再插入输入的字符,但是vim的可视模式并没有这么做。从上面的例子也可以看出来,vim的可视模式保持了普通模式中使用操作符操作区域的逻辑。但是vim也提供了类似于普通编辑器一样的体验,这个体验就是选择模式。
在可视模式下使用 <Ctrl +g> 进入选择模式,下面是一个选择模式的例子

在进入可视模式后,使用<Ctrl +g> 进入选择模式,此时左下角的字样已经变为 SELECT,表示此时进入了选择模式。在选择模式中,随便输入一个字符,它会删除选中然后输入对应的内容。
相信能看到这里的小伙伴已经很熟练的使用vim进行文本操作了。这个模式主要是为了迎合那些想让 vim 像其他编辑器那样的用户。这种模式效率并不高,而且也不太推荐使用这种模式。
可视模式的3种子模式
可视模式下有3种处理不同情况的子模式,分别为:处理字符的可视模式、处理行的可视模式、处理列的可视模式
处理字符的可视模式与普通的motion 配合使用,可以选中光标移动所经过的字符。可以在普通模式下按v 进入
处理行的可视模式可以与行操作的motion 配合,一次选中一行,可以在普通模式下按 V 进入
处理列的可视模式可以与一般的motion 配合,一次选中一列,行操作可以选中多列,而h l 则可以选中多列。
3种模式下可以互相转化,按键与上面介绍的相同。例如从处理字符的选择模式切换到处理行的可以使用V ,从处理列的选择模式切换到处理行的,可以使用v。但是如果处在处理字符的可是模式下再次按下v 则会退回到普通模式,在其他模式下类似。
重新选择选中区域
如果选择到一半发现我们选择错了该怎么办呢?一种方式是退回到普通模式下,然后再重新进入选择模式。但是在这里要介绍一种新的方式——可以按 o 重新选择选区的活动段。选择模式下选区一段固定,另一端可以移动。通过多次按下o 来变更需要移动哪一段
例如下面的例子

示例
上面叽里呱啦说了一堆,可能各位小伙伴都没怎么记住,下面给出一些例子,帮助大家来理解之前说到的一些内容
示例1:缩进Python代码
假设有这么一段Python代码
def fib(n):
a , b = 0, 1
while a < n:
print(a)
a , b = b, a + b
fib(42)
要将中间两行缩进两次,变为下面的代码
def fib(n):
a , b = 0, 1
while a < n:
print(a)
a , b = b, a + b
fib(42)
- 解法1: 可以在普通模式下,在对应位置使用
2>>将两行缩进一次,然后使用.命令再重复一次

- 解法2:使用
>j缩进两行,然后使用.重复,效果与上面的解法1一样,这里就不演示了 - 解法3:使用
V选中一行,然后使用2>缩进2次,移动到下一行后使用.重复

- 解法4:使用
V选中一行,然后使用j再选中一行,接着使用2>>将选中两行一次缩进两次

- 解法5:这里介绍一个在可视模式下的新命令——
gv它可以选中上次选中的区域。结合这个命令可以这么操作,先选择两行,再使用>缩进一次,然后使用gv选中上次选中的两行,再次使用>

针对示例1,我给出了5种解法,有利用普通模式加.命令的方式,也有利用现学的可视模式的解法。当然也有其他的解法,各位小伙伴有好的方式也可以在底下评论。
上面不管哪种解法,大部分都使用了.命令,这里也可以看出. 在处理重复操作时候的威力。虽然它很好用,但是也需要注意:在基于字符的可视模式下 . 命令操作的字符数与上次修改中操作的字符数相等。例如
world
world1
world11
world111
当我们在第一行使用 v 进入选择模式,然后使用e 选中一个单词删除它之后,再在下一行执行. 命令的时候,并没有删除一行,只删除了world这个单词

针对示例1给出的几个解法,我们发现使用可视模式在效率上有时候还不如在普通模式下配合. 来使用,这么说是不是说可视模式就失去了它的价值呢?其实也不是,在平时处理文本的操作中,并不是每个任务都需要进行重复,在处理一次性操作的任务时,vim的可视模式在效率上于普通模式其实差距不大,而且有时候要修改的文本所在区域无法准确的通过一两个motion 表达出来,这种情况下可视模式就大大的派上用场了。下面几个列子就可以说明这点。
示例2:处理列的可视模式的初步使用
假设我们要将下列代码
Print("hello world")
Print("hello world")
Print("hello world")
Print("hello world")
Print("hello world")
变为
print("hello world")
print("hello world")
print("hello world")
print("hello world")
print("hello world")
可以使用 <Ctrl + v> 进入处理列的可视模式,然后选中所有的P,接着使用 u 将其变为小写

示例3:添加注释
假设现在有一些Python代码需要添加注释,即将下列代码
print("hello world")
print("hello world")
print("hello world")
print("hello world")
print("hello world")
print("hello world")
变为
#print("hello world")
#print("hello world")
#print("hello world")
#print("hello world")
#print("hello world")
#print("hello world")
可以使用 <Ctrl + v> 进入处理列的可视模式,然后选中所有的p,然后使用 I 在行首进入插入模式,接着输入 # 注释代码,最后使用 <Esc> 退回到普通模式,我们可以看到在插入时它只显示了一行的变化,但是最后回到普通模式后,针对第一行的变化作用到了所有选中行

示例3:在每行代码后添加一个分号
还是将之前介绍. 命令的那个例子来作为示例,但是这里提供一个使用列处理的可视模式的方式
在下列代码的每一行行尾添加一个分号
var foot = "foot"
var ball = "ball"
var football = foot + ball
变为
var foot = "foot";
var ball = "ball";
var football = foot + ball;
现将光标移动到第一行的最后一列,然后使用<Ctrl v> 进入到处理列的可视模式中,然后移动光标到最后一行的行尾。接着使用A 进入插入模式,输入分号,最后使用<Esc> 回到普通模式。这个时候我们发现vim在被选中区域每一行的尾部都添加了一个分号

在普通模式下 i I a A 都有自己的用途,而在处理列的可视模式下我们都只是在用 I 和 A ,而且他们的含义与在普通模式下有所不同,在处理列的可视模式中,A 表示在选择区的每个行尾进行同样的操作,而I 表示在选择区的行首进行同样的操作。至于a 和 i 这里则代表要处理的文本对象。
到此我们介绍完了vim中又一个常用的模式,再下一篇中,将介绍vim的另一种常用的模式——命令模式。
vim 从嫌弃到依赖(7)——可视模式的更多相关文章
- VIM下的可视模式的相关知识
三种可视模式: v 激活面向字符的可视模式: V 激活面向行的可视模式: ctrl+v 激活面向列块的可视模式: 选择高亮区: 上面的 v 是可以与跳转指令 以及表示范围的指令组合使用的. 如:vl, ...
- Vim技能修炼教程(7) - 可视模式
可视模式 可视模式是与正常模式.插入模式一起并列的模式.它的作用就像图形化编辑器下用鼠标来选择一个块. 在vim下,使用正常模式和ex命令,连搜带跳行的,未必就比用鼠标慢. 我们先做一个例子找找感觉, ...
- 第四章 vim 可视模式
第四章 vim 可视模式 vim的可视模式允许我们选中一块文本区域并进行操作 3种不同的可视模式 分为 操作字符文本 行文本 块文本 .命令用来重复执行可视模式中的命令 只有在操作面 ...
- vim的visual可视模式(转载)
转自:http://www.cnblogs.com/chenyadong/archive/2011/08/30/2159809.html 为了便于选取文本,VIM 引入了可视(Visual)模式.要选 ...
- Vim的可视模式
可视模式可以看到选中的字符串, 并对其进行操作 v:进入字符选择模式 V:进入行选择模式 ctrl-v(Window是ctrl-q):进入block选择模式 o:移动光标到选择的另一端 O:移动光标到 ...
- vim 的visual可视模式
一,在普通模式下面可以按v或者V进入可视模式下,选择内容: v 可以选择光标位置到光标结束的字符,包括行: V 选择光标位置行到光标结束的所在行的之间的所有行,选择的是个矩形: CTRL+v 选择块:
- vim 基础学习之可视模式
1. 选择模式这个模式必须通过可视模式进入.在可视模式下,我们通过 <C-g>来把我们的可视选中块作为选择模式下的操作块. 这时候我们输入可见字符,就会把这个块给覆盖掉.例如aaa bbb ...
- VI 基本可视模式
可视模式让你可以选择文件的一部分内容,以便作比如删除,复制等工作. 进入可视模式 v 用v命令进入可视模式.当光标移动时,就能看到有一些文本被高亮显示了,它们就是被选中的内容. 三种可视模式 v 一个 ...
- 『学了就忘』vim编辑器基础 — 96、末行模式中的相关命令
目录 1.在文档中显示行号 2.是否显示文档内容相关颜色 3.是否将查找的字符串高亮显示 4.是否显示右下角的状态栏 5.是否在左下角显示如"--INSERT--"之类的状态栏 6 ...
- selenium 之可视模式、静默模式、忽略证书不可用的设置
1.可视模式的设置(在前台工作) from selenium import webdriver import time url = "https://y.qq.com/n/ryqq/song ...
随机推荐
- Buffer 缓冲区操作
1.缓冲区分片在 NIO 中,除了可以分配或者包装一个缓冲区对象外,还可以根据现有的缓冲区对象来创建一个子缓冲区,即在现有缓冲区上切出一片来作为一个新的缓冲区,但现有的缓冲区与创建的子缓冲区在底层数组 ...
- Java 网络编程 —— ServerSocket 详解
构造 ServerSocket ServerSocket 的构造方法有以下几种重载形式 ServerSocket() throws IOException ServerSocket(int port) ...
- P1525 关押罪犯 (并查集 / 二分图)| 二分图伪码
原题链接:https://www.luogu.com.cn/problem/P1525 题目概括: 给你m对关系,每对关系分别涉及到x,y两人,矛盾值为w 请你判断分配x和y到两个集合中,能否避免冲突 ...
- Codeforces Round #544 (Div. 3)简单题解
复健,时间有限题解比较简陋 A. Middle of the Contest 将小时转成分钟,得到起止时间在一天中的分钟数,取平均值即可,复杂度O(1).平均值转换会时间的时候注意前导0. void ...
- 神秘又强大的@SpringBootApplication注解
一.前言 大部分的配置都可以用Java类+注解来代替,而在SpringBoot项目中见的最多的莫过于@SpringBootApplication注解了,它在每个SpringBoot的启动类上都有标注. ...
- 一、mysql5.7 rpm 安装(单机)
一.下载需要的rpm包mysql-community-client-5.7.26-1.el6.x86_64.rpmmysql-community-common-5.7.26-1.el6.x86_64. ...
- <vue 基础知识 2、插值语法> v-once,v-html,v-text,v-pre,v-cloak
代码结构 一. Mustache 1.效果 展示如何将数据展示在页面上 2.代码 01-Mustache.html <!DOCTYPE html> <html lang=&q ...
- freeswitch的2833和inband对接方案
概述 freeswitch支持三种模式的DTMF传输方式,分别时inband.INFO.2833. 在传统的PSTN网络中,所有的DTMF码都是inband模式,所以VOIP网络和PSTN网络对接中, ...
- 基于Tensorflow技术开发的计算机毕业设计辅助生成器(使用AI大模型技术)
这是一个辅助生成计算机毕业设计的工具,可以自动完成毕业设计的源码.它基于几百个github上面开源的java和python项目,运用tensorflow技术,训练出了AI大模型.基本实现了计算机毕业设 ...
- 基于AHB_BUS Clac slave详解
基于AHB-APB BUS slave详解 1.目录 高内聚:让模块的功能更集中,更单一. AMBA总线例子,需要有一个模块和AMBA进行交互,就可以单独将与AHB总线进行交互的部分作为一个模块.经常 ...