• 我是这样用vim写代码的--插件篇


         上一篇介绍了vim的简单编辑方式。熟练掌握vim的基本操作后,还只是一个得心应手的文本编辑器,终究是比IDE要弱很多的。强大的vs中,代码目录树,代码跳转,函数浏览,自动补全,代码调试等功能才是我们舍弃文本编辑器拥抱IDE的核心原因。本篇将介绍本人长期依赖的插件,及基本使用方法,从而真正能够完全用vim环境做开发。

         首先要说明的是,自己手动管理插件是非常麻烦的一件事,在尝试了一段痛苦的手动管理经历后,本人果断清掉了本地的插件文件夹,开始使用Vundle,一个很方便的vim插件管理器。Vundle本身也是一个vim插件,只需要在vimrc里面配置好即可方便的安装、更新、删除插件,非常好用。

         Vundle的安装请参考 https://github.com/VundleVim/Vundle.vim 

         安装好之后,就可以随心所欲添加github上的各种插件了。这里推荐本人觉得非常必要且好用的几个插件,并附上一些特殊配置项。

         Nerdtree  Plugin 'scrooloose/nerdtree' 

         文件目录树插件,打开目录页签可以方便的浏览工程目录,切换文件,创建、删除和移动文件。

         本人的特殊配置:

         let g:NERDTreeChDirMode=2  该设置使得当前工作目录与nerdtree的根目录一致,这样可以快速的切换工作目录,配合后续插件设置,使得查找等操作更得心应手。

         Nerdtree的使用很简单,命令行输入:NERDTree或者:NERDTreeToggle可打开关闭Nerdtree窗口,不过一般建议在vimrc中配置快捷键,本人使用Ctrl+n(首字母,好记)。在Nerdtree窗口中的移动,和在一般编辑窗口中一致。按下?键,则可以开关快速的帮助。

         这里列一下最常用的快捷键:

         u/shift+u 根目录移到上层目录,后者会保留当前根目录为展开状态。

         shift+c  将当前目录设为根节点。

         shift+r  刷新当前根目录,由于刷新根目录也比较快,所以本人总是刷新根目录。

         enter  展开或折叠目录,如果是文件则可以直接打开文件,比较符合直觉。

         o/i/s  三个快捷键均是用于打开当前文件的。只是o是在上一个窗口显示,i是纵向分窗口显示,s是横向分窗口显示。在想要参考文件内容时,后两个快捷键很有用。

         有以上快捷键,基本上就能简单使用Nerdtree了。

         Ctrlp  Plugin 'ctrlpvim/ctrlp.vim'

         该插件实现了类似sublime的快速文件查找和跳转。在工程较大时,用来跳转文件非常方便。

         let g:ctrlp_working_path_mode = 'wa'  在工作目录下的任一文件中使用ctrlp,都会搜索整个工作目录下的文件,大型工程中可随时查找工程目录下其他文件。

         let g:ctrlp_custom_ignore={
              'dir': 'v[/].(git|hg|svn)$',
              'file': 'v.(exe|so|dll|xls|xlsx|doc|docx|meta|bytes|ppt|pptx)$',
          }

         ctrlp忽略目录和文件,该项设置可根据自己项目需要设置。

         ctrlp的快捷键非常好记,就是ctrl+p,按下后会跳出相应搜索窗口,输入要搜索的文件名,回车即可打开文件。同样ctrl+s,ctrl+v可以分割窗口打开。当有搜索到多个文件时,可使用ctrl+j/ctrl+k上下移动,选择文件。

         Taglist  Plugin 'vim-scripts/taglist.vim'

         标签列表插件,可以快速查看当前文件的标签、函数、变量等。

         let Tlist_Show_One_File=1  每次只显示一个文件的标签,工程较大时,如果显示所有文件的标签打开会很慢。
         let Tlist_Use_Right_Window=1  默认打开到窗口右侧,由于nerdtree已经占用了左侧窗口,taglist放到右侧,避免冲突。
         let Tlist_GainFocus_On_ToggleOpen=1  打开时光标放到taglist窗口,这样打开后可以直接挪动光标到对应的标签跳转,也可以直接按q退出taglist窗口。
         let Tlist_Close_On_Select=1  选中标签后就关闭taglist窗口,个人喜好taglist只在要跳转时出现。

         由于vim文件内搜索非常方便,因此使用相对较少。回车即可打开,选择相应的标签,回车跳转。

         CtrlSF  Plugin 'dyng/ctrlsf.vim' 

         看名字猜用途,就是全局搜索插件,配合一定的设置和快捷键,能到达到和vs中一样的搜索体验。该插件的安装稍微麻烦一点,需要依赖ack或ag。针对windows有编译好的版本可以直接使用 https://github.com/k-takata/the_silver_searcher-win32。将执行文件放到vim目录下即可。

         let g:ctrlsf_ackprg='ag'  据说ag效率更高一点

         let g:ctrlsf_default_view_mode='compact'  默认设置下,ctrlsf的形态很像sublime的搜索,每个结果有前后部分上下文,个人更偏好vs式的预览,这两种模式也可以按M随时切换。     

         let g:ctrlsf_auto_close=0  设置不自动关闭,搜索字符串不像搜标签,经常需要点开看看。
         let g:ctrlsf_case_sensitive='no'   大小写不敏感,为了查询更快速,默认设成大小写不敏感搜索。
         let g:ctrlsf_ignore_dir=['tags']  忽略部分目录
         let g:ctrlsf_default_root='cwd'  设置在当前工作目录下搜索,和nerdtree一致。

         以上配置,加上快捷键配置后,任意位置按下ctrl+f,即可全局搜索当前词,也可删掉当前内容,输入要查找的内容(由于这种需求较少,所以没有单独设快捷键)。如搜索内容中间有空格之类的特殊字符,可在最外侧用单引号包起来。

         YouCompleteme  Plugin 'Valloric/YouCompleteMe'

         最难装却是最重要的插件,自动补全插件,没有这个插件的情况下,vim自带的neocomplete也能简单用用,但确实没有YCM强大。

         let g:ycm_min_num_of_chars_for_completion=2  设置最少2个字符触发补全
         let g:ycm_semantic_triggers={
              'c' : ['->', '.'],
              'lua' : ['.', ':'],
         }  触发语义分析的符号,基本上可以媲美vs,并且对lua等脚本语言也能有很好的补全效果。

        该功能本人认为不需要快捷键,打几个字母就会自动跳出提示。

         以上就是本人日常工作中用到的所有插件了。最开始的时候,总觉得什么插件都好,装了一大堆插件,由于有些插件会有按键冲突之类的,一边用一边删,最后就留下了以上几个插件。一些项目特殊需要,可以自己写一些简单的vimscript函数,配上快捷键。使用了两年下来,基本没有觉得有什么短缺的,完全能胜任编码工作。文章最后贴上本人windows系统上的vimrc,可以参考酌情使用。

    source $VIMRUNTIME/vimrc_example.vim
    source $VIMRUNTIME/mswin.vim
    behave mswin
    
    set diffexpr=MyDiff()
    function MyDiff()
      let opt = '-a --binary '
      if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
      if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
      let arg1 = v:fname_in
      if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
      let arg2 = v:fname_new
      if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
      let arg3 = v:fname_out
      if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
      if $VIMRUNTIME =~ ' '
        if &sh =~ '<cmd'
          if empty(&shellxquote)
            let l:shxq_sav = ''
            set shellxquote&
          endif
          let cmd = '"' . $VIMRUNTIME . 'diff"'
        else
          let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . 'diff"'
        endif
      else
        let cmd = $VIMRUNTIME . 'diff'
      endif
      silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3
      if exists('l:shxq_sav')
        let &shellxquote=l:shxq_sav
      endif
    endfunction
    
    "vundle-----------------------------------------------------------------------
    set nocompatible              " be iMproved, required
    filetype off                  " required
    
    " set the runtime path to include Vundle and initialize
    set rtp+=$HOME/vimfiles/bundle/Vundle.vim/
    call vundle#begin('$HOME/vimfiles/bundle/')
    
    " let Vundle manage Vundle, required
    Plugin 'VundleVim/Vundle.vim'
    Plugin 'scrooloose/nerdtree'
    let g:NERDTreeChDirMode=2
    Plugin 'vim-scripts/taglist.vim'
    let Tlist_Show_One_File=1
    let Tlist_Use_Right_Window=1
    let Tlist_GainFocus_On_ToggleOpen=1
    let Tlist_Close_On_Select=1
    Plugin 'ctrlpvim/ctrlp.vim'
    let g:ctrlp_working_path_mode = 'wa'
    let g:ctrlp_custom_ignore={
         'dir':  'v[/].(git|hg|svn)$',
         'file': 'v.(exe|so|dll|xls|xlsx|doc|docx|meta|bytes|ppt|pptx)$',
         }
    Plugin 'vim-scripts/a.vim'
    
    Plugin 'dyng/ctrlsf.vim'
    let g:ctrlsf_ackprg='ag'
    let g:ctrlsf_auto_close=0
    let g:ctrlsf_case_sensitive='no'
    let g:ctrlsf_default_view_mode='compact'
    let g:ctrlsf_ignore_dir=['tags']
    let g:ctrlsf_default_root='cwd'
    
    Plugin 'Valloric/YouCompleteMe'
    let g:ycm_min_num_of_chars_for_completion=2
    let g:ycm_semantic_triggers={
    			 'c' : ['->', '.'],
    			 'lua' : ['.', ':'],
    			}
    
    " All of your Plugins must be added before the following line
    call vundle#end()            " required
    filetype plugin indent on    " required
    
    "endvundle-----------------------------------------------------------------------
    
    set backspace=2		" more powerful backspacing
    
    set encoding=utf-8
    set fileencodings=ucs-bom,utf-8,chinese
    
    set langmenu=zh_CN.UTF-8
    let $LANG='zh_CN.UTF-8'
    
    source $VIMRUNTIME/delmenu.vim
    source $VIMRUNTIME/menu.vim
    
    colorscheme desert
    syntax enable
    syntax on
    
    set lines=50 columns=200 linespace=1
    set background=dark
    set guifont=consolas:h11:cANSI
    
    set foldenable
    set foldmethod=manual
    
    set tabstop=4
    set shiftwidth=4
    set softtabstop=4
    set autoindent
    
    set noundofile
    set nobackup
    set noswapfile
    set ignorecase
    
    set hlsearch
    set incsearch
    set showmatch
    set wildmenu
    
    set ruler
    
    set laststatus=2
    
    set number
    
    set exrc
    set secure
    
    set cursorline
    
    set tags=tags;
    
    "set guioptions-=m  "menu bar
    set guioptions-=T  "toolbar
    set guioptions-=r  "scrollbar
    set guioptions-=L
    
    map <silent> <C-j> :resize+5<CR>
    map <silent> <C-k> :resize-5<CR> 
    map <silent> <C-h> :vertical resize-5<CR>
    map <silent> <C-l> :vertical resize+5<CR>
    
    map <silent> <C-Up> :resize-5<CR>
    map <silent> <C-Down> :resize+5<CR> 
    map <silent> <C-Left> :vertical resize-5<CR>
    map <silent> <C-Right> :vertical resize+5<CR>
    map <silent> <C-tab> :tabn<CR>
    
    map <silent> <C-n> :NERDTreeToggle<CR>
    map <silent> <C-m> :TlistToggle<CR>
    
    nmap <C-f> <Plug>CtrlSFCwordPath
    vmap <C-f> <Plug>CtrlSFVwordPath
    
    "open folder of current file
    function Folder()
    	silent exec "!explorer " . expand("%:h")
    endfunction
    nmap <silent> <S-e> :call Folder()<CR>
    

      

  • 相关阅读:
    OpenStack Cinder组件支持的块存储设备表
    恒天云 3.0:打造基于OpenStack的私有云新模式
    看到一位园友博客有感
    android圆角功能,非常好用,可以用在图片,视频,gif等上面
    Android studio 3.0以上版本无法引入,找不到v4,v7包方案解决
    Android工程运用阿里freeline10秒快速编译分享
    Android监听view的attached或detached状态
    Android弹出Toast工具类总结
    为何IT开发人员如此辛苦?
    android TextView如何换行?
  • 原文地址:https://www.cnblogs.com/kevonyang/p/8576492.html
Copyright © 2020-2023  润新知