Home [데브코스] 2주차 - linux 기초(vim)
Post
Cancel

[데브코스] 2주차 - linux 기초(vim)


오답노트

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현재 행을 레지스터에 복사
uundo, 바로 이전에 행한 명령 한 개를 취소
ctrl+Rredo, 바로 이전에 취소했던 명령을 다시 실행

3dd라 하면 3개의 행을 삭제, 5p이면 5번을 붙이게 된다.


명령행 모드

  • 범위를 지정해서 명령
명령어설명
:20d20번 행을 삭제
:10,25d10~25번 행 삭제
:10,$d10~마지막 행 삭제
:%y문서 전체를 복사, %는 1,$와 동일
:.,+20y현재 행부터 아래로 20행 복사
:-10,+5d현재 행부터 위로 10, 아래로 5행 총 16행 삭제
:40pu40번 행에 레지스터 내용 붙여넣기


  • 범위 연산
기호의미
.현재 행
$마지막 행
+#현재 위치에서 #만큼 아래 행
-#현재 위치에서 #만큼 위 행
%문서 전체


  • 드래그 기능
명령어설명
v일반 비주얼 모드로 현재 커서 위치에서 블록을 지정
Vvisual line mode로, 현재 커서가 위치한 행에서 행 단위로 블록을 지정
ctrl+Vvisual 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의 바이너리 종류

이름설명
vivi 호환의 vim, 가장 적은 기능을 가지기에 tiny vim이라 부른다.
vim일반적인 vim, enhanced vim이라고도 함
vimx가장 많은 기능을 가진 vim, vim+clipboard, X window clipboard 기능이 포함됨


기능redHat 패키지 이름debian 패키지 이름
일반 vivim-minimal (명령어:vi)vim-tiny(명령어:vi)
enhanced vimvim-enhanced (명령어: vim)vim-nox(명령어:vim)
vim with Xvim-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자동 들여쓰기
cindentC언어 스타일의 들여쓰기
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, 를 한 후 ;를 누르면 →방향으로 다음, 다음 다음 ,를 하면 ←방향으로 뒤로


일반모드 검색 - 명령어

명령어설명
/stringstring을 전방탐색함
?stringstring을 후방탐색
*현재 커서에 위치한 단어를 바로 전방탐색
#현재 커서에 위치한 단어를 바로 후방탐색
n다음 탐색 결과를 찾아냄(전방이면 전방, 후방이면 후방)
Nn과 반대방향으로 다음 검색
%괄호의 짝을 찾아줌

대소문자를 구분하지 않고 하기 위해서는 \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에 저장시켜놓을 수도 있다.

: 함수를 작성해서 넣을 수 있다. 마지막 과 같이 enter를 치라는 것 ## autocmd 특정 상황에서 자동으로 실행할 명령 *.c 파일을 열 때 자동으로 실행되어야 하는 명령으로 ```bash autocmd BufRead,BufNewFile *.txt colo evening ``` 하면 버퍼를 읽거나, 새로운 파일을 만들 때 txt파일이면 테마를 evening으로 해라 편리한 기능으로 스왑파일이 있으면 그 파일을 읽기 전용으로만 하게끔 ```bash au SwapExists * let v:swapchoice = 'o' ``` au는 축약어 파일 확장자 말고, 경로가 될 수 도 있다. */include/* ## 편리한 기능2 ### 들여쓰기를 다시 하기 어디서 불러온 경우 들여쓰기가 안되어 있는 경우가 있다. 이를 retab이라 하는데 두 가지 방법이 있다. - ={motion} - motion에는 이동 관련 키 gg,G, )), ]] 등을 사용할 수 있다. - gg → = → G - 를 하면 맨 앞부터 맨뒤까지 =, 즉 retab해준다. - visualmode에서 = - 비주얼모드에서 라인 선택 후 = 키를 눌러도 된다. ### 기존의 탭 문자를 공백 4칸으로 전환하고 싶으면 :set et ts=4 :ret 반대로 공백 4칸을 탭으로 하려하면 :set noet ts=4 :ret! 강제 변환이므로 ! ### 자동완성 기능 기존의 단어가 존재할 경우 단어를 타이핑하다가 ctrl+N 누르면 앞서 사용한 단어를 보고 추론하여 자동완성해준다. 그러나 include 구문 안에 있는 것들도 인식해서 찾아준다. 이때 ctrl+x를 누르고 ctrl+n을 하면 사전 기반 검색이라고 하는데 특수 문자, 경로명도 찾을 수 있다. 취소하려면 ESC ### vim-bootstrap 자동으로 vimrc를 만들어주는 곳이 잇다. [https://vim-bootstrap.com/](https://vim-bootstrap.com/) 다하고 나서 제너레이트 누르면 파일을 하나 만들어주는데, 이를 .vimrc로 변환해서 자신의 홈디렉토리로 복사 더 수정해서 넣어야 할것들 fencs. ia, ca 등
This post is licensed under CC BY 4.0 by the author.