linux 最强编辑器 vim 精通
vim 可以说是程序员最常用的编辑器了,主要原因是因为它高效、功能强大等优点,本文是我倾力总结的 vim 的一些最常用的一些操作,从前往后循序渐进,即适合刚上手的同学,也适合已经在使用 vim 的同学查阅。
vim 的四种模式
vim的每种模式都有其特定的作用,刚开始接触可能有点不适应,当你上手后就知道为什么要这么设计了。
- 正常模式: 启动 vim 后默认处于正常模式。不论位于什么模式,按下键(有时需要按两下)都会进入正常模式。按
:
进入命令行模式。 - 插入模式: 可以输入文本,在正常模式下,按
i、a、o
等都可以进入插入模式。 - 命令行模式:在正常模式下,按下
:
键,会进入命令模式。在命令模式中可以执行一些输入并执行一些 vim 或插件提供的指令,就像在 shell 里一样。这些指令包括设置环境、文件操作、调用某个功能等等。 - 可视模式: 正常模式下按
v
可以进入可视模式, 在可视模式下,移动光标可以选择文本。按V
进入可视行模式, 总是整行整行的选中。ctrl+v
进入可视块模式。
启动 vim
vim -d file1 file2
比较两个文件的不同,同vimdff
,后面描述;vim -R file
以只读的方式打开文件,但可以强制保存(使用感叹号保存);vim -M file
以只读的方式打开文件;vim + file
打开文件后光标跳到文件的末尾;vim +num file
打开文件后光标跳到第num行;vim +/string file
打开file,并将光标停留在第一个找到的string行上。
vim -p file1 file2 file3
打开多个文件,每个文件占用一个标签页。gT
:跳转到前一个 tabgt
:跳转到后一个 tab:tabc[lose]
关闭当前的标签页。:tabo[nly]
关闭其它的标签页。- 如果想关闭当前 Tab,用 vim 的自带命令 :q 或 :wq
不创建隐藏文件
编辑文件时不创建临时文件,不创建隐藏文件:set noswapfile
文档操作
:e file
--关闭当前编辑的文件,并开启新的文件file。 如果对当前文件的修改未保存,会看到警告。:e! file
--放弃对当前文件的修改,编辑新的文件file。:e!
-- 重新加载当前文档,并丢弃已做的改动。:e#
或ctrl+^
-- 回到刚才编辑的文件(只能在打开两个文件时,在这两个文件之间来回切换),很实用。:f
或ctrl+g
-- 显示文档名,是否修改,和光标位置。gf
-- 打开以光标所在字符串为文件名的文件。:w
-- 保存修改。:wq
-- 保存并退出。ZZ
-- 保存并退出。:x
-- 保存并退出。:q[uit]
--退出当前窗口。:saveas newfilename
-- 另存为 newfilename,原来的文件不变;:Sex
-- 水平分割一个窗口,浏览文件系统;:Vex
-- 垂直分割一个窗口,浏览文件系统;
光标的移动
注意:光标移动都是在 normal 模式下进行的。
h
或退格: 左移一个字符;l
或空格 : 右移一个字符;j
: 下移一行;k
: 上移一行;
+
或Enter
: 把光标移至下一行第一个非空白字符。-
: 把光标移至上一行第一个非空白字符。
w
: 前移一个单词,光标停在下一个单词开头;W
: 移动下一个单词开头,但忽略一些标点,只要是连成一串的就做为一个单词;
e
: 前移一个单词,光标停在下一个单词末尾;E
: 移动到下一个单词末尾,但忽略一些标点,只要是连成一串的就做为一个单词;
b
: 后移一个单词,光标停在上一个单词开头;B
: 移动到上一个单词开头,但忽略一些标点,只要是连成一串的就做为一个单词;
{
: 前移1段,只要有空行则表示为一段。}
: 后移1段,只要有空行则表示为一段。
0
: 移动到行首。^
: 移动到本行第一个非空白字符。$
: 移动到行尾。
3G
: 到文件第3行。:n
移动到第n行。:$
移动到最后一行。
H
: 把光标移到屏幕最顶端一行。M
: 把光标移到屏幕中间一行。L
: 把光标移到屏幕最底端一行。
gg
: 到文件头部。G
: 到文件尾部。
Ctrl + o
:跳转到光标上次位置Ctrl + i
:再跳回来
fy
: 表示在当前行从光标处开始,往后搜索y字符,如果搜索出结果,则跳转到y处,否则光标不移动Fy
: 表示在当前行从光标处开始,往前搜索y字符,如果搜索出结果,则跳转到y处,否则光标不移动;
: 重复如上的某一个操作。,
: 反向重复如上操作。
[{
: 跳转到当前块开始处(特指{}组成的块儿);]}
: 跳转到当前块结束处(特指{}组成的块儿);
%
: 移动到匹配的(), {}, []上。50%
: 移动到全文中部20%
: 移动到全文百分之20处80%
: 移动到全文80%处
翻屏
ctrl+f
: 下翻一屏。ctrl+b
: 上翻一屏。
ctrl+d
: 下翻半屏。ctrl+u
: 上翻半屏。
ctrl+e
: 屏幕向下滚动一行。ctrl+y
: 屏幕向上滚动一行。
zt
: 把光标所在行移动到窗口顶端zz
: 把光标所在行移动到窗口中间zb
: 把光标所在行移动到窗口底部n%
: 到文件n%的位置。
标记
使用标记可以快速移动。到达标记后,可以用Ctrl+o
返回原来的位置。 Ctrl+o
和Ctrl+i
很像浏览器上的 后退 和 前进 。
m{a-z}
标记光标所在位置,局部标记,只用于当前文件。`{a-z}
移动到标记位置。``
移动到上次编辑的位置。
:marks
显示所有标记。:delmarks a b
删除标记a和b。:delmarks a-c
删除标记a、b和c。:delmarks a c-f
删除标记a、c、d、e、f。:delmarks!
删除当前缓冲区的所有标记。
插入文本
i
: 在光标前插入I
: 在当前行第一个非空字符前插入;
a
: 在光标后插入;A
: 在当前行最后插入;
o
: 在下面新建一行插入;O
: 在上面新建一行插入;
:r filename
在当前位置插入另一个文件的内容。:[n]r filename
在第n行插入另一个文件的内容。
:r !date
在光标处插入当前日期与时间。:r !command
可以将其它 shell 命令的输出插入当前文档。
剪切、复制、粘贴、删除
x
: 剪切光标当前字符
y
: 复制在可视模式下选中的文本。yy or Y
: 复制整行文本。
y$
: 从光标当前位置复制到行尾。y0
: 从光标当前位置复制到行首。
:m,ny
: 复制m行到n行的内容。ygg
: 复制光标以上的所有行。yG
: 复制光标以下的所有行。
byw
:复制一个单词bdw
:删除一个单词
d
: 删除(剪切)在可视模式下选中的文本。
dd
: 删除当前行[n] dd
: 删除(剪切)1(n)行。:m,nd
剪切m行到n行的内容。
d$ or D
: 删除(剪切)当前位置到行尾的内容。d0
: 删除(剪切)当前位置到行首的内容d^
: 删除(剪切)当前位置到行首的非空字符内容
dgg
: 剪切光标以上的所有行。dG
: 剪切光标以下的所有行。
p
: 在光标之后粘贴。P
: 在光标之前粘贴。
多行处理(首先显示行号)
2,9 co 20
表示复制2行到9行内容,然后粘贴到20行后2,9 de
表示删除2到9行
v
从光标当前位置开始,光标所经过的地方会被选中,再按一下v结束。V
从光标当前行开始,光标经过的行都会被选中,再按一下V结束(选中一行)。Ctrl + v
从光标当前位置开始,选中光标起点和终点所构成的矩形区域,再按一下Ctrl + v
结束。
- 删除对称符号之间的内容,这些符号包括
'' "" [] () {} <>
,删除其实是保存在了寄存器里面,删除之后可以使用p命令粘贴 - 1 将光标定位到两个符号里面
- 2 命令行模式下输入
di(da)
,然后输入对应的一个符号 - 3 例如
di"
表示删除双引号间的内容,da"
表示将符号本身也删除
寄存器
a-z
:都可以用作寄存器名。"ayy
把当前行的内容放入a寄存器。A-Z
:用大写字母索引寄存器,可以在寄存器中追加内容。 如"Ayy
把当前行的内容追加到a寄存器中。:reg
显示所有寄存器的内容。""
:不加寄存器索引时,默认使用的寄存器。"*
:当前选择缓冲区,"*yy
把当前行的内容放入当前选择缓冲区。"+
:系统剪贴板。"+yy
把当前行的内容放入系统剪贴板。
查找与替换
:set ignorecase
忽略大小写搜索:set noignorecase
返回精确匹配用命令
/something
: 在后面的文本中查找something。?something
: 在前面的文本中查找something。n
: 向后查找下一个。N
: 向前查找下一个。
/something\\>
精确匹配某个关键字,"\>"
是一个特殊的记法,它只匹配一个word的结束处。
^
字符匹配一行的开头,所以"/^was"
只匹配位于一行开始的单词 was$
字符匹配一行的末尾 ,所以"/was\$"
只匹配位于一行末尾的单词 was
:noh
取消搜索出现的高亮关键字
*
向后搜索光标处的关键词,n、N在搜索到的词上来回跳动#
先前搜索光标处的关键词,n、N在搜索到的词上来回跳动
:s/old/new
-- 用new替换当前行第一个old。:s/old/new/g
-- 用new替换当前行所有的old。:n1,n2s/old/new/g
-- 用new替换文件n1行到n2行所有的old。
:%s/old/new/g
- 用 new 替换文件中所有的 old。:%s/^/xxx/g
- 在每一行的行首插入xxx,^ 表示行首。:%s/$/xxx/g
- 在每一行的行尾插入xxx,$ 表示行尾。
注意
- 所有替换命令末尾加上c,每个替换都将需要用户确认。 如:%s/old/new/gc
- 所有替换命令末尾加上i,则忽略大小写(ignore)。 如:%s/old/new/gi
排版格式化
<<
向左缩进一个shiftwidth>>
向右缩进一个shiftwidth
多行缩进:按V进入行的 visual 状态,选择多行,用>或<缩进或缩出
:ce(nter)
本行文字居中:le(ft)
本行文字靠左:ri(ght)
本行文字靠右J
拼接当前行和下一行
代码格式化,vim 格式化代码实际上就是 "缩进代码", 命令是等号=
- 全部格式化 :
gg=G
- 对当前行格式化(缩进):
==
- 选择多行后, 执行 等号命令
=
折叠功能使用插件 pseewald/vim-anyfold
zc
光标当前往上折叠一节zC
光标当前往上折叠所有zo
光标当前往上展开一节zO
光标当前往上展开所有zR
展开所有zM
折叠所有
拼写检查
:set spell
-开启拼写检查功能:set nospell
-关闭拼写检查功能
多文件同时编辑
可以一次打开多个文件,可以在编辑过程中在不同的文件之间切换
vim a.txt b.txt c.txt
:next(:n)
编辑下一个文件。:previous(:N)
编辑上一个文件。
:args
显示文件列表。Ctrl ^
在最近编辑的两个文件之间来回切换
vim -o filenames
在水平分割的多个窗口中编辑多个文件。vim -O filenames
在垂直分割的多个窗口中编辑多个文件。
分屏编辑
vim -o file1 file2
: 水平分割窗口,同时打开file1和file2vim -O file1 file2
: 垂直分割窗口,同时打开file1和file2
:split(:sp)
-- 把当前窗水平分割成两个窗口,这两个窗口显示的内容是相同的。:split filename
-- 水平分割窗口,并在新窗口中显示另一个文件。
:vsplit(:vsp)
-- 把当前窗口分割成垂直分布的两个窗口。:vsplit filename
-- 垂直分割窗口,并在新窗口中显示另一个文件。
:qall
-- 关闭所有窗口,退出vim。:wall
-- 保存所有修改过的窗口。:only
-- 只保留当前窗口,关闭其它窗口。:close
-- 关闭当前窗口。
ctrl+w ctrl+w
: 切换到下一个窗口。或者是ctrl+w w。ctrl+w p
: 切换到前一个窗口。ctrl+w h(l,j,k)
: 切换到左(右,下,上)的窗口。ctrl+w t(b)
: 切换到最上(下)面的窗口。ctrl+w H(L,K,J)
: 将当前窗口移动到最左(右、上、下)面。ctrl+w r
:旋转窗口的位置。
大小写切换
~
: 反转光标所在字符的大小写。- 可视模式下的
U
或u
把选中的文本变为大写或小写。
替换(normal模式)
r
: 替换光标处的字符,同样支持汉字。R
: 进入替换模式,按esc回到正常模式。
撤消与重做(normal模式)
[n] u
: 取消一(n)个改动。:undo 5
: 撤销5个改变。:undolist
: 你的撤销历史。ctrl + r
: 重做最后的改动。U
: 取消当前行中所有的改动。:earlier 4m
: 回到4分钟前:later 55s
: 前进55秒
宏
.
: 重复上一个编辑动作qa
:开始录制宏a(键盘操作记录)q
:停止录制a
:播放宏a,就是把刚才的键盘操作记录重新执行一遍
文件加解密
vim -x file
: 开始编辑一个加密的文件。:X
: 为当前文件设置密码。:set key=
: 去除文件的密码,然后使用wq保存退出(不能使用x保存退出)。
文件的编码
:e ++enc=utf8 filename
, 让 vim 用 utf-8 的编码打开这个文件。:w ++enc=gbk
,不管当前文件什么编码,把它转存成gbk编码。:set fenc
或:set fileencoding
,查看当前文件的编码。- 在vimrc中添加
set fileencoding=ucs-bom,utf-8,cp936
,vim会根据要打开的文件选择合适的编码。 注意:编码之间不要留空格。cp936
对应于gbk
编码。ucs-bom
对应于windows
下的文件格式。让vim 正确处理文件格式和文件编码,依赖于~/.vimrc
的正确配置
文件格式
- 有三种文件格式:
unix, dos, mac
三种格式的区别主要在于回车键的编码:dos
下是回车加换行,unix
下只有 换行符,mac
下只有回车符。 :e ++ff=dos filename
, 让vim用 dos 格式打开这个文件。:w ++ff=mac filename
, 以 mac 格式存储这个文件。:set ff
,显示当前文件的格式。- 在 vimrc 文件中添加
set fileformats=unix,dos,mac
,让 vim 自动识别文件格式。
命令行
- normal 模式下按:进入命令行模式,命令行模式下的快捷键:
- 上下方向键:上一条或者下一条命令。如果已经输入了部分命令,则找上一 条或者下一条匹配的命令。
- 左右方向键:左/右移一个字符。
- 正常模式下,q然后按
':'
,打开命令行历史缓冲区, 可以像编辑文件一样编辑命令。 q/
可以打开查找历史记录。
执行外部命令
:! cmd
执行外部命令。:!!
执行上一次的外部命令。:sh
调用 shell,用 exit 返回 vim。:r !cmd
将命令的返回结果插入文件当前位置。
:pwd
显示vim的工作目录。:cd path
改变vim的工作目录。:set autochdir
可以让vim 根据编辑的文件自动切换工作目录。
vim内置自动补全
- 开启自动补全功能(vimrc文件)
filetype plugin on
set completeopt=menuone,popup,noinsert,noselect
- 查看文档
查看自动补全文档:help ins-completion
- 关键字补全
CTRL+N
或者CTRL+P
可以启动。它会检索当前正在编辑的文件中所有的“词”,然后根据你当前在编辑的“词”进行匹配。这里“词”的概念类似英语中的单词,必须前后要有特殊的、不表意的字符隔开。 - 全能的补全
CTRL+X CTRL+O
可以启动。全能的补全Omni completion,它可以补全各种编程语言的内容。 - 命令行补全
CTRL+X CTRL+V
可以启动。这个通常是用在写Vim脚本时使用。 - 文件名补全
CTRL+X CTRL+F
可以启动。CTRL+X被称为^X模式。用这个功能,它会根据你已经输入的路径进行匹配,在打文件名的时候很方便,如果你什么路径都没输入,那么它会去当前工作目录匹配。 - 整行的补全
CTRL+X CTRL+L
可以启动。查找每一行的开头是否匹配来补全。 - 常用快捷键
Ctrl+Y 选择选中的补全内容,退出补全模式
Ctrl+E 在查找过一遍待选的补全之后发现不合适,要取消补全,按此快捷键组合
Ctrl+W 在查找过一遍待选的补全之后发现不合适,要取消补全,按此快捷键组合
二进制文件操作
vim -b datafile
- 用
xxd
把这个文件转换成十六进制,如果保存的话,会替换原文件。 :%!xxd
- 用下面的命令把它转换回来,如果保存的话,会替换原文件。
:%!xxd -r
vimrc配置
我的 .vimrc
配置内容很简单,由于经常会在服务器上操作,服务器上是大家共有的环境,所以不宜设置太多的自定义快捷键。
syntax on
set hlsearch
set incsearch
set tabstop=4
set shiftwidth=4
set softtabstop=4
set expandtab
set autoindent
其他技巧
- 一个小技巧:按8,再按i,进入插入模式,输入=, 按esc进入命令模式,就会出现8个=。 这在插入分割线时非常有用,如
30i+<esc>
就插入了36个+组成的分割线。