Overview
配置自己的 .vimrc 文件
vim 的配置文件在用户家目录的 .vimrc 文件中,如果没有,自己创建一个。
打开 .vimrc 文件,输入配置,我的配置如下:
"显示行号 set nu "启动时隐去援助提示 set shortmess=atI "语法高亮 syntax on "使用vim的键盘模式 set nocompatible "不需要备份 set nobackup "没有保存或文件只读时弹出确认 set confirm "鼠标可用 set mouse-=a "tab缩进 set tabstop=4 set shiftwidth=4 set expandtab set smarttab "文件自动检测外部更改 set autoread "c文件自动缩进 set cindent "自动对齐 set autoindent "智能缩进 set smartindent "高亮查找匹配 set hlsearch "显示匹配 set showmatch "显示标尺,就是在右下角显示光标位置 set ruler "去除vi的一致性 set nocompatible "设置键盘映射,通过空格设置折叠 nnoremap <space> @=((foldclosed(line('.')<0)?'zc':'zo'))<CR> """""""""""""""""""""""""""""""""""""""""""""" "不要闪烁 set novisualbell "启动显示状态行 set laststatus=2 "浅色显示当前行 autocmd InsertLeave * se nocul "用浅色高亮当前行 autocmd InsertEnter * se cul "显示输入的命令 set showcmd "被分割窗口之间显示空白 set fillchars=vert:/ set fillchars=stl:/ set fillchars=stlnc:/ " vundle 环境设置 filetype off set rtp+=~/.vim/bundle/Vundle.vim " vundle 管理的插件列表必须位于 vundle#begin() 和 vundle#end() 之间 call vundle#begin() Plugin 'VundleVim/Vundle.vim' Plugin 'altercation/vim-colors-solarized' Plugin 'tomasr/molokai' Plugin 'vim-scripts/phd' Plugin 'Lokaltog/vim-powerline' Plugin 'octol/vim-cpp-enhanced-highlight' Plugin 'Raimondi/delimitMate' " 插件列表结束 call vundle#end() filetype plugin indent on " 配色方案 "set background=dark "colorscheme solarized "colorscheme molokai "colorscheme phd " 禁止显示菜单和工具条 set guioptions-=m set guioptions-=T " 总是显示状态栏 set laststatus=2 " 禁止折行 set nowrap " 设置状态栏主题风格 let g:Powerline_colorscheme='solarized256' syntax keyword cppSTLtype initializer_list " 基于缩进或语法进行代码折叠 "set foldmethod=indent set foldmethod=syntax " 启动 vim 时关闭折叠代码 set nofoldenable "允许用退格键删除字符 set backspace=indent,eol,start "编码设置 set encoding=utf-8 "共享剪切板 set clipboard=unnamed
vim 的插件使用 vundle 管理
安装 vundle:
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
如我的配置文件所示,Plugin '插件地址' 即为添加插件,如:
Plugin 'dyng/ctrlsf.vim'
安装插件,先找到其在 github.com 的地址,再将配置信息其加入 .vimrc 中的call vundle#begin() 和 call vundle#end() 之间,最后进入 vim 执行:
:PluginInstall
便安装完成插件。
如需删除插件,只需将 Plugin '插件地址' 删除或者注释掉,再进入 vim 执行:
:PluginClean
便将插件删除。
如需升级插件,进入 vim 执行:
:PluginUpdate
便完成升级。
主题安装
默认的 vim 主题对于编程人员来说,伤眼又难看。作为一名码代码的,个人比较偏爱暗黑色的背景,所以选在隆重给大家推荐一款主题——vim主题Tomorrow。
该主题的安装也非常简单。从 github 上下载 tomorrow 主题的源文件,导入主题就能用了。
/* 从github上下载tomorrow主题 */
git clone https://github.com/chriskempson/tomorrow-theme.git
终端切换 tomorrow 主题
- 进入 tomorrow/OS X Terminal 双击 Tomorrow Night.terminal 即可导入暗黑色的 tomorrow 主题。
- 然后,打开终端,依次进入 Terminal->preferences,按下图的操作进行。
vim 切换 Tomorrow 主题
vim 切换 tomorrow 主题就没那么简单直接了,需要设置 .vimrc 配置文件和加入 colors 文件夹。
/* 在.vim/bundle下新建文件夹 */
~ cd ~/.vim/bundle
~ mkdir ./vim/colors
/* 进入tomorrow文件夹中的vim配置文件夹 */
~ cd tomorrow-theme/vim/colors
/* 移动配置文件到.vim/bundle/colors文件夹 */
~ mv Tomorrow-Night.vim ~/.vim/bundle
接下来,修改 .vimrc 配置文件,使主题生效。
/* 在配置文件中加入下面的配置 */ " ********************************************* " Tomorrow主题配置 " ********************************************* set t_Co=256 set background=dark colorscheme Tomorrow-Night
重启终端和vim试试,全新的tomorrow配色就这样生效了。!!!
主题切换
:colorscheme "查看当前主题 :colorscheme space tab "列出所有主题 :colorscheme your-theme "切换主题
有时候我们想快速浏览主题并找到一款合适的主题,change-colorscheme 将会满足我们的要求.
安装
git https://github.com/chxuan/change-colorscheme.git
cd ./change-colorscheme/plugin
cp change-colorscheme.vim ~/.vim/plugin
或者如果你有 Vundle, 将 'chxuan/change-colorscheme' 加入你的 ~/.vimrc 然后执行 :PluginInstall.
使用
你可以将下面的代码放入 ~/.vimrc:
map <F12> :NextColorScheme<CR> imap <F12> <ESC> :NextColorScheme<CR> map <F11> :PreviousColorScheme<CR> imap <F11> <ESC> :PreviousColorScheme<CR>
按下 F12 将加载下一个主题,按下 F11 将加载上一个主题。 如果你想知道当前是什么主题你可以执行 :colorscheme.
注意
该插件将会在 ~/.vim/colors 搜索主题。
分割布局
在写代码的时候,最喜欢的就是开两个窗口来浏览不同的代码,这点在 vim 中可以轻易的做到,所以,自从用了 vim 就再也不想用双屏来看代码了。
为了配合快捷键来使用分割布局,我们需要在 .vimrc 文件中添加下面的配置。
" ********************************************* " 分割布局相关 " ********************************************* set splitbelow set splitright "快捷键,ctrl+l切换到左边布局,ctrl+h切换到右边布局 "ctrl+k切换到上面布局,ctrl+j切换到下面布局 nnoremap <C-J> <C-W><C-J> nnoremap <C-K> <C-W><C-K> nnoremap <C-L> <C-W><C-L> nnoremap <C-H> <C-W><C-H>
保存退出,重新进入 vim 之后,就可以用命令来控制分割布局了。
:split // 水平分割打开一个新窗口 :vsplit // 垂直分割打开一个新窗口
下面是分割成四个窗口的预览图,看看是不是很酷炫,效率一下子就提升了。另外,CTRL+H/J/K/L 就可以切换到任意窗口进行编辑操作。
代码折叠
通常,在一些 IDE 里面都提供对代码进行折叠的操作,便于理清代码的思路。Vim 当然不甘示弱,这么点小功能能难倒我,而且 vim 的折叠功能更加的可控和智能。
同样,在 .vimrc 中添加如下配置来开启代码折叠功能。
" 开启代码折叠功能 " 根据当前代码行的缩进来进行代码折叠 set foldmethod=indent set foldlevel=99
这样一来,你在 NORMAL 模式下就可以输入 za 快捷键来进行代码折叠了。为了便于操作,我们可以将 za 快捷键换成空格键。所以,您的配置文件中还需要添加如下命令:
" 将za快捷键映射到space空格键上 nnoremap <space> za
目录树
按照当初的想法,是为了将 vim 配置成 Python 开发环境,那么开发环境中的文件目录当然少不了。得益于 vim 强大的插件系统,自然会有插件来带我们完成这个功能。于是,我们找到了 NERDTree 这个插件,先来看看实用效果吧。
第一步,在 vimrc 文件中添加如下代码,和 Vbundle 放在一起。
Plugin 'gmarik/Vundle.vim'
Plugin 'scrooloose/nerdtree'
" ********************************************* " NERD插件属性 " ********************************************* au vimenter * NERDTree // 开启vim的时候默认开启NERDTree map <F2> :NERDTreeToggle<CR> // 设置F2为开启NERDTree的快捷键
第三步,执行 :PluginInstall
" Installing plugins to /.vim/bundle"
. Plugin 'gmarik/Vundle.vim'
+ Plugin 'scrooloose/nerdtree' // 表示新添加的插件已经安装
* Helptags
Tagbar
Tagbar 可以将正在编辑的文件生成一个大纲,包含类、方法、变量等,可以选中快速跳转到目标位置,编辑大文件的时候特别有用。
Tagbar 的安装需要 Ctags 的支持,我们首先需要安装用 brew 来安装 Ctags,运行如下命令:
~ brew install ctags
Plugin 'majutsushi/tagbar' " 启动时自动focus map <F4> :TagbarToggle<CR> let g:tagbar_auto_faocus =1 " 启动指定文件时自动开启tagbar autocmd BufReadPost *.py,*.cpp,*.c,*.h,*.hpp,*.cc,*.cxx call tagbar#autoopen()
做完这些之后,执行 :PluginInstall
自动补全
在 vim 下,最好用的自动补全插件非 YouCompleteMe 莫属,这款插件支持C、C++、obj-C、C# 和 python 语言的自动补全,有了它,补全各类代码都不用愁了。
安装 YCM 需要 cmake 的支持,而且 vim 的版本需要在 7.4 以上。首先,我们来安装 cmake。
~ brew install cmake
然后,按照插件的安装方法,向 .vimrc 中添加下列配置命令。
Plugin 'Valloric/YouCompleteMe' " ********************************************* " YCM插件相关 " ********************************************* let g:ycm_autoclose_preview_window_after_completion=1 " 跳转到定义处 map <leader>g :YcmCompleter GoToDefinitionElseDeclaration<CR> " 默认tab、s-tab和自动补全冲突 let g:ycm_key_list_select_completion = ['<TAB>', '<c-n>', '<Down>'] let g:ycm_key_list_previous_completion = ['<S-TAB>', '<c-p>', '<Up>'] let g:ycm_auto_trigger = 1
最后,执行 :PluginInstall,执行完之后,会提示 YCM 需要编译后才能使用,去 YCM 目录下执行编译工作吧。
/* 进入ycm目录 */ ~ cd .vim/bundle/YouCompleteMe/ /* 执行编译 */ ./install.sh --clang-completer
编译的过程有点慢,耐心等待之后,就可以在写代码的时候自动补全了,看如下示意图,补全 python 代码。
通过 Git 安装 YCM
用 vundle 中的安装太慢, 所以自己手动安装
检查是否安装 clang、g++、cmake 等
安装插件管理工具
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
在 .vimrc 中插件管理处加入:
Plugin 'Valloric/YouCompleteMe'
安装 ycm
cd .vim/bundle git clone https://github.com/Valloric/YouCompleteMe.git cd YouCompleteMe git submodule update--init --recursive ./install.py --clang-completer
在 .vimrc 中添加下列
let g:ycm_global_ycm_extra_conf = '~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py'
air-line
大家在看上述截图的时候,可以会对下方的一条状态栏感兴趣,作为外观党,实在是对这个小插件爱不释手,它的最大好处就是好看!附带的功能也一目了然,可以显示 vim 当前的状态INSERT、NORMAL、VISUAL 等,还可以配合一些插件提示语法错误。废话不多说,接下来就教大家安装这个增强型状态栏工具。
这个状态栏是由 vim-airline 插件提供,默认情况下,airline 使用 ASCII 字符来作为状态栏的分隔符, 所以安装完后,会出现一些乱码的情况。具体的修改方法后面会讲到。
首先,还是按照插件安装的方法,在 .vimrc 中添加如下配置命令。
Plugin 'vim-airline/vim-airline' Plugin 'vim-airline/vim-airline-themes' " ********************************************* " vim-airline " ********************************************* " 开启powerline字体 let g:airline_powerline_fonts = 1 " 使用powerline包装过的字体 set guifont=Source\ Code\ Pro\ for\ Powerline:h14
然后,执行 :PluginInstall,重启 vim 可能不会如你所愿.
因为 terminal 使用的字体一般是 menlo 或者 monaco,这些字体都没有对 powerline 的字符进行封装,所以状态栏的字符段会出现乱码,这个时候需要做的就是安装 powerline 字体。
/* 从github下载字体文件 */ git clone https://github.com/powerline/fonts.git /* 安装powerline字体 */ cd fonts ./install.sh
等待脚本程序运行完之后,就成功安装好了 powerline 封装过的字体了。接下来,修改终端字体,个人比较偏爱 Source Code Pro 字体,所以讲终端字体修改为 Source Code Pro for Powerline,然后重启 vim 就能看到正常显示的 airline 了。
支持 UTF-8 编码
大部分情况下,进行 Python 开发时,你应该使用 UTF-8 编码,尤其是使用 Python3 的时候,为了使 vim 支持 UTF-8 编码需要在 .vimrc 中添加如下代码:
set encoding=utf-8
文件跳转 ctrlp
在进行大项目的开发时,往往需要进行文件的跳转,有时我们队要跳转的文件名只记得部分,所以需要支持模糊查找,目录树跨文件夹跳转起来太不方便,于是 ctrlp 插件登场了,当逆向打开某个文件时,只需要按下 ctrl+p 输入要打开的文件名即可实现文件跳转,所有和这个文件名匹配的文件都会被按照优先级列出来。
其安装步骤如下,在 .vimrc 中添加如下配置命令:
Plugin 'kien/ctrlp.vim' " ********************************************* " ctrlp " ********************************************* let g:ctrlp_map = '<c-p>' let g:ctrlp_cmd = 'CtrlP' " 设置过滤不进行查找的后缀名 let g:ctrlp_custom_ignore = '\v[\/]\.(git|hg|svn|pyc)$'
最后,执行 :PluginInstall,重启 vim,按下 CTRL+P,文件跳转就显示出来了。
使用 ctags 生成 tag 标签文件实现跳转
在当前目录下执行命令 ctags -R 就可以生成当前项目所有源文件对应的 tag 标签文件
此时,再通过 Vim 打开当前项目的某个源文件,把光标移动到某个标识符上,通过按键 Ctrl + ] 就可以跳转到对应的定义位置,命令 Ctrl + o 可以回退到原来的位置
如果当前光标下是个局部变量,在 Vim 命令模式下执行命令 gd 就可以跳转到这个局部变量的定义处
默认情况下,生成的 tags 文件必须在 vim 运行的当前目录才能在 vim 里面正确跳转
可以在 Vim 尾行模式或 Vim 配置文件 .~/.vimrc 中通过以下命令显式地指定 tag 文件路径:
:set tags+=tags文件路径
~ cd /usr/local/include ~ ctags -R
~ vim .vimrc ... set tags+=/usr/local/include/tags ...
PEP8风格
对于 Python 代码而言,必须要支持 PEP8 风格的缩进,所以,需要在 .vim 文件中添加下面的配置文件。
" ********************************************* " python代码风格PEP8 " ********************************************* au BufNewFile,BufRead *.py set tabstop=4 |set softtabstop=4|set shiftwidth=4|set textwidth=79|set expandtab|set autoindent|set fileformat=unix au BufNewFile,BufRead *.js, *.html, *.css set tabstop=2|set softtabstop=2|set shiftwidth=2
另外,如果需要自动缩进 python 代码的话,需要安装如下插件:
Plugin 'vim-scripts/indentpython.vim'
共享粘贴板
有时候需要从 vim 中复制一些代码出去,所以 vim 必须支持能够将代码复制到系统粘贴板上,要实现上述需求,只需要在 .vimrc 中添加如下配置参数。
set clipboard=unnamed
一键执行 Python 代码
在 .vimrc 中添加:
" F5 to run sh/python3
map <F5> :call CompileRunGcc()<CR>`
func! CompileRunGcc()
exec "w"
if &filetype == 'sh'
:!time bash %
elseif &filetype == 'python'
exec "!time python3.7 %"
endif
endfunc
说明:
- F5 一键执行代码, 可以自定义.
- 一键执行 shell 脚本的部分,不需要可以去掉.
- 需配置更多一键执行的文件类型, 点击文末参考链接.
- 注意:
- Python3.7 改成自己对应的版本.
按 F5 一键运行
然后按 Enter 回到编辑界面.十分丝滑的体验!
使用 pydiction 自动补全
pydiction中主要有三个文件:
- python_pydiction.vim – 该文件为 Vim 的 plugin 文件,实现 Python 文件的 TAB 补全功能。
- complete-dict – 该文件为 Vim 的 dictionary 文件,其中包含 Python 关键字和模块结构等信息。是plugin 进行补全时所查找的参考文件。
- pydiction.py – (可选)该文件是 Python script 文件,用于生成 dictionary文件。可以通过执行该脚本添加更多的可 TAB 补全模块。
1. 使用 Vundle 安装 pydiction
cd ~/.vim/bundle git clone https://github.com/rkulla/pydiction.git
2. 转到 pydiction 文件夹,然后执行:
cp -r ./after ~/.vim
PS:按照网上的教程使用bundle安装pydiction后,还是无法使用tab补全,原因是还需要复制pydiction中的after(包含python_pydiction.vim)文件夹至.vim目录中(Linux系统都需用此步骤)。
3. 配置 .vimrc
在 vimrc 文件中添加
filetype plugin on let g:pydiction_location = '~/.vim/bundle/pydiction/complete-dict'
其他
在编辑模式下如何快速移动光标
编辑 ~/.vimrc 配置文件,加入如下行,编辑模式下自定义的快捷键
inoremap <C-o> <Esc>o inoremap <C-l> <Right> inoremap <C-h> <Left> inoremap <C-k> <Up> inoremap <C-j> <Down> inoremap <C-b> <PageUp> inoremap <C-f> <PageDown>
括号自动补齐
inoremap ( ()<ESC>i inoremap [ []<ESC>i inoremap { {}<ESC>i inoremap ' ''<ESC>i inoremap " ""<ESC>i
行号
显示行号
set nu
不显示行号
set nonu
禁止光标闪烁
set gcr=a:block-blinkon0
禁止显示滚动条
set guioptions-=l
set guioptions-=L
set guioptions-=r
set guioptions-=R
禁止显示菜单和工具条
set guioptions-=m
set guioptions-=T
头文件的跳转
问题:按 gf 无法跳转到指定头文件
解决:vimrc 中添加 set path=xxx
xxx 是头文件所在目录
Ctrl + 6 : 跳转回来
小结
vim 的插件太多了,针对不同的需求都有相应的插件给予辅助。本篇博客只是按照自己的需求配置了相应的插件,
" ********************************************* " Vbundle插件管理 " ********************************************* set nocompatible " required set nu " required filetype off " required let python_highlight_all=1 syntax on set hlsearch set encoding=utf-8 set clipboard=unnamed set ts=4 set mouse=a "启用鼠标" " set the runtime path to include Vundle and initialize set rtp+=~/.vim/bundle/Vundle.vim call vundle#begin() " alternatively, pass a path where Vundle should install plugins "call vundle#begin('~/some/path/here') " let Vundle manage Vundle, required Plugin 'gmarik/Vundle.vim' Plugin 'majutsushi/tagbar' Plugin 'scrooloose/nerdtree' Plugin 'Valloric/YouCompleteMe' Plugin 'vim-airline/vim-airline' Plugin 'vim-airline/vim-airline-themes' Plugin 'kien/ctrlp.vim' Plugin 'tmhedberg/SimpylFold' Plugin 'scrooloose/syntastic' Plugin 'nvie/vim-flake8' Bundle 'klen/python-mode' Bundle 'Lokaltog/powerline', {'rtp': 'powerline/bindings/vim/'} " Add all your plugins here (note older versions of Vundle used Bundle instead of Plugin) " All of your Plugins must be added before the following line call vundle#end() " required filetype plugin indent on " required " ********************************************* " " 分割布局相关 " " ********************************************* " set splitbelow " set splitright " "快捷键,ctrl+l切换到左边布局,ctrl+h切换到右边布局 " "ctrl+k切换到上面布局,ctrl+j切换到下面布局 nnoremap <C-J> <C-W><C-J> nnoremap <C-K> <C-W><C-K> nnoremap <C-L> <C-W><C-L> nnoremap <C-H> <C-W><C-H> " ********************************************* " " Tomorrow主题配置 " " ********************************************* set t_Co=256 set background=dark "colorscheme Tomorrow-Night " 开启代码折叠功能 " 根据当前代码行的缩进来进行代码折叠 set foldmethod=indent set foldlevel=99 " 将折叠za快捷键映射到space空格键上 nnoremap <space> za let g:SimpylFold_docstring_preview=1 " ********************************************* " NERD插件属性 " ********************************************* au vimenter * NERDTree " 开启vim的时候默认开启NERDTree map <F2> :NERDTreeToggle<CR> " 设置F2为开启NERDTree的快捷键 " ********************************************* " YCM插件相关 " ********************************************* let g:ycm_autoclose_preview_window_after_completion=1 " 跳转到定义处 map <leader>g :YcmCompleter GoToDefinitionElseDeclaration<CR> " 默认tab、s-tab和自动补全冲突 let g:ycm_key_list_select_completion = ['<TAB>', '<c-n>', '<Down>'] let g:ycm_key_list_previous_completion = ['<S-TAB>', '<c-p>', '<Up>'] let g:ycm_auto_trigger = 1 " 启动时自动focus map <F4> :TagbarToggle<CR> let g:tagbar_auto_faocus =1 " 启动指定文件时自动开启tagbar autocmd BufReadPost *.py,*.pyc,*.cpp,*.c,*.h,*.hpp,*.cc,*.cxx call tagbar#autoopen() " ********************************************* " vim-airline " ********************************************* " 开启powerline字体 let g:airline_powerline_fonts = 1 " 使用powerline包装过的字体 set guifont=Source\ Code\ Pro\ for\ Powerline:h14 " ********************************************* " ctrlp " ********************************************* let g:ctrlp_map = '<c-p>' let g:ctrlp_cmd = 'CtrlP' " 设置过滤不进行查找的后缀名 let g:ctrlp_custom_ignore = '\v[\/]\.(git|hg|svn|pyc)$' " ********************************************* " python代码风格PEP8 " ********************************************* au BufNewFile,BufRead *.py set tabstop=4 |set softtabstop=4|set shiftwidth=4|set textwidth=79|set noexpandtab|set autoindent|set fileformat=unix au BufNewFile,BufRead *.js, *.html, *.css set tabstop=2|set softtabstop=2|set shiftwidth=2 " 多余空格 "au BufRead,BufNewFile *.py,*.pyw,*.c,*.h match BadWhitespace /\s\+$/ " " " Python-mode " Activate rope " Keys: 按键: " K Show python docs 显示Python文档 " <Ctrl-Space> Rope autocomplete 使用Rope进行自动补全 " <Ctrl-c>g Rope goto definition 跳转到定义处 " <Ctrl-c>d Rope show documentation 显示文档 " <Ctrl-c>f Rope find occurrences 寻找该对象出现的地方 " <Leader>b Set, unset breakpoint (g:pymode_breakpoint enabled) 断点 " [[ Jump on previous class or function (normal, visual, operator modes) " ]] Jump on next class or function (normal, visual, operator modes) " 跳转到前一个/后一个类或函数 " [M Jump on previous class or method (normal, visual, operator modes) " ]M Jump on next class or method (normal, visual, operator modes) " 跳转到前一个/后一个类或方法 let g:pymode_rope = 1 " Documentation 显示文档 let g:pymode_doc = 1 let g:pymode_doc_key = 'K' "Linting 代码查错,=1为启用 let g:pymode_lint = 1 let g:pymode_lint_checker = "pyflakes,pep8" " Auto check on save let g:pymode_lint_write = 1 " Support virtualenv let g:pymode_virtualenv = 1 " Enable breakpoints plugin let g:pymode_breakpoint = 1 let g:pymode_breakpoint_bind = '<leader>b' " syntax highlighting 高亮形式 let g:pymode_syntax = 1 let g:pymode_syntax_all = 1 let g:pymode_syntax_indent_errors = g:pymode_syntax_all let g:pymode_syntax_space_errors = g:pymode_syntax_all " Don't autofold code 禁用自动代码折叠 let g:pymode_folding = 0
"显示行号 set nu "启动时隐去援助提示 set shortmess=atI "语法高亮 syntax on "使用vim的键盘模式 set nocompatible "不需要备份 set nobackup "没有保存或文件只读时弹出确认 set confirm "鼠标可用 set mouse-=a "tab缩进 set tabstop=4 set shiftwidth=4 set expandtab set smarttab "文件自动检测外部更改 set autoread "c文件自动缩进 set cindent "自动对齐 set autoindent "智能缩进 set smartindent "高亮查找匹配 set hlsearch "显示匹配 set showmatch "显示标尺,就是在右下角显示光标位置 set ruler "去除vi的一致性 set nocompatible "设置键盘映射,通过空格设置折叠 nnoremap <space> @=((foldclosed(line('.')<0)?'zc':'zo'))<CR> """""""""""""""""""""""""""""""""""""""""""""" "不要闪烁 set novisualbell "启动显示状态行 set laststatus=2 "浅色显示当前行 autocmd InsertLeave * se nocul "用浅色高亮当前行 autocmd InsertEnter * se cul "显示输入的命令 set showcmd "被分割窗口之间显示空白 set fillchars=vert:/ set fillchars=stl:/ set fillchars=stlnc:/ " vundle 环境设置 filetype off set rtp+=~/.vim/bundle/Vundle.vim " vundle 管理的插件列表必须位于 vundle#begin() 和 vundle#end() 之间 call vundle#begin() Plugin 'VundleVim/Vundle.vim' Plugin 'scrooloose/nerdtree' Plugin 'altercation/vim-colors-solarized' Plugin 'tomasr/molokai' Plugin 'vim-scripts/phd' Plugin 'Lokaltog/vim-powerline' Plugin 'octol/vim-cpp-enhanced-highlight' Plugin 'Raimondi/delimitMate' Plugin 'chriskempson/vim-tomorrow-theme' Plugin 'majutsushi/tagbar' Plugin 'kien/ctrlp.vim' Plugin 'Valloric/YouCompleteMe' Plugin 'vim-scripts/indentpython.vim' " 插件列表结束 call vundle#end() filetype plugin indent on " 配色方案 "set background=dark "colorscheme solarized "colorscheme molokai "colorscheme phd " 禁止显示菜单和工具条 set guioptions-=m set guioptions-=T " 总是显示状态栏 set laststatus=2 " 禁止折行 set nowrap " 设置状态栏主题风格 let g:Powerline_colorscheme='solarized256' syntax keyword cppSTLtype initializer_list " 基于缩进或语法进行代码折叠 "set foldmethod=indent set foldmethod=syntax " 启动 vim 时关闭折叠代码 set nofoldenable "允许用退格键删除字符 set backspace=indent,eol,start "编码设置 set encoding=utf-8 "共享剪切板 set clipboard=unnamed " Tomorrow主题配置 " ********************************************* set t_Co=256 set background=dark colorscheme Tomorrow-Night " 分割布局相关 " ********************************************* set splitbelow set splitright "快捷键,ctrl+l切换到左边布局,ctrl+h切换到右边布局 "ctrl+k切换到上面布局,ctrl+j切换到下面布局 nnoremap <C-J> <C-W><C-J> nnoremap <C-K> <C-W><C-K> nnoremap <C-L> <C-W><C-L> nnoremap <C-H> <C-W><C-H> " 开启代码折叠功能 " 根据当前代码行的缩进来进行代码折叠 set foldmethod=indent set foldlevel=99 " NERD插件属性 " ********************************************* " 开启vim的时候默认开启NERDTree au vimenter * NERDTree "" 设置F2为开启NERDTree的快捷键 map <F2> :NERDTreeToggle<CR> " 启动时自动focus map <F4> :TagbarToggle<CR> let g:tagbar_auto_faocus =1 " 启动指定文件时自动开启tagbar autocmd BufReadPost *.py,*.cpp,*.c,*.h,*.hpp,*.cc,*.cxx call tagbar#autoopen() " YCM插件相关 " ********************************************* let g:ycm_autoclose_preview_window_after_completion=1 " 跳转到定义处 map <leader>g :YcmCompleter GoToDefinitionElseDeclaration<CR> " 默认tab、s-tab和自动补全冲突 let g:ycm_key_list_select_completion = ['<TAB>', '<c-n>', '<Down>'] let g:ycm_key_list_previous_completion = ['<S-TAB>', '<c-p>', '<Up>'] let g:ycm_auto_trigger = 1 " ctrlp " ********************************************* let g:ctrlp_map = '<c-p>' let g:ctrlp_cmd = 'CtrlP' " 设置过滤不进行查找的后缀名 let g:ctrlp_custom_ignore = '\v[\/]\.(git|hg|svn|pyc)$' " python代码风格PEP8 " ********************************************* au BufNewFile,BufRead *.py set tabstop=4 |set softtabstop=4|set shiftwidth=4|set textwidth=79|set expandtab|set autoindent|set fileformat=unix au BufNewFile,BufRead *.js, *.html, *.css set tabstop=2|set softtabstop=2|set shiftwidth=2
set nocompatible filetype off set rtp+=~/.vim/bundle/Vundle.vim call vundle#begin() Plugin 'VundleVim/Vundle.vim' Plugin 'scrooloose/nerdtree' " 显示目录结构 Plugin 'scrooloose/nerdcommenter' " 注释 Plugin 'Valloric/YouCompleteMe' " 提示 Plugin 'vim-airline/vim-airline' " 底栏 Plugin 'tomasr/molokai' " 主题 Plugin 'python-mode/python-mode' " 代码检查 Plugin 'vim-latex/vim-latex' " LaTex Plugin 'godlygeek/tabular' " 对齐 Plugin 'plasticboy/vim-markdown' " Markdown Plugin 'tyru/open-browser.vim' " previm需要,vim内打开浏览器 Plugin 'previm/previm' " Markdown预览 Plugin 'mattn/emmet-vim' " HTML,CSS Plugin 'luochen1990/rainbow' " 括号层级显示 Plugin 'ap/vim-css-color' " 显示CSS颜色 Plugin 'yggdroot/indentline' " 显示缩进指示线 Plugin 'pangloss/vim-javascript' " JavaScript Plugin 'posva/vim-vue' " Vue Plugin 'tpope/vim-surround' " 快速添加、修改和删除括号、引号、HTML标签、XML标签等 Plugin 'terryma/vim-multiple-cursors' " 多光标操作 call vundle#end() filetype plugin indent on set encoding=utf-8 set nu set mouse=a set cursorline set cursorcolumn syntax on color molokai if has("gui_running") set lines=100 columns=200 endif set guifont=Monaco\ 10 set guioptions-=m " 隐藏菜单栏 set guioptions-=T " 隐藏工具栏 set guioptions-=r " 隐藏右侧滚动条 set guioptions-=L " 隐藏左侧滚动条 set guioptions-=b " 隐藏底部滚动条 " NERDTree autocmd vimenter * NERDTree " 自动开启NERDTree " <F3>关闭NERDTree map <F3> :NERDTreeToggle<CR> " NERDCommenter let g:NERDSpaceDelims=1 " 于注释符后添加一个空格 " let g:NERDDefaultAlign= 'start' " 注释符左对齐 let g:NERDDefaultAlign= 'left' " 注释符左对齐 let g:NERDCommentEmptyLines=1 " 允许注释空行 let g:NERDTrimTrailingWhitespace=1 " 去掉注释时,去掉多余空格 let g:NERDToggleCheckAllLines=1 " 注释时检查所选行是否已被注释 " 注释或反注释快捷键<F2> map <F2> <Leader>ci " YouCompleteMe autocmd InsertLeave * if pumvisible() == 0|pclose|endif "离开插入模式后自动关闭预览窗口 let g:ycm_complete_in_comments = 1 "在注释输入中也能补全 let g:ycm_collect_identifiers_from_comments_and_strings = 0 "注释和字符串中的文字也会被收入补全 let g:ycm_autoclose_preview_window_after_completion = 0 " 补全后自动关闭preview窗口 let g:ycm_extra_conf_globlist = ['~/Workspace/*'] " 载入该路径下的.ycm_extra_conf.py前不会弹出提示框 let g:ycm_global_ycm_extra_conf = '~/.vim/bundle/YouCompleteMe/third_party/ycmd/.ycm_extra_conf.py' " 默认库路径 " vim-airline let g:airline#extensions#tabline#enabled=1 " python-mode let g:pymode_warnings=0 " 允许插件警告 let g:pymode_python='python3' " 设置pymode是用的Python版本 let g:pymode_virtualenv=1 " 支持自动检测virtualenv let g:pymode_run_bind='<F5>' " 设置<F5>为运行代码快捷键 let g:pymode_lint_sort=['E','W','C','I'] " 报错等显示顺序 let g:pymode_lint_ignore = ["E116"] " 不显示E116报错,即注释缩进报错 " vim-latex let g:tex_flavor='latex' let g:Tex_DefaultTargetFormat='pdf' let g:Tex_CompileRule_pdf='xelatex -interaction=nonstopmode $*' let g:Tex_ViewRule_pdf='xreader' " open-browser.vim let g:previm_open_cmd='firefox' " rainbow let g:rainbow_active=1 let g:rainbow_conf={ \ 'guifgs': ['royalblue3', 'darkorange3', 'seagreen3', 'firebrick'], \ 'ctermfgs': ['lightblue', 'lightyellow', 'lightcyan', 'lightmagenta'], \ 'operators': '_,_', \ 'parentheses': ['start=/(/ end=/)/ fold', 'start=/\[/ end=/\]/ fold', 'start=/{/ end=/}/ fold'], \ 'separately': { \ '*': {}, \ 'tex': { \ 'parentheses': ['start=/(/ end=/)/', 'start=/\[/ end=/\]/'], \ }, \ 'vim': { \ 'parentheses': ['start=/(/ end=/)/', 'start=/\[/ end=/\]/', 'start=/{/ end=/}/ fold', 'start=/(/ end=/)/ containedin=vimFuncBody', 'start=/\[/ end=/\]/ containedin=vimFuncBody', 'start=/{/ end=/}/ fold containedin=vimFuncBody'], \ }, \ 'html': { \ 'parentheses': ['start=/\v\<((area|base|br|col|embed|hr|img|input|keygen|link|menuitem|meta|param|source|track|wbr)[ >])@!\z([-_:a-zA-Z0-9]+)(\s+[-_:a-zA-Z0-9]+(\=("[^"]*"|'."'".'[^'."'".']*'."'".'|[^ '."'".'"><=`]*))?)*\>/ end=#</\z1># fold'], \ }, \ 'css': 0, \ } \} " 括号自动补齐 inoremap ( ()<ESC>i inoremap [ []<ESC>i inoremap { {}<ESC>i inoremap ' ''<ESC>i inoremap " ""<ESC>i " 自动代码折叠 set foldmethod=indent nnoremap <Space> za " 插入头部 func AddTitlePY() call append(0,"# -*- coding=utf8 -*-") call append(1,"#") call append(2,"# Author : Painter") call append(3,"# Created Time : ".strftime("%Y-%m-%d %a %H:%M:%S")) call append(4,"# Filename : ".expand("%:t")) call append(5,"# Email : painter9509@126.com") call append(6,"") call append(7,"") endfunc func AddTitleC() call append(0,"/*=======================================") call append(1," *") call append(2," * Author : Painter") call append(3," * Created Time : ".strftime("%Y-%m-%d %a %H:%M:%S")) call append(4," * Filename : ".expand("%:t")) call append(5," * Email : painter9509@126.com") call append(6," *") call append(7," *=======================================*/") call append(8,"") call append(9,"") endfunc func AddTitleTeX() call append(0,"%") call append(1,"% Author : Painter") call append(2,"% Created Time: ".strftime("%Y-%m-%d %a %H:%M:%S")) call append(3,"% Filename : ".expand("%:t")) call append(4,"% Email : painter9509@126.com") call append(5,"%") call append(6,"") call append(7,"") endfunc au BufNewFile *.py,*.pyw call AddTitlePY() au BufNewFile *.c,*.cpp,*.h call AddTitleC() au BufNewFile *.tex call AddTitleTeX() " Python C C++ highlight BadWhitespace ctermbg=red guibg=darkred au BufNewFile,BufRead *.py,*.pyw,*.c,*.cpp,*.h \ set tabstop=4 | \ set softtabstop=4 | \ set shiftwidth=4 | \ set expandtab | \ set autoindent | \ set fileformat=unix | \ match BadWhitespace /\s\+$/ au BufNewFile,BufRead *.c,*.cpp,*.h \ set cindent | \ set colorcolumn=80 au BufNewFile,BufRead *.tex,*.htm,*.html \ set tabstop=2 | \ set softtabstop=2 | \ set shiftwidth=2 | \ set expandtab | \ set fileformat=unix " func AutoRun() " if &filetype=="python" " let mp=&makeprg " setlocal makeprg=python\ -u " silent make % " copen " let &makeprg=mp " endif " endfunc " map <F5> :w<CR> :call AutoRun()<CR> auto BufEnter * if 0==len(filter(range(1,winnr('$')), 'empty(getbufvar(winbuf
" 让配置变更立即生效 autocmd BufWritePost $MYVIMRC source $MYVIMRC "显示行号 set nu "启动时隐去援助提示 set shortmess=atI " 开启语法高亮功能 syntax enable " 允许用指定语法高亮配色方案替换默认方案 syntax on " 禁止光标闪烁 set gcr=a:block-blinkon0 " 禁止显示滚动条 set guioptions-=l set guioptions-=L set guioptions-=r set guioptions-=R " 禁止显示菜单和工具条 set guioptions-=m set guioptions-=T " 开启实时搜索功能 set incsearch " 搜索时大小写不敏感 set ignorecase " 关闭兼容模式, 使用vim的键盘模式 set nocompatible " vim 自身命令行模式智能补全 set wildmenu "不需要备份 set nobackup "没有保存或文件只读时弹出确认 set confirm "鼠标可用 set mouse-=a "tab缩进 set tabstop=4 set shiftwidth=4 set expandtab set smarttab "文件自动检测外部更改 set autoread "c文件自动缩进 set cindent "自动对齐 set autoindent "智能缩进 set smartindent "高亮查找匹配 set hlsearch "显示匹配 set showmatch "显示标尺,就是在右下角显示光标位置 set ruler " 高亮显示当前行/列 set cursorline set cursorcolumn " 设置 gvim 显示字体 " set guifont=YaHei\ Consolas\ Hybrid\ 11.5 "去除vi的一致性 set nocompatible "设置键盘映射,通过空格设置折叠 nnoremap <space> @=((foldclosed(line('.')<0)?'zc':'zo'))<CR> """""""""""""""""""""""""""""""""""""""""""""" "不要闪烁 set novisualbell "启动显示状态行 set laststatus=2 "浅色显示当前行 autocmd InsertLeave * se nocul "用浅色高亮当前行 autocmd InsertEnter * se cul "显示输入的命令 set showcmd "被分割窗口之间显示空白 set fillchars=vert:/ set fillchars=stl:/ set fillchars=stlnc:/ " vundle 环境设置 filetype off set rtp+=~/.vim/bundle/Vundle.vim " vundle 管理的插件列表必须位于 vundle#begin() 和 vundle#end() 之间 call vundle#begin() Plugin 'VundleVim/Vundle.vim' Plugin 'scrooloose/nerdtree' " 显示目录结构 Plugin 'scrooloose/nerdcommenter' " 注释 Plugin 'altercation/vim-colors-solarized' Plugin 'tomasr/molokai' " 主题 Plugin 'vim-scripts/phd' Plugin 'Lokaltog/vim-powerline' Plugin 'octol/vim-cpp-enhanced-highlight' Plugin 'Raimondi/delimitMate' Plugin 'chriskempson/vim-tomorrow-theme' Plugin 'majutsushi/tagbar' Plugin 'kien/ctrlp.vim' Plugin 'Valloric/YouCompleteMe' " 代码补全 Plugin 'vim-scripts/indentpython.vim' Plugin 'python-mode/python-mode' " 代码检查 Plugin 'plasticboy/vim-markdown' " Markdown Plugin 'previm/previm' " Markdown预览 Plugin 'luochen1990/rainbow' " 括号层级显示 Plugin 'nathanaelkane/vim-indent-guides' " 缩进指南 " 插件列表结束 call vundle#end() " 自适应不同语言的智能缩进 filetype indent on filetype plugin indent on " 配色方案 "set background=dark "colorscheme solarized " 素雅 "colorscheme molokai " 多彩 "colorscheme phd " 复古 " Tomorrow主题配置 " ********************************************* " set t_Co=256 " set background=dark " colorscheme Tomorrow-Night " 禁止显示菜单和工具条 set guioptions-=m set guioptions-=T " 总是显示状态栏 set laststatus=2 " 禁止折行 set nowrap " 设置状态栏主题风格 let g:Powerline_colorscheme='solarized256' syntax keyword cppSTLtype initializer_list " 基于缩进或语法进行代码折叠 "set foldmethod=indent set foldmethod=syntax " 启动 vim 时关闭折叠代码 set nofoldenable "允许用退格键删除字符 set backspace=indent,eol,start "编码设置 set encoding=utf-8 "共享剪切板 set clipboard=unnamed " 分割布局相关 " ********************************************* set splitbelow set splitright "快捷键,ctrl+l切换到左边布局,ctrl+h切换到右边布局 "ctrl+k切换到上面布局,ctrl+j切换到下面布局 nnoremap <C-J> <C-W><C-J> nnoremap <C-K> <C-W><C-K> nnoremap <C-L> <C-W><C-L> nnoremap <C-H> <C-W><C-H> " 开启代码折叠功能 " 根据当前代码行的缩进来进行代码折叠 set foldmethod=indent set foldlevel=99 " NERD插件属性 " ********************************************* " 开启vim的时候默认开启NERDTree " au vimenter * NERDTree "" 设置F2为开启NERDTree的快捷键 map <C-T> :NERDTreeToggle<CR> " map <F2> :NERDTreeToggle<CR> " NERDCommenter let g:NERDSpaceDelims=1 " 于注释符后添加一个空格 " let g:NERDDefaultAlign= 'start' " 注释符左对齐 let g:NERDDefaultAlign= 'left' " 注释符左对齐 let g:NERDCommentEmptyLines=1 " 允许注释空行 let g:NERDTrimTrailingWhitespace=1 " 去掉注释时,去掉多余空格 let g:NERDToggleCheckAllLines=1 " 注释时检查所选行是否已被注释 " 注释或反注释快捷键<F2> map <F2> <Leader>ci " 启动时自动focus map <F4> :TagbarToggle<CR> let g:tagbar_auto_faocus =1 " 启动指定文件时自动开启tagbar autocmd BufReadPost *.py,*.cpp,*.c,*.h,*.hpp,*.cc,*.cxx call tagbar#autoopen() " YCM插件相关 " ********************************************* autocmd InsertLeave * if pumvisible() == 0|pclose|endif "离开插入模式后自动关闭预览窗口 let g:ycm_complete_in_comments = 1 "在注释输入中也能补全 let g:ycm_collect_identifiers_from_comments_and_strings = 0 "注释和字符串中的文字也会被收入补全 let g:ycm_autoclose_preview_window_after_completion = 0 " 补全后自动关闭preview窗口 " let g:ycm_autoclose_preview_window_after_completion=1 let g:ycm_global_ycm_extra_conf = '~/.vim/bundle/YouCompleteMe/third_party/ycmd/.ycm_extra_conf.py' " 默认库路径 " 跳转到定义处 map <leader>g :YcmCompleter GoToDefinitionElseDeclaration<CR> " 默认tab、s-tab和自动补全冲突 let g:ycm_key_list_select_completion = ['<TAB>', '<c-n>', '<Down>'] let g:ycm_key_list_previous_completion = ['<S-TAB>', '<c-p>', '<Up>'] let g:ycm_auto_trigger = 1 " ctrlp " ********************************************* let g:ctrlp_map = '<c-p>' let g:ctrlp_cmd = 'CtrlP' " 设置过滤不进行查找的后缀名 let g:ctrlp_custom_ignore = '\v[\/]\.(git|hg|svn|pyc)$' " python代码风格PEP8 " ********************************************* au BufNewFile,BufRead *.py set tabstop=4 |set softtabstop=4|set shiftwidth=4|set textwidth=79|set expandtab|set autoindent|set fileformat=unix au BufNewFile,BufRead *.js, *.html, *.css set tabstop=2|set softtabstop=2|set shiftwidth=2 " python-mode let g:pymode_warnings=0 " 允许插件警告 let g:pymode_python='python3' " 设置pymode是用的Python版本 let g:pymode_virtualenv=1 " 支持自动检测virtualenv " let g:pymode_run_bind='<F5>' " 设置<F5>为运行代码快捷键 let g:pymode_lint_sort=['E','W','C','I'] " 报错等显示顺序 let g:pymode_lint_ignore = ["E116"] " 不显示E116报错,即注释缩进报错 " F5 to run sh/python3 map <F5> :call CompileRunGcc()<CR>` func! CompileRunGcc() exec "w" if &filetype == 'sh' :!time bash % elseif &filetype == 'python' exec "!time python3.7 %" endif endfunc " 默认tab、s-tab和自动补全冲突 let g:ycm_key_list_select_completion = ['<TAB>', '<c-n>', '<Down>'] let g:ycm_key_list_previous_completion = ['<S-TAB>', '<c-p>', '<Up>'] let g:ycm_auto_trigger = 1 " 括号自动补齐 inoremap ( ()<ESC>i inoremap [ []<ESC>i inoremap { {}<ESC>i inoremap ' ''<ESC>i inoremap " ""<ESC>i " insert mode shortcut inoremap <C-h> <Left> inoremap <C-j> <Down> inoremap <C-k> <Up> inoremap <C-l> <Right> inoremap <C-d> <DELETE> " 定义快捷键的前缀,即<Leader> let mapleader=";" " 定义快捷键到行首和行尾 nmap LB 0 nmap LE $ " 设置快捷键将选中文本块复制至系统剪贴板 vnoremap <Leader>y "+y " 设置快捷键将系统剪贴板内容粘贴至 vim nmap <Leader>p "+p " 定义快捷键关闭当前分割窗口 nmap <Leader>q :q<CR> " 定义快捷键保存当前窗口内容 nmap <Leader>w :w<CR> " 定义快捷键保存所有窗口内容并退出 vim nmap <Leader>WQ :wa<CR>:q<CR> " 不做任何保存,直接退出 vim nmap <Leader>Q :qa!<CR> " 依次遍历子窗口 nnoremap nw <C-W><C-W> " 跳转至右方的窗口 nnoremap <Leader>lw <C-W>l " 跳转至左方的窗口 nnoremap <Leader>hw <C-W>h " 跳转至上方的子窗口 nnoremap <Leader>kw <C-W>k " 跳转至下方的子窗口 nnoremap <Leader>jw <C-W>j " 定义快捷键在结对符之间跳转 nmap <Leader>M % " 将外部命令 wmctrl 控制窗口最大化的命令行参数封装成一个 vim 的函数 fun! ToggleFullscreen() call system("wmctrl -ir " . v:windowid . " -b toggle,fullscreen") endf " 全屏开/关快捷键 map <silent> <F11> :call ToggleFullscreen()<CR> " 启动 vim 时自动全屏 autocmd VimEnter * call ToggleFullscreen() " 随 vim 自启动 let g:indent_guides_enable_on_vim_startup=1 " 从第二层开始可视化显示缩进 let g:indent_guides_start_level=2 " 色块宽度 let g:indent_guides_guide_size=1 " 快捷键 i 开/关缩进可视化 :nmap <silent> <Leader>i <Plug>IndentGuidesToggle
Reference
http://zcheng.ren/2016/12/29/VimAndZshInMacTerminal/