配置 Vim C++开发(基本够用的)环境(Ubuntu 20.04)_vim c++ ubuntu 20.04-程序员宅基地

技术标签: c++  ubuntu  linux  vim  琐细经验  

补全示例

介绍

玩 Vim 的哲学就是追求 “基本够用”, 包括装插件、设置快捷键或自己写脚本。因为基本够用时,你才能有效地把Vim变成生产力,而不是因为“磨刀误了砍柴功”,最终丧失了对 Vim 的耐心。 Vim 的扩展可能性很多,在学会 Vim 自带的大量快捷键之前,没有必要去装一堆的插件,这篇文章就是这样的一个平衡点,恰到好处地教你使用最有用的 Vim C++ 插件。

这篇博客介绍了一种简单实用的VIM用于C++开发的配置方法,其特点是流畅的补全和在文件间便捷地跳转。

配置步骤

  1. 安装 vim
sudo apt install vim
  1. 安装 clangd-11 (官方源)
sudo apt install clang-11 clang-tools-11 clang-11-doc libclang-common-11-dev \
   libclang-11-dev libclang1-11 clang-format-11 clangd-11 clang-tidy-11 \
   libc++-11-dev libc++abi-11-dev
sudo update-alternatives --install /usr/bin/clangd clangd /usr/bin/clangd-11 100
  1. 安装 vim-plug
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

提示 :如果国内因DNS污染无法访问 raw.githubusercontent.com,可以通过设置 /etc/hosts 解决,在其中增加如下一行内容。

151.101.84.133  raw.githubusercontent.com
  1. 配置 vimrc

修改 ~/.vimrc 文件如下:

let mapleader = " "

call plug#begin('~/.vim/plugged')

Plug 'neoclide/coc.nvim', {
    'for':[ 'c', 'cpp', 'json', 'cmake', 'vim'], 'branch': 'release'}
Plug 'rhysd/vim-clang-format', {
    'for' : ['c', 'cpp']}
Plug 'chxuan/cpp-mode', {
    'for' : ['cpp']}

call plug#end()

" plugin-config vim-clang-format
let g:clang_format#auto_format=1

" plugin-config cpp-mode
nnoremap <leader>y :CopyCode<cr>
nnoremap <leader>p :PasteCode<cr>
nnoremap <leader>u :GoToFunImpl<cr>
nnoremap <silent> <leader>a :Switch<cr>

" plugin-config coc-snippets {
    {
    {
    
inoremap <silent><expr> <TAB>
      \ pumvisible() ? coc#_select_confirm() :
      \ coc#expandableOrJumpable() ? "\<C-r>=coc#rpc#request('doKeymap', ['snippets-expand-jump',''])\<CR>" :
      \ <SID>check_back_space() ? "\<TAB>" :
      \ coc#refresh()

function! s:check_back_space() abort
  let col = col('.') - 1
  return !col || getline('.')[col - 1]  =~# '\s'
endfunction

let g:coc_snippet_next = '<tab>'
" plugin-config coc-snippets }}}

" plugin-config coc-definition
nmap <silent> <leader>d :call CocAction('jumpDeclaration')<CR>
nmap <silent> <leader>i :call CocAction('jumpDefinition')<CR>

" options {
    {
    {
    
set tabstop=2
set softtabstop=2
set shiftwidth=2
set smarttab
set expandtab

set nohlsearch
set incsearch
set hidden
set nobackup
set nowritebackup
set updatetime=300
set shortmess+=c
set signcolumn=yes
set nonumber
set ttyfast
set showcmd
set cmdheight=1
set noswapfile
set nobackup
set noerrorbells
set autowrite
set ignorecase
set ruler
set cursorline
set colorcolumn=110
set title
set showmatch
set noshowmode
set mouse=v
set modifiable
set splitright
set splitbelow
set shortmess=atI
set backspace=indent,eol,start
set wildmenu
set encoding=utf-8 nobomb
set binary
set autoread
set mousehide
set spelllang=en_US
set fileformat=unix
set autoread
set autowrite
set laststatus=2
set termwinsize=10*0
set number
set background=dark
set formatoptions=c,l,1,p
set expandtab
set nowrap
" options }}}

" Uncomment the following to have Vim jump to the last position when reopening a file
if has("autocmd")
  au BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$")
    \| exe "normal! g'\"" | endif
endif

if has('persistent_undo')      "check if your vim version supports it
  set undofile                 "turn on the feature
  set undodir=$HOME/.vim/undo  "directory where the undo files will be stored
endif

修改.vimrc后,请不要忘记在命令行中执行 mkdir ~/.vim/undo -p 创建一个存放历史操作记录的文件夹。

  1. 安装插件
    在 vim 默认导航模式键入:PlugInstall,vim-plug 会安装~/.vimrc中所配置的三项插件,主要用于代码自动补全和跳转。
  2. 配置补全服务器
    在 vim 默认导航模式键入:CocConfig,在打开的配置文件中粘贴如下内容:

提示: 在vim中编辑时,阁下可能需要在粘贴前 :set paste,键入i进入插入模式,按 Ctrl+Shift+V 粘贴系统剪贴板内容,Esc退出,然后:set nopaste:set paste 的作用是临时取消自动插入缩进符。

{
    
  "languageserver":{
    
    "clangd":{
    
      "command":"clangd",
      "filetypes":[
        "c",
        "cpp"
      ],
      "rootPatterns":[
        "compile_commands.json",
        ".git"
      ],
      "args":[
        "--compile-commands-dir=build",
        "--compile_args_from=filesystem",
        "--all-scopes-completion",
        "--background-index",
        "--clang-tidy",
        "--cross-file-rename",
        "--completion-parse=always",
        "--completion-style=detailed",
        "--function-arg-placeholders",
        "--header-insertion-decorators",
        "--query-driver=/usr/bin/**/clang-*,/home/adem/GCC-10/bin/g++*",
        "--header-insertion=never",
        "--limit-results=0",
        "-j=6",
        "--pch-storage=memory"
      ]
    }
  }
}

在后续的项目中,只要使vim所编辑的文件的各级父目录下存在compile_commands.json 文件,就可以实现整个项目中变量的跳转和补全了,并且感觉不到延时。这里的 compile_commands.json 文件可以通过许多常用的工具方便地生成,参见这里

示例: 当使用 CMake 时,在命令行中增加 -DCMAKE_EXPORT_COMPILE_COMMANDS=1 选项,或在顶层CMakeLists.txt中增加 set(CMAKE_EXPORT_COMPILE_COMMANDS ON)一行内容。

该环境下可用的部分快捷键

  • <ctrl>+n 切换下一个补全项(键入单词或函数时会自动补全,且自带实时语法检查)
  • <tab> 切换下一个补全项
  • <space>+d 跳转到(当前光标所在位置对象的)定义
  • <spacd>+i 跳转到(当前光标所在位置对象的)实现
  • <ctrl>+o 跳转到上一位置
  • <ctrl>+i 跳转到下一位置
  • <space>+a 切换头文件/cpp文件
  • <space>+y 在头文件中复制函数签名
  • <space>+p 在对应的cpp文件中粘贴函数实现的定义
  • 重新打开文件后光标会从上次退出的位置开始,并且可以保留上次编辑的历史回退记录。
  • 其它VIM中默认自带的常用快捷键在此不重复列出。

参考资料

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_41294183/article/details/117424147

智能推荐

OFDM802.11a的FPGA实现(七)一级交织:分组交织器(含verilog和matlab代码)

在前面的文章中讲解了卷积编码和删余,实现了1/2、2/3、3/4编码速率的输出。数据域在编码之后,下一个部分就是交织。今天对交织进行具体实现。

移动硬盘无法读取?学会这3个方法,快速解决问题!_新硬盘无法识别-程序员宅基地

文章浏览阅读648次。移动硬盘在目前工作和学习中都是一个比较重要的工具。如果遇到移动硬盘无法读取的情况,应该如何解决呢?小编给大家总结了几个简单有效的操作方法,记得收藏起来哦!_新硬盘无法识别

微信小程序红包 php,如何用微信小程序发红包-程序员宅基地

文章浏览阅读250次。在目前的小程序版本尚不支持发红包这个功能,开发者们表面笑嘻嘻,心里妈卖批!在这里,提供一种已经实践过的解决思路。详细解析,就是下面的几个步骤1、首先是在小程序里面的领红包入口2、点击后跳转webview, 附带当前的小程序的token给webview验证,webview 的src 指向具备付款能力的服务号的一个获取openid页面,根据附加的token来判断用户是否可以领取红包,此时用户拥有两个o..._小程序 可以用微信支付 现金红包php

视频教程-跟一夫学UI设计 APPUI综合设计与图标实战案例视频教程 photoshop绘制icon案例-UI-程序员宅基地

文章浏览阅读104次。跟一夫学UI设计 APPUI综合设计与图标实战案例视频教程 photoshop绘制icon案例 ..._app风格案例视频

vue 海康视频播放_vue-hkvideo-程序员宅基地

文章浏览阅读4k次,点赞4次,收藏22次。1. 下载并安装海康 web 插件https://open.hikvision.com/download/5c67f1e2f05948198c909700?type=102. 把上一步解压的三个 js, 复制到你的项目中, 根据路径, 自己引入到 index.html 中3. 建议运行它的 demo, 大概看看代码, 了解一下它的大致结构, 它的注解很详细, 3 分钟就能看完4. 贴上我的代码(我的是每次只显示一个画面, 点击摄像头切换画面)<temp.._vue-hkvideo

html li 鼠标经过变色,CSS实现li标签鼠标经过时改变背景颜色-程序员宅基地

文章浏览阅读5.3k次,点赞3次,收藏4次。很多时候需要用到这个css效果,实际上就用了一个li标签的热点样式,不仅是li标签,div等也可以的完整代码如下,div/css鼠标热点改变li标签背景颜色body{ background-color:#CCCC99; margin:0; padding:0; color:#fff;}ul{ margin:0; padding:50px;}li{ list-style:none; height:2..._ul li 样式 鼠标移入颜色

随便推点

VBOX报错"Kernel driver not installed(rc=-1908)"-程序员宅基地

文章浏览阅读129次。根据报错提示先安装dkms包[root@OS4 ~]# rpm-ivh dkms-2.2.0.3-3.2.noarch.rpm warning: dkms-2.2.0.3-3.2.noarch.rp..._vboxheadless: error -1908 in suplibosinit! vboxheadless: kernel driver not i

vue.js的手脚架vue-cli项目搭建的步骤-程序员宅基地

文章浏览阅读90次。手脚架是什么?众所周知,现在的前端项目发展得越渐越大,我们前端程序员要从0开始去搭建一套完整的项目很费时,所以这时候前端工程的手脚架就出现了。我用得vue-cli也是其中之一,还有其他的我也说不清,我就说一下我接触比较多的这款vue-cli,但是所有手脚架的核心:都是为了能够快速搭建一个完整的项目的结构,开发者只需要在生成的项目结构的基础上进行开发即可,非常简单高效。然后..._如何上线vue-cli手脚架项目到服务器

python进程和线程-程序员宅基地

文章浏览阅读794次,点赞19次,收藏19次。2、multiprocessing.Process类的join()方法可以阻塞主进程,当子进程没有进行完成的时候,主进程hold。2、threading.Thread类的join()方法可以阻塞主进程,当子线程没有进行完成的时候,主线程hold。3、可以通过继承multiprocessing.Process并重写run()函数的方法来实现多线程。1、线程通过multiprocessing.Process类的start()方法启动。1、线程通过threading.Thread类的start()方法启动。

使用OkHttp 缓存 API 调用提高Android应用性能

要能够将 API 调用的响应本地存储到缓存中,首先,我们需要定义缓存并通知客户端。在下面的代码片段中,我们使用 okhttp 库中的 Cache 类定义了缓存。我们将此缓存的最大大小设置为 5 MB。然后,在初始化 okhttpclient 参数时使用cache()函数。.build()如果设备连接到互联网:如果最后一次 API 响应是在不到 30 分钟之前检索的,则显示缓存的响应;否则,获取新的响应并将其存储在缓存中。如果设备离线:使用最多 1 天前的 API 响应以保持应用程序功能。

一键实现在VS Code中绘制流程图

而其较为出众的一点,就是较好的可拓展性,即丰富的插件应用,这些应用可以极大地提高生产效率,并优化日常使用。可以发现,其整体格局和我们常见的流程图编辑应用较为类似,其主题颜色也与我们的VS Code保持一致,在这里为了编辑方便,我们还是将编辑器主题改为浅色。当然,其功能仍存在局限,不能够完全代替我们传统的图形绘制工具,但也可以作为我们日常工作的有益补充,帮助我们完成一些特定情景下的项目。整体布局也十分明晰,与我们常用的Visio极为类似:左侧为形状选项卡,中间为画布容器,右侧为样式编辑。

go http框架下的静态资源代理实现(压缩,缓存验证自定义)

之前在说了我的第一版静态资源代理,后面我又完善了一下:照着以上思路,可以在其他语言其他框架中实现,因为对框架没有依赖,都是使用的一些基本功能。