如何将VIM配置成适用C语言的IDE
博客都快长了半年的草,整个换工作的过程也基本确定下来了,在前公司里做内核开发,还有souce insight可用来看代码,自己也就懒得折腾,到新公司后,source insight没得用了,只好把vim拿来配置,记录如下,一般情况下的IDE长什么样子都是类似,最好界面如source insight这般,可以解决类似问题。
左边有类似的函数列表,中间是代码编辑区,右边则是代码文件列表,最下面则显示搜索结果。那就先把成品放上来,如下图
详细代码参考https://github.com/OenHan/vim,整个代码也是从https://github.com/oenhan/dot-vimrc修改而来,专门针对我需要查看内核代码做的修改,原配置可能更适合前端开发等,做的大而全,我把没用的插件都删除了。
安装方法:
sudo apt-get install ctags cscope git mv ~/.vim ~/.vim.orig mv ~/.vimrc ~/.vimrc.orig git clone https://github.com/oenhan/vim.git ~/.vim ln -s ~/.vim/vimrc ~/.vimrc git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/vundle
在vim执行“:BundleInstall”进行插件安装。
安装的插件直接看bundles.vim,根据自己需要进行增删即可。
vimrc内容说一下,如果看着不爽,直接去https://github.com/oenhan/vim/blob/master/vimrc:
""""""""""""""""""""""""""""""""""""""""""""""
" OENHAN'S VIM CONFIG
"
" Maintainer: OenHan <oenhan#gmail.com>
" Last change: 2016-08-30
""""""""""""""""""""""""""""""""""""""""""""'"
source ~/.vim/bundles.vim
"""""""""""""""""""""""""""""""""""""""""
" 基本配置
"""""""""""""""""""""""""""""""""""""""""
" 启动的时候不显示那个援助乌干达儿童的提示
set shortmess=atI
" 解码
set encoding=utf-8
set fileencodings=utf-8,gb2312,gb18030,gbk,ucs-bom,cp936,latin1
" 关闭兼容模式
set nocompatible
" 历史记录控制
set history=1000
"""""""""""""""""""""""""""""""""""""""""
" vim控制配置
"""""""""""""""""""""""""""""""""""""""""
" 使用鼠标模式
set mouse=a
" 在title bar显示文件名
set title
" 总是显示状态栏
set laststatus=2
" 在状态栏显示命令行
set showcmd
" 显示光标当前位置
set ruler
" 禁止光标闪烁
set gcr=a:block-blinkon0
" 禁止显示滚动条
set guioptions-=l
set guioptions-=L
set guioptions-=r
set guioptions-=R
" 禁止显示菜单和工具条
set guioptions-=m
set guioptions-=T
" 将外部命令 wmctrl 控制窗口最大化的命令行参数封装成一个 vim 的函数
" yum install wmctrl
fun! ToggleFullscreen()
call system("wmctrl -ir " . v:windowid . " -b toggle,fullscreen")
endf
" 全屏开/关快捷键
map <silent> <F11> :call ToggleFullscreen()<CR>
" 启动 vim 时自动全屏
autocmd VimEnter * call ToggleFullscreen()
" 设置 退出vim后,内容显示在终端屏幕, 可以用于查看和复制, 不需要可以去掉
" 好处:误删什么的,如果以前屏幕打开,可以找回
set t_ti= t_te=
"""""""""""""""""""""""""""""""""""""""""
" 内容显示配置
"""""""""""""""""""""""""""""""""""""""""
" 开启代码颜色高亮
syntax on
syntax enable
" 告诉vim terminal支持 256 colors
set t_Co=256
" color scheme
set background=dark
color solarized
"color monokai
"colors Tomorrow-Night-Eighties
set guifont=Tsentsiu\ Mono\ HG\ 16
"""""""""""""""""""""""""""""""""""""""""
" 代码查看配置
"""""""""""""""""""""""""""""""""""""""""
" 开启实时搜索功能
set incsearch
" 搜索时大小写不敏感
set ignorecase
" vim 自身命令行模式智能补全
set wildmenu
set smartcase
set showmatch
set matchtime=2
" 高亮特殊符号
"set backspace=indent,eol,start
"set list listchars=tab:»\ ,
" 开启行号显示
set number
" 高亮显示当前行/列
set cursorline
set cursorcolumn
" 高亮显示搜索结果
set hlsearch
" 显示行号
set number
" 不自动换行
set nowrap
" 终端滚动时时刻保留n行在界面中
set scrolloff=7
" 基于缩进或语法进行代码折叠
"set foldmethod=indent
set foldmethod=syntax
" 启动 vim 时关闭折叠代码
set nofoldenable
" 默认收缩设置
set autoindent
set smartindent
set tabstop=4
set softtabstop=4
set shiftwidth=4
set textwidth=80
set smarttab
"set expandtab
" 根据侦测到的不同文件类型处理不同的插件和缩放
filetype on
filetype indent on
filetype plugin on
filetype plugin indent on
autocmd FileType python setlocal tabstop=4 shiftwidth=4 softtabstop=4 textwidth=120
autocmd FileType html,htmldjango,xhtml,haml setlocal tabstop=2 shiftwidth=2 softtabstop=2 textwidth=0
autocmd FileType make setlocal noexpandtab
" 新建.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, "")
elseif &filetype == 'ruby'
call setline(1,"#!/usr/bin/env ruby")
call append(line("."),"# encoding: utf-8")
call append(line(".")+1, "")
" elseif &filetype == 'mkd'
" call setline(1,"<head><meta charset=\"UTF-8\"></head>")
else
call setline(1, "/*************************************************************************")
call append(line("."), " > File Name: ".expand("%"))
call append(line(".")+1, " > Author: ")
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<iostream>")
call append(line(".")+7, "using namespace std;")
call append(line(".")+8, "")
endif
if &filetype == 'c'
call append(line(".")+6, "#include<stdio.h>")
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
"""""""""""""""""""""""""""""""""""""""""
" 代码修改配置
"""""""""""""""""""""""""""""""""""""""""
" 让配置变更立即生效
autocmd! BufWritePost $HOME/.vimrc source %
" 在另外一个vim中加载被修改过的vimrc
cnoreabbrev vimreload so $HOME/.vimrc
" 文件修改之后自动载入
set autoread
" 取消备份
set nobackup
" 关闭交换文件
set noswapfile
" 提醒退出时保存文件
set confirm
"""""""""""""""""""""""""""""""""""""""""
" 快捷键配置
"""""""""""""""""""""""""""""""""""""""""
" 定义前缀键
let mapleader=";"
" 定义快捷键到行首和行尾
nmap LB 0
nmap LE $
" 定义git grep 快捷键
cnoreabbrev grep !git grep
" vim文本选择
" v : 按照字符选择
" V : 按行选择
" Ctrl+v : 按列选择
" 剪切到剪切板
nmap <Leader>d "+d
" 设置快捷键将选中文本块复制至系统剪贴板
nmap <Leader>y "+y
" 设置快捷键将系统剪贴板内容粘贴至 vim
nmap <Leader>p "+p
" 遍历子窗口
nnoremap nw <C-W><C-W>
nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
nmap <F5> :TagbarToggle<cr>
nmap <F6> :NERDTreeToggle<cr>
nmap <F3> :GundoToggle<cr>
nmap <F4> :IndentGuidesToggle<cr>
nmap <C-F11> :!cscope -bRq<cr>
nmap <C-F12> :!ctags -R --c-kinds=+l+x+p --fields=+lS -I __THROW,__nonnull --extra=+ .<cr>
" When editing a file, always jump to the last cursor position
autocmd BufReadPost *
\ if ! exists("g:leave_my_cursor_position_alone") |
\ if line("'\"") > 0 && line ("'\"") <= line("$") |
\ exe "normal g'\"" |
\ endif |
\ endif
" w!! to sudo & write a file
cmap w!! %!sudo tee >/dev/null %
" eggcache vim
:command! W w
:command! WQ wq
:command! Wq wq
:command! Q q
:command! Qa qa
:command! QA qa
"""""""""""""""""""""""""""""""""""""""""
" 插件配置
"""""""""""""""""""""""""""""""""""""""""
" a.vim
" :A 跳到与当前.c同名的.h文件
nmap ha A
" :IH 跳到光标所在的单词对应的文件
nmap hi IH
" c.vim 默认不需要具体配置
" cscope.vim
if has('cscope')
set cscopetag
set csto=0
set cscopeverbose
cnoreabbrev csa cs add
cnoreabbrev csf cs find
cnoreabbrev csfs cs find s
cnoreabbrev csfc cs find c
cnoreabbrev csfe cs find e
cnoreabbrev csft cs find t
cnoreabbrev csfd cs find d
cnoreabbrev csfi cs find i
cnoreabbrev csfg cs find g
cnoreabbrev csk cs kill
cnoreabbrev csr cs reset
cnoreabbrev css cs show
cnoreabbrev csh cs help
cnoreabbrev cs cs find s <cword>
cnoreabbrev cc cs find c <cword>
cnoreabbrev ce cs find e <cword>
cnoreabbrev ct cs find t <cword>
cnoreabbrev cd cs find d <cword>
cnoreabbrev ci cs find i ^<cfile>$
cnoreabbrev cg cs find g <cword>
cnoreabbrev cf cs find f <cword>
nnoremap <C-s>s :cs find s <cword><CR>
nnoremap <C-s>g :cs find g <cword><CR>
nnoremap <C-s>c :cs find c <cword><CR>
nnoremap <C-s>t :cs find t <cword><CR>
nnoremap <C-s>e :cs find e <cword><CR>
nnoremap <C-s>f :cs find f <cfile><CR>
nnoremap <C-s>i :cs find i ^<cfile>$<CR>
nnoremap <C-s>d :cs find d <cword><CR>
endif
" ctags.vim
" ctags -R --c-kinds=+l+x+p --fields=+lS -I __THROW,__nonnull
" ctrlp.vim 快速文件查找
" 支持正则查询
let g:ctrlp_regexp = 1
let g:ctrlp_max_files = 0
" 过滤文件
set wildignore+="*/tmp/*,*.so,*.o,*.a,*.obj,*.swp,*.zip,*.pyc,*.pyo,*.class,.DS_Store"
let g:ctrlp_custom_ignore = {
\ 'dir': '\v[\/]\.(git|hg|svn)$',
\ 'file': '\v\.(exe|so|dll|o|mod.c)$',
\ 'link': 'SOME_BAD_SYMBOLIC_LINKS',
\ }
" 使用git index给搜索加速
let g:ctrlp_user_command = {
\ 'types': {
\ 1: ['.git', 'cd %s && git ls-files'],
\ },
\ 'fallback': 'find %s -type f'
\ }
" gundo.vim 调用 gundo 树
" u命令取消最近一次的操作,可以使用多次来恢复原有的操作
" U取消所有操作
" Ctrl+R可以恢复对使用u命令的操作
nnoremap <Leader>ud :GundoToggle<CR>
" 开启保存 undo 历史功能
set undofile
" undo 历史保存路径
set undodir=~/.undo_history/
" nerdtree
" 使用 NERDTree 插件查看工程文件。设置快捷键,速记:file list
nmap <Leader>fl :NERDTreeToggle<CR>
" 设置NERDTree子窗口宽度
let NERDTreeWinSize=20
" 设置NERDTree子窗口位置
let NERDTreeWinPos="right"
" 显示隐藏文件
let NERDTreeShowHidden=1
" NERDTree 子窗口中不显示冗余帮助信息
let NERDTreeMinimalUI=1
" 删除文件时自动删除文件对应 buffer
let NERDTreeAutoDeleteBuffer=1
let NERDTreeChDirMode=2
let NERDTreeIgnore=['\~$', '\.pyc$', '\.swp$']
let NERDTreeShowBookmarks=1
let NERDTreeRespectWildIgnore=1
let NERDTreeMinimalUI=1
" Tagbar
" 设置 tagbar 子窗口的位置出现在主编辑区的左边
let tagbar_left=1
" 设置显示/隐藏标签列表子窗口的快捷键。速记:identifier list by tag
nnoremap <Leader>ilt :TagbarToggle<CR>
" 设置标签子窗口的宽度
let tagbar_width=32
" tagbar 子窗口中不显示冗余帮助信息
let g:tagbar_compact=1
" 自动聚焦
let g:tagbar_autofocus=1
let g:tagbar_iconchars = ['▸', '▾']
" 设置 ctags 对哪些代码标识符生成标签
let g:tagbar_type_cpp = {
\ 'kinds' : [
\ 'c:classes:0:1',
\ 'd:macros:0:1',
\ 'e:enumerators:0:0',
\ 'f:functions:0:1',
\ 'g:enumeration:0:1',
\ 'l:local:0:1',
\ 'm:members:0:1',
\ 'n:namespaces:0:1',
\ 'p:functions_prototypes:0:1',
\ 's:structs:0:1',
\ 't:typedefs:0:1',
\ 'u:unions:0:1',
\ 'v:global:0:1',
\ 'x:external:0:1'
\ ],
\ 'sro' : '::',
\ 'kind2scope' : {
\ 'g' : 'enum',
\ 'n' : 'namespace',
\ 'c' : 'class',
\ 's' : 'struct',
\ 'u' : 'union'
\ },
\ 'scope2kind' : {
\ 'enum' : 'g',
\ 'namespace' : 'n',
\ 'class' : 'c',
\ 'struct' : 's',
\ 'union' : 'u'
\ }
\ }
" airline
let g:airline_theme='base16_solarized'
let g:airline_detect_modified=1
let g:airline_detect_paste=1
let g:airline_inactive_collapse=0
let g:airline_detect_spell=0
let g:airline_detect_crypt=1
"let g:airline_powerline_fonts=1
if !exists('g:airline_symbols')
let g:airline_symbols = {}
endif
let g:airline_symbols.crypt = '?'
let g:airline_symbols.linenr = ''
let g:airline_symbols.maxlinenr = ''
let g:airline_symbols.branch = ''
let g:airline_symbols.paste = 'ρ'
let g:airline_symbols.notexists = '∄'
let g:airline_symbols.whitespace = 'Ξ'
let g:airline_left_sep = ''
let g:airline_left_alt_sep = '|'
let g:airline_right_sep = ''
let g:airline_right_alt_sep = '|'
" airline自有插件
let g:airline#extensions#branch#enabled = 1
let g:airline#extensions#branch#vcs_priority = ["git"]
let g:airline#extensions#branch#format = 1
let g:airline#extensions#tabline#enabled = 1
let g:airline#extensions#tabline#left_sep = ' '
let g:airline#extensions#tabline#left_alt_sep = '|'
let g:airline#extensions#tabline#switch_buffers_and_tabs = 1
let g:airline#extensions#tabline#tab_nr_type = 2
let g:airline#extensions#tabline#buffer_idx_mode = 1
let g:airline#extensions#tabline#buffer_label = 'b'
let g:airline#extensions#tabline#tabs_label = 't'
" 跳到具体的tab 使用 :b 1<CR>
nnoremap <C-Left> :bp<CR>
nnoremap <C-Right> :bn<CR>
let g:airline#extensions#whitespace#enabled = 0
let g:airline#extensions#virtualenv#enabled = 1
let g:airline#extensions#capslock#enabled = 1
let g:airline#extensions#hunks#enabled = 1
let g:airline#extensions#hunks#non_zero_only = 1
let g:airline#extensions#hunks#hunk_symbols = ['+', '~', '-']
let g:airline#extensions#quickfix#enabled = 1
let g:airline#extensions#quickfix#quickfix_text = 'Quickfix'
let g:airline#extensions#quickfix#location_text = 'Location'
" indent_guides
" 随 vim 自启动
let g:indent_guides_enable_on_vim_startup=0
" 从第二层开始可视化显示缩进
let g:indent_guides_start_level=2
let g:indent_guides_indent_levels = 10
" 色块宽度
let g:indent_guides_guide_size=1
" 快捷键 i 开/关缩进可视化
nmap <silent> <Leader>i <Plug>IndentGuidesToggle
" vim-trailing-whitespace
cnoreabbrev fixws FixWhitespace
"Mark 高亮多个word
set viminfo+=!
let g:mwAutoLoadMarks = 1
let g:mwAutoSaveMarks = 0
" YouCompleteMe
let g:ycm_global_ycm_extra_conf = '~/.vim/ycm_extra_conf.py'
" 让Vim的补全菜单行为与一般IDE一致
set completeopt+=longest,menu
" 补全内容不以分割子窗口形式出现,只显示补全列表
"set completeopt-=preview
" YCM 补全菜单配色
"highlight Pmenu ctermfg=2 ctermbg=3 guifg=#D3D3D3 guibg=#005555
" YCM选中项配色
"highlight PmenuSel ctermfg=2 ctermbg=3 guifg=#D3D3D3 guibg=#004444
" 设置在下面几种格式的文件上屏蔽ycm
let g:ycm_filetype_blacklist = {
\ 'tagbar' : 1,
\ 'nerdtree' : 1,
\}
" 允许 vim 加载 .ycm_extra_conf.py 文件,不再提示
let g:ycm_confirm_extra_conf=0
"注释和字符串中的文字也会被收入补全
let g:ycm_collect_identifiers_from_comments_and_strings = 0
"在字符串输入中也能补全
let g:ycm_complete_in_strings = 1
" 补全功能在注释中同样有效
let g:ycm_complete_in_comments=1
" 从第2个键入字符就开始罗列匹配项
let g:ycm_min_num_of_chars_for_completion=2
" 禁止缓存匹配项,每次都重新生成匹配项
let g:ycm_cache_omnifunc=0
" 语法关键字补全
let g:ycm_seed_identifiers_with_syntax=1
" 开启 YCM 标签补全引擎
let g:ycm_collect_identifiers_from_tags_files=1
" 引入 C++ 标准库tags
"set tags+=/data/misc/software/misc./vim/stdcpp.tags
" YCM 集成 OmniCppComplete 补全引擎,设置其快捷键
inoremap <leader>; <C-x><C-o>
" Tab与空格之间进行转换
" Convert all leading spaces to tabs (default range is whole file):
" ---:Space2Tab
" Convert lines 11 to 15 only (inclusive):
" ---:11,15Space2Tab
" Convert last visually-selected lines:
" ---:'<,'>Space2Tab
" Same, converting leading tabs to spaces:
" ---:'<,'>Tab2Space
" Return indent (all whitespace at start of a line), converted from
" tabs to spaces if what = 1, or from spaces to tabs otherwise.
" When converting to tabs, result has no redundant spaces.
function! Indenting(indent, what, cols)
let spccol = repeat(' ', a:cols)
let result = substitute(a:indent, spccol, '\t', 'g')
let result = substitute(result, ' \+\ze\t', '', 'g')
if a:what == 1
let result = substitute(result, '\t', spccol, 'g')
endif
return result
endfunction
" Convert whitespace used for indenting (before first non-whitespace).
" what = 0 (convert spaces to tabs), or 1 (convert tabs to spaces).
" cols = string with number of columns per tab, or empty to use 'tabstop'.
" The cursor position is restored, but the cursor will be in a different
" column when the number of characters in the indent of the line is changed.
function! IndentConvert(line1, line2, what, cols)
let savepos = getpos('.')
let cols = empty(a:cols) ? &tabstop : a:cols
execute a:line1 . ',' . a:line2 . 's/^\s\+/\=Indenting(submatch(0), a:what, cols)/e'
call histdel('search', -1)
call setpos('.', savepos)
endfunction
command! -nargs=? -range=% Space2Tab call IndentConvert(<line1>,<line2>,0,<q-args>)
command! -nargs=? -range=% Tab2Space call IndentConvert(<line1>,<line2>,1,<q-args>)
command! -nargs=? -range=% RetabIndent call IndentConvert(<line1>,<line2>,&et,<q-args>)
贴上之后发现没啥说的,自己慢慢看吧,主要几个快捷键了解之后就很方便了。
如何将VIM配置成适用C语言的IDE来自于OENHAN
链接为:https://oenhan.com/vim-c-ide/


您好,我也按照您的这个配置,不过supertab的双击tab键失效了,您能解释下吗,谢谢!
您好,我也按照您的这个配置,不过supertab的双击tab键失效了,您能解释下吗,谢谢!