모두에게 사랑받을 수 있는 Vim

bolero2·2022년 6월 8일
2

development

목록 보기
2/7
post-thumbnail

이번 포스팅에서는 바로바로... Vim Editor 입니다!

저는 Vim을 굉장히 좋아합니다. 저 뿐만 아니라 개발 직종에 계신 다양한 분들이 Vim을 접하고 사용할텐데요.

이번 포스팅에서는 왜 Vim을 사용해야 하고, Vim 초보 입장에서 개발 시에 유용한 단축키에 대해서 알아보겠습니다.

1. 왜 Vim Editor를 사용해야 할까?

지금은 제가 AI 분야에서 개발을 하고 있지만, 예전에는 보안 분야에 관심이 많았었습니다.
그때 칼리 리눅스라던지, 우분투라던지 linux 배포판과 linux 운영체제에 대해 공부를 했었습니다.

저는 그리고 원래 Pycharm이라던가 Visual Studio 같은 IDE(Integrated Develpment Environment)를 선호하지 않았습니다.

IDE로 코딩하는 것 보다는 차라리 notepad, gedit과 같은 단순한 편집기를 쓰고, gcc/g++ 컴파일러로 make 명령어를 치는 것을 더 좋아합니다.

(gedit 역시 매~우 훌륭한 편집기입니다. 그냥 노트패드인데 리눅스 자체 프로그램인데다가, 확장자 별 코드블록에 색상도 입혀주니까요.)

그 때 제가 사용했던 것들이 Windows host machine에 VM을 설치해서 linux를 사용하는 방식이었습니다.

VM 프로그램은 대표적으로 2개가 있었죠.

  1. VMWare
  2. Virtual Box
VMWareVirtual Box

(이젠 저에게는 추억이 되어버렸습니다...)

하지만 현재, 개발자로써 저는 VMWare와 같은 프로그램을 사용하지 않습니다.

Microsoft에서 제공하는 Azure 라던가, Amazon에서 제공하는 EC2 와 같은 서버를 구독해서 사용하는 방식으로 뭔가 개발을 하고있죠.

그리고 심지어, Cloud Computing 기술이 발전하고, Docker / Kubernetes와 같은 서비스가 많이 출시되었습니다.

Linux 서버에서 Docker의 Container 안으로 들어가서 뭔가를 작업하고싶다?

💡 그렇다면 Vim이 최고의 편집기가 될겁니다.

물론 저는 요즘 VSCode를 사용합니다. 하지만 VSCode에도 Vim plugin이 있을 정도로, Vim의 인기는 식지 않았습니다.

Vim 말고 다른 편집기는 뭐가 있을까요? 2개 정도가 떠오르네요

  1. Sublime Text
  2. Atom

이렇게 2개가 떠오르는데, Atom같은 경우는 굉장히 무거웠습니다.
그리고 Sublime Text는 뭐 돈도 내야했던 것 같고, 이거 쓸 바엔 차라리 gedit 쓰겠다! 해서 안썼던 것 같네요.


제가 Vim Editor를 사랑하는 이유가 있습니다.

  1. 코드 라인넘버를 볼 수 있다. : 대부분 interpreter, compiler 빌드 시에 오류가 발생하면 오류가 발생한 코드 라인을 알려줍니다. 이 위치를 알면, Vim을 켜고 바로 접근할 수 있죠.
  2. 마우스가 필요없다. : 아마 가장 큰 장점이 아닐까 생각됩니다. 마우스따위 필요없습니다. 키보드에서 손을 뗄 필요가 없는거죠.
  3. 멋있다. : 멋있습니다. 소위 간지가 나는거죠.
  4. 생산성이 좋다. : 생산성이 좋다는 것은, 작업의 속도가 빨라지고 정확한 작업을 할 수 있다는 것입니다. Vim에서는 마우스가 필요 없는데다가, 코드 라인 복사 역시 편해서 원활한 작업이 가능합니다.

2. Vim의 모드와 커서 이동 방법

자, 뭔가 하나 작성해봅시다.

위처럼 vi {filename} 을 입력하면, vim editor로 파일을 열 수 있습니다.
만약 파일을 여는 것이 아니라 단순히 editor를 열고 싶으면, vi 만 입력해도 됩니다.

vim으로 파일을 열면 위처럼 이상한 ~ 표시와 맨 아래에 "main.py" 0L, 0B 라는 문구밖에 안보입니다.

vim 에서 가장 중요한 부분이 입력이 가능한 상태냐? 아니냐? 입니다.
현재 창에서 숫자 12345를 아무리 입력해도, 입력되지 않습니다.

💡 우리는 Vim의 모드에 대해서 알아야합니다. 반드시!

2-1. Vim의 모드

Vim에는 총 4개의 모드를 지원합니다.

  1. Normal : 일반 모드입니다. 라인 복사, 라인 삭제, 커서 이동 등이 가능합니다.
  2. Insert : 입력 모드입니다. 뭔가를 입력할 수 있습니다.
  3. Command : 명령어를 내릴 수 있습니다. 여러 행의 indent를 수정하거나, 파일 저장 및 종료가 가능합니다.
  4. Visual : 블록 지정이 가능합니다.

각 모드별 구분은 하단에 보이게 됩니다.

NormalInsertCommandVisual
  • Normal 모드는 하단에 아무것도 없습니다. ESC를 눌러서 모드를 활성화 할 수 있습니다.

  • Insert 모드는 하단에 -- INSERT -- 라고 보입니다. 여러 방식으로 활성화가 가능합니다.

    • i : 현재 커서 위치부터 입력을 시작합니다.
    • I : 현재 라인의 맨 앞에서부터 입력을 시작합니다.
    • o : 다음 라인에 한 행을 삽입하고, 거기서부터 입력을 시작합니다.
    • O : 이전 라인에 한 행을 삽입하고, 거기서부터 입력을 시작합니다.
    • a : 한 칸 뒤에서부터 입력을 시작합니다.
    • s : 현재 커서의 글자를 지우고 입력을 시작합니다.
    • cc : 현재 라인을 지우고 맨 앞에서부터 입력을 시작합니다.
    • C : 현재 커서를 포함해서, 뒤까지 전부 지우고 입력을 시작합니다.
  • Command 모드는 하단에 : 가 보입니다. 그리고 커서가 하단의 : 뒤로 이동됩니다. 여기에 명령어를 입력함으로써 조작이 가능합니다.
    (예시 : self 단어를 myself로 바꾸는 동작 - :%s/self/myself/g)

  • Visual 모드는 하단에 -- VISUAL {option} -- 라고 보입니다.

    • v : 해당 커서부터 글자 단위로 블록 지정이 가능합니다. Windows 에서 Shift + 방향키 느낌입니다. (-- VISUAL --)
    • V : 해당 라인부터 라인 단위로 블록 지정이 가능합니다. (-- VISUAL LINE --)
    • Control + v : 열 단위, 글자 단위의 블록 지정이 가능합니다. (-- VISUAL BLOCK --)

Vim Editor는 이처럼 총 4개의 모드를 가지고 있습니다.
각 모드간의 호환성은 없고, Insert > Visual 처럼 Normal 모드를 제외한 모드 간의 변경은 항상 Normal 모드를 거쳐야 합니다.

2-2. Vim에서의 커서 이동

2-1 에서 봤듯이, 뭔가를 입력하고 블록 지정을 위해서는 커서의 위치가 기준이 됩니다.

Vim에서 커서 이동은 키보드 화살표로도 이동이 가능하지만, 그렇게 되면 오른손이 실제 문자 키보드 부분과 떨어지게 됨으로써 생산성이 떨어질 수 있습니다. (실제로 화살표 이동이 불편합니다.)

Vim에서는 조금 이상한(?) 방식으로 커서를 이동할 수 있습니다.

우리가 키보드에 손을 올리면, 왼손 검지는 자연스럽게 F키에 손이 올라가고 오른손 검지는 J키에 손이 올라갑니다.

그러면 오른손 중지는 J키 옆의 K키에 올라가게되는데, 여기서 J키는 하단 이동, K키는 상단 이동 단축키입니다.

💡 반드시 Normal 모드에서 움직여야 합니다!

그리고 J키와 K키 양 옆의 H키와 L키는 정말 자연스럽게도 각각 좌/우 이동키입니다.

  1. 기본 커서 이동 단축키
    • J : 커서 한칸 아래로 이동
    • K : 커서 한칸 위로 이동
    • H : 커서 한칸 왼쪽 이동
    • L : 커서 한칸 오른쪽 이동

이 기본 커서 이동 단축키는, {number} j/k/h/l 을 입력하면 "해당 숫자만큼" 이동하기가 가능합니다.
그냥 L를 누르는 경우는 1L 과 동일하게 동작하는 것입니다.
(ex. 10K 는 10줄 위로 이동하는 것과 동일하고, 25L 은 25칸 오른쪽으로 이동하는 것과 동일합니다.)

그리고 또 유용한 커서 이동 단축키가 있습니다.

  1. 기타 커서 이동 단축키
    • w : 단어 기준 앞으로 이동
    • W : 다음 공백 위치까지 앞으로 이동
    • b : 단어 기준 뒤로 이동
    • B : 이전 공백 위치까지 뒤로 이동
    • ^ (shift+6) : 해당 행의 맨 앞으로 이동
    • $ (shift+4) : 해당 행의 맨 뒤로 이동
    • gg : 문서의 맨 처음 행의 0열로 이동 (0행 0열)
    • G : 문서의 맨 마지막 행의 0열로 이동
    • : {line_num} : 해당 라인으로 이동 (라인 출력 : :se nu)

특히, w$ 같은 커서 이동 단축키는 삭제/복사 명령어와 같은 d, y와 조합이 가능합니다.

화면 및 페이지 단위의 이동도 가능합니다.

  1. 화면 및 페이지 단위 커서 이동 단축키
    • Ctrl + f : 아래로 한 화면 단위 스크롤(Page Down)
    • Ctrl + b : 위로 한 화면 단위 스크롤(Page Up)
    • Ctrl + d : 화면에 보여지는 라인 수의 1/2 만큼 뒤로 이동
      (예를 들어, 현재 화면에 100줄이 보이고 현재 커서가 20행에 있다면,
      커서는 20 + (100 * 0.5) = 70행에 위치하게 됩니다.)
    • Ctrl + u : 화면에 보여지는 라인 수의 1/2 만큼 앞으로 이동

3. Vim에서의 복사/붙여넣기, 삭제 그리고 실행취소

자세한 단축키 이전에, 딱 4개만 기억하면 됩니다.

  • d : 삭제를 담당합니다. (실제로는 Vim에는 삭제가 없습니다. 모든 것은 잘라내기입니다.)
  • y : 복사를 담당합니다. (복사는 잘라내기와 다르게, 해당 행을 없애지 않습니다.)
  • p : 붙여넣기를 담당합니다.
  • u : 실행 취소(undo)를 담당합니다.

d, y 단축키는 2-2 에서 봤던 기타 커서 이동 단축키와 조합이 가능합니다.
예를 들어, 단어 하나를 삭제하고 싶으면 dw를 입력하면 됩니다.
다음 공백까지 삭제하고 싶으면 dW를 입력하면 되겠죠?
(소문자 d, y는 단독으로 사용할 수 없습니다. 항상 뒤에 뭔가 있어야합니다.)

아래의 명령어들은 Command 모드에서도 사용이 가능합니다.
:y10의 경우는 y10y와 동일합니다.

단독으로 사용하는 경우도 있습니다. dd 혹은 D 의 경우가 단독으로 사용하는 경우죠.

그러면 기본적인 경우부터, 응용 버전까지 살펴봅시다.

  1. 삭제(=잘라내기) 명령어
    • dd : 해당 행을 잘라내기. 행이 1개 사라짐.
    • D : 해당 행은 남기고, 내용은 전부 잘라내기.
    • d{number}d : 해당 행을 포함하여 {number} 개 행을 잘라내기 함.
    • dw : 단어 하나를 잘라내기.
    • dW : 다음 공백까지를 잘라내기.
    • db : 이전 단어 하나를 잘라내기.
    • dB : 이전 공백까지를 잘라내기.
    • dG : 문서의 끝까지 잘라내기.
    • dgg : 문서의 시작까지 잘라내고, 커서를 문서의 시작(0행 0열) 위치로 이동시킴.
    • d^ : 현재 커서 위치부터 해당 행의 맨 앞까지 잘라내기
    • d$ : 현재 커서 위치부터 해당 행의 맨 뒤까지 잘라내기
  2. 복사 명령어
    • yy = Y : 해당 행을 복사.
    • y{number}y : 해당 행을 포함하여 {number} 개 행을 복사함.
    • yw : 단어 하나를 복사.
    • yW : 다음 공백까지를 복사.
    • yb : 이전 단어 하나를 복사.
    • yB : 이전 공백까지를 복사.
    • yG : 문서의 끝까지 복사.
    • ygg : 문서의 시작까지 복사하고, 커서를 문서의 시작(0행 0열) 위치로 이동시킴.
    • y^ : 현재 커서 위치부터 해당 행의 맨 앞까지 복사함
    • y$ : 현재 커서 위치부터 해당 행의 맨 뒤까지 복사함
  3. 붙여넣기
    • p = :pu : 현재 커서 위치의 다음 줄에 붙여넣기함.
    • P : 현재 행을 다음 행으로 밀고, 붙여넣기함. (=현재 행의 이전 줄에 붙여넣기)
  4. 실행 취소
    • u : 방금 수행한 것을 되돌림. (=Undo)
    • Ctrl+R : 방금 실행 취소한 것을 실행 취소함.

너무 많은가요? 사실 이 단축키들은 d, y 만 알고 2-2에서 봤던 것들을 조합하면 외울 필요가 없는 단축키입니다😊


4. 기타 단축키 및 명령어

2장과 3장에서 봤던 것들로 충분히 할 수 있지만, 알아두면 좋은 단축키가 있습니다.
몇 개만 소개하도록 하겠습니다.

  • > or < : indent(~/.vimrc에 정의) 만큼 해당 행 이동, 코딩할 때 필수겠죠?

    • :10,20> : 10번 행부터 20번 행까지 > indent 적용.
    • :10,+20> : 10번 행부터 20개의 행(총 10번 행~30번 행)까지 > indent 적용.
    • 이러한 방식은 다른 명령어도 가능합니다. (ex. :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} 로 변경함.
    • / 는 기본적인 구분자입니다. 만약 바꿀 문자에 / 가 존재한다면 @? 등을 구분자로 사용해도 됩니다.
      (단, 구분자는 1개로 통일되어야 합니다. 혼용하시면 안됩니다.)
    • %s 에서 % 는 문서 전체를 의미합니다. 만약 10번 행부터 20번 행 내에서만 변경하고 싶으면 :10,20s/{src}/{dest}/g 가 됩니다.
    • g 는 옵션입니다.
      • g : 물어보지 않고 전부 변경함
      • c : 매칭되는 문자열을 하나하나 물어봄
      • i : 대소문자 구분없이 변경
      • 해당 옵션들은 조합이 가능합니다. (ex. gi)
      • c 보다 g 의 우선순위가 더 낮습니다.
  • /{word} : {word} 를 검색함. (VSCode의 Ctrl+f 와 동일)
    • 검색이 되면 해당 단어는 블록처리가 되어서 보입니다.
    • n : 다음의 매칭되는 단어로 이동
    • N : 이전의 매칭되는 단어로 이동
    • 아래쪽에 매칭되는 단어가 없으면, 문서의 맨 위부터 다시 검색합니다.

부록. vimrc에 indent 정의하기

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 되시길 바랍니다!

profile
AI Engineer 입장에서 작성하는 여러 기록들

0개의 댓글