如何在vim中重复添加单词两侧的文本?

如何在vim中重复添加单词两侧的文本?,vim,editor,vi,Vim,Editor,Vi,我在Python脚本中有一堆局部变量引用,我想从字典中取而代之。因此,我需要将foo,bar,以及其他内容更改为env['foo'],env['bar'],等等。我是否需要编写一个正则表达式并匹配每个变量名以进行转换,或者是否有一种更直接的方法可以通过命令重复执行?我找到了一种方法来完成我需要的操作。使用q{0-9a-zA-Z”}将按键笔划记录到缓冲区中。将光标定位在变量名称的下方,然后cw并键入env['']。接下来将光标向后移动一个空格到最后一个引号,并使用P粘贴从cw命令填充的缓冲区。最后

我在Python脚本中有一堆局部变量引用,我想从字典中取而代之。因此,我需要将
foo
bar
,以及其他内容更改为
env['foo']
env['bar']
,等等。我是否需要编写一个正则表达式并匹配每个变量名以进行转换,或者是否有一种更直接的方法可以通过
命令重复执行?

我找到了一种方法来完成我需要的操作。使用
q{0-9a-zA-Z”}
将按键笔划记录到缓冲区中。将光标定位在变量名称的下方,然后
cw
并键入
env['']
。接下来将光标向后移动一个空格到最后一个引号,并使用
P
粘贴从
cw
命令填充的缓冲区。最后,使用
@{0-9a-z.=*}
对每个变量重复使用录制。

您可以使用宏:一次性键入这些命令(使用空格仅插入注释)

“首先移动到相关单词的开头(即通过搜索)
qa“将宏记录到a寄存器中。
ienv['”插入相关条目
ea']”移动到单词末尾并插入相关片段
q“停止录制

然后,当你进入下一个单词时,只需点击
@a
重播宏(或者甚至点击
@
重播宏之后的最后一次重播)。

有一种更简单的方法-可以使用正则表达式搜索和替换。通过键入冒号进入cmdline模式,然后运行以下命令:

%s/\\(foo\|bar\|baz\\)/env['\1']/

用实际变量名替换
foo
bar
baz
。您可以添加任意数量的附加变量,只需确保用反斜杠转义或管道即可。希望这会有所帮助。

您可以编写一个功能,将其添加到.vimrc文件中:

function! s:surround()
    let word = expand("<cword>")
    let command = "%s/".word."/env[\'".word."\']/g"
    execute command
endfunction
map cx :call <SID>surround()<CR>
函数!s:surround()
让word=展开(“”)
let command=“%s/”.word./env[\'”.word.\']/g”
执行命令
端功能
映射cx:调用环绕()
这将围绕光标下当前出现的单词

如果要指定每个实例之前和之后的内容,可以使用以下方法:

function! s:surround()
    let word = expand("<cword>")
    let before = input("what should go before? ")
    let after = input("what should go after? ")
    let command = "%s/".word."/".before.word.after."/g"
    execute command
endfunction
map cx :call <SID>surround()<CR>
function! s:surround()
    let word = expand("<cword>")
    let before = input("what should go before? ")
    let after = input("what should go after? ")
    let command = "%s/".word."/".before.word.after."/c"
    execute command
endfunction
map cx :call <SID>surround()<CR>
函数!s:surround()
让word=展开(“”)
let before=输入(“什么应该在前面?”)
let after=输入(“应该在后面做什么?”)
let command=“%s/”.word.“/”.before.word.after.“/g”
执行命令
端功能
映射cx:调用环绕()
如果您只想确认变量的每个实例,可以使用:

function! s:surround()
    let word = expand("<cword>")
    let before = input("what should go before? ")
    let after = input("what should go after? ")
    let command = "%s/".word."/".before.word.after."/g"
    execute command
endfunction
map cx :call <SID>surround()<CR>
function! s:surround()
    let word = expand("<cword>")
    let before = input("what should go before? ")
    let after = input("what should go after? ")
    let command = "%s/".word."/".before.word.after."/c"
    execute command
endfunction
map cx :call <SID>surround()<CR>
函数!s:surround()
让word=展开(“”)
let before=输入(“什么应该在前面?”)
let after=输入(“应该在后面做什么?”)
let command=“%s/”.word.“/”.before.word.after.“/c”
执行命令
端功能
映射cx:调用环绕()

好问题;我使用“surround.vim”(在谷歌上搜索)对于空格,但用括号/方括号括起来,并在前面加上函数名或字典名将是非常棒的。我恭敬地建议您等待,看看是否有比当前3个曲面更好的答案…这比我的答案短一两个字符。谢谢!我一直忽略了录制的宏,我应该开始更频繁地使用它们。根据单词的组织方式,您可以在停止录制前将光标放在下一个单词的开头。然后只需重复录制的宏n-1次(作为已更改为录制宏的第一个单词)我在vimrc中映射了
:vmap@:normal!
,这样我就可以在可视选择的行范围内执行宏,并执行
n次。这是通过可视选择,点击
@
,键入宏的字母,然后最后点击enter键来实现的。这可以用前缀和后缀参数化,以便更通用的use?同样,它在整行上运行。光标下的单词如何?我确信它可以参数化,但说实话,我不太熟悉vim函数,所以我不知道如何操作。你可以通过
let before=input(“在.word之前应该放什么文本”)获得用户输入
每次替换将花费更多时间,但会更加灵活。我将使用包含此内容的版本编辑答案。在我的测试中,此选项将替换文件中当前单词的每个实例。是否希望一次只对一个单词执行操作?我将使用一个选项更新答案。按@两次可重复上一次macro