首頁 > 軟體

Vim設定詳解

2020-06-16 17:06:48

Linux下的編輯器以vim和emacs為主流,一個編輯器之神,一個是神的編輯器。本文以主要介紹如何在linux下以vim為基礎搭建一個比較順手的程式碼編輯器。

  • 有兩種比較流行的方式:

自動安裝
手動安裝

  • 自動安裝

  這種是方法是比較省事的方法,只要一個.vimrc組態檔就可以搞定所有的事情,一次配好即可。以後只要有這個組態檔,就可以走遍天下。
這種方式需要使用一個VIM外掛管理工具來自動管理VIM外掛的安裝與解除安裝,筆者使用的Vundle來管理VIM外掛,Vundle的全稱是Vim Bundle,它是一款Vim外掛管理工具。Vundle讓你可以非常輕鬆地安裝、更新、搜尋和清理Vim外掛。它還能管理你的執行時環境,並幫助標記。

    • 可以在Github上下載Vundle: https://github.com/VundleVim/Vundle.vim

下載完成後,解壓到使用者根目錄的.vim目錄下即可

    • 在終端(命令列)中使用git clone獲取: git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

clone完成後, 會在使用者根目錄下多出來一個bundle目錄,此時Vundle已經安裝完成。安裝好Vundle以後,就可以根據自己的需要安裝外掛了。Vundle提供了幾種不同的外掛安裝方式,一般我們用到的外掛在github都可以找到,因此最常用的一般就是直接找github上外掛對應的倉名,新增到.vimrc中即可。然後開啟vim,執行:PluginInstall命令,即可自動安裝,等待Vundle執行完下載安裝操作後,就可以開始享受VIM了。

筆者的.vimrc檔案設定如下:

"===============================================================================================
set nocompatible " be iMproved, required
filetype off " required

" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" alternatively, pass a path where Vundle should install plugins
"call vundle#begin('~/some/path/here')

" let Vundle manage Vundle, required
Plugin 'VundleVim/Vundle.vim'

" The following are examples of different formats supported.
" Keep Plugin commands between vundle#begin/end.
" plugin on GitHub repo
Plugin 'tpope/vim-fugitive'

" plugin from http://vim-scripts.org/vim/scripts.html
Plugin 'L9'

" Git plugin not hosted on GitHub
"Plugin 'git://git.wincent.com/command-t.git'

" git repos on your local machine (i.e. when working on your own plugin)
"Plugin 'file:///home/gmarik/path/to/plugin'

" The sparkup vim script is in a subdirectory of this repo called vim.
" Pass the path to set the runtimepath properly.
"Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}

" Install L9 and avoid a Naming conflict if you've already installed a
" different version somewhere else.
"Plugin 'ascenator/L9', {'name': 'newL9'}

" All of your Plugins must be added before the following line

"============================ my plugins start =============================
Plugin 'scrooloose/nerdtree'
Plugin 'kien/ctrlp.vim'
Plugin 'vim-airline/vim-airline'
Plugin 'vim-airline/vim-airline-themes'
Plugin 'majutsushi/tagbar'
Plugin 'tacahiroy/ctrlp-funky'
Plugin 'jlanzarotta/bufexplorer'
Plugin 'easymotion/vim-easymotion'
Plugin 'haya14busa/incsearch.vim'
Plugin 'dkprice/vim-easygrep'
Plugin 'dyng/ctrlsf.vim'
Plugin 'Xuyuanp/nerdtree-git-plugin'
Plugin 'hfts/Porsche'
Plugin 'vim-scripts/OmniCppComplete'
Plugin 'vim-scripts/AutoComplPop'
Plugin 'scrooloose/nerdcommenter'

"============================ my plugins end ===============================

call vundle#end() " required
filetype plugin indent on " required
" To ignore plugin indent changes, instead use:
"filetype plugin on
"
" Brief help
" :PluginList - lists configured plugins
" :PluginInstall - installs plugins; append `!` to update or just :PluginUpdate
" :PluginSearch foo - searches for foo; append `!` to refresh local cache
" :PluginClean - confirms removal of unused plugins; append `!` to auto-approve removal
"
" see :h vundle for more details or wiki for FAQ
" Put your non-Plugin stuff after this line

"========== for vim ==============
syntax enable " 開啟語法高亮
set t_Co=256 " 開啟256色顯示
set scrolloff=3 " 捲動時保持邊距5行
set number " 開啟行號顯示
set mouse=a " 開啟滑鼠
set cmdheight=1
set nocompatible
set confirm " 在處理未儲存或唯讀檔案的時候,彈出確認
set autoindent    " 自動縮排
set tabstop=4    " Tab鍵的寬度
set expandtab " 展開tab為空格
set softtabstop=4    " 統一縮排為4
set shiftwidth=4
filetype plugin indent on "開啟檔案型別檢測, 加了這句才可以用智慧補全
set completeopt=longest,menu
set hlsearch " 高亮搜尋
set laststatus=1 " 始終顯示狀態列
set encoding=utf-8 "
set ignorecase " 搜尋忽略大小寫
set nopaste " 切換到正常模式
set list lcs=tab:¦ " 顯示對齊線 | ¦ ┆ │

colorscheme Porsche

set cursorline
"hi cursorline cterm=none term=none
"autocmd WinEnter * setlocal cursorline
"autocmd WinLeave * setlocal nocursorline
"highlight CursorLine guibg=#30F010 ctermbg=189

"自動補全
: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"

"========== for quick key =======
" F11預設時全螢幕
nmap <F2> :NERDTreeToggle<cr>
nmap <F3> :TagbarToggle<CR>
nmap <F4> :ToggleBufExplorer<cr>
nmap <F5> :CtrlPFunky<cr>
nmap <F10> :set paste<cr> " 切換到貼上模式
nmap <F12> :source ~/.vimrc<cr>
nmap <silent> <leader>ll :colorscheme Porsche<cr>
nmap <silent> <leader>jj :colorscheme space-vim-dark<cr>
nmap <silent> <leader>nm :set nonumber<cr>
nmap <silent> <leader>mn :set number<cr>
nmap <silent> <leader>ag :Ag<cr>
nmap <silent> <leader>ff ::shell<cr>

"========== for NERDTree ==============
"let g:NERDTree_title='NERD Tree'
"let g:winManagerWindowLayout='NERDTree|TagList,Tarbar'
autocmd vimenter * NERDTree
nmap wm :NERDTreeToggle<cr>
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") ) | q | endif
function! NERDTree_Start()
exec 'NERDTree'
endfunction
function! NERDTree_IsValid()
return 1
endfunction
nmap <silent> mt :if IsWinManagerVisible() <BAR> WMToggle<CR> <BAR> else <BAR> WMToggle<CR>:q<CR> endif "<CR>

"========== for CtrlP ===================
let g:ctrlp_map = '<c-p>'
let g:ctrlp_cmd = 'CtrlP'
let g:ctrlp_working_path_mode = 'r'
let g:ctrlp_match_window = 'bottom,order:ttb,min:1,max:15,results:100'
let g:ctrlp_tabpage_position = 'al'
let g:ctrlp_working_path_mode = 'r'
let g:ctrlp_reuse_window = 'netrw|help|quickfix'
let g:ctrlp_open_new_file = 't'
let g:ctrlp_open_multiple_files = 'tjr'
let g:ctrlp_arg_map = 1
let g:ctrlp_extensions = ['tag', 'buffertag', 'quickfix', 'dir', 'rtscript',
'undo', 'line', 'changes', 'mixed', 'bookmarkdir']
set wildignore+=*/tmp/*,*.so,*.swp,*.zip,*.png,*.jpg,*.jpeg,*.gif " MacOSX/Linux
let g:ctrlp_custom_ignore = 'v[/].(git|hg|svn)$'

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

"========== for CtrlPFunky ==============
nnoremap <Leader>u :execute 'CtrlPFunky ' . expand('<cword>')<Cr>
let g:ctrlp_extensions = ['funky']
let g:ctrlp_funky_syntax_highlight = 1
let g:ctrlp_funky_matchtype = 'path'
let g:ctrlp_funky_nerdtree_include_files = 1

"========== for vim-airline ==============
let g:airline_theme="light" "light
let g:airline#extensions#tabline#enabled = 1
let g:airline#extensions#tabline#left_sep = ' '
let g:airline#extensions#tabline#left_alt_sep = '|'

"========== for EasyMotion ==============
" <Leader>f{char} to move to {char}
map <Leader>f <Plug>(easymotion-bd-f)
nmap <Leader>f <Plug>(easymotion-overwin-f)
" s{char}{char} to move to {char}{char}
nmap s <Plug>(easymotion-overwin-f2)
" Move to line
map <Leader>L <Plug>(easymotion-bd-jk)
nmap <Leader>L <Plug>(easymotion-overwin-line)
" Move to word
map <Leader>w <Plug>(easymotion-bd-w)
nmap <Leader>w <Plug>(easymotion-overwin-w)

"========== for insearch ==============
map / <Plug>(incsearch-forward)
map ? <Plug>(incsearch-backward)
map g/ <Plug>(incsearch-stay)
nnoremap <Esc><Esc> :<C-u>nohlsearch<CR>
"set incsearch
set hlsearch
let g:incsearch#auto_nohlsearch = 0
map n <Plug>(incsearch-nohl-n)
map N <Plug>(incsearch-nohl-N)
map * <Plug>(incsearch-nohl-*)
map # <Plug>(incsearch-nohl-#)
map g* <Plug>(incsearch-nohl-g*)
map g# <Plug>(incsearch-nohl-g#)

"=========== for NERDTREE-GIT-PLUGIN =====
let g:NERDTreeIndicatorMapCustom = {
"Modified" : "?",
"Staged" : "?",
"Untracked" : "?",
"Renamed" : "?",
"Unmerged" : "═",
"Deleted" : "?",
"Dirty" : "?",
"Clean" : "??",
"Unknown" : "?"
}

"=========== cscope ===============
if has("cscope")
set csprg=/usr/local/bin/cscope
set csto=0
set cst
set nocsverb
" 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
endif
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>

"=========== omnicppcomplete ===============
let OmniCpp_GlobalScopeSearch = 1
let OmniCpp_NamespaceSearch = 2
let OmniCpp_DisplayMode = 1
let OmniCpp_ShowScopeInAbbr = 1
let OmniCpp_ShowPrototypeInAbbr = 1
let OmniCpp_ShowAccess = 1
let OmniCpp_MayCompleteDot = 1
let OmniCpp_MayCompleteArrow = 1
let OmniCpp_MayCompleteScope = 1
let OmniCpp_MayCompleteScope = 1
let OmniCpp_SelectFirstItem = 1
let OmniCpp_DefaultNamespace=["std"]
let OmniCpp_SelectFirstItem = 2

"===============NERD Commenter=========================
let g:NERDSpaceDelims = 1 " Add spaces after comment delimiters by default
let g:NERDCompactSexyComs = 1 " Use compact syntax for prettified multi-line comments
let g:NERDDefaultAlign = 'left' " Align line-wise comment delimiters flush left instead of following code indentation
let g:NERDAltDelims_java = 1 " Set a language to use its alternate delimiters by default
let g:NERDCustomDelimiters = { 'c': { 'left': '/**','right': '*/' } } " Add your own custom formats or override the defaults
let g:NERDCommentEmptyLines = 1 " Allow commenting and inverting empty lines (useful when commenting a region)
let g:NERDTrimTrailingWhitespace = 1 " Enable trimming of trailing whitespace when uncommenting
"===============================================================================================

  • 手動安裝

手動安裝,當然是要自己一個一個地安裝外掛了。這種方式的特點是需要自己一個一下下載vim外掛,然後手動進行安裝。雖然比較費事,但如果之前有vim外掛安裝包的備份檔案,那就可以不依賴於網路。所以還是推薦在自己的本地留一份常用外掛的安裝包備份。手動安裝的過程比較簡單,基本上就是“下載-解壓”,先從網絡卡下載好外掛的壓縮包,一般來說直接解壓到.vim目錄中即可。

筆者常用的幾個外掛如下,一般都可以在github上找到,其實從上面的組態檔中就可以找到筆者使用了哪些vim外掛。
Plugin 'scrooloose/nerdtree'
Plugin 'kien/ctrlp.vim'
Plugin 'vim-airline/vim-airline'
Plugin 'vim-airline/vim-airline-themes'
Plugin 'majutsushi/tagbar'
Plugin 'tacahiroy/ctrlp-funky'
Plugin 'jlanzarotta/bufexplorer'
Plugin 'easymotion/vim-easymotion'
Plugin 'haya14busa/incsearch.vim'
Plugin 'dkprice/vim-easygrep'
Plugin 'dyng/ctrlsf.vim'
Plugin 'Xuyuanp/nerdtree-git-plugin'
Plugin 'hfts/Porsche'
Plugin 'vim-scripts/OmniCppComplete'
Plugin 'vim-scripts/AutoComplPop'
Plugin 'scrooloose/nerdcommenter'

最後,附上筆者vim的兩張截圖:

Vim入門基礎知識集錦  http://www.linuxidc.com/Linux/2017-02/140903.htm

Vim入門基礎教學 http://www.linuxidc.com/Linux/2017-02/140279.htm

把Vim打造成優秀的C++ IDE  http://www.linuxidc.com/Linux/2016-06/132262.htm

Ubuntu 14.04升級Vim7.4到8.0  http://www.linuxidc.com/Linux/2016-11/136816.htm

Vim安裝youcompleteme自動補全外掛  http://www.linuxidc.com/Linux/2016-11/137665.htm

Linux Vim編輯器使用簡單講解  http://www.linuxidc.com/Linux/2016-12/138930.htm

Vim文字編輯器  http://www.linuxidc.com/Linux/2017-03/142275.htm

Vim安裝與設定進階版 http://www.linuxidc.com/Linux/2017-03/141724.htm

Vim編輯器使用教學  http://www.linuxidc.com/Linux/2017-07/145885.htm

Ubuntu 16.04 Vim YouCompleteMe自動補全的安裝設定與使用  http://www.linuxidc.com/Linux/2017-02/141088.htm

Linux文字編輯器Vim基礎教學  http://www.linuxidc.com/Linux/2017-09/146930.htm

本文永久更新連結地址http://www.linuxidc.com/Linux/2017-09/147109.htm 


IT145.com E-mail:sddin#qq.com