Translate

2015년 4월 2일 목요일

[Linux/Unix] Vim(vi) 고급 기능 소개



평소 vi를 자주 사용하는 편인데 아무래도 쓸일이 많다보니 vi책을 읽어보니 꽤 좋은 내용들이 많았다.

제목에는 고급기능이라고 달았지만 사실 vi스크립트를 만드는 그런 강좌는 아니고..
그냥 메모장 정도의 기능만 사용하는 분들을 위한 참고글이 되겠다.

아래는 내가 자주 사용할 만한 유용한 기능들을 소개를 해본다.





1. 비주얼 모드 (Visual Mode)

IT로 밥먹고 사는 윈도우 사용자중에 울트라에디트(UltraEdit)를 모르는 사람이 있을까..
울트라에디트 툴 자체가 기능이 많고 강력하기에 많이 쓰기도 하지만 주위에서는 아래의 이미지와 같이 열편집이 가능하기 때문에 쓰는 분들을 몇분 보았다. (최근에는 Sublime Text 가 유행..)

Sublime Text 에서의 열편집 기능




하지만 vim 에는 비주얼모드 라는 기능이 있어서 다음과 같이 열편집이 가능하다.
커맨드: <CTRL+V>

Vim 에서의 열편집 기능


위와 같은 상태에서 다음과 같은 기능이 가능하다.
1. 'x' 입력 시 해당영역 삭제
2. 'y' 입력 시 해당영역 복사
3. ':w test.txt' 입력 시 해당영역 test.txt 파일로 저장
4. 'shift+i' 입력 후 문자열 입력 시 해당영역 앞에 모두 같은 문자 입력








2. 문자열 교체 (Replace String)

vi를 좀 써본 사람들은 대부분 알고 있겠지만 좀 더 편리한 기능을 소개하려 한다.
일반적인 문자열교체 방법은 다음과 같다.

:%s/{원본문자열}/{교체할문자열}/g

하지만 문자열에 구분자(/)가 포함된 경우 다음과 같이 작업해야 한다.
:%s/\/opt\/util\/java/java/g



구분자(/)가 많아질 수록 가독성이 나빠져서 불편해진다.
그런경우 아래와 같이 문자열교체가 가능하다.
(아래의 두 결과는 동일하다.)

 :%s/\/opt\/util\/java/java/g
 :%s,/opt/util/java,java,g








3. 특수문자 교체

윈도우의 줄넘김: \r\n
유닉스의 줄넘김: \n

위의 문제로 유닉스에서 vi로 파일을 열게되면 종종 문자열 끝에 ^M 표시를 볼 수 있다.

많이들 알겠지만 교체방법은 :%s/^M//g 또는 :%s/\r//g 라고 입력하면 없어진다.
(^M 입력방법은 <CTRL+V><CTRL+M> 을 눌러주면 된다.)



3-1 바이너리 모드 (Binary Mode)

지금까지 답답했던 것은 저런 특수문자가 보이지 않는 경우가 있었다는 건데..
저런 무시할 수 있는 특수문자라면 상관 없지만..
HP-UX나 AIX(IBM) 서버에서 XML 파일의 처음에 보이지 않는 BOM 특수문자가 들어가서 Application 을 구동 시 문제가 되었던 적이 몇번 있었다.
그때마다 해당 파일을 내려받아서 울트라에디터로 헥사모드로 보기로 변경 후 해당 문자를 지워준 후 서버에 업로드를 했었는데 그럴 필요가 없었다.

바이너리모드로 파일을 열게되면 특수문자가 보이게 된다.
방법은 아래와 같이 둘중에 아무것이나 사용하면 된다.

1) vim -b 파일명
2) :set binary








4. 창 분할

알고는 있지만 탭을 열거나 창을 여러개 열 수 있다보니 자주 사용하지는 않는 기능..
가끔 유용하게 쓰일일이 있긴 하지만 자주 쓰지는 않는다.


수평분할: <CTRL+W> s or :sp {file_name}


수직분할: <CTRL+W> v or :vs {file_name}


창 사이 이동하기: <CTRL+W> 방향키(or h,j,k,l)

창 크기 조정하기
<CTRL+W> = : 모든창의 크기를 동일하게 조절

<수평분할인 경우>
<CTRL+W> [#]+ : #크기만큼 선택된 창의 크기를 키운다.
<CTRL+W> [#]- : #크기만큼 선택된 창의 크기를 줄인다.

<수직분할인 경우>
<CTRL+W> [#]> : #크기만큼 선택된 창의 크기를 키운다.
<CTRL+W> [#]< : #크기만큼 선택된 창의 크기를 줄인다.








5. 탭 페이지

창분할을 하게되면 화면이 반으로 줄다보니 나같은 경우는 탭열기를 많이 사용한다.
물론 지금까지 사용한건 vi기능이 아니라 터미널 기능이었지만서도;;

새로운 파일로 탭 열기: :tabnew
파일을 탭으로 열기: :tabedit filename
탭 닫기: :tabclose

다음 탭으로 이동: gt
이전 탭으로 이동: gT


PS.
탭 이동 시 <CTRL+PageUp> 또는 <CTRL+PageDown> 기능이 지원을 하지만
OS또는 툴 자체에서 사용하는 경우가 많아 vim에서 지원이 되지 않을 수 있다.








6. 파일 내용 비교하기

diff 명령어를 이용해 파일 비교를 할 수 있는 것은 알고 있었지만 vim을 이용해서 하는것은 비교적 최근이다.

$ vim -d {file1} {file2}









7. 디렉토리 탐색하기


디렉토리 탐색하기: :e {directory}
ex) :e .  (현재 디렉토리 탐색)









8. 파일인코딩 변환

인코딩이 맞지 않아서 이미 읽어들인 파일의 한글이 깨졌을 경우 다음과 같이 인코딩을 변경해서 올바르게 나오게 한다. (예전에 많이 써먹던 방법)

:e ++enc={encoding}

ex)
:e ++enc=utf-8
:e ++enc=euc-kr



여러 서버에서 작업을 했던터라 써보지는 않았지만 아래와 같이 셋팅 시 위의 작업이 필요가 없다고 한다.

.vimrc 파일 수정
set fencs=utf-8,korea,euc-kr








9. 들여쓰기 재정렬

소스를 붙여넣다보면 아래와 같이 앞에 탭이나 공백없이 붙어있거나 계단형식으로 소스가 붙게되는 경우가 있다.





다음과 같이 작업을 하면 자동으로 들여쓰기가 되어 이쁘게 보여지게 된다.
1. gg  (문서의 처음으로 이동)
2. =G  (현재줄부터 문서의 마지막줄까지 들여쓰기 작업)



댓글 2개 :

  1. 들여쓰기 중 제가 가장 즐겨쓰는 명령은 { } 로 묶인 문단 단위로 들여쓰기는 맞추는 것인데요...
    { 또는 } 에 커서를 위치시키고 =a{ 또는 =a} 를 입력하면 그 문단에 포함된 부분문 들여쓰기를 예쁘게 맞춰줍니다.
    소스파일 전체를 들여쓰기 맞추는 것도 필요하지만, 문단별로 맞추는 게 개발자에겐 더 필요하더군요.

    답글삭제
    답글
    1. 좋은정보 알려주셔서 고맙습니다.
      해보니 { 또는 } 에 맞출 필요는 없고 아무데서나 하면 되는데 커서가 있는 위치의 상위 {} 영역부터 최하위영역까지 모두 맞춤이 되네요.
      저같은 경우에는 Vue.js 프레임워크의 파일이 파일하나에 HTML과 Javascript 가 동시에 있는데 이런경우에 유용하게 사용이 가능할 듯 합니다. ^^

      삭제