在Vim中,为什么:随意腐蚀我的褶皱?

时间:2013-05-16 16:19:49

标签: vim folding

我有 Alt Up Alt Down 的小映射,它可以在一行上下移动文本。我决定将这些映射设置为“折叠感知”,以便将文本向上移动一行将移动到闭合折叠。但是当我玩这些映射时,vim会破坏我的折叠。

映射:
映射通过调用:move函数来工作。 :move的参数是绝对行号,低于该行号应该移动文本。

nnoremap <A-Down> :call MoveDown_n()<CR>
nnoremap <A-Up> :call MoveUp_n()<CR>

function! MoveUp_n() range
let pos = getpos(".")
normal k
let line_pos = line(".") - 1
call setpos(".", pos)
execute "m".line_pos
endfunction

function! MoveDown_n() range
let pos = getpos(".")
normal jj
let line_pos = line(".") - 1
call setpos(".", pos)
execute "m".line_pos
endfunction

测试文件:

 vim: foldmethod=marker



fold A {{{
some
  text
     here
}}}
fold B {{{
some
  text
     here
}}}
fold C {{{
some
  text
     here
}}}
fold D {{{
some
  text
     here
}}}

问题:
当我加载测试文件(所有折叠关闭)并将光标放在其中一个折叠上时,首先 Alt Up Alt Down 键似乎像预期的那样移动折叠。但是,如果你继续将折叠移动到彼此之上,那么:

  1. 褶皱开始变得未展开(“腐败”),没有明显的原因。
  2. 你无法关闭这些折叠,因为vim无法检测到那里有折叠。
  3. 保存并重新编辑文件(:e)似乎可以解决问题。
  4. 有时会发生第一次运动,有时不会发生。我甚至有测试用例,其中折叠边界被错误地检测到而不是根本没有被检测到。例如,Vim认为的折叠从中间线text开始。

    ---编辑---
    更多测试: 移动折叠A似乎导致大多数问题。如果你没有触摸折叠A,我认为你可以移动折叠B,C和D而不会遇到问题。

    如果您将折叠A向上移动两次(参见注释1),它将损坏折叠B,C和D.如果您将折叠A向下移动一次(参见注释-2),它将损坏折叠B。

    (注释1)将光标放在折叠A(第5行)上,然后执行:move3:move2或执行:move-2,然后执行kj,然后执行{{ 1}}。
    (注释-2)将光标放在折叠A(第5行)上,然后执行:move-2

    我注意到的是,在任何:move14操作之后,光标位于折叠最后一行的第一列。但是,在执行第二个:move命令之前,即使您要将光标重置为折叠A的第一行,也会在折叠A上执行两次命令:move-2将损坏B,C和D的折叠。 / p>

    如果重要:在Windows上使用gvim 7.3

1 个答案:

答案 0 :(得分:1)

你可以删除整行并粘贴它,开箱即用(并且可以识别折叠)

nnoremap <a-down> ddp
nnoremap <a-up> ddkP

此外,升级版本无法在文件底部使用。