팀내 개발환경을 위한 vim-go를 설정 해보자

vim-go

vim-go를 왜 쓰게 되었나?

Team내에서 좀더 업무 자동화를 위해 내부 개발이 필요하게 되어 Language 습득 중에 개발 환경 설정을 찾는 도중에 개발팀 이종립님 도움으로 vim-go를 알게 되어 해당 설정을 한후에 내용을 팀원들에게 내용 공유 차 간단히 정리 하게 되었다. (vs code와 vim사이를 고민을 많이 했지만 팀 내부 분들이 Vim이 더 익숙하신 분들이 많아 vim으로 환경 설정을 하게 되었다.)

참고 링크: go를 위한 vim 환경설정

요구사항 확인

  • vim 버전을 확인하자.
    vim-go 및 필요 Plugin을 사용 하려면 vim 버전이 8버전 이상 설치를 요구 되어진다. 아래와 같이 버전 확인 및 재설치를 진행해보자.
#vim 버전을 확인 해보자
brew info vim

# 만약 8버전 이상이 아닌 경우 아래와 같이 uninstall 한 후에 재 설치 하는게 가장 깔끔하다.
brew unlink vim
brew unlinstall vim
brew install vim
  • vim-plug 설치하자.
    vim-plug가 설치 되어 있어야 한다. 예전에는 Vundle을 사용하였지만 사용시 vim이 정상적으로 실행 안될때가 많아져서 vim-plug로 변경하게 되었다. vim plug는 vim 에서 사용 할 수 있는 plugin manager로 plugin을 쉽게 설치 하고 사용 할수 있도록 도와준다.
# 아래와 같이 vim-plug를 설치 하자 
$ curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ 
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

vim-go 설치

  • .vimrc에 설치해야할 Plugin을 정의 하자
filetype plugin indent on 

" vim-Plug Plugin List
call plug#begin('~/.vim/plugged')

" 자동완성을 해주는 Plugin이다. 많은 Launguge를 지원하고 :CoCInstall coc-<lang> 으로 지원되는 Languge 설치가 가능
Plug 'neoclide/coc.nvim', {'branch': 'release'}

" 유명한 플러그인들
Plug 'majutsushi/tagbar'
Plug 'vim-airline/vim-airline'
Plug 'tpope/vim-fugitive'

" Vim-go를 사용하기 위한 Plugin
Plug 'fatih/vim-go', { 'do': ':GoUpdateBinaries' }

" 나만의 자동 완성을 만들수 있는 Plugin 이다. 
Plug 'SirVer/ultisnips'

" 편의
Plug 'milkypostman/vim-togglelist'
Plug 'AndrewRadev/splitjoin.vim'
Plug 'mhinz/vim-startify'

" preview를 해주는 유용한 plugin
Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' } " fzf 사용시 꼭 설치하고 ~/.fzf 에 들어가서 ./install --all 하자
Plug 'junegunn/fzf.vim'

" Initialize plugin system
call plug#end()
  • 저장하고 ESC 키를 눌러 :PlugInstall 명령어로 설정한 Plugin을 설치 해보자.
:PlugInstall
  • .vimrc에 Go lang 설정을 넣어보자 다행히 종립님이 블로그에 설정값을 잘 정리해 주셔서 일일히 찾지 않고 쉽게 설정 할 수 있었다. 만약 개인적으로 더 필요한 경우에는 :help vim-go 명령어를 사용하여 옵션값을 확인해서 설정해보자.
" 저장할 때 자동으로 formatting 및 import from https://johngrib.github.io/
let g:go_fmt_command = "goimports"
let g:go_list_type = "quickfix"
let g:go_addtags_transform = "camelcase"

let g:go_autodetect_gopath = 1
let g:go_highlight_types = 1
let g:go_highlight_fields = 1
let g:go_highlight_functions = 1
let g:go_highlight_function_calls = 1
let g:go_highlight_extra_types = 1
let g:go_highlight_generate_tags = 1
let g:go_highlight_operators = 1
let g:go_auto_type_info = 1
let g:go_auto_sameids = 1

" quickfix 이동 및 open/close from https://johngrib.github.io/
nnoremap <C-n> :cnext<CR>
nnoremap <C-p> :cprevious<CR>
nnoremap <LocalLeader>q :call ToggleQuickfixList()<CR>

" 테스트 커버리지 검사 및 색깔 표시 토글 from https://johngrib.github.io/
nnoremap <LocalLeader>c :GoCoverageToggle<CR>

" 자주 쓰는 기능들 from https://johngrib.github.io/
autocmd FileType go nnoremap <Tab>b :GoBuild<CR>
autocmd FileType go nnoremap <Tab>r :GoRun<CR>
autocmd FileType go nnoremap <Tab><Tab>r :GoRun %<CR>
 
autocmd FileType go nnoremap <Tab>t :GoTest<CR>
autocmd FileType go nnoremap <Tab><Tab>t :GoTestFunc<CR>
autocmd FileType go nnoremap <Tab>c :GoCoverageToggle<CR>

vim-go 사용법

vim으로 실행된 코드내에서 IDE 처럼 다양한 기능들을 사용 할 수 있다. 아래는 사용방법에 대한 명령어 이다.
이부분도 위에 참고 링크에서 종립님이 자세히 작성을 해주셔서 내용 정리 및 팀 공유차 작성하게 된 파트 이다. 좀더 많은 자료를 확인 하고 싶으면 아래 링크를 확인 해보자 vim-go

Run/Build/Test

vim-go를 설치하면 vim내에서 실행, 테스트, 빌드를 실행 할 수 있게 된다. 아래는 vim 내에서 명령어 호출 방법이다.

  • Run
    • :GoRun - 패키지 전체를 실행한다. (main.go)
    • :GoRun % - 현재 편집중인 파일에서 실행한다.
  • Build
    • :GoBuild - 빌드를 하며, 빌드 내용은 QuickWindow 에서 보여준다.
  • Test

  • :GoTest - 모든 테스트 케이스를 실행한다.
  • :GoTestFunc - 현재 커서가 위치한 함수의 테스트를 실행한다.
  • :GoCoverage - 테스트 코드를 실행하고, 성공/실패한 함수들에 색깔을 보여준다.
  • :GoAlternate - 현재 코딩 중인 파일과, 해당 파일의 테스트 코드 파일을 번갈아 가며 보여준다.

Import

위에 .vimrc에서는 vim으로 go 파일 생성시 자동으로 import 및 fomater 가 입력 되는 설정을 넣어 두었지만 이부분도 수동으로 가능하다.

  • :GoImport strings - import ”strings” 구문이 추가된다.
  • :GoImport s<Tab> - 일부만 쓰고 키를 누르면 자동 완성이 되며, 계속 누르면 여러 후보를 확인 할 수 있다.
  • :GoImportAs str strings - import str ”strings” 구문이 추가 된다.
  • :GoDrop strings - import ”strings” 구문이 삭제 된다.

Interface

Interface 구현시 아래의 명령어를 사용해주면 기본 fomater를 만들어준다.

  • :GoImpl - 인터페이스 이름을 입력하면 구현해야할 함수들의 뼈대를 만들어 준다.

Find/View/Move

  • [[ - 이전 함수로 커서 이동.
  • ]] - 다음 함수로 커서 이동.
  • :GoDef - 커서가 위치한 함수나 변수가 선언된 곳으로 점프
    • vim 기본 커맨드인 ctrl+] 로도 된다. 외울 필요 없음
    • gd로도 가능하다.
    • 점프 전의 위치로 돌아가는 방법은 세 가지가 있다.
      • 점프 전의 위치로 돌아가려면 vim 기본 커맨드인 ctrl+o.
      • ctrl+o의 작동 방식이 마음에 안 든다면 vim-go에서 제공하는 ctrl+t를 써도 좋다.
      • 가장 확실하게 돌아가려면 :GoDefPop을 쓰면 된다.
  • :GoDecls, :GoDeclsDir - 함수나 변수가 정의된 파일, 경로 목록을 보여준다.
  • :GoDoc - 함수 바로 위에 달아둔 코멘트를 볼 수 있다.
  • :GoInfo
    • 해당 함수의 이름과 parameter 목록, return type 등을 아래 status line 에 한 줄로 보여준다.
    • let g:go_auto_type_info = 1로 설정해두면, 커서 아래의 함수 정보를 자동으로 보여준다.
  • let g:go_auto_sameids = 1 - 설정해 두면, 커서 아래의 변수명/함수명을 현재 버퍼에서 모두 찾아 색깔을 칠해준다.

  • :GoDeps - 파일의 모든 디펜던시 보기.
  • :GoReferrers - 커서가 위치한 함수, 변수를 사용하는 모든 파일/위치를 조사해준다.
  • :GoImplements - 인터페이스 구현 목록을 보여준다. 유용하다.
  • :GoChannelPeers - 변수 위에 커서를 놓고 사용한다. 해당 변수가 선언된 곳, 재할당된 곳, 함수로 넘겨진 곳 등을 목록으로 보여준다.
  • :GoCallers, :GoCallees - IDE들이 모두 제공하는 기능.

Refactoring

  • :GoRename - 변수, 함수명 변경을 도와준다.
  • :GoFreevars - 비주얼 모드에서 사용. 범위 내의 변수들 중 extract 해도 문제 없을 변수 목록을 만들어 준다

Debugger

  • :GoDebugStart
  • :GoDebugTest
  • :GoDebugBreakpoint
  • :GoDebugContinue
  • :GoDebugNext
  • :GoDebugStep
  • :GoDebugStop
  • :GoDebugRestart

결론

vim이 훌륭한 툴이라는걸 다시 알게 된 계기가 되었다 예전부터 엔지니어링 업무때문에 많이 사용하고 있었지만 거의 대부분 정확히 이해하고 쓴다기보단 내가 필요한 기능들만 찾아서 쓰다보니 활용도가 낮았고 coding을 시작하기 시작했을때 부터는 IDE를 주로 많이 사용하게 되었는대 현재는 vim에서도 충분히 plugin을 통하여 IDE 만큼 기능이 지원되는 것 같다. IDE를 써도 vim이 익숙하다보니 항상 vim plugin을 설치해서 사용 하였는대 이제는 그럴 필요는 없어보인다. 용도에 따라 IDE와 vim을 분리해서 쓰면 장점이 많을것 같다.

태그: ,

Back to Top ↑

댓글남기기