是否有一个vim命令可以交叉两个单词与一个运算符交叉?

时间:2018-02-10 13:06:43

标签: vim

例如,猜猜我有这个块。

if( first > second)
{
}

我想把这些单词换成一个操作符。

if( second > first)
{
}

自然如何处理vim命令?

4 个答案:

答案 0 :(得分:2)

如果您想手动执行此操作,可以执行以下操作(光标位于first):

yiw    yank current word
ww     move cursor to 'second'
viw    visually select current word
p      put from unnamed register (selected word goes to unnamed register)
bbb    move cursor back to 'first'
viw    visually select current word
p      put from unnamed register

这是相对直观的,但无可否认,非常涉及。

您可以将其映射到一些易于键入的键组合:

nnoremap <key> yiwwwviwpbbbviwp

但你可能最终不得不在角落案件之后与角落案件作斗争。

或者您可以将此代码段(找到here)放在vimrc中,然后只需按<key1>即可将当前“字”与之前的<key2>交换为交换当前的“单词”与下一个:

nnoremap <key1>  "_yiw?\v\w+\_W+%#<CR>:s/\v(%#\w+)(\_W+)(\w+)/\3\2\1/<CR><C-o><C-l>
nnoremap <key2> "_yiw:s/\v(%#\w+)(\_W+)(\w+)/\3\2\1/<CR><C-o>/\v\w+\_W+<CR><C-l>

答案 1 :(得分:2)

我有vim-exchange插件,允许我以这种方式更改单词。

在第一个单词时按cxiw,然后跳到第二个单词并按.

答案 2 :(得分:1)

以更自然的方式做到这一点,怎么样?

:map <f7> <esc>dbwPwdwbbPl<esc>

将光标放在<上,然后按 F7

答案 3 :(得分:1)

此解决方案使用以下功能:

function! Swap()
  normal di)
  let a=split(@")
  let @b=a[2]." ".a[1]." ".a[0]
  normal %"bp
endfunction

可以映射到gs,例如:

nnoremap <silent> gs :call Swap()<cr>

这种方法的一个缺点是它比基于mappigs的解决方案更复杂。它的优点是它可以将光标放在括号(...)内的任何位置。