Как я могу проверить наличие цветовой схемы в моем .vimrc?

В .vimrc можно ли загрузить цветовую схему, только если она существует?


person ClosureCowboy    schedule 18.04.2011    source источник


Ответы (6)


Использование :colorscheme в try-catch как Рэнди сделал может быть достаточно, если вы просто хотите загрузить его, если он существует, и сделать что-то еще в противном случае. Если вас не интересует часть else, достаточно простого :silent! colorscheme.

В противном случае лучше всего использовать globpath(). Затем вы можете проверить каждый путь, возвращаемый с помощью filereadable(), если вы действительно этого хотите.

" {rtp}/autoload/has.vim
function! has#colorscheme(name) abort
    let pat = 'colors/'.a:name.'.vim'
    return !empty(globpath(&rtp, pat))
endfunction

" .vimrc
if has#colorscheme('desert')
     ...

РЕДАКТИРОВАТЬ: filereadable($HOME.'/.vim/colors/'.name.'.vim') может показаться простым и определенно привлекательным, но этого недостаточно, если цветовая схема, которую мы ищем, находится где-то еще. Как правило, если он был установлен в другом каталоге благодаря диспетчеру плагинов. В этом случае единственный надежный способ — проверить vim 'runtimepath'. (он же 'rtp'). Отсюда globpath(). Обратите внимание, что команда :colorscheme name ищет в {rtp}/colors/{name}.vim.

person Luc Hermitte    schedule 18.04.2011
comment
Переход на :silent! colorscheme foo очень хорошо соответствует моим потребностям, спасибо. - person mat; 29.11.2012
comment
В части о назначении переменных следует использовать let. В противном случае я получаю сообщения об ошибках, что pat не является командой vim. - person jdhao; 11.04.2019
comment
@jdhao. Действительно, ты прав. Интересно, как он мог оставаться в таком состоянии так долго... Спасибо. - person Luc Hermitte; 11.04.2019

Альтернативой ответу @eckes может быть попытка загрузить цветовую схему и устранить ошибку, если она не существует:

try
    colorscheme mayormaynotexist
catch /^Vim\%((\a\+)\)\=:E185/
    " deal with it
endtry
person Randy Morris    schedule 18.04.2011
comment
Спасибо. Я не знал, что вы можете выполнить try-catch в .vimrc! - person ClosureCowboy; 19.04.2011
comment
Не могли бы вы подробнее объяснить значение синтаксиса регулярных выражений catch? Я не понимаю, почему нельзя просто /^E185:/ - person Daniel YC Lin; 02.02.2017
comment
Я просто использовал пример из :help catch, так как предполагал, что это будет точный формат ошибки. - person Randy Morris; 02.02.2017

Вы можете использовать функцию filereadable, чтобы проверить, соответствует ли цветовая схема ( например, schemename) существует: проверьте один раз под ~/vimfiles/colors (Win32, для Unix используйте ~/.vim/colors/) и один раз под $VIMRUNTIME/colors/:

if filereadable("/path/to/schemename.vim")
  colo schemename
endif
person eckes    schedule 18.04.2011

Мой метод похож,

if filereadable( expand("$HOME/.vim/colors/railscast.vim") )
    colorscheme railscast
endif

Это немного более надежно, чем жесткое кодирование всего пути.

person Community    schedule 14.05.2014

Обычно я использую любимый colorscheme с запасным вариантом, если мой любимый недоступен. Вложенный try сделает эту работу:

try 
  colorscheme solarized
  catch
  try 
    colorscheme peachpuff
    catch
  endtry
endtry

Если ни один из colorscheme не доступен, загружается вариант по умолчанию (независимо от того, что происходит в вашей системе). Если одна или обе цветовые схемы недоступны, ошибки не отображаются. Сначала поставьте предпочитаемый colorscheme.

Кроме того, catch без аргументов перехватывает любую ошибку. Это удобно, если вы имеете дело с разными локалями, которые выдают разные сообщения об ошибках.

person jebidiam    schedule 04.10.2018

Это то, что у меня есть в моем .vimrc файле.

if filereadable( expand("$HOME/.vim/colors/sublimemonokai.vim") )
    colorscheme sublimemonokai "https://github.com/ErichDonGubler/vim-sublime-monokai

    " vim-sublime-monokai only support 256 colours in terminal. If you are using a terminal which support truecolor like iterm2, enable the GUI color
    set termguicolors

    " Otherwise, use below setting to activate the 256 color in terminal
    set t_Co=256
else
    echom "The sublimemonokai.vim were not found to be used as colorscheme. elflord will be set for the timebeing..."
    colorscheme elflord
endif

в основном он проверяет, существует ли цветовая схема, которая мне нравится, на машине или нет. Если это так, он выберет его и применит все необходимые для него настройки. В противном случае он выбирает подходящую цветовую схему, поставляемую с vim.

Глядя на другие ответы, мой ответ разделяет битовую часть с ответом @user427390 и имеет дополнительное условие else.

Следующая ссылка очень помогла мне в создании сценариев для моих собственных файлов, связанных с .vimrc и vim: http://learnvimscriptthehardway.stevelosh.com/

person Mehrad Mahmoudian    schedule 09.11.2018