diff --git a/ETC/간단한-vi,vim-편집기-사용법.md b/ETC/간단한-vi,vim-편집기-사용법.md new file mode 100644 index 0000000..97c98c5 --- /dev/null +++ b/ETC/간단한-vi,vim-편집기-사용법.md @@ -0,0 +1,181 @@ +# 간단한 vi / vim 편집기 사용법 + +![vi, vim 단축키 모음](https://user-images.githubusercontent.com/68052095/103456655-9bf70b00-4d3b-11eb-919f-472f6dc5885b.png) +- 이미지 출처 : [Vim 도대체 왜 쓰는가](https://bengi.kr/1349) + +## vi / vim 시작하기 +- `$ vi` : vi / vim 시작하기 +- `$ vi aaa.txt` : aaa.txt 파일을 편집하면서 vi 시작 +- `$ vi -R aaa.txt` : 읽기 전용으로 열기 + +![Vim 상태](https://user-images.githubusercontent.com/68052095/103455788-62ba9d00-4d33-11eb-8757-0fccd1596047.PNG) + +- `명령대기상태 -> 편집상태` : 삽입명령어(아래참조) +- `편집상태 -> 명령대기상태` : `Esc` +- `명령대기상태 -> 명령줄입력` : `:` 또는 `/` (아래참조) +- `명령줄상태 -> 명령대기상태` : `Esc` 또는 `Enter` (아래참조) + +## 커서의 이동 +- `h`, `l`, `j`, `k` : `왼쪽(←, Back space)`, `오른쪽(→, space)`, `위(↑)`, `아래(↓)` +- `b`, `w` : 이전 단어의 첫 글자로 / 다음 단어의 첫 글자로 이동. +- `B`, `W` : 이전 단어의 첫 글자로 / 다음 단어의 첫 글자로 이동. (문장부호 무시) +- `e` : 다음 단어의 끝 글자로 이동. +- `E` : 다음 단어의 끝 글자로 이동. (문장부호 무시) +- `H`, `M`, `L` : 화면의 맨 위 / 중간 / 맨 아래로 +- `0` : 그 줄의 맨 처음으로 (숫자 0이다) +- `$` : 그 줄의 맨 끝으로 +- `+` : 다음 줄의 처음으로 +- `-` : 윗 줄의 처음으로 +- `3|` : 현재 줄의 3번째 열로 +- `4H` : 화면 상의 처음 줄부터 4줄 밑으로 +- `4L` : 화면 상의 마지막 줄부터 4줄 위로 +- `(`, `)` : 이전 문장의 시작으로 / 다음 문장의 시작으로 +- `{`, `}` : 이전 문단의 시작으로 / 다음 문단의 시작으로 +- `[[`, `]]` : 이전 섹션의 시작으로 / 다음 섹션의 시작으로 + +## 편집 버퍼를 통한 이동 +- `^F`, `^B` : 한 화면 앞으로 / 뒤로 (`^`는 `Ctrl`를 의미) +- `^D`, `^U` : 반 화면 앞으로 / 뒤로 +- `4^B` : 4화면 위로 이동 +- `4^F` : 4화면 아래로 이동 +- `7^U` : 7줄 위로 이동 +- `7^D` : 7줄 아래로 이동 +- `^Y` : 커서는 현재 위치 그대로 화면만 한 줄씩 아래로 이동 +- `^E` : 커서는 현재 위치 그대로 화면만 한 줄씩 위로 이동 + +## 행 단위 이동 +- `:0` : 파일의 첫 번째 행으로 가기 (숫자 0) +- `:10` : 10번째 행으로 가기 +- `:$` : 파일의 마지막 행으로 가기 +- `G` : 파일의 마지막 행으로 가기 +- `10G` : 10번째 행으로 가기 + +## 삽입명령어 +- `i` : 커서 위치부터 삽입 시작 +- `a` : 커서 위치 오른쪽부터 삽입 시작 +- `A` : 현재 줄의 맨 끝부터 삽입 시작 +- `I` : 현재 줄의 맨 처음부터 삽입 시작 +- `o` : 커서 아래에 행 삽입 +- `O` : 커서 위에 행 삽입 + +## 삭제명령 +- `x`: 현재 커서위치의 한 문자 삭제 +- `X` : 현재 커서 왼쪽의 한 문자 삭제 +- `dd` : 한 줄 지우기 +- `4dd` : 4 줄 지우기 +- `dw` : 한 단어 지우기 +- `d2w` : 2 단어 지우기 +- `D` : 커서 오른쪽 행 삭제 +- `:5 d` : 5 째 행 삭제 +- `:5,10 d` : 5-10째 행 삭제 + +## 파일의 저장 및 종료 +- `:wq` : 저장 후 vi 종료 +- `:w` : 저장 (종료는 하지 않고 계속 편집) +- `:q!` : 저장하지 않고 vi 빠져나가기 +- `:w filename` : `filename`으로 저장 후 계속 편집 +- `ZZ` : 변경사항 저장 후 vi 종료 + +## 내용의 복사 및 이동 +- `yy` : 현재의 행 복사 +- `5yy` : 현재의 행 위치부터 5행 복사 +- `p` : 아래(오른쪽)에 붙여넣기 +- `P` : 위(왼쪽)에 붙여넣기 +- `f4yy` : 현재의 행 위치부터 4행을 `f`라는 이름의 버퍼에 복사 +- `fp` : `f`라는 이름의 버퍼에 복사된 내용을 현재 행 위치에 붙여넣기 +- `:3 co 7` : 1-3 행을 7행 다음으로 복사 +- `:3 m 7` : 3행을 7행 다음으로 이동 +- `:1,3 m 7` : 1-3행을 7행 다음으로 이동 + +## 내용 고치기 +- `J` : 현재 행과 아래 행 결합 +- `3J` : 3줄 합치기 +- `u` : 이전 명령 취소 +- `cw` : 단어 변경 +- `cc` : 행 변경 +- `C` : 커서 오른쪽의 행 변경 +- `s` : 커서가 위치한 문자열 대체 +- `r` : 한 글자만 변경 (입력 모드로 바뀌지 않음) +- `R` : 입력하는 대로 겹쳐써서 변경 +- `xp` : 커서 위치 문자와 오른쪽 문자 교환 +- `-` : 문자형(대, 소문자) 변경 +- `U` : 행 변경사항 취소 +- `:u` : 이전의 최종행 취소 + +## 명령 취소 및 반복 +- `.` : 마지막 명령 반복 +- `2.` : 마지막 명령 2회 반복 +- `u` : 마지막 명령 취소 +- `U` : 현재 줄을 저장 + +## 행 번호 설정 및 화면표시 +- `:set nu` : 행 번호 표시 +- `:set nonu` : 행 번호 숨기기 +- `:=` : 현재 줄번호 보여주기 +- `:/pattern/ =` : pattern이 위치한 줄번호 보여주기 + +## 시스템이 다운된 후에 파일 되살리기 +- `vi -r` : 되살릴 수 있는 모든 파일 이름 보여주기 +- `vi -r file.txt` : vi를 시작하여 지정한 파일 되살리기 + +## 다른 파일을 파일 내로 삽입 +- `:r filename` : 커서 다음에 파일 삽입 +- `:20 r filename` : 파일을 20번째 행 다음에 삽입 + +## 새로운 파일 편집하기 +- `:e file.txt` : file.txt 편집하기 +- `:e!` : 현재의 편집중인 내용 무시하고 가장 최근에 편집한 내용 다시 편집하기 + +## 다중 편집하기 +`% vi file1 file2 file3` +혹은 +`:e file1 file2 file3` +했을 때, + +- `:args` : 편집 중인 파일목록 보여주기 +- `:n[ext]` : 다음 파일로 넘어가기 +- `:prev[ious]` : 이전 파일로 넘어가기 (단, 편집 중인 파일이 저장되지 않으면 다음 파일로 넘어갈 수 없다) + +## 문자열 탐색 +- `/aaa` : 'aaa' 찾기 (현재 위치부터 뒤로) +- `?aaa` : 'aaa' 역방향 찾기 (현재 위치부터 앞으로) +- `/` : 가장 최근에 검색한 문자열 다시 검색 +- `?` : 가장 최근에 검색한 문자열 다시 역방향 검색 +- `:set noh` : 문자열 검색 후 문자열 강조 끄기 + +## 치환 +`vi`에서 치환은 `정규표현식`이 이용된다(실제로 이 상태에서 실행하는 명령어는 `ed`나 `ex`라는 프로그램이 처리하게 되는데, 그래서 보통 이 상태를 `"ed-모드"`라고 한다). 문서에서 원하는 패턴을 찾으려면 바로 위에 '문자열 탐색' 에서 설명된 바와 같이 `/문자열 ` 이나 `?문자열 `을 사용한다. 문자치환 명령은 다음과 같다. + +[형식] `:범위s/변경전/변경후/수정자` + +`'범위'`는 명령이 실행될 범위(예: 10,20 이면 10행 부터 20행 까지)를 나타낸다. `'s'`는 `치환(substitute)`의 약자이며 `'수정자'`는 치환 명령의 세부사항을 결정한다. 필요한 것만 뒤에 적어주면 된다. (중복 가능) + +- `g `(global) - 한 줄에서 일치하는 부분을 여러개 찾았을 때 전부 치환한다. 이것을 사용하지 않으면 처음 것만 치환. +- `c `(confirm) - 만족하는 정규표현식을 찾았을 때 치환하기 전에 확인한다. +- `i `(ignore-case) - 대소문자를 구별하지 않는다. + +`"변경전"`과 `"변경후"`에 치환할 내용을 입력한다. `"변경전"`에 정규표현식을 적는다. 정규표현식으로 `.`, `*`, `^`, `$`, `[]`, `\(...\)`, `\<...\>`, `POSIX.2` 단축 표현을 사용할 수 있다. 여기서 여러 문자를 묶어서 단위를 만들고 찾은 내용을 기억하는 특수문자가 `\(`, `\)` 임을 주의해야 한다. 반대로 `(`, `)`가 일반문자이다. `vim(VI iMproved)`에서는 `vi`에 추가로 `|`, `+`, `(?와 같은) =`, `{n,m}`을 사용할 수 있지만, 앞에 `\ `를 붙여야 한다. 또, `vim`에는 `\i`, `\k`, `\p`, `\s`등의 단축 표현들이 있다. + +`"변경후"`에 `\n `과 `& `를 사용할 수 있다. `\n `는 `"변경전"`에서 `n`번째 `\(...\)`에 대응하는 부분이고, `& `는 `"변경전"`에 만족한 전체를 나타낸다. 예를 들어, +`:%s/\([0-9][0-9]*\) \([Cc]hapter\)/\2 \1/` +는 문서에서 12 Chapter같은 부분을 Chapter 12와 같이 치환하고, +`:%s/F[1-9][12]*/&/g` +는 HTML 문서에서 `"F1"` ~ `"F12"`란 단어 모두를 굵은 체로 바꾼다. (주의! `&`는 정규표현식의 특수문자는 아니지만 `vi`의 특수문자이므로, 문자그대로의 `&`를 사용하려면 대신 `\& `를 사용해야 한다) 이외에도 (뒤를 모두 대문자로) `\u `나 (뒤를 모두 소문자로) `/l `같은 기능이 있다. + +- `:%s/aaa/bbb/g` - 파일 전체(g)에서 'aaa'을 'bbb' 로 치환 +- `:%s/^M//g` - 파일 전체(g)에서 `^M `을 삭제. `^M`은 `Ctrl+V+Enter`로 입력한다. +- `:s/aaa/bbb/` - 현재 행에서 'aaa'을 'bbb' 로 치환 +- `:1,10 s/aaa/bbb/` - 1행부터 10행 까지 'aaa'을 'bbb' 로 치환 +- `:1,. s/str/rep/` - 1부터 현재행까지 'aaa'를 `'bbb' 로 전부 바꾸기 +- `:g/감자/s//바위/gc` - 각 발생 확인 후 대체 + +주의할 점은 치환명령어가 `/ `문자로 각 부분을 구분하기때문에 `"변경전"`이나 `"변경후"`에 `/ 문자`를 사용하려면 `\/` 같이 써야한다. +필요하다면 `/ `대신 다른 문자를 사용해도 된다. 예를 들어, +`:%s/\/usr\/local\/bin\//\/usr\/bin\//g` +대신 +`:%s#/usr/local/bin/#/usr/bin/#g` +가 알아보기 더 쉽다. + +출처 : [VI 편집기 사용법](https://yagi815.tistory.com/146) + +--- \ No newline at end of file