文章目录
- 前言
- 为什么要使用gvim
- gvim技巧
- 已配置好的gvim命令说明
- 福利
前言
- 代码的整洁是十分重要的,尤其是对齐方面。有些人写的代码就非常美观,规范,有些人就写不尽人意了,有人就会说想要写出整齐美观规范的代码是需要花费很多时间的吧,而且还很繁琐,所以为了省事,就写的很“随意”,这种“随意的代码”自己看看还行,但是在公司里,都是团队合作,你的代码不单单要自己看着舒服,也要别人看着舒服,所以每个公司都有自己的代码规范,但都大同小异。下面将介绍一种在FPGA领域最常用的代码编辑工具-----gvim,大部分公司都是用这个软件的,毕竟开源,而且使用起来非常灵活,可以自己定义各种骚操作~
- 工欲善其事,必先利其器,做为一名FPGA或者数字芯片设计人员,gvim就是我们编写代码的神器,掌握vim是十分必要的,使用vim来编写RTL代码会极大提高我们的效率,通过一些模板和规则的制作,vim也会让我们的代码看起来更加完美漂亮,尤其是对齐方面。
- 我接触vim也有段时间了,对vim也比较熟悉,这里我要推荐一本关于vim的书籍----《vim的实用技巧》。看完这本书,我对vim有了新的认识,也学了很多,以前总是想着制作快捷键和模板,却对vim自带的一些强大功能一无所知,真是惭愧。多掌握vim自带的一些功能,这样就可以随便在哪都可以用的顺手。
- 对于新手来说,刚开始使用gvim会有点吃力,各种不熟悉,这个是正常现象,要有一定的耐心哦,后面会越用越顺手的。文章的最后我会给出我配置好的gvim,下载后可以直接使用。
- 下面我将会介绍一些vim自带的核心功能,
- 点范式: “.”命令可以让我们重复上次的修改,它是Vim中最为强大的多面手。那么何为修改?从进入插入模式的那一刻起(例如,输入i),直到返回普通模式时为止(输入),这期间做出的改变称为一次修改。vim会记录其每一个动作,做出这样一个修改后再用.命令的话,它就会重新执行这些按键操作。
核心思想就是:执行、重复、回退;一键移动,另一键执行 - 把撤销单元切成块。i{insert some text}是一次修改,u键会触发撤销命令。
- 双剑合璧,天下无敌。 操作符 + 动作命令 = 操作。 如:d{motion}。
操作符如下:
命令 | 用途 |
---|---|
c | 修改 |
d | 删除 |
y | 复制 |
g~ | 反转大小写 |
gu | 转化为小写 |
gU | 转化为大写 |
> | 增加缩进 |
< | 减小缩进 |
= | 自动缩进 |
动作 | 用途 |
---|---|
aw | 一个单词 |
ap | 一段 |
l | 一个字符 |
- 重新映射大小写转换键(根据自己习惯)
- 区分实际行和屏幕行(jk命令会工具实际行移动,gj,gk则按照屏幕行移动。)
- 单词和字符串;w单词,W字符串。单词由字母、数字、下划线组成,字符串则有非空白字符序列组成。
- 分隔符文本对象
- 分隔符文本对象
命令 | 用途 |
---|---|
vi} | {}内部 |
vi) | ()内部 |
vi] | []内部 |
vi" | ""内部 |
va} | 一对花括号 |
va) | 一对圆括号 |
va] | 一对[] |
va" | 一对"" |
- 范围文本对象
命令 | 用途 |
---|---|
iw | 当前单词 |
aw | 当前单词及 空格 |
iW | 当前字符串 |
aW | 当前字符串及 空格 |
is | 当前一个句子 |
as | 当前一个句子及 空格 |
ip | 当前段落 |
ap | 当前段落及 空格 |
- 位置标记
m{a-zA-Z}标记当前位置,’{mark}跳到位置标记处 - 在匹配括号间跳转 %
- 寄存器
- 无名寄存器(""): x,s,d{motion},c{motion},y{motion}命令都会覆盖无名寄存器中的内容。
- 复制专用寄存器("0):当使用y{motion}是,要复制的文本会同时拷贝到无名寄存器和复制专用寄存器中。
- 有名寄存器("a-"z)
- 系统剪贴板("+),选择专用寄存器("*):如果想从vim复制文本到外部程序(反之亦然),则必须使用系统剪贴板。
- 在可视模式下使用p命令时,会先从无名寄存器中取出内容,然后在把高亮的内容存到无名寄存器中。
- p命令粘贴到光标后,P命令则是粘贴到光标前。
- 利用宏来制作模板
- q键既是“录制”按钮,也是“停止”按钮。为了录制我们的按键操作,一开始需要按q{register},从而指定一个用于保存宏的寄存器。当状态栏中出现“记录中”时,表示录制已经开始。此后,我们执行的每一条命令都被宏捕获,直到再次按下q键停止为止。
- 将宏粘贴到文档中,(:put a)
- 编辑完宏后,0"ay$dd
- 将我们录制好的宏粘贴到_vimrc中即可。
- 给列表编号
在配置大量寄存器的时候,是需要输入一些编号的,一个一个的输入会比较繁琐,使用gvim的“迭代求值方法”就会简单很多
//需要在[]内一次输入编号(0-19),手动输入会比较繁琐,更何况有些场景(0v5640寄存器的配置,有304个寄存器,要是都手动输入会比较麻烦)
assigncfg_array[]={8'h78, 16'h3103, 8'h11};
assigncfg_array[]={8'h78, 16'h3008, 8'h82};
assigncfg_array[]={8'h78, 16'h3008, 8'h42};
assigncfg_array[]={8'h78, 16'h3103, 8'h03};
assigncfg_array[]={8'h78, 16'h3017, 8'hff};
assigncfg_array[]={8'h78, 16'h3018, 8'hff};
assigncfg_array[]={8'h78, 16'h3034, 8'h1A};
assigncfg_array[]={8'h78, 16'h3037, 8'h13};
assigncfg_array[]={8'h78, 16'h3108, 8'h01};
assigncfg_array[]={8'h78, 16'h3630, 8'h36};
assigncfg_array[]={8'h78, 16'h3631, 8'h0e};
assigncfg_array[]={8'h78, 16'h3632, 8'he2};
assigncfg_array[]={8'h78, 16'h3633, 8'h12};
assigncfg_array[]={8'h78, 16'h3621, 8'he0};
assigncfg_array[]={8'h78, 16'h3704, 8'ha0};
assigncfg_array[]={8'h78, 16'h3703, 8'h5a};
assigncfg_array[]={8'h78, 16'h3715, 8'h78};
assigncfg_array[]={8'h78, 16'h3717, 8'h01};
assigncfg_array[]={8'h78, 16'h370b, 8'h60};
assigncfg_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累加,最后再其余的行播放这个宏即可。
----------------------------敲黑板-------------------------------
在插入模式下输入相应的命令后,再回车(或者空格)即可
命令 | 用途 |
---|---|
F2功能键 | 插入文件头 |
Module | module模板 |
Define | define模板 |
Code | code注释模板,用来分隔变量和代码,使整个代码布局更加合理 |
ii | |
列块模式 | |
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替换为空格:
: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自动缩进
福利 【FPGA|FPGA编辑神器(gvim)】为了能及时回复大家,现在获取源码方式如下:
微信扫描下面的二维码关注【春哥笔记】公众号,回复"gvim"即可Get源码的获取方式:
在公众号中有视频演示操作哦~
文章图片
推荐阅读
- FPGA|DDR3原理总结
- oeasy教您玩转vim - 89 - # 高亮细节Highlight
- oeasy教您玩转vim - 88 - # 自动命令autocmd
- oeasy教您玩转vim - 87 - # 内容查找grep命令
- oeasy教您玩转vim - 85 - # 全局命令
- oeasy教您玩转vim - 84 - # 命令command
- vim 命令整理(从FreePlane的mm格式导出)
- oeasy教您玩转vim - 82 - # 函数function