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

在Vim/NeoVim中,如何在不修改内容的情况下在文本缓冲区内绘制,vim,neovim,Vim,Neovim,例如,假设我想实现一个插件,它使用自定义字符在80列处绘制边距线(假设我想从*字符列中绘制边距线) 如何在Vim或Neovim中实现这一点 但更一般地说,有没有一种方法可以在不影响文本内容的情况下在文本缓冲区上绘制内容 例如,如何在一个窗口内绘制一个内部矩形,使其颜色鲜艳以显示活动窗口?其效果是,当前文本缓冲区的第一行可见行将填充--字符,当前文本缓冲区的最右列将填充|。这将在窗口内,与状态线或垂直分割线分开 等等,怎么做这样的事情 当前以不同方式在文本缓冲区上绘制的一些插件: EasyM

例如,假设我想实现一个插件,它使用自定义字符在80列处绘制边距线(假设我想从
*
字符列中绘制边距线)

如何在Vim或Neovim中实现这一点

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

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

等等,怎么做这样的事情

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


EasyMoon没有覆盖文本,我认为这是不可能的。 其作用在以下函数中定义):

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


总之,我并不是一个插件或vim方面的专家。我写这个答案是因为我认为有更简单的方法来实现你想要的。例如,可以使用特定颜色高亮显示边界线,或更改活动分割的背景。还有一个用于调暗非活动拆分的插件:

'set colorcolumn=80'
改为工作吗?请参见
:h'cc'
我想我喜欢vim,但希望它在GUI绘图能力方面更加现代。也许20年后我们会有这样的感觉。我很喜欢vim这种不受干扰的外表。我想大多数时候我都希望有一些GUI功能,因为我使用vim是错误的(我不想说,你的问题就是这样),而且要花很多时间来适应它,我还有很长的路要走=)。但部分原因是,我们已经习惯了这么多的文本编辑器,它们做的事情是“错误的/不是vim方式”。如果我们从vim开始,它将是完美的。没错,但是有一些基本的UI样式是基于文本的UI无法实现的。在GUI中,很容易绘制有用的东西,比如缩进指南(vim插件是性能不好的黑客)、带有有用颜色和符号的最小地图,以及其他在基于文本的UI中不可能实现的东西,这些东西不一定是使用vim的缺点。即使一个人精通Vim,像小地图这样的东西对那些非常视觉化的人来说仍然是有用的。有些人喜欢隐藏的缓冲区,而他们不是视觉化的人,他们对自己的工作流程进行心理映射,这很好。GUI只允许文本中不可能的其他功能,即使用户是Vim中编辑原始文本的忍者。是的,GUI当然有优势,我无意说你错了。对不起,如果我给了你这种感觉。我只是说,我认为即使在20年内也不会发生,因为vim的许多优势可能会与GUI发生冲突。最重要的是,在您使用的每个系统/服务器上都有相同的环境。
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 "}}}