微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我有一个AltUp和AltDown的小映射,可以将文本上下移动一行.我决定将这些映射设置为“折叠感知”,以便将文本向上移动一行将使其移过闭合折叠.但是当我玩这些映射时,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
}}}

问题:
当我加载测试文件(关闭所有折叠)并将光标放在其中一个折叠上时,首先AltUp和AltDown键似乎按照预期移动折叠.但是如果你继续将褶皱移动到彼此之上,那么:

>褶皱开始变得未扩张(“腐败”),没有明显的原因.
>你无法关闭这些折叠,因为vim无法检测到那里有折叠.
>保存并重新编辑文件(:e)似乎可以修复折叠.

有时会发生第一次运动,有时不会发生.我甚至有测试用例,其中折叠边界被错误地检测到而不是根本没有被检测到.例如,Vim认为的折叠以中间线文本开头.

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

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

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

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

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

解决方法

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

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

此外,版本不在文件底部.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐