如果 Vim 中有多个空间,则渲染空间

Hon*_*arc 4 vim vim-plugin

我用了:

set listchars=tab:?\ ,trail:·,precedes:?,extends:?,nbsp:·,space:·
Run Code Online (Sandbox Code Playgroud)

渲染空格和制表符。

但是我只想显示 >=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': '·'})
Run Code Online (Sandbox Code Playgroud)
  • 我使用优先-1兼容indentLine
  • ( @<= ) 匹配一个又一个空格
  • ( @=) 在另一个空格之前匹配一个空格

并删除空间listchars

set listchars=tab:?\ ,trail:·,precedes:?,extends:?,nbsp:·
Run Code Online (Sandbox Code Playgroud)

非常感谢 Ben Knoble 帮我找到了!!!

D. *_*ble 7

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

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

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

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

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

测试文件

word word  word   word
word word  word   word
Run Code Online (Sandbox Code Playgroud)

set conceallevel=1

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

所以,我们可以用例如 a 替换所有额外的空格,.使它们脱颖而出:

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

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

打扫干净

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

call matchdelete(space_match)
Run Code Online (Sandbox Code Playgroud)

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

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

  • 尝试使用 `\@&lt;=` 而不是 `\zs`: `let m = matchadd("Conceal", ' \@&lt;= ', 10, -1, {'conceal': '.'})` (2认同)