1

假设我有这两个块:

1
23
456

hello..
world world
codecode

然后我需要这个块(在1hello..之间,之间没有任何空格):

1hello..
23world world
456codecode

什么是最好的快速方法?


我在 windows xp 和 windows 7 上使用 gvim7.3.46

这是我的 _vimrc

set nocompatible
source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
behave mswin

set diffexpr=MyDiff()
function MyDiff()
  let opt = '-a --binary '
  if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
  if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
  let arg1 = v:fname_in
  if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
  let arg2 = v:fname_new
  if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
  let arg3 = v:fname_out
  if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
  let eq = ''
  if $VIMRUNTIME =~ ' '
    if &sh =~ '\<cmd'
      let cmd = '""' . $VIMRUNTIME . '\diff"'
      let eq = '"'
    else
      let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
    endif
  else
    let cmd = $VIMRUNTIME . '\diff'
  endif
  silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3 . eq
endfunction

我用过C-r",但是没有用。

1
23
456
hello..
world world
codecode

我用C-q, y, C-p, 结果是:

1
23
456

1  hello..
23 world world
456codecode
4

3 回答 3

3
  1. 将光标放在 上1

  2. 点击<C-v>进入视觉块模式。

  3. 向下移动光标456并点击$以选择整个块。

  4. 点击y以拉动该块。

  5. 将光标放在hin 上hello

  6. P

于 2013-07-05T07:28:25.527 回答
3

我会使用视觉块模式。这样做:

  1. 在第一个区块开始时,按<C-v>进入可视区块模式。
  2. 选择相关行,然后按$将选择范围扩展到行尾。
  3. d删除第一个块。这也将复制它。
  4. 然后P在第二个块的开头按,将第一个块粘贴到第二个块之前,中间没有空格。

然后第一行范围将为空,因此如果您不想要这些行,则必须删除它们。

于 2013-07-05T07:29:14.407 回答
1

使用递归宏在两个块之间来回跳转,删除和加入行:

qq}jdd''pkgJj@qq

值得注意的击键:

  • ''跳回到你最近跳的那一行
  • @qq从定义内部调用宏q
  • gJ连接两条线,它们之间没有空格

递归宏

于 2013-07-05T08:59:59.457 回答