심심한 개발자의 취미생활

vi/vim 에디터 사용법/단축키 정리

요즘은 개발 업무를 진행하다 보면 정말 다양한 취향에 맞는 수많은 에디터 들이 많다 node.js를 베이스로 개발을 진행하는 필자는 당연하게도 vscode를 메인으로 사용하고 있다. 하지만 docker 환경과 서버단의 작업이 늘어나면서 터미널에서의 작업이 늘어나고 당연하게도 vi 에디터를 사용하는 경우가 늘어나고 있다. vi를 사용하는데는 큰 어려움은 없지만 이번 기회에 학부때 정리해두었던 내용을 다시 한번 정리해 보고자 한다.

vi/vim

vi/vim 에디터는 unix 계열의 운영체제에서 주로 쓰이는 매우 유서가 깊은 에디터이다. 태생이 CLI 환경이다 보니 마우스와 키보드 방향키가 없어도 아주 강력한 문서 편집 기능을 제공한다. vim은 이러한 vi를 기반으로 GUI 환경과 다양한 기능들이 추가되어 개량된 버전으로 대부분의 터미널에서 'vi'를 실행시키더라도 'vim'이 실행된다. 이하부터는 vi와 vim을 구분하지 않고 vi라 지칭한다.

사용법

vi에는 3가지의 모드가 존재한다.

  • 명령 / 이동 / 편집 모드
    • 입력 커서의 이동과 내용의 수정, 삭제, 복사 등 문서 작업을 위한 모드
  • 입력 모드
    • 실제 타이핑을 통한 내용 입력을 위한 모드
  • ex / 실행 모드
    • 내용 검색, 변환 등의 기능 수행 모드

각 모드는 ESC 키와 키 문자를 통해 서로간의 변환이 이루어 진다. 기본은 명령모드로 시작하며 특별한 표시는 없다 명령모드에서 'a', 'i', 'o' 등의 키를 입력하면 입력모드로 변경이 이루어지며 터미널 하단에 '-- INSERT --' 표시가 나타난다. 다시 ESC 키를 누르면 명령모드로 변경되고 실행 모드 명령어의 시작 문자인 ':' 또는 '/'를 입력하면 실행 모드로 변경된다.

모드별 명령어 (※ 대소문자 구분)

명령 모드

  • 단어 단위로 이동

    • W, w : 다음 단어의 처음으로 이동
    • E, e : 단어의 끝으로 이동
    • B, b : 단어의 처음으로 이동
  • 행 단위로 이동

    • 0(숫자) : 행의 처음으로 이동
    • $ : 행의 마지막으로 이동
  • 문서 단위로 이동

    • G : 문서의 마지막으로 이동
    • gg : 문서의 처음으로 이동
    • ctrl + f : 한 페이지 앞으로 이동
    • ctrl + b : 한 페이지 뒤로 이동
    • shift + h : 화면의 처음으로 이동
    • shift + m : 화면의 중앙으로 이동
    • shift + l : 화면의 끝으로 이동
  • 복사 / 삭제

    • x : 커서가 위치하는 문자 삭제
    • X : 커서가 있는 앞 문자 삭제
    • dd : 커서가 위치하는 행 삭제 (한줄 삭제)
    • ⍺dd : 커서가 위치하는 행 포함 아래 ⍺줄 삭제
    • yy : 커서가 위치하는 행 복사 (한줄 복사)
    • ⍺yy : 커서가 위치하는 행 포함 아래 ⍺줄 복사
    • p : 커서가 위치하는 행 아래에 복사한 내용 붙여 넣기
    • P : 커서가 위치하는 행 위에 복한 내용 붙여 넣기
  • dd / yy 의 활용 (커서 위치 기준)

    • dw, yw : 다음 단어의 처음까지 삭제 / 복사
    • de, ye : 단어의 끝까지 삭제 / 복사
    • db, yb : 단어의 처음까지 삭제 / 복사
    • d0, y0 : 행의 처음까지 삭제 / 복사
    • d$ / y$ : 행의 마지막까지 삭제 / 복사
    • dG, yG : 문서의 마지막까지 삭제 / 복사
    • dgg, ygg : 문서의 처음까지 삭제 / 복사

입력 모드

  • i : 현재 위치에서 입력 모드로 전환
  • I : 행의 제일 처음에서 입력 모드로 전환 (0 + i)
  • a : 현재 위치에서 우측으로 한 칸 이동 후 입력 모드로 변경
  • A : 행의 제일 마지막에서 입력 모드로 변경 ($ + i)
  • o : 현재 커서 위치의 한 줄 아래에 새로운 행을 추가하고 입력모드로 변경
  • O : 현재 커서 위치의 한 줄 위에 새로운 행을 추가하고 입력모드로 변경
  • s : 현재 문자를 지우고 입력 모드로 변경
  • S : 현재 행의 모든 문자를 지우고 입력 모드로 변경 (dd + i)

실행 / EX 모드

  • :se nu : 라인 번호 활성 (:set number)

  • :se nonu : 라인 번호 비활성 (:set nonumber)

  • :[n] : n번째 라인으로 이동

  • /Pattern : Pattern 검색

    • n : 아래 방향으로 계속 검색
    • N : 윗 방향으로 계속 검색
  • :[범위]s/[Old]/[New]/[option] : 범위 내의 Old를 New로 치환

    • 범위
      • % : 문서 전체
      • n : n번째 라인에서
      • n,m : n번째 라인에서 m번째 라인까지
      • -n,+m : 커서위 n번째 라인에서 커서 밑 m번째 라인까지
    • 옵션
      • g : 적용 범위내 모두 변경
    • 예시
      • :s/old/new : 현재 라인에서 첫번째 old만 new로 변경
      • :s/old/new/g : 현재 라인의 모든 old를 new로 변경
      • :10s/old/new : 10번 라인에서 첫번째 old를 new로 변경
      • :10,15s/old/new/g : 10번에서 15번까지의 라인에서 모든 old를 new로 변경
      • :-3,+4s/old/new/g : 커서 기준 위로 3번째, 아래로 4번째 라인까지의 모든 old를 new로 변경
      • :%s/old/new/g : 문서 전체에서 old를 new로 변경
  • 화면 분할

    • :[n]sp [파일이름] : 수평 나누기
    • :[n]vs [파일이름] : 수직 나누기
      • [n] : 라인 수
      • ctrl + wn : 현재 화면을 수평으로 나누기
      • ctrl + wv : 현재 화면을 수직으로 나누기
      • ctrl + ww : 창간 이동
  • 파일 관련 명령어

    • :q : 나가기
    • :q! : 강제 종료
    • :w : 저장
    • :wq : 저장하고 나가기
    • :e [목적파일] : 현재 창을 닫고 파일 열기/생성
    • :e! [목적파일] : 현재 창을 강제로 닫고 파일 열기/생성
    • :enew : 현재 창을 닫고 빈 새 문서를 생성
    • :f : 현재 커서 위치 정보
    • :w >> [목적파일] : 현재 편집중인 파일을 목적 파일 끝에 추가
    • :w [파일명] : 다른 이름으로 저장
    • :[n]r[파일명] : 파일 이름의 내용을 현재 편집중인 파일의 n라인부터 삽입
    • :[n]r![command] : command 실행 결과를 파일의 n라인부터 삽입
    • :.![command] : command 실행 결과를 커서의 현재 라인을 지우고 삽입

해당 문서는 모두 vi 에디터로 작성되었습니다.