Surround.vim이라는 멋진 플러그인이 있기는 하지만, 개인적으로는 vimrc에 오랫동안 넣고 쓰던 코드
기본원리
기본원리는 매우 간단한데, 괄호 등으로 감싸고자 하는 단어를 선택영역으로 만든 다음, 선택 영역을 해제하고, 이 영역의 마지막과 끝 영역으로 이동해서 괄호짝을 삽입해주면 된다.
viw
: 현재 단어 선택<esc>
: 단어 선택 취소\
>`: 마지막 선택영역의 끝으로 이동a)<esc>
: 선택영역 뒤에 닫는 괄호 추가\
<`: 선택영역의 시작지점으로 이동i(<esc>
: 여는 괄호 삽입\
>ll`: 두 글자가 추가되었으므로 다시 단어 끝부분을 이동하여 오른쪽으로 두 칸 이동
키 맵핑
이를 vimrc 에 키 맵핑으로 정의하면 다음과 같다.
nnoremap <leader>) viw<esc>`>a)<esc>`<i(<esc>`>ll
만약 비주얼모드에서 선택영역을 만들고 그 영역을 둘러싸기 위해서는 다음과 같이 맵핑을 만들면 된다.
vnoremap <leader>) <esc>`>a)<esc>`<i(<esc>`>ll
열고 닫는 괄호문자들의 짝을 바꿔주면 중괄호, 대괄호나 마크 다운용 표시들을 쉽게 만들 수 있다.
html 태그 감싸기
html 태그로 감싸는 기능을 만드려면 먼저 태그로 사용할 단어를 입력 받아야 하고, 시작태그를 입력 받았으면 끝 태그로 변환이 필요하기에 함수를 사용하기로 한다. 해당 함수는 gist에서 확인하시라.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function! SurroundThings(mode) | |
let s:m = input("Marker: ") | |
let s:v = "" | |
if a:mode == 1 | |
let s:v = "viw" | |
endif | |
exec "normal ".s:v."\<esc>`>a</".s:m.">\<esc>`<i<".s:m.">\<esc>`>l".len(s:m)."l" | |
endfunction | |
nnoremap <leader>? :call SurroundThings(1)<cr> | |
vnoremap <leader>? :call SurroundThings(0)<cr> |