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
相关推荐
杜子不疼.23 分钟前
进程控制(四):自主Shell命令行解释器
linux·c语言·人工智能
橘颂TA25 分钟前
【Linux 网络】深入理解 UDP
linux·运维·服务器·网络·网络协议
乱蜂朝王8 小时前
Ubuntu 20.04安装CUDA 11.8
linux·运维·ubuntu
梁洪飞9 小时前
clk学习
linux·arm开发·嵌入式硬件·arm
~光~~9 小时前
【嵌入式linux驱动——点亮led】基于鲁班猫4 rk3588s
linux·点灯·嵌入式linux驱动
yuanmenghao10 小时前
车载Linux 系统问题定位方法论与实战系列 - 车载 Linux 平台问题定位规范
linux·运维·服务器·网络·c++
qq_5895681011 小时前
centos6.8镜像源yum install不成功,无法通过镜像源下载的解决方式
linux·运维·centos
weixin_5160230711 小时前
linux下fcitx5拼音的安装
linux·运维·服务器
hunter145012 小时前
Linux 进程与计划任务
linux·运维·服务器
楼田莉子12 小时前
Linux学习之磁盘与Ext系列文件
linux·运维·服务器·c语言·学习