"========================================== " Author: zthxxx " BlogPost: https://blog.zthxxx.me " ReadMe: README.md " Sections: " -> Initial Plugin 加载插件 " -> General Settings 基础设置 " -> Display Settings 展示/排版等界面格式设置 " -> FileEncode Settings 文件编码设置 " -> Others 其它配置 " -> HotKey Settings 自定义快捷键 " -> FileType Settings 针对文件类型的设置 " -> Theme Settings 主题设置 " " -> 插件配置和具体设置在 vimrc.bundles 中 "========================================== "========================================== " Initial Plugin 加载插件 "========================================== " install bundles if filereadable(expand("~/.vimrc.bundles")) source ~/.vimrc.bundles elseif filereadable(expand("~/.config/nvim/vimrc.bundles")) " neovim source ~/.config/nvim/vimrc.bundles endif " ensure ftdetect et al work by including this after the bundle stuff filetype plugin indent on " NOTE: 以下配置有详细说明,一些特性不喜欢可以直接注解掉 "========================================== " General Settings 基础设置 "========================================== " 修改leader键 let mapleader = ' ' let g:mapleader = ' ' " 映射 ESC inoremap [ " 开启语法高亮 syntax on " history存储容量 set history=2000 " 检测文件类型 filetype on " 针对不同的文件类型采用不同的缩进格式 filetype indent on " 允许插件 filetype plugin on " 启动自动补全 filetype plugin indent on " 文件修改之后自动载入 set autoread " 启动的时候不显示那个援助乌干达儿童的提示 set shortmess=atI " 备份,到另一个位置. 防止误删, 目前是取消备份 "set backup "set backupext=.bak "set backupdir=/tmp/vimbk/ " 取消备份。 视情况自己改 set nobackup " 关闭交换文件 set noswapfile " TODO: remove this, use gundo " create undo file " if has('persistent_undo') " " How many undos " set undolevels=1000 " " number of lines to save for undo " set undoreload=10000 " " So is persistent undo ... " "set undofile " set noundofile " " set undodir=/tmp/vimundo/ " endif set wildignore=*.swp,*.bak,*.pyc,*.class,.svn " 突出显示当前列 " set cursorcolumn " 突出显示当前行 set cursorline " 设置 退出vim后,内容显示在终端屏幕, 可以用于查看和复制, 不需要可以去掉 " 好处:误删什么的,如果以前屏幕打开,可以找回 set t_ti= t_te= " 键盘党.... set mouse-=a " 启用鼠标 " set mouse=a " Hide the mouse cursor while typing " set mousehide " 修复ctrl+m 多光标操作选择的bug,但是改变了ctrl+v进行字符选中时将包含光标下的字符 set selection=inclusive set selectmode=mouse,key " change the terminal's title set title " 去掉输入错误的提示声音 set novisualbell set noerrorbells set t_vb= set tm=500 " Remember info about open buffers on close set viminfo^=% " For regular expressions turn magic on set magic " Configure backspace so it acts as it should act set backspace=eol,start,indent set whichwrap+=<,>,h,l "========================================== " Display Settings 展示/排版等界面格式设置 "========================================== " 显示当前的行号列号 set ruler " 在状态栏显示正在输入的命令 set showcmd " 左下角显示当前vim模式 set showmode " 在上下移动光标时,光标的上方或下方至少会保留显示的行数 set scrolloff=7 " set winwidth=0 " 命令行(在状态行下)的高度,默认为1,这里是2 set statusline=%<%f\ %h%m%r%=%k[%{(&fenc==\"\")?&enc:&fenc}%{(&bomb?\",BOM\":\"\")}]\ %-14.(%l,%c%V%)\ %P " Always show the status line - use 2 lines for the status bar set laststatus=2 " 显示行号 set number " 取消换行 set nowrap " 括号配对情况, 跳转并高亮一下匹配的括号 set showmatch " How many tenths of a second to blink when matching brackets set matchtime=2 " 设置文内智能搜索提示 " 高亮search命中的文本 set hlsearch " 打开增量搜索模式,随着键入即时搜索 set incsearch " 搜索时忽略大小写 set ignorecase " 有一个或以上大写字母时仍大小写敏感 set smartcase " 代码折叠 set foldenable " 折叠方法 " manual 手工折叠 " indent 使用缩进表示折叠 " expr 使用表达式定义折叠 " syntax 使用语法定义折叠 " diff 对没有更改的文本进行折叠 " marker 使用标记进行折叠, 默认标记是 {{{ 和 }}} set foldmethod=indent set foldlevel=99 " 代码折叠自定义快捷键 zz let g:FoldMethod = 0 map zz :call ToggleFold() fun! ToggleFold() if g:FoldMethod == 0 exe "normal! zM" let g:FoldMethod = 1 else exe "normal! zR" let g:FoldMethod = 0 endif endfun " 缩进配置 " Smart indent set smartindent " 打开自动缩进 " never add copyindent, case error " copy the previous indentation on autoindenting set autoindent " tab相关变更 " 设置Tab键的宽度 [等同的空格个数] set tabstop=4 " 每一次缩进对应的空格数 set shiftwidth=4 " 按退格键时可以一次删掉 4 个空格 set softtabstop=4 " insert tabs on the start of a line according to shiftwidth, not tabstop 按退格键时可以一次删掉 4 个空格 set smarttab " 将Tab自动转化成空格[需要输入真正的Tab键时,使用 Ctrl+V + Tab] set expandtab " 缩进时,取整 use multiple of shiftwidth when indenting with '<' and '>' set shiftround " A buffer becomes hidden when it is abandoned set hidden set wildmode=list:longest set ttyfast " 00x增减数字时使用十进制 set nrformats= " 相对行号: 行号变成相对,可以用 nj/nk 进行跳转 set relativenumber number au FocusLost * :set norelativenumber number au FocusGained * :set relativenumber " 插入模式下用绝对行号, 普通模式下用相对 autocmd InsertEnter * :set norelativenumber number autocmd InsertLeave * :set relativenumber function! NumberToggle() if(&relativenumber == 1) set norelativenumber number else set relativenumber endif endfunc nnoremap :call NumberToggle() " 防止tmux下vim的背景色显示异常 " Refer: http://sunaku.github.io/vim-256color-bce.html if &term =~ '256color' " disable Background Color Erase (BCE) so that color schemes " render properly when inside 256-color tmux and GNU screen. " see also http://snk.tuxfamily.org/log/vim-256color-bce.html set t_ut= endif "========================================== " FileEncode Settings 文件编码,格式 "========================================== " 设置新文件的编码为 UTF-8 set encoding=utf-8 " 自动判断编码时,依次尝试以下编码: set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1 set helplang=cn "set langmenu=zh_CN.UTF-8 "set enc=2byte-gb18030 " 下面这句只影响普通模式 (非图形界面) 下的 Vim set termencoding=utf-8 " Use Unix as the standard file type set ffs=unix,dos,mac " 如遇Unicode值大于255的文本,不必等到空格再折行 set formatoptions+=m " 合并两行中文时,不在中间加空格 set formatoptions+=B "========================================== " others 其它设置 "========================================== " vimrc文件修改之后自动加载, windows autocmd! bufwritepost _vimrc source % " vimrc文件修改之后自动加载, linux autocmd! bufwritepost .vimrc source % " 自动补全配置 " 让Vim的补全菜单行为与一般IDE一致(参考VimTip1228) set completeopt=longest,menu " 增强模式中的命令行自动完成操作 set wildmenu " Ignore compiled files set wildignore=*.o,*~,*.pyc,*.class " 离开插入模式后自动关闭预览窗口 autocmd InsertLeave * if pumvisible() == 0|pclose|endif " 回车即选中当前项 inoremap pumvisible() ? "\" : "\" " In the quickfix window, is used to jump to the error under the " cursor, so undefine the mapping there. autocmd BufReadPost quickfix nnoremap " quickfix window s/v to open in split window, ,gd/,jd => quickfix window => open it autocmd BufReadPost quickfix nnoremap v L autocmd BufReadPost quickfix nnoremap s K " command-line window autocmd CmdwinEnter * nnoremap " 上下左右键的行为 会显示其他信息 inoremap pumvisible() ? "\" : "\" inoremap pumvisible() ? "\" : "\" inoremap pumvisible() ? "\\\" : "\" inoremap pumvisible() ? "\\\" : "\" " 打开自动定位到最后编辑的位置, 需要确认 .viminfo 当前用户可写 if has("autocmd") au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif endif "========================================== " HotKey Settings 自定义快捷键设置 "========================================== " 主要按键重定义 " 关闭方向键, 强迫自己用 hjkl map map map map "Treat long lines as break lines (useful when moving around in them) "se swap之后,同物理行上线直接跳 nnoremap k gk nnoremap gk k nnoremap j gj nnoremap gj j " F1 - F6 设置 " F1 废弃这个键,防止调出系统帮助 " I can type :help on my own, thanks. Protect your fat fingers from the evils of noremap " " F2 行号开关,用于鼠标复制代码用 " 为方便复制,用开启/关闭行号显示: function! HideNumber() if(&relativenumber == &number) set relativenumber! number! elseif(&number) set number! else set relativenumber! endif set number? endfunc nnoremap :call HideNumber() " F3 显示可打印字符开关 nnoremap :set list! list? " F4 换行开关 nnoremap :set wrap! wrap? " F6 语法开关,关闭语法可以加快大文件的展示 nnoremap :exec exists('syntax_on') ? 'syn off' : 'syn on' set pastetoggle= " when in insert mode, press to go to " paste mode, where you can paste mass data " that won't be autoindented " disbale paste mode when leaving insert mode au InsertLeave * set nopaste " F5 set paste问题已解决, 粘贴代码前不需要按F5了 " F5 粘贴模式paste_mode开关,用于有格式的代码粘贴 " Automatically set paste mode in Vim when pasting in insert mode function! XTermPasteBegin() set pastetoggle=[201~ set paste return "" endfunction inoremap [200~ XTermPasteBegin() " 分屏窗口移动, Smart way to move between windows map j map k map h map l " http://stackoverflow.com/questions/13194428/is-better-way-to-zoom-windows-in-vim-than-zoomwin " Zoom / Restore window. function! s:ZoomToggle() abort if exists('t:zoomed') && t:zoomed execute t:zoom_winrestcmd let t:zoomed = 0 else let t:zoom_winrestcmd = winrestcmd() resize vertical resize let t:zoomed = 1 endif endfunction command! ZoomToggle call s:ZoomToggle() nnoremap z :ZoomToggle " Go to home and end using capitalized directions noremap H ^ noremap L $ " Map ; to : and save a million keystrokes 用于快速进入命令行 " nnoremap ; : " 命令行模式增强,ctrl - a到行首, -e 到行尾 cnoremap cnoremap cnoremap cnoremap " 搜索相关 " 进入搜索Use sane regexes" nnoremap / /\v vnoremap / /\v " Keep search pattern at the center of the screen. nnoremap n nzz nnoremap N Nzz nnoremap * *zz nnoremap # #zz nnoremap g* g*zz " 去掉搜索高亮 noremap / :nohls " switch # * " nnoremap # * " nnoremap * # " for # indent, python文件中输入新行时#号注释不切回行首 autocmd BufNewFile,BufRead *.py inoremap # X# " tab/buffer相关 " 切换前后buffer nnoremap [b :bprevious nnoremap ]b :bnext " 使用方向键切换buffer noremap :bp noremap :bn " tab 操作 " http://vim.wikia.com/wiki/Alternative_tab_navigation " http://stackoverflow.com/questions/2005214/switching-to-a-particular-tab-in-vim " tab切换 " 上一个tab map th :tabprev " 下一个tab map tl :tabnext " 切第1个tab map tk :tabfirst " 切最后一个tab map tj :tablast " 前一个tab(previous) map tp :tabprev " 后一个tab(next) map tn :tabnext " tabedit map te :tabedit " 关闭tab map tc :tabclose " tabm map tm :tabm " normal模式下切换到确切的tab noremap 1 1gt noremap 2 2gt noremap 3 3gt noremap 4 4gt noremap 5 5gt noremap 6 6gt noremap 7 7gt noremap 8 8gt noremap 9 9gt noremap 0 :tablast " Toggles between the active and last active tab " " The first tab is always 1 " let g:last_active_tab = 1 " nnoremap gt :execute 'tabnext ' . g:last_active_tab " nnoremap :execute 'tabnext ' . g:last_active_tab " vnoremap :execute 'tabnext ' . g:last_active_tab " nnoremap tt :execute 'tabnext ' . g:last_active_tab autocmd TabLeave * let g:last_active_tab = tabpagenr() " 新建tab Ctrl+t nnoremap :tabnew inoremap :tabnew " => 选中及操作改键 " 调整缩进后自动选中,方便再次操作 vnoremap < >gv " y$ -> Y Make Y behave like other capitals map Y y$ " 复制选中区到系统剪切板中 vnoremap y "+y " auto jump to end of select " vnoremap y y`] " vnoremap p p`] " nnoremap p p`] " select all map sa ggVG " select block nnoremap v V`} " w!! to sudo & write a file cmap w!! w !sudo tee % " 滚动Speed up scrolling of the viewport slightly nnoremap 3 nnoremap 3 " Quickly close the current window nnoremap q :q " Quickly save the current file nnoremap w :w " Quickly save the current file and close nnoremap x :x " remap U to for easier redo nnoremap U " Quickly edit/reload the vimrc file nmap ev :e $MYVIMRC nmap sv :so $MYVIMRC "========================================== " FileType Settings 文件类型设置 "========================================== " 具体编辑文件类型的一般设置,比如不要 tab 等 autocmd FileType python set tabstop=4 shiftwidth=4 expandtab ai autocmd FileType ruby,javascript,html,css,xml set tabstop=2 shiftwidth=2 softtabstop=2 expandtab ai autocmd BufRead,BufNewFile *.md,*.mkd,*.markdown set filetype=markdown.mkd autocmd BufRead,BufNewFile *.part set filetype=html " disable showmatch when use > in php au BufWinEnter *.php set mps-=<:> " 保存python文件时删除多余空格 fun! StripTrailingWhitespaces() let l = line(".") let c = col(".") %s/\s\+$//e call cursor(l, c) endfun autocmd FileType c,cpp,java,go,php,javascript,puppet,python,rust,twig,xml,yml,perl autocmd BufWritePre :call StripTrailingWhitespaces() " 定义函数AutoSetFileHead,自动插入文件头 autocmd BufNewFile *.sh,*.py exec ":call AutoSetFileHead()" function! AutoSetFileHead() "如果文件类型为.sh文件 if &filetype == 'sh' call setline(1, "\#!/bin/bash") endif "如果文件类型为python if &filetype == 'python' call setline(1, "\#!/usr/bin/env python") call append(1, "\# encoding: utf-8") endif normal G normal o normal o endfunc " 设置可以高亮的关键字 if has("autocmd") " Highlight TODO, FIXME, NOTE, etc. if v:version > 701 autocmd Syntax * call matchadd('Todo', '\W\zs\(TODO\|FIXME\|CHANGED\|DONE\|XXX\|BUG\|HACK\)') autocmd Syntax * call matchadd('Debug', '\W\zs\(NOTE\|INFO\|IDEA\|NOTICE\)') endif endif "========================================== " TEMP 设置, 尚未确定要不要 "========================================== " tmux " function! WrapForTmux(s) " if !exists('$TMUX') " return a:s " endif " " let tmux_start = "\Ptmux;" " let tmux_end = "\\\" " " return tmux_start . substitute(a:s, "\", "\\", 'g') . tmux_end " endfunction " " let &t_SI .= WrapForTmux("\[?2004h") " let &t_EI .= WrapForTmux("\[?2004l") " allows cursor change in tmux mode " let &t_SI = "\]50;CursorShape=1\x7" " let &t_EI = "\]50;CursorShape=0\x7" " if exists('$TMUX') " let &t_SI = "\Ptmux;\\]50;CursorShape=1\x7\\\" " let &t_EI = "\Ptmux;\\]50;CursorShape=0\x7\\\" " endif "========================================== " Theme Settings 主题设置 "========================================== " Set extra options when running in GUI mode if has("gui_running") set guifont=Monaco:h14 if has("gui_gtk2") "GTK2 set guifont=Monaco\ 12,Monospace\ 12 endif set guioptions-=T set guioptions+=e set guioptions-=r set guioptions-=L set guitablabel=%M\ %t set showtabline=1 set linespace=2 set noimd set t_Co=256 endif " theme主题 set background=dark set t_Co=256 " mkdir -p ~/.vim/colors/ " colorscheme solarized " curl -SL# https://raw.githubusercontent.com/altercation/vim-colors-solarized/master/colors/solarized.vim -o ~/.vim/colors/solarized.vim " colorscheme molokai " curl -SL# https://raw.githubusercontent.com/tomasr/molokai/master/colors/molokai.vim -o ~/.vim/colors/molokai.vim colorscheme desert " 设置标记一列的背景颜色和数字一行颜色一致 hi! link SignColumn LineNr hi! link ShowMarksHLl DiffAdd hi! link ShowMarksHLu DiffChange " for error highlight,防止错误整行标红导致看不清 highlight clear SpellBad highlight SpellBad term=standout ctermfg=1 term=underline cterm=underline highlight clear SpellCap highlight SpellCap term=underline cterm=underline highlight clear SpellRare highlight SpellRare term=underline cterm=underline highlight clear SpellLocal highlight SpellLocal term=underline cterm=underline " NERDTree " https://github.com/scrooloose/nerdtree " curl -sL https://raw.githubusercontent.com/egalpin/apt-vim/master/install.sh | sh " apt-vim install -y https://github.com/scrooloose/nerdtree.git map t :NERDTreeToggle " open NERDTree automatically when vim starts up on opening a directory autocmd StdinReadPre * let s:std_in=1 autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists("s:std_in") | exe 'NERDTree' argv()[0] | wincmd p | ene | exe 'cd '.argv()[0] | endif