vim editor
vim(vim - vi improved) editor는 linux에서 가장 많이 쓰이는 텍스트 편집기다. vim.org에서 윈도우 vim을 사용하 수 있다.
vim설치
1
$ sudo apt -y install vim
이 때, 의존성 문제가 발생할 수 있다. 그래서
1
$ sudo apt edit-sources
를 치고, 자신이 원하는 에디터를 고른 후, 아래를 빈 줄에 타이핑한다.
1
deb http://kr.archive.ubuntu.com/ubuntu/ bionic-updates main restricted universe
그 후, 다시
1
$ sudo apt update && sudo apt install vim
vim 시작
vim
1
2
3
4
5
특정 파일명을 열면서 시작
$ vim mytext.txt
파일명이 "-"일 경우 -stdin-을 의미함.
$ find . -name "*.txt" | vim -
vim mode
- 일반모드: normal mode (or command mode)
- 입력모드: insert mode
- 명령행모드: command-line mode ( or colon mode)
- [추가] 비주얼모드: visual mode = 마우스를 대신하는 드래그 모드
normal에서는 타이핑이 불가능하기에 insert mode로 가야 타이핑이 가능하다. 그래서 a
를 외워서 변경해준다. 타이핑을 실패하거나, 잘라내기 등을 할때는 노말모드로 해야 하기에 esc
를 누른다. 특정 파일명을 지정하거나, 복잡한 명령을 써야하는 경우 커맨드라인 모드로 가야한다. 이때는 :
을 사용한다.
노말 모드는 간단하게 단축키를 쓸 수 있게 해주는 모드이다.
a,i,o에 대한 뜻이 다 있는데,
- a = append: 현재 커서 위치에서 한 칸 뒤로 이동한 후 입력 모드
- i = insert: 현재 커서 위치에서 입력모드
- o = open line: 현재 행 아래에 새로운 행을 하나 만든 후 입력 모드
하지만, a를 가장많이 쓰므로, a만 외워도 괜찮다.
노말 모드가 필요한 이유
text-based에서는 GUI 메뉴가 없어서 단축키로 해야 한다.
1
2
3
4
5
6
$ vim clientlist.txt
a (입력 모드로 전환)
텍스트 입력
<ESC> (일반 모드로 전환)
:w (= write, 저장)
:q (= quit, 나가기)
노말 모드에서는 화살표키 대신 hjkl(좌하상우)을 사용한다.
명령어 | 설명 |
---|---|
[#]h | 좌로 #칸 이동, # 디폴트값은 1 |
[#]j | 아래로 #칸 이동 |
[#]k | 위로 #칸 |
[#]j | 우로 #칸 |
^ | 행 맨 앞으로 이동 |
$ | 행 맨 끝으로 이동 |
ctrl+B = | 위로 한 화면 스크롤 |
ctrl+F = | 아래로 한 화면 스크롤 |
ctrl+U | 위로 1/2화면 스크롤 |
ctrl+D | 아래로 1/2화면 스크롤 |
[#]gg | #행으로 이동, #이 생략되면 1을 의미 |
[#]G | #행으로 이동, #이 생략되면 마지막 행을 의미 |
:# | #행으로 이동 |
ctrl+G | 현재 문서 위치 정보를 하단 상태 바에 표시 |
force 명령
!를 뒤에 추가한다. e.g. :wq!
저장이나 창을 닫을 경우 팝업창이 뜨는데, vim에서는 이런 팝업창을 띄워주는 것이 없다. 그래서 저장을 하지 않으면 에러가 난다. 저장하지 않고, 나가려고 하면 q!
를 해주어야 한다.
vim 일반 모드 기능
buffer (register 기능)
buffer: delete, cut
vim에서의 삭제는 임시 버퍼에 잘라내기가 된다.
명령어 | 설명 |
---|---|
x | 커서에 위치한 문자 삭제 |
dd | 현재 행을 삭제 |
D | 현재 컬럼 위치에서 현재 행의 끝부분까지 삭제 |
J | 아래 행을 현재 행의 끝에 붙임 |
p | 현재 행에 붙여넣는다. |
P | 현재 행의 위쪽에 붙는다. |
yy or Y | 현재 행을 레지스터에 복사 |
u | undo, 바로 이전에 행한 명령 한 개를 취소 |
ctrl+R | redo, 바로 이전에 취소했던 명령을 다시 실행 |
3dd라 하면 3개의 행을 삭제, 5p이면 5번을 붙이게 된다.
명령행 모드
- 범위를 지정해서 명령
명령어 | 설명 |
---|---|
:20d | 20번 행을 삭제 |
:10,25d | 10~25번 행 삭제 |
:10,$d | 10~마지막 행 삭제 |
:%y | 문서 전체를 복사, %는 1,$와 동일 |
:.,+20y | 현재 행부터 아래로 20행 복사 |
:-10,+5d | 현재 행부터 위로 10, 아래로 5행 총 16행 삭제 |
:40pu | 40번 행에 레지스터 내용 붙여넣기 |
- 범위 연산
기호 | 의미 |
---|---|
. | 현재 행 |
$ | 마지막 행 |
+# | 현재 위치에서 #만큼 아래 행 |
-# | 현재 위치에서 #만큼 위 행 |
% | 문서 전체 |
- 드래그 기능
명령어 | 설명 |
---|---|
v | 일반 비주얼 모드로 현재 커서 위치에서 블록을 지정 |
V | visual line mode로, 현재 커서가 위치한 행에서 행 단위로 블록을 지정 |
ctrl+V | visual block mode로 열 단위로 블록을 지정 |
드래그 한 상태로 colon(:)을 누르면 범위 지정해서 명령 가능
- 비쥬얼 블록 열 편집
명령어 |
---|
ctrl+V, ESC*2 |
I: insert |
A: append |
C: change |
~: switch case |
특정 열에 문자열을 삽입하거나 교체할 때 많이 사용
1줄씩 편집하는 것이 아닌 전체를 통으로 수정
⇒ gg → ^V → G → I → 0000 → ESC,ESC
하게 되면 전체 줄에 대해 0000을 삽입
비주얼 모드
- gv: 이전 강조 텍스트 영역 불러오기
- o: 강조 텍스트 블록의 시작으로 이동 한번 더 누르면 끝으로 이동
vim의 바이너리 종류
이름 | 설명 |
---|---|
vi | vi 호환의 vim, 가장 적은 기능을 가지기에 tiny vim이라 부른다. |
vim | 일반적인 vim, enhanced vim이라고도 함 |
vimx | 가장 많은 기능을 가진 vim, vim+clipboard, X window clipboard 기능이 포함됨 |
기능 | redHat 패키지 이름 | debian 패키지 이름 |
---|---|---|
일반 vi | vim-minimal (명령어:vi) | vim-tiny(명령어:vi) |
enhanced vim | vim-enhanced (명령어: vim) | vim-nox(명령어:vim) |
vim with X | vim-X11 (명령어: vimx,gvim) | vim-gnome or vim-athena (명령어: vim, gvim, evim) |
1
2
3
4
5
설치
$ sudo apt -y install vim-gnome
제거
$ sudo apt -y --auto-remove remove vim-gnome
일반 유저의 경우 alias vi=vim으로 잡혀있다. root 유저의 경우 vi로 실행과 vim이 서로 다르다.
클립보드 설정
x window 환경에서 vim과 클립보드를 공유한다는 것은 x window와 유닉스의 클립보드가 공유되지 않기 때문에, x window와 vim이 클립보드를 공유할 수 있도록 하기 위해 vim-gnome을 설치하고, 설정을 더 해야 한다.
1
~/.vimrc : vim config
설치 후 아래 부분을 추가해줘야 한다. "
는 vim에서 주석을 의미한다.
1
2
3
4
" clipboard settings : Copy/Paste/Cut
if has('unnamedplus')
set clipboard=unnamed, unnamedplus
endif
서로 공유가 되는지 확인을 위해서 2개의 터미널을 켜고, 1개는 vimx, 2번째는 gedit를 켜서
- vimx에서는 복사는 y, 붙여넣기는 p
- gedit에서는 복사는 ctrl+c, 붙여넣기는 ctrl+v
명령행 모드 옵션 설정
주로 사용하는 옵션
옵션 | 설명 |
---|---|
nu | 화면에 행 번호 표시 |
rnu | 현재 행을 기준으로 상하의 상대적 행 번호 표시 |
ai | 자동 들여쓰기 |
cindent | C언어 스타일의 들여쓰기 |
ts = value | 화면에 표시될 탭 크기를 value로 지정(기본은 8인데, 4가 자주 쓰임) |
sw = value | 자동 블록 이동 시 열의 너비(대부분 ts와 같은 수나 배수로 함) |
fencs = value | 지원할 파일 인코딩 방식 리스트 *복수 개 지정 시 공백 없이 콤마로 구분 |
fenc = value | 현재 파일 인코딩 방식을 지정 |
vim custom colorscheme라고 검색하면 github에 많이 있다. 사람들이 많이 쓰는 스킨테마는 molokai, jellybeans, material 이다. 원하는 컬러를 골라 적용하면 된다.
vim 매뉴얼
vim은 help를 지원한다.
입력모드 | 접두어 | 예 |
---|---|---|
일반 | 없음 | :help x |
입력 | i_ | :help i_CTRL_N |
명령행 | : | :help :w |
비주얼 | v_ | :help v_u |
vim 실행인수 | - | |
옵션 | ‘ | |
명령행 모드 특수키 | c_ |
설명 글을 보면 색이 칠해져 있는 것들이 있다. 이 때, ^]
를 누르면 그것에 대한 설명으로 이동한다. 다시 돌아오는 키는 ^T
이다. help창과 edit창이 이분할되는데 이 두개를 왓다갔다하는 방법은 ^W^W
이다.
vim의 에러
파일을 중복해서 오픈한 경우 두 가지를 분별해야 한다.
- 다른 프로그램이 동일한 파일을 수정한 경우
- 에디트 세션이 충돌되어 죽은 경우
두가지를 분별하는 방법은
process ID에 still running이라 나오면 1번
⇒ 읽기 전용으로 보든지, 아니면 나가거나
process ID에 still running이 아니면 2번
⇒ recover(R)을 해라.
⇒ 그래도 에러가 뜨면서 swp 파일 뭐라 뜨면 (d)elete라고 뜨면 d하고, 아니면 나가서
rm -rf .<파일 이름>.<확장자>.swp
문자열 관련 기능
formatting
정렬하는 것으로 center
정렬 할 경우 width가 몇인지 지정해줘야 함, 기본은 80으로 되어 있다.
- 50으로 지정
1
:center 50
find
명령어 | 설명 |
---|---|
fc, f/, f; | 문자 c를 전방 검색 |
Fc, F/, F; | 문자 c를 후방 검색 |
; | 최근 검색을 재검색 |
, | 최근 검색을 반대방향으로 재검색 |
f, 를 한 후 ;를 누르면 →방향으로 다음, 다음 다음 ,를 하면 ←방향으로 뒤로
일반모드 검색 - 명령어
명령어 | 설명 |
---|---|
/string | string을 전방탐색함 |
?string | string을 후방탐색 |
* | 현재 커서에 위치한 단어를 바로 전방탐색 |
# | 현재 커서에 위치한 단어를 바로 후방탐색 |
n | 다음 탐색 결과를 찾아냄(전방이면 전방, 후방이면 후방) |
N | n과 반대방향으로 다음 검색 |
% | 괄호의 짝을 찾아줌 |
대소문자를 구분하지 않고 하기 위해서는 \c처럼 \
를 추가한다.
e.g.
/inter
: 대소문자 구분해서/\cinter
: 대소문자 구별하지 않고
또는 대소문자 구분을 키거나 끄는 옵션을 설정하려면
- 켜기(default) → :set ignorecase
- 끄기 → :set noignorecase
검색 후 밝게 표시된 단어를 해제하고 싶을 때는 :nohl
로 설정한다.
[section]에서 section을 정규표현식이 아닌 이 단어 자체를 찾고자 한다면 magic을 끄도록 /\M[section]
이라 해야 한다.
교체
sed
의 기능이 추가된 것으로 sed와 문법이 같다.
명령행으로
1
:[range]s/<찾는 문자열>/교체할 문자열>/<옵션>
- s는 sebstitute라는 의미
- 구분자는 / 와 , 둘다 가능
- 구분자로 구분자가 아닌 진짜 슬러시라는 것을 표시하기 위해 \를 덧붙인다.
- (e.g. s/\/usr\/linux/\/usr\/linuxer/g)
- 옵션은 g,i,c,e 가 잇는데 g(검색된 문자열 모두를 교체) 한다고 하는 것을 많이 씀
- 이 때, 특수문자도 찾을 수 있다.
NewLine = 개행 문자, windows/DOS 의 파일을 unix로 가져오면 깨지거나 이상한 문자가 붙고, unix파일을 windows로 가져가면 다 붙어서 불려온다.
그러나 실전에서는 가져왔을 때는 :set ff=dos 라고 하면 dos포맷, 가져다 주려면 :Set ff=unix로 하면 unix 포맷으로 되고 바꾼 후 주면 된다.
파일 관련 기능
용어
- buffer : 파일을 편집하기 위한 임시 공간
- 예를 들어 파일명 없이 vim을 실행하면 이름이 없는 buffer에 작업하게 된다.
- 그러다가 :w myfile.txt 처럼 저장하면 buffer는 myfile.txt에 저장되면서 이름을 가지게 된다.
- register: 텍스트 일부를 저장하고 잇는 임시 공간 , dd로 삭제하고 p로 붙여넣을 수 있게 해주는 공간
vim에서 다른 파일을 편집하려고 할 때는
명령어 | 설명 |
---|---|
:e [filename] | filename을 편집모드로 오픈, filename이 생략되면 현재 파일을 다시 오픈 |
:e #[count] (==ctrl+6) | count번째 파일을 오픈, count를 생략하면 바로 이전 파일 |
종료 기능
명령어 | 설명 |
---|---|
:q! | 현재 창 종료 |
:qa! | 모든 창 종료, 복수 창 열려 있을 때 유용 |
:x | 저장하면서 종료 (일반 모드에서는 ZZ)(저장할 게 있으면 저장 없으면 그냥 종료) |
vim에서 디렉토리 열기
현재 디렉토리를 vim으로 열고자 하면, vim . 하면 출력값이 주욱 나오고, 커서를 해당 파일로 가져가 엔터치면 열린다. 또는 :e <path>로 실행해도 된다.
디렉토리에서 <F1> 누르면 명령키가 나온다.
- enter을 누르면 현재 창에 열어준다 ⇒ ctrl + 6누르면 다시 돌아옴
- i: 파일 표시 방법을 변경시켜준다.
- s: 정렬 방식을 바꾼다.
- o: 해당 파일을 수평 분할된 새창으로 열어줌
- v: 해당 파일을 수직 분할된 새창으로 열어줌
- p: 미리보기
분할 기능
- 같은 파일을 분할하려면
- 수평 분할 <ctrl+w>+ s or :sp [file]
- 수직 분할 <ctrl+w> + v or :vs [file]
- 창을 이동하는 명령 | 명령어 | 설명 | | — | — | | <ctrl+w> + 방향키 | | | <ctrl+w> + w | 현재 창에서 오른쪽 방향으로 이동 |
- 창 크기 조절 | 명령어 | 설명 | | — | — | | <ctrl+w> = | 모든 창 크기 동일 | | <ctrl+w> [#]+ | #크기만큼 크기 키움 | | <ctrl+w> [#]- | #크기만큼 크기 줄임 |
++ -d 옵션 (diff)
1
vim -d file1 file2
다른 부분을 찾아주고, 어디가 구체적으로 다른지 표시해준다.소스 코드 비교할 때, 설정 파일 비교할 때 많이 사용되며, 실시간으로 비교해준다. do
를 타이핑하면 해당 부분을 바로 카피하고, dp
를 타이핑하면 삭제한다.
tabpage
분할할 때마다 원래 창의 크기가 줄어들기에 탭페이지 기능을 많이 사용하는 기능이 있다.
옵션 : -p
1
vim -p file1 file2 file3
vim안에서 추가하고 싶다면 명령행 모드로
명령어 | 설명 |
---|---|
:[#]tabe[dit] file | #번째 탭에 파일을 연다. #을 생량하면 현재 탭 뒤에 생성, 번호는 0번 부터 |
[#]gt ( colon은 너무 많이 써야됨) | 다음 탭으로 이동, #에 숫자를 지정하면 탭 번호로 이동 |
[#]gT | 이전 탭으로 이동 |
buffer
1
2
:files
:buffers
둘 중 아무거나 타이핑하면 현재 저장 전인 것들의 리스트를 볼 수 있다.
추가 옵션으로는 다음과 같다.
- % : 현재 편집 중인 버퍼
- # : 바로 이전에 열었던 버퍼, ctrl+6누르면 #이 표시된 파일 열림
이 때, 경로명을 적으면 경로명을 인식해서 열기가 가능하다.
- gf : 파일이 켜져 있는 상태로 이동 , ctrl+6를 누르면 다시 돌아옴
- c언어에서 헤더파일을 볼수도 있다.
- <ctrl+w> + f : 분할된 창에 열어주는 것
- <ctrl+w> + gf : 파일명을 탭에 열어줌
파일 encoding
줄여서 fencs
파일을 읽어서 확인할 encoding list를 설정
변환이 필요한 경우 지원한다. 따라서 .vimrc에 설정되어 있어야만 읽어올 수 있다.
:set fenc=value
구분은 ,로 한다. ,중간에 공백은 있으면 안된다. 앞부터 순서대로 점검한다. 순서가 중요하다.
ucs-bom: 무조건 적어야함, 바이코드마크가 있는지 체크해주는 것
latin-1: ascii
korea: 유닉스에서는 euc-kr, 윈도우에서는 cp949로 자동변환함
japan도 마찬가지
:help encoding-values 라 하면 많이 나온다.
fencs는 설정 리스트이고, fenc는 설정하는 것
~/.vimrc 에서는 set fencs =
일반 파일에서 다른 파일로 설정하기 위해서는 :set fenc=
텍스트 파일을 윈도우로 가져갈 때는
- :set ff=dos
- :set fenc=korea
- :wq
- 다른 이름으로 저장하고 싶은 경우
- :sav new_dosfile.txt
윈도우에서 가져온다면
- :set ff=unix
- :set fenc=utf8
- :wq
편리한 기능
단어 경계 이동
- w: 단어 바로 앞에
- e: 단어 바로 뒤에
- ^: 공백이 아닌 실제 내용이 있는 시작 열
- $: 마지막 열
괄호, 블록 단위 이동
- %: 괄호 짝으로 이동
- (, ) / {, } / [, ] 문장, 문단, 블록 단위의 시작 위치, 끝 위치로 이동
단축어 기능 - 특정 단어를 사용자 설정으로 쓸 수 있다.
ab, ia 기능
ia: insert mode에서만 작동하는 기능
ca: commandline mode에서만 작동하는 기능
ca: 한글상태 오타를 변환할 수 있다.
- ca ㅈ w
- ca ㅈㅂ wq
- ca ㅂ q
- ca ㅌ x
간혹 .vimrc 파일이 euc-kr로 되어 잇으면 편집시 작동하지 않을 수도 있다.
:set all 로 치면 fenc가 어떻게 설정되어 있는지 확인 가능
명령어 | 설명 |
---|---|
:ab [lhs] | 현재 설정된 모든 약어 목록 출력, lhs 지정하면 해당 약어 정보만 |
:ab {lhs} {rhs} | lhs 약어를 rhs로 변환 |
:unab {lhs} | 약어 lhs 해제 |
:abclear | 설정된 모든 약어 해제 |
:ia {lhs} {rhs} | ab와 기능은 같으나 입력 모드에서만 작동 |
:ca {lhs} {rhs} | 명령행 모드에서만 작동 |
편리하게 모든 곳에서 사용하도록 vimrc에 저장시켜놓을 수도 있다.