复习编辑器之神Vim, 顺便立个Flag,以后的verilog都使用Vim进行编写。 🙌
选择与替换
选择块内容:
如果使用的是GVim,可以直接使用 鼠标进行拖动,GVim会自动进入Visual Mode。如果在拖动鼠标的同时按住键盘的Alt键,Vim就会进入Visual-Block模式,在这个模式下可以进行块选择。
" 快速选择段落内容
vip
" 选择 { ( [ 的内容
vi(
" 选取上一次选择的区域, 正常模式下
gv在Visual-Mode中选择需要的内容后就可以使用d x y p等命令对选中的内容进行相关操作。
搜索关键字:
当需要在Vim中搜索关键字时,在normal mode下使用/name 进行搜索。
搜索时可以连接标识符,指定搜索的范围,是否大小写敏感等。具体表示符如下:
/g表示在全局范围内进行操作/c表示在替换操作时需要进行确认/I表示需要在搜索时对关键字的大小写敏感
指定搜索范围:
:%代表整个文件: i, j搜索范围是 第 i 到 j行:.,+x搜索范围是从当前行和接下来的两行
搜索关键字的一个重要作用就是在/前面加上s,就可以进行关键字的搜索替换,具体格式为:s/name/new_name
例如,在写testbench的时候需要从原模块中复制输入输出的定义后将input替换为reg,将output替换为wire类型。可以使用如下命令进行修改替换:
" 全局范围内进行搜索 input 替换为 reg,% 代表整个文件,g 代表全局范围内,c代表在替换时需要进行逐项确认
:%s/input/reg/gc
" 在 i,j 行之间进行搜索替换
:i,js/input/reg/gc
" 在选中的内容中进行搜索替换
:<,'>s/input/reg
" 从当前行开始,向下两行的范围内进行搜索替换,点代表当前行
:.,+2/s/input/reg
" 在全局范围内对已经选择(搜索)到的关键字进行替换
:%s//new_name/gc在搜索完成后可以使用noh取消搜索结果的高亮显示。
批量操作
在多行添加内容:
在例化代码模块时,可以快速从源文件中将模块复制过来并将参数名统一添加.和括号()。
在列选择模式下选择第一列,按下 I,输入需要插入的内容后,按下<ESC>键后就可以完成批量添加。下面就是将module改为例化模块的方法。

宏功能
宏功能可以将需要重复执行的动作记录下来,然后批量执行。
| 命令 | 模式 | 说明 |
|---|---|---|
| qx | Normal Mode | 录制宏 到 x,x可以是 abcde...等等 |
| q | Normal Mode | 停止录制 |
| @x | Normal Mode | 运行宏,可以在按之前输出数字指定重复执行的次数 |
快速对齐
使用Vim-Plug安装Easy-Align插件,并在.vimrc里面加上
xmap ga <Plug>(EasyAlign)
nmap ga <Plug>(EasyAlign)配置好后再Visual-Mode下选择需要对齐的代码,按下 ga+ 标识符就可以快速对齐代码了。
例如需要对齐一些localparam的声明,再使用鼠标选择之后,按下ga+ ** + <SPACE>就可以快速以空格为中心将代码进行对齐。
可以在输入对齐字符之前按下<Left> 或者<Right>选择左对齐或者右对齐。

快速移动
单词之间的移动
在Vim中使用光标移动到一个单词后,在Normal Mode下按下*,Vim就会自动高亮所有匹配的单词,再次按下*,指针就会跳转到下一个一样的单词,按下#可以跳转到上一个单词。
使用~~可以跳转到上一个编辑的位置。
! 注意:这里是~~,~代表对的单词的大小写进行替换。
配对括号之间的跳转
在一个括号上按下 %可以快速跳转到它匹配的另一半的位置。
文件内跳转
" n 为行数
:n
" 跳转到文件头
gg
" 跳转到文件尾
G行内的跳转
" 下一个单词的第一个字母
w
" 上一个单词的第一个字母
b
" 当前单词的最后一个字母,如果已经在最后一个字母,则会跳转到下一个单词的最后一个字母
e
" 上一个单词的最后一个字母
ge
" 跳转到行首
0
" 跳转到行尾
$Easy-Motion插件
使用Vim-Plug安装Easy-Motion插件,并在.vimrc里面加上
nmap s <Plug>(easymotion-overwin-f2)在Normal-Mode中按下s并输入想要跳转到地方的头两个单词,并按下屏幕中提示的字符就可以将指针快速地移动到指定为位置。
例如我当前的光标再else的位置,我想快速跳转到 clk_baud位置处。在Normal Mode下按下 scl,并根据提示按下s键,光标就跳转到了指定的位置。

代码折叠
可以设置折叠的模式,这里直接设置为marker模式,且折叠标记设置为//BEGIN和//END。
:set foldmethod=marker
:set foldmarker=//BEGIN,//END| 命令 | 模式 | 说明 |
|---|---|---|
| zc | Normal Mode | 折叠当前块 |
| zo | Normal Mode | 展开当前块 |
| zC | Normal Mode | 折叠所有可以折叠的块 |
| zO | Normal Mode | 展开所有可以折叠的块 |
不常用操作
| 命令 | 模式 | 说明 |
|---|---|---|
| CTRL-O | Normal Mode | 打开上一个最近打开的文件 |
| CTRL-I | Normal Mode | 打开下一个最近打开的文件 |
| Ctrl-u | Normal Mode | 向下移动半个屏幕 |
| Ctrl-d | Normal Mode | 向上移动半个屏幕 |
分屏操作
| 命令 | 模式 | 说明 |
|---|---|---|
| :vs | Normal Mode | 横向拆分窗口 |
| :sp | Normal Mode | 纵向拆分窗口 |
| C-w w h j k l | Normal Mode | 切换当前窗口,w 是循环切换 |
| C-w q | Normal Mode | 关闭当前窗口 |
Buffer操作
| 命令 | 模式 | 说明 |
|---|---|---|
| :ls | Normal Mode | 列出当前所有打开的文件 |
| :bn | Normal Mode | 跳转到下一个编辑文件 |
| :bp | Normal Mode | 跳转到上一个打开的编辑文件 |
其他
使用--cmd 可以在shell里面调用vim的命令,从而和shell 进行结合并自动化完成某些操作
vim --cmd PluginInstall