加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 01:57:46 所属栏目:安全 来源:网络整理
导读:我有一个AltUp和AltDown的小映射,可以将文本上下移动一行.我决定将这些映射设置为“折叠感知”,以便将文本向上移动一行将使其移过闭合折叠.但是当我玩这些映射时,vim会破坏我的折叠. 映射: 映射通过调用:move函数来工作.参数:move是绝对行号,低于该行号应
我有一个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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读