vim

전 세계 개발자가 가장 많이 쓰는 에디터 중 하나

1. 설명

  • VI iMproved

  • 원래 vi -> vim 으로 변화됨

  • 자주 사용되는 옵션

    • -t : tag : tag 로 jump 하여 에디터를 시작한다.

    • -o files : 여러 파일을 split 모드로 열기

    • -R files : read-only mode 로 열기

    • -d files : diff mode

2. 이동

  • j, k, h, l : 상하좌우

  • w : 단어 시작점을 기준으로 앞으로 이동

  • e : 단어 끝점을 기준으로 앞으로 이동

  • b : 단어 시작점을 기준으로 뒤로 이동

  • 0 : 문장 맨 앞으로 이동

  • $ : 문장 맨 끝으로 이동

  • f(CHAR) : 문장 내에서 현재 포인터에서 가장 가까운 CHAR를 찾아 앞으로 이동

  • F(CHAR): 문장 내에서 현재 포인터에서 가장 가까운 CHAR를 찾아 뒤로 이동

  • } : 단락(빈줄) 단위로 아래로 이동한다.

  • { : 단락(빈줄) 단위로 위로 이동한다.

  • G : 파일의 맨 끝으로 한번에 이동

  • gg : 파일의 맨 앞으로 한번에 이동

  • :[number]

    • number 라인으로 이동한다.

    • :10 - 10번째 라인으로 이동한다.

  • :set number / :set nonumber

    • 파일의 라인 넘버를 보여준다/안보여준다.

  • H, M, L : 현재 페이지의 최상단, 중간, 최하단으로 이동한다.

  • ctrl + f / ctrl + b

    • 페이지 단위로 뒤로 / 앞으로 이동

  • ctrl + d / ctrl + u

    • 반페이지 단위로 뒤로 / 앞으로 이동

  • ctrl + e / ctrl + y

    • 한줄씩 밑으로 스크롤 / 한줄씩 위로 스크롤

    • 커서는 이동하지 않는다.

3. 편집 1

  • 입력모드로 전환

    • i : 커서 위치부터 편집 시작

    • I : 커서가 있던 라인의 가장 앞으로 이동하여 편집 시작

    • a : 현재 커서에서 한칸 왼쪽으로 이동하여 편집 시작

    • A : 커서가 있던 라인의 가장 마지막으로 이동하여 편집 시작

    • o : 현재 커서에서 맡으로 한줄을 추가하면서 편집 시작

    • O : 현재 커서에서 위로 한줄을 추가하면서 편집 시작

    • cc : 현재 라인을 한줄 삭제하면서 편집 시작

    • C : 현재 커서 단어를 지우면서 편집 시작

  • 복사

    • yy : 현재 줄 복사

    • yw : 현재 단어 복사

  • 붙여넣기

    • P : 현재 위치에 바로 붙여넣기

    • p : 현재 커서 다음줄에 붙여넣기

  • 잘라내기

    • x : 현재 캐릭터 잘라내기

    • dd : 현재 라인 잘라내기

    • dw : 현재 word 의 끝까지 잘라내기

    • D : 현재 커서부터 라인 끝까지 지우기 -> 클립보드에 보관 X

  • 덮어쓰기 - replace

    • r : 현재 캐릭터만 대체한다. 끝나자마자 replace 됨

    • R : 끝날때까지 덮어쓰기 모드가 유지됨

    • s :

  • 되돌리기/반복

    • u : undo

    • ctrl-r : redo

    • . : 마지막 행동 반복

4. 편집 2

  • :q : 문서 편집화면에서 나가기

  • :q! : 현재 변경사항을 저장하지 않고 나가기

  • :w [filename]: 파일 저장하기

  • :wq / :x : 저장하고 나가기

  • :qa : 전체 저장하고 나가기

  • :e : 현재 창에서 다른 파일 열기

    • 현재 파일 내용 위에 다른 파일이 열린다.

    • 현재 수정 내용을 저장한 뒤에야 이동할 수 있다.

5. 검색

  • vim file 내에서 내가 원하는 검색어를 찾기 위함

5-1. 주요 사용법

  • /keyword

  • ?keyword

  • /\<keyword\>

  • n : 정방향 검색 반복

  • N : 역방향 검색 반복

  • * : 커서 위치의 키워드 아래쪽으로 검색

  • # : 커서 위치의 키워드 위쪽으로 검색

  • /abc\|xyz : abc or xyz 검색

5-2. 유용한 설정모음

  • :set ic : 대소문자 구분없이 - ignore case

  • :set noic : 대소문자 구분있게

  • :set hlsearch : search highlight On

  • :set nohlsearch : search highlight OFF

  • :set incsearch : 타이밍시 화면에 표시 O

  • :set noincsearch : 타이밍시 화면에 표시 X

6. 스트링 치환

  • 문서 전체 스트링 치환 : %

    • :%s/str/replace : 전체 문서에 대해서 str -> replace 로 치환 / 라인별로 가장 최초의 한번만 적용된다.

    • :%s/str/replace/g : 다중 검색시에도 적용한다. / 검색되는 케이스 모두에 적용된다.

    • :%s/str/replace/gc : 치환하기 전에 사용자에게 묻는다. 하나하나 물어본다.

    • :%s/\<str\>/replace/gc : "str" 단어 단위로 검색하여 치환한다.

  • 라인 지정 의미 기호

    • . : 현재라인

    • 1 : 라인 1

    • $ : 문서의 마지막 라인

  • 라인 지정 스트링 치환

    • :1,10s/str/replace/gc : 라인 1-10 에 대해서만 치환을 적용한다.

    • :1,.s/str/replace/gc : 라인 1 - 현재 라인까지 치환 적용한다.

    • :1,$s/str/replace/gc : 라인 1 - 마지막 라인까지 치환 적용한다.

7. RegEx

  • 주로 vim 에서 찾을 때 많이 사용된다.

  • 주요 의미 기호

    • . : newline 제외한 모든 문자

    • ^ : 라인의 시작

    • $ : 라인의 끝

      • /{$

    • * : 0이거나 여러 개

      • /String.*r

    • \+ : 1이거나 여러 개 = 1개는 반드시 있다.

    • \= : 0개이거나 1개 = 없거나 1개가 있거나

    • \{n} : n회 반복한다.

    • \{n,m} : n~m회 반복한다.

    • \{,m} : 최대 m회까지 반복

    • \{n,} : 최소 n회까지 반복

    • [0-9] : 0~9 사이의 캐릭터

    • [a-z] : a~z 사이의 캐릭터

    • [abc] : a, b, c 중 하나와 매치되는 캐릭터

    • [^0-9] : 0~9를 제외한 캐릭터

  • 예제

    • /sem_.*(.*) : sem_ 으로 시작하여 함수를 호출/선언하는 경우

      • 예) sem_dnskdksldhk() : sem 시리즈를 호출하는 api 를 일괄적으로 검색하겠다.

    • /public.*(.*)

    • /^#include : 라인의 시작에 #include 가 나오는 경우

    • /\<inotify_ : 단어가 inotify_ 로 시작하는 경우

    • :%s/\<variable\>/var/g : 문서 전체에서 variable 단어와 정확히 일치하는 단어를 찾아 var 로 변경한다.

8. 멀티 윈도우

  • vim 실행시 창 분할

    • 가로분할

      • vim -o test.c test.h

      • vim *.sh -o

    • 세로분할

      • vim -O test.c test.h

  • vim 실행 후 창 분할

    • 가로분할

      • :split s / ctrl+w s

      • :split n / ctrl+w n

    • 세로분할

      • :vsplit v

      • ctrl+w v

  • vim 실행 후 새 창 분할

    • 가로 새 창

      • :new (n)

      • ctrl+w (n)

    • 세로 새 창

      • :vnew

      • ctrl+w

  • 창 닫기

    • 현재창

      • :quit

      • ctrl+w q

    • 현재창만 남기기

      • :only

      • ctrl+w o

  • 창 간 커서 이동

    • ctrl+w w : 다음 창으로 이동

    • ctrl+w k : 윗 창으로 이동

    • ctrl+w j : 아래 창으로 이동

    • ctrl+w h : 왼쪽 창으로 이동

    • ctrl+w l : 오른쪽 창으로 이동

    • ctrl+w t : 최상단 창으로 이동

    • ctrl+w b : 최하단 창으로 이동

  • 창 이동

    • ctrl+w K : 윗 창으로 이동

    • ctrl+w J : 아래 창으로 이동

    • ctrl+w H : 왼쪽 창으로 이동

    • ctrl+w L : 오른쪽 창으로 이동

  • 창 크기 조절

    • ctrl+w + // ctrl+w - : 높이 증가 // 감소

    • ctrl+w _ OR / : 높이 최대화

    • ctrl+w > // ctrl+w < : 폭 증가 // 감소

    • ctrl+w | : 폭 최대화

    • ctrl+w = : 높이/폭 모두 같게

  • 기타 기능

    • ctrl+w ] : 새창에서 tag jump

    • ctrl+w f : 커서 위치의 파일 이름을 새창에서 열기

9. 단축키 (사용자 정의)

  • 모드마다 다른 단축키를 설정할 수 있다.

  • 기본문법 : CMD LHS RHS

    • CMD : map, nmap, imap...

    • LHS : 입력할 키

    • RHS : 입력시 동작

  • <C-key> : ctrl + key

  • <S-key> : shift + key

  • <A-key> : alt + key

  • <C-S-key> : ctrl + shift + key

  • <BS>, <Tab>, ...

  • example

    • :nmap <F8> oprintf("%s %d line : \n", __func__, __LINE__);<ESC>

      • normal mode 에서 F8 누르면 아래 줄에 printf() 출력한다.

    • :imap <F8> printf("%s %d line: \n", __func__, __line__);<CR>

      • insert mode 에서 F8누르면 print() 출력한다.

    • :nmap <F2> :cs find s <C-R>=expand("<cword>")<CR><CR>

      • F2 누르면 커서위의 단어를 cscope find symbol 로 매핑해서 실행한다.

      • 그 후 엔터를 두번 누른다.

    • :map <F8> oprintf("hello\n");<ESC>

      • F8을 누르면 hello 를 츨력하고 개행한다.

10. 유용한 기능들

  • 자동완성 : insert mode 에서 ctrl + p

    • 미리 정의된 변수 등 프로그래밍 파일 내에서 유용하게 사용

  • diff mode

    • 서로 비슷하지만 살짝 다른 두 파일의 내용을 비교할 때 유용하게 사용

    • vim [file1] [file2] -d

    • or vimdiff [file1] [file2]

    • diff 설정 - :diffthis

    • diff 해제 - :diffoff

    • do : 왼쪽에 있는 내용 오른쪽으로 복사

  • fold

    • 생성 : [visual block 모드에서] zf

    • 삭제 : zd OR space

    • 열기 : zo

    • 닫기 : zc

  • 괄호 쌍 이동 : [괄호에 커서를 놓고] %

  • 마킹

    • 위치마킹 : m[a-z]

    • 마킹으로 이동 : '[a-z]

  • man page 열기 : 단어위에 커서 놓고 k

    • section 3 에 대한 man 페이지 열 때 : 3k

    • :!man -a : 모든 섹션으로 보기

  • indentation

    • 현재중 auto indent, ==

    • 블록에 적용시, [비주얼모드] =

    • 파일 전체에 적용시, gg=G

    • :set expandtab

11. vim 플러그인

  • vim 의 기능을 확장할 수 있는 방법

  • 운영체제에 소프트웨어 패키지를 설치해서 사용하듯, vim 도 plugin 을 설치할 수 있다. -> vim 기능의 확장!

  • 설치방법

    • ~/.vim/plugin 디렉터리에 plugin 파일(.vim) 복사

    • 플러그인 관리자

      • vundle

      • pathogen

      • vim-plug

  • 플러그인은 어디에서 찾는가?

12. man

  • man page 조회

sections

섹션에 따라서 내용이 나누어져 설명되어있다.

  1. general commands

  2. system call

  3. library functions : C standard library

  4. special files

  5. file formats and conventions

  6. games and screensavers

  7. miscellanea

  8. system administration commands and daemons

example

  • man 3 pringf

  • man -a stat

  • apropos pthread

    • 검색에서 포함된 모든 페이지를 보여준다.

  • whatis pthread

command (less)

  • 종료 : q

  • 검색

    • /pattern

    • ?pattern

  • 화면이동

    • 한 페이지 앞으로 : f, ctrl-f, space

    • 한페이지 뒤로 : b, ctrl-b

    • 한 줄 앞으로 : j, e, ctrl-e

    • 한줄 뒤로 : k, y, ctrl-y

13. diff

  • 두 파일의 차이점을 비교하고, stdout 으로 출력한다.

  • diff 결과를 patch command 로 적용하는 것이 가능하다.

자주 사용되는 옵션

  • -r, --recursive

    • diff 뜰 때, 디렉토리 단위로하면, 모든 파일에 대해서 반복적으로 설정해주어야 한다.

  • -q, --brief

    • 변경 여부만 출력

  • -u, -U NUM, --unified[=NUM]

    • unified context 방식으로 출력한다.

    • 기본값은 3dnl

  • -N, --new file

    • 없는 파일을 빈 파일로 인식한다.

  • -p, --show-c-function

    • 변화된 블럭 함수의 이름을 출력

example

  • diff -uN before.c after.c

  • diff -urNp dir_a dir_b

  • diff -q dir_a dir_b

    • echo $?

      • 변경사항 없다면 0

      • 변경되었다면, 1

 diff -urNp diff_a diff_b
--- diff_a	2023-01-17 16:24:35.000000000 +0900
+++ diff_b	2023-01-17 16:27:40.000000000 +0900
@@ -6,4 +6,4 @@ hello, vim
 hello, vim
 hello, vim
 hello, vim
-hello, vim
+hello, vim...!!!!

14. patch

  • patch file (diff 의 결과물)을 파일에 적용한다.

자주 사용되는 옵션

  • -pNum

    • --strip=NUM

  • -i patchfile

    • --input-patchfile

  • --dry-run

    • 가상으로 실행(적용되지 않음)

    • 실행 결과만 출력한다.

  • --merge

    • conflict 발생시 merge

example

  • patch -p0 --dry-run < test.patch

  • patch -p3 -i test.patch

  • patch -p0 --merge -i test.patch

15. ctags

  • 소스코드를 분석하여 tag 를 파일로 저장

    • function 이나 variable 등을 tag 로 저장하여 vim 이 탐색하기 쉽도록 해준다.

    • ctags 가 없다면 vim 은 주석인지, 함수인지, 변수인지 구분해내지 못한다.

  • vim 등의 에디터에서 소스코드 탐색이 쉽도록 한다.

  • ctags [options] [files...]

자주 사용되는 옵션

  • -R : recurse

  • --exclude=[pattern]

example

  • ctags -R

  • ctags -R --exclude="drivers"

vim 연동 예제

  • 특정 tag 파일 지정

    • :set tags=../tags

  • 상위로 올라가며 tag 파일 지정

    • :set tags=./tags;/

  • tag 찾기

    • :tag rte_eal_init

  • 여러가지 tag 중 선택

    • :tselect rte_eal_init

    • :tselect main

  • 여러가지 tag 중 선택 + 검색

    • :ts /rte_eal_

  • 커서 위의 단어로 tag jump 단축키 : ctrl+]

    • :tj dump_info

    • 수정하기 전에 다른 키워드로 jump 하고 싶을 때

    • ctrl + w + ]

      • 창을 새로 열면서 태그 점프하면 수정된 내용을 저장하지 않아도 다른 키워드 있는 파일을 볼 수 있다.

  • tag jump 에서 되돌아오는 단축키 : ctrl+t

  • ctags --list-languages

    • ctags 에서 지원되는 언어 목록

16. cscope

  • 소스 파일을 분석하여 파일로 저장한다.

    • ctags 보다 파일이름, 함수 호출하는 곳 - 호출되는 곳 등 다양한 방법으로 검색이 가능하다.

  • 자체 사용자 인터페이스 사용이 가능하다.

  • vim 등의 에디터에서도 연동이 가능하다.

options

  • -b : 분석 파일만 빌드한다. vim 에서 연동하기 위해서 필요하다.

  • -R : recursive

example

  • find `pwd` -type f -name ".[ch]" > csope.files

    • 현재 디렉토리에서 이름이 .ch 로 끝나는 타입의 파일들에 대해서 검색한다.

  • cscope -b

  • cscope -R

interactive mode

  • cscope -R

  • find this C symbol : symbol 검색. 원형, 함수 호출하는 부분을 포함한다.

  • find this global definition : 함수 선언부

  • find functions called by this function : 입력한 함수가 호출하는 함수를 검색

  • find functions calling this function : 입력한 함수를 호출하는 부분을 검색

  • find this text string : text 검색

  • change this text string : 텍스트 대체

  • find this egrep pattern : extended regex pattern 으로 검색

  • find this file : 파일 이름 검색

  • find files #including this file : 특정 파일을 #include 하는 부분 검색

  • find assignments to this symbol : 심볼에 해당하는 부분을 검색

vim 연동 예제

  • : set cscopetag

    • ctag 파일 대신에 ctrl+] 로 tag jump 한다.

  • :cscope (add, find, help, kill, reset, show)

    • a : 심볼에 해당하는 부분 검색

    • c : 이 함수를 호출하는 부분 검색

    • d : 이 함수가 호출하는 함수 검색

    • e : extended regex pattern 으로 검색

    • f : 파일 이름 검색

    • g : 함수 선언부

    • i : 특정 파일을 $include 하는 부분 검색

    • s : symbol 검색 (원형, 함수 호출하는 부분 포함)

    • t : text 검색

17. strace

  • system call 과 signal 을 trace 한다.

  • 어플리케이션을 개발하다보면, 알게모르게 app - linux kernal 사이를 자주 왔다갔다 한다. -> systeml call

option

  • -p : pid 지정. 동작 중인 프로세스에 attach 한다.

  • -f : 생성되는 thread 도 trace 한다.

  • -tt : timestamp 를 같이 출력한다.

  • -o : stdout 대신 입력받는 파일에 저장한다.

example

  • strace ls

  • strace -tt ls

  • strace -tt -o output ls

  • strace -p 1234

    • strace -p `pidof [실행중인 파일 이름]`

Last updated