侧边栏壁纸
  • 累计撰写 793 篇文章
  • 累计创建 1 个标签
  • 累计收到 1 条评论
标签搜索

目 录CONTENT

文章目录

Vim

Dettan
2021-04-10 / 0 评论 / 0 点赞 / 136 阅读 / 1,972 字
温馨提示:
本文最后更新于 2022-07-23,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
/ 后端 / Tool / Vim
"_d 黑洞寄存器
加括号的 view模式下加映射
z(
z)
z{
z}
z[
z]


:imap jk <Esc>
" 翻页
:map zj Lzz
:map zk Hzz
" 缩进
:nmap <tab> V>
:nmap <s-tab> V<
:vmap <tab> >gv
:vmap <s-tab> <gv
" 加括号
:map z( i(<Esc>ea)<Esc>

导航
# * 搜索当前单词,然后跳到上/下一个
- + 跳转到上/下一行软行首
段落
{ } 上/下一个空行
( ) 上/下一段的首部 (段是空格分开的)
标记
m 字母 打上mark,
` 跳转到标记
‘ 字母 跳到mark行首
屏幕
H M L 屏幕的顶行/中行/底行
zt zz zb 移动当前行至屏幕顶/中/底端
vim中删除技巧
:%s/[Ctrl-v][Enter]//g         删除DOS方式的回车^M
:%s= *$==                      删除行尾空白
:%!sort -u                     删除重复行
:%s/^.{-}pdf/new.pdf/          只是删除第一个pdf
:%s///                         删除多行注释
:g/^$/d                        删除所有空行 
:g!/^dd/d                      删除不含字符串'dd'的行
:v/^dd/d                       删除不含字符串'dd'的行
:g/str1/,/str2/d               删除所有第一个含str1到第一个含str2之间的行
:v/./.,/./-1join               压缩空行
:g/^$/,/./-j                   压缩空行
ndw 或 ndW                     删除光标处开始及其后的 n-1 个字符。
d0                             删至行首。
d$                             删至行尾。
ndd                            删除当前行及其后 n-1 行。
x 或 X                         删除一个字符。
Ctrl+u                         删除输入方式下所输入的文本。
D                              删除到行尾

录制到a这个寄存器里.

qa  开始录制
q   结束录入
@a  播放宏


.vimrc 文件中加入下面把宏持久化保存
let @宏名 = "代码"

代码
替换
一、把空格替换为换行
:% s/ /\r/g
二、把空行删除
:g/^$/d
:%s/(\d+章)/第\1/g 把 12章 前面加上个第,变成第12章.
正则规则 http://www.360doc.com/content/17/1206/19/37257658_710576169.shtml

vi/vim 中可以使用 :s 命令来替换字符串。该命令有很多种不同细节使用方法,可以实现复杂的功能
:s/vivian/sky/ 替换当前行第一个 vivian 为 sky 
:s/vivian/sky/g 替换当前行所有 vivian 为 sky 
:n,替换第行开始到最后一行中每一行的第一个为   
:,s/vivian/sky/替换第n行开始到最后一行中每一行的第一个vivian为sky   
:n,s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky n 为数字,若 n 为 .,表示从当前行开始到最后一行 
:%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky 
:%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky 可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符 
:s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/ 
:%s+/oradata/apras/+/user01/apras1+ (使用+ 来 替换 / ): /oradata/apras/替换成/user01/apras1/ 
1.
:s/vivian/sky/ 替换当前行第一个 vivian 为 sky 
:s/vivian/sky/g 替换当前行所有 vivian 为 sky 
2.
:n,替换第行开始到最后一行中每一行的第一个为   
:,s/vivian/sky/替换第n行开始到最后一行中每一行的第一个vivian为sky   
:n,s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky (n 为数字,若 n 为 .,表示从当前行开始到最后一行) 
3.
:%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky 
:%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky 
4. 可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符 
5. 删除文本中的^M 
6. 替换确认
7. 其它 
(原文地址: http://wzgyantai.blogbus.com/logs/28117977.html)



1.替换变量 在正规表达式中使用 ( 和 ) 符号括起正规表达式,即可在后面使用\1、\2等变量来访问 ( 和 ) 中的内容。
example:
·将 data1 data2 修改为 data2 data1
:s/(\w+)\s+(\w+)/\2\t\1、
·将 Doe, John 修改为 John Doe
:%s/(\w+), (\w+)/\2 \1/
2.利用函数式替换
用法:
:s/替换字符串/\=函数式
说明: ·函数式可以有多个,返回值可以用字符串连接符.连接起来,如line(".")返回匹配行号(:help line() ),submatch(n)可以引用\1、\2的内容,其中submatch(0)引用匹配的整个内容; ·函数式也可以是字符串常量,用双引号引起来。函数式也可以是任意表达式,需要用小括号引起来,如(3+2*6); ·函数式还可以是寄存器中的内容,通过"@寄存器名"访问,如@a(不需要加引号,但是还是需要用.来连接); example: ·要将下列8行的data0依次变成data0~7(前面的数字是行号) double data0; double data0; double data0; double data0; double data0; double data0; double data0;
double data0;
ma
:%s/^(double\s+data)\d(;)/\=submatch(1).(line(".")-line("'a")+1).submatch(2)/g
再或者 首先将光标移到125行(line("'V7j
:%s/^(double\s+data)\d(;)/\=submatch(1).(line(".")-line("'
3.匹配的开始与结束
\zs和\ze可以用于替换操作中指明替换的开始与结束,如上例中可以以更短的操作来实现:
ma
:%s#^double\s+data\zs\d\ze#\=(line(".")-line("'a")+1)#g
另外,还可以使用vim表达式来实现上述功能:
:let n=0 | g/^double\s+data\zs\d/s//\=n/ | let n+=1
其中 ·| 用来分割不用的命令; ·g 在匹配后面模式的行中执行指定的ex命令 ·\zs 指明匹配由此开始 ·s//\=n 对匹配模式进行替换,匹配模式为空,表示以上一次匹配成功的模式, 并且指明替换是一个表达式;
1.
高级递增替换
把下面几句放到 _vimrc
let g:I=0 function! INC(increment) let g:I =g:I + a:increment return g:I
endfunction
·对于上述问题,可以这样解决:
:let I=-1 | %s/^ double\s+data\zs\d\ze/\=INC(1)/
·还可以生成数字序列,如生成1~100间隔为5的数字序列:
:let I=0 | ‘a,’b s/^/\=INC(5)/
5.进行四舍五入的替换操作(该部分转载) 298.896 448.344 597.792 149.448 224.172 298.896 448.344 149.448 224.172 以上的数据来自真实的需求, 目前需要把他们按四舍五入的原则取整.
vim7中引入了一种叫dictionary的数据类型, 即哈希. 利用他能对一些不同的源字串提供不同的替换:
:let a={0:0, 1:0, 2:0, 3:0, 4:0, 5:1, 6:1, 7:1, 8:1, 9:1}
一目了然, 0-4则取0, 舍, 5-9则取1, 进位.
:%s#^(\d+).(\d)\d*#\=(submatch(1)+a[submatch(2)])#g
为了验证是否正确, 将上面的式子简单修改, 能输出下面的结果, 方便对比校验:
:%s#^(\d+).(\d)\d*#\=(submatch(0).'==>'.(submatch(1) + a[submatch(2)]))#g
298.896==>299 448.344==>448 597.792==>598 149.448==>149 224.172==>224 298.896==>299 448.344==>448 149.448==>149 224.172==>224 结束 来源: http://blog.itpub.net/25897606/viewspace-746838

0

评论区