如果Vim中有多个空间,则呈现空间

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

我用过:

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

渲染空格和制表符。

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

((与vscode中的"editor.renderWhitespace": "boundary"相同)enter image description here

我可以在Vim中做到吗?(configplugin

谢谢。

编辑:我使用:

if exists('space_match')
  call matchdelete(space_match)
endif
let space_match = matchadd('Conceal', '\v( @<= )|(^ )', -1, -1, {'conceal': '·'})
  • 我使用优先级-1indentLine兼容
  • [( @<= )以匹配另一个空格之后的空格
  • [(^ )以匹配第一个空格

并删除listchars中的空间:

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

非常感谢本·诺布尔(Ben Knoble)帮助我找到了!!!

vim vim-plugin
1个回答
2
投票

使用隐藏,有两种方法可以实现,具体取决于您要实现的目标。

我将在下面使用matchadd(),但理论上您可以使用syn-conceal做类似的事情。区别在于,匹配项是窗口的局部项。可以在定义的地方使用语法-您可以使用任何文件类型或其他机制通过语法进行设置。

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

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

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

测试文件

word word  word   word
word word  word   word

set conceallevel=1

在第1级,我们被允许在比赛中使用替换字符。

因此,我们可以用.代替所有多余的空格,以使其突出:

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

((10是默认优先级,并且-1请求一个新ID用于匹配。)

清理

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

call matchdelete(space_match)
© www.soinside.com 2019 - 2024. All rights reserved.