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 缩进来使超过限制的函数调用 运行 适合。
我在使用 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 缩进来使超过限制的函数调用 运行 适合。