FPGA编辑神器(gvim)

文章目录

  • 前言
  • 为什么要使用gvim
  • gvim技巧
  • 已配置好的gvim命令说明
  • 福利

前言

  • 代码的整洁是十分重要的,尤其是对齐方面。有些人写的代码就非常美观,规范,有些人就写不尽人意了,有人就会说想要写出整齐美观规范的代码是需要花费很多时间的吧,而且还很繁琐,所以为了省事,就写的很“随意”,这种“随意的代码”自己看看还行,但是在公司里,都是团队合作,你的代码不单单要自己看着舒服,也要别人看着舒服,所以每个公司都有自己的代码规范,但都大同小异。下面将介绍一种在FPGA领域最常用的代码编辑工具-----gvim,大部分公司都是用这个软件的,毕竟开源,而且使用起来非常灵活,可以自己定义各种骚操作~

为什么要使用gvim

  • 工欲善其事,必先利其器,做为一名FPGA或者数字芯片设计人员,gvim就是我们编写代码的神器,掌握vim是十分必要的,使用vim来编写RTL代码会极大提高我们的效率,通过一些模板和规则的制作,vim也会让我们的代码看起来更加完美漂亮,尤其是对齐方面。

  • 我接触vim也有段时间了,对vim也比较熟悉,这里我要推荐一本关于vim的书籍----《vim的实用技巧》。看完这本书,我对vim有了新的认识,也学了很多,以前总是想着制作快捷键和模板,却对vim自带的一些强大功能一无所知,真是惭愧。多掌握vim自带的一些功能,这样就可以随便在哪都可以用的顺手。

  • 对于新手来说,刚开始使用gvim会有点吃力,各种不熟悉,这个是正常现象,要有一定的耐心哦,后面会越用越顺手的。文章的最后我会给出我配置好的gvim,下载后可以直接使用。

  • 下面我将会介绍一些vim自带的核心功能,

gvim技巧

  1. 点范式: “.”命令可以让我们重复上次的修改,它是Vim中最为强大的多面手。那么何为修改?从进入插入模式的那一刻起(例如,输入i),直到返回普通模式时为止(输入),这期间做出的改变称为一次修改。vim会记录其每一个动作,做出这样一个修改后再用.命令的话,它就会重新执行这些按键操作。
    核心思想就是:执行、重复、回退;一键移动,另一键执行
  2. 把撤销单元切成块。i{insert some text}是一次修改,u键会触发撤销命令。
  3. 双剑合璧,天下无敌。 操作符 + 动作命令 = 操作。 如:d{motion}。
    操作符如下:
命令 用途
c 修改
d 删除
y 复制
g~ 反转大小写
gu 转化为小写
gU 转化为大写
> 增加缩进
< 减小缩进
= 自动缩进
动作 用途
aw 一个单词
ap 一段
l 一个字符
  1. 重新映射大小写转换键(根据自己习惯)
  2. 区分实际行和屏幕行(jk命令会工具实际行移动,gj,gk则按照屏幕行移动。)
  3. 单词和字符串;w单词,W字符串。单词由字母、数字、下划线组成,字符串则有非空白字符序列组成。
  4. 分隔符文本对象
  5. 分隔符文本对象
命令 用途
vi} {}内部
vi) ()内部
vi] []内部
vi" ""内部
va} 一对花括号
va) 一对圆括号
va] 一对[]
va" 一对""
  1. 范围文本对象
命令 用途
iw 当前单词
aw 当前单词及 空格
iW 当前字符串
aW 当前字符串及 空格
is 当前一个句子
as 当前一个句子及 空格
ip 当前段落
ap 当前段落及 空格
  1. 位置标记
    m{a-zA-Z}标记当前位置,’{mark}跳到位置标记处
  2. 在匹配括号间跳转 %
  3. 寄存器
  • 无名寄存器(""): x,s,d{motion},c{motion},y{motion}命令都会覆盖无名寄存器中的内容。
  • 复制专用寄存器("0):当使用y{motion}是,要复制的文本会同时拷贝到无名寄存器和复制专用寄存器中。
  • 有名寄存器("a-"z)
  • 系统剪贴板("+),选择专用寄存器("*):如果想从vim复制文本到外部程序(反之亦然),则必须使用系统剪贴板。
  • 在可视模式下使用p命令时,会先从无名寄存器中取出内容,然后在把高亮的内容存到无名寄存器中。
  • p命令粘贴到光标后,P命令则是粘贴到光标前。
  1. 利用宏来制作模板
  • q键既是“录制”按钮,也是“停止”按钮。为了录制我们的按键操作,一开始需要按q{register},从而指定一个用于保存宏的寄存器。当状态栏中出现“记录中”时,表示录制已经开始。此后,我们执行的每一条命令都被宏捕获,直到再次按下q键停止为止。
  • 将宏粘贴到文档中,(:put a)
  • 编辑完宏后,0"ay$dd
  • 将我们录制好的宏粘贴到_vimrc中即可。
  1. 给列表编号
    在配置大量寄存器的时候,是需要输入一些编号的,一个一个的输入会比较繁琐,使用gvim的“迭代求值方法”就会简单很多
//需要在[]内一次输入编号(0-19),手动输入会比较繁琐,更何况有些场景(0v5640寄存器的配置,有304个寄存器,要是都手动输入会比较麻烦)
assign  cfg_array[]  =       {8'h78, 16'h3103, 8'h11};
assign  cfg_array[]  =       {8'h78, 16'h3008, 8'h82};
assign  cfg_array[]  =       {8'h78, 16'h3008, 8'h42};
assign  cfg_array[]  =       {8'h78, 16'h3103, 8'h03};
assign  cfg_array[]  =       {8'h78, 16'h3017, 8'hff};
assign  cfg_array[]  =       {8'h78, 16'h3018, 8'hff};
assign  cfg_array[]  =       {8'h78, 16'h3034, 8'h1A};
assign  cfg_array[]  =       {8'h78, 16'h3037, 8'h13};       
assign  cfg_array[]  =       {8'h78, 16'h3108, 8'h01};      
assign  cfg_array[]  =       {8'h78, 16'h3630, 8'h36};
assign  cfg_array[]  =       {8'h78, 16'h3631, 8'h0e};
assign  cfg_array[]  =       {8'h78, 16'h3632, 8'he2};
assign  cfg_array[]  =       {8'h78, 16'h3633, 8'h12};
assign  cfg_array[]  =       {8'h78, 16'h3621, 8'he0};
assign  cfg_array[]  =       {8'h78, 16'h3704, 8'ha0};
assign  cfg_array[]  =       {8'h78, 16'h3703, 8'h5a};
assign  cfg_array[]  =       {8'h78, 16'h3715, 8'h78};
assign  cfg_array[]  =       {8'h78, 16'h3717, 8'h01};
assign  cfg_array[]  =       {8'h78, 16'h370b, 8'h60};
assign  cfg_array[]  =       {8'h78, 16'h3705, 8'h1a};

下面介绍“迭代法求值”

  • :let i=0 使i=0
  • qa 开启录制宏
  • 0f[a=i 在[]中插入i的值
  • 回车后ESC
  • :let i+=1 使i递增
  • 回车后按q 退出录制
  • jVG 选择其余所有行
  • : 进入命令模式
  • normal @a 回放之前录制好的宏即可
  • 其实目的就是先录制一段宏,然后是变量i累加,最后再其余的行播放这个宏即可。
    ----------------------------敲黑板-------------------------------

已配置好的gvim命令说明

以下是我自己配置的一些命令,下载我的gvim后就可以直接使用。
在插入模式下输入相应的命令后,再回车(或者空格)即可

命令 用途
F2功能键 插入文件头
Module module模板
Define define模板
Code code注释模板,用来分隔变量和代码,使整个代码布局更加合理
ii
qq 列块模式
pp 补全命令
hh 插入模式下左移
jj 插入模式下下移
kk 插入模式下上移
ll 插入模式下右移
input input对齐模板 (输入完毕按空格即可)
output8 output对齐模板,最后的数字取值范围是[0,32],默认为wire型的。(输入完毕按空格即可)
outputreg8 output对齐模板,最后的数字取值范围是[0,32]。(输入完毕按空格即可)
reg8 reg模板,最后的数字取值范围是[0,32]。(输入完毕按空格即可)
wire8 wire模板,最后的数字取值范围是[0,32]。 (输入完毕按空格即可)
Shixu 时序逻辑代码模板,默认带2个else if
Shixu1 时序逻辑代码模板,带一个else if
Zh 组合逻辑代码模板
Jsq 计数器代码模板
Jsq2 2层计数器模板
Jsq3 3层计数器模板
Ztj 3段式状态机模板
F10功能键 例化
F7功能键 调整例化后的格式
=ap 在普通模式下输入=ap,可以调整该段代码的自动缩进

对于已保存的文件,可以使用下面的方法进行空格和TAB的替换

TAB替换为空格:
:set ts=4
:set expandtab
:%retab!

空格替换为TAB:
:set ts=4
:set noexpandtab
:%retab!

set ts=4
set softtabstop=4
set shiftwidth=4
set expandtab
set autoindent

ts是tabstop的缩写,设TAB宽度为4个空格。
 softtabstop 表示在编辑模式的时候按退格键的时候退回缩进的长度,当使用 expandtab 时特别有用。
 shiftwidth 表示每一级缩进的长度,一般设置成跟 softtabstop 一样。
 expandtab表示缩进用空格来表示,noexpandtab 则是用制表符表示一个缩进。
 autoindent自动缩进

福利

为了能及时回复大家,现在获取源码方式如下:
微信扫描下面的二维码关注【春哥笔记】公众号,回复"gvim"即可Get源码的获取方式:
在公众号中有视频演示操作哦~
FPGA编辑神器(gvim)_第1张图片

你可能感兴趣的:(FPGA,vim)