
学习Vim
学习Vim
光标的移动
移动光标
单位级
h
向左一字符j
下一行k
上一行l
向右一字符
单词级
w
orW
向右移动到下一单词开头e
orE
向右移动到单词结尾b
orB
向左移动到单词开头
注意:所有小写单词都是以分词符作为单词界限,大写字母以空格作为界限
块级
gg
到文档第一行G
到文档最后一行0
到行首(第 1 列)^
到该行第一个非空白字符$
到行尾Ctrl-d
向下移动半页Ctrl-u
向上移动半页:<N>
or<N>gg
跳转到第 N 行:+<N>
or<N>j
向下跳 N 行:-<N>
or<N>k
向上跳 N 行
注意:所有命令前都可以加一个数字 N,表示对后面的命令执行 N 次,例如你想向下移动 3 行,除了可以用 :+3
之外,还可以用 3j
来实现同样的效果。另外,上面实际上有两种命令:一种是键入后立即执行的,比如 gg
;还有一种是先输入 :
的,这类命令需要在输入完成后按回车执行。
打开文件、查找内容
打开文件
在 Vim 中打开文件
:e <filename>
打开名为 filename 的文件,若文件不存在则创建之:Ex
在 Vim 中打开目录树,光标选中后回车打开对应文件(提示:-
进入上级目录)- 将光标定位到文件名的任意位置上,直接敲键盘
gf
查找
文档内查找
*
向后查找光标当前所在单词#
向前查找光标当前所在单词/<search>
向后查找指定字符串?<search>
向前查找指定字符串n
继续查找下一个N
继续查找上一个
注意: n
和 N
是有方向性的,若你之前通过 *
查找,则 n
会继续向文档尾方向查找,N
向文档首方向;反之,若你通过 #
查找,则 n
指向文档首,N
指向文档尾
匹配查找
Vim 中可以使用 %
对 (
和 )
,[
和 ]
,{
和 }
进行匹配查找,当光标位于其中一个
符号上时,按下 %
,光标会跳到与之匹配的另外一个符号上。
buffer
简单理解buffer 就是当前 Vim session 的文件历史记录。
现在你的 buffer 中应该已经有两个文件了,你可以用
:buffers
或:ls
命令查看,看到buffer 列表了吧,大概是这个样子的:
:ls
1 #h "file-one.md" line 47
2 %a "file-two.md" line 1
Press ENTER or type command to continue
接下来你可以尝试通过以下命令在文件缓存中进行跳转了
:bn
打开缓存中下一个文件:bp
打开缓存中上一个文件:b<N>
打开缓存中第 N 个文件你也可以使用
:bdelete<N>
来删除所要关闭的缓冲区,缩写:bd<N>
。
文档的修改与保存
修改文档
控制光标、打开文件、切换文件、并在文件中查找内容,这些操作都是在 Vim 的 normal模式下进行的。现在,是时候进入 Vim 的另外一种模式 —— insert 模式,学习一下如何修改文件了。
插入
i
当前字符前插入a
当前字符后插入
注意:以上两个命令都会使 Vim 进入 insert 模式,进入该模式后光标会发生变化,这时输入的文字会直接出现在文档中,按 Esc
键或 Ctrl-[
或 Ctrl-C
退出 insert 模式。
删除(并保存到 Vim 剪贴板)
x
删除当前字符,相当于 insert 模式下的Delete
X
删除前一个字符,相当于 insert 模式下的Backspace
dd
删除当前行,并将删除的内容保存到 Vim 剪贴板d<X>
删除指定内容并保存到 Vim 剪贴板
说明: <X>
部分是对操作内容的描述,如果要删除一个单词,就输入 dw
或者 de
,要复制当前位置到行尾的内容,就输入 y$
,要删除后面 3 个字符并插入,就输入 c3l
诸如此类。
复制
yy
复制当前行到 Vim 剪贴板y<X>
复制指定内容到 Vim 剪贴板
粘贴
p
在当前位置后粘贴P
在当前位置前粘贴
合并
J
将当前行与下一行合并
替换
r<X>
将当前字符替换为 Xgu<X>
将指定的文本转换为小写gU<X>
将指定的文本转换为大写:%s/<search>/<replace>/
查找 search 内容并替换为 replace 内容
撤销、重做
u
撤销Ctrl-r
重做
保存文件
:w
保存当前文件:wa
保存全部文件:wq
orZZ
保存并退出:q!
orZQ
强制退出,不保存:saveas <new filename>
文件另存为:w <new filename>
文件另存一份名为<new filename>
的副本并继续编辑原文件
一些小技巧
简单设置 Vim
“工欲善其事,必先利其器”。尽管 Vim 非常强大,但默认配置的 Vim 看起来还是比较朴素的,为了适合我们的开发需求,要对 Vim 进行一些简单的配置。
:set number
显示行号:set relativenumber
显示相对行号(这个非常重要,慢慢体会):set hlsearch
搜索结果高亮:set autoindent
自动缩进:set smartindent
智能缩进:set tabstop=4
设置 tab 制表符所占宽度为 4:set softtabstop=4
设置按tab
时缩进的宽度为 4:set shiftwidth=4
设置自动缩进宽度为 4:set expandtab
缩进时将 tab 制表符转换为空格:filetype on
开启文件类型检测:syntax on
开启语法高亮
这里列出的是命令,你可以通过在 Vim 中输入进行设置,但这种方式设置的参数只在本次关闭 Vim 前生效,如果你退出 Vim 再打开,之前的设置就失效了。
若要永久生效,需要修改 Vim 的一个自动配置文件,一般文件路径是 /home/<user>/.vimrc
(Linux系统)或 /Users/<user>/.vimrc
(Mac OS 系统)
如果没有就新建一个,以 Mac OS 系统为例:
cd ~
vim .vimrc
现在你已经在 Vim 中打开了你的 Vim 专属配置文件,将上面提到的配置复制到你的文件中,记得要删除每行开头的
:
修改完成执行
:wq
或者ZZ
保存退出,再次进入 Vim 时,你的这些配置就已经生效了
重复上一次命令
Vim 有一个特殊的命令 .
,你可以用它重复执行上一个命令。
缩进
>>
向右缩进当前行<<
向左缩进当前行
自动排版
==
自动排版当前行gg=G
当前文档全文自动排版<N>==
对从当前行开始的 N 行进行自动排版=<N>j
对当前行以及向下 N 行进行自动排版=<N>k
对当前行以及向上 N 行进行自动排版
分屏与标签页
窗口分屏
工作中经常会遇到这种情况,就是需要参照其他文档编辑当前文档(场景:翻译),或者从另外一个文档copy 代码到当前文档(场景:复制 html 元素类名到 css 文档),这时候就是你最需要分屏的时候。
分屏方式
:split
缩写:sp
orCtrl-w s
上下分屏:vsplit
缩写:vs
orCtrl-w v
左右分屏:diffsplit
缩写:diffs
diff 模式打开一个分屏,后面可以加上 {filename}
窗口跳转
Ctrl-w w
激活下一个窗口Ctrl-w j
激活下方窗口Ctrl-w k
激活上方窗口Ctrl-w h
激活左侧窗口Ctrl-w l
激活右侧窗口
移动分屏
Ctrl-w L
移动到最右侧Ctrl-w H
移动到最左侧Ctrl-w K
移动到顶部Ctrl-w J
移动到底部
注意:区分大小写。另外,可以将底部的屏幕移动到右侧,实现上下分屏到左右分屏的转换。
屏幕缩放
Ctrl-w =
平均窗口尺寸Ctrl-w +
增加高度Ctrl-w -
缩减高度Ctrl-w _
最大高度Ctrl-w >
增加宽度Ctrl-w <
缩减宽度Ctrl-w |
最大宽度
标签页
创建标签页
:tabnew
or:tabedit
缩写:tabe
打开新标签页Ctrl-w gf
在新标签页中打开当前光标所在位置的文件名
注意::tabnew
和 :tabedit
后面都可以跟一个 <空格><文件名> 用以在新标签页中打开指定文件,还可以在 :
后面加一个数字,指出新标签页在列表中的位置(从 0 开始)。
切换标签页
gt
or:tabnext
缩写:tabn
下一个标签页(最后一个会循环到第一个)gT
or:tabprevious
缩写:tabp
上一个标签页(第一个会循环到最后一个):tabrewind
缩写:tabr
or:tabfirst
缩写:tabfir
到第一个:tablast
缩写:tabl
到最后一个标签页
关闭标签页
:tabclose
缩写:tabc
关闭当前标签页:-tabc
关闭上一个标签页:+tabc
关闭下一个标签页:tabonly
缩写:tabo
关闭其他标签页
本文章修改自dofy/learn-vim