超级强大的 vim 配置(vimplus)

From : http://www.cnblogs.com/highway-9/p/5984285.html
From : http://www.cnblogs.com/ma6174/archive/2011/12/10/2283393.html
From : http://www.cnblogs.com/youxia/p/linux002.html
From : http://blog.csdn.net/namecyf/article/details/7787479

最近在重新配置Vim,也在GitHub上找了三个star和fork数目很高的方案,在这里分享给大家:

前言

vim 和 emacs 是 linux 环境下的文本编辑利器,关于 vim 和 emacs 谁更优秀的话题从来没有断过,我在这里就不再评判了,vim 是 linux 下的默认编辑器,学好了 vim 将会一生受用,我之前学 vim 是在网上找的一些资料,读博客之类的,使用了几年vim 始终感觉没有什么大的进步,后来在 vim 官网看到 vim 书籍推荐,其中一本就是《vim实用技巧》,后来果断在京东上买了一本,除了宏相关的没怎么看以外,其他的都看了,加上自己的实际操作,感觉 vim 技术又上了一个层次,《vim实用技巧》是教会 vimer 怎么使用 vim,使用 vim 写代码时,给 vim 装上一些插件,将会如虎添翼,后来我在网上找一些插件来安装,或者在 github 上搜索别人的 vimrc,看别人装了什么插件,自己选择性的安装了一些,使用一段时间后感觉使用 vim 编辑代码就是一件非常愉快的事情,再加上我最近买的忍者二代机械键盘那简直写代码很带感啊,我最开始自己家的电脑上给vim装了很多插件,后来在公司又要重新搭建vim开发环境,感觉有点麻烦,后来又想有没有什么一键安装、部署之类的小程序,就可以傻瓜式的把开发环境给搭建起来不是很爽吗,vimplus就运运而生了,如果喜欢的朋友请不要吝啬,给个star,废话不多说,直接上安装步骤(个人博客也发表了《超级强大的vim配置(vimplus)》)。

超级强大的vim配置(vimplus)--续集:https://www.cnblogs.com/highway-9/p/5984285.html

之前,为了解决一个语法加亮的问题更改了 vimrc,之后,突然发现鼠标可以使用了,点到那里光标就定位到那里,但是随后发现 ctrl+shift+c 不能用了,鼠标右键复制选项也是灰的。到网上,搜了一下,发现是 set mouse=a 这句话的问题,这个是用来开启鼠标功能的。a表示所有模式

vi 的三种模式:

  1. 命令模式
  2. 插入模式
  3. 可视模式

鼠标可以启动于各种模式中(The mouse can be enabled for different modes):

  1. n Normal mode
  2. v Visual mode
  3. i Insert mode
  4. c Command-line mode
  5. h all previous modes when editing a help file
  6. a all previous modes
  7. r for |hit-enter| and |more-prompt| prompt

Normally you would enable the mouse in all four modes with:
:set mouse=a
When the mouse is not enabled, the GUI will still use the mouse for
modeless selection. This doesn't move the text cursor.

所以配置文件中的 set mouse=a 启动了所有模式,这样就屏蔽了鼠标右健功能。

这里我设置为 set mouse=v 在可视模式下使用鼠标,然后搞定。但是,这样,其他模式就无法使用鼠标定位了,有点不爽。莫非鱼和熊掌不能兼得??又到网上找了下,发现确实这样,不过却另有所获:无须更改 set mouse=a ,用鼠标选中,按y键复制,然后点击要粘贴的地方使用鼠标中键粘贴!!!支持夸文件粘贴,比使用命令方便多了

vimplus

vimplus 是 vim 的超级配置安装程序 

github地址:https://github.com/chxuan/vimplus.git,欢迎star和fork。

接触 vim 到现在也有几年了,但是之前用 vim 都是在网上找别人配置好了的 vim,但是别人配置的始终都不能够满足自己的需求(自己需要有强大的 C/C++ 代码提示补全功能、头文件/源文件切换、静态代码分析等功能),所以最近自己有时间,自己归纳了一些vim的插件,然后做成一键安装程序,供有相同需求的vimer们参考。

安装配置(Ubuntu、Centos)

git clone https://github.com/chxuan/vimplus.git
cd ./vimplus
sudo ./install.sh

现在 vimplus 支持 ubuntu14.04 之后的所有 ubuntu 64 位系列以及 centos7 64 位,运行 install.sh 脚本,你就可以一边喝咖啡,一遍看着屏幕刷刷刷的打印就安装部署好了开发环境了,整个过程大约持续40分钟,其中下载编译 ycm 耗费了大半时间,我有下载好了的 YouCompleteMe.tar.gz,省得在github上去下载,很慢的,你懂的,若想要手动安装ycm,需要修改vimplus目录下的.vimrc文件。

Plugin 'Valloric/MatchTagAlways'
#Plugin 'Valloric/YouCompleteMe'
Plugin 'docunext/closetag.vim'

将 ycm 插件那行注释掉,不然还会再去下载 ycm,ycm 可以最后等 vimplus 执行完成后再安装~~,接下来需要手动编译 ycm。

cd ~
mv YouCompleteMe.tar.gz ~/.vim/bundle/
cd ~/.vim/bundle/
tar -xvf YouCompleteMe.tar.gz
cd YouCompleteMe
./install.py --clang-completer

vimplus 将自动安装一些软件,比如说。

  • vim
  • g++
  • ctags
  • cmake
  • python2
  • python3

插件列表

插件说明
cpp-mode提供生成函数实现、函数声明/实现跳转、.h .cpp切换等功能(I'm author😄)
vim-edit方便的文本编辑插件(I'm author😄)
change-colorscheme随心所欲切换主题(I'm author😄)
prepare-code新建文件时,生成预定义代码片段(I'm author😄)
vim-buffervim缓存操作(I'm author😄)
vimplus-startifyvimplus开始页面(修改自mhinz/vim-startify)
tagbar使用majutsushi/tagbar的v2.3版本,taglist的替代品,显示类/方法/变量
vim-plugVundle下载更快的插件管理软件
YouCompleteMe史上最强大的基于语义的自动补全插件,支持C/C++、C#、Python、PHP等语言
NerdTree代码资源管理器
vim-nerdtree-syntax-highlightNerdTree文件类型高亮
nerdtree-git-pluginNerdTree显示git状态
vim-devicons显示文件类型图标
Airline可以取代powerline的状态栏美化插件
auto-pairs自动补全引号、圆括号、花括号等
LeaderFctrlp更强大的文件的模糊搜索工具
ack强大的文本搜索工具
vim-surround自动增加、替换配对符的插件
vim-commentary快速注释代码插件
vim-repeat重复上一次操作
vim-endwiseif/end/endif/endfunction补全
tabular代码、注释、表格对齐
vim-easymotion强大的光标快速移动工具,强大到颠覆你的插件观
incsearch.vim模糊字符搜索插件
markdown-previewmarkdown实时预览
vim-fugitive集成Git
gv显示git提交记录
vim-slash优化搜索,移动光标后清除高亮
echodoc补全函数时在命令栏显示函数签名
vim-smooth-scroll让翻页更顺畅
clever-f.vim强化f和F键
github-complete.vimEmoji🐶补全
vimcdocvim中文文档

安装的插件我也部分列出来。

配置 YouCompleteMe

到这一步,安装已经完成,你会发现~目录有两个文件,一个是vim的配置文件.vimrc,一个是 YouCompleteMe 的配置文件[.ycm_extra_conf.py][25],一般来说建立一个main.cpp来写C、C++程序来说是没有问题的,都会有语法补全,当你需要写一些项目并涉及到第三方库时,就需要更改[.ycm_extra_conf.py][26]了,具体步骤如下。

  1. 将 .ycm_extra_conf.py 拷贝的项目的根目录。
  2. 更改 .ycm_extra_conf.py 里面的 flags 变量,添加三方库路径和工程子目录路径。

使用 vim-devicons

桌面版linux使用vim-devicons插件会出现乱码,需要设置终端字体为Droid Sans Mono for Powerline Nerd Font Complete,使用 xshell 等工具连接服务器 linux 的用户就没有必要使用 vim-devicons 了,可以在插件目录将 vim-devicons 目录删除,不然会导致 NerdTree 的缩进有问题。

快捷键

vim的插件需要设置好了快捷键才会发挥它的威力,有些插件的快捷键可以查看各自官网,有些快捷键我自己改过的,下面罗列部分插件的快捷键。

  • 显示目录树 <F3>
  • 显示函数、变量、宏定义等 <F4>
  • 显示静态代码分析结果 <F5>
  • .h .cpp 文件快速切换 <F2>
  • 转到申明 <, + u>
  • 转到定义 <, + i>
  • 打开包含文件 <, + o>
  • Buffer切换 <Ctrl + P/Ctrl + N>
  • 光标位置切换 <Ctrl + O/Ctrl + I>
  • 模糊搜索文件 <Ctrl + f>
  • Surround <ys{motion or text-object}{char}/cs{orig_char}{dest_char}/ds{char}>
  • 注释 <gcc/gcap/gc/,ca/,cA>
  • DirDiff :DirDiff <dir1> <dir2>
  • 重复 .
  • 改变主题 <F10/F9>

下面这幅图是借用Valloric/YouCompleteMe来展示强大的C++补全功能 

文件搜索

ctrlp 提供文件搜索,支持模糊查询。

vim-airline

vim-airline提供漂亮的状态栏支持。

vim-surround

vim-commentary

auto-pairs

incsearch.vim

vim-devicons

vim-coloresque

vim-dirdiff

vim-startify

Change the colorscheme

安装完成后

运行 setup.sh 脚本程序一键安装完成后,HOME 目录将会存在.ycm_extra_conf.py,该文件就是YCM实现C++等语言语法补全功能的配置文件,一般我会在HOME目录放一个,然后每一个项目拷贝一个.ycm_extra_conf.py,更改.ycm_extra_conf.py文件里面的 flags 变量的值即可实现相关include文件的语法补全功能。

注意事项

  • 1. 如果网络条件不好可能安装失败,基本上是 Valloric/YouCompleteMe 安装失败,安装失败后需要将 ~/.vim/bundle文件夹下的YouCompleteMe目录删除,然后重新执行 setup.sh 即可,重新安装时,程序将自动安装安装失败的插件。
  • 2. 在 ubuntu16.04 LTS 下安装可能会失败(Valloric/YouCompleteMe安装失败),因为 vim 默认支持 python3 进行插件编译,安装失败后,手动进入~/.vim/bundle/YouCompleteMe,然后运行 python3 ./install.py --clang-completer 即可。

强大的 vim 配置文件,让编程更随意

花了很长时间整理的,感觉用起来很方便,共享一下。

我的 vim 配置主要有以下优点:

  • 1. 按F5可以直接编译并执行C、C++、java代码以及执行shell脚本,按“F8”可进行C、C++代码的调试
  • 2. 自动插入文件头 ,新建C、C++源文件时自动插入表头:包括文件名、作者、联系方式、建立时间等,读者可根据需求自行更改
  • 3. 映射“Ctrl + A”为全选并复制快捷键,方便复制代码
  • 4. 按“F2”可以直接消除代码中的空行
  • 5. “F3”可列出当前目录文件,打开树状文件目录
  • 6. 支持鼠标选择、方向键移动
  • 7. 代码高亮,自动缩进,显示行号,显示状态行
  • 8. 按“Ctrl + P”可自动补全
  • 9. []、{}、()、""、' '等都自动补全
  • 10. 其他功能读者可以研究以下文件

vim 本来就是很强大,很方便的编辑器,加上我的代码后肯定会如虎添翼,或许读者使用其他编程语言,
可以根据自己的需要进行修改,配置文件里面已经加上注释。
读者感兴趣的话直接复制下面的代码到文本文件,然后把文件改名为“ .vimrc” (不要忘记前面的“.”),然后把文件放到用户文件夹的根目录下面即可。重新打开vim即可看到效果。

为方便管理,源码托管到了github,后期增加了好多新功能,

具体详见:https://github.com/ma6174/vim

这是在github上的vim配置的截图:

下面是精简的,没有插件的vim配置文件,保存到自己的.vimrc文件就能使用。

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 显示相关  
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"set shortmess=atI   " 启动的时候不显示那个援助乌干达儿童的提示  
"winpos 5 5          " 设定窗口位置  
"set lines=40 columns=155    " 设定窗口大小  
"set nu              " 显示行号  
set go=             " 不要图形按钮  
"color asmanian2     " 设置背景主题  
set guifont=Courier_New:h10:cANSI   " 设置字体  
"syntax on           " 语法高亮  
autocmd InsertLeave * se nocul  " 用浅色高亮当前行  
autocmd InsertEnter * se cul    " 用浅色高亮当前行  
"set ruler           " 显示标尺  
set showcmd         " 输入的命令显示出来,看的清楚些  
"set cmdheight=1     " 命令行(在状态行下)的高度,设置为1  
"set whichwrap+=<,>,h,l   " 允许backspace和光标键跨越行边界(不建议)  
"set scrolloff=3     " 光标移动到buffer的顶部和底部时保持3行距离  
set novisualbell    " 不要闪烁(不明白)  
set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}   "状态行显示的内容  
set laststatus=1    " 启动显示状态行(1),总是显示状态行(2)  
set foldenable      " 允许折叠  
set foldmethod=manual   " 手动折叠  
"set background=dark "背景使用黑色 
set nocompatible  "去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限  

" 显示中文帮助
if version >= 603
    set helplang=cn
    set encoding=utf-8
endif

" 设置配色方案
"colorscheme murphy

"字体 
"if (has("gui_running")) 
"   set guifont=Bitstream\ Vera\ Sans\ Mono\ 10 
"endif 

set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
set termencoding=utf-8
set encoding=utf-8
set fileencodings=ucs-bom,utf-8,cp936
set fileencoding=utf-8

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""新文件标题""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"新建.c,.h,.sh,.java文件,自动插入文件头 
autocmd BufNewFile *.cpp,*.[ch],*.sh,*.java exec ":call SetTitle()" 
""定义函数SetTitle,自动插入文件头 
func SetTitle() 
    "如果文件类型为.sh文件 
    if &filetype == 'sh' 
        call setline(1,"\#########################################################################") 
        call append(line("."), "\# File Name: ".expand("%")) 
        call append(line(".")+1, "\# Author: ma6174") 
        call append(line(".")+2, "\# mail: ma6174@163.com") 
        call append(line(".")+3, "\# Created Time: ".strftime("%c")) 
        call append(line(".")+4, "\#########################################################################") 
        call append(line(".")+5, "\#!/bin/bash") 
        call append(line(".")+6, "") 
    else 
        call setline(1, "/*************************************************************************") 
        call append(line("."), "    > File Name: ".expand("%")) 
        call append(line(".")+1, "    > Author: ma6174") 
        call append(line(".")+2, "    > Mail: ma6174@163.com ") 
        call append(line(".")+3, "    > Created Time: ".strftime("%c")) 
        call append(line(".")+4, " ************************************************************************/") 
        call append(line(".")+5, "")
    endif

    if &filetype == 'cpp'
        call append(line(".")+6, "#include<iostream>")
        call append(line(".")+7, "using namespace std;")
        call append(line(".")+8, "")
    endif

    if &filetype == 'c'
        call append(line(".")+6, "#include<stdio.h>")
        call append(line(".")+7, "")
    endif

    "新建文件后,自动定位到文件末尾
    autocmd BufNewFile * normal G
endfunc 

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"键盘命令
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
nmap <leader>w :w!<cr>
nmap <leader>f :find<cr>
" 映射全选+复制 ctrl+a
map <C-A> ggVGY
map! <C-A> <Esc>ggVGY
map <F12> gg=G
" 选中状态下 Ctrl+c 复制
vmap <C-c> "+y

"去空行  
nnoremap <F2> :g/^\s*$/d<CR> 

"比较文件  
nnoremap <C-F2> :vert diffsplit 

"新建标签  
map <M-F2> :tabnew<CR>  

"列出当前目录文件  
map <F3> :tabnew .<CR>  

"打开树状文件目录  
map <C-F3> \be  
"C,C++ 按F5编译运行
map <F5> :call CompileRunGcc()<CR>
func! CompileRunGcc()
    exec "w"
    if &filetype == 'c'
        exec "!g++ % -o %<"
        exec "! ./%<"
    elseif &filetype == 'cpp'
        exec "!g++ % -o %<"
        exec "! ./%<"
    elseif &filetype == 'java' 
        exec "!javac %" 
        exec "!java %<"
    elseif &filetype == 'sh'
        :!./%
    endif
endfunc

"C,C++的调试
map <F8> :call Rungdb()<CR>
func! Rungdb()
    exec "w"
    exec "!g++ % -g -o %<"
    exec "!gdb ./%<"
endfunc

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
""实用设置
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

" 设置当文件被改动时自动载入
set autoread
" quickfix模式
autocmd FileType c,cpp map <buffer> <leader><space> :w<cr>:make<cr>

"代码补全 
set completeopt=preview,menu 

"允许插件  
filetype plugin on

"共享剪贴板  
set clipboard+=unnamed 

"从不备份  
set nobackup

"make 运行
:set makeprg=g++\ -Wall\ \ %

"自动保存

set autowrite
set ruler                   " 打开状态栏标尺
set cursorline              " 突出显示当前行
set magic                   " 设置魔术
set guioptions-=T           " 隐藏工具栏
set guioptions-=m           " 隐藏菜单栏
"set statusline=\ %<%F[%1*%M%*%n%R%H]%=\ %y\ %0(%{&fileformat}\ %{&encoding}\ %c:%l/%L%)\

" 设置在状态行显示的信息
set foldcolumn=0
set foldmethod=indent 
set foldlevel=3 
set foldenable              " 开始折叠

" 不要使用vi的键盘模式,而是vim自己的
set nocompatible

" 语法高亮
set syntax=on

" 去掉输入错误的提示声音
set noeb

" 在处理未保存或只读文件的时候,弹出确认
set confirm

" 自动缩进
set autoindent
set cindent

" Tab键的宽度
set tabstop=4

" 统一缩进为4
set softtabstop=4
set shiftwidth=4

" 不要用空格代替制表符
set noexpandtab

" 在行和段开始处使用制表符
set smarttab

" 显示行号
set number

" 历史记录数
set history=1000

"禁止生成临时文件
set nobackup
set noswapfile

"搜索忽略大小写
set ignorecase

"搜索逐字符高亮
set hlsearch
set incsearch

"行内替换
set gdefault

"编码设置
set enc=utf-8
set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936

"语言设置
set langmenu=zh_CN.UTF-8
set helplang=cn

" 我的状态行显示的内容(包括文件类型和解码)
"set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}
"set statusline=[%F]%y%r%m%*%=[Line:%l/%L,Column:%c][%p%%]

" 总是显示状态行
set laststatus=2

" 命令行(在状态行下)的高度,默认为1,这里是2
set cmdheight=2

" 侦测文件类型
filetype on

" 载入文件类型插件
filetype plugin on

" 为特定文件类型载入相关缩进文件
filetype indent on

" 保存全局变量
set viminfo+=!

" 带有如下符号的单词不要被换行分割
set iskeyword+=_,$,@,%,#,-

" 字符间插入的像素行数目
set linespace=0

" 增强模式中的命令行自动完成操作
set wildmenu

" 使回格键(backspace)正常处理indent, eol, start等
set backspace=2

" 允许backspace和光标键跨越行边界
set whichwrap+=<,>,h,l

" 可以在buffer的任何地方使用鼠标(类似office中在工作区双击鼠标定位)
set mouse=a
set selection=exclusive
set selectmode=mouse,key

" 通过使用: commands命令,告诉我们文件的哪一行被改变过
set report=0

" 在被分割的窗口间显示空白,便于阅读
set fillchars=vert:\ ,stl:\ ,stlnc:\

" 高亮显示匹配的括号
set showmatch

" 匹配括号高亮的时间(单位是十分之一秒)
set matchtime=1

" 光标移动到buffer的顶部和底部时保持3行距离
set scrolloff=3

" 为C程序提供自动缩进
set smartindent

" 高亮显示普通txt文件(需要txt.vim脚本)
au BufRead,BufNewFile *  setfiletype txt

"自动补全
:inoremap ( ()<ESC>i
:inoremap ) <c-r>=ClosePair(')')<CR>
:inoremap { {<CR>}<ESC>O
:inoremap } <c-r>=ClosePair('}')<CR>
:inoremap [ []<ESC>i
:inoremap ] <c-r>=ClosePair(']')<CR>
:inoremap " ""<ESC>i
:inoremap ' ''<ESC>i
function! ClosePair(char)
    if getline('.')[col('.') - 1] == a:char
        return "\<Right>"
    else
        return a:char
    endif
endfunction
filetype plugin indent on 

"打开文件类型检测, 加了这句才可以用智能补全
set completeopt=longest,menu

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" CTags的设定  
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
let Tlist_Sort_Type = "name"    " 按照名称排序  
let Tlist_Use_Right_Window = 1  " 在右侧显示窗口  
let Tlist_Compart_Format = 1    " 压缩方式  
let Tlist_Exist_OnlyWindow = 1  " 如果只有一个buffer,kill窗口也kill掉buffer  
let Tlist_File_Fold_Auto_Close = 0  " 不要关闭其他文件的tags  
let Tlist_Enable_Fold_Column = 0    " 不要显示折叠树  
autocmd FileType java set tags+=D:\tools\java\tags  
"autocmd FileType h,cpp,cc,c set tags+=D:\tools\cpp\tags  
"let Tlist_Show_One_File=1            "不同时显示多个文件的tag,只显示当前文件的

"设置tags  
set tags=tags  
"set autochdir 

""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"其他东东
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

"默认打开Taglist 
let Tlist_Auto_Open=1 

"""""""""""""""""""""""""""""" 
" Tag list (ctags) 
"""""""""""""""""""""""""""""""" 
let Tlist_Ctags_Cmd = '/usr/bin/ctags' 
let Tlist_Show_One_File = 1 "不同时显示多个文件的tag,只显示当前文件的 
let Tlist_Exit_OnlyWindow = 1 "如果taglist窗口是最后一个窗口,则退出vim 
let Tlist_Use_Right_Window = 1 "在右侧窗口中显示taglist窗口

" minibufexpl插件的一般设置
let g:miniBufExplMapWindowNavVim = 1
let g:miniBufExplMapWindowNavArrows = 1
let g:miniBufExplMapCTabSwitchBufs = 1
let g:miniBufExplModSelTarget = 1

vim 配置插件的安装管理(超级详细)

查看:https://blog.csdn.net/u013630349/article/details/74279038

vim 简单 配置

在命令行下,输入命令:sudo vim /etc/vim/vimrc。会影响所有用户
在命令行下,输入命令:sudo ~/vimrc。只影响当前用户

syntax on          "语法高亮
set nu             "在左侧行号
set tabstop        "tab 长度设置为 4
set nobackup     "覆盖文件时不备份
set cursorline     "突出显示当前行
set ruler            "在右下角显示光标位置的状态行
set autoindent        "自动缩进

vim 使用

配置的基本

首先, 我们建立目录存放我们的主题

mkdir -p  ~/.vim/colors

这个目录就是给我们存放主题用的, 我们用什么主题呢? 这里我们采用 molokai 这个主题, 当然如果读者愿意用别的主题,
也是可以的, 下一个就行.

http://www.vim.org/scripts/script.php?script_id=2340下载molokai主题, 拷贝到~/.vim/colors目录下, 创建.vimrc文件.

touch ~/.vimrc

将下面的内容拷贝到.vimrc中.

set modelines=0

"设置更好的删除
set backspace=2

syntax on "语法高亮

"用浅色高亮当前行
autocmd InsertLeave * se nocul
autocmd InsertEnter * se cul

set smartindent "智能对齐

set autoindent "自动对齐

set confirm "在处理未保存或只读文件的时候,弹出确认框

set tabstop=4 "tab键的宽度
set softtabstop=4
set shiftwidth=4 "统一缩进为4
set expandtab "不要用空格替代制表符

set number "显示行号
set history=50  "历史纪录数
set hlsearch
set incsearch "搜素高亮,搜索逐渐高亮

set gdefault "行内替换
set encoding=utf-8
set fileencodings=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936,utf-16,big5,euc-jp,latin1 "编码设置

colorscheme molokai

set guifont=Menlo:h16:cANSI "设置字体
set langmenu=zn_CN.UTF-8
set helplang=cn  "语言设置

set ruler "在编辑过程中,在右下角显示光标位置的状态行

set laststatus=1  "总是显示状态行

set showcmd "在状态行显示目前所执行的命令,未完成的指令片段也会显示出来

set scrolloff=3 "光标移动到buffer的顶部和底部时保持3行的距离
set showmatch "高亮显示对应的括号
set matchtime=5 "对应括号高亮时间(单位是十分之一秒)

set autowrite "在切换buffer时自动保存当前文件

set wildmenu  "增强模式中的命令行自动完成操作

set linespace=2 "字符间插入的像素行数目
set whichwrap=b,s,<,>,[,] "开启normal 或visual模式下的backspace键空格键,左右方向键,insert或replace模式下的左方向键,右方向键的跳行功能

filetype plugin indent on "分为三部分命令:file on,file plugin on,file indent on 分别是自动识别文件类型, 用用文件类型脚本,使用缩进定义文件

set foldenable  "允许折叠
set cursorline "突出显示当前行
set magic  "设置魔术?神马东东
set ignorecase "搜索忽略大小写
filetype on "打开文件类型检测功能
set background=dark
set t_Co=256   "256色
set mouse=a  "允许鼠标

这时候, 我们可以发现我们的 vim 变成了:

插件安装

这一部分比上面的样式重要的多,这里主要是讲插件的使用,而这些插件大大增加了vim 的性能。

1. vbundle 管理插件 的 插件

我们的插件如果一个一个安装的话, 这可能会搞死你, 因此我们希望有一个能够自动安装和管理插件的插件.
这就是我们要说的 vbundle, 可参考:.

安装非常简单:

git clonehttps://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

然后我们来看看配置, 也非常简单.

set nocompatible              " be iMproved, 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 'VundleVim/Vundle.vim'

" All of your Plugins must be added before the following line
call vundle#end()            " required
filetype plugin indent on    " required
" To ignore plugin indent changes, instead use:
"filetype plugin on
"
" Brief help
" :PluginList       - lists configured plugins
" :PluginInstall    - installs plugins; append `!` to update or just :PluginUpdate
" :PluginSearch foo - searches for foo; append `!` to refresh local cache
" :PluginClean      - confirms removal of unused plugins; append `!` to auto-approve removal
"
" see :h vundle for more details or wiki for FAQ
" Put your non-Plugin stuff after this line

vimrc 中把上面的代贴在 最前面 即可。需要添加插件的话,只要在 begin 和 end 之间加入即可

2. nerdtree 插件

在 begin 和 end之 间加入

Plugin 'scrooloose/nerdtree'

输入命令

:PluginInstall

配置 nerdtree:

let NERDTreeQuitOnOpen=1 "打开文件时关闭树
let NERDTreeShowBookmarks=1 "显示书签

配置快捷键:

let mapleader =","
map <leader>ne :NERDTreeToggle<CR>
map <leader>tl :TlistToggle<cr>
nnoremap <leader>ma :set mouse=a<cr>
nnoremap <leader>mu :set mouse=<cr>

保存vimrc,输入,ne, 我们看看:

似乎有那么点意思!

3. tagbar 插件

安装方式:

Plugin 'majutsushi/tagbar' 

设置键:

nmap <leader>tb:TagbarToggle<CR>

似乎已经越来越接近我们想要的了.

4. autopair插件

这个插件就是给括号自动配对的.

Plugin 'jiangmiao/auto-pairs'

5. minibuffer 插件

安装插件:

Plugin 'minibufexpl.vim'

配置插件

let g:miniBufExplMapWindowNavVim = 1 
let g:miniBufExplMapWindowNavArrows = 1 
let g:miniBufExplMapCTabSwitchBufs = 1 

配置快捷键:

nmap <leader>mmbe:MiniBufExplorer<CR>
nmap <leader>mmbc :CMiniBufExplorer<CR>
nmap <leader>mmbu :UMiniBufExplorer<CR>
nmap <leader>mmbt :TMiniBufExplorer<CR>

效果如下

6. taglist 插件

功能类似于 tagbar。安装:

Plugin 'taglist.vim' 

配置:

let Tlist_Use_Right_Window=1 "taglist 显示在右侧 
let Tlist_Exit_OnlyWindow=1 "taglist 只剩下一个窗口时,自动关闭
let Tlist_File_Fold_Auto_Close=1

快捷键:
map tl :TlistToggle
nnoremap ev :vsplit $MYVIMRC
nnoremap sv :source $MYVIMRC

7. nerd comment 插件

这个插件是用来自动添加注释的插件。安装:

Plugin 'scrooloose/nerdcommenter'

8. 代码折叠

配置:

"使用语法高亮定义代码折叠set foldmethod=syntax
"打开文件是默认不折叠代码
set foldlevelstart=99

zc 折叠
zC 对所在范围内所有嵌套的折叠点进行折叠
zo 展开折叠
zO 对所在范围内所有嵌套的折叠点展开
[z 到当前打开的折叠的开始处。]z 到当前打开的折叠的末尾处。
zj 向下移动。到达下一个折叠的开始处。关闭的折叠也被计入。
zk 向上移动到前一折叠的结束处。关闭的折叠也被计入。

9. markdown 插件安装

安装:

Plugin 'godlygeek/tabular'
Plugin 'plasticboy/vim-markdown'

配置:

let g:vim_markdown_math = 1
let g:vim_markdown_frontmatter = 1
let g:vim_markdown_toml_frontmatter = 1
let g:vim_markdown_json_frontmatter = 1

效果

10. youcompleteme 插件

YouCompleteMe:一个随键而全的、支持模糊搜索的、高速补全的插件。YCM 由 google 公司搜索项目组的软件工程师 Strahinja Val Markovic 所开发,YCM 后端调用 libclang (以获取AST,当然还有其他语言的语义分析库)、前端由 C++ 开发(以提升补全效 率)、外层由 python 封装(以成为 vim 插件),这是至今为止最强大也是最难安装的插件之一,有很多人都砸在这个插件上了,我们来看看如何安装这个插件。

安装插件:

Plugin 'Valloric/YouCompleteMe'

打开vim,输入:PluginInstall, vim 会自动去从 git 上 clone 出项目,把这个项目安装到项目目录上。

安装完毕后。我们进入到插件目录

cd ~/.vim/bundle/YouCompleteMe/
./install.py --clang-completer

又是需要漫长的等待,等他安装好,在 vimrc 中配置 YouCompleteMe:

let g:ycm_key_list_select_completion = ['<Down>']
let g:ycm_key_list_previous_completion = ['<Up>']
let g:ycm_confirm_extra_conf=0 "关闭加载.ycm_extra_conf.py提示
let g:ycm_min_num_of_chars_for_completion=2 " 从第2个键入字符就开始罗列匹配项
let g:ycm_cache_omnifunc=0  " 禁止缓存匹配项,每次都重新生成匹配项
let g:ycm_seed_identifiers_with_syntax=1    " 语法关键字补全
" 在注释输入中也能补全
let g:ycm_complete_in_comments = 1
" 在字符串输入中也能补全
let g:ycm_complete_in_strings = 1
"注释和字符串中的文字也会被收入补全
let g:ycm_collect_identifiers_from_comments_and_strings = 0
let g:ycm_global_ycm_extra_conf = '~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py'

nnoremap <F5> :YcmForceCompileAndDiagnostics<CR>
nnoremap <leader>lo :lopen<CR> "open locationlist                                                                                                                      
nnoremap <leader>lc :lclose<CR>   "close locationlist
inoremap <leader><leader> <C-x><C-o>"
inoremap <leader><leader> <C-x><C-o>
nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR>

我们开看看效果:

完整配置文件如下:

set nocompatible              " be iMproved, 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 'VundleVim/Vundle.vim'

" nerdtree插件
Plugin 'scrooloose/nerdtree'

" tagbar
Plugin 'majutsushi/tagbar'

" auto pair
Plugin 'jiangmiao/auto-pairs'

" mini buffer
Plugin 'minibufexpl.vim'

" tag list
Plugin 'taglist.vim'

" nerd commit
Plugin 'scrooloose/nerdcommenter'

" PHP mannual
Plugin 'alvan/vim-php-manual'

" snippets mate
Plugin 'MarcWeber/vim-addon-mw-utils'
Plugin 'tomtom/tlib_vim'
Plugin 'garbas/vim-snipmate'
Plugin 'honza/vim-snippets'

" markdown插件
Plugin 'godlygeek/tabular'
Plugin 'plasticboy/vim-markdown'

" you complete me插件
Plugin 'Valloric/YouCompleteMe'

" All of your Plugins must be added before the following line
call vundle#end()            " required
filetype plugin indent on    " required
" To ignore plugin indent changes, instead use:
" filetype plugin on

"  Brief help
" :PluginList       - lists configured plugins
" :PluginInstall    - installs plugins; append `!` to update or just
" :PluginUpdate
" :PluginSearch foo - searches for foo; append `!` to refresh local cache
" :PluginClean      - confirms removal of unused plugins; append `!` to auto-approve removal

" see :h vundle for more details or wiki for FAQ
" Put your non-Plugin stuff after this line

set modelines=0

"设置更好的删除
set backspace=2

syntax on "语法高亮

"用浅色高亮当前行
autocmd InsertLeave * se nocul
autocmd InsertEnter * se cul

set smartindent "智能对齐

set autoindent "自动对齐

set confirm "在处理未保存或只读文件的时候,弹出确认框

set tabstop=4 "tab键的宽度
set softtabstop=4
set shiftwidth=4 "统一缩进为4
set expandtab "不要用空格替代制表符

set number "显示行号
set history=50  "历史纪录数
set hlsearch
set incsearch "搜素高亮,搜索逐渐高亮

set gdefault "行内替换
set encoding=utf-8
set fileencodings=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936,utf-16,big5,euc-jp,latin1 "编码设置

colorscheme molokai

set guifont=Menlo:h16:cANSI "设置字体
set langmenu=zn_CN.UTF-8
set helplang=cn  "语言设置

set ruler "在编辑过程中,在右下角显示光标位置的状态行

set laststatus=1  "总是显示状态行

set showcmd "在状态行显示目前所执行的命令,未完成的指令片段也会显示出来

set scrolloff=3 "光标移动到buffer的顶部和底部时保持3行的距离
set showmatch "高亮显示对应的括号
set matchtime=5 "对应括号高亮时间(单位是十分之一秒)

set wildmenu  "增强模式中的命令行自动完成操作

set linespace=2 "字符间插入的像素行数目
set whichwrap=b,s,<,>,[,] "开启normal 或visual模式下的backspace键空格键,左右方向键,insert或replace模式下的左方向键,右方向键的跳行功能

filetype plugin indent on "分为三部分命令:file on,file plugin on,file indent on 分别是自动识别文件类型, 用用文件类型脚本,使用缩进定义文件


syntax enable
set foldenable  "允许折叠
set cursorline "突出显示当前行
set magic  "设置魔术?神马东东
set ignorecase "搜索忽略大小写
filetype on "打开文件类型检测功能
set background=dark
set t_Co=256   "256色
set mouse=a  "允许鼠标
"使用语法高亮定义代码折叠
set foldmethod=syntax
""打开文件是默认不折叠代码
set foldlevelstart=99"

" nerdtree 配置
let NERDTreeQuitOnOpen=1 "打开文件时关闭树
let NERDTreeShowBookmarks=1 "显示书签

" taglist 配置
let Tlist_Use_Right_Window=1 "taglist 显示在右侧 
let Tlist_Exit_OnlyWindow=1 "taglist 只剩下一个窗口时,自动关闭
let Tlist_File_Fold_Auto_Close=1

" -- MiniBufferExplorer --   
let g:miniBufExplMapWindowNavVim = 1  " 按下Ctrl+h/j/k/l,可以切换到当前窗口的上下左右窗口  
let g:miniBufExplMapWindowNavArrows = 1  "按下Ctrl+箭头,可以切换到当前窗口的上下左右窗口  
let g:miniBufExplMapCTabSwitchBufs = 1 "启用以下两个功能:Ctrl+tab移到下一个buffer并在当前窗口打开;Ctrl+Shift+tab移到上一个buffer并在当前窗口打开;ubuntu好像不支持  
let g:miniBufExplMapCTabSwitchWindows = 1 "  启用以下两个功能:Ctrl+tab移到下一个窗口;Ctrl+Shift+tab移到上一个窗口;ubuntu好像不支持  
let g:miniBufExplModSelTarget = 1     " 不要在不可编辑内容的窗口(如TagList窗口)中打开选中的buffer

" markdown 配置
let g:vim_markdown_math = 1
let g:vim_markdown_frontmatter = 1
let g:vim_markdown_toml_frontmatter = 1
let g:vim_markdown_json_frontmatter = 1

" YouCompleteMe配置
let g:ycm_key_list_select_completion = ['<Down>']
let g:ycm_key_list_previous_completion = ['<Up>']
let g:ycm_confirm_extra_conf=0 "关闭加载.ycm_extra_conf.py提示
let g:ycm_min_num_of_chars_for_completion=2 " 从第2个键入字符就开始罗列匹配项
let g:ycm_cache_omnifunc=0  " 禁止缓存匹配项,每次都重新生成匹配项
let g:ycm_seed_identifiers_with_syntax=1    " 语法关键字补全
" 在注释输入中也能补全
let g:ycm_complete_in_comments = 1
" 在字符串输入中也能补全
let g:ycm_complete_in_strings = 1
"注释和字符串中的文字也会被收入补全
let g:ycm_collect_identifiers_from_comments_and_strings = 0
let g:ycm_global_ycm_extra_conf = '~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py'

let mapleader = ","
map <leader>ne :NERDTreeToggle<CR>
nmap <leader>tb :TagbarToggle<CR>
nmap <leader>mmbe :MiniBufExplorer<CR>
nmap <leader>mmbc :CMiniBufExplorer<CR>
nmap <leader>mmbu :UMiniBufExplorer<CR>
nmap <leader>mmbt :TMiniBufExplorer<CR>
map <leader>tl :TlistToggle<cr>
nnoremap <leader>ev :vsplit $MYVIMRC<cr>
nnoremap <leader>sv :source $MYVIMRC<cr>
nnoremap <leader>ma :set mouse=a<cr>
nnoremap <leader>mu :set mouse=<cr>
nnoremap <F5> :YcmForceCompileAndDiagnostics<CR>
nnoremap <leader>lo :lopen<CR> "open locationlist                                                                                                                      
nnoremap <leader>lc :lclose<CR>   "close locationlist
inoremap <leader><leader> <C-x><C-o>"
inoremap <leader><leader> <C-x><C-o>
nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR>

"对搜索的设置
map ft :call Search_Word()<CR>:copen<CR>
function Search_Word()
let w = expand("<cword>") " 在当前光标位置抓词
execute "vimgrep " . w . " %"
endfunction

总结

这就是我们配置好的vim了, 如果你去配置, 我相信你一定会遇到不少问题, 但是我想, 这总是一个很好的经历, 它会培养你的耐心和毅力, 也会变得更加成熟。希望你也去试试哇!

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值