我在Python脚本中有一堆本地变量引用,我想从字典中提取。因此,我需要将foo
,bar
和其他人更改为env['foo']
,env['bar']
等等。我是否需要编写正则表达式并将每个变量名称与变换匹配,或者是否有更直接的方法可以用.
命令重复?
答案 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']/
用您的实际变量名称替换foo
,bar
和baz
。您可以根据需要添加任意数量的其他变量,只需确保使用反斜杠转义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".=*}
的记录。