Vim 編輯器可以說在程序員屆中享有盛譽(yù)招驴,其豐富強(qiáng)大的插件和靈活的移動也使得開發(fā)起來事半功倍掸刊;但是 Vim 復(fù)雜的配置和極大的學(xué)習(xí)成本也讓很多人望而生畏抠璃。
今天就來整理一下如何配置一個(gè) Vim 開發(fā)環(huán)境環(huán)境挤渐。
說明
- 本人目前主要從事 PHP 開發(fā)工作茶凳,如果針對其他語言舶替,可能還需要額外的其他配置
Vim 基本知識
Vim 的不同模式
我們知道 Vim 大概分為普通模式令境、插入模式、輸入模式和可視模式顾瞪,下面簡單介紹一下各個(gè)模式的基本知識和區(qū)別
- 普通模式
打開文件時(shí)的默認(rèn)模式舔庶,無論在哪種模式下,按下Esc鍵就會進(jìn)入普通模式陈醒。在這個(gè)模式下惕橙,可以移動光標(biāo),刪除某個(gè)字符钉跷,刪除某行弥鹦,復(fù)制多行,粘貼多行。
下面是在普通模式下的基本快捷鍵
j 向上移動一行
k 向下移動一行
h 向左移動一格
k 向右移動一格
x 刪除光標(biāo)后的一個(gè)字符
dd 剪切光標(biāo)所在的那一行彬坏,并復(fù)制
yy 復(fù)制光標(biāo)所在的行
p 粘貼復(fù)制的內(nèi)容
u 還原上一次的操作
ctr + r 回退上一次的還原操作
Vim 普通模式下的命令還有很多朦促,想要熟練使用 Vim,掌握這些命令是必須的
- 插入模式
在正常模式下按下 i 鍵栓始,也叫插入模式务冕,插入模式里可以進(jìn)行文字的輸入,在該模式下按Esc鍵切換到普通模式幻赚。 - 輸入模式
在正常模式下輸入 ":" 或 "/" 進(jìn)入命令行模式禀忆,在該模式下可以進(jìn)行保存、搜索落恼、替換箩退、退出、顯示行號等佳谦。
搜索
/word 光標(biāo)之后查找字符串 word戴涝,按 n 向后搜索;
?word 光標(biāo)之前查找字符串 word吠昭,按 n 向前搜索喊括;
替換
:n1,n2/word1/word2/g
將 n1 到 n2 行之間的 word1 替換為 word2,不加g則只替換每行的第一個(gè)word1矢棚;
:1,$s/word1/word2/g
將文章中的 word1 替換為 word2,不加 g 則只替換每行的第一個(gè)word1府喳;
其他
:w 保存文本 蒲肋;
:w! 強(qiáng)制保存;在root用戶下钝满,文件只讀也能保存兜粘;
:q 退出vim ;
:q! 強(qiáng)制退出弯蚜;
:wq 保存并退出孔轴;
:set nu 顯示行號;
:set nonu 不顯示行號碎捺;
- 可視模式
可視模式是選中一塊區(qū)域進(jìn)行操作路鹰,包括刪除、替換收厨、復(fù)制晋柱、粘貼、改變大小寫等诵叁。
在正常模式下按 v(小寫)進(jìn)入字符文本雁竞,按 V(大寫)進(jìn)入行文本,按ctrl + v 進(jìn)入塊文本拧额。然后使用上下左右鍵進(jìn)行操作選中區(qū)域碑诉。
對選中的部分使用 d 進(jìn)行刪除彪腔,y 進(jìn)行復(fù)制,p 進(jìn)行粘貼进栽,r 進(jìn)行文本替換漫仆,gu 轉(zhuǎn)換為小寫,gU 轉(zhuǎn)換為大寫泪幌,g~ 大小寫互換盲厌。
基本配置
Vim 配置文件一般是位于個(gè)人 home 下的 .vimrc (~/.vimrc)文件,我們的配置 Vim 也主要是針對這個(gè)文件進(jìn)行修改
下面是 Vim 的一些基礎(chǔ)配置
"設(shè)置字體
set guifont=Consolas:h12:cANSI
"設(shè)置搜索高亮 祸泪,取消請使用set nohlsearch
set hlsearch
" 關(guān)閉 .swp 文件
set noswapfile
" 顯示行號吗浩;取消顯示可輸入 set nonu
set number
" 突出顯示當(dāng)前行
set cursorline
"去掉討厭的有關(guān) vim 一致性模式,避免以前版本的一些 bug 和局限.
set nocompatible
"否則無法使用退格鍵
set backspace=indent,eol,start
"開啟語法高亮
syntax on
"設(shè)置命令歷史記錄為10條.
set history=100
"設(shè)置替換 tab 鍵 [縮進(jìn)]
set expandtab
"設(shè)置 tab 鍵為4個(gè)空格.
set tabstop=4
set softtabstop=4
"設(shè)置當(dāng)行之間交錯時(shí)使用4個(gè)空格
set shiftwidth=4
"設(shè)置匹配模式,類似當(dāng)輸入一個(gè)左括號時(shí)會匹配相應(yīng)的那個(gè)右括號
set showmatch
"搜索選項(xiàng).(比如,鍵入"/bo",光標(biāo)自動找到第一個(gè)"bo"所在的位置.)
set noincsearch
"字符集
set fileencodings=ucs-bom,utf-8,chinese,cp936
"顏色方案
colorscheme desert
"colorscheme peachpuff
"colorscheme molokai
"colorscheme ron
"colorscheme default
"colorscheme delek
"依據(jù)上面的對起格式没隘,智能的選擇對起方式懂扼,對于類似C語言編.
"set smartindent
"自動縮進(jìn)
"set autoindent
"C風(fēng)格縮進(jìn)
set cindent
"設(shè)置文件類型
set filetype=php
"set filetype=go
"set filetype=html
" 用空格鍵來開關(guān)代碼折疊
set foldenable
" 手動折疊代碼
" set foldmethod=manual
" 按縮進(jìn)自動折疊代碼
" set foldmethod=indent
" 按語法高亮折疊代碼
" set foldmethod=syntax
" 按標(biāo)記折疊代碼
set foldmethod=marker
" 設(shè)置替換輸入望浩,比如通過一下配置塌衰,可以通過輸入 w3c + 回車,輸入后面 HTML 基本模板內(nèi)容
ab w3c <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><ESC>o<html xmlns="http://www.w3.org/1999/xhtml"><CR><head><CR><title>1</title><CR><meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <CR><script src="http://cdn.bootcss.com/jquery/3.0.0-beta1/jquery.min.js" type="text/javascript"></script><CR><style><CR>body,ul,ol,li,p,h1 ,h2,h3,h4,h5,h6,form,fieldset,td,img,div{margin:0;padding:0;border:0;}<CR>/*,table notice:The table we often usered by develop so we exeges is,if you publish you software please move on top of style css*/<CR>body{margin-top:0px;}<CR>ul,ol{list-style-type:none;}<CR>select,input,i mg,select{vertical-align:middle;}<CR>.clearit{clear:both;}<CR></style><CR><meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" /><CR> </head><CR><body><CR></body><CR></html><ESC>kO
關(guān)于折疊的用法
我們看到 Vim 里面有常用的幾個(gè)折疊方法领猾,我們來主要介紹一下默認(rèn)的 manual 折疊方法和 marker 折疊方法
- manual 手動折疊瑰妄,并且關(guān)閉 Vim 后所有的折疊都會消失
- marker 標(biāo)記折疊陷嘴,按照標(biāo)記進(jìn)行折疊,關(guān)閉 Vim 后折疊并不會消失(推薦使用)
標(biāo)記折疊方法使用
- 跳轉(zhuǎn)到你要折疊的起始位置
- 在普通模式下輸入 zf
- 跳轉(zhuǎn)到你要折疊的結(jié)束位置
- 從你要折疊的起始位置到結(jié)束位置已經(jīng)折疊并且標(biāo)記起來了间坐,并且下次用 Vim 打開文件灾挨,折疊依然存在
折疊常用命令
以下折疊的命令均在普通模式下輸入
- zR 打開所有折疊
- zM 關(guān)閉所有折疊
- zE 刪除所有的折疊標(biāo)簽
快捷鍵配置
快捷鍵映射是 Vim 的強(qiáng)大功能,下面我們就來看一下 Vim 快捷鍵映射的相關(guān)配置
Vim 快捷鍵基本知識
- Vim 快捷鍵又叫鍵盤映射竹宋,一般會在用戶字自定義快捷鍵前加一個(gè)前置輸入劳澄,這樣可以避免和 Vim 自身的快捷鍵相互沖突
- Vim 設(shè)置快捷鍵有 map、nmap蜈七、imap秒拔、vmap 等命令,這些都是什么意思呢飒硅?
nore 表示非遞歸砂缩。
n 表示在普通模式下生效。
v 表示在可視模式下生效狡相。
i 表示在插入模式下生效梯轻。
各個(gè)命令生效的模式如下表所示
Command 命令 | Normal 常規(guī)模式 | Visual 可視化模式 | Insert Only 插入模式 | Command Line命令行模式 |
---|---|---|---|---|
map | yes | yes | ||
map! | yes | yes | ||
nmap | yes | |||
vmap | yes | |||
imap | yes | |||
cmap | yes |
快捷鍵配置
"設(shè)置用戶快捷鍵的前置輸入為 ,
let mapleader = ","
"定義 mm返回最新修改的位置
map mm '.zz
"退出插入模式
imap <leader>q <ESC>
"F9定義函數(shù)和類的注釋 文件位置
"下載php-doc.vim 放到 ~/.vim/plugin/php-doc.vim"
inoremap <F9> <ESC>:call PhpDocSingle()<CR>
nnoremap <F9> :call PhpDocSingle()<CR>
vnoremap <F9> :call PhpDocRange()<CR>
"設(shè)置行號
map <leader>1 :set nu<ENTER>
"取消設(shè)置行號
map <leader>2 :set nonu<ENTER>
"插入HTML注釋
map <leader>3 O<!--<ESC>yyp2xA><ESC>ddpk
"以/**/格式注釋掉一行
map <leader>4 O/**<ESC>yyp2xA/<ESC>ddpk
"在上一行加分隔線
map <leader>8 O/*------------------------------------------------------------------------*/<ESC>j
"手動折疊
"按大括號包圍折疊
nmap <silent> <leader>q f{v%zf
"按中括號包圍折疊
nmap <silent> <leader>[ f[v%zf
"切換標(biāo)簽
"向右切換標(biāo)簽
map <leader>w <C-W><C-W>
"向左切換標(biāo)簽
map <leader>e <C-W>h
" 切換 tab
"跳轉(zhuǎn)到上一個(gè) tab
map <leader>a :tabp<CR>
"跳轉(zhuǎn)到下一個(gè) tab
map <leader>f :tabn<CR>
" 管理 buffer
"關(guān)閉當(dāng)前 buffer
nmap <leader>k :bd<CR>
"跳轉(zhuǎn)到上一個(gè) buffer
map <leader>s :bp<CR>
"跳轉(zhuǎn)到下一個(gè) buffer
map <leader>d :bn<CR>
"跳轉(zhuǎn)到行尾回車
nmap <C-\> $a<CR><ESC>
" 當(dāng)前行向下移動一行
nmap <C-j> ddp
" 當(dāng)前行向上移動一行
nmap <C-k> dd<Up>P
" 插入模式下的移動快捷鍵
" 插入模式下移動到行首
inoremap <C-U> <Home>
" 插入模式下移動到行尾
inoremap <C-O> <End>
"插入模式下上下左右移動
inoremap <C-b> <Left>
inoremap <C-l> <Right>
inoremap <C-j> <Down>
inoremap <C-k> <Up>
"插入模式和普通模式下的保存快捷鍵
nnoremap <C-D> :w<CR>
inoremap <C-D> <ESC>:w<CR>i
"插入模式下代碼提示
inoremap <leader>i <C-X><C-l>
inoremap <leader>o <C-X><C-O>
" 利用臨時(shí)文件來實(shí)現(xiàn)復(fù)制、粘貼
" ctrl+v 粘貼
" ctrl+c 復(fù)制
" ctrl+x 剪切
imap <C-V> <ESC>:r $HOME/.vim/.vimxfer<CR>i
nmap <C-V> :r $HOME/.vim/.vimxfer<CR>
vmap <C-V> c<ESC>:r $HOME/.vim/.vimxfer<CR>
"必須在可視模式下復(fù)制
vmap <C-C> :w! $HOME/.vim/.vimxfer<CR>
"實(shí)現(xiàn)ctrl+x 剪切 , 利用vim書簽來做
vmap <C-X> ma:w! $HOME/.vim/.vimxfer<CR>V'ad
"因?yàn)槲覀円鎿Q掉ctrl+c為復(fù)制, ctrl+v 為粘貼 , 所以重新定義塊操作為 ,v
noremap <leader>v <C-V>
"重新定義ZZ , 同時(shí)清除復(fù)制緩存
map ZZ :!echo "" > $HOME/.vim/.vimxfer<CR>:wq<CR>
說明
- 實(shí)現(xiàn)利用
ctrl + c
尽棕、ctrl + v
來復(fù)制喳挑、粘貼功能需要在創(chuàng)建 .vimxfer 文件(touch ~/.vim/.vimxfer
)
插件管理和配置
插件為 Vim 提供了強(qiáng)大的功能,Vim 有許多插件是通過 Vundle 管理的,接下來我們來介紹使用 Vundle 來安裝管理插件
安裝 Vundle
可以通過如下命令安裝 Vundle
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
Vundle 配置以及基本插件安裝
set nocompatible " be iMproved, required
filetype on " required
" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'gmarik/Vundle.vim'
Plugin 'fatih/vim-go'
Plugin 'godlygeek/tabular'
Plugin 'dgryski/vim-godef'
Plugin 'Blackrush/vim-gocode'
Plugin 'majutsushi/tagbar'
Plugin 'scrooloose/nerdtree'
Bundle 'jistr/vim-nerdtree-tabs'
Plugin 'Xuyuanp/nerdtree-git-plugin'
"React
"Plugin 'pangloss/vim-javascript'
"Plugin 'mxw/vim-jsx'
"Plugin 'jbgutierrez/vim-babel'
"Es6
"Plugin 'tomtom/tlib_vim'
"Plugin 'MarcWeber/vim-addon-mw-utils'
"Plugin 'garbas/vim-snipmate'
"Plugin 'isRuslan/vim-es6'
"Plugin 'cosminadrianpopescu/vim-tail'
"github
"Plugin 'git@github.com:relunctance/vimrc.git'
" 項(xiàng)目中字符或者函數(shù)名查找
Plugin 'relunctance/govim-find-func'
"Plugin 'bufexplore.zip'
Plugin 'cscope.vim'
"超級注釋插件
Plugin 'tpope/vim-commentary'
call vundle#end()
filetype plugin indent on
"
" Brief help
" :PluginList - list configured plugins
" :PluginInstall(!) - install (update) plugins
" :PluginSearch(!) foo - search (or refresh cache first) for foo
" :PluginClean(!) - confirm (or auto-approve) removal of unused plugins
"
" see :h vundle for more details or wiki for FAQ
" Put your non-Plugin stuff after this line
做好這些配置之后伊诵,便可以在命令行模式下使用 PluginInstall 命令安裝插件了
:PluginInstall(!)
下面介紹一些重要插件以及其相關(guān)的快捷鍵
注釋插件 tpope/vim-commentary
tpope/vim-commentary 是一款為代碼添加注釋的插件单绑,下面是其相關(guān)配置
"vim-commentary
"gcc 注釋當(dāng)前行(普通模式)或者取消注釋當(dāng)前行
"gc 可視模式下,注釋當(dāng)前選中的部分曹宴,或者取消當(dāng)前選中部分的注釋
"gcu 撤銷上一次注釋的部分搂橙,可以是一行也可以是多行
"gcgc 撤銷注釋當(dāng)前行和鄰近的上下兩行
"為python和shell等添加注釋
autocmd FileType python,shell,coffee set commentstring=#\ %s
"修改注釋風(fēng)格
autocmd FileType java,php,go,c,cpp set commentstring=//\ %s
目錄樹插件 NerdTree
目錄樹插件 NerdTree 可以在左側(cè)欄列出當(dāng)前文件所在的目錄樹并管理文件和目錄,類似IDE笛坦,可大大提高開發(fā)效率区转,實(shí)現(xiàn)效果如下:NerdTree 插件可以通過 Vundle 安裝,下面我們來看一下插件的基本配置和用法
"NERD Tree
let NERDChristmasTree=1
let NERDTreeAutoCenter=1
let NERDTreeBookmarksFile= $HOME . '/.vim/bookmark.txt' "書簽保存位置版扩,需要手動創(chuàng)建
let NERDTreeMouseMode=2
let NERDTreeShowBookmarks=1
let NERDTreeShowFiles=1
let NERDTreeShowHidden=1
let NERDTreeQuitOnOpen=1
let NERDTreeShowLineNumbers=1
let NERDTreeWinPos='left' "設(shè)置目錄標(biāo)簽位置
let NERDTreeWinSize=40 "設(shè)置目錄標(biāo)簽寬度
nmap <silent> <leader>t :NERDTreeToggle<CR> "關(guān)閉打開目錄標(biāo)簽快捷鍵
NerdTree 常用命令
t : 在新 Tab 中打開選中文件/書簽废离,并跳到新 Tab
T : 在新 Tab 中打開選中文件/書簽,但不跳到新 Tab
i : split 一個(gè)新窗口打開選中文件礁芦,并跳到該窗口
gi : split 一個(gè)新窗口打開選中文件蜻韭,但不跳到該窗口
s : vsplit 一個(gè)新窗口打開選中文件,并跳到該窗口
gs : vsplit 一個(gè)新 窗口打開選中文件柿扣,但不跳到該窗口
! : 執(zhí)行當(dāng)前文件
O : 遞歸打開選中 結(jié)點(diǎn)下的所有目錄
x : 合攏選中結(jié)點(diǎn)的父目錄
X : 遞歸 合攏選中結(jié)點(diǎn)下的所有目錄
P : 跳到根結(jié)點(diǎn)
p : 跳到父結(jié)點(diǎn)
K : 跳到當(dāng)前目錄下同級的第一個(gè)結(jié)點(diǎn)
J : 跳到當(dāng)前目錄下同級的最后一個(gè)結(jié)點(diǎn)
k : 跳到當(dāng)前目錄下同級的前一個(gè)結(jié)點(diǎn)
j : 跳到當(dāng)前目錄下同級的后一個(gè)結(jié)點(diǎn)
u : 將當(dāng)前根結(jié)點(diǎn)的父目錄設(shè)為根目錄肖方,并變成合攏原根結(jié)點(diǎn)
U : 將當(dāng)前根結(jié)點(diǎn)的父目錄設(shè)為根目錄,但保持展開原根結(jié)點(diǎn)
r : 遞歸刷新選中目錄
R : 遞歸刷新根結(jié)點(diǎn)
m : 顯示文件系統(tǒng)菜單未状,用于新建目錄俯画、文件
A : Zoom (maximize-minimize) the NERDTree window
? : 切換是否顯示 Quick Help
以上命令需要在普通模式下,移動光標(biāo)到 NerdTree 的窗口直接輸入就可以
代碼導(dǎo)航插件 Tagbar
Tagbar 是一款 Vim 下常用的代碼函數(shù)娩践、變量導(dǎo)航插件活翩,效果如下圖所示
使用這個(gè)插件需要安裝 ctags 軟件,并生成代碼導(dǎo)航的 tags 文件
插件配置
在 vim 配置文件里面翻伺,我們需要對插件進(jìn)行如下簡單的配置
" Tag list (tagbar)
"
" 使用tagbar
" tagbar 關(guān)閉打開快捷鍵
nmap <silent> <leader>g :TagbarToggle<CR>
let g:tagbar_ctags_bin = '/usr/bin/ctags'
let g:tagbar_width = 60
插件常用命令
ctrl+n : Go to next top-level tag
ctrl+p : Go to previous top-level tag
x : Zoom window in/out
? : Toggle help
ctags 安裝與使用
ctags(Generate tag files for source code)是 vim 下方便代碼閱讀的工具,它可以在命令行下幫助程序員很容易地瀏覽源代碼沮焕。ctags 最先是用來生成 C 代碼的 tags 文件吨岭,后來擴(kuò)展成可以生成各類語言的 tags , 有些語言也有專有的 tags 生成工具(比如java的jtags, python的 ptags).
安裝 ctags 軟件
//centos 安裝
yum install ctags
生成 tags 文件
在你的代碼根目錄下,運(yùn)行如下代碼
ctags --languages=PHP -R .
ctags 常用命令
ctrl+ ] 跳到光標(biāo)所在函數(shù)或者結(jié)構(gòu)體的定義處
ctrl+ o 返回之前的跳轉(zhuǎn)
ctrl + i 回退 ctrl+ o 的跳轉(zhuǎn)
GIT 文件狀態(tài)插件 Xuyuanp/nerdtree-git-plugin
nerdtree-git-plugin 插件可以在 NerdTree 插件展示的文件樹窗口上顯示文件的 GIT 狀態(tài)峦树,只要經(jīng)過以下配置就可以使用
let g:NERDTreeIndicatorMapCustom = {
\ "Modified" : "?",
\ "Staged" : "?",
\ "Untracked" : "?",
\ "Renamed" : "?",
\ "Unmerged" : "═",
\ "Deleted" : "?",
\ "Dirty" : "?",
\ "Clean" : "??",
\ 'Ignored' : '?',
\ "Unknown" : "?"
\ }
代碼自動報(bào)錯提示
普通 IDE 都有代碼語法錯誤提示辣辫,那么 Vim 怎么實(shí)現(xiàn)這個(gè)功能呢,我們可以通過下面的配置實(shí)現(xiàn)
"定義檢測 PHP 語法是否正確的函數(shù)
function! CompilePHP()
let file = shellescape(expand('%:p'))
let command = "silent !php72 -l " . file
execute command
if v:shell_error != 0
silent !clear
let command = "!php72 -l " . file
execute command
else
redraw!
endif
endfunction
"配置以 .php 文件結(jié)尾的文件保存的時(shí)候調(diào)用 CompilePHP 函數(shù)
autocmd BufWritePost *.php call CompilePHP()
"定義檢測 shell 腳本的函數(shù)
function! CompileShell()
let file = shellescape(expand('%:p'))
let command = "silent !sh -n " . file
execute command
if v:shell_error != 0
silent !clear
let command = "!sh -n " . file
execute command
else
redraw!
endif
endfunction
"配置 .sh 結(jié)尾的文件保存的時(shí)候自動調(diào)用 CompileShell 函數(shù)
autocmd BufWritePost *.sh call CompileShell()
總結(jié)
下面將本文講到的配置整理如下
"設(shè)置字體
set guifont=Consolas:h12:cANSI
"設(shè)置搜索高亮 魁巩,取消請使用set nohlsearch
set hlsearch
" 關(guān)閉 .swp 文件
set noswapfile
" 顯示行號急灭;取消顯示可輸入 set nonu
set number
" 突出顯示當(dāng)前行
set cursorline
"去掉討厭的有關(guān) vim 一致性模式,避免以前版本的一些 bug 和局限.
set nocompatible
"否則無法使用退格鍵
set backspace=indent,eol,start
"開啟語法高亮
syntax on
"設(shè)置命令歷史記錄為10條.
set history=100
"設(shè)置替換 tab 鍵 [縮進(jìn)]
set expandtab
"設(shè)置 tab 鍵為4個(gè)空格.
set tabstop=4
set softtabstop=4
"設(shè)置當(dāng)行之間交錯時(shí)使用4個(gè)空格
set shiftwidth=4
"設(shè)置匹配模式,類似當(dāng)輸入一個(gè)左括號時(shí)會匹配相應(yīng)的那個(gè)右括號
set showmatch
"搜索選項(xiàng).(比如,鍵入"/bo",光標(biāo)自動找到第一個(gè)"bo"所在的位置.)
set noincsearch
"字符集
set fileencodings=ucs-bom,utf-8,chinese,cp936
"顏色方案
colorscheme desert
"colorscheme peachpuff
"colorscheme molokai
"colorscheme ron
"colorscheme default
"colorscheme delek
"依據(jù)上面的對起格式谷遂,智能的選擇對起方式葬馋,對于類似C語言編.
"set smartindent
"自動縮進(jìn)
"set autoindent
"C風(fēng)格縮進(jìn)
set cindent
"設(shè)置文件類型
set filetype=php
"set filetype=go
"set filetype=html
" 用空格鍵來開關(guān)代碼折疊
set foldenable
" 手動折疊代碼
" set foldmethod=manual
" 按縮進(jìn)自動折疊代碼
" set foldmethod=indent
" 按語法高亮折疊代碼
" set foldmethod=syntax
" 按標(biāo)記折疊代碼
set foldmethod=marker
" 設(shè)置替換輸入,比如通過一下配置,可以通過輸入 w3c + 回車畴嘶,輸入后面 HTML 基本模板內(nèi)容
ab w3c <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><ESC>o<html xmlns="http://www.w3.org/1999/xhtml"><CR><head><CR><title>1</title><CR><meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <CR><script src="http://cdn.bootcss.com/jquery/3.0.0-beta1/jquery.min.js" type="text/javascript"></script><CR><style><CR>body,ul,ol,li,p,h1 ,h2,h3,h4,h5,h6,form,fieldset,td,img,div{margin:0;padding:0;border:0;}<CR>/*,table notice:The table we often usered by develop so we exeges is,if you publish you software please move on top of style css*/<CR>body{margin-top:0px;}<CR>ul,ol{list-style-type:none;}<CR>select,input,i mg,select{vertical-align:middle;}<CR>.clearit{clear:both;}<CR></style><CR><meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" /><CR> </head><CR><body><CR></body><CR></html><ESC>kO
"快捷鍵配置
"設(shè)置用戶快捷鍵的前置輸入為 ,
let mapleader = ","
"定義 mm返回最新修改的位置
map mm '.zz
"退出插入模式
imap <leader>q <ESC>
"F9定義函數(shù)和類的注釋 文件位置
"下載php-doc.vim 放到 ~/.vim/plugin/php-doc.vim"
inoremap <F9> <ESC>:call PhpDocSingle()<CR>
nnoremap <F9> :call PhpDocSingle()<CR>
vnoremap <F9> :call PhpDocRange()<CR>
"設(shè)置行號
map <leader>1 :set nu<ENTER>
"取消設(shè)置行號
map <leader>2 :set nonu<ENTER>
"插入HTML注釋
map <leader>3 O<!--<ESC>yyp2xA><ESC>ddpk
"以/**/格式注釋掉一行
map <leader>4 O/**<ESC>yyp2xA/<ESC>ddpk
"在上一行加分隔線
map <leader>8 O/*------------------------------------------------------------------------*/<ESC>j
"手動折疊
"按大括號包圍折疊
nmap <silent> <leader>q f{v%zf
"按中括號包圍折疊
nmap <silent> <leader>[ f[v%zf
"切換標(biāo)簽
"向右切換標(biāo)簽
map <leader>w <C-W><C-W>
"向左切換標(biāo)簽
map <leader>e <C-W>h
" 切換 tab
"跳轉(zhuǎn)到上一個(gè) tab
map <leader>a :tabp<CR>
"跳轉(zhuǎn)到下一個(gè) tab
map <leader>f :tabn<CR>
" 管理 buffer
"關(guān)閉當(dāng)前 buffer
nmap <leader>k :bd<CR>
"跳轉(zhuǎn)到上一個(gè) buffer
map <leader>s :bp<CR>
"跳轉(zhuǎn)到下一個(gè) buffer
map <leader>d :bn<CR>
"跳轉(zhuǎn)到行尾回車
nmap <C-\> $a<CR><ESC>
" 當(dāng)前行向下移動一行
nmap <C-j> ddp
" 當(dāng)前行向上移動一行
nmap <C-k> dd<Up>P
" 插入模式下的移動快捷鍵
" 插入模式下移動到行首
inoremap <C-U> <Home>
" 插入模式下移動到行尾
inoremap <C-O> <End>
"插入模式下上下左右移動
inoremap <C-b> <Left>
inoremap <C-l> <Right>
inoremap <C-j> <Down>
inoremap <C-k> <Up>
"插入模式和普通模式下的保存快捷鍵
nnoremap <C-D> :w<CR>
inoremap <C-D> <ESC>:w<CR>i
"插入模式下代碼提示
inoremap <leader>i <C-X><C-l>
inoremap <leader>o <C-X><C-O>
" 利用臨時(shí)文件來實(shí)現(xiàn)復(fù)制蛋逾、粘貼
" ctrl+v 粘貼
" ctrl+c 復(fù)制
" ctrl+x 剪切
imap <C-V> <ESC>:r $HOME/.vim/.vimxfer<CR>i
nmap <C-V> :r $HOME/.vim/.vimxfer<CR>
vmap <C-V> c<ESC>:r $HOME/.vim/.vimxfer<CR>
"必須在可視模式下復(fù)制
vmap <C-C> :w! $HOME/.vim/.vimxfer<CR>
"實(shí)現(xiàn)ctrl+x 剪切 , 利用vim書簽來做
vmap <C-X> ma:w! $HOME/.vim/.vimxfer<CR>V'ad
"因?yàn)槲覀円鎿Q掉ctrl+c為復(fù)制, ctrl+v 為粘貼 , 所以重新定義塊操作為 ,v
noremap <leader>v <C-V>
"重新定義ZZ , 同時(shí)清除復(fù)制緩存
map ZZ :!echo "" > $HOME/.vim/.vimxfer<CR>:wq<CR>
" 插件管理
set nocompatible " be iMproved, required
filetype on " required
" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'gmarik/Vundle.vim'
Plugin 'fatih/vim-go'
Plugin 'godlygeek/tabular'
Plugin 'dgryski/vim-godef'
Plugin 'Blackrush/vim-gocode'
Plugin 'majutsushi/tagbar'
Plugin 'scrooloose/nerdtree'
Bundle 'jistr/vim-nerdtree-tabs'
Plugin 'Xuyuanp/nerdtree-git-plugin'
"React
"Plugin 'pangloss/vim-javascript'
"Plugin 'mxw/vim-jsx'
"Plugin 'jbgutierrez/vim-babel'
"Es6
"Plugin 'tomtom/tlib_vim'
"Plugin 'MarcWeber/vim-addon-mw-utils'
"Plugin 'garbas/vim-snipmate'
"Plugin 'isRuslan/vim-es6'
"Plugin 'cosminadrianpopescu/vim-tail'
"github
"Plugin 'git@github.com:relunctance/vimrc.git'
" 項(xiàng)目中字符或者函數(shù)名查找
Plugin 'relunctance/govim-find-func'
"Plugin 'bufexplore.zip'
Plugin 'cscope.vim'
"超級注釋插件
Plugin 'tpope/vim-commentary'
call vundle#end()
filetype plugin indent on
"
" Brief help
" :PluginList - list configured plugins
" :PluginInstall(!) - install (update) plugins
" :PluginSearch(!) foo - search (or refresh cache first) for foo
" :PluginClean(!) - confirm (or auto-approve) removal of unused plugins
"
" see :h vundle for more details or wiki for FAQ
" Put your non-Plugin stuff after this line
"-------------------------------------vim-commentary----------------------------------
"gcc 注釋當(dāng)前行(普通模式)或者取消注釋當(dāng)前行
"gc 可視模式下,注釋當(dāng)前選中的部分窗悯,或者取消當(dāng)前選中部分的注釋
"gcu 撤銷上一次注釋的部分区匣,可以是一行也可以是多行
"gcgc 撤銷注釋當(dāng)前行和鄰近的上下兩行
"為python和shell等添加注釋
autocmd FileType python,shell,coffee set commentstring=#\ %s
"修改注釋風(fēng)格
autocmd FileType java,php,go,c,cpp set commentstring=//\ %s
"------------------------------------------NERD Tree-----------------------------------
let NERDChristmasTree=1
let NERDTreeAutoCenter=1
let NERDTreeBookmarksFile= $HOME . '/.vim/bookmark.txt' "書簽保存位置,需要手動創(chuàng)建
let NERDTreeMouseMode=2
let NERDTreeShowBookmarks=1
let NERDTreeShowFiles=1
let NERDTreeShowHidden=1
let NERDTreeQuitOnOpen=1
let NERDTreeShowLineNumbers=1
let NERDTreeWinPos='left' "設(shè)置目錄標(biāo)簽位置
let NERDTreeWinSize=40 "設(shè)置目錄標(biāo)簽寬度
nmap <silent> <leader>t :NERDTreeToggle<CR> "關(guān)閉打開目錄標(biāo)簽快捷鍵
" ------------------------------——-----Tag list (tagbar)--------------------------------------
"
" 使用tagbar
" tagbar 關(guān)閉打開快捷鍵
nmap <silent> <leader>g :TagbarToggle<CR>
let g:tagbar_ctags_bin = '/usr/bin/ctags'
let g:tagbar_width = 60
"-----------------------------------nerdtree-git-plugin-----------------------------------------
let g:NERDTreeIndicatorMapCustom = {
\ "Modified" : "?",
\ "Staged" : "?",
\ "Untracked" : "?",
\ "Renamed" : "?",
\ "Unmerged" : "═",
\ "Deleted" : "?",
\ "Dirty" : "?",
\ "Clean" : "??",
\ 'Ignored' : '?',
\ "Unknown" : "?"
\ }
" 代碼報(bào)錯提示
"定義檢測 PHP 語法是否正確的函數(shù)
function! CompilePHP()
let file = shellescape(expand('%:p'))
let command = "silent !php72 -l " . file
execute command
if v:shell_error != 0
silent !clear
let command = "!php72 -l " . file
execute command
else
redraw!
endif
endfunction
"配置以 .php 文件結(jié)尾的文件保存的時(shí)候調(diào)用 CompilePHP 函數(shù)
autocmd BufWritePost *.php call CompilePHP()
"定義檢測 shell 腳本的函數(shù)
function! CompileShell()
let file = shellescape(expand('%:p'))
let command = "silent !sh -n " . file
execute command
if v:shell_error != 0
silent !clear
let command = "!sh -n " . file
execute command
else
redraw!
endif
endfunction
"配置 .sh 結(jié)尾的文件保存的時(shí)候自動調(diào)用 CompileShell 函數(shù)
autocmd BufWritePost *.sh call CompileShell()