如果 Vim 中有多个 space,则渲染 space

Render space if it have multi space in Vim

我用过:

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

渲染 space 和制表符。

但我只想显示 >=2 space,如果它有一个 space 其他字符之间我不想显示。

(与vscode中的"editor.renderWhitespace": "boundary"相同)

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

谢谢。

编辑: 我使用:

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

并删除 listchars 中的 space:

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

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

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

中删除 space

I'll be using matchadd() below, but you can theoretically do something similar with syn-conceal. The difference is that a match is local to a window. Syntax is available where defined—you could use any filetype or other mechanism to set this via syntax.

I assume that the regex \s (match whitespace) matches what you need. If you need only spaces, change \s to </code> (a single space character) in the regexp.</p> <p>I assume you can read vim regexp. The help pages are extensive, but do note below that I use <code>\v to explicitly set the magic type (matchadd is sensitive to regex-influencing options like 'magic') and I use \zs where appropriate to start the match.

I'll be using the test text below.

测试文件

word word  word   word
word word  word   word

set conceallevel=1

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

因此,我们可以将所有额外的 space 替换为例如 . 以使其脱颖而出:

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

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

正在清理

要摆脱 match/conceal,您只需

call matchdelete(space_match)

OP 表示以下内容最适合该问题:

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