一、安裝
1)dnf安裝
fedora22以下
sudo yum install vim
fedora22及以上
sudo dnf install vim
如果遇到下面類似的錯誤
file /usr/share/man/man1/vim.1.gz from install of vim-common-2:7.4.1718-1.fc22.x86_64 conflicts with file from package vim-minimal-2:7.4.640-4.fc22.x86_64
運行如下命令,升級vi
sudo dnf update vi
用這種方式安裝,vim是在安裝在/usr/share/vim
2)源碼安裝
ftp下載
wget ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2
下載到本地的是一個vim-7.4.tar.bz2,所以要解壓
解壓
tar -jxvf vim-7.4.tar.bz2
解壓后會在當前目錄得到vim74文件夾,切換到vim74目錄
cd vim74
編譯前的配置
./configure --prefix=/opt/vim --with-x --enable-gui=gnome2 --with-features=huge --disable-selinux --enable-multibyte
配置選項說明,可以運行./configure --help來查看全部配置選項
--prefix=/opt/vim 安裝路徑
--with-x --enable-gui=gnome2 生成gvim
--with-features=huge 支持最大特性
--disable-selinux 編譯時不檢查是否支持selinux
--enable-multibyte 支持多字節
這里會要求安裝gcc編譯器,如果沒安裝就安裝
sudo dnf install gcc
配置時如果出現下面錯誤
no terminal library found checking for tgetent()... configure: error: NOT FOUND! You need to install a terminal library; for example ncurses. Or specify the name of the library with --with-tlib.
這是沒安裝ncurses庫,運行如下命令安裝
sudo dnf install ncurses-devel
需要重新配置可 運行如下命令,清理上一次編譯生成的所有文件
make distclean
配置后,編譯並且安裝
sudo make && make install
建立軟連接,即把剛剛安裝路徑加入到系統環境變量
mv /usr/bin/vim /usr/bin/vim_backup # 先將原來的備份 ln -s /opt/vim/bin/vim /usr/bin/vim # 建立軟鏈接
git下載
git clone https://github.com/vim/vim.git
克隆之后會在當前目錄得到vim文件夾,切換到vim目錄后,就和ftp下載的編譯一樣
cd vim
二、配置
准備工作
先在home目錄下,新建.vim目錄和.vimrc文件,vim默認配置文件是/etc/vimrc,這個是作用整個系統的,所以一般不改這個
切換到當前用戶的home目錄
cd ~
新建.vim目錄和.vimrc文件
mkdir .vim touch .vimrc
切換到.vim目錄,然后新建bundle目錄
cd .vim mkdir bundle
切換到bundle,從github克隆vundle到本地
cd bundle git clone https://github.com/gmarik/vundle.git
切換到home目錄,編輯.vimrc配置文件
cd ~
vi .vimrc
我的配置文件
插件說明
(1)vim-airline
vim-airline這個插件要用到特定的字體才能顯示特定的符號
運行下面命令下載字體
git clone https://github.com/powerline/fonts.git
克隆之后會在當前目錄得到fonts文件夾,切換到fonts,運行./install.sh安裝字體
cd fonts
./install.sh
打開終端,右鍵Profiles->Profiles Preferences,打開后就可以選擇終端字體了

(2)cscope
先查看vim是否開啟了cscope這個特性,運行如下命令,看到+cscope就表示開啟了,看到-cscope就表示沒開啟
vim --version | grep cscope
如果沒開啟就重新編譯vim,切換到下載vim源碼目錄,然后運行如下命令
./configure --enable-cscope sudo make && make install
cscope的安裝,如果沒安裝的可以用下面命令安裝
sudo dnf install cscope
或者到https://sourceforge.net/projects/cscope/files/latest/download?source=files下載,下載后會得到cscope-15.8b.tar.gz壓縮包,解壓
tar -zxvf cscope-15.8b.tar.gz
解壓后得到cscope-15.8b文件夾,切換到cscope-15.8b目錄,然后配置,編譯,安裝
cd cscope-15.8b ./configure --prefix=/opt/cscope
sudo make && make install
cscope默認只解析C語言文件(即后綴為.c和.h文件)、lex文件(即后綴為.l文件)和yacc文件(即后綴為.y文件),所以要解析其他語言的文件,需要把這些文件名和完整路徑保存在cscope.files這個文件,我們可以在項目的根目錄運行下面命令來生成cscope.files
find . -type f > cscope.files
然后在生成cscope數據庫文件
cscope -bq
運行上面命令后,會在當前目錄生成cscope.out,cscope.in.out,cscope.po.out這3個文件
cscope常用的選項
-R: 遞歸生成數據庫文件
-b: 只生成數據庫文件,不進入cscope的界面
-q: 生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度
-k: 在生成數據庫文件時,不搜索/usr/include目錄
-i: 如果保存文件列表的文件名不是cscope.files時,需要加此選項告訴cscope到哪兒去找源文件列表。可以使用”–“,表示由標准輸入獲得文件列表。
-I incdir: 在-I選項指出的目錄中查找頭文件
-u: 掃描所有文件,重新生成交叉數據庫文件
-C: 在搜索時忽略大小寫
-P path: 在以相對路徑表示的文件前加上的path,這樣,你不用切換到你數據庫文件所在的目錄也可以使用它了
我的vim配置文件
"使用vundle來管理插件,要求filetype off,set nocompatible " This is not stage " 偵測文件類型 filetype off "關閉兼容模式 set nocompatible "定義<leader> let mapleader="," "vundle的配置必須要放在vimrc文件的最前面,只有vundle插件運行之后, "安裝vundle "git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle "這樣才能加載其他插件 "運行時路徑,runtimepath set rtp+=~/.vim/bundle/vundle/ "vundle開始配置 call vundle#rc() "讓vundle管理插件 Bundle 'gmarik/vundle' "自定義的插件 "github上其他用戶的插件,按下面格式寫,github用戶名/插件名 "Bundle 'tpope/vim-fugitive' Bundle 'altercation/vim-colors-solarized' Bundle 'kien/ctrlp.vim' Bundle 'vim-airline/vim-airline' Bundle 'vim-airline/vim-airline-themes' Bundle 'majutsushi/tagbar' Bundle 'Valloric/YouCompleteMe' Bundle 'SirVer/ultisnips' Bundle 'tomasr/molokai' Bundle 'scrooloose/nerdtree' Bundle 'scrooloose/syntastic' Bundle 'ervandew/supertab' Bundle 'honza/vim-snippets' Bundle 'mattn/emmet-vim' Bundle 'tpope/vim-fugitive' Bundle 'spf13/PIV' Bundle 'tpope/vim-surround' Bundle 'Raimondi/delimitMate' Bundle 'scrooloose/nerdcommenter' Bundle 'godlygeek/tabular' Bundle 'easymotion/vim-easymotion' Bundle 'joonty/vdebug' Bundle 'airblade/vim-gitgutter' Bundle 'Shougo/neocomplete.vim' Bundle 'kien/rainbow_parentheses.vim' Bundle 'sjl/gundo.vim' "aaaaa,github上的vim-scripts用戶的插件,按下面格式寫,直接寫插件名 Bundle 'taglist.vim' Bundle 'TaskList.vim' "不是github上的,按下面格式寫 "Bundle 'git://git.wincent.com/command-t.git' "Brief help ":BundleList -顯示vimrc里面填寫的所有插件名稱 ":BundleInstall(!) -自動下載安裝或更新插件 ":BundleSearch(!) foo -搜索插件foo ":BundleClean(!) -移出插件 ":help vundle -查看幫助 "End brief help """""""""""""""" """"配置插件"""" """""""""""""""" "ctrlp插件,g:代表全局變量,l:代表本地變量,s:代表腳本變量 let g:ctrlp_map='<c-p>' let g:ctrlp_cmd='CtrlP' let g:ctrlp_working_path_mode='ra' "vim-airline插件 set laststatus=2 set t_Co=256 let g:airline_theme="luna" let g:airline_powerline_fonts=1 let g:airline#extension#tabline#enabled=1 let g:airline#extension#tabline#left_sep=' ' let g:airline#extension#tabline#left_alt_sep='|' "nerdtree插件 map <F2> :NERDTreeToggle<CR> "taglist插件 let Tlist_Auto_update=1 let Tlist_Auto_open=0 let Tlist_Use_Right_Window=1 let Tlist_Show_One_File=0 let Tlist_File_Fold_Auto_Close=0 let Tlist_Exit_OnlyWindow=1 map <F4> :TlistToggle<CR> "TaskList插件 "map <leader>td <Plug>TaskList "tagbar插件 map <F3> :TagbarToggle<CR> "ctags set tags=tags; "syntastic插件 set statusline+=%#warningmsg# set statusline+=%{SyntasticStatuslineFlag()} set statusline+=%* let g:syntastic_always_populate_loc_list=1 let g:syntastic_auto_loc_list=1 let g:syntastic_check_on_open=1 let g:syntastic_check_on_wq=0 "vim-fugitive插件 ":help fugitive查看幫助 "PIV插件 "shift+k查看PHP手冊 "nerdcommenter插件 "一些快捷鍵 "<leader>cc 注釋 "<leader>cu 反注釋 "<leader>c<space> 注釋開關 "<leader>cs 塊注釋 "rainbow_parentheses插件 let g:rbpt_colorpairs = [ \['brown','RoyalBlue3'], \['Darkblue','SeaGreen3'], \['darkgray','DarkOrchid3'], \['darkgreen','firebrick3'], \['darkcyan','RoyalBlue3'], \['darkred','SeaGreen3'], \['darkmagenta','DarkOrchid3'], \['brown','firebrick3'], \['gray','RoyalBlue3'], \['black','SeaGreen3'], \['darkmagenta','DarkOrchid3'], \['Darkblue','firebrick3'], \['darkgreen','RoyalBlue3'], \['darkcyan','SeaGreen3'], \['darkred','DarkOrchid3'], \['red','firebrick3'], \] let g:rbpt_max=16 let g:rbpt_loadcmd_toggle=1 au VimEnter * RainbowParenthesesToggle au Syntax * RainbowParenthesesLoadRound au Syntax * RainbowParenthesesLoadSquare au Syntax * RainbowParenthesesLoadBraces "cscope插件 "cs find c|d|e|f|g|i|s|t name "0 或 s 查找本 C 符號(可以跳過注釋) "1 或 g 查找本定義 "2 或 d 查找本函數調用的函數 "3 或 c 查找調用本函數的函數 "4 或 t 查找本字符串 "6 或 e 查找本 egrep 模式 "7 或 f 查找本文件 "8 或 i 查找包含本文件的文件 if has("cscope") ":tag,ctrl+],vim -t等命令會始終使用:cstag而不是:tag set cst "是否使用quickfix窗口來顯示cscope結果 set cscopequickfix=s-,c-,d-,i-,t-,e- "指定cscope的路徑 set csprg=/usr/bin/cscope "查找順序,0為先找cscope數據,找不到再找tag文件 set csto=0 "增加cscope數據庫時會提示信息 set nocsverb "顯示查找結果的路徑的最后3個部分,包含本文件名 set cspc=3 "add any database in current directory if filereadable("cscope.out") cs add cscope.out "else add database pointed to by environment elseif $CSCOPE_DB != "" cs add $CSCOPE_DB endif set csverb "定義一些快捷鍵 nmap <C-\>s :cs find s <C-R>=expand("<cword>")<CR><CR> nmap <C-\>g :cs find g <C-R>=expand("<cword>")<CR><CR> nmap <C-\>c :cs find c <C-R>=expand("<cword>")<CR><CR> nmap <C-\>t :cs find t <C-R>=expand("<cword>")<CR><CR> nmap <C-\>e :cs find e <C-R>=expand("<cword>")<CR><CR> nmap <C-\>f :cs find f <C-R>=expand("<cfile>")<CR><CR> nmap <C-\>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR> nmap <C-\>d :cs find d <C-R>=expand("<cword>")<CR><CR> "查找結果,水平分割窗口 nmap <C-@>s :scs find s <C-R>=expand("<cword>")<CR><CR> nmap <C-@>g :scs find g <C-R>=expand("<cword>")<CR><CR> nmap <C-@>c :scs find c <C-R>=expand("<cword>")<CR><CR> nmap <C-@>t :scs find t <C-R>=expand("<cword>")<CR><CR> nmap <C-@>e :scs find e <C-R>=expand("<cword>")<CR><CR> nmap <C-@>f :scs find f <C-R>=expand("<cfile>")<CR><CR> nmap <C-@>i :scs find i ^<C-R>=expand("<cfile>")<CR>$<CR> nmap <C-@>d :scs find d <C-R>=expand("<cword>")<CR><CR> "查找結果,豎直分割窗口 nmap <C-@><C-@>s :vert scs find s <C-R>=expand("<cword>")<CR><CR> nmap <C-@><C-@>g :vert scs find g <C-R>=expand("<cword>")<CR><CR> nmap <C-@><C-@>c :vert scs find c <C-R>=expand("<cword>")<CR><CR> nmap <C-@><C-@>t :vert scs find t <C-R>=expand("<cword>")<CR><CR> nmap <C-@><C-@>e :vert scs find e <C-R>=expand("<cword>")<CR><CR> nmap <C-@><C-@>f :vert scs find f <C-R>=expand("<cfile>")<CR><CR> nmap <C-@><C-@>i :vert scs find i ^<C-R>=expand("<cfile>")<CR>$<CR> nmap <C-@><C-@>d :vert scs find d <C-R>=expand("<cword>")<CR><CR> endif "YouCompleteMe插件 let g:ycm_key_list_select_completion=['<C-n>','<Down>'] let g:ycm_key_list_previous_completion=['<C-p>','<Up>'] let g:ycm_complete_in_comments=1 "補全功能在注釋中同樣有效 let g:ycm_confirm_extra_conf=0 "允許vim加載.ycm_extra_conf.py文件,不再提示 let g:ycm_collect_identifiers_from_tags_files=1 "開啟ycm基於標簽引擎 let g:ycm_min_num_of_chars_for_completion=1 "從第一個鍵入字符就開始羅列匹配項 let g:ycm_cache_omnifunc=0 "禁止緩存匹配項,每次都重新生成匹配項 let g:ycm_seed_identifiers_wity_syntax=1 "語法關鍵字補全 let g:ycm_error_symbol='>>' "錯誤提示符 let g:ycm_warning_symbol='>*' "警告提示符 set completeopt-=preview "補全內容不以分割子窗口形式出現,只顯示補全列表 nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR> "ultisnips插件 let g:UltiSnipsExpandTrigger="<tab>" let g:UltiSnipsJumpForwardTrigger="<tab>" let g:UltiSnipsJumpBackwardTrigger="<s-tab>" "supertab插件 let g:SuperTabDefaultCompleteType='<C-n>' "neocomplete插件 "Note: This option must set it in .vimrc(_vimrc). NOT IN .gvimrc(_gvimrc)! "" Disable AutoComplPop. let g:acp_enableAtStartup = 0 " Use neocomplete. let g:neocomplete#enable_at_startup = 1 " Use smartcase. let g:neocomplete#enable_smart_case = 1 " Set minimum syntax keyword length. let g:neocomplete#sources#syntax#min_keyword_length = 3 let g:neocomplete#lock_buffer_name_pattern = '\*ku\*' " Define dictionary. let g:neocomplete#sources#dictionary#dictionaries = { \ 'default' : '', \ 'vimshell' : $HOME.'/.vimshell_hist', \ 'scheme' : $HOME.'/.gosh_completions' \ } " Define keyword. if !exists('g:neocomplete#keyword_patterns') let g:neocomplete#keyword_patterns = {} endif let g:neocomplete#keyword_patterns['default'] = '\h\w*' " Plugin key-mappings. inoremap <expr><C-g> neocomplete#undo_completion() inoremap <expr><C-l> neocomplete#complete_common_string() " Recommended key-mappings. " <CR>: close popup and save indent. inoremap <silent> <CR> <C-r>=<SID>my_cr_function()<CR> function! s:my_cr_function() return (pumvisible() ? "\<C-y>" : "" ) . "\<CR>" " For no inserting <CR> key. " return pumvisible() ? "\<C-y>" : "\<CR>" endfunction " <TAB>: completion. inoremap <expr><TAB> pumvisible() ? "\<C-n>" : "\<TAB>" " <C-h>, <BS>: close popup and delete backword char. inoremap <expr><C-h> neocomplete#smart_close_popup()."\<C-h>" inoremap <expr><BS> neocomplete#smart_close_popup()."\<C-h>" " Close popup by <Space>. "inoremap <expr><Space> pumvisible() ? "\<C-y>" : "\<Space>" " AutoComplPop like behavior. let g:neocomplete#enable_auto_select = 1 " Shell like behavior(not recommended). "set completeopt+=longest "let g:neocomplete#enable_auto_select = 1 "let g:neocomplete#disable_auto_complete = 1 "inoremap <expr><TAB> pumvisible() ? "\<Down>" : "\<C-x>\<C-u>" " Enable omni completion. autocmd FileType css setlocal omnifunc=csscomplete#CompleteCSS autocmd FileType html,markdown setlocal omnifunc=htmlcomplete#CompleteTags autocmd FileType javascript setlocal omnifunc=javascriptcomplete#CompleteJS autocmd FileType python setlocal omnifunc=pythoncomplete#Complete autocmd FileType xml setlocal omnifunc=xmlcomplete#CompleteTags autocmd FileType php setlocal omnifunc=phpcomplete#CompletePHP " Enable heavy omni completion. if !exists('g:neocomplete#sources#omni#input_patterns') let g:neocomplete#sources#omni#input_patterns = {} endif "let g:neocomplete#sources#omni#input_patterns.php = '[^. \t]->\h\w*\|\h\w*::' "let g:neocomplete#sources#omni#input_patterns.c = '[^.[:digit:] *\t]\%(\.\|->\)' "let g:neocomplete#sources#omni#input_patterns.cpp = '[^.[:digit:] *\t]\%(\.\|->\)\|\h\w*::' " For perlomni.vim setting. " https://github.com/c9s/perlomni.vim let g:neocomplete#sources#omni#input_patterns.perl = '\h\w*->\h\w*\|\h\w*::' """""""""""""""" """"公共設置"""" """""""""""""""" "基於縮進或語法進行代碼縮進 set foldenable "set foldmethod=indent "set foldmethod=syntax "set foldmethod=manual set foldmethod=indent "設置歷史記錄數 set history=1000 "在狀態行上顯示光標所在位置的行號和列號 set ruler "顯示行號 set number "輸入的命令顯示出來 set showcmd "在狀態欄顯示當前的模式 set showmode "命令行的高度 set cmdheight=2 "光標移動到buffer的頂部和底部時保持3行距離 set scrolloff=3 "在被分割的窗口間顯示空白,便於閱讀 "set fillchars=vert:/,stl:/,stlnc:/ "關閉滴滴答答的聲音 set noerrorbells "不要閃爍 set novisualbell "命令錯誤時,去掉響聲 set t_vb= "啟動時不顯示援助烏干達兒童的提示 set shortmess=atI " 語法高亮 syntax enable syntax on "配色方案為molokai colorscheme molokai "背景顏色 set background=dark "突出顯示當前行 "set cursorline "突出顯示當前列 "set cursorcolumn "回格鍵刪除2個空格 set backspace=2 "允許backspace和光標鍵跨越行邊界 set whichwrap+=<,>,h,l "按一次backspace就刪除4個空格了 set smarttab "程序自動縮進的空白寬度,4個空格 set shiftwidth=4 "tab鍵的寬度,4個空格 set tabstop=4 "輸入tab鍵時實際占有的寬度 set softtabstop=4 "輸入tab鍵時替換為空格鍵 set expandtab "自動縮進 set autoindent "使用C/C++時自動縮進 set cindent "智能縮進 set smartindent "不生成備份文件,如index.html~ set nobackup "不生成臨時文件,如index.swap set noswapfile "設置文件被修改時自動載入 set autoread "自動保存 set autowrite "根據編輯的文件自動切換工作目錄 set autochdir "當前編輯的文件編碼 set fileencoding=urf-8 "gvim打開支持編碼的文件 set fileencodings=ucs-bom,utf-8,gbk,cp936,gb2312,big5,euc-jp,euc-kr,latin1 "gvim內部編碼 set encoding=utf-8 "設置終端編碼為gvim內部編碼encoding let &termencoding=&encoding "設置文件格式 set fileformats=unix,dos,mac " 載入文件類型插件 filetype plugin on " 為特定文件類型載入相關縮進文件 filetype indent on "高亮顯示匹配的括號 set showmatch "匹配括號高亮的時間,單位是十分之一秒 set matchtime=2 "搜索內容高亮顯示 set hlsearch "實時匹配搜索內容 set incsearch "搜索時忽略大小寫 set ignorecase "搜索時智能忽略大小寫 set smartcase "搜索時可以用正則表達式 set magic "當運行宏時,不重繪 set lazyredraw "搜索到文件兩端時不重新搜索 set nowrapscan "帶有下面字符的單詞不要被換行分割 set iskeyword+=_,$,@,%,#,-,. "gvim 配置 if has("gui_running") colorscheme solarized endif "設置字體 "set guifont=Bitstream_Vera_Sans_Mono:h12:cANSI "set guifontwide=Yahei_Mono:h12:cGB2312 set guifont=Source\ Code\ Pro\ for\ Powerline\ Semibold\ 12 "設置gvim工具欄 "set guioptions=aegic "使用中文幫助文檔 set helplang=cn "解決consle輸出亂碼 language messages zh_CN.utf-8 "防止特殊符號無法正常顯示 set ambiwidth=double "關閉上側工具欄 "set guioptions-=T "關閉右側滾動條 "set guioptions-=r
