처음으로 리눅스 및 유닉스를 접하면서 다룬 편집기이며, 다루기도 복잡하지만 보편적인 편집기인 것 같다. 그래서 필수적으로 기본 명령어와 기본 설정정도는 알아둬야하는 것 같다.
1.1 VI,VIM의 기본설정
- VIM 설치
$ sudo apt-get install vim
- 탭사이즈 조절 및 Line Number 설정
$ 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
- CTAGS 추가 (./vimrc 변경)
$ 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
- CSCOPE 추가 (./vimrc 변경)
$ 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
- CSCOPE File 관련 생성
$ 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를 편집기 안에서 실행이 가능하다.
- 문자열 치환기능
pattern 내부에 /가 존재한다면 \을 이용하여 구분해줘야 한다.
:1,10s/old/new/g :
:3,$s/old/new/g : line3 부터 설정 끝까지 검색하고 치환
:s/old/new/g : 전체 치환
- 복사 및 이동
하지만 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 기준으로 다음줄로 이동
- 삭제기능
:5,10d : 5~ 10 line 삭제
- 검색기능
Normal Mode에서 원하는 단어 위치에서 '*' 지속적으로 누르면 그 단어를 계속 찾아준다.
동일한 기능으로 '/pattern' 하고 'n'을 지속적으로 누르면 이를 지속적으로 찾는다.
define 찾기의 예제
'/define' 입력 후 n 지속적입력 아래로 검색 'N' 반대방향
'?define' 입력 후 n 지속적입력 위로 검색 'N' 반대방향
- 뒤줄에 특수문자 "," 추가
//1~10 line에 , 추가
:1,10s/$/\,/g
//전체 추가
:%s/$/\,/g
- 앞줄에 추가 "foo:" 추가
:%s/^/foo: /
2.3 Command 확장
vi가 window 처럼 이용이 되고 window의 다른 editor처럼 편하다면 좋겠지만, 이를 유사하게 사용이 가능하다.
- Window 처럼 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
- 창 분할
:split 파일명 // 세로 창 분할 위아래 분할 :vs 파일명 // 가로 창 분할 좌우 분할 //Ctrl+w를 누른 후 w 창이동
- 창분할 의 고급 (탐색기 처럼사용)
:30vs./ : 30은 세로창의 사이즈이며, ./ 디렉토리 열어 탐색기처럼 사용하여 File open :split./ : 가로창을 현재 디렉토리 열어 탐색기처럼 사용하여 File open
- HEX Editor (현재 많이 이용중)
:!%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에서 도구->단축버트모음
별도저장 및 다른 기능을 저장