当前位置: 首页 > news >正文

【Vim Masterclass 笔记09】S06L22:Vim 核心操作训练之 —— 文本的搜索、查找与替换操作(第一部分)

文章目录

  • S06L22 Search, Find, and Replace - Part One
    • 1 从光标位置起,正向定位到当前行的首个字符 b
    • 2 从光标位置起,反向查找某个字符
    • 3 重复上一次字符查找操作
    • 4 定位到目标字符的前一个字符
    • 5 单字符查找与 Vim 命令的组合
    • 6 跨行查找某字符串
    • 7 Vim 的增量查找
    • 8 Vim 搜索的高亮显示
    • 9 全局搜索与替换的快速交替操作
    • 10 反向全局搜索
    • 11 查找光标所在的下一个单词
    • 12 查找光标所在的上一个单词
    • 13 全局搜索 motion 与 D 命令的组合应用
    • 14 全局搜索 motion 与 Y 命令及寄存器的组合应用
    • 15 本节知识点思维导图

写在前面
开年这几天利用假期和难得的空闲时间,突击翻完了李笑来的《自学是门手艺》,收获很大。书中最后也提到了 Vim 的学习,觉得很有必要把这个专栏笔记整理完,争取在春节前顺利收官。本篇为第 6 章第 22 课的自学笔记,也是全套课程最为核心的几节操作课,主要介绍文本的检索、单词单字的匹配以及常用的替换技巧,因时长限制,Jason 讲师特地分为两部分介绍。本课为第一部分,第 23 课为第二部分。知识点不仅密集而且应用灵活性极强,需要结合示例文件用心体会、反复练习,形成肌肉记忆。如果 Vim 真的有捷径,那必定是大量实践、反复琢磨这条路。


S06L22 Search, Find, and Replace - Part One

1 从光标位置起,正向定位到当前行的首个字符 b

FB(即 F + {char}

查找该行首个大写字母 A:按 F + ShiftA

注意:f 键查找是 区分大小写 的。

2 从光标位置起,反向查找某个字符

反向查找:ShiftF + {char}。例如,反向定位到光标左边最近一个 z,按:ShiftF + Z

正向查找:forward search

反向查找:backward search / reverse search

3 重复上一次字符查找操作

正向重复查找,按 ;

反向重复查找,按 ,

4 定位到目标字符的前一个字符

正向:按 T + {char}

反向:按 ShiftT + {char}

例如,正向定位下一个 i 左边(前一个)的字符:TI

再如,反向定位上一个 i 右边(即反向的前一个)的字符:ShiftT + I

同理,可使用 ;, 分别重复定位到下一个 {char}、且在它前面(正向为左边,反向为右边)的那个字符。

注意,无论是 f 查找还是 t 查找,; 始终与上一次查找的方向保持一致;而 , 始终与上一次的方向相反。

此外,这两类查找也支持数量词 {count}。例如,从当前位置开始,正向查找当前行的第 2 个空格字符,需键入:2FSpace

【复习】

重复上一次 Vim 命令,用的是 .;而这里的 f 查找和 t 查找对应的是动作 motion,并且可能存在多个匹配项,所以只能按 ;, 进行正反向浏览。

与此同时,也正因为这些查找属于 motion 动作,而非 command 命令,它们也可以和前面学过的其它 command 命令组合使用(如 c / d / y 命令等)

5 单字符查找与 Vim 命令的组合

对于下列文本内容:

Delete THIS<<--- word.

F + ShiftT 将光标定位到大写字母 T 后,需要删除字符 T(包含)到字符 w(不包含)之间的内容,至少有三种解决方案:

  • D + TW
  • D + FSpace
  • 还可以用前面介绍的 D + ShiftW

6 跨行查找某字符串

使用 / + {target_string}

例如:正向跨行查找字符串 and/ + and

正向快速匹配下一个目标,按:N

反向快速匹配,则按:ShiftN

一直按 N 匹配到当前文件的最后一个目标字符串后,再次按 NVim 会提示 search HIT BOTTOM, continuing at TOP,并将光标定位到文件第一处匹配项(反之亦然):

图 22-1 跨行查找到最后一处关键字后,Vim 提示继续查找将从文件开头重新开始

【图 22-1 跨行查找到最后一处关键字后,Vim 提示继续查找将从文件开头重新开始】

想要重新检索其他字符串,键入 / + {new_string} 即可。

7 Vim 的增量查找

增量查找(incsearch,即 incremental search)Vim 中的一个配置项,启用该配置项后,Vim 会在输入搜索关键字的过程中,实时显示最新的匹配结果。也就是说,可以看到搜索结果的 即时反馈,而不必等到输完搜索字符串后再进行查找。

相关操作增量搜索命令
查看:set is? / :set incsearch?
开启:set is / :set incsearch
关闭:set nois / :set noincsearch
切换:set is! / :set incsearch!

8 Vim 搜索的高亮显示

搜索高亮显示(hls,全称 hlsearch,即 highlight search),默认关闭。开启后,当前文件所有的匹配项都将高亮显示,直到换成其他关键词或者关闭高亮。相关配置命令如下:

相关操作高亮显示命令
查看:set hls? / :set hlsearch?
开启:set hls / :set hlsearch
关闭:set nohls / :set nohlsearch
切换:set hls! / :set hlsearch!
临时关闭:nohls / :nohlsearch

注意:临时关闭只对当前匹配结果生效;只要用 / 重新检索,Vim 就会重新恢复高亮显示。

关于 Vim 偏好的具体配置,后续还会重点介绍,这里暂不展开。

9 全局搜索与替换的快速交替操作

先用 /{keyword} 搜索,然后用 cw 等命令替换为其他关键词;后续再通过 N. 快速定位、快速替换,实现快速交替操作。

例如:全文检索 and 并替换为 &,可以先用【/and + CW + &】完成第一组操作,随后交替使用 N. 实现快速替换。

10 反向全局搜索

反向搜索(backward search,或者 reverse search),使用:? + {keyword}

例如,从当前光标位置开始,反向检索关键词 is? + is

同理,重复下一个匹配项(即向上查找),使用 N;逆向操作使用 ShiftN(即向下查找)。

11 查找光标所在的下一个单词

使用星号键 *

例如:光标定位到单词 is 的任一字符上,键入 * 可以全局匹配到下一个单词 is,继续按 * 或者 N 可匹配下一处;上一处用 ShiftN

注意

* 只能匹配单词 is,无法匹配像 episodesister 这样关键词出现在中间的情况,因为 * 表示匹配完整单词(matching an entire word)。

12 查找光标所在的上一个单词

使用 #,重复该操作,使用 #N;逆向操作仍然使用 ShiftN

发散

从形状上看,# 更像是 * 的 “放大版”,形似 * 的 “大写”;而 * 则形似 # 的 “小写”。

13 全局搜索 motion 与 D 命令的组合应用

全局搜索本质上也属于 motion 操作,因此同样可以与 command 命令组合使用。例如,删除当前光标到下一处 This(不含)之间的文本内容:

图 2:全局搜索与命令的组合示例:删除当前光标到 This 间的内容(操作前)

【图 2:全局搜索与命令的组合示例:删除当前光标到 This 间的内容(操作前)】

键入 D/ + This + Enter,得到如下结果:

图 3:执行 D/This + Enter 后的最终结果

【图 3:执行 D/This + Enter 后的最终结果】

14 全局搜索 motion 与 Y 命令及寄存器的组合应用

此外,也可以将组合操作的内容放入某个寄存器。

例如:将文件初始位置到下一个 z 之间的内容,存入寄存器 "a

操作前(光标位于起初位置):

图 4:Y 命令 + 全局搜索 + 寄存器操作示例(操作前)

【图 4:Y 命令 + 全局搜索 + 寄存器操作示例(操作前)】

依次键入 "AY + /Z + Enter,并查看寄存器 "a 的内容,得到如下结果:

图 5:执行 "ay/z + Enter 操作后,查看寄存器 a 中的内容(操作成功)

【图 5:执行 "ay/z + Enter 操作后,查看寄存器 a 中的内容(操作成功)】

15 本节知识点思维导图

图 6:本课知识点思维导图梳理

【图 6:本课知识点思维导图梳理】

第二次整理思维导图才发现,这些按键操作有很多对应关系,根本不用死记硬背:

  • 在当前行进行检索,一般是精确到某个字符,这样就有两种情况:
    • 找到 目标字符:英文为 find,即 F 查找:f + {char}
    • 邻近 目标字符:英文为 till,即 T 查找:t + {char}
    • 上述两种情况都是正向检索,刚好 ft 有对应的大写,因此反向检索就分别为 FT
    • 若当前行存在多个匹配项,则定位下一个匹配项用 ;,但 : 已经被命令模式占用,因此只能从字形上进行关联。要找到一个类似 Shift; 功能的按键,可以尝试 .,,但前者已被 Vim 命令的重复执行占用,因此只能是 ,
  • 若要跨行检索,则往往以字符串为基础,以便减少候选词的数量:
    • 正向用 / 的话,逆向自然就用 Shift/,即 ?
    • 当存在多个匹配项,需要定位到 下一个(next) 关键词,因此下一个匹配项使用 N,上一个自然就是 ShiftN
    • 为了补充跨行检索,又出现了单词完整匹配查找,分别使用 *#;同时 NShiftN 仍然有效。至于为什么是 *#,完全就是从形状上考虑的。

后记
Vim 的使用我觉得是计算机领域少有的 “先难后易” 技能,为了今后的流畅体验,现在苦一点累一点是非常值得的。能否熟练使用 Vim 也是评价一个人计算机综合素养的重要指标之一。

(第一部分完)


http://www.mrgr.cn/news/83434.html

相关文章:

  • 电源故障导致服务器无法启动的解决方法
  • B树及其Java实现详解
  • 《操作系统真象还原》第十二章(一) —— 系统调用
  • 深度学习从入门到实战——卷积神经网络原理解析及其应用
  • 浅尝Appium自动化框架
  • Real DOM 和 Virtual DOM,差异在哪?优缺点几何?一文说清
  • SpringCloud项目搭建快速入门
  • CentOS 7 下 MySQL 5.7 的详细安装与配置
  • C语言程序环境和预处理详解
  • 模拟闯红灯的抓拍系统
  • RabbitMQ高级篇
  • LeetCode 热题 100 | 双指针
  • 【数据结构】第1天之Java中的数据结构
  • 【MySQL学习笔记】MySQL视图View
  • C语言中两个不同类型的结构体相互赋值
  • ffmpeg 常用命令 案例
  • word中电流符号i或者j,这两个字母的头上的点会消失---完美解决办法
  • AI人工智能(3):Python 入门机器学习
  • fisco bcos CRUD编写合约的注意点
  • 【应用篇】09.自主Shell命令行解释器
  • mysql中创建计算字段
  • 音视频入门基础:RTP专题(2)——使用FFmpeg命令生成RTP流
  • ollama简单上手
  • 【C语言】_使用冒泡排序模拟实现qsort函数
  • java_将数据存入elasticsearch进行高效搜索
  • Vue Router4