目录
- :help <command>:帮助文档
- Ctrl+n 或者 Ctrl+p:自动补齐
模式
- i:插入模式
- a:在光标后输入
- o:在当前行后插入一个新行
- O:在当前行前插入一个新行
- ESC:返回Normal模式
移动
- hjkl:移动光标
- 0:数字零,到行头
- $:到本行行尾
- ^:到本行第一个不是blank字符的位置(所谓blank字符就是空格,tab,换行,回车等)
- g_:到本行最后一个不是blank字符的位置
- :N:到第N行
- gg:第一行
- G:最后一行
- w:到下一个单词的开头
- e:到下一个单词的结尾
- %:匹配括号移动
- *:移动光标到下一个匹配单词
- #:移动光标到上一个匹配单词
- fa: 到下一个为a的字符处;F反向
- t,:到逗号前的第一个字符;T反向
Normal模式字符操作
- x:删除当前光标所在的一个字符
- u:撤销
- Ctrl+r:重做
删除复制黏贴
- d:删除
- p:黏贴;P在当前位置之前粘贴剪贴板
- **p:复制指定寄存器中的内容(:reg 查看寄存器中的内容,比如 ”0p 复制 “0 寄存器中的内容)
- y:复制
- dd pp yy:对当前行进行删除,黏贴和复制
- :set paste:设置黏贴模式,可以快速的解决黏贴过程中多次换行造成格式混乱的问题(:set nopaste 可以取消黏贴模式)
块操作
- vi":选择双引号之内的字符;v2i" 两个双引号之内的字符
- va":选择双引号之间的字符(包含双引号);同上
- Ctrl + v:对某块字符执行相同的操作,见范例
- J:将多行连接变成一行
- shift + < >:左右缩进
- =:自动缩进
重复操作
- .:重复上一次操作
- N<command>:重复某个指令N次,比如 2dd,3p
搜索
- /pattern: 搜索pattern的字符串(如果搜索出多个匹配,可按n键到下一个,N上一个)
- shift *:移动到需要查找单词的首字母上,shift * 即可快速搜索该单词
- :noh:搜索之后取消高亮
文件操作
- :w:存盘,可以跟文件名
- :q:退出
- :e:打开文件
- :saveas:另存为
分屏
- vim -On file1 file2:垂直分屏
- vim -on file1 file2:水平分屏
- Ctrl+w c:关闭当前窗口
- :sp file1:上下分割,打开一个文件
- :vsp file1:左右分割,打开一个文件
- Ctrl+w jkhl:在多个分屏中移动光标
功能指令
- :set invlist / :set nolist:显示和取消显示不可见字符,其中 ^I 标识 Tab,$ 表示回车
- :set expandtab:将 tab 键替换为空格
- :set ts=4:设置 tab 键对应四个空格长度
范例
- 0y$:到行头,从这里开始拷贝,拷贝到本行最后一个字符
- dt":删除所有的内容,直到遇到双引号
- 0 Ctrl+v Ctrl+d I--:在某块区域前面添加 --
Vim 配置
vim的配置文件位置有以下三个
- system vimrc file: "$VIM/vimrc" 或 /etc/vim/vimrc (所有用户的都将被修改,不建议修改)
- user vimrc file: "$HOME/.vimrc" 或 /usr/share/vim/vimrc (Debian 为 /etc/vim/vimrc 的链接文件)
- user vimrc file: "~/.vimrc" (一般不存在,可以自己创建)
下面给出一个较好配置文件
" CRiption: \u9002\u5408\u81EA\u5DF1\u4F7F\u7528\u7684vimrc\u6587\u4EF6\uFF0Cfor Linux/Windows, GUI/Console
"
" Last Change: 2010\u5E7408\u670802\u65E5 15\u65F613\u5206
"
" Version: 1.80
"
"=========================================================================
set nocompatible " \u5173\u95ED vi \u517C\u5BB9\u6A21\u5F0F
set diffopt=filler,iwhite,
set diffexpr=MyDiff()
set autowrite
function MyDiff()
let opt = ""
if &diffopt =~ "icase"
let opt = opt . "-i "
endif
if &diffopt =~ "iwhite"
let opt = opt . "-b "
endif
silent execute "!diff -a --binary -w " . opt . v:fname_in . " " . v:fname_new .
\ " > " . v:fname_out
endfunction
syntax on " \u81EA\u52A8\u8BED\u6CD5\u9AD8\u4EAE
"colorscheme molokai " \u8BBE\u5B9A\u914D\u8272\u65B9\u6848
set number " \u663E\u793A\u884C\u53F7
"set cursorline " \u7A81\u51FA\u663E\u793A\u5F53\u524D\u884C
set ruler " \u6253\u5F00\u72B6\u6001\u680F\u6807\u5C3A
set expandtab
set shiftwidth=4 " \u8BBE\u5B9A << \u548C >> \u547D\u4EE4\u79FB\u52A8\u65F6\u7684\u5BBD\u5EA6\u4E3A 4
set softtabstop=4 " \u4F7F\u5F97\u6309\u9000\u683C\u952E\u65F6\u53EF\u4EE5\u4E00\u6B21\u5220\u6389 4 \u4E2A\u7A7A\u683C
set tabstop=4 " \u8BBE\u5B9A tab \u957F\u5EA6\u4E3A 4
set nobackup " \u8986\u76D6\u6587\u4EF6\u65F6\u4E0D\u5907\u4EFD
" set autochdir " \u81EA\u52A8\u5207\u6362\u5F53\u524D\u76EE\u5F55\u4E3A\u5F53\u524D\u6587\u4EF6\u6240\u5728\u7684\u76EE\u5F55
filetype plugin on " \u5F00\u542F\u63D2\u4EF6
set backupcopy=yes " \u8BBE\u7F6E\u5907\u4EFD\u65F6\u7684\u884C\u4E3A\u4E3A\u8986\u76D6
set ignorecase smartcase " \u641C\u7D22\u65F6\u5FFD\u7565\u5927\u5C0F\u5199\uFF0C\u4F46\u5728\u6709\u4E00\u4E2A\u6216\u4EE5\u4E0A\u5927\u5199\u5B57\u6BCD\u65F6\u4ECD\u4FDD\u6301\u5BF9\u5927\u5C0F\u5199\u654F\u611F
set nowrapscan " \u7981\u6B62\u5728?\u7D22\u5230\u6587\u4EF6\u4E24\u7AEF\u65F6\u91CD\u65B0?\u7D22
set incsearch " \u8F93\u5165\u641C\u7D22\u5185\u5BB9\u65F6\u5C31\u663E\u793A\u641C\u7D22\u7ED3\u679C
set hlsearch " \u641C\u7D22\u65F6\u9AD8\u4EAE\u663E\u793A\u88AB\u627E\u5230\u7684\u6587\u672C
set noerrorbells " \u5173\u95ED\u9519\u8BEF\u4FE1\u606F\u54CD\u94C3
set novisualbell " \u5173\u95ED\u4F7F\u7528\u53EF\u89C6\u54CD\u94C3\u4EE3\u66FF\u547C\u53EB
set t_vb= " \u7F6E\u7A7A\u9519\u8BEF\u94C3\u58F0\u7684\u7EC8\u7AEF\u4EE3\u7801
set showmatch " \u63D2\u5165\u62EC\u53F7\u65F6\uFF0C\u77ED\u6682\u5730\u8DF3\u8F6C\u5230\u5339\u914D\u7684\u5BF9\u5E94\u62EC\u53F7
set matchtime=2 " \u77ED\u6682\u8DF3\u8F6C\u5230\u5339\u914D\u62EC\u53F7\u7684\u65F6\u95F4
set magic " \u8BBE\u7F6E\u9B54\u672F
set hidden " \u5141\u8BB8\u5728\u6709\u672A\u4FDD\u5B58\u7684\u4FEE\u6539\u65F6\u5207\u6362\u7F13\u51B2\u533A\uFF0C\u6B64\u65F6\u7684\u4FEE\u6539\u7531 vim \u8D1F\u8D23\u4FDD\u5B58
set smartindent " \u5F00\u542F\u65B0\u884C\u65F6\u4F7F\u7528\u667A\u80FD\u81EA\u52A8\u7F29\u8FDB
set backspace=indent,eol,start
set mouse=v
set wildmenu
" \u4E0D\u8BBE\u5B9A\u5728\u63D2\u5165\u72B6\u6001\u65E0\u6CD5\u7528\u9000\u683C\u952E\u548C Delete \u952E\u5220\u9664\u56DE\u8F66\u7B26
set tags=./tags
let Tlist_Show_One_File=1
let Tlist_Exit_OnlyWindow=1
let Tlist_Use_Right_Window=1
let g:winManagerWindowLayout='FileExplorer'
let mapleader = ","
let b:tablify_delimiter = " "
let b:tablify_cellLeftPadding = 0
let b:tablify_cellRightPadding = 0
nmap tm :Tlist <cr>:WMToggle<cr>
imap <C-Tab> <C-x><C-o>
filetype plugin indent on
"set completeopt=longest,menu
let g:SuperTabRetainCompletionType=2
let g:SuperTabDefaultCompletionType="<C-X><C-P>"
set cmdheight=1 " \u8BBE\u5B9A\u547D\u4EE4\u884C\u7684\u884C\u6570\u4E3A 1
set laststatus=2 " \u663E\u793A\u72B6\u6001\u680F (\u9ED8\u8BA4\u503C\u4E3A 1, \u65E0\u6CD5\u663E\u793A\u72B6\u6001\u680F)
set statusline=\ %<%F[%1*%M%*%n%R%H]%=\ %y\ %0(%{&fileformat}\ %{&encoding}\ %c:%l/%L%)\
" \u8BBE\u7F6E\u5728\u72B6\u6001\u884C\u663E\u793A\u7684\u4FE1\u606F
set foldenable " \u5F00\u59CB\u6298\u53E0
"set foldmethod=syntax " \u8BBE\u7F6E\u8BED\u6CD5\u6298\u53E0
set foldcolumn=0 " \u8BBE\u7F6E\u6298\u53E0\u533A\u57DF\u7684\u5BBD\u5EA6
setlocal foldlevel=1 " \u8BBE\u7F6E\u6298\u53E0\u5C42\u6570\u4E3A
" set foldclose=all " \u8BBE\u7F6E\u4E3A\u81EA\u52A8\u5173\u95ED\u6298\u53E0
nnoremap <space> @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo')<CR>
" \u7528\u7A7A\u683C\u952E\u6765\u5F00\u5173\u6298\u53E0
" return OS type, eg: windows, or linux, mac, et.st..
function MySys()
if has("win16") || has("win32") || has("win64") || has("win95")
return "windows"
elseif has("unix")
return "linux"
endif
endfunction
" \u7528\u6237\u76EE\u5F55\u53D8\u91CF$VIMFILES
if MySys() == "windows"
let $VIMFILES = $VIM.'/vimfiles'
elseif MySys() == "linux"
let $VIMFILES = $HOME.'/.vim'
endif
" \u914D\u7F6E\u591A\u8BED\u8A00\u73AF\u5883
if has("multi_byte")
" UTF-8 \u7F16\u7801
"set encoding=utf-8
" set fileencoding=utf-8,gbk,gb18030
"set termencoding=utf-8,gbk,gb18030
set formatoptions+=mM
set fencs=utf-8,gbk,gb18030
if v:lang =~? '^\(zh\)\|\(ja\)\|\(ko\)'
set ambiwidth=double
endif
if has("win32")
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
language messages zh_CN.utf-8
endif
else
echoerr "Sorry, this version of (g)vim was not compiled with +multi_byte"
endif
if(has("win32") || has("win95") || has("win64") || has("win16"))
let g:iswindows=1
else
let g:iswindows=0
endif
map <F12> :call Do_CsTag()<CR>
"nmap <C-@>s :cs find s <C-R>=expand("<cword>")<CR><CR>:copen<CR>
"nmap <C-@>g :cs find g <C-R>=expand("<cword>")<CR><CR>
"nmap <C-@>c :cs find c <C-R>=expand("<cword>")<CR><CR>:copen<CR>
"nmap <C-@>t :cs find t <C-R>=expand("<cword>")<CR><CR>:copen<CR>
"nmap <C-@>e :cs find e <C-R>=expand("<cword>")<CR><CR>:copen<CR>
"nmap <C-@>f :cs find f <C-R>=expand("<cfile>")<CR><CR>:copen<CR>
"nmap <C-@>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>:copen<CR>
"nmap <C-@>d :cs find d <C-R>=expand("<cword>")<CR><CR>:copen<CR>
function Do_CsTag()
let dir = getcwd()
if filereadable("tags")
if(g:iswindows==1)
let tagsdeleted=delete(dir."\\"."tags")
else
let tagsdeleted=delete("./"."tags")
endif
if(tagsdeleted!=0)
echohl WarningMsg | echo "Fail to do tags! I cannot delete the tags" | echohl None
return
endif
endif
if has("cscope")
silent! execute "cs kill -1"
endif
if filereadable("cscope.files")
if(g:iswindows==1)
let csfilesdeleted=delete(dir."\\"."cscope.files")
else
let csfilesdeleted=delete("./"."cscope.files")
endif
if(csfilesdeleted!=0)
echohl WarningMsg | echo "Fail to do cscope! I cannot delete the cscope.files" | echohl None
return
endif
endif
if filereadable("cscope.out")
if(g:iswindows==1)
let csoutdeleted=delete(dir."\\"."cscope.out")
else
let csoutdeleted=delete("./"."cscope.out")
endif
if(csoutdeleted!=0)
echohl WarningMsg | echo "Fail to do cscope! I cannot delete the cscope.out" | echohl None
return
endif
endif
if(executable('ctags'))
"silent! execute "!ctags -R --c-types=+p --fields=+S *"
silent! execute "!ctags -R --c-types=+p --c++-kinds=+p --fields=+iaS --extra=+q ."
endif
if(executable('cscope') && has("cscope") )
if(g:iswindows!=1)
silent! execute "!find . -name '*.h' -o -name '*.c' -o -name '*.cpp' -o -name '*.java' -o -name '*.cs' -o -name '*.py' > cscope.files"
else
silent! execute "!dir /s/b *.c,*.cpp,*.h,*.java,*.cs >> cscope.files"
endif
silent! execute "!cscope -b"
execute "normal :"
if filereadable("cscope.out")
execute "cs add cscope.out"
endif
endif
endfunction
if has("autocmd")
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif
endif
let NERDShutUp=1
set fileencodings=utf-8,gb18030,gbk,gb2312,big5
set fileencoding=utf-8
"set fileencoding=gb18030
set termencoding=utf-8
set encoding=utf-8
set langmenu=zh_CN.utf-8
set cscopequickfix=s-,c-,d-,i-,t-,e-
silent! execute "cs add cscope.out"
nmap cw :Tlist <cr>:WMToggle<cr>:cw<cr>:Tlist <cr>:WMToggle<cr>
au! BufRead,BufNewFile *.json set filetype=json
au BufRead,BufNewFile *.go set makeprg=go
au BufRead,BufNewFile *.py set makeprg=python
function Test_python()
let current_file = expand('%:p')
exe ':ConqueTermSplit pylint ' . current_file
endfunction
nmap cp :call Test_python()<cr>
autocmd BufNewFile *.py exec ":call AddTitle()"
function AddTitle()
call append( 0, "\#!/usr/bin/env python")
call append( 1, "\# encoding: utf8")
call append( 2, "\#")
call append( 3, "\# @author : **************")
call append( 4, "\# @file : ".expand("%:t"))
call append( 5, "\# @date : ".strftime("%Y/%m/%d %H:%M"))
call append( 6, "if __name__ == '__main__':")
call append( 6, "")
echohl WarningMsg | echo "Successful in adding the copyright." | echohl None
endf