2005/07/06 15:28에 이글루스 블로그에 적었던 글이다.
작성일: 1998년 4월 26일
작성자: 안창선(csan@coresw.co.kr, http://genesis.yonsei.ac.kr/~kabin --> http://kldp.org/~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/
위의 명령은 라인의 처음에 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로 지정한 위치의 라인,열로 현재의 위치를 옮긴다.
`` 위치를 옮긴 후에 바로 전에 지정한 위치나 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을 포함
----------------------------------------------------------------------
10. 임시 영역이 꽉찰 경우 응급조치
임시영역이 넘쳐서 vi에디터가 제대로 작동하지 않는 경우가 있다. 이때는 임시영역의 위치를 바꾸어 주면 정삭적으로 편집작업을 할 수 있다. set명령으로(쉘에서) directory변수의 위치를 바꾸어 이 일을 할 수 있다.
$ set directory=/usr/fly/vitemp
만약 위의 명령을 vi내에서 하길 원한다면 위의 명령을 vi에서 사용한 후에 :e command를 사용하면 편집중이 모든 파일의 임시디렉토리가 바뀌어질것이다.
또한 EXINIT환경변수의 값을 바꾸어 이 일을 할 수도 있다.
setenv EXINIT 'set directory=/usr/fly/vitemp'
11. map을 이용해 타이핑을 줄이자.
map명령은 명령 모드에서의 map명령과 입력 모드에서의 map명령의 두가지가 있다.
* 명령모드 map
명령 설명
--------------------------------------------------------------
map x sequence x를 sequence로 지정
unmap x x를 unmap
map 현재 map된 문자들을 보여준다.
--------------------------------------------------------------
위의 map명령을 .exrc파일에 넣어 두면 차후에 편하게 쓸 수가 있다. 위의 명령중에 x부분에 해당하는 키는 명령모드에서 사용되지 않는 것을 선택하여 정의 하여야 하며 이에 해당하는 것에는 다음과 같은 문자셋이 있다.
문 자: q K q V v
제어문자: ^A ^K ^O ^T ^W ^X
기 호: _ * =
(위에서 =는 VI가 lisp모드일 경우에 사용되므로 이때는 사용해서는 안된다.)
기본적인 사용예는 다음과 같이 사용될 수 있다.
map v dwwP
이와같이 정의해 두거나 ex모드(:상태)에서 위의 명령을 입력하면 'v'키를 입력함으로써 dwwP에 해당하는 명령이 실행된다. 즉 v키는 현재워드를 삭제(dw)하고 그 삭제된 워드를 현재 워드의 다음워드에 복사하게 된다.(즉 현재 워드와 다음워드의 자리바꿈)
또한 한 문자의 정의 뿐만 아니라 두글자 이상으로 map을 정의 할 수도 있다. 다음의 예를 보자.
map *s Ea'^[Bi'^[
map *d Ea"^[Bi"^[
위의 명령은 *s키를 입력하여 Ea'^[Bi'^[에 해당하는 명령을 실행하게 된다. 여기서 ^[가 의미하는 실제 여러분이 입력해야 할 키는 CTRL-V를 누른 다음 ESC키를 누른것을 의미한다.
또한 위의 명령을 설명하자면 다음과 같다.
Ea'^[Bi'^[ ==> 현재 단어의 앞 뒤로 '를 삽입하는 명령
Ea"^[Bi"^[ ==> 현재 단어의 앞 뒤로 "를 삽입하는 명령
또한 Function키를 등록 할 수도 있다. 예를 들어 F1키를 한 단어 삭제로 사용할 수도 있다.
map #1 dw ==> F1키를 한 단어를 삭제하는 키로 등록
* 입력모드 map
입력 모드에서의 map은 명령모드의 맵이 map명령으로 이루어 지는데 반해 map!이 사용된다는 차이가 있다.
입력 모드에서의 map은 다음과 같은 형식으로 사용될 수 있다.
:map! ^ ^[OCRAZYFLY:^[jA
위의 명령은 입력 모드에서 ^(caret)를 입력하면 ESC를 누른 다음 현재라인의 윗쪽에 한 라인을 삽입(O)하고 그 위치에 CRAZYFLY:라고 입력한 후에 ESC를 누르고 그 다음 라인으로 옮기고(j) 그 행의 맨 뒤에 입력을 계속 한다라는 의미이다.
12. 입력모드에서 방향키를 사용하자.
DOS사용자를 위해 명령모드와 입력 모드의 전환을 편리하게 하기 위해 입력 모드에서 방향키(up, down, left, right)를 누르면 그에 해당하는 행동을 하게 해주는 것을 map명령을 통해 할 수 있다.
물론 위의 키들이 다음의 코드를 나타낸 다는 것을 알아야 할 것이다.
키 코드 VI코드
---------------------------------------------------------
up ^[[A ^[ka
down ^[[B ^[ja
left ^[[D ^[hi
right ^[[C ^[la
---------------------------------------------------------
이를 map명령으로 나타내면 각각 다음과 같다.
-------------------------------------------------
map! ^[[A ^[ka
map! ^[[B ^[ja
map! ^[[D ^[hi
map! ^[[C ^[la
-------------------------------------------------
* 현재 커서가 위치한 단어 찾기 (앞방향)
# 현재 커서가 위치한 단어 찾기 (역방향)
'Linux and Unix' 카테고리의 다른 글
명령어 실행 시간 측정하기 (0) | 2017.10.22 |
---|---|
VIM의 색상 파일에서 사용할 수 있는 색상값 (0) | 2017.10.22 |
Make Utility로 Makefile 만들기 (0) | 2017.10.22 |
파일을 열지않고 파일내의 특정 문자를 변경하기 (0) | 2017.10.22 |
DOS 파일포맷의 ^M 없애기 (0) | 2017.10.21 |