首页 > 解决方案 > 如果 Vim 中有多个空间,则渲染空间

问题描述

我用了:

set listchars=tab:→\ ,trail:·,precedes:←,extends:→,nbsp:·,space:·

渲染空格和制表符。

但我只想显示 >=2 个空格,我不想显示它是否在其他字符之间有一个空格。

"editor.renderWhitespace": "boundary"在vscode中也是一样的) 在此处输入图像描述

我可以在 Vim 中完成吗?(configplugin

谢谢你。

编辑:我使用:

if exists('space_match')
  call matchdelete(space_match)
endif
let space_match = matchadd('Conceal', '\v( @<= )|(  @=)', -1, -1, {'conceal': '·'})

并删除空间listchars

set listchars=tab:→\ ,trail:·,precedes:←,extends:→,nbsp:·

非常感谢 Ben Knoble 帮我找到那个!!!

标签: vimvim-plugin

解决方案


使用隐藏,有几种方法可以实现,具体取决于您想要实现的目标。由于我们使用隐藏,您需要space'listchars'.

我将在matchadd()下面使用,但理论上你可以使用syn-conceal. 不同之处在于匹配是窗口本地的。语法在定义的地方可用——您可以使用任何文件类型或其他机制通过语法来设置它。

我假设正则表达式\s(匹配空格)与您需要的匹配。如果您只需要空格,请在正则表达式中更改\s(单个空格字符)。

我假设您可以阅读 vim 正则表达式。帮助页面很广泛,但请注意下面我\v用来显式设置魔法类型(matchadd对影响正则表达式的选项很敏感'magic'),并且我\zs在适当的地方使用来开始匹配。

我将使用下面的测试文本。

测试文件

word word  word   word
word word  word   word

set conceallevel=1

在第 1 级,我们可以在比赛中使用替换字符。

因此,我们可以用例如 a 替换所有额外的空格.以使它们突出:

let space_match = matchadd('Conceal', '\s\@<=\s+', 10, -1, {'conceal': '.'})

(10 是默认优先级,-1 请求匹配的新 ID。)

打扫干净

要摆脱匹配/隐藏,您可以简单地

call matchdelete(space_match)

OP 表示以下方法最适合该问题:

let space_match = matchadd('Conceal', '\v( @<= )|(  @=)', -1, -1, {'conceal': '·'})
  • 优先-1兼容indentLine
  • ( @<= )匹配一个又一个空格
  • ( @=)在另一个空格之前匹配一个空格

推荐阅读