一、简介
面向:linux c\c++开发者
场景:使用vim作为核心代码编辑工具
作用:减少命令执行窗口之间的切换效率问题,通过vim插件中触发shell脚本,所有菜单功能在同一个窗口中完整
2.提供默认的注释模板,通过快捷键快速形成文件头、函数、变量注释
二、基本环境
|----------|------------------------------------------------------------|
| 主机 | MacOs Sonoma 14.7 |
| 虚拟机 | Parallels Desktop 20 for Mac Pro Edition 版本 20.0.1 (55659) |
| 虚拟机-操作系统 | Ubuntu 22.04 最小安装 |
好久没有更新,直线一直在修养,最近身体好点了,我是一个国内ctp期货量化后台开发者,先来一张图看看vim开发工具的效果图

图中顶部:菜单栏
左侧:nerdtree插件+项目信息
菜单主要功能包括:
文件:目前暂无功能,未来准备扩展创建c、php模板文件的功能
编辑:目前一个当前页搜索替换功能
模块:主要用来在项目目录下快速切换模块目录
构建:生成(automake),构建(configure),编译(make),安装(makeinistall),清理(make clean),编译单元测试
调试:直接运行,开始调试,添加断点,临时断点,清除断点,清楚所有断点,显示断点列表
工具:内存泄露检测、部署测试工具库、查看性能报告,清理、调试模式、性能监控、优化等级、混合编译
部署:部署本地、部署测试环境,部署生产环境,后两者还未实现
vim插件:
1.Menus.vim(菜单栏插件)、
2.CodeComment(注释插件)
3.SymbolComment(符号索引提示插件,这个插件比较失败,核心在于正则捕获符号的部分,光标停留1.7秒后显示符号注释,有重复符号显示查询列表,符号注释窗口可根据注释内容展开或收拢)
4.BufferSwitcher.vim(缓冲区切换插件)
5.WindowSwitch.vim(窗口切换插件)
这个是我自己的vimrc内容,供大家参考
vim9script
# {{{ 插件管理
call plug#begin('~/.vim/plugged')
Plug 'https://gitee.com/pengzongwei/YouCompleteMe.git'
Plug 'https://gitee.com/imgrass/taglist.vim.git'
Plug 'https://gitcode.com/gh_mirrors/ner/nerdtree.git'
Plug 'https://gitee.com/hello-luiswu/vim-devicons.git'
Plug 'https://gitee.com/duyz1218/vim-nerdtree-syntax-highlight.git'
Plug 'vim-autoformat/vim-autoformat'
Plug 'altercation/vim-colors-solarized'
Plug 'https://github.com/ap/vim-css-color.git'
Plug 'tomasiser/vim-code-dark'
call plug#end()
# }}}
# {{{ 剪贴板
set clipboard=unnamedplus
set clipboard+=unnamed
# }}}
# {{{ 编码设置
# 用来在打开文件时进行解码的猜测列表
set fileencodings=utf-8,gb18030,gbk,gb2312,cp936 # 用来在打开文件时进行解码的猜测列表
set termencoding=utf-8 # 显示文件时,所用的编码
set encoding=utf-8 # 保存文件时所用的编码
set termencoding=utf-8 # 输出到客户终端采用的编码类型
set fileencoding=utf-8 # 当前编辑的文件的字符编码方式
# }}}
# {{{ 缩进和退格
set ai # 自动对齐
set cindent # 按照 C 语言的语法,自动地调整缩进的长度
set tabstop=3 # 设TAB宽度为3个空格
set shiftwidth=3 # 在编辑模式的时候按退格键的时候退回缩进的长度
set expandtab # 表示缩进用空格来表示
set autoindent # 自动缩进
set backspace=indent,eol,start # indent:autoindent等自动缩进,想用退格键将字段缩进的删掉
# eol:如果插入模式下在行开头,想通过退格键合并两行
# start:要想删除此次插入前的输入
# }}}
# {{{ 外观
set showmode # 在底部显示,当前处于命令模式还是插入模式
set foldmethod=marker # 用标记/*{{{*/ /*}}}*/来定义折叠
syntax on # 默认:会用缺省的语法颜色覆盖你的(hi and hi link)
syntax enable # 特殊:不会覆盖掉你自己定义的颜色(hi def and hi def link)
filetype on
filetype plugin on
filetype indent on
set nowrap # 不自动折行
set showcmd # 在底部显示,当前键入的指令
set termguicolors # 开启真彩色
set laststatus=2 # 控制状态栏的显示行为
set number # 显示行号
set relativenumber # 相对行号
colorscheme codedark # 配色方案
set cursorline # 开启光标高亮行
# 光标所在行的配色
hi CursorLine cterm=NONE ctermbg=238 ctermfg=NONE guibg=NONE guifg=NONE
hi EndOfBuffer guifg=bg ctermbg=bg ctermfg=bg
# }}}
# {{{ 映射 快捷键
inoremap jj <Esc>:w<CR>
nnoremap ss :w<CR>
g:maplocalleader = " "
# 编辑模式下,光标→
inoremap <C-l> <Right>
# 编辑模式下,光标←
inoremap <C-h> <Left>
# 编辑模式下,光标↓
inoremap <C-j> <Down>
# 编辑模式下,光标↑
inoremap <C-k> <Up>
# 去除行的前导空格
nnoremap <S-b> wd0<CR>
# 删除光标所在的单词
nnoremap <S-e> daw
nmap <tab> V>
nmap <s-tab> V<
# }}}
# {{{ 搜索
set hlsearch # 高亮显示搜索内容
set incsearch # 输入关键字的时候高亮显示
set ignorecase # 搜索时忽略大小写
# }}}
# 代码补全插件 {{{
var path: string = "~/.vim/plugged/YouCompleteMe/third_party/ycmd/examples"
set runtimepath+=~/.vim/plugged/YouCompleteMe
au FileType html,css set omnifunc=htmlcomplete # 启用HTML和CSS文件类型的自动完成功能
g:ycm_collect_identifiers_from_tags_files = 1 # 开启 YCM 基于标签引擎
g:ycm_collect_identifiers_from_comments_and_strings = 1 # 注释与字符串中L的内容也用于补全
g:syntastic_ignore_files = [".*\.py$"] # 让 syntastic忽略 python 文件
g:ycm_seed_identifiers_with_syntax = 1 # 语法关键字补全
g:ycm_confirm_extra_conf = 0 # 关闭加载ycm_extra_conf的提示
g:ycm_key_list_select_completion = ['<c-n>', '<Down>'] # 映射按键, 没有这个会拦截掉tab, 导致其他插件的tab不能用.
g:ycm_key_list_previous_completion = ['<c-p>', '<Up>']
g:ycm_complete_in_comments = 1 # 在注释输入中也能补全
g:ycm_complete_in_strings = 1 # 在字符串输入中也能补全
g:ycm_collect_identifiers_from_comments_and_strings = 1 # 注释和字符串中的文字也会被收入补全
g:ycm_global_ycm_extra_conf = path .. '/.ycm_extra_conf.py' # 设置进行补全时需要用到的文件路径
g:ycm_show_diagnostics_ui = 0 # 禁用语法检查
inoremap <expr> <CR> pumvisible() ? "<Down>\<C-y>" : "\<CR>" | # 回车即选中当即选中当前项
nnoremap <c-j> :YcmCompleter GoToDefinitionElseDeclaration<CR>| # 跳转到定义处
# }}}
# 状态栏 {{{
set statusline+=%3*\%{&ff}\[%{&fenc}]\ %* # 显示文件编码类型
set statusline+=%4*\ Row:%l/%L,Col:%c\ %* # 显示光标所在行和列
set statusline+=%5*\%3p%%\%* # 显示光标前文本所占总文本的比例
set statusline=%1*\%<%.50F\ # 显示文件名和文件路径 (%<应该可以去掉)
set statusline+=%=%2*\%y%m%r%h%w\ %* # 显示文件类型及文件状态
set statusline+=%3*\%{&ff}\[%{&fenc}]\ %* # 显示文件编码类型
set statusline+=%4*\ Row:%l/%L,Col:%c\ %* # 显示光标所在行和列
set statusline+=%5*\%3p%%\%* # 显示光标前文本所占总文本的比例
hi User1 cterm=none ctermfg=245 ctermbg=236 # 配色方案
hi User2 cterm=none ctermfg=208 ctermbg=236
hi User3 cterm=none ctermfg=169 ctermbg=236
hi User4 cterm=none ctermfg=100 ctermbg=236
hi User5 cterm=none ctermfg=green ctermbg=236
# }}}
# {{{ NerdTree 树形目录插件配置
autocmd vimenter * NERDTree # 自动打开目录树
autocmd VimEnter * wincmd p # 焦点在主窗口
g:NERDTreeWinSize = 35 # 宽度
g:NERDTreeHidden = 0 # 不显示隐藏文件
g:NERDTreeShowLineNumbers = 0 # 显示行号
g:NERDTreeMinimalUI = 1 # 隐藏顶部help
g:NERDTreeDirArrowExpandable = '+' # 文件夹展开时的符号
g:NERDTreeDirArrowCollapsible = '-' # 文件夹收拢时的符号
g:NERDTreeWinPos = 'left' # 显示在左侧
g:NERDTreeAutoDelete = 1 # 当删除文件或目录时自动刷新
# 当剩余的窗口都不是文件编辑窗口时,自动退出vim
autocmd BufEnter * if 0 == len(filter(range(1, winnr('$')), 'empty(getbufvar(winbufnr(v:val), "&bt"))')) | qa! | endif
g:NERDTreeIgnore = [
'\~$', # 备份文件
'\.o$',
'\.lo$',
'\.la$',
'\.a$',
'\.so.*$',
'\.d$',
'\.gcno$',
'\.gcda$',
'\.in$',
'\.am$',
'\.ac$',
'^autom4te\.cache$',
'^\.deps$',
'^\.libs$',
'^m4$',
'^build$',
# 添加更多具体的文件名模式
'^aclocal\.m4$',
'^autoscan\.log$',
'^compile$',
'^config\.guess$',
#'^config\.h',
'^config\.h\.in$',
'^config\.log$',
'^config\.status$',
'^config\.sub$',
'^depcomp$',
'^install-sh$',
'^ltmain\.sh$',
'^missing$',
'^stamp-h1$',
'^libtool$',
'^Makefile$',
'^Makefile\.in$',
'^configure$'
]
# }}}
# {{{ 图标插件配置
# Can be enabled or disabled
g:webdevicons_enable_nerdtree = 1
# whether or not to show the nerdtree brackets around flags
g:webdevicons_conceal_nerdtree_brackets = 1
# adding to vim-airline's tabline
g:webdevicons_enable_airline_tabline = 1
# adding to vim-airline's statusline
g:webdevicons_enable_airline_statusline = 1
# Highlight full name (not only icons). You need to add this if you don't have vim-devicons and want highlight.
g:NERDTreeFileExtensionHighlightFullName = 1
g:NERDTreeExactMatchHighlightFullName = 1
g:NERDTreePatternMatchHighlightFullName = 1
# Highlight full name (not only icons). You need to add this if you don't have vim-devicons and want highlight.
g:NERDTreeHighlightFolders = 1
# highlights the folder name
g:NERDTreeHighlightFoldersFullName = 1
# you can add these colors to your .vimrc to help customizing
g:brown = "905532"
g:aqua = "3AFFDB"
g:blue = "689FB6"
g:darkBlue = "44788E"
g:purple = "A1608C"
g:lightPurple = "834F79"
g:red = "AE403F"
g:beige = "F5C06F"
g:yellow = "F09F17"
g:orange = "D4843E"
g:darkOrange = "F16529"
g:pink = "CB6F6F"
g:salmon = "EE6E73"
g:green = "00a65a"
g:Turquoise = "40E0D0"
g:lightGreen = "31B53E"
g:white = "FFFFFF"
g:rspec_red = "FE405F"
g:git_orange = "F54D27"
g:gray = "808A87"
g:NERDTreeExtensionHighlightColor = {} # this line is needed to avoid error
g:NERDTreeExtensionHighlightColor['o'] = g:gray # sets the color of o files to blue
g:NERDTreeExtensionHighlightColor['h'] = g:purple # sets the color of h files to blue
g:NERDTreeExtensionHighlightColor['c'] = g:green # sets the color of c files to blue
g:NERDTreeExtensionHighlightColor['cpp'] = g:green # sets the color of cpp files to blue
g:NERDTreeExtensionHighlightColor['hh'] = g:purple # sets the color of cpp files to blue
g:NERDTreeExtensionHighlightColor['c++'] = g:green # sets the color of c++ files to blue
# }}}
# {{{ TagsList 配置
# taglist窗口显示在右侧,缺省为左侧
g:Tlist_Use_Right_Window = 1
# 设置ctags路径"将taglist与ctags关联
g:Tlist_Ctags_Cmd = '/usr/bin/ctags'
# 启动vim后自动打开taglist窗口
g:Tlist_Auto_Open = 0
# 不同时显示多个文件的tag,只显示当前文件的
# 不同时显示多个文件的tag,仅显示一个
g:Tlist_Show_One_File = 1
# taglist为最后一个窗口时,退出vim
g:Tlist_Exit_OnlyWindow = 1
# 设置taglist窗口大小
g:Tlist_WinWidth = 30
# 设置taglist打开关闭的快捷键F8
noremap <F3> :TlistToggle<CR>
# 更新ctags标签文件快捷键设置
noremap <F4> :!ctags -R<CR>
# }}}
# {{{ 格式化插件
g:autoformat_verbosemode = 1
au BufWrite *.c,*.h,*.hh,*.cpp,*.sh, :Autoformat
# 指定html用 js-beautify 进行格式化
# js
autocmd FileType javascript noremap <buffer> <c-f> :call JsBeautify()<cr>
# json
autocmd FileType json noremap <buffer> <c-f> :call JsonBeautify()<cr>
# jsx
autocmd FileType jsx noremap <buffer> <c-f> :call JsxBeautify()<cr>
# html
autocmd FileType html noremap <buffer> <c-f> :call HtmlBeautify()<cr>
# css or scss
autocmd FileType css noremap <buffer> <c-f> :call CSSBeautify()<cr>
# }}}
后续插件的代码,我会逐渐公开,供喜欢的参考,相互学习和研究