vim 常用技巧和实例

查找与替换
多窗口与分屏
  • 屏幕滚动Ctrl + u(上翻半屏)、Ctrl + d(下翻半屏)、Ctrl + b(上翻整屏)、Ctrl + f(下翻整屏)。
  • 删除dd(删除整行)、dw(删除单词)、d$(删除到行尾)。
  • 复制粘贴yy(复制整行)、yw(复制单词)、p(粘贴到光标后)、P(粘贴到光标前)。
  • 撤销与重做u(撤销)、Ctrl + r(重做)。
  • 查找/pattern(向前查找)、?pattern(向后查找)、n(下一个匹配项)、N(上一个匹配项)。
  • 替换:s/old/new/g(当前行替换)、:%s/old/new/g(全局替换)。
  • 分屏:split(水平分屏)、:vsplit(垂直分屏)。
  • 窗口切换Ctrl + w + h/j/k/l(切换到左/下/上/右窗口)、Ctrl + w + w(循环切换窗口)。
宏录制
  • 录制q{寄存器名}(开始录制)、q(结束录制)。
  • 执行@{寄存器名}(执行录制的宏)、@@(重复上次执行的宏)

寄存器"{寄存器名}(指定寄存器操作),例如 "ayy 复制当前行到寄存器 a

  • f{char} 命令让vim 查找下一处指定支付{char}出现的位置,如果找到了,就直接把光标移到那里,它会在光标位置与当前位置行尾之间查找指定的字符;
  • t{char}正向移动到下一个{char}所在之处的前一个字符上;
  • ;命令会重复查找上次f命令所查找的字符,命令可以反向查找上次f{char}查找的字符 ;
  • >G命令会增加从当前行到问文档末尾处的缩进层级
  • Vim会把我们离开插入模式之前的全部按键操作都记录下来,然后按.进行重复操作;
  • <ctrl-a>和<ctrl-x>命令分别对数字执行加和减操作
  1. 如果光标不在数字上,那么<ctrl-a>将在当前行正向查找一个数字,如果找到就会跳到哪里;
  2. 如果带一个次数前缀,那就可以用他们加减任意整数。比如,把光标移到字符5上,执行10<ctrl-a>就会把它变为15;
  • cw:删除当前单词并进入插入模式;
  • G: 移动光标到当前文件的最后一行;
  • gg: 移动到当前文件的第一行;
  • nG: n为数字,移动到当前文件的第n行;
  • 在插入模式下:ctrl-w删除前一个单词;ctrl-u 删除到行首;
  • 在当前行正好处于窗口顶部和底部时,有时需要滚动屏幕,用zz命令可以把当前行显示在窗口正中;
  • R可由普通模式进入替换模式;
    1. R,空格b<Esc> 表示用",空格b"替换原来的",空格B"
  • viw 高亮选择指定文本
    1. iw:当前单词,aw:当前单词及一个空格,iW:当前字串,is:当前句子,ip:当前段落
  • <ctrl-g>可以在可视模式及选择模式间切换。如果在选择模式中输入任何可见字符的话,此字符会替换所选内容并切换到插入模式
  • V :激活面向行的可视模式,gv:重选上次的高亮选取
  • 高亮选区的范围由其两个端点界定.其中一端固定,而另一端可以随光标自由移动,可以用o来切换其活动的端点
  • :t 复制行
    1. :t$ 把当前行复制到文本结尾
    2. :'<,'>t0 把高亮选中的行复制到文件开头
  • :read !{cmd} 在shell中执行cmd,并把其标准输入插入到光标下方
  • %命令允许在一组开闭括号间跳转
    1. c% 剪切当前括号的内容到 "寄存器
  • 寄存器
    1. 在外部程序中用剪切或复制命令获取了文本,可以用过 "+p 命令将其粘贴到vim内部;
    2. 在vim的复制和删除命令之前加入"+,相应文本将被捕获到系统剪切板

实际例子

(a)列出当前文件夹下的所有文件(包含全路径)

  1. 在普通模式下key :read!ls (提取当前文件夹下的所有文件名)
  2. 手动把当前文件夹的路径粘贴到文件第一行
  3. Key <shift+v> 选中第一行
  4. Key <"ay> //把当前选定内容存入寄存器a
  5. Key <ctrl +v >选中指定行后key<shift+i>
  6. Key <ctrl +ra> //插入a 寄存器的内容

(b) 例化module提取所有port

Dut u_dut(.a(a),

.b(b));

  1. <shift+v> 选中module定义的第一行
  2. Key % 匹配括号进而选定所有port
  3. Key o 切到选中区域的开头
  4. Key <:normal f,i() enter>

(c) 跨文件复制粘贴

  1. Vim打开一个文件,比如 a.cpp
  2. 在普通模式下,输入<:sp>横向切分一个窗口
  3. 在普通模式下,key<:e b.cpp>,在另外一个窗口打开另外一个文件
  4. 切换到a.cpp所在窗口,在普通模式下,把光标移到你需要复制内容的起始行,然后输入你想复制的行的数量,在行数后面接着输入yy,就将内容复制到临时寄存器中(在普通模式下ctrl+w,再按一下w,可以在两个窗口之间切换)
  5. 切到目标文件窗口,把光标移动到你需要插入的位置,按p即可复制

(d) 用迭代求值的方式给列表编号

  1. :let i=1
  2. qa
  3. I<ctrl r>=i<Enter>)<Esc> //表达式寄存器"=,可以输入vim脚本表达式并按<Enter>执行
  4. :let i+=1
  5. q
  6. jVG 选中其余所有行
  7. :'<,'>normal @a
相关推荐
阿拉伯柠檬2 小时前
传输层与传输层协议UDP
linux·网络·网络协议·面试·udp
你好helloworld2 小时前
linux离线安装nvidia-docker
linux·运维·服务器
忙里偷闲学python2 小时前
mysql
linux·数据库·mysql·oracle
lbb 小魔仙2 小时前
【Linux】Linux入门实战教程:文件系统与进程管理
linux·运维·服务器
HIT_Weston2 小时前
76、【Ubuntu】【Hugo】搭建私人博客:Hugo 版本更新
linux·运维·ubuntu
肆悟先生3 小时前
2.1visual Studio code 插件
ide·vscode·编辑器·html5
wangyongpro3 小时前
Ubuntu 系统盘拓展分区空间大小
linux·运维·ubuntu
guaiyud53 小时前
vmware安装centos 8
linux·centos·vmware
代码游侠3 小时前
应用——Linux FIFO(命名管道)与I/O多路复用
linux·运维·服务器·网络·笔记·学习