설치

운영체제: macOS
vim 플러그인 매니저: pathogen

NodeJS 설치

$ brew install node

coc.nvim 다운로드

$ cd ~/.vim/bundle
$ git clone https://github.com/neoclide/coc.nvim

yarn 설치

$ npm install --global yarn

coc.nvim 디렉토리에서 coc.nvim 의존성 설치 및 컴파일

$ yarn install

jedi 패키지 설치

$ pip3 install jedi

~/.vimrc 파일에 설정 추가 vim configuration

자동완성 팝업창의 텍스트가 잘 보이지 않는 경우 ~/.vimrc 파일에 추가

hi Pmenu ctermbg=black ctermfg=white 

언어별 자동완성 설정

coc.nvim은 VSCode와 동일하게 LSP를 사용하여 자동완성 기능을 지원한다.

vim 을 실행한 뒤 명령어 입력 예시

  • Python :CocInstall coc-python
    • 인터프리터 설정 - :CocConfig python.setInterpreter "/path/to/interpreter"
  • C/C++ :CocInstall coc-clangd
  • JavaScript :CocInstall coc-tsserver

linter

소스 코드를 분석하여 에러가 발생하는 부분을 검사하여 알려 준다.
코드 스타일 준수 여부를 검사해주기도 한다.

Python

  • pylint - 스타일(PEP 8) 검사, 에러 검사, 리팩토링에 대한 조언
      $ pip install pylint
      $ pylint <파이썬 파일>
    
  • flake8 - 에러 검사
      $ pip install flake8
      $ flake8 <파이썬 파일>
    

float window/popup scroll

float window

사진과 같은 팝업창을 스크롤 하는 단축키를 설정하는 코드 (~/.vimrc)

" Remap <C-f> and <C-b> to scroll float windows/popups
if has('nvim-0.4.0') || has('patch-8.2.0750')
  nnoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? coc#float#scroll(1) : "\<C-f>"
  nnoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? coc#float#scroll(0) : "\<C-b>"
  inoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? "\<c-r>=coc#float#scroll(1)\<cr>" : "\<Right>"
  inoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? "\<c-r>=coc#float#scroll(0)\<cr>" : "\<Left>"
  vnoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? coc#float#scroll(1) : "\<C-f>"
  vnoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? coc#float#scroll(0) : "\<C-b>"
endif

기본은 <Control-f>, <Control-b>로 스크롤 하도록 설정되어 있다.

위의 코드를 수정하면 내가 원하는 단축키로 팝업창을 스크롤할 수 있다. <Control-j>(아래), <Control-k>(위)로 설정

" Remap <C-j> and <C-k> to scroll float windows/popups
" <C-j>: down, <C-k>: up
if has('nvim-0.4.0') || has('patch-8.2.0750')
  nnoremap <silent><nowait><expr> <C-j> coc#float#has_scroll() ? coc#float#scroll(1) : "\<C-j>"
  nnoremap <silent><nowait><expr> <C-k> coc#float#has_scroll() ? coc#float#scroll(0) : "\<C-k>"
  inoremap <silent><nowait><expr> <C-j> coc#float#has_scroll() ? "\<c-r>=coc#float#scroll(1)\<cr>" : "\<Right>"
  inoremap <silent><nowait><expr> <C-k> coc#float#has_scroll() ? "\<c-r>=coc#float#scroll(0)\<cr>" : "\<Left>"
  vnoremap <silent><nowait><expr> <C-j> coc#float#has_scroll() ? coc#float#scroll(1) : "\<C-j>"
  vnoremap <silent><nowait><expr> <C-k> coc#float#has_scroll() ? coc#float#scroll(0) : "\<C-k>"
endif

mapping commands

  • remap recursive map
  • nnoremap normal mode에서의 non-recursive map
  • vnoremap visual mode에서의 non-recursive map
  • inoremap insert mode에서의 non-recursive map

example

map j gg
map Q j
noremap W j

Q -> j -> j (Q가 재귀적으로 mapping되어 결론적으로 j에 mapping된다)
W -> j (W는 j에 mapping되고 더 이상 mapping이 진행되지 않는다)

referece

Comments