假设我编写了引用x维度的代码。让vim复制代码行替换所有对x到y和z的引用的最佳方法是什么(最好是最清晰的方法)。
输入:
length_x = X_vec.dot(X_vec)**.5
期望的输出:
length_x = X_vec.dot(X_vec)**.5
length_y = Y_vec.dot(Y_vec)**.5
length_z = Z_vec.dot(Z_vec)**.5
到目前为止,这是我最好的。
function SwitchXtoYZ()
:normal yy
:normal p
:normal! V
:s/X/Y/ge
:normal! V
:s/x/y/ge
:normal p
:normal! V
:s/X/Z/ge
:normal! V
:s/x/z/ge
endfunction
command XtoYZ exec SwitchXtoYZ() | :normal `.
它有效,但我觉得这不是很有趣。如果光标返回到发出命令XtoYZ之前的位置(它当前是第二个插入行的开头),则会获得奖励。
答案 0 :(得分:1)
每行开头的:是可选的,:normal! V
行也是可选的。
您正在利用您所知道的Normal命令,这是一种很好的启动方式,但如果您使用更多Command-mode(ex)命令和函数,则可以获得更清晰的代码。我会做这样的事情:
function! SwitchXtoYZ()
let save_cursor = getpos(".")
copy .
s/X/Y/ge
s/x/y/ge
-copy .
s/X/Z/ge
s/x/z/ge
call setpos('.', save_cursor)
endfun
command! XtoYZ call SwitchXtoYZ()
:help function-list
:help getpos()
:help :call
:help :exec
答案 1 :(得分:1)
您不需要执行此功能,宏可以满足您的要求。如果你愿意的话,你也可以在你的vimrc中定义一个宏,这样你每次打开vim就可以拥有它。
这是宏:
qqv<Esc>Y2p:s/x/y/gi<Enter>n:s//z/gi<Enter>`<q
所以它被记录并保存在注册表q
中,您可以@q
重播它。
解释一下:
qq " start recording into q
v<esc> " enter visual mode and exit. to let `< work
Y2p " yank current line and paste twice below
:s/x/y/gi<Enter> " x->y sub, case insensitive
n " go to next x (here we could use j too)
:s//z/gi<Enter> " do another sub x->z
`< " back to the old cursor position
q " end recording
如果您想要X->Y
和x->y
,只需删除i
标记,再添加两个:s