在Vim中复制行并附加几个字母

Ale*_*ber 2 vi vim macros text-editor

我正在编辑一个文本文件中的字典,其中包含俄语单词 - 每行一个单词.

有些名词缺少它们的衍生词,它们通常是由少数几个字母附加的相同单词 - 在6-7个变体中如此屏幕截图所示:

在此输入图像描述

在Vim中,我想将光标放在第一列并逐行向下滚动.当我识别出一个名词时,我想按下一些(尽可能少的!)击键来取出那个单词,将它复制成单独的行并附加字母.

我可以通过%sort u稍后发布来删除重复项.

如果我可以在整个文件上运行该命令,它将类似于:

%s/\(.\+\)$/\1^M\1?^M\1??^M\1???^M\1??^M\1?^M\1???^M/
Run Code Online (Sandbox Code Playgroud)

你有没有想法,如何在Vim中创建这样一个"宏"?

cor*_*vec 5

有几种方法可以解决这个问题.您可以创建宏,也可以创建地图.可以在运行VIM时完成.可以将它们放在另一个文件中(.vimrc例如,或者具有特定于此项目的绑定的文件)并在需要时提供.

我还会给你一些关于正则表达式的建议:如果你正在写一些特别复杂的东西,你可以\通过启动正则表达式\v(即,:s/\v([0-9a-f]+\s)/0x\1/g)来大大减少所需的数量.

在VIM中创建宏

您可以通过按q普通模式,然后按下要用于宏的键,在VIM中启动宏.然后,您可以通过按下@后跟宏的字母来调用宏.q在普通模式下再次按可停止录制.

因此,您可以按如下方式输入此宏(使用q寄存器):

qq:s/\(.\+\)$/\1\r\1?\r\1??\r\1???\r\1??\r\1?\r\1???\r/Enterq

然后,当您在一条线上并且想要运行此命令时,请@q从"正常"模式进入.

将宏存储在文件中并获取它

在最后一步中创建宏时,您实际在做的是设置q寄存器.您可以通过进入registers命令模式来检查这一点.您可以在.vimrc文件中按如下方式设置此宏,并且每次启动VIM时都可以使用它.

  1. 在(:new)中创建要存储此宏的文件.
  2. 将以下行添加到文件中:

    let @q=":s/\\(.\\+\\)$/\\1\\r\\1a\\r\\1b\\r\\1??\\r\\1???\\r\\1??\\r\\1?\\r\\1???\\r/^M"

    (如果你猛拉线并将其粘贴到VIM中Ctrl+R",则^M在行尾会有一个正确的字符.你需要做一些手动编辑以确保它在引号内.或者,你可以输入Ctrl+VCtrl+M到输入^ M字符.)

  3. 保存文件(:w testmacro.vim).
  4. 来源(:so %:source %).
  5. 通过@q在您要执行此操作的其中一行上键入来测试您的宏.

稍后,您将能够通过运行加载此宏:so testmacro.vim.

创建映射

您可以改为创建映射.以下映射复制给定行中的最后一个单词,将其粘贴到以下六行,然后附加到每个给定行.

nnoremap <c-j> yy6pA?<esc>jA??<esc>jA???<esc>jA??<esc>jA?<esc>jA???<esc>j

n在"nnoremap"的开头,表示它只在普通模式下运行.
noremap表示此命令不会进行任何递归重映射(而有nmap,这可能会发生). <c-j>映射到Ctrl+J yy6p该线并将其粘贴6次. Aa<esc>j追加到当前行的末尾,输入文本(在本例中a),退出插入模式,然后向下移动一行.

您可以在VIM的命令模式下输入此命令,也可以将其存储在文件中并使用该:source命令加载它.

将寄存器与映射相结合

您可以访问映射中的寄存器.这意味着如果您知道输入给定的替换正则表达式将执行您想要的操作,则可以将其保存在寄存器中,然后在当前行上输入命令.

为此,请在文件中输入以下命令,然后将其获取:

nnoremap <c-i> :<c-r>f<cr>
let @f="s/\\(.\\+\\)$/\\1\\r\\1a\\r\\1b\\r\\1??\\r\\1???\\r\\1??\\r\\1?\\r\\1???\\r/^M"
Run Code Online (Sandbox Code Playgroud)

现在,您可以输入Ctrl+I以在当前行上的寄存器f中运行替换正则表达式.

或者,将一些寄存器用于此目的 - 让我们说af.

nnoremap <c-l> yy6p$"apj"bpj"cpj"dpj"epj"fpj
let @a="a"
let @b="??"
let @c="???"
let @d="ax"
let @e="e"
let @f="???
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我们使用了在按下"使用它的命令之前按下和注册名称的功能,例如粘贴.