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
섹션에 따라서 내용이 나누어져 설명되어있다.
general commands
system call
library functions : C standard library
special files
file formats and conventions
games and screensavers
miscellanea
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
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