gpt4 book ai didi

接受用户输入的 Vim 宏

转载 作者:行者123 更新时间:2023-12-05 02:11:16 29 4
gpt4 key购买 nike

假设我有以下文本文件

name: John Doe
description: My name is John Doe and I'm really good at vim!
name: John Doe
description: My name is John Doe and I'm really good at vim!
name: John Doe
description: My name is John Doe and I'm really good at vim!
name: John Doe
description: My name is John Doe and I'm really good at vim!

有没有办法录制执行以下操作的宏:

从第一个John开始:

  1. cw但允许运行宏的用户在这里输入

  2. js<is>w后面偷偷说的是

  3. .用给定的输入替换 John
  4. 重复

理想情况下,我想在第一行输入以下击键:

@qJane

并且有:

name: Jane Doe
description: My name is Jane Doe and I'm really good at vim!

@qJim

name: Jim Doe
description: My name is Jim Doe and I'm really good at vim!

最佳答案

获取用户输入的最简单方法是使用 input() 函数,它允许您提示输入名称并在表达式中使用它。

不幸的是,您不能真正从宏中使用它,因为宏也会记录您对提示的回答(并且重播您构建的宏会遇到类似的问题。)

您可以从一个函数中使用它并将该函数绑定(bind)到一个键映射:

function! ChangeName()
let newname = input('Name? ')
return '0/\<John\>'."\<cr>cw".newname."\<esc>n."
endfunction
nnoremap <expr> <leader>cn ChangeName()

然后您可以输入 \cn ,这将提示您输入一个新名称。键入新名称并按 ENTER 后,它将替换前两次出现的 John。使用新名称。

函数返回映射的扩展,使用<expr>在 map 命令中让它使用函数的返回值。 (让函数发出带有 :normal!:execute 命令也是一种可能的方法。)

您提到按 @qJim@qJane ,其中没有提示,新名称“感觉”像是命令的一部分。通过使用 getchar() 可以更接近类似的东西在映射背后的函数的循环中。您还需要决定如何终止名称,您会在最后输入 ENTER 吗?您会使用计时来决定命令何时结束(需要快速键入吗?)如果您使用 getchar(),您可能还需要处理退格和取消命令。 .使用 input()肯定更容易,并且根据您的特定用例可能就足够了。

关于接受用户输入的 Vim 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57788828/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com