작은숲:위키노트/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 문서 | |
| 사용자 설정 | |
| 활용 | |
| 명령어 | |