Vim 在插入模式下不使用制表位距离

Vim doesn't use tabstop distance in insert-mode

我在使用 lisp 编程时遇到 vim 中的自动缩进问题。

我的 .vimrc 有以下选项卡设置:

set noexpandtab
set autoindent
set softtabstop=0
set shiftwidth=8
set tabstop=8

当我在插入模式下键入 (if <enter> 时,会创建一个缩进为 two spaces 的新行。 None 我的设置说明了两个 space 的任何内容,所以为什么我没有得到一个标签? 在插入模式下,我可以使用什么设置来更改缩进?

提前致谢!

更新: 感谢您的回答,设置不会被覆盖。 它与“默认的 lisp 缩进”有关。 在 :help lisp 它说了一些关于改变 p 标志的事情 cpoptions。这就是它在 cpoptions 标志的帮助中所说的:

p - Vi compatible Lisp indenting.  When not present, a slightly better algorithm is used.

设置它会将缩进更改为一个 space 而不是两个 space。 仍然不确定如何将其更改为其他内容。

每个文件类型都可以在 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

看起来这是两个 -space 缩进是 :set lisp 模式的硬编码行为,忽略了 shiftwidth.

我们可以追溯到 source code,其中包含硬编码的 amount += 2; 增量语句。

这样做是有充分理由的;它已成为编写 Lisp 的主要方式。

在我写这个答案时,我浏览了以下项目的源代码示例(所有 Lisp 或类 Lisp 语言):

  • 钢铁银行 Common Lisp (SBCL);
  • Clozure Common Lisp (CCL);
  • GNU Emacs;
  • Clojure;
  • GNU 诡计;
  • 球拍;
  • 和 GNU CLISP。

除了两个 space 缩进,我没有发现任何其他示例!使用两个 space 缩进,你在 good/large 公司。您不妨习惯一下;即使你以某种方式让 Vim 遵循你的方式,如果你将任何东西上传到任何人的 Lisp 项目中,你可能不得不重新格式化。

现在,我看到 Lisp 代码使用四 space 缩进,就像在非常古老的代码库和一些书中一样。

顺便说一下,有时您会看到 if 缩进成这样:

(if (condition)
    (then)
    (else))

这可能发生在缩进为四 space 的情况下,但我指的是对齐的情况,而不是四 space 缩进。这种格式当然是函数参数的标准格式,但对于 if 等运算符却存在争议。有些人在他们的代码库中喜欢这种方式。比如本机构randomly found coding style guide推荐这种写法if,同时也推荐二-space缩进

如果从 lispwords.

中删除 if

Vim 将执行上述操作

:set lispwords=... 参数包含一个以逗号分隔的标识符列表,这些标识符遵循类似运算符的缩进,这意味着两个 space 而不是类似函数的对齐方式:第二行和第三行与参数对齐。默认情况下,if 位于 lispwords

Lisp 模式还对函数应用两个 space 缩进(即如果没有参数,lispwords 中未列出的形式):

(gobbledygook 1 2 
              2 3)

(gobbledygook
  1)

这也是“规范”的。如果您试图符合某个最大行长度,有时这会派上用场;有时可以通过将所有参数向下移动并给它们两个 space 缩进来使超过限制的函数调用 运行 适合。