Vimscript实现缓冲区失焦时高亮全部文本的正确方法
问题描述
在Vimscript中需要实现窗口失去焦点时高亮缓冲区全部文本,最初使用的命令无法达到预期,反而会导致光标向下移动一行:
autocmd FocusLost * execute '/.'
问题原因
上述命令调用的/.是Vim的搜索命令,执行时会自动跳转到下一个匹配位置(即下一行的任意字符),本质不属于高亮操作,因此会出现光标下移的异常表现。
可用实现代码
以下代码可实现窗口失焦时将缓冲区全部文本调暗,窗口重新获得焦点时自动恢复原有语法高亮效果:
augroup dimbuf autocmd! " 失焦时将Search高亮组设置为暗灰色样式 autocmd FocusLost * execute 'highlight Search cterm=none guifg=#555555 guibg=NONE' " 为缓冲区所有字符添加Search高亮匹配,使用固定ID便于后续精准删除 autocmd FocusLost * call matchadd('Search', '.', 0, 1843991912) " 获得焦点时删除之前添加的全局高亮匹配 autocmd FocusGained * call matchdelete(1843991912) " 恢复Search高亮组默认配置 autocmd FocusGained * execute 'highlight Search none' | execute 'highlight Search cterm=reverse' augroup END
注:代码中使用固定数字
1843991912作为匹配ID,避免和其他自定义高亮匹配产生冲突。
内容的提问来源于stack exchange,提问作者glenncounty
相关产品推荐
相关产品推荐

