vim编辑器进阶学习(二)

风尘

文章目录

  1. 1. 寄存器
  2. 2. 宏(Macro)
  3. 3. 文本对象(Text Objects)
  4. 4. 标记 marks
  5. 5. 折叠
  6. 6. 搜索与替换

[TOC]

寄存器

VIM有十种寄存器,通过:reg 命令可以显示寄存器内容,通过" + 寄存器名称 + 命令可以将内容放入寄存器或取出。

  • 未命名寄存器("

    VIM会将删除指令(dcsx)和复制指令(y) 的文本放入该寄存器中,每次指令执行内容会覆盖上次放入内容。

  • 编号寄存器(0-9

    VIM 将剪切和删除指令(除了x指令)的文本放入该寄存器中。0 号寄存器存储最近复制指令的文本,1号寄存器存储最近删除指令的文本(手动指定寄存器情况除外),每成功执行一次指令VIM将前一个内容从1 号寄存器转移到2 号寄存器,2 号到3号,依此类推,9 号寄存器上一次内容将丢弃。

  • 小文本删除寄存器(-

    VIM 将删除小于一行的文本放入该寄存器中(如x 指令,手动指定寄存器情况除外)。

  • 命名寄存器(a~zA~Z

    完全由用户指定内容的寄存器,使用小写字母可以替换对应命名寄存器的内容(如:"ayy指令),使用大写字母可以追加对应命名寄存器的内容(如:"Ayy指令),当cpoptions 标志位指定>

  • 只读寄存器(.%:

    .存储最近插入的文本寄存器,可以通过c 指令重复上一次操作。%存储当前文件名。:存储最近执行的命令。

  • 交换文件寄存器(#

    存储了当前窗口交换文件的名字。这个寄存器也是只读的,主要是为了一个插件改变它之后再恢复它。

  • 表达式寄存器(=

    存储VIM 表达式的寄存器,普通模式可以通过指令"=进行存储,插入模式可以通过<C-r> =指令存储。更多参考文档:h expression

  • 选择寄存器(*+

    GUI系统剪切板寄存器,当剪切板无效或无法工作时将使用未命名寄存器代替。X11 提供了PRIMARY, SECONDARY, 和 CLIPBOARD 三种寄存器,其中vim 仅实现了PRIMARYCLIPBOARD分别使用*+表示。

  • 黑洞寄存器(_

    该寄存器功能和/dev/null设备类似,写入这个寄存器的内容将消失,可以用来删除文本。如使用指令"_dd 删除当前行。

  • 上次搜索寄存器

    存储最近一次搜索的内容,这个被使用于n 指令和hlsearch 指令。

宏(Macro)

可以通过宏录制一组命令,然后重复执行。宏命令也存储在vim 寄存器中,并且必须在normal 模式下使用。

  • 录制宏

    通过命令q + 寄存器名称(0-9a-zA-Z")开始录制。如:qa命令开始录制一个宏并存储在命名寄存器a 中,此时vim 左下方将显示recording @a

    # 将下列每行文本中间隔字母转为大写
    my name is lili!
    how old are you!
    what do you do!
    -------------------------------------------
    1、录制宏到 q 寄存器 `qq` recording @q ...
    2、执行替换命令:gU 转大写字母命令 l 向右移动光标 ws 表示跳转到下一个单词(vim-easymotion 插件) j 向下移动光标 0 回到行首
    
    0gUlwsgUlwsgUlwsgUlj0
    -------------------------------------------
    # 新文本内容
    My Name Is Lili!
    how old are you!
    what do you do!
    
  • 停止宏录制

    开始一个宏命令录制后,可以按q 键停止宏录制。

  • 宏的使用

    录制好的宏可以通过[数字] + @ + 寄存器名称(0-9a-zA-Z")执行。@符号前可以加数字表示执行次数,如执行两次上面录制的宏2@q

    # 执行两次录制的宏后文本内容
    My Name Is Lili!
    How Old Are You!
    What Do You Do!
    

    上面命令也可替换成[数字] + @@ 命令表示重复执行前一个宏。如:2@@命令可以达到上面一样效果。

    宏命令也可以通过:normal命令执行,如:normal @q 表示执行宏q

    由于宏命令同样存储在vim 寄存器中,因此也可以利用寄存器特性对宏命令进行修改和追加,如qQ 命令就可以对宏q 进行命令追加。也可以直接修改寄存器内容对宏命令进行修改。

文本对象(Text Objects)

  • 文本对象类型

    单词(w)、句子(s)、段落(p

    区间对象:

    []{}()<>"'`t(tag 标签块)b|B(block 块)

  • 文本对象范围

    inner(i):不包含空格

    around(a):包含空格

  • 文本对象命令

    [number]<command>[Text Object]

    number 命令执行次数

    command 选项:

    • 删除 delete(d)

    • 改变 change(c)

    • 复制 yank(y)

  • 示例

    i. 选择单词

    文本:Good morning everyone !

    viw 结果 Good morning everyone !

    vaw 结果 Good morning everyone !

    ii. 删除单词

    diw 结果 Good morning everyone !
    2daw 结果 Good morningeveryone ! (试试2diw 执行结果)

    iii. 区块操作

    文本:[Good morning everyone !]

    vi[ 结果 [Good morning everyone !]

    iv. 标签操作

    文本:<div>Good morning everyone !</div>

    vit 结果 <div>Good morning everyone !</div>

    更多操作参考文档 :h text-objects

标记 marks

折叠

搜索与替换