如何在vim中具有同一缓冲区的多个视图?

问题描述 投票:0回答:1

我一直在尝试在vimscript中实现一个功能,以便在同一缓冲区的两个视图之间切换。我想要的功能是这样的:我按一个键,屏幕位置和光标移到我以前保存的位置。如果没有另一个保存的位置,它将在当前视图和光标位置创建一个位置。我有一个vimscript函数,正是我所描述的功能:

fun! SwitchFileMarker(reset)

    if a:reset == 1
        if exists("b:switch_file_window")
            unlet b:switch_file_window
        endif
    endif

    if exists("b:switch_file_window")
        let cursor_location = getpos("'0")
        let top_location = getpos("'9")
        :execute "normal! m0Hm9`0"
        call setpos('.', top_location)
        :execute "normal! zt"
        call setpos('.', cursor_location)
        :execute "normal! zv"
    else
        " save the location
        :execute "normal! m0Hm9`0"
    endif

    let b:switch_file_window = 1
endfun

nmap <leader>b :call SwitchFileMarker(0)<CR>
nmap <leader>B :call SwitchFileMarker(1)<CR>

此函数的唯一问题是,我希望它在调用该函数时保存当前视图的折叠并加载保存的视图的折叠。我可以使用:mkview和:loadview来实现这一点,但是问题是如果文件中的行数改变了,折叠就会丢失。 :mkview函数似乎记得特定行号的折叠,如果在编辑文件时ive在折叠位置上方添加了几行,当我使用:loadview时,折叠会丢失。使用标记,就像我在函数中所做的那样,可以保存光标位置(但不折叠),因为标记可以跟踪不断变化的行号。我想要获得的功能本质上就像在一个窗口中有两个缓冲区视图,而不是在两个窗口中。如果我有两个窗口编辑相同的缓冲区,则可以在一个窗口中添加行,而在另一个窗口中不折叠,因此这正是我想要的功能,只是在一个窗口中而不是在两个窗口中。有什么建议可以做到吗?

vim neovim
1个回答
0
投票

使用标记!

要设置标记,可以使用m<letter>:mark <letter>

要转到标记行,请使用'<letter>。要移至确切位置,请选择`<letter>

如果字母是小写字母,则它是局部于缓冲区的。如果为大写,则为全局。

编辑:OP希望保存折页,而这不能做。但是无论如何了解还是有帮助的,所以我留下答案了。

© www.soinside.com 2019 - 2024. All rights reserved.