gpt4 book ai didi

vim - 在 Vim 中,为什么是 :move randomly corrupting my folds?

转载 作者:行者123 更新时间:2023-12-01 05:21:14 24 4
gpt4 key购买 nike

我有一个 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 )似乎修复了折叠。

  • 有时它会随着第一个 Action 发生,有时不会。我什至有测试用例,折叠边界会被错误地检测到,而不是根本没有被检测到。例如,Vim 认为的折叠从中间行 text 开始。

    - - 编辑 - -
    更多测试:
    移动折叠 A 似乎导致了大部分问题。如果你不碰折叠 A,我认为你可以移动折叠 B、C 和 D 而不会遇到问题。

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

    (note-1) 将光标放在折叠 A(第 5 行)上,然后执行 :move3:move2 或执行 :move-2 ,然后是 kj ,然后是 :move-2
    (note-2) 将光标放在折叠 A(第 5 行)上,然后执行 :move14
    我注意到的一点是,在任何 :move 操作之后,光标会被放置在折叠最后一行的第一列。但是,即使您在执行第二个 :move-2 命令之前将光标重置到折叠 A 的第一行,对折叠 A 执行两次命令 :move-2 也会破坏折叠 B、C 和 D。

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

    最佳答案

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

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

    此外,up 版本在文件底部不起作用。

    关于vim - 在 Vim 中,为什么是 :move randomly corrupting my folds?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16592654/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com