通常来说精通 VIM 的人非常少,精通需要花费大量的时间熟悉和使用,但是一旦熟悉后编码速度会得到非常大的提升,可以极大的摆脱鼠标的依赖,而且对于经常需要 ssh 和跟 linux 打交道的人来说,只能熟悉 vim,没有别的选择.这里并不提供入门也不提供高级进阶,只是记录一些常用的操作(希望能涉及常用的 99%).


模式
首先需要清楚 VIM 具有四种编辑模式:
NORMAL
:正常模式,此模式下可以输入命令.INSERT
:插入模式,此模式下可以编辑文本.VISUAL
:可视化模式,此模式下移动光标可选择文本.REPLACE
:替换模式,此模式下的输入会替换文本.
当前所处的模式都会在 VIM 底部看到,按 ESC 键就会返回到 NORMAL 模式,可在 NORMAL 模式下进入其它模式.
光标移动
w
,W
:跳到下一个单词的开头(小写包括标点).e
,E
:跳到下一个单词的结尾(小写包括标点).b
,B
:跳到上一个单词开头(小写包括标点).(
:上一句.)
:下一句.{
:上一段(空白行).}
:下一段(空白行).^
:当前行的开始.$
:当前行的行尾.gg
:文档的第一行.G
:文档的最后一行.
窗口切换
切换 split
ctrl + ww
: 切换上一个 splitctrl + w + h
: 切换左边 splitctrl + w + l
: 切换右边 splitctrl + w + j
: 切换下边 splitctrl + w + k
: 切换上边 split
切换 panel(tab)
gt
: 切换右边 panelgT
: 切换左边 panelngt
: 切换右边第 n 个 panelngT
: 切换左边第 n 个 panel:tabn
: 切换下一个 panel:tabp
; 切换上一个 panel:tabn [n]
: 切换到下一个的第 n 个 panel:tabp [n]
; 切换到上一个的第 n 个 panel
打开新文件
:tabe /path/file
: 打开一个新 tab 并编辑此文件vs
: 垂直分屏vs /path/file
: 垂直分屏并打开文件sp
: 水平分屏sp /path/file
: 水平分屏并打开此文件:e#
: 回到上一个文件(当你在当前 tab 打开文件编辑完成后想要回退回去)
翻页
ctrl-f ctrl-b
:整页翻页(f 就是 forword b 就是 backward)ctrl-d ctlr-u
:翻半页(d=down u=up)ctrl-e ctrl-y
:滚一行zz
让光标所在的行居屏幕中央zt
让光标所在的行居屏幕最上一行 t=topzb
让光标所在的行居屏幕最下一行 b=bottom
删除(剪切)
使用d
会将删除的字符放入缓冲区,可以使用p
粘贴出来.
d
:删除(剪切)v 模式下选中的块.dd
:删除(剪切)当前行,ndd
删除 n 行.d^
:删除(剪切)至行首.d$
:删除(剪切)至行尾,同D
.dw
:删除(剪切)一个 word.dG
:删除(剪切)至档尾.dl
:删除光标右边字符.dh
:删除光标左边字符.dj
:删除光标当前行和下面一行.dk
:删除光标当前行和上面一行.(n)d
:n 是行数,比如10d
说明是删除当前行开始的 10 行.:1,10d
:删除 1 到 10 行.:11,$d
:删除 11 行开始的所有行.:1,$d
:删除所有行.df
:删除当前行中指定字符(包括此字符)的内容,比如dfn
删除光标开始到 n 字符的位置中间所有内容.dt
:基本与上面类似(不包含此字符).
拷贝
y
:在使用 v 模式选定了某一块的时候,复制选定块到缓冲区用;yy
:复制整行(nyy 或者 yny ,复制 n 行,n 为数字);y^
:复制当前到行头的内容;y$
:复制当前到行尾的内容;yw
:复制一个 word (nyw 或者 ynw,复制 n 个 word,n 为数字)yG
:复制至档尾(nyG 或者 ynG,复制到第 n 行,例如 1yG 或者 y1G,复制到档尾)yiw
:复制当前光标坐在位置的单词viwy
:同上p
:粘贴拷贝的内容.
搜索
/
:正常模式下按下/
再输入需要搜索的字符串,回车后会在当前位置向下搜索.n
是搜索上一个,shift+n
或者N
反向查找.?
:和上面的一样,只是会向上查找.f[letter]
:寻找当前行遇到的字符.t[letter]
:与f
相同,但光标在此字符之前.:noh
: 取消搜索后的高亮显示匹配块
使用f
, t
搜索出结果后可以使用以下按键来来回跳转
;
: 跳转到下一个结果,
: 跳转到上一个结果
注意 f/t 都是行内搜索
编辑
o
:当前行的下一行新开一行.O
:当前行的上一行新开一行.A
:当前行的尾部追加内容.i
:游标前插入内容.I
:行首插入.cc
:删除游标所在的行,然后进入编辑模式.cw
:删除游标所在的单词,然后进入编辑模式.C
:删除从游标所在的位置到行尾的字符,然后进入编辑模式.u
:撤销最后的改变.U
:还原当前行的内容.v
: 进入选择模式V
: 选中当前光标所在行,使用 jk 移动选择多行.gi
: 进入上一次插入模式的位置.r
: 替换当前光标所在字符.R
: 连续替换字符
CTRL+[
相当于 ESC,如果 ESC 键坏了那么这个你会用得上.
替换
替换是 vim 的强项, 因为可以用正规表达式来匹配字符串.以下提供几个例子.
:s/aa/bb/g
将光标所在行出现的所有包含 aa 的字符串中的 aa 替换为 bb:%s/aa/bb/g
将文档中出现的所有包含 aa 的字符串中的 aa 替换为 bb:12,23s/aa/bb/g
将从 12 行到 23 行中出现的所有包含 aa 的字符串中的 aa 替换为 bb:12,23s/^/#/
将从 12 行到 23 行的行首加入 # 字符:%s= *$==
将所有行尾多余的空格删除:g/^\s*$/d
将所有不包含字符(空格也不包含)的空行删除.
也可以逐个替换,比如替换文本中所有的var
:
- 搜索 var:
/var
- 按下:
cgn
- 输入你想替换的值
- 完成后回车,替换下一个值可以点击
.
键. - 跳过则点击
n
键
文件操作
:w
:写入文件.:w!
:写文件忽略警告信息.:wq
:写文件后退出.ZZ
:退出编辑器,如果文件有改动,则保存再退出.:x
:退出编辑器,如果文件有改动,则保存再退出.:e!
放弃所有修改, 重新从磁盘加载文件.:e
:不保存退出.:n
:编辑地下一行.
标签
m[letter]
: 设置当前行的标签,比如ma
.'[letter]
: 跳转到此标签处,比如'a
.
[letter]如果是小些字母,那么代表是文件内部的标签,大写字母就是所有文件的标签
跳转
我们可以很方便的在文件中进行跳跃,而不需要使用 hjkl 简单的移动.
gd
: 跳转到定义处.CTRL-O
: 跳转到光标之前的位置.CTRL-I
: 跳转到光标最新到位置.TAB
: 与CTRL-I
相同.
下面两个只能在当前文件中可用,无法跨文件
- 双反引号: 光标可以在当前位置与上一个位置跳转来回跳转.
''
: 与上面的相同,只是在两个位置行的行首之前跳转.
vim 对于 jump 过的位置记录条数的最多的是 100 个
更多的用法可以输入:help jumplist
折叠
zj
: 移动光标到下一个折叠处zk
: 移动光标到上一个折叠处za
: 切换光标处折叠状态zo
: 打开光标处的折叠zO
: 打开光标处的所有折叠zc
: 关闭光标处的折叠zC
: 关闭光标处的所有折叠zm
: 将 foldlevel 增加 1zM
: 关闭所有折叠zr
: 将 foldlevel 减少 1zR
: 将 foldlevel 减少到 0zd
: 删除光标处的折叠zE
: 删除所有折叠[z
: 移动到折叠处的开始位置]z
: 移动到折叠处的结束位置
可视化选择
我们可以使用v
和V
选择多行, 然后可以做以下事情:
J
、gJ
→ 把所有的行连接起来(变成一行)<
或>
左右缩进=
自动给缩进
Text Object
文本对象(Text Object)操作是成为一个 vim 高手的必经之路,如果你足够熟练,还可以达到令人眼花缭乱的地步...
TextObject 文本对象
w
: words
: sentencep
: paragraph'
: single quote"
: double quotet
: tag(
: small bracket[
: middle bracket{
: big bracket
上面给出英文是因为当你使用 VIM 的时候最好是能快速联想到对应的操作,比如操作一个 word 时候你可以快速按下w
而不是想到中文"单词"
Range 范围
i
: innera
: all
Command 操作
d
: deletev
: selectc
: change
使用
以下面为例:
The text is an example by Obeta(zhouyuexie).
删除单词example
,命令格式为<Command><Range><TextObject>
:
daw
: 包括删除单词前面的空格diw
: 只删除单词dw
: 省略 Range 会默认删除到单词后到空格
其余到类似,更多使用可以查看Vim Text Objects: The Definitive Guide
.vimrc 配置
下面使用了一些 vim 基本配置,你可以直接 copy 使用,也可以点击这里下载一份我目前觉得最好到配置,然后根据自己的需求习惯来更改,解压后将.vimrc
与.vim
文件放入到你自己的根目录,放入后随便使用 vim 打开一个文件,输入:PlugInstall
进行安装插件.
" 显示行号
set number
" 显示标尺
set ruler
" 历史纪录
set history=1000
" 输入的命令显示出来,看的清楚些
set showcmd
" 状态行显示的内容
set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}
" 启动显示状态行1,总是显示状态行2
set laststatus=2
" 语法高亮显示
syntax on
set fileencodings=utf-8,gb2312,gbk,cp936,latin-1
set fileencoding=utf-8
set termencoding=utf-8
set fileformat=unix
set encoding=utf-8
" 配色方案
syntax enable
" 指定配色方案是256色
set t_Co=256
" 不折叠
set nofoldenable
" set foldenable " 自动折叠
set wildmenu
" 去掉有关vi一致性模式,避免以前版本的一些bug和局限,解决backspace不能使用的问题
set nocompatible
set backspace=indent,eol,start
set backspace=2
" 启用自动对齐功能,把上一行的对齐格式应用到下一行
set autoindent
" 依据上面的格式,智能的选择对齐方式,对于类似C语言编写很有用处
set smartindent
" vim禁用自动备份
set nobackup
set nowritebackup
set noswapfile
" 用空格代替tab
set expandtab
" 设置显示制表符的空格字符个数,改进tab缩进值,默认为8,现改为4
set tabstop=2
" 统一缩进为4,方便在开启了et后使用退格(backspace)键,每次退格将删除X个空格
set softtabstop=2
" 设定自动缩进为4个字符,程序中自动缩进所使用的空白长度
set shiftwidth=2
" 设置帮助文件为中文(需要安装vimcdoc文档)
set helplang=cn
" 显示匹配的括号
set showmatch
" 文件缩进及tab个数
au FileType html,python,vim,javascript setl shiftwidth=2
au FileType html,python,vim,javascript setl tabstop=2
au FileType java,php setl shiftwidth=2
au FileType java,php setl tabstop=2
" 高亮搜索的字符串
set hlsearch
" 检测文件的类型
filetype on
filetype plugin on
filetype indent on
" C风格缩进
set cindent
set completeopt=longest,menu
" 功能设置
" 去掉输入错误提示声音
set noeb
" 自动保存
set autowrite
" 突出显示当前行
set cursorline
" 突出显示当前列
"set cursorcolumn
"设置光标样式为竖线vertical bar
" Change cursor shape between insert and normal mode in iTerm2.app
"if $TERM_PROGRAM =~ "iTerm"
let &t_SI = "\<Esc>]50;CursorShape=1\x7" " Vertical bar in insert mode
let &t_EI = "\<Esc>]50;CursorShape=0\x7" " Block in normal mode
"endif
" 共享剪贴板
set clipboard+=unnamed
" 文件被改动时自动载入
set autoread
" 顶部底部保持7行距离
set scrolloff=7
每行前面加了"
的说明是已经被注释的.(以上配置设计到一些插件,因此别直接 copy,根据自己的需要来获取是最好的.)
懒人配置
对于懒人来说每次都要自己配置那么多,这是非常难受的,因此这里推荐一个开箱即用的配置vimrc
安装方法也很简单:
git clone --depth=1 https://github.com/amix/vimrc.git ~/.vim_runtime
sh ~/.vim_runtime/install_awesome_vimrc.sh
其它问题
粘贴代码后会出现格式混乱
原本格式: line line line 粘贴后: line line line
解决方案有两种:
- 粘贴前打开粘贴模式
:set paste
,粘贴完成后关闭粘贴模式:set nopaste
- 在.vimrc 中增加一个函数来自动实现第一个的操作,可以直接参考这里,注意对于 tmux 需要使用最下面的方式,而 window10 里的 linux 子系统无法设置,只能用第一个方法.