Skip to content

Instantly share code, notes, and snippets.

@CyberGitter
Last active November 14, 2017 01:45
Show Gist options
  • Save CyberGitter/75c8f7923a73f2555992 to your computer and use it in GitHub Desktop.
Save CyberGitter/75c8f7923a73f2555992 to your computer and use it in GitHub Desktop.
进行文档整理时,Vim确实能带来不少方便
查找替换
:s/old/new/g
:%s/old/new/gc
g表示global,c表示confirm
批量删除
在规则文本后插入
在每行后插入空行
:g/$/norm o
:[range]g/$/norm o
Vim中匹配行尾到底用`$`还是用`\n`?它们到底有什么区别?
列出一些我想了解的要点吧:
Unix/Windows/Mac换行的区别
<CR><NL>
CTRL-V CTRL-M
Windows+gVim中,用`:%s/\r//g`删除`^M`。详见[这里](http://stackoverflow.com/questions/5843495/what-does-m-character-mean-in-vim)
Vim中`\n`和`\r`的区别
^M 其实就是 \r ,也就是说这个文件所使用的回车是 mac 中的。也就是 apple公司生产的操作系统内默认的换行符。
在 windows中默认是 \r\n
在 unix/linux 中默认是 \n
只需要在vi/vim 中输入命令:%s/\r//g或者:%s/[ctrl-v][ctrl-m]//g ====== :%s/^M//g
效果是一样的,注意这里的 ctrl-v 和 ctrl-m 是你的按键,不是直接打字母上去,所以显示出来的是:%s/^M//g
正则表达式中的行首行尾匹配:
在“第*条”后只采用一个全角空格
:%s/ +/ /g
注意,要用`+`,而非`*`,不然会在每个字符后面都添加一个全角空格。并且,最佳实践最好也是都用`+`,这样保证只对确实存在空格的地方进行操作。
更新:此法不通,提示找不到模式` +`
如何连接连续的多行?
:[range]s/\n/
如何在“第某条”后插入空格?
%s/\(第.\{1,3}条\)/\1 /g
在reST中,将“第某条”加粗:
%s/\(第.\{1,3}条\)/**\1**/g
同理也可构造在前面插入空格的命令
例如,在“(一)”之前插入“- ”:
%s/\(^(\)/- \1/g
非空行前插入空格:
%s/\(^.\+$\)/  \1/g
把1、改成1. 
%s/\(\d\{1,2}、\)/\1. /g
另外注意,正则表达式中,“(”是直接匹配的,不必用“\(”转义。在Vim中亦是如此。
注意在Vim中,grouping的括号,以及指明匹配次数的{},都需要用\转义:\(\)、\{}
以上,请注意区分作为实体符号的小括号与作为grouping定界符的小括号,以免疑惑于为何有时需要转义,有时又不需要。
隔行删除:
[range]norm jdd
将多个连续两次或以上的空行合并为一个空行:
删除所有空行:
:g/^$/d
将顶格的“第某章”转换为mediawiki语法:
%s/\(^第.\{1,3}章.\+$\)/== \1 ==/g
对数字开头的行,在行尾添加一个“:”:
%s/\(^\d.\+$\)/\1:/gc
每行的行首都添加自定义的文本或字符串:
%s/^/要插入的字符串
每行的行尾都自定义的文本或字符串
%s/$/要插入的字符串
全句前后加包裹
%s/\(^.\+$\)/* [[\1]]/gc
删除
%s/^要删除的字符串//g
把句首中文括号及其中的文号移至句尾
%s/^\((.\+)\)\(.\+\)$/\2\1/gc
注意:替换为的字符串中,不要加上^与$
将文本字符串以超级链接标签包裹起来
%s/\(^.\+$\)/<li><a href="">\1<\/a><\/li>/gc
如何删除多余的空格:其实有一个很好的hack,在记事本中,先把连续的2个空格替换为1个,然后再继续操作。
一般的方法是:
`%s/\s//gc`
其中,正则表达式提供了元字符`s`,用以匹配任意的空白符。
`%s/ //gc`
Vim中,空格可以直接匹配。
Vim中,如何匹配连续的多个模式
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment