scriptencoding utf-8 " ======================================================================== " 依云(lilydjwg) 的 vimrc " 我的博客: https://blog.lilydjwg.me/ " " 整个配置仅适用于本人 " 不过,其中的部分配置很可能非常适合你哦~~ " 不要整个地照搬,只复制对你自己有用的部分! " " 有任何意见和建议,或者其它想说的,可以到我的博客留言。 " " 许可:GPLv3 " ======================================================================== " 其他文件[[[1 try packadd! matchit catch /.*/ runtime macros/matchit.vim endtry runtime vimrc_example.vim "]]] " 我的设置 " 函数[[[1 " 复制缓冲区到新标签页[[[2 function Lilydjwg_copy_to_newtab() let temp = tempname() try let nr = bufnr('%') exec "mkview" temp tabnew exec "buffer" nr exec "source" temp finally call delete(temp) endtry endfunction " 删除所有未显示且无修改的缓冲区以减少内存占用[[[2 function Lilydjwg_cleanbufs() for bufNr in filter(range(1, bufnr('$')), \ 'buflisted(v:val) && !bufloaded(v:val)') execute bufNr . 'bdelete' endfor endfunction " 转成 HTML,只要 pre 标签部分[[[2 " http://bootleq.blogspot.com/2012/12/tohtml-html-document-function-tohtmldoc.html function Lilydjwg_to_html(line1, line2) let save_number = get(g:, 'html_number_lines', -1) let g:html_number_lines = 0 call tohtml#Convert2HTML(a:line1, a:line2) setlocal buftype=nofile bufhidden=hide noswapfile nobuflisted call search("
") normal! dit %delete _ let @" = '' . substitute(@", '\v^\n\s*', '', '') . '' call setline(1, split(@", '\n')) if save_number > -1 let g:html_number_lines = save_number else unlet g:html_number_lines endif endfunction " 获取可读的文件大小[[[2 function Lilydjwg_getfsize(file) let size = getfsize(a:file) if has('python3') try py3 from myutils import filesize return py3eval('filesize('.size.')') catch /.*/ endtry endif return size . 'B' endfunction " 打开 NERDTree,使用当前文件目录或者当前目录[[[2 function Lilydjwg_NERDTreeOpen() if exists("t:NERDTreeBufName") NERDTreeToggle else try NERDTree `=expand('%:h')` catch /E121/ NERDTree `=getcwd()` endtry endif endfunction " Perl-style quoted lists[[[2 function Lilydjwg_qw() let in = input('qw(') return py3eval('LilyQw("'.escape(in, '"\').'")') endfunction " 使用分隔符连接多行 [[[2 function Lilydjwg_join(sep, bang) range if a:sep[0] == '\' let sep = strpart(a:sep, 1) else let sep = a:sep endif let lines = getline(a:firstline, a:lastline) if a:firstline == 1 && a:lastline == line('$') let dellast = 1 else let dellast = 0 endif exe a:firstline . ',' . a:lastline . 'd_' if a:bang != '!' call map(lines, "substitute(v:val, '^\\s\\+\\|\\s\\+$', '', 'g')") endif call append(a:firstline-1, join(lines, sep)) if dellast $d_ endif endfunction " 切换显示行号/相对行号/不显示 [[[2 function Lilydjwg_toggle_number() if &nu && &rnu set nonu nornu elseif &nu && !&rnu set rnu else set nu endif endfunction " 更改缩进[[[2 function Lilydjwg_reindent(...) if a:0 != 2 echoerr "需要两个参数" endif let save_et = &et let save_ts = &ts try let &ts = a:1 set noet retab! let &ts = a:2 set et retab! let &l:sw = a:2 finally let &et = save_et let &ts = save_ts endtry endfunction " 将当前窗口置于屏幕中间(全屏时用)[[[2 function CenterFull() on vs ene setl nocul setl nonu 40winc | winc l vs winc l ene setl nocul setl nonu 40winc | winc h redr! endfunction " 使用 colorpicker 程序获取颜色值(hex/rgba)[[[2 function Lilydjwg_colorpicker() if exists("g:last_color") let color = substitute(system("colorpicker ".shellescape(g:last_color)), '\n', '', '') else let color = substitute(system("colorpicker"), '\n', '', '') endif if v:shell_error == 1 return '' elseif v:shell_error == 2 " g:last_color 值不对 unlet g:last_color return Lilydjwg_colorpicker() else let g:last_color = color return color endif endfunction " 更改光标下的颜色值(hex/rgba/rgb)[[[2 function Lilydjwg_changeColor() let color = Lilydjwg_get_pattern_at_cursor('\v\#[[:xdigit:]]{6}(\D|$)@=|=LookFurther(0) inoremap =LookFurther(1) " 对齐命令[[[2 function Lilydjwg_Align(type) range try let pat = g:Myalign_def[a:type] catch /^Vim\%((\a\+)\)\=:E716/ echohl ErrorMsg echo "对齐方式" . a:type . "没有定义" echohl None return endtry call Align#AlignPush() call Align#AlignCtrl(pat[0]) if len(pat) == 3 call Align#AlignCtrl(pat[2]) endif exe a:firstline.','.a:lastline."call Align#Align(0, '". pat[1] ."')" call Align#AlignPop() endfunction function Lilydjwg_Align_complete(ArgLead, CmdLine, CursorPos) return filter(keys(g:Myalign_def), 'stridx(v:val, a:ArgLead) == 0') endfunction " 退格删除自动缩进 [[[2 function! Lilydjwg_checklist_bs(pat) " 退格可清除自动出来的列表符号 if getline('.') =~ a:pat let ind = indent(line('.')-1) if !ind let ind = indent(line('.')+1) endif call setline(line('.'), repeat(' ', ind)) return "" else return "\ " endif endfunction " 字典补全 与 [[[2 function Lilydjwg_dictcomplete() if pumvisible() return "\ " else return "\ \ " endif endfunction " 返回当前日期的中文表示[[[2 function Lilydjwg_zh_date() let d = strftime("%Y年%m月%d日") let d = substitute(d, '[年月]\@<=0', '', 'g') return d endfunction " 关闭某个窗口[[[2 function Lilydjwg_close(winnr) let winnum = bufwinnr(a:winnr) if winnum == -1 return 0 endif " Goto the workspace window, close it and then come back to the " original window let curbufnr = bufnr('%') exe winnum . 'wincmd w' close " Need to jump back to the original window only if we are not " already in that window let winnum = bufwinnr(curbufnr) if winnr() != winnum exe winnum . 'wincmd w' endif return 1 endfunction " 补全 So 命令[[[2 function Lilydjwg_complete_So(ArgLead, CmdLine, CursorPos) let path = 'so/' . a:ArgLead . '*' let ret = split(globpath(&rtp, path), '\n') call filter(ret, 'v:val =~ "\.vim$"') " XXX 如果文件名特殊则可能不对 call map(ret, 'fnamemodify(v:val, '':t:r'')') return ret endfunction " 取得光标处的匹配[[[2 function Lilydjwg_get_pattern_at_cursor(pat) let col = col('.') - 1 let line = getline('.') let ebeg = -1 let cont = match(line, a:pat, 0) while (ebeg >= 0 || (0 <= cont) && (cont <= col)) let contn = matchend(line, a:pat, cont) if (cont <= col) && (col < contn) let ebeg = match(line, a:pat, cont) let elen = contn - ebeg break else let cont = match(line, a:pat, contn) endif endwhile if ebeg >= 0 return strpart(line, ebeg, elen) else return "" endif endfunction " 切换配色方案[[[2 function Lilydjwg_toggle_color() let colors = ['pink_lily', 'lilypink', 'darkBlue', 'spring2'] " spring2 是增加了彩色终端支持的 spring if !exists("g:colors_name") let g:colors_name = 'pink_lily' endif let i = index(colors, g:colors_name) let i = (i+1) % len(colors) exe 'colorscheme ' . get(colors, i) endfunction " %xx -> 对应的字符(到消息)[[[2 function Lilydjwg_hexchar() let chars = Lilydjwg_get_pattern_at_cursor('\(%[[:xdigit:]]\{2}\)\+') if chars == '' echohl WarningMsg echo '在光标处未发现%表示的十六进制字符串!' echohl None return endif let str = substitute(chars, '%', '\\x', 'g') exe 'echo "'. str . '"' endfunction " 用火狐打开链接[[[2 function Lilydjwg_open_url() let s:url = Lilydjwg_get_pattern_at_cursor('\v%(https?|ftp)://[^]''" \t\r\n>*。,\`)]*') if s:url == "" echohl WarningMsg echomsg '在光标处未发现URL!' echohl None else echo '打开URL:' . s:url if has("win32") || has("win64") " start 不是程序,所以无效。并且,cmd 只能使用双引号 " call system("start '" . s:url . "'") call system("cmd /q /c start \"" . s:url . "\"") elseif has("mac") call system("open '" . s:url . "'") else " call system("gnome-open " . s:url) call system("setsid firefox '" . s:url . "' &") endif endif unlet s:url endfunction " Title Save [[[2 function Lilydjwg_TSave() let line = getline(1) if line =~ '^\s*$' let line = getline(2) endif let line = substitute(line, '[:/\\]', '-', 'g') let line = substitute(line, '^\s\+', '', 'g') let line = substitute(line, '\s\+$', '', 'g') let line = substitute(line, ' ', '\\ ', 'g') let line = substitute(line, '\r', '', 'g') exe 'sav ' . line . '.txt' endfunction " 切换 ve [[[2 function Lilydjwg_toggle_ve() if &ve == 'all' let &ve = '' else let &ve = 'all' endif endfunction " 切换 ambiwidth [[[2 function Lilydjwg_toggle_ambiwidth() if &ambiwidth == 'double' let &ambiwidth = 'single' else let &ambiwidth = 'double' endif endfunction " 是否该调用 cycle?[[[2 function Lilydjwg_trycycle(dir) let pat = Lilydjwg_get_pattern_at_cursor('[+-]\?\d\+') if pat if a:dir ==? 'x' return "\ " else return "\ " end else let mode = mode() =~ 'n' ? 'w' : 'v' let dir = a:dir ==? 'x' ? -1 : 1 return ":\ call Cycle('" . mode . "', " . dir . ", v:count1)\ " end endfunction " set 相关[[[1 " 一般设置[[[2 " nvim needs this to enable ftplugin filetype plugin on filetype indent on " maybe necessary when root syntax on " set guifont=文泉驿等宽正黑\ Medium\ 10 set number set smarttab set expandtab " 不要响铃,更不要闪屏 set visualbell t_vb= " when will this cause problems? set ttyfast " 不要包含标准错误,但是允许 Vim 初始化其默认值 autocmd VimEnter * set shellredir=> autocmd GUIEnter * set t_vb= " ! is for histwin to save tags set viminfo='100,:10000,<50,s10,h,! set history=10000 set wildmenu set delcombine " 组合字符一个个地删除 set laststatus=2 " 总是显示状态栏 " 首先尝试最长的,接着轮换补全项 set wildmode=longest:full,full set ambiwidth=double set shiftround set diffopt+=vertical,context:3,foldcolumn:0 if &diffopt =~ 'internal' set diffopt+=indent-heuristic,algorithm:patience endif set fileencodings=ucs-bom,utf-8,gb18030,cp936,latin1 set fileformats=unix,dos,mac set formatoptions=croqn2mB1 try " Vim 7.4 set formatoptions+=j catch /.*/ endtry set nojoinspaces set virtualedit=block set nostartofline " set guioptions=egmrLtai set guioptions=acit " 没必要,而且很多时候 = 表示赋值 set isfname-== set nolinebreak set nowrapscan set scrolloff=5 set sessionoptions=blank,buffers,curdir,folds,help,options,tabpages,winsize,slash,unix,resize set shiftwidth=2 set winaltkeys=no set noequalalways set listchars=eol:$,tab:>-,nbsp:␣ set display=lastline set completeopt+=longest try set completeopt+=popup set completepopup=border:off catch /.*/ endtry set maxcombine=4 set cedit= set whichwrap=b,s,[,] set tags+=./../tags,./../../tags,./../../../tags try set matchpairs=(:),{:},[:],《:》,〈:〉,[:],(:),「:」,『:』,‘:’,“:” catch /^Vim\%((\a\+)\)\=:E474/ endtry " Avoid command-line redraw on every entered character by turning off Arabic " shaping (which is implemented poorly). if has('arabic') set noarabicshape endif set wildignore+=*~,*.py[co],__pycache__,.*.swp set shortmess-=S if !has("patch-8.1.1270") try packadd! vim-searchindex catch /.*/ endtry endif if exists('&balloonevalterm') set balloonevalterm endif try set signcolumn=number catch /.*/ endtry " Linux 与 Windows 等 [[[2 if has("gui_macvim") set macmeta end if has("win32") || has("win64") " Win 编码 [[[3 " 行禁则补丁要求 encoding 为 'utf-8' " 但是设置 encoding=utf-8 会导致状态栏和编译者信息乱码 " set encoding=utf-8 " set fileencoding=cp936 " language messages zh_CN.UTF-8 " set termencoding=cp936 " set langmenu=chinese_gb.936 " source $VIMRUNTIME/delmenu.vim " source $VIMRUNTIME/menu.vim " Win 路径 [[[3 let g:vimfiles = split(&runtimepath, ',')[1] let g:mytmpdir = $TMP " Win 程序 [[[3 " 用默认的程序打开文件 nmap :!"%" command Hex silent !winhex '%' command SHELL silent cd %:p:h|silent exe "!start cmd"|silent cd - command Nautilus silent !explorer %:p:h " Win 配置 [[[3 command FScreen simalt ~x command Fscreen simalt ~r if has('directx') set renderoptions=type:directx endif else " Linux 路径 [[[3 let g:vimfiles = split(&runtimepath, ',')[0] if exists('$VIMTMP') let g:mytmpdir = $VIMTMP else let g:mytmpdir = expand("~/tmpfs") endif let g:MuttVim_configfile = expand('~/scripts/python/pydata/muttvim.json') cnoremap getcmdtype() == ':' ? '~/tmpfs/' : "\ " " cron 的目录不要备份 set backupskip+=/etc/cron.*/* set backupdir=.,/var/tmp,/tmp " Linux 程序 [[[3 " 用默认的程序打开文件 nmap :!gnome-open "%" set grepprg=grep\ -nH\ $* command Hex silent !setsid ghex2 '%' command SHELL silent cd %:p:h|silent exe '!setsid xfce4-terminal'|silent cd - command Nautilus silent !nautilus %:p:h " Linux 配置 [[[3 command FScreen winpos 0 0|set lines=40|set columns=172 command Fscreen set lines=40|set columns=88 endif " 语言相关 [[[3 if $LANGUAGE =~ '^zh' || ($LANGUAGE == '' && v:lang =~ '^zh') " 缓冲区号 文件名 行数 修改 帮助 只读 编码 换行符 BOM ======== 字符编码 位置 百分比位置 set statusline=%n\ %<%f\ %L行\ %{&modified?'[+]':&modifiable\|\|&ft=~'^\\vhelp\|qf$'?'':'[-]'}%h%r%{&fenc=='utf-8'\|\|&fenc==''?'':'['.&fenc.']'}%{&ff=='unix'?'':'['.&ff.']'}%{&bomb?'[BOM]':''}%{&eol?'':'[noeol]'}%{&diff?'[diff]':''}%=\ 0x%-4.8B\ \ \ \ %-14.(%l,%c%V%)\ %P else set statusline=%n\ %<%f\ %LL\ %{&modified?'[+]':&modifiable\|\|&ft=~'^\\vhelp\|qf$'?'':'[-]'}%h%r%{&fenc=='utf-8'\|\|&fenc==''?'':'['.&fenc.']'}%{&ff=='unix'?'':'['.&ff.']'}%{&bomb?'[BOM]':''}%{&eol?'':'[noeol]'}%{&diff?'[diff]':''}%=\ 0x%-4.8B\ \ \ \ %-14.(%l,%c%V%)\ %P endif " 路径相关 [[[3 let g:VEConf_favorite = g:vimfiles . "/ve_favorite" let g:NERDTreeBookmarksFile = g:vimfiles . "/NERDTreeBookmarks" let g:dictfilePrefix = g:vimfiles . "/dict/" if has("python3") exe "py3file" g:vimfiles . "/vimrc.py" endif let g:undodir = g:mytmpdir . "/.vimundo" let &errorfile= g:mytmpdir . "/.error" " 图形与终端 [[[2 let g:colors_name = 'lilypink' if has("gui_running") set mousemodel=popup " 有些终端不能改变大小 set columns=88 set lines=38 set cursorline elseif has("unix") set ambiwidth=single " 防止退出时终端乱码 " 这里两者都需要。只前者标题会重复,只后者会乱码 set t_fs=(B set t_IE=(B if &term =~ '256color\|nvim' set cursorline else " 在Linux文本终端下非插入模式显示块状光标 if &term == "linux" || &term == "fbterm" set t_ve+=[?6c autocmd InsertEnter * set t_ve-=[?6c autocmd InsertLeave * set t_ve+=[?6c " autocmd VimLeave * set t_ve-=[?6c endif if &term == "fbterm" set cursorline elseif $TERMCAP =~ 'Co#256' set t_Co=256 set cursorline else " 暂时只有这个配色比较适合了 let g:colors_name = 'default' " 在终端下,如果码表存在,则自动加载vimim输入法 if len(split(globpath(&rtp, 'so/vimim.wubi.txt'), '\n')) > 0 autocmd VimEnter * runtime so/vimim.vim endif endif endif elseif has('win32') && exists('$CONEMUBUILD') " enable 256 colors in ConEmu on Win set term=xterm set t_Co=256 let &t_AB="\e[48;5;%dm" let &t_AF="\e[38;5;%dm" set cursorline endif " delay colorschem command for eink.vim if exists('*timer_start') function s:Colorscheme(t) exe "colorscheme" g:colors_name if !has('gui_running') exe "doautoall ColorScheme" g:colors_name endif endfunction " XXX: This will cause a redraw on startup autocmd VimEnter * call timer_start(1, function('s:Colorscheme')) else exe "colorscheme" g:colors_name endif " bracketed paste mode support for tmux if &term =~ '^screen\|^tmux' && exists('&t_BE') let &t_BE = "\033[?2004h" let &t_BD = "\033[?2004l" " t_PS and t_PE are key code options and they are special exec "set t_PS=" . "\033[200~" exec "set t_PE=" . "\033[201~" endif if &term =~ '^screen\|^tmux' " This may leave mouse in use by terminal application " set t_RV=Ptmux;[>c\ set ttymouse=sgr if &t_GP == '' " for getwinpos set t_GP=Ptmux;[13t\ endif endif " 不同的 Vim 版本 [[[2 if has("conceal") " 'i' is for neosnippet set concealcursor=nci " XXX: This will cause a redraw on startup set conceallevel=0 endif if has("persistent_undo") let &undodir=g:undodir if !isdirectory(&undodir) call mkdir(&undodir, 'p', 0700) endif set undofile endif try " Vim 7.4.399+ set cryptmethod=blowfish2 catch /.*/ " Vim 7.3+ try set cryptmethod=blowfish catch /.*/ " Vim 7.2-, neovim endtry endtry unlet g:undodir let g:silent_unsupported = 1 " map 相关[[[1 " nmap [[[2 " Fx 相关 [[[3 " buffer list nmap be nmap :ls :buffer nmap :cnext nmap :cprevious nmap :enew nmap :next nmap :previous " 重新载入当前文件 nmap :e! " t 开头 [[[3 nmap tt :tabnew nmap TT :call Lilydjwg_copy_to_newtab() " format all nmap t= mxHmygg=G`yzt`x " select all nmap ta ggVG nmap tf :call Lilydjwg_open_url() " less style 清除高亮 nmap :nohls " join line without space nmap tj Jx " select line content nnoremap tl ^vg_ nmap to :call append('.', '') j nmap tO :call append(line('.')-1, '') k nmap tp "+P nmap tv :call Lilydjwg_toggle_ve() nmap tw :call Lilydjwg_toggle_ambiwidth() " w 开头 [[[3 nmap wc :set cursorline! nnoremap wf :call Lilydjwg_NERDTreeOpen() nnoremap wn :call Lilydjwg_toggle_number() nnoremap wt :TlistToggle nnoremap wb :TagbarToggle " - 开头 [[[3 nmap -+ :set nomodified nmap -c :call Lilydjwg_toggle_color() nmap -ft :exe 'tabe '.g:vimfiles.'/ftplugin/'.&ft.'.vim' nmap -syn :exe 'tabe '.g:vimfiles.'/syntax/'.&ft.'.vim' nmap -int :exe 'tabe '.g:vimfiles.'/indent/'.&ft.'.vim' " 显示高亮组 [[[4 nnoremap wh :echo "hi<" . synIDattr(synID(line("."),col("."),1),"name") . '> trans<' . synIDattr(synID(line("."),col("."),0),"name") . "> lo<" . synIDattr(synIDtrans(synID(line("."),col("."),1)),"name") . ">" " Alt 组合键 [[[3 nmap :MRU " 打开草稿 nmap ShowScratchBuffer for i in range(1, 8) exec 'nnoremap '. i .'gt' endfor nnoremap :exec "normal!" min([tabpagenr('$'),9])."gt" " lusty-explorer [[[4 nmap :LustyBufferExplorer nmap :LustyBufferGrep nmap :LustyFilesystemExplorerFromHere let g:LustyExplorerSuppressRubyWarning = 1 " 其它开头的 [[[3 nmap :tabnew nmap nmap q nnoremap za nmap ' nmap Y y$ nmap 'm :MarksBrowser nmap :: :! nmap cd :lcd %:p:h :echo expand('%:p:h') nmap gb :setl fenc=gb18030 nmap d :%s/\r//eg `` nmap cac :call Lilydjwg_changeColor() nmap gl :IndentGuidesToggle nnoremap gs :echo Lilydjwg_getfsize(expand('%')) " imap [[[2 inoremap inoremap =Lilydjwg_colorpicker() inoremap inoremap inoremap =Lilydjwg_qw() imap cmap " 日期和时间 [[[3 imap =Lilydjwg_zh_date() imap =strftime("%Y-%m-%d") imap =strftime("%Y-%m-%d %H:%M") " 补全 [[[3 imap imap imap imap =Lilydjwg_dictcomplete() " 补全最长项 inoremap pumvisible()?"\ \ ":"\ " " vmap [[[2 vnoremap # "9y? ='\V'.substitute(escape(@9,'\?'),'\n','\\n','g') vnoremap * "9y/ ='\V'.substitute(escape(@9,'\/'),'\n','\\n','g') vnoremap "+y " 中文引号 [[[3 vmap “ ``>a” vmap ” `>a” ` " cmap [[[2 " 还是这样吧 " FIXME 但这样在 wildmenu 补全时会有点奇怪 cmap cmap cnoremap cnoremap " g[jk] [[[2 nmap gj nmap gk vmap gj vmap gk " 以 % 表示的字符 [[[2 vmap t% :w !ascii2uni -a J -q nmap t% :call Lilydjwg_hexchar() " HTML 转义 [[[2 " I got the idea from unimpaired.vim noremap [x :HTMLEscape noremap ]x :HTMLUnescape nnoremap [x :.HTMLEscape nnoremap ]x :.HTMLUnescape " Ctrl-S 保存文件 [[[2 nmap :update imap :update vmap :update " 快速隐藏当前窗口内容[[[2 nmap :tabnew imap :tabnew vmap :tabnew " mouse mapping[[[2 if v:version < 703 nmap zhzhzh nmap zlzlzl vmap zhzhzh vmap zlzlzl else map map imap imap endif nnoremap "+P inoremap + " 上下移动一行文字[[[2 nmap mz:m+ `z nmap mz:m-2 `z vmap :m'>+ ` mzgv`yo`z vmap :m'<-2 `>my` u", 'nt') endif autocmd BufReadCmd *.maff,*.xmind,*.crx,*.apk,*.whl,*.egg call zip#Browse(expand(" ")) " 见 ft-syntax-omni if has("autocmd") && exists("+omnifunc") autocmd Filetype * \ if &omnifunc == "" && !get(b:, 'disable_omnifunc') | \ setlocal omnifunc=syntaxcomplete#Complete | \ endif endif " 自定义命令[[[1 " 对齐 xxx: xxx (两栏) " .vimrc 有可能是软链接 exe 'command Set tabe ' . escape(resolve($MYVIMRC), ' ') " 删除当前文件 command Delete if delete(expand('%')) | echohl WarningMsg | echo "删除当前文件失败" | echohl None | endif command -nargs=1 -range=% -bang Join ,