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

标签 vim macros text-editor vi

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

一些名词缺少派生词,派生词通常是同一个词加上几个字母 - 有 6-7 个变体,如屏幕截图所示:

enter image description here

在 Vim 中,我想将光标放在第一列并逐行向下滚动。当我识别一个名词时,我想按一些(尽可能少!)击键来输入该词,将其复制到不同的行并附加字母。

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

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

%s/\(.\+\)$/\1^M\1а^M\1ам^M\1ами^M\1ах^M\1е^M\1ном^M/

请问您知道如何在 Vim 中创建这样的“宏”吗?

最佳答案

有几种方法可以处理这个问题。您可以创建宏,也可以创建 map 。两者都可以在运行 VIM 时完成。两者都可以放在另一个文件中(例如,您的 .vimrc 或具有特定于此项目的绑定(bind)的文件)并在需要时获取。

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

在 VIM 中创建宏

你可以在 VIM 中启动一个宏,方法是在正常模式下按 q,然后按你希望用于宏的键。然后,您可以通过按 @ 后跟宏的字母来调用宏。在正常模式下再次按 q 停止录制。

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

qq: s/\(.\+\)$/\1\r\1а\r\1ам\r\1ами\r\1ах\r\1е\r\1ном\r/ 输入q

然后,当您在线上并且想要运行此命令时,在普通模式下输入 @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"

    (如果您使用 Ctrl+R" 拉出该行并将其粘贴到 VIM 中,则该行末尾将有一个正确的 ^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”开头的表示它只在Normal模式下起作用。
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"

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

或者,将一些寄存器专门用于此目的 - 比如说 a-f。

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="ном

在这种情况下,我们使用了在点击使用它的命令(例如粘贴)之前按 " 和寄存器名称的功能。

关于vim - 在 Vim 中复制行并附加几个字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15556932/

相关文章:

vim - cscope 类似 C++ 的功能(使用 vim)

ios - 如何在预编译时检测iPhone/ipad

c# - 在表单生成器自动回复器中查询自定义表

css - 使 CSS 注释充当 CSS 文件中的链接

vim - 是否可以在不改变文件本身的情况下在 Vim 中明显地标记文件的行?

vim - Vim 中的 HOME 和 END 键问题

vim - 为什么 vim 粘贴的行为取决于 yanking 方法

c - 使用宏进行类型检查

text-editor - 我可以设置ABAP编辑器的背景颜色吗?

python - 动态缩进和突出显示 tkinter 文本框中的单词