Vim проверить, если опции действительны перед настройкой

Я использую свой .vimrc на нескольких разных машинах, которые все имеют существенно разные версии vim. Большинство версий загружаются нормально, но одна из них сообщает об этом (исправленном) списке ошибок при запуске:

Error detected while processing ~/.vimrc:
Undefined variable: pathogen
Invalid expression: pathogen#infect()
Invalid :syntax subcommand: enable
Unknown function: executable
Invalid expression: executable('xclip')
:else without :if: else
:endif without :if: endif
Invalid argument: indent on
Invalid argument: plugin on
Invalid argument: nrformats=alpha,hex,octal
Illegal arguments: fromstart
Not an editor command: colorscheme zobean
Unknown option: foldenable
Unknown option: foldcolumn=0
Unknown option: cursorline
Unknown option: winminwidth=0
Ambiguous mapping, conflicts with "^V<silent>"
Ambiguous mapping, conflicts with "^V<leader>"
Ambiguous mapping, conflicts with "j"

Я знаю, что могу использовать if has('mouse') проверить, включена ли поддержка мыши. Есть ли аналогичный тест, который я могу сделать для других команд, например pathogen, а настройки и параметры, которые обычно отсутствуют?

Обратите внимание, у меня нет разрешения на установку программ на всех этих компьютерах, поэтому установка последней версии vim не является допустимым вариантом.

Я намерен поддерживать только один .vimrc для всех машин, которые будут соответствующим образом адаптировать варианты к тому, что доступно.

Приложение: контент vimrc

Я не буду включать всю мою .vimrcдлиной около 250 строк, но ниже представлены типичные строки и разделы, вызывающие каждую из перечисленных выше ошибок:

execute pathogen#infect()
syntax enable
if has('win32')
    ...
elseif executable('xclip')
    ...
else
    ...
endif
filetype indent on
filetype plugin on
set nrformats=alpha,hex,octal
syn sync fromstart
colorscheme zobean
set foldenable foldnestmax=5 foldmethod=indent
set foldcolumn=0
set cursorline
set winminwidth=0
vnoremap < <gv
nnoremap <leader>~ vwb<esc>~
vnoremap jk <esc>

1 ответ

Решение
if exists('*pathogen#infect')
" The function pathogen#infect() exists
else
" The function pathogen#infect() does not exist
endif

использование :help exists() для получения дополнительной информации. В дополнение к переменным, exists() также может проверить &опции, *функции, :команды, #автокоманды событий.

Другие вопросы по тегам