如何让Vim的lvimgrep命令保留缩进,区分Python类与函数?
让Vim Loclist保留Python类/函数的缩进显示
刚好踩过这个坑!你遇到的问题根源是:lvimgrep默认只会提取正则匹配到的片段,而你的正则/\v^\s*(class|def)/只匹配了行首的缩进+关键词部分,所以Loclist里自然看不到完整的缩进层级。完全不用自己实现lvimgrep,用原生命令调整下参数就能解决,下面给你两种方案:
方案1:修改Vim正则,匹配整行内容
把你的lvimgrep命令改成匹配整行,这样就能把缩进和完整定义都捕获到Loclist里:
:execute 'lvimgrep /\v^\s*(class|def).*/ ' . file_name
这里的.*会匹配class/def后面的所有内容,执行后打开:lopen,就能看到带缩进的完整行——类内的函数会有更深的缩进,和独立函数一眼就能区分开。
要是你不想显示整行,只想保留缩进+关键词,也可以把正则写成/\v^(\s*)(class|def)/,再通过'lformat'自定义显示格式,但这种方式稍繁琐,不如直接匹配整行来得直观。
方案2:调用Linux外部grep命令
如果你更习惯用外部grep的BRE/ERE语法,用lgrep命令调用它就行——外部grep默认输出完整的匹配行,自带缩进:
- 用BRE语法(grep默认模式,括号要转义):
:execute 'lgrep -n "^\s*\(class\|def\)" ' . file_name - 用ERE语法(加
-E选项,语法更接近Vim正则)::execute 'lgrep -nE "^\s*(class|def)" ' . file_name
这种方式在处理大文件时速度还可能更快,打开:lopen后同样能看到清晰的缩进层级。
小技巧:优化Loclist的显示
如果你之前用conceal隐藏文件名、行号时不小心影响了缩进,可以试试这个配置——只隐藏无关的行号和分隔符,保留缩进和内容:
:set conceallevel=2 :autocmd FileType qf setlocal concealcursor=n :autocmd FileType qf syn match qfConceal /^\d\+:\d\+:/ conceal
这样Loclist会更清爽,同时缩进层级完全保留。
内容的提问来源于stack exchange,提问作者oneastok
相关产品推荐
相关产品推荐

