问题描述
在 lisp 中编程时,我在 vim 中遇到自动缩进的问题。
我的 .vimrc 有以下选项卡设置:
set noexpandtab
set autoindent
set softtabstop=0
set shiftwidth=8
set tabstop=8
当我在插入模式下输入 (if <enter>
时,会创建一个缩进 两个空格 的新行。
我的设置都没有说明两个空格,那么为什么我没有得到一个选项卡?
在插入模式下,我可以使用什么设置来更改缩进?
提前致谢!
更新:
感谢您的回答,设置不会被覆盖。
它与“默认 lisp 缩进”有关。
在 :help lisp
中,它说明了有关更改 p
标志的内容
cpoptions
。这是 cpoptions
标志帮助中的说明:
p - Vi compatible Lisp indenting. When not present,a slightly better algorithm is used.
设置它确实会将缩进更改为一个空格而不是两个空格。 仍然不确定如何将其更改为其他内容。
解决方法
看起来这是两个空格的缩进,是 :set lisp
模式的硬编码行为,它忽略了 shiftwidth
。
我们可以将其追溯到包含硬编码的 amount += 2;
增量语句的 source code。
这样做是有充分理由的;它已成为编写 Lisp 的主要方式。
在写这个答案时,我偷看了以下项目的源代码示例(所有 Lisp 或类 Lisp 语言):
- Steel Bank Common Lisp (SBCL);
- Clozure Common Lisp (CCL);
- GNU Emacs;
- Clojure;
- GNU 诡计;
- 球拍;
- 和 GNU CLISP。
除了两个空格的缩进之外,我没有发现任何其他示例!使用两个空格的缩进,你在好/大公司。你不妨习惯它;即使你以某种方式让 Vim 遵循你的方式,如果你将任何东西上传到任何人的 Lisp 项目中,你可能不得不重新格式化。
现在,我已经看到使用四空格缩进的 Lisp 代码,就像在非常古老的代码库和一些书籍中一样。
顺便说一下,有时您会看到 if
像这样缩进:
(if (condition)
(then)
(else))
这是对齐,而不是四个空格缩进。这种格式是函数的标准格式,但对于 if
等运算符存在争议。有些人在他们的代码库中喜欢这种方式。例如,该机构的 randomly found coding style guide 推荐它。
如果您从 if
中删除 lispwords
,Vim 将执行上述操作。
:set lispwords=...
参数包含一个以逗号分隔的标识符列表,这些标识符遵循类似运算符的缩进,这意味着两个空格而不是类似函数的对齐方式:第二行和第三行与参数对齐。默认情况下,if
位于 lispwords
中。
Lisp 模式还对函数应用两个空格缩进(即 lispwords
中未列出的形式,如果没有参数):
(gobbledygook 1 2
2 3)
(gobbledygook
1)
这也是“规范的”。有时,如果您试图符合某个最大行长,这会派上用场;有时可以通过将所有参数向下移动并仅给它们两个空格缩进来使超出限制的函数调用适合。
,每个文件类型在 vim 中都有自己的设置。所以你的 .vimrc 值可以在文件类型插件中被覆盖。要了解 lisp 文件类型设置的当前值,请打开 lisp 文件并在 vim 命令行中运行以下命令:
:set noexpandtab?
:set autoindent?
:set softtabstop?
:set shiftwidth?
:set tabstop?
如果它们与 .vimrc 中的不同,那么您的值将在某些插件中被覆盖。
为了使用您的自定义值再次覆盖它们,请使用所需的值创建 ~/.vim/after/ftplugin/lisp.vim
文件:
set noexpandtab
set autoindent
set softtabstop=0
set shiftwidth=8
set tabstop=8