If you have no idea which plugin(s) might be causing the problem, use a binary search method to isolate the errant plugin(s).

Disable half of your plugins and retest Vim.

Test again to see if the problem persists or has gone away.

If the problem went away, the disabled set contain your bad plugin. Keep half of the disabled plugins disabled and re-enable the other half. You now have less disabled plugins to test. Go back to step 2.

If the problem persists, the enabled set contain your bad plugin. Disable half of your remaining plugins and keep the other remaining half enabled. You now have less enabled plugins to test. Go back to step 2.

If you can isolate one or a set of plugins causing the problem:

Make sure you have the latest version of those plugins installed.

Check the plugin page to see if there are any known conflicts with other plugins or known failures for a given Vim version.

The VimLint plugin was designed to help identify erroneous vimrc settings.

Ensure you have a personal vimrc file (file ~/.vimrc on Linux, or $HOME/_vimrc on Windows).

Ensure your vimrc contains at least:

set nocompatible
syntax on
filetype plugin indent on
set hidden

Ensure your vimrc does not have:

set compatible or set cp
set smartindent or set si
set cindent or set cin
set lisp
set gdefault or set gd
set edcompatible or set ed
set exrc or set ex
set insertmode or set im
set noloadplugins or set nolpl
set nomagic
set nomodeline or set noml

If Vim finds the command finish anywhere in your vimrc it will stop sourcing the rest of the file. So you can use it to do a binary search as described in Plugins to identify the problematic line.

Ensure :echo $SHELL is correct. You will need to use a POSIX shell for full Vim compatibility. The fish shell is known to not be compatible.

Many plugins change options when they are sourced, filetype is set, etc. So, you might find yourself wondering why an option is not set as you expect. From inside Vim, type this command:

:verbose set myoption?

That displays the value of the given option and where it was set. Replace myoption with the option being tested, and remember to include the "?" (the query causes the value to be displayed; omitting it might set the option).

For local options that inherit its value, that command would not specify where the value was set. What to do in this case?