Vim 从零开始配置

 

配置

mkdir -p ~/.vim/autoload/
vi ~/.vim/autoload/plug.vim
## add https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
" 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%<

快捷键

  • Ctrl+x Ctrl+f: 进入路径补全