`filetype plugin` 在哪里定义以及如何覆盖它?

Where is `filetype plugin` defined and how to override it?

我正在尝试设置 python 缩进以使用 2 个空格而不是 4(或 8)个空格。我将以下内容放入 ~/.vimrc:

set expandtab
set shiftwidth=2
set softtabstop=2
set tabstop=2

只要我也将filetype plugin on放入配置中,这就可以正常工作。当我 filetype plugin on 时,当我打开一个 python 文件时,set tabstop? 将 return 8 并且缩进弄乱了。

所以我的问题是:(1) filetype plugin on 是如何工作的以及文件类型特定的配置文件位于何处? (2) 如何覆盖我的 ~/.vimrc(或其他地方)中特定于文件类型的配置?

首先启用加载特定文件类型的插件文件

filetype plugin on

This actually loads the file "ftplugin.vim" in 'runtimepath'. The result is that when a file is edited its plugin file is loaded (if there is one for the detected filetype).

您可以启用加载缩进文件:

filetype indent on

您可以合并它:

filetype plugin indent on

然后为 python 自定义规则:

au FileType python  set et sts=2 sw=2 ts=2
  1. filetype plugin on 是如何工作的以及文件类型特定的配置文件位于何处?

    filetype on 启用文件类型检测,正如其名称所暗示的那样。

    filetype plugin on 启用文件类型检测和文件类型插件,它们是 vimscript 文件,包含用于设置各种选项、定义映射等的特定于文件类型的命令。这些 ftplugins 位于 $VIMRUNTIME/ftplugin/ 下,您可以在 ~/.vim/ftplugin/~/.vim/after/ftplugin/ 下以及 &runtimepath and/or &packpath.

    下的各个地方创建自己的

    根据“python”标签判断,您遇到问题的 ftplugin 是 $VIMRUNTIME/ftplugin/python.vim,它有以下片段:

    if !exists("g:python_recommended_style") || g:python_recommended_style != 0
        " As suggested by PEP8.
        setlocal expandtab tabstop=4 softtabstop=4 shiftwidth=4
    endif
    
  2. 如何在我的 ~/.vimrc(或其他地方)覆盖特定于文件类型的配置?

    一般,有两种方法可以选择:

    • 在您的 vimec 中添加 FileType 自动命令:

      augroup myFiletypes
          autocmd!
          autocmd FileType foo setlocal this=that
          […]
      augroup END
      
    • 把你的设置放在他们自己的ftplugins中:

      " in after/ftplugin/foo.vim
      setlocal this=that
      

    后者更干净

    在此特定情况下,该功能位于全局变量后面,因此您只需将设置保持在vimrc“原样”中并添加以下行(这会让你的同事发疯):

    let g:python_recommended_style = 0
    

    根据 :help ft-python-plugin.