找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1422

积分

0

好友

204

主题
发表于 昨天 18:32 | 查看: 4| 回复: 0

在强大的vim编辑器中,range(范围)是一个核心且功能强大的概念,它极大地扩展了编辑命令的灵活性和威力。

许多冒号命令都支持 [range] 参数,例如:

复制命令:

:[range]co[py] {address}  " 帮助命令 :copy

替换命令:

:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]  " 帮助命令 :s

一、替换命令(:substitute)与范围

我们从最常用的 :s:substitute 的缩写)命令开始。它允许你在指定范围内搜索并替换文本,基本格式如下:

:[range]s/from/to/[flags]

这个命令会将 [range] 指定行内的字符串 from 替换为字符串 to。例如,将所有行中的 Professor 替换为 Teacher

:%s/Professor/Teacher/

命令前的 % 表示范围是整个文件(1,$ 的简写)。如果不指定范围,:s 命令仅作用于当前行。

默认情况下,替换只针对每行的第一个匹配项。要为行中所有匹配项执行替换,需要添加 g(全局)标志:

:%s/Professor/Teacher/g

替换命令还支持其他有用的标志,如 c(确认),它会在每次替换前请求确认。Vim 会提示 replace with Teacher (y/n/a/q/l/^E/^Y)?,你可以选择:

  • y: 替换当前匹配项。
  • n: 跳过当前匹配项。
  • a: 替换所有剩余匹配项,不再询问。
  • q: 退出替换操作。
  • l: 替换当前项后退出。

s/ 后面的 from 部分是一个模式(正则表达式),例如,要替换行首的 the

:s/^the/these/

如果模式或替换字符串中包含正斜杠 /,可以用反斜杠转义,或者使用其他分隔符(如 +=)以提高可读性:

:s+one/two+one or two+

二、范围的指定方法

范围总是放在冒号命令的开头,用于精确控制命令生效的行。

1. 使用行号
最直接的方式是使用确切的数字行号。

  • :1,5s/this/that/g:在第1至第5行(含)进行替换。
  • :54s/President/Fool/:仅在第54行进行替换。

2. 使用特殊符号

  • .:代表当前行。例如 :.write otherfile 仅将当前行写入另一文件。
  • $:代表文件最后一行。例如 :.,$s/yes/no/ 从当前行修改到文件末尾。
  • %:代表整个文件 (1,$)。

3. 使用搜索模式
范围可以由搜索模式来动态定义。

  • :/^Chapter/,/^Chapter/s=grey=gray=g:从当前向前的首个 ^Chapter 行,到当前向后的下一个 ^Chapter 行之间进行替换。这里用 = 代替 / 作为分隔符以避免混淆。
  • 模式后可以跟偏移量:/Chapter/-1 表示匹配行的上一行/Chapter/+2 表示匹配行的下两行

4. 使用标记 (Mark)
如果你用 mtmb 分别标记了文本块的起始和结束,那么范围可以表示为:

:'t,'b

这表示从标记 t 所在行到标记 b 所在行。

5. 源自可视模式
在可视模式下选择文本行后,输入 : 进入命令行模式,你会看到自动生成的范围 :'<,'>,它代表了刚才选中的行区域。'<'> 就是标识可视选区起止位置的标记。

6. 指定行数
在输入冒号前先输入一个数字 N,然后按 :,Vim 会自动生成从当前行开始的 N 行范围 :.,.+N-1。接着输入命令即可。

三、范围限定符完整列表与规则

以下是Vim中可用的行限定符总结:

  • {number}: 绝对行号。
  • .: 当前行。
  • $: 文件最后一行。
  • %: 整个文件 (1,$)。
  • 't: 标记 t 所在行(小写标记可跨缓冲区)。
  • /pattern/: 向下匹配 pattern 的下一行。
  • ?pattern?: 向上匹配 pattern 的上一行。
  • \/: 下一个匹配上次搜索模式的行。
  • \&: 下一个匹配上次替换模式的行。

这些符号后可附加 +n-n 来表示偏移。范围可以用逗号 , 或分号 ; 连接。使用 , 时,两个地址基于原始行号计算;使用 ; 时,第二个地址的计算会从第一个地址确定的位置开始。

看到这些强大的范围指定方式,你会发现其理念与 awksed 这类经典的文本处理工具中的 pattern { action } 高度一致,体现了Unix哲学下工具设计的通用性与灵活性。

最后,一个小技巧:你可以在Vim内部直接打开一个终端,而无需切换窗口:

:terminal bash

这为在编辑器中执行Shell命令提供了极大便利。




上一篇:RocketMQ零拷贝深度解析:sendfile与mmap如何实现百万级吞吐
下一篇:Go方法接收者选择指南:指针接收者优势与接口实现详解
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-24 19:21 , Processed in 0.175391 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表