先安装插件管理工具 pathogen
创建目录 ~/.vim/bundle/pathogen/autoload/
下载 pathogen.vim(https://github.com/tpope/vim-pathogen )至 ~/.vim/bundle/pathogen/autoload/
在 .vimrc 中加入下面两行
runtime bundle/pathogen/autoload/pathogen.vim
execute pathogen#infect()
其他插件下载解压后, 都拷贝到 ~/.vim/bundle/ 目录下即可
书签插件
https://github.com/huxiao/vim-bookmark
https://github.com/MattesGroeger/vim-bookmarks ( 这个插件要配合 ctrlp 才好用 )
nmap <F2> mn
imap <F2> <ESC>mn
let g:bookmark_sign = '●'
let g:bookmark_disable_ctrlp = 1
mm 用于设定或者删除一个书签,或者使用命令 VbookmarkToggle
mn 用于跳转到下一个书签,或者使用命令 VbookmarkNext
mp 用于跳转到前一个书签,或者使用命令 VbookmarkPrevious
ma 用于显示所有书签
mc 删除一个书签
mx 删除所有书签
let g:vbookmark_bookmarkSaveFile = $HOME . '/.vimbookmark'
" 设置跳转书签的快捷键
nmap <F2> mn
imap <F2> <ESC>:w<CR>mn
C++ STL 语法高亮插件
https://github.com/octol/vim-cpp-enhanced-highlight
C++源文件和头文件之间切换
https://github.com/derekwyatt/vim-fswitch
nmap <silent> <Leader>sw :FSHere<cr>
这样,键入 ;sw 就能在实现 cpp 文件和 h文件间切换
另外一个是
https://github.com/vim-scripts/a.vim
:A switches to the header file corresponding to the current file being edited (or vise versa) :AS splits and switches :AV vertical splits and switches :AT new tab and switches :AN cycles through matches :IH switches to file under cursor :IHS splits and switches :IHV vertical splits and switches :IHT new tab and switches :IHN cycles through matches <Leader>ih switches to file under cursor <Leader>is switches to the alternate file of file under cursor (e.g. on <foo.h> switches to foo.cpp) <Leader>ihn cycles through matches
nnoremap <leader>av :AV<CR>
nnoremap <leader>as :AS<CR>
快速开关注释
https://github.com/scrooloose/nerdcommenter
常用操作:
<leader>cc,注释当前选中文本,如果选中的是整行则在每行首添加 //,如果选中一行的部分内容则在选中部分前后添加分别 /、/;
<leader>cu,取消选中文本块的注释。
也可以都调用 <leader>c<
SPACE>
,它会根据是否有注释而选择来注释还是取消注释。
括号引号自动补全
https://github.com/Raimondi/delimitMate
or
https://github.com/jiangmiao/auto-pairs
https://github.com/scrooloose/nerdtree
将如下信息加入.vimrc中:
" 使用 NERDTree 插件查看工程文件。设置快捷键
nmap <F8> :NERDTreeToggle<CR>
" 设置NERDTree子窗口宽度
let NERDTreeWinSize=32
" 设置NERDTree子窗口位置
let NERDTreeWinPos="right"
" 显示隐藏文件
let NERDTreeShowHidden=1
" NERDTree 子窗口中不显示冗余帮助信息
let NERDTreeMinimalUI=1
" 删除文件时自动删除文件对应 buffer
let NERDTreeAutoDeleteBuffer=1
常用操作:回车,打开选中文件;r,刷新工程目录文件列表;I(大写),显示/隐藏隐藏文件;m,出现创建/删除/剪切/拷贝操作列表。键入 <leader>fl 后,右边子窗口为工程项目文件列表
在 plugin/NERD_tree.vim 中, 修改
call s:initVariable("g:NERDTreeMapOpenVSplit", "s") 为
call s:initVariable("g:NERDTreeMapOpenVSplit", "v")
以符合个人操作习惯, 作用是按 v 时打开一个竖屏
ctags
从 http://ctags.sourceforge.net/ 下载源代码包后,解压缩生成源代码目录,然后进入源代码根目录执行./configure,然后执行make,编译成功后执行make install
在 .vimrc 中加入以下设置
nmap<leader>R :!ctags -R<CR>
这样, 在 VIM 中按 <leader> + r 就可以生成当前目录的 tags 文件了
根据头文件中的函数声明,自动生成 CPP 文件中的空白函数体
ProtoDef (http://www.vim.org/scripts/script.php?script_id=2624 )
ProtoDef 需要依赖 perl , ctags 和 FSwitch(http://www.vim.org/scripts/script.php?script_id=2590 )
安装好 ProtoDef 后, 在 .vimrc 中加入以下配置
" 设置 pullproto.pl 脚本路径
let g:protodefprotogetter='~/.vim/bundle/protodef/pullproto.pl'
" 成员函数的实现顺序与声明顺序一致
let g:disable_protodef_sorting=1
使用的时候, 先在源码目录使用 ctags -R 命令生成 tags 文件; 然后在 .h 文件中声明类函数, 切换到同名 .cpp 文件中后, 键入 <leader>PP 即可补全函数空白体
内容查找
https://github.com/dyng/ctrlsf.vim
需要事先安装 ack
sudo apt-get install ack-grep
安装 ag
sudo apt-get install silversearcher-ag
https://github.com/rking/ag.vim
在 .vimrc 中加入以下配置
" 使用 ctrlsf.vim 插件在工程内全局查找光标所在关键字,设置快捷键。快捷键速记法:search in project
nnoremap <leader>sp :CtrlSF<CR>
noremap <leader>? :CtrlSF -R
nmap <F4> :CtrlSFToggle<CR>
noremap <leader>/ :silent execute("CtrlSF -R '\\b" . expand("<cword>") . "\\b'")<CR>
let g:ctrlsf_ackprg = 'ag' "设置 ctrlsf 使用 ag
" ag 快捷键
noremap <leader>f :silent execute("Ag " . expand("<cword>"))<CR>
修改 ctrl +o 为竖屏打开
在 autoload/ctrlsf.vim 中 func! s:OpenFileInWindow 函数中, 把
exec 'silent split ' . fnameescape(a:file)
修改为
exec 'silent vsplit ' . fnameescape(a:file)
内容查找 - ACK2
https://beyondgrep.com/
git clone https://github.com/mileszs/ack.vim
此时已可以使用ack命令;
:Ack xxx *
,在项目里搜索xxx单词.
每次手动输入:Ack xxx还是很不方便的,可以在.vimrc文件里设置快捷键::map <F4> :Ack -i
, -i参数表示忽略大小写. 以后在项目里,只需要按F4,即可全局搜索单词了.
语法检测
https://github.com/scrooloose/syntastic
在 .vimrc 中加入以下配置
let g:syntastic_error_symbol = '✗'
let g:syntastic_warning_symbol = '⚠'
" 是否在打开文件时检查
let g:syntastic_check_on_open=0
" 是否在保存文件后检查
let g:syntastic_check_on_wq=1
内容替换
将完整配置信息添加进 .vimrc 中:
" 替换函数。参数说明:
" confirm:是否替换前逐一确认
" wholeword:是否整词匹配
" replace:被替换字符串
function! Replace(confirm, wholeword, replace)
wa
let flag = ''
if a:confirm
let flag .= 'gec'
else
let flag .= 'ge'
endif
let search = ''
if a:wholeword
let search .= '\<' . escape(expand('<cword>'), '/\.*$^~[') . '\>'
else
let search .= expand('<cword>')
endif
let replace = escape(a:replace, '/\&~')
execute 'argdo %s/' . search . '/' . replace . '/' . flag . '| update'
endfunction
" 不确认、非整词
"nnoremap <Leader>R :call Replace(0, 0, input('Replace '.expand('<cword>').' with: '))<CR>
" 不确认、整词
nnoremap <Leader>rw :call Replace(0, 1, input('Replace '.expand('<cword>').' with: '))<CR>
" 确认、非整词
"nnoremap <Leader>rc :call Replace(1, 0, input('Replace '.expand('<cword>').' with: '))<CR>
" 确认、整词
"nnoremap <Leader>rcw :call Replace(1, 1, input('Replace '.expand('<cword>').' with: '))<CR>
"nnoremap <Leader>rwc :call Replace(1, 1, input('Replace '.expand('<cword>').' with: '))<CR>
文件查找
https://github.com/Yggdroot/LeaderF
修改插件源码,更改快捷键为符合个人操作修改
leaderf/python/leaderf/cli.py 中
注释下面4行代码
elif equal(cmd, '<C-V>') or equal(cmd, '<S-Insert>'):
self._paste()
self._buildPattern()
yield '<Update>'
在下面这行代码
elif equal(cmd, '<C-C>'):
yield '<Quit>'
后面加入下面两行代码
elif equal(cmd, '<C-P>'):
yield '<Quit>'
leaderf/python/leaderf/manager.py 中
修改 elif equal(cmd, '<C-]>'): 为 elif equal(cmd, '<C-V>'):
在 .vimrc 中加入下面配置
let g:Lf_ShortcutF = '<C-P>'
let g:Lf_CommandMap = {'<C-C>': ['<Esc>', '<C-C>']}
nmap <leader>m :LeaderfMru<CR>
imap <c-p> <ESC>:LeaderfFile<CR>
查看函数,结构体,变量列表
https://github.com/majutsushi/tagbar
" 设置标签子窗口的宽度
let tagbar_width=32
" tagbar 子窗口中不显示冗余帮助信息
let g:tagbar_compact=1
// GO 语言配置
let g:tagbar_type_go = {
\ 'ctagstype' : 'go',
\ 'kinds' : [
\ 'p:package',
\ 'i:imports:1',
\ 'c:constants',
\ 'v:variables',
\ 't:types',
\ 'n:interfaces',
\ 'w:fields',
\ 'e:embedded',
\ 'm:methods',
\ 'r:constructor',
\ 'f:functions'
\ ],
\ 'sro' : '.',
\ 'kind2scope' : {
\ 't' : 'ctype',
\ 'n' : 'ntype'
\ },
\ 'scope2kind' : {
\ 'ctype' : 't',
\ 'ntype' : 'n'
\ },
\ 'ctagsbin' : 'gotags',
\ 'ctagsargs' : '-sort -silent'
\ }
" 设置 ctags 对哪些代码元素生成标签
let g:tagbar_type_cpp = {
\ 'd:macros:1',
\ 'g:enums',
\ 't:typedefs:0:0',
\ 'e:enumerators:0:0',
\ 'n:namespaces',
\ 'c:classes',
\ 's:structs',
\ 'u:unions',
\ 'f:functions',
\ 'm:members:0:0',
\ 'v:global:0:0',
\ 'x:external:0:0',
\ 'l:local:0:0'
\ ],
\ 'sro' : '::',
\ 'kind2scope' : {
\ 'g' : 'enum',
\ 'n' : 'namespace',
\ 'c' : 'class',
\ 's' : 'struct',
\ 'u' : 'union'
\ },
\ 'scope2kind' : {
\ 'enum' : 'g',
\ 'namespace' : 'n',
\ 'class' : 'c',
\ 'struct' : 's',
\ 'union' : 'u'
\ }
\ }
nmap <F3> :TagbarToggle<CR>
任务列表
https://github.com/vim-scripts/TaskList.vim
这是一个非常有用的插件,它能够标记文件中的 FIXME
、 TODO
等信息,并将它们存放到一个任务列表当中,后面随时可以通过Tasklist跳转到这些标记的地方再来修改这些代码,是一个十分方便实用的Todo list工具。
--help:
通常只需添加一个映射: map <leader>td <Plug>TaskList
在普通模式下,按下 Ctrl - n
开始进入可视模式并选中光标下的单词,继续按 Ctrl - n
选择下一个相同的单词,按下 Ctrl - p
往回选一个, Ctrl - x
则跳过下一个相同单词. 按下 c 进行修改, 按下 <Esc>
退出
状态栏美化
https://github.com/itchyny/lightline.vim
或者 vim-airline
参见
http://blog.csdn.net/the_victory/article/details/50638810
"--------------------------------------------------------------------------
"vim-airline
"--------------------------------------------------------------------------
Plugin 'vim-airline'
let g:airline_theme="molokai"
"这个是安装字体后 必须设置此项"
let g:airline_powerline_fonts = 1
" 关闭状态显示空白符号计数
let g:airline#extensions#whitespace#enabled = 0
let g:airline#extensions#whitespace#symbol = '!'
if !exists('g:airline_symbols')
let g:airline_symbols = {}
endif
" 在 airline 的状态栏上显示文件的绝对路径
let g:airline_section_c = "%{expand('%:p')}"
vim中集成shell
conque " 对中文的支持有问题
http://www.vim.org/scripts/script.php?script_id=2771
用法说明 https://code.google.com/archive/p/conque/wikis/Usage.wiki#3.1.8_Hide_start_messages
nmap <leader>sh :ConqueTermVSplit bash<CR>
let g:ConqueTerm_PyVersion = 2 " 本机的 python 是 2.7,所以这里设置成 2
let g:ConqueTerm_StartMessages = 0 "去掉烦人的警告
代码自动格式化
https://github.com/sbdchd/neoformat
需要安装 astyle, http://astyle.sourceforge.net/
astyle 的参数配置参见
http://blog.csdn.net/janepen/article/details/7022180
在 neoformat/auto/load/neoformat/formatters 中, 分别编辑 cpp.vim 和 c.vim 如下
cpp.vim
function! neoformat#formatters#cpp#enabled() abort
return ['astyle']
endfunction
function! neoformat#formatters#cpp#astyle() abort
return {
\ 'exe': 'astyle',
\ 'args': ['--style=allman', '-p', '-D', '--pad-header'],
\ 'stdin': 1,
\ }
endfunction
c.vim
function! neoformat#formatters#c#enabled() abort
return ['astyle']
endfunction
function! neoformat#formatters#c#astyle() abort
return {
\ 'exe': 'astyle',
\ 'args': ['--mode=c','--style=allman', '-p', '-D', '--pad-header'],
\ 'stdin': 1,
\ }
endfunction
.vimrc 中写入如下配置
augroup fmt autocmd! autocmd BufWritePre * undojoin | Neoformat augroup END
自动保存
https://github.com/vim-scripts/vim-auto-save
" ====================================================== vim-auto-save平滑滚动
https://github.com/yuttie/comfortable-motion.vim
let g:ale_open_list = 1
let g:ale_keep_list_window_open = 1
"自定义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>d查看错误或警告的详细信息
nmap <Leader>d :ALEDetail<CR>
"设置状态栏显示的内容
"set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}\ %{ALEGetStatusLine()}
"文件内容发生变化时不进行检查
"let g:ale_lint_on_text_changed = 'never'
"打开文件时不进行检查
"let g:ale_lint_on_enter = 0
"对C/C++使用Clang进行语法检查
"let g:ale_linters = {'c': 'clang'}
"let g:ale_c_clang_options = '-std=c11 -Wall'
"let g:ale_linters = {'c++': 'clang++'}
let g:ale_cpp_clangcheck_options = '-std=c++11 -Wall'
let g:ale_cpp_gcc_options = '-std=c++11 -Wall'
"关闭 golang 的语法检测
"let g:ale_linters = {'go': ['gofmt']}
let g:ale_linters = {
\ 'c': ['clang'],
\ 'c++': ['clang++'],
\ 'go': ['go build', 'gofmt', 'go vet']
\}
" 打开 golang 语法检测
"let g:ale_linters = {'go': ['gometalinter', 'gofmt']}
let g:go_disable_autoinstall = 0 "禁止自动下载
let g:go_highlight_functions = 1
let g:go_highlight_methods = 1
let g:go_highlight_fields = 1
let g:go_highlight_types = 1
let g:go_highlight_operators = 1
let g:go_highlight_build_constraints = 1
let g:go_auto_type_info = 1
let g:go_fmt_command = "goimports"
let g:go_metalinter_autosave = 0
au FileType go nmap <F12> <Plug>(go-def)
au FileType go nmap <F5> <Plug>(go-run)
au FileType go nmap <leader>b <Plug>(go-build)
au FileType go nmap <leader>e <Plug>(go-rename)
au FileType go nmap <Leader>gd <Plug>(go-doc)
au FileType go nmap <Leader>s <Plug>(go-implements)
au FileType go nmap <Leader>r <Plug>(go-referrers)
"au FileType go nmap <Leader>t <Plug>(go-vet)