1. VI 편집기
처음으로 리눅스 및 유닉스를 접하면서 다룬 편집기이며, 다루기도 복잡하지만 보편적인 편집기인 것 같다. 그래서 필수적으로 기본 명령어와 기본 설정정도는 알아둬야하는 것 같다.
1.1 VI,VIM의 기본설정
$ sudo apt-get install vim
$ vi ~/.vimrc
set ts=4
set nu
set ruler
set title
" "주석
set ts=4 : tab size 설정
set nu : set number 좌측에 line number 표시
set ruler : 현재 cursor 위치 표시
1.2 소스분석시 필요한 설정
$ sudo apt-get install ctags cscope
$ vi ~/.vimrc
set tags=./tags,tags "
set tags +=~/qtwork/kernel/tags
"set tags+=~/am437x/works/board-support/u-boot-2014.07+gitAUTOINC+fb6ab76dad-gfb6ab76/tags
"set tags+=~/dm368/mt5/Source/dvsdk_ipnctools/ipnc_psp_03_21_00_04/kernel/tags
$ vi ~/.vimrc
set csprg=/usr/bin/cscope
set csto=0
set cst
set nocsverb
if filereadable("./cscope.out")
cs add cscope.out
else
cs add /usr/src/linux/cscope.out
endif
set csverb
$ vi mkcscope.sh
#!/bin/sh
rm -rf cscope.files cscope.files
find . \( -name ‘*.c’ -o -name ‘*.cpp’ -o -name ‘*.cc’ -o -name ‘*.h’ -o -name ‘*.s’ -o -name ‘*.S’ \) -print>cscope.files
cscope -i cscope.files
상위와 같이 실행하면, 자동으로 cscope가 실행이 되는데, 이때
ctrl+z 로 나가면 된다.
2. VIM의 모드구성
Normal Mode가 Default 이며, 다른모드에서 ESC를 클릭시 Normal로 돌아온다.
- Normal Mode : vi로 file open 했을 경우 처음 기본모드 (default)
- Insert Mode : Normal 에서 'i' , 'a', 'o', 's' 입력시 편집가능
- Visual Mode : Normal 'v'
- Command 이용 및 sed와 유사한 기능 실행
Normal Mode는 ':'를 이용하여 Command가 실행이 가능하며, sed와 같은 script도 가능하다
'/' 를 이용하여 정의하고 검색도 가능하다
https://wiki.kldp.org/KoreanDoc/html/Vim_Guide-KLDP/Vim_Guide-KLDP.html
http://idkwim.tistory.com/66
2.1 단축키 생성 및 치환기능
Visual 모드에서 아래와 같이 각각의 명령을 이용하여 vi 내부에서 사용되는 기본명령 및 다른 기능들을 단축키로 대체 가능하다.
솔직히 거의 잘 사용하지 않으며, 그냥 알아두기만 하고 추후 사용할 일 있으때 그때보자.
nmap, map, vmap, imap,
일단 nmap에 대해 간단히 알아보자.
위의 visual mode에서 아래와 같이 실행을 해보자.
:nmap - dd
:nmap \ -
위와 같이 실행을 하면, - 키를 입력하면 자동으로 dd가 실행이되어 한줄이 삭제된다.
\ 키를 입력을 하여도 동일하다.
nmap은 명령어를 mapping 시켜준다.
아래와 같이 실행을 하면, 위에서 mapping 했던 설정이 제거된다.
:nunmap -
:nunmap \
ex) :map _ ddp
'_'를 누르면 해당 줄을 아래로 내림
하지만 입력모드에서 언더스코어는 코딩할 때 자주 쓰이므로, 노멀모드에서만 동작하도록 해야 합니다. 이 때는 모드의 머릿글자+map 으로 동작 범위를 제한할 수 있습니다.
ex) :nmap _ ddp
그런데 만약, p 키를 다른 명령에 맵핑했다면 어떻게 될까요. _ 를 누르면 현재 줄을 삭제하고 p에 할당된 작업을 수행합니다. 따라서 맵핑을 작성할 때는 키시퀀스에 할당된 기능이 아닌 맵핑된 기능만을 처리하도록 해야 합니다.
:noremap _ ddp
noremap 은 키 시퀀스에 맵핑된 기능이 있어도 무시하고 디폴트 기능만을 수행하도록 합니다. 역시 모드의 머릿글자와 덧붙여서 조합이 가능합니다.
그러면 noremap 은 언제 사용해야 할까요? 언제 어떤 맵핑을 추가할지 모르니, "항상" 이렇게 사용해야 합니다.
:help nmap
관련 Manual
http://learnvimscriptthehardway.stevelosh.com/chapters/05.html
http://sunshowers.tistory.com/61
http://jaeheeship.github.io/console/2013/11/15/vimrc-configuration.html
2.2 Command 기본실행
Normal Mode에서 ':' 을 실행을 하면 sed와 같은 script 구사가 쉽게 가능하며,
':!'를 이용하여 Linux Command를 편집기 안에서 실행이 가능하다.
기본기능은 sed와 동일하게 s/pattern/pattern/g g는 전체의 의미
pattern 내부에 /가 존재한다면 \을 이용하여 구분해줘야 한다.
:1,10s/old/new/g :
:3,$s/old/new/g : line3 부터 설정 끝까지 검색하고 치환
:s/old/new/g : 전체 치환
Normal Mode에서 기본복사는 'yy' or '5yy' , 1줄 or 5줄 복사 하고 원하는 곳에 'p' 붙혀넣기 동작이다.
하지만 Command 이용하여 복사가 아래와 같이 가능하다.
아래의 실행하기전에 : se nu로 line의 소스의 숫자를 확인하자.
: 1,5 co 7 : 1 ~5 을 line 7 기준으로 다음줄에 복사
: 1,5 t 7 : 1 ~5 을 line 7 기준으로 다음줄에 복사
: 2,4 m 7 : 2 ~4 을 line 7 기준으로 다음줄로 이동
Normal Mode에서 기본복사는 'dd' or '5dd' , 1줄 삭제 or 5줄 삭제가 가능하지만, Command를 이용하여 가능하다.
:5,10d : 5~ 10 line 삭제
Normal Mode에서 원하는 단어 위치에서 '*' 지속적으로 누르면 그 단어를 계속 찾아준다.
동일한 기능으로 '/pattern' 하고 'n'을 지속적으로 누르면 이를 지속적으로 찾는다.
define 찾기의 예제
'/define' 입력 후 n 지속적입력 아래로 검색 'N' 반대방향
'?define' 입력 후 n 지속적입력 위로 검색 'N' 반대방향
//1~10 line에 , 추가
:1,10s/$/\,/g
//전체 추가
:%s/$/\,/g
:10,20s/^/foo: /
:%s/^/foo: /
2.3 Command 확장
vi가 window 처럼 이용이 되고 window의 다른 editor처럼 편하다면 좋겠지만, 이를 유사하게 사용이 가능하다.
vi 내부에서 여러문서를 읽고 편집하기위해서 tab 기능을 사용하며, 상위에 tab이 표시된다.
: tabnew test.c : 새로운 탭(문서창)을 작성한다. ,
: tabnext : 다음 탭(문서창)을 보여준다.
: tabprev : 이전 탭(문서창)을 보여준다.
: tabclose : 현재 탭(문서창)을 닫는다.
각 tab의 제거는 q! or x(save하고 exit) or tabclose 이지만 귀찮다.
위 명령은 길어서 사용하기 힘들다면, vi ~/.vimrc 열어 단축 단어 설정하자.
$ vi ~/.vimrc
nmap th :tabprev
nmap tl :tabnext
nmap tn :tabnew
nmap tc :tabclose
http://vim.wikia.com/wiki/Using_tab_pages
Tab기능과 별도로 현재의 창을 분할하여 File을 열고 닫을수도 있다.
:split 파일명 // 세로 창 분할 위아래 분할
:vs 파일명 // 가로 창 분할 좌우 분할
//Ctrl+w를 누른 후 w 창이동
앞에 숫자를 넣으면 창의 크기가 결정이 되며, File 명 대신 Directory를 선택시 탐색기로이용
:30vs./ : 30은 세로창의 사이즈이며, ./ 디렉토리 열어 탐색기처럼 사용하여 File open
:split./ : 가로창을 현재 디렉토리 열어 탐색기처럼 사용하여 File open
:!%xxd
:!%xxd -r
3. Xshell 설정의 단축버튼설정
Xshell에는 총 12개의 단축버튼이 있으며, vim을 사용할때 이 단축버튼을 각각의 기능에 연결하여 CTAGS/CSCOPE 사용하자.
VIM에서 사용하는 CTAGS/CSCOPE 기능
:tj //TAG 검색
:sts tj //새창 검색
:tn //다음태그
:tp //이전태그
:tags //태그 히스토리
:cs find c // 부른함수
:cs find d // 불려진함수
:cs find s // C심볼
:tabnew // 새창
:tabnext // 다음탭
:tabprev // 이전탭
:tabclose // 탭닫기
단축버튼을 만들 경우 반드시 CR을 확인하자 (new line)
Xshell에서 도구->단축버트모음
별도저장 및 다른 기능을 저장