vim的verilog补全插件更新(支持变量名补全)-CSDN博客

vim使用的verilog补全插件(即插即用)_vim verilog插件-CSDN博客

利用verilator实现vim对Verilog代码实时纠错功能-CSDN博客

本文是以上三篇文章的后续,同时新增了很多插件的功能

功能汇总

这个插件下,vim被分成了纠错模式和浏览模式。

补全功能在两种模式种通用。

纠错模式下,提供纠错功能,用于编写代码使用。

浏览模式下,vim会显示多样的信息,并且提供快速跳转功能,用于修改代码和阅读代码。

进入时默认纠错模式,按下<C-e>在两种模式之间切换。

补全功能

补全功能提供模块端口补全,代码补全,变量和参数补全。同时具有简单的判断功能,会根据光标所在位置判断可能的补全选项,筛选补全内容

补全代码

补全module

模块补全的时候,当行首为模块名,后面输入的内容自动接入端口名

纠错模式功能

纠错模式提供quickfix和显示错误功能,按下<C-c> 打开/关闭 错误汇总端口,打开端口后按上下键选中错误,按下回车可以快速跳转错误位置。当光标移动至错误高亮行左右两格内时,自动显示错误信息。

纠错

浏览模式功能

浏览模式提供丰富的信息和跳转功能

按下<C-c>,quickfix窗口显示所有模块的位置,通过选择加回车快速跳转

全部函数跳转

当你的光标置于模块名称上是,popup出现提示,之后按下<C-j>可以快速跳转,按下<C-k>回到上一次跳转的位置

模块跳转

当光标位于变量名称上方时,显示变量的信息,包括变量类型,从哪些模块输入输出,自定义备注

请注意,如果你要显示自定义备注,请将备注用/*  */的备注形式接在变量定义处的后方,同时需要接在逗号或者分号的前面,如果你不需要显示自定义备注,就接在逗号或者分号后方。

变量显示

当光标位于变量上方时,quickfix可以用于跳转到变量输入输出的函数端口位置

变量端口跳转

(注意,当你的光标从变量端口移开后,全局函数跳转需要按下<C-s>才能打开)

当你的代码没有报错时,按下<C-b>可以自动整理代码。

整理

安装说明

需要的配置

代码需要从github安装,安装前,请你先安装或设置以下内容。

1:确保你的终端是fish shell,如果不是请你改成fish shell或保证你的终端可以执行fish shell功能

2:安装verilator,这是一个开源的仿真工具,纠错模式需要用到它的功能

      你可以在以下链接安装,我的版本是5.008,你可以使用其他版本,但是我不保证纠错模式能 正常运行
Installation — Verilator Devel 5.031 documentationInstallation — Verilator Devel 5.031 documentation

3:下载verible插件库中的verible-verilog-format插件,并且置于系统文件夹下,确保插件可以执行

Releases · chipsalliance/verible · GitHub

你可以在这个链接安装适合你系统的版本,解压后在bin文件夹里面找到这个插件,置于你的系统文件夹下

安装过程

在你的主界面的.vim/plugin 文件夹执行以下代码,如果你没有这个文件夹,在主界面创建它,你需要保证你的vim可以识别这个文件夹

git clone git@github.com:kaifengwu/vim_verilog_plugin.git
mv vim_verilog_plugin/ verilog_function/
cd verilog_function/plugin/

之后打开你所在文件夹的configuration.vim文件,你会看到以下内容

"---------------------------辅助配置------------------------------
"智能按键操作
autocmd FileType * inoremap } <ESC>:call Quotation4()<cr><ESC>

autocmd FileType * inoremap ' '<ESC>:call Quotation3()<cr><ESC>

autocmd FileType * inoremap > <ESC>:call Quotation2()<cr><ESC>

autocmd FileType * inoremap " <ESC>:call Quotation1()<cr><ESC>
"自动补全括号
autocmd FileType * inoremap ) )<ESC>i
autocmd FileType * inoremap ] ]<ESC>i
"特殊按键映射
"保存功能
autocmd FileType * map <C-s> :cexpr[]<CR>:cclose<CR>:w<CR>
autocmd FileType * inoremap <C-s> <ESC>:cexpr[]<CR>:cclose<CR>:w<CR>l
"保存并退出
autocmd FileType * map <C-q> <ESC>:cclose<CR>:wq<CR>
autocmd FileType * inoremap <C-q> <ESC>:wq<CR>:cexpr[]<CR>:q<CR>
"打开/关闭quickfix端口
autocmd FileType * map <C-c> <ESC>:call Window()<CR>
autocmd FileType * inoremap <C-c> <ESC>:call Window()<CR>
"快速切换括号功能
autocmd FileType * inoremap <C-l> <ESC>:call JumpToClosingParen(1)<CR>la
autocmd FileType * map <C-l> :call JumpToClosingParen(1)<CR>l
autocmd FileType * inoremap <C-h> <ESC>:call JumpToClosingParen(0)<CR>li
autocmd FileType * map <C-h> :call JumpToClosingParen(0)<CR>l
"以下注释掉的内容放到.vimrc里面去
"设置更新时间,防止光标一直跳转
"set updatetime=500
"使用alt键恢复部分普通模式功能

"插入模式下按下alt恢复hjkl的上下左右功能
"execute "set <M-h>=\eh"
"inoremap <M-h> <Left> 

"execute "set <M-j>=\ej"
"inoremap <M-j> <Down> 

"execute "set <M-k>=\ek"
"inoremap <M-k> <Up> 

"execute "set <M-l>=\el"
"inoremap <M-l> <Right> 

"imap <A-h> <Left>
"imap <A-j> <Down>
"imap <A-k> <Up>
"imap <A-l> <Right>
"o键打开下一行
"execute "set <M-o>=\eo"
"inoremap <M-o> <ESC>o
"noremap <M-o> <ESC>o

"黏贴
"execute "set <M-p>=\ep"
"inoremap <M-p> <ESC>pa

"删除光标所在位置单词
"execute "set <M-w>=\ew"
"inoremap <M-w> <ESC>ebdei
"nnoremap <M-w> <ESC>ebde
"注释
"noremap <C-x> <ESC>^:call Annotate()<cr><ESC>
"inoremap <C-x> <ESC>^:call Annotate()<cr><ESC>
"智能换行
"inoremap <C-j> <ESC>^$:call Newline()<cr><ESC>
"noremap <C-j> <ESC>^$:call Newline()<cr><ESC>
"autocmd FileType * set guicursor=n-v-c:block,i-ci-ve:ver5,r-cr-o:hor20
"以上内容注释掉之后放到.vimrc里面

"----------------------Verilog 相关的配套设置-----------------------------

autocmd FileType verilog setlocal shiftwidth=4 softtabstop=4
"在保存 .v 文件时运行 verilator 并加载错误到 Quickfix 窗口
autocmd BufWritePost *.v silent call LoadQuickfixMessage()

au BufRead,BufNewFile *.v set filetype=verilog
autocmd FileType verilog map <C-e> :call ModuleChange()<CR>
autocmd FileType verilog inoremap <C-e> <ESC>:call ModuleChange()<CR>

autocmd FileType verilog map <C-b> :call Verilogformat()<CR>
autocmd FileType verilog inoremap <C-b> <ESC>:call Verilogformat()<CR>
"把这一行的问号?换成你vim所在文件夹的绝对路径
"autocmd VimEnter *.v : LoadCompletionFile /?/.vim/plugin/verilog_function/verilog.txt

autocmd VimEnter *.v : call LoadMoudlesFromFile(0)
"设置补全操作快捷键
"如果你使用coc-nvim,使用底下的这几个映射
autocmd FileType verilog inoremap <silent><expr> <TAB>
    \ TriggerAutoComplete(0) ? "\<C-n>" : 
    \ coc#pum#visible()  ? coc#pum#next(1):
    \ CheckBackspace() ? "\<Tab>" :
    \ coc#refresh()

autocmd FileType verilog inoremap <expr> <S-TAB> 
    \ TriggerAutoComplete(0) ? "\<C-p>" : 
    \coc#pum#visible() ? coc#pum#prev(1) : "\<C-h>"

autocmd FileType verilog inoremap <silent><expr> <CR> 
    \ TriggerAutoComplete(0) ?  "\<C-y>\<space>" : 
    \coc#pum#visible() ? coc#_select_confirm()
    \: "\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"

"如果你不使用coc-nvim,把上面的映射注释掉然后改成底下的这几个
"autocmd FileType verilog inoremap <silent><expr> <TAB>
    "\ TriggerAutoComplete(0) ? "\<C-n>" : "\<Tab>" 

"autocmd FileType verilog inoremap <expr> <S-TAB> 
    "\ TriggerAutoComplete(0) ? "\<C-p>" : "\<C-h>"

"autocmd FileType verilog inoremap <silent><expr> <CR> 
    "\ TriggerAutoComplete(0) ?  "\<C-y>\<space>" : "\<CR>"



autocmd CursorHold *.v silent call AutoLoadCompeletion()
            \| call ShowPopup() 
autocmd FileType verilog inoremap <silent><expr> <C-j> g:JUMP? "<ESC>:call JumpToModule(1)<cr>zz" : "<ESC>^$:call Newline()<cr><ESC>"
autocmd FileType verilog map <silent><expr> <C-j> g:JUMP? "<ESC>:call JumpToModule(1)<cr>zz" : "<ESC>^$:call Newline()<cr><ESC>"
autocmd FileType verilog map <C-k> <ESC>:call JumpToModule(0)<cr>zz
autocmd FileType verilog inoremap <C-k> <ESC>:call JumpToModule(0)<cr>zz


"补全相关设置
 autocmd FileType verilog set autowrite
 autocmd FileType verilog set wildmode=full
 autocmd FileType verilog set wildmenu
 autocmd FileType verilog set completeopt=menuone,noinsert,noselect,preview
 autocmd FileType verilog set pumheight=10

" 设置补全菜单背景为灰色,前景为黑色
 autocmd FileType verilog highlight Pmenu ctermbg=black ctermfg=grey

" 设置补全菜单中选中项的背景为红色,前景为白色
 autocmd FileType verilog highlight PmenuSel ctermbg=red ctermfg=white

" 设置滚动条背景为浅灰色
 autocmd FileType verilog highlight PmenuSbar ctermbg=lightgray

" 设置滚动条的滚动指示部分为深灰色
 autocmd FileType verilog highlight PmenuThumb ctermbg=darkgray
"---------------------------------------------------------------------------

接下来进行以下操作

把中间注释掉的映射复制到.vimrc里面,并且去掉注释,确保你的映射不会和现有的冲突

找到文件中‘verilog相关配置’这个部分,找到以下代码

"把这一行的问号?换成你vim所在文件夹的绝对路径
"autocmd VimEnter *.v : LoadCompletionFile /?/.vim/plugin/verilog_function/verilog.txt

把问号换成你.vim所在文件夹的绝对路径,然后把这行的注释去掉

之后你就可以愉快的开始补全了

快捷键功能使用介绍

alt恢复功能

在插入模式下,按下alt键(不要松开),接下来按下h,j,k,l,o,p,这些按键的功能会恢复(光标上下左右移动,开新行,黏贴)

同时alt+w会删除光标所在位置的单词

Ctrl功能

<C-s>保存,同时你可以拿来当ESC键使用

<C-q>保存并退出

<C-c>打开关闭quickfix窗口(有时候一次关不掉就按两次)

<C-e>切换纠错模式和浏览模式,按下后窗口底下的框显示"Display Message"是浏览模式,显示“Display Error”是纠错模式

<C-l>向右跳入,跳出括号

<C-h>向左跳入,跳出括号

(这俩功能在函数端口补全的时候很有用,你可以写完一个端口之后按两下,就可以跳入下一个端口开始写。请注意,只能在同一行跳跃)

<C-j>智能回车键,当前文提到的跳转显示出来的时候作为跳转功能,没显示出来的时候会自动识别行末尾的分号,如果没有分号的话会添加分号并且开启新一行

(这个功能在写c的时候比较有用,你写printf里面的内容之后就不需要跳到行末,加上分号,然后再按回车)

<C-k>跳回你上一次使用<C-j>或者<C-k>跳转的位置

<C-x> 类似vscode中的注释键,自动在函首添加或去掉注释

安装和使用过程中的问题欢迎在底下反馈,我有空会尽量解答

这个插件是博主第一次写vim插件,目前没有大量使用,欢迎各位大佬批评指正,也欢迎大家反馈bug

更多推荐