用户的vim配置文件是~/.vimrc
,想要使当前正在编辑的配置文件生效,使用:so %
由于使用vim时,敲击esc的频率很高,我们可以考虑将caps映射成esc,在/etc/profile
中增加xmodmap -e 'clear Lock' -e 'keycode 0x42 = Escape'
即可
vim基本设置
" 保存光标位置
au BufReadPost * exe "normal! g`\""
" 开启文件类型的支持,并按文件类型打开对应的插件/进行对应的缩进方式
filetype plugin indent on
" 在输入括号时光标会短暂地跳到与之相匹配的括号处,不影响输入
set sm
" 折叠方式(不设定的话依靠语法折叠,要求对应语法文件里有设定)
"set foldmethod=indent
" 用空格打开折叠
nnoremap <space> @=((foldclosed(line('.'))<0)?'zc':'zo')<CR>
" 启动时自动折叠代码(超过三层的会被折叠)
set foldlevel=3
" 左栏宽度
set foldcolumn=0
" 保存折叠
au BufWinLeave * silent mkview
au BufWinEnter * silent loadview
" 光标遇到折叠,折叠就打开
"set foldopen=all
" 移开折叠时自动关闭折叠
"set foldclose=all
" 生成swap文件(用于vim崩溃后的回复等)
set swapfile
" 生成undo文件(用于撤销操作)
set undofile
set undodir=~/code/.undo
" 生成备份文件(记录上一个副本)
set backup
set backupext=.bak
set backupdir=~/code/.bak
vim外观
" 语法高亮,要放到前面,否则影响其他的显示配置
syntax enable
" 配色方案
colorscheme torte
" 行高亮
set cursorline
highlight CursorLine cterm=NONE ctermbg=darkgrey ctermfg=NONE
" 显示行号
set nu
" 改变行号文字/背景色
highlight LineNr ctermfg=white ctermbg=gray
" 背景
hi Normal ctermbg=NONE ctermfg=NONE
" 高亮搜索的关键字
set hls
" 折行
set display=lastline
vim脚本
使用let声明变量,除数值和字符串外,还支持list(使用[]声明)和dict(使用{}声明),在命令模式调用函数使用call指令
func! Compile()
if &filetype == 'c'
exec '!gcc % -o %:r -O2 -Wall -Dbhiaibogf -g'
elseif &filetype == 'cpp'
exec '!g++ % -o %:r -O2 -Wall -Dbhiaibogf -g -std=c++1z'
elseif &filetype == 'python'
exec '!python %'
elseif &filetype == 'tex'
exec '!xelatex %'
elseif &filetype == 'markdown'
exec 'MarkdownPreview'
elseif &filetype == 'php' || &filetype == 'html'
exec '!google-chrome-stable localhost/% &'
endif
endfunc
func! Run()
if &filetype == 'python'
exec '!python %'
elseif &filetype == 'tex'
exec '!evince %<.pdf'
else
exec '!./%<'
endif
endfun
快捷键
vim快捷键可用于多种模式:
- nmap 普通模式
- imap 插入模式
- vmap 可视模式
- cmap 命令行模式
- omap 操作符等待模式(如dw输入d之后的情况)
- map 普通,可视模式及操作符等待模式
- map! 插入和命令行模式
- []noremap 不会递归的进行映射
一些按键的表示方式:
- 空格
<space>
- 回车
<CR>
- ctrl+K
<C-K>
" 定义快捷键的前缀,即<Leader>
let mapleader=";"
" 写入只读文件(使用tee命令将缓存区的内容写入文件)
cmap ww w !sudo tee %
" 在缓冲区之间跳转
nmap <C-N> :bn<CR>
imap <C-N> :bn<CR>
nmap <C-P> :bp<CR>
imap <C-P> :bp<CR>
" 编译和运行
nmap <F9> :w<CR>:call Compile()<CR>
imap <F9> <ESC>:w<CR>:call Compile()<CR>
nmap <F10> :call Run()<CR>
imap <F10> <ESC>:call Run()<CR>
插件
Vundle
Vundle是一个插件管理软件,可以方便的安装/删除/更新插件
手动下载Vundlegit clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
然后进行配置
" 关闭对vi的兼容
set nocompatible
" 关闭vim对文件类型的支持
filetype off
" Vundle所在的目录
set rtp+=~/.vim/bundle/Vundle.vim
" 插件要安装的位置(在begin与end直接是需要用Vundle进行维护的插件)
call vundle#begin('~/.vim/bundle/')
" let Vundle manage Vundle
Plugin 'VundleVim/Vundle.vim'
call vundle#end()
" 开启文件类型的支持,并按文件类型打开对应的插件/进行对应的缩进方式
filetype plugin indent on
如果想要添加新的插件,只需在.vimrc中写入Plugin 'pluginaddr/pluginname'
,并执行:PluginInstall
即可,使用PluginClear
会清除不在.vimrc文件中的插件,使用PluginUpdate
会更新所有位于列表中的插件
缩进线
Plugin 'Yggdroot/indentLine'
状态栏
Plugin 'vim-airline/vim-airline'
" 打开tabline功能,方便查看和切换Buffer
let g:airline#extensions#tabline#enabled = 1
" 使用powerline字体来设置airline的符号
let g:airline_powerline_fonts = 1
airline使用powerline的字体,这个可以在github下到或用pacman安装,推荐DejaVu Sans Mono for Powerline Book
批量注释
Plugin 'scrooloose/nerdcommenter'
使用<leader>cc
来注释,<leader>cu
来取消注释
目录显示与符号显示
" 文件管理
Plugin 'scrooloose/nerdtree'
" 符号管理(tagbar依赖于ctag)
Plugin 'majutsushi/tagbar'
" 窗口管理(很老的插件了,谁有替代品请留言告诉我)
Plugin 'Winmanager'
let g:NERDTree_title='NERDTree'
let g:Tagbar_title='Tagbar'
let g:winManagerWindowLayout='NERDTree|Tagbar'
function! NERDTree_Start()
exec 'q'
exec 'NERDTree'
endfunction
function! NERDTree_IsValid()
return 1
endfunction
function! Tagbar_Start()
exec 'q'
exec 'TagbarOpen'
endfunction
function! Tagbar_IsValid()
return 1
endfunction
" 窗口宽度
let winManagerWidth = 10
" 自动打开
let g:AutoOpenWinManager = 1
" 需要在winmanager.vim添加
"if g:AutoOpenWinManager
"autocmd VimEnter * nested call s:ToggleWindowsManager()
"endif
" tagbar的高度
let g:tagbar_vertical = 12
markdown
安装以下插件,支持实时预览并且生成目录等
" 用于符号对齐
Plugin 'godlygeek/tabular'
" 更好的显示效果
Plugin 'plasticboy/vim-markdown'
" 实时预览并添加对数学公式的支持
Plugin 'iamcco/markdown-preview.vim'
Plugin 'iamcco/mathjax-support-for-mkdp'
" 用于生成被tagbar使用的tags
Plugin 'jszakmeister/markdown2ctags'
let g:tagbar_type_markdown = {
\ 'ctagstype': 'markdown',
\ 'ctagsbin' : '~/.vim/bundle/markdown2ctags/markdown2ctags.py',
\ 'ctagsargs' : '-f - --sort=yes --sro=»',
\ 'kinds' : [
\ 's:sections',
\ 'i:images'
\ ],
\ 'sro' : '»',
\ 'kind2scope' : {
\ 's' : 'section',
\ },
\ 'sort': 0,
\ }
" 生成目录
Plugin 'mzlogin/vim-markdown-toc'
c/c++语义补全
Plugin 'Valloric/YouCompleteMe'
" C++语义补全需要这个python脚本,你要做的是把编译时使用的编译选项加入这个文件
let g:ycm_global_ycm_extra_conf='~/.vim/.ycm_extra_conf.py'
" 跳转到定义处
nmap <c-j> :YcmCompleter GoTo<CR>|
" 显示当前变量的类型
nmap <c-k> :YcmCompleter GetType<CR>|
" 修改错误
nmap <c-h> :YcmCompleter FixIt<CR>|
" 停止提示是否载入本地ycm_extra_conf文件
let g:ycm_confirm_extra_conf = 0
" 语法关键字补全
let g:ycm_seed_identifiers_with_syntax = 1
" 在接受补全后不分裂出一个窗口显示接受的项
set completeopt-=preview
" 每次重新生成匹配项,禁止缓存匹配项
let g:ycm_cache_omnifunc=0
" 开启 YCM 基于标签引擎
let g:ycm_collect_identifiers_from_tags_files = 1
" 从第2个键入字符就开始罗列匹配项
let g:ycm_min_num_of_chars_for_completion=2
" 在注释输入中也能补全
let g:ycm_complete_in_comments = 1
" 在字符串输入中也能补全
let g:ycm_complete_in_strings = 1
" 注释和字符串中的文字也会被收入补全
let g:ycm_collect_identifiers_from_comments_and_strings = 1
比较特殊的是,这个插件需要编译后才能使用,一般情况下输入以下命令即可
cd ~/.vim/bundle/YouCompleteMe
python3 install.py --clang-completer
如果出现问题,请到github上查看手动安装的说明
reference
[vim的在线中文文档](http://vimcdoc.sourceforge.net/doc/help.html)