vim操作及配置
vim号称编辑器之神,最近也一直使用vim写代码,最大的印象就是快,无论是临时修改文件,还是专门写代码.现在记录vim主要操作快捷键和我的vim配置
vim操作
一、移动光标
-
左移h、右移l、下移j、上移k
-
向下翻页ctrl
f,向上翻页ctrlb -
向下翻半页ctrl
d,向上翻半页ctrlu -
移动到行尾$,移动到行首0(数字),移动到行首第一个字符处^
-
移动光标到下一个句子 ),移动光标到上一个句子(
-
移动到段首{,移动到段尾}
-
移动到下一个词w,移动到上一个词b
-
移动到文档开始gg,移动到文档结束G
-
移动到匹配的{}.().[]处%
-
跳到第n行 ngg 或 nG 或 :n
-
移动光标到屏幕顶端H,移动到屏幕中间M,移动到底部L
-
读取当前字符,并移动到本屏幕内下一次出现的地方 *
-
读取当前字符,并移动到本屏幕内上一次出现的地方 #
二、查找替换
-
光标向后查找关键字 #或者g#
-
光标向前查找关键字 或者g
-
当前行查找字符 fx, Fx, tx, Tx
-
基本替换 :s/s1/s2 (将下一个s1替换为s2)
-
全部替换 :%s/s1/s2
-
只替换当前行 :s/s1/s2/g
-
替换某些行 :n1,n2 s/s1/s2/g
-
搜索模式为 /string,搜索下一处为n,搜索上一处为N
-
制定书签 mx, 但是看不到书签标记,而且只能用小写字母
-
移动到某标签处 `x,1旁边的键
-
移动到上次编辑文件的位置 `.
.代表一个任意字符 *代表一个或多个字符的重复
三、编辑操作
-
光标后插入a, 行尾插入A
-
后插一行插入o,前插一行插入O
-
删除字符插入s, 删除正行插入S
-
光标前插入i,行首插入I
-
删除一行dd,删除后进入插入模式cc或者S
-
删除一个单词dw,删除一个单词进入插入模式cw
-
删除一个字符x或者dl,删除一个字符进入插入模式s或者cl
-
粘贴p,交换两个字符xp,交换两行ddp
-
复制y,复制一行yy
-
撤销u,重做ctrl + r,重复.
-
智能提示 ctrl
n 或者 ctrlp -
删除motion跨过的字符,删除并进入插入模式 c{motion}
-
删除到下一个字符跨过的字符,删除并进入插入模式,不包括x字符 ctx
-
删除当前字符到下一个字符处的所有字符,并进入插入模式,包括x字符,cfx
-
删除motion跨过的字符,删除但不进入插入模式 d{motion}
-
删除motion跨过的字符,删除但不进入插入模式,不包括x字符 dtx
-
删除当前字符到下一个字符处的所有字符,包括x字符 dfx
-
如果只是复制的情况时,将12-17条中的c或d改为y
-
删除到行尾可以使用D或C
-
拷贝当前行 yy或者Y
-
删除当前字符 x
-
粘贴 p
-
可以使用多重剪切板,查看状态使用:reg,使用剪切板使用”,例如复制到w寄存器,”wyy,或者使用可视模式v”wy
-
重复执行上一个作用使用.
-
使用数字可以跨过n个区域,如y3x,会拷贝光标到第三个x之间的区域,3j向下移动3行
-
在编写代码的时候可以使用]p粘贴,这样可以自动进行代码缩进
-
>> 缩进所有选择的代码, << 反缩进所有选择的代码
-
gd 移动到光标所处的函数或变量的定义处
-
K 在man里搜索光标所在的词
-
合并两行 J
-
若不想保存文件,而重新打开 :e!
-
若想打开新文件 :e filename,然后使用ctrl + ^进行文件切换
四.窗口操作
-
分隔一个窗口:split或者:vsplit
-
创建一个窗口:new或者:vnew
-
在新窗口打开文件:sf {filename}
-
关闭当前窗口:close
-
仅保留当前窗口:only
-
到左边窗口 ctrl + w, h
-
到右边窗口 ctrl + w, l
-
到上边窗口 ctrl + w, k
-
到下边窗口 ctrl + w, j
-
到顶部窗口 ctrl + w, t
-
到底部窗口 ctrl + w, b
五.宏操作
-
开始记录宏操作q[a-z],按q结束,保存操作到寄存器[a-z]中
-
@[a-z]执行寄存器[a-z]中的操作
-
@@执行最近一次记录的宏操作
六、可视操作
-
进入块可视模式 ctrl + v
-
进入字符可视模式 v
-
进入行可视模式 V
-
删除选定的块 d
-
删除选定的块然后进入插入模式 c
-
在选中的块同是插入相同的字符 I<String>ESC
七.跳到声明
-
[[ 向前跳到顶格第一个{
-
[] 向前跳到顶格第一个}
-
]] 向后跳到顶格的第一个{
-
]] 向后跳到顶格的第一个}
-
[{ 跳到本代码块的开头
-
]} 跳到本代码块的结尾
八.挂起操作
-
挂起Vim ctrl + z 或者 :suspend
-
查看任务 在shell中输入 jobs
-
恢复任务 fg [job number](将后台程序放到前台)或者 bg [job number](将前台程序放到后台)
-
执行shell命令 :!command
-
开启shell命令 :shell,退出该shell exit
-
保存vim状态 :mksession name.vim
-
恢复vim状态 :source name.vim
-
启动vim时恢复状态 vim -S name.vim
vim配置
http://github.com/honmaple/vim
初始化文件
~/vim/vimrc
1set nocompatible 2filetype off 3let g:is_mac = has('macunix') 4let g:is_linux = has('unix') && !has('macunix') && !has('win32unix') 5let g:is_windows = has('win32') || has('win64') 6if has("gui_running") 7 let g:is_gui = 1 8else 9 let g:is_gui = 0 10endif 11set rtp+=$HOME/.vim/bundle/Vundle.vim 12 13 14function s:require(file) 15 let l:file = $HOME . '/.vim/plugins/' . a:file . '.vim' 16 if filereadable(expand(l:file)) 17 execute 'source ' . fnameescape(l:file) 18 else 19 echom l:file . ' does not exist.' 20 endif 21endfunction 22 23call vundle#begin() 24Plugin 'VundleVim/Vundle.vim' 25call vundle#end() " required 26filetype plugin indent on " required 27 28" call plug#begin('~/.vim/plugged') 29" call plug#end() 30 31 32let require_list = [ 33 \ 'init-gui', 34 \ 'init-ui', 35 \ 'init-editor', 36 \ 'init-buffer', 37 \ 'init-file', 38 \ 'init-auto-insert', 39 \ 'init-git', 40 \ 'init-develop', 41 \ 'init-python', 42 \ 'init-html', 43 \ 'init-text', 44 \ 'init-keybind'] 45 46for file in require_list 47 call s:require(file) 48endfor
全局设置
~/git/.vim/plugins/init-gui.vim
1" 修改leader键 2let mapleader = ',' 3let g:mapleader = ',' 4 5filetype on "启用文件类型侦测 6filetype plugin on "针对不同的文件类型加载对应的插件 7filetype plugin indent on "启用缩进 8syntax on "代码高亮 9syntax enable "代码高亮 10set t_Co=256 11 12set mouse=a "任何模式下启用鼠标 13set mousehide "Hide the mouse cursor while typing 14scriptencoding utf-8 15" 设置 退出vim后,内容显示在终端屏幕, 可以用于查看和复制, 不需要可以去掉 16" set t_ti= t_te= 17 18if has('clipboard') 19 if has('unnamedplus') " When possible use + register for copy-paste 20 set clipboard=unnamed,unnamedplus 21 else " On mac and Windows, use * register for copy-paste 22 set clipboard=unnamed 23 endif 24endif 25 26set shortmess+=filmnrxoOtT "去掉欢迎界面 27set guifont=Monospace\ 12 28set viewoptions=folds,options,cursor,unix,slash " Better Unix / Windows compatibility 29set virtualedit=onemore " Allow for cursor beyond last character 30set history=1000 " Store a ton of history (default is 20) 31"set spell "启用拼写检查 32set hidden " Allow buffer switching without saving 33set iskeyword-=. " '.' is an end of word designator 34set iskeyword-=# " '#' is an end of word designator 35set iskeyword-=- " '-' is an end of word designator 36 37"set backup "设置备份文件 38"if has('persistent_undo') 39" set undofile " So is persistent undo ... 40" set undolevels=1000 " Maximum number of changes that can be undone 41" set undoreload=10000 " Maximum number lines to save for undo on a buffer reload 42"endif 43 44set tabpagemax=15 " Only show 15 tabs 45set showmode " Display the current mode 46 47set cursorline "高亮光标所在行 48set cuc "高亮光标所在列 49set colorcolumn=80 50highlight clear SignColumn " SignColumn should match background 51highlight clear LineNr " Current line number row will have same background color in relative mode 52"highlight clear CursorLineNr " Remove highlight color from current line number 53 54if has('cmdline_info') 55 set ruler " Show the ruler 56 set rulerformat=%30(%=\:b%n%y%m%r%w\ %l,%c%V\ %P%) " A ruler on steroids 57 set showcmd " Show partial commands in status line and 58" Selected characters/lines in visual mode 59endif 60 61if has('statusline') 62 set laststatus=2 "启用状态栏信息 63 set statusline=%<%f\ " Filename 64 set statusline+=%w%h%m%r " Options 65 " if !exists('g:override_bundles') 66 "set statusline+=%{fugitive#statusline()} " Git Hotness 67 "endif 68 set statusline+=\ [%{&ff}/%Y] " Filetype 69 set statusline+=\ [%{getcwd()}] " Current dir 70 set statusline+=%=%-14.(%l,%c%V%)\ %p%% " Right aligned file nav info 71endif 72 73set backspace=indent,eol,start " Backspace for dummies 74set linespace=0 " No extra spaces between rows 75set number "显示行号 76set relativenumber number "设置相对行号 77au FocusLost * :set norelativenumber number 78au FocusGained * :set relativenumber 79" 插入模式下用绝对行号, 普通模式下用相对 80autocmd InsertEnter * :set norelativenumber number 81autocmd InsertLeave * :set relativenumber 82function! NumberToggle() 83 if(&relativenumber == 1) 84 set norelativenumber number 85 else 86 set relativenumber 87 endif 88endfunction 89set scrolloff=10 "在上下移动光标时,光标的上方或下方至少会保留显示的行数 90set showmatch "高亮显示匹配的括号 91set incsearch "在输入要搜索的文字时,实时匹配 92set hlsearch "高亮搜索 93"set winminheight=0 " Windows can be 0 line high 94set ignorecase "搜索模式里忽略大小写 95set smartcase "如果搜索模式包含大写字符,不使用'ignorecase' 选项,只有在输入搜索模式并且打开 'ignorecase' 选项时才会使用 96set wildmenu 97" 增强模式中的命令行自动完成操作 98set wildmode=list:longest,full " Command <Tab> completion, list matches, then longest common part, then all. 99set whichwrap=b,s,h,l,<,>,[,] " Backspace and cursor keys wrap too 100"让Vim的补全菜单行为与一般IDE一致(参考VimTip1228) 101set completeopt=longest,menu 102set wildignore=*.o,*~,*.pyc,*.class 103"set scrolljump=5 " Lines to scroll when cursor leaves screen 104"set scrolloff=3 " Minimum lines to keep above and below cursor 105set list 106set listchars=tab:›\ ,trail:•,extends:#,nbsp:. " Highlight problematic whitespace 107set showcmd "在状态栏显示正在输入的命令 108 109set nowrap "设置不自动换行 110"set autoindent "打开自动缩进 111set shiftwidth=4 "换行时自动缩进宽度,可更改(宽度同tabstop) 112set expandtab "将Tab键转换为空格 113set tabstop=4 "设置Tab键的宽度,可以更改,如:宽度为2 114"autocmd FileType haskell,rust setlocal nospell 115 116let g:FoldMethod = 0 117fun! ToggleFold() 118 if g:FoldMethod == 0 119 exe "normal! zM" 120 let g:FoldMethod = 1 121 else 122 exe "normal! zR" 123 let g:FoldMethod = 0 124 endif 125endfun 126 127function! ToggleBG() 128 let s:tbg = &background 129 " Inversion 130 if s:tbg == "dark" 131 set background=light 132 else 133 set background=dark 134 endif 135endfunction 136 137 138"set smartindent "启用智能对齐方式 139"set shiftround "缩进时,取整 140"set showtabline=1 "显示标签 141set smarttab "指定按一次backspace就删除shiftwidth宽度 142"set foldmethod=indent "indent 折叠方式 143"set foldmethod=syntax 144"set foldenable "启用折叠 145set foldmethod=marker 146" 启动 vim 时关闭折叠代码 147set nofoldenable 148"set matchtime=5 "匹配括号高亮的时间(单位是十分之一秒) 149"set autoread "当文件在外部被修改,自动更新该文件 150"set autowrite "自动保存 151" set vb t_vb= "关闭提示音 152 153" 显示/隐藏菜单栏、工具栏、滚动条,可用 Ctrl + F11 切换 154if g:is_gui 155 winpos 100 10 "指定窗口出现的位置,坐标原点在屏幕左上角 156 set guiheadroom=0 157 set lines=38 columns=120 158 set guioptions-=m 159 set guioptions-=T 160 set guioptions-=r 161 set guioptions-=L 162 nmap <silent> <c-F11> :if &guioptions =~# 'm' <Bar> 163 \set guioptions-=m <Bar> 164 \set guioptions-=T <Bar> 165 \set guioptions-=r <Bar> 166 \set guioptions-=L <Bar> 167 \else <Bar> 168 \set guioptions+=m <Bar> 169 \set guioptions+=T <Bar> 170 \set guioptions+=r <Bar> 171 \set guioptions+=L <Bar> 172 \endif<CR> 173endif
UI设置
~/.vim/plugins/init-ui.vim
1Plugin 'altercation/vim-colors-solarized' 2Plugin 'tomasr/molokai' 3" Plugin 'spf13/vim-colors' 4Plugin 'bling/vim-airline' 5Plugin 'powerline/fonts' 6Plugin 'luochen1990/rainbow' 7Plugin 'Yggdroot/indentLine' 8Plugin 'liuchengxu/space-vim-dark' 9Plugin 'mhinz/vim-startify' 10 11 12 13if $TERM=~'cons25' 14 colorscheme default 15elseif g:is_gui 16 set background=dark 17 " let g:solarized_termcolors=256 18 " let g:solarized_termtrans = 0 19 " colorscheme solarized 20 let g:molokai_original = 1 21 colorscheme molokai 22else 23 set background=dark 24 let g:solarized_termcolors=256 25 let g:solarized_termtrans = 0 26 " colorscheme molokai 27 colorscheme solarized 28endif 29" indentLine { 30 " 用于显示对齐线 31 let g:indentLine_char = "┊" 32 let g:indentLine_first_char = "┊" 33 " 色块宽度 34 "let g:indent_guides_guide_size=1 35 " 设置终端对齐线颜色,如果不喜欢可以将其注释掉采用默认颜色 36 let g:indentLine_color_term = 256 37" } 38" vim-airline { 39 " let g:airline#extensions#tabline#enabled = 1 40 let g:airline_powerline_fonts=1 41 if !exists('g:airline_theme') 42 let g:airline_theme = 'dark' 43 endif 44" } 45" rainbow { 46 let g:rainbow_active = 1 47" } 48
编辑器设置
~/.vim/plugins/init-editor.vim
1Plugin 'tpope/vim-surround' 2Plugin 'jiangmiao/auto-pairs' 3Plugin 'vim-scripts/matchit.zip' 4Plugin 'gcmt/wildfire.vim' 5Plugin 'godlygeek/tabular' 6Plugin 'majutsushi/tagbar' 7Plugin 'kristijanhusak/vim-multiple-cursors' 8Plugin 'tpope/vim-commentary' 9Plugin 'Chiel92/vim-autoformat' 10Plugin 'thinca/vim-quickrun' 11 12" tagbar { 13 "nmap tb :TlistClose<CR>:TagbarToggle<CR> 14 let g:tagbar_width=20 "设置窗口宽度 15 let g:tagbar_left=0 "在左侧窗口中显示 16 let g:tagbar_compact=1 "不显示帮助信息 17 "tagbar_map_togglefold 打开tagbar变量 "o" 18 " set tags=./tags; 19 " 自动切换目录为当前编辑文件所在目录 20 " au BufRead,BufNewFile,BufEnter * cd %:p:h 21" } 22" wildfire { 23 let g:wildfire_objects = { 24 \ "*" : ["i'", 'i"', "i\)", "i\]", "i\}", "ip","it"], 25 \ "html,xml" : ["at","i>",'i"',"i\)"]} 26" } 27" vim-multiple-cursors { 28 " default mapping 29 let g:multi_cursor_next_key='<c-n>' 30 let g:multi_cursor_prev_key='<c-p>' 31 let g:multi_cursor_skip_key='<c-x>' 32 let g:multi_cursor_quit_key='<esc>' 33" } 34" Tabularize { 35 " 对齐 36 " nmap <Leader>a= :Tabularize /^[^=]*\zs=<CR> 37 " vmap <Leader>a= :Tabularize /^[^=]*\zs=<CR> 38" } 39" quickrun { 40 let g:quickrun_config = { 41 \ "_" : { 42 \ "outputter" : "message", 43 \ }, 44 \} 45 let g:quickrun_no_default_key_mappings = 1 46" }
Buffer设置
~/.vim/plugins/init-buffer.vim
1Plugin 'bling/vim-bufferline' 2Plugin 'sjl/gundo.vim' 3 4" gundo { 5 set undodir=~/.vim/.cache/undo 6 set undofile 7 set undolevels=10 " Maximum number of changes that can be undone 8 set undoreload=10 " Maximum number lines to save for undo on a buffer reload 9" }
文件设置
~/.vim/plugins/init-file.vim
1Plugin 'ctrlpvim/ctrlp.vim' 2Plugin 'tacahiroy/ctrlp-funky' 3Plugin 'dyng/ctrlsf.vim' 4Plugin 'scrooloose/nerdtree' 5Plugin 'jistr/vim-nerdtree-tabs' 6 7" ctrlp { 8 let g:ctrlp_working_path_mode = 'ra' 9 let g:ctrlp_map = '<c-p>' 10 let g:ctrlp_cmd = 'CtrlP' 11 12 let g:ctrlp_custom_ignore = { 13 \ 'dir': '\v[\/]\.(git|hg|svn|rvm)$', 14 \ 'file': '\v\.(exe|so|dll|zip|tar|tar.gz|pyc)$', 15 \ } 16 17 if executable('ag') 18 let s:ctrlp_fallback = 'ag %s --nocolor -l -g ""' 19 elseif executable('ack-grep') 20 let s:ctrlp_fallback = 'ack-grep %s --nocolor -f' 21 elseif executable('ack') 22 let s:ctrlp_fallback = 'ack %s --nocolor -f' 23 else 24 let s:ctrlp_fallback = 'find %s -type f' 25 endif 26 if exists("g:ctrlp_user_command") 27 unlet g:ctrlp_user_command 28 endif 29 let g:ctrlp_user_command = { 30 \ 'types': { 31 \ 1: ['.git', 'cd %s && git ls-files . --cached --exclude-standard --others'], 32 \ 2: ['.hg', 'hg --cwd %s locate -I .'], 33 \ }, 34 \ 'fallback': s:ctrlp_fallback 35 \ } 36 37" } 38 39 40" ctrlp-funky { 41 " CtrlP extensions 42 let g:ctrlp_extensions = ['funky'] 43 let g:ctrlp_funky_syntax_highlight = 1 44" } 45" ctrlsf { 46 " 工程内查找文件内容,先安装ag /the_silver_searcher 47 let g:ctrlsf_ackprg = 'ag' 48 nmap <C-F>f <Plug>CtrlSFPrompt 49 vmap <C-F>f <Plug>CtrlSFVwordPath 50 vmap <C-F>F <Plug>CtrlSFVwordExec 51 nmap <C-F>n <Plug>CtrlSFCwordPath 52 nmap <C-F>p <Plug>CtrlSFPwordPath 53" } 54 55" NerdTree { 56 " 自动开启nerdtree 57 let g:nerdtree_tabs_open_on_console_startup = 0 58 let g:nerdtree_tabs_open_on_gui_startup = 0 59 "当打开vim且没有文件时自动打开NERDTree 60 " if !g:is_gui 61 " autocmd StdinReadPre * let s:std_in=1 62 " autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif 63 " endif 64 "显示文件 65 let NERDTreeShowFiles=1 66 let NERDTreeIgnore=['\.py[cd]$', '\~$', '\.swo$', '\.swp$', '^\.git$', '^\.hg$', '^\.svn$', '\.bzr$'] 67 "显示隐藏文件 68 let NERDTreeShowHidden=0 69 let NERDTreeChDirMode=0 70 let NERDTreeQuitOnOpen=1 71 let NERDTreeMouseMode=2 72 let NERDTreeKeepTreeInNewTab=1 73 let NERDTreeWinSize=22 74 let NERDTreeWinPos="left" 75 "高亮显示当前文件或目录 76 let NERDTreeHightCursorline=1 77 "不显示'Bookmarks' label 'Press ? for help' 78 let NERDTreeMinimalUI=1 79 " s/v 分屏打开文件 80 let g:NERDTreeMapOpenSplit = 's' 81 let g:NERDTreeMapOpenVSplit = 'v' 82" }
