《Vim实用技巧》笔记

Vim实用技巧

Table of Contents

  • 1. Vim决问题的方式
  • 2. 普通模式
  • 3. 插入模式
  • 4. 可视模式
  • 5. 命令行模式
    • 5.1. 操作文本的Ex命令
    • 5.2. range服务说明
    • 5.3. 补全
    • 5.4. 命令行窗口–使用vim的编辑能力编辑Ex命令
    • 5.5. 执行外部命令
  • 6. 管理多个文件
    • 6.1. 缓冲区列表管理
    • 6.2. 参数列表
    • 6.3. 窗口操作
    • 6.4. 标签页操作
  • 7. 打开及保存文件
    • 7.1. 打开文件
    • 7.2. 使用find查找文件
    • 7.3. 使用netrw管理文件系统
  • 8. 寄存器
  • 9. 宏
  • 10. 模式匹配
    • 10.1. 调整大小写敏感
    • 10.2. 调整正则表达式的匹配模式
    • 10.3. 特殊匹配符
    • 10.4. 统计当前模式的匹配个数
  • 11. 查找功能
  • 12. 替换功能
    • 12.1. 标志位总结
    • 12.2. 替换域中的特殊字符
    • 12.3. 使用寄存器内容
    • 12.4. 重复上一次substitute命令
  • 13. Quckfix列表与位置列表
  • 14. 与外部程序的交互
  • 15. Vim中的补全功能
  • 16. 拼写检查
    • 16.1. Vim拼写检查器的基本命令
    • 16.2. 使用其他拼写字典
    • 16.3. 在插入模式下更正拼写错误

1 Vim决问题的方式

  • >G命令会增加当前行到文档末尾的缩进层次
  • Vim中可重复的操作及回退
    目的 操作 重复 回退
    做出修改 {edit} . u
    在行内查找下一指定字符[前一个字符] f{char}/t{char} ; ,
    在行内查找上一指定字符[后一个字符] F{char}/T{char} ; ,
    在文档中查询下一处匹配项 /pattern<CR> n N
    在文档中查询下一处匹配项 ?pattern<CR> n N
    执行替换 :s/target/replacement & u
    宏操作 q{register}{changes}q @{register} u
    执行Ex命令 :Ex命令 @:(:寄存器总是存储最后一次的Ex命令) u

2 普通模式

  • 学会把d{motion}与/查找动作一起使用,可以极大提高效率
  • 改变大小写
    • gU{motion} 修改为大写
    • gu{motion} 修改为小写
    • g~{motion} 大小写翻转
    • gUgU 修改当前行为大写
    • gugu 修改当前行为小写
    • g~g~ 当前行大小写翻转
  • 缩进
    • >{motion} 增加缩进
    • <{motion} 减少缩进
    • ={motion} 自动缩进
  • 数字运算
    • C-a +1
    • C-x -1
  • 虚拟替换模式
    • gR 进入虚拟连续替换模式,它把tab当成一组空格来处理
    • gr 进入虚拟单词替换模式,它把tab当成一组空格来处理
  • 移动
    操作 作用
    j k 按照实际行向下向上移动
    gj和gk 按照屏幕行向下向上移动
    ge 反向移动到上一个单词的结尾
    gf 跳转到光标所在字符串所表示的文件,通过配置suffixesadd选项,允许省略文件后缀名,通过配置path属性可以省略部分目录信息
    `` 当前文件中上次跳转动作之前的位置
    `. 上次修改的位置
    `^ 上次插入的地方
    `[ 上次修改或复制的起始位置
    `] 上次修改或复制的结束位置
    `< 上次高亮选区的起始位置
    `> 上次高亮选区的结束位置
    H 跳转到屏幕最上方
    M 跳转到屏幕正中间
    L 跳转到屏幕最下方
  • 按子串移动

    子串比单词的范围更大,它仅仅以空白字符作为分隔依据.

    • W 类似w,移动到下一个字串
    • B 类似b,移动到上一个字串
    • E 类似e,移动到子串的字部
    • gE 类似ge,移动到上一个字串的尾部

3 插入模式

  • 更正错误

    • C-h 删除前一个字符
    • C-w 删除前一个单词
    • C-u 删除到行首
  • 返回普通模式
    • ESC 或者 C-[ 切换到普通模式
    • C-o 切换到插入-普通模式
  • 寄存器
    • C-r {register} 访问寄存器中的内容
    • C-r C-p {register} 访问寄存器中的内容
    • C-r = 访问表达式寄存器,通过访问该特殊寄存器可以执行计算式甚至一段Vim脚本
  • 插入特殊字符
    • C-v u {1234} 以4为16进制编码来输入字符
    • 普通模式下ga 显示光标所在的字符编码
    • C-v 非数字键 插入这个按键本身所代表的字符
    • C-k{char1}{char2} 以二合字母插入非常用字符
    • :digraphs 查看可用的二合字母列表
    • :digraph-table 查看另一个更为有用的列表

4 可视模式

  • gv 重选上次的高亮选区
  • o 切换高亮选区的活动端
  • 当实用命令.重复对高亮选区所做的修改时,此修改会重复作用域相同范围的文本
  • 在windows下使用C-q进入列块编辑模式,而在linux下使用C-v进入列块编辑模式,在emacs的evil-mode下,也使用C-v进入列块模式

5 命令行模式

5.1 操作文本的Ex命令

命令 用途
:[range]delete [register] 删除指定范围的行到register中
:[range]yank [register] 赋值指定范围的行到register中
:[line]put [register] 在指定行后粘贴register的内容
:[range]copy {address} 将指定范围的行拷贝到{address}所指定的行之下
:[range]move {address} 将指定范围的行移动到{address}所指定的行之下
:[range]join 连接指定范围的行
:[range]normal {commands} 对指定范围的每一行执行普通命令
:[range]substitute/{pattern}/{string}/{flag} 正则替换
:[range]global/{pattern}/{cmd} 对给定范围内匹配的行,在上面执行Ex命令
:[range]vglobal/{pattern}/{cmd} global的取反
:[range]global!/{pattern}/{cmd} global的取反
:grep /vimgrep 搜索关键字

5.2 range服务说明

符号 地址
N 文件的第N行
$ 文件的最后一行
0 虚拟行,位于文件第一行的上方
. 光标所在行
‘m 包含位置标记m的行
‘< 高亮选区的起始行
‘> 高亮选区的结束行
% 整个文件(:1,$的简写形式)

5.3 补全

  • C-d 显示可用的补全列表
  • Tab 自动补全
  • C-r C-w 插入光标下的单词
  • C-r C-a 插入光标下的子串

5.4 命令行窗口–使用vim的编辑能力编辑Ex命令

命令 动作
q/ 打开查找命令历史的命令行窗口
q: 打开Ex命令历史的命令行窗口
C-f 从命令行模式切换到命令行窗口
:help cmdwin 查看命令行帮助

5.5 执行外部命令

命令 用途
:shell 启动shell
:!{cmd} 在shell中执行cmd
:read !{cmd} 在shell中执行cmd,并把标准输出插入到光标下方
[range]write !{cmd} 在shell中执行{cmd},以[range]作为其标准输入
[range]!{fiter} 使用外部命令{filter}过滤指定的[range]

6 管理多个文件

6.1 缓冲区列表管理

命令 用途
:ls 列出缓冲区列表
:bnext 上一个缓冲区
:bprev 下一个缓冲区
:bfirst 列表开头的buffer
:blast 列表结尾的buffer
:buffer N 第N号buffer
:buffer {bufname} 匹配bufname的buffer
:bdelete N1 N2… 删除buffer
:N,M bdelete 删除buffer
:bufdo 在:ls列出的所有缓冲区执行Ex命令

6.2 参数列表

参数列表记录了在启动时作为参数传递給Vim的文件列表. 通过设置参数列表,可以通过:nexthe :prev来打开下一个/上一个文件

  • :args 显示当前参数列表的内容
  • :args {filelist} 设置文件列表
  • :args {文件通配符} 设置符合文件通配的文件列表

    其中,

  1. *符号用于匹配0到多个字符,但范围仅限于指定的目录
  2. ** 也匹配0到多个字符,范围递归进入目录的子目录

:args `shell命令` 以shell命令的输出作为参数列表的值:argdo命令在列表中的每个缓冲区上执行同一条命令在使用:argdo/:bufdo前,最好启用‘hidden‘设置.启用hidden选项后,如果活动的缓冲区的内容发生了变化,Vim会在离开该缓冲区时自动将其隐藏. 否则Vim会阻止离开该缓冲区. 这样我们就无法用:argdo或:bufdo命令来修改一组缓冲区.

6.3 窗口操作

操作 用途
C-w s 水平分割当前窗口
C-w v 垂直分割当前窗口
:split {file} 水平分割当前窗口,并在新窗口载入file
:vsplit {file} 垂直分割当前窗口,并在新窗口载入file
C-w w 在窗口间循环切换
C-w c或:close 关闭活动窗口
C-w o或:only 只保留活动窗口,关闭其他所有窗口
C-w = 使所有窗口等宽,等高
C-w _ 最大化活动窗口的高度
[N]C-w _ 将活动窗口的高度设为N行
C-w 竖线 类似C-w _,但设置窗口的宽

6.4 标签页操作

Vim的标签页是可以容纳一系列窗口的容器,它类似于Linux中的虚拟桌面的概念

命令 用途
:tabedit {filename} 在新标签页打开{filename}
C-w T 把当前窗口移到一个新标签页
:tabclose 关闭当前标签页
:tabonly 只保留当前标签页,关闭其他标签页
:tabnext{n}或{N}gt 切换到编号为{N}的标签页
:tabnext或gt 切换到下一个标签页
:tabprevious或gT 切换到上一个标签页
:tabmove [N] 将当前标签页移动到第N个位置,默认为最后一个位置

7 打开及保存文件

7.1 打开文件

  • :pwd 查看当前工作目录,所谓工作目录只的是vim启动时的那个目录,该目录 不随着 buffer路径的不同而不同
  • :edit %<TAB> %符号代表缓冲区中的完整路径
  • :edit %:h :h修饰符会去除文件名,但保留路径部分,使用这种方式可以快速打开与活动缓冲区中文件属于同一个目录的文件

7.2 使用find查找文件

:find命令运行我们通过文件名打开一个文件,而无需输入该文件的完整路径.

在使用该功能前先需要配置path选项

  1. :set path+=app/**
  2. :find recvfrommb<tab>

7.3 使用netrw管理文件系统

8 寄存器

  • 使用寄存器

    "{register}复制/删除操作

  • 无名寄存器

    若没有指定寄存器,则Vim缺省使用无名寄存器,可以使用""表示. 它是极其易变的

  • 复制专用寄存器

    使用y{motion}时,不仅会把内容存入无名寄存器,而会存入复制专用寄存器,可用"0来表示

  • 有名寄存器

    用小些字母a-z引用寄存器,会覆盖原寄存器内容. 而用大写字母A-Z引用寄存器,则会将新内容添加到该寄存器的原有内容之后

  • 黑洞寄存器

    使用"_来引用,该寄存器不保存任何内容

  • 系统剪贴板

    使用"+来引用,该寄存器与系统剪贴板相关联

  • 主剪贴板

    X11视窗支持另一种叫做主剪贴板的剪贴板(primary),它高村者上次被高亮选中的文本,可用用鼠标中键把他们粘贴出来. 使用"*来引用

    Windows/Mac OS没有主剪贴板的概念,因此"*也代表系统剪贴板

  • 其他寄存器
    寄存器 内容
    "= 表达式寄存器
    "% 当前文件名
    "# 轮换文件名
    ". 上次插入的文本
    ": 上次执行的Ex命令
    "/ 上次查找的模式

9 宏

  • 对多行同时执行某个宏

    • [range]normal @{register}
    • global/pattern/@{register}
  • 对多个文件同时执行宏
    • :argdo normal @{register}
    • :bufdo normal @{register}

10 模式匹配

10.1 调整大小写敏感

  • 匹配式中任何地方出现\C则表示开启大小写敏感模式
  • 匹配式中任何地方出现\c则表示大小写不敏感模式

10.2 调整正则表达式的匹配模式

  • \v表示开启very magic搜索模式,即假定除_,大小写字符和数字之外的所有字符都具有特殊含义
  • \V表示开启very nomagic原义开关,即默认消除大多数字符上的特殊含义.

10.3 特殊匹配符

  • <匹配左定界符
  • >匹配右定界符
  • \_s匹配空格或者回车符
  • %()只使用括号的分组功能,不捕获其内容
  • \ze和\zs对匹配进行裁剪

    一个匹配的边界通常对应于一个模式的起始与结尾. 但我们可以使用元字符\zs和\ze对匹配进行裁剪,使其成为这个完成模式的一个子集.

    \zs标志着一个匹配的起始,\ze用来界定匹配的结束

10.4 统计当前模式的匹配个数

使用:%s///gn就可以统计当前模式的匹配个数

标志位n会抑制正常的替换动作. 该命令不会对每次匹配进行替换,而是简单地统计匹配的次数

11 查找功能

  • /pattern//e 定位到查找匹配的结尾
  • // 将查找域留空,则Vim将重用上一次的查找模式
  • 类似的s//中将查找域留空,Vim也会重用上一次的查找模式
  • normal模式下q/打开查询历史的命令行窗口

12 替换功能

12.1 标志位总结

标志位 功能
g 修改一行内的所有匹配
c 让我们有机会可以确认或拒绝每一处修改
n 不真正作替换,而只报告本次substitute命令匹配的个数
e 屏蔽错误提示
& 指示Vim重用上一次substitute命令所用过的标志位

12.2 替换域中的特殊字符

具体可用过:h sub-replace-special来查询完整的列表

符号 描述
\r 插入一个换行符
\t 插入一个制表符
\\ 插入一个反斜杠
\{数字} 插入第N个子匹配
\0 插入匹配模式的所有内容
& 插入匹配模式的所有内容
~ 使用上一次调用substitute时的替换域
\={Vim Script} 插入{Vim Script}表达式的结果

12.3 使用寄存器内容

在命令模式下也能通过C-r{register}的方式来将寄存器内容插入命令行.

因此在输入查询域时可以用C-r\来代替

12.4 重复上一次substitute命令

  • 使用g&在整个文件范围内重复substitute命令
  • 使用[range]&&在指定范围内重新执行替换操作.
  • normal模式下的&命令是:s的同义词,用于重复上一次的替换操作.但它不包含替换的标志位.

13 Quckfix列表与位置列表

对于每一条用于填充quickfix列表的命令都有一条对应的命令,把结果保存到位置列表.

:make,:grep以及:vimgrep会实用quickfix列表,而:lmake,:lgrep,:lvimgrep实用位置列表.

这两者的区别在于在任一特定的时刻,只能有一个quickfix列表,而位置列表却可以有多个.

命令 用途
:cnext 跳转到下一项
:cprev 跳转到上一项
:cfirst 跳转到第一项
:clast 跳转到最后一项
:cnfile 跳转到下一个文件的第一项
:cpfile 跳转到上一个文件的最后一项
:cc N 跳转到第N项
:copen 打开quickfix窗口
:cclose 关闭quickfix窗口
:colder quickfix的前一个版本
:cnew quickfix的后一个版本

位置窗口的操作,只需要把quickfix的命令起始字符改为l即可

14 与外部程序的交互

  • makeprg选项允许我们指定运行:make时所调用的程序
  • errorformat选项允许我们告诉Vim如何解析:make产生的结果
  • grepprg选项允许我们指定允许:grep所调用的程序
  • grepformat选项指示Vim如何解析来自:grep命令的输出结果
  • :vimgrep命令允许我们实用Vim自带的正则表达式引擎,实现跨越文件的查找功能

    :vimgrep[!] /{pattern}/[g][j] {files}

15 Vim中的补全功能

  • ignorecase选项会影响到补全时的大小写敏感问题
  • 触发自动补全的方法
    命令 补全类型
    C-n 普通关键字,可以通过设置complete选项来定制普通关键字补全时所扫描的位置
    C-x C-n 当前缓冲区关键字
    C-x C-i 包含文件关键字,Vim本身就理解C语言的包含方式,但通过设置include选项,我们也可以让它了解其他语言的对应提示符
    C-x C-] tag文件关键字
    C-x C-k 字典查找,可以通过dictionary选项来指定一个或多个含有单词列表的文件
    C-x C-l 整行补全
    C-x C-f 文件名补全,需要注意的是,Vim的文件自动补全功能只相对于工作目录的路径进行扩展,而不是相对于当前编辑文件的路径. 可以通过:cd命令来却换工作目录,:cd -切换到之前的工作目录
    C-x C-o 全能补全
  • 与自动补全的弹出式菜单相互交互
    按键 作用
    C-n / C-p 实用下一个/上一个匹配项
    C-y 确认选用当前选中的匹配项
    C-e 还原最少输入的文本
    C-h /BackSpace 从当前匹配项删除一个字符
    C-l 从当前匹配项增加一个字符
    {char} 中止补全,并插入字符

16 拼写检查

16.1 Vim拼写检查器的基本命令

命令 用途
:set spell 开启检查
[s 或 ]s 在拼写错误间响应地进行反向及正向的跳转
z= 来获取Vim提供的更正建议列表,也可以使用N z=来跳过提示,直接采纳第N个更正建议
zg 把当前单词添加到拼写文件
zw 将当前单词从拼写文件中删除
zug 撤销对当前单词的zg或zw命令

16.2 使用其他拼写字典

Vim默认以英文字典作为拼写字典,通过配置spelllang选项可以让我们更改 本地缓冲区 的缺省设置.

如果我们试着加载某个尚未支持的拼写文件,Vim会自动为我们提供下载和安装的方法

通过配置spellfile选项,我们可以指定一个文件路径,用于保存由zg和zw命令所添加,删除的单词

spellfile可以设置多个文件,在zg前加上数字标号能指定添加到那个文件中

16.3 在插入模式下更正拼写错误

在插入模式下按C-x s 或C-x C-s会触发一个特殊的自动补全(参见compl-spelling).

Vim会从光标位置开始进行反向扫描,直到发现一处拼写错误为止;然后提供更正建议.

时间: 2024-11-03 21:37:46

《Vim实用技巧》笔记的相关文章

SQL 笔记 By 华仔

-------------------------------------读书笔记------------------------------- 笔记1-徐 最常用的几种备份方法 笔记2-徐 收缩数据库的大小的方法 笔记3-徐 设置数据库自动增长注意要点 笔记4-徐 模仿灾难发生时还原adventurework数据库 示例 stopat 笔记5-徐 检查日志文件不能被截断的原因 笔记6-徐 检测孤立用户并恢复孤立用户到新的服务器 解决数据库镜像孤立用户问题 笔记7-徐 SQLSERVER日志记录

SQL笔记---多表左联

这是实际场景当中的一个例子,拿出来分析总结思路. -- SQL 查询 --SELECT  orderQuery.Rk_SkuCode ,        orderQuery.SkuName,        SUM(ISNULL(orderQuery.OrderTotal, 0))        - SUM(ISNULL(removeQuery.RemoveTotal, 0))        - SUM(ISNULL(pickQuery.PickTotal, 0))        - SUM(IS

SQL笔记---分页

随用随想,随用随记. 通过实际应用掌握SQL语句. 一. SQL分页 1. 第一种方法:利用ID大于多少进行筛选 SELECT TOP 20        *FROM    dbo.WMS_StockWHERE   ( Rk_SkuCode > ( SELECT MAX(Rk_SkuCode)                         FROM   ( SELECT TOP 40                                            *           

《HeadFirst SQL》笔记

规范化 0 约束 1 原子性 2 第一范式 1NF 3 数据模式 4 依赖 5 联接查询 6 交叉联接(AKA 笛卡尔联接,叉积) 7 内联接 8 子查询 9 外联接 10 自联接 11 集合 12 事务 13 ACID 14 管理事务 15 常用语句 16 注意 17 规范化 约束 NOT NULL UNIQUE PRIMARY KEY DEFAULT FOREIGN KEY:引用父表的某个唯一值引用完整性:插入外键列的值必须已经存在于父表的来源列中 --创建外键 create table i

SQL笔记1:SELECT及SELECT高级应用

T-SQL笔记1:SELECT及SELECT高级应用 本章摘要 1:安装AdventureWorks 2:基本运算符和表达式 3:between 4:like 5:escape 6:TOP 7:GROUP BY 7.1:GROUP BY ALL 7.2:HAVING 8:SELECT字句技术 8.1:使用DISTINCT消除重复值 8.2:返回拼接的结果 8.3使用INTO字句 9:子查询 9.1:子查询类型 9.2:代替表达式的查询 9.3:多层嵌套 10:比较使用 EXISTS 和 IN 的

金典 SQL笔记(6)

page223-索引 --利用SQL 语句创建索引 --CREATE INDEX 索引名称on 表名(字段 ,字段, 字段字段n) --索引名称必须为唯一的,字段 ,字段, 同意一个到多个 --范例为T_person 表中给FName创建索引索引名为 idx_person_name CREATE INDEX idx_person_name ON T_Person (FName) --删除索引 --drop index 表名索引名 DROP INDEX T_person.idx_person_na

Mybatis 项目开发实际常用SQL笔记总结

parameterType 和 resultType parameterType:单个参数用String,多个参数用map resultType:   可以是 Integer.String.Object    <select id="countGroupMasterByUid" parameterType="String" resultType="Integer">      SELECT              COUNT(id)

sql笔记/分页存储过程

[email protected]c#中进行++操作可以是整数或小数,sql中只能对整数进行++操作.char类型 适合存储长度波动较小不回收效率高varchar 类型 适合存储长度波动较大可以回收nchar代表unicode 存储内容包括汉字时候考虑加n SQL语句特点1不区分大小写2没有双引号所有字符串都包含在单引号3没有逻辑相等,逻辑相等和赋值一样都是用=4没有bool值得概念,但是在视图中可以输入true/false5也有关系运算符.6也有逻辑运算符 &&-- and || --o

sql笔记

1. 看下面sql,重点有两个,一个是distinct  ,一个是树形结构查询 select DISTINCT t.unit_code from t_unit_relation t where t.corp_tn='jiaozhougongan' start with t.unit_code='0001' connect by prior t.unit_code = t.unit_upcode 分析: ① distinct:去重复值 ② 树形结构查询,这个博客:http://www.cnblog

HeadFirst SQL 读书摘要

数据库都是用 圆柱形表示的. 数据库中包含表 表中包含行和列 行又叫记录record,  列又叫 字段field 创建数据库 create database mypipe_l; 选择数据库 use mypipe_l; 创建表 create table doughnut( name VARCHAR(10), type VARCHAR(6) ); 查看表 desc doughnut; 删除表 drop table doughnut; 插入数据 insert into doughnut (name,