작은숲:위키노트/Vi 팁
Copy&Paste 할 때 들여쓰기 금지
마우스로 붙여넣기를 할 때 autoindent 나 textwidth 등이 작동해 버려서 원하지 않는 들여쓰기가 되는 것을 막으려면:
set paste
한 후에 붙여넣기를 하고
set nopaste
를 하여 계속 작업하면 된다.
set pastetoggle=<Ins>
이렇게 설정하면, Ins를 누를 때마다 paste 와 nopaste 상태가 전환된다. (명령 모드, 입력 모드 둘 다에서 사용 가능하다.)
Folding 기능 사용
들여쓰기를 기준으로 접을 경우.
set foldmethod=indent
zi– 접는기능 사용 토글zv– 커서 줄 보기zo– 부분 펴기 (혹은 화살표키)zc– 부분 접기zM– 모두 접기zR– 모두 펴기
창 나누기
:sp <file name>– 가로로 나뉜 창 열기. <file name>이 없을 경우 새 파일을 여는 것과 동일하다.:vs– 세로로 나뉜 창 열기^ww– 창 사이 이동.^wt,^wb– 열린 창의 Top과 Bottom으로의 이동.^wj,^wk– 창의 위, 아래로 이동할 수 있게 합니다.^wc– 활성 창을 닫는다.^w_– 활성 창을 최대화한다.20^w_– 활성 창의 높이를 20줄로 한다.^w+– 활성 창의 높이를 한줄 늘인다.^w-– 활성 창의 높이를 한줄 줄인다.^w=– 모든 창을 같은 크기로.:res15– 활성 창의 크기를 15로.
한 파일의 일부분을 다른 파일로 복사하기
"f4yy– 현재 줄부터 4 줄을 'f'라는 이름의 버퍼에 복사한다.:w– 편집 중인 파일을 저장한다.:e–newfile새로운 파일을 로드한다."fp– 새로운 파일의 현재 줄 위치에 'f'라는 이름으로 저장해 두었던 내용을 복사한다.
vi가 기억하는 두 가지 파일명(%, #)
vi 에디터에서 파일 편집을 할때 사용하는 두가지 ex 명령이 있다. 다음의 예를 보자.
:e file1 file2
위의 명령을 실행하면 file1을 편집하고 있는 상태가 되게 된다. 이 상태에서 :n 을 입력하면 file2를 편집하게 된다. 이때 다음을 입력해보자.
:e#
이 명령을 입력하면 VI는 다시 file1을 편집하게 되고, 이때 다시 :e#를 입력하면 file2를 편집하게 된다. 만약 이때 또 다시 :e#를 입력하게 되면 file1을 편집하게 된다. 즉 #의 뜻은 '선택적인 다른 하나의 파일'을 뜻하게 된다는 것이다.
또한 %의 뜻을 알아보자. %는 현재의 파일명을 뜻할 수 있다. 다음을 입력해보자.
:w %.new
이 명령을 현재 편집중인 파일을 그 파일에 .new 를 더한 이름으로 파일을 다시 저장하게 된다. 즉 위의 명령을 입력할 때 편집 중이던 파일명이 filename 이었다면 위의 명령으로 저장되는 파일은 filename.new 라는 파일이 된다.
찾기 패턴과 글로벌 명령
찾기 패턴
:/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을 찾아 화면에 출력해준다.:g!/pattern/nu– 파일에서pattern이 없는 줄을 찾아 줄 번호를 출력해 준다. 이것을 이용해pattern이 나타나는 횟수를 카운팅 할 수 있다.:60,124g/pattern/p– 60에서 124 줄까지pattern을 찾아 출력해준다.
또한 글로벌 명령은 다음과 같이 대치 명령과 같이 쓰일수 있다.
:g/^WARNING:/s/\<not\>/NOT/
위의 명령은 줄의 처음에 WARNING: 으로 시작하는 줄을 찾아서 그 줄에 하나의 단어(양쪽에 공백으로 존재하거나 양쪽에 TAB이나 newline등이 있는)로 존재하는 not이 있을 경우에 이것을 NOT으로 교체하라는 명령이다.
파일의 일부분만 저장
:230,$w newfile– 230 줄부터 끝까지newfile로 저장.:.,600w newfile– 현재 줄부터 600 줄까지newfile로 저장
패턴명령을 통해 블럭을 옮기기
:g/SYNTAX/,/DESCRIPTION/-1 mo /PARAMETERS/-1
위 명령은 SYNTAX가 처음 발견되는 위치부터 DESCRIPTION이 발견되는 위치의 바로 전 줄까지를 PARAMETERS가 발견되는 바로 전 줄으로 옮긴다는 뜻이다.
위치 지정해 놓기
mx– 현재의 위치를x라고 지정해 놓는다.(x 는 숫자이면 안된다.)'x–x로 지정한 위치의 줄으로 현재의 위치를 옮긴다.`x–x로 지정한 위치의 줄, 열로 현재의 위치를 옮긴다.``– 위치를 옮긴 후에 바로 전에 지정한 위치나 context의 정확한 위치로 돌아간다.''- 바로 전에 지정한 위치나 context 줄의 시작으로 돌아간다.
텍스트를 유닉스 명령으로 필터링하기
편집중인 내용을 유닉스 명령으로 필터링할 수 있다. 예를 들어 1 줄부터 10 줄까지를 유닉스 명령인 sort를 통해 정렬할 수도 있고 특정 블럭을 특정 사람에게 메일로 보낼 수도 있다. 다음과 같은 형식으로 사용된다.
:1,99!sort– 1 줄부터 99 줄까지를 유닉스의sort명령에게 보내 글 결과 값으로 대치한다.!)command– 전체 줄을command에게 보내 그 결과 값으로 대치한다.!!command– 현재 줄을command에게 보내고 그 결과 값으로 대치한다.4!!command– 현재 줄부터 4 줄을command에게 보내 글 결과로 대치한다.
단축키 사용
: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 파일로 저장하게 되는 것이다.
복사 삭제 및 줄 모드, 문자 모드 명령
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)
임시 영역이 꽉찰 경우 응급 조치
임시 영역이 넘쳐서 vi 에디터가 제대로 작동하지 않는 경우가 있다. 이때는 임시 영역의 위치를 바꾸어 주면 정상적으로 편집 작업을 할 수 있다. set 명령으로(셸에서) directory 변수의 위치를 바꾸어 이 일을 할 수 있다.
$ set directory=/usr/fly/vitemp
만약 위의 명령을 vi 내에서 하길 원한다면 위의 명령을 vi에서 사용한 후에 :e command를 사용하면 편집 중이 모든 파일의 임시 디렉토리가 바뀌어질 것이다. 또한 EXINIT 환경 변수의 값을 바꾸어 이 일을 할 수도 있다.
setenv EXINIT 'set directory=/usr/fly/vitemp'
map을 이용해 타이핑을 줄이자
map 명령은 명령 모드에서의 map 명령과 입력 모드에서의 map 명령의 두 가지가 있다.
명령모드 map
map x sequence–x를sequence로 지정unmap x–x를 unmapmap– 현재 map된 문자들을 보여준다.
위의 map 명령을 .exrc 파일에 넣어 두면 차후에 편하게 쓸 수가 있다.
위의 명령중에 x 부분에 해당하는 키는 명령 모드에서 사용되지 않는 것을 선택하여 정의하여야 하며 이에 해당하는 것에는 다음과 같은 문자셋이 있다.
- 문자:
qKVv - 제어문자:
^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
입력모드 map
입력 모드에서의 map은 명령 모드의 맵이 map 명령으로 이루어지는데 반해 map!이 사용된다는 차이가 있다.
입력 모드에서의 map은 다음과 같은 형식으로 사용될 수 있다.
:map! ^ ^[OCRAZYFLY:^[jA
위의 명령은 입력 모드에서 ^(caret)를 입력하면 ESC를 누른 다음 현재 줄의 윗쪽에 한 줄을 삽입(O)하고 그 위치에 CRAZYFLY:라고 입력한 후에 ESC를 누르고 그 다음 줄으로 옮기고(j) 그 행의 맨 뒤에 입력을 계속 한다라는 의미이다.
입력 모드에서 방향키를 사용하자
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
다른 명령들
:! cmd– 에디터 안에서 셸 명령을 수행하고자 할 때:sh– 셸로 잠시 나가기, 돌아올 때는exit~– (tilde or 'wavy'), 대문자를 소문자로 소문자를 대문자로 교환%– 한 줄 안에서(, ), {, }, [, ]를 검색mx– 문자x에 현재 위치를 표시d'x– 문자x에 표시된 위치부터 현재 커서 위치까지 삭제^V– 제어 문자를 입력할 수 있도록 함 (e.g.,^L)?string–string패턴을 현재 위치의 앞에서 찾기:n,m w file–n줄에서m줄까지 내용을file이라는 이름으로 저장. (e.g., 15,25 w file)J– JOINS, 커서가 있는 줄과 다음 줄을 합치기.:set ai– 에디터가 자동적으로 들여쓰기 탭(insert tabs)을 삽입.:set list– 특수 문자(special characters)를 보여줌. (i.e., non-printable characters):set ts=n– 탭 입력을 공백 몇 자로 표현할 것인지 설정.:set nu– 줄번호를 나타나게 함.
같이 보기
참고 자료
| 배포판 | |
|---|---|
| 서버 프로그램 | |
| 시스템 도구 | |
| 시스템 보안 | |
| 시스템 설정 | |
| HOWTO 문서 | |
| 사용자 설정 | |
| 활용 | |
| 명령어 | |