zoukankan      html  css  js  c++  java
  • Vim配置及使用技巧

          要说Linux下比较好用的文本编辑器,我推荐vim(当然很多人都用emacs,可我没用过),用vim也有一年左右,有些心得体会想与诸位分享。在我的学习过程中,借鉴了不少优秀的博客,其中有csdn大神namecyf的博客http://blog.csdn.net/namecyf/article/details/7787479和博客园风歌的blog的http://www.cnblogs.com/junnyfeng/p/3633697.html这两篇文章。

    1 Vim的安装与基本介绍

    •安装

    Archlinux下安装Vim直接用pacman即可,其他Linux系统也类似,建议把gvim也安装上。

    •配置文件

         系统安装vim时应该会有一个vimrc文件,修改里面的代码可以对所有用户的Vim进行配置,我们一般只是对当前用户的vim进行配置,故我们可以在$HOME下创建一个.vimrc的隐藏文件,这个就是vim的配置文件。

    •查看vim是否支持python

    1.在vim界面执行:version,如果python前有+号,就是支持,减号就是不支持。如果不支持,则需要以编译安装方式重新安装vim。如下:

    2.首先把系统的vim全部删除,包括vim,gvim,vim-runtime,vim-common,vim-gui-common,vim-tiny

    3.然后下载源码包

    4.进入目录进行配置编译属性,如下

    cd ./vim74/src

    ./configure --with-features=huge --enable-pythoninterp --enable-python3interp --enable-luainterp --enable-multibyte --enable-sniff --enable-fontset

    5.编译

    make && make install

    •安装vundle插件

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

    以后只需要在.vimrc中添加插件,然后咋爱vim界面运行:BundleInstall就可以安装相应插件。

      •使用help命令

    在vim执行:help <subject>就可以查看subject的相关解释,可以获得你想象得到的帮助:

    (1)查找关于某个字母的命令 :help x   查找关于x的命令

    (2)得到所以命令的索引:help index

    (3)带有控制键的命令 :help CTRL-A 注意大写

    (4)带有模式的命令:help i-CTRL-A 在虚拟模式下 v-CTRL-A 在冒号模式 c-CTRL-A

    (5)带有命令行参数 :help -t

    (6)关于某个选项的如:help 'number'

    (7) 特殊按键用尖括号:help i-<Up>

    (8)可以用错误ID号来寻求帮助 :help E37

    (9)关于引发自动命令的事件“Eventname”的帮助:help Eventname

    (10)关于编译时特性“+subject”的帮助:help +subject

    (11)关于函数的subject()的帮助:help subject()

    (12)到帮助文件digraphs.txt文件的开头:help digraphos.txt

    (13)查找一个以“pattern”开始的帮助标记:help pattern<Tab>

    (14)下一个匹配项:cn

    (15)前一个匹配项:cN或:cprev

    (16)第一个/最后一个匹配项:cfirst/clast

    (17)打开/关闭快速修改窗口:copen/cclose

    2 Vim配置

    这部分主要将一些比较实用的插件以及它在.vimrc里如何配置。

    2.1 在程序中跳来跳去:Ctags的使用

          tags文件是由ctags程序产生的一个索引文件, ctags程序其是叫"Exuberant Ctags", 是Unix上面ctags程序的替代品, 并且比它功能强大, 是大多数Linux发行版上默认的ctags程序. 那么tags文件是做什么用的呢? 如果你在读程序时看了一个函数调用, 或者一个变量, 或者一个宏等等, 你想知道它们的定义在哪儿, 怎么办呢? 用grep? 那会搜出很多不相干的地方. 现在流行用是的<C-]>, 谁用谁知道呀, 当光标在某个函数或变量上时, 按下"Ctrl+]", 光标会自动跳转到其定义处,再按"Ctrl+T"就会跳回原来位置,够厉害吧!

    下面我们就来安装吧!

    •首先现在这个网站上下载ctags的压缩文件(类似ctags-x.x.tar.gz的文件):http://ctags.sourceforge.net

    •然后就是解压安装了:

     #tar -xzvf ctags-x.x.tar.gz --x自行替换 

     #cd ctags-x.x 

     #make && make install 

    这样Ctags就安装好了,执行#ctags -R就可以递归地生成当前目录下的tags文件了。现在进行一些配置:

    在.vimrc中加入以下内容:

     set tags=./tags,./../tags,./*/tags --这样的设置可以生成当前目录,上级目录以及当前目录的所有子目录的tags文件

    然后绑定快捷键F7就可以,在vim界面下也可以生成tags文件

     map <F7> <Esc>:!ctags -R <CR><CR> 

    ctags的一些使用说明:

    •:tags 列出所有tag

    •:tag 跳至tag序列的最后

    •在多个匹配的tag之间移动

    :tfirst

    :tlast

    :[count] tprevious

    :[count] tnext

    :tselect tagname

    •:ptag function 新建窗口,显示function的参数定义

    •:pclose 关闭该窗口

    •gd 在当前函数中查找变量定义,gD在文件中查找定义

     2.2 显示变量名和函数列表:TagBar

    tagbar是一个taglist的替代品,比taglist更适合c++使用,函数能够按类区分,支持按类折叠显示等,显示结果清晰简洁。

    安装TagBar只需要在.vimrc中添加:

     Plugin 'majutsushi/tagbar' 

    然后在vim界面中输入:BundleInstall即可,可用vundle进行管理。

    我在自己的vim里绑定了一个快捷键"tb",可以打开TagBar:

     map tb <Esc>:Tagbar <CR> 

    :help tagbar可查阅详细用法。

    右边的则是tagbar

    2.3 树形目录插件:NERDTree

    无意中看到朋友使用的vim竟然能在左边显示树形目录,感觉很方便,这样子文件夹有什么文件一目了然。打听后是一个叫做NERDTree的插件,这个插件在vundle居然也有,于是可以这样安装:

     Plugin 'scrooloose/nerdtree' 

    同样的在vim界面中:BundleInstall进行安装

    我的设置是F8打开:

     map <F8> <Esc>:NERDTree <CR> 

    :help nerdtree可查阅详细用法

    左边的为nerdtree

    2.4 好看的状态栏:vim-powerline

    PowerLine是一个增强的Vim状态栏插件。当Vim处于NORMAL、INSERT、BLOCK等状态时,状态栏会呈现不同的颜色,同时状态栏还会显示当前编辑文件的格式(uft-8等)、文件类型(java、xml等)和光标位置等。同样的vundle里也有

     Plugin 'Lokaltog/vim-powerline' 

    然后安装同上,无需设置,重启即可看到效果。

    以上图片的下面部分则是powerline的效果图:

    2.5 好看的背景:molokai

    我用的背景和文字分别是:molokai和Source Code Pro

    当然了,需要安装对应的字体和下载主题文件,主题文件需要移至$HOME/.vim/colors/目录下,字体文件移至/usr/share/fonts/目录下(建议将.ttf文件移至TTF目录下,.otf文件移至OTF目录下),然后更新系统的字体缓存:#fc-cache -fv即可。

    配置字体和背景还需要:

     colorscheme molokai 

     set guifont=Source Code Pro 12 #12是字体大小 

    字体以及主题文件的下载地址我都会在下面给出,接下来介绍jeaye/color_coded插件:

    这个插件可以高亮c/c++程序的struct,class等等结构。不过要在.vimrc中配置:

     hi link StructDecl Type 

     hi link UnionDecl Type 

     hi link ClassDecl Type 

     hi link EnumDecl Type 

    2.6 超级强大的自动补全插件:YouCompleteMe

    安装这个插件要求vim支持python2.6以上,如果支持,则用Vundle安装:

     Plugin 'Valloric/YouCompleteMe' 

    之后的安装同上,安装完成后会有一个错误显示:

    Done! With errors; press l to view log
    ycm_client_support.[so|pyd|dll] and ycm_core.[so|pyd|dll] not detected; you need
    to compile YCM before using it. Read the docs!

    这是正常的,因为ycm需要手工编译出库文件,到 .vim/bundle/YouCompleteMe下跑

     #./install.sh --clang-completer     --参数是为了支持c/c++ 的补全,系统需要安装clang

          YouCompleteMe 的补全配置文件在$HOME/.vim/bundle/YouCompleteMe/cpp/ycm/.ycm_extra_conf.py(我的在$HOME/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py),这是个隐藏文件。通过修改它可以进行自己想要的补全功能。

    我的.ycm_extra_conf.py文件配置如下:

      1 # This file is NOT licensed under the GPLv3, which is the license for the rest
      2 # of YouCompleteMe.
      3 #
      4 # Here's the license text for this file:
      5 #
      6 # This is free and unencumbered software released into the public domain.
      7 #
      8 # Anyone is free to copy, modify, publish, use, compile, sell, or
      9 # distribute this software, either in source code form or as a compiled
     10 # binary, for any purpose, commercial or non-commercial, and by any
     11 # means.
     12 #
     13 # In jurisdictions that recognize copyright laws, the author or authors
     14 # of this software dedicate any and all copyright interest in the
     15 # software to the public domain. We make this dedication for the benefit
     16 # of the public at large and to the detriment of our heirs and
     17 # successors. We intend this dedication to be an overt act of
     18 # relinquishment in perpetuity of all present and future rights to this
     19 # software under copyright law.
     20 #
     21 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
     22 # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     23 # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
     24 # IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
     25 # OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
     26 # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
     27 # OTHER DEALINGS IN THE SOFTWARE.
     28 #
     29 # For more information, please refer to <http://unlicense.org/>
     30 
     31 import os
     32 import ycm_core
     33 
     34 # These are the compilation flags that will be used in case there's no
     35 # compilation database set (by default, one is not set).
     36 # CHANGE THIS LIST OF FLAGS. YES, THIS IS THE DROID YOU HAVE BEEN LOOKING FOR.
     37 flags = [
     38 '-Wall',
     39 '-Wextra',
     40 '-Werror',
     41 '-Wc++98-compat',
     42 '-Wno-long-long',
     43 '-Wno-variadic-macros',
     44 '-fexceptions',
     45 '-DNDEBUG',
     46 # You 100% do NOT need -DUSE_CLANG_COMPLETER in your flags; only the YCM
     47 # source code needs it.
     48 '-DUSE_CLANG_COMPLETER',
     49 # THIS IS IMPORTANT! Without a "-std=<something>" flag, clang won't know which
     50 # language to use when compiling headers. So it will guess. Badly. So C++
     51 # headers will be compiled as C headers. You don't want that so ALWAYS specify
     52 # a "-std=<something>".
     53 # For a C project, you would set this to something like 'c99' instead of
     54 # 'c++11'.
     55 '-std=c++11',
     56 # ...and the same thing goes for the magic -x option which specifies the
     57 # language that the files to be compiled are written in. This is mostly
     58 # relevant for c++ headers.
     59 # For a C project, you would set this to 'c' instead of 'c++'.
     60 '-x',
     61 'c++',
     62 '-isystem',
     63 '../BoostParts',
     64 '-isystem',
     65 # This path will only work on OS X, but extra paths that don't exist are not
     66 # harmful
     67 '-isystem',
     68 '../llvm/include',
     69 '-isystem',
     70 '../llvm/tools/clang/include',
     71 '-I',
     72 '.',
     73 '-I',
     74 './ClangCompleter',
     75 '-isystem',
     76 './tests/gmock/gtest',
     77 '-isystem',
     78 './tests/gmock/gtest/include',
     79 '-isystem',
     80 './tests/gmock',
     81 '-isystem',
     82 './tests/gmock/include',
     83 '-isystem',
     84 '/usr/bin/',
     85 '-isystem',
     86 '/usr/lib64/gcc/x86_64-pc-linux-gnu/6.1.1',
     87 '-isystem',
     88 '/usr/include/c++/6.1.1',
     89 '-isystem',
     90 '/usr/include/c++/6.1.1/x86_64-pc-linux-gnu',
     91 '-isystem',
     92 '/usr/include/c++/6.1.1/backward',
     93 '-isystem',
     94 '/usr/local/include',
     95 '-isystem',
     96 '/usr/lib/clang/3.8.0/include',
     97 '-isystem',
     98 '/usr/include',
     99 ]
    100 
    101 
    102 # Set this to the absolute path to the folder (NOT the file!) containing the
    103 # compile_commands.json file to use that instead of 'flags'. See here for
    104 # more details: http://clang.llvm.org/docs/JSONCompilationDatabase.html
    105 #
    106 # You can get CMake to generate this file for you by adding:
    107 #   set( CMAKE_EXPORT_COMPILE_COMMANDS 1 )
    108 # to your CMakeLists.txt file.
    109 #
    110 # Most projects will NOT need to set this to anything; you can just change the
    111 # 'flags' list of compilation flags. Notice that YCM itself uses that approach.
    112 compilation_database_folder = ''
    113 
    114 if os.path.exists( compilation_database_folder ):
    115   database = ycm_core.CompilationDatabase( compilation_database_folder )
    116 else:
    117   database = None
    118 
    119 SOURCE_EXTENSIONS = [ '.cpp', '.cxx', '.cc', '.c', '.m', '.mm' ]
    120 
    121 def DirectoryOfThisScript():
    122   return os.path.dirname( os.path.abspath( __file__ ) )
    123 
    124 
    125 def MakeRelativePathsInFlagsAbsolute( flags, working_directory ):
    126   if not working_directory:
    127     return list( flags )
    128   new_flags = []
    129   make_next_absolute = False
    130   path_flags = [ '-isystem', '-I', '-iquote', '--sysroot=' ]
    131   for flag in flags:
    132     new_flag = flag
    133 
    134     if make_next_absolute:
    135       make_next_absolute = False
    136       if not flag.startswith( '/' ):
    137         new_flag = os.path.join( working_directory, flag )
    138 
    139     for path_flag in path_flags:
    140       if flag == path_flag:
    141         make_next_absolute = True
    142         break
    143 
    144       if flag.startswith( path_flag ):
    145         path = flag[ len( path_flag ): ]
    146         new_flag = path_flag + os.path.join( working_directory, path )
    147         break
    148 
    149     if new_flag:
    150       new_flags.append( new_flag )
    151   return new_flags
    152 
    153 
    154 def IsHeaderFile( filename ):
    155   extension = os.path.splitext( filename )[ 1 ]
    156   return extension in [ '.h', '.hxx', '.hpp', '.hh' ]
    157 
    158 
    159 def GetCompilationInfoForFile( filename ):
    160   # The compilation_commands.json file generated by CMake does not have entries
    161   # for header files. So we do our best by asking the db for flags for a
    162   # corresponding source file, if any. If one exists, the flags for that file
    163   # should be good enough.
    164   if IsHeaderFile( filename ):
    165     basename = os.path.splitext( filename )[ 0 ]
    166     for extension in SOURCE_EXTENSIONS:
    167       replacement_file = basename + extension
    168       if os.path.exists( replacement_file ):
    169         compilation_info = database.GetCompilationInfoForFile(
    170           replacement_file )
    171         if compilation_info.compiler_flags_:
    172           return compilation_info
    173     return None
    174   return database.GetCompilationInfoForFile( filename )
    175 
    176 
    177 def FlagsForFile( filename, **kwargs ):
    178   if database:
    179     # Bear in mind that compilation_info.compiler_flags_ does NOT return a
    180     # python list, but a "list-like" StringVec object
    181     compilation_info = GetCompilationInfoForFile( filename )
    182     if not compilation_info:
    183       return None
    184 
    185     final_flags = MakeRelativePathsInFlagsAbsolute(
    186       compilation_info.compiler_flags_,
    187       compilation_info.compiler_working_dir_ )
    188 
    189     # NOTE: This is just for YouCompleteMe; it's highly likely that your project
    190     # does NOT need to remove the stdlib flag. DO NOT USE THIS IN YOUR
    191     # ycm_extra_conf IF YOU'RE NOT 100% SURE YOU NEED IT.
    192    # try:
    193    #   final_flags.remove( '-stdlib=libc++' )
    194    # except ValueError:
    195    #   pass
    196   else:
    197     relative_to = DirectoryOfThisScript()
    198     final_flags = MakeRelativePathsInFlagsAbsolute( flags, relative_to )
    199 
    200   return {
    201     'flags': final_flags,
    202     'do_cache': True
    203   }
    View Code

    flags里面的这几条请依据自己的gcc和clang的版本来填写(gcc --version和clang --version):

    '/usr/lib64/gcc/x86_64-pc-linux-gnu/6.1.1',
    '/usr/include/c++/6.1.1',
    '/usr/include/c++/6.1.1/x86_64-pc-linux-gnu',
    '/usr/include/c++/6.1.1/backward',
    '/usr/lib/clang/3.8.0/include'

    接着就是在.vimrc文件里进行配置了:

    """"""""""""" ycm配置
    nnoremap <leader>gt :YcmCompleter GetType<CR>
    nnoremap <leader>gp :YcmCompleter GetParent<CR>
    nnoremap <leader>gg :YcmCompleter GoToDefinitionElseDeclaration<CR>
    let g:ycm_global_ycm_extra_conf = '~/.ycm_extra_conf.py'
    let g:ycm_confirm_extra_conf=0 "不再询问是否加载.ycm_extra_conf.py文件 
    let g:ycm_complete_in_comments = 1  "注释也用补全
    let g:ycm_autoclose_preview_window_after_completion = 1
    let g:ycm_add_preview_to_completeopt = 0

    gt可以获得该变量类型,gp可以跳转到它的父类的声明处,gg跳转到定义处。详细教程参考https://github.com/Valloric/YouCompleteMe/#options

    2.7 c/c++快捷编译运行

    这个功能主要使用自动命令autocmd,使得vim自动识别文件,然后F5进行编译,F6运行程序,另外还有整行注释功能(按./注释,按..取消注释):

    """"""""""""""""""""""""""""""""""""""""C语言的编译运行"""""""""""""""""""""""""""""""""""""""""
    " <F5>编译C/py语言,<F6>运行
    augroup ccompile
        autocmd Filetype c map <F5> <Esc>:w<CR>:!gcc % -std=c99 -g -o %< -lm <CR>
        autocmd Filetype cpp map <F5> <Esc>:w<CR>:!g++ % -std=c++11 -g -o %< -lm <CR>
        autocmd Filetype python map <F5> <Esc>:w<CR>:!python % <CR>
    augroup END
    
    augroup crun
        autocmd Filetype c map <F6> <Esc>:! ./%< <CR>
        autocmd Filetype cpp map <F6> <Esc>:! ./%< <CR>
    augroup END
    
    " 整行注释
    augroup comment
        autocmd Filetype c noremap <buffer> <localleader>/ I//<Esc>
        autocmd Filetype cpp noremap <buffer> <localleader>/ I//<Esc>
        autocmd Filetype h noremap <buffer> <localleader>/ I//<Esc>
    augroup END
    
    augroup nocomment
        autocmd Filetype c noremap <buffer> <localleader>. ^xx
        autocmd Filetype cpp noremap <buffer> <localleader>. ^xx
        autocmd Filetype h noremap <buffer> <localleader>. ^xx
    augroup END

    2.8 相关下载

    •.vimrc文件:click here

    •Source Code Pro字体:click here

    •主题(这里有百来个,自己挑选):click here

    3 .vimrc代码

    以下是我的.vimrc文件内容:

      1 "Y_VIMRC 
      2 "author cqm 
      3 "email chester@hit.edu.cn
      4 "Time: Wed Feb  3 16:40:07 CST 2016
      5 "settings are as followed:
      6 
      7 "---------------------------------START-------------------------------------------------
      8 
      9 
     10 """""""""""""""""""""""""""""""""""""""基本设置""""""""""""""""""""""""""""""""""""""""
     11 " 设定默认解码 
     12 set fenc=utf-8 
     13 set fencs=utf-8,usc-bom,euc-jp,gb18030,gbk,gb2312,cp936 
     14 
     15 " 支持256色,使得vim配色支持终端
     16 set t_Co=256
     17 
     18 " C缩进
     19 set smartindent 
     20 set cindent
     21 
     22 " 设置背景和字体
     23 colorscheme molokai
     24 set guifont=Source Code Pro 12 
     25 
     26 " 不要使用vi的键盘模式,而是vim自己的 
     27 set nocompatible 
     28 
     29 " history文件中需要记录的行数 
     30 set history=1000 
     31 
     32 " 在处理未保存或只读文件的时候,弹出确认 
     33 set confirm
     34 
     35 " 与windows共享剪贴板 
     36 set clipboard+=unnamed 
     37  
     38 " 侦测文件类型 
     39 filetype off 
     40  
     41 " 为特定文件类型载入相关缩进文件 
     42 filetype indent on 
     43  
     44 " 带有如下符号的单词不要被换行分割 
     45 set iskeyword+=_,$,@,%,#,- 
     46 
     47 " 语法高亮
     48 syntax enable
     49 syntax on 
     50  
     51 "隐藏GUI的工具栏
     52 set guioptions=P
     53 
     54 " 不要备份文件 
     55 set nobackup 
     56 
     57 " 不要生成swap文件
     58 setlocal noswapfile 
     59  
     60 " 字符间插入的像素行数目 
     61 set linespace=0 
     62  
     63 " 在状态行上显示光标所在位置的行号和列号 
     64 set ruler 
     65  
     66 " 命令行(在状态行下)的高度,默认为1,这里是2 
     67 set cmdheight=2 
     68 
     69 " 使回格键(backspace)正常处理indent, eol, start等 
     70 set backspace=indent,eol,start
     71  
     72 " 允许backspace和光标键跨越行边界 
     73 set whichwrap+=<,>,b,s,[,]
     74  
     75 " 不让vim发出讨厌的滴滴声 
     76 set noerrorbells 
     77  
     78 " 高亮显示匹配的括号 
     79 set showmatch 
     80 
     81 " 匹配括号高亮的时间(单位是十分之一秒) 
     82 set matchtime=5 
     83  
     84 " 在搜索的时候忽略大小写 
     85 set ignorecase 
     86  
     87 " 不要高亮被搜索的句子(phrases) 
     88 set nohlsearch 
     89  
     90 " 在搜索时,输入的词句的逐字符高亮(类似firefox的搜索) 
     91 set incsearch 
     92  
     93 " 光标移动到buffer的顶部和底部时保持3行距离,窗口滚动最小距离 
     94 set scrolloff=3 
     95  
     96 " 2为总显示最后一个窗口的状态行
     97 " 设为1则窗口数多于一个的时候显示最后一个窗口的状态行;
     98 " 0不显示最后一个窗口的状态行 
     99 set laststatus=2 
    100  
    101 " 继承前一行的缩进方式,特别适用于多行注释 
    102 ""set autoindent 
    103 
    104 " 显示行号
    105 set number
    106  
    107 " 制表符为4 
    108 set tabstop=4 
    109  
    110 " 统一缩进为4 
    111 set softtabstop=4 
    112 set shiftwidth=4 
    113  
    114 " 不要用空格代替制表符 
    115 set noexpandtab 
    116  
    117 " 不要换行 
    118 " set nowrap 
    119 " set sidescroll=10
    120  
    121 " 在行和段开始处使用制表符 
    122 set smarttab 
    123 
    124 " Ctrl+A全选,Ctrl+C复制,Ctrl+V粘贴
    125 map <C-A> ggvG$ 
    126 imap <C-A> <Esc>ggvG$
    127 vmap <C-C> "+y<Esc>
    128 map <C-V> "+p
    129 imap <C-V> <Esc>"+pa
    130 
    131 " 括号等的自动匹配
    132 inoremap ( ()<Esc>i
    133 inoremap [ []<Esc>i
    134 inoremap { {}<Esc>i
    135 inoremap ' ''<Esc>i
    136 inoremap " ""<Esc>i
    137 
    138 " 设置<leader>和<localleader>
    139 let mapleader = ","
    140 let maplocalleader = "."
    141 
    142 " 可以折叠 
    143 set foldenable 
    144 set foldmethod=manual 
    145 
    146 " 自动更新.vimrc
    147 map <leader>vo <Esc>:vsp ~/.vimrc<CR>
    148 
    149 
    150 """"""""""""""""""""""""""""""""""""""""Vundle管理插件""""""""""""""""""""""""""""""""""""""""
    151 set rtp+=~/.vim/bundle/vundle/
    152 call vundle#rc()
    153 Plugin 'gmarik/vundle'
    154 Plugin 'tpope/vim-fugitive'
    155 Plugin 'Lokaltog/vim-easymotion'
    156 Plugin 'tpope/vim-rails.git'
    157 Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
    158 Plugin 'L9'
    159 Plugin 'FuzzyFinder'
    160 Plugin 'git://git.wincent.com/command-t.git'
    161 Plugin 'Valloric/YouCompleteMe'
    162 Plugin 'Valloric/ListToggle'
    163 Plugin 'scrooloose/syntastic'
    164 Plugin 'davidhalter/jedi'
    165 Plugin 'majutsushi/tagbar'
    166 Plugin 'scrooloose/nerdtree'
    167 Plugin 'Lokaltog/vim-powerline'
    168 Plugin 'jeaye/color_coded'
    169 Plugin 'octol/vim-cpp-enhanced-highlight'
    170 
    171 call vundle#end()
    172 filetype plugin indent on     " required
    173 
    174 """"""""""""""""""""""""""""""""""""""""C语言的编译运行"""""""""""""""""""""""""""""""""""""""""
    175 " <F5>编译C/py语言,<F6>运行
    176 augroup ccompile
    177     autocmd Filetype c map <F5> <Esc>:w<CR>:!gcc % -std=c99 -g -o %< -lm <CR>
    178     autocmd Filetype cpp map <F5> <Esc>:w<CR>:!g++ % -std=c++11 -g -o %< -lm <CR>
    179     autocmd Filetype python map <F5> <Esc>:w<CR>:!python % <CR>
    180 augroup END
    181 
    182 augroup crun
    183     autocmd Filetype c map <F6> <Esc>:! ./%< <CR>
    184     autocmd Filetype cpp map <F6> <Esc>:! ./%< <CR>
    185 augroup END
    186 
    187 " 整行注释
    188 augroup comment
    189     autocmd Filetype c noremap <buffer> <localleader>/ I//<Esc>
    190     autocmd Filetype cpp noremap <buffer> <localleader>/ I//<Esc>
    191     autocmd Filetype h noremap <buffer> <localleader>/ I//<Esc>
    192 augroup END
    193 
    194 augroup nocomment
    195     autocmd Filetype c noremap <buffer> <localleader>. ^xx
    196     autocmd Filetype cpp noremap <buffer> <localleader>. ^xx
    197     autocmd Filetype h noremap <buffer> <localleader>. ^xx
    198 augroup END
    199 
    200 
    201 " 大括号补全
    202 autocmd Filetype c,cpp,h inoremap {<CR> {<CR>}<Esc>O
    203 
    204 
    205  
    206 """"""""""""""""""""""""""""""""""""""""""各插件的配置""""""""""""""""""""""""""""""""""""""""""
    207 """"""""""""" Ctags配置
    208 set tags=./tags,./../tags,./*/tags
    209 map <F7> <Esc>:!ctags -R <CR><CR>
    210 
    211 """"""""""""" ycm配置
    212 nnoremap <leader>gt :YcmCompleter GetType<CR>
    213 nnoremap <leader>gp :YcmCompleter GetParent<CR>
    214 nnoremap <leader>gg :YcmCompleter GoToDefinitionElseDeclaration<CR>
    215 let g:ycm_global_ycm_extra_conf = '~/.ycm_extra_conf.py'
    216 let g:ycm_confirm_extra_conf=0 "不再询问是否加载.ycm_extra_conf.py文件 
    217 let g:ycm_complete_in_comments = 1  "注释也用补全
    218 let g:ycm_autoclose_preview_window_after_completion = 1
    219 let g:ycm_add_preview_to_completeopt = 0
    220 
    221 """"""""""""" TagBar设置
    222 map tb <Esc>:Tagbar <CR>
    223 
    224 """"""""""""" NerdTree设置
    225 map <F8> <Esc>:NERDTree <CR>
    226 
    227 """"""""""""" color_coded设置
    228 hi link StructDecl Type
    229 hi link UnionDecl Type
    230 hi link ClassDecl Type
    231 hi link EnumDecl Type
    232 
    233 "----------------------------------------------END--------------------------------------------"
    View Code

    4 vim使用技巧

    4.1 基本操作技巧

    •插入模式下h,j,k,l分别表示左,下,上,右

    •J表示合并两行,使用时在前一行按大写J

    •o表示在下一行开始新的一行,O表示在上一行开始新的一行

    •u可以撤销上一次的任意修改,再按u则继续撤销上上次的修改,而ctrl+r可以对此次撤销操作进行撤销

    •i表示在光标字符前插入,a表示在光标字符后插入,I将光标置于第一个非空白字符前并插入,A在行尾插入

    •w指想后移进一个单词,且光标置于首字母处,b相反,移前一个单词,光标也是首字母处;其次,3w则执行3次w命令。e同w,只是光标置于单词末尾,ge同b一样,只是光标置于单词末尾;大写W以空白为边界区分单词分隔,而小写w以,/等为分隔

    •^或者是0可以将光标移至行首,$移至行末,2$则是下一行行末,以此类推

    •fx为向右查找x,5fx为向右查找第五个x,F为向左查找;tx与fx类似,只是光标停在x前一个字符处,T则向左查找,用;可重复命令或者是,反方向重复

    •%用于匹配括号,中括号,大括号,双引号等

    •33G将光标置于第33行,gg跳至文章第一行,G跳至文章最后一行

    •ctrl+g显示当前光标所在位置

    •/string用来搜索字符串,n向下搜索,2n为第二个,N向前搜索;?string同/string,n向前搜索,N向下搜索;*可以向下查找当前光标所在单词,#为向前搜索;/和?的正则表达式的运用规则主要有:.匹配任何单个字符,$匹配行尾字符串,^匹配行首字符串

    •ma将当前光标的位置标记为a,`a则是跳转到a标记,'a为跳转到a标记所在行的行首,:marks可以查看所有标记--在列表中,标志名为'为进行此次跳转之前的起跳点,"为上次编辑该文件时光标的最后位置,[为最后一次修改的起始位置,]为最后一次修改的结束位置

    •dw删除包含光标所在位置的第一个单词,包括后面的空白字符;d2w删除第二个单词;de,同dw,不过不包括空白字符;d$则删除当前光标到末尾的所有字符;cw为删除该单词后进入插入模式;dd删除整行,cc删除后进入插入模式;D=d$,s=cl(删除光标下字符并且进入插入模式),S=cc

    •r更换单个字符,5r将光标下字符开始数第5个更换,.重复修改命令,R进入replace模式,V进入visual模式,ctrl+v矩形框图式的visual模式;visual模式下,as可直接选中一个句子

    •y可对选中的内容进行复制,Y复制整行内容,yw复制一个单词包括其后的空白字符,ye则不包括,yy复制整行;p为粘贴,若是单个字符(包括x删除的字符),p将粘贴到当前光标的后一个位置,若是一行(包括dd后的内容),则粘贴至下一行

    •cas删除一个句子并且进入插入模式,cis类似,只是不包括后面的空格

    •~改变当前光标下字符的大小写

    •gu改成小写,如guj将下一行的所有字符改成小写,gU改成大写,g~大小写反写

    •g ctl+g 显示字数

    •zf创建折行,zo打开,zc关闭,zR/zr打开所有这行,zM/zm关闭所有折行,如zfap折叠一个段落,zd删除当前行折叠,zD删除所有折叠

    4.2 vim脚本初试

    将命令台的命令写入.vimrc文件中,便能永久生效,如下

    •set nohlsearch 取消搜索高亮效果

    •set incsearch 边打字边搜索

    •set nowrapscan 到了行尾或者行首便停止搜索,不必反复绕

    •命令台下:scriptname 搜索启动文件路径

    •命令台下:options 打开选项,回车可跳转对应主题,对选项进行更改后回车即可成功设置,:set 选项名& 用于恢复默认值

    •set nowrap 长行不折到下一行

    •set whichwrap=b,s,<,> 退格或者左方向键到行首时,再按一次到上一行行尾;空格或者右方向键到行尾时,再按一次到下一行行首;set whichwrap = b,s,<,>,[,] 保证在插入模式下也可行

    •set list 将制表符显示出来,隐藏起来为nolist,默认情况下制表符表示为^I,行末尾为$,行末尾空白字符为空格,但是可以通过set listchars=tab:^I.trail:-(空白字符)来修改

    •查看一个word可包含的字符set iskeyword,会显示iskeyword=@(所有字母),48-57(ASCII中0~9),_,192-255(拉丁字母),若想加入-,则set iskeyword+=-来实现,同理减去某个字符用-=

    4.3 编辑多个文件

    •:edit foo.txt 关闭当前窗口,编辑foo.txt文件

    •#vim 1.txt 2.txt 3.txt 窗口只会显示第一个文件,剩下的文件可以通过:next来查看

    •:args 查看列表中有哪些文件,其中正在编辑的文件用[]括起

    •:previous 前一个文件,:last 最后一个文件,:first 第一个文件,:3next 向后数第三个

    •:args a.txt b.txt c.txt 重新编排顺序,且打开第一个文件

    •ctrl+^可以在两个文件中切换(当前和下一个)

    •当回到某个文件时,`.可以回到最后修改处,`"回到最后光标停留处

    •ma为局部标记,只对该文件有用;mA为全局标记,对全部文件有用

    •"将文本保存至寄存器中,名字为26个小写英文字母例如--------"fyas复制句子到f寄存器中,ctrl+vjjww"by复制文本到b寄存器中,粘贴可用"fp,删除时也可以将内容复制,如"wdaw

    •:saveas change.txt 另存为

    4.4 分割窗口

    •:split 将分成上下两个屏幕,光标定位于上面的窗口

    •ctrl+w+w 切换窗口

    •:only 除当前窗口,其他窗口都关闭

    •:3split a.txt 高度为3打开a.txt

    •ctrl+w+- 减小高度,ctrl+w++ 增加高度,3ctrl+w++ 增加3行高度

    •:vsplit 分成左右,光标定位于左

    •ctrl+w+h,j,k,l可切换窗口

    •:wall 保存全部窗口,:qall 退出所有窗口

    •#vim -o a.txt b.txt c.txt 为每个文件水平分配一个窗口,O则垂直分配

    •#vimdiff main.c main.c~ 查看所作的修改,:diffupdate可以重新比较2个文件,dp和do可以使该行消除不同

    •tabedit a.txt 建立一个页签,gt可以在不同页签中切换

    •read b.txt 将b.txt中内容添加到光标下一行的开始位置

    •:.,$write! b.txt 将当前行到尾行的内容写入b.txt中

    4.5 大幅操作

    •qb 记录命令,将接下来的动作记录到b寄存器中,直到再按下q结束记录,@b可以重复执行b中命令

    •qB 向b中追加命令,同样"By也是追加操作

    •:[range] s/from/to/[flags] 替换命令,例如:%s/Professor/Teacher/g 表示对所有行Professor替换成Techer,其中%表示所有行,g表示一行中的所有符合条件的匹配,若无g则只是每行第一个被替换,from中字符串可以用正则表达式,对于range,可以表示如下:

    1,5     1到5行

    75      第75行

    .,$      当前行到尾行

    %       全文

    •可用别的字符代替分隔符

    •:[range]global/{pattern}/{command} 全局命令,如:g+//+s/foobar/barfoo/g 意为将c文件中//注释中的foobar改成barfoo,其中+为分割符

    •!{motion}{program} 其中motion为指定内容,program为外部命令,如!5Gsort将光标所在行到第5行的文本进行sort操作;!!为过滤当前行,如!!date则将时间信息代替当前行内容

    •:0read !date -u将utc格式时间插入文件开头

    •:read !date 插入时间

    •.,$!sort 当前行到尾行sort

    •:source filename 执行脚本,:souece %为执行当前脚本

    •:grep java *.c 在所有c程序中找到java的行,并且跳到第一个符合的行,:cnext下一个,:cprev上一个,:clist列表

    •:write !wc 显示行数,单词数,字数

    •保存一个会话 :mksession! vimbook.vim下次运行#vim -S vimbook.vim即可

    4.6 文件处理

    •:set path += /a/b/c 添加path

    •gf查找光标下关键字的定义,在path下查找

    •:find stdio.h 在path中查找,sfind则会建立新窗口

    •缓冲区分成三种:active(出现在窗口),hidden(隐藏,不在窗口),inactive(已经编辑完)

    •:hide edit a.txt 将当前文件隐藏,但是未保存,然后转而编辑a.txt

    •:buffers 显示缓存区列表,前面有编号,后面是一系列符号,其中%表示当前缓冲区,+表示有改动的,=表示只读,l为被载入并且显示在窗口,h为被载入但是不显示在窗口

    •:buffer [编号] 可跳至相应的缓冲区,bnext下一个缓冲区,bprevious上一个缓冲区,还有bfirst,blast;bdelete则是删除,后面接编号

    •使vim自动识别mac,windows,unix系统文件,只需:set fileformats=unix,dos,mac,可以+=和-=;:set fileformat?可以查看文件格式

    •:edit ++ff=unix a.txt 强制指定a.txt为unix文件,:w使其保存为unix文件

    •#vim -x a.txt 为文件加密

    •:set key=    解密(因为密码为空格)

    •:X 加密

    •#vim -b data 打开一个二进制文件

    •:set display=uhex 以十六进制显示不可打印字符

    •:cd进入一个目录,会使所有窗口改变

    •:pwd显示当前目录

    •:lcd会改变当前窗口,但是不影响别的窗口

    4.7 定义新命令

    •脚本语言中,空格为<Space>,回车为<CR>,空命令为<Nop>,|字符为<Bar>

    •:command列出自定义命令,:command -nargs=[char] my_command_name command定义一个新命令,其中char可为:0,1,*,?,+分别表示0个参数,1个参数,任意参数,0或1个参数,1个或多个参数

    •例如:command -nargs=+ Say :echo "<args>" 则命令模式下Say Hello则会打印,需要注意的是,<args>不支持用户参数中存在双引号,不过<q-args>可以

    •在命令中还可以用-range指定范围,可以用delcommand删除单个命令,comclear删除所有命令

    •:autocmd {event} {file_pattern} {command}表示在event触发时执行command,其中event可以为BufReadPost(开始编辑一个已载入的文件),BufNewFile(开始编辑一个未载入的文件),FileReadPre(开始读文件),FileWritePre(保存文件前),当然也可以是FileType指定文件类型,例如:autocmd FileType c command,对c文件进行执行命令;file_pattern为文件名模式,可以用*匹配任何字符,?匹配单个字符,[abc]匹配a,b,c

    •augroup group_name {一系列autocmd命令} augroup END 为一个组定义多个自动命令

    •被自动命令执行的都是ex命令,如果要在normal模式下定义命令,则需要在{command}前面加入normal

    4.8 vim脚本进阶

    •变量赋值let {variable} = {expression}

    •while循环: while {condition}

              {statements}

                      end while

    •变量名由ASCII,,数字,下划线组成,不能以数字开头

    •s:name 脚本文件作用域,此时s:name这个变量只在当前脚本文件中有效,其他的脚本文件中如果也定义了同名的s:name也没关系,因为这两者彼此独立。这一点与C中的static关键字类似;b:name 缓冲区作用域,b:name只在指定的缓冲区中有效;w:name只在指定的窗口中有效;g:name 全局作用域,函数外定义的变量的默认值;v:name vim预定义的变量,注意预定义变量不同于vim的选项(option)变量;l:name 函数内部的局部变量,函数内部定义的变量的默认值

    •字符串变量若本身包含双引号,则需要在引号前用

    •字符串序列中的特殊字符   <Tab>

                h   <NL>段行符

                                       <CR>

                                    e    <Esc>

                                         <BS>

    •表达式中可包含以下语素:$NAME环境变量名,&namevim中选项名,@rvim中寄存器名

    •if {condition}

        {statements}

     elseif {condition}

        {statements}

     endif

    •excute只可执行ex命令,加上normal后可执行normal模式命令

    •函数定义function {name} 

                     {body}

                endfunction

    4.9 vim剪贴板

    •:reg查看vim中所有剪贴板内容,其中""为当前剪贴板(用y复制后的内容),"0-9是历史剪贴板,"+为系统剪贴板,"*为当前选择区,为选择的内容

    •鼠标中键为当前选择区内容

    •被替换或者被删除的内容会进入当前剪贴板

    作者: vachester
    出处:http://www.cnblogs.com/vachester/
    邮箱:xcchester@gmail.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。

  • 相关阅读:
    【NOIP2016提高组】 Day1 T3 换教室
    【NOIP2016 Day1 T2】天天爱跑步
    web@前端--html,css,javascript简介、第一个页面(常用标签简介)
    MySQL--视图view、触发器trigger、事务(start transaction)、存储过程(特殊的数据逻辑处理函数)、流程控制(if,case....)
    MySQL--pymysql模块
    MySQL--(了解)可能会用到的内置函数
    MySQL--详细查询操作(单表记录查询、多表记录查询(连表查询)、子查询)
    MySQL--表操作(约束条件foreign key关联表 多对1,多对多,1对1)
    MySQL--表操作(innodb表字段数据类型、约束条件)、sql_mode操作
    MySQL基本语句、存储引擎
  • 原文地址:https://www.cnblogs.com/vachester/p/5659648.html
Copyright © 2011-2022 走看看