# Why does vim still auto-indent LaTeX after I set noai noci nosi?

I want to disable autoindent and smartindent for LaTeX so I did

:set noai noci nosi


When I open a brand new mwe.tex, filetype=plaintex and there is no auto indent magic.

When I then enter some code, such as \begin{frame}\end{frame}, save and reopen the file, filetype=tex, colours have changed, and... there is what to me looks like both auto indent and smart indent going on:

• I start typing \begin{frame} at the beginning of the line, so far so good
• I press enter, and the cursor is indented by four spaces, despite setting noai, noci, and nosi. At this point, :set shows:
--- Options ---
background=dark     helplang=en         shiftwidth=4        ttyfast
filetype=tex        ruler               syntax=tex
foldmethod=indent   scroll=34           tabstop=4
backspace=indent,eol,start
define=\\$$[egx]\|char\|mathchar\|count\|dimen\|muskip\|skip\|toks$$\=def\|\\font\|\\$$future$$\
=let\|\\new$$count\|dimen\|skip\|muskip\|box\|toks\|read\|write\|fam\|insert$$\|\\$$re$$\=new$$boo lean\|command\|counter\|environment\|font\|if\|length\|savebox\|theorem\(style$$\=\)\s*\*\=\s*{\=\
|DeclareMathOperator\s*{\=\s*
fileencoding=utf-8
fileencodings=ucs-bom,utf-8,default,latin1
include=\\input\|\\include{
includeexpr=substitute(v:fname, '^.\{-}{\|}.*', '', 'g')
indentexpr=GetTeXIndent()
indentkeys=0{,0},:,0#,!^F,o,O,e,[,(,{,),},],&,=\bibitem,=\item

• I type \end{frame at the indented base. After I add a }, it gets automatically dedented (with a fraction of a second delay).

From :scriptnames, I can tell there are scripts loaded at /usr/share/vim/vim80/indent.vim, /usr/share/vim/vim80/syntax/tex.vim, /usr/share/vim/vim80/ftplugin/tex.vim, and /usr/share/vim/vim80/indent/tex.vim. So it looks like there is a script overriding the standard vim settings. How do I configure the behaviour of this script?

'indentexpr' has the highest priority of how vim can automatically indent lines.

:h 'indentexpr':

When this option is not empty, it overrules the 'cindent' and 'smartindent' indenting.

Your value is indentexpr=GetTeXIndent().

Customize GetTeXIndent()

The behavior of GetTeXIndent() can be customized by a few variables (e.g. g:tex_indent_brace or g:tex_indent_items). They are documented in-source in \$VIMRUNTIME/indent/tex.vim.

If you only want to disable the indentation after \begin{frame} but keep indenting other code, you can put in your vimrc

let g:tex_noindent_env = 'document\|verbatim\|lstlisting\|frame'


This variable is also respected by Tex_CalcIdent() of vim-latex and BuckyTeXIndent() of vim-bucky.

Vimtex user: Customize VimtexIndentExpr()

vimtex provides its own indentation function VimtexIndentExpr(). This function can be customized with a similar option g:vimtex_indent_ignored_envs which, however, is a list of names

let g:vimtex_indent_ignored_envs = ['document', 'verbatim', 'lstlisting', 'frame']


Disable indentation completely

:set indentexpr=

Permanent vim setting

If you want to set indentexpr= permanently in your vim config, see the question

How can I change the default indentation based on filetype?

and its answers. Some recommend to not use autocmds but to place

setlocal indentexpr=


into a file such as ~/.vim/after/indent/tex.vim which is always sourced by vim and has the last word.

• Of note, these can (and should) be set locally. Also, these options won’t persist—adding them to an ftplugin can help this. – D. Ben Knoble Jul 10 '19 at 3:45