Macros

作者: 一口亅 | 来源:发表于2021-05-11 18:50 被阅读0次

使用Vim宏,您可以记录操作并将它们存储在Vim寄存器中,以便在需要时执行。

基础

qa                     Start recording a macro in register a
q (while recording)    Stop recording macro

@a    Execute macro from register a
@@    Execute the last executed macros

举例
hello
vim
macros
are
awesome
想要讲上面文本都大写

qa0gU$jq
  • qa starts recording a macro in the a register.
  • 0 goes to beginning of the line.
  • gU$ uppercases the text from your current location to the end of the line.
  • j goes down one line.
  • q stops recording.

然后,利用@a重复——3@a

Safety Guard

宏执行在遇到错误时自动结束。

Command Line Macro

:normal @a
:2,3 normal @a execute your macro between lines 2 and 3

跨多个文件执行宏

  • :args *.txt
    find all .txt files in your current directory.
  • :argdo g/donut/normal @a
    executes the global command g/donut/normal @a on each file inside :args
  • :argdo update
    executes update command to save each file inside :args when the buffer has been modified.

递归宏

a. chocolate donut
b. mochi donut
c. powdered sugar donut
d. plain donut
目的:切换第一个单词的大小写

qaqqa0W~j@aq
  • qaq
    必须从一个空寄存器开始,因为当你递归调用宏时,它将运行寄存器中的任何内容。
  • qa
    starts recording on register a.
  • 0
    goes to the first character in the current line.
  • W
    goes to the next WORD.
  • ~
    toggles the case of the character under the cursor.
  • j
    goes down one line.
  • @a
    executes macro a.
  • q
    stops recording.

Appending A Macro

qAA.<Esc>q
  • qA
    starts recording the macro in register A.
  • A.<Esc>
    在行尾插入一个点(这里A是插入模式命令,不要与宏A混淆),然后退出插入模式。
  • q
    stops recording macro.

修改一个宏

之前寄存器a中有一个命令——0W~A.<Esc>,用于给句子首字母切换大小写以及句尾加句号

:put a    显示的是0W~A.^[

^[ is Vim's internal code representation of <Esc>

现在需要修改它,要求可以在单词“donut”(甜甜圈)之前添加单词“deep fried”

  • Back to the macro, right after the toggle case operator (~), let's add the instructions to go to the end of the line ($), go back one word (b), go to the insert mode (i), type "deep fried " (don't forget the space after "fried "), and exit insert mode (<Esc>).
  • 即 0W~$bideep fried <Esc>A.^[

但是,Vim不能理解<Esc>,必须为<Esc>键编写内部代码表示。

  • 在插入模式下, 按下Ctrl-V加<Esc>,就可以输出^[

Ctrl-V是一个插入模式操作符,用于逐字插入下一个非数字字符
宏代码现在应该如下所示

0W~$bideep fried ^[A.^[

要将修改后的指令添加到寄存器a中,你可以像在命名寄存器中添加一个新条目一样进行操作。在行开始处,运行"ay$将被删除的文本存储在寄存器a中。

另一种方法(在命令行)

Do :let @a=", then do Ctrl-R Ctrl-R a, this will literally paste the content of register a. Finally, don't forget to close the double quotes ("). You might have something like

:let @a="0W~$bideep fried ^[A.^["

Macro Redundancy

:let @z = @a
复制寄存器a中的宏到寄存器z

Series Vs Parallel Macro

Vim can execute macros in series and parallel.
举例
import { FUNC1 } from "library1";
import { FUNC2 } from "library2";
import { FUNC3 } from "library3";
import { FUNC4 } from "library4";
import { FUNC5 } from "library5";

If you want to record a macro to lowercase all the uppercased "FUNC", this macro should work:

qa0f{gui{jq
  • qa
    starts recording in register a.
  • 0
    goes to first line.
  • f{
    finds the first instance of "{".
  • gui{
    lowercases (gu) the text inside the bracket - text-object (i{).
  • j
    goes down one line.
  • q
    stops macro recording.

但是如果中间有一行断了,比如:import { FUNC1 } from "library1";
import { FUNC2 } from "library2";
import { FUNC3 } from "library3";
import foo from "bar";
import { FUNC4 } from "library4";
import { FUNC5 } from "library5";

想跳过这一行继续运行就需要——Run the macro in parallel.

  • :1,$ normal @a

相关文章

网友评论

      本文标题:Macros

      本文链接:https://www.haomeiwen.com/subject/fqyadltx.html