禁用vim中的所有自动缩进

28

在TeX中,Vim通常会搞砸我的缩进。主要是当我在一个显示的方程式中时,我认为它应该像这样:

\[
    x=\frac{y}{z}  
\]

x前的空格为一个制表符。

当我开始输入方程式时,我先输入\[\]标记,然后再回到它们之间,输入制表符,然后输入其余的方程式。

Vim 在我必须使用包含花括号的某些东西(例如\frac{})时才会出问题。当我键入闭合的}时,vim 会自动将整行的缩进向左移动,这样就取消了我键入的制表符。

这非常令人恼火,我该如何禁用它?

我的.vimrc文件中包含:

"indentation
set smartindent
set autoindent
set tabstop=5
set shiftwidth=5
filetype indent on

这是哪个版本?我无法在7.3中重现它。我尝试将文件类型设置为tex,启用您的选项,并输入您的样例。关闭括号并未更改缩进级别。 - Don Reba
“Accolade”是花括号({})的一个相对较少使用的术语;在欧洲比在美国更为常见。 - Keith Thompson
@Keith,哦,那里的英语有点马虎...我会修正它。 - romeovs
1
这个问题有令人满意的解决方案吗?无论我取消哪个缩进变量,问题都还存在。也许这是$VIMRUNTINE/indent/tex.vim的限制?! - Dominique
2
@Dominique:我现在使用noautoindentnocindentsmartindent。我不太确定为什么这样做效果最好,但是试错表明这是最令人满意的方法。 - romeovs
显示剩余3条评论
6个回答

39
我刚刚花了几个小时处理JavaScript的缩进问题,得出的结论是不要从vimrc中删除filetype indent on 这个设置为多种文件类型提供最佳的智能缩进。如果你发现结果很糟糕,那么很可能是配置问题。

特定文件的缩进设置

所以如果你像我一样,在你的vimrc中有filetype indent on并且不知道它在做什么。
这个设置只是告诉vim查找具有特定文件类型的缩进规则的文件。它会寻找几个地方,但可能只有两个地方是你感兴趣的。
  1. $VIMRUNTIME/indent/
  2. ~/.vimrc/after/indent/
第一个位置包含vim默认的缩进规则。如果你在全新的vim安装中设置了filetype indent on,所有智能缩进都将来自此处。例如,当你打开名为index.html的文件时,它会从$VIMRUNTIME/indent/html.vim获取规则。
根据我的经验,这些默认规则非常好,但是其他设置可能会破坏它们。
第二个位置(after目录)允许你添加覆盖第一个位置设置的设置。这很好,因为你不必编辑默认文件以定制它们。
缩进方式有几种选项,它们并不总是兼容的。来自Vim wiki:的介绍如下:

autoindent

"autoindent"仅仅是从上一行复制缩进,在开始新行时。它对于结构化文本文件或者想要手动控制大部分缩进而不受Vim干扰的情况非常有用。'autoindent'不会影响其他缩进设置,一些基于文件类型的缩进脚本甚至会自动启用它。
我在我的vimrc中使用"filetype indent on"和"set autoindent",因为它们能很好地配合使用。我没有设置其他的选项。
"smartindent"和"cindent"
"smartindent"会在某些情况下自动插入一个额外的缩进级别,适用于类C文件。 "cindent"更具可定制性,但在语法方面也更严格。 "smartindent"和"cindent"可能会干扰基于文件类型的缩进,并且不应与之同时使用。
当涉及到C和C ++时,基于文件类型的缩进会自动设置“cindent”,因此对于这些文件没有必要手动设置“cindent”。 在这些情况下,“cinwords”,“cinkeys”和“cinoptions”选项仍然适用。
通常情况下,只有在不满意基于文件类型的缩进方式时才应手动设置“smartindent”或“cindent”。
"indentexpr"
运行在(vimfolder)\ indent \\(indentscripts)中找到的文件类型缩进脚本。 它在vim documentation中提到了文件类型,以及刚才提到的其他内容(而且它是我遇到问题的原因)。
重置'autoindent'、'cindent'、'smartindent'和/或'indentexpr'以禁用打开文件时的缩进。

故障排除

有可能某些流氓插件正在更改您的缩进设置,这就是您得到不良结果的原因。幸运的是,verbose会告诉您最后更改相关选项的文件。

:verbose set autoindent?
:verbose set cindent?
:verbose set smartindent?
:verbose set indentexpr?

您可能会得到这样的结果

indentexpr=SomeMessedUpValue
Last set from ~/.vim/bundle/some_plugin/indent/plaintex.vim

如果出现这种情况,您可以移动该文件,关闭并重新打开vim,查看是否解决了问题。
关闭TeX的缩进设置
也许默认设置对您来说不够好,您想禁用TeX的缩进设置,但保留所有其他文件类型的设置。您可以通过在 after 目录中的文件中将这些值设置为其默认值来轻松实现。
我不太了解Tex或LaTex,但是当我创建一个扩展名为 .tex 的文件并运行:filetype 时,它的文件类型为plaintex 。假设这是正确的,您需要创建一个名为 ~ / .vim / after / indent / plaintex.vim 的文件。在那个文件里:
set autoindent&
set cindent&
set smartindent&
set indentexpr&

每当您打开一个 .tex 文件时,这将将所有这些值设置为它们的默认值。

谢谢你的回答!有没有办法在.vimrc文件中关闭TeX的缩进设置? - zyy

21

您的问题中似乎有一点术语混淆。在vim中,术语自动缩进(autoindent)指的是一种简单地遵循前一行缩进级别的特殊缩进方式(有时非常方便)。要删除它,请手动使用set noautoindent,或将其写入您的_vimrc。

还有另外两种自动缩进方式:cindentsmartindent。同样地,如果您希望禁用它们,请选择set nocindentset nosmartindent

如果您查看帮助(help autoindent,...),它们都有很好的解释。您更喜欢哪一个(或不喜欢)主要取决于您的编程风格和习惯。因此,请尝试它们并看看您最喜欢哪个。

不幸的是,我现在不怎么使用LaTeX了,所以不熟悉它的内部文件类型缩进规则。


2
对我来说,cindent 通常是导致问题的原因。 - Thomas
2
对我来说,从我的 .vimrc 文件中删除 filetype plugin indent on 帮了我。 - elim
在cygwin(windows 7)的vimrc中使用set nocindentset nosmartindent可以解决在使用Oo插入新行时出现的固定缩进问题。这个问题非常令人沮丧,因为它不会只是插入一个空行。谢谢! - WEBjuju
1
有四种自动缩进方式:autoindentcindentsmartindentindentexpr - krubo
所有这些都在编辑一个以“.css”为文件名的文件时失败了 - 当前(2020年)的vim卡住了CSS文件的缩进(不正确)。但是我发现了一个不同的命令 - “:set paste”,它可以做到这个答案未能做到的事情,并且实际上禁用了损坏的自动缩进(暂时)。 - Adam

3
若有其他人遇到类似的问题,我找到的解决方法如下:
  1. 使用:verbose set indentexpr?查找导致反缩进的文件。
  2. 找到更改indentexpr的位置(对我而言是setlocal indentexpr=GetTeXIndent())。
  3. 将该行更改为setlocal indentexpr&以关闭indentexpr
这样做可以消除所有括号、圆括号和大括号的反缩进。

3

命令 :se paste 对我来说效果最好,感谢同一页上的建议。只需记住,在粘贴完成后使用 :se nopaste 恢复正常的缩进行为即可。 - user3076105
我不在vim中编写代码,所以我实际上不需要任何缩进行为。 - alamar

2

删除set autoindentset smartindent这两行代码,以取消vim的自动缩进。


这不是autoindent的作用。它只是一种缩进风格,复制前一行的缩进级别。 - Don Reba
1
我是根据问题的标题“在vim中禁用所有自动缩进”进行操作的。尽管复制前一行的缩进级别并不是技术上的“智能”缩进,但仍然属于自动缩进。 - Jared Ng
这也不是smartindent的作用。这个命令会减少以闭合括号开头的行的缩进级别。 - Don Reba
1
...这仍然是“自动”缩进。我在我的答案中试图具体说明,删除这些行将会取消vim的自动缩进。 - Jared Ng

0
如果您正在使用vim-latex插件,请设置此选项:
let g:tex_indent_brace=0

对于其他插件,如果您不想像上面的答案那样关闭indentexpr,您可以找到设置indentkeys的位置并注释掉这些行。这应该可以防止在键入闭合括号时触发重新缩进。

:verbose set indentkeys?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接