2/26/2015

VI 편집기 수정중 (추후정리)

1. VI 편집기 

처음으로 리눅스 및 유닉스를 접하면서 다룬 편집기이며, 다루기도 복잡하지만 보편적인 편집기인 것 같다. 그래서 필수적으로 기본 명령어와 기본 설정정도는 알아둬야하는 것 같다.

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로 돌아온다.

  1. Normal Mode : vi로 file open 했을 경우 처음 기본모드 (default)
  2. Insert   Mode : Normal 에서 'i' , 'a', 'o', 's'  입력시 편집가능
  3. 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


  • 앞줄에 추가 "foo:" 추가 
:10,20s/^/foo: /

:%s/^/foo: /




2.3 Command 확장 

vi가 window 처럼 이용이 되고 window의 다른 editor처럼 편하다면 좋겠지만, 이를 유사하게 사용이 가능하다.

  • Window 처럼 Tab 기능 사용 
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

  • 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에서 도구->단축버트모음
별도저장 및 다른 기능을 저장


댓글 없음 :