Vim复制和粘贴行与搜索和替换

时间:2013-12-31 20:04:40

标签: vim

假设我编写了引用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之前的位置(它当前是第二个插入行的开头),则会获得奖励。

2 个答案:

答案 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->Yx->y,只需删除i标记,再添加两个:s