Vim 常规教程
vim 入门到进阶
vim 有四种使用模式
- 编辑模式, 按
ESC
切换 - 写入模式, 在编辑模式 按
a
i
切换 - 可选模式, 在编辑模式 按
v
V
切换 - 命令模式, 在编辑模式 按
:
切换
编辑模式
vim newtext.txt # bash命令下,如果当前没有文件则会新建一个空文件.
:e /home/alice/newtext.txt # vim 命令模式下打开文件.
:w ... # 写入文件
:q ... # 退出文件
:q! ... # 强制退出文件,修改文件但未保存会有提示,强制退出则不提示.
:wq ... # 保存并退出文件,加!可强制保存退出.
/ xxx # xxx是字符串, 寻找字符串,n 或 N 上下查询.
. # 重复上一次的操作
编辑文件
[插入] 在编辑模式下输入 | |
---|---|
A |
光标前 输入 |
a |
光标后 输入 |
i |
行首 输入 |
I |
行尾 输入 |
o |
上一行 输入 |
O |
下一行 输入 |
[修改] 在编辑模式下输入 | |
---|---|
R |
修改整行 内容 |
r |
修改单个 字符 |
g~ |
反转大小写 |
gu |
转换为小写 |
gU |
转换为大写 |
[缩进] 在编辑模式下输入 | |
---|---|
> |
增加缩进 |
< |
减小缩进 |
= |
自动缩进 |
[删除] 在编辑模式下输入 | |
---|---|
x |
删除光标字符,向后 删除 |
X |
删除光标字符,向前 删除 |
dd |
删除整行 |
`d | [删除] 在编辑模式下输入 |
--------------------------- | ----------------------------------- |
x |
删除光标字符,向后 删除 |
X |
删除光标字符,向前 删除 |
dd |
删除整行 |
删除光标后 的字符 |
|
d0 |
删除光标前 的字符 |
dG |
删除光标至文件尾 的字符 |
dgg |
删除光标至文件首 的字符 |
n dd |
n 代表数字,代表向光标下删除多少行 |
[复制] 在编辑模式下输入 | |
---|---|
yy |
复制整行 |
y$ |
复制光标后 的字符 |
y0 |
复制光标前 的字符 |
yG |
复制光标至文件尾 的字符 |
ygg |
复制光标至文件首 的字符 |
n yy |
n 代表数字,代表向光标下复制多少行 |
]y |
指令快速将选定的文本复制到系统剪贴板 |
[粘贴] 在编辑模式下输入 | |
---|---|
p |
向后 粘贴 |
P |
向前 粘贴 |
ddp |
剪切整行 |
注: |
被删除的字符会在缓存内,可以粘贴删除的字符,相当于剪切 |
+p |
将系统剪切板粘贴, 在写入模式下快捷键: Ctrl +r + |
*p |
将X11主剪切板粘贴 |
[恢复] 在编辑模式下输入 | |
---|---|
u |
恢复上一次操作 |
Ctrl +r |
重做 |
# 通过在.vimrc中进行如下设置来启用持久性撤销。
:set undofile
# 不过,这会在系统中为每个被编辑过的文件保留一个撤销历史记录文件,显得有些混乱。也可以将这些文件保存在同一个目录中,配置如下所示。
# 为所有文件设置持久性撤销
set undofile
if !isdirectory("$HOME/.vim/undodir")
call mkdir("$HOME/.vim/undodir", "p")
endif
set undodir="$HOME/.vim/undodir"
查询文件
[查找] 在编辑模式下输入 | |
---|---|
/ 字符串 |
n 向下搜索,N 向上搜索 |
. |
重复 上一次操作 |
* |
查询相关单词,n 下一个,N 上一个 |
*nn |
会遍历完所有的匹配项,从而跳回到本次查找的起点 |
可选模式
Vim的可视模式(visual mode)支持文本的任意选择(通常用于执行某些操作)。如果需要选择的文本不属于已定义的文本对象(单词、句子和段落等),则这个模式非常有用。进入可视模式有以下几种方式。
一旦进入可视模式,读者可以通过常用的移动命令来移动光标,从而扩展选择范围。
[选择文本] | |
---|---|
v |
进入字符可视模式(状态栏标文本--VISUAL-- ) |
V |
进入行可视模式(状态栏标识文本--VISUAL LINE-- ) |
Ctrl +v |
组合键进入块可视模式(状态栏标识文本--VISUAL BLOCK-- ) |
gv |
重选上次高亮选区 |
注释
根据语法注释,这里主要是批量注释。Ctrl
+ v
进入块选择模式,然后移动光标选中你要注释的行,再按大写的 I
进入行首插入模式输入注释符号如 //
或
#
,输入完毕之后,按两下 ESC
,Vim 会自动将你选中的所有行首都加上注释,保存退出完成注释。
取消注释:Ctrl
+ v
进入块选择模式,选中你要删除的行首的注释符号,注意 //
要选中两个,选好之后按 d
即可删除注释,ESC
保存退出。
输入模式
[移动] 在输入模式操作 | |
---|---|
h |
左移一列 |
l |
右移一列 |
j |
下移一列 |
k |
上移一列 |
命令模式
[行号] 命令模式下输入 | 全称 | |
---|---|---|
set nu | set number | 打开行号 |
set nonu | set nonumber | 关闭行号 |
颜色
可以尝试其中一种配色主题,方法是输入:colorscheme
Vim 8自带如下主题配色。
[颜色] 命令模式下输入 | |||||
---|---|---|---|---|---|
blue | darkblue | default | delek | desert | elflord |
evening | industry | koehler | morning | murhpy | pablo |
peachpuff | ron | shine | slate | torte | zellner |
折叠
需要在.vimrc文件中将foldmethod设置为indent,设置代码如下。
set foldmethod=indent
不要忘记重新加载~/.vimrc
,方法是重启Vim或在Vim中执行:source $MYVIMRC
命令。将foldmethod设置为自动类型(如indent)会默认将所有文件折叠。
输入za
可切换折叠状态(打开关闭的折叠或关闭打开的折叠)。输入zR
和zM
分别用于同时打开和关闭所有折叠。
设置折叠方式的方法为在.vimrc
文件中加入set foldmethod=<折叠方法>
。
- manual:手动折叠,这种方法对于长文本而言并不适用。
- indent:基于缩进的折叠,这对于依赖缩进的编程语言非常合适(不管哪种语言,标准的编码风格中总是会采用某种一致性的缩进。因此,当读者想要快速隐藏不关心的代码时,indent折叠方式不失为一种高效率的选择)。
- expr:基于正则表达式的折叠。如果读者想要用复杂的规则来定义折叠,那么可以选择这种方式。
- marker:使用文本中特殊的标记来定义折叠,比如{{{和}}}。这种方法对于管理很长的.vimrc文件非常有效,但是在Vim之外不常用,因为这种方式需要修改文件内容。
- syntax提供了可识别语法的折叠,但它并非对所有语言都开箱即用(不支持Python)。
- diff:当Vim处于diff模式时会自动采用这种折叠方式,diff模式下需要展示两个文件的不同之处,而相同之处往往需要隐藏起来
替换
: 1,$s/word1/word2/gc
或 : %s/word1/word2/gc
从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !且在取代前显示提示字符给用户确认 (confirm) 是否需要取代!,如果将命令后的c不写,则不需要用户确认。
打开
编辑一个目录时(如用:e .
命令打开当前目录),实际上打开的是Netrw
。
通过Netrw,读者可以在工作区中看到所有的文件。虽然Netrw已经在顶部的状态栏中列出了几个常用的快捷键,但是下面的几个主要功能键还是需要了解一下。
命令 | 说明 |
---|---|
Enter |
用于打开文件和目录 |
- |
进入上一层目录 |
D |
删除一个文件或目录 |
R |
重命名一个文件或目录 |
: edit . |
打开文件管理,并显示当前目录,可缩写: e . |
: Explore |
打开文件管理,并显示活动缓冲区所在的目录 |
Netrw的窗口也可以在分割窗口或标签页中打开。
命令 | 说明 |
---|---|
: Vex |
以左右分割方式打开Netrw |
: Sex |
以上下分割方式打开Netrw |
: Lex |
以左右分割方式打开Netrw,当前Netrw窗口位于最左边,且高度占满整个屏幕 |
% |
表示该缓冲区位于当前窗口中 |
a |
表示该缓冲区处于活动状态,即它已被加载并可见 |
line 30 |
表示当前光标位置 |
: b 1 |
返还指定缓存文件。命令中的空格可以省略,得到简化版的命令:b1 |
1 |
为缓冲区编号,在整个Vim会话中,它的值保持不变 |
2 |
保存 |
3 |
退出 |
4 |
缓存区文件 |
5 |
多文件 |
6 |
组合文件 |
7 |
比较文件 |
8 |
资源管理器 |
"xxxxx" |
"xxxx"为文件名 |
分屏
使用如下命令将窗口分割成两个,其中一个显示新的文件。
命令 | 说明 |
---|---|
: split file |
上下分割, split命令可以简化为: sp . 或者快捷键: Crtl +w ,s |
: vsplit file |
左右分割,:vs 是:vsplit的简化版. 或者快捷键:Crtl +w ,v |
切换
为了使光标能在不同窗口间移动,先按Ctrl
+w
组合键,然后输入一个方向键:h
、j
、k
、l
中的一个或键盘方向键。
移动
窗口命令的快捷键都要先按Ctrl
+w
组合键,后面跟一个大写的方向键(H
、J
、K
和L
中的一个),当前窗口会被移动到相应的位置。
命令 | 说明 |
---|---|
Ctrl +w ,w 组合键 |
在窗口之间循环切换 |
Ctrl +w ,H 组合键 |
将当前窗口移动 到屏幕的最左边 |
Ctrl +w ,J 组合键 |
将当前窗口移动 到屏幕的底部 |
Ctrl +w ,K 组合键 |
将当前窗口移动 到屏幕的顶部 |
Ctrl +w ,L 组合键 |
将当前窗口移动 到屏幕的最右边 |
Ctrl +w ,= 组合键 |
使所有窗口等宽 ,等高 |
Ctrl +w ,_ 组合键 |
最大化活动窗口的高度 |
Ctrl +w ,` |
`组合键 |
N Ctrl +w ,_ 组合键 |
把活动窗口的高度设为N 行 |
N Ctrl +w ,` |
`组合键 |
使用Ctrl
+w
,r
组合键将当前行或当前列(行优先于列)中的每个窗口的内容向右或向下移动。使用Ctrl
+w
,R
组合键则以相反的方向执行类似的操作。
· 使用Ctrl
+w
,x
组合键将当前窗口与下一个窗口的内容交换(如果当前窗口是最后一个,则与前一个交换)。
关闭
- 使用
Ctrl
+w
,q
组合键关闭当前窗口。 - 使用
: q
命令关闭窗口并卸载缓冲区;不过,当只有一个窗口打开的时候,这会导致退出Vim。 - 使用
Ctrl
+w
,c
组合键关闭活动窗口 - 使用
: bd
命令删除当前缓冲区,并关闭当前窗口。 - 使用
Ctrl
+w
,o
合键(或: only
,或: on
命令)关闭除当前窗口之外的所有窗口。 - 当打开了多个窗口时,可通过
: qa
命令关闭所有窗口并退出。也可以结合: w
命令,即: wqa
,它会先保存所有打开的文件,再退出Vim。
终端
进入终端模式的命令如下。
进入终端模式的命令如下 | |
---|---|
: terminal |
: terminal 命令可简化为: term |
在Shell中执行程序 | |
---|---|
:! ls |
ls 是shell自带的程序,再按Enter键返回 |
:shell |
进入shell,exit 返回, 或者 Ctrl +d |
批量修改
:%s/AAA/BBB/g # 批量将AAA转换为 BBB
管理员写入
是不是经常会忘了使用sudo命令而重新配置文件, 而这个方法就是专门处理这个问题的.
:w !sudo tee % > /dev/null
tee
程序将以sudo
权限运行,也就是说它拥有写/etc/hosts 文件的权限,在 Vim 命令行中,% 符号具有特殊含义。它会展开成当前文件的完整路径.
:tee/你的文件 > /dev/null
这条命令会把缓冲区的内容当作标准输入,并用它来覆盖你的文件的内容。
批量插入
Ctrl
+v
,jj$
A
;
Esc
常用命令
packloadall | 加载所有插件 |
---|---|
silent! helptags ALL | 为所有插件加载帮助文档 |
syntax on | 支持语法高亮显示 |
filetype plugin indent on | 启用根据文件类型自动缩进 |
set autoindent | 开始新行时处理缩进 |
set expandtab | 将制表符Tab展开为空格,这对于Python尤其有用 |
set tabstop=4 | 要计算的空格数 |
set shiftwidth=4 | 用于自动缩进的空格数 |
set backspace=2 | 在多数终端上修正退格键Backspace的行为 |
colorscheme murphy | 修改配色 |
set nocompatible | 与Vi不兼容 |
syntax on | 语法高亮 |
set autoindent | 沿用上一行缩进 |
set autoread | 从磁盘自动重载文件 |
set backspace=indent,eol,start | 现代编辑器的退格键行为 |
set belloff=all | 禁用错误报警声 |
set cscopeverbose | 详细输出cscope结果 |
set complete-=i | 补全时,不要对当前被包含的文件进行扫描 |
set display=lastline,msgsep | 显示更多消息文本 |
set encoding=utf-8 | 设置默认编码 |
set fillchars=vert:|,fold: | 分隔字符 |
set formatoptions=tcqj | 更直观的自动格式化 |
set fsync | 调用fsync()实现更健壮的文件保存 |
set history=10000 | 最大的历史记录数 |
set hlsearch | 搜索结果高亮显示 |
set incsearch | 搜索时边输入边搜索、并移动光标 |
set langnoremap | 避免出现映射崩溃的情况 |
set laststatus=2 | 总是显示状态栏 |
set listchars=tab:>\ ,trail:-,nbsp:+ | :list时一些特殊字符的显示 |
set nrformats=bin,hex | 对 |
set ruler | 在状态栏角落里显示当前行位置信息 |
set sessionoptions-=options | 不同会话不共享选项 |
set shortmess=F | 文件信息少显示一些 |
set showcmd | 在状态栏中显示最后一条命令 |
set viminfo+=! | 为多个会话保存全局变量 |
set sessionoptions-=options | 不同会话不共享选项 |
set tabpagemax=50 | -p选项能够打开的最大数目的标签页 |
set tags=./tags;,tags | 用于搜索标签的那些文件名 |
set ttimeoutlen=50 | 按键序列中等待下一个的时间,单位为毫秒 |
set ttyfast | 要求实现快速的终端连接 |
set wildmenu | 增强命令行补全功能 |
按键
命令的重映射。
Vim支持将某些键映射为其他键,:map和:noremap提供了这样的功能。
- :map 用于递归映射。
- :noremap 用于非递归映射。
- :nmap和:nnoremap用于编辑模式。
- :vmap和:vnoremap用于可视和选择模式。
- :xmap和:xnoremap用于可视模式。
- :smap和:snoremap用于选择模式。
- :omap和:onoremap用于操作待决模式。
- :map!和:noremap!用于写入和命令行模式。
- :imap和:inoremap用于写入模式。
- :cmap和:cnoremap用于命令行模式。
这意味着经:map重映射的命令可以识别自定义映射,而:noremap则针对系统默认映射。
决定创建一个新映射时,最好先确认一下此键或按键序列是否已经被映射为其他用途了。内置的按键绑定列表可通过:help index命令查看。而:map命令则可以查看插件和读者自定义的映射。比如,:map g将显示所有以g键开头的映射。
比如,在.vimrc文件中将按如下方式自定义映射。
如果想显式移除自定义或插件定义的映射,可使用:unmap命令。还有一个重要选项是:mapclear,它会将读者定义的映射和默认映射都清除掉。
你还可以在映射中使用特殊字符和命令,比如下列代码。
"noremap <C
-u
> :wCtrl
-u
>来保存文件(u表示更新)
上述例子中,Ctrl
+u
组合键。Vim中的Ctrl
修饰符表示为
· Alt
键加上某个键,比如Alt
+b
组合键。
· <s-_>表示Shift
键加某个键,比如Shift
+f
组合键。
注意,命令后面接Enter
键)。如果没有按Enter键,则命令虽然输入了,却不会被执行,读者会停留在命令行模式下(除非读者希望如此)。
另外,这里还列出一些可能用得上的特殊字符。
表示空格。 表示Esc键。 和 表示Enter键。 表示制表符Tab键。 - bs表示退格键。
、 、 和 表示箭头键。 、 表示上下翻页键。 ~ 表示12个功能键。 、 、 和分别表示Home、Insert、Delete和End键。
你还可以将一个键映射为
禁止箭头键功能,使自己习惯hjkl风格
- map
- map
- map
- map
插图
相关连接
Vimhelp_txt.pdf 提取码:GnTt