有几种方法可以解决这个问题。您可以创建宏,也可以创建地图。两者都可以在运行 VIM 时完成。两者都可以放在另一个文件中(例如,您的.vimrc,或具有特定于该项目的绑定的文件)并在需要时获取。
我也会给你更多关于正则表达式的建议:如果你写的东西特别复杂,你可以通过以\v开头的正则表达式来大大减少\s的数量(即@987654324 @)。
在 VIM 中创建宏
您可以通过在普通模式下按 q 来在 VIM 中启动宏,然后按您希望用于宏的键。然后,您可以通过按 @ 后跟宏的字母来调用宏。在普通模式下再次按 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
“nnoremap”开头的n表示它只在正常模式下起作用。
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="ном
在这种情况下,我们使用了在点击使用它的命令(例如粘贴)之前按 " 和寄存器名称的功能。