使用VIM,你可以完全解放鼠标,只用到大键盘就可以完成所有操作,非常的方便快捷,可以让我更加专注设计。
GVIM的配置,只需要配置_vimrc文件即可,想要什么功能都可以自己配置,比如我喜欢的光标不闪烁;括号自动补全,并跳出括号;列操作;在insert模式下,使用pp自动补全,hh左移,jj下移等。
以下内容分两部分,一是GVIM自带的命令汇总,二是自定义的规则,便于我快捷写verilog代码,可以快速添加文件注释,module模块,宏定义和接口信号声明,代码主体部分,组合逻辑,异步/同步时序逻辑设计等
注:<C-r>是Ctrl+r的组合键
// *********************************************************************
// 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 <command> --> 显示相关命令的帮助
各种插入模式:
a --> 在光标后插入
O --> 在当前行前插入一个新行
o --> 在当前行后插入一个新行
简单的移动光标:
0 --> 数字零,到行头
^ --> 到本行第一个不是blank字符的位置(所谓blank字符就是空格、tab、换行、回车等)
$ --> 到本行行尾
g_ -->到本行最后一个不是blank字符的位置
/pattern --> 搜索pattern的字符串(如果搜索出多个匹配,可按n键到下一个)
:noh --> 取消搜索字符串的高亮显示
拷贝/粘贴:
yy --> 拷贝当前行于剪贴板
p --> 粘贴,当前位置之后
Undo/Redo:
u --> undo
<C-r> --> redo
打开/保存/退出/改变文件:
:e <path/to/file> --> 打开一个文件
:wq --> 存盘+退出(:w 存盘,:q 退出)(:w后可以跟文件名)
:q! --> 退出不保存
:saveas <path/to/file> --> 另存为<path/to/file>
重复自己:
. --> (小数点)可以重复上一次的命令
N<command> --> 重复某个命令N次
比如:2dd --> 删除2行 3p --> 粘贴文本3次
光标移动更有效率:
gg --> 到第一行
NG --> 到第N行
G --> 到最后一行
按单词移动光标:
w --> 到下一个单词的开头
e --> 到下一个单词的结尾
最强的光标移动:
% --> 匹配括号移动,包括(),{},[]
*和# --> 匹配光标所在单词,移动光标到下一个(上一个)匹配单词
禁止光标不闪烁的方法: set gcr=i:ver15-blinkon0 (insert模式下)
set gcr=n:block-blinkon0 (normal模式下)
块操作:
典型的操作:0 <C-q> <hjkl> I--[ESC] (块操作在句首处输入--)
自动补齐:
在insert模式下,输入一个词的开头,然后按<C-p>或<C-n>,自动补齐就出现了。
分屏:
输入:split (创建横分屏)(可以使用:sp代替)
输入:vsplit (创建垂直分屏)(可以使用:vs代替)
可以使用hjkl切换分屏;
关闭其他分屏,保留当前分屏:ctrl+w和o
改变分屏尺寸:ctrl+w和+ (增大尺寸)
ctrl+w和- (减小尺寸)
自定义的规则:
在括号中移动的快捷方式:现在括号可以自动补全了,按ESC可以跳出括号
关键字匹配代码块
在insert模式下,
pp --> 自动补全
hh --> 左移
jj --> 下移
kk --> 上移
ll --> 右移
ii --> <ESC>
在normal模式下,qq --> <C-q>(列操作),所以列操作就变为:
进入normal模式,qq <hjkl> I <内容> <ESC>
以下是编写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 ' ''<ESC>i
inoremap " ""<ESC>i
inoremap ( ()<ESC>i
inoremap [ []<ESC>i
inoremap < <><ESC>i
inoremap { {<CR>}<ESC>O
"设置跳出自动补全的括号
func SkipPair()
if getline('.')[col('.') - 1] == ')' || getline('.')[col('.') - 1] == ']' || getline('.')[col('.') - 1] == '"' || getline('.')[col('.') - 1] == "'" || getline('.')[col('.') - 1] == '}' || getline('.')[col('.') - 1] == ">"
return "\<ESC>la"
else
return "\t"
endif
endfunc
" 将TAB键绑定为跳出括号
inoremap <TAB> <c-r>=SkipPair()<CR>
:imap pp <C-p>
:imap hh <Left>
:imap jj <Down>
:imap kk <Up>
:imap ll <Right>
:imap ii <Esc>
:map qq <C-q>
"--------------------------------------module----------------------------------
"------------------------------------------------------------------------------
"--------------------------------------module----------------------------------
:ab Define //======================================================================<Enter>//************** Define Parameter and Internal Signals *****************<Enter>//======================================================================<Enter><ESC>i
:ab Code //======================================================================<Enter>//**************************** Main Code *******************************<Enter>//===============================