A (neo)vim IDE setup for C/C++, that just works
Honestly I don’t think over-functional completion and diagnostics give you any productivity. The same is true for highlighting: if you highlight everything, you highlight nothing. It’s a harmful mentality to think “oh I have to have the best tools before I get started.” No, tool is just tool, the purpose is production.
So this is what I want:
- basic syntax highlighting.
- completions based on current project.
- jump to definition.
Essential tools/plugins
Deoplete for completion framework
https://github.com/Shougo/deoplete.nvim
Deoplete-clang plus clang support
https://github.com/deoplete-plugins/deoplete-clang
gutentags for tag generation (to jump to defs)
https://github.com/ludovicchabant/vim-gutentags
Clang/LLVM
https://llvm.org
in most cases you can simply install with your system’s package manager.
Optional ones that make life easier
bear generate a compile database for your makefile based project.
https://github.com/rizsotto/Bear
Neosnippet plus snippet support
https://github.com/Shougo/neosnippet.vim
tagbar tagging within the buffer.
https://github.com/preservim/tagbar
vim-clang-format
https://github.com/rhysd/vim-clang-format
vim-autoformat
https://github.com/vim-autoformat/vim-autoformat
nerdcommenter
https://github.com/preservim/nerdcommenter
lightline a better status line.
https://github.com/itchyny/lightline.vim
vim-bufferline
https://github.com/bling/vim-bufferline
ctrlpvim/ctrlp.vim
https://github.com/kien/ctrlp.vim
mileszs/ack.vim
https://github.com/mileszs/ack.vim
MY COMPLETE VIMRC:
init.vim
"important stuffs================================
syntax on
source ~/.config/nvim/plugins.vim
"CUSTOM SCRIPTS==================================
source ~/.config/nvim/custom_scripts.vim
"COLORS AND FONTS================================
set guifont=Source\ Code\ Pro
let base16colorspace=256
set t_Co=256
" set background=dark
if has('nvim') || has('termguicolors')
set termguicolors
endif
colorscheme dichromatic
" setting transparancy same to terminal
" hi normal guibg=000000
"VISUALS AND UI==================================
set wildmenu
set nu
set cursorline
set culopt=number
set colorcolumn=96
set clipboard+=unnamedplus
set laststatus=2
set signcolumn=no
autocmd! ColorScheme * hi VertSplit cterm=NONE gui=NONE
set so=7
set ruler
set cmdheight=1
set hid
set backspace=eol,start,indent
set whichwrap+=<,>,h,l
set lazyredraw
set magic
set showmatch
set mat=2
"BEHAVIOURS======================================
set history=500
set autoread
au FocusGained,BufEnter * checktime
set ignorecase
set smartcase
set hlsearch
set incsearch
" :W sudo saves the file
command! W execute 'w !sudo tee % > /dev/null' <bar> edit!
" Avoid garbled characters in Chinese language windows OS
let $LANG='en'
set langmenu=en
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
" Turn backup off, since most stuff is in SVN, git etc. anyway...
set nobackup
set nowb
set noswapfile
set ai "Auto indent
set si "Smart indent
set expandtab
set smarttab
set shiftwidth=4
set tabstop=4
set lbr
set tw=500
set wrap "Wrap lines
"FILETYPE SPECIFICS==============================
" Enable filetype plugins
filetype plugin on
filetype indent on
filetype plugin indent on
au FileType markdown set tw=80
au FileType latex set tw=80
" Ignore compiled files
set wildignore=*.o,*~,*.pyc
if has("win16") || has("win32")
set wildignore+=.git\*,.hg\*,.svn\*
else
set wildignore+=*/.git/*,*/.hg/*,*/.svn/*,*/.DS_Store
endif
" No annoying sound on errors
set noerrorbells
set novisualbell
set t_vb=
set tm=500
"COMPLETION======================================
inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>"
inoremap <expr> <Tab> pumvisible() ? "\<C-n>" : "\<Tab>"
"MAPPINGS========================================
let mapleader="\\"
""" bind mapleader only in normal mode
nnoremap \\ <NOP>
nnoremap <C-J> <C-W><C-J>
nnoremap <C-K> <C-W><C-K>
nnoremap <C-L> <C-W><C-L>
nnoremap <C-H> <C-W><C-H>
map <C-W> :Bclose <CR>
" tag goto
nnoremap <leader>g <C-]>
" Visual mode pressing * or # searches for the current selection
" Super useful! From an idea by Michael Naumann
vnoremap <silent> * :<C-u>call VisualSelection('', '')<CR>/<C-R>=@/<CR><CR>
vnoremap <silent> # :<C-u>call VisualSelection('', '')<CR>?<C-R>=@/<CR><CR>
" Map <Space> to / (search) and Ctrl-<Space> to ? (backwards search)
map <space> /
map <C-space> ?
" Disable highlight when <leader><cr> is pressed
map <silent> <leader><cr> :noh<cr>
" Opens a new tab with the current buffer's path
" Super useful when editing files in the same directory
map <leader>te :tabedit <C-r>=expand("%:p:h")<cr>/
" Switch CWD to the directory of the open buffer
" map <leader>cd :cd %:p:h<cr>:pwd<cr>
" Return to last edit position when opening files (You want this!)
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
" Delete trailing white space on save, useful for some filetypes ;)
fun! CleanExtraSpaces()
let save_cursor = getpos(".")
let old_query = getreg('/')
silent! %s/\s\+$//e
call setpos('.', save_cursor)
call setreg('/', old_query)
endfun
if has("autocmd")
autocmd BufWritePre *.txt,*.js,*.py,*.wiki,*.sh,*.coffee :call CleanExtraSpaces()
endif
" Spell Checking
map <leader>ss :setlocal spell!<cr>
function! CmdLine(str)
call feedkeys(":" . a:str)
endfunction
function! VisualSelection(direction, extra_filter) range
let l:saved_reg = @"
execute "normal! vgvy"
let l:pattern = escape(@", "\\/.*'$^~[]")
let l:pattern = substitute(l:pattern, "\n$", "", "")
if a:direction == 'gv'
call CmdLine("Ack '" . l:pattern . "' " )
elseif a:direction == 'replace'
call CmdLine("%s" . '/'. l:pattern . '/')
endif
let @/ = l:pattern
let @" = l:saved_reg
endfunction
plugins.vim
call plug#begin('~/.vim/plugged')
" Apparance
Plug 'rafi/awesome-vim-colorschemes'
Plug 'https://gitlab.com/protesilaos/tempus-themes-vim.git'
Plug 'vim-scripts/ScrollColors'
Plug 'kyazdani42/nvim-web-devicons'
Plug 'romainl/vim-dichromatic'
" Layouts & Lines & Bars
Plug 'itchyny/lightline.vim'
Plug 'bling/vim-bufferline'
" Misc
Plug 'tweekmonster/startuptime.vim'
" Editor
Plug 'jiangmiao/auto-pairs'
Plug 'preservim/nerdtree'
Plug 'rbgrouleff/bclose.vim'
" Programming
Plug 'majutsushi/tagbar'
Plug 'rhysd/vim-clang-format'
Plug 'alx741/vim-stylishask'
Plug 'preservim/nerdcommenter'
Plug 'Chiel92/vim-autoformat'
Plug 'ludovicchabant/vim-gutentags'
" Plug 'neovim/nvim-lspconfig'
" Plug 'prabirshrestha/vim-lsp'
" Utils
Plug 'ctrlpvim/ctrlp.vim'
Plug 'ap/vim-css-color'
Plug 'mileszs/ack.vim'
" Previews
Plug 'iamcco/markdown-preview.nvim', { 'do': { -> mkdp#util#install() }, 'for': ['markdown', 'vim-plug']}
Plug 'xuhdev/vim-latex-live-preview', { 'for': 'tex' }
" Latex/ markdowns
Plug 'lervag/vimtex'
Plug 'godlygeek/tabular'
Plug 'plasticboy/vim-markdown'
Plug 'metakirby5/codi.vim'
" deplete
Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' }
Plug 'zchee/deoplete-clang'
Plug 'Shougo/neosnippet.vim'
Plug 'Shougo/neosnippet-snippets'
call plug#end()
" deoplete conf
source ~/.config/nvim/deoplete_conf.vim
" gutentags
augroup MyGutentagsStatusLineRefresher
autocmd!
autocmd User GutentagsUpdating call lightline#update()
autocmd User GutentagsUpdated call lightline#update()
augroup END
" Ack
let g:ackprg = 'ag --vimgrep'
let g:vimtex_view_general_viewer = 'zathura'
let g:vimtex_quickfix_mode=1
"" lightline:
source ~/.config/nvim/lightline_conf.vim
"" Bufferline
let g:bufferline_echo = 0
let g:python3_host_prog='/usr/bin/python'
nmap <F8> :TagbarToggle<CR>
nmap <F9> :NERDTreeToggle<CR>
" CtrlP:
" Setup some default ignores
let g:ctrlp_custom_ignore = {
\ 'dir': '\v[\/](\.(git|hg|svn)|\_site)$',
\ 'file': '\v\.(exe|so|dll|class|png|jpg|jpeg)$',
\}
let g:ctrlp_working_path_mode = 'r'
nmap <leader>p :CtrlP<cr>
" Easy bindings for its various modes
nmap <leader>bb :CtrlPBuffer<cr>
nmap <leader>bm :CtrlPMixed<cr>
nmap <leader>bs :CtrlPMRU<cr>
nmap <leader>t :CtrlPTag<cr>
nmap <F3> :Autoformat<CR>
" vim-markdown:
let g:tex_conceal = ""
" the default item indent is stupid
let g:tex_indent_items=0
let g:vim_markdown_math = 1
let g:vim_markdown_folding_disabled = 1
let g:vim_markdown_auto_insert_bullets = 0
" This gets rid of the nasty _ italic bug in tpope's vim-markdown
" block $$...$$
syn region math start=/\$\$/ end=/\$\$/
" inline math
syn match math '\$[^$].\{-}\$'
" actually highlight the region we defined as "math"
hi link math Statement
" Vim-live LAtex
let g:livepreview_previewer = 'zathura'
let g:livepreview_use_biber = 1
" vim-markdown-preview
let g:mkdp_open_to_the_world = 1
let g:mkdp_browser = 'vimb'
let g:mkdp_open_ip = '127.0.0.1'
let g:mkdp_port = 6789
let g:mkdp_browser = 'vimb'
let g:mkdp_refresh_slow = 1
let g:mkdp_preview_options = {
\ 'mkit': {},
\ 'katex': {},
\ 'uml': {},
\ 'maid': {},
\ 'disable_sync_scroll': 1,
\ 'sync_scroll_type': 'middle',
\ 'hide_yaml_meta': 1,
\ 'sequence_diagrams': {},
\ 'flowchart_diagrams': {},
\ 'content_editable': v:false,
\ 'disable_filename': 0
\ }
" NERDCOMMENTER:
" Add spaces after comment delimiters by default
let g:NERDSpaceDelims = 1
" Align line-wise comment delimiters flush left instead of following code indentation
let g:NERDDefaultAlign = 'left'
" Add your own custom formats or override the defaults
let g:NERDCustomDelimiters = { 'c': { 'left': '/*','right': '*/' } }
let g:NERDCustomDelimiters = { 'cpp': { 'left': '/*','right': '*/' } }
custom_scripts.vim
map <A-Tab> :call SwitchBuffer() <CR>
function! SwitchBuffer()
:set showtabline=2
:bn
" augroup enable
" autocmd InsertEnter * :set showtabline=0
" augroup END
endfunction
map <S-Tab> :call SwitchBufferP() <CR>
function! SwitchBufferP()
:set showtabline=2
:bp
" augroup enable
" autocmd InsertEnter * :set showtabline=0
" augroup END
endfunction
" to preview markdowns
" nnoremap <C-m> :silent !pandoc % -f gfm -o /tmp/vim-pandoc.html<CR>:redraw!<CR>
nnoremap <C-m> :call RenderMarkdown() <CR>
function! RenderMarkdown()
:silent !pandoc % -f gfm -o /tmp/vim-pandoc.html
:redraw!
endfunction
function! PreviewMarkdown()
:silent !pandoc % -f gfm -o /tmp/vim-pandoc.html
:redraw!
:!firefox /tmp/vim-pandoc.html > /dev/null 2>&1
endfunction
"##### auto fcitx ###########
let g:input_toggle = 1
function! Fcitx2en()
let s:input_status = system("fcitx-remote")
if s:input_status == 2
let g:input_toggle = 1
let l:a = system("fcitx-remote -c")
endif
endfunction
function! Fcitx2zh()
let s:input_status = system("fcitx-remote")
if s:input_status != 2 && g:input_toggle == 1
let l:a = system("fcitx-remote -o")
let g:input_toggle = 0
endif
endfunction
set ttimeoutlen=150
"Exit insert mode
autocmd InsertLeave * call Fcitx2en()
"Enter insert mode
autocmd InsertEnter * call Fcitx2zh()
"
lightline_conf.md
let g:lightline = {
\ 'colorscheme':'simpleblack',
\ 'tabline': {
\ 'left': [ ['bufferline'] ]
\ },
\ 'component_expand': {
\ 'bufferline': 'LightlineBufferline',
\ },
\ 'component_type': {
\ 'bufferline': 'tabsel',
\ },
\ }
function! LightlineBufferline()
call bufferline#refresh_status()
return [ g:bufferline_status_info.before, g:bufferline_status_info.current, g:bufferline_status_info.after]
endfunction
function! MyFilename()
if expand('%:t') == 'ControlP'
return g:lightline.ctrlp_prev . ' ' . g:lightline.subseparator.left . ' ' .
\ g:lightline.ctrlp_item . ' ' . g:lightline.subseparator.left . ' ' .
\ g:lightline.ctrlp_next
endif
if expand('%:t') == '__Tagbar__'
return 'Tagbar ' . g:lightline.subseparator.left . ' ' .
\ g:lightline.fname
endif
return ('' != MyReadonly() ? MyReadonly() . ' ' : '') .
\ (&ft == 'vimfiler' ? vimfiler#get_status_string() :
\ &ft == 'unite' ? unite#get_status_string() :
\ &ft == 'vimshell' ? vimshell#get_status_string() :
\ '' != expand('%:t') ? expand('%:t') : '[No Name]') .
\ ('' != MyModified() ? ' ' . MyModified() : '')
endfunction
function! CtrlPMark()
return expand('%:t') =~ 'ControlP' ? g:lightline.ctrlp_marked : ''
endfunction
let g:ctrlp_status_func = {
\ 'main': 'CtrlPStatusFunc_1',
\ 'prog': 'CtrlPStatusFunc_2',
\ }
function! CtrlPStatusFunc_1(focus, byfname, regex, prev, item, next, marked)
let g:lightline.ctrlp_prev = a:prev
let g:lightline.ctrlp_item = a:item
let g:lightline.ctrlp_next = a:next
let g:lightline.ctrlp_marked = a:marked
return lightline#statusline(0)
endfunction
function! CtrlPStatusFunc_2(str)
return lightline#statusline(0)
endfunction
deoplete_conf.vim
let g:deoplete#enable_at_startup = 1
" deoplete-clang and clang2
let g:deoplete#sources#clang#libclang_path = '/usr/lib/libclang.so'
let g:deoplete#sources#clang#clang_header = '/usr/lib/clang'
"
let g:deoplete#sources#clang#flags = ['-Iwhatever']"
call deoplete#custom#var('omni', 'input_patterns', {
\ 'tex': g:vimtex#re#deoplete
\})
imap <C-k> <Plug>(neosnippet_expand_or_jump)
smap <C-k> <Plug>(neosnippet_expand_or_jump)
xmap <C-k> <Plug>(neosnippet_expand_target)
" SuperTab like snippets behavior.
" Note: It must be "imap" and "smap". It uses <Plug> mappings.
imap <expr><TAB>
\ pumvisible() ? "\<C-n>" :
\ neosnippet#expandable_or_jumpable() ?
\ "\<Plug>(neosnippet_expand_or_jump)" : "\<TAB>"
smap <expr><TAB> neosnippet#expandable_or_jumpable() ?
\ "\<Plug>(neosnippet_expand_or_jump)" : "\<TAB>"
[+] click to leave a comment [+]
>> SEND COMMENT <<