Showing posts with label vim. Show all posts
Showing posts with label vim. Show all posts

Wednesday, November 7, 2018

Vim 替换基本命令讲解

使用Vim很长时间了, 我对于替换命令的印象还是最基本的这样:%s/pattern/string/g
所以写下本文是为了好好梳理一下, 本文只总结最常用的方法对于不常用或比较复杂的不进行介绍
本文基于Vim Docs, 想看官方文档的请在Vim中运行:h :s

基本格式

替换命令的基本格式是:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]
我们可以分成
  • [range]
  • s[ubstitute]
  • {pattern}
  • {string}
  • [flags]
  • [count]
    来进行讲解

[range]

range太强大, 很多地方都可以用的到, 所以我单独写了一篇: Vim range详解

s[ubstitute]

这里的s[ubstitute]代表动作为替换, 由于substitute太长, 一般简写s即可

{pattern}

用来匹配的正则表达式

{string}

用来替换的内容
支持正则表达式的子匹配
  • \0 匹配到的字符串
  • \1 第一个子匹配
  • \2 第二个子匹配…以此类推
  • \r 换行
  • \b backspace
  • \t table
  • \\ \

[flags]

Options
  • c confirm, 每个匹配都可以选择替换还是不替换
    • y yes, 替换
    • l last, 替换并退出
    • n next, 跳过
    • a all, 替换此次和后面所有
    • q quit, 退出
  • g 对行内所有匹配, 如果没有这个标志, 默认只替换行内匹配的第一个
  • i ignore 忽略大小写
  • I 不忽略大小写
  • n 不进行替换, 只显示匹配成功的次数
  • p print, 显示最后一次匹配的行
  • # 类似p, 同时显示行号
  • l list, 类似p, 但显示方式类似于:list

[count]


替换的行数
默认为一行
如果[range]省略, 连光标那一行往下一共[count]行的范围
否则是[range]最后一行往下一共[count]行的范围

Tuesday, November 6, 2018

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