Vim编写Lisp时插入模式自动缩进不符合配置问题及调整方法咨询
Vim编写Lisp时自动缩进问题的解决方案
哈哈,这个问题我之前也踩过坑!你遇到的2个空格缩进根本不是你的制表符配置出问题了——是Vim给Lisp文件内置的语法缩进规则在搞事情!它会忽略你设置的shiftwidth/tabstop这些通用选项,默认用2个空格来缩进if这类特殊Lisp表单。
下面给你几种调整的方法,按灵活度排序:
1. 全局统一Lisp缩进量(适配你的制表符配置)
这是最直接的方式——如果你想让所有Lisp结构的自动缩进都和你的制表符配置对齐(比如用1个制表符,对应你设置的tabstop=8),只需要在.vimrc里加一行:
autocmd FileType lisp setlocal lisp-indent-offset=8
把8换成你想要的缩进数值就行,因为你开了noexpandtab,当缩进量等于tabstop时,Vim会自动用制表符代替对应数量的空格,刚好符合你的需求。
2. 针对单个Lisp表单自定义缩进
如果你只想调整if的缩进,不想影响defun、let等其他结构,可以用lisp_indent_specials字典单独设置:
autocmd FileType lisp let b:lisp_indent_specials = {'if': 8}
这样只有if表单会缩进8个空格(也就是1个制表符),其他Lisp结构保持默认的2个空格缩进。
3. 关于你提到的cpoptions的p标志
那个选项其实只能切换到Vi兼容的旧版Lisp缩进逻辑(缩进变成1个空格),它没有自定义缩进数值的功能,所以如果要精准控制缩进量,这个方法就不太够用了。
补充:为什么你的通用制表符配置没生效?
Vim对Lisp这类结构化语言会自动启用语法驱动的缩进(也就是indentexpr),这种缩进的优先级远高于你设置的autoindent、shiftwidth这些通用选项。只有当你手动用>>/<<调整缩进时,你的shiftwidth才会生效;而插入模式下的自动缩进,完全由Lisp专属的缩进规则控制。
内容的提问来源于stack exchange,提问作者dexus
相关产品推荐
相关产品推荐

