vim 配置 比较全转自GitHub

转自https://github.com/erasin/notes/blob/master/linux/vim/vimrc.md

" GLOBAL 环境配置
" ------------------------------------------------------------------

" 中文帮助
set helplang=cn

" 保留历史 
set history=500

" 行控制
set linebreak               " 英文单词在换行时不被截断
set nocompatible            " 设置不兼容VI
"set textwidth=80           " 设置每行80个字符自动换行,加上换行符
set wrap                    " 设置自动折行
"set nowrap                 " 设置不自动换行

" 标签页
set tabpagemax=15           " 最多15个标签
"set showtabline=2          " 总是显示标签栏

" 关闭错误时的声音提示
set noerrorbells
set novisualbell
set t_vb=                   " close visual bell

" 行号与标尺
set ruler                   " 右下角显示光标位置的状态行
set number                  " 显示行号
set cursorline              " 突出显示当前行
"set rulerformat=%15(%c%V\ %p%%%)

" 制表符(设置所有的tab和缩进为4个空格)
set tabstop=4               " 设置tab键的宽度
set shiftwidth=4            " 换行时行间交错使用4个空格
"set cindent shiftwidth=4   " 自动缩进4空格
set softtabstop=4
set expandtab               " 使用空格来替换tab
set smarttab                " 开启新行时使用智能 tab 缩进

set list                     " 显示Tab符,
set listchars=tab:\|\ ,      " 使用一高亮竖线代替 把符号显示为 |
"set listchars=tab:>-,trail:-
"set listchars=tab:\|\ ,nbsp:%,trail:-

highlight LeaderTab guifg=#666666   " 设定行首tab为灰色
match LeaderTab /\t/        " 匹配行首tab

" 缩进
set autoindent              " 设置自动缩进
set smartindent             " 设置智能缩进

" 搜索
set hlsearch                " 开启高亮显示结果
set incsearch               " 开启实时搜索功能
"set noincsearch             " 关闭显示查找匹配过程
"set magic     " Set magic on, for regular expressions
"set showmatch " Show matching bracets when text indicator is over them
"set mat=2     " How many tenths of a second to blink
set ignorecase              " 搜索时无视大小写
set nowrapscan              " 搜索到文件两端时不重新搜索

" 状态栏显示目前所执行的指令
set showcmd

" 自动重新读入
set autoread                " 当文件在外部被修改,自动更新该文件


" 备份与缓存
set nobackup
set nowb
"set noswapfile
set writebackup             " 设置无备份文件

" 自动完成
set complete=.,w,b,k,t,i
set completeopt=longest,menu    " 只在下拉菜单中显示匹配项目,并且会自动插入所有匹配项目的相同文本


set showmatch               " 显示括号配对情况
set iskeyword+=_,$,@,%,#,-  " 带有如下符号的单词不要被换行分割
"set wildmenu "打开 wildmenu 选项,启动具有菜单项提示的命令行自动完成。
"set matchpairs=(:),{:},[:],<:>
"set whichwrap=b,s,<,>,[,]

set backspace=2             " 设置退格键可用
set mouse=a                 " 鼠标可用
set ve=block                "光标可以定位在没有实际字符的地方
"set fullscreen             " 启动后自动全屏

set nocompatible            " 关闭兼容模式
set hidden                  " 允许在有未保存的修改时切换缓冲区
set relativenumber          " 行标跟随
set clipboard+=unnamed      " 共享外部剪贴板
set autochdir               " 设定文件浏览器目录为当前目录

colorscheme default         " 配色方案

filetype indent on          " 针对不同的文件类型采用不同的缩进格式
filetype plugin on          " 针对不同的文件类型加载对应的插件
filetype plugin indent on
filetype on                 " for taglist

" 默认为 UTF-8 编码
" --------------------------------------------------------------- 
if has("multi_byte")
    set encoding=utf-8
    " English messages only
    "language messages zh_CN.utf-8

    if has('win32')
        language english
        let &termencoding=&encoding " 处理consle输出乱码
    endif

    set fencs=utf-8,gbk,chinese,latin1
    set formatoptions+=mM
    set nobomb " 不使用 Unicode 签名

    if v:lang =~? '^\(zh\)\|\(ja\)\|\(ko\)'
        set ambiwidth=double
    endif
else
    echoerr "Sorry, this version of (g)vim was not compiled with +multi_byte"
endif

" 编码设置
" -------------------------------------------------------------
"set fileencoding=utf-8
set encoding=utf-8 "缓冲编码
set fileencodings=utf-8,cp936,gb18030,big5,gbk,euc-jp,latin1
set fileencoding=utf-8
set termencoding=utf-8 "编码转换
"set fileformats=unix

" 命令行与状态行
" -----------------------------------------------------------------------
set laststatus=2                          " 开启状态栏信息
set cmdheight=1                           " 命令行的高度,默认为1,这里设为2
" 状态行显示的内容 [包括系统平台、文件类型、坐标、所占比例、时间等]
set statusline=%{fugitive#statusline()}\ %F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %y%r%m%*%=\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}

" line color
" now set it up to change the status line based on mode
if version >= 700
  au InsertEnter * hi StatusLine term=reverse ctermbg=5 gui=undercurl guisp=Magenta
  au InsertLeave * hi StatusLine term=reverse ctermfg=0 ctermbg=2 gui=bold,reverse
endif

function! InsertStatuslineColor(mode)
  if a:mode == 'i'
    hi statusline guibg=magenta
  elseif a:mode == 'r'
    hi statusline guibg=blue
  else
    hi statusline guibg=red
  endif
endfunction

au InsertEnter * call InsertStatuslineColor(v:insertmode)
au InsertChange * call InsertStatuslineColor(v:insertmode)
au InsertLeave * hi statusline guibg=green

" GUI MODEL 图形界面
" ---------------------------------------------
if has("gui_running")
    colorscheme neon 
    "set guifont=Monospace\ 11
    "set gfw=Zhenyuan:h12:cGB2312
    "au GUIEnter * simalt ~x " 窗口启动时自动最大化
    set guioptions-=m        " 隐藏菜单栏
    set guioptions-=T        " 隐藏工具栏
    set guioptions-=L        " 隐藏左侧滚动条
    set guioptions-=r        " 隐藏右侧滚动条
    "set guioptions-=b       " 隐藏底部滚动条
    "set showtabline=0       " 隐藏Tab栏
    "colorscheme tango2 
    set lines=42
    set columns=136
    "set guifontset=-dt-interface
    set encoding=utf-8
    "language messages zh_CN.UTF-8  "解决consle输出乱码 
    set fdm=indent           "按照缩进进行折叠 manual

    "Toggle Menu and Toolbar 使用F2隐藏/显示菜单
    map <silent> <F2> :if &guioptions =~# 'T' <Bar>
            \set guioptions-=T <Bar>
            \set guioptions-=m <bar>
        \else <Bar>
            \set guioptions+=T <Bar>
            \set guioptions+=m <Bar>
        \endif<CR>

    if has("win32")
        " Windows 兼容配置
        source $VIMRUNTIME/mswin.vim

        " F11 最大化
        map <f11> :call libcallnr('fullscreen.dll', 'ToggleFullScreen', 0)<cr>

        " 字体配置
        "exec 'set guifont='.iconv('Courier_New', &enc, 'gbk').':h10:cANSI'
        "exec 'set guifontwide='.iconv('微软雅黑', &enc, 'gbk').':h10'
        set guifont=YaHei_Consolas_Hybrid:h12:cANSI
        set guifontwide=YaHei_Consolas_Hybrid:h12
    endif

    if has("unix") && !has('gui_macvim')
        set guifont=Ubuntu\ Mono\ 11
    endif

endif

" Floding 折叠
" ------------------------------------------------
"set foldmethod=syntax " 选择代码折叠类型
"set foldlevel=100 " 禁止自动折叠
"
set foldenable " Enables folding.
" 折叠方法  
" manual    手工折叠  
" indent    使用缩进表示折叠  
" expr      使用表达式定义折叠  
" syntax    使用语法定义折叠  
" diff      对没有更改的文本进行折叠  
" marker    使用标记进行折叠, 默认标记是 {{{ 和 }}} 
set foldmethod=manual " Set fold method to 'manual'.
""set fdc=0 " Show where folds start and end, when they are opened.
"nnoremap @=((foldclosed(line('.')) < 0 )? 'zc':'zo')

:set foldtext=MyFoldText()
:function MyFoldText()
:  let line = getline(v:foldstart)
:  let sub = substitute(line, '/\*\|\*/\|{{{\d\=', '', 'g')
:  return v:folddashes . sub
:endfunction

" 语法高亮 
" ----------------------------------------------
syntax enable               " 打开语法高亮
syntax on                   " 开启文件类型侦测
au BufRead,BufNewFile *.txt setlocal ft=txt
au BufRead,BufNewFile *.tpl setlocal ft=smarty 		" 支持 Smarty
au BufRead,BufNewFile *.as setlocal ft=actionscript	" 支持 ActionScript
"au BufRead,BufNewFile *.js set ft=javascript syntax=jquery
au BufRead,BufNewFile jquery.*.js set ft=javascript syntax=jquery
"autocmd BufRead *.as set filetype=actionscript
"autocmd BufRead *.js set filetype=javascript
autocmd BufRead,BufNewFile *.txtfmt set filetype=txtfmt
"autocmd BufRead,BufNewFile *.txt set filetype=txtfmt
autocmd BufRead,BufNewFile *.mxml set filetype=mxml
autocmd BufRead,BufNewFile *.bash set filetype=bash
autocmd BufRead,BufNewFile *.php set filetype=php
autocmd BufRead,BufNewFile *.c set filetype=c

au BufNewFile,BufRead,BufEnter,WinEnter,FileType *.m,*.h setf objc  " 增加 Objective-C 语法支持
" fencview 自动编码识别     :FencView   查看文件编码和更改文件编码
let g:fencview_autodetect=1

" dict
autocmd FileType javascript set dictionary=~/.vim/dict/javascript.dict

" 每行超过80个的字符用下划线标示
au BufRead,BufNewFile *.asm,*.c,*.cpp,*.java,*.cs,*.sh,*.lua,*.pl,*.pm,*.py,*.rb,*.hs,*.vim 2match Underlined /.\%81v/

" 将指定文件的换行符转换成 UNIX 格式
au FileType php,javascript,html,css,python,vim,vimwiki set ff=unix

" 关闭VIM的时候保存会话,按F122读取会话
set sessionoptions=buffers,sesdir,help,tabpages,winsize
au VimLeave * mks! ~/Session.vim
nmap <F7> :so ~/Session.vim<CR>

" 自动刷新firefox
autocmd BufWriteCmd *.html,*.js,*.css,*.gtpl :call Refresh_firefox()
function! Refresh_firefox()
    if &modified
        write
        silent !echo ‘vimYo = content.window.pageYOffset;
                    \ vimXo = content.window.pageXOffset;
                    \ BrowserReload();
                    \ content.window.scrollTo(vimXo,vimYo);
                    \ repl.quit();’ |
                    \ nc localhost 4242 2>&1 > /dev/null
    endif
endfunction

" 自动载入VIM配置文件
autocmd! bufwritepost vimrc source $MYVIMRC

" 自动匹配括号
" -----------------------------------
:inoremap ( ()<ESC>i
:inoremap ) <c-r>=ClosePair(')')<CR>
:inoremap { {}<ESC>i
:inoremap } <c-r>=ClosePair('}')<CR>
:inoremap [ []<ESC>i
:inoremap ] <c-r>=ClosePair(']')<CR>
":inoremap < <><ESC>i
":inoremap > <c-r>=ClosePair('>')<CR>
:inoremap " ""<ESC>i
:inoremap ' ''<ESC>i
:inoremap ` ``<ESC>i

function ClosePair(char)
    if getline('.')[col('.') - 1] == a:char
        return "\<Right>"
    else
        return a:char
    endif
endf

" 快捷键
" --------------------------------------

"设置','为leader快捷键
let mapleader = ","
let g:mapleader = ","

" Ctrl + S 保存文件
map <C-s> <ESC>:w<CR>
imap <C-s> <ESC>:w<CR>a
vmap <C-s> <ESC>:w<CR>

" Ctrl + C 选中状态下复制
vnoremap <C-c> "+y

" Ctrl + V 粘贴剪切板中的内容
map <C-v> "+p
imap <C-v> <esc>"+pa
vmap <C-v> d"+P

"设置快速保存和退出
"快速保存为,s
"快速退出(保存)为,w
"快速退出(不保存)为,q
nmap <leader>s :w!<cr>
nmap <leader>w :wq!<cr>
nmap <leader>q :q!<cr>

nmap <C-t>   :tabnew<cr>
nmap <C-p>   :tabprevious<cr>
nmap <C-n>   :tabnext<cr>
nmap <C-k>   :tabclose<cr>
nmap <C-Tab> :tabnext<cr>

"切换buffer
nmap bn :bn<cr>
nmap bp :bp<cr>

" 插入模式按 F4 插入当前时间
imap <f4> <C-r>=GetDateStamp()<cr>

" 返回当前时期
func! GetDateStamp()
    return strftime('%Y-%m-%d')
endfunction

" 选中一段文字并全文搜索这段文字
vnoremap  *  y/<C-h>=escape(@", '\\/.*$^~[]')<CR><CR>
vnoremap  #  y?<C-h>=escape(@", '\\/.*$^~[]')<CR><CR>

"----------------------------------------------------------------------------
" Plugin TagList
" ---------------------------------------------------------------------------
" TagList 键入:Tlist开启
" if MySys() == "windows"                "设定windows系统中ctags程序的位置
" 	let Tlist_Ctags_Cmd = 'ctags'
" elseif MySys() == "linux"              "设定windows系统中ctags程序的位置
    let Tlist_Ctags_Cmd = '/usr/bin/ctags'
" endif
map t :TlistToggle<cr>
let Tlist_Show_One_File = 1            "不同时显示多个文件的tag,只显示当前文件的
let Tlist_Compact_Format = 1 		   " 使用小窗口.
let Tlist_Exit_OnlyWindow = 1          "如果taglist窗口是最后一个窗口,则退出vim
let Tlist_Enable_Fold_Column = 0 	   " 使taglist插件不显示左边的折叠行
let Tlist_Use_Right_Window = 1         "在右侧窗口中显示taglist窗口
"let Tlist_Use_Left_Window = 1          " Split to the left side of the screen.
let Tlist_GainFocus_On_ToggleOpen = 1
let Tlist_Inc_Winwidth = 0 			   " 防止taglist改变终端窗口的大小
let Tlist_WinWidth = 25 			   " taglist窗口宽度
let Tlist_Sort_Type = 'name'           " 排序 name.

" ---------------------------------------------------------------------------
" Plugin NERDTree
" ----------------------------------------------------------------------------
" plugin - NERD_tree.vim 以树状方式浏览系统中的文件和目录
" :NERDtree 打开NERD_tree         :NERDtreeClose    关闭NERD_tree
" o 打开关闭文件或者目录         t 在标签页中打开
" T 在后台标签页中打开           ! 执行此文件
" p 到上层目录                   P 到根目录
" K 到第一个节点                 J 到最后一个节点
" u 打开上层目录                 m 显示文件系统菜单(添加、删除、移动操作)
" r 递归刷新当前目录             R 递归刷新当前根目录
"-----------------------------------------------------------------
let loaded_netrwPlugin = 0 					" 不启动netrw
let NERDTreeCaseSensitiveSort=1 			" 让文件排列更有序
let NERDTreeHijackNetrw = 0 				" 输入:e filename不再显示netrw,而是显示nerdtree
let NERDTreeChDirMode = 2 					" 改变tree目录的同时不改变工程的目录
let NERDTreeWinPos = 'left' 				" NERDTree显示位置在窗口右侧
let NERDTreeWinSize = 25 					" NERDTREE的大小
let NERDTreeIgnore = [ '^\.svn$', '\~$' ] 	" 忽略.svn的显示
" F3 NERDTree 切换
map <F3> :NERDTreeToggle<CR>
imap <F3> <ESC>:NERDTreeToggle<CR>

"-----------------------------------------------------------------
" plugin - NERD_commenter.vim 注释代码用的
" 将 mapleader 设置为 `,`
" [count],cc 光标以下count行逐行添加注释(7,cc)
" [count],cu 光标以下count行逐行取消注释(7,cu)
" [count],cm 光标以下count行尝试添加块注释(7,cm)
" ,cA 在行尾插入 /* */,并且进入插入模式。 这个命令方便写注释
" ,c<space> toggle 注释
" 注:count参数可选,无则默认为选中行或当前行
"-----------------------------------------------------------------
let NERDSpaceDelims=1       " 让注释符与语句之间留一个空格
let NERDCompactSexyComs=1   " 多行注释时样子更好看

" Plugin MiniBufExplorer 多个文件切换 可使用鼠标双击相应文件名进行切换
""let g:miniBufExplMapWindowNavVim = 1
""let g:miniBufExplMapWindowNavArrows = 1
""let g:miniBufExplMapCTabSwitchBufs = 1
""let g:miniBufExplModSelTarget = 1

" --------------------------------------------------------------------
" plugin Load_Template 根据文件后缀自动加载模板,使用:LoadTemplate呼出
" --------------------------------------------------------------------
" let g:template_path = '~/.vim/templates'

" ---------------------------------------------------------------------
" plugin indent guides 对齐线
" ---------------------------------------------------------------------
" <Leader>ig     toggle
let g:indent_guides_guide_size=1    "设置宽度

" ---------------------------------------------------------------------
" 处理文件
" ---------------------------------------------------------------------
" **** PHP **** {{{
" 不显示PHP变量再Taglist中
let tlist_php_settings = 'php;c:class;d:constant;f:function'
" 高亮显示sql语句
let php_sql_query = 1 
" }}}

" **** Python *** {{{
" For lines that end with \n\ or \ and continue on the next one.
"let g:pyindent_continue = '&sw - &sw'
let g:pyindent_continue = 0
autocmd Filetype python set completefunc=pythoncomplete#Complete
" }}}


" 一键保存和编译 
" -----------------------------------------
" Ctrl + G 一键保存、编译
" Ctrl + R 一键保存、运行
"
" 编译C源文件
func! CompileGcc()
    exec "w"
    let compilecmd="!gcc -Wall -std=c99 "
    let compileflag="-o %<"
    exec compilecmd." % ".compileflag
endfunc

" 编译C++源文件
func! CompileCpp()
    exec "w"
    let compilecmd="!g++ -Wall "
    let compileflag="-o %<"
    exec compilecmd." % ".compileflag
endfunc

" 编译Haskell源文件
func! CompileHaskell()
    exec "w"
    let compilecmd="!ghc --make "
    let compileflag="-o %<"
    exec compilecmd." % ".compileflag
endfunc

" 编译Java源文件
func! CompileJava()
    exec "w"
    exec "!javac %"
endfunc

" 编译C#源文件
func! CompileCs()
    exec "w"
    exec "!csc %"
endfunc

" 编译Gas源文件
func! CompileGas()
    exec "w"
    exec "!gcc -Wall -ggdb -o %< %"
endfunc

" 运行Shell源文件
func! RunShell()
    exec "w"
    exec "!sh %"
endfunc

" 运行Lua源文件
func! RunLua()
    exec "w"
    exec "!lua %"
endfunc

" 运行Perl源文件
func! RunPerl()
    exec "w"
    exec "!perl %"
endfunc

" 运行Python源文件
func! RunPython()
    exec "w"
    exec "!python %"
endfunc

" 运行Ruby源文件
func! RunRuby()
    exec "w"
    exec "!ruby %"
endfunc

" 检测PHP程序语法
func! RunPHP()
    exec "w"
    exec "!php -l %"
endfunc

" vala
func! CompileVala()
    exec "w"
    exec "!valac --pkg gtk+-3.0 %"
    exec "!./%<"
endfunc

" 根据文件类型自动选择相应的编译函数
func! CompileCode()
    exec "w"
    if &filetype == "c"
        exec "call CompileGcc()"
    elseif &filetype == "cpp"
        exec "call CompileCpp()"
    elseif &filetype == "haskell"
        exec "call CompileHaskell()"
    elseif &filetype == "java"
        exec "call CompileJava()"
    elseif &filetype == "cs"
        exec "call CompileCs()"
    elseif &filetype == "asm"
        exec "call CompileGas()"
    elseif &filetype == "sh"
        exec "call RunShell()"
    elseif &filetype == "lua"
        exec "call RunLua()"
    elseif &filetype == "perl"
        exec "call RunPerl()"
    elseif &filetype == "python"
        exec "call RunPython()"
    elseif &filetype == "ruby"
        exec "call RunRuby()"
    elseif &filetype == "php"
        exec "call RunPHP()"
    elseif &filetype == "vala"
        exec "call CompileVala()"
    endif
endfunc

" 运行可执行文件
func! RunResult()
    exec "w"
    if &filetype == "c"
        exec "! %<"
    elseif &filetype == "cpp"
        exec "! %<"
    elseif &filetype == "haskell"
        exec "! %<"
    elseif &filetype == "java"
        exec "!java %<"
    elseif &filetype == "cs"
        exec "! %<"
    elseif &filetype == "asm"
        exec "! %<"
    elseif &filetype == "sh"
        exec "!sh %<.sh"
    elseif &filetype == "lua"
        exec "!lua %<.lua"
    elseif &filetype == "perl"
        exec "!perl %<.pl"
    elseif &filetype == "python"
        exec "!python %<.py"
    elseif &filetype == "ruby"
        exec "!ruby %<.rb"
    endif
endfunc


" Ctrl + G 一键保存、编译
" Ctrl + R 一键保存、运行
map <C-g> :call CompileCode()<CR>
imap <C-g> <ESC>:call CompileCode()<CR>
vmap <C-g> <ESC>:call CompileCode()<CR>

map <C-r> :call RunResult()<CR>
imap <C-r> <ESC>:call RunResult()<CR>
vmap <C-r> <ESC>:call RunResult()<CR>

" 对齐线高亮显示 
" 利用自带的 cc 即 colorcolum
" -----------------------------------------------------
" 使用  ,ch 来toggle对齐线
map ,ch :call SetColorColumn()<CR>
function! SetColorColumn()
    let col_num = virtcol(".")
    let cc_list = split(&cc, ',')
    if count(cc_list, string(col_num)) <= 0
        execute "set cc+=".col_num
    else
        execute "set cc-=".col_num
    endif
endfunction

猜你喜欢

转载自blog.csdn.net/cy413026/article/details/84326936