- 看《vim8文本处理实战》一部分所做的笔记,不太会,学中ing
- 《vim实用技巧》看了开头也不错
交换文件
- 指定文件存放位置
set directory = 文件位置
- 不使用交换文件
set noswapfile
移动
- hjkl 左下上右
- w 移动到下个单词的开头
- e 移动到最近单词的结尾,ge 移动到上一个单词的结尾
- b 移动到最近单词的开头
- w/e/b这三个命令的大写版本,表示将除空格外的所有字符视为单词的一部分
狭义单词(word) 空白字符分割(空格、制表符、换行符)分割的字母、数字、下划线组成的序列
广义单词(WORD) 空格分割的任何非空字符组成的序列
- t+字符 #until,在该行搜索该字符,并将光标置于此字符前,T反向搜索
- f+字符 #find,在该行搜索该字符,并将光标置于此字符上,F反向
- _ 将光标放到行首 , $ 将光标放到行尾
- shift+{ 和 shift+} 移动到段落的开头和结尾
- shift+( 和 shift+) 移动到句子的开头和结尾
- H 跳转到当前窗口的顶部,L 跳转到当前窗口的底部
- ctrl+f(或pageDown)在当前缓冲区向下翻页,ctrl+b(pageUP)向上翻页,ctrl+u / d 向上或下 翻半页
- gg 跳转到文件的开头,G跳转到文件的结尾
- % 当你的光标在(){}[]上时,可以移动光标到它对应的符号上
显示行号 :set number , 可在vimrc中配置
: N 跳转到N行,: +/- N 向下向上移动N行 查看相对行号 :set relativenumber
‘;’ 重复t/T/f/F的操作,‘,’ 撤销到上一步t/T/f/F的操作
修改
<命令><数字><移动或一个文本对象>
- c 删除一部分文字后立即进入编辑模式,cc删除一整行然后进入插入模式, 大写C或S 用于删除当前行内容然后进入插入模式,但会保留缩进
- d (delete) 删除文字,dd删除一整行
- r 替换单个字母
- gi 在最后退出的位置进入插入模式
- s 用于删除单个字符(如果前面加了数字则会删除多个字符) 然后进入插入模式
- ~ 切换当前光标下字母的大小写
撤销和重复
- u 撤销最后一步操作
- ctrl+r 重做此操作
文本对象
括号内或引号内的文本都可称文本对象
- 内对象
以i开头,内对象不包括空白字符串(或其他周围的字符)
- 外对象
以a开头,包括空格和其他字符
- 对象选择
w/W 狭义广义单词
s 句子
p 段落
HTML/XML标签
\、‘’、“”、()、[]、<>、{}、
- 使用方式
动词 | 数目(可选) | 形容词 | 名词 |
---|
d(删除) | - | i(内部) | ) |
c | 2 | a(外部) | w |
帮助 :help text-objects
搜索
- / 字符串 向下搜索
- ? 字符串 向上搜索
- ‘*’ 向下查找光标下的单词
- ‘#’ 向上查找光标下的单词
n: 向下匹配
N: 反向匹配
: set hlsearch #高亮显示每一个匹配项
: noh #清除高亮
: set incsearch 将光标动态跳转到第一个匹配处
:\c searchString #忽略大小写
vimgrep <模式> <路径>
模式通常为字符串,也可以为vim风格的正则表达式。路径通常为一个通配符,当路径为××时表示对目录递归搜索
: vimgrep animal**/*.py #示例
: cn 或 cp 逐个浏览各匹配项
: copen 打开可视化显示的快速恢复(quickfix)列表,用jk移动按回车跳转到相对应的匹配处
替换
- substitute 默认情况将当前行中的一个子字符串替换为其他字符
- & 重复替换
:s/<find-this>/<replace-with-this>/<flags>
flags:
g 全局替换
c 替换确认
i 忽略大小写
I 区分大小写
e 无匹配项不显示错误
n 不使用替换
作用范围:
% 整个文件默认,%s/string/string/gi
数字 行号
/search-pattern/ 在下一个搜索结果所在行 :12;/dog/s/animal/creature/g 从12行开始找到包含dog的行,在这范围内替换
?backwards-search-pattern? 反向搜索
; 运算组合 20;$ 20行到最后一行
<和> 单词界定符 /<animal> 限定单词 animalaaaa就不会搜索到了
- :arg 用于定义参数列表
- :argdo 对参数列表中的所有文件执行一条命令
- :args 显示参数列表中的文件列表
:arg **/*.py
:argdo %s/<animal>/creature/ge | update
# update相当于write,用于保存每个被修改过的缓存区
帮助
- 如何查询帮助
: h(help) 进入帮助
- 用帮助查询搜索
: h search
别急着按回车
ctrl+d
得到补充命令
:h search-commands
- 搜索帮助中的内容
/ 关键字 想文本下方搜索
? 向文本上方搜索
缓冲区
缓冲区是文件的内部表示,每个打开的文件都有一个缓冲区。
- 查看缓冲区
:ls
或者
:buffers
:files
缓冲显示为
缓冲编号 | %(表示该缓冲位于当前窗口)| a(表示已被加载可见)| 文件名| line n (表示当前光标位置)
- 切换缓冲
通过数字和名称,在同一个缓冲区中他们是唯一的
# 使用编号
: b n
# 使用文件名称(可只打部分文件名进行搜索)
: b cat
# 且可以使用tab在匹配结果中来回遍历
# 使用上下切换
: bn #(bnext)
: bp #(bprevious)
- 删除缓冲区
: bd
窗口
- 窗口的创建
# 水平分割
: split 缓冲名称 #可简化为sp
# 垂直分割
: vsplit 缓冲名称 #可简化为vs
命令 | 用途 |
---|
<c -w>s | 水平分割 |
<c -w>v | 垂直分割 |
:sp[lit] {file} | 水平分割当前窗口,并在新窗口中载入{file} |
:vsp[lit] {file} | 垂直分割当前窗口,并在新窗口中载入{file} |
- 窗口的跳转
ctrl+w 然后再按hjkl
- 窗口的删除
ctrl+w q 关闭当前窗口
ctrl+w o 关闭除当前窗口之外的窗口
: q 关闭窗口并卸载缓冲区
: bd 删除当前缓冲区,并关闭当前窗口
: qa 关闭所有窗口并推出
: wqa 先保存再关闭
: only 关闭其他窗口 # 简写为on
Ex命令 | 普通模式命令 | 用途 |
---|
:clo[se] | <c -w>c | 关闭活动窗口 |
:on[ly] | <c -w>o | 只保留活动窗口,关闭其他所有窗口 |
- 窗口的移动和修改大小
: help window-moving
: help window-resize
- 移动
ctrl+w 大写的HJKL
- 大小
ctrl+w = 调整所有窗口为一直大小
# 调整当前窗口的高度
: resize +/- N #增加或减少N行 , 简写为res
ctrl+w +/-
# 调整当前窗口的宽度
: vertical resize +/- N #增加或减少N列
ctrl+w </>
标签页Tabs
:lcd {path}
设置当前窗口的本地工作目录,不影响标签页:windo lcd {path}
如果标签页包含了多个窗口,可用此命令为这些窗口设置本地工作目录
- 打开标签页
: tabnew <文件名称> #文件名称可以不加
# 在新标签页中加载文件
: e <文件名>
: b <filename> / <number>
命令 | 用途 |
---|
:tabe[dit] {filename} | 在新标签页中打开{filename} |
<c -w>T | 把当前窗口移到一个新的标签页 |
:tabc[lose] | 关闭当前标签页及其中的所有窗口 |
tabo[nly] | 只保留活动的标签页,关闭所有其他标签页 |
- 标签页之间的跳转
: tabnext #快捷键gt
: tabprevious #快捷键gT
Ex命令 | 普通模式命令 | 用途 |
---|
:tabn[ext] {N} | {N}gt | 切换到编号为{N}的标签页 |
:tabn[ext] | gt | 切换到下一标签页 |
:tabp[revious] | gT | 切换到上一标签页 |
- 标签页的关闭
:tabclose
- 标签页的移动
:tabmove N #将当前标签页移动到第N个标签页后,0为第一关标签页
折叠
- 设置折叠
" 在vimrc中写入
set foldmethod=indent
- 打开关闭折叠
zo 打开折叠
zc 关闭折叠
za 切换折叠状态
zR/zM 同时打开和关闭所有折叠
文件树的浏览
- 支持文件菜单:e命令
" 编辑vimrc文件
set wildmenu
在使用:e 时输入空格,再按tab键,就会显示文件列表
用tab遍历文件,shift+tab反向遍历(左/右方向键起同样的作用)
- 目录浏览器Netrw
这是vim内置的文件管理器插件
- 打开文件树
:Ex #全写为Explore
:e 文件夹地址
- 操作指令
Enter # 打开文件和目录
- # 进入上一层目录
D # 删除一个文件或目录
R # 重命名一个文件或目录
- 其他用法
Netrw窗口也可以在分割窗口或标签页中打开
:Vex # 左右分割的方式打开
:Sex # 上下分割的方式打开
:Lex # 左右分割,Nettw窗口在左边,且高度占满整个屏幕
使用寄存器进行复制和粘帖 2021-2-20 8:23
y 移动命令/文本对象
在可视化模式下选择一些文本 然后按y
yy #复制一行
"+yG # 当光标在文本开头时,复制整篇文章
a~z # 手动复制数据寄存器,复制时使用大写字母是附加内容到此寄存器
" # 无名寄存器,默认的复制粘贴是使用这个,如yy p等,用""两个双引号显式访问
0~10 # 最后10次删除操作的历史记录,0存储最后一次删除文本
一些只读寄存器
% # 存储当前文件名
# # 存储上次打开的文件名
. # 最后插入的文本
: # 最后执行的命令
:reg <寄存器标识符> # 查看某个寄存器中的内容
:reg a b # 同时查看a、b寄存器中的内容
:reg 列出所有寄存器的内容
* # (mac和winodws系统中的默认粘帖板) 系统主粘帖板
+ # 只针对linux,ctrl+c组合键操作的粘帖板选择器(Clipboard selection)
set clipboard=unamed " 复制到系统寄存器(*)
set clipboard=unnaedplus " 复制到系统寄存器(+)
代码自动补全 2021-2-21 9:42
- 输入一些代码
- 按ctrl+n,弹出自动补全列表
- 使用ctrl+n,ctrl+p 在列表中选择
多种类型的补全
- 按ctrl+x
- 再按
ctrl+i # 补全整行
ctrl+j # 补全标签
ctrl+f # 补全文件名
s # 基于拼写建议的补全(要设置:set spell)
宏的录制和回放
- 按q进入宏录制模式
- 选择一个寄存器
- 输入需要录制宏的命令
- 再次输入q退出
- 用@ 加寄存器名称重复回放宏
qa # 录制宏,存入a寄存器
cw 1 # 修改一个单词为1
q # 推出宏
@a # 重复使用a宏
@@ # 重复使用上一个宏
:set nowrapscan # 搜索到文件末尾时产生错误,终止搜索
宏可以编辑
宏可以嵌套
vim实用技巧内容
模式
普通模式
技巧10 用次数座简单的算术运算
按键操作 | 用途 |
---|
n <c -a> | 正向跳转到第一个数字上,然后进行加n运算 |
n <c -x> | 正向跳转到第一个数字上,然后进行减n运算 |
技巧12 操作符+动作命令=操作
命令 | 用途 |
---|
g~ | 反转大小写 |
gu | 转换为小写 |
gU | 转换为大写 |
> | 增加缩进 |
< | 减小缩进 |
= | 自动缩进 |
! | 使用外部程序过滤{motion}所跨越的行 |
插入模式
技巧13 在插入模式中可即时更正错误
按键操作 | 用途 |
---|
<c -h> | 删除前一个字符(同退格键) |
<c -w> | 删除前一个单词 |
<c -u> | 删至行首 |
技巧14 返回普通模式
- 在插入模式执行后切换到普通模式执行一条命令后切回
- 示例 <c -o> zz 用 zz 命令可以重绘屏幕,并把当前行显示在窗口正中,这样就能够阅读当前行之上及之下的半屏内容
技巧15 不离开插入模式,粘贴寄存器中的文本
按键操作 | 用途 |
---|
<c -r> {register} | 将指定寄存器中的内容输入 |
<c -r><c -p>{register} | 同上,且修正任何不必要的缩进 |
技巧16 随时随地做运算
按键操作 | 用途 |
---|
<c -r>= | 输入并执行表达式寄存器的内容 |
可视模式
技巧21 选择高亮选区
按键操作 | 用途 |
---|
<c -v> | 激活面向列块的可视模式 |
gv | 重选上次的高亮选区 |
- 在可视模式中按o键来切换其活动的端点
- 在面向列的可视模式中i/a 是文本对象,需要使用I/A来进入插入模式
命令行模式
技巧27 认识vim的命令行模式
命令 | 用途 |
---|
[range] delete [x] | 删除指定范围内的行[到寄存器] |
[rang] yank [x] | 复制指定范围的行 |
[line] put [x] | 在指定行后粘贴寄存器x中的内容 |
[range] copy {address} | 把指定范围的行拷贝到{address}下 |
[range] move {address} | 把指定范围内的行移动到{address}指定的行下 |
[range] join | 连接指定范围内的行 |
[range] normal {commands} | 对指定范围内的每一行执行普通命令{commands} |
[range] substitute/{pattern}/{string}/[flags] | 把指定范围内出现{pattern}的地方替换为{string} |
[range] global/{pattern}/[Ex] | 对指定范围内匹配{pattern}的所有行执行EX命令{Ex} |
- copy 简写为 t 或co 此命令不会使用寄存器
- move 简写为 m
技巧31 重复上次的ex命令
按键操作 | 用途 |
---|
@: | 执行:寄存器中的命令 |
@@ | 重复执行上次的命令 |
技巧33 把当前单词插入命令行
技巧34 回溯历史命令
命令 | 动作 |
---|
q/ | 打开查找历史命令行窗口 |
q: | 打开ex命令历史的命令行窗口 |
<c -f> | 从命令行模式切换到命令行窗口 |
技巧35 运行shell命令
:!{cmd}
!:调用外部程序
%: 当前文件名
:shell
启动一个交互的shell会话
<c-z> 挂起vim所属的进程,进入bash
jobs命令 查看挂起进程列表
fg命令 唤醒被挂起的进程并移到前台
bg命令 唤醒但不移到前台
:read !{cmd} 把命令的标准输出重定向到缓冲区
:[range]write !{cmd} 把缓冲区内容作为指定{cmd}的标准输入
注意: !位置当使用write! {cmd}时,!表示强制
当给定范围时!{cmd} 将[range]指定行作为{cmd}标准输入,然后又会用{cmd}的内容覆盖[range]内原本的内容
:2,$!sort -t',' -k2
范围: 第二行到最后一行
-t:以什么分隔
-k 按照哪个字段排序
命令 | 用途 |
---|
:shell | 启动一个shell(输入exit返回vim) |
:!{cmd} | 在shell中运行{cmd} |
:read !{cmd} | 在shell中运行{cmd},并把其标准输出插入到光标下方 |
[range]write !{cmd} | 在shell中执行{cmd},以[range]作为其标准输入 |
[range]!{filter} | 使用外部程序{filter}过滤指定的[range] |
技巧36 批处理运行ex命令
命令 | 用途 |
---|
:source {filename} | 加载执行{filename}脚本 |
- 使用:*do 命令批量执行ex命令,例如:argdo :bufdo :cfdo
文件
管理多个文件
技巧37 用缓冲区列表管理打开的文件
命令 | 用途 |
---|
:ls | 查看载入内存中的缓冲区列表 |
:bprev | 切换到上一个缓冲区 |
:bnext | 切换到下一个缓冲区 |
:bfirst | 跳转到缓冲区列表的开头 |
:blast | 跳转到缓冲区列表的结尾 |
<c -^> | 在当前文件与轮换文件间快速切换 |
:buffer N | 跳转到对应编号的缓冲区 |
:buffer {bufname} | 跳转到对应名称的缓冲区(名称可只写一部分) |
:bufdo {Ex} | 在所有缓冲区上执行ex命令 |
:bdelete [buf-Id] | 删除缓冲区,默认当前buf |
- %:那个缓冲区在当前窗口中可见
- #:轮换文件
- :5,10 bd 可删除5-10的缓冲区,不连续只能: bd 编号了
技巧38 用参数列表将缓冲区分组
命令 | 用途 |
---|
:args | 查看当前的参数列表 |
:args {arglist} | 将{arglist}(文件名、通配符、shell命令输出结果)加入参数列表 |
:first | 跳转到第一个参数列表中的文件 |
:last | 跳转到最后一个参数列表中的文件 |
:next | 跳转到下一个参数列表中的文件 |
:prev | 跳转到上一个参数列表中的文件 |
:argdo {Ex} | 将参数列表中的所有文件都执行{ex}命令 |
- **通配符匹配当前及其子目录
- shell命令输出结果加入示例`cat .chapters`,用反引号执行
技巧39 管理隐藏缓冲区
命令 | 用途 |
---|
:w[rite] | 把缓冲区内容写入磁盘 |
:e[dit]! | 把磁盘内容读入缓冲区(回滚修改) |
:qa[ll]! | 关闭所有窗口,摈弃修改而无需警告 |
:wa[ll]! | 把所有修改的缓冲区写入磁盘 |
- +: 查看缓冲区列表时,+表示此buf被修改且未保存
- 当有未保持的缓冲区时切换缓冲区,将出现错误信息,使用!可强制执行切换。
:set hidden
启用hidden
设置,当有未保存缓冲区并切换时不发出警告
打开及保存文件
技巧42 用:edit
命令打开文件
:edit %<tab>
%:代表活动缓冲区的完整路径名称
<tab>:键将其展开(提示显示)
:edit %:h <tab>
%:h 将会被展开为当前文件所在目录的路径
修饰符 | 作用 |
---|
:p | 扩展为完整的路径 |
:h | 去掉最后一个部分 |
:t | 只保留最后一个部分 |
:r | 根部(去掉扩展名) |
:e | 只有扩展名 |
- 一般用
expand
函数 - 可以输入%%直接扩展为活动缓冲区所在的目录路径
cnoremap <expr> %% getcmdtype() == ':' ? expand('%:h').'/' : '%%'
判断当前是否是命令行模式
用三元表达式
如果是将其扩展为活动缓冲区所在的目录路径
如果不是原样输出
技巧43 使用:find
打开文件
示例
:set path+=app/**
为path追加app目录及其子目录
示例
:find Navigation.js
可以用<tab>补全命令,如果匹配结果已经唯一可以直接回车
技巧45 把文件保存到不存在的目录中
:!mkdir -p %:h
:write
创建文件夹然后保存
-p 批量创建文件夹
技巧46 以超级用户权限保存文件
:w !sudo tee % > /dev/null
:write !{cmd} 将缓冲区的内容作为{cmd}的标准输入
% 扩展为当前缓冲区文件的全路径名
tee将内容写入
tee的标准输出重定向到内容黑洞
更快地移动及跳转
区分实际行与屏幕行
- 开启
wrap
设置时每个超出窗口宽度的文本行都会被回绕显示,以确保没有文本显示不出来 - 实际行有
\n
换行符,而屏幕行没有,只是因为屏幕显示不下了导致看起来换行
命令 | 光标动作 |
---|
j | 向下移动一个实际行 |
gj | 向下移动一个屏幕行 |
k | 向上移动一个实际行 |
gk | 向上移动一个屏幕行 |
0 | 移动到实际行的行首 |
g0 | 移动到屏幕行的行首 |
^ | 移动到实际行的第一个非空白字符 |
g^ | 移动到屏幕行的第一个非空白字符 |
$ | 移动到实际行的行尾 |
g$ | 移动到屏幕行的行尾 |
技巧49 基于单词的移动
- 一个单词由字母、数字、下划线、或其他非空白字符的序列组成,单词间以空白字符分割
- 字串 由非空白字符序列组成
技巧54 设置位置标记,以便快速跳转
命令 | 作用 |
---|
'{mark} | 跳到位置标记所在行,并把光标置于该行第一个非空白字符上 |
`{mark} | 跳到设置此位置标记时的光标所在之处 |
m{a-z | A-Z} |
- 小写位置标记只在每个缓冲区局部可见,大写则全局可见
- 自动位置标记
位置标记 | 跳转到 |
---|
`` | 当前文件中上次跳转动作之前的位置 |
`. | 上次修改的地方 |
`^ | 上次插入的地方 |
`[ | 上次复制或修改的起始位置 |
`] | 上次复制或修改的结束位置 |
`< | 上次高亮选区的起始位置 |
`> | 上次高亮选区的结束位置 |
在文件间的跳转
技巧56 遍历跳转列表
命令 | 作用 |
---|
[count]G | 跳转到指定行 |
/pattern / ?pattern / n / N | 跳转到下一个/上一个模式出现之处 |
% | 跳转到匹配的括号所在之处 |
(/) | 跳转到上一句/下一句的开头 |
{/} | 跳转到上一段/下一段的开头 |
H/M/L | 跳转到屏幕的最上方/正中间/最下方 |
gf | 跳转到光标下的文件名 |
<c -]> | 跳转到光标下关键字的定义之处(ctags) |
'{mark}/`{mark} | 跳转到一个位置标记 |
- 注意:在插入模式下与<c -i>的效果时一样的,当修改键的功能时<c -i>的作用也同样被修改
技巧57 遍历改变列表
命令 | 作用 |
---|
:changes | 显示对每个缓冲区所做的修改 |
g; | 反向遍历改变列表 |
g, | 正向遍历改变列表 |
u<c -r> | 跳回上次修改过的地方 |
gi | 用`^标记恢复到上次插入的位置,并切换到插入模式 |
技巧58 跳转到光标下的文件
vim -u NONE -N
启动vim时不加载任何插件
- 使用
gf
跳转到当前光标下的文件名 - 当其文件名未指定扩展名时,可以设置让其尝试
:set suffixesadd+=.rb
为其尝试添加.rb后缀
查看选项内容
:set path?
增加
:set path+={filedir}
寄存器
复制与粘贴
技巧61 深入理解vim寄存器
- 无名寄存器(“”)
- 复制专用寄存器("0)
- 黑洞寄存器("_)
- 表达式寄存器("=)
- 只读寄存器
寄存器 | 内容 |
---|
"% | 当前文件名 |
"# | 轮换文件名 |
". | 上次插入的文本 |
": | 上次执行的Ex命令 |
"/ | 上次查找的模式 |
技巧62 用寄存器中的内容替换高亮选区的文本
- 选中一段文本然后使用寄存器的内容将其替换,没用用到删除操作,所以没有删除的内容到无名寄存器
技巧63 把寄存器的内容粘贴出来
操作 | 作用 |
---|
<c -r>{register} | 将寄存器中的内容粘贴出来 |
p | 将无名寄存器中的内容粘贴到当前行的下一行 |
P | 将无名寄存器中的内容粘贴到当前行的上一行 |
gp | 粘贴到下一行,但是当前光标移动到粘贴内容的行尾 |
gP | 粘贴到上一行,但是当前光标移动到粘贴内容的行尾 |
宏
技巧67 加次数回放宏
技巧68 在连续的文本行上重复修改
:[range] normal @{rigister}/@@
技巧69 给宏追加命令
- 当宏存储在寄存器a中时使用qA大写的字母来追加内容
技巧70 在一组文件中执行宏
技巧71 用迭代求值的方式给文本编号
- 设置一个变量,开始录制宏,使用表达式寄存器输出这个变量,使变量自增,退出宏
:let i = 1
qa
I<c -r>=i<cr><esc>
:let i += 1
q
技巧71 用迭代的求值方式给列表编号
- 将存储宏内容的寄存器输出到文本,然后编辑内容,输回寄存器,最后删除文本。
模式匹配
按模式匹配及按原意匹配
技巧73 调整查找模式的大小写敏感性
\c
忽略大小写 \C
强制区分大小写smartcase
智能大小写敏感性设置,当全小写时不区分大小写,当有大写字符时区分大小写
技巧74 按正则表达式查找时,使用\v
模式开关
- very magic 搜索模式 把出下划线、字母、数字以为的字符都当作具有特殊含义的字符
示例 匹配16进制颜色
/#\([0-9a-fA-F]\{6}\|[0-9a-fA-F]\{3}\)
/\v#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})
/\v#(\x{6}|\x{3})
技巧75 按原文查找文本时,使用\V
原义开关
技巧76 使用圆括号捕获子匹配
- 使用括号将匹配分组
- 使用
\N
获取匹配的内容 \0
引用整个匹配
技巧77 界定单词的边界
/v<the>
匹配the而不匹配their
/\v%(And|D)rew (Neil)
\1 匹配的时Neil,将%在前的分组忽略了
- 在very magic搜索模式
<
与>
字符直接解析为单词定界符
命令 | 作用 |
---|
# | 反向查找当前光标下的单词 |
g* | 正向查找当前光标下的单词,但是不使用单词定界符<> |
g# | 反向查找当前光标下的单词,但是不使用单词定界符<> |
技巧78 界定匹配的边界
/\v"\zs[^"]+\ze"
匹配双引号中的内容
[^"] 不匹配双引号
技巧79 转义问题字符
- 使用
/
正向查找时碰到/
符会结束匹配 - 使用
?
反向查找时碰到?
符会结束匹配 - 上两种称为
查找域结束符
用于附加标志位 如/e光标会移动到每个匹配的结尾 - 用编程的方式转义字符
使用表达式寄存器调用函数
使用u寄存器存储文本内容
使用点符号连接字符
使用escape函数将寄存器u中的/与\符号前都添加转义字符\
/\V<c -r>=escape(@u,getcmdtype().'\')
查找
技巧80 结识查找命令
命令 | 用途 |
---|
gn | 进入面向字符的可视模式,并选中下一处匹配 |
gN | 进入面向字符的可视模式,并选中上一处匹配 |
技巧81 高亮查找匹配
hlsearch
选项高亮查找nohlsearch
选中禁用高亮查找
:se hls
:se nohls
:noh 暂时处于关闭查找高亮状态
技巧82 在执行查找前预览第一处匹配
技巧83 将光标偏移到查找匹配的结尾
/e
查找域结束符后使用标志 将光标会移动到每个匹配的结尾
技巧84 对完整的查找匹配进行操作
技巧85 利用查找历,迭代完成复杂的模式
技巧86 统计当前模式的匹配个数
- 使用
:substitute
替换命令,加上/n
标志(不替换)来显示匹配的个数
:%s///gn
开始的两个//表示使用上一次匹配模式
后两//表示替换内容为空
g 标志 表示当前行全部匹配
n 标志 表示不进行替换
:vimgrep //g %
将当前文件中所有找到的匹配放进quickfix列表
替换
技巧88 认识substitute命令
:[range]s[ubstitute]/{pattern}/{string}/[flags]
标志位 | 用途 |
---|
g | 一行内的所有匹配 |
c | 每次修改需要确认 |
n | 抑制正常的替换行为 |
e | 屏蔽错误提示 |
& | 重用上一次的标志位 |
符号 | 描述 |
---|
& | 插入模式的所有内容 |
~ | 使用上一次的{string} |
={Vim script} | 执行表达式,并用于{string} |
技巧90 手动控制每一次替换操作
答案 | 用途 |
---|
y | 确认 |
n | 忽略 |
q | 退出 |
l | last 替换此处匹配后退出 |
a | all 替换此处之后所有的匹配 |
<c -e> | 向上滚动屏幕 |
<c -y> | 向下滚动屏幕 |
技巧91 重用上次的查找模式
:s//{string}/g
无内容双//
- 适用于先用
/
查找然后再替换
技巧92 用寄存器的内容替换
- 传值
<c -r>{register}
输入- 当寄存器中存在
&
或~
特殊字符时需要对其转义
:%s//<c-r>0/g
使用寄存器0的内容
- 引用
:%s//\=@0/g
\= 执行一段表达式脚本
在脚本中可用@{register}引用寄存器内容
技巧93 重复上一次substitute命令
按键 | 用途 |
---|
g& | 在整个文件的范围内重复上一次替换命令 |
:[range]&& | 前一个&表示上一次的替换命令(无标志位和范围) 后一个&表示重复上一次替换的标志位 |
技巧95 在替换的过程中执行算数运算
submatch(N)
返回第N个分组匹配的内容,类似于\{N}
,但是它用在脚本表达式中
:%s//\=submatch(0)-1/g
技巧96 交换两个或更多的单词
/\v(<man>|<dog>)
:%s//\={"dog":"man","man":"dog"}[submatch(1)]/g
技巧97 在多个文件中执行查找与替换
在当前查找内容
/Pragmatic\ze Vim
使用上一次查找模式,在当前目录及子目录下的所有.txt文件中进行查找匹配,并将匹配的结果存入quickfix列表
:vimgrep // **/*.txt
对quickfix列表中的文件都执行替换命令
:cfdo %s//Practical/gc
对quickfix列表中的有改动的文件进行保存
:cfdo update
可以合为一条命令
:cfdo %s//Practical/g | update
global命令
技巧98 认识global命令
:[range] global[!] /{pattern}/ [cmd]
- 缺少情况下默认是整个文件,默认是print
- vglobal (v表示invert) 反转行为
- global过程为先找到所有匹配,然后再进行[cmd]命令,且[cmd]命令的范围可单独设定
技巧100 将TODO项收集到寄存器
qaq
准备寄存器将其内容清空- 执行
g/TODO/yank A
大写A字母将内容添加到寄存器a中
- 使用
g/TODO
打印 - 使用
g/TODO/t$
将匹配项复制到文件尾部
技巧101 将css文件中所有规则的属性按照字母排序
:g/{/ .+1,/}/-1 sort
g
pattern: /{
cmd: [range] cmd
range: / .+1,/}/-1 .表示当前行,/}/表示匹配}字符,+-表示加减行
cmd: sort
- 使用
g/{pattern}/[range][cmd]
工具
编译代码,并通过Quickfix列表浏览错误信息
命令 | 用途 |
---|
:cnext | 跳转到下一项 |
:cprev | 跳转到上一项 |
:cfirst | 跳转到第一项 |
:clast | 跳转到最后一项 |
:cnfile | 跳转到下一个文件的第一项 |
:cpfile | 跳转到上一个文件的最后一项 |
:cc N | 跳转到第N项 |
:copen | 打开quickfix窗口 |
cclose | 关闭quickfix窗口 |
cdo{cmd} | 在quickfix列表中的每一行执行{cmd} |
:cfdo{cmd} | 在quickfix列表中的每个文件上执行{cmd} |
:colder | 回溯quickfix列表之前的某个版本 |
:cnewer | 回到quickfix列表比较新的版本 |
通过grep、vimgrep以及其他工具对整个工程进行查找
技巧109 不必离开vim也能调用grep
- vim中使用
grep
默认添加-n
显示行号参数 -i
不区分大小写参数- 示例
:grep -i Waldo *
技巧111 使用vim内置正则表达式引擎的grep
:vim[grep][!] /{pattern}/[g][j] {file} …
:vimgrep /going/ clock.txt tough.txt where.txt
:args *.txt
:vim /going/g ##
利用vim的拼写检查器,查找并更正拼写错误
技巧120 对你的工作进行拼写检查
命令 | 用途 |
---|
[s或]s | 正向及反向跳转到拼写错误的单词 |
[N]z= | 根据修改建议修正单词,N表示直接使用某个修正选项 |
zg | 把当前单词添加到拼写文件中 |
zw | 把当前单词从拼写文件中删除 |
zug | 撤销针对当前单词的zg或zw命令 |
技巧123 在插入模式下更正拼写错误
命令 | 用途 |
---|
<c -x>s | 更正拼写错误 |
<c -x><c -s> | 更正拼写错误,可以一直按住ctrl键 |
附录A 根据个人喜欢定制Vim
A.1 动态改变vim设置项
:set ignorecase
开启忽略大小写:set noignorecase
关闭忽略大小写:set ignorecase?
获取当前选项状态:set ignorecase&
设为默认值- 关闭加
no
,查询状态加?
,恢复默认加&
只对当前缓冲区生效
:setlocal tabstop=4
对所有缓冲区生效:bufdo setlocal tabstop=4
number
只在窗口范围内生效,如果想要每个窗口都生效
A.3 为特定类型的文件应用个性化设置
- 在配置目录中创建
ftplugin
文件,并将特点类型的文件配置放入其中