시작하며....
오늘 주제를 정한 거는 Help였는데 정리가 잘되지 않아서 갑자기 주제를 바꾸게 되었어요.
Help는 조금 더 진행을 한 다음에 나와도 괜찮을 거 같다는 생각이 들었기 때문이죠.
Key Mapping도 굉장히 중요한 Vim의 능력 중의 하나예요.
그러니 같이 알아보아요!!
Windows에서의 Ctrl+F
지난 강좌에서 Ctrl+F의 명령어는 Page Down과 같다고 했지요.
하지만 윈도우에서 Ctrl+F를 눌렀을 때는 다른 프로그램처럼 찾기가 되는 걸 볼 수 있어요.
리눅스에서 동일하게 Ctrl+F를 눌렀다면 아마 Page Down이 되었을 거예요.
그런데 윈도우에서는 그렇지 않다니 이상하지요??
그 이유는 윈도우 vim의 설정 파일을 보시면 알 수 있어요.
"C:\Program Files (x86)\Vim\_vimrc"
위의 파일을 열면 아래와 같은 설정을 볼 수 있어요.
source는 해당 파일에서 실행 가능한 명령어를 읽어서 설정을 하는 거죠.
"$VIMRUNTIME/mswin.vim"의 위치는 아래와 같아요.
"C:\Program Files (x86)\Vim\vim80\mswin.vim"
저 파일을 열어서 보면 아래와 같은 부분을 확인할 수 있어요.
if has("gui")" CTRL-F is the search dialognoremap <C-F> :promptfind<CR>inoremap <C-F> <C-\><C-O>:promptfind<CR>cnoremap <C-F> <C-\><C-C>:promptfind<CR>" CTRL-H is the replace dialognoremap <C-H> :promptrepl<CR>inoremap <C-H> <C-\><C-O>:promptrepl<CR>cnoremap <C-H> <C-\><C-C>:promptrepl<CR>endif
if문에서 gui라는 Feature를 가졌느냐고 물어보네요.
가졌을 때 noremap, inoremap, cnoremap 라는 명령어가 수행된다라고 볼 수 있지요.
우선 저 명령어가 무엇인지 알아보기 전에 기본형을 알려 드릴게요.
map KEY 명령어_or_KEY
대충 저 정도가 형식으로 보면 되고요.
KEY가 명령어나 다른 Key로 Mapping 된다고 보시면 쉬울 거 같아요.
저 map 명령어는 크게 2가지로 구분할 수 있지죠.
- map의 적용 모드 별
- map의 용도 별
이 구분 방법으로 각각 자세하게 볼게요.
map의 적용 모드 별 구분
Vim의 가장 기초가 모드가 나누어져 있다는 거죠?
Mapping을 할 때에도 그때 그때 필요한 모드가 나누어져야 해요.
예를 들어 Normal 모드에서만 Mapping을 하고 싶을 때가 있을 텐데 Visual Mode 일 때도 Mapping이 되어 있으면 곤란하잖아요.
그래서 적용 모드 별로 map의 명령어가 조금씩 달라져요.
- map : Normal, Visual, Select, Operator-pending
- nmap : Normal
- vmap : Visual and Select
- xmap : Visual
- smap : Select
- omap : Operator-pending
- map! : Insert and Command-line
- imap : Insert
- lmap : Insert, Command-line, Lang-Arg
- cmap : Command-line
사실 막~ 외울 필요는 없어요.
:help map-overview
위의 명령어를 적으면 map에 대한 모드별 정보를 언제든 알 수 있어요.
그러니 help 명령어만 아시면 특별히 외울 필요 없다는 거죠.
그리고 map이라는 명령어를 기본으로 Prefix나 Postfix가 붙어 있는 형태이고 해당 문자들이 모드의 이름과 비슷한 점이 많아서 어렵지는 않을 거예요.
map의 용도 별 구분
용도 별로 아래와 같이 3가지로 나눌 수 있지요.
- Key Mapping : map KEY 명령어_or_KEY, noremap KEY 명령어_or_KEY
- Key Mapping 삭제 : unmap KEY, mapclear
- Key Mapping 출력 : map, map KEY
위의 명령어는 가장 기본이 되는 명령어를 적은 거예요.
저 명령어에 모드별로 나누었을 때의 Prefix나 Postfix를 적어 주면 모든 map 명령어가 나오게 되지요.
물론 help 명령어로 찾아볼 수 있으니 무조건적인 암기보다는 help 사용법에 더 익숙해 지시는 게 좋을거 같아요.
사실 여기서 알아봐야 하는 건 map과 noremap의 차이가 더 중요한 거 같아요.
map과 noremap
map은 recursive mapping이고 noremap은 non-recursive mapping이라고 하네요.
recursive라는 의미가 순환인데 순환을 하면서 mapping이 된다는 의미로 보면 될 거 같아요.
map d y
map j d
noremap k d
위의 예를 가지고 이야기를 해 드릴게요.
처음 map을 보니 Key d를 Key y에 Mapping을 했어요.
( d -> y(복사) )
그러니 d를 눌렀을 때 y가 입력된 효과가 일어나게 되죠.
즉, 삭제하려고 했더니 복사가 되는 거죠.
그리고 두 번째 map을 보니 Key j가 Key d에 Mapping이 된다고 나오네요.
( j -> d )
그럼 여기까지 했을 때 Key j를 누르면 Mapping된 d의 본래 기능인 삭제가 될까요?
아니에요.
recursive라는 거처럼 d가 Mapping된 y까지 연결되어요.
( j -> d -> y(복사) )
그러니 j를 누르면 d가 불리고 d와 연결된 y가 최종적으로 불리게 되는 거죠.
하지만 noremap은 map과는 달라요.
recursive를 하지 않기 때문에 k를 눌렀을 때 Mapping된 d의 본래 기능인 삭제가 호출되는 거죠.
( k -> d(삭제) )
그러니 recursive를 하면 Mapping이 되지 않은 마지막까지 찾아가서 해당 명령어의 기능을 자신이 가지는 거라고 생각하면 될 거 같아요.
그럼 여기서 하나 질문...
위의 map 설정을 하고 아래와 같은 명령어를 입력하면 어떻게 될까요??
map y j
즉, y -> j -> d -> y 식이 되는 거겠죠??
일단 map 명령어는 문제없이 진행되는데 y, j, d 중의 하나의 명령어를 입력하면 아래와 같은 재귀맵핑 이라는 에러가 나올 거예요.
다시 Windows의 Ctrl+F
그럼 윈도우의 설정 파일에 적혀 있던 noremap, inoremap, cnoremap에 대해서 다시 볼까요???
<C-F>에 대해 적혀 있던 내용은 아래와 같아요.
noremap <C-F> :promptfind<CR>
inoremap <C-F> <C-\><C-O>:promptfind<CR>
cnoremap <C-F> <C-\><C-C>:promptfind<CR>
처음 명령어를 읽어 보면 Normal, Visual, Select, Operator-pending 상태에서 non-recursive로 Mapping을 하는데 Ctrl+F(<C-F>)는 :promptfind와 엔터(<CR>)이네요.
그러니 Ctrl+F를 눌러도 찾기가 나오는 거예요.
두 번째와 세 번째의 명령어는 각각 Insert Mode와 Command-line Mode에서의 Mapping이고요.
<C-\><C-O>는 Insert Mode에서 ESC를 누르면 커서가 한칸 앞으로 이동 하는 문제를 해결 한 후에 Command-line을 진입하기 위한 준비 작업입니다.
또한 <C-\><C-C>는 Command-line을 빠져 나가는 명령어 이고요.
Windows에서 Ctrl+F를 Page Down으로 사용하기
위의 내용이 길었지만 이걸 하는 방법에 대해서는 쉽게 알 수 있겠지요???
적용된 Mapping Rule을 삭제 하면 되요.
그건 unmap 명령어를 사용하면 되겠지요?
물론 Insert와 Command-line Mode에서도 모두 삭제 하도록 해야 하고요.
그럼 다음과 같은 명령어 셋이 나오겠지요??
unmap <C-F>
iunmap <C-F>
cunmap <C-F>
마치며....
실제로 예제를 든건 Ctrl+F에 Mapping된 명령어를 제거하는거 였지만...
그걸 위해 Mapping에 대한 전반적인 내용은 보았습니다.
사실 실전이 가장 중요한데...
이 Mapping은 나중에도 엄청 나오니까 그때 다시 보면서 연습을 하도록 할게요.
그럼 또 다음에 뵙겠습니다.
감사합니다.
댓글 없음:
댓글 쓰기