vim笔记

  • 看《vim8文本处理实战》一部分所做的笔记,不太会,学中ing
  • 《vim实用技巧》看了开头也不错

交换文件

  1. 指定文件存放位置
set directory = 文件位置
  1. 不使用交换文件
set noswapfile

移动

  1. hjkl 左下上右
  2. w 移动到下个单词的开头
  3. e 移动到最近单词的结尾,ge 移动到上一个单词的结尾
  4. b 移动到最近单词的开头
  5. w/e/b这三个命令的大写版本,表示将除空格外的所有字符视为单词的一部分

狭义单词(word) 空白字符分割(空格、制表符、换行符)分割的字母、数字、下划线组成的序列

广义单词(WORD) 空格分割的任何非空字符组成的序列

  1. t+字符 #until,在该行搜索该字符,并将光标置于此字符,T反向搜索
  2. f+字符 #find,在该行搜索该字符,并将光标置于此字符,F反向
  3. _ 将光标放到行首 , $ 将光标放到行尾
  4. shift+{ 和 shift+} 移动到段落的开头和结尾
  5. shift+( 和 shift+) 移动到句子的开头和结尾
  6. H 跳转到当前窗口的顶部,L 跳转到当前窗口的底部
  7. ctrl+f(或pageDown)在当前缓冲区向下翻页,ctrl+b(pageUP)向上翻页,ctrl+u / d 向上或下 翻半页
  8. gg 跳转到文件的开头,G跳转到文件的结尾
  9. % 当你的光标在(){}[]上时,可以移动光标到它对应的符号上

显示行号 :set number , 可在vimrc中配置

: N 跳转到N行,: +/- N 向下向上移动N行 查看相对行号 :set relativenumber

‘;’ 重复t/T/f/F的操作,‘,’ 撤销到上一步t/T/f/F的操作

修改

<命令><数字><移动或一个文本对象>

  1. c 删除一部分文字后立即进入编辑模式,cc删除一整行然后进入插入模式, 大写C或S 用于删除当前行内容然后进入插入模式,但会保留缩进
  2. d (delete) 删除文字,dd删除一整行
  3. r 替换单个字母
  4. gi 在最后退出的位置进入插入模式
  5. s 用于删除单个字符(如果前面加了数字则会删除多个字符) 然后进入插入模式
  6. ~ 切换当前光标下字母的大小写

撤销和重复

  1. u 撤销最后一步操作
  2. ctrl+r 重做此操作

文本对象

括号内或引号内的文本都可称文本对象

  1. 内对象

以i开头,内对象不包括空白字符串(或其他周围的字符)

  1. 外对象

以a开头,包括空格和其他字符

  1. 对象选择

w/W 狭义广义单词

s 句子

p 段落

HTML/XML标签

\、‘’、“”、()、[]、<>、{}、

  1. 使用方式
动词数目(可选)形容词名词
d(删除)-i(内部))
c2a(外部)w

帮助 :help text-objects

搜索

  • / 字符串 向下搜索
  • ? 字符串 向上搜索
  • ‘*’ 向下查找光标下的单词
  • ‘#’ 向上查找光标下的单词
n: 向下匹配
N: 反向匹配
: set hlsearch #高亮显示每一个匹配项
: noh #清除高亮
: set incsearch 将光标动态跳转到第一个匹配处
:\c  searchString  #忽略大小写
  • vimgrep 跨文件搜索

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就不会搜索到了

  • 参数列表
  1. :arg 用于定义参数列表
  2. :argdo 对参数列表中的所有文件执行一条命令
  3. :args 显示参数列表中的文件列表
  • 递归替换每一个python文件内容
:arg **/*.py
:argdo %s/<animal>/creature/ge | update

# update相当于write,用于保存每个被修改过的缓存区

帮助

  1. 如何查询帮助
: h(help) 进入帮助
  1. 用帮助查询搜索
: h search 
别急着按回车
ctrl+d
得到补充命令
:h search-commands
  1. 搜索帮助中的内容
/ 关键字 想文本下方搜索
? 向文本上方搜索

缓冲区

缓冲区是文件的内部表示,每个打开的文件都有一个缓冲区。

  1. 查看缓冲区
:ls
或者
:buffers
:files

缓冲显示为
缓冲编号 |  %(表示该缓冲位于当前窗口)| a(表示已被加载可见)| 文件名| line n (表示当前光标位置)
  1. 切换缓冲

通过数字和名称,在同一个缓冲区中他们是唯一的

# 使用编号
: b n
# 使用文件名称(可只打部分文件名进行搜索)
: b cat
# 且可以使用tab在匹配结果中来回遍历

# 使用上下切换
: bn  #(bnext)
: bp  #(bprevious)
  1. 删除缓冲区
: bd

窗口

  1. 窗口的创建
# 水平分割
: split 缓冲名称 #可简化为sp
# 垂直分割
: vsplit 缓冲名称 #可简化为vs
命令用途
<c -w>s水平分割
<c -w>v垂直分割
:sp[lit] {file}水平分割当前窗口,并在新窗口中载入{file}
:vsp[lit] {file}垂直分割当前窗口,并在新窗口中载入{file}
  1. 窗口的跳转
ctrl+w 然后再按hjkl 
  1. 窗口的删除
ctrl+w q 关闭当前窗口
ctrl+w o 关闭除当前窗口之外的窗口
: q 关闭窗口并卸载缓冲区
: bd 删除当前缓冲区,并关闭当前窗口
: qa 关闭所有窗口并推出
: wqa 先保存再关闭
: only 关闭其他窗口 # 简写为on
Ex命令普通模式命令用途
:clo[se]<c -w>c关闭活动窗口
:on[ly]<c -w>o只保留活动窗口,关闭其他所有窗口
  1. 窗口的移动和修改大小

: help window-moving

: help window-resize

  1. 移动
ctrl+w 大写的HJKL
  1. 大小
ctrl+w = 调整所有窗口为一直大小

# 调整当前窗口的高度
: resize +/- N  #增加或减少N行 , 简写为res
ctrl+w +/-

# 调整当前窗口的宽度
: vertical resize +/- N #增加或减少N列
ctrl+w </>

标签页Tabs

  • :lcd {path} 设置当前窗口的本地工作目录,不影响标签页
  • :windo lcd {path}如果标签页包含了多个窗口,可用此命令为这些窗口设置本地工作目录
  1. 打开标签页
: tabnew <文件名称> #文件名称可以不加
# 在新标签页中加载文件
: e <文件名>
: b <filename> / <number>
命令用途
:tabe[dit] {filename}在新标签页中打开{filename}
<c -w>T把当前窗口移到一个新的标签页
:tabc[lose]关闭当前标签页及其中的所有窗口
tabo[nly]只保留活动的标签页,关闭所有其他标签页
  1. 标签页之间的跳转
: tabnext #快捷键gt
: tabprevious #快捷键gT
Ex命令普通模式命令用途
:tabn[ext] {N}{N}gt切换到编号为{N}的标签页
:tabn[ext]gt切换到下一标签页
:tabp[revious]gT切换到上一标签页
  1. 标签页的关闭
:tabclose
  1. 标签页的移动
:tabmove N #将当前标签页移动到第N个标签页后,0为第一关标签页

折叠

  1. 设置折叠
" 在vimrc中写入
set foldmethod=indent
  1. 打开关闭折叠
zo 打开折叠
zc 关闭折叠
za 切换折叠状态
zR/zM 同时打开和关闭所有折叠

文件树的浏览

  1. 支持文件菜单:e命令
" 编辑vimrc文件
set wildmenu

在使用:e 时输入空格,再按tab键,就会显示文件列表
用tab遍历文件,shift+tab反向遍历(左/右方向键起同样的作用)
  1. 目录浏览器Netrw

这是vim内置的文件管理器插件

  • 使用方法
  1. 打开文件树
:Ex #全写为Explore
:e 文件夹地址
  1. 操作指令
Enter # 打开文件和目录
- # 进入上一层目录
D # 删除一个文件或目录
R # 重命名一个文件或目录
  1. 其他用法

Netrw窗口也可以在分割窗口或标签页中打开

:Vex # 左右分割的方式打开
:Sex # 上下分割的方式打开
:Lex # 左右分割,Nettw窗口在左边,且高度占满整个屏幕

使用寄存器进行复制和粘帖 2021-2-20 8:23

  • 复制格式(y yank)
y 移动命令/文本对象 

在可视化模式下选择一些文本 然后按y

yy #复制一行

"+yG # 当光标在文本开头时,复制整篇文章
  • p按钮粘贴

  • vim支持多种寄存器,每个寄存器用字母、数字、或特殊符号来表示

  • 寄存器的访问方式是引号键",后面接寄存器标识符,然后是针对寄存器的操作

  • 寄存器的种类

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

  1. 输入一些代码
  2. 按ctrl+n,弹出自动补全列表
  3. 使用ctrl+n,ctrl+p 在列表中选择

  • 插入-补全模式

多种类型的补全

  1. 按ctrl+x
  2. 再按
ctrl+i # 补全整行
ctrl+j # 补全标签
ctrl+f # 补全文件名
s # 基于拼写建议的补全(要设置:set spell)

宏的录制和回放

  1. 按q进入宏录制模式
  2. 选择一个寄存器
  3. 输入需要录制宏的命令
  4. 再次输入q退出
  5. 用@ 加寄存器名称重复回放宏
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>切换到插入-普通模式
  • 在插入模式执行后切换到普通模式执行一条命令后切回
  • 示例 <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 把当前单词插入命令行
  • <c-r><c-w>
技巧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打开文件
  • 首先要配置path选项让其知道搜索的目录
示例
:set path+=app/**
为path追加app目录及其子目录
  • 然后使用:find命令
示例
:find Navigation.js
可以用<tab>补全命令,如果匹配结果已经唯一可以直接回车
技巧45 把文件保存到不存在的目录中
  • 当文件所处的目录不存在,保存文件时会出错
命令用途
<c -g>显示当前文件的文件名及状态
:!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 基于单词的移动
命令光标动作
ge反向移动到上一个单词的结尾
  • 一个单词由字母、数字、下划线、或其他非空白字符的序列组成,单词间以空白字符分割
  • 字串 由非空白字符序列组成
技巧54 设置位置标记,以便快速跳转
命令作用
'{mark}跳到位置标记所在行,并把光标置于该行第一个非空白字符上
`{mark}跳到设置此位置标记时的光标所在之处
m{a-zA-Z}
  • 小写位置标记只在每个缓冲区局部可见,大写则全局可见
  • 自动位置标记
位置标记跳转到
``当前文件中上次跳转动作之前的位置
`.上次修改的地方
`^上次插入的地方
`[上次复制或修改的起始位置
`]上次复制或修改的结束位置
`<上次高亮选区的起始位置
`>上次高亮选区的结束位置

在文件间的跳转

技巧56 遍历跳转列表
命令作用
<c -o>后退跳转
<c -i>前进跳转
  • 跳转动作
命令作用
[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 加次数回放宏
  • {N} @{rigister}/@@
技巧68 在连续的文本行上重复修改
  • 利用normal命令 并行执行宏
:[range] normal @{rigister}/@@
技巧69 给宏追加命令
  • 当宏存储在寄存器a中时使用qA大写的字母来追加内容
技巧70 在一组文件中执行宏
  • 使用*do命令执行宏
技巧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原义开关
  • very nomagic 搜索模式
技巧76 使用圆括号捕获子匹配
  • 使用括号将匹配分组
  • 使用\N获取匹配的内容
  • \0引用整个匹配
技巧77 界定单词的边界
  • 使用<>界定单词匹配的边界
/v<the>
匹配the而不匹配their
  • 在圆括号前使用%忽略此分组
/\v%(And|D)rew (Neil)
\1 匹配的时Neil,将%在前的分组忽略了
  • 在very magic搜索模式 <>字符直接解析为单词定界符
命令作用
#反向查找当前光标下的单词
g*正向查找当前光标下的单词,但是不使用单词定界符<>
g#反向查找当前光标下的单词,但是不使用单词定界符<>
技巧78 界定匹配的边界
  • 使用\zs界定开始边界
  • 使用\ze界定结束边界
/\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 在执行查找前预览第一处匹配
  • incsearch 选项
技巧83 将光标偏移到查找匹配的结尾
  • /e 查找域结束符后使用标志 将光标会移动到每个匹配的结尾
技巧84 对完整的查找匹配进行操作
  • 使用gn gN
技巧85 利用查找历,迭代完成复杂的模式
  • 使用q/ 可编辑查找历史
技巧86 统计当前模式的匹配个数
  • 使用:substitute 替换命令,加上/n 标志(不替换)来显示匹配的个数
:%s///gn
开始的两个//表示使用上一次匹配模式
后两//表示替换内容为空
g 标志 表示当前行全部匹配
n 标志 表示不进行替换
  • 使用:vimgrep 命令
:vimgrep //g %
将当前文件中所有找到的匹配放进quickfix列表

替换

技巧88 认识substitute命令
  • :[range]s[ubstitute]/{pattern}/{string}/[flags]
标志位用途
g一行内的所有匹配
c每次修改需要确认
n抑制正常的替换行为
e屏蔽错误提示
&重用上一次的标志位
  • 替换域中的特殊字符
符号描述
&插入模式的所有内容
~使用上一次的{string}
={Vim script}执行表达式,并用于{string}
技巧90 手动控制每一次替换操作
答案用途
y确认
n忽略
q退出
llast 替换此处匹配后退出
aall 替换此处之后所有的匹配
<c -e>向上滚动屏幕
<c -y>向下滚动屏幕
  • :h :s_c 查看帮助
技巧91 重用上次的查找模式
  • :s//{string}/g 无内容双//
  • 适用于先用/查找然后再替换
技巧92 用寄存器的内容替换
  1. 传值
  • <c -r>{register} 输入
  • 当寄存器中存在&~特殊字符时需要对其转义
:%s//<c-r>0/g
使用寄存器0的内容
  1. 引用
  • @{register}
:%s//\=@0/g
\= 执行一段表达式脚本
在脚本中可用@{register}引用寄存器内容
技巧93 重复上一次substitute命令
按键用途
g&在整个文件的范围内重复上一次替换命令
:[range]&&前一个&表示上一次的替换命令(无标志位和范围) 后一个&表示重复上一次替换的标志位
  • g& = :%s//~/&
技巧95 在替换的过程中执行算数运算
  • submatch(N) 返回第N个分组匹配的内容,类似于\{N},但是它用在脚本表达式中
:%s//\=submatch(0)-1/g
技巧96 交换两个或更多的单词
  • 使用字典数据结构(dictionary)
/\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
  • | 在vim中作为命令的分隔符

global命令

技巧98 认识global命令
  • :[range] global[!] /{pattern}/ [cmd]
  • 缺少情况下默认是整个文件,默认是print
  • vglobal (v表示invert) 反转行为
  • global过程为先找到所有匹配,然后再进行[cmd]命令,且[cmd]命令的范围可单独设定
技巧100 将TODO项收集到寄存器
  1. qaq 准备寄存器将其内容清空
  2. 执行g/TODO/yank A 大写A字母将内容添加到寄存器a中
  • 使用g/TODO 打印
  • 使用g/TODO/t$将匹配项复制到文件尾部
技巧101 将css文件中所有规则的属性按照字母排序
  • :g/{/ .+1,/}/-1 sort
:g/{/ .+1,/}/-1 sort
g
pattern: /{
cmd: [range] cmd
range: / .+1,/}/-1   .表示当前行,/}/表示匹配}字符,+-表示加减行
cmd: sort
  • 使用g/{pattern}/[range][cmd]

工具

编译代码,并通过Quickfix列表浏览错误信息

  • 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 对你的工作进行拼写检查
  • :set spell
命令用途
[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只在窗口范围内生效,如果想要每个窗口都生效

  • :windo setlocal number
A.3 为特定类型的文件应用个性化设置
  • 在配置目录中创建ftplugin文件,并将特点类型的文件配置放入其中
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值