使用VIM,你可以完全解放鼠标,只用到大键盘就可以完成所有操作,非常的方便快捷,可以让我更加专注设计。
GVIM的配置,只需要配置_vimrc文件即可,想要什么功能都可以自己配置,比如我喜欢的光标不闪烁;括号自动补全,并跳出括号;列操作;在insert模式下,使用pp自动补全,hh左移,jj下移等。
以下内容分两部分,一是GVIM自带的命令汇总,二是自定义的规则,便于我快捷写verilog代码,可以快速添加文件注释,module模块,宏定义和接口信号声明,代码主体部分,组合逻辑,异步/同步时序逻辑设计等
注:
// *********************************************************************
// File Name : GVIM.txt
// Author : YYB
// Create Date : 2019-12-05 15:41
// Last Modified : 2019-12-05 15:41
// Description : GVIM自定义规则汇总
// Notes :
// *********************************************************************
GVIM命令:
normal模式和insert模式:
normal模式下的命令:
i --> 进入insert模式,按ESC回到normal模式
x --> 删除当前光标所在的一个字符
:wq --> 存盘+退出(:w 存盘,:q 退出)(:w后可以跟文件名)
dd --> 删除当前行,并把删除的行存在剪贴板里
p --> 粘贴剪贴板
hjkl --> 左下上右
:help
各种插入模式:
a --> 在光标后插入
O --> 在当前行前插入一个新行
o --> 在当前行后插入一个新行
简单的移动光标:
0 --> 数字零,到行头
^ --> 到本行第一个不是blank字符的位置(所谓blank字符就是空格、tab、换行、回车等)
$ --> 到本行行尾
g_ -->到本行最后一个不是blank字符的位置
/pattern --> 搜索pattern的字符串(如果搜索出多个匹配,可按n键到下一个)
:noh --> 取消搜索字符串的高亮显示
拷贝/粘贴:
yy --> 拷贝当前行于剪贴板
p --> 粘贴,当前位置之后
Undo/Redo:
u --> undo
打开/保存/退出/改变文件:
:e
:wq --> 存盘+退出(:w 存盘,:q 退出)(:w后可以跟文件名)
:q! --> 退出不保存
:saveas
重复自己:
. --> (小数点)可以重复上一次的命令
N
比如:2dd --> 删除2行 3p --> 粘贴文本3次
光标移动更有效率:
gg --> 到第一行
NG --> 到第N行
G --> 到最后一行
按单词移动光标:
w --> 到下一个单词的开头
e --> 到下一个单词的结尾
最强的光标移动:
% --> 匹配括号移动,包括(),{},[]
*和# --> 匹配光标所在单词,移动光标到下一个(上一个)匹配单词
禁止光标不闪烁的方法: set gcr=i:ver15-blinkon0 (insert模式下)
set gcr=n:block-blinkon0 (normal模式下)
块操作:
典型的操作:0
自动补齐:
在insert模式下,输入一个词的开头,然后按
分屏:
输入:split (创建横分屏)(可以使用:sp代替)
输入:vsplit (创建垂直分屏)(可以使用:vs代替)
可以使用hjkl切换分屏;
关闭其他分屏,保留当前分屏:ctrl+w和o
改变分屏尺寸:ctrl+w和+ (增大尺寸)
ctrl+w和- (减小尺寸)
自定义的规则:
在括号中移动的快捷方式:现在括号可以自动补全了,按ESC可以跳出括号
关键字匹配代码块
在insert模式下,
pp --> 自动补全
hh --> 左移
jj --> 下移
kk --> 上移
ll --> 右移
ii -->
在normal模式下,qq -->
进入normal模式,qq
以下是编写verilog的快捷方式:
F2 --> 文件头注释
Module --> module模块
Define --> 宏定义和接口信号声明
Code --> 代码主体部分
zuhe --> 组合逻辑
yibu --> 异步时序逻辑
tongbu --> 同步时序逻辑
input对齐规则:
input48 --> input [47:0]
input32 --> input [31:0]
input31 --> input [30:0]
...
input2 --> input [1 :0]
input --> input
output对齐规则类似于input
举例:output32 --> output wire [31:0]
outputreg32 --> output reg [31:0]
wire对齐规则类似于input
reg对齐规则类似于input
_vimrc文件如下:
" ***********************************************************************
" * Author : YYB
" * Create time : 2019-12-4 22:37
" * Last modified : 2018-12-4 22:37
" * Filename : _vimrc
" * Description : 配置GVIM,为快速编写verilog代码
" * *********************************************************************
set nocompatible
source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
source $VIMRUNTIME/colors/desert.vim
behave mswin
"设置光标不闪烁
set gcr=i:ver15-blinkon0
set gcr=n:block-blinkon0
"let g:indent_guides_enable_on_vim_startup = 1
"--------------------------------------------------------------------------------
"------------------------------对齐规则------------------------------------------
"--------------------------------------------------------------------------------
set nu!
set sw=4
set ts=4
set et
set nobackup
"注释换行不自动添加注释
au FileType c,cpp,verilog setlocal comments-=:// comments+=f://
set paste
"自动补全括号,按TAB跳出括号
inoremap ' ''i
inoremap " ""i
inoremap ( ()i
inoremap [ []i
inoremap < <>i
inoremap { {}O
"设置跳出自动补全的括号
func SkipPair()
if getline('.')[col('.') - 1] == ')' || getline('.')[col('.') - 1] == ']' || getline('.')[col('.') - 1] == '"' || getline('.')[col('.') - 1] == "'" || getline('.')[col('.') - 1] == '}' || getline('.')[col('.') - 1] == ">"
return "\la"
else
return "\t"
endif
endfunc
" 将TAB键绑定为跳出括号
inoremap =SkipPair()
:imap pp
:imap hh
:imap jj
:imap kk
:imap ll
:imap ii
:map qq
"--------------------------------------module----------------------------------
"------------------------------------------------------------------------------
"--------------------------------------module----------------------------------
:ab Define //======================================================================//************** Define Parameter and Internal Signals *****************//======================================================================i
:ab Code //======================================================================//**************************** Main Code *******************************//======================================================================i
:ab Module module ();endmodule
":ab Zh ii0d$ialways @(*) begin dwa end0dwk$a
"--------------------------------------时序逻辑----------------------------------------"
"组合逻辑,使用快捷方式zuhe
:ab zuhe always @(*)beginif ()beginendelse beginendend
"异步时序逻辑,使用快捷方式yibu
:ab yibu always @(posedge clk or negedge rst_n)beginif(!rst_n)beginendelse if()beginendelse beginendend
"同步时序逻辑,使用会计方式tongbu
:ab tongbu always @(posedge clk)beginif(!rst_n)beginendelse if()beginendelse beginendend
"---------------------------------------计数器-----------------------------------------"
:ab Jsq iid0d$i//cntalways @(posedge clk or negedge rst_n)beginif(!rst_n)begincnt <= 0;endelse if(add_cnt)beginif(end_cnt)cnt <= 0;elsecnt <= cnt + 1;endendassign add_cnt=; assign end_cnt=add_cnt && cnt == ;
:ab Jsq2 iid0d$i//cnt0always @(posedge clk or negedge rst_n)beginif(!rst_n)begincnt0 <= 0;endelse if(add_cnt0)beginif(end_cnt0)cnt0 <= 0;elsecnt0 <= cnt0 + 1;endendassign add_cnt0=;assign end_cnt0=add_cnt0 && cnt0 == ;//cnt1always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt1 <= 0;endelse if(add_cnt1)beginif(end_cnt1)cnt1 <= 0;elsecnt1 <= cnt1 + 1;endendassign add_cnt1=end_cnt0;assign end_cnt1=add_cnt1 && cnt1 == ;
:ab Jsq3 iid0d$i//cnt0always @(posedge clk or negedge rst_n)beginif(!rst_n)begincnt0 <= 0;endelse if(add_cnt0)beginif(end_cnt0)cnt0 <= 0;elsecnt0 <= cnt0 + 1;endendassign add_cnt0=;assign end_cnt0=add_cnt0 && cnt0 == ;//cnt1always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt1 <= 0;endelse if(add_cnt1)beginif(end_cnt1)cnt1 <= 0;elsecnt1 <= cnt1 + 1;endendassign add_cnt1=end_cnt0;assign end_cnt1=add_cnt1 && cnt1 == ;//cnt2always @(posedge clk or negedge rst_n)beginif(!rst_n)begincnt2 <= 0;endelse if(add_cnt2)beginif(end_cnt2)cnt2 <= 0;elsecnt2 <= cnt2 + 1;endendassign add_cnt2=end_cnt1;assign end_cnt2=add_cnt2 && cnt2 == ;
:ab Cnt0 iid0d$ireg [ : 0] cnt0 ;wire add_cnt0 ;wire end_cnt0 ;//cnt0always @(posedge clk or negedge rst_n)beginif(!rst_n)begincnt0 <= 0;endelse if(add_cnt0)beginif(end_cnt0)cnt0 <= 0;elsecnt0 <= cnt0 + 1;endendassign add_cnt0=; assign end_cnt0=add_cnt0 && cnt0 == ;
:ab Cnt1 iid0d$ireg [ : 0] cnt1 ;wire add_cnt1 ;wire end_cnt1 ;//cnt1always @(posedge clk or negedge rst_n)beginif(!rst_n)begincnt1 <= 0;endelse if(add_cnt1)beginif(end_cnt1)cnt1 <= 0;elsecnt1 <= cnt1 + 1;endendassign add_cnt1