Vim的終極配置方案,完美的寫程式碼介面! ——.vimrc
阿新 • • 發佈:2019-01-11
先秀一下我的Vim介面
語法補全我用的是YouCompleteMe, 有目錄樹外掛,taglist外掛等。
通過外掛管理器Vundle來進行安裝,具體方法自行百度。
背景可以通過換張自己喜愛的圖片,然後調終端的透明度,就可以對著自己喜愛的場景程式設計啦~
有語法高亮,語句補全,顯示行號,自動縮排等等功能。
還有建立原始檔自動新增標頭檔案的功能,例如寫一個.c程式
自動添加了寫在配置檔案裡的資訊,包括作者名,郵箱,時間和程式的標頭檔案等。
配置
如果你需要配置vim,只需在Home目錄建立一個~/.vimrc檔案即可以配置vim了,如需安裝外掛,在~/.vim目錄下建立一個bundle資料夾,外掛裝在裡面。(我通過Vundle管理外掛,自行百度Vundle怎麼使用),可以參考我的 vimrc配置檔案:
含有完整的註釋
set nocompatible
filetype on
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" 這裡根據自己需要的外掛來設定,以下是我的配置 "
"
" YouCompleteMe:語句補全外掛
set runtimepath+=~/.vim/bundle/YouCompleteMe
autocmd InsertLeave * if pumvisible() == 0|pclose|endif "離開插入模式後自動關閉預覽視窗"
let g:ycm_collect_identifiers_from_tags_files = 1 " 開啟 YCM基於標籤引擎
let g:ycm_collect_identifiers_from_comments_and_strings = 1 " 註釋與字串中的內容也用於補全
let g:syntastic_ignore_files=[".*\.py$"]
let g:ycm_seed_identifiers_with_syntax = 1 " 語法關鍵字補全
let g:ycm_complete_in_comments = 1
let g:ycm_confirm_extra_conf = 0 " 關閉載入.ycm_extra_conf.py提示
let g:ycm_key_list_select_completion = ['<c-n>', '<Down>'] " 對映按鍵,沒有這個會攔截掉tab, 導致其他外掛的tab不能用.
let g:ycm_key_list_previous_completion = ['<c-p>', '<Up>']
let g:ycm_complete_in_comments = 1 " 在註釋輸入中也能補全
let g:ycm_complete_in_strings = 1 " 在字串輸入中也能補全
let g:ycm_collect_identifiers_from_comments_and_strings = 1 " 註釋和字串中的文字也會被收入補全
let g:ycm_global_ycm_extra_conf='~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py'
let g:ycm_show_diagnostics_ui = 0 " 禁用語法檢查
inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<CR>" " 回車即選中當前項
nnoremap <c-j> :YcmCompleter GoToDefinitionElseDeclaration<CR> " 跳轉到定義處
let g:ycm_min_num_of_chars_for_completion=2 " 從第2個鍵入字元就開始羅列匹配項
"
" github 倉庫中的外掛 "
Plugin 'VundleVim/Vundle.vim'
Plugin 'vim-airline/vim-airline'
"vim-airline配置:優化vim介面"
"let g:airline#extensions#tabline#enabled = 1
" airline設定
" 顯示顏色
set t_Co=256
set laststatus=2
" 使用powerline打過補丁的字型
let g:airline_powerline_fonts = 1
" 開啟tabline
let g:airline#extensions#tabline#enabled = 1
" tabline中當前buffer兩端的分隔字元
let g:airline#extensions#tabline#left_sep = ' '
" tabline中未啟用buffer兩端的分隔字元
let g:airline#extensions#tabline#left_alt_sep = ' '
" tabline中buffer顯示編號
let g:airline#extensions#tabline#buffer_nr_show = 1
" 對映切換buffer的鍵位
nnoremap [b :bp<CR>
nnoremap ]b :bn<CR>
" 對映<leader>num到num buffer
map <leader>1 :b 1<CR>
map <leader>2 :b 2<CR>
map <leader>3 :b 3<CR>
map <leader>4 :b 4<CR>
map <leader>5 :b 5<CR>
map <leader>6 :b 6<CR>
map <leader>7 :b 7<CR>
map <leader>8 :b 8<CR>
map <leader>9 :b 9<CR>
" vim-scripts 中的外掛 "
Plugin 'taglist.vim'
"ctags 配置:F3快捷鍵顯示程式中的各種tags,包括變數和函式等。
map <F3> :TlistToggle<CR>
let Tlist_Use_Right_Window=1
let Tlist_Show_One_File=1
let Tlist_Exit_OnlyWindow=1
let Tlist_WinWidt=25
Plugin 'The-NERD-tree'
"NERDTree 配置:F2快捷鍵顯示當前目錄樹
map <F2> :NERDTreeToggle<CR>
let NERDTreeWinSize=25
Plugin 'indentLine.vim'
Plugin 'delimitMate.vim'
" 非 github 倉庫的外掛"
" Plugin 'git://git.wincent.com/command-t.git'
" 本地倉庫的外掛 "
call vundle#end()
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"""""新檔案標題
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"新建.c,.h,.sh,.java檔案,自動插入檔案頭
autocmd BufNewFile *.cpp,*.[ch],*.sh,*.java exec ":call SetTitle()"
""定義函式SetTitle,自動插入檔案頭
func SetTitle()
"如果檔案型別為.sh檔案
if &filetype == 'sh'
call setline(1, "##########################################################################")
call append(line("."), "# File Name: ".expand("%"))
call append(line(".")+1, "# Author: amoscykl")
call append(line(".")+2, "# mail: [email protected]")
call append(line(".")+3, "# Created Time: ".strftime("%c"))
call append(line(".")+4, "#########################################################################")
call append(line(".")+5, "#!/bin/zsh")
call append(line(".")+6, "PATH=/home/edison/bin:/home/edison/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/work/tools/gcc-3.4.5-glibc-2.3.6/bin")
call append(line(".")+7, "export PATH")
call append(line(".")+8, "")
else
call setline(1, "/*************************************************************************")
call append(line("."), " > File Name: ".expand("%"))
call append(line(".")+1, " > Author: amoscykl")
call append(line(".")+2, " > Mail: [email protected] ")
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<iostream>")
call append(line(".")+7, "using namespace std;")
call append(line(".")+8, "")
endif
if &filetype == 'c'
call append(line(".")+6, "#include<stdio.h>")
call append(line(".")+7, "")
endif
" if &filetype == 'java'
" call append(line(".")+6,"public class ".expand("%"))
" call append(line(".")+7,"")
" endif
"新建檔案後,自動定位到檔案末尾
autocmd BufNewFile * normal G
endfunc
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
"鍵盤命令
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
nmap <leader>w :w!<cr>
nmap <leader>f :find<cr>
" 對映全選+複製 ctrl+a
map <C-A> ggVGY
map! <C-A> <Esc>ggVGY
map <F12> gg=G
" 選中狀態下 Ctrl+c 複製
vmap <C-c> "+y
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
""實用設定
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" 設定當檔案被改動時自動載入
set autoread
" quickfix模式
autocmd FileType c,cpp map <buffer> <leader><space> :w<cr>:make<cr>
"程式碼補全
set completeopt=preview,menu
"允許外掛
filetype plugin on
"共享剪貼簿
set clipboard=unnamed
"從不備份
set nobackup
"make 執行
:set makeprg=g++\ -Wall\ \ %
"自動儲存
set autowrite
set ruler " 開啟狀態列標尺
set cursorline " 突出顯示當前行
set magic " 設定魔術
set guioptions-=T " 隱藏工具欄
set guioptions-=m " 隱藏選單欄
"set statusline=\ %<%F[%1*%M%*%n%R%H]%=\ %y\ %0(%{&fileformat}\ %{&encoding}\ %c:%l/%L%)\
" 設定在狀態行顯示的資訊
set foldcolumn=0
set foldmethod=indent
set foldlevel=3
set foldenable " 開始摺疊
" 不要使用vi的鍵盤模式,而是vim自己的
set nocompatible
" 語法高亮
set syntax=on
" 去掉輸入錯誤的提示聲音
set noeb
" 在處理未儲存或只讀檔案的時候,彈出確認
set confirm
" 自動縮排
set autoindent
set cindent
" Tab鍵的寬度
set tabstop=4
" 統一縮排為4
set softtabstop=4
set shiftwidth=4
" 不要用空格代替製表符
set noexpandtab
" 在行和段開始處使用製表符
set smarttab
" 顯示行號
set number
" 歷史記錄數
set history=1000
"禁止生成臨時檔案
set nobackup
set noswapfile
"搜尋忽略大小寫
set ignorecase
"搜尋逐字元高亮
set hlsearch
set incsearch
"行內替換
set gdefault
"編碼設定
set enc=utf-8
set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
"語言設定
set langmenu=zh_CN.UTF-8
set helplang=cn
" 我的狀態行顯示的內容(包括檔案型別和解碼)
set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}
set statusline=[%F]%y%r%m%*%=[Line:%l/%L,Column:%c][%p%%]
" 總是顯示狀態行
set laststatus=2
" 命令列(在狀態行下)的高度,預設為1,這裡是2
set cmdheight=2
" 偵測檔案型別
filetype on
" 載入檔案型別外掛
filetype plugin on
" 為特定檔案型別載入相關縮排檔案
filetype indent on
" 儲存全域性變數
set viminfo+=!
" 帶有如下符號的單詞不要被換行分割
set iskeyword+=_,$,@,%,#,-
" 字元間插入的畫素行數目
set linespace=0
" 增強模式中的命令列自動完成操作
set wildmenu
" 使回格鍵(backspace)正常處理indent, eol, start等
set backspace=2
" 允許backspace和游標鍵跨越行邊界
set whichwrap+=<,>,h,l
" 可以在buffer的任何地方使用滑鼠(類似office中在工作區雙擊滑鼠定位)
set mouse=a
set selection=exclusive
set selectmode=mouse,key
" 通過使用: commands命令,告訴我們檔案的哪一行被改變過
set report=0
" 在被分割的視窗間顯示空白,便於閱讀
set fillchars=vert:\ ,stl:\ ,stlnc:\
" 高亮顯示匹配的括號
set showmatch
" 匹配括號高亮的時間(單位是十分之一秒)
set matchtime=1
" 游標移動到buffer的頂部和底部時保持3行距離
set scrolloff=3
" 為C程式提供自動縮排
set smartindent
" 高亮顯示普通txt檔案(需要txt.vim指令碼)
au BufRead,BufNewFile * setfiletype txt
"自動補全
:inoremap ( ()<ESC>i
:inoremap ) <c-r>=ClosePair(')')<CR>
":inoremap { {<CR>}<ESC>O
":inoremap } <c-r>=ClosePair('}')<CR>
:inoremap [ []<ESC>i
:inoremap ] <c-r>=ClosePair(']')<CR>
:inoremap " ""<ESC>i
:inoremap ' ''<ESC>i
function! ClosePair(char)
if getline('.')[col('.') - 1] == a:char
return "\<Right>"
else
return a:char
endif
endfunction
filetype plugin indent on
"開啟檔案型別檢測, 加了這句才可以用智慧補全
set completeopt=longest,menu
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
然後儲存檔案,重新開啟終端就行了!