Vi이란 ?

Photo by Luca Bravo on Unsplash

Linux나 Unix 유저라면 한 번쯤은 vi editor를 사용해본 경험이 있을 것이다. vi editor란 Unix-like 운영체제 용으로 만든 텍스트 편집기를 말한다. Vi와 더불어 Vi IMproved의 약자인 Vim이라는 기존 vi editor의 성능을 개선한 확장판이 있다. 이 editor들은 터미널에서 바로 파일에 접근하여 내용을 수정할 수 있어 주로 서버, 인프라 엔지니어들이 자주 사용하는 편집기로 대부분의 Linux, Unix OS에 기본 editor로 설치되어 있다.

vi는 라인 편집기 개념에 기반하여 GUI에 익숙한 사용자들이 처음 이 편집기를 접하는 사람들은 상당히 괴랄한 사용법에 혀를 내두르곤 한다. 사용법을 모르면 입력이 되지 않아 키보드나 컴퓨터가 고장났다고 생각할 수도 있고, 해당 화면을 빠져나오지 못해 곤경에 처할 수도 있다. 이처럼 꽤 높은 진입장벽이 있는 툴임에도 불구하고 나름 전통있는 IDE로서 개발자 친화적인 다양한 단축키를 제공하고 있어서 꽤 두터운 마니아층을 보유하고 있다. 그래서 Visual Studio나 PyCharm과 같이 편집방식으로 vi 인터페이스를 제공하는 IDE들이 많다.

최근 데이터 플랫폼 공부를 하면서 부쩍 vi를 사용할 일들이 많아졌다. vi의 최대 장점은 터미널에서 바로 파일에 접근하여 수정할 수 있다는 점이 아닐까 싶다. 특히 yaml이나 config 파일을 수정할 때 vi로 바로 접근해서 필요한 부분을 고칠 때 유용하다. XWindow가 마련된 환경이면 다른 IDE를 통해 수정할 수도 있겠지만 매번 파일 불러오는 것도 번거로운 작업일 뿐더러, 오롯이 CLI 환경만 제공되는 서버라고 한다면 vi는 최선의 선택이 될 수 밖에 없다. 데이터 인프라를 구축할 때에도 대부분 서버에서 작업이 이뤄지기 때문에 vi 사용에 능숙해야 한다.

vi을 재밌게 익혀보고자 한다면 여기 VIM Adventures라는 Vim 단축키를 이용한 튜토리얼 게임이 있다.

사용법

image

출처 Wikipedia

vi editor는 모든 기능이 영문 키보드 안에 집중되어 있다. 심지어 화살표 키 마저도 hjkl가 대체하고 있어 손가락의 동선을 최소화 한다. 그래서 vi 매니아 층을 겨냥한 해피해킹과 같이 아예 방향키가 없는 키맵을 가진 키보드도 있다. 이렇게 매니아 층이 두터운 이유는 vi에 숙달되면 매우 강력한 편집기로써 사용할 수 있기 때문이다. 하지만 숙달되기까지 꽤 오랜 시간이 걸린다는 점은 가장 큰 단점이다.

vi는 기본적으로 편집이 제한된 Command Mode로 시작한다. 여기서 내용을 수정하기 위해서는 다음 명령어를 통해 Insert Mode로 전환하여야 한다.

  • a : 커서 다음(오른쪽)에 입력
  • A : 행 마지막 부분에 입력
  • i : 커서 앞(왼쪽)에 입력
  • I : 행 처음 부분에 입력
  • o : 커서 밑에 빈 행을 추가하여 입력
  • O : 커서 위에 빈 행을 추가하여 입력
  • s : 커서에 있는 글자를 지우고 입력

Insert Mode로 전환하고 나서야 비로소 편집이 가능하며 esc 키를 통해 다시 Command Mode로 돌아갈 수 있다. 또한 Command Mode에서는 다음과 같은 기본적인 명령을 지원한다.

이동

  • h : 왼쪽 방향키
  • j : 아래쪽 방향키
  • k : 위쪽 방향키
  • l : 오른쪽 방향키
  • w : 다음 단어의 첫 글자로 이동
  • b : 이전 단어의 첫 글자로 이동
  • ^ : 행의 첫 글자로 이동
  • $ : 행의 마지막 글자로 이동
  • gg : 처음 행으로 이동
  • G : 마지막 행으로 가기
  • ( : 이전 문장으로 이동
  • ) : 다음 문장으로 이동
  • { : 이전 문단으로 이동
  • } : 다음 문단으로 이동
  • >> : 오른쪽으로 들여쓰기
  • << : 들여쓰기 해제

삭제

  • x : 커서 다음 글자 잘라내기
  • dd : 커서가 위치한 행 삭제
  • dw : 커서 포함 해당 단어 끝까지 삭제
  • db : 커서 미포함 해당 단어 시작까지 삭제
  • d0 : 커서 미포함 행 시작까지 삭제
  • d$ : 커서 포함 행 끝까지 삭제
  • dgg : 커서가 위치한 행 포함 문서 첫 행까지 삭제
  • dG : 커서가 위치한 행 포함 문서 마지막 행까지 삭제

복사

  • yy : 커서가 위치한 행 복사
  • yw : 커서 포함 해당 단어 끝까지 복사
  • yb : 커서 미포함 해당 단어 시작까지 복사
  • y0 : 커서 미포함 행 시작까지 복사
  • y$ : 커서 포함 행 끝까지 복사
  • ygg : 커서가 위치한 행 포함 문서 첫 행까지 복사
  • yG : 커서가 위치한 행 포함 문서 마지막 행까지 복사
  • p : 커서 다음에 붙여넣기
  • P : 커서 이전에 붙여넣기

Visual Mode

  • v : 문자열 단위로 선택 가능한 Visual Mode로 전환
  • V : 문장 단위로 선택 가능한 Visual Line Mode로 전환
  • ~ : 선택 영역 대/소문자 전환
  • d : 선택 영역 삭제
  • c : 선택 영역 삭제 후 Insert Mode로 전환
  • y : 선택 영역 복사
  • esc : Visual (Line) Mode 해제

북마크

  • m{a-zA-Z} : 해당 커서를 북마크로 설정
  • :marks : 북마크 리스트 확인
  • ₩{a-zA-Z} : 기록된 북마크로 이동

기타

  • r{글자} : 커서에 위치한 글자 대체
  • R : 글자 대체모드
  • /문자열 : 앞에서부터 문자열 찾기
  • ?문자열 : 뒤에서부터 문자열 찾기
  • n : 다음 검색결과
  • N : 이전 검색결과
  • %s/old/new : 각 행의 처음 나오는 old를 new로 치환
  • %/old/new/g : 문서 내 모든 old를 new로 치환
  • %/old/new/gc : 문서 내 모든 old를 new로 치환하되 각 old마다 치환할 것인지 물음
  • u : 이전으로 되돌리기 (Undo)
  • Ctrl + r : 되돌린 작업 재실행 (Redo)
  • ZZ : 저장 후 종료 (= :wq)
  • ZQ : 강제 종료 (= :q!)

🍯 정보: 위 명령어 앞에 숫자와 함께 사용하면 같이 입력된 숫자만큼 해당 명령어가 실행된다. 예를 들어, 3yy는 커서가 위치한 행을 포함하여 아래 3줄까지 복사가 된다.

또한 Command Mode에서는 : 키와 함께 다음과 같은 기본적인 명령을 지원한다.

  • :q : 종료 (아무런 수정이 일어나지 않아야 가능)
  • :q!: 강제종료
  • :w : 저장
  • :wq: 저장 후 종료
  • :syntax on : 문법 강조효과
  • :set number : 행 번호 보이기
  • :set nonumber : 행 번호 숨기기
  • :cd : 현재 디렉토리 출력
  • :terminal : 분할 화면으로 터미널 창 띄우기

추가예정

  • Vim Plugin

참고

댓글 남기기