현재 사용중인 vimrc의 대략적인 설정입니다. 사용중인 옵션에 대해서는 별도의 포스팅으로 설명하겠습니다. 실제로는 여러 파일로 쪼개서 사용하고 있습니다.
기본적인 설정
몇 가지 초기 설정
vi 비호환모드와 인코딩 및 포맷옵션등을 설정합니다.
set nocompitable encoding=utf-8
set autowrite autoread
set formatoptions=jmMlqt
set visualbell
편집 및 표시와 관련된 설정
탭, 들여쓰기 및 그외 편집 시 영향을 주는 설정들입니다.
set wrap linebreak textwidth=0
set tabstop=4 softtabstop=-1 shiftwidth=0 expandtab
set smartindent autoindent
set showbreak=>\
set listchars=tab:»-\|,eol:¶,trail:≡
set showmatch matchtime=3
set backspace=indent,start,eol
set virtualedit+=block
set scrolloff=0 sidescroll=0 sidescrolloff=0
검색과 관련된 설정
키워드를 입력하면 바로 검색을 시작하고, 매치된 결과는 하이라이트합니다. 대소문자는 무시하되, 입력된 패턴에 대문자가 포함되어 있으면 대소문자를 구분하여 검색합니다.
set incsearch hlsearch ignorecase smartcase
그외 편의 기능 관련
wildmenu
는 명령줄 모드에서 탭 키를 눌러서 자동완성할 때, 미리 적용 가능한 목록을 보여줍니다.
set wildmenu title showcmd cmdheight=2
set mouse=a lazyredraw splitbelow splitright
set notimeout ttimeout ttimeoutlen=10
set completeoption=longest,menuone,preview
기본적인 키맵
let mapleader='-'
let maplocalleader='_'
" 편의용 단축키
inoremap jk <Esc>
nnoremap ; :
vnoremap ; :
" 이동/점프 관련
nnoremap j gj
nnoremap k gk
nnoremap gj j
nnoremap gk k
nnoremap g; g;zz
nnoremap g, g,zz
tnoremap <Esc> <C-\><C-n>
g;
, g,
는 이전/이후 편집 위치로 점프하는 명령이며, zz
는 현재 커서 위치의 라인을 화면 가운데로 두도록 스크롤하는 기능입니다. 이를 결합하면 점프했을 때, 위치를 쉽게 찾을 수 있습니다.
:terminal
명령으로 새 터미널 버퍼를 열었을 때, 터미널 창을 닫기 위해서는 터미널 입력 모드를 빠져 나와야 하는데, 이 때 사용하는 키가 <C-\><C-n>
입니다. <Esc> 키로 쉽게 노멀 모드로 전환할 수 있는 키 맵을 추가합니다. (노멀모드에서 다시 터미널모드로 전환하려면 a를 누릅니다.)
자동 완성 메뉴에 탭키를 사용하기
현재 위치의 앞 글자가 공백인지를 확인해서 공백이 아닌 경우에는 탭 키를 눌렀을 때, 사용 가능한 자동 완성 목록에서 다음 요소를 선택하도록 합니다. 이 코드만 들어가도 굉장히 쾌적한 사용이 가능해집니다. s:check_after_space()
함수는 현재 커서 위치가 맨 앞에 있거나 혹은 커서 앞의 글자가 공백인지를 체크합니다. 입력모드에서 <tab>키를 누를 때마다 이 함수를 호출하고, 1을 리턴하는 경우에는, 탭 키를 입력합니다. 그렇지 않다면 <Tab>키는 <C-n>으로 동작해서 자동완성 목록의 다음 항을 선택하도록 작동합니다. 또, pumvisible()
로 팝업메뉴가 떠있는 상황에서도 탭 키를 눌러서 다음 항목을 선택하게 됩니다.
키가 눌려진 시점에 스크립트를 호출해서 동작해야 하므로, 해당 맵은 <expr>
옵션으로 정의됩니다. <expr>
키맵의 우변은 단순 키 시퀀스가 아니라, 키 시퀀스 문자열을 리턴하는 vimscript 표현식이어야 합니다. 이 때 특수키나 키 조합을 리턴하는 경우에는 \<...>
의 형태를 사용해 줍니다.
function s:check_after_space() abort
let l:col = col('.') - 1
return !col || getline('.')[col - 1] =~# '\s'
endfunction
inoremap <silent><expr> <Tab>
\pumvisible() ? "\<C-n>" :
\<SID>check_after_space() ? "\<Tab>" : "\<C-n>"
inoremap <silent><expr> <S-Tab>
\pumvisible() ? "\<C-p>" : "\<C-h>"
찾기 기능
현재 커서 위치의 단어를 찾는 기능을 추가해봅니다.
nnoremap * yiw/<c-r>"<cr>
function s:search_in_buf()
call setloclist(0, [])
exec 'slient! lvimgrep /' . expand('<cword>') . '/ %'
if !empty(getloclist(0))
lopen
else
echo "Not found"
endif
endfunction
nnoremap <script> <Plug>(search_in_buf)
\:<C-u>call <SID>search_in_buf()<CR>
nmap <leader>* <Plug>(search_in_buf)
현재 커서가 위치한 단어를 찾는 동작을 추가합니다. *
키를 누르면 현재 커서의 단어를 복사하여 해당 단어로 검색하는 동작을 수행합니다. hlsearch
가 설정되어 있기 때문에 같은 단어는 모두 하이라이트되어 표시됩니다. 이후 n/N 키를 눌러서 이전/이후 매치 위치로 이동합니다.
<leader>*
를 사용하면 현재 버퍼의 내용 전체에서 단어가 있는 위치를 찾아서 별도의 창에서 보여줍니다. 창에서 j/k로 이동하여 <enter>키를 누르면 해당 위치로 점프하게 됩니다.
복사/붙여넣기 지원
복사/붙여넣기는 아마 vim처음 쓸 때부터 습관으로 <F3>, <F4>에 할당해놓고 쓰고 있습니다. 참고로 클립보드로 복사하는 기능은 'clipboard'
기능을 포함한 빌드여야 하므로, has()
함수를 사용해서 해당 기능이 사용 가능할 때만 작동하도록 합니다.
if has('clipboard')
nnoremap <F3> "+Y
nnoremap <F4> "+p
vnoremap <F3> "+y
vnoremap <F4> "+P
endif
괄호로 감싸기
현재 단어를 괄호나 따옴표로 감싸는 기능도 제법 유용하게 사용할 수 있습니다. 다음과 같은 식으로 만들 수 있습니다.
- 현재 단어를 잘라냅니다. vim에서는 잘라냈거나 지운 단어는
@"
레지스터에 저장됩니다. - 여는 괄호를 넣습니다.
<c-r>"
를 입력하여 방금 잘라낸 단어를 붙여넣습니다.- 닫는 괄호를 넣습니다.
<Esc>
를 눌러 입력모드를 빠져나옵니다.
이상의 동작에 대한 키 시퀀스는 ciw(<c-r>")<Esc>
가 됩니다. 이렇게하면 현재 단어 주위로 괄호가 쳐지고, 커서는 닫는 괄호에 위치하게 됩니다. 이 때 여닫는 괄호를 바꿔주면 대/중괄호나 따옴표로도 감쌀 수 있습니다. 저는 맵리더 뒤에 닫는 괄호의 종류별로 키맵을 만들어 놓고 씁니다.
비슷한 방식으로 선택 영역을 괄호로 감싸는 기능도 만들 수 있겠습니다. (ciw
를 s
로 교체하면 됩니다.)
" easy surrounds
nnoremap <leader>) ciw(<C-r>")<esc>
nnoremap <leader>} ciw{<C-r>"}<esc>
nnoremap <leader>] ciw[<C-r>"]<esc>
nnoremap <leader>> ciw<<C-r>"><esc>
nnoremap <leader>" ciw"<C-r>""<esc>
nnoremap <leader>' ciw'<C-r>"'<esc>
nnoremap <leader>` ciw`<C-r>"`<esc>
nnoremap <leader>* ciw*<C-r>"*<esc>
nnoremap <leader>+ ciw**<C-r>"**<esc>
플러그인 설치
플러그인 관리에는 vimplug
를 사용하고 있습니다.
call plug#begin(
\(has('win32') ? '~/vimfiles/': '~/.vim/'). 'plugged'
\)
"--------------------------------
" Plug '등록할 플러그인'
"--------------------------------
call plug#end()
syntax on
그 외의 설정 관리
vimrc 파일이 커지는 것은 초기 로딩 타임에 영향을 줍니다. 따라서 최소한의 옵션과 키맵 등을 vimrc 파일에 기록하고, 필요한 동작은 autoload 함수로 작성하여 최초 호출 시점에 로딩되도록하면 초기 로딩 시간을 단축할 수 있습니다.
그외에 편집하는 파일 타입별 설정은 ~/.vim/ftplugin/
디렉토리 아래에 파일 타입별로 vim 파일을 만들어서 정의해놓는 것이 autocommand 로 특정 파일별로 설정을 만드는 것보다 좋습니다.