Vim
作为已经 29 岁(1991.11.2)的老牌文本编辑器,比“名名”年龄还大,在2019年 StackOverflow 的统计数据中仍然排在了总榜第五名,占据了25.4%的“市场”。Vim 不同于其他编辑器或者 IDE,它被称作“编辑器之神”,它小巧、启动极快、可运行在任何主流系统上、各种快捷操作、所有 Unix 或类 Unix 系统都预装了 Vi 或 Vim,而且很多编辑器、IDE 都提供 Vim 插件,学会了 Vim 可以一套快捷键走遍天下,而且可以和其他编辑器实现优势互补,编辑用 Vim,项目结构、文件结构、长得好看等用其他编辑器。Vim 学习一开始较难,一旦上手,就如神兵利器解封,助你在文本编辑披荆斩棘。
Vim 是一个纯命令操作的编辑器,它拥有不同的模式,你可以认为是不同的状态,通过在不同的模式下输入不同的命令可以实现各种文本操作的功能,包括我们对文本常用的操作如复制、黏贴、删除、新增、查找、替换等功能,各种模式下转换关系如下图所示。
比如我们用 Vim 打开一个文件,默认进入的就是正常模式
,模式之间的切换:
ESC
键总是可以切换到正常模式
,正常模式下是无法编辑文本的;不过正常模式下可以有其他操作,后面再具体展开;正常模式
进入插入模式
,即通过输入 i
或 a
或 o
键进入可编辑状态,大写的 A
光标是跳到行尾,小写的 a
是跳到下一个字符开始编辑,大写的 O
是在当前行的上一行新起一行开始编辑,小写的 o
是在当前行的下一行另起一行开始编辑,而 i
不管大小写,都是相同作用,在当前光标处开始编辑;正常模式
下按 v
或者 ctrl + v
(Mac 下是 Command + v
) 可进入 可视模式
,两种方式进入的 可视模式
操作上会所区别,具体也到下面讲;正常模式
或 可视模式
下按 :
冒号可进入 命令模式
;命令模式下可以设置 Vim
编辑器,还可以新建文件或打开其他文件或者多标签切换等;从命令模式
切回正常模式
同样按 ESC
键即可。可视模式
退回到 正常模式
需要按两次 ESC
键。接下来开始讲解 Vim
操作集合。注意,本文不涉及 Vim
的配置和相关插件安装。
“注:除正则表达式外,以下 $ 均表示在终端命令窗口操作,
:
冒号开头表示 Vim 的命令模式
。
# 在终端命令窗口打开一个文件
$ vim test.txt
# 通过按i/I/o/O/a/A均可进入编辑模式
# 编辑模式最简单,就是我们平常正常输入文本内容
i
编辑完成按 ESC
键退出 编辑模式
进入 正常模式
,正常模式
下我们可以做的事情很多:
# ------------------------------------
# 将编辑的内容更新到磁盘,即相当于 ctrl+s 保存操作,
# 先进入命令模式,输入小写 w 后回车,完成保存会重新进入正常模式
:w
# ------------------------------------
# yy 复制当前光标所在行
yy
# ------------------------------------
# 删除当前光标所在行,即相当于 ctrl+x 选中一行剪切操作
# 删除当前光标前或后一个字符用 X 和 x 来实现
# S 删除当前行,并进入编辑模式,s 删除当前字符,并进入编辑状态
dd
X
x
S
s
# ------------------------------------
# 用小写 u 撤销上一次的编辑操作,即相当于 ctrl+z
u
# ------------------------------------
# 用 ctrl+r 可以恢复撤销,即相当于 ctrl+shift+z
ctrl + r
# ------------------------------------
# 用 p 可将 yy 或者 dd 操作后的内容复制到下一行
# x 或者 X 操作后的内容复制到当前光标处
p
# ------------------------------------
# 正常模式下输入斜杠 / 或者 ? 可全文搜索你输入的关键字
# 斜杠 / 是正向往下搜索,? 是反向往上搜索你的关键字
# 或者使用 shift+* 或者 shift+# 可以自动匹配光标处的单词进行搜索
/想要搜索的内容
?想要搜索的内容
shift + #
shift + *
# ------------------------------------
# 搜索完成,可以通过按 n 向下搜索结果切换,N 是向上搜索结果切换
n
N
# ------------------------------------
# 搜索特殊的字符如 *、[、]、^、%、/、?、~、$,其中不包括空格,
# 需要在符号前面加上转义字符反斜杠 \,如搜索百分号
/\%
# ------------------------------------
# 搜索默认是区分大小写的,将 \c 加在搜索关键字后面,强制不区分大小写
# 将 \C 加在搜索关键字后面,强制区分大小写
/want to search\c
# ------------------------------------
# 正常模式下,用 gg 可以快速跳转到文件第一行
# 用 G ,即 shift+g 可以快速跳转到文件末行
# 先输入行号,再输入 gg ,可以跳转到指定行,超过文本总行,跳转到最后一行
gg
shift + g
7gg
# 正常模式下,行首行尾的跳转可以通过按 0或shift+6 和 shift + $来实现
0
shift + 6
shift+$
# ------------------------------------
# 保存并退出当前编辑文件,切换到命令模式下
:wq
基本的文本编辑就是上面的一些操作,可以随意编辑一个文本文件了。学到这里,你就基本入门了。
其他一些常用基本的跳转类操作还有比如:
# 跳回之前位置
ctrl + o
# 会回退上面的跳动
ctrl + i
# 返回上一次插入文本的地方
gi
# 返回上一个修改位置
g;
# 返回下一个修改位置
g,
# 在任意位置, 按 mx, (x可以为任意字母), 就做好了一个名字为 x 的 mark, 可用:marks查看, 也可用 `x 跳到此位置 (x为上述的任意字符)
更多跳转操作可以自己去解锁。
对于更高效的使用 vim ,我们还可以学会基本的查找替换、正则查找、文本格式化等操作。
# 查找替换操作,命令模式下
# range 为 %,表示全文查找,range不填写,option不加默认对一个源字符串查找替换
# option 可为 g、c、i,分别表示
# g(global)全局替换,c(comfirm)表示操作时需要确认, i(ignorecase)表示不区分大小写,可组合
:[range]s/源字符串/目标字符串/[option]
:%s/源字符串/目标字符串/g
:%s/源字符串/目标字符串/gc
:%s/源字符串/目标字符串/gci
:2,8s/源字符串/目标字符串/gc
# 去掉所有行尾空格和tab
:%s/\s\+$//g
vim 在搜索包括搜索替换操作支持正则表达式,对于我们常见的正则比如:
特殊符号 | 描述 |
---|---|
^ | 匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。要匹配 ^ 字符本身,请使用 \^。 |
$ | 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 也匹配或。要匹配 字符本身,请使用 \$。 |
. | 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \. |
* | 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \* |
| | 指明两项之间的一个选择 |
() | 标记一个子表达式的开始和结束位置,注意括号在vim中使用需要加\,即\( |
...... | ...... |
“在 Vim 中,正则表达式的元字符必须用反斜杠进行转义才行!默认的配置,像
. *
这种极其常用的元字符不需要转义,这个需不需要转义可以通过在vimrc中设置magic。我们也可以不在.vimrc中设置,可以动态的选择是否强制转义,如在查找命令中:
\v
: 任何元字符都不用加反斜杠\V
: 任何元字符都必须加反斜杠/\v(a.c)
: 查找任意位置的abc/acc/adc/V\(a\.c\)
: 查找任意位置的abc/acc/adc注意在 Vim 中 ?
不同于我们常用的正则,要实现非贪婪的搜索匹配:
特殊符号 | 描述 |
---|---|
* | (0 次或更多次) 贪婪匹配 |
+ | (1 次或更多次) 贪婪匹配 |
{-} | (0 次或更多次) 非贪婪匹配,同 ? |
{-n,} | (至少n次) 非贪婪匹配 |
如正常模式下下图操作所示:
更多参见: http://vimregex.com/
,包括全局命令(Global Command)的使用等。
示例:
# 删除文件中所有空行
:g/^$/ d
# 正则查找以abc开头,def结尾的字符串
/abc.*def
# 正则查找以json 微信公众号 字段信息
/"微信公众号":".\{-}"
Vim 提供了一个在 命令模式
下对 一系列连续行
执行一条 正常模式
命令的 :normal
命令,包括如批量复制,批量黏贴,批量插入、批量删除等。结合正常模式
下用于重复执行上一个执行过命令的操作 .
(点),实现多行批量操作。
normal
命令的使用格式为 :{range}norm[al][!] {commands}
,即命令模式
下,表示在 {range}
指定的范围内的每行执行若干 正常模式
下命令 {commands}
,normal
命令可以简写为 norm
,可选参数 !
表示在执行 {commands}
过程中不适用命令映射。举两个例子,比如 :normal ggdd
,即表示先跳转到文件第一行,然后删除该行。又如 :nnoremap G dd
是表示设置删除行命令取别名映射为 G
,执行 :normal G
不会跳转到文件末行,除非 :normal! G
才可以实现。
另外我们还有一个 Vim 模式没有介绍,那就是 可视模式
,进入可视模式
主要有三种方式,而且进入可视模式
只能由正常模式
下进入:
# 方式一:正常模式下输入 v,实现字符级别选择
# 方式二:正常模式下输入 ctrl + v,实现字符列选择
# 方式三:正常模式下输入 shift + v,实现行选择
接下来结合上面的 normal
、.
操作和可视模式多选操作实现高效的文本批量操作。
多行注释:
方式一(推荐)
方式二
去除注释:
比如我们在敲代码过程中发现每一行末尾都少加了分号(;
),而每一行的代码长短不一样,这个时候我们就可以用 .
命令执行上一次命令操作和结合 normal
命令实现我们的需求。
方式一:
A;
V
键进入可视模式,选中我们需要批量操作的行:
进入命令模式,输入 normal .
,即 :'<,'>normal .
,就可以实现选中行批量执行第一行的添加分号命令了方式二(推荐):
V
键进入可视模式,选中我们需要批量操作的行:
进入命令模式,输入 normal A;
,即 :'<,'>normal A;
,就可以实现选中行批量添加分号命令了“注:'<,'> 代表高亮选区的范围。在
可视模式
下选择完范围后,如果按下:
键,vim 命令行上就会自动填充:'<,'>
。
# 可视模式下选择文本,然后用=更正代码的对齐方式
V=
# == 对当前行代码对齐方式更正
==
# 可以重新格式化选中的整个段落
gq
# 多行合并为一行
方式一: 命令模式下输入 ggVGJ,ggVG 表示全选
方式二: 可视模式下选中要操作行,然后按 J
# 文本大小写转换
# 将单词小写转大写
gUw
# 将单词大写转小写
guw
# 整篇文章大写转小写
ggguG
# 整篇文章小写转大写
gggUG
# 去掉尾行^M
: %s/\r//g
更多批量高效操作,感兴趣的朋友还可以去了解 Vim 宏
。
如果想同时在一个界面里操作多个文档呢?就像浏览器一样可以有很多个页面,鼠标想点哪个页面就点哪个页面,然后进行浏览和操作呢?
# 在终端中打开多个文档
vim -p test1.txt test2.txt test3.txt
# 或者用Vim打开了一个文档test1.txt后,接着想在Vim内直接打开当前目录下的另一个文件test2.txt(命令模式下)
# 如果 test2.txt 不存在,则会创建该文件
:tabnew ./test2.txt
# 想在多个文档之间切换,循环切换查看---方式一,正常模式下
gt
# 想在多个文档之间切换,查看上一个文档---方式二,命令模式下
:tabp
# 想在多个文档之间切换,查看下一个文档---方式三,命令模式下
:tabn
# 想关闭除当前文档之外的其他文档
:tabo
# 如果打开的文档有好几十个,可以在命令模式下,用该命令来选择选中哪个文档来查看
:tabs
Vim 默认最多只能打开 10 个标签页。你可以用如 set tabpagemax=15
设置可以打开的最大标签页数目。
# vim 外部直接打开文件分屏
# O 表示垂直(左右)分割,o 表示水平(上下)分割,n表示分几个屏(可缺省不写)
vim -On [FILE_1] [FILE_2] ...
vim -on [FILE_1] [FILE_2] ...
# vim 中分屏操作
# 创建空白分屏,默认水平分隔
:new
# 打开当前文件,克隆分屏
# 水平分隔克隆
ctrl + w + s
# 垂直分隔克隆
ctrl + w + v
# 水平分隔打开任意文件
:split [FILENAME]
# 或简写
:sp [FILENAME]
# 垂直分隔打开指定任意文件
:vsplit [FILENAME]
# 或简写
:vs [FILENAME]
# 关掉除当前聚焦屏外所有分屏
:only
# 退出当前分屏
:q 或 ctrl + o
# 分屏移动切换或复制操作
:split 上下分屏,打开同一个文件
:vsplit 左右分屏,打开同一个文件
# 分屏窗口大小控制
ctrl + w + 扩大窗口
ctrl + w - 缩小窗口
ctrl + w h 跳转到左边的窗口
ctrl + w j 跳转到下边的窗口
ctrl + w k 跳转到上边的窗口
ctrl + w l 跳转到右边的窗口
ctrl + w t 跳转到最顶上的窗口
ctrl + w b 跳转到最顶下的窗口
# Vim挂起:当不想要关闭当前文档,但是想进入[终端]输入一些命令的时候,可以在[命令模式]下:
:shell
# 进入终端了,然后操作完你的命令了,想回到之前编辑的文档界面(注意你当前在终端里):
exit
以前在 Windows 系统的时候,喜欢编辑完后按 Ctrl+s
来保存文档,这是个很好的习惯,但是在 Vim 中却不是了,因为这个操作在正常模式下会让你的 Vim 锁住,光标啥的都移动不了了,那么怎么来解锁呢?
# 正常模式下锁住 Vim
ctrl+s
# 解锁 Vim
ctrl + q
Vim 是很强大的,利用插件可以实现很高大上的功能,但是上面的所说都是基于默认的 Vim,没有任何插件的,这小节所说的字符串自动补全也是一样,这个在做 Linux 下程序开发的时候很实用。
# 在插入模式下
ctrl + n
“注:这种代码补全方式是基于 vim 当前打开的所有文件的相关字符串,而不是真正的比如某种变成编译的内置函数之类可以自动找到并补全。
对于一些二进制文件, 比如网络传输中我们要对接收到的数据进行字节分析,又比如分析码流文件如 h264 文件等,都需要查看二进制内容,vim 也提供二进制文件的查看和编辑功能:
# 打开一个h264二进制文件,加-b选项
vim -b test.h264
# 打开是乱码,需要切换到十六进制模式显示
# 切换到16进制显示状态后,可以修改16进制值,但是右边的乱码是修改无效的
:%!xxd -g 1
# 修改后需要切换回二进制模式,即乱码的状态,才能保存修改的内容
:%!xxd -r
# 保存
:w
vimrc
常用配置本文并不打打算将 Vim 配置为一个 IDE,而仅仅是一个文本编辑器,这一节所涉及的 .vimrc
常用配置和状态栏美化也比较简单,我们先了解下插件管理器
和插件
的概念,Vim
可以支持很多外部插件,比如代码补全插件、颜色主题插件等,插件管理起
顾名思义就是管理插件
的。本质上插件管理器
其实也是一个插件,只是它的功能就是管理其他插件。常见的插件管理器有 Pathogen
、Vundle
和 Vim-plugin
。本节涉及到的状态栏美化需要借助插件管理起来安装美化插件。
这里示例一个流行的状态栏美化插件 vim-airline
安装。
插件管理器
Vundle$ git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/plugin/Vundle.vim
$ git clone https://github.com/vim-airline/vim-airline ~/.vim/bundle/vim-airline
打开 .vimrc
文件,在第一行开始输入:
set nocompatible " be iMproved, required
filetype off " required
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" 将插件放入插件管理器中
Plugin 'vim-airline/vim-airline'
call vundle#end()
filetype plugin indent on " required
" 永远显示状态栏
set laststatus=2
" 支持 powerline 字体
let g:airline_powerline_fonts = 1
命令模式下:
:PluginInstall
这样就将状态栏美化插件配置好了。如果遇到 airline
状态栏上无法正常显示图标和三角形箭头符号,需要下载安装字体: https://github.com/ryanoasis/nerd-fonts 的 patched-fonts
中下载你喜欢的的字体。比如 patched-fonts/Hermit/Medium/complete/Hurmit Medium Nerd Font Complete.otf
字体。这里仅展示如何在 Cygwin
中安装字体:
配置主题是为了赏心悦目,试过在如 VS Code
中使用 Vim
插件,有部分高级功能无法正常使用,虽然结合 VS Code
也是比较漂亮的,但不好用这一点就有点遗憾了,需要插件开发者去解决相关问题。比较经典流行的主题有:
molokai
:https://github.com/tomasr/molokai.gitgruvbox
:https://github.com/morhetz/gruvbox.gitsolarized
:https://github.com/altercation/vim-colors-solarized.git配置这些主题不需要用到 Vundle 这类插件管理器。直接克隆下来,将对应主题中 colors
目录下的 {主题名}.vim
,文件放于 ~/.vim/colors/
目录中,然后在 ~/.vimrc
中配置主题即可:
syntax enable
" 主题配置了 gruvbox 的暗色主题,还有亮色主题 light
set background=dark
colorscheme gruvbox
set t_Co=256
到这里主题就配置成功了。接下来我们配置一些编码过程中常用的 .vimrc
配置。
vimrc
常用配置Vim 的全局配置为 /etc/vim/vimrc
或者 /etc/vimrc
,对所有用户生效。当前用户的配置为 ~/.vimrc
。对于单词生效的配置,我们可以在命令模式
下设置即可,比如你想要临时关闭行号显示 : :set nonu
。而 vimrc
文件是 Vim 编辑器的全局配置,且每次打开 Vim 都起作用。一般配置项都可以设置关闭
和打开
,比如开启行号显示set number
,关闭行号显示set nonumber
,即在开启
项前加no
即可。在 vimrc
配置文件中 双引号 "
表示注释。如下就是一些常用的配置项:
" =============================================================
" 这里是 Vundle 插件配置
" =============================================================
set nocompatible " be iMproved, required
filetype off " required
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" 将插件放入插件管理器中
Plugin 'vim-airline/vim-airline'
" Plugin 'vim-airline/vim-airline-themes'
call vundle#end()
filetype plugin indent on " required
" 永远显示状态栏
set laststatus=2
let g:airline_powerline_fonts = 1 " 支持 powerline 字体
if !exists('g:airline_symbols')
let g:airline_symbols = {}
endif
" 右边状态栏分割符号为 <
let g:airline_symbols.linenr = ''
let g:airline_symbols.maxlinenr = ''
let g:airline#extensions#tabline#enabled = 1
let g:airline#extensions#tabline#fnamemod = ':~'
let g:airline#extensions#tabline#fnamecollapse = 0
" =============================================================
" 这里是主题配置
" =============================================================
syntax enable
set background=dark
" gruvbox/molokai/solarized
colorscheme solarized
" 启用256色,否则主题无法生效
set t_Co=256
" =============================================================
" 这里是常用配置
" =============================================================
" 凸显当前行
set cursorline
" 语法高亮
set syntax=on
" 自动缩进
set autoindent
" Tab键的宽度
set tabstop=4
" 统一缩进为4
set softtabstop=4
set shiftwidth=4
" 使用空格代替制表符
set expandtab
" 在行和段开始处使用制表符
set smarttab
" 显示行号
set number
" 操作历史记录数
set history=1000
" 禁止生成临时文件
set nobackup
" 不创建交换文件
set noswapfile
"搜索字符高亮
set hlsearch
" 搜索时,每输入一个字符,就自动跳到第一个匹配的结果
set incsearch
" 搜索时忽略大小写
"set ignorecase
" 语言设置
set langmenu=zh_CN.UTF-8
set helplang=cn
" 侦测文件类型
filetype on
" 高亮显示匹配的括号
set showmatch
" 为C程序提供自动缩进
set smartindent
" 高亮tab,保存后将tab替换为空格
highlight WhitespaceEOL ctermbg=red guibg=red
match WhitespaceEOL /\s\+$/
autocmd BufWritePre * :%s/\s\+$//e
" 自动切换工作目录,即打开哪个文件,就切到到当前文件目录
set autochdir
set backspace=indent,eol,start
" 设置编码最长80字符提示条
set cc=80
" 超过长度自动折行
set wrap
" 在底部状态栏显示命令模式下命令
set showcmd
" 使用utf编码
set encoding=utf-8
" 出错时,不发出提示音
set noerrorbells
" 编辑同一个文件,外部发生改变时,做出提示
" 如果遇到不生效,可以用 :e 刷新,重新加载
set autoread
整合前面的状态栏配置和主题配置,最后的效果就是:
要想熟悉 Vim 的各种快捷操作,需要经常使用 Vim,并且多探索尝试更加高效的操作,去反复尝试它,自然而然你使用 Vim 实现文本编辑的效率会越来越高。
上面的操作是可以让一个程序员足够快的开发项目的,更多的 Vim 技能解锁,需要我们不断折腾和使用,解锁的技能就越多。
最后附上一张 Vim 键盘操作备忘汇总图:
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有