vim 打造 C/C++ 编程环境

  • 用vim打造出 C/C++ 编程环境的方法
  • 多个平台(Windows与linux)下vim的安装与配置
  • 提供了扩展多种编程语言的方案

vim下载与安装

linux下的下载与安装

  • Ubuntu下使用命令
sudo apt install vim
  • CentOs下使用命令
sudo yum install vim

windows下的下载与安装

  • 官网下载gvim安装包点击安装即可
    点此下载
  • 安装时务必记住安装路径,以便之后的配置;
  • 安装路径不要出现中文或空格,以避免一些奇怪的错误

vim插件的下载与应用

相关目录和配置文件

  • vimrc 配置文件

    linux下为 ~/.vimrc , windows下为安装目录下的 _vimrc文件

  • linux下vim插件的存放目录为

    cd ~/.vim/
    #如没有可自行创建
    #mkdir ~/.vim/
    
  • windows下插件存放目录为,软件安装目录下的 vimfile文件夹

插件管理插件 pathogen

  • 项目地址

    https://github.com/tpope/vim-pathogen

  • 安装命令

    mkdir -p ~/.vim/autoload ~/.vim/bundle && curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
    
  • 解释

    • 在~/.vim/目录下创建两个文件夹autoload 和 bundle
    • 将 pathogen.vim 文件下载到autoload目录下
    • 将其他插件放在 bundle 目录下, pathogen会自动将其配置,而不用自己将文件放在不同的目录
    • linux下可以直接复制上面的安装命令(当然前提时安装了git) ,
    • windows下从项目地址将文件下载下来按照上述说明建立相应的文件夹并将文件复制进去即可

自动匹配括号与引号 auto-pairs

  • 项目地址

    https://github.com/jiangmiao/auto-pairs

  • 安装命令

git clone git://github.com/jiangmiao/auto-pairs.git ~/.vim/bundle/auto-pair
  • 解释

    从GitHub上获取项目的文件夹复制到 ~/.vim/bundle 目录下(此后的插件都是此方式,之后不再赘述)

显示目录树 NERDTree

  • 项目地址

    https://github.com/scrooloose/nerdtree

  • 安装命令

    git clone https://github.com/scrooloose/nerdtree.git ~/.vim/bundle
    

ctags

  • 说明

    ctags并不是一个vim的插件,它是一个可执行的程序,通过它可以生成索引文件,用于变量与函数的跳转,列出及代码补全

  • linux下的安装

sudo apt-get install ctags		#Ubuntu
sudo yum install ctags			#CentOs
  • windows下的安装 点此下载

    把下载下来的压缩文件解压,把其中的 ctags.exe 文件添加环境变量(不会请自行百度)

taglist 列出函数、变量等

  • 项目地址

    http://www.vim.org/scripts/script.php?script_id=273

  • 安装命令

    cd ~/.vim/bundle && wget "http://www.vim.org/scripts/download_script.php?src_id=19574" -O taglist.zip && unzip taglist.zip -d taglist
    

C/C++代码补全 omnicppcomplete

  • 项目地址

    http://www.vim.org/scripts/script.php?script_id=1520

  • 安装命令

    cd ~/.vim/bundle && wget "http://www.vim.org/scripts/download_script.php?src_id=7722" -O omnicppcomplete.zip && unzip omnicppcomplete.zip -d omnicppcomplete
    
  • 额外添加库函数补全的方法

    以 STL 标准库为例

    • 下载用于生成 tags 文件的补全文件
      点此下载
    • 建立一个文件夹方便统一管理,(这里我选择在.vim/ 下建立一个名为 tags 的文件夹)
    mkdir -p ~/.vim/tags && cd ~/.vim/tags && wget "http://www.vim.org/scripts/download_script.php?src_id=9178" -O - | tar jxvf -
    
    • 生成 tags 文件,在 ~/.vim/tags/cpp_src/目录下执行如下命令
    ctags -R --sort=yes --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++
    
    • 添加tags文件路径到 vimrc
    set tags+=~/.vim/tags/cpp_src/tags
    

MiniBufExplorer 显示已打开的文件

  • 项目地址

    http://www.vim.org/scripts/download_script.php?src_id=3640

  • 安装命令

     mkdir -p ~/.vim/bundle/minibufexplorer/plugin && wget "http://www.vim.org/scripts/download_script.php?src_id=3640" -O ~/.vim/bundle/minibufexplorer/plugin/minibufexpl.vim
    

SuperTab — tab键触发代码补全

  • 项目地址

    https://github.com/ervandew/supertab

  • 安装命令

    cd ~/.vim/bundle && git clone https://github.com/ervandew/supertab.gi
    

vimrc文件的编写

以下是我的vimrc文件

几点说明

  • 文件中各个部分都做了注释,应该比较容易看懂
  • 文件中有些补全插件在文中并未提及,有些我自己也没装,可根据需要自行查找,这里提供的只是一个支持多种编程语言的vimrc文件编写思路,请见谅
"============================
"  windows下解决乱码问题(linux下不需要)
"============================
set encoding=utf-8
set fileencodings=utf-8,chinese,latin-1
if has("win32")
set fileencoding=chinese
else
set fileencoding=utf-8
endif
"解决菜单乱码
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
"解决consle输出乱码
language messages zh_CN.utf-

"============================
"  基本设置
"============================
syntax enable 					"开启语法高亮
syntax on 						"开启语法高亮

filetype on 					"检测文件类型
filetype plugin on 				"针对不同文件采取不同缩进方式
filetype indent on 				"允许插件
filetype plugin indent on 		"启动自动补全

set number						"显示行号
set ruler 						"显示当前行号
set showmode 					"显示当前Vim模式
set showcmd 					"显示正在输入的命令
set tabstop=4 					"设置tab宽度
set shiftwidth=4 				"设置自动对齐空格数
set smarttab 					"设置backspace删去tab"
set mouse=a 					"允许鼠标操作
set nobackup 					"取消备份
set noswapfile 					"取消临时文件
set encoding=utf-8 				"设置编码方式
set helplang=cn 				"中文帮助
set completeopt=longest,menu 	"自动补全配置
set wildmenu 					"增强命令行自动完成操作

"pathogen 插件管理
execute pathogen#infect()


"============================
"  TagList插件设置
"============================
autocmd FileType cpp set tags+=~/.vim/tags/cpp_src/tags  "设置tags文件包含
let Tlist_Show_One_File=1    	" 只展示一个文件的taglist
let Tlist_Exit_OnlyWindow=1  	" 当taglist是最后一个窗口时自动退出
let Tlist_Use_Right_Window=1 	" 在右边显示taglist窗口
let Tlist_Sort_Type="name"   	" tag按名字排序


"============================
"  补全插件设置
"============================
autocmd FileType css set omnifunc=csscomplete#CompleteCSS
autocmd FileType html set omnifunc=htmlcomplete#CompleteTags
autocmd FileType javascript set omnifunc=javascriptcomplete#CompleteJS
autocmd FileType xml set omnifunc=xmlcomplete#CompleteTags
autocmd FileType php set omnifunc=phpcomplete#CompletePHP
autocmd FileType ruby set omnifunc=rubycomplete#Complete
autocmd FileType perl set omnifunc=perlcomplete#Complete

"============================
"  C++ 补全插件设置
"============================
autocmd Filetype c setlocal omnifunc=cppcomplete#Complete
autocmd Filetype cpp setlocal omnifunc=cppcomplete#Complete
" search namespaces in the current buffer   and in included files
let OmniCpp_NamespaceSearch = 2     
let OmniCpp_ShowPrototypeInAbbr = 1 " 显示函数参数列表
let OmniCpp_MayCompleteScope = 1    " 输入 :: 后自动补全
let OmniCpp_DefaultNamespaces = ["std", "_GLIBCXX_STD"]
let OmniCpp_DisplayMode = 1 		"always show all members


"============================
"  Python 补全插件设置
"============================
autocmd Filetype python setlocal omnifunc=pythoncomplete#Complete
let g:pydiction_location='~/.vim/tools/pydiction/complete-dict'

"============================
"  Java 补全插件设置
"============================
autocmd Filetype java setlocal omnifunc=javacomplete#Complete
autocmd FileType java set omnifunc=javacomplete#Complete   
autocmd FileType java set completefunc=javacomplete#CompleteParamsInf
autocmd FileType java inoremap  . .


"============================
"  自动添加文件头
"============================
"新建.c,.h,.sh,.java文件,自动插入文件头 
autocmd BufNewFile *.cpp,*.[ch],*.sh,*.rb,*.java,*.py exec ":call SetTitle()" 
""定义函数SetTitle,自动插入文件头 
func SetTitle() 
    "如果文件类型为.sh文件 
    if &filetype == 'sh' 
        call setline(1,"\#!/bin/bash") 
        call append(line("."), "") 
    elseif &filetype == 'python'
        call setline(1,"#!/usr/bin/env python")
        call append(line("."),"# coding=utf-8")
        call append(line(".")+1, "") 
    else 
        call setline(1, "/*************************************************************************") 
        call append(line("."), "    > File Name: ".expand("%")) 
        call append(line(".")+1, "    > Author: DHD") 
        call append(line(".")+2, "    > Mail: ") 
        call append(line(".")+3, "    > Created Time: ".strftime("%c")) 
        call append(line(".")+4, " ************************************************************************/") 
        call append(line(".")+5, "")
    endif
    if expand("%:e") == 'cpp'
        call append(line(".")+6, "#include")
        call append(line(".")+7, "using namespace std;")
        call append(line(".")+8, "")
    endif
    if &filetype == 'c'
        call append(line(".")+6, "#include")
        call append(line(".")+7, "")
    endif
    if expand("%:e") == 'h'
        call append(line(".")+6, "#ifndef _".toupper(expand("%:r"))."_H")
        call append(line(".")+7, "#define _".toupper(expand("%:r"))."_H")
        call append(line(".")+8, "#endif")
    endif
    if &filetype == 'java'
        call append(line(".")+6,"public class ".expand("%:r"))
        call append(line(".")+7,"")
    endif
    "新建文件后,自动定位到文件末尾
endfunc 
autocmd BufNewFile * normal G


"============================
"  快捷键设置
"============================
"Ctrl + n 打开目录树
map  :NERDTree 		
"Ctrl + t 打开 taglist
map  :Tlist
"ctags 生成 cpp 文件的 tags
map  :call CreateTags()
" 编译运行
map  :call ComplieAndRun() 
" 调试
map  :call Rungdb() 


"============================
"  函数定义
"============================
"编译
func! ComplieAndRun()
	exec "w"
	if &filetype == 'c'
        exec "!g++ % -o %<"
        exec "!time ./%<"
    elseif &filetype == 'cpp'
        exec "!g++ % -std=c++11 -o %<"
        exec "!time ./%<"
    elseif &filetype == 'java' 
        exec "!javac %" 
        exec "!time java %<"
    elseif &filetype == 'sh'
        :!time bash %
    elseif &filetype == 'python'
       "exec "!time python2.7 %"
        exec "!time python3.6 %"
    elseif &filetype == 'html'
        exec "!google-chrome % &"
    endif
endfunc

"调试
func! Rungdb()
	exec "w"
	exec "!g++ % -std=c++11 -g -o %<"
	exec "!gdb ./%<"
endfunc

"生成tags文件
func! CreateTags()
	if &filetype == 'c'
		exec "!ctags *.c *.h --c-kinds=+p --fields=+iaS --extra=+fq "
	elseif &filetype == 'cpp'
		exec "!ctags *.cpp *.h *.hpp *.c --c++-kinds=+px --fields=+iaS --extra=+fq "
	elseif &filetype == 'java'
		exec "!ctags *.java --java-kinds=+p --fields=+iaS --extra=+fq "
	elseif &filetype == 'python'
		exec "!ctags *.py --python-kinds --fields=+iaS --extra=+f "
	elseif &filetype == 'html'
		exec "!ctags *.html --html-kinds=+p --fields=+iaS --extra=+f "
	endif
endfunc

你可能感兴趣的:(vim 打造 C/C++ 编程环境)