[week1-4] Vim editor

haeryong·2022년 11월 3일
0

Vim 기초

vi, vim 차이

vi
UNIX, Linux에서 가장 많이 사용하는 에디터
1976년 BSD의 Bill Joy가 개발.

vim
vi improved
vi에 추가적인 기능 부여.
vim에는 vi의 기능을 모두 포함.
리눅스에서는 vi 대신 vim이 사용됨.
(최소화된 vim 에디터이므로 추가 설치 필요.)

설치
RH 계열
# yum -y install vim-enhanced

Debian 계열
$ sudo apt -y install vim

의존성 문제 발생 시

$ sudo apt edit-sources
엔터

6줄 정도 내려가서 아래 내용을 타이핑

deb http://kr.archive.ubuntu.com/ubuntu/ bionic-updates main restricted universe

^x 후 y, 엔터를 치고 나오면 됨.
이후에 다시 설치 진행

vim 사용법

특정 파일명을 열면서 시작

$ vim mytext.txt

파일을 찾아서 편집.(파일명이 "-"이면 stdin을 의미한다.)

$ find . -name "*.txt" | vim -

vi의 3가지 모드

  1. 일반 모드(normal mode): 단축키가 사용되는 모드.
  2. 입력 모드(insert mode)
  3. 명령행 모드(command-line mode)
  4. 비주얼 모드(visual mode) (Vim에서 추가됨)

Normal -> Insert key : a, i, o
a(append) : 현재 커서 위치에서 한칸 뒤로 이동한 후 입력모드 전환.
A : 현재 행의 끝으로 이동한 후 입력모드 전환.

i(insert) : 현재 커서 위치에서 입력모드 전환.
I : 현재 행의 맨 앞으로 이동 후 입력 모드로 전환.

o(open line) : 현재 행 아래에 새로운 행을 하나 만든 후 입력모드 전환.
O : 현재 행 위에 새로운 행을 하나 만든 후 입력모드 전환.

R(replace) : 수정 모드, 모든 글자가 덧쓰여짐.

Insert -> Normal key : ESC

Normal -> Command-line key : 콜론(:)
Command-line -> Normal key : ESC, 실행

force 명령 : 뒤에 !를 추가함.

cursor 이동

Normal 모드에서
H(left), J(down), K(up), L(right)로 커서 이동.

move 반복
[#]h : left로 [#]만큼 이동
^ : 행의 맨 앞으로 이동
$ : 행의 맨 끝으로 이동

페이지 단위 이동
Ctrl + B 또는 Page Up: 위로 한 화면 스크롤
Ctrl + F 또는 Page Down: 아래로 한 화면 스크롤

Ctrl + U : 위로 1/2화면 스크롤
Ctrl + D : 아래로 1/2화면 스크롤

특정 라인으로 이동
[#]gg 또는 [#]G 또는 :# : #행으로 이동.
# 생략 시 gg는 첫행으로, G는 마지막 행으로.

CTRL + G 또는 :file : 현재 위치를 하단 상태 바에 표시함.

vim 일반 모드 기능

삭제
vi에서의 삭제 = 임시 버퍼에 잘라내기.
x : 커서에 위치한 문자 삭제(del키와 같음)
dd, :d : 현재 행을 삭제
D : 현재 컬럼 위치에서 현재 행의 끝까지 삭제
J : 아래 행을 현재 행의 끝에 붙음.

paste
p : 현재 행에 붙여넣기.(put)
:pu : 현재 행의 아래에 붙여넣기.
P : 현재 행의 위쪽에 붙임.

copy
yy, :y, Y : 현재 행을 레지스터에 복사(yank).

undo, redo
u : undo
CTRL-R : redo 이전에 취소했던 명령을 다시 실행.

.(dot) : 이전 명령어 반복.

vim 명령행 모드 기능

:20d : 20번 행 삭제
:10,25d : 10~25행 삭제
:10,$d : 10~마지막 행 삭제

:%y : 문서 전체 복사
:.,+20y : 현재 생부터 아래로 20행 복사
:-10,+5d : 현재로부터 -10행~+5행까지 삭제
:40pu : 40행에 레지스터 내용 붙여넣기

범위 연산에 사용되는 meta character
. : 현재 행
$ : 마지막 행
+# : 현재 위치 기준 #만큼 아래행
-# : 현재 위치 기준 #만큼 윗행
% : 문서 파일 전체

visual mode
마우스 드래그 기능을 대신함

v : 일반 비주얼 모드. 현재 커서 위치에서 블록 지정
V : 비주얼 라인 모드. 현재 커서가 위치한 행에서 행 단위로 블록 지정
CTRL + V : 비주얼 블록 모드. 열 단위로 블록 지정.(CTRL + Q로 대체 가능)

column editing
특정 열에 문자열을 한번에 삽입, 교체할 수 있다.

CTRL + V -> [IAc~...] -> 수정 -> ESC, ESC
I : insert
A : append
c : change
~ : switch case

gv : 이전의 highlighted text 영역 불러오기
o : highlighted text 블록의 시작과 끝을 전환

vim의 종류

vi : vi 호환의 vim. compact vim, tiny vim이라고 부른다.
RH 계열 : vim-minimal
Deb 계열 : vim-tiny

vim : 일반적인 vim을 의미함. vi에 추가적인 기능, 플로그인 사용이 가능.
enhanced vim이라고도 부름.
RH 계열 : vim-enhanced
Deb 계열 : vim-nox

vimx : 가장 많은 기능을 가진 vim.
vim, clipboard, X window clipboard 기능이 포함됨.
RH계열 : vim-X11 (명령어 : vimx, gvim)
Deb계열 : vim-gnome 혹은 vim-athena(위젯이 다름) (명령어 : vim, gvim, evim)

설치
RH계열

yum -y install vim-X11

제거
yum -y remove vim-X11

Deb 계열

sudo apt -y install vim-gnome
혹은 vim-nox

제거
sudo apt -y --auto-remove remove vim-gnome

vim clip board

X window 환경에서 vim과 클립보드를 공유하려면

$ gvim --version | grep clipboard

를 통해 clipboard, xterm_clipboard 기능이 포함되어있는지 확인해야함.

또한 ~/.vimrc 파일에 unnamed 클립보드 설정을 추가해야함.

" clipboard settings : Copy/Paste/Cut
if has('unnamedplus')
	set clipboard=unnamed, unnamedplus
endif

options (.vimrc)

명령행모드 : 옵션설정
:set : 현재 옵션 설정을 보여줌.
:set all : 모든 옵션 설정을 보여줌
:set [no]name : name에 해당하는 옵션을 on/off함. 앞에 no를 붙이면 off
:set name! : name옵션의 on,off를 toggle
:set name=value : name옵션에 value값 할당.

주로 사용하는 옵션

nu : 화면에 행번호 표시.
rnu : 현재 행 기준 상대적 거리 표시.
ai : autoindent 자동 들여쓰기
cindent : c 스타일 들여쓰기
ts=value : tabstop 화면에 표시 될 탭 크기 지정
sw=value : shiftwidth 자동 블록 이동 시 열의 너비
fencs=value : file encodings 지원할 파일 인코딩 방식 리스트.
fenc=value : 현재 파일 인코딩 방식 지정.

예시

$ vim ~/.vimrc

set ai cindent
set ts=4 sw=4
set nu

set fencs=ucs-bom,utf-8,korea

colorscheme

:colo [name]
을 통해 변경.

help

vim의 online help(manual)

:help [name]
을 통해 검색.

help에 사용되는 prefix
일반모드 : 없음
입력모드 : i
명령행 : :
비주얼 : v

vim 실행인수 -
옵션 '
명령행 모드 특수키 c_

하이퍼텍스트 단축키
^] : 하이퍼텍스트에 커서를 두고 누르면 해당 키워드의 정의 부분으로 넘어감.
^T : 이전으로 돌아가기
^W^W : window 사이를 이동할 때.

문자열 관련 기능

Formatting
center, right, left 정렬 기능.
width를 기준으로 정렬한다.

find
행에서 문자 1개 검색.
fc : 문자 c를 전방 검색.
Fc : 문자 c를 후방 검색.

; : 최근 검색을 재검색.
, : 최근 검색을 반대방향으로 재검색.

검색

/string : string을 전방탐색.

  • : 현재 커서에 위치한 단어를 전방탐색.
    # : 현재 커서에 위치한 단어를 후방탐색.
    n : 다음 탐색 결과를 찾아냄.
    N : n의 반대 방향으로 탐색.
    % : 괄호의 짝을 찾아줌.

\c 접두어를 사용하면 대,소문자 구분 없이 찾아냄.

예시
/\cyona
Yona를 찾아냄.

혹은 아래 옵션을 켤 수도 있다.
:set ignorecase

검색 후 밝게 표시된 단어를 해제하고 싶을 때
:nohl
no highlight

교체(substitute)
sed의 기능이 import 된 것으로, sed 문법과 동일하다.

:[range]s/<찾는 문자열>/<교체할 문자열>/<옵션>
separator는 / 대신 , 등으로 대체 가능하다.

명령어 옵션
g : 검색된 문자 모두를 교체.(g 생략 시 처음 1개만 교체)
i : 대소문자 무시.
c : 교체할 때마다 Y/N 확인.
e : 교체 과정 중 에러 무시.

fileformat : DOS/UNIX
set ff=dos, set ff=unix로 포맷 변환 가능.

file 관련 기능

buffer, register(vim에서의 용어)
buffer : 파일을 편집하기 위한 임시 공간
register : 텍스트 일부를 저장하고 있는 임시 공간

edit, find
vim에서 다른 파일을 편집하려고 할 때
:e [filename] : filename을 편집모드로 오픈함.

:e #[count] : count번째 파일을 오픈.
CTRL + 6 : (:e #)과 동일함. 바로 이전 파일 오픈

:find [filename] : filename에 해당하는 파일을 검색해 오픈.

quit

:q[!] : 현재 window 종료, !는 강제 종료.
:qa[!] : 모든 창을 종료
:wq : 저장 + 종료 (:x로 대체 가능)
:wqa : 저장 + 모든 창 종료

write, update
:w [filename] : filename에 해당되는 파일에 쓰기를 지정, filename이 없으면 현재 파일에 쓰기.

:sav file : 현재 파일을 다른 이름으로 저장.
:up : 변경된 점이 있는 경우에만 :w를 실행.
:x : up기능 + quit기능 (일반모드에서는 ZZ 입력)

파일 저장 예시
:10,50w history : 10~50 행을 history라는 파일에 저장.

netrw
vim으로 디렉터리를 여는 기능.

:e <path>
CTRL + 6 기능과 함께 사용하면 좋음.

newtrw 단축키
enter : 파일을 현재 창에 열기.
i : 파일 표시 방법 변경
s : 정렬 방식 변경
o : 파일을 수평 분할된 새 창에 열기.
v : 파일을 수직 분할된 새 창에 열기.
p : 미리보기(ctrl-w z 또는 :pclose로 닫음).
t : 새로운 탭으로 분할하여 열어줌

  • : 상위 디렉터리로 이동.

복수의 파일 다루기

split
창 분할 명령
ctrl+w s 또는 :sp [file] : 창 수평 분할

ctrl+w v 또는 :vs [file] : 창 수직 분할

실행 시 분할 옵션을 줄 수도 있음.
$ vim [filename] -o 또는 -O

창 이동 명령
CTRL+w [hjkl, 화살표] : 원하는 방향의 창으로 이동

CTRL+w CTRL+w : 오른쪽 창으로 이동(오른쪽 끝이면 아래로 이동).

CTRL+w p : 바로 이전의 창으로 이동.

CTRL+w = : 모든 창 size를 동일하게 조절
CTRL+w [+-] : 창 사이즈를 키우거나 줄임.

diff

vim -d file1 file2 file3 ...
파일들의 차이를 비교.
do, dp를 통해 다른 부분을 get, put 가능.

tab page

vim -p file1 file2 file3 ...

또는
:[#]tabe file : #번째 탭에 파일 열기.
:[#]tabnew file : #번째 위치에 빈 탭 만들기.
:[#]tabc : #번째 탭 닫기.

탭 사이 이동:
gt, gT를 이용

buffer
:files 혹은 :buffers : 현재 버퍼 목록을 출력한다.
%(편집 중), #(바로 이전에 열었던 버퍼), a(활성된 버퍼), +(변경된 부분이 있는 버퍼)

filename under the cursor
텍스트 중 파일명이 존재하면 파일명에 커서를 위치하고 gf 명령을 통해 그 파일을 열 수 있다.
CTRL + 6으로 되돌아가기.

또는 CTRL + W f로 분할된 창에 열기.

encoding

fileencodings(fencs)
파일을 읽을 때 확인할 encoding list를 설정
.vimrc에 설정해두어야 중국어, 일본어, 한국어 등 multi-bytes 기반 인코딩 파일을 읽을 수 있다.

set fencs=value
예시 : fencs=ucs-bom,utf-8,japan,korea,latin-1
usc_bom은 항상 적음.
latin-1은 ASCII를 의미함, 순서에 주의.

character set
utf-8 : UTF-8 유니코드 형식
ucs-bom : BOM 마크에 의한 유니코드 형식
korea : 한글 지원(유닉스에서는 euc-kr, 윈도에서는 cp949로 자동 변환됨.)
euc-kr : 한글 지원(유닉스에서만 사용 가능)
cp949 : 한글 지원(유닉스, 윈도 모두 사용 가능)
japan : 일본어 지원(유닉스 euc-jp, 윈도에서는 cp932로 자동 변환됨.)
latin1, ansi : 영문 ASCII 형식

fenc
현재 인코딩 형식

:set fenc=korea : 다른 문자 세트(korea)로 변환

Linux -> Window
텍스트 파일을 Window에 가져갈 때
1. :set ff=dos (개행문자)
2. :set fenc=korea
3. :sav new_dosfile.txt

Window -> Linux
fencs가 제대로 설정되었으면 실행 시 자동변환됨.

  1. :set ff=unix (개행문자)
  2. :set fenc=utf8
  3. :sav new_unixfile.txt

편리한 기능

word 단위 이동
w : 다음 단어 앞으로 이동.
e : 다음 단어 뒷부분으로 이동.

0 : 0번째 열로 이동.
^ : 공백이 아닌 실제 내용이 시작되는 열로 이동.
$ : 마지막 열로 이동.
b : w의 역방향.
W,E,B : w,e,b와 유사. 단어가 가진 의미를 따져서 이동.

bloack, paragraph 단위 이동
$ : 가장 가까운 괄호 짝으로 이동.
( : 문장 단위의 시작 위치로 이동.
) : 문장 단위의 끝 위치로 이동.
{ : 문단 단위의 시작 위치로 이동.
} : 문단 단위의 끝 위치로 이동.
[[ : 블록 단위의 시작 위치로 이동.
]] : 블록 단위의 끝 위치로 이동.

abbreviation
alias 기능.
ia는 insert mode에서만 작동.
ca는 commandline mode에서는 작동.
ab는 어디에서나 작동.

예시

ab 내메일 mailmail@ggmail.com

시간 (man strftime으로 검색, <CR>은 엔터를 의미함.)
ia 시간0 <C-R>=strftime("%Y.%m.%d-%H:%M:%S")<CR>

ca ㅈ w
ca ㅈㅂ wq
ca ㅂ q
ca ㅌ x

key map

nmap <단축키> <명령>

imap <단축키> <명령>

vmap <단축키> <명령>

cmap <단축키> <명령>

예시

~/.vimrc

nmap <F2> :up<CR>   (업데이트 된 부분이 있으면 저장하는 기능.)
nmap <F3> :tabnext<Enter>   gt 기능
nmap <F4> :tabprev<Enter>   gT 기능

autocmd
특정 상황에서 자동으로 실행할 명령

예시
au BufRead,BufNewFile *.txt colo desert : txt파일을 읽을 때 colo를 desert로 바꾸기.

au SwapExists * let v:swapchoice = 'o' : 스왑 파일이 존재하는 경우 readonly로 열기.

re-indentind
들여쓰기를 다시 해주는 기능.

  1. ={motion}
    motion에는 gg, G, )), ]] 등을 사용할 수 있다.
    범위는 현재 커서 위치부터 motion의 위치 까지이다.

  2. visualmode에서 V로 line선택 후 =키 누르기.

tab vs whitespace
기존에 작성된 tab 문자를 공백 4칸으로 전환하려면

:set et ts=4
:ret

공백 4칸을 탭 문자로 변환

:set noet ts=4
:ret!

insert-completion
도중까지 입력한 뒤에 CTRL+N을 눌러주면 됨.
CTRL+X CTRL+N : 더하기 낱말 모드. 추가 검색
CTRL+X CTRL+K CTRL+N : 사전 검색 모드.

vimrc를 만들어주는 사이트.
vim-bootstrap

fencs, abbreviation, key map 부분은 따로 추가해야함.

0개의 댓글