ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [vim-go] vim에 go 플러그인 설치하기
    IT 생활/Go 프로그래밍 2021. 12. 12. 16:12

    안녕하세요 류똥구입니다.
    저는 Go에 관심이 생겨서 취미로 공부도 하고 개발도 해보려고 하고 있습니다.
    처음에 Go 맛만 볼 때는 리눅스 노트북을 쓰고 있을 때여서 노트북에 Go랑 Atom을 설치해서 사용했었는데,
    그사이에 노트북도 맥북에어로 바꾸기도 해서 새로 Go 개발환경을 구축해야 하는 상황이였습니다.

    노트북이 바뀔 때마다 개발환경을 새로 구축하는 것도 귀찮기도 하고, 맥북뿐만 아니라 아이패드에서도 개발을 했으면 했습니다.
    집에서 구형 맥미니를 서버로 사용하고 있어서 맥미니를 Go 개발 서버로도 사용할 생각이였습니다.

    맥북에서는 따로 개발 환경을 구축해도 되지만 밖에 나갈때는 주로 아이패드만 가지고 가서 (맥북도 상대적으로 무겁더라구요)
    거의 아이패드를 위한 Go개발 환경 구축이 목적이였습니다.

    우선 맥미니에 Go를 설치했습니다.
    2020.04.01 - [IT 생활/Go 프로그래밍] - GO 언어 시작하기

     

    GO 언어 시작하기

    안녕하세요 류똥구입니다. 최근에는 제 맥미니를 가지고 홈서버를 구축하는 과정을 포스팅 해왔었는데, 갑자기 GO?라니 무언가 싶으신가요? 홈서버로 개인 사이트를 하나 운영해보려고 합니다.

    welcome1208.tistory.com


    구글링을 해보니 Go 개발에서는 vim이 꽤나 많이 사용되고 있다고 합니다.
    아이패드에서 어차피 맥미니에 접속해서 개발할 것이니 vim은 딱 맞는 에디터이기 합니다.

    vim에 Go를 위한 vim-go 플러그인을 설치하면 키워드 인식 및 하이라이트, 자동완성 등을 제공해 줍니다.
    https://github.com/fatih/vim-go

     

    GitHub - fatih/vim-go: Go development plugin for Vim

    Go development plugin for Vim. Contribute to fatih/vim-go development by creating an account on GitHub.

    github.com

    맥미니에 vim-go를 설치하면 아이패드에서 터미널앱으로 맥미니에 ssh로 접속하여 개발만 하면 됩니다.

    그런데 문제는 제가 vim을 쓰긴 했지만 플러그인을 지원한다는 사실도 몰랐다는 겁니다.
    vim-go를 어떻게 설치해야 할지 몰라서 꽤나 헤맸는데요.
    Ricardo Gerardi의 "Configuring Vim to Develop Go Progrmas"를 참고하여 vim-go를 설치하였습니다.

     

    Configuring Vim to Develop Go Programs

    VIM + Plugins = A Powerful IDE for Go

    medium.com


    이하 내용은 "Configuring Vim to Develop Go Programs"의 번역입니다.


    Vim은 빠르면서고 가벼운 텍스트 에디터로 리눅스 배포판과 Unix계열 운영체제에서 내장되어 있있습니다. Vim은 간단하게 텍스트 파일을 수정하거나 설정파일을 변경하는 용도로 많이 사용되고 있습니다. 그러나 Vim은 보다 많은 용더로 사용할 수 있습니다. Vim은 유연하고 기능이 많은 현대적인 에디터로 살짝 설정을 변경하는 것만으로 IDE를 대체하여 소프트웨어 개발하는데 사용할 수 있습니다.

    여러 IDE의 텍스트 에디터에서 LSP (Language Server Protocol)로 개발된 gopls ("고플리즈"라 발음)를 통해서 Go언어를 지원하고 있습니다. gopls는 코드 자동완성 (code auth-completion), 코드분석(analysis), 형식 지원(formatting) 등을 지원합니다. vim-go 플러그인을 추가하면 Vim에서 Go개발에 필요한 모든 것을 할 수 있습니다.

    vim-go 플러그인은 Fatih Arslan이 개발하였고 이후에 Billie Cleek이 유지보수하고 있습니다. vim-go는 gopls과 Go 툴들을 이용하여 Vim에서 IDE와 같은 사용 경험을 제공해 줍니다.

    이 글에서는 vim-go를 설치하고 Vim8로 Go 프로그래밍을 위한 기본 설정하는 방법에 대해서 다룹니다.
    이 글에서 설명하는 방법은 리눅스 배포판과 macOS에 적용할 수 있습니다. 윈도우용 Vim에서도 대부분의 설정을 동일하나 파일 경로나 설치가 필요한 프로그램들이 다를 수 있습니다.


    사전 준비

    Vim-go를 설치하기 위해서는 다음 항목들을 만족해야 합니다.

    • Go 1.16 이상 버전
    • Vim 8.2 이상 버전
    • Git (vim 플러그인 설치를 위해 필요)
    • Python 3 (선택사항. Completor 플러그인을 사용하여 자동 완성을 사용하기 위해서 필요)

    우선, Go를 리눅스 패키지 관리자나 macOS brew를 사용하여 설치하거나 Go 사이트에서 설치 파일을 다운로드 받아아서 설치합니다.
    Go를 다운로드하여 설치하는 방법은 제 이전글을 참고하시기 바랍니다.
    2020.04.01 - [IT 생활/Go 프로그래밍] - GO 언어 시작하기

     

    GO 언어 시작하기

    안녕하세요 류똥구입니다. 최근에는 제 맥미니를 가지고 홈서버를 구축하는 과정을 포스팅 해왔었는데, 갑자기 GO?라니 무언가 싶으신가요? 홈서버로 개인 사이트를 하나 운영해보려고 합니다.

    welcome1208.tistory.com


    Vim은 대부분의 리눅스 배포판과 macOS에서 사용가능하나 일부 시스템에서는 베이직 버전을 제공하고 일부는 enhanced 버전의 Vim을 제공하고 있습니다. 본 글의 내용을 따라가기 위해서는 현재 사용하고 있는 Vim의 버전이 플러그인 지원과 같은 고급기능을 지원하는 버전이여야 합니다.

    앞서 설명한 준비가 되었다면, Go 개발에 필요한 플러그인을 설치합시다.

    Vim-go 플러그인 설치

    플러그인을 사용하여 Vim8의 기능을 확장 합시다. 플러그인을 사용하면 별도의 설치 없이 Vim에 많은 기능을 추가할 수 있습니다.
    Vim8은 native plugin loading을 제공하고 있습니다. (설치된 플러그인을 자동으로 동작시킨다는 의미인 듯) 따라서 별도의 플러인 매니저가 필요하지 않습니다.
    native plugin loading을 지원하는 타입은 Vim에서 “:help package” 명령으로 확인할 수 있습니다.

    Vim-go 설치를 위해 auto-load 플러그인 디렉토리를 만들어 줍니다.

    $ mkdir -p ~/.vim/pack/plugins/start


    다음으로 .vimrc 파일에 파일 타입 감지와 구문 하이라이트 설정합니다.

    $ vim ~/.vimrc
    syntax on
    filetype plugin indent on


    그럼 다음으로 vim-go를 앞서서 만든 .vim/pack/plugins/start에 다운로드 합니다.

    $ git clone https://github.com/fatih/vim-go.git ~/.vim/pack/plugins/start/vim-go


    github에 있는 vim-go 플러그인 코드를 다운로드 받은 것이므로 master 브랜치로 지정되어 있습니다.
    master 브랜치는 개발용이므로 버전 태그를 확인하여 최신 버전으로 변경하도록 합니다.

    $ cd ~/.vim/pack/plugins/start/vim-go
    $ git checkout $(git tag -l --sort verion:refname | grep -v rc | tail -1) // 가장 최신 태그로 변경함


    2021년 6월 기준으로 최신 버전은 v1.25입니다. 아마도 이 글을 따라서 하는 분들은 더 이후 버전일 수도 있습니다.
    여기까지 하면 vim-go 플러그인 설치가 완료되었습니다.

    Vundle이나 vim-plug 같은 플러그인 매니저를 사용해서도 vim-go를 설치할 수 있습니다.
    .vimrc에 다음 내용을 추가하고 Vim을 재시작하면 됩니다.

    “vim-plug 를 사용하는 경우”
    Plug ‘fatih/vim-go’, { ‘do’: ‘:GoUpdateBinaries’ }

    “Vundle을 사용하는 경우”
    Plugin ‘fatih/vim-go’


    Vim-go 플러그인 설치를 하고 나면 help 시스템을 설정해 줘야 합니다.

    $ vim -c “:helptags ALL” -c “:q”


    이제 마지막으로 Go 유틸리티를 설치해 줍니다.

    $ vim -c “:GoInstallBinaries” -c “:q”


    설치에 대한 더 자세한 내용을 알고 싶으시면, github에 있는 vim-go의 설치 절차 내용을 확인하시기 바랍니다.
    이제 vim-go를 보다 효과적으로 사용하기 위한 기본 설정을 해봅시다.

    vim-go 시작하기

    vim-go를 설치하고나면 Vim은 .go 파일에 대해서 자동으로 vim-go를 불러와서 사용합니다.
    go 파일을 작성할 때는 vim-go의 명령들을 바로 사용할 수 있습니다.

    일반적으로 많이 사용하는 명령들은 다음과 같습니다.

    • :GoRun - “go run” 명령을 이용하여 main 패키지를 실행
    • :GoBuild - “go build” 명령을 이용하여 현재 패키지를 빌드
    • :GoTest - “go test” 명령을 이용하여 패키지 테스트를 수행
    • :GoCoverageToggle - 테스트 커버리지 결과 디스플레이 설정 토글
    • :GoRename - 현재 패키지의 모든 .go 파일에 대해서 현재 커서가 가르키는 인식자 (identifier)의 이름을 변경
    • :GoImplements - 현재 커서가 가르키는 인식자가 어떤 인터페이스의 구현인지 표시
    • :GoInfo - 현재 커서가 가르키는 인식자에 대해서 변수 타입이나 함수형과 같은 정보를 표시


    위 명령어에 단축키를 매핑하면 보다 생산적으로 사용할 수 있습니다.
    .vimrc에 autocmd (au)과 nmap을 이용하여 vim-go 명령을 .go 파일에서만 사용할 수 있는 단축키를 지정할 수 있습니다.

    au FileType go nmap <leader>r <Plug>(go-run)
    au FileType go nmap <leader>b <Plug>(go-build)
    au FileType go nmap <leader>t <Plug>(go-test)
    au FileType go nmap <leader>c <Plug>(go-coverage-toggle)
    au FileType go nmap <leader>e <Plug>(go-rename)
    au FileType go nmap <leader>s <Plug>(go-implements)
    au FileType go nmap <leader>i <Plug>(go-info)

    키맵에서는 <leader>키를 기본으로 백슬러시 '\'를 사용합니다. 따라서, \b를 사용해서 프로그램을 빌드하거나 \r를 사용해서 실행할 수 있습니다.

     

    코드 탐색 (Navigating Code)

    추가적으로 vim-go는 Go 코드에서 연관있는 내용을 찾거나 파일을 여는 것을 쉽게 할 수 있습니다. Vim은 키맵 gd를 사용해서 변수 정의로 이동할 수 있습니다. vim-go 플러그인은 이 키맵(gd)를 다시 매핑해서 ":GoDef"를 실행하도록 합니다. ":GoDef"는 커서가 가르키고 있는 인식자의 정의나 선언 부분으로 이동하게 해주는 기능입니다. vim-go에서 gd는 심지어 다른 파일이나 다른 패키지에 있는 곳으로도 이동할 수 있습니다. 또한, vim-go는 점프 경로를 저장하고 있어서 여러번 점프한 다음에 'Ctrl+o'를 누르면 이전 위치로 돌아갈 수 있습니다.

    어떤 상황에서는 별도의 창에서 정의 부분을 열어서 보면서 작업하는게 유용할 수 있습니다.
    .vimrc에 다음 두 줄을 추가하여 Vim의 수평 분할 ‘\ds’나 수직 분할 ‘\dv’ 단축어를 vim-go의 창분할 명령으로 사용 할 수 있습니다.

    au FileType go nmap <leader>ds <Plug>(go-def-split)
    au FileType go nmap <leader>dv <Plug>(go-def-vertical)


    ‘:GoAlternate’ 명령을 이용하면 작업 중인 .go 파일의 테스트 파일을 왔다갔다 할 수 있습니다. 단축키 ‘\ae’를 사용하여 해당 기능을 사용하고 ‘\av’ 단축어로 다른 파일을 수직분할해서 볼 수 있게 하려면 .vimrc에 다음 내용을 추가하면 됩니다.

    au FileType go nmap <leader>ae <Plug>(go-alternate-edit)
    au FileType go nmap <leader>av <Plug>(go-alternate-vertical)


    그럼 다음으로 vim-go로 코드 문서를 확인하는 방법을 확인해 보겠습니다.

    팝업창으로 문서 열기

    vim-go에서 키 ‘k’를 사용하여 커서가 가리키고 있는 인식자에 대한 문서는 열 수 있습니다.

    (macOS의 Vim에서는 'k'가 위로 이동으로 키 맵핑이 되어 있습니다. 문서를 열기 위해서는 ':GoDoc'을 이용하거나 따로 키 맵핑을 해야합니다.)

    Vim의 기본 설정으로는 문서가 별도의 창으로 열리도록 되어 있습니다.
    vim 설정을 좀 변경하면 문서를 별도 창이 아니라 팝업창으로 열리게 할 수 있습니다.

    .vimrc에 다음 내용을 추가하면 팝업창을 활성화 할 수 있습니다.

    let g:go_doc_popup_window = 1


    설정을 한 뒤 Go 파일을 열어서 확인하고자 하는 인식자에 커서를 위치하고 ‘k’키를 누르면 다음과 같이 팝업창으로 문서를 보여주게 됩니다.

     

    vim-go의 문서 팝업출력


    여기까지 소개한 설정을 마쳤다면, 이제 Vim으로 Go 프래그래밍을 할 모든 준비가 되었습니다.
    vim-go에서 제공하느 명령어는 ‘:h’으로 확인할 수 있으니 참고하시기 바랍니다.


    자동완성 사용하기

    자동완성 기능은 아마도 IDE의 가장 유명한 기능일 겁니다. 자동완성이 있으면 IDE에서 함수, 메소드 그리고 프로퍼티들에 대해서 현재 사용가능한 것을 제안해주게 됩니다.
    Vim에서도 비슷한 기능을 사용할 수 있습니다. vim-go 플러그인은 gogls와 Vim omnifunc를 사용하여 자동완성을 제공할 수 있습니다.

    자동완성을 사용하기 위해서는 Vim의 삽입 모드 (INSERT mode)에서 <ctrl+x><ctrl+o>를 누르면 다음과 같이 자동완성 제안을 볼 수 있습니다.

    vim-go의 자동완성 기능


    만약에 알아서 자동완성이 되는 것을 원하면, completor 플러그인을 추가로 설치하면 됩니다. completor 플러그인은 Vim8의 비동기 코드 완성 플러그인으로 Neovim을 사용하는 경우에는 deoplete을 설치하면 되고 Vim8에서는 파이썬을 통해서 기능이 제공됩니다.

    Vim8의 경우에는 다음 명령으로 .vim/pack/plugins/start에 completor를 설치합니다.

    $ git clone https://github.com/maralla/completor.vim.git ~/.vim/pack/plugins/start/completor.vim


    Vundle이나 Vim-plug를 사용하는 경우에는 .vimrc에 다음 내용을 추가하여 설치할 수 있습니다.

    Plug ‘maralla/completor.vim’


    설치가 되었으면 Completor가 gopls를 사용하도록 .vimrc에 다음 내용을 추가합니다.

    let g:completor_filetype_map = {}
    let g:completor_filetype_map.go = {‘ft’: ‘lsp’, ‘cmd’: ‘gopls - remote=auto’}


    gopls가 $PATH에 포함되어 있어야 Completor가 정상적으로 동작합니다.
    만약에 Bash를 사용하고 있으면 다음 내용을 .bash_profile에 추가하도록 합니다.

    export PATh=$PATH:$home/go/bin


    이제 Vim을 재시작하고 go 파일 작업을 하면 자동으로 팝업창으로 코드 자동완성 제안 목록을 보여주게 됩니다.

    주의: 만약에 다른 자동완성 플러그인을 이미 사용 중이라면, 해당 플러그인에서 gopls와 연동되어 문서가 나오는지 확인해 봐야 합니다.


    다음으로 할 것은?

    Vim은 프로그래밍을 위한 빠르고 유연한 환경중 하나입니다. 플러그인과 툴을 추가하는 것만으로도 Vim은 Go 프로그래밍을 위한 IDE를 대체할 수 있습니다.
    본 글에서는 Vim에서 몇몇 유용한 툴들을 Go 프로그래밍에 사용할 수 있도록 설정하고 자동완성을 적용하였습니다.

    본 글에서 설명한 vim 개발환경은 바로 개발을 시작하고 제품을 만들 수 있기에 충분합니다. Vim-go는 코드 정적분석, 코드 분석, 태깅, 함수 정의 찾기, 디버깅 등의 많은 기능들을 제공하고 있습니다. 다른 글에서는 vim-go의 다른 기능들을 설정하는 방법에 대해서 다루도록 하겠습니다.

    댓글

Designed by Tistory.