要說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 }
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--------------------------------------------"
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是歷史剪貼板,"+為系統剪貼板,"*為當前選擇區,為選擇的內容
•鼠標中鍵為當前選擇區內容
•被替換或者被刪除的內容會進入當前剪貼板