在 Vim/NeoVim 中,如何在不修改内容的情况下在文本缓冲区内绘制

In Vim/NeoVim, how to draw inside text buffer without modifying content

例如,假设我想实现一个使用自定义字符在 80 列处绘制边距线的插件(假设我希望该线由 * 个字符的列组成)。

如何在 Vim 或 Neovim 中完成?

但更一般地说,有没有一种方法可以在不影响文本内容的情况下在文本缓冲区上绘制内容?

例如,我如何在 window 中绘制一个内部矩形,我可以将其涂成鲜艳的颜色以显示活动的 window?效果是当前文本缓冲区的第一行可见行将填充 --- 个字符,当前文本缓冲区的最右列将填充 | .这将在 window 内,与状态线或垂直分割线分开。

等这种事情怎么做到的?

目前以不同方式在文本缓冲区上绘制的一些插件:

EasyMotion 不会在文本上绘制,我认为这是不可能的。 它的作用在以下函数中定义 (sourcecode):

function! EasyMotion#helper#VarReset(var, ...) "{{{
if ! exists('s:var_reset')
    let s:var_reset = {}
endif

if a:0 == 0 && has_key(s:var_reset, a:var)
    " Reset var to original value
    " setbufvar( or bufname): '' or '%' can be used for the current buffer
    call setbufvar('%', a:var, s:var_reset[a:var])
elseif a:0 == 1
    " Save original value and set new var value

    let new_value = a:0 == 1 ? a:1 : ''

    " Store original value
    let s:var_reset[a:var] = getbufvar("", a:var)

    " Set new var value
    call setbufvar('%', a:var, new_value)
endif
endfunction "}}}

所以它保存每个替换的字符并在之后恢复它们。 我没有看过 indentLine,但它可能做智能 listchars,因为 indentchar 下从来没有文本。

无论如何,我并不是其中一个插件的专家,也不是一般的 vim。我之所以写这个答案是因为我认为有更简单的方法可以实现您想要的。例如,您可以用某种颜色突出显示边界线,或更改活动拆分的背景。还有一个用于调暗非活动拆分的插件:https://github.com/blueyed/vim-diminactive