前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >vim 从嫌弃到依赖(3)——vim 普通模式

vim 从嫌弃到依赖(3)——vim 普通模式

作者头像
Masimaro
发布2022-05-10 10:51:30
6460
发布2022-05-10 10:51:30
举报
文章被收录于专栏:MasiMaro 的技术博文

在上一篇中,我们提到vim的几种模式,并且给出了一些基本的操作命令,包括移动光标,删除、替换操作。并且给出了几个重要的公式,理解这个公式对于理解vim和提高使用vim的效率来说至关重要。所以在这篇文章里面我打算再围绕这几个公式给出一些示例,希望能给各位理解公式提供一些帮助。

行内查找字符串

vim操作的效率很大程度上取决于移动光标的效率,平时在修改代码的时候很大程度上都是需要在特定位置修改,下面介绍到的操作很大程度上能提高我们移动光标和修改的效率

行内查找字符使用 f{char} 来进行,即使用f后面加一个字符,会快速跳转到行内第一个出现该字符的位置,例如下面一段话

代码语言:javascript
复制
vim.o.relativenumber = true

假设光标位于行首的s 处,我们可以使用 fr 将光标移动到单词 字符 r出现的位置

fr跳转到行内第一个r的位置
fr跳转到行内第一个r的位置

根据公式

代码语言:javascript
复制
motion = [数字] + 移动光标

我们可以使用 2fr 跳转到第二个r 位置

2fr跳转到行内第二个r的位置
2fr跳转到行内第二个r的位置

我们也可以使用 t 来跳转光标到搜索的字符处,它与 f 的区别在于 f 直接跳转光标到指定字符处,t 跳转光标到指定字符的前一个位置

  • 例如使用 tr 跳转到第一个r的左边
tr跳转到第一个r的左边
tr跳转到第一个r的左边
  • 使用3tr 跳转到第三个r的左边
3tr跳转到第三个r左侧
3tr跳转到第三个r左侧

我们可以使用 FT 实现向前查找,它门跳转的规则与 ft 类似,这里就不再给出具体的示例了,有小伙伴感兴趣的可以自行尝试

大范围移动

之前只演示了基本的行内移动和多行移动,但是多行移动是基于上述公式实现重复向下移动一行多次的。vim中提供了一些大范围移动光标的方式。

  • H 移动光标到窗口首行
  • M 移动光标到窗口中间
  • L 移动光标到窗口尾行
  • gg 移动光标至第一行
  • G 移动光标到最后一行

要演示这几个操作光靠一屏就可以显示完的简短的文本是不行的,这里我采用 ~/.bashrc 小伙伴可以随便打开一个系统的配置文件,只要它超过一屏就行

  • 假设光标在文件最后一行,使用H 将光标移动到窗口首行
H 移动光标到窗口首行
H 移动光标到窗口首行
  • 假设光标在文件最后一行,使用 M 移动光标到窗口中间
M 移动光标到窗口中央
M 移动光标到窗口中央
  • 假设光标在文件第一行,使用 L 移动光标到窗口末尾
L 移动光标到窗口尾部
L 移动光标到窗口尾部
  • 假设光标在文件的第一行,使用 G 移动光标到最后一行
G 跳转到文件最后一行
G 跳转到文件最后一行

后面的 gg 也就不演示了,从上面这些演示来看不难发现窗口和文件不是同一个东西,在窗口中跳转只能在文件的部分区域间进行跳转,而在文件中跳转则能浏览文件中的任意行

根据上面的公式,他们前面也是可以添加数字的,但是在这些操作的前面加上数字表示重复又有什么,例如gg 可以跳转到文件首行,我执行3次跳到行首又有什么用呢。要解释这个问题,我们先看一个例子

  • 例如使用 3gg 可以跳转到文件的第三行。这里我们假设光标在文件的最后一行
3gg跳转到文件的第三行
3gg跳转到文件的第三行

这些算是之前将的公式含义的特例吧,他们并不表示重复,这里我仅仅列出他们的含义吧,具体该如何理解我也不清楚,暂时记住,后续会使用即可

  • 数字 + gg, 表示跳转到文件的第几行
  • 数字 + G, 也表示跳转到文件的第几行。但是我平时都使用 gg 这种跳转方式,毕竟在一个键位上按两次可比按它的大写字母要快的多
  • 数字 + L, 移动到窗口的倒数第几行
  • 数字 + H, 移动到窗口的第几行
  • 数字 + M, 与单纯的使用M 效果一样

结合跳转指令的操作

下面在列举一些操作符配合光标移动指令的例子,帮助大家理解

例1,我们来针对之前的配置文件来做修改

假设光标在 relativenumber 的词首

  • 我们可以使用cw 来删除该单词并输入number
cw修改当前单词
cw修改当前单词
  • 可以直接使用 dtn 来删除字符 n 前面 relative
dt 删除字符
dt 删除字符

例2 将 hello world!! 改为 hello world!!!

  • 使用 2f! 将光标移动到对应位置,然后使用 a 进入插入模式插入对应字符
f2! 查找并修改
f2! 查找并修改
  • 使用 2f" 移动到行尾,然后使用i 进入插入模式插入对应字符
2f" 移动并进入插入模式
2f" 移动并进入插入模式
  • 使用$ 跳转到行尾,使用 i 进入插入模式进行修改
f$ 移动行尾并修改
f$ 移动行尾并修改

从上面的例子来看,使用 f t 之类的指令相比使用 lw 更加高效,毕竟数单词个数和字符格式是很低效而且容易出错的

例3:将 "hello world" 改为 "nice to meet you"

我们假设光标位于h

  • 使用 d2w 删除两个单词并进入插入模式
d2w 删除2个单词并进入插入模式
d2w 删除2个单词并进入插入模式
  • 使用 dt" 删除对应单词,然后进入插入模式
dt" 删除对应字符
dt" 删除对应字符
  • 使用 ci" 删除对应字符并进入插入模式
ci" 删除字符并进入插入模式
ci" 删除字符并进入插入模式

文本对象

看到这里,肯定很多小伙伴会有一脑袋问号,这个 i 是什么东西,i 不是进入插入模式嘛,为什么我光标在行首它也能准确的删除引号内的字符呢。这就涉及到vim中一个非常重要的概念——文本对象

还记得最开始我们说过,vim将文本分为 字符、单词、句子、段落嘛,这可不是为了方便而人为划分的,而是vim在处理文本的时候就是真么做的。文本对象是vim 描述这些划分的。文本对象只能跟在 operator 后,由 ai 开头,后面跟文本范围来组成,表示我们要针对哪个范围的文本进行何种处理。其中 i 表示 inner 不包含表示范围的字符, 而 a 会包含表示范围的字符。例如上述例子中,如果使用 i 则会保留 " ,使用 a 则不会保留。感兴趣的小伙伴可以自行尝试。

下面给出各种文本范围的表格

文本范围

代表含义

w

word 词

s

sentence 句

p

paragraph 段

t

tag(HTML/XML) 标签

[或]

由[]包裹的部分

(或)

由()包裹的部分

<或>

由<>包裹的部分

{或}

由{} 包裹的部分

"

由""包裹的部分

'

由''包裹的部分

`

由``包裹的部分

文本对象看似抽象,实际上只需要多使用几次基本就能掌握它了。熟练掌握它之后,将会大大提高我们编辑文本的效率

接下来让我们再给出一个最后的例子,并且以本示例来结束该文

假设有这么一段文本

代码语言:javascript
复制
<div class = "example">
	<div> This is vim example</div>
</div>

我们希望将其变为

代码语言:javascript
复制
<div class "example">
	vim is so good
</div>

我们将光标移动到最外层的div上,然后使用 cit 删除div中的内容,然后输入 "vim is so good"

cit删除tag中的内容
cit删除tag中的内容
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 行内查找字符串
  • 大范围移动
  • 结合跳转指令的操作
    • 例1,我们来针对之前的配置文件来做修改
      • 例2 将 hello world!! 改为 hello world!!!
        • 例3:将 "hello world" 改为 "nice to meet you"
        • 文本对象
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档