【问题标题】:Vim doesn't use tabstop distance in insert-modeVim 在插入模式下不使用制表位距离
【发布时间】:2021-07-19 15:46:25
【问题描述】:

我在用 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.

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

【问题讨论】:

  • 我对 lisp 不熟悉,但看起来 Vim 将 lisp 缩进处理为一种特殊情况。你可以看看:help 'lisp'
  • 感谢 gdupras,我查看了 lisp 的帮助,设法获得了不同的缩进,但不知道如何将其更改为我想要的。

标签: vim lisp auto-indent


【解决方案1】:

看起来这是两个空格缩进是: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 中删除if,Vim 会执行上述操作。

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

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

(gobbledygook 1 2 
              2 3)

(gobbledygook
  1)

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 您可以使用verbose -> :verbose set noexpandtab? 找出您的设置在哪里更改。无需猜测您的内容会被覆盖。但我同意你的看法,它很可能是文件类型插件。
    • 设置没有被覆盖,所以它必须在其他地方。我在 lisp.vim 文件中没有看到任何关于缩进的内容,但这也可能是因为该文件读起来很混乱 :-)。
    猜你喜欢
    • 1970-01-01
    • 2012-02-03
    • 2017-03-14
    • 2018-06-17
    • 1970-01-01
    • 2012-10-08
    • 2015-04-30
    • 1970-01-01
    • 2012-12-11
    相关资源
    最近更新 更多