Vim配置及使用技巧

      要說Linux下比較好用的文本編輯器,我推薦vim(固然不少人都用emacs,可我沒用過),用vim也有一年左右,有些心得體會想與諸位分享。在個人學習過程當中,借鑑了很多優秀的博客,其中有csdn大神namecyf的博客http://blog.csdn.net/namecyf/article/details/7787479和博客園風歌的blog的http://www.cnblogs.com/junnyfeng/p/3633697.html這兩篇文章。html

1 Vim的安裝與基本介紹

•安裝java

Archlinux下安裝Vim直接用pacman便可,其餘Linux系統也相似,建議把gvim也安裝上。python

•配置文件linux

     系統安裝vim時應該會有一個vimrc文件,修改裏面的代碼能夠對全部用戶的Vim進行配置,咱們通常只是對當前用戶的vim進行配置,故咱們能夠在$HOME下建立一個.vimrc的隱藏文件,這個就是vim的配置文件。c++

•查看vim是否支持pythongit

1.在vim界面執行:version,若是python前有+號,就是支持,減號就是不支持。若是不支持,則須要以編譯安裝方式從新安裝vim。以下:github

2.首先把系統的vim所有刪除,包括vim,gvim,vim-runtime,vim-common,vim-gui-common,vim-tiny正則表達式

3.而後下載源碼包express

4.進入目錄進行配置編譯屬性,以下json

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 函數內部的局部變量,函數內部定義的變量的默認值

•字符串變量若自己包含雙引號,則須要在引號前用\

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

            \h   <NL>段行符

                                \r    <CR>

                                \e    <Esc>

                                \b     <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是歷史剪貼板,"+爲系統剪貼板,"*爲當前選擇區,爲選擇的內容

•鼠標中鍵爲當前選擇區內容

•被替換或者被刪除的內容會進入當前剪貼板

相關文章
相關標籤/搜索