我正在编辑文本文件中的字典,其中包含俄语单词 - 每行一个单词。
一些名词缺少派生词,派生词通常是同一个词加上几个字母 - 有 6-7 个变体,如屏幕截图所示:
在 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 时都可用。
- 创建要将此宏存储在 (
:new
) 中的文件。 将以下行添加到文件中:
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 字符。 )- 保存文件(
:w testmacro.vim
)。 - 来源(
:so %
或:source %
)。 - 通过在您想要执行此操作的行之一上键入 @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/