我有 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 键似乎像预期的那样移动折叠。但是,如果你继续将折叠移动到彼此之上,那么:
:e
)似乎可以解决问题。有时会发生第一次运动,有时不会发生。我甚至有测试用例,其中折叠边界被错误地检测到而不是根本没有被检测到。例如,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
答案 0 :(得分:1)
你可以删除整行并粘贴它,开箱即用(并且可以识别折叠)
nnoremap <a-down> ddp
nnoremap <a-up> ddkP
此外,升级版本无法在文件底部使用。