" use space as leader key
let mapleader = " "
set undofile " Maintain undo history between sessions
set undodir=~/.vim/undodir
" for formatter
let g:python3_host_prog="/usr/bin/python3"
let g:formatterpath = ['~/.local/bin/clang-format', '~/.local/bin/autopep8']
" gf search path, such as c/cpp head file
set path=.,/usr/include/**,$HOME/.local/include/**
" use plugin
set nocompatible
let g:polyglot_disabled = ['sensible']
filetype plugin indent on
call plug#begin('~/.vim/plugged')
" Plug 'ycm-core/YouCompleteMe'
" Plug 'vim-airline/vim-airline'
Plug 'preservim/nerdtree'
Plug 'ludovicchabant/vim-gutentags'
Plug 'skywind3000/asyncrun.vim'
" Plug 'dense-analysis/ale'
Plug 'sheerun/vim-polyglot'
Plug 'joshdick/onedark.vim'
Plug 'vim-autoformat/vim-autoformat'
Plug 'preservim/tagbar'
call plug#end()
colorscheme onedark
noremap <leader>f :Autoformat<CR>
" open vimrc config by ctrl,
nnoremap <silent> <C-,> :e ~/.vimrc<CR>
inoremap <silent> <C-,> <Esc>:e ~/.vimrc<CR>
"set fold by syntax
set foldmethod=syntax
set foldlevel=99
" for save file
inoremap <C-s> <Esc>:w<CR>a
nnoremap <C-s> :w<CR>
vnoremap <C-s> <Esc>:w<CR>gv
" make vim paste <==> physic machine
"autocmd TextYankPost * echo v:event
function! s:raw_echo(str)
if has('win32') && has('nvim')
call chansend(v:stderr, a:str)
else
if filewritable('/dev/fd/2')
call writefile([a:str], '/dev/fd/2', 'b')
else
exec("silent! !echo " . shellescape(a:str))
redraw!
endif
endif
endfunction
function Copy()
let c = join(v:event.regcontents,"\n")
let c64 = system("base64 -w 0", c)
let str1 = "\e]52;c;" . trim(c64) . "\x07"
call s:raw_echo(str1)
endfunction
autocmd TextYankPost * call Copy()
nnoremap <F5> :autocmd! TextYankPost *<CR>
nnoremap <F6> :autocmd TextYankPost * call Copy()<CR>
" show space and line eof char
" set list listchars+=space:. listchars-=eol:$
" syntax highlight
syntax on
" show line number and relative number
set number
"set relativenumber
" indent when newline
set smartindent
" mouse mode
set mouse=n
" use plugin
" filetype plugin on
" cancel backup and no generate swp file
set nobackup
set nowb
set noswapfile
""""" search config """"
" use search highlight
set hlsearch
" increase search by result
set incsearch
" ignore but not always ignore
set ignorecase
set smartcase
" show n/N/*/# search index in status bar
set shortmess-=S
""""""" end of search config""""
" if has Chinese confusion code on Linux , use these:
set enc=utf-8
set fencs=utf-8,gbk,big5,cp936,gb18030,gb2312,utf-16
set fenc=utf-8
" tab width =4
set tabstop=4
" indent = 4
set softtabstop=4
set shiftwidth=4
set expandtab
" jk -> <ESC>
inoremap jk <ESC>
" v as visual and select mode
" vnoremap jk <ESC>
" use emacs keymap in insert mode
inoremap <C-B> <LEFT>
inoremap <C-F> <RIGHT>
inoremap <C-A> <HOME>
inoremap <C-E> <END>
inoremap <C-D> <DEL>
inoremap <C-H> <BACKSPACE>
" cn to change multi place
nnoremap cn *``cgn
nnoremap cN *``cgN
" for multi line micro
imap <C-E> <ESC>A
xnoremap @ :<C-u>call ExecuteMacroOverVisualRange()<CR>
function! ExecuteMacroOverVisualRange()
echo "@".getcmdline()
execute ":'<,'>normal @".nr2char(getchar())
endfunction
"nnoremap <leader>n :NERDTreeFocus<CR>
"nnoremap <C-n> :NERDTree<CR>
nnoremap <C-n> :NERDTreeToggle<CR>
"nnoremap <C-f> :NERDTreeFind<CR>
"for asyncRun
" open quickfix window auto,height
let g:asyncrun_open = 9
" bell when task done.
let g:asyncrun_bell = 1
" set open/close Quickfix window
nnoremap <leader>c :call asyncrun#quickfix_toggle(6)<cr>
" Map Alt-q to close the window
nnoremap <silent> <leader>q :q<CR>
"
"nnoremap <silent> <F8> :AsyncRun gcc -Wall "$(VIM_FILEPATH)" -o "$(VIM_FILEDIR)/$(VIM_FILENOEXT)" <cr>
"nnoremap <silent> <F5> :AsyncRun -raw -cwd=$(VIM_FILEDIR) "$(VIM_FILEDIR)/$(VIM_FILENOEXT)" <cr>
set termwinsize=20x120
" Define a function to set key mappings for shell files
function! SetShellKeymaps()
nnoremap <F8> :w<CR>:AsyncRun bash %:p <CR>
inoremap <F8> <ESC>:w<CR>:AsyncRun bash %:p<CR>
endfunction
" Set up an autocmd for the FileType event for shell files
autocmd FileType sh call SetShellKeymaps()
autocmd FileType bash call SetShellKeymaps()
" autocmd FileType zsh call SetShellKeymaps()
" Define a function to set key mappings for Python files
function! SetPythonKeymaps()
nnoremap <F8> :w<CR>:AsyncRun python3 %:p <CR>
inoremap <F8> <ESC>:w<CR>:AsyncRun python3 %:p<CR>
endfunction
" Set up an autocmd for the FileType event for Python files
autocmd FileType python call SetPythonKeymaps()
function! SetCKeymaps()
nnoremap <F7> :w<CR>:AsyncRun gcc -Wshadow -Wall -o %:p:r.out %:p <CR>
inoremap <F7> <ESC>:w<CR>:AsyncRun gcc -Wshadow -Wall -o %:p:r.out %:p <CR>
nnoremap <F8> :AsyncRun %:p:r.out <CR>
endfunction
autocmd FileType c call SetCKeymaps()
function! SetCXXKeymaps()
nnoremap <F7> :w<CR>:AsyncRun g++ -Wshadow -Wall -std=c++2a -o %:p:r.out %:p <CR>
inoremap <F7> <ESC>:w<CR>:AsyncRun g++ -Wshadow -Wall -std=c++2a -o %:p:r.out %:p <CR>
nnoremap <F8> :AsyncRun %:p:r.out <CR>
endfunction
autocmd FileType cpp call SetCXXKeymaps()
" for tags
set tags=./.tags;,.tags
" gutentags 搜索工程目录的标志,碰到这些文件/目录名就停止向上一级目录递归
let g:gutentags_project_root = ['.root', '.svn', '.git', '.hg', '.project']
" 所生成的数据文件的名称
let g:gutentags_ctags_tagfile = '.tags'
" 将自动生成的 tags 文件全部放入 ~/.cache/tags 目录中,避免污染工程目录
let s:vim_tags = expand('~/.cache/tags')
let g:gutentags_cache_dir = s:vim_tags
" 配置 ctags 的参数
let g:gutentags_ctags_extra_args = ['--fields=+niazS', '--extra=+q']
let g:gutentags_ctags_extra_args += ['--c++-kinds=+px']
let g:gutentags_ctags_extra_args += ['--c-kinds=+px']
" 检测 ~/.cache/tags 不存在就新建
if !isdirectory(s:vim_tags)
silent! call mkdir(s:vim_tags, 'p')
endif
" allow backspace delete char in different mode
set backspace=indent,eol,start
" focus window by Ctrl + hjkl
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-h> <C-w>h
nnoremap <C-l> <C-w>l
" use ag as grep program
if executable('ag')
set grepprg=ag\ --vimgrep\ $* " receive other parameter
set grepformat=%f:%l:%c:%m " file:line:column:message
endif
" just for best search
function! MySearch()
let grep_term = input("Search=> ")
if !empty(grep_term)
execute 'silent grep' grep_term | copen
else
echo "Empty search term"
endif
redraw!
endfunction
command! Search call MySearch()
nnoremap <leader>s :Search<CR>
"statusline
set laststatus=2
function! GitBranch()
return system("git rev-parse --abbrev-ref HEAD 2>/dev/null | tr -d '\n'")
endfunction
let branch=GitBranch()
function! ShortFileName()
let a=bufname("")
let filename = fnamemodify(a, ':t')
return filename
endfunction
map <Leader>r <ESC>:w <CR> :source $MYVIMRC<CR>
map <leader>t :TagbarToggle <CR>
" for custom statusline color
hi User1 cterm=none ctermfg=blue ctermbg=238
hi User2 cterm=none ctermfg=green ctermbg=238
hi User3 cterm=bold ctermfg=green ctermbg=238
hi User4 cterm=bold ctermfg=cyan ctermbg=238
hi User5 cterm=none ctermfg=green ctermbg=238
hi User7 cterm=none ctermfg=green ctermbg=238
set statusline=%1*%{branch}\ %{ShortFileName()}\ %m%r%h%w\ %2*%{tagbar#currenttag('%s','','f')}\ %=\ %3*\ %Y\ %4*%{\"\".(\"\"?&enc:&fenc).((exists(\"+bomb\")\ &&\ &bomb)?\"+\":\"\").\"\"}\ %5*[%p%%]\ \ %7*%LL%<