발단

Ultisnips는 최강의 Vim 플러그인 중 하나이지만, 이상하게 다른 플러그인과 충돌하는 경우가 많은데…

오늘 하나 더 발견했다.

vim-go를 설치한 다음 *.go 파일을 열면, += 연산자에 대해 E734 에러가 발생한다.

E734: Wrong variable type for +=

문제 발생 지점

문제 발생 지점은 vim-go의 s:GoUltisnips 함수였다.

function! s:GoUltiSnips() abort
  if get(g:, 'did_plugin_ultisnips') isnot 1
    return
  endif

  if !exists("g:UltiSnipsSnippetDirectories")
    let g:UltiSnipsSnippetDirectories = ["gosnippets/UltiSnips"]
  else
    let g:UltiSnipsSnippetDirectories += ["gosnippets/UltiSnips"]   " 오잉?
  endif
endfunction

주석으로 오잉? 이라 쓴 곳을 보면

  • g:UltiSnipsSnippetDirectories+= 연산자를 써서 ["gosnippets/UltiSnips"]를 이어 붙이고 있다.
  • 이어 붙이는 것이 list 이므로, g:UltiSnipsSnippetDirectories는 list여야 한다.
  • g:UltiSnipsSnippetDirectories가 list가 아니라면? E734 에러가 난다.

어이없는 건 나는 g:UltiSnipsSnippetDirectories를 따로 설정해준 적이 없다는 것이다.

default 값으로 돌아가는데도 에러가 난다는 것. 설마 나만 그런건 아니겠지?

아무튼 해결책은 두 가지다.

  • .vimrc에서 let g:UltiSnipsSnippetDirectories = [] 와 같이 정의해준다.
  • s:GoUltiSnips에서 g:UltiSnipsSnippetDirectories가 list 타입이 아니라면 +=을 못 쓰게 한다.

그냥 두 번째 방법을 쓰기로 했다.

따라서 다음과 같이 수정하였다.

function! s:GoUltiSnips() abort
  if get(g:, 'did_plugin_ultisnips') isnot 1
    return
  endif

  if !exists("g:UltiSnipsSnippetDirectories")
    let g:UltiSnipsSnippetDirectories = ["gosnippets/UltiSnips"]
  elseif type("g:UltiSnipsSnippetDirectories") == 3
    let g:UltiSnipsSnippetDirectories += ["gosnippets/UltiSnips"]
  endif
endfunction

이렇게 수정하니 에러가 싹 사라졌다. 쉽게 해결해서 다행이다.

그러나 역시 가장 쉬운 해결 방법은 g:UltiSnipsSnippetDirectories.vimrc에서 직접 정의해 주는 것일듯.

let g:UltiSnipsSnippetDirectories = []

이거 하나면 위의 삽질이 다 필요없다.