Vim

vim.png

1. Vim Command

Table 1: Vim Keyboard
Command Description
插入命令  
a 在光标所在字符后插入
A 在光标所在行行尾插入
i 在光标所在字符前插入
I 在光标所在行行首插入
o 在光标下插入新行
O 在光标上插入新行
定位命令  
\$ 光标移到行尾
\^ 光标移到行首
gg 到第一行
G 到最后一行
nG or :n 到第n行
删除命令  
x 删除光标位置字符
nx 删除光标位置后的n个字符
dd 删除光标所在行,ndd删除n行
dG 删除光标所在位置到文件末尾内容
D 删除光标所在位置到行尾内容
:n1,n2d 删除指定范围的行,如:999,1003d
保存命令  
:w 保存修改
:w 另存为指定文件
:wq 保存修改并退出
ZZ 保存退出快捷键
:q! 不保存退出
:wq! 保存修改并退出(文件所有者及root可使用)
常用操作  
选择 按v,进入可视模式,移动光标选定内容
复制 一般选定后,按y(yank)即可复制,常用命令如下:
  yy 复制整行(nyy或者yny ,复制n行,n为数字)
  y^ 复制当前到行头的内容
  y$ 复制当前到行尾的内容
  yw 复制一个word (nyw或者ynw,复制n个word,n为数字)
  yG 复制至档尾(nyG或者ynG,复制到第n行,例如1yG或者y1G,复制到档尾) 
剪切 按d(delete)剪切,基本和复制命令一样。常用命令如下:
  d 剪切选定块到缓冲区;
  dd 剪切整行,ndd剪切当前行以下n行。
  d^ 剪切至行首
  d$ 剪切至行尾
  dw 剪切一个word
粘贴 按p(put),粘贴在当前光标所在行下面
  按P,粘贴在当前光标所在行上面
  整行的复制粘贴在游标的上(下)一行;非整行的复制则是粘贴在游标的前(后)
撤销(undo) u,(阅读模式下按U,撤销上一步的操作)
恢复(redo) Ctrl+r
搜索 查找(normal模式下)
  n/N,继续搜索下一处/上一处关键词
  :%s/oldString/newString/g,全文替换
  :n1,n2s/oldString/newString/g,在一定范围内替换指定字符串
  注意:查找回车应当用\n,而替换为回车应当用\r(相当于<CR>)
  Vim查找支持正则表达式,例如/vim$匹配行尾的"vim"。 需要查找特殊字符需要转义,例如/vim\\(匹配"vim\)"。
  \c表示大小写不敏感查找,\C表示大小写敏感查找。
  *即可查找光标所在单词(word), 要求每次出现的前后为空白字符或标点符号。
  例如当前为foo, 可以匹配foo bar中的foo,但不可匹配foobar中的foo。
  g*即可查找光标所在单词的字符序列,每次出现前后字符无要求。 即foo bar和foobar中的foo均可被匹配到。
查找及替换 :s(substitute), 查找和替换。语法如下:
  :{作用范围}s/{目标}/{替换}/{替换标志}
  例如:%s/foo/bar/g会在全局范围(%)查找foo并替换为bar,所有出现都会被替换(g)。
  1. 作用范围分为当前行、全文、选区等等。
  当前行::s/foo/bar/g。
  全文::%s/foo/bar/g。
  选区,在Visual模式下选择区域后输入:,Vim即可自动补全为 :'<,'>::'<,'>s/foo/bar/g。
  2-11行::5,12s/foo/bar/g
  当前行.与接下来两行+2::.,+2s/foo/bar/g
  2. 替换标志
  空替换标志表示只替换从光标位置开始,目标的第一次出现::%s/foo/bar
  i表示大小写不敏感查找,I表示大小写敏感:
  :%s/foo/bar/i
  # 等效于模式中的\c(不敏感)或\C(敏感)
  :%s/foo\c/bar
  c表示需要确认,例如全局查找"foo"替换为"bar"并且需要确认::%s/foo/bar/gc
设置命令  
:set nu! 显示行号
:set nonu 取消行号
:syntax on 语法高亮度显示
:set ai! 设置自动缩进
:set filetype indent on 启用自动缩进选项
:set filetype=xml 启用自动缩进选项n
:100 跳到指定行:
:split 分割视窗(可加名称随便开启另一档案)
gg=G Formart格式化
:n/:N 编辑多个文件时,下一个文件/上一个文件
注意事项 如果设置完成后,发现功能没有起作用,检查系统下是否安装了 vim-enhanced,命令为: $ rpm -q vim-enhanced
小技巧  
:r ![命令] 导入命令执行结果
:map 快捷键 触发命令
  定义快捷键,范例:
  :map ^P I#<ESC>
  :map ^B 0x
  :map ^H zrg1390556487@gmail.com<ESC> //定义快捷键,插入邮箱
:n1,n2s/^/#/g 连续行注释
:n1,n2s/^#//g 连续行注释
:n1,n2s/^/\/\//g 连续行注释
:ab mymail zrg@gmail.com 替换,输入mymail,自动变成zrg@gmail.com

2. Vim Configuration

2.1. Set Theme

  1. 查看当前主题

    :color 
    :colorscheme 
    
  2. 查看vim运行目录

    :echo $VIMRUNTIME 
    
  3. 查看colors目录

    $ ls /usr/share/vim/vim80 
    
  4. 设置颜色主题,查看效果

    :colorscheme [space] [Ctrl+d]
    :colorscheme elflord 
    
  5. 修改颜色主题

    // Debian/Ubuntu
    $ vim /etc/vim/vimrc
    
    // MacOS
    $ vim ~/.zshrc
    
    // 然后,添加如下代码 
    
    # elfload 表示主题名称
    colorscheme elflord 
    
    或者在 ~/.vimrc 中进行设置:
    
    highlight Search ctermbg=yellow ctermfg=black 
    highlight IncSearch ctermbg=black ctermfg=yellow 
    highlight MatchParen cterm=underline ctermbg=NONE ctermfg=NONE
    
    上述配置指定 Search 结果的前景色(foreground)为黑色,背景色(background)为灰色; 渐进搜索的前景色为黑色,背景色为黄色;光标处的字符加下划线。
    
  6. MacOS 修改主题

    $ ls /usr/share/vim/vim81/
    $ vim ~/.vimrc
    
    colorscheme darkblue # 主题设置
    syntax on # 打开语法高亮
    

2.2. Enable and Disable Highlight

// Disable
:nohighlight 或 :nohl
// Only disable search highlight
:set nohlsearch
// Re-enabled search hightlight on next search
:set hlsearch
  • 延时禁用

    让Vim查找/替换后一段时间自动取消高亮,发生查找时自动开启呢?
    
    1: " 当光标一段时间保持不动了,就禁用高亮
    2: autocmd cursorhold * set nohlsearch
    3: " 当输入查找命令时,再启用高亮
    4: noremap n :set hlsearch<cr>n
    5: noremap N :set hlsearch<cr>N
    6: noremap / :set hlsearch<cr>/
    7: noremap ? :set hlsearch<cr>?
    8: noremap * *:set hlsearch<cr>
    
  • 一键禁用

    设置快捷键来一键禁用/开启搜索高亮:
    
    nnoremap <c-h> :call DisableHighlight()<cr>
    function! DisableHighlight()
          set nohlsearch
    endfunc
    
    希望关闭高亮时只需要按下 Ctrl+H,当发生下次搜索时又会自动启用。
    
  • 设置生效

    Notice: 设置完成后,发现功能没有起作用,检查一下系统下是否安装了vim-enhanced包,查询命令为: 
    $ rpm -q vim-enhanced
    

2.3. Install Plugin

  1. Install vundle

    $ git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
    
  2. Configure vundle

    $ vim ~/.vimrc
    
    set nocompatible              " be iMproved, required
    filetype off                  " required
    
    " set the runtime path to include Vundle and initialize
    set rtp+=~/.vim/bundle/Vundle.vim
    call vundle#begin()
    " alternatively, pass a path where Vundle should install plugins
    "call vundle#begin('~/some/path/here')
    
    " let Vundle manage Vundle, required
    Plugin 'VundleVim/Vundle.vim'
    
    " The following are examples of different formats supported.
    " Keep Plugin commands between vundle#begin/end.
    " plugin on GitHub repo
    Plugin 'tpope/vim-fugitive'
    " plugin from http://vim-scripts.org/vim/scripts.html
    " Plugin 'L9'
    " Git plugin not hosted on GitHub
    Plugin 'git://git.wincent.com/command-t.git'
    " git repos on your local machine (i.e. when working on your own plugin)
    Plugin 'file:///home/gmarik/path/to/plugin'
    " The sparkup vim script is in a subdirectory of this repo called vim.
    " Pass the path to set the runtimepath properly.
    Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
    " Install L9 and avoid a Naming conflict if you've already installed a
    " different version somewhere else.
    " Plugin 'ascenator/L9', {'name': 'newL9'}
    
    " All of your Plugins must be added before the following line
    call vundle#end()            " required
    filetype plugin indent on    " required
    " To ignore plugin indent changes, instead use:
    "filetype plugin on
    "
    " Brief help
    " :PluginList       - lists configured plugins
    " :PluginInstall    - installs plugins; append `!` to update or just :PluginUpdate
    " :PluginSearch foo - searches for foo; append `!` to refresh local cache
    " :PluginClean      - confirms removal of unused plugins; append `!` to auto-approve removal
    "
    " see :h vundle for more details or wiki for FAQ
    " Put your non-Plugin stuff after this line
    
  3. Install Plugins
    • Launch vim and run :PluginInstall
    • To install from command line: vim +PluginInstall +qall

3. Problems

3.1. MacOS 下backspace键失效,不能向左删除

在默认状态下,delete(backspace)按下只会删除本次插入模式下插入的文本,这跟backspace的模式设置有关,其模式可以设置为以下三种模式:

  • 0 same as “:set backspace=” (Vi compatible)
  • 1 same as “:set backspace=indent,eol”
  • 2 same as “:set backspace=indent,eol,start”

Solving:

$ vim ~/.vimrc
" 解决插入模式下delete/backspce键失效问题
set backspace=2