====== Neovim (nvim) ======
===== Preparing =====
* 설치
# Ubuntu (debian 계열)
$ sudo apt-get install software-properties-common # apt repository 관리 툴 제공하는 software-properties-common 설치
$ sudo add-apt-repository ppa:neovim-ppa/stable # repository 추가
$ sudo apt-get update # update
$ sudo apt-get install neovim # neovim 설치
# macos
$ brew install nvim
# windows
> choco install neovim
* 설정파일; ''~/.config/nvim/init.vim'' @linux, ''~\AppData\Local\nvim\init.vim'' @Windows
* init.vim에서 .vimrc 파일 참조
set runtimepath^=~/.vim runtimepath+=~/.vim/after
let &packpath = &runtimepath
source ~/.vimrc
* .bashrc, .zshrc ''alias vim="nvim"''
===== Plugins =====
* vim-plug; plugin 사용
# linux
$ sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
# 또는
$ curl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
# windows
> iwr -useb https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim |`
ni "$(@($env:XDG_DATA_HOME, $env:LOCALAPPDATA)[$null -eq $env:XDG_DATA_HOME])/nvim-data/site/autoload/plug.vim" -Force
* NERDTree; tree 구조 ''Plug 'preservim/nerdtree' ''
* Tagbar; 현재 버퍼의 class, struct, prototype, typedef, macro 등 요약. ''Plug 'preservim/tagbar' ''
* vim-airline; 버퍼 정보 상세 표시 ''Plug 'vim-airline/vim-airline' ''
* ctrlp; 파일 탐색기
* CoC(Conquer of Completion); 자동완성(auto completion) intellisense, LSP(Language Server Protocol) 지원.
- node.js 설치
$ curl -sL install-node.now.sh/lts | sudo $SHELL
# yarn 설치
$ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
$ echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
$ sudo apt-get update && sudo apt-get install yarn
- vim-plug 등록 ''Plug 'neoclide/coc.nvim', {'branch': 'release'}''
* LSP(Language Server Protocol); '':CocIntsall '' [[https://github.com/neoclide/coc.nvim|Conquer of Completion @github.com]] [[https://github.com/neoclide/coc.nvim/wiki/Language-servers|CoC Language Servers @github.com]]
* nvim-treesitter; syntax highlight ''Plug 'nvim-treesitter/nvim-treesitter', {'do': ':TSUpdate'}''
* '':TSInstall <사용하는 언어>'' [[https://github.com/nvim-treesitter/nvim-treesitter#supported-languages|nvim-treesitter#supported-languages @github.com]]
===== References =====
" =========================================================================
" = 플러그인 설정 =
" =========================================================================
call plug#begin('~/.vim/plugged') " 플러그인 시작
" Conquer Of Completion 자동완성 플러그인
Plug 'neoclide/coc.nvim', {'branch': 'release'}
" nvim-treesitter 구문 파싱 하이라이팅
Plug 'nvim-treesitter/nvim-treesitter', {'do': ':TSUpdate'}
" Tagbar 코드 뷰어 창
" Plug 'majutsushi/tagbar'
Plug 'preservim/tagbar'
" NERDTree 코드 뷰어 창
Plug 'preservim/nerdtree'
" 컬러스킴(색상표) jellybeans, gruvbox
Plug 'nanotech/jellybeans.vim'
" Plug 'morhetz/gruvbox'
" 하단에 다양한 상태(몇 번째 줄, 인코딩, etc.)를
" 표시하는 상태바 추가
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
" CScope 플러그인
Plug 'ronakg/quickr-cscope.vim'
" CtrlP 파일 탐색 플러그인
Plug 'ctrlpvim/ctrlp.vim'
" 비활성 윈도우 강조
" Plug 'blueyed/vim-diminactive'
" vim cutlass 잘라내기 명령어가 yank 에 영향을 주지 않음
Plug 'svermeulen/vim-cutlass'
" VIM GAS(GNU ASsembler) Highlighting
Plug 'Shirk/vim-gas'
call plug#end()
" =========================================================================
" = 단축키 지정 =
" = n(normal mode) 명령 모드 =
" = v(visual, select mode) 비주얼 모드 =
" = x(visual mode only) 비주얼 모드 =
" = s(select mode only) 선택 모드 =
" = i(insert mode) 편집 모드 =
" = t(terminal mode) 편집 모드 =
" = c(commnad-line) 모드 =
" = re(recursive) 맵핑 =
" = nore(no recursive) 맵핑 =
" =========================================================================
" ------------------------------------
" 편집 모드
" ------------------------------------
" jk 와 kj 를 키로 맵핑
inoremap jk
inoremap kj
" ------------------------------------
" 명령 모드
" ------------------------------------
" 을 통해 NERDTree 와 Tagbar 열기
nnoremap :NERDTreeToggle:TagbarToggle
" 를 눌러서 이전, 다음 탭으로 이동
nnoremap :tabprevious
nnoremap :tabnext
" 를 눌러서 이전, 다음 버퍼로 전환
nnoremap :bp
nnoremap :bn
" 를 눌러서 현재 버퍼 삭제
nnoremap :bpspbnbd
nnoremap :bpspbnbd
" t 를 눌러서 커서를 NERDTree 로 옮기기
nnoremap t :NERDTreeFocus
" 우측 하단(botright)에 창 생성(new), 해당 창을 terminal 로 변경
" 크기를 10 으로 재설정(resize) 후 창 높이를 고정(winfixheight)시킴
" 줄번호는 삭제하고, 터미널 디렉터리 글자색을 변경
nnoremap
\:botright new
\:terminal
\:resize 10
\:set winfixheight
\:set nonu
\iLS_COLORS=$LS_COLORS:'di=1;33:ln=36'
" ------------------------------------
" 터미널 모드
" ------------------------------------
" 터미널 모드에서 누르면 명령 모드로 전환하고 입력
tmap
" jk 혹은 kj 를 누르면 를 실행
tmap jk
tmap kj
" 입력 시 실행 => 터미널 모드에서 기본 모드로 전환
tnoremap
" ------------------------------------
" 명령, 비주얼 모드
" ------------------------------------
" iamroot 자동 주석
map o/* * IAMROOT, =strftime("%Y.%m.%d")
\: */
" =========================================================================
" = vim 설정 =
" =========================================================================
" 탭 정지 = 8 칸마다
set tabstop=8
" 쉬프트 (<< 혹은 >>) 이동거리 8 칸
set shiftwidth=8
" 줄 번호를 표시한다.
set number
" 괄호 짝을 강조한다.
set showmatch
" 하위 디렉터리를 모두 path 에 추가한다.
" gf 명령어 사용 시 파일을 인식 가능
set path+=**
" 탐색 문자열 강조
set hlsearch
" 항상 상단에 탭 라인을 출력한다.
set showtabline=2
" 행 표시선 출력
set colorcolumn=80
if has('nvim') " nvim 을 사용 중이라면
set inccommand=nosplit " nvim live %s substitute (실시간 강조)
endif
" vim 과 OS 의 클립보드 동기화
set clipboard=unnamedplus
" GUI-Color 를 사용 가능하도록 설정 (TrueColor)
" cterm 혹은 term 대신 gui 를 통해 색상을 설정할 수 있고
" 16,777,216 종류의 색상 표현 가능(기존 256)
set termguicolors
" 모든 마우스 기능을 사용
set mouse=a
" mkview 명령어가 저장하는 요소 중
" 하나인 `options` 를 제거
set viewoptions-=options
" 문법이 존재하면
if has("syntax")
" 문법 강조를 수행
syntax on
endif
" 컬러스킴(문법 강조 색상) - 현재 jellybeans
colorschem jellybeans
" colorschem gruvbox
" =========================================================================
" = 하이라이트 정의 =
" =========================================================================
" 버퍼(창)과 버퍼의 끝(창의 끝)을 투명하게
highlight Normal guibg=NONE
highlight EndOfBuffer guibg=NONE
" 줄번호 배경색은 투명(NULL)하게,
" 글자는 굵게(bold), 글자색은 하얗게(White)
highlight LineNr guibg=NONE gui=bold guifg=white
" 행 표시선 색상
highlight ColorColumn guibg=White
" =========================================================================
" = 함수 정의 =
" =========================================================================
" tabsize 를 size 로 변경
function SetTab(size)
execute "set shiftwidth=".a:size
execute "set tabstop=".a:size
execute "set softtabstop=".a:size
endfunction
" =========================================================================
" = 자동 실행 (autocmd) =
" =========================================================================
" terminal buffer 에 진입했을 때 mode 를 normal 에서 terminal 모드로 변경
" 또한 줄번호를 없앤다.
autocmd BufEnter term://* start " do nothing
autocmd TermOpen term://* execute ":set nonu"
" 파일 명이 *.S 로 시작하면 GAS 문법 강조 사용
autocmd BufRead,BufNew *.S execute ":set ft=gas"
" 버퍼를 저장할때 파일 이름이 .c, .h 와 같다면 ctags 명령어를 실행
" autocmd BufWritePost *.c,*.h silent! !ctags -R &
" 윈도우를 나갈 때 뷰를 저장하고,
autocmd BufWinLeave *.c,*.h mkview
" 윈도우에 들어갈 땐 뷰를 로드한다. (커서위치 저장)
" silent! 는 loadview 중 발생하는 에러를 억압(suppress) 한다.
autocmd BufWinEnter *.c,*.h silent! loadview
" 활성화된 버퍼만 라인 번호 표시 (단, 확장자는 .c 혹은 .h 일때만 동작)
autocmd BufEnter * if (&filetype == 'c' || &filetype == 'cpp')
\| set number
\| endif
" 버퍼에서 나갈 땐 줄 번호를 지운다.
autocmd BufLeave * if (&filetype == 'c' || &filetype == 'cpp')
\| set nonumber
\| endif
" =========================================================================
" = 플러그인 설정 =
" =========================================================================
" ------------------------------------
" coc 설정
" ------------------------------------
" nvim 버전이 0.5.0 이상이며, 패치가 8.1.1564 이상이라면
if has("nvim-0.5.0") || has("patch-8.1.1564")
" 사인(sign column) 열을 숫자 열과 합침
set signcolumn=number
endif
" 을 눌러서 현재 지시자를 옮김.
" inoremap
"\ pumvisible() ? "\" :
"\ check_back_space() ? "\" :
"\ coc#refresh()
"inoremap pumvisible() ? "\" : "\"
" 키가 지시자 제거, 기존 자동완성 양식 폐기
function! s:check_back_space() abort
let col = col('.') - 1
return !col || getline('.')[col - 1] =~# '\s'
endfunction
" 를 눌러서 자동완성 적용
if has('nvim')
inoremap coc#refresh()
else
inoremap coc#refresh()
endif
" 코드 탐색 단축키
nmap gr (coc-references)
" 커서 아래의 토큰을 강조
autocmd CursorHold * silent call CocActionAsync('highlight')
" ------------------------------------
" nvim-treesitter 설정
" ------------------------------------
lua <+w, W 를 사용 가능하게
" let g:ConqueTerm_CWInsert = 1
" ------------------------------------
" vim-airline 설정
" ------------------------------------
" powerline-font 활성화
let g:airline_powerline_fonts = 1
" luna 테마 사용
let g:airline_theme = 'luna'
" tabline 에 파일명만 출력 되도록 설정
let g:airline#extensions#tabline#formatter = 'unique_tail'
" 창의 상단에 표시되도록 설정
" let g:airline_statusline_ontop = 1
" 탭라인 허용
let g:airline#extensions#tabline#enabled = 1
" 항상 tabline 을 표시
let g:airline#extensions#tabline#show_tabs = 1
" ------------------------------------
" NERDTree 설정
" ------------------------------------
" 창 크기(가로)를 20 으로 설정
let g:NERDTreeWinSize=30
" ------------------------------------
" vim-cutlass 설정
" ------------------------------------
" c, C 명령어는 yank 에 영향을 주도록 변경
nnoremap c d
xnoremap c d
nnoremap cc dd
nnoremap C Dv
* [[https://github.com/junegunn/vim-plug|vim-plug @github.com]]
*[[https://www.joinc.co.kr/w/man/12/neovim|NeoVim 기반 개발환경 설정]]
* [[https://velog.io/@mythos/Linux-neovim-%EC%84%A4%EC%A0%95-CoC-Vim-Plug-treesitter-NERDTree|[Linux] neovim 설정 (CoC, Vim-Plug, treesitter, NERDTree)]]
* [[https://cdecl.github.io/devops/nvim-plug/|Neovim, vim-plug 설정]]
* [[https://tyanjournal.com/tips/neovim-c-ide/[Vim] Neovim을 C++ IDE로 사용하기]]
* [[https://seulcode.tistory.com/272|My neovim settings: 나의 neovim 세팅을 공유합니다.]]
* [[https://m.youtube.com/watch?v=JWReY93Vl6g| Awesome Neovim Setup From Scratch - Full Guide]] {{youtube>JWReY93Vl6g}}