VI 에디터 120% 사용하기
작성일: 1998년 4월 26일
작성자: 안창선(csan@coresw.co.kr, http://genesis.yonsei.ac.kr/~kabin)
참고서적: O'Reilly Learning the vi Editor
Usenet net.unix
O'Reilly Unix Power Tools
1. 한 파일의 일부분을 다른 파일로 복사하기 명령 설명
----------------------------------------------------------------
"f4yy 현재라인부터 4라인을 'f'라는 이름의 버퍼에 복사한다.
:w 편집중인 파일을 저장한다.
:e newfile 새로운 파일을 로드한다.
"fp 새로운 파일의 현재 라인위치에 'f'란는 이름으로 저장해
두었던 내용을 복사한다.
----------------------------------------------------------------
2. VI가 기억하는 두가지 파일명(%, #) vi에디터에서 파일 편집을 할때 사용하는 두가지 ex 명령이 있다.
다음의 예를 보자.. :e file1 file2 위의 명령을 실행하면 file1을 편집하고 있는 상태가 되게 된다.
이 상태에서 :n 을 입력하면 file2를 편집하게 된다. 이때 다음을 입력해보자 :e# 이 명령을 입력하면 VI는 다시 file1을 편집하게 되고 이때 다시 :e#를
입력하면 file2를 편집하게 된다. 만약 이때 또 다시 :e#를 입력하게 되면
file1을 편집하게 된다. 즉 #의 뜻은 '선택적인 다른 하나의 파일'을
뜻하게 된다는 것이다. 또한 %의 뜻을 알아보자. %는 현재의 파일명을 뜻할 수 있다. 다음을 입력해
보자. :w %.new 이 명령을 현재 편집중인 파일을 그 파일에 .new를 더한 이름으로 파일을
다시 저장하게 된다. 즉 위의 명령을 입력할때 편집중이던 파일명이 filename
이었다면 위의 명령으로 저장되는 파일은 filename.new 라는 파일이 된다.
3. 찾기 패턴과 글로벌 명령 * 찾기 패턴 명령 설명
-----------------------------------------------------------
:/pattern/d pattern을 포함한 다음 라인을 삭제
:/pattern/+d pattern을 포함한 라인의 그 다음 라인을 삭제
(+d 대신 +1을 사용할 수도 있다.)
:/pattern1/,/pattern2/d pattern1을 찾은 곳부터 pattern2가 있는
위치 까지를 삭제
:.,/pattern/m23 현재라인부터 pattern이 있는 곳까지를
23라인 다음으로 옮긴다.
-------------------------------------------------------------
위에서 주의할 점이 있다. 즉 VI명령과 EX명령에서 약간 다르게
작동되는 면이 있다는 것이다. 즉
d/while 과 :.,/while/d 가 틀리게 작동된다는 것이데 전자는 while이 있는곳
전 라인까지 삭제되고 후자는 while이 발생된 라인까지 삭제가 된다. * 글로벌 명령 명령 설명
------------------------------------------------------------------
:g/pattern/ 파일에서 pattern이 찾아지는 마지막 위치로 이동
:g/pattern/p 파일에서 pattern을 찾아 화면에 print해준다.
:g!/pattern/nu 파일에서 pattern이 없는 라인을 찾아 라인 번호를
print해 준다. 이것을 이용해 pattern이 나타나는
횟수를 카운팅 할 수 있다.
:60,124g/pattern/p 60에서 124라인까지 pattern을 찾아 print해준다.
-------------------------------------------------------------------
또한 글로벌 명령은 다음과 같이 대치 명령과 같이 쓰일수 있다. :g/^WARNING:/s/\<not\>/NOT/ 위의 명령은 라인의 처음에 WARNING: 으로 시작하는 라인을 찾아서 그 라인에
하나의 단어(양쪽에 공백으로 존재하거나 양쪽에 TAB이나 newline등이 있는)로
존재하는 not이 있을 경우에 이것을 NOT으로 교체 하라는 명령이다.
4. 파일의 일부분만 저장 명령 설명
------------------------------------------------------------------
:230,$w newfile 230라인부터 끝까지 newfile로 저장
:.,600w newfile 현재라인부터 600라인까지 newfile로 저장
------------------------------------------------------------------
5. 패턴명령을 통해 블럭을 옮기기 :g/SYNTAX/,/DESCRIPTION/-1 mo /PARAMETERS/-1 위 명령은 SYNTAX가 처음 발견되는 위치부터 DESCRIPTION이 발견되는 위치의
바로 전라인까지를 PARAMETERS가 발견되는 바로 전라인으로 옮긴다는 뜻이다.
6. 위치 지정해 놓기. 명령 설명
------------------------------------------------------------------
mx : 현재의 위치를 x라고 지정해 놓는다.(x 는 숫자이면 안된다.)
'x x로 지정한 위치의 라인으로 현재의 위치를 옮긴다.
`x x로 지정한 위치의 라인,열로 현재의 위치를 옮긴다.
`` 위치를 옮긴 후에 바로 전에 지정한 위치나 context의 정확한
위치로 돌아감
'' 바로 전에 지정한 위치나 context 라인의 시작으로 돌아감.
------------------------------------------------------------------
7. 텍스트를 유닉스 명령으로 필터링 하기 편집중인 내용을 유닉스 명령으로 필터링 할 수 있다. 예를 들어 1라인부터
10라인까지를 유닉스 명령인 sort를 통해 sort할 수도 있고 특정 블럭을
특정사람에게 메일로 보낼 수도 있다. 다음과 같은 형식으로 사용된다. 명령 설명
-------------------------------------------------------------------
:1,99!sort 1라인부터 99라인까지를 유닉스의 sort명령에게 보내
글 결과 값으로 대치한다.
!)command 전체라인을 command에게 보내 그 결과 값으로 대치한다.
!!command 현재라인을 command에게 보내고 그 결과 값으로 대치한다.
4!!command 현재라인부터 4라인을 command에게 보내 글 결과로 대치한다.
---------------------------------------------------------------------
8. 단축키 사용 명령 설명
--------------------------------------------------------------------
:ab abbr phrase abbr을 phrase에 대한 단축키로 사용
:unab abbr abbr에 대한 단축키 설정을 해제
--------------------------------------------------------------------
명령으로 단축키 사용 명령 설명
---------------------------------------------------------------------
:ab aW w! /tmp/fly.tmp.a
:ab aR r /tmp/fly.tmp.a
:ab bW w! /tmp/fly.temp.b
:ab bR r /tmp/fly.temp.b
---------------------------------------------------------------------
위 처럼 설정을 해 놓은 다음에 :.,+45 aW 이렇게 명령을 내리면
현재라인부터 45라인까지를 /tmp/fly.tmp.a 파일로 저장하게 되는 것이다.
9. 복사 삭제 및 라인모드, 문자 모드 명령 명령 설명
---------------------------------------------------------------------
yy 1라인 버퍼에 저장
"fyy 1라인을 버퍼 f에 저장
dd 1라인 삭제(삭제된 내용은 버퍼에 저장됨)
2dd 2라인 삭제(삭제된 내용은 버퍼에 저장)
d$ 현 위치부터 그 라인의 끝까지 삭제
이때 $의 위치에는 문자 모드의 명령들이 모두 쓰일수 있음
예를 들어, d^, dfa, dG 등등
ddp 현재라인을 삭제하고 삭제되어 버퍼에 저장된 내용을 현재라이의
다음 라인에 복사(즉, 현재라인과 다음라인을 바꿈)
D d$와 같은뜻
C c$와 같은뜻(현재위치부터 라인의 끝까지 수정)
Y yy와 같은뜻
d'a 현재라인부터 a로 지정해 놓은 위치의 라인까지 삭제
d`a 현재라인부터 a로 지정해 놓은 위치의 라인,컬럼까지 삭제
c/pattern/ 현재라인부터 pattern이 나오는 위치까지의 모든 문자를
수정(라인모드가 아님)
c?pattern? pattern을 포함
<G 현재라인부터 편집중인 파일의 끝까지 indent삭제(dedent)
----------------------------------------------------------------------
10. 임시 영역이 꽉찰 경우 응급조치 임시영역이 넘쳐서 vi에디터가 제대로 작동하지 않는 경우가 있다.
이때는 임시영역의 위치를 바꾸어 주면 정삭적으로 편집작업을 할 수 있다.
set명령으로(쉘에서) directory변수의 위치를 바꾸어 이 일을 할 수 있다. $ set directory=/usr/fly/vitemp 만약 위의 명령을 vi내에서 하길 원한다면 위의 명령을 vi에서 사용한 후에
:e command를 사용하면 편집중이 모든 파일의 임시디렉토리가 바뀌어질것이다. 또한 EXINIT환경변수의 값을 바꾸어 이 일을 할 수도 있다. setenv EXINIT 'set directory=/usr/fly/vitemp'