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

行内查找字符串

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

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

vim.o.relativenumber = true

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



根据公式

motion = [数字] + 移动光标

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



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

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

  • 使用3tr 跳转到第三个r的左边



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

大范围移动

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

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

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

  • 假设光标在文件最后一行,使用H 将光标移动到窗口首行

  • 假设光标在文件最后一行,使用 M 移动光标到窗口中间

  • 假设光标在文件第一行,使用 L 移动光标到窗口末尾

  • 假设光标在文件的第一行,使用 G 移动光标到最后一行



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

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

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



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

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

结合跳转指令的操作

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

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

假设光标在 relativenumber 的词首

  • 我们可以使用cw 来删除该单词并输入number

  • 可以直接使用 dtn 来删除字符 n 前面 relative

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

  • 使用 2f! 将光标移动到对应位置,然后使用 a 进入插入模式插入对应字符

  • 使用 2f" 移动到行尾,然后使用i 进入插入模式插入对应字符

  • 使用$ 跳转到行尾,使用 i 进入插入模式进行修改



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

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

我们假设光标位于h

  • 使用 d2w 删除两个单词并进入插入模式

  • 使用 dt" 删除对应单词,然后进入插入模式

  • 使用 ci" 删除对应字符并进入插入模式

文本对象

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

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

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

文本范围 代表含义
w word 词
s sentence 句
p paragraph 段
t tag(HTML/XML) 标签
[或] 由[]包裹的部分
(或) 由()包裹的部分
<或> 由<>包裹的部分
由{} 包裹的部分
" 由""包裹的部分
' 由''包裹的部分
` 由``包裹的部分

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

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

假设有这么一段文本

<div class = "example">
<div> This is vim example</div>
</div>

我们希望将其变为

<div class "example">
vim is so good
</div>

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

vim 从嫌弃到依赖(3)——vim 普通模式的更多相关文章

  1. 【转】将Vim改造为强大的IDE—Vim集成Ctags/Taglist/Cscope/Winmanager/NERDTree/OmniCppComplete(有图有真相)

    原文网址:http://blog.csdn.net/bokee/article/details/6633193 工欲善其事,必先利其器.一个强大的开发环境可以大大提高工作效率.好吧,我知道这是废话.. ...

  2. Vim新手入门资料和一些Vim实用小技巧

    一些网络上质量较高的Vim资料 从我07年接触Vim以来,已经过去了8个年头,期间看过很多的Vim文章,我自己觉得非常不错,而且创作时间也比较近的文章有如下这些. Vim入门 目前为阿里巴巴高级技术专 ...

  3. 将Vim改造为强大的IDE—Vim集成Ctags/Taglist/Cscope/Winmanager/NERDTree/OmniCppComplete(有图有真相)(转)

    1.安装Vim和Vim基本插件首先安装好Vim和Vim的基本插件.这些使用apt-get安装即可:lingd@ubuntu:~/arm$sudo apt-get install vim vim-scr ...

  4. vim配色方案设置(更换vim配色方案)

    vim配色后,我的 设定底色为黑色,字体为绿色,然后将文件夹设为洋红,默认的注释换为淡黄:其实有一种简单的方法,就是设定为系统配置好的配色方案:转载文章如下:   ---------------- ( ...

  5. vim学习笔记(一)—— vim安装方法

    一.完全卸载vim的方法 sudo apt-get remove --purge vim (--purge 是完全删除,会连配置文件一起删除) 二.Vim前言——————“世界上只有三种编辑器,EMA ...

  6. vim介绍/vim颜色显示和移动光标/ vim一般模式下移动光标/ vim一般模式下复制、剪切和粘贴

    5.1 vim介绍 5.2 vim颜色显示和移动光标 5.3 vim一般模式下移动光标 5.4 vim一般模式下复制.剪切和粘贴 vim   是vi的升级版本 vim 带有颜色显示 安装vim : y ...

  7. 高效率编辑器 Vim——操作篇,非常适合 Vim 新手

    原文地址:https://linuxtoy.org/archives/efficient-editing-with-vim.html vim教程:http://vimcasts.org/ https: ...

  8. Vim配置:在win10下用vim编译运行C/C++(异步插件管理,一键运行)

    为什么用Vim 重新调配vim,追求尽量简单些. 安装 官网下载 PC: MS-DOS and MS-Windows下的 For modern MS-Windows systems (starting ...

  9. vim的几个插件mark.vim ctrlp.vim等

    开发过程中, 保证语义的前提下, 尽量使用 短的 变量名: 如: 用 $map来代替 $condition, 因为在书写长的变量名的时候, 容易写错, 而排查错误, 还不容易找出来. vim在浏览和排 ...

  10. vim的个性化配置- 再谈vim的折叠和展开 -- 彻底掌握vim 的展开和折叠!

    http://www.wklken.me/posts/2016/02/03/some-vim-configs.html 一般把 设置成 逗号, 是比较好的, 因为逗号比默认的leader  要方便键入 ...

随机推荐

  1. Axure 单键快捷键

    如果怕误操作,可以把它关闭

  2. PPT 常规设置

    高级设置 可以将撤销次数调大,最多 150次 默认拉到PPT中的图片是被压缩的,可以设置成不压缩(解压 PPT 可查看里面的图片大小) 字体嵌入 可将自动保存时间调短,默认保存目录我习惯先保存到桌面( ...

  3. 初识Selenium自动化(为什么要去用自动化?)

    什么是自动化测试 让程序代替人去验证程序功能的过程 自动化测试就是把以人为驱动的测试行为转化为机器执行的一种过程 比如说:我们设计好执行脚本,通过驱动连接浏览器去模拟人去操作浏览器一般 为什么要进行自 ...

  4. 视频云AI时代,穿越市场第一,想象更多

    国际权威数据公司IDC发布<中国视频云市场跟踪(2023 H1)>报告:自2018年至今,阿里云持续保持中国视频云整体市场第一,整体市场占比达24.4%. 01 第一之外,低谷之上 近期, ...

  5. 为什么 Go 和 Rust 语言都舍弃了继承?

    为什么go和rust语言都舍弃了继承? 舍弃了 Class 舍弃或弱化子类型 类的继承是一段儿弯路 OO 发明了继承,然后发现真正有意义的是 interface 的组合(更准确的说,是 Product ...

  6. CodeForces - 651A Joysticks ( 不难 但有坑 )

    正式更换编译器为: VS Code 如何配置环境:click here 代码格式化工具:clang-format A. Joysticks 题目连接: http://www.codeforces.co ...

  7. L2-012 关于堆的判断 (25分) (字符串處理)

    将一系列给定数字顺序插入一个初始为空的小顶堆H[].随后判断一系列相关命题是否为真.命题分下列几种: x is the root:x是根结点: x and y are siblings:x和y是兄弟结 ...

  8. java 对象作为成员变量

    public class Main { private int uplimit; private int value; public Main(int uplimit){ this.uplimit = ...

  9. OpenShift image registry 访问镜像

    1. OpenShift 内部 image registry Openshift 自带内部 image registry,可通过 podman 实现 image 的 pull 和 push 操作. 对 ...

  10. JVM 内存模型及特点总结

    本文为博主原创,未经允许不得转载: JVM 内存区域主要分为线程私有区域[程序计数器.虚拟机栈.本地方法区].线程共享区域[JAVA 堆.方法区].直接内存. 线程私有数据区域生命周期与线程相同, 依 ...