我有一个小的映射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
Run Code Online (Sandbox Code Playgroud)
测试文件:
vim: foldmethod=marker
fold A {{{
some
text
here
}}}
fold B {{{
some
text
here
}}}
fold C {{{
some
text
here
}}}
fold D {{{
some
text
here
}}}
Run Code Online (Sandbox Code Playgroud)
问题:
当我加载测试文件(所有折叠都关闭)并将光标放在其中一个折叠上时,首先 和AltUp键AltDown似乎会像预期的那样移动折叠。但如果你不断地把折痕一个接一个地移动,那么:
:e) 似乎可以修复折叠。有时它会在第一个动作中发生,有时则不会。我什至有过一些测试用例,其中折叠边界会被错误地检测到,而不是根本没有被检测到。例如,Vim 认为的折叠是从中间行开始的text。
--- 编辑 ---
更多测试:
移动折叠 A 似乎导致了大部分问题。如果你不碰折叠 A,我认为你可以移动折叠 B、C 和 D,而不会遇到问题。
如果将折叠 A 向上移动两次(请参阅注释 1),则会损坏折叠 B、C 和 D。如果将折叠 A 向下移动一次(请参阅注释 2),则会损坏折叠 B。
(note-1) 将光标放在折叠 A(第 5 行)上,然后执行 do :move3、:move2或 do :move-2、then kj、then :move-2。
(注2)将光标放在折叠A(第5行)上,然后执行:move14
我注意到,在任何:move操作之后,光标都会放置在折叠最后一行的第一列。但是,即使您在执行第二个命令:move-2之前将光标重置到折叠 A 的第一行,在折叠 A 上执行两次该命令也会损坏折叠 B、C 和 D。:move-2
如果重要的话:在 Windows 上使用 gvim 7.3
您只需删除整行并将其粘贴即可,开箱即用(并且具有折叠意识)
nnoremap <a-down> ddp
nnoremap <a-up> ddkP
Run Code Online (Sandbox Code Playgroud)
此外,向上版本在文件底部不起作用。
| 归档时间: |
|
| 查看次数: |
459 次 |
| 最近记录: |