vim - 在 .vimrc 中设置时,python autoindent 无法正常工作

dmx*_*dmx 2 python vim

我的.vimrc文件有问题:我正确地编写了 python 代码。但我有缩进问题。当我把它放在我的 .vimrc 文件中时:

" indentation python
au BufNewFile,BufRead *.py
    \ set tabstop=4
    \ set softtabstop=4
    \ set shiftwidth=4
    \ set textwidth=79
    \ set expandtab
    \ set ts=4
    \ set sw=4
    \ set ai
    \ set autoindent
    \ set fileformat=unix
    \ set expandtab ts=4 sw=4 ai
Run Code Online (Sandbox Code Playgroud)

但只要一个Python文件打开,如果我运行set expandtab ts=4 sw=4 ai Vim将在选择代码和命中时正确启动缩进S-=。任何的想法?

Ama*_*dan 5

这在 Vim 中不是有效的语法。\只取消换行符,它不会让你链接命令(你有|)。你写的相当于(截断为你的选项的一个子集):

au BufNewFile,BufRead *.py set tabstop=4 set softtabstop=4 set shiftwidth=4 set textwidth=79
Run Code Online (Sandbox Code Playgroud)

这显然没有意义,因为set这不是一个有效的选择。

所以你可以这样做

au BufNewFile,BufRead *.py
  \ set tabstop=4
  \     softtabstop=4
  \     shiftwidth=4
  \     textwidth=79
Run Code Online (Sandbox Code Playgroud)

(使其成为set具有多个设置的单个命令),或者您可以这样做

au BufNewFile,BufRead *.py
    \ set tabstop=4 |
    \ set softtabstop=4 |
    \ set shiftwidth=4 |
    \ set textwidth=79
Run Code Online (Sandbox Code Playgroud)

(使其成为多个set命令)。

但是,这是不好的做法,因为选项将全局设置;例如,如果您先加载一个 JavaScript 文件,然后再加载一个 Python 文件,然后返回到您的 JavaScript 缓冲区,它将拥有您的 Python 设置。你应该更喜欢使用setlocal

此外,通常使用FileType python而不是BufNewFile,BufRead *.py- 可能不是专门针对 Python 的情况,但某些语言可以有多个扩展名。

最后,这允许您.vimrc通过将依赖于语言的设置放在.vim/after/ftplugin/python.py. 您不需要autocmd那里 - 只需编写您的setlocal, 并且知道您的设置将针对python文件类型的每个缓冲区执行。

因此,我的最终建议是:

" .vim/after/ftplugin/python.py
setlocal tabstop=4
setlocal softtabstop=4
setlocal shiftwidth=4
setlocal textwidth=79
setlocal expandtab
setlocal autoindent
setlocal fileformat=unix
Run Code Online (Sandbox Code Playgroud)

或等效地

" .vim/after/ftplugin/python.py
setlocal ts=4 sts=4 sw=4 tw=79 et ai ff=unix
Run Code Online (Sandbox Code Playgroud)