vi editor cheat sheet / vi 명령어 정리

2019. 12. 8. 11:51coding

Editor


  • UNIX에서의 파일 편집
    • cat 명령
      • 간단한 화일의 작성 시 사용 (cat > myfile)
      • 화일 작성 마칠 때는 ctrl + D
      • 화일의 내용 중 일부만 수정할 수 가 없음
    • editor 사용
      • 화일의 내용을 편리하게 편집
      • 메모리 버퍼를 사용해서 파일 저장 (작성을 마친 후에 저장, 취소 가능)

Why use vi?


  • very powerful
  • useful simple subset of commands
  • portable (PCs, mainframes, etc)
  • designed for slow networks
  • full-screen
  • vi [options] filelist

Introduction to vi


  • Modes of Operation
  • The work Buffer
    • During the editing session, vi make all changes in the buffer
    • Advantage : 오동작으로 원하지 않은 결과가 발생했을 때, 파일에 저장되지 않도록 할 수 있다.
    • Disadvantage : 시스템이 다운될 경우, 편집한 결과가 모두 소멸될 수 있다.

Vi Modes



Command & input mode


  • 명령 모드
    • 사용자가 입력한 내용이 vi의 명령어로 인식됨
    • vi를 처음 시작하면 명령 모드
    • 커서의 이동이나 기타 편집 명령
    • colon (:) 을 누르면 ex 명령 사용 가능
  • 입력 모드
    • 사용자가 입력한 내용이 화일에 쓰여짐
    • ESC를 누르면 명령 모드로 복귀
  • 변경 모드, colon 모드를 따로 구분하기도 함

vi 시작하기


  • vi - 새로운 파일 시작 (파일 저장할 때 이름 지정)
  • vi filename - 지정한 이름이 없으면 새로운 파일 생성, 지정한 이름이 있으면 기존 파일 열기
  • Bottom line is the status line
  • Some, but not all, commands are shown on the status line
  • Often you type a command and nothing appears on the screen
  • 엔터키를 눌러야 하는 경우
    • colon 명령 (:q! 등)
    • 검색 명령 (/text 등)
  • 엔터키가 필요 없는 경우
    • 문자로 시작하는 명령어 (ZZ, G..)
    • 제어 문자로 시작하는 명령어 (^L..)

저장 및 종료하기


  • 저장 명령 : ESC를 눌러 명령모드로
    • :w + return → 현재의 파일명으로 파일 저장
    • :w filename + return → 지정한 파일명으로 파일 저장
  • 종료 명령 : 저장 후 종료 또는 그냥 종료
    • :q + return → 작업 내용을 저장하였으면 종료
    • :q! + return → 작업 내용을 저장하지 않고 종료
    • :wq + return → 작업 내용을 저장한 후 종료
    • :wq filename + return → 작업 내용을 지정한 파일명으로 저장한 후 종료
    • ZZ + return → 작업 내용을 저장한 후 종료

.exrc File / Mapping


  • When vi starts, it reads the .exrc file in home directory, if it exits.
  • Use this file to customize vi with any options (set options like autoindent, nu..), abbreviations or key-command maps you always want to use
  • To save frequently used command sequence to a shortcut, use **:map x** sequence, :map will display all currently mapped characters (?)

Vi Commands


**i (Insert)**

  • i → Insert Before Cursor (커서 한칸 전에 삽입)
  • I (Shift + i) → Insert at Beginning (줄 제일 앞에 삽입)

**a (Append)**

  • a → Append after cursor (커서 한칸 뒤에 삽입)
  • A (Shift + a) → Append at end (줄 제일 뒤에 삽입)

o (New Line)

  • o → Add after line (커서가 있는 줄 바로 다음줄에 새로운 줄 추가)
  • O (Shift + o) → Add before line (커서가 있는 줄 바로 전줄에 새로운 줄 추가)

Cursor Moving

  • k / ↑: 한 줄 위로 이동
  • j / ↓: 한 줄 밑으로 이동 (내려갈 칸에 입력한 내용이 없으면 그 전에 입력한 내용이 있는 칸까지 이동, 아예 없으면 맨 앞으로 이동)
  • l / > / spacebar : 한 칸 오른쪽으로 이동 (빈 줄에서는 안움직임..?)
  • h / < / backspace : 한 칸 왼쪽으로 이동 (빈 줄에서는 안움직임..?)
  • ^ (shift + 6) / 0 : 커서가 있는 줄 맨 앞칸으로 이동
  • $ (shitf + 4) : 커서가 있는 줄 맨 뒷칸으로 이동 (글자 있는 칸까지만)
    • : 윗 줄의 처음으로 이동 (글자 있으면 맨 첫글자 있는 칸, 없으면 맨 앞칸)
    • / Enter : 다음 줄의 처음으로 이동 (글자 있으면 맨 첫글자 있는 칸, 없으면 맨 앞칸)
  • H (Shift + h) : 화면 맨 위 맨 첫칸으로 이동
  • M (Shift + m) : 화면 중앙의 맨 첫칸으로 이동 (입력한 내용의 중간)
  • L (Shift + l) : 화면 맨 밑의 맨 첫칸으로 이동 (마지막 입력줄 맨 첫칸)
  • w : 다음 단어의 첫 문자로 이동
  • b : 이전 단어의 첫 문자로 이동
  • e : 다음 단어의 끝 글자로 이동
  • :(n) + enter / (n)G : n번째 줄 첫 문자로 이동
  • :$ / G : 파일 가장 마지막 줄의 첫 문자로 이동
  • (n)+ / (n)- : n 줄 앞/뒤의 첫 문자로 이동
  • ( : 현재 문장의 맨 첫칸으로 이동
  • ) : 다음 문장의 맨 첫칸으로 이동
  • { : 현재 문단의 처음 빈칸으로 이동
  • } : 다음 문단의 처음 빈칸으로 이동
    • (minus sign) : 윗 줄의 맨 앞칸으로 이동
    • (plus sign) : 다음 줄의 맨 앞칸으로 이동

Scroll Command

  • ^u (control + u) : 반 화면 위로 이동
  • ^d : 반 화면 아래로 이동
  • ^b : 한 화면 위로 이동
  • ^f : 한 화면 아래로 이동
  • ^y : 한 줄만 위로 (화면을 이동)
  • ^e : 한 줄만 아래로 (화면을 이동)
  • ^l : 파일 내용 다시 출력

Delete Command

  • x / (n)x : 커서 위치의 문자 (커서로부터 n개) 삭제
  • dw / (n)dw : 커서 위치의 단어 (커서로부터 n개 단어, 공백은 한단어로) 삭제
  • dd / (n)dd : 커서 위치의 줄 전체 (커서로부터 n개 줄) 삭제
  • D (shift + d) : 커서 위치 문자부터 줄의 제일 끝까지 삭제

Undo Command

  • u : 방금 수행한 명령 취소 (줄에 상관 없이)
  • U : 해당 줄의 모든 편집 취소 (바꾼 횟수 상관 없이)

Editing Command

  • r : 현재 커서 위치의 한 문자 변경 (r + 문자 입력 → 명령모드 유지)
  • R : 현재 커서 위치부터 문자열 변경 (Replace 모드로 변경 → ESC 입력 전까지 계속 변경 가능)
  • cw : 커서 위치부터 현재 단어의 끝까지 내용 변경 (커서 위치의 단어가 삭제되고 insert 모드로 변경)
  • cc : 커서가 위치한 줄의 내용 변경 (커서가 있는 줄 다 삭제되고 insert 모드로 변경)
  • s / (n)s : 현재 커서부터 내용 변경 (커서 위치의 문자 n개가 삭제되고 insert 모드로 변경)
  • C (Shift + c) : 커서 위치에서부터 줄 끝까지 내용 변경 (커서 위치부터 줄 끝까지 삭제되고 insert 모드로 변경)
  • y / (n)yy : 커서로부터 현재 행 (n개) 을 버퍼로 복사
  • p : 현재 행 바로 밑에 버퍼 내용을 삽입
  • P (Shift + p) : 현재 행 바로 윗줄에 버퍼 내용을 삽입
  • dd / (n)dd : 커서 위치의 줄 전체 잘라내기 (행 삭제와 잘라내기는 동일한 동작)

버퍼에 저장

  • "buffernameyy : 현재 행부터 아래로 n줄을 [buffername] 버퍼에 저장
  • "[buffername]p : buffername 내용을 바로 아래줄에 붙여넣기

범위 지정 명령

  • 1,$ / % : 첫 줄에서 마지막 줄까지 지정 (파일 내의 모든 줄)
  • 1,. : 첫 줄에서 현재 줄까지 지정
  • .,$ : 현재 줄에서 마지막 줄까지 지정
  • .-(n) : 현재 줄에서 n줄 위의 줄만 지정
  • (n1),(n2) : n1번째 줄에서 n2번째 줄까지 지정

복사와 잘라내기

  • :(n)y : n번째 행을 복사
  • :<범위>y : 범위로 지정한 행을 복사
  • :(n)d : n번째 행을 잘라내기
  • :<범위>d : 범위로 지정한 행을 잘라내기
  • :pu : 현재 행 다음에 버퍼 내용을 붙여넣기
  • :(n)pu : n번째 행 다음에 버퍼 내용을 붙여넣기

Search Commands

  • /문자열 : 현재 위치부터 파일 앞쪽으로 → 문자열을 탐색
  • ?문자열 : 현재 위치부터 파일 뒤쪽으로 ← 문자열을 역방향 탐색
  • n : 다음 문자열 탐색 →
  • N : 역방향으로 문자열 탐색 ←

Changing Commands

  • :s/문자열1/문자열2/ : 커서가 위치한 줄에서만 문자열 1을 문자열2로 바꿈 (전체를 다 찾아서 바꾸지는 않음, 첫번째 문자열만 변경)
  • :<범위>s/문자열1/문자열2/ : <범위> 안의 모든 줄에 대해서 각 줄의 첫번째 문자열1을 찾아 문자열2로 바꿈
  • :<범위>s/문자열1/문자열2/g : <범위> 안의 모든 줄에 대해서 모든 문자열1을 문자열2로 바꿈 (전부 다 바꿈)
  • :<범위>s/문자열1/문자열2/gc : <범위> 안의 모든 줄에 대해서 각각의 문자열1을 문자열2로 치환할 때 수정할 지 안할지를 물어본다

기타 기능

  • :r <filename> : 지정한 파일을 현재 커서 위치에 삽입
  • :e <filename> : 현재 파일 대신 지정한 파일을 읽음
  • :n : Vi 시작 시 여러 파일을 지정하였을 경우 다음 파일로 이동
  • :!<명령> : vi를 잠시 중단하고 지정한 명령 수행 → 돌아올 때는 enter key
  • :sh : vi를 잠시 빠져나가서 쉘을 수행 → 돌아올 때는 exit 입력
  • :f <filename> : 파일 이름을 지정한 이름으로 변경
  • :w %.old : 현재 파일을 .old 이름으로 저장
  • control + g : 기본적인 파일 정보 출력 (파일명, 라인 수)
  • J : 현재 줄 뒤에 바로 다음줄을 잘라내서 붙여넣기 (한 칸 띄우고)
  • . : 바로 이전에 수행한 명령을 실행
  • ~ : 현재 커서 위치의 한 문자를 소문자 혹은 대문자로 전환

환경 설정

  • :set nu : 파일 내용의 각 줄에 줄 번호 표시 (보이기만 하고 저장되지는 않음)
  • :set nonu : 줄 번호 취소
  • :set list : 눈에 보이지 않는 특수문자 표시 (Tap은 ^I로 표시, 줄의 마지막에는 $ 표시)
  • :set nolist : 특수문자보기 기능 취소
  • :set showmode : 현재 모드 표시
  • :set noshowmode : 현재 모드 표시기능 취소
  • :set : set으로 설정한 모든 vi 변수 출력
  • :set all : 설정 가능한 모든 vi 변수와 현재 값 출력