vim - 如果 Vim 中有多个空间,则渲染空间
问题描述
我用了:
set listchars=tab:→\ ,trail:·,precedes:←,extends:→,nbsp:·,space:·
渲染空格和制表符。
但我只想显示 >=2 个空格,我不想显示它是否在其他字符之间有一个空格。
("editor.renderWhitespace": "boundary"
在vscode中也是一样的)
我可以在 Vim 中完成吗?(config
或plugin
)
谢谢你。
编辑:我使用:
if exists('space_match')
call matchdelete(space_match)
endif
let space_match = matchadd('Conceal', '\v( @<= )|( @=)', -1, -1, {'conceal': '·'})
- 我使用优先级
-1
来兼容indentLine
( @<= )
匹配一个又一个空格( @=)
在另一个空格之前匹配一个空格
并删除空间listchars
:
set listchars=tab:→\ ,trail:·,precedes:←,extends:→,nbsp:·
非常感谢 Ben Knoble 帮我找到那个!!!
解决方案
使用隐藏,有几种方法可以实现,具体取决于您想要实现的目标。由于我们使用隐藏,您需要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
( @<= )
匹配一个又一个空格( @=)
在另一个空格之前匹配一个空格
推荐阅读
- ios - 为什么每当玩家向左或向右时它只播放我的左侧动画?
- java - 通过流转换数组数组
- c - 最大消息长度 MPI_Type_vector 和 MPI_Gather
- c# - C# LDAP AD Authentication,使用 Job Title 进行授权
- java - '(' , ')',
或预期逗号,在 android studio 中出现“TEXT”SQLite 数据库错误 - reactjs - 使用 antd 在组件中创建子菜单失败
- node.js - 几个小时后木偶师放慢了速度
- r - 麻烦从 CRAN_package_db() 基于 colnames 子集 data.frame
- python - 删除无效括号
- angular - 使用 Angular cli 6.0.5 安装 fontawesome 会引发错误 E418