CC BY 4.0 (除特别声明或转载文章外)
如果这篇博客帮助到你,可以请我喝一杯咖啡~
vim配置文件
"vim-instant-markdown Take vim-plug as example
" 映射的一些常用的操作
" f8 : 打开当前文件大纲,包括class定义,方法,成员变量等(使用ctags)
" f9 : 打开文件树
" ctrl+]:跳转到符号定义处
" ,+c :跳转到符号被引用处
" ,+s :在tags中查找符号
" ,+m :高亮标记单词
"标签跳转:通过在项目根目录执行ctags -R生成tags文件,项目中的文件需要set tags=path/tags
"然后通过ctrl+]跳转到定义(或者g+ctrl+],会显示多个定义),通过ctrl+o跳转回去
"
"设置文件编码
set encoding=utf-8
set fileencodings=utf-8
set termencoding=utf-8
"设定leader键,Mark.vim使用了leader键
let mapleader='\'
let g:solarized_termcolors=256
"设置主题
syntax on
set background=dark
colorscheme onehalfdark
"常用主题onedark,xcodelight,xcodedark,xcodewwdc
"gotham,gotham256,solarized
set cursorline
"设置保持历史记录10000
set history=10000
"打开文件时禁止折叠
set nofoldenable
"按照语法高亮进行折叠
set fdm=indent
set display=lastline
set scrolloff=5
set matchtime=2
set matchpairs+=<:>
set number
set showcmd
set showmatch
" 设置文件不备份,这里被注释掉;
set nobackup
set noundofile
set noswapfile
"set backupext=.bak
"set backupdir=~/.vim/vim_bak/
"语法高亮
set syntax=on
" 去掉输入错误的提示声音
set noeb
" 在处理未保存或只读文件的时候,弹出确认
set confirm
" 自动缩进
set autoindent
set cindent
" 设置tab为四个空格空格代替Tab
" 注意: 插入模式下输入【ctrl+v+i】可以强制输入一个tab
set tabstop=4 " tabstop 表示一个 tab 显示出来是多少个空格的长度,默认8
set softtabstop=4 " softtabstop 表示在编辑模式的时候按退格键的时候退回缩进的长度,当使用 expandtab 时特别有用
set expandtab " 当设置成 expandtab 时,缩进用空格来表示,noexpandtab 则是用制表符表示一个缩进
set autoindent " 自动缩进
set cindent " 自动缩进补充
set shiftwidth=4 " 自动缩进空白字符个数
highlight WhitespaceEOL ctermbg=red guibg=red
match WhitespaceEOL /\s\+$/
" 显示行号
set number
" 历史记录数
set history=1000
"禁止生成临时文件
set nobackup
set noswapfile
"搜索忽略大小写
set ignorecase
set incsearch
set autoread
set autowrite
" 鼠标定位
" 鼠标定位和鼠标拷贝似乎不能共存,按住shift再使用鼠标拷贝
set mouse=a
" 普通模式下为光标方块,插入模式下为竖线
let &t_SI.="\e[6 q" "SI = INSERT mode
let &t_SR.="\e[4 q" "SR = REPLACE mode
let &t_EI.="\e[1 q" "EI = NORMAL mode (ELSE)
"光标颜色
highlight Cursor guifg=white guibg=white
highlight iCursor guifg=white guibg=white
set guicursor=n-v-c:block-Cursor
set guicursor+=i:ver100-iCursor
set guicursor+=n-v-c:blinkon0
set guicursor+=i:blinkwait10
set guitablabel=%N\ %f
"垂直分割线颜色
hi VertSplit guibg=#31312D guifg=#526A83 ctermfg=White ctermbg=Black term=none cterm=none gui=none
"plug插件管理器
call plug#begin('~/.vim/plugged')
Plug 'ycm-core/YouCompleteMe'
"文件树
Plug 'preservim/nerdtree'
"Plug 'ryanoasis/vim-devicons'
"自动补全括号
Plug 'jiangmiao/auto-pairs'
"底部状态栏美化
"Plug 'vim-airline/vim-airline'
Plug 'Lokaltog/vim-powerline'
"缩进指示线,在编辑py的时候很不错
Plug 'Yggdroot/indentLine'
Plug 'Yggdroot/LeaderF',{'do':'./install.sh'}
"主题
Plug 'altercation/vim-colors-solarized'
Plug 'Eric-Song-Nop/vim-glslx'
"针对C++的语法高亮
Plug 'octol/vim-cpp-enhanced-highlight'
"ale语法检查
Plug 'w0rp/ale'
"标签导航插件
Plug 'majutsushi/tagbar'
"彩虹括号
Plug 'luochen1990/rainbow'
Plug 'kien/rainbow_parentheses.vim'
"跳转与检索
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'
"添加/删除注释
Plug 'preservim/nerdcommenter'
"vim git-diff
Plug 'airblade/vim-gitgutter'
Plug 'godlygeek/tabular'
Plug 'plasticboy/vim-markdown'
Plug 'suan/vim-instant-markdown'
call plug#end()
" in your .vimrc (_vimrc for Windows)
autocmd! BufNewFile,BufRead *.vs,*.fs set ft=glslx
filetype plugin indent on
"==============================================================
"YCM
" 每次重新生成匹配项,禁止缓存匹配项
let g:ycm_cache_omnifunc=0
" 在注释中也不能补全
let g:ycm_complete_in_comments=0
"关闭额外预览窗口
let g:ycm_add_preview_to_completeopt = 0
"基于syntastic的代码诊断,觉得慢的话可以换成ale
let g:ycm_show_diagnostics_ui = 0
let g:ycm_server_log_level = 'info'
let g:ycm_min_num_identifier_candidate_chars = 2
let g:ycm_collect_identifiers_from_comments_and_strings = 1
let g:ycm_complete_in_strings=1
let g:ycm_key_invoke_completion = '<c-z>'
set completeopt=menu,menuone
let g:ycm_enable_diagnostic_signs = 0
let g:ycm_enable_diagnostic_highlighting = 0
let g:ycm_error_symbol = 'K'
let g:ycm_warning_symbol = 'O'
let g:ycm_global_ycm_extra_conf='~/.ycm_extra_conf.py'
let g:ycm_confirm_extra_conf = 0
noremap <c-z> <NOP>
" 选择语言
let g:ycm_semantic_triggers = {
\ 'c,cpp,python,java,go,erlang,perl': ['re!\w{2}'],
\ 'cs,lua,javascript': ['re!\w{2}'],
\ }
" ycm补全框颜色
highlight PMenu ctermfg=0 ctermbg=242 guifg=black guibg=darkgrey
highlight PMenuSel ctermfg=242 ctermbg=8 guifg=darkgrey guibg=black
" ycm获取类型信息
nnoremap ty :YcmCompleter GetType<CR>
"==============================================================
"nerdtree
"vim打开空文件时直接打开文件树
"autocmd StdinReadPre * let s:std_in=1
"autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif
"vim打开文件夹时打开文件树
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists("s:std_in") | exe 'NERDTree' argv()[0] | wincmd p | ene | exe 'cd '.argv()[0] | endif
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif
" NERDTree.vim
" let g:NERDTreeWinPos="left"
let g:NERDTreeWinSize=30
" let g:NERDTreeShowLineNumbers=1
" let g:neocomplcache_enable_at_startup = 1
" 将打开文件树的操作映射到F8键
nnoremap <F8> :NERDTreeToggle<cr>
" NERDTress File highlighting
function! NERDTreeHighlightFile(extension, fg, bg, guifg, guibg)
exec 'autocmd filetype nerdtree highlight ' . a:extension .' ctermbg='.a:bg .' ctermfg='. a:fg .' guibg='. a:guibg .' guifg='. a:guifg
exec 'autocmd filetype nerdtree syn match ' . a:extension .' #^\s\+.*'.a:extension .'$#'
endfunction
call NERDTreeHighlightFile('cpp', 'blue', 'none', 'blue', '#151515')
call NERDTreeHighlightFile('cc', 'blue', 'none', 'blue', '#151515')
call NERDTreeHighlightFile('c', 'blue', 'none', 'blue', '#151515')
call NERDTreeHighlightFile('h', 'yellow', 'none', 'yellow', '#151515')
call NERDTreeHighlightFile('hpp', 'yellow', 'none', 'yellow', '#151515')
call NERDTreeHighlightFile('md', 'blue', 'none', '#3366FF', '#151515')
call NERDTreeHighlightFile('json', 'yellow', 'none', 'yellow', '#151515')
call NERDTreeHighlightFile('html', 'yellow', 'none', 'yellow', '#151515')
call NERDTreeHighlightFile('css', 'cyan', 'none', 'cyan', '#151515')
call NERDTreeHighlightFile('js', 'Red', 'none', '#ffa500', '#151515')
"================================================================
"ale
"始终开启标志列
let g:ale_sign_column_always = 0
let g:ale_set_highlights = 0
"自定义error和warning图标
let g:ale_sign_error = '✗'
let g:ale_sign_warning = '⚡'
"在vim自带的状态栏中整合ale
let g:ale_statusline_format = ['✗ %d', '⚡ %d', '✔ OK']
"显示Linter名称,出错或警告等相关信息
let g:ale_echo_msg_error_str = 'E'
let g:ale_echo_msg_warning_str = 'W'
let g:ale_echo_msg_format = '[%linter%] %s [%severity%]'
"普通模式下,sp前往上一个错误或警告,sn前往下一个错误或警告
nmap sp <Plug>(ale_previous_wrap)
nmap sn <Plug>(ale_next_wrap)
"<Leader>s触发/关闭语法检查
"文件内容发生变化时不进行检查
let g:ale_lint_on_text_changed = 'never'
"打开文件时不进行检查
let g:ale_lint_on_enter = 0
" C 语言配置检查参数
let g:ale_c_gcc_options = '-Wall -Werror -O2 -std=c11'
let g:ale_c_clang_options = '-Wall -Werror -O2 -std=c11'
let g:ale_c_cppcheck_options = ''
" C++ 配置检查参数
let g:ale_cpp_gcc_options = '-Wall -Werror -O2 -std=c++17'
let g:ale_cpp_clang_options = '-Wall -Werror -O2 -std=c++17'
let g:ale_cpp_cppcheck_options = ''
let g:ale_cpp_cc_options = '-std=c++17 -Wall'
"
"使用clang对c和c++进行语法检查,对python使用pylint进行语法检查
let g:ale_linters = {
\ 'cpp': ['clang++'],
\ 'c': ['clang'],
\ 'python' : ['flake8']
\}
"===============================================================
"powerline
set laststatus=2
let g:Powerline_symbols='unicode'
"===============================================================
"airline
" tabline,也就是上方的tab列表
let g:airline#extensions#tabline#enabled = 1
" 显示tab的分割
let g:airline#extensions#tabline#show_splits = 0
" 不显示buffer
let g:airline#extensions#tabline#show_buffers = 0
" tab的显示风格
let g:airline#extensions#tabline#alt_sep = 1
let g:airline#extensions#tabline#left_sep = ' '
let g:airline#extensions#tabline#left_alt_sep = '◀'
let g:airline#extensions#tabline#tab_nr_type = 1 " tab number
let g:airline#extensions#tabline#show_tab_nr = 0
" let g:airline#extensions#tabline#formatter = 'default'
" 只显示文件名字
let g:airline#extensions#tabline#formatter = 'unique_tail'
" 文件名过长则显示...
let g:airline#extensions#tabline#overflow_marker = '…'
let g:airline_powerline_fonts = 1
" 关闭一堆不需要的
let g:airline#extensions#tabline#buffer_nr_show = 0
let g:airline#extensions#tabline#exclude_preview = 0
"if !exists('g:airline_symbols')
" let g:airline_symbols = {}
"endif
let g:airline_theme="onedark"
let g:airline_left_sep = '▶'
let g:airline_left_alt_sep = '❯'
let g:airline_right_sep = '◀'
let g:airline_right_alt_sep = '❮'
"================================================================
"rainbow
let g:rbpt_colorpairs = [
\ ['brown', 'RoyalBlue3'],
\ ['Darkblue', 'SeaGreen3'],
\ ['darkgray', 'DarkOrchid3'],
\ ['darkgreen', 'firebrick3'],
\ ['darkcyan', 'RoyalBlue3'],
\ ['darkred', 'SeaGreen3'],
\ ['darkmagenta', 'DarkOrchid3'],
\ ['brown', 'firebrick3'],
\ ['gray', 'RoyalBlue3'],
\ ['darkmagenta', 'DarkOrchid3'],
\ ['Darkblue', 'firebrick3'],
\ ['darkgreen', 'RoyalBlue3'],
\ ['darkcyan', 'SeaGreen3'],
\ ['darkred', 'DarkOrchid3'],
\ ['red', 'firebrick3'],
\ ]
let g:rbpt_max = 16
let g:rbpt_loadcmd_toggle = 0
au VimEnter * RainbowParenthesesToggle
au Syntax * RainbowParenthesesLoadRound
au Syntax * RainbowParenthesesLoadSquare
au Syntax * RainbowParenthesesLoadBraces
"================================================================
"tagbar
"设置tagbar使用的ctags的插件,必须要设置对
let g:tagbar_ctags_bin='/usr/bin/ctags'
""设置tagbar的窗口宽度
let g:tagbar_width=35
"设置tagbar的窗口显示的位置,为右边
let g:tagbar_left=0
"打开文件自动 打开tagbar
"autocmd BufReadPost *.cpp,*.c,*.h,*.hpp,*.cc,*.cxx call tagbar#autoopen()
"映射tagbar的快捷键
map <F9> :TagbarToggle<CR>
" 设置焦点在tagbar
let g:tagbar_autofocus=1
"=================================================================
" ctags
" 设置tag跳转快捷键
nnoremap <leader>] g<C-]>
" 添加已经存在的tags文件
if filereadable("tags")
set tags+=./tags
endif
" ctags -R --c++-kinds=+px --fields=+iaS --extra=+q
"=================================================================
"fzf
"
" FZF -e name:在当前文件夹下精确匹配搜索文件
" Files name : 在当前文件夹下模糊匹配搜索文件,相当于FZF name
" Tags name :根据ctags生成的tags搜索标签
" Ag name :全文本模糊匹配,需要安装额外工具,详见官方md
" This is the default extra key bindings
let g:fzf_action = {
\ 'ctrl-t': 'tab split',
\ 'ctrl-x': 'split',
\ 'ctrl-v': 'vsplit' }
" Default fzf layout
" - down / up / left / right
let g:fzf_layout = { 'down': '~40%' }
" In Neovim, you can set up fzf window using a Vim command
" let g:fzf_layout = { 'window': 'enew' }
" let g:fzf_layout = { 'window': '-tabnew' }
" let g:fzf_layout = { 'window': '10split enew' }
" Customize fzf colors to match your color scheme
let g:fzf_colors =
\ { 'fg': ['fg', 'Normal'],
\ 'bg': ['bg', 'Normal'],
\ 'hl': ['fg', 'Comment'],
\ 'fg+': ['fg', 'CursorLine', 'CursorColumn', 'Normal'],
\ 'bg+': ['bg', 'CursorLine', 'CursorColumn'],
\ 'hl+': ['fg', 'Statement'],
\ 'info': ['fg', 'PreProc'],
\ 'border': ['fg', 'Ignore'],
\ 'prompt': ['fg', 'Conditional'],
\ 'pointer': ['fg', 'Exception'],
\ 'marker': ['fg', 'Keyword'],
\ 'spinner': ['fg', 'Label'],
\ 'header': ['fg', 'Comment'] }
" Enable per-command history.
" CTRL-N and CTRL-P will be automatically bound to next-history and
" previous-history instead of down and up. If you don't like the change,
" explicitly bind the keys to down and up in your $FZF_DEFAULT_OPTS.
" fzf的缓存文件,加快查找
let g:fzf_history_dir = '~/.local/share/fzf-history'
let g:fzf_buffers_jump = 0
" [[B]Commits] 自定义被'git log'使用的选项
let g:fzf_commits_log_options = '--graph --color=always --format="%C(auto)%h%d %s %C(black)%C(bold)%cr"'
" [Tags] 定义用来产生tag的命令,好像就ctags可以,gtags不兼容。LeaderF可以使用gtags
let g:fzf_tags_command = 'ctags -R'
" [Commands] --expect expression for directly executing the command
let g:fzf_commands_expect = 'alt-enter,ctrl-x'
" 历史缓存文件,加快查找速度
let g:fzf_history_dir = '~/.local/share/fzf-history'
"=================================================================
"=================================================================
" Mark
" 打开vim时重置mark
set viminfo='64,<8192,s1024,!,h
"=================================================================
" cscope
" cscope -Rbq,生成cscope数据库,使用方式类似ctags
" cscope find c name,查找调用该函数的函数
" set quickfix,把信息打到quickfix里面,不过还是全屏好用
" set cscopequickfix=s-,c-,d-,i-,t-,e-
" use both cscope and ctag for 'ctrl-]', ':ta', and 'vim -t'
" set cscopetag
" check cscope for definition of a symbol before checking ctags: set to 1
" if you want the reverse search order.
set csto=0
" add any cscope database in current directory
if filereadable("cscope.out")
cs add cscope.out
" else add the database pointed to by environment variable
elseif $CSCOPE_DB != ""
cs add $CSCOPE_DB
endif
" show msg when any other cscope db added
set cscopeverbose
" 设置输出文件信息长度,文件路径深度最高为五
:set cspc=5
" 设置输出信息的颜色
" 通过:highlight查看所有高亮属性
:hi ModeMsg ctermfg=Blue
:hi MoreMsg ctermfg=Red
:hi Directory term=bold ctermfg=114 guifg=#98c379
" 快捷键
nmap <leader>c :cs find c <C-R>=expand("<cword>")<CR><CR>
nnoremap <leader>s :Tags <C-R>=expand("<cword>")<CR><CR>
" 同时查找ctags和cscope的数据库
set cst
"=================================================================
" gtags
set cscopetag " 使用 cscope 作为 tags 命令
set cscopeprg='gtags-cscope' " 使用 gtags-cscope 代替 cscope
"gtags.vim 设置项
let GtagsCscope_Auto_Load = 1
let CtagsCscope_Auto_Map = 1
let GtagsCscope_Quiet = 1
" 并不是禁止了cscope与ctags,gtags是在C++与java方面的补充
" Add spaces after comment delimiters by default
let g:NERDSpaceDelims = 1
" Use compact syntax for prettified multi-line comments
let g:NERDCompactSexyComs = 1
" Align line-wise comment delimiters flush left instead of following code indentation
let g:NERDDefaultAlign = 'left'
" Set a language to use its alternate delimiters by default
let g:NERDAltDelims_java = 1
" Add your own custom formats or override the defaults
let g:NERDCustomDelimiters = { 'c': { 'left': '/**','right': '*/' } }
" Allow commenting and inverting empty lines (useful when commenting a region)
let g:NERDCommentEmptyLines = 1
" Enable trimming of trailing whitespace when uncommenting
let g:NERDTrimTrailingWhitespace = 1
" Enable NERDCommenterToggle to check all selected lines is commented or not
let g:NERDToggleCheckAllLines = 1
"=================================================================
map <F2> :call SetTitle()<CR>
func SetComment()
call setline(1,"/************************************************************************")
call append(line("."), "* Copyright (C), xxxxxxxxxxxxxxxx.")
call append(line(".")+1, "* ")
call append(line(".")+2, "* File Name :".expand("%:t"))
call append(line(".")+3, "* Author :yesky")
call append(line(".")+4, "* Version :")
call append(line(".")+5, "* Date :".strftime("%Y-%m-%d"))
call append(line(".")+6, "* Description:")
call append(line(".")+7, "*")
call append(line(".")+8,"************************************************************************/")
call append(line(".")+9, "")
call append(line(".")+10, "")
endfunc
" 加入shell,Makefile注释
func SetComment_sh()
call setline(3, "#================================================================")
call setline(4, "# Copyright (C),xxxxxxxxxxxxxxxxx.")
call setline(5, "# ")
call setline(6, "# File Name :".expand("%:t"))
call setline(7, "# Author :yesky")
call setline(8, "# Version :")
call setline(9, "# Date :".strftime("%Y-%m-%d"))
call setline(10, "# Description:")
call setline(11, "#")
call setline(12, "#================================================================")
call setline(13, "")
call setline(14, "")
endfunc
" 定义函数SetTitle,自动插入文件头
func SetTitle()
if &filetype == 'make'
call setline(1,"")
call setline(2,"")
call SetComment_sh()
elseif &filetype == 'sh'
call setline(1,"#!/system/bin/sh")
call setline(2,"")
call SetComment_sh()
else
call SetComment()
if expand("%:e") == 'hpp'
call append(line(".")+10, "#ifndef _".toupper(expand("%:t:r"))."_H")
call append(line(".")+11, "#define _".toupper(expand("%:t:r"))."_H")
call append(line(".")+12, "#ifdef __cplusplus")
call append(line(".")+13, "extern \"C\"")
call append(line(".")+14, "{")
call append(line(".")+15, "#endif")
call append(line(".")+16, "")
call append(line(".")+17, "#ifdef __cplusplus")
call append(line(".")+18, "}")
call append(line(".")+19, "#endif")
call append(line(".")+20, "#endif //".toupper(expand("%:t:r"))."_H")
elseif expand("%:e") == 'h'
call append(line(".")+10, "#pragma once")
elseif &filetype == 'c'
call append(line(".")+10,"#include \"".expand("%:t:r").".h\"")
elseif &filetype == 'cpp'
call append(line(".")+10, "#include \"".expand("%:t:r").".h\"")
endif
endif
endfunc
map <F3> :call QuickComment()<CR>
func QuickComment()
if &filetype == 'make'
call append(line("."), "# start modified by yesky in ".strftime("%Y-%m-%d")." ")
call append(line(".")+1, "# end modified by yesky in ".strftime("%Y-%m-%d")." ")
elseif &filetype == 'c'
call append(line("."), "// start modified by yesky in ".strftime("%Y-%m-%d")." ")
call append(line(".")+1, "// end modified by yesky in ".strftime("%Y-%m-%d")." ")
elseif &filetype == 'sh'
call append(line("."), "# start modified by yesky in ".strftime("%Y-%m-%d")." ")
call append(line(".")+1, "# end modified by yesky in ".strftime("%Y-%m-%d")." ")
elseif &filetype == 'cpp'
call append(line("."), "// start modified by yesky in ".strftime("%Y-%m-%d")." ")
call append(line(".")+1, "// end modified by yesky in ".strftime("%Y-%m-%d")." ")
elseif &filetype == 'hpp'
call append(line("."), "// start modified by yesky in ".strftime("%Y-%m-%d")." ")
call append(line(".")+1, "// end modified by yesky in ".strftime("%Y-%m-%d")." ")
endif
endfunc
"=================================================================
"Quickly Run
""""""""""""""""""""""
map <F5> :call CompileRunGcc()<CR>
func! CompileRunGcc()
exec "w"
if &filetype == 'c'
exec "!g++ % -o %<"
exec "!time ./%<"
elseif &filetype == 'cpp'
exec "!g++ % -o %<"
exec "!time ./%<"
elseif &filetype == 'java'
exec "!javac %"
exec "!time java %<"
elseif &filetype == 'sh'
:!time bash %
elseif &filetype == 'python'
exec "!time python3 %"
endif
endfunc