接触Linux有两年了,vim还是只会简单的操作。最近实在受不了sublime的代码提示,决定花点时间来配置下vim。本文讲自己认为方便的vim配置,称不上完美,只讲究简单实用。

使用 ctags

主要参考   http://roclinux.cn/?p=424

1.  ctags根据代码产生索引文件,支持ava, c, c++, python, perl, php, ruby, scheme, tcl, vim, yacc, bash/kron shell/zsh, cobol, awk, asp, lisp, pascal等等。可以通过自己的包管理器来安装。例如,对于Ubuntu  sudo pat-get install ctags

2. vim通过taglist插件来使用ctags。到官网下载taglist,解压到用户家目录下的 .vim 文件夹下。这会生成 doc,plugin两个目录。

然后,  cd .vim/doc

使用命令打开vim,在命令模式下执行 :helptags . 。

重启vim,taglist应该已经好了。

3. 使用 ctags+taglist

用vim打开源文件,光标定位到某个函数或者变量,按ctrl+],就可以跳转到定义。然后使用 ctrl-o或者ctrl-t。可以连续查询连续返回。

在vim中执行 :TlistToggle ,会在vim中出现宏、函数、变量列表。按ctrl-w再按w,可以连续在左右窗口切换。

配置YouCompleteMe

Ubuntu的源中已经有了, 为 vim-youcompleteme, 因为自己已经手动安装了,没有实测。不想折腾的朋友可以试一下。

1. 安装vundle

vundle是一个管理vim插件的工具,使用vundle安装YouCompleteMe比较方便。

按照作者在https://github.com/gmarik/Vundle.vim#about提供的方法安装好vundle。(主要是下载解压,病略微修改 .vimrc)

2. 使用vundle安装YouCompleteMe

主要根据作者自己的建议整理 https://github.com/Valloric/YouCompleteMe

在.vimrc中 vundle部分,添加一行:

Plugin 'Valloric/YouCompleteMe'

然后,打开vim,输入命令

:PluginInstall

就会开始自动安装vundle指定的各种插件。

由于要安装clang等,安装过程是非常久的,大概需要一个小时,这个时间完全可以去做些别的。

等安装好后,在.vim/vundle/YouCompleteMe目录下多了一堆目录和文件。

3. 使用YouCompleteMe

YouCompleteMe进行补全时需要查找一个 ycm_global_ycm_extra_conf文件。可以每次在工作目录中放置这个文件,也可以设置全局。全局设置要在.vimrc中添加一行

let g:ycm_global_ycm_extra_conf='~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py'

4. 效果图

YCM作者主页的效果图

实用的 .vimrc 文件

主要参考http://www.cnblogs.com/ma6174/archive/2011/12/10/2283393.html。 加入了前面介绍的ctags, YouCompleteMe的配置。

 " Suzzz   2014.11.03
" 主要参考 http://www.cnblogs.com/ma6174/archive/2011/12/10/2283393.html
" 额外添加了 ctags, YouCompleteMe等
" 主要特点 "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. 使用YouCompleteMe提供C++的自动补全提示,效果类似 Visual Studio那种,可以解析系统头文件 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" """""""""""""" Suzzz """""""""""""""""""""
"Vundle相关。Vundle是vim插件管理器,使用它来管理插件很方便,而且功能强大
"https://github.com/gmarik/Vundle.vim#about 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 'gmarik/Vundle.vim' " plugin on GitHub repo 添加github上的vimn插件,形式非常简单
Plugin 'tpope/vim-fugitive' "语法检查
Plugin 'scrooloose/syntastic'
"让 syntastic忽略 python 文件
let g:syntastic_ignore_files=[".*\.py$"] "补全 python
Plugin 'davidhalter/jedi' Plugin 'rstacruz/sparkup', {'rtp': 'vim/'} " YouCompleteMe插件,很好的智能提示,基本达到 IDE 级别
Plugin 'Valloric/YouCompleteMe' " All of your Plugins must be added before the following line 所有Vundle管理的插件必须安装在这里之前
call vundle#end() " required
filetype plugin indent on " required
" To ignore plugin indent changes, instead use:
"filetype plugin on
" YouCompleteMe 通过这个cm_global_ycm_extra_conf来获得补全规则,可以如下指定,也可以每次放置在工作目录
let g:ycm_global_ycm_extra_conf='~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py'
"让YouCompleteMe同时利用原来的ctags
let g:ycm_collect_identifiers_from_tag_files = " """"""""""""" By ma6174 """"""""""""""""""""" " 显示相关 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" "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),总是显示状态行(2) set foldenable " 允许折叠 set foldmethod=manual " 手动折叠 "set background=dark "背景使用黑色 set nocompatible "去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限 " 显示中文帮助 if version >= set helplang=cn set encoding=utf- endif " 设置配色方案 "colorscheme murphy "字体 "if (has("gui_running")) " set guifont=Bitstream\ Vera\ Sans\ Mono\ 10 "endif set fencs=utf-,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936 set termencoding=utf- set encoding=utf- set fileencodings=ucs-bom,utf-,cp936 set fileencoding=utf- """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" """""新文件标题"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" "新建.c,.h,.sh,.java文件,自动插入文件头 autocmd BufNewFile *.cpp,*.[ch],*.sh,*.java exec ":call SetTitle()" ""定义函数SetTitle,自动插入文件头 func SetTitle() "如果文件类型为.sh文件 if &filetype == 'sh' call setline(,"\#########################################################################") call append(line("."), "\# File Name: ".expand("%")) call append(line(".")+, "\# Author: YourName") call append(line(".")+, "\# mail: YourEmail") "原来的时间形式比较复杂,不喜欢,改变一下 "call append(line(".")+3, "\# Created Time: ".strftime("%c"))
call append(line(".")+, "\# Created Time: ".strftime("%Y-%m-%d",localtime())) call append(line(".")+, "\#########################################################################") call append(line(".")+, "\#!/bin/bash") call append(line(".")+, "") else call setline(, "/*************************************************************************") call append(line("."), " > File Name: ".expand("%")) call append(line(".")+, " > Author: YourName") call append(line(".")+, " > Mail: YourEmail ") " 同样的 改变时间格式
"call append(line(".")+3, " > Created Time: ".strftime("%c"))
call append(line(".")+, " > Created Time: ".strftime("%Y-%m-%d",localtime())) call append(line(".")+, " ************************************************************************/") call append(line(".")+, "") endif if &filetype == 'cpp' call append(line(".")+, "#include<iostream>") call append(line(".")+, "using namespace std;") call append(line(".")+, "") endif if &filetype == 'c' call append(line(".")+, "#include<stdio.h>") call append(line(".")+, "") endif "新建文件后,自动定位到文件末尾 autocmd BufNewFile * normal G endfunc " Suzzz: 模仿上面,新建python文件时,添加文件头 autocmd BufNewFile *py exec ":call SetPythonTitle()" func SetPythonTitle()
call setline(,"#!/usr/bin/env python")
call append( line("."),"#-*- coding: utf-8 -*-" )
call append(line(".")+," ")
call append(line(".")+, "\# File Name: ".expand("%"))
call append(line(".")+, "\# Author: YourName")
call append(line(".")+, "\# mail: YourEmail")
call append(line(".")+, "\# Created Time: ".strftime("%Y-%m-%d",localtime()))
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= set foldmethod=indent set foldlevel= set foldenable " 开始折叠 " 不要使用vi的键盘模式,而是vim自己的 set nocompatible " 语法高亮 set syntax=on " 去掉输入错误的提示声音 set noeb " 在处理未保存或只读文件的时候,弹出确认 set confirm " 自动缩进 set autoindent set cindent " Tab键的宽度 set tabstop= " 统一缩进为4 set softtabstop= set shiftwidth= " 不要用空格代替制表符 set noexpandtab " 在行和段开始处使用制表符 set smarttab " 显示行号 set number " 历史记录数 set history= "禁止生成临时文件 set nobackup set noswapfile "搜索忽略大小写 set ignorecase "搜索逐字符高亮 set hlsearch set incsearch "行内替换 set gdefault "编码设置 set enc=utf- set fencs=utf-,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936 "语言设置 set langmenu=zh_CN.UTF- 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= " 命令行(在状态行下)的高度,默认为1,这里是2 set cmdheight= " 侦测文件类型 filetype on " 载入文件类型插件 filetype plugin on " 为特定文件类型载入相关缩进文件 filetype indent on " 保存全局变量 set viminfo+=! " 带有如下符号的单词不要被换行分割 set iskeyword+=_,$,@,%,#,- " 字符间插入的像素行数目 set linespace= " 增强模式中的命令行自动完成操作 set wildmenu " 使回格键(backspace)正常处理indent, eol, start等 set backspace= " 允许backspace和光标键跨越行边界 set whichwrap+=<,>,h,l " 可以在buffer的任何地方使用鼠标(类似office中在工作区双击鼠标定位) set mouse=a set selection=exclusive set selectmode=mouse,key " 通过使用: commands命令,告诉我们文件的哪一行被改变过 set report= " 在被分割的窗口间显示空白,便于阅读 set fillchars=vert:\ ,stl:\ ,stlnc:\ " 高亮显示匹配的括号 set showmatch " 匹配括号高亮的时间(单位是十分之一秒) set matchtime= " 光标移动到buffer的顶部和底部时保持3行距离 set scrolloff= " 为C程序提供自动缩进 set smartindent " 高亮显示普通txt文件(需要txt.vim脚本) au BufRead,BufNewFile * setfiletype txt "自动补全 :inoremap ( ()<ESC>i :inoremap ) <c-r>=ClosePair(')')<CR> "by Suzzz: 原作者这种设置,输入{会自动补全,并且中间插入一个空行,将光标定位到空行。这对于函数是OK的,但是使用花括号初始化数组、vector时就不方便了。所以改为现在这种。只是补全,然后光标在左右括号中间。
":inoremap { {<CR>}<ESC>O
:inoremap { {}<ESC>i :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('.') - ] == 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 = " 在右侧显示窗口 let Tlist_Compart_Format = " 压缩方式 let Tlist_Exist_OnlyWindow = " 如果只有一个buffer,kill窗口也kill掉buffer let Tlist_File_Fold_Auto_Close = " 不要关闭其他文件的tags let Tlist_Enable_Fold_Column = " 不要显示折叠树 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= """""""""""""""""""""""""""""" " Tag list (ctags) """""""""""""""""""""""""""""""" let Tlist_Ctags_Cmd = '/usr/bin/ctags' let Tlist_Show_One_File = "不同时显示多个文件的tag,只显示当前文件的 let Tlist_Exit_OnlyWindow = "如果taglist窗口是最后一个窗口,则退出vim let Tlist_Use_Right_Window = "在右侧窗口中显示taglist窗口 " minibufexpl插件的一般设置 let g:miniBufExplMapWindowNavVim = let g:miniBufExplMapWindowNavArrows = let g:miniBufExplMapCTabSwitchBufs =
let g:miniBufExplModSelTarget =

Vim使用YouCompleteMe达到类似IDE的代码提示、补全,以及其他实用设置的更多相关文章

  1. Eclipse代码提示补全问题,自动选择第一个

    原地址 http://blog.csdn.net/liuhhaiffeng/article/details/7179243 Eclipse具有代码提示功能, 但是默认的提示只有在输入".&q ...

  2. Sublime Text 2搭建Go开发环境,代码提示+补全+调试

    本文在已安装Go环境的前提下继续. 1.安装Sublime Text 2 2.安装Package Control. 运行Sublime,按下 Ctrl+`(`在Tab键上边),然后输入以下内容: im ...

  3. 【vim环境配置】解决ubuntu上 由YouCompleteMe插件配置不当引起的 自动补全失效的问题

    背景: 由于不可抗拒的原因,学习环境由之前centos的一台机器上,变成了ubuntu的一台机器上.因此,需要在新的ubuntu的机器上再配置一次vim环境.算起来这已经是第三次配置vim环境了(ma ...

  4. python代码自动补全

    牛逼了!Python代码补全利器,提高效率告别996! Python之禅 Python之禅 微信号 VTtalk 功能介绍 人生苦短,我用Python,这里是一名老程序员分享Python技术的地方,欢 ...

  5. 这个 Python 代码自动补全神器搞得我卧槽卧槽的

    是时候跟你说说这个能让你撸代码撸得舒服得不要不要的神器了——kite. ​!   ​ 简单来说,它是一款 IDE 的插件,能做到代码自动补全,可能你会说了,这有什么牛逼的?一般的编辑器不都有这个功能么 ...

  6. codeblocks 设置代码自动补全

    熟悉使用一些开发类IDE的朋友对代码自动补全一定印象深刻,如Visual studio,eclipse等,我们在程序中定义的那一个个超长的变量函数名只需打出几个字母就可自动补全,但是在codebloc ...

  7. eclipse代码自动补全设置

    1.说明 eclipse安装好了之后,在编辑框中输入某个英文字符,默认不自动弹出自动代码选择框,需要手动按下 Alt + / 或者输入的字符为 .  才弹出代码自动补全框.其实eclipse是可以设置 ...

  8. notepad++代码自动补全功能

    可以代码自动补全功能,默认他是没有开启这个功能的,在首选项->备份与自动完成 里面有自动完成这一个设置,可以设置单词补全,也可以设置函数补全,这样写代码就快多了

  9. linux下让irb实现代码自动补全的功能

    我不知道其他系统上irb是否有此功能,但是在ubuntu上ruby2.1.2自带的irb默认是没有代码自动补全功能的,这多少让人觉得有所不便.其实加上也很简单,就是在irb里加载一个模块:requir ...

随机推荐

  1. Node-Media-Server

    Node-Media-Server (相对稳定可用性高) 主要应用Node.js 实现的RTSP(结合ffmpeg)/RTMP/HTTP/WebSocket/HLS/DASH流媒体服务器 特性 跨平台 ...

  2. 修改Pycharm for Mac背景色

    Mac 上面的Pycharm的背景是白色,太刺眼,网上教程那么多,实用性都不高,最终在csdn找到了一个. 修改步骤如下: pycharm -->Preferences --> Appea ...

  3. Linux操作系统简介

    一:Linux系统概述 1.常见操作系统 - 服务端操作系统 : linux.unix.windows server - 单机操作系统 : windows(dos .ucdos.win95.win98 ...

  4. Mac下新安装的MySQL无法登陆root用户解决方法

      一 设置MySQL命令行搜索路径 0.苹果->系统偏好设置->最下边点mysql 在弹出页面中 启动mysql服务 1.打开终端,输入: sudo vi ~/.bash_profile ...

  5. C# 实现QQ式截图功能

    这个功能一共有两部分组成,第一部分是窗体代码,另外的一部分是一个辅助方法.直接贴出代码,以供大家参考: using System; using System.Collections.Generic; ...

  6. 单例类singleton自动释放

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  7. 二进制包形式安装mysql5.7.17

    mysql5.7与mysql5.5的安装方式有些区别,如果按照5.5的方式来安装5.7就会有很多报错信息,下面介绍mysql5.7.17的二进制安装方式. 首先安装依赖包: yum -y instal ...

  8. Nginx配置请求转发location及rewrite规则

    一个示例: location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] } location / { # 因为所有的地址都以 / 开头,所以这 ...

  9. 如何自定义FileZilla编辑文件的默认打开方式

    看一下设置: 原来是人家默默认不给我们提示 改一下: 还是不行,还是跳到网页去了 还是不行 这样就好了...

  10. SpringMVC中的适配器

    适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作 适用场景: 1.已经存在的类的接口不符合我们的需 ...