이번 포스팅에서는 바로바로... Vim Editor 입니다!
저는 Vim을 굉장히 좋아합니다. 저 뿐만 아니라 개발 직종에 계신 다양한 분들이 Vim을 접하고 사용할텐데요.
이번 포스팅에서는 왜 Vim을 사용해야 하고, Vim 초보 입장에서 개발 시에 유용한 단축키에 대해서 알아보겠습니다.
지금은 제가 AI 분야에서 개발을 하고 있지만, 예전에는 보안 분야에 관심이 많았었습니다.
그때 칼리 리눅스라던지, 우분투라던지 linux 배포판과 linux 운영체제에 대해 공부를 했었습니다.
저는 그리고 원래 Pycharm이라던가 Visual Studio 같은 IDE(Integrated Develpment Environment)를 선호하지 않았습니다.
IDE로 코딩하는 것 보다는 차라리 notepad, gedit과 같은 단순한 편집기를 쓰고, gcc/g++ 컴파일러로 make 명령어를 치는 것을 더 좋아합니다.
(gedit 역시 매~우 훌륭한 편집기입니다. 그냥 노트패드인데 리눅스 자체 프로그램인데다가, 확장자 별 코드블록에 색상도 입혀주니까요.)
그 때 제가 사용했던 것들이 Windows host machine에 VM을 설치해서 linux를 사용하는 방식이었습니다.
VM 프로그램은 대표적으로 2개가 있었죠.
VMWare | Virtual Box |
---|---|
(이젠 저에게는 추억이 되어버렸습니다...)
하지만 현재, 개발자로써 저는 VMWare와 같은 프로그램을 사용하지 않습니다.
Microsoft에서 제공하는 Azure 라던가, Amazon에서 제공하는 EC2 와 같은 서버를 구독해서 사용하는 방식으로 뭔가 개발을 하고있죠.
그리고 심지어, Cloud Computing 기술이 발전하고, Docker / Kubernetes와 같은 서비스가 많이 출시되었습니다.
Linux 서버에서 Docker의 Container 안으로 들어가서 뭔가를 작업하고싶다?
💡 그렇다면 Vim이 최고의 편집기가 될겁니다.
물론 저는 요즘 VSCode를 사용합니다. 하지만 VSCode에도 Vim plugin이 있을 정도로, Vim의 인기는 식지 않았습니다.
Vim 말고 다른 편집기는 뭐가 있을까요? 2개 정도가 떠오르네요
이렇게 2개가 떠오르는데, Atom같은 경우는 굉장히 무거웠습니다.
그리고 Sublime Text는 뭐 돈도 내야했던 것 같고, 이거 쓸 바엔 차라리 gedit 쓰겠다! 해서 안썼던 것 같네요.
제가 Vim Editor를 사랑하는 이유가 있습니다.
자, 뭔가 하나 작성해봅시다.
위처럼 vi {filename}
을 입력하면, vim editor로 파일을 열 수 있습니다.
만약 파일을 여는 것이 아니라 단순히 editor를 열고 싶으면, vi
만 입력해도 됩니다.
vim으로 파일을 열면 위처럼 이상한 ~ 표시와 맨 아래에 "main.py" 0L, 0B 라는 문구밖에 안보입니다.
vim 에서 가장 중요한 부분이 입력이 가능한 상태냐? 아니냐? 입니다.
현재 창에서 숫자 12345를 아무리 입력해도, 입력되지 않습니다.
💡 우리는 Vim의 모드에 대해서 알아야합니다. 반드시!
Vim에는 총 4개의 모드를 지원합니다.
- Normal : 일반 모드입니다. 라인 복사, 라인 삭제, 커서 이동 등이 가능합니다.
- Insert : 입력 모드입니다. 뭔가를 입력할 수 있습니다.
- Command : 명령어를 내릴 수 있습니다. 여러 행의 indent를 수정하거나, 파일 저장 및 종료가 가능합니다.
- Visual : 블록 지정이 가능합니다.
각 모드별 구분은 하단에 보이게 됩니다.
Normal | Insert | Command | Visual |
---|---|---|---|
Normal 모드는 하단에 아무것도 없습니다. ESC를 눌러서 모드를 활성화 할 수 있습니다.
Insert 모드는 하단에 -- INSERT -- 라고 보입니다. 여러 방식으로 활성화가 가능합니다.
Command 모드는 하단에 :
가 보입니다. 그리고 커서가 하단의 :
뒤로 이동됩니다. 여기에 명령어를 입력함으로써 조작이 가능합니다.
(예시 : self
단어를 myself
로 바꾸는 동작 - :%s/self/myself/g
)
Visual 모드는 하단에 -- VISUAL {option} -- 라고 보입니다.
Vim Editor는 이처럼 총 4개의 모드를 가지고 있습니다.
각 모드간의 호환성은 없고, Insert > Visual 처럼 Normal 모드를 제외한 모드 간의 변경은 항상 Normal 모드를 거쳐야 합니다.
2-1 에서 봤듯이, 뭔가를 입력하고 블록 지정을 위해서는 커서의 위치가 기준이 됩니다.
Vim에서 커서 이동은 키보드 화살표로도 이동이 가능하지만, 그렇게 되면 오른손이 실제 문자 키보드 부분과 떨어지게 됨으로써 생산성이 떨어질 수 있습니다. (실제로 화살표 이동이 불편합니다.)
Vim에서는 조금 이상한(?) 방식으로 커서를 이동할 수 있습니다.
우리가 키보드에 손을 올리면, 왼손 검지는 자연스럽게 F키에 손이 올라가고 오른손 검지는 J키에 손이 올라갑니다.
그러면 오른손 중지는 J키 옆의 K키에 올라가게되는데, 여기서 J키는 하단 이동, K키는 상단 이동 단축키입니다.
💡 반드시 Normal 모드에서 움직여야 합니다!
그리고 J키와 K키 양 옆의 H키와 L키는 정말 자연스럽게도 각각 좌/우 이동키입니다.
J
: 커서 한칸 아래로 이동K
: 커서 한칸 위로 이동H
: 커서 한칸 왼쪽 이동L
: 커서 한칸 오른쪽 이동이 기본 커서 이동 단축키는, {number} j/k/h/l
을 입력하면 "해당 숫자만큼" 이동하기가 가능합니다.
그냥 L
를 누르는 경우는 1L
과 동일하게 동작하는 것입니다.
(ex. 10K
는 10줄 위로 이동하는 것과 동일하고, 25L
은 25칸 오른쪽으로 이동하는 것과 동일합니다.)
그리고 또 유용한 커서 이동 단축키가 있습니다.
w
: 단어 기준 앞으로 이동W
: 다음 공백 위치까지 앞으로 이동b
: 단어 기준 뒤로 이동B
: 이전 공백 위치까지 뒤로 이동^
(shift+6) : 해당 행의 맨 앞으로 이동$
(shift+4) : 해당 행의 맨 뒤로 이동gg
: 문서의 맨 처음 행의 0열로 이동 (0행 0열) G
: 문서의 맨 마지막 행의 0열로 이동: {line_num}
: 해당 라인으로 이동 (라인 출력 : :se nu
)특히, w
와 $
같은 커서 이동 단축키는 삭제/복사 명령어와 같은 d
, y
와 조합이 가능합니다.
화면 및 페이지 단위의 이동도 가능합니다.
Ctrl + f
: 아래로 한 화면 단위 스크롤(Page Down)Ctrl + b
: 위로 한 화면 단위 스크롤(Page Up)Ctrl + d
: 화면에 보여지는 라인 수의 1/2 만큼 뒤로 이동Ctrl + u
: 화면에 보여지는 라인 수의 1/2 만큼 앞으로 이동자세한 단축키 이전에, 딱 4개만 기억하면 됩니다.
d
: 삭제를 담당합니다. (실제로는 Vim에는 삭제가 없습니다. 모든 것은 잘라내기입니다.)y
: 복사를 담당합니다. (복사는 잘라내기와 다르게, 해당 행을 없애지 않습니다.)p
: 붙여넣기를 담당합니다.u
: 실행 취소(undo)를 담당합니다.이 d
, y
단축키는 2-2 에서 봤던 기타 커서 이동 단축키와 조합이 가능합니다.
예를 들어, 단어 하나를 삭제하고 싶으면 dw
를 입력하면 됩니다.
다음 공백까지 삭제하고 싶으면 dW
를 입력하면 되겠죠?
(소문자 d
, y
는 단독으로 사용할 수 없습니다. 항상 뒤에 뭔가 있어야합니다.)
아래의 명령어들은 Command 모드에서도 사용이 가능합니다.
:y10
의 경우는y10y
와 동일합니다.
단독으로 사용하는 경우도 있습니다. dd
혹은 D
의 경우가 단독으로 사용하는 경우죠.
그러면 기본적인 경우부터, 응용 버전까지 살펴봅시다.
dd
: 해당 행을 잘라내기. 행이 1개 사라짐.D
: 해당 행은 남기고, 내용은 전부 잘라내기.d{number}d
: 해당 행을 포함하여 {number}
개 행을 잘라내기 함.dw
: 단어 하나를 잘라내기.dW
: 다음 공백까지를 잘라내기.db
: 이전 단어 하나를 잘라내기.dB
: 이전 공백까지를 잘라내기.dG
: 문서의 끝까지 잘라내기.dgg
: 문서의 시작까지 잘라내고, 커서를 문서의 시작(0행 0열) 위치로 이동시킴.d^
: 현재 커서 위치부터 해당 행의 맨 앞까지 잘라내기d$
: 현재 커서 위치부터 해당 행의 맨 뒤까지 잘라내기yy
= Y
: 해당 행을 복사.y{number}y
: 해당 행을 포함하여 {number}
개 행을 복사함.yw
: 단어 하나를 복사.yW
: 다음 공백까지를 복사.yb
: 이전 단어 하나를 복사.yB
: 이전 공백까지를 복사.yG
: 문서의 끝까지 복사.ygg
: 문서의 시작까지 복사하고, 커서를 문서의 시작(0행 0열) 위치로 이동시킴.y^
: 현재 커서 위치부터 해당 행의 맨 앞까지 복사함y$
: 현재 커서 위치부터 해당 행의 맨 뒤까지 복사함p
= :pu
: 현재 커서 위치의 다음 줄에 붙여넣기함.P
: 현재 행을 다음 행으로 밀고, 붙여넣기함. (=현재 행의 이전 줄에 붙여넣기)u
: 방금 수행한 것을 되돌림. (=Undo)Ctrl+R
: 방금 실행 취소한 것을 실행 취소함.너무 많은가요? 사실 이 단축키들은 d
, y
만 알고 2-2에서 봤던 것들을 조합하면 외울 필요가 없는 단축키입니다😊
2장과 3장에서 봤던 것들로 충분히 할 수 있지만, 알아두면 좋은 단축키가 있습니다.
몇 개만 소개하도록 하겠습니다.
>
or <
: indent(~/.vimrc
에 정의) 만큼 해당 행 이동, 코딩할 때 필수겠죠?
:10,20>
: 10번 행부터 20번 행까지 >
indent 적용.:10,+20>
: 10번 행부터 20개의 행(총 10번 행~30번 행)까지 >
indent 적용.:10,20d
, :10,+30d
)r
: 한 글자 수정
R
: 현재 커서 위치부터 수정 (한글오피스의 삽입-수정 할 때 수정이라고 생각시면 됩니다.)
.
: 방금 했던 동작을 반복함.
(예를 들어, d2d
를 해서 2줄을 잘라낸 후에 .
를 치게 되면 다시 2줄을 잘라내게 됩니다.
d2d
> .
> .
> .
를 하게 되면 총 8줄을 잘라내는 것이죠.
하지만 버퍼에 덮어쓰게 되므로, 붙여넣기 동작에는 가장 마지막의 2줄만을 붙여넣게 됩니다.)
:se nu
: 코드 라인 번호를 보여줌.
:{number}
: 해당 코드 라인으로 커서를 이동함.
:se nu | :{number} |
---|---|
:%s/{src word}/{dest word}/g
: 문서 전체에 걸쳐 존재하는 {src word}
를 {dest word}
로 변경함./
는 기본적인 구분자입니다. 만약 바꿀 문자에 /
가 존재한다면 @
나 ?
등을 구분자로 사용해도 됩니다.%s
에서 %
는 문서 전체를 의미합니다. 만약 10번 행부터 20번 행 내에서만 변경하고 싶으면 :10,20s/{src}/{dest}/g
가 됩니다.g
는 옵션입니다. g
: 물어보지 않고 전부 변경함c
: 매칭되는 문자열을 하나하나 물어봄i
: 대소문자 구분없이 변경gi
)c
보다 g
의 우선순위가 더 낮습니다./{word}
: {word}
를 검색함. (VSCode의 Ctrl+f
와 동일)n
: 다음의 매칭되는 단어로 이동N
: 이전의 매칭되는 단어로 이동tab으로 indent를 넣고 python main.py
를 하면 indent 오류가 발생합니다.
vim에서 tab 뿐만 아니라, >
단축키로 indent를 넣게 되면 초기 설정으로는 tab으로 인식됩니다.
또한, >
단축키는 8칸이나 indent를 삽입해줍니다.
vi ~/.vimrc
로 vimrc 파일을 열고, 해당 스크립트를 문서의 마지막에 이어서 작성해주면 위의 문제들이 해결됩니다.
syntax enable
set smartindent
set tabstop=4
set shiftwidth=4
set expandtab
제가 Vim Editor에서 사용하는 모든 것들을 알려드린 것 같네요!
다들 즐거운 Vim Life 되시길 바랍니다!