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 : ”, __func__, __LINE__);<ESC>
▪
normal mode 에서 F8 누르면 아래 줄에 printf() 출력한다.
◦
:imap <F8> printf(“%s %d line: ”, __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”);<ESC>
▪
F8을 누르면 hello 를 츨력하고 개행한다.
10. 유용한 기능들
vim [file1] [file2] -d
•
자동완성 : 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 dir_a dir_b
◦
urNp
•
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...!!!!
Plain Text
복사
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 [실행중인 파일 이름]`