플러그인을 테스트하고 .vimrc에있는 경우에만 플러그인을 테스트하려면 어떻게해야합니까?


14

필자 는 성공적으로로드되었다는 가정하에 관련 명령 .vimrc을 사용 ftplugin하고 분명히 사용 하려고합니다 . 그러나 플러그인이 설치되어 있지 않은 오래된 컴퓨터가 몇 대 발견되었습니다. 어떻게 든이 플러그인을 조건부로로드 filetype on하고 동일한 조건부 블록에 유사한 지시문을 추가 할 수 있습니까 ?

색 구성표와 Vim 버전에 대한 조건이 있지만 플러그인을 확인하거나 인식하지 못하는 예제를 보지 못했습니다.

주의 : 저는 VimScript 초보자입니다.


1
플러그인은의 다음에로드 ~/.vimrc되므로 ~/.vimrc플러그인 파일의 존재를 테스트하거나 플러그인이 다음과 같은 자동 명령으로로드 될 때까지 테스트를 연기하지 않으면 플러그인 내에서 플러그인의 효과를 테스트 할 수 없습니다. VimEnter.
garyjohn

@garyjohn : 아하, 흥미 롭습니다. 이런 종류의 것이 기존의 대답과 모순되기 때문입니다. 답변으로 작성해 주시겠습니까?
0xC0000022L

그 문제를 해결하기 위해 답변을 편집했습니다.
qqx

내 의견은 qqx의 답변과 모순되지 않았습니다. qqx의 답변을주의 깊게 읽지 않았거나 잘못 추론 한 경우 놓칠 수있는 점에주의를 기울여야했습니다. 대답은 시작하기에 좋았으며 지금은 더 명확합니다.
garyjohn

답변:


19

exists()플러그인에 의해 정의 된 변수, 명령 또는 함수가 vim으로 알려져 있는지 확인하기 위해 함수를 사용하는 조건부로 해당 블록을 랩핑 할 수 있습니다 .

~ / .vim 아래 파일에 몇 비트가 있습니다.

" after/plugin/speeddating.vim
if exists(':SpeedDatingFormat')
    SpeedDatingFormat %-d %B %Y
endif

" ftplugin/ruby.vim
if exists('g:loaded_surround') && !exists('b:surround_'.char2nr(':'))
  let b:surround_{char2nr(':')} = ":\r"
endif

위의 비트는 일반 플러그인, 여기서 ftplugin 및 after/plugin디렉토리 의 파일 이후에 평가되는 파일에 있습니다.

다른 옵션은 try / catch 블록을 사용하는 것이지만 vim 7.0 이상이 필요합니다.

if v:version >= 700
    try
        runtime bundle/pathogen/autoload/pathogen.vim
        call pathogen#infect()
    catch
    endtry
endif

try해당 블록 의 섹션에 문제가 발생하면 해당 catch섹션으로 건너 뜁니다 . catch섹션이 비어 있기 때문에 endtry명령문 다음에 나머지 초기화 파일로 계속 진행됩니다 .

이미로드 된 플러그인에 의존하지 않고 수동으로 코드를로드하기 때문에 .vimrc 파일 자체에서 수행 할 수 있습니다.


8

내가 선호하는 방법은 플러그인 파일이 있는지 확인하는 것입니다. 나는 이것이 더 간단하다는 것을 안다.

if !empty(glob("path/to/plugin.vim"))
   echo "File exists."
endif

합리적으로 들리지만 기본 경로는 무엇입니까? 자동으로 Vim 홈 ~/.vim입니까 (예 : 보통 )?
0xC0000022L

.vimrc 구성 및 패키지 관리 기본 설정에 따라 다릅니다. 나는 이것을한다 :if filereadable($HOME."/.vim/plugins.vim") source ${HOME}/.vim/plugins.vim endif
user3751385

고마워요 나는 당신이 준 것에 의해 암시 된 기본 경로가 더 걱정되었습니다.
0xC0000022L

4

Vim 구성을 .vimrc여러 after/디렉토리 가 아닌에 함께 유지하면서 이것을 달성하고 싶었습니다 . 이것이 내가 생각해 낸 해결책입니다.

  1. 로 제공되는 단일 명령을 확인하여 각 플러그인의 존재를 확인하고 존재하는 exists()경우 옵션을 설정하십시오. (이것은 허용되는 답변과 같습니다.)

  2. 위의 방식으로 설정된 모든 옵션을 함수 ( SetPluginOptionsNow()내 코드에서 호출) 내에 넣으십시오 .

  3. VimEnter이벤트 에서이 함수를 호출하면 새 Vim 세션을 시작하는 동안 트리거되지만 플러그인이 모두로드 된 후에 트리거 됩니다. 이 사실 때문에 exists()검사에서 문제없이 플러그인 기능을 확인할 수 있습니다.

여기 내 해당 부분의 샘플이 있습니다 .vimrc.

""" PLUGIN-SPECIFIC OPTIONS
" These are "supposed to be" set in after/plugin directory, but then
" cross-platform synchronization would get even messier. So, au VimEnter it is. 

function! SetPluginOptionsNow()


    " NERDTree Options
    if exists(":NERDTree")
        map <F10> :NERDTreeToggle<CR>
    endif

    " Syntastic Options
    if exists(":SyntasticCheck")
        let g:syntastic_stl_format = '[Syntax: line:%F (%e+%w)]'
        set statusline+=%#warningmsg#
        set statusline+=%{SyntasticStatuslineFlag()}
        set statusline+=%*
        " and so on...

endfunction

au VimEnter * call SetPluginOptionsNow()
""" END OF PLUGIN-SPECIFIC OPTIONS

이 답변은 vim-airline에 좋지 않습니다. 특히 VimEnter 이벤트가 같은 것을 지정하기를 기다리는 airline_theme것은 많은 오류를 유발하는 것처럼 보입니다 ... 왜 그런지 잘 모르겠습니다.
StevieP

3

또 다른 대안은 존재하지 않을 :silent! {cmd}때 오류를 억제하는를 사용 {cmd}하는 것입니다. 주요 이점은 짧은 단일 명령이라는 것입니다. 이것은 Vim 6에서도 작동하며 옵션 항목에 좋습니다.

예를 들어 Tim Pope의 repeat.vim 을 사용하여 매핑을 반복 가능하게 하는 플러그인에서 사용 됩니다.


:silent!아닌 !silent이며 :unsilent내부 어딘가에 사용될 때를 제외하고 포함 된 모든 명령에 적용됩니다 . (그러나 드문 일입니다.)
Ingo Karkat

2

다른 질문에 처음 게시 : /programming//a/48178537/2843583

대안으로 regexp를 사용하여 현재 플러그인이 있는지 확인하십시오 runtimepath.

if &rtp =~ 'plugin-name'
    ...
endif

이것은 autoload디렉토리에 vimscript 코드 만있는 플러그인과 함께 작동한다는 장점이 있으며, 함수 호출시 자동로드 스 니펫이로드되기 때문에 .vimrc가 처음 구문 분석 될 때 감지 할 수 없습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.