2

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

一些名词缺少它们的派生词,通常是同一个词加上几个字母 - 有 6-7 种变体,如下图所示:

在此处输入图像描述

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

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

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

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

你有什么想法,如何在 Vim 中创建这样的“宏”?

4

4 回答 4

5

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

我也会给你一些关于正则表达式的建议:如果你正在写一些特别复杂的东西,你可以通过以(ie, )\开头的正则表达式来大大减少所需的 s数量。\v: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/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 yy6pyanks 行并粘贴 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 中运行替换正则表达式。

或者,将一些寄存器专用于该目的 - 比如说 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="ном

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

于 2013-03-21T20:15:48.937 回答
4

q您可以通过在escape模式中按下来录制宏。例如,

  1. 将光标放在要编辑的名词上。
  2. 按下qa开始录制宏并将其存储在寄存器中a(其他字母和数字也可用于寄存器)。
  3. 执行您想要执行的任何常规操作(复制行、粘贴、附加字母等,就像您尝试在搜索字符串中显示的那样)。
  4. 完成更改后,在escape模式下q再次按下。

您的宏现在已在 register 中创建a。每当您想重复按键序列时,只需按@a

请注意,您可以在recording模式下执行任何操作,包括任何类型的命令、插入、光标移动等。有关宏和相关选项的更多信息,请查看 Vim 帮助:h complex-repeat

Vim 寄存器被共享为宏和 yanked 测试的占位符;此功能甚至允许您在文件中保存和编辑宏。有关详细信息,请参阅此问题

于 2013-03-21T20:11:10.753 回答
1

这是一个地图解决方案 - 它将线条复制到缓冲区中,然后使用 p 粘贴。A 附加在行尾

  map <F2> 0dwpo<esc>pAa<enter><esc>pAam<enter><esc>pAax ...etc
于 2013-03-21T20:36:20.823 回答
1

如果你的目标是,当你的光标在一个特殊的词上,然后按下一些东西,vim 会附加不同的“后缀”(我希望我用了正确的词,但你知道我的意思)。你可以去宏(q)。但是,由于您已经编写了该:s命令,您可以使用该命令创建一个映射,执行相同的操作,并且它会更短。

在命令行中,您可以通过按 获取光标下的单词<c-r><c-w>。所以你可以尝试:

nnoremap <leader>z :s/<c-r><c-w>/& & &..../<cr>

我没有写这& & &...部分,因为我不知道(从未尝试过,我在 windows 下没有 vim。我什至没有 windows)是否\n可以在 windows 下使用换行符。 &表示整个匹配的部分,在这种情况下是光标下的单词。

因此,您只需将光标移动到单词 type<leader>z上,vim 就会为您完成这项工作。(如果更换部件是正确的:))。

于 2013-03-21T20:54:37.010 回答