Vim range详解

本来是要写substitute的, 然后发现range功能太过于强大, 并且很多地方都要使用,
所以本文写range, 写下本文也是为自己梳理一下,
本文的主要内容主要来自官方文档加上自己的理解, 如果想看官方文档请在Vim中执行:h [range]

range

[range]代表替换作用的范围

下面我将范围分成单行多行

单行

  • {number} 行号为number 的那一行
  • . 光标当前行(默认)
  • $ 最后一行
  • 't mark t(小写的mark) 所在 的那一行
  • 'T mark T(大写的mark) 所在 的那一行 (如果在mark T 不在本文件不会生效)
  • /{pattern}[/] 当前光标向下匹配{pattern} 的那一行
  • ?{pattern}[?] 当前光标向上匹配{pattern} 的那一行
  • \/ 向下搜索你上一搜索的内容 的那一行
  • \? 向上搜索你上一搜索的内容 的那一行
  • \& 向下搜索你上一次替换中的{pattern} 的那一行

多行

  • % 整个文件, 相当于1,$

注: 如果向下搜索指的并不单单是从当前光标到底部, 而是光标到底部(不包含光标那一行)和顶部到光标(包含光标那一行)

加减号

在上面的单行范围中我们又可以在后面加上数字来指定一个偏移
e.g.
.+1 就代表向下偏移一行
.-1 就代表向上偏移一行
/findsomething/+3 找到findsomething那行再往下偏移3行

逗号和分号

{n1},{n2} 表示的范围就是n1n2(包括)
e.g.
1,3 表示第一行到第三行(包括)

1,/find/ 表示从第一行到 从光标开始找find的那一行

所以,的执行是这样的: 先执行n1找到行号, 再执行n2找出行号, 就是之间的范围

;,为唯一的区别是;会先移动光标到;左边的行号, 再去执行,
这就导致了开始找的范围不一样

所以;的执行是这样的: 先执行n1找到行号, 将光标移动到n1, 再执行n2

//

{n1}//{n2} 先找n1在从n1那行开始找n2

Author: comwrg
Link: https://comwrg.github.io/2018/11/06/vim-range-details/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.