安裝依賴庫(支持Python 3、Lua她渴、Ruby)
sudo apt-get install libncurses5-dev libgnome2-dev libgnomeui-dev \libgtk2.0-dev libatk1.0-dev libbonoboui2-dev \libcairo2-dev libx11-dev libxpm-dev libxt-dev python-dev \python3-dev ruby-dev lua5.1 lua5.1-dev git
刪除原有Vim
首先查詢系統(tǒng)中有哪些與vim相關(guān)的軟件倚评,我的是vim忆畅、vim-common和vim-run晒屎,然后徹底刪除他們:
dpkg -l | grep vim
sudo dpkg -P vim vim-common vim-run
下載vim源碼安裝
安裝前先獲取Python的配置路徑肄渗,比如我的是/usr/lib/python2.7/config-x86_64-linux-gnu
git clone https://github.com/vim/vim.git
cd vim
./configure --with-features=huge? --enable-multibyte? --enable-rubyinterp? --enable-pythoninterp? --with-python-config-dir=/usr/lib/python2.7/config-x86_64-linux-gnu? --enable-perlinterp? --enable-luainterp? --enable-gui=gtk2 --enable-cscope --prefix=/usr
make
sudo make install
下載vundle
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
安裝pathogen
sudo apt-get install pathogen
sudo apt install curl
mkdir -p ~/.vim/autoload ~/.vim/bundle
curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
安裝插件
打開vim,運行指令:PluginInstall
vim
:PluginInstall
修改~/.vimrc
將文末代碼復制到vimrc
vi ~/.vimrc
參考來源:
https://github.com/yangyangwithgnu/use_vim_as_ide#3.4
http://www.reibang.com/p/27816557adcb
https://github.com/strivexj/Vim/blob/master/vimrc
execute pathogen#infect()
" 定義快捷鍵的前綴季惯,即
let mapleader=";"
" 開啟文件類型偵測
filetype on
" 根據(jù)偵測到的不同類型加載對應的插件
filetype plugin on
"自動保存
set autowrite
" 在處理未保存或只讀文件的時候,彈出確認
set confirm
" 定義快捷鍵到行首和行尾
"nmap LB 0
"nmap LE $
noremap H ^
noremap L $
" 設(shè)置快捷鍵將選中文本塊復制至系統(tǒng)剪貼板
vnoremap y "+y
" 設(shè)置快捷鍵將系統(tǒng)剪貼板內(nèi)容粘貼至 vim
nmap p "+p
"定義快捷鍵關(guān)閉當前分割窗口;
nmap q :q
" 定義快捷鍵保存當前窗口內(nèi)容
nmap w :w
" 定義快捷鍵保存所有窗口內(nèi)容并退出 vim
nmap WQ :wa:q
" 不做任何保存臀突,直接退出 vim
nmap Q :qa!
" 依次遍歷子窗口
nnoremap nw
" 跳轉(zhuǎn)至右方的窗口
nnoremap lw l
" 跳轉(zhuǎn)至左方的窗口
nnoremap hw h
" 跳轉(zhuǎn)至上方的子窗口
nnoremap kw k
" 跳轉(zhuǎn)至下方的子窗口
nnoremap jw j
" 定義快捷鍵在結(jié)對符之間跳轉(zhuǎn)
nmap M %
" 映射全選+復制 ctrl+a
map? ggVGY
map!? ggVGY
map? gg=G
" 選中狀態(tài)下 Ctrl+c 復制
vmap? "+y
"nmap? ^V$y
" 設(shè)置環(huán)境保存項
set sessionoptions="blank,buffers,globals,localoptions,tabpages,sesdir,folds,help,options,resize,winpos,winsize"
" 保存 undo 歷史
set undodir=~/.undo_history/
set undofile
" 保存快捷鍵
map ss :mksession! my.vim :wviminfo! my.viminfo
" 恢復快捷鍵
map rs :source my.vim :rviminfo my.viminfo
set fileformat=unix? ? "設(shè)置以unix的格式保存文件"
set cindent? ? ? ? "設(shè)置C樣式的縮進格式"
set tabstop=4? ? "設(shè)置table長度"
set shiftwidth=4? ? ? ? "同上"
set showmatch? ? "顯示匹配的括號"
set scrolloff=5? ? ? ? "距離頂部和底部5行"
set fenc=utf-8? ? ? "文件編碼"
set backspace=2
set matchtime=5
set ignorecase? ? ? ? "忽略大小寫"
" 讓配置變更立即生效
autocmd BufWritePost $MYVIMRC source $MYVIMRC
" 通過使用: commands命令勉抓,告訴我們文件的哪一行被改變過
set report=0
" 在被分割的窗口間顯示空白,便于閱讀
set fillchars=vert:\ ,stl:\ ,stlnc:\
"change word to uppercase, I love this very much
inoremap? gUiwea
"用jk退出編輯模式
inoremap jk
"直接輸入空格進入命令模式
noremap? :
" 開啟實時搜索功能
set incsearch
" 關(guān)閉兼容模式
set nocompatible
" vim 自身命令行模式智能補全
set wildmenu
" vundle 環(huán)境設(shè)置
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
" vundle 管理的插件列表必須位于 vundle#begin() 和 vundle#end() 之間
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
Plugin 'altercation/vim-colors-solarized'
Plugin 'tomasr/molokai'
Plugin 'vim-scripts/phd'
Plugin 'Lokaltog/vim-powerline'
Plugin 'octol/vim-cpp-enhanced-highlight'
Plugin 'nathanaelkane/vim-indent-guides'
Plugin 'Yggdroot/indentLine'
Plugin 'vim-autopep8'
Plugin 'derekwyatt/vim-fswitch'
Plugin 'kshenoy/vim-signature'
Plugin 'vim-scripts/BOOKMARKS--Mark-and-Highlight-Full-Lines'
Plugin 'majutsushi/tagbar'
Plugin 'vim-scripts/indexer.tar.gz'
Plugin 'vim-scripts/DfrankUtil'
Plugin 'vim-scripts/vimprj'
Plugin 'dyng/ctrlsf.vim'
Plugin 'terryma/vim-multiple-cursors'
Plugin 'scrooloose/nerdcommenter'
Plugin 'vim-scripts/DrawIt'
Plugin 'SirVer/ultisnips'
Plugin 'Valloric/YouCompleteMe'
Plugin 'derekwyatt/vim-protodef'
Plugin 'scrooloose/nerdtree'
Plugin 'fholgado/minibufexpl.vim'
Plugin 'gcmt/wildfire.vim'
Plugin 'sjl/gundo.vim'
Plugin 'Lokaltog/vim-easymotion'
Plugin 'suan/vim-instant-markdown'
Plugin 'lilydjwg/fcitx.vim'
Plugin 'jiangmiao/auto-pairs'
Plugin 'vim-airline/vim-airline'
Plugin 'vim-airline/vim-airline-themes'
Plugin 'kien/rainbow_parentheses.vim'
Plugin 'vim-syntastic/syntastic'
Plugin 'jistr/vim-nerdtree-tabs' "vim-nerdtree-tabs 插件是為了解決nerdtree不能在tab之間共享的問題
Plugin 'sickill/vim-monokai'
Plugin 'kien/ctrlp.vim'
Plugin 'klen/python-mode'
Plugin 'PyCQA/pylint'
" 插件列表結(jié)束
call vundle#end()
set autoread? ? " 設(shè)置當文件在外部被修改候学,自動更新該文件
set autochdir? " 自動設(shè)置當前目錄為正在編輯的目錄
set showcmd " 狀態(tài)欄顯示當前執(zhí)行的命令
"允許在vim中運行python
let g:pymode_run = 1
"運行python的快捷鍵為E
let g:pymode_run_key = ''
map? " disable python-mode RopeCodeAssistInsertMode Key binding
"Ctrl+O打開自動補全(使用Ctrl+N和Ctrl+P來向前藕筋、向后翻頁)
inoremap? =RopeCodeAssistInsertMode()
let g:tagbar_width =25
"設(shè)置tagbar默認打開(大屏幕顯示器可以打開)
"autocmd VimEnter * nested TagbarOpen
let g:tagbar_autofocus = 0
" ctrap
set wildignore+=*/tmp/*,*.so,*.swp,*.zip,*.png,*.jpg,*.jpeg,*.gif " MacOSX/Linux
let g:ctrlp_custom_ignore = '\v[\/]\.(git|hg|svn)$'
"
"ctrlp默認會使用grep進行搜索,效率低且慢梳码。所以隐圾,我使用了ag去替換默認的搜索
"功能。ag是一款輕量級的搜索工具掰茶,速度非诚静兀快。為了集成ag濒蒋,需要添加下列配置:
if executable('ag')
" Use Ag over Grep
set grepprg=ag\ --nogroup\ --nocolor
" Use ag in CtrlP for listing files.
let g:ctrlp_user_command = 'ag %s -l --nocolor -g ""'
" Ag is fast enough that CtrlP doesn't need to cache
let g:ctrlp_use_caching = 0
endif
" 顯示/隱藏 MiniBufExplorer 窗口
map bl :MBEToggle
" buffer 切換快捷鍵
map? :MBEbn
map? :MBEbp
" 配色方案
set background=dark
"colorscheme solarized
"colorscheme phd
"colorscheme molokai
colorscheme monokai
" 禁止光標閃爍
set gcr=a:block-blinkon0
" 禁止顯示滾動條
set guioptions-=l
set guioptions-=L
set guioptions-=r
set guioptions-=R
" 禁止顯示菜單和工具條
set guioptions-=m
set guioptions-=T
" 將外部命令 wmctrl 控制窗口最大化的命令行參數(shù)封裝成一個 vim 的函數(shù)
fun! ToggleFullscreen()
call system("wmctrl -ir " . v:windowid . " -b toggle,fullscreen")
endf
" 全屏開/關(guān)快捷鍵
map? :call ToggleFullscreen()
" 啟動 vim 時自動全屏
autocmd VimEnter * call ToggleFullscreen()
" 當同時顯示多個文件中的tag時盐碱,可使taglist只顯示當前文件tag把兔,其它文件的tag都被折疊起來
let Tlist_File_Fold_Auto_Close=1
" 如果taglist窗口是最后一個窗口,則退出vim
let Tlist_Exit_OnlyWindow=1
" 缺省情況下瓮顽,雙擊一個tag時县好,才會跳到該tag定義的位置,設(shè)置單擊tag就跳轉(zhuǎn)
let? Tlist_Use_SingleClick=1
set mouse=a? ? ? ? ? ? " 開啟鼠標
" 總是顯示狀態(tài)欄
set laststatus=2
" 顯示光標當前位置
set ruler
" 開啟行號顯示
set number
" 高亮顯示當前行/列
set cursorline
" set cursorcolumn
" 高亮顯示搜索結(jié)果
set hlsearch
" 設(shè)置 gvim 顯示字體
" set guifont=YaHei\ Consolas\ Hybrid\ 11.5
" 禁止折行
set nowrap
" 設(shè)置狀態(tài)欄主題風格
" let g:Powerline_colorscheme='solarized256'
" 自適應不同語言的智能縮進
filetype indent on
" 將制表符擴展為空格
set expandtab
" 設(shè)置編輯時制表符占用空格數(shù)
set tabstop=4
" 設(shè)置格式化時制表符占用空格數(shù)
set shiftwidth=4
" 讓 vim 把連續(xù)數(shù)量的空格視為一個制表符
set softtabstop=4
"縮進指示線"
let g:indentLine_char='┆'
let g:indentLine_enabled = 1
"autopep8設(shè)置"
let g:autopep8_disable_show_diff=1
" 基于縮進或語法進行代碼折疊(za暖混,打開或關(guān)閉當前折疊缕贡;zM,關(guān)閉所有折疊拣播;zR晾咪,打開所有折疊)
"set foldmethod=indent
set foldmethod=syntax
" 啟動 vim 時關(guān)閉折疊代碼
set nofoldenable
" 開啟語法高亮功能
syntax enable
" 允許用指定語法高亮配色方案替換默認方案
syntax on
filetype plugin indent on
" *.cpp 和 *.h 間切換(sw實現(xiàn)切換)
nmap? sw :FSHere
let g:UltiSnipsSnippetDirectories=["mysnippets"]
" UltiSnips 的 tab 鍵與 YCM 沖突,重新設(shè)定
let g:UltiSnipsExpandTrigger=""
let g:UltiSnipsJumpForwardTrigger=""
let g:UltiSnipsJumpBackwardTrigger=""
"顯示書簽"
let NERDTreeShowBookmarks=1
"設(shè)置忽略文件類型"
let NERDTreeIgnore=['\~$', '\.pyc$', '\.swp$']
"窗口大小"
let NERDTreeWinSize=25
"關(guān)閉各種按鍵叮叮聲音和閃屏
set vb t_vb=
au GuiEnter * set t_vb=
set backspace=indent,eol,start
set novisualbell " 關(guān)閉使用可視響鈴代替呼叫
set noerrorbells " 關(guān)閉錯誤信息響鈴
set magic " 設(shè)置魔術(shù)
set smartindent " 開啟新行時使用智能自動縮進
set cmdheight=1 " 設(shè)定命令行的行數(shù)為 1
"記住上次退出的位置
au BufReadPost * if line("'\"") > 0|if line("'\"") <= line("$")|exe("norm '\"")|else|exe "norm $"|endif|endif
let g:airline_powerline_fonts = 1
" 是否啟用頂部tabline
let g:airline#extensions#tabline#enabled = 1
" 頂部tabline顯示方式
let g:airline#extensions#tabline#left_sep = ' '
let g:airline#extensions#tabline#left_alt_sep = '|'
let g:airline_theme="deus"
let g:Powerline_colorscheme='deus'
"彩虹括號
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
au VimEnter * RainbowParenthesesToggle
au Syntax * RainbowParenthesesLoadRound
au Syntax * RainbowParenthesesLoadSquare
au Syntax * RainbowParenthesesLoadBraces
"設(shè)置注釋快捷鍵
map? ci
" ******************NERDTree***************************************************************************
"? close vim if the only window left open is a NERDTree
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif
"let g:nerdtree_tabs_open_on_console_startup=1
" NERDTress File highlighting
"Set different colors for different file extensions
"NERDTress File highlighting
"Start
function! NERDTreeHighlightFile(extension, fg, bg, guifg, guibg)
exec 'autocmd filetype nerdtree highlight ' . a:extension .' ctermbg='. a:bg .' ctermfg='. a:fg .' guibg='. a:guibg .' guifg='. a:guifg
exec 'autocmd filetype nerdtree syn match ' . a:extension .' #^\s\+.*'. a:extension .'$#'
endfunction
call NERDTreeHighlightFile('jade', 'green', 'none', 'green', '#151515')
call NERDTreeHighlightFile('ini', 'yellow', 'none', 'yellow', '#151515')
call NERDTreeHighlightFile('md', 'blue', 'none', '#3366FF', '#151515')
call NERDTreeHighlightFile('yml', 'yellow', 'none', 'yellow', '#151515')
call NERDTreeHighlightFile('config', 'yellow', 'none', 'yellow', '#151515')
call NERDTreeHighlightFile('conf', 'yellow', 'none', 'yellow', '#151515')
call NERDTreeHighlightFile('json', 'yellow', 'none', 'yellow', '#151515')
call NERDTreeHighlightFile('html', 'yellow', 'none', 'yellow', '#151515')
call NERDTreeHighlightFile('styl', 'cyan', 'none', 'cyan', '#151515')
call NERDTreeHighlightFile('css', 'cyan', 'none', 'cyan', '#151515')
call NERDTreeHighlightFile('coffee', 'Red', 'none', 'red', '#151515')
call NERDTreeHighlightFile('js', 'Red', 'none', '#ffa500', '#151515')
call NERDTreeHighlightFile('php', 'Magenta', 'none', '#ff00ff', '#151515')
"End
"Open NERDTree when no file is specified
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif
" 顯示文件中的類诫尽、函數(shù)禀酱、變量的功能的TagbarToggle快捷鍵F10
map? :TagbarToggle
"F9開啟和關(guān)閉樹"
map? :NERDTreeToggle
let NERDTreeChDirMode=1
"*************************************NREDTree-end******************************************
" configure syntastic syntax checking to check on open as well as save
"是否在打開文件時檢查
let g:syntastic_check_on_open=1
" 是否在保存文件后檢查
"let g:syntastic_check_on_wq=1
let g:syntastic_html_tidy_ignore_errors=[" proprietary attribute \"ng-"]
let g:syntastic_always_populate_loc_list = 1
let g:syntastic_auto_loc_list = 1
set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*
" 設(shè)置錯誤符號
let g:syntastic_error_symbol='?'
"設(shè)置警告符號
let g:syntastic_warning_symbol=''
let g:syntastic_python_checkers=['pylint','javac','php', 'phpcs', 'phpmd']
let g:syntastic_python_pylint_args='--disable=C0111,R0903,C0301'
let g:syntastic_aggregate_errors = 1
"自動跳轉(zhuǎn)到發(fā)現(xiàn)的第一個錯誤或警告處
let g:syntastic_auto_jump = 1
"進行實時檢查,如果覺得卡頓牧嫉,將下面的選項置為1
let g:syntastic_check_on_wq = 1
"高亮錯誤
let g:syntastic_enable_highlighting=1
" YCM 補全菜單配色
" 菜單
highlight Pmenu ctermfg=10 ctermbg=8 guifg=#005f87 guibg=#EEE8D5
" 選中項
highlight PmenuSel ctermfg=4 ctermbg=6 guifg=#AFD700 guibg=#106900
" 補全功能在注釋中同樣有效
let g:ycm_complete_in_comments=1
" 允許 vim 加載 .ycm_extra_conf.py 文件剂跟,不再提示
let g:ycm_confirm_extra_conf=0
" 開啟 YCM 標簽補全引擎
let g:ycm_collect_identifiers_from_tags_files=1
" 引入 C++ 標準庫tags
set tags+=/data/misc/software/misc./vim/stdcpp.tags
" YCM 集成 OmniCppComplete 補全引擎,設(shè)置其快捷鍵
inoremap ;
" 補全內(nèi)容不以分割子窗口形式出現(xiàn)酣藻,只顯示補全列表
set completeopt-=preview
" 從第一個鍵入字符就開始羅列匹配項
let g:ycm_min_num_of_chars_for_completion=1
" 禁止緩存匹配項曹洽,每次都重新生成匹配項
" let g:ycm_cache_omnifunc=0
" 語法關(guān)鍵字補全
let g:ycm_seed_identifiers_with_syntax=1
" 設(shè)置背景透明
" hi Normal guibg=NONE ctermbg=NONE
" When vimrc is edited, reload it
autocmd! bufwritepost vimrc source ~/.vimrc
" Turn backup off, since most stuff is in SVN, git anyway...
set nobackup
set nowb
set noswapfile
""""""""""""""""""""""
"Quickly Run
""""""""""""""""""""""
map? :call CompileRunGcc()
func! CompileRunGcc()
exec "w"
if &filetype == 'c'
exec "!g++ % -o %<"
exec "!time ./%<"
elseif &filetype == 'cpp'
exec "!g++ % -o %<"
exec "!time ./%<"
elseif &filetype == 'java'
exec "!javac %"
exec "!time java %<"
elseif &filetype == 'sh'
:!time bash %
elseif &filetype == 'python'
exec "!time python2.7 %"
elseif &filetype == 'html'
exec "!firefox % &"
elseif &filetype == 'go'
"? ? ? ? exec "!go build %<"
exec "!time go run %"
elseif &filetype == 'mkd'
exec "!~/.vim/markdown.pl % > %.html &"
exec "!firefox %.html &"
endif
endfunc
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""新文件標題""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"新建.c,.h,.sh,.java文件,自動插入文件頭
autocmd BufNewFile *.cpp,*.[ch],*.sh,*.java,*.py exec ":call SetTitle()"
""定義函數(shù)SetTitle辽剧,自動插入文件頭
func! SetTitle()
"如果文件類型為.sh文件
if &filetype == 'sh'
call setline(1,"\#########################################################################")
call append(line("."), "\# File Name: ".expand("%"))
call append(line(".")+1, "\# Author: cwj")
call append(line(".")+2, "\# mail: 1003214597@qq.com")
call append(line(".")+3, "\# Created Time: ".strftime("%c"))
call append(line(".")+4, "\#########################################################################")
call append(line(".")+5, "\#!/bin/bash")
call append(line(".")+6, "")
endif
if &filetype == 'py'
call setline(1,"```")
call append(line(".")+1, "\# File Name: ".expand("%"))
call append(line(".")+2, "\# Author: cwj")
call append(line(".")+3, "\# mail: 1003214597@qq.com")
call append(line(".")+4, "\# Created Time: ".strftime("%c"))
call append(line(".")+5, "```")
else
call setline(1, "/*************************************************************************")
call append(line("."), "? ? File Name: ".expand("%"))
call append(line(".")+1, "? ? Author: cwj")
call append(line(".")+2, "? ? Mail: 1003214597@qq.com")
call append(line(".")+3, "? ? Created Time: ".strftime("%c"))
call append(line(".")+4, " ************************************************************************/")
call append(line(".")+5, "")
endif
if &filetype == 'cpp'
call append(line(".")+6, "#include")
call append(line(".")+7, "using namespace std;")
call append(line(".")+8, "")
call cursor(10,2)
elseif &filetype == 'c'
call append(line(".")+6, "#include")
call append(line(".")+7, "")
call cursor(9,2)
elseif &filetype == 'java'
call append(line(".")+6,"public class ".expand("%:t:r")." {")
call append(line(".")+7, "? ? ? public static void main(String[] args) {")
call append(line(".")+8, "")
call append(line(".")+9, "? ? ? }")
call append(line(".")+10, "}")
call cursor(10,2)
else
call cursor(8,2)
endif
"新建文件后送淆,自動定位到文件末尾
" autocmd BufNewFile * normal G
endfunc