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

时间:2011-05-31 19:54:47

标签: vim editor vi

我在Python脚本中有一堆本地变量引用,我想从字典中提取。因此,我需要将foobar和其他人更改为env['foo']env['bar']等等。我是否需要编写正则表达式并将每个变量名称与变换匹配,或者是否有更直接的方法可以用.命令重复?

4 个答案:

答案 0 :(得分:6)

您可以使用宏:一次输入这些命令(间距只是为了插入注释)

             " first move to start of the relevant word (ie via search)
qa           " record macro into the a register.
ienv['<esc>  " insert relevant piece
ea']         " move to end of word and insert relevant piece
q            " stop recording

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

答案 1 :(得分:5)

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

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

用您的实际变量名称替换foobarbaz。您可以根据需要添加任意数量的其他变量,只需确保使用反斜杠转义OR管道。希望有所帮助。

答案 2 :(得分:3)

你可以编写一个能很好地完成这项工作的函数,将它添加到你的.vimrc文件中:

function! s:surround()
    let word = expand("<cword>")
    let command = "%s/".word."/env[\'".word."\']/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."/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>

答案 3 :(得分:0)

我想出了一种方法来做我需要的事情。使用q{0-9a-zA-Z"}将键击记录到缓冲区中。将光标定位在变量名称的前面,然后cw并键入env['']。接下来将光标向后移动一个空格到最后一个引号,并将cw命令填充的缓冲区粘贴到P。最后,为每个变量重复使用@{0-9a-z".=*}的记录。