sheerun / vim-polyglot

A solid language pack for Vim.
5.56k stars 296 forks source link

[Bug Report] ftdetect/*.vim files are sourced twice #706

Open laggardkernel opened 3 years ago

laggardkernel commented 3 years ago

Does this bug happen when you install plugin without vim-polyglot?

No

Describe the bug:

From vim --startuptime log, I found my ftdetect/*.vim files are loaded twice. After lots of time digging, I figured out it was related with theses lines in autoload/polyglot/init.vim, first introduces in c45f0b8f6

" Load user-defined filetype.vim and oter plugins ftdetect first
" This is to use polyglot-defined ftdetect always as fallback to user settings
augroup filetypedetect
  runtime! filetype.vim
  runtime! ftdetect/*.vim
augroup END

To put it in a simple way, runtime! filetype.vim sources share/vim/vim82/filetype.vim, which also run runtime! ftdetect/*.vim

For detailed analysis

Analysis base from verbose log vim -V99debug.log.

Let's begin with how a filetype.vim is loaded. Unlike plugin/ files handled by vim automatically, filetype.vim files are only loaded with executing filetype plugin indent on.

filetype plugin indent on triggers searching for filetype.vim

sheerun commented 3 years ago

They are sourced twice to support different loading scenarios on vim, nvim and different package managers for vim like vim pack, vim-plug, etc. second load takes 0ms because code is not executed

sheerun commented 3 years ago

You might want to read https://github.com/vim/vim/issues/7056

Sourcing twice is actually for vim-polyglot to load faster, not slower, because it ensures it's loaded before vim-native ftdetect, preventing it from loading second time fully, and saving you 25ms of startup time. In fact it makes vim start faster than without any plugins.

laggardkernel commented 3 years ago

I'm not talking about ftdetect/polyglot.vim, which just call call polyglot#init#init(). Cause the init() is redefined as a dummy function when it's first called. The next time when it's called, it does nothing and basically being skipped.

The reason I reported this issue is that I found my custom ftdetect files, ~/.config/nvim/ftdetect/zsh.vim and ftdetect/tmux.vim being sourced twice from the --startuptime log.

augroup filetypedetect
  runtime! filetype.vim
  runtime! ftdetect/*.vim
augroup END

From what I've digged, runtime! filetype.vim will source the vim builtin filetype.vim, within which runtime! ftdetect/*.vim is called. We may not need another runtime! ftdetect/*.vim in the above code.

But I've never thought about when loading vim-polyglot with different pkg managers. I really have no idea about this part.

If I wanna prevent my custom ftdetect being sourced twice, the best solution for now is use a custom flag like g:ftdetect_zsh_loaded and check it at the beginning of the file?

sheerun commented 3 years ago

I need to debug this.. no idea why it happens