搞一个高效的c/c++开发环境,工具VIm+自研vim插件+Shell脚本

一、简介

面向: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>
# }}}

后续插件的代码,我会逐渐公开,供喜欢的参考,相互学习和研究

相关推荐
茫忙然1 小时前
U 盘搭建免驱 Linux 便携系统教程
linux·服务器
knighthood20012 小时前
vscode插件开发的一些过程
ide·vscode·编辑器
一起逃去看海吧3 小时前
dify-03
java·linux·开发语言
fengyehongWorld3 小时前
Linux 根据端口进行的相关查询
linux
lihao lihao3 小时前
linux匿名管道
linux·运维·服务器
うちは止水3 小时前
weston出图调试
linux·wayland·weston
STDD3 小时前
Farming Simulator 25(模拟农场 25) Linux 专服搭建完全指南
linux·运维·javascript
好好风格3 小时前
宝塔面板 HTTPS 端口证书不生效排查记录
linux·运维·nginx