说明
:command: 命令
keyword: 快捷键
帮助 使用内置帮助(built-in help) 使用 vim 的内置帮助是一个好习惯(虽然很多朋友更喜欢在网上搜索相关的使用方法)。查看帮助的语法如下表格所示:
**前缀 **
**例子 **
**说明 **
:
:help :w
有关 :w 命令的帮助
none
:help j
有关“j”键在正常模式上下文中的帮助
v_
:help v_J
有关在上下文中使用“J”键到视觉模式的帮助
i_
:help i_<Esc>
有关在上下文中使用“Esc”键插入模式的帮助
/
:help /\n
有关搜索模式“\n”的帮助
make
命令
说明
:make
内置命令编译项目
:cl
显示编译错误信息
:cc + 数字
跳转编译错误位置
:cp/:cn
向前/向后导航
copen
打开 quickfix 窗口来查看编译信息
快捷键 命令行 上移动光标时最常用的键命令行上移动光标时最常用的键: C: ctrl; S: shift
命令
说明
<Left>
左移一个字符
<Right>
右移一个字符
<S-Left> 或 <C-Left>
左移一个单词
<S-Right> 或 <C-Right>
右移一个单词
<C-B> 或 <Home>
命令行行首
<C-E> 或 <End>
命令行行尾
<C-W>
删除光标前整个单词
<C-U>
删除命令行上全部文字,从而让你从头开始。
注意
<S-Left> (光标左移键和 Shift 键同时按下) 和 <C-Left> (光标左移键和 Control 键同时按下) 并非在所有键盘上都有效。其它 Shift 和 Control 组合键也是这种情况。
编辑 刷新文件 命令 在 vim 打开一个文件,在另一个地方修改了文件
:e重新加载文件
:e!强制丢掉本地修改,从磁盘加载文件
配置自动刷新 vim提供了自动加载的选项 autoread,默认关闭。
在vimrc中添加 set autoread即可打开自动加载选项,相关选项:
:help 'autoread'
:help timestamp
:help FileChangedShell
:help :checktime
另外,vim使用tag进行切换时,如果当前文件修改未保存,会提示需保存后才能跳转。 在vimrc中添加
可使切换文件时,修改的文件被自动保存。
撤销 关闭文件再重新打开时,无法撤回历史动作。以下配置可以实现持久化undo记录
1 2 3 set undofile " 配置你的undo保存路径 set undodir=~/.vim/undodir
十六进制 二进制打开文件
vim 的 -b 选项是告诉vim打开的是一个二进制文件,不指定的话,会在后面加上 0x0a ,即一个换行符
十六进制查看
返回正常的格式:
分组:
命令
说明
:%!xxd -g 1
表示每1个字节为1组
:%!xxd -g 2
表示每2个字节为1组(默认)
:%!xxd -g 4
表示每4个字节为1组
man xxd
获得xxd的帮助文件
无权限保存 在编辑系统文件或者受权限保护的文件的时候,很容易会忘记在 vim 编辑之前添加 sudo,这样将会以只读模式打开文件,也就是编辑后不能保存。
但是这时候,你可能已经对文件做了一些修改(尚未保存),很显然,强制退出不是一个好选择。
非文件所有者保存时提示没有权限,为了避免丢失原有的改动,可以使用以下命令。其中实现原理也很简单,可以参考这里
键入此命令后,将要求您输入sudo命令的密码,然后文件就可以保存了。
注:我们应该使用 sudoedit 命令而不是 sudo vim 来编辑需要超级用户权限的文件。
我们将上述命令拆解来看下:
命令
说明
:w
这是写入命令。由于没有给出参数,vim 将把整个文件写入标准输出;
!sudo
将 sudo 命令作为 shell 命令而不是 vim 命令运行;
tee
tee命令用于读取标准输入并将其写入标准输出或文件;
%
vim 将其替换为您正在编辑的当前文件的名称。
:w 命令将整个文件写入 STDOUT(标准输出);然后,我们使用sudo命令(因为我们编辑的毕竟是一个系统文件)来获得临时权限。
百分号(%)表示文件名,tee 命令从 STDOUT 获取 vim 的输出并将其写入 % 文件。
这基本上适用于 <Vim's STDOUT> | sudo tee /etc/ssh/sshd_config,有点复杂…
缩进 快捷键
快捷键
说明
>>
向右给它进当前行
<<
向左缩进当前行
=
缩进当前行 (和上面不一样的是,它会对齐缩进)
=%
把光标位置移到语句块的括号上,然后按=%,缩进整个语句块(%是括号匹配)
G=gg或gg=G
缩进整个文件(G是到文件结尾,gg是到文件开头)
粘贴代码保留缩进 我们都有过在互联网上复制代码的时候。当将代码粘贴到文件中时,缩进都给弄乱了,这时候需要怎样做呢?
为了避免这种情况,请在 .vimrc 文件中添加以下代码:
对 vimrc 文件进行如上更改后,在粘贴代码之前按 F2 键,这样做将确保代码粘贴正确的缩进。
以正确的缩进深度开始书写 假设光标在第一行第一列,但是所要写的内容需要缩进,那在不按下制表符(tab)和空格键的情况下,应该怎样做呢?
答案是在正常模式下按下 S 键。
当光标位于行的第一列时,按 Esc 键进入正常模式。然后按 S(大写)键,这会将光标移动到适当的缩进深度,并自动进入“插入”模式,以便开始键入。
光标移动
快捷键
说明
Ctrl + O
向后回退你的光标移动
Ctrl + I
向前追赶你的光标移动
Ctrl + ^
跳转至先前编辑过的buffer
保存文件前显示差异 我们可能遇到过这样的情况:我修改了这个文件,但是忘记都做了哪些修改了,并且我担心其中有些地方可能修改错了。
解决此问题的方法是查看缓冲区和文件之间的差异。可在 vim 中执行如下命令:
我们将上述命令拆解来看:
命令
说明
:w
用于保存/写入,在这个特定场景中,如果命令中没有指定文件名,则输出将写入STDIN(标准输入)文件;
:!<command>
是执行 shell 命令的语法,在这个例子中,我们在 shell 中运行 diff 命令;
%
表示未修改的当前文件的名称;试试这个::!echo %
-
是 diff 命令的 STDIN 文件。
因此,该命令首先将所有[未保存]内容写入STDIN文件。然后diff命令读取当前文件(%)并将其与STDIN(-)文件进行比较。
这个命令大致等同于这个shell命令:diff <original-file> <Vim's STDOUT>
显示拼写错误 我们应该都使用过 Microsoft word,其拼写检查器在拼写错误的单词下会有一条红色的波浪线。
vim 也内置了拼写检查器,但默认情况下是关闭的。我们可以使用如下命令启用它:
这样,你可能会看到拼写错误的单词被突出显示,其突出显示的方式取决于你的 vim 颜色方案。我在拼写错误的单词下面有一条白色下划线,如下图所示:
要将这设置为 vim 的默认,可在 .vimrc 文件中添加如下配置:
使用 vim 打开文件的同时将光标定位在某一行 默认情况下,我们使用 vim 打开文件,光标总会在第一行。在某些时候,我们希望光标能够定位在我们指定的某一行,而不是第一行。
可以通过使用 +n(n为行号)选项来实现这一点,当然前提是你需要知道打开的文件总行数应大于或等于 n,如下:
在插入模式下删除文本 我们都知道,在正常模式(normal mode)下,可以使用 d 和 x 键删除文本,那么在插入模式下如何执行相同的操作(比如 dd)呢?
以下是常用的一些方案:
快捷键
说明
ctrl + w
删除前一个单词(字)(相当于正常模式下的 db)
ctrl + h
删除前一个字符
ctrl + u
删除当前行所有前面的字符(相当于正常模式下的 d0 )
ctrl + k
删除当前行中所有主要字符(相当于正常模式下的 d$)
重新加载.vimrc 文件 输入下面任一命令重载 ~/.vimrc::so $MYVIMRC 或者 :source ~/.vimrc
:so[urce]! {file} 这个 vim 命令会从给定的文件比如 ~/.vimrc 读取配置。就像你输入的一样,这些命令是在普通模式下执行的。当你在 :global、:argdo、 :windo、:bufdo 之后、循环中或者跟着另一个命令时,显示不会再在执行命令时更新。
分屏与标签页 分屏
命令
说明
:He[xplore]
把当前窗口上下分屏,并在下面进行目录浏览. (在下边分屏浏览目录)
:He[xplore]!
把当前窗口上下分屏,并在上面进行目录浏览. (在上边分屏浏览目录)
:Ve[xplore]
左右分屏(在左边分屏间浏览目录)
:Ve[xplore]!
左右分屏(在右边分屏间浏览目录)
分屏同步移动
命令
说明
:set scb
让两个分屏中的文件同步移动, 要到需要同步移动的两个屏中都输入如下命令 (相当于使用“铁锁连环”)
:set scb!
需要解开,那么就输入下面的命令
注:set scb 是 set scrollbind 的简写
分页
命令
说明
:Te[xplorer]
像Chrome这样的分页式的浏览
gt
到下一个页
gT
到前一个页
{i}gt
i是数字,到指定页,比如:5 gt就是到第5页
:tabm {n}
切换Tab页
:tabs
查看现在打开的窗口和Tab的情况
:tabclose
[i] 如果后面指定了数字,那就关闭指定页,如果没有就关闭当前页
vim -p <files>
如果你在Shell命令行下,你可以使用 vim 的 -p 参数来用Tab页的方式打开多个文件, 如: vim -p *.cpp
:bufdo tab split
把buffer中的文件全转成Tab页
分屏方式
:split 缩写 :sp or Ctrl-w s 上下分屏
:vsplit 缩写 :vs or Ctrl-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 | 最大宽度
缓冲区
命令/快捷键
说明
:ls or :buffers
查看缓冲区
:b[uffer] <n>:b[uffer] <filename>
打开缓冲区n/<filename>
:bn[ext]
切换到下一个缓冲区
:bp[revious]
切换到上一个缓冲区
:bl[ast]
切换到最后一个缓冲区
:bf[irst]
切换到最前一个缓冲区
buffer 标记说明
标记
说明
–
(非活动的缓冲区)
a
(当前被激活缓冲区)
h
(隐藏的缓冲区)
%
(当前的缓冲区)
#
(交换缓冲区)
=
(只读缓冲区)
+
(已经更改的缓冲区)
Quickfix
命令
说明
:cope[n]
打开quickfix
:cw[indow]
如果有错误, 则打开quickfix; 如果没有错误且quickfix开启, 则关闭quickfix
:cp
跳到上一个错误
:cn
跳到下一个错误
:cl
列出所有错误
:cc
显示错误详细信息
字符相关 字符改变
快捷键
说明
guu或是 Vu
把一行的文字变成全小写
gUU 或是 VU
把一行的文件变成全大写
v
进入选择模式,然后移动光标选择你要的文本, 按u转小写,按U转大写
ga
查看光标处字符的ascii码
g8
查看光标处字符的utf-8编码
gf
打开光标处所指的文件 (这个命令在打到#include头文件时挺好用的,当然,仅限于有路径的)
* 或 #
在当前文件中搜索当前光标的单词
显示隐藏的特殊字符 你是否在 Python、YAML等要求严格缩进格式的文件中遇到过问题?检查之后,发现文档的内容都是正确的,除了缩进,因为其中有一行是缩进了3个空格,而不是4个空格。
这种情况经常发生。大多数IDE允许我们查看特殊字符,并能识别行尾、空格和制表符。vim 不亚于其他任何IDE,它也可以显示那些隐藏的字符。
Vim中的隐藏字符 vim 中的隐藏字符可以被认为是“空格”。以下是 vim 为了更好的易读性而隐藏的字符:
字符
含义
eol
行尾(end of line)
tab
trail
换行符前的空格
extends
最后一列中的字符,表示下一行是换行的延续
precedes
第一列中的字符,表示此行是前一行的延续
conceal
nbsp
空格字符
显示隐藏字符 要临时显示隐藏字符,可使用如下命令:
临时显示隐藏字符后,如果想再次将隐藏字符隐藏,可使用如下命令:
如上图所示,启用 list 选项来显示隐藏字符后,文本区域会看到有 $ 字符,表示换行符。
要 永久 显示换行符,可将如下命令添加到 vimrc 文件中:
更改隐藏字符 当打开隐藏字符的可见性时,vim有一个预先定义的字符集合,如上图所示,换行符由美元符号 $ 表示。
但是如果你不想要美元符号呢?如果你想要一个不同的字符来表示换行符呢?
以下是设置隐藏字符的一个例子:
1 :set listchars=eol:^,tab:-,trail:!,extends:>,precedes:<
上面的例子中,设置显示行尾(eol)的字符在 eol: 后面键入即可。
如上图所示,我复制了空格并将其粘贴在行尾,它们显示为感叹号 !,同时,行尾字符由 $ 变为了 ^。
如果要永久使用上述设置,可将下面的命令添加到 vimrc 文件中:
1 set listchars=eol:^,tab:-,trail:!,extends:>,precedes:<
将所有空格转为制表符(或者反过来) 我们都喜欢使用制表符(tab)或者空格,但是,如果我们正在编辑的文本其缩进使用的符号正好与我们的习惯相反,该怎么办?
将所有空格转换为制表符 如果当前文件使用空格缩进文本,希望将它们转换为制表符时,需要运行如下两个 vim 命令:
1 2 :set noexpandtab :retab!
这样做会将所有空格转换为其等效的制表符。如果文档使用两个空格作为缩进宽度,它们将转换为1个制表符。如果 4 个空格用作单个缩进宽度时,这 4 个制表位将替换为 1 个制表字符。
将所有制表符转换为空格 如果要编辑的文件使用制表符缩进,并且要将制表符转换为空格,则需要运行如下4个 vim 命令:
1 2 3 4 :set expandtab :set tabstop=4 :set shiftwidth=4 :retab
第一个命令(expandtab)告诉 vim 使用空格展开 tab,第二个命令(tabstop)设置使用多少个空格用作一个“缩进块”。
在我们的例子中,我们定义了“1个tab=4个空格”;当使用>>运算符时,shiftwidth 命令用于控制缩进,这也被设置为4个空格。
最后,retab 命令将所有制表符(用于缩进)转换为空格。
正则表达式 先来看一个现实的问题,如果在 Vim 中,将正则表达式中定义的大量元字符原封不动地引用(就像 perl),势必会给使用正常编辑功能的人造成困扰。比如 /foo(1) 命令,按照正则表达式来理解会是搜索 foo1 字符串。而在大多数人编辑器中应该是搜索 foo(1) 字符串。
Vim 毕竟是一个编辑器,于是在 Vim 中规定,正则表达式的元字符必须用反斜杠进行转义(和大多数正则表达式对转义符的定义正好相反)。如果上面的例子要用正则表达式搜索,就应写成 /foo\(1\) 。但是,像 . * 这种极其常用的元字符,都加上反斜杠就太麻烦了。而且,众口难调,有些人喜欢用正则表达式,有些人不喜欢用…
为了解决这个问题,Vim 设置了 magic 变量。简单地说,magic 就是设置哪些元字符要加反斜杠哪些不用加的。 简单来说:
magic (\m):除了 $ . * ^ 之外其他元字符都要加反斜杠
nomagic (\M):除了 $ ^ 之外其他元字符都要加反斜杠
这个设置也可以在正则表达式中通过 \m \M 开关临时切换。 \m 后面的正则表达式会按照 magic 处理, \M 后面的正则表达式按照 nomagic 处理,并忽略实际的 magic 设置。
例如:
1 2 /\m.* # 查找任意字符串 /\M.* # 查找字符串 .* (点号后面跟个星号)
另外还有两个包含全部的命令。
\v (即 very magic):任何元字符都不用加反斜杠
\V (即 very nomagic):任何元字符都必须加反斜杠
例如:
1 2 3 4 /\v(a.c){3}$ # 查找行尾的 abcaccadc /\m(a.c){3}$ # 查找行尾的 (abc){3} /\M(a.c){3}$ # 查找行尾的 (a.c){3} /\V(a.c){3}$ # 查找任意位置的 (a.c){3}$
Vim 默认设置是 magic,也推荐大家都使用 magic 的设置。有特殊需求时,直接通过 \v \m \M \V 中的一种定义即可。
Vim 中设定 magic 变量:
1 2 3 :set magic " 设置magic :set nomagic " 取消magic :h magic " 查看帮助
基本元素 本文下面使用的字符都是默认(magic)模式下的,在其他模式下请自行转义。
常用的元字符
元字符
意义
.
匹配任意一个字符
[abc]
匹配方括号中的任意一个字符。也可以用 - 表示范围
[a-z0-9]
匹配小写字母和阿拉伯数字中的一个字符
[^abc]
匹配除方括号中字符之外的任意一个字符
\(abc\)
分组匹配,将 abc 放入 1 中
\d
匹配阿拉伯数字,等同于 [0-9]
\D
匹配阿拉伯数字之外的任意字符,等同于 [^0-9]
\x
匹配十六进制数字,等同于 [0-9A-Fa-f]
\w
匹配单词字母,等同于 [0-9A-Za-z_]
\W
匹配除单词字母之外的任意字符,等同于 [^0-9A-Za-z_]
\t
匹配 <TAB> 字符
\s
匹配空白字符,等同于 [ \t]
\S
匹配非空白字符,等同于 [^ \t]
\a
匹配所有的字母字符。等同于 [a-zA-Z]
\l
匹配小写字母 [a-z]
\L
匹配非小写字母 [^a-z]
\u
匹配大写字母 [A-Z]
\U
匹配非大写字幕 [^A-Z]
注解
用 \( 和 \) 进行分组匹配,在分组后面可以使用 \1 、 \2 等变量来访问分组的内容(注意:\0 表示匹配的所有内容),最多保存一行中的 9 个分组。这种形式实际上是将分组中的内容保存到特殊的空间(保留缓冲区)中。
1 2 3 4 # 原字符串 That or this # 替换后的字符串 this or That :%s/\(That\) or \(this\)/\2 or \1/
量词
元字符
意义
*
匹配 0 个或多个
\+
匹配1个或多个(匹配优先)
\? 或 \=
0 个或 1 个,\? 不能在 ? 命令中使用
\{n,m}
匹配 n 个到 m 个
\{n,}
匹配最少 n 个
\{,m}
匹配最多 m 个
\{n}
匹配 n 个
注解
用于限定数量的元字符不仅可用于字符,也可以用于分组等模式。举例如下:
表示位置的符号
元字符
意义
$
匹配行尾,如 tail$ 只匹配位于一行结尾处的 tail
^
匹配行首,如 ^head 只匹配位于一行开头处的 head
\<
匹配以某些字符开头的单词,\<ac 只匹配以 ac 开头的单词,如 action
\>
匹配以某些字符结尾的单词,ad\> 只匹配以 ac 开头的单词,如 head
非贪婪匹配 正则表达式中有贪婪匹配和非贪婪匹配两种,Vim 默认开启贪婪匹配。如果想使用非贪婪匹配,可以使用 \{-} 代替 * 、 + 等量词。
1 2 3 4 字符串:ahdbjkbkls a.*b # 匹配 ahdbjkb a.\{-}b # 匹配 ahdb
常用的一些匹配命令
替换markdown文件中代码块的代码语言
1 :'<,'>s/^```\s*\(\n^\S\+\)/```bash\1/g
将蛇形风格转化为小驼峰
%s!\(\<\|_\)\([a-z]\)!\U\2!g
删除论文中作者的上标
正则表达式进阶 4种Magic模式
magic 模式,使用\m前缀,其后模式的解释方式为’magic’选项。^,$,.,*和[]等字符含有特殊意义;而+、?、()、和{}等其它字符则按字面意义解释。magic为默认设置,表达式中的\m前缀可以省略
no magic 模式,使用\M前缀,其后模式的解释方式为’nomagic’选项。除了^和$之外的特殊字符,都将被视为普通文本
very magic 模式,使用\v前缀,其后模式中除 ‘0’-‘9’,’a’-‘z’,’A’-‘Z’ 和 ‘_’ 之外的字符都当作特殊字符解释
very nomagic 模式,使用\V前缀,其后模式中只有反斜杠(\)具有特殊意义
不同模式之间的区别,在于哪些特殊字符需要使用反斜杠(\)进行转义。例如星号(*),在magic和very magic模式下视为特殊修饰符;而在no magic和very nomagic模式下则被视为普通字符,必须使用 \* 恢复其特殊作用。
对于简单的正则表达式,使用 \ 对特殊字符进行转义,可能并不会造成困扰;但在复杂的正则表达式中,对大量特殊字符的重复转义,将使得表达式过于繁琐且难以阅读。
例如在默认的magic模式下, 使用以下命令查找十六进制色彩值. 其中,使用()构建捕获组 ; 使用{}匹配6位和3位十六进制值。因为有多种特殊字符需要进行转义,造成表达式过于冗长:
1 /\m#\(\x\{6\}\|\x\{3\}\)
而使用very magic模式,则可以简化表达式:
4种Magic模式的差异和用法,可以简单总结如下:
以下表格,列示了常用特殊字符在不同模式下的应用。其中,黄色高亮表示为无需转义的特殊字符:
请注意,“{}”也可简写为“{}”;“[]”必须仅保留开头的反斜杠;“()”则需要完整的两个反斜杠。
magic默认模式 建议始终将‘magic’ 选项保持在缺省值。
建议在模式之前,通过使用“\v“或“\M“等前缀,来明确激活特定模式。
如果希望始终使用Very magic模式,那么请在vimrc中定义以下键盘映射,将在查找和替换时自动激活very magic模式:
1 2 3 4 nnoremap / /\v vnoremap / /\v cnoremap %s/ %s/\v nnoremap :g/ :g/\v
模式转换 你甚至可以在表达式当中改变模式。例如以下命令,开头使用very magic模式,之后转换为magic模式,整体表达式将匹配“foo(bar)”:
当然,非常不建议采用此种易引起误解的表达式写法。我们可以将其改写为very nomagic模式:
请使用以下命令,查看更多帮助信息:
转义符(Escaped Characters) 如果需要查找某些特殊符号(比如美元符号),那么可以使用反斜杠backslash(\)进行转义。
\.
匹配点(A literal period)
\\
匹配反斜杠(A literal backslash)
\/
匹配斜杠(A literal forward slash)
\^
匹配脱字符(A literal carat)
\$
匹配美元符号(A literal dollar sign)
根据对于特殊元字符的不同解释方式,Vim正则表达式可以分为四种模式:magic,no magic,very magic和very nomagic。
特殊字符元素(Special Character Atoms)
含义
\a
大小写字母字符 [a-zA-Z]
\A
除了a-zA-Z以外的字母字符
\b
<BS>
\d
数字字符(digit) [0-9]
\D
非数字字符 [^0-9]
\e
<ESC>
\f
由isfname选项定义的文件名字符
\F
由isfname选项定义的文件名字符,但是不包含数字
\h
单词的头字符(A-Za-z)
\H
不是单词的头字符(A-Za-z)
\i
由isident选项定义的字符
\I
由isident选项定义的字符,但是不包括数字
\k
由iskeyword选项定义的关键字字符
\K
由iskeyword选项定义的关键字字符,但是不包括数字
\l
小字字符 [a-z]
\L
非小写字符 [^a-z]
\n
行尾符(The end of line character)
\o
八进制数字
\O
非八进制数字
\p
由isprint选项定义的可打印字符
\P
由isprint选项定义的可打印字符,但是不包括数字
\r
<CR>
\s
空白符 <Space> 和 <Tab> [ ]
\S
非空白符 [^ ]
\t
<Tab>
\u
大写字母字符 [A-Z]
\U
非大写字母字符 [^A-Z]
\w
单词字符(0-9A-Za-z)
\W
非单词字符
\x
十六进制数字 [0-9a-fA-F]
\X
非十六进制数字 [^0-9a-fA-F]
\~
匹配最后指定的字符串
或操作(Alternation Operator) |用于查找两个或是多个可能的匹配。例如表达式foo\|bar可以找到foo或是bar。我们可以连接使用多个或操作符。例如表达式Larry\|Moe\|Curly将找到Larry、Moe和Curly。而表达式end\(if\|while\|for\)则可以匹配”endif”, “endwhile” 和 “endfor”几个不同的元素组合。
如果希望匹配多次,那么可以组合使用加号和括号运算符。例如表达式/\(foo\|bar\)\+可以匹配 “foo”, “foobar”, “foofoo”, “barfoobar”等等。
捕获组(Regex-Groups) ()用于保证需要作为整体而组合出现的字符。例如表达式a\(XY\)*b将会匹配ab, aXYb, aXYXYb, aXYXYXYb。
逆向引用(Back Reference)表达式\n,用于引用之前定义的第n个捕获组。其中n为数字1–9。
例如对于文本“he fly fly flies”,表达式\(fly\) \1将匹配“fly fly”。因为\1再次引用了第一个捕获组“fly”,所以将匹配2个“fly”。
捕获组嵌套 以下文本中包含FIRSTNAME LASTNAME格式的姓名信息:
1 2 Prepared by Tommas Young Prepared by Tommy Young
使用以下命令,可以将其转换为LASTNAME, FIRSTNAME格式:
1 2 3 :%s/\(Tom\%(mas\|my\)\) \(Young\)/\2, \1/g Prepared by Young, Tommas Prepared by Young, Tommy
从以上命令可以看到,捕获组是可以嵌套的;\%(\) 指定的组将不会被计数,这可以允许我们使用更多的组,并且查找速度也更快。
帮助信息
模式转换更多信息: :help /magic
查看关于查找模式的更多帮助信息: :help pattern
教程
路径和工作目录 路径 path设置的目的是为了查找文件,比如说你使用gf指令打不开文件时,就得看看path是否设置正确了
1 2 3 4 5 6 7 8 9 10 11 12 13 :help path //查看path :set path? // 检查头文件加载情况 :checkpath! //添加path :set path+=/sdsd/sdsd //添加相对路径,注意要以.开头,否则无效 :set path+=./../core
默认的path包含:
当前文件路径,用dot.表示
当前的工作路径,用两个逗号,,表示
working directory working directory不同于path。path表示查找文件的路径,working directory表示vim的工作路径,往往是打开vim的当前路径。在新建文件,或者打开文件时,会在working directory下操作。
working directory会被默认加到path中,即,, 用两个逗号表示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 //查看working directory :pwd //设置工作目录 :cd %:h //跳转到当前文件目录 :lcd %:h //仅改变当前窗口的目录为当前文件目录 :cd - //跳转到前一个目录 //自动设置当前文件路径为working directory set acd //设置自动跳转到文件路径 :help autochdir :help :cd
DEBUG messages 查看错误信息 当Vim出现问题时,它通常会显示一些错误信息,可以通过查看这些信息来了解问题的具体原因。在Vim中,您可以使用:messages命令来查看最近的错误和警告信息。
verbose 例子 有时其他 Vim 配置可能会影响 t_SI 的行为。确保没有其他设置覆盖或修改了 t_SI 的设置。您可以通过执行 :verbose set t_SI? 命令来查看最后一次设置 t_SI 的地方,并检查是否有其他配置可能会干扰它。
详解 1 :[count]verb[ose] {command}
执行命令 {command},执行期间 ‘verbose’ 设为 [count]。 如果忽略 [count],缺省为 1。”:0verbose” 可以用来设置 ‘verbose’ 为零。
在此基础之上再应用 “:silent”,可以产生相应详细度的消息但不显示。”:silent” 和 “:verbose” 的组合因而可以只在内 部产生消息,然后用 v:statusmsg 或相关命令进行检查。 例如:
1 2 3 4 5 :let v:statusmsg = "" :silent verbose runtime foobar.vim :if v:statusmsg != "" : " foobar.vim 找不到 :endif
如果和别的命令相连接,”:verbose” 只适用于第一个命令:
1 :4verbose set verbose | set verbose
verbose=4 verbose=0
要记录 verbose 消息到文件,用 ‘verbosefile’ 选项。
具体见这里
scriptname 检查Vim配置文件 如果您在Vim中添加了自定义配置,那么这些配置可能会导致一些问题。要解决这些问题,您可以尝试禁用配置并逐个重新启用来找到问题所在。您可以使用 :scriptnames 命令查看当前加载的所有脚本,并使用 :scriptname 命令检查特定的脚本。
运行环境 检查运行环境 如果您在Vim中使用外部命令或脚本,那么运行环境可能会导致一些问题。例如,某些命令或脚本可能需要特定的环境变量或依赖项。您可以使用 :! echo $PATH 命令查看当前环境变量,并使用:! 命令执行外部命令。
重定向
进入普通模式(按下 Esc 键)。
输入 :redir > filename 命令,其中 filename 是您要保存输出的文件名。
执行您的命令。
输入 :redir END 来停止重定向。
保存文件并退出 Vim。
参考