mac下配置vim

macvim配置

最终效果如下:

系统环境

  • macos10.12.4
  • homebrew1.2.1
  • python3.5&python2.7
  • iTerm2
  • zsh5.3.1
  • macvim8.0

安装macvim

mac预装了vim,但官方的 vim 在 Mac 上只有一个很不完善的,长期没人维护的 Carbon 图形用户界面。macvim 主要是在此基础上添加了一个完整的 Cocoa 用户界面,其核心部分和 vim 同步。MacVim 采用了分离进程的方式,一个 MacVim 程序可以启动多个 vim 进程,每个显示在一个 MacVim 窗口中,这是官方的 vim 和其他平台下的 gvim 所不支持的。MacVim 还支持很多 Mac OS X 原生的界面特性,比如工具栏、滚动条、全屏显示、Mac 菜单快捷键的绑定等。

# 查看预装vim版本
vim --version

# 查看预装vim路径
where vim

安装

有两种方式来安装macvim:

  1. Github上下载macvim.dmg安装包进行安装
  2. 使用Homebrew安装

这也是我们所采用的方式:

brew install macvim

建立软链接

无论使用哪种方式进行安装,可以在MacVim.app包文件中找到mvim和vim的可执行文件,要在shell中方便的执行这些命令,可以:

  1. 将可执行文件所在路径添加到环境变量$PATH
  2. 将可执行文件复制到环境变量$PATH中的某一个路径下;
  3. $PATH中的某一个路径下创建该可执行文件的软/硬链接;
  4. 为可执行文件设置别名,并添加到配置文件中(/.bash_profile或/.zshrc);

这里推荐在/usr/local/bin目录下为mvim软链接的方式。同时,mac预装vim版本过低,推荐使用MacVim.app包中的vim将其替代,如果想同时保留原来预装的/usr/bin/vim中的vim,可以通过创建别名来将其“覆盖”掉。

# 将可执行文件所在路径添加到环境变量`$PATH`中,单引号内的字符会原样输出
echo 'export PATH=/usr/local/Cellar/macvim/8.0-133/MacVim.app/Contents/bin:$PATH' >> ~/.zshrc

# 或将可执行文件mvim复制到/usr/local/bin/路径下
cp /usr/local/Cellar/macvim/8.0-133/MacVim.app/Contents/bin/mvim /usr/local/bin/mvim

# 或者在/usr/local/bin/路径中为mvim建立软链接
ln -s /usr/local/Cellar/macvim/8.0-133/MacVim.app/Contents/bin/mvim /usr/local/bin/mvim

# 为macvim中的vim创建别名,将其添加至~/.zshrc配置文件
echo 'alias vim="/usr/local/Cellar/macvim/8.0-133/MacVim.app/Contents/MacOS/vim"' >> ~/.zshrc
# 重新加载.zshrc以使修改生效 
source ~/.zshrc

安装验证

终端输入vim,终端vim显示如下:

终端输入mvim,弹出GUIvim如下:

配置文件

在vim启动过程中,首先将查找配置文件并执行其中的命令,而这些初始化文件一般有vimrc、gvimrc和exrc三种。通过:version命令可以查看vim的配置文件信息:

:version
VIM - Vi IMproved 8.0 (2016 Sep 12, compiled May  8 2017 19:26:04)
MacOS X (unix) version
Included patches: 1-596
Compiled by Homebrew
......
 system vimrc file: "$VIM/vimrc"       # 全局vimrc配置文件
     user vimrc file: "$HOME/.vimrc"   # 用户vimrc配置文件
 2nd user vimrc file: "~/.vim/vimrc"       # 备用用户vimrc配置文件
      user exrc file: "$HOME/.exrc"    # 向后兼容vi的用户配置文件
  system gvimrc file: "$VIM/gvimrc"    # 全局gvimrc配置文件
    user gvimrc file: "$HOME/.gvimrc"   # 局部gvimrc配置文件
2nd user gvimrc file: "~/.vim/gvimrc"   # 备用局部gvimrc配置文件
       defaults file: "$VIMRUNTIME/defaults.vim"
 system menu file: "$VIMRUNTIME/menu.vim"  # MacVim的菜单文件的路径
  fall-back for $VIM: "/Applications/MacVim.app/Contents/Resources/vim"      # 系统变量VIM路径

配置文件的位置

vim的配置文件有全局和用户两种版本,分别存放于$VIM$HOME目录中,用户配置文件默认是没有的,必要时由用户自己在$HOME目录下创建。可以使用:echo命令查看他们的路径,使用:e命令进入目录:

:echo $VIM
/usr/local/Cellar/macvim/8.0-133/MacVim.app/Contents/Resources/vim

:echo $HOME
/Users/Garsen
  1. vimrc是vim最常用的配置文件
  2. gvim是Gvim的配置文件
  3. exrc仅用于向后兼容olvi/ex;除非你使用vi-compatible模式,否则不需要关注exrc配置文件

配置文件的加载顺序

可以通过:scriptname查看各脚本的加载顺序:

  1: /usr/local/Cellar/macvim/8.0-133/MacVim.app/Contents/Resources/vim/vimrc
  2: ~/.vimrc
  3: /usr/local/Cellar/macvim/8.0-133/MacVim.app/Contents/Resources/vim/runtime/syntax/syntax.vim
  4: /usr/local/Cellar/macvim/8.0-133/MacVim.app/Contents/Resources/vim/runtime/syntax/synload.vim
  5: /usr/local/Cellar/macvim/8.0-133/MacVim.app/Contents/Resources/vim/runtime/syntax/syncolor.vim
  6: /usr/local/Cellar/macvim/8.0-133/MacVim.app/Contents/Resources/vim/runtime/filetype.vim
  7: /usr/local/Cellar/macvim/8.0-133/MacVim.app/Contents/Resources/vim/runtime/menu.vim
  8: /usr/local/Cellar/macvim/8.0-133/MacVim.app/Contents/Resources/vim/runtime/autoload/paste.vim
  9: /usr/local/Cellar/macvim/8.0-133/MacVim.app/Contents/Resources/vim/runtime/ftoff.vim
 10: ~/.vim/bundle/Vundle.vim/autoload/vundle.vim    
  ......
 85: /usr/local/Cellar/macvim/8.0-133/MacVim.app/Contents/Resources/vim/gvimrc
 86: ~/.gvimrc    
  ......

可以看到:macvim在启动时会依次加载全局vimrc>>用户.vimrc>>全局gvimrc>>用户.gvimrc,而终端vim在启动既不加载gvimrc也不加载.gvimrc也就是说:

  1. 用户配置文件中的配置会覆盖全局配置文件的配置;因此,我们可以通过创建~/.vimrc来修改vim的默认配置。
  2. 对GUIvim,gvimrc会覆盖vimrc中的配置;因此,我们可以通过创建~/.vimrc使终端vim和GUIvim拥有不同的配置。此外,GUIvim支持更多扩展,有些功能在终端vim中无法使用。

创建用户配置文件

# 切换至用户目录
cd ~
# 使用mvim创建并打开.vimrc
mvim .vimrc

编辑配置文件

可以使用以下命令,新建缓冲区来编辑配置文件:
:edit $MYVIMRC
也可以使用以下命令,新建标签页来编辑配置文件:
:tabedit $MYVIMRC

当然也可以使用任何其他文本编辑器打开配置文件进行编辑。

应用配置文件

修改配置文件后,需要重新启动Vim,或使用:source命令来应用新的设置:

:source $MYVIMRC

我们可以在配置文件中增加以下命令,在保存后自动应用配置:

autocmd bufwritepost .vimrc source $MYVIMRC

配置文件基本配置

显示中文帮助

  1. 下载vimdoc
  2. 将文件解压到~/.vim/doc,若路径不存在则自己创建
  3. 打开vim执行:helptags ~/.vim/doc
  4. 在~/.vimrc中进行配置:
set helplang=cn 
if version >= 603
    set helplang=cn
    set encoding=utf-8
endif

保存配置文件后自动应用配置

:com[mand][!] [{attr}...] {cmd} {rep}
定义一个用户命令,命令的名字是 {cmd},而替换的文本是{rep}。该命令的属性 (参考下面) 是 {attr}。如果该命令已存在,会报错,除非已经指定了一个!,这种情况下命令被重定义。

BufWritePost是一个自动命令事件BufWritePost <filename> <command>把整个缓冲区写回到文件后(即修改并保存.vimrc之后),自动执行source $MYVIMRC以使配置生效。

autocmd! BufWritePost $MYVIMRC source $MYVIMRC

设置字体

设置格式:set guifont=字体名:h字号

  • 只要能在“字体册”中找到的字体都可以使用,可以自己下载安装喜欢的字体
  • 如果字体名中包含空格,需使用\进行转义;
  • 如果要使用powerline主题,则将字体设置为poerline类字体效果最好;
set guifont=Meslo\ LG\ S\ DZ\ Regular\ for\ Powerline:h13

字符编码

enc,fenc,fencs,tenc,一般乱码多是因这些参数设置不正确引起:

  1. enc,vim内部使用的编码,如buffer,寄存器中的字符串,windows一般是gbk,mac是utf-8
  2. fenc,当前打开文件自身的编码,如果enc和fenc不一致,vim会做编码转换,转换成fenc编码保存文件
  3. fencs,一个字符编码列表,编码的自动识别就是通过它实现的
  4. tenc,终端使用的编码,或者说vim用于屏幕显示时的编码,显示时vim会把内部编码转换为屏幕编码进行输出,默认为enc
mac和linux系统将enc设置为utf-8
set enc=utf-8

其他项

其他基本设置如下,注释清晰,不再一一说明:

" 设置外观 -------------------------------------
set number                      "显示行号 
set showtabline=0               "隐藏顶部标签栏"
set guioptions-=r               "隐藏右侧滚动条" 
set guioptions-=L               "隐藏左侧滚动条"
set guioptions-=b               "隐藏底部滚动条"
set cursorline                  "突出显示当前行"
set cursorcolumn                "突出显示当前列"
set langmenu=zh_CN.UTF-8        "显示中文菜单
" 变成辅助 -------------------------------------
syntax on                           "开启语法高亮
set nowrap                      "设置代码不折行"
set fileformat=unix             "设置以unix的格式保存文件"
set cindent                     "设置C样式的缩进格式"
set tabstop=4                   "一个 tab 显示出来是多少个空格,默认 8
set shiftwidth=4                "每一级缩进是多少个空格
set backspace+=indent,eol,start "set backspace&可以对其重置
set showmatch                   "显示匹配的括号"
set scrolloff=5                 "距离顶部和底部5行"
set laststatus=2                "命令行为两行"
" 其他杂项 -------------------------------------
set mouse=a                     "启用鼠标"
set selection=exclusive
set selectmode=mouse,key
set matchtime=5
set ignorecase                  "忽略大小写"
set incsearch
set hlsearch                    "高亮搜索项"
set noexpandtab                 "不允许扩展table"
set whichwrap+=<,>,h,l
set autoread

安装vim插件管理器——Vundle

Vim本身能够满足开发人员的很多需求,但是它的可扩展性也极强,并且已经有一些杀手级的扩展,可以让Vim拥有“现代”集成开发环境的特性。所以,你所需要的第一件东西就是一个好用的扩展管理器。

虽说有其他很多方式对vim进行扩展,Vim也有多个插件管理器,但是我们强烈推荐Vundle,它能够搜索、安装、更新和移除vim插件,再也不需要手动管理vim插件,你可以把它想象成Vim的pip。有了Vundle,安装和更新包这种事情不费吹灰之力。

安装Vundle

git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim

该命令将下载Vundle插件管理器,并将它放置在你的Vim编辑器bundles文件夹中。现在,你可以通过.vimrc配置文件来管理所有扩展了。

配置Vundle

接下来将Vundle配置添加到配置文件的顶部:

set nocompatible              " required
filetype off                  " required

" 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'

" 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

使用Vundle
这样,你就完成了使用Vundle前的设置。之后,安装vim插件的一般步骤可归结为:

  1. 在配置文件.vimrc中,将希望安装的插件写入call vundle#begin()call vundle#end()行之间:Plugin '插件名'
  2. 然后打开Vim编辑器,运行下面的命令::PluginInstall,Vundle就会自动下载安装对应的插件
  3. 在.vimrc中对插件进一步做详细配置

执行:PluginInstall后的截图:

安装插件——打造IDE

或许,Vim编辑器最重要的功能就是它不要求使用鼠标(除了GUI版本外)。一开始,你可能会觉得这是个非常糟糕的做法,但是只要你投入时间——是的,这很花时间——学习快捷组合键,就可以大幅提升工作流的速度。

添加目录树——NERDTree

NERDTree的作用就是列出当前路径的目录树,一般IDE都是有的。可以方便的浏览项目的总体的目录结构和创建删除重命名文件或文件名。

安装NERDTree

添加目录树:nerdtree

Plugin 'scrooloose/nerdtree'  

添加git状态图标:nerdtree-git

Plugin 'Xuyuanp/nerdtree-git-plugin'  

配置NERDTree

"使用F3键快速调出和隐藏它
map <F3> :NERDTreeToggle<CR>

let NERDTreeChDirMode=1

"显示书签"
let NERDTreeShowBookmarks=1

"设置忽略文件类型"
let NERDTreeIgnore=['\~$', '\.pyc$', '\.swp$']

"窗口大小"
let NERDTreeWinSize=25

" 修改默认箭头
let g:NERDTreeDirArrowExpandable = '▸'
let g:NERDTreeDirArrowCollapsible = '▾'

"How can I open a NERDTree automatically when vim starts up if no files were specified?
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif

" 打开vim时自动打开NERDTree
autocmd vimenter * NERDTree           

"How can I open NERDTree automatically when vim starts up on opening a directory?
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 | endif

" 关闭vim时,如果打开的文件除了NERDTree没有其他文件时,它自动关闭,减少多次按:q!
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif

" 开发的过程中,我们希望git信息直接在NERDTree中显示出来, 和Eclipse一样,修改的文件和增加的文件都给出相应的标注, 这时需要安装的插件就是 nerdtree-git-plugin,配置信息如下
let g:NERDTreeIndicatorMapCustom = {
    \ "Modified"  : "✹",
    \ "Staged"    : "✚",
    \ "Untracked" : "✭",
    \ "Renamed"   : "➜",
    \ "Unmerged"  : "═",
    \ "Deleted"   : "✖",
    \ "Dirty"     : "✗",
    \ "Clean"     : "✔︎",
    \ "Unknown"   : "?"
    \ }

" 显示行号
let NERDTreeShowLineNumbers=1
let NERDTreeAutoCenter=1

" 在终端启动vim时,共享NERDTree
let g:nerdtree_tabs_open_on_console_startup=1

使用NERDTree

F3:自定义启用/隐藏目录树
?: 快速帮助文档
o: 打开一个目录或者打开文件,创建的是buffer,也可以用来打开书签
go: 打开一个文件,但是光标仍然留在NERDTree,创建的是buffer
t: 打开一个文件,创建的是Tab,对书签同样生效
T: 打开一个文件,但是光标仍然留在NERDTree,创建的是Tab,对书签同样生效
i: 水平分割创建文件的窗口,创建的是buffer
gi: 水平分割创建文件的窗口,但是光标仍然留在NERDTree
s: 垂直分割创建文件的窗口,创建的是buffer
gs: 和gi,go类似
x: 收起当前打开的目录
X: 收起所有打开的目录
e: 以文件管理的方式打开选中的目录
D: 删除书签
P: 大写,跳转到当前根路径
p: 小写,跳转到光标所在的上一级路径
K: 跳转到第一个子路径
J: 跳转到最后一个子路径
<C-j>和<C-k>: 在同级目录和文件间移动,忽略子目录和子文件
C: 将根路径设置为光标所在的目录
u: 设置上级目录为根路径
U: 设置上级目录为跟路径,但是维持原来目录打开的状态
r: 刷新光标所在的目录
R: 刷新当前根路径
I: 显示或者不显示隐藏文件
f: 打开和关闭文件过滤器
q: 关闭NERDTree
A: 全屏显示NERDTree,或者关闭全屏

分割布局

安装插件

不用安装额外插件

配置插件

" 指定屏幕上可以进行分割布局的区域
set splitbelow               " 允许在下部分割布局
set splitright               " 允许在右侧分隔布局

" 组合快捷键:
nnoremap <C-J> <C-W><C-J>    " 组合快捷键:- Ctrl-j 切换到下方的分割窗口
nnoremap <C-K> <C-W><C-K>    " 组合快捷键:- Ctrl-k 切换到上方的分割窗口
nnoremap <C-L> <C-W><C-L>    " 组合快捷键:- Ctrl-l 切换到右侧的分割窗口
nnoremap <C-H> <C-W><C-H>    " 组合快捷键:- Ctrl-h 切换到左侧的分割窗口

nnoremap是什么意思?——简单来说,nnoremap将一个组合快捷键映射为另一个快捷键。no部分,指的是在Vim的正常模式(Normal Mode)下,
而不是可视模式下重新映射。更多信息请看[这里]
(https://stackoverflow.com/questions/3776117/what-is-the-difference-between-the-remap-noremap-nnoremap-and-vnoremap-mapping)

使用插件

  1. 使用:sv <filename>命令,新文件会在当前文件下方界面打开打开;使用相反的命令:vs <filename>, 新文件会在当前文件右侧界面打开;记得在输入完:sv后,利用tab补全功能,快速查找文件。

  2. 你还可以嵌套分割布局,所以你可以在分割布局内容再进行分割,纵向或横向都可以,直到你满意为止。众所周知,我们开发时经常需要同时查看多个文件

  3. 使用组合快捷键快速切换当前激活窗口

    • Ctrl-j 切换到下方的分割窗口
    • Ctrl-k 切换到上方的分割窗口
    • Ctrl-l 切换到右侧的分割窗口
    • Ctrl-h 切换到左侧的分割窗口
  4. 使用缓冲区,虽然Vim支持tab操作,仍有很多人更喜欢缓冲区和分割布局,你可以把缓冲区想象成最近打开的一个文件。:ls命令查看所有缓冲区,输入:b <filename or number>切换到一个已开启的缓冲区(可使用自动补全)。

:ls
1   a + "i.py"          line0
3   %a=+ "j.py"         line3
5   #a    "k.py"            line1

:b 1
:b k.py 

标签窗口——taglist

taglist是一个用于显示定位程序中各种符号的插件,例如宏定义、变量名、结构名、函数名这些东西 我们将其称之为符号(symbols),而在taglist中将其称之为tag。显然,要想将程序文件中的tag显示出来,需要事先了解全部tag的信息,并将其保存在一个文件中,然后去解析对应的tag文件。taglist做的仅仅是将tag文件中的内容解析完后显示在Vim上而已。tag扫描以及数 据文件的生成则是由ctags(Exuberant Ctags)这一工具完成的,所以在使用taglist之前,你的电脑需要装有ctags。

安装taglist

  • 安装Ctags

ctags用来遍历源代码文件内容生成tags文件,这些tags文件能被编辑器或其它工具用来快速查找定位源代码中的符号(tag/symbol),如变量名,函数名等。Macos自带了Ctags但是和这里要用的不是一个版本,默认的Ctags只支持少有的几种语言,我们需要安装的是Exuberant Ctags:

# 安装ctags-exuberant
brew install ctags-exuberant

# 创建软链接
ln -s /usr/local/Cellar/ctags/5.8_1/bin/ctags /usr/local/bin/ctags

# which ctags 显示/usr/local/bin/ctags则说明默认ctags是我们所安装的那个版本
which ctags 
  • 生成tags
ctags –R *

-R表示递归创建,也就包括源代码根目录(当前目录)下的所有子目录;*表示所有文件;这条命令会在当前目录下产生一个tags文件,当用户在当前目录中运行vi/vim时,会自动载入此tags文件。

Plugin 'taglist.vim'

配置taglist

let Tlist_Use_Right_Window = 1          "让taglist窗口出现在Vim的右边

let Tlist_File_Fold_Auto_Close = 1      "当同时显示多个文件中的tag时,设置为1,可使taglist只显示当前文件tag,其它文件的tag都被折叠起来。

let Tlist_Show_One_File = 1             "只显示一个文件中的tag,默认为显示多个

let Tlist_Sort_Type ='name'             "Tag的排序规则,以名字排序。默认是以在文件中出现的顺序排序

let Tlist_GainFocus_On_ToggleOpen = 1       "Taglist窗口打开时,立刻切换为有焦点状态

let Tlist_Exit_OnlyWindow = 1           "如果taglist窗口是最后一个窗口,则退出vim

let Tlist_WinWidth = 32             "设置窗体宽度为32,可以根据自己喜好设置

let Tlist_Ctags_Cmd='/usr/local/bin/ctags'  "这里比较重要了,设置ctags的位置,不是指向MacOS自带的那个,而是我们用homebrew安装的那个

map t :TlistToggle<CR>              "热键设置,我设置成Leader+t来呼出和关闭Taglist

使用taglist

  • 通过热键+t(,+t)或者:TlistToggle弹出/关闭标签窗口
  • 在标签窗口按F1可以打开以下帮助内容
  • o 在一个新打开的窗口中显示光标下tag
  • 显示光标下tag的原型定义
  • u 更新taglist窗口中的tag
  • s 更改排序方式,在按名字排序和按出现顺序排序间切换
  • x taglist窗口放大和缩小,方便查看较长的tag
  • 打开一个折叠,同zo
  • 将tag折叠起来,同zc
  • 打开所有的折叠,同zR
  • = 将所有tag折叠起来,同zM
  • [[ 跳到前一个文件
  • ]] 跳到后一个文件
  • q 关闭taglist窗口

python代码缩进

对于python来说,代码的正确缩进是至关重要的,我们将从以下几个方面为vim配置代码缩进功能:

  1. python代码的自动缩进
  2. 遵从PEP8代码风格标准
  3. 自动格式化为PEP8代码

安装插件

  • 自动缩进有用,但是在某些情况下(比如函数定义有多行的时候),并不总是会达到你想要的效果,尤其是在符合PEP8标准方面。我们可以利用indentpython.vim插件,来解决这个问题:
Plugin 'vim-scripts/indentpython.vim'
Plugin 'tell-k/vim-autopep8'
  • 要使用tell-k/vim-autopep8插件必须先在电脑上安装python的第三方包autopep8。但奇怪的是用pip安装时找不到这个包,我们使用easy-install来安装,只需要在m某个python环境下安装一次即可,实测在其他环境下也可用:
easy_install autopep8

配置插件

对于Python代码而言,必须要支持PEP8风格的缩进,所以,需要在.vimrc文件中添加下面的配置。这些设置将让Vim中的Tab键就相当于4个标准的空格符,确保每行代码长度不超过80个字符,并且会以unix格式储存文件,避免在推送到Github或分享给其他用户时出现文件转换问题。

" 按照PEP8标准来配置vim
au BufNewFile,BufRead *.py set tabstop=4 |set softtabstop=4|set shiftwidth=4|set textwidth=79|set expandtab|set autoindent|set fileformat=unix

另外,对于全栈开发,你可以设置针对每种文件类型设置au命令:

au BufNewFile,BufRead *.js, *.html, *.css set tabstop=2|set softtabstop=2|set shiftwidth=2

下面来配置vim-autopep8

" Disable show diff window
let g:autopep8_disable_show_diff=1

" vim-autopep8自1.11版本之后取消了F8快捷键,需要用户自己为:Autopep8设置快捷键:
autocmd FileType python noremap <buffer> <F8> :call Autopep8()<CR>

使用插件

在使用macvim编辑*.py文件时:

  • 代码自动按照PEP8规则进行缩进;
  • tap键相当于4个标准空格,每行代码不超过80字符;
  • 使用:Autopep8命令或者F8快捷键自动按照PEP8标准格式化python代码

在使用macvim编辑*.js, *.html, *.css文件时,tap键相当于2个标准空格

添加代码缩进指示线

安装indentline

indentLine是一款缩进指示线,由纯字符实现,效果比较完美

Plugin 'Yggdroot/indentLine'

配置indentline

indentLine默认是关闭的,因此需要在.vimrc中配置才能看到效果:

" 支持任意ASCII码,也可以使用特殊字符:¦, ┆, or │ ,但只在utf-8编码下有效
let g:indentLine_char='¦'   

" 使indentline生效
let g:indentLine_enabled = 1    

使用indentline

在代码缩进处,自动生成缩进指示线

代码折叠

大多数“现代”集成开发环境(IDE)都提供对方法(methods)或类(classes)进行折叠的手段,只显示类或方法的定义部分,而不是全部的代码。

安装插件

本身不用安装额外插件,但为避免出现超过你所希望的折叠数目,我们推荐SimplyFold来解决这个问题:

Plugin 'tmhedberg/SimpylFold'

配置插件

" 必须手动输入za来折叠(和取消折叠)
set foldmethod=indent                " 根据每行的缩进开启折叠
set foldlevel=99

" 使用空格键会是更好的选择,所以在你的配置文件中加上这一行命令吧:
nnoremap <space> za

" 希望看到折叠代码的文档字符串?
let g:SimpylFold_docstring_preview=1

使用插件

在程序块处会显示折叠线,当光标放于折叠线时,按空格键可以切换在该折叠线处是否折叠。

代码补全——YouCompleteMe

杀手级插件YouCompleteMe——vim上的自动补全神器:

  • 适用于任何语言,不同语言配置只有少许差异;
  • 多种补全引擎,既可以根据标识符也可以根据语义进行补全;
  • 能够提供类似IDE的自动补全体验,不用按任何键,在写代码的同时会自动弹出代码提示;
  • 还能和Syntastic配合提供实时语法检查;
  • 不同于以往其他vim插件,YCM是一款编译型的插件.在下载完后,需要手动编译后才能使用;

安装YCM

先决条件:

  1. 最新版本的macvim,并且版本支持python2或python3
brew upgrade macvim

在 macvim 中键入命令 :echo has('python') || has('python3'),若结果是 1 则证明是支持的,或者在macvim中输入:version,查看版本支持情况。

  1. 安装Cmake
brew install cmake
  1. 如果需要安装带 C-family languages 语义支持的YCM版本,需要将Xcode升级到最新版本,同时安装最新的命令行工具,同时还需要下载最新版的libclang,详情见YCM官方教程,这里我们安装的是不带 C-family languages 语义支持的版本。

安装YouCompleteMe:

# 官方推荐使用Vundle安装,只需将下面命令加入到~/.vimrc
Plugin 'Valloric/YouCompleteMe'

# 如果`:PluginInstall`过程出错,则退出重新尝试,或者直接从git上下载到`~/.vim/bundle/YouCompleteMe` 目录下
git clone https://github.com/Valloric/YouCompleteMe#full-installation-guide ~/.vim/bundle/YouCompleteMe

编译YCM

cd ~/.vim/bundle/YouCompleteMe

# 不带 C-family languages 语义支持的版本
./install.sh

# 带 C-family languages 语义支持的版本
./install.sh --clang-completer

# 带 C# 语义支持的版本
./install.sh --omnisharp-completer

# 带 Go 语言语义支持的版本
./install.sh --gocode-completer

配置YCM

" 补全菜单的开启与关闭
set completeopt=longest,menu                    " 让Vim的补全菜单行为与一般IDE一致(参考VimTip1228)
let g:ycm_min_num_of_chars_for_completion=2             " 从第2个键入字符就开始罗列匹配项
let g:ycm_cache_omnifunc=0                      " 禁止缓存匹配项,每次都重新生成匹配项
let g:ycm_autoclose_preview_window_after_completion=1       " 智能关闭自动补全窗口
autocmd InsertLeave * if pumvisible() == 0|pclose|endif         " 离开插入模式后自动关闭预览窗口

" 补全菜单中各项之间进行切换和选取:默认使用tab  s-tab进行上下切换,使用空格选取。可进行自定义设置:
"let g:ycm_key_list_select_completion=['<c-n>']
"let g:ycm_key_list_select_completion = ['<Down>']      " 通过上下键在补全菜单中进行切换
"let g:ycm_key_list_previous_completion=['<c-p>']
"let g:ycm_key_list_previous_completion = ['<Up>']
inoremap <expr> <CR>       pumvisible() ? "\<C-y>" : "\<CR>"    " 回车即选中补全菜单中的当前项

" 开启各种补全引擎
let g:ycm_collect_identifiers_from_tags_files=1         " 开启 YCM 基于标签引擎
let g:ycm_auto_trigger = 1                  " 开启 YCM 基于标识符补全,默认为1
let g:ycm_seed_identifiers_with_syntax=1                " 开启 YCM 基于语法关键字补全
let g:ycm_complete_in_comments = 1              " 在注释输入中也能补全
let g:ycm_complete_in_strings = 1               " 在字符串输入中也能补全
let g:ycm_collect_identifiers_from_comments_and_strings = 0 " 注释和字符串中的文字也会被收入补全

" 重映射快捷键
"上下左右键的行为 会显示其他信息,inoremap由i 插入模式和noremap不重映射组成,只映射一层,不会映射到映射的映射
inoremap <expr> <Down>     pumvisible() ? "\<C-n>" : "\<Down>"
inoremap <expr> <Up>       pumvisible() ? "\<C-p>" : "\<Up>"
inoremap <expr> <PageDown> pumvisible() ? "\<PageDown>\<C-p>\<C-n>" : "\<PageDown>"
inoremap <expr> <PageUp>   pumvisible() ? "\<PageUp>\<C-p>\<C-n>" : "\<PageUp>"

"nnoremap <F5> :YcmForceCompileAndDiagnostics<CR>           " force recomile with syntastic
"nnoremap <leader>lo :lopen<CR>    "open locationlist
"nnoremap <leader>lc :lclose<CR>    "close locationlist
"inoremap <leader><leader> <C-x><C-o>

nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR> " 跳转到定义处
let g:ycm_confirm_extra_conf=0                  " 关闭加载.ycm_extra_conf.py确认提示

使用YCM

  • 编辑文本时,自动弹出补全菜单,通过tab和shift+tab键上下切换选项,enter或空格进行选取。
  • 支持基于标识符、语义的补全,在注释和字符串中进行补全
  • 多语言支持,不仅仅是python,也包括其他非C族语言的补全

括号自动补全

auto-pairs主要功能是括号和引号自动补全,输入左引号和左括号自动补全另外一半,安装好就可以无需额外配置

Plugin 'jiangmiao/auto-pairs'

多行注释

安装插件

Plugin 'scrooloose/nerdcommenter'

配置插件

" nerdcommenter默认热键<leader>为'\',这里将热键设置为','
let mapleader=','

" 设置注释快捷键
map <F4> <leader>ci<CR>

使用插件

在normal模式下按v并移动光标选择需要注释的行,再按F4就可以为所有选中的行添加注释

执行python

其他常用的编辑器都有很方便的一键执行的功能或插件,例如Sublime Text的command+b、Atom的script插件。

vim实现这个功能只需要在.vimrc中添加如下代码就可以实现F6一键执行python代码,而且由于是调用了vim的quickfix功能,因此还支持如果出现错误,跳转到错误行。

map <F6> <ESC>:Autopep8<CR>:w<CR>:call RunPython()<CR>

function! RunPython()
  let mp = &makeprg
  let ef = &errorformat
  let exeFile = expand("%:t")
  setlocal makeprg=python\ -u
  set efm=%C\ %.%#,%A\ \ File\ \"%f\"\\,\ line\ %l%.%#,%Z%[%^\ ]%\\@=%m
  silent make %
  copen
  let &makeprg = mp
  let &errorformat = ef
endfunction

映射快捷键F6,将自动执行以下操作:切换至nomal模式>>执行Autopep8规范代码格式>>保存当前文件>>调用Runpython自定义函数,Runpython自动选取当前环境下的python解释器。

配色方案

安装配色方案

Vundle将配色方案也作为插件来管理,因此只需要在这里找到你喜欢的配色方案,然后按照普通插件的安装方法进行安装即可,例如:

Plugin 'jakwings/vim-colors'

配置配色方案
vim的背景自动检测是相当不错的,至少在MacVim,不用做过多配置,使用默认配置就能获取很好的效果;只需要将colorscheme your-theme添加到配置文件就行了,vim每次(everytime)打开时会选取的你所设置的配色方案。

" 推荐几种配色,使用哪种只需将其取消注释即可

" 经典的solarized
colorscheme solarized               " 白色背景

" Tomorrow系列
"colorscheme Tomorrow               " 白色背景
"colorscheme Tomorrow-Night         " 黑色背景,序号看不清
"colorscheme Tomorrow-Night-Bright      " 黑色背景,高对比度,最清晰
"colorscheme Tomorrow-Night-Eighties        " 黑色背景,低对比度

" 其他
"colorscheme desert
"colorscheme molokai
"colorscheme pablo
"colorscheme phd
"colorscheme pablo
"colorscheme slate

使用配色方案

打开vim,:colorscheme your-theme, 即可临时(only-once)切换至相应配色方案;

:colorscheme按住空格+tab键来切换配色方案

美化状态栏——powerline

安装插件

首先准备工作:

  • 在电脑上安装powerline-status
安装powerline-status
pip install powerline-status

# 查看是否已安装成功
pip show powerline-status
  • 下载powerline字体solarized配色,解压后找到vim-colors-solarized文件夹复制到~/.vim/bundle目录下,或者简单地添加如下命令:
Plugin 'vim-colors-solarized'

安装vim-powerline插件:

Plugin 'vim-powerline'

配置插件

注意将字体换做powerline系列的,否则状态栏可能出现乱码。

" 将字体设置为Meslo LG S DZ Regular for Powerline 13号大小
set guifont=Meslo\ LG\ S\ DZ\ Regular\ for\ Powerline:h13

let g:Powerline_symbols = 'fancy'       " Powerline_symbols为状态栏中的箭头,unicode没有箭头
"let g:Powerline_symbols= 'unicode'

set laststatus=2                " 必须设置为2,否则状态栏不显示
set t_Co=256                    " 开启256颜色之后,colorschema在vim里好看了许多
let g:Powerline_colorscheme='solarized256'  " 状态栏使用了solarized256配色方案

"set fillchars+=stl:\ ,stlnc:\          " 状态栏如果有\\\\\或^^^^^等符号出现,添加此句再删掉此句就好了

关于Vimscript

Vim有其脚本语言Vimscript,使用Vimscript写成的宏可以实现自动执行复杂的操作。用 -s选项启动Vim,或者直接切换到宏所在目录使用':source'命令都可以执行Vim脚本。Vim的配置文件就可以作为Vim脚本的一个范例,Unix和Linux下配置文件名是.vimrc,Windows下配置文件一般叫做_vimrc。这个文件在启动Vim的时候被自动执行。Vimscript可以使用Vim 命令行模式的所有命令,使用':normal'命令还可以使用通常模式中的所有命令。Vimscript具有数字,字符串两种数据类型。用数字代表布尔类型,0代表假,之外的数全代表真。最新的Vim 7更提供了列表、关联数组等高级数据结构。Vimscript也拥有各种比较运算符和算术运算符。控制结构实现了if分支和for/while循环。用户还可以自己定义函数,并且可以使用超过100种的预定义函数。编写成的脚本文件可以在调试模式中进行调试。

关于Vimscript的详细介绍可以参考笨方法学Vimscript

由于配置文件过长就不贴出了!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容