vim操作及配置


vim号称编辑器之神,最近也一直使用vim写代码,最大的印象就是快,无论是临时修改文件,还是专门写代码.现在记录vim主要操作快捷键和我的vim配置

vim操作

一、移动光标

  1. 左移h、右移l、下移j、上移k

  2. 向下翻页ctrl f,向上翻页ctrl b

  3. 向下翻半页ctrl d,向上翻半页ctrl u

  4. 移动到行尾$,移动到行首0(数字),移动到行首第一个字符处^

  5. 移动光标到下一个句子 ),移动光标到上一个句子(

  6. 移动到段首{,移动到段尾}

  7. 移动到下一个词w,移动到上一个词b

  8. 移动到文档开始gg,移动到文档结束G

  9. 移动到匹配的{}.().[]处%

  10. 跳到第n行 ngg 或 nG 或 :n

  11. 移动光标到屏幕顶端H,移动到屏幕中间M,移动到底部L

  12. 读取当前字符,并移动到本屏幕内下一次出现的地方 *

  13. 读取当前字符,并移动到本屏幕内上一次出现的地方 #

二、查找替换

  1. 光标向后查找关键字 #或者g#

  2. 光标向前查找关键字 或者g

  3. 当前行查找字符 fx, Fx, tx, Tx

  4. 基本替换 :s/s1/s2 (将下一个s1替换为s2)

  5. 全部替换 :%s/s1/s2

  6. 只替换当前行 :s/s1/s2/g

  7. 替换某些行 :n1,n2 s/s1/s2/g

  8. 搜索模式为 /string,搜索下一处为n,搜索上一处为N

  9. 制定书签 mx, 但是看不到书签标记,而且只能用小写字母

  10. 移动到某标签处 `x,1旁边的键

  11. 移动到上次编辑文件的位置 `.

    .代表一个任意字符 *代表一个或多个字符的重复

三、编辑操作

  1. 光标后插入a, 行尾插入A

  2. 后插一行插入o,前插一行插入O

  3. 删除字符插入s, 删除正行插入S

  4. 光标前插入i,行首插入I

  5. 删除一行dd,删除后进入插入模式cc或者S

  6. 删除一个单词dw,删除一个单词进入插入模式cw

  7. 删除一个字符x或者dl,删除一个字符进入插入模式s或者cl

  8. 粘贴p,交换两个字符xp,交换两行ddp

  9. 复制y,复制一行yy

  10. 撤销u,重做ctrl + r,重复.

  11. 智能提示 ctrl n 或者 ctrl p

  12. 删除motion跨过的字符,删除并进入插入模式 c{motion}

  13. 删除到下一个字符跨过的字符,删除并进入插入模式,不包括x字符 ctx

  14. 删除当前字符到下一个字符处的所有字符,并进入插入模式,包括x字符,cfx

  15. 删除motion跨过的字符,删除但不进入插入模式 d{motion}

  16. 删除motion跨过的字符,删除但不进入插入模式,不包括x字符 dtx

  17. 删除当前字符到下一个字符处的所有字符,包括x字符 dfx

  18. 如果只是复制的情况时,将12-17条中的c或d改为y

  19. 删除到行尾可以使用D或C

  20. 拷贝当前行 yy或者Y

  21. 删除当前字符 x

  22. 粘贴 p

  23. 可以使用多重剪切板,查看状态使用:reg,使用剪切板使用”,例如复制到w寄存器,”wyy,或者使用可视模式v”wy

  24. 重复执行上一个作用使用.

  25. 使用数字可以跨过n个区域,如y3x,会拷贝光标到第三个x之间的区域,3j向下移动3行

  26. 在编写代码的时候可以使用]p粘贴,这样可以自动进行代码缩进

  27. >> 缩进所有选择的代码, << 反缩进所有选择的代码

  28. gd 移动到光标所处的函数或变量的定义处

  29. K 在man里搜索光标所在的词

  30. 合并两行 J

  31. 若不想保存文件,而重新打开 :e!

  32. 若想打开新文件 :e filename,然后使用ctrl + ^进行文件切换

四.窗口操作

  1. 分隔一个窗口:split或者:vsplit

  2. 创建一个窗口:new或者:vnew

  3. 在新窗口打开文件:sf {filename}

  4. 关闭当前窗口:close

  5. 仅保留当前窗口:only

  6. 到左边窗口 ctrl + w, h

  7. 到右边窗口 ctrl + w, l

  8. 到上边窗口 ctrl + w, k

  9. 到下边窗口 ctrl + w, j

  10. 到顶部窗口 ctrl + w, t

  11. 到底部窗口 ctrl + w, b

五.宏操作

  1. 开始记录宏操作q[a-z],按q结束,保存操作到寄存器[a-z]中

  2. @[a-z]执行寄存器[a-z]中的操作

  3. @@执行最近一次记录的宏操作

六、可视操作

  1. 进入块可视模式 ctrl + v

  2. 进入字符可视模式 v

  3. 进入行可视模式 V

  4. 删除选定的块 d

  5. 删除选定的块然后进入插入模式 c

  6. 在选中的块同是插入相同的字符 I<String>ESC

七.跳到声明

  1. [[ 向前跳到顶格第一个{

  2. [] 向前跳到顶格第一个}

  3. ]] 向后跳到顶格的第一个{

  4. ]] 向后跳到顶格的第一个}

  5. [{ 跳到本代码块的开头

  6. ]} 跳到本代码块的结尾

八.挂起操作

  1. 挂起Vim ctrl + z 或者 :suspend

  2. 查看任务 在shell中输入 jobs

  3. 恢复任务 fg [job number](将后台程序放到前台)或者 bg [job number](将前台程序放到后台)

  4. 执行shell命令 :!command

  5. 开启shell命令 :shell,退出该shell exit

  6. 保存vim状态 :mksession name.vim

  7. 恢复vim状态 :source name.vim

  8. 启动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" }
作者: honmaple
链接: https://honmaple.me/articles/2015/12/vim操作及配置.html
版权: CC BY-NC-SA 4.0 知识共享署名-非商业性使用-相同方式共享4.0国际许可协议
wechat
alipay

加载评论