如果 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 中完成吗? (config
或 plugin
)
谢谢。
编辑: 我使用:
if exists('space_match')
call matchdelete(space_match)
endif
let space_match = matchadd('Conceal', '\v( @<= )|( @=)', -1, -1, {'conceal': '·'})
- 我使用优先级
-1
来兼容indentLine
( @<= )
匹配一个 space 又一个 space
( @=)
在另一个 space 之前匹配 space
并删除 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
我用过:
set listchars=tab:→\ ,trail:·,precedes:←,extends:→,nbsp:·,space:·
渲染 space 和制表符。
但我只想显示 >=2 space,如果它有一个 space 其他字符之间我不想显示。
(与vscode中的"editor.renderWhitespace": "boundary"
相同)
我可以在 Vim 中完成吗? (config
或 plugin
)
谢谢。
编辑: 我使用:
if exists('space_match')
call matchdelete(space_match)
endif
let space_match = matchadd('Conceal', '\v( @<= )|( @=)', -1, -1, {'conceal': '·'})
- 我使用优先级
-1
来兼容indentLine
( @<= )
匹配一个 space 又一个 space( @=)
在另一个 space 之前匹配 space
并删除 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 withsyn-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