GNUEmacsManual:15

From 흡혈양파의 번역工房
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
파일 다루기

파일 다루기

운영체제는 파일(files) 에 영구적으로 데이터를 보관하므로 사용자가 Emacs로 편집하는 텍스트 대부분은 파일에서 와서 결국 파일로 보관된다.


파일을 편집하기 위해서는 Emacs에게 파일을 읽고 파일의 텍스트 사본을 포함하는 버퍼를 준비시킬 것을 알려야 한다. 이것을 파일을 방문한다고 한다. 편집 명령어는 버퍼 내 텍스트에 직접 적용되는데, 즉 Emacs 내부의 복사본에 직접 적용된다는 의미다. 변경내용은 사용자가 버퍼를 파일로 저장할 때에만 파일 자체에 나타난다.


파일을 방문하고 저장하는 것 외에도 Emacs는 파일을 삭제, 복사, 재명명, 뒤에 추가(append)하고, 여러 개의 버전을 보관하며, 파일 디렉터리에 작업한다.


파일명

파일에서 작업하는 다수의 Emacs 명령어들은 미니버퍼를 이용해 사용자에게 파일명을 명시하도록 요구한다(26 페이지의 5.2절 [미니버퍼 파일] 참고).


미니버퍼에 있는 동안 사용자는 일반적인 완성 및 히스토리 명령어를 이용할 수 있다(26 페이지의 5장 [미니버퍼] 참고). 파일명 완성은

completion-ignored-extensions

변수에 나타나는 확장자(extensions)를 가진 파일명을 무시한다(32 페이지의 5.4.5절 [완성 옵션] 참고). 대부분의 명령어는 파일명을 읽는 데에 "permissive completion with confirmation"을 사용하므로 사용자가 존재하지 않는 파일명을 제출할 수는 있으나 그러한 파일명을 완성한 직후에 RET 을 입력하면 Emacs가 '

[Confirm]

'을 출력하므로 두 번째 RET 을 입력해야만 승인이 됨을 주목한다. 상세한 내용은 30 페이지의 5.4.3절 [완성 종료]를 참고한다.


각 버퍼는 버퍼 로컬 변수

default-directory

에 보관된 기본 디렉터리를 갖는다. Emacs가 미니버퍼를 이용해 파일명을 읽을 때마다 보통 기본 디렉터리를 첫 내용으로 미니버퍼에 삽입한다. 이러한 삽입은

insert-default-directory

변수를

nil

로 변경하면 금지할 수 있다(26 페이지의 5.2절 [미니버퍼 파일] 참고). 그와 상관없이 Emacs는 항상 상대 파일명이 기본 디렉터리를 기준으로 한다고 가정하므로 디렉터리가 없는 파일명을 입력하면 기본 디렉터리 내 파일을 명시한다.


사용자가 파일을 방문하면 Emacs 는 방문하는 버퍼에서

default-directory

를 그 파일의 디렉터리로 설정한다. C-x b 와 같은 명령어를 통해 파일을 방문하지 않는 새 버퍼를 생성할 때는 당시에 현재 버퍼가 아닌 버퍼로부터 기본 디렉터리가 복사되는 것이 보통이다(147 페이지의 16.1절 [버퍼 선택하기] 참고). 현재 버퍼에서

default-directory

의 값을 확인하려면 M-x pwd 명령어를 사용할 수 있다. M-x cd 명령어는 디렉터리 명의 입력을 요하며, 버퍼의

default-directory

를 그 디렉터리로 설정한다(버퍼의 파일명이 존재한다 하더라도 이로 인해 변경되지 않는다).


예를 들어,

/u/rms/gnu/gnu.tasks

파일을 방문하면 기본 디렉터리는

/u/rms/gnu/

로 설정된다. 파일명을 읽는 명령어를 호출하여 디렉터리는 누락시킨 채로 미니버퍼에 '

foo

'만 입력하면

/u/rms/gnu/foo

를 명시하고, '

../.login

' 을 입력하면

/u/rms/.login

을, '

new/foo

' 를 입력하면

/u/rms/gnu/new/foo

라고 명시할 것이다.


파일명을 미니버퍼에 입력할 때 사용할 수 있는 단축키가 몇 가지 있다: 이중 슬래시는 "한 쌍의 슬래시 중에서 두 번째 슬래시 앞의 내용은 모두 무시하라"는 의미로 해석되고, '

~/

' 는 홈 디렉터리로 해석된다. 26 페이지의 5.2절 [미니버퍼 파일]을 참고한다.


'

$

' 문자는 환경 변수를 파일명으로 대체할 때 사용된다. 환경 변수의 이름은 '

$

' 다음에 모두 영숫자 문자로 구성되거나, '

$

' 다음에 중괄호 안에 위치시킬 수 있다. 예를 들어

{{{1}}}

라는 셸 명령어를 이용해

FOO

라는 환경 변수를 설정했다면

/u/$FOO/test.c

/u/${FOO}/test.c

모두

/u/rms/hacks/test.c

에 대한 축약어다. 환경 변수가 정의되지 않았다면 어떠한 대체도 발생하지 않으므로 '

$

' 문자는 그 자체를 의미한다. 환경 변수는 Emacs가 시작되기 전에 적용되어야만 Emacs에 영향을 미친다는 사실을 기억하자.


이름에 '

$

'가 포함된 파일로 접근하는데 '

$

'가 확장(expansion)을 야기하면 '

$$

'를 입력한다. 이 쌍은 단일 '

$

'에 대해 변수 대체가 실행되는 동시에 단일 '

$

'로 변환된다. 아니면 '

/:

'를 이용해 파일명 전체에 인용 부호를 붙인다(143 페이지의 15.14절 [인용된 파일명] 참고). 리터럴로 시작하는 파일명은 '

/:

' 인용 부호를 붙여야 한다.


파일명에 non-ASCII 문자를 포함할 수도 있다. 190 페이지의 19.11절 [파일명 코딩]을 참고한다.


파일 방문하기

C-x C-f 파일을 방문한다(

find-file

).


C-x C-r 파일의 변경을 허용하지 않고 보기 용도로 파일을 방문한다(

find-file-read-only

).


C-x C-v 마지막으로 방문한 파일 대신 그와 다른 파일을 방문한다(

find-alternate-file

).


C-x 4 f 파일을 다른 창에서 방문한다(

find-file-other-window

). 선택된 창에 무엇이 표시되는지는 수정하지 않는다.


C-x 5 f 파일을 새로운 프레임에서 방문한다(

find-file-other-frame

). 선택된 프레임에 무엇이 표시되는지는 수정하지 않는다.


M-x find-file-literally 내용 변환 없이 파일을 방문한다.


파일을 방문한다는 것은 그 내용을 Emacs 버퍼로 읽어 편집이 가능하도록 만드는 것이다. Emacs는 사용자가 방문하는 파일마다 새로운 버퍼를 만든다.


파일을 방문하려면 C-x C-f (

find-file

)를 입력하고 미니버퍼를 이용해 원하는 파일명을 입력한다. 미니버퍼에 있는 동안 C-g 를 입력하면 명령어를 취소할 수 있다. 미니버퍼에 파일명을 입력하는 것과 관련된 상세한 내용은 122 페이지의 15.1절 [파일명]을 참고한다.


명시한 파일이 존재하지만 시스템이 읽기를 허용하지 않으면 에코 영역에 오류 메시지가 나타난다. 그 외의 경우 화면의 새로운 텍스트 모양과 모드 행에 표시된 버퍼 명으로 C-x C-f 가 성공적으로 완료되었음을 알 수 있다(8 페이지의 1.3절 [모드 행] 참고). Emacs는 보통 디렉터리명은 누락하고 파일명에서 버퍼명을 구성한다. 예를 들어

/usr/rms/emacs.tex

파일은 '

emacs.tex

'라는 버퍼에서 방문된다. 해당 이름으로 된 버퍼가 이미 존재하면 Emacs는 유일한 이름을 구성하는데, 일반적으로는 디렉터리명을 기반으로 접두어를 추가하는 방법이 사용되지만 (예: '

<rms>

', '

<tmp>

' 등) 다른 방법을 선택해도 좋다. 154 페이지의 16.7.1절 [Uniquify]를 참고한다.


새 파일을 생성할 때에도 동일한 명령어 C-x C-f 를 이용해 방문하면 된다. Emacs는 에코 영역에 '

(New file)

'을 표시하지만 다른 측면에서는 사용자가 기존에 있던 빈 파일을 방문한 것처럼 행동할 것이다.


파일을 방문한 후에 편집 명령어에 대한 변경 사항은 Emacs 버퍼에서 이루어진다. 변경 사항은 사용자가 버퍼를 저장할 때까지는 방문된 파일에 적용되지 않는다(126 페이지의 15.3절 [저장하기] 참고). 버퍼가 저장되지 않은 변경 사항을 포함할 경우 버퍼가 수정되었다고 말한다. 이는 버퍼가 저장되지 않으면 일부 변경 내용이 손실될 것을 의미한다. 모드 행은 왼쪽 여백 근처에 두 개의 별 모양을 표시하여 버퍼가 수정되었음을 나타낸다.


Emacs에 이미 존재하는 파일을 방문할 경우 C-x C-f 는 사본을 만드는 대신 기존 버퍼로 전환한다. 이를 실행하기 전에 사용자가 파일을 마지막으로 방문하거나 저장한 후에 파일이 변경되었는지를 먼저 확인한다. 파일이 변경되었다면 Emacs는 다시 읽기를 제안한다.


large-file-warning-threshold

보다 큰 파일의 방문을 시도할 경우 (기본값은 10 메가바이트 정도 되는 10000000) Emacs는 사용자에게 승인을 먼저 요청한다. 파일 방문을 계속하려면 y 를 응답한다. 하지만 Emacs는 Emacs 최대 버퍼 크기보다 큰 파일은 방문할 수 없음을 명심해야 하는데, 최대 버퍼 크기는 Emacs가 할당할 수 있는 메모리량과 Emacs가 나타낼 수 있는 정수로 제한된다(147 페이지의 16장 [버퍼] 참고). 이를 어길 경우 Emacs는 최대 버퍼 크기가 초과되었음을 알려주는 오류 메시지를 표시한다.


사용자가 명시한 파일명이 셸 스타일의 와일드카드 문자를 포함할 경우 Emacs는 그에 일치하는 모든 파일을 방문한다. (대, 소문자에 둔감한 파일시스템에서는 Emacs가 문자 대소문자를 무시하고 와일드카드에 일치시킨다.). 와일드카드는 '

?

', '

*

', '

[...]

' 시퀀스를 포함한다. 미니버퍼에서 파일명에 와일드카드 '

?

'를 입력하려면 C-q ? 를 입력해야 한다. 이름에 사실상 와일드카드 문자가 포함된 파일로 방문하는 방법에 관한 정보는 143 페이지의 15.14절 [인용된 파일명]을 참고한다.


파일명을 실수로 잘못 입력하여 잘못된 파일로 방문한 경우 C-x C-v (

find-alternate-file

)를 입력하여 원하고자 하는 파일로 방문한다. C-x C-vC-x C-f 와 비슷하지만 현재 버퍼를 제거한다(수정되었을 경우 저장하도록 제시한 후에). C-x C-v 가 방문할 파일명을 읽으면 버퍼에 전체 기본 파일명을 삽입하고 디렉터리 부분 직후에 포인트를 위치시키는데, 이는 해당 이름을 입력할 때 약간의 오류를 범한 경우에 편리한 방법이다.


사실상 디렉터리에 해당하는 파일을 "방문"하는 경우 Emacs는 Emacs 디렉터리 브라우저 Dired를 호출한다. 315 페이지의 27장 [Dired]를 참고한다. 이 행위는

find-file-run-dired

변수를

nil

로 설정하여 변경할 수 있는데, 변경 시 디렉터리로 방문을 시도하면 오류가 발생한다.


사실상 다른 파일의 컬렉션 또는 파일 아카이브에 해당하는 파일은 아카이브 member 에 연산을 허용하기 위해 Dired 와 같은 환경을 호출하는 특수 모드에서 방문된다. 이러한 기능에 관한 상세한 내용은 141 페이지의 15.12절 [파일 아카이브]를 참고한다.


운영체제가 수정을 허용하지 않거나 읽기 전용으로 표시된 파일을 방문할 경우 사용자가 후에 저장할 때 문제가 될 변경을 하지 않도록 Emacs는 버퍼 역시 읽기 전용으로 만든다. C-x C-q 를 이용해 버퍼를 쓰기 가능하게 만들 수도 있다(

read-only-mode

). 149 페이지의 16.3절 [다양한 버퍼 연산]을 참고한다.


실수로 파일의 내용을 변경하지 못하도록 읽기 전용으로 방문하고 싶다면 C-x C-f 대신 C-x C-r (

find-file-read-only

) 명령어를 이용해 파일을 방문한다.


C-x 4 f (

find-file-other-window

) 는 명시된 파일을 포함하는 버퍼가 다른 창에서 선택된다는 점만 제외하면 C-x C-f 와 같다. C-x 4 f 이전에 선택된 창은 이미 표시하던 것과 동일한 버퍼를 계속해서 표시한다. 하나의 창만 표시될 때 이 명령어를 사용할 경우 해당 창은 두 개로 나뉘는데, 하나는 이전과 동일한 버퍼를 표시하고 나머지 하나는 새로 요청된 파일을 표시한다. 156 페이지의 17장 [창]을 참고한다.


C-x 5 f (

find-file-other-frame

)도 비슷하지만 새 프레임을 열거나, 명시된 파일을 표시하는 기존 프레임이 무엇이든 그 프레임을 선택한다. 162 페이지의 18장 [프레임]을 참고한다.


그래픽 디스플레이에는 파일을 방문하는 방법이 두 가지 더 있다. 첫째, Emacs가 적절한 GUI 툴킷으로 빌드된 경우 마우스로 호출된 명령어는 (메뉴 바 또는 툴 바를 클릭하여) 미니버퍼에 파일명을 요청하는 대신 툴킷의 표준 "File Selection" 대화상자를 사용한다. GNU/Linux와 Unix 플랫폼에서는 Emacs가 GTK, LessTif, Motif 툴킷을 이용해 빌드되었을 때 이를 실행하며, MS-Windows와 Mac에서는 GUI 버전이 기본적으로 이를 실행한다. 맞춤화 방법에 관한 정보는 174 페이지의 18.16절 [대화상자]를 참고한다.


둘째, Emacs는 "드래그 앤 드롭"을 지원하며, 파일을 일반 Emacs 창에 드롭하면 해당 창을 이용하는 파일을 방문한다. 단 예외가 있는데, 파일을 Dired 버퍼를 표시하는 창으로 드롭하면 표시된 디렉터리로 파일을 이동시키거나 복사한다는 점이다. 상세한 내용은 173 페이지의 18.13절 [드래그 앤 드롭], 329 페이지의 27.18절 [다양한 Dired 기능]을 참고한다.


텍스트 모드 터미널과 그래픽 디스플레이에서 Emacs가 GUI 툴킷 없이 빌드된 경우 메뉴 바 "File" 메뉴의 "Visit New File" 항목을 통해 파일로 방문할 수 있다.


사용자가 파일을 방문할 때마다 Emacs는 자동으로 내용을 스캔하여 어떠한 문자 부호화와 행끝 규칙을 사용하는지 감지하고, 이를 버퍼 내에서 Emacs의 내부 부호화 및 행끝 규칙으로 변환한다. 사용자가 버퍼를 저장하면 Emacs는 역(inverse)변환을 실행하여 기존(원래) 부호화 및 행끝 규칙을 이용해 파일을 디스크에 쓴다. 183 페이지의 19.5절 [코딩 시스템]을 참고한다.


특별한 부호화나 규칙 없이 ASCII 문자의 시퀀스로서 파일을 편집하고 싶다면 M-x find-file-literally 명령어를 사용한다. 이는 C-x C-f 와 마찬가지로 파일을 방문하지만 포맷팅 변환(Emacs Lisp Reference Manual의 "Format Conversion"절 참고), 문자 코드 변환(183 페이지의 19.5절 [코딩 시스템] 참고), 또는 자동 무압축(141 페이지의 15.11절 [압축 파일] 참고)을 실행하지 않고,

require-final-newline

으로 인해 최종 새 행을 추가하지 않는다(130 페이지의 15.3.3절 [맞춤화 저장] 참고). 일반적인 (non-literal) 방식으로 동일한 파일을 이미 방문했다면 이 명령어는 말 그대로 파일을 방문할 것인지 질문할 것이다.


확장(extensions)이 파일 방문 연산을 수정하도록 허용하는 두 가지 특별한 훅 변수가 있다. 존재하지 않는 파일을 방문하면

find-file-not-found-functions

에서 함수를 실행하는데, 이 변수는 함수의 목록을 보유하고, 이 함수들은 그들 중 하나가

nil

이 아닌 값을 리턴할 때까지 하나씩 (인자 없이) 호출된다. 이것은 일반 훅이 아니며 그러한 사실을 표시하기 위해 이름이 '

-hook

' 대신 '

-functions

' 로 끝이 난다.


존재 여부와 상관없이 파일의 방문이 성공하면 인자 없이

find-file-hook

에서 함수를 호출한다. 이 변수는 일반 훅이다. 존재하지 않는 파일의 경우

find-file-not-found-functions

가 먼저 실행된다. 422 페이지의 33.2.2절 [훅]을 참고한다.


파일을 편집하기 위한 주 모드를 자동으로 명시하고 (202 페이지의 20.3절 [모드 선택하기] 참고) 해당 파일에 정의된 로컬 변수를 명시하는 방법도 (424 페이지의 33.2.4절 [파일 변수] 참고) 여러 가지가 있다.


파일 저장하기

Emacs에서 파일을 저장한다는 것은 버퍼에서 방문한 파일로 버퍼의 내용을 다시 쓰는 것을 의미한다.

파일 저장을 위한 명령어

아래는 파일을 저장하고 쓰는 것과 관련된 명령어들이다.


C-x C-s 현재 버퍼를 그 파일로 저장한다(

save-buffer

).


C-x s 어떤 버퍼 또는 모든 버퍼를 그 파일로 저장한다(

save-some-buffers

).


M-~ 현재 버퍼가 변경되었음을 잊는다(

not-modified

). 접두 인자(C-u)를 이용해 현재 버퍼가 변경되었음을 표시한다.


C-x C-w 현재 버퍼를 명시된 파일명으로 저장한다(

write-file

).


M-x set-visited-file-name 현재 버퍼를 저장할 파일명을 변경한다.


파일을 저장하고 변경 내용을 영구적으로 적용하고 싶다면 C-x C-s (

save-buffer

)를 입력한다. 저장이 완료된 후 C-x C-s 를 사용하면 다음과 같은 메시지를 표시한다:


Wrote /u/rms/gnu/gnu.tasks


현재 버퍼가 수정되지 않으면 (버퍼가 생성되거나 마지막으로 저장된 후 어떠한 변경 사항도 이루어지지 않았다) 저장은 효과가 없을 것이므로 아직 저장이 되지 않는다. 대신 C-x C-s 는 에코 영역에 아래와 같은 메시지를 표시한다:


(No changes need to be saved)


C-u C-x C-s 에 접두 인자를 사용하면 Emacs는 다음 저장이 이루어질 때 백업할 버퍼를 표시하기도 한다. 127 페이지의 15.3.2절 [백업]을 참고한다.


C-x s (

save-some-buffers

) 명령어는 특정 또는 모든 수정된 버퍼를 저장할 것을 권한다. 그리고 각 버퍼에 무엇을 수행할 것인지 묻는다. 가능한 응답은

query-replace

와 동일하다:


y 이 버퍼를 저장하고 나머지 버퍼에 대해 묻는다.


n 이 버퍼는 저장하지 않고 나머지 버퍼에 대해서는 묻는다.


! 이 버퍼와 나머지 버퍼를 추가 질문 없이 저장한다.


RET 추가 저장 없이

save-some-buffers

를 종료한다.


. 이 버퍼를 저장한 후 버퍼에 대해 질문하지 않고

save-some-buffers

를 종료한다.


C-r 현재 질문 중인 버퍼를 확인한다. View 모드를 종료하면

save-some-buffers

로 돌아가 다시 질문한다.


d 버퍼를 그에 상응하는 파일에 diff하여 어떤 변경 사항을 저장할 것인지 사용자가 확인할 수 있도록 한다. 이는

diff-buffer-with-file

명령어를 호출한다(137 페이지의 15.8절 [파일 비교하기] 참고).


C-h 이러한 옵션에 관한 도움말 메시지를 표시한다.


Emacs를 종료하는 키 시퀀스 C-x C-c

save-some-buffers

를 호출하므로 같은 질문을 한다.


버퍼를 변경하고 변경 내용을 저장하지 않길 원한다면 저장을 방지하는 행동을 취해야 한다. 아니면 사용자가 C-x s 또는 C-x C-c 를 사용할 때마다 실수로 버퍼를 저장하게 된다. 이 때 사용자가 M-~ (

not-modified

)를 입력하면 버퍼가 수정되었다는 표시를 없앤다. 이를 실행하면 저장 명령어는 버퍼를 저장해야 한다는 사실을 믿지 않을 것이다. ('

~

'는 주로 'not'의 수학 기호로 사용되므로 M-~ 는 메타화(metafied)된 'not'이다.) 아니면 파일을 방문하거나 저장한 이후에 파일로부터 텍스트를 다시 읽음으로써 모든 변경내용을 취소할 수도 있다. 이것을 되돌리기(reverting)라고 부른다. 132 페이지의 15.4절 [되돌리기]를 참고한다. (모든 변경 내용의 실행 취소가 이루어질 때까지 실행 취소 명령어 C-x u 를 반복하여 변경내용을 취소할 수도 있지만 되돌리기 방법이 더 수월하다.)


M-x set-visited-file-name 은 현재 버퍼가 방문 중인 파일명을 수정한다. 이는 미니버퍼를 이용해 새로운 파일명을 읽는다. 그리고 나서 해당 파일명을 방문한다고 버퍼를 표시하고, 그에 따라 버퍼명을 변경한다.

set-visited-file-name

은 새로 방문한 파일에 버퍼를 저장하지 않고, 사용자가 후에 저장할 때 Emacs에 있는 기록을 수정할 뿐이다. 또한 버퍼를 "modified"(수정됨)로 표시하여 해당 버퍼에서 C-x C-s 가 저장을 실행할 것이다.


버퍼를 다른 파일을 방문하는 것으로 표시하고 즉시 저장하고 싶다면 C-x C-w (

write-file

)을 사용한다. 이는

set-visited-file-name

다음에 C-x C-s 를 사용하는 것과 동일한데, 단 C-x C-w 는 파일이 존재할 경우 확인을 요청한다는 점에서 차이가 있다. 파일을 방문하지 않는 버퍼에서 C-x C-s 를 사용하면 C-x C-w 와 동일한 효과를 보이므로, 파일명을 읽고 해당 파일을 방문하는 버퍼를 표시하여 그곳에 저장한다. 파일을 방문하지 않는 버퍼 내 기본 파일명은 버퍼의 기본 디렉터리와 버퍼명을 결합하여 만들어진다(122 페이지의 15.1절 [파일명] 참고).


새 파일명이 주 모드를 의미할 경우 C-x C-w 는 대부분의 경우 해당 주 모드로 전환된다.

set-visited-file-name

명령어 역시 이를 수행한다. 202 페이지의 20.3절 [모드 선택하기]를 참고한다.


Emacs가 파일을 저장하려는데 디스크 상의 최신 버전 일자가 Emacs가 마지막으로 읽거나 쓴 날짜와 일치하지 않을 경우 동시 편집으로 문제가 야기되어 사용자의 즉각적인 주의를 요하는 문제일 수도 있으므로 Emacs는 사용자에게 그 사실을 알린다. 130 페이지의 15.3.4절 [동시 편집]을 참고한다.


백업 파일

대부분 운영체제에서는 파일을 재작성하면 자동으로 파일이 포함하고 있던 기록을 모두 파기한다. 따라서 Emacs로부터 파일을 저장하면 파일의 오래된 내용을 버리는데, 오래된 내용을 저장하기 전에 백업 파일이라는 다른 파일에 조심스럽게 복사하는 예외의 경우도 존재한다.


Emacs는 버퍼로부터 파일이 처음으로 저장될 때에만 파일의 백업을 만든다. 이후 파일을 몇 번을 저장하든 백업은 변경되지 않고 남아 있다. 하지만 버퍼를 제거한 후에 파일을 다시 방문하면 새로운 백업 파일이 만들어질 것이다.


대부분 파일의 경우

make-backup-files

변수는 백업 파일을 만들 것인지 여부를 결정한다. 대부분 운영체제에서 그 기본값은 t로, Emacs가 백업 파일을 작성한다.


버전 관리 시스템이 관리하는 파일의 경우 (281 페이지의 25.1절 [버전 관리] 참고)

vc-make-backup-files

변수는 백업 파일을 만들 것인지 결정한다. 기본값은

nil

인데, 사용자가 버전 관리 시스템에 이전 버전을 모두 보관하면 백업 파일이 불필요하기 때문이다. Specialized Emacs Features의 "General VC Options"절을 참고한다.


Emacs는 각 파일마다 하나의 백업을 보관하거나, 사용자가 편집하는 파일마다 숫자를 매긴 일련의 백업 파일을 만들 수도 있는데, 선택은 사용자에게 달려 있다. 128 페이지의 15.3.2.1절 [백업 이름]을 참고한다.


backup-enable-predicate

변수의 기본값은

temporary-file-directory

또는

small-temporary-file-directory

로 명시되어 임시 파일에 사용되는 디렉터리에 백업 파일이 파일용으로 작성되지 않도록 금한다.


버퍼가 이전에 저장된 적이 없더라도 Emacs 에게 버퍼로부터 다른 백업 파일을 만들 것을 직접 알릴 수도 있다. C-u C-x C-s 를 이용해 버퍼를 저장할 경우 저장된 버전은 사용자가 버퍼를 다시 저장할 때 백업 파일로 만들어질 것이다. C-u C-u C-x C-s 는 버퍼를 저장하지만 먼저 이전 파일 내용을 새로운 백업 파일에 만든다. C-u C-u C-u 는 사용자가 다시 저장할 경우 새로 저장된 내용으로부터 또 다른 백업을 만들도록 처리한다.


단일 백업 또는 번호를 매긴 백업

Emacs가 백업 파일을 만들 때는 편집 중인 파일명 뒤에 '

~

'를 붙여 백업 파일명이 구성되므로

eval.c

에 대한 백업 파일은

eval.c~

가 될 것이다.


접근 제어에서 Emacs로 하여금 백업 파일을 일반 이름으로 작성하지 못하도록 할 경우 백업 파일을

~/.emacs.d/%backup%

로 작성할 것이다. 그러한 파일은 하나만 존재할 수 있으므로 가장 최근에 만들어진 백업만 이용할 수 있다.


Emacs는 번호를 매긴 백업 파일을 만들 수도 있다. 번호를 매긴 백업 파일명은 '

.~

', 숫자, 원본 파일명 뒤에 '

~

'를 다시 포함하여 만들어진다. 따라서

eval.c

의 백업 파일은

eval.c.~1~

,

eval.c.~2~

식으로 부를 수 있고,

eval.c~259~

이상으로 이름을 붙일 수 있다.


version-control

변수는 단일 백업 파일을 만들 것인지 아니면 번호를 매긴 다수의 파일을 만들 것인지 결정한다. 가능한 값은 다음과 같다:


nil

이미 번호를 매긴 백업 파일에 대해 번호를 매긴 백업을 만든다. 아니면 단일 백업을 만든다. 이것이 기본값이다.


t

번호를 매긴 백업을 만든다.


never

번호를 매긴 백업을 절대 만들지 않으며, 항상 단일 백업을 만든다.


이 변수를 전역적으로 설정하는 방법은 init 파일 또는 맞춤화 버퍼를 통한 방법이 일반적이다. 하지만 개별 버퍼에서 해당 버퍼의 파일에 대한 백업 만들기를 제어하도록

version-control

을 로컬로 설정하는 방법도 있다(423 페이지의 33.2.3 [로컬] 참고). 사용자가 주어진 파일을 방문할 때마다 Emacs는 로컬로

version-control

을 설정하도록 만들 수도 있다(424 페이지의 33.2.4절 [파일 변수] 참고). Rmail 모드와 같은 일부 모드에서 이 변수를 설정한다.


환경 변수 VERSION_CONTROL 을 설정하여 백업 파일로 무엇을 할지 다양한 GNU 유틸리티에 알리도록 할 경우 그에 따라 Emacs는 시작 시 Lisp 변수인

version-control

을 설정함으로써 환경 변수를 따르기도 한다. 환경 변수의 값이 '

t

' 또는 '

numbered

'일 경우

version-control

t

가 되고, 값이 '

nil

' 또는 '

existing

' 일 경우

version-control

nil

이 되며, '

never

' 또는 '

simple

'일 경우

version-control

never

가 된다.


특정 패턴에 일치하는 파일을 구체적 디렉터리로 백업하도록 명시하려면

backup-directory-alist

변수를 맞춤화한다. 이 변수는 단일 백업과 번호를 매긴 백업 모두에 적용된다.

("." . dir)

요소를 추가하여 절대 이름 dir으로 된 디렉터리에 모든 백업을 만드는 방법이 일반적인데, Emacs는 여러 디렉터리에서 동일한 이름을 가진 파일들 간에 충돌을 피하기 위해 백업 파일명을 수정한다. 아니면 원본 파일의 디렉터리의 보이지 않는 하위디렉터리

.~

에 백업을 만들도록

(".".".~")

를 추가하여도 좋다. Emacs는 필요 시 백업을 만들 디렉터리를 생성한다.


make-backup-file-name-function

변수를 적절한 Lisp 함수로 설정할 경우 Emacs가 백업 파일명을 구성하는 일반적인 방식을 오버라이드할 수 있다.


자동 백업 삭제

디스크 공간의 과잉 소모를 막기 위해 Emacs는 자동으로 번호를 매긴 백업 버전을 삭제할 수 있다. 일반적으로 Emacas는 처음 백업 몇 개와 최신 백업 몇 개만 보관하며 그 중간에 백업은 삭제한다. 새로운 백업이 만들어질 때마다 이 과정은 반복된다.


kept-old-versions

kept-new-versions

변수가 이러한 삭제를 제어한다. 두 변수의 값은 각각 새로운 백업이 만들어질 때마다 보관할 가장 오래된 (숫자가 작은) 백업 개수와 보관할 가장 최신 (숫자가 큰) 백업 개수에 해당한다. 중간에 해당하는 (가장 오래된 것과 최신 것은 제외) 백업은 초과 중간 버전(excess middle version)으로서 삭제된다. 이러한 변수들의 값은 초과 버전을 삭제할 시기가 되었을 때, 즉 새로운 백업 버전이 만들어진 직후에 사용되고, 최신에 만들어진 백업이

kept-new-versions

내 계수에 포함된다. 두 변수 모두 기본값은 2이다.


delete-old-versions

t

일 경우 Emacs는 조용히 excess 백업 파일을 삭제한다. 기본값

nil

일 경우 Emacs는 excess 백업 버전을 삭제해야 하는지 여부를 묻는다. 다른 값을 가진다면 Emacs는 절대 백업을 자동으로 삭제하지 않는다.


Dired's

.

(마침표) 명령어를 이용해 오래된 버전을 삭제하는 방법도 있다. 316 페이지의 27.3절 [Dired 삭제]를 참고한다.


복사하기 vs. 재명명하기

백업 파일은 오래된 파일을 복사하거나 재명명하여 만들 수 있다. 복사와 재명명은 오래된 파일이 여러 개의 이름(하드 링크)을 가질 때 차이가 난다. 오래된 파일이 백업 파일로 재명명될 경우 대안 이름이 백업 파일에 대한 이름이 된다. 오래된 파일이 복사될 경우 대안 이름은 사용자가 편집 중인 파일의 이름으로 남고, 그러한 이름으로 접근한 내용이 새로운 내용이 될 것이다.


백업 파일을 만드는 방법은 파일의 소유자와 그룹에도 영향을 미칠 수 있다. 복사를 사용 시에는 아무 것도 변경되지 않는다. 하지만 재명명 방법을 사용할 경우 사용자가 파일의 소유자가 되고 파일의 그룹이 기본그룹이 된다(운영체제마다 그룹에 다른 기본값을 갖는다.)


재명명과 복사의 선택은 다음과 같이 이루어진다:

  • backup-by-copying
    변수가
    nil
    이 아닐 경우 (기본값은
    nil
    ) 복사를 사용한다.
  • 그 외의 경우
    backup-by-copying-when-linked
    변수가
    nil
    이 아니고 (기본값은
    nil
    ) 파일이 여러 개의 이름을 갖고 있으면 복사를 사용한다.
  • 그 외의 경우
    backup-by-copying-when-mismatch
    변수가
    nil
    이 아니고 (기본값은
    nil
    ) 재명명 시 파일의 소유자나 그룹을 변경할 것이라면 복사를 사용한다.
    backup-by-copying-when-mismatch
    nil
    로 변경할 경우 Emacs는 숫자로 된 파일 소유자의 사용자 id를 확인한다. 숫자가
    backup-by-copying-when-privileged-mismatch
    보다 클 경우
    backup-by-copying-when-mismatch
    nil
    이 아닌 값을 가진 것처럼 행동한다.
  • 그 외의 경우 재명명이 기본적으로 선택된다.


버전 관리 시스템으로 파일을 관리하면 (281 페이지의 25.1절 [버전 관리] 참고) Emacs는 보통 해당 파일에 대해 일반적인 방식으로 백업을 만들지 않는다. 하지만 체크인과 체크아웃은 몇 가지 면에서 백업을 만드는 것과 비슷하다. 아쉽게도 한 가지가 비슷한데, 이러한 연산들은 주로 하드 링크를 깨지게 만들어 사용자가 방문한 파일명을 동일한 파일에 대한 대안 이름으로부터 연결을 끊는다는 점이다. 이는 Emacs와는 상관이 없고 버전 관리 시스템과 상관된 일이다.


파일 저장 맞춤화하기

require-final-newline

변수의 값이

t

일 경우, 파일을 저장하거나 쓰면 끝에 새 행이 없을 시 새 행을 조용히 놓는다. 값이

visit

일 경우, Emacs는 파일을 방문한 직후 새 행을 갖고 있지 않은 파일의 끝에 새 행을 추가한다. (이는 버퍼를 수정된 버퍼로 표시하는데, 사용자는 실행을 취소할 수 있다.) 값이

visit-save

일 경우 Emacs는 방문 시 그리고 저장 시에 그러한 새 행들을 추가한다. 값이

nil

이라면 Emacs는 파일의 끝을 변경되지 않은 채로 남겨 두고, 그 외

nil

이 아닌 값은 사용자에게 새 행의 추가 여부를 물을 것이다. 기본값은

nil

이다.


일부 주 모드는 항상 새 행으로 끝이 나도록 된 구체적인 유형의 파일용으로 설계되어 있다. 그러한 주 모드는

require-final-newline

변수를 기본값이

t

로 설정되는

mode-require-final-newline

값으로 설정한다. 후자 변수를 설정함으로써 이러한 모드가 마지막 새 행을 어떻게 처리하는지 제어할 수 있다.


보통 프로그램이 파일을 쓸 때는 운영체제가 데이터를 디스크로 commit하기 전에 주 메모리에 파일의 데이터를 잠시 캐시 저장한다. 이는 성능을 크게 향상시키기도 하는데, 가령 랩톱에서 실행하면 파일이 작성될 때마다 디스크 스핀업을 피할 수 있기 때문이다. 하지만 캐시를 디스크에 comit하기 전에 운영체제가 충돌할 경우 데이터 손실 위험이 있다.


이러한 위험을 줄이기 위해 Emacs는 파일을 저장한 후에

fsync

시스템 콜(call)을 호출할 수 있다.

fsync

가 데이터 손실 위험을 완전히 제거하는 것은 아닌데, 부분적으로는 많은 시스템에서

fsync

를 적절하게 구현하지 않기 때문이고, 또 다른 이유는

fsync

가 적절하게 작동한다 하더라도 Emacs의 파일 저장 절차가 보통 충돌을 살아 남을 수 없는 디렉터리 업데이트에 의존하기 때문이다.


write-region-inhibit-fsync

변수는 파일을 저장한 후에 Emacs가

fsync

를 호출할 것인지 여부를 제어한다. Emacs가 대화형일 경우 변수의 기본값은

nil

이고, Emacs가 배치 모드에서 실행될 경우

t

가 된다.


Emacs는 자동 저장 파일을 작성할 때는 절대

fsync

를 사용하지 않는데, 이러한 파일은 언제든 데이터를 손실할 수 있기 때문이다.


동시 편집으로부터 보호

두 명의 사용자가 동일한 파일을 방문하고 두 사람 다 내용을 변경하여 저장할 경우 동시 편집이 발생한다. 두 사람 모두 이러한 일을 발생하고 있다는 알림을 받지 못하면 두 사람 중 먼저 저장하는 사람은 변경 내용이 손실되었음을 후에 발견할 것이다.


일부 운영체제에서는 두 번째 사용자가 파일을 변경하기 시작하면 Emacs가 즉시 알려 즉각 경고를 발행한다. 모든 운영체제에서는 Emacs는 사용자가 파일을 저장할 때를 확인하고, 다른 사용자의 변경 내용을 덮어쓰려 하면 경고를 한다. 다른 사용자의 작업에 대한 손실을 피하기 위해서는 파일을 저장하는 대신 적절한 수정 행위를 취하여야 한다.


파일을 방문하는 Emacs 버퍼에서 첫 번째 수정을 할 때 Emacs는 파일이 사용자에 의해 잠겨 있다고 기록한다. (동일한 디렉터리에 특별한 내용이 담겨 있고 구체적으로 명명된 부호 링크를 생성하여 이루어진다.)[1] 사용자가 변경 내용을 저장하면 Emacs는 잠금을 제거한다. 파일을 방문하는 Emacs 버퍼가 저장되지 않은 변경 내용을 가질 때마다 파일이 잠금된다는 것이 기본 개념이다.


create-lockfiles

변수를

nil

로 설정하여 잠금 파일의 생성을 막을 수도 있다.

주의:

이 방법을 이용하면 해당 기능이 제공하는 혜택을 잃을 수도 있다.


방문한 파일을 다른 사람이 잠그는 동안 사용자가 버퍼를 수정하기 시작하면 이는 충돌을 야기한다. Emacs가 이 충돌을 감지하면

ask-user-about-lock

이라는 Lisp 함수를 호출함으로써 사용자에게 무엇을 할 것인지 묻는다. 맞춤화를 위해 이 함수를 재정의할 수도 있다. 이 함수의 표준 정의는 사용자에게 질문을 하고 세 가지 가능한 답을 수용한다:


s

잠금을 훔친다. 파일을 이미 변경하는 사람이 누구든 잠금 권한을 잃고 당신에게 잠금 권한이 주어진다.


p

진행한다. 다른 사람이 잠그고 있다 하더라도 파일을 편집한다.


q

중단한다. 이는 오류를 발생시키고 (

file-locked

) 버퍼 내용은 변경되지 않은 채 유지되며, 당신이 수정하려 했던 내용은 사실상 적용되지 않는다.


Emacs 또는 운영체제가 충돌할 경우 오래된(stale) 잠금 파일을 남겨두고 갈 수 있으므로 사용자는 거짓된 충돌에 관한 경고를 받는 경우도 생길 수 있다. 충돌이 거짓이라고 결정할 경우 p 를 이용해 Emacs에게 편집을 계속하라고 알려준다.


잠금은 파일명을 기반으로 작동함을 명심하고, 파일이 여러 개의 이름을 가질 경우 Emacs는 두 명의 사용자가 다른 이름으로 동시에 편집하지 못하도록 막지 않는다.


잠금 파일은 일부 상황에서 작성할 수 없는데, 가령 Emacs에 시스템 권한이 없거나 어떠한 이유로 잠금 파일을 생성할 수 없는 경우가 있다. 이 때 사용자가 파일 저장을 시도하면 Emacs는 파일의 마지막 수정 일자를 확인함으로써 여전히 충돌을 감지한다. Emacs가 마지막으로 방문하거나 저장한 이후 파일이 변경되었다면 변경 내용이 다른 방식으로 이루어졌음을 의미하고, Emacs가 저장 후 계속한다면 변경 내용은 손실될 것이다. 이후 Emacs는 경고 메시지를 표시하고 저장 전에 확인을 요청하는데, 저장은

yes

를 선택하고 저장을 취소하려면

no

또는 C-g 를 선택한다.


동시 편집이 이미 발생하고 있음을 알고 있다면 M-x diff-buffer-with-file 명령어를 이용해 버퍼와 그 파일을 비교하는 것도 한 가지 방법이다. 137 페이지의 15.8절 [파일 비교하기]를 참고한다.


파일 섀도잉

M-x shadow-initialize 파일 섀도잉을 설정한다.


M-x shadow-define-literal-group 사이트 간에 공유할 하나의 파일을 선언한다.


M-x shadow-define-regexp-group 파일 그룹 각각에 일치하는 모든 파일을 호스트들이 공유하도록 만든다.


M-x shadow-define-cluster RET name RET 섀도우 파일 클러스터 name을 정의한다.


M-x shadow-copy-files 모든 보류(pending) 섀도우 파일을 복사한다.


M-x shadow-cancel 일부 파일의 섀도잉 지시를 취소한다.


특정 파일의 동일한 섀도우 사본을 하나 이상의 위치, 아니면 다른 머신에 보관하도록 만들 수도 있다. 이를 위해선 우선 섀도우 파일 그룹(shadow file group)을 만들어야 하는데, 이것은 사이트 목록들이 공유하는, 동일한 이름으로 된 파일들의 집합이다. 파일 그룹은 영구적이며, 현재 Emacs 세션은 물론이고 향후 세션에도 적용된다. 그룹이 만들어지고 나면 사용자가 Emacs를 종료할 때마다 당신이 편집한 파일을 해당 그룹 내 다른 파일로 복사할 것이다. M-x shadow-copy-files 를 입력하면 Emacs를 종료하지 않고 파일의 복사가 가능하다.


섀도우 파일 그룹을 설정하려면 M-x shadow-define-literal-group 또는 M-x shadow-define-regexp-group 을 사용한다. 추가 정보는 해당하는 문서 문자열을 참고한다.


파일을 섀도우로 복사하기 전에 Emacs는 승인을 요청한다. "no"라고 답하면 이 번만 이 파일의 복사를 건너뛴다. 특정 파일에 대한 섀도잉을 영구적으로 취소하고 싶다면 M-x shadow-cancel 을 이용해 섀도우 파일 그룹을 제거하거나 변경한다.


섀도우 클러스터(shadow cluster)는 디렉터리를 공유하는 호스트 그룹으로, 그 중 하나로 복사하거나 그로부터 복사해오는 것만으로 모든 호스트에서 파일을 업데이트하기에 충분하다. 각 섀도우 클러스터에는 이름이 있고, 일차 호스트(우리가 파일을 복사하는 목적지)의 네트워크 주소, 클러스터 내 다른 모든 호스트의 호스트명에 일치하는 정규 표현식을 명시한다. M-x shadow-define-cluster 를 이용해 섀도우 클러스터를 정의할 수 있다.


자동으로 타임 스탬프 업데이트하기

파일에 타임 스탬프를 넣어 사용자가 파일을 편집하여 저장할 때마다 자동으로 업데이트되도록 마련할 수 있다. 타임 스탬프는 파일의 첫 8개 행에 위치해야 하고, 다음과 같이 삽입하거나:


Time-stamp: <>


다음과 같이 삽입해야 한다:


Time-stamp: " "


그리고 나서

time-stamp

함수를

before-save-hook

훅으로 추가한다(422 페이지의 33.2.2절 [훅] 참고). 파일을 저장하면 이 함수는 타임 스탬프를 현재 날짜와 시간으로 자동 업데이트한다. M-x time-stamp 명령어를 이용해 타임 스탬프를 수동으로 업데이트할 수도 있다. 그 외 맞춤화는

time-stamp

라는 Custom 그룹을 참고한다. 타임 스탬프는 사용자의 로케일 설정에 따라 포맷팅됨을 명심한다(482 페이지의 C.4절 [환경] 참고).


버퍼 되돌리기

파일을 방문하는 버퍼에 많은 변경 사항이 적용되었으나 마음이 바뀌었다면 변경 사항을 되돌려(revert) 파일이 저장된 버전으로 돌릴 수 있다. 이 때 M-x revert-buffer 를 입력한다. 되돌리기는 의도치 않게 엄청난 작업을 손실할 수 있으므로 Emacs는 먼저 확인을 요청한다.


revert-buffer

명령어는 파일이 약간만 편집되었을 경우 사용자가 이전과 거의 같은 텍스트 부분에 포인트를 위치시키려고 노력한다.


되돌리기는 버퍼를 "수정되지 않음"으로 표시한다. 또한 버퍼의 실행 취소 히스토리를 제거한다(109 페이지의 13.1절 [실행 취소] 참고). 따라서 되돌리기의 실행 취소는 불가능하므로, 사용자가 다시 마음을 바꾼다고 해서 실행 취소 명령어를 이용해 되돌린 변경 내용을 다시 가져오기가 불가능하다.


Dired 버퍼처럼 파일과 관련되지 않은 일부 유형의 버퍼도 되돌리기가 가능하다. 이러한 버퍼에서 되돌리기란 그 내용을 재계산함을 의미한다. C-x b 를 이용해 직접 생성된 버퍼는 되돌릴 수가 없고, 이를 시도하면

revert-buffer

는 오류를 보고한다.


자동으로 그리고 자주 변경되는 파일을 편집할 때는 (예: 계속 실행되는 프로세스로부터의 출력 로그) Emacs가 사용자에게 문의하지 않고 파일을 되돌리는 편이 유용할 것이다. 이러한 행위를 요청하려면

revert-without-query

변수를 정규 표현식 목록으로 설정한다. 파일이 그 정규 표현식 중 하나에 일치할 경우 파일이 변경되면

find-file

revert-buffer

는 파일을 자동으로 되돌릴 것인데, 버퍼가 수정되지 않았을 때에 한한다. (사용자가 텍스트를 편집했다면 변경 내용을 버리는 것은 옳지 못하다.)


Emacs에게 버퍼를 주기적으로 되돌리도록 알릴 수도 있다. 특정 버퍼에 이를 실행하려면 M-x auto-revert-mode 를 입력하여 Auto-Revert 모드라는 부 모드를 활성화한다. 그러면 5초마다 현재 버퍼가 자동으로 되돌아가는데, 그 시간 간격은

auto-revert-interval

변수를 통해 변경 가능하다. 모든 파일 버퍼에 이를 실행하려면 M-x global-auto-revert-mode 를 입력하여 전역(global) Auto-Revert 모드를 활성화한다. 이러한 부 모드들은 원격 파일을 확인하거나 되돌리지는 않는데, 그럴 경우 속도가 너무 느려지기 때문이다.


Auto-Revert 모드는 시스템 로그와 같은 파일을 "추적하는(tail)" 데에 사용되기도 하여 다른 프로그램들이 해당 파일에 실행한 변경 내용이 계속해서 표시된다. 이러한 기능을 활성화하기 위해서는 버퍼의 끝으로 포인트를 이동시키면 파일 내용이 변경될 때 포인트는 그 곳에 남아 있을 것이다. 하지만 최종까지 이르러야 파일이 커지면서 변경된다고 확신한다면 Auto-Revert Tail 모드를 대신 사용한다(

auto-revert-tail-mode

). 이유는 그러한 용도에 더 효율적인 모드이기 때문이다. Auto-Revert Tail 모드는 원격 파일에도 적용된다.


버전 관리에 있는 파일의 초기 버전으로 되돌리는 명령어는 292 페이지의 25.1.8절 [VC 실행 취소]를 참고한다. 버전 관리에 있는 파일을 방문할 때 Auto Revert 특이점은 284 페이지의 25.1.2절 [VC 모드 행]을 참고한다.


자동저장: 재앙으로부터 보호

Emacs는 이따금씩 사용자가 실제로 사용한 파일은 수정하지 않고 사용자가 방문한 파일을 자동으로 각각의 구분된 파일에 저장하곤 한다. 이를 자동 저장(auto-saving) 이라고 부른다. 이는 시스템이 충돌할 때 제한된 작업량 이상의 손실을 막는다.


Emacs가 자동 저장을 실행할 시간이라고 결정하면 각 버퍼를 고려하는데, 해당 버퍼에 자동 저장이 활성화되어 있고 마지막 자동 저장 이후 내용이 변경되었다면 자동 저장을 실행한다. 어떤 파일이든 자동 저장 중이라면 에코 영역에 '

Auto-saving...

'이라는 메시지가 표시된다. 자동 저장 중에 발생하는 오류는 포착되므로 사용자가 입력 중인 명령어의 실행을 방해하지 않는다.


자동 저장 파일

자동 저장은 사용자가 방문한 파일에 저장하지 않는 것이 보통인데, 영구적으로 적용하려는 변경 내용이 아닌 경우 바람직하지 못하기 때문이다. 따라서 자동 저장은 auto-save file 이라는 다른 파일에서 이루어지고, 방문한 파일은 사용자가 직접 저장(C-x C-s 의 이용 등)을 요청할 때에만 변경된다.


자동 저장 파일명은 방문한 파일명 앞과 뒤에 '

#

' 이 붙어 만들어지는 것이 보통이다. 따라서

foo.c

파일을 방문하는 버퍼는

#foo.c#

파일에 자동 저장된다. 파일을 방문하지 않는 버퍼 대부분은 사용자가 직접 요청 시에만 자동 저장되므로 그러한 버퍼가 자동 저장되면 자동 저장 파일명은 버퍼명의 앞뒤로 '

#

' 이 붙은 다음 유일성을 위해 이름 맨 뒤에 숫자와 문자가 추가된다. 예를 들어 사용자가 전송할 메시지를 작성 중인

*mail*

버퍼는

#*mail*#704juu

와 같은 이름의 파일로 자동 저장된다. 자동 저장 파일명은 Emacs 부분들이 이와 다르게 실행하도록 사용자가 재프로그램화하지 않는 이상 위와 같은 방식으로 이루어진다(

make-auto-save-file-name

auto-save-file-name-p

함수). 버퍼에서 자동 저장용으로 사용되는 파일명은 해당 버퍼에서 자동 저장이 켜져 있을 때 계산된다.


auto-save-file-name-transform

변수는 자동 저장 파일명에 대한 통제 정도를 허용한다. 이는 자동 저장 파일명을 변형시킬 대체와 일련의 정규 표현식을 명시하도록 해준다. 기본값을 이용하면 원격 파일에 대한 자동 저장 파일을 (142 페이지의 15.13절 [원격 파일] 참고) 로컬 머신의 임시 파일 디렉터리에 위치시킨다.


큰 버퍼에서 상당한 부분의 텍스트를 삭제하면 해당 버퍼에서 자동 저장이 일시적으로 꺼진다. 이는 사용자가 텍스트를 무의식적으로 삭제할 경우 자동 저장 파일이 삭제된 텍스트를 포함한다면 자동 저장 파일이 훨씬 더 유용하다고 생각하기 때문이다. 이러한 일이 발생한 후 자동 저장을 재활성화시키려면 C-x C-s 를 이용해 버퍼를 저장하거나 C-u 1 M-x auto-save-mode 를 이용한다.


구분된 자동 저장 파일보다 방문한 파일에 자동 저장을 실행하고 싶다면

auto-save-visited-file-name

변수를

nil

이 아닌 값으로 설정한다. 이 모드에서는 자동 저장과 직접 저장 간에 실질적 차이가 없다.


버퍼의 자동 저장 파일은 사용자가 방문한 파일에 버퍼를 저장 시 삭제된다. (

delete-auto-save-files

변수를

nil

로 설정하여 이를 해제할 수도 있다.) C-x C-w 또는

set-visited-file-name

를 이용해 방문한 파일명을 변경하면 자동 저장 파일은 새로 방문한 이름에 어울리게 재명명된다.


자동 저장 관리하기

auto-save-default

변수가

nil

이 아닐 경우 사용자가 파일을 방문할 때마다 해당 파일의 버퍼에 대해 자동 저장이 켜진다(하지만 배치 모드에서는 해당하지 않는다. 관련 내용은 480 페이지의 C.2절 [초기 옵션]을 참고한다.). 이 변수의 기본값은 t이므로 자동 저장은 파일을 방문하는 버퍼에 일반적으로 사용된다. 현재 버퍼에서 자동 저장의 기능을 토글하려면 M-x auto-save-mode 를 입력한다. Auto Save 모드는 버퍼 로컬 부 모드의 역할을 한다(200 페이지의 20.2절 [부 모드] 참고).


Emacs는 마지막 자동 저장 후 사용자가 얼마나 많은 문자를 입력했는지를 바탕으로 주기적으로 자동 저장한다.

auto-save-interval

변수는 몇 개의 문자 간격을 두고 자동 저장을 실행하는지 명시한다. 기본값은 300이다. Emacs는 너무 적은 값은 허용하지 않으므로

auto-save-interval

을 20 미만의 값으로 맞춤화할 경우 Emacs는 값이 20인 것처럼 행동할 것이다.


자동 저장은 한동안 입력을 중단할 때에도 발생한다. 기본값은 30초 idleness 이후로 되어 있다(이 때 Emacs는 쓰레기 수집을 실행하기도 하는데, The Emacs Lisp Reference Manual의 "Garbage Collection" 절을 참고한다). 이 간격을 변경하려면

auto-save-timeout

변수를 맞춤화한다. 현재 버퍼가 길면 실제 시간 간격은 더 길어지는데, 이것은 자동 저장에 많은 시간이 소요되는 긴 버퍼를 편집할 때 방해하지 않도록 설정된 휴리스틱이다. Idle 시간 동안 자동 저장은 두 가지를 성취하는데, 첫째, 사용자가 잠시 터미널에서 멀어질 경우 사용자의 모든 작업이 저장되도록 확보할 수 있다는 것이고, 둘째, 사용자가 실제로 입력을 하고 있을 때 자동 저장을 어느 정도 피할 수 있다는 점이다.


Emacs는 치명적 오류가 발생할 때에도 자동 저장을 실행한다. 여기에는 '

kill %emacs

' 와 같은 셸 명령어로 Emacs 작업을 종료(kill)하거나 전화선 또는 네트워크 연결을 끊는 작업도 포함된다.


M-x do-auto-save 명령어를 이용해 자동 저장을 직접 실행할 수도 있다.


자동저장으로부터 데이터 복구하기

M-x recover-file RET file RET 명령어를 통해 자동저장 파일의 내용을 이용해 데이터 손실로부터 복구할 수 있다. 이는 file을 방문한 후 (승인을 받고 나서) 자동저장 파일

#file#

로부터 내용을 복구한다. 이후 사용자는 C-x C-s 를 이용해 복구된 텍스트를 file 자체로 넣는다. 예를 들어 자동저장 파일

#foo.c#

에서

foo.c

파일을 복구하려면 다음을 실행한다:


M-x recover-file RET foo.c RET
yes RET
C-x C-s


M-x recover-file 은 승인을 요청하기 전에 명시된 파일과 자동저장 파일을 설명하는 디렉터리 목록을 표시하여 사용자가 크기와 일자를 비교할 수 있도록 한다. 자동저장 파일이 오래된 경우 M-x recover-file 은 읽기를 제공하지 않는다.


Emacs 또는 컴퓨터가 충돌 시에는 M-x recover-session 명령어를 이용해 자동 저장 파일에서 편집 중이던 파일을 모두 복구시킬 수 있다. 이는 먼저 기록된 중단(interrupted) 세션 목록을 표시한다. 선택할 세션으로 포인트를 이동시킨 후 C-c C-c 를 입력한다.


이후

recover-session

은 해당 세션 중에 편집 중이던 파일마다 복구시킬 것인지 묻는다. y 를 누르면

recover-file

을 호출하여 보통대로 작동한다. 이는 원본 파일과 자동저장 파일의 일자를 표시하고, 해당 파일을 복구할 것인지 다시 묻는다.


recover-session

이 완료되면 사용자가 복구하기로 선택한 파일이 Emacs 버퍼에 나타난다. 이제 사용자가 저장할 차례다. 저장을 해야만 파일 자체가 업데이트된다.


Emacs는 중단된 세션에 관한 정보를 {{RoundTitleNavy|~/.emacs.d/auto-save-list/{{ 디렉터리의

.saves-pid-hostname

이란 파일로 저장한다. 디렉터리는

auto-save-list-file-prefix

변수로 결정된다.

auto-save-list-file-prefix

nil

로 설정하면 세션은 복구용으로 기록되지 않는다.


파일명 별칭

심볼릭 링크와 하드 링크 둘 다 여러 개의 이름으로 동일한 파일을 참조할 수 있게 만든다. 하드 링크는 파일을 직접 참조하는 대안 이름으로, 모든 이름이 동일하게 유효하고 하나가 선호되는 일이 없다. 반면 심볼릭 링크는 정의된 별칭과 같아서

foo

bar

에 대한 심볼릭 링크라면 둘 중 하나를 이용해 파일을 참조할 수 있지만

bar

는 진짜 이름이고

foo

는 별칭일 뿐이다. 심볼릭 링크가 디렉터리를 가리키면 더 복잡한 사례가 발생한다.


보통 사용자가 방문하는 파일을 Emacs가 다른 이름으로 방문 중일 경우 Emacs는 에코 영역에 메시지를 표시하고 해당 파일을 방문하는 기존의 버퍼를 사용한다. 이는 하드 링크나 심볼릭 링크를 지원하는 시스템 혹은 사용자가 긴 파일명을 절단하는 시스템에서 긴 이름을 사용할 경우, 아니면 대, 소문자에 민감한 파일 시스템의 경우에 발생한다. 이 때

find-file-suppress-same-file-warnings

변수를

nil

이 아닌 값으로 설정하면 메시지를 감출(suppress) 수 있다.

find-file-existing-other-name

변수를 nil로 설정하면 기능을 완전히 끄게 되므로 사용자가 두 개의 다른 이름으로 동일한 파일을 방문할 경우 파일 이름마다 다른 버퍼를 얻게 될 것이다.


find-file-visit-truename

변수가

nil

이 아닌 경우 버퍼에 기록된 파일명은 당신이 명시하는 이름보다는 파일의 truename 이 (모든 심볼릭 링크가 대상 이름으로 대체되어 만들어진 이름) 된다.

find-file-visit-truename

find-file-existing-other-name

의 효과를 나타내기도 한다.


때로는 디렉터리가 심볼릭 링크를 통해 일반적인 방식으로 접근되는데, Emacs가 "링크된" 이름을 표시하는 편을 선호하는 사용자도 있을지 모른다. 이런 경우

directory-abbrev-alist

를 맞춤화한다. 해당 목록의 각 요소는 형태를

(from . to )

갖고 있고, 이는 디렉터리명에서 from이 나타날 때마다 from을 to로 대체함을 의미한다. from 문자열은 정규 표현식이다(97 페이지의 12.6절 [Regexps] 참고). 이는 첫 번째 문자에 앵커(anchor)된 디렉터리명에 일치시킨 결과로, '\'로 시작되어야 한다(새 행이 포함된 디렉터리명을 지원하기 위함으로, '^'보다 우선한다). to 문자열은 to 문자열에서 홈 디렉터리를 뜻하며, Emacs는 이러한 대체를 따로 실행한다.

/fsf

라는 심볼릭 링크를 통해

/home/fsf

로 접근하는 시스템에서 한 가지 예를 들겠다:

(("\\'home/fsf" . "/fsf"))


파일 디렉터리

파일 시스템은 파일을 directories로 그룹화한다. directory listing 은 디렉터리 내 모든 파일의 목록이다. Emacs는 디렉터리를 생성 및 삭제하고 디렉터리 목록을 간략한 (파일명으로만 이루어진) 포맷과 자세한 (크기, 일자, 작성자가 포함된) 포맷으로 만드는 명령어를 제공한다. Emacs는 Dired라는 디렉터리 브라우저 기능도 포함하는데, 이는 315 페이지의 27장 [Dired]를 참고한다.


C-x C-d dir-or-pattern RET 간략한 디렉터리 목록을 표시한다(

list-directory

).


C-u C-x C-d dir-or-pattern RET 자세한 디렉터리 목록을 표시한다.


M-x make-directory RET dirname RET dirname 이라는 새 디렉터리를 생성한다.


M-x delete-directory RET dirname RET dirname 이라는 디렉터리를 삭제한다. 비어 있지 않은 경우 재귀적으로 삭제할 것인지 묻는다.


디렉터리 목록을 표시하는 명령어는 C-x C-d (

list-directory

)이다. 해당 명령어는 미니버퍼를 이용해 파일명을 읽는데, 파일명은 열거할 디렉터리이거나 열거할 파일에 대한 와일드카드를 포함하는 패턴으로 되어 있다. 예를 들어,


C-x C-d /u2/emacs/etc RET


위를 이용하면

/u2/emacs/etc

디렉터리 내 모든 파일을 열거한다. 파일명 패턴을 명시하는 예를 들어보겠다:


C-x C-d /u2/emacs/src/*.c RET


보통 C-x C-d 는 파일명만 포함하는 간략한 디렉터리를 표시한다. 수치적 인자(값과 상관없이)는 크기, 일자, 소유자를 포함한 자세한 목록을 만들 것을 알린다('

ls -l

'처럼).


디렉터리 리스팅의 텍스트는 대부분 하위(inferior) 프로세스에서

ls

를 실행하여 얻는다. 두 개의 Emacs 변수들이

ls

로 전달된 스위치를 제어하는데,

list-directory-brief-switches

는 사용할 스위치를 간략한 목록으로 (기본값 "

-CF

") 제공하는 문자열이고,

list-directory-verbose-switches

는 사용할 스위치를 긴 목록으로 (기본값 "

-l

") 제공하는 문자열이다.


긴 디렉터리 목록에서 Emacs는 디렉터리를 포함한 디스크에 빈 공간에 대한 정보를 추가한다. 이를 위해

directory-free-space-args

를 인자로 하여

directory-free-space-program

이 명시한 프로그램을 실행한다.


M-x delete-directory 명령어는 미니버퍼를 이용해 디렉터리명 입력을 요구하고, 디렉터리가 비어 있다면 그것을 삭제한다. 디렉터리가 비어 있지 않으면 재귀적으로 삭제하길 원하는지 사용자에게 물을 것이다. "Trash"(또는 "Recycle Bin") 기능이 있는 시스템에서는 이 명령어로 하여금 명시된 디렉터리를 완전히 삭제하는 대신 Trash로 이동하도록 만들 수도 있는데,

delete-by-moving-to-trash

변수를

t

로 설정하면 된다. Trash 에 관한 추가 정보는 140 페이지의 15.10절 [다양한 파일 연산]을 참고한다.


파일 비교하기

M-x diff 명령어는 미니버퍼를 이용해 두 개의 파일명을 입력하도록 요구하고, 두 파일의 차이를

*diff*

라는 버퍼에 표시한다. 이는

diff-switches

변수로부터 얻은 옵션을 이용해

diff

프로그램을 실행함으로써 작용한다.

diff-switches

의 값은 문자열이어야 하고, 기본값은 컨텍스트

diff

를 명시하는 "

-c

"이다.

diff

프로그램에 관한 추가 정보는 Comparing and Merging Files의 "Diff" 절을 참고한다.


diff

명령어의 출력은 Diff 모드라는 주 모드를 이용해 표시된다. 138 페이지의 15.9절 [Diff 모드]를 참고한다.


M-x diff-backup 명령어는 명시된 파일을 가장 최근 백업에 비교한다. 백업 파일명을 명시하면

diff-backup

은 그것을 백업의 원본 소스 파일과 비교한다. 그 외에는 M-x diff 와 행동 방식이 동일하다.


M-x diff-buffer-with-file 명령어는 명시된 파일을 그에 상응하는 파일과 비교한다. 이는 사용자가 버퍼를 저장할 경우 사용자가 파일에서 변경한 내용을 표시한다.


M-x compare-windows 명령어는 현재 창의 텍스트와 다음 창의 텍스트를 비교한다. (Emacs에서 창에 관한 추가 정보는 156 페이지의 17장 [창] 참고). 비교는 해당하는 버퍼에서 마크 링에 각 초기 포인트 값을 민 후에 각 창에 포인트에서 시작된다. 그리고 각 창에서 포인트를 한 번에 하나의 문자만큼 순방향으로 이동시키고, 이러한 이동은 일치하지 않는 문자에 도달할 때까지 지속된다. 그러한 문자에 도달하면 명령어가 종료된다.


M-x compare-windows 명령어를 실행할 때 두 창의 포인트 다음에 non-matching(일치하지 않는) 텍스트가 따라오면 두 창에서 일치하는 텍스트까지 직관적으로 앞서기(advance up)를 시도한 후 종료한다. 따라서 사용자가 M-x compare-windows 를 반복 사용할 경우 명령어는 매번 일치하는 범위를 건너뛰거나 또 다른 범위의 시작을 찾는다.


수치적 인자와 함께

compare-windows

를 이용하면 여백에 변경된 내용은 무시한다.

compare-ignore-case

변수가

nil

이 아닌 경우 비교는 대, 소문자의 차이도 무시한다.

compare-ignore-whitespace

변수가

nil

이 아닌 경우

compare-windows

는 보통 여백에 변경된 내용은 무시하는데, 접두 인자를 사용하면 기능을 꺼버린다.


diff3

프로그램으로부터 출력을 편집하는 부 모드인 Smerge 모드를 켜기 위해 M-x smerge-mode 를 이용할 수 있다. 이는 주로 파일에 충돌하는 변경 내용으로 인해

VC

외부의 버전 관리 시스템 "업데이트"로부터 합치기(merge)가 실패한 결과이다. Smerge 모드는 구체적 변경 내용을 선택함으로써 충돌을 해결하는 명령어를 제공한다.


파일 통합을 위한 강력한 인터페이스를 제공하는 Emerge 기능은 Specialized Emacs Features의 "Emerge" 절을 참고한다.


Diff 모드

Diff 모드는 M-x diff 와 다른 유사한 명령어의 출력에 사용되는 주 모드이다. 이러한 유형의 출력을 패치라고 부르는데, 명시된 변경 내용을 자동으로 적용하는

patch

명령어로 전달이 가능하기 때문이다. Diff 모드를 수동으로 선택하려면 M-x diff-mode 를 입력한다.


패치에 명시된 변경 사항은 헝크(hunks)로 그룹화되는데, 이것은 하나 또는 그 이상의 변경된 행을 포함하는 연속 텍스트 청크를 의미한다. 헝크는 변경 내용에 대한 컨텍스트를 제공하기 위해 변경되지 않은 행을 포함하기도 한다. 각 헝크 앞에는 헝크 헤더가 위치하는데 이는 헝크가 발생하는 기존 행 번호와 새로운 행 번호를 명시한다. Diff 모드는 각 헝크 헤더를 강조하여 헝크의 실제 내용으로부터 헤더를 구별한다.


Diff 모드 버퍼는 여느 다른 버퍼와 같이 편집이 가능하다. (읽기 전용일 경우 쓰기 가능하게 만들어야 한다. 149 페이지의 16.3절 [다양한 버퍼]를 참고한다.) 사용자가 청크를 변경할 때마다 Diff 모드는 패치가 "올바르게" 유지되도록 자동으로 헝크 헤더에서 행 번호를 수정하려 한다. 자동 행 번호 수정을 비활성화하려면

diff-update-on-the-fly

변수를

nil

로 변경한다.


Diff 모드는 Compilation 모드와 비슷하게 헝크마다 "오류 메시지"로 취급한다. 따라서 그에 해당하는 소스 위치로 방문하기 위해서는 C-x ' 와 같은 명령어를 사용한다. 262 페이지의 24.2절 [컴파일 모드]를 참고한다.


또한 Diff 모드는 패치의 부분을 탐색, 조작, 적용하는 명령어로 다음을 제공한다:


M-n 다음 헝크 시작(hunk-start)으로 이동한다(

diff-hunk-next

).

이 명령어에는 한 가지 부작용이 있는데, 바로 사용자가 이동하는 헝크를 이 명령어가 재정의하여 더 나은 세분성(granularity)으로 변경 내용을 강조한다는 점이다. 이 기능을 비활성화하려면 Diff Auto-Refine 부 모드를 토글하여 끄는 M-x diff-auto-refine-mode 를 입력한다. Diff Auto Refine 모드를 기본적으로 비활성화하려면 아래 내용을 init 파일에 추가한다(422 페이지의 33.2.2절 [훅] 참고):
(add-hook 'diff-mode-hook
	(lambda () (diff-auto-refine-mode -1)))


M-p 이전 헝크 시작으로 이동한다(

diff-hunk-prev

). M-n 과 마찬가지로 사용자가 이동하는 헝크를 재정의하는 부작용이 있으므로 원치 않을 경우 Diff Auto-Refine 모드를 비활성화한다.


M-} 다중 파일 패치에서 다음 파일 시작으로 이동한다(

diff-file-next

).


M-{ 다중 파일 패치에서 이전 파일 시작으로 이동한다(

diff-file-prev

).


M-k 포인트에 위치한 헝크를 제거한다(

diff-hunk-kill

).


M-K 다중 파일 패치에서 현재 파일 부분을 제거한다(

diff-file-kill

).


C-c C-a 해당 헝크를 그 대상 파일에 적용한다(

diff-apply-hunk

). C-u 의 접두 인자를 이용해 해당 헝크를 되돌린다.


C-c C-b 포인트에 위치한 헝크의 변경 내용을 더 정밀한 세분성으로 강조한다(

diff-refine-hunk

). 각 변경된 행에서 정확히 어떤 부분이 실제로 변경되었는지 확인하도록 해준다.


C-c C-c 해당 헝크에 해당하는 소스 파일과 행으로 이동한다(

diff-goto-source

).


C-c C-e 패치를 이용해 Ediff 세션을 시작한다(

diff-ediff-patch

). Ediff Manual의 "Ediff" 절을 참고한다.


C-c C-n 보기를 현재 헝크로 제한한다(

diff-restrict-view

). 73페이지의 11.5절 [좁히기]를 참고한다. C-u 의 접두 인자를 이용해 다중 파일 패치의 현재 파일로 보기를 제한한다. 다시 넓히기 위해서는 C-x n w (widen)를 사용한다.


C-c C-r 전체 버퍼에 대한 비교 방향을 바꾼다(

diff-reverse-direction

).


C-c C-s 포인트에서 헝크를 나눈다(

diff-split-hunk

). 수동으로 패치를 편집하기 위한 것으로,

diff

프로그램에 대해

-u

또는

--unified

옵션으로 생성된 unified diff format 을 이용해야만 작동된다.

diff

에 대해

-c

또는

-context

옵션으로 생성된 context diff format 에서 헝크를 나눌 필요가 있을 경우 먼저 C-c C-u 를 이용해 버퍼를 통합된 diff 포맷으로 변환한다.


C-c C-d 전체 버퍼를 컨텍스트 diff 포맷(diff-unified->context)으로 변환한다. 접두 인자를 이용해 영역 내의 텍스트만 변환한다.


C-c C-u 전체 버퍼를 통합된 diff 포맷(diff-context->unified)으로 변환한다. 접두 인자를 이용해 통합된 포맷을 컨텍스트 포맷으로 변환한다. 마크가 활성화되면 영역 내의 텍스트만 변환한다.


C-c C-w 여백의 변경 내용을 무시하도록 현재 헝크를 재정의한다(

diff-refine-hunk

).


C-x 4 A C-x 4 a 와 같이 (297 페이지의 25.2절 [로그 변경] 참고) 헝크마다 ChangeLog 엔트리를 생성한다(

diff-add-change-log-entries-other-window

). 이는 후에 변경 내용의 실제 설명으로 채울 수 있는 변경 내용의 로그 스켈레톤(sksleton)을 생성한다. Diff 모드에서 C-x 4 a 자체는 현재 헝크의 파일을 대신하여 작동하지만 패치 자체로부터 함수명을 얻는다. 이는 패치에 의해 삭제된 함수의 로그 엔트리를 만들 때 유용하다.


패치는 수정된 행에서 의도하지 않고 원하지 않은 변경 내용인 끝줄 공백을 포함하곤 한다. 이 문제를 처리하는 방법에는 두 가지가 있다. 첫째, Diff 버퍼에서 Whitespace 모드를 활성화하면 (82 페이지의 11.16절 [쓸모 없는 여백] 참고) 수정된 행에서 자동으로 끝줄 여백을 강조한다. 둘째, 패치에 의해 수정된 끝줄 공백을 검색하여 패치와 패치된 소스 파일(들)에 위치한 공백을 모두 제거하는 M-x diff-delete-trailing-whitespace 명령어를 사용하는 방법이 있다. 이 명령어는 수정하는 내용을 저장하지 않으므로 사용자가 변경 내용의 저장 여부를 결정해야 한다(수정된 파일 목록은 에코 영역에 표시된다). 접두 인자를 이용하면 패치된 소스 파일이 아닌 원본 소스 파일의 수정을 시도한다.


다양한 파일 연산

Emacs는 파일에 그 외 다수의 연산을 실행하는 명령어를 갖고 있다. 이 모든 명령어들은 하나의 파일에 작동하고, 와일드카드 파일명을 허용하지 않는다.


M-x delete-file 은 파일의 입력을 요구하여 삭제한다. 한 디렉터리에서 많은 파일을 삭제할 경우

delete-file

보다 Dired를 사용하는 편이 더 편리하다. 316 페이지의 27.3절 [Dired 삭제]를 참고한다.


M-x move-file-to-trash 는 파일을 Trash (또는 Recycle Bin)로 이동시킨다. 이는 대부분의 운영체제에서 이용할 수 있는 기능으로, Trash 로 이동되는 파일은 후에 마음이 바뀌면 다시 가져올 수도 있다.


기본적으로 Emacs 삭제 명령어는 Trash 를 사용하지 않는다. 일반적 삭제 명령어에 Trash를 (이용 가능한 경우) 이용하려면

delete-by-moving-to-trash

변수를

t

로 변경한다. 이는 M-x delete-fileM-x delete-directory 명령어를 비롯해 (136 페이지의 15.7절 [디렉터리] 참고) Dired의 삭제 명령어에 (316 페이지의 27.3절 [Dired 삭제] 참고) 영향을 미친다. M-x delete-file 또는 M-x delete-directory 에 접두 인자를 제공하면

delete-by-moving-to-trash

와 상관없이 Trash 를 이용하지 않고 완전 삭제시킨다.


M-x copy-fileold 파일을 읽고 새로운 내용을 가진 new 라는 새 파일을 쓴다.


M-x copy-directory

cp -r

셸 명령어와 비슷하게 디렉터리를 복사한다. old 디렉터리와 대상 디렉터리 new 의 입력을 요한다. new 가 이미 존재하는 디렉터리일 경우 old 디렉터리의 복사본을 생성하여 그것을 new 에 넣는다. new 가 기존에 있는 디렉터리가 아닐 경우 old 의 내용을 모두 new 라는 새 디렉터리로 복사한다.


M-x rename-file 은 미니버퍼를 이용해 oldnew 라는 두 개의 파일명을 읽은 후 old 파일을 new 로 재명명한다. 파일명 new 가 이미 존재할 경우

yes

로 승인해야 하고, 승인하지 않으면 재명명은 완료되지 않는데, 재명명은 new 의 오래된 의미를 손실시키기 때문이다. oldnew 가 서로 다른 파일 시스템에 있을 경우 old 파일이 복사되어 삭제된다. new 인자가 디렉터리명에 불과할 경우 실제 새 이름은 old 와 동일한 non-directory 구성요소와 함께 그 디렉터리에 위치한다. 예를 들어 M-x rename-file RET ~/foo RET /tmp RET

~/foo

/tmp/foo

로 재명명한다. 이 절에 소개된 나머지 명령어들도 모두 동일한 규칙이 적용된다. 명령어 모두 새 파일명이 이미 존재할 경우 승인을 요청할 것이다.


M-x add-name-to-file 은 오래된 이름을 제거하지 않고 기존 파일에 이름을 추가한다. 새 이름은 기존 파일에 대한 "하드 링크"로 생성된다. 새 이름은 파일이 위치한 것과 동일한 파일 시스템에 속한다. MS-Windows에서 이 명령어는 파일이 NTFS 파일 시스템에 상주할 때에만 작동한다. MS-DOS에서는 파일을 복사하여 작동한다.


M-x make-symbolic-link 는 두 개의 파일명 target과 linkname 을 읽은 후 target을 가리키는 linkname 이란 심볼릭 링크를 생성한다. 후에 linkname 이란 파일을 열면 파일을 열 당시 target이란 이름을 가진 파일을 참조하고, 당시에 target 이란 이름이 존재하지 않으면 오류가 표시될 것이다. 이 명령어는 인자 target 을 확장하지 않으므로 링크의 대상으로서 상대적 이름을 명시할 수 있도록 해준다. MS-Windows에서 이 명령어는 MS Windows Vista 이후 버전에서만 작동한다.


M-x insert-file (또는 C-x i)은 명시된 파일의 사본을 포인트에 있는 현재 버퍼로 복사하고, 포인트는 내용 앞에 변경되지 않은 채 둔다. 마크를 활성화하지 않은 채 삽입된 내용 뒤의 위치가 마크 링으로 추가된다(48 페이지의 8.4절 [마크 링] 참고).


M-x insert-file-literally 는 파일이 "말 그대로" 삽입된다는 점만 제외하면 M-x insert-file 과 같아서 특별한 부호화나 규칙이 없는 ASCII 문자의 시퀀스로 취급되므로 M-x find-file-literally 명령어와 유사하다(123 페이지의 15.2절 [방문하기] 참고).


M-x write-regionM-x insert-file 의 정반대로, 영역의 내용을 명시된 파일로 복사한다. M-x append-to-file 은 영역의 텍스트를 명시된 파일의 끝으로 추가한다. 59 페이지의 9.4절 [텍스트 누적하기]를 참고한다. write-region-inhibit-fsync 변수는 이러한 명령어를 비롯해 파일 저장에 적용된다. 관련 내용은 130 페이지의 15.3.3절 [저장 맞춤화하기]를 참고한다.


M-x set-file-modes 는 파일명 다음에 따라오는 파일 모드를 읽어 해당 파일 모드를 명시된 파일에 적용한다. 파일 권한(file permissions)이라고도 불리는 File 모드는 파일이 읽기 가능한지, 누구에게 쓰는지, 실행 가능한지, 누가 쓰는지를 결정한다. 이 명령어는 chmod 명령어에서 허용하는 것과 동일한 부호 또는 8진수 포맷을 이용하여 파일 모드를 읽는데, 가령 'u+x'는 파일을 소유한 사용자를 위해 실행 권한을 추가함을 의미한다. 파일 모드를 지원하지 않는 운영 체제에는 영향을 미치지 않는다. chmod 는 이 기능을 위한 편의 명령어다.


압축 파일 접근하기

Emacs는 사용자가 압축 파일로 방문하면 자동으로 압축 해제를 진행하고, 사용자가 그러한 파일을 수정하여 저장하면 자동으로 재압축을 실행한다. Emacs는 압축 파일을 파일명으로 인식한다. '

.gz

' 로 끝나는 파일명은

gzip

으로 압축된 파일을 나타낸다. 그 외 이름으로 끝나는 파일은 그 외 압축 프로그램을 나타낸다.


자동 압축해제 및 압축은 Emacs가 파일 내용을 사용하는 연산에 모두 적용된다. 이는 파일 방문, 저장, 그 내용을 버퍼에 삽입, 로딩, 컴파일하는 바이트를 포함한다.


해당 기능을 비활성화하려면 M-x auto-compression-mode 명령어를 입력한다.

auto-compression-mode

변수를 맞춤화하면 이 기능을 영구적으로 비활성화할 수 있다.


파일 아카이브

'

.tar

'로 끝나는 이름을 가진 파일은 보통

tar

프로그램에 의해 만들어진 아카이브다. Emacs는 Dired와 같은 내용 목록을 제공하는 Tar 모드라는 특수 모드에서 이러한 파일을 볼 수 있다(315 페이지의 27장 [Dired] 참고). Dired에서와 마찬가지로 목록을 이동하고 아카이브에 포함된 하위파일을 방문할 수 있다. 하지만 Tar 모드에서 Dired 명령어를 모두 이용할 수 있는 것은 아니다.


Auto Compression 모드가 활성화되면 (141 페이지의 15.11절 [압축 파일] 참고) 압축 아카이브에 ('

.tgz

',

.tar.Z

,

.tar.gz

확장자를 가진 파일) 역시 Tar 모드가 사용된다.


e, f, RET 키는 모두 구성요소 파일을 고유의 버퍼에 압축 해제한다. 그 버퍼에서 편집이 가능하고, 버퍼를 저장하면 편집된 버전이 Tar 버퍼에 있는 버전을 대체할 것이다. Tar 버퍼에서 파일명을 마우스로 클릭하여도 동일한 효과를 볼 수 있다. v 는 View 모드에서 파일을 버퍼로 압축 해제한다(73 페이지의 11.6절 [뷰 모드] 참고). o 는 파일을 압축 해제하여 다른 창에 표시하므로 파일을 편집하는 동시 아카이브에 작업할 수 있다.


d 는 사용자가 Dired에서처럼 후에 x 를 사용 시 삭제할 파일을 표시하고, u 는 파일의 표시를 해제한다. C 는 아카이브로부터 파일을 디스크로 복사하고, R 은 아카이브 내에서 파일을 재명명한다. g 는 디스크 상에서 아카이브로부터 버퍼를 되돌린다. M, G, O 키는 각각 파일의 권한(permission) 비트, 그룹, 소유자를 변경한다.


Tar 버퍼를 저장하면 사용자가 구성요소에 적용한 변경 사항과 함께 아카이브의 새 버전을 디스크로 쓴다.


Emacs가 아카이브를 직접 읽으므로 Tar 모드를 사용하는 데에

tar

프로그램이 필요한 것은 아니다. 하지만 압축 아카이브로 접근하기 위해선 적합한 압축 해제 프로그램이 필요하다.


arc

,

jar

,

lzh

,

zip

,

rar

,

7z

,

zoo

아카이브를 비롯해 자체 압축 해제가 되는 실행 가능 (executables)

exe

파일에 대해서도 약간은 다르지만 유사한 Archive 모드가 사용된다.


Archive 모드의 키 바인딩은 Tar 모드의 키 바인딩과 유사하나 잇따른 연산을 위한 파일을 표시하는 m 키와 표시된 파일을 모두 표시 해제하는 M-DEL 키가 추가된다. 또한 a 키는 하나의 행에 들어맞지 않는 아카이브 유형에 대해 세부 파일 정보의 표시 여부를 토글한다. 하위파일 재명명, 또는 그 모드나 소유자 변경과 같은 연산들은 아카이브 포맷 일부에 대해서만 지원된다.


Tar 모드와 달리 Archive 모드는 아카이브를 압축, 압축 해제하는 아카이빙(archiving) 프로그램을 실행한다. 하지만 사용자가 아카이브에 하위파일을 압축 해제하거나 조작하기 위한 용도로 내용의 아카이브 테이블을 살펴보는 데에는 이러한 프로그램이 필요하지 않다. 프로그램 이름과 옵션에 대한 세부 내용은 '

Archive

' Customize 그룹에서 설정 가능하다.


원격 파일

특수 파일 구문을 이용해 다른 머신에 위치한 파일을 참조할 수도 있다:

/host:filename 
/user@host:filename 
/user@host#port:filename 
/method:user@host:filename 
/method:user@host#port:filename


이 요청을 시행하기 위해 Emacs는

ftp

,

ssh

,

rlogin

,

telnet

과 같은 원격 로긴 프로그램을 사용한다. 언제든 사용할 방법을 파일명에 명시할 수 있는데,

/ftp:user@host:filename

은 FTP를 사용하는 반면

/ssh:user@host:filename

은 ssh를 사용한다. 파일명에 방법을 명시하지 않으면 Emacs는 다음과 같이 방법을 선택한다:

  1. 호스트명이 '
    ftp.
    '(점 포함)로 시작되면 Emacs는 FTP를 사용한다.
  2. 사용자명이 '
    ftp
    ' 또는 'anonymous'일 경우 Emacs는 FTP를 사용한다.
  3. tramp-default-method
    변수가 '
    ftp
    '로 설정된 경우 Emacs는 FTP를 사용한다.
  4. ssh-agent
    가 실행 중일 경우 Emacs는
    scp
    를 사용한다.
  5. 그 외의 경우 Emacs는
    ssh
    를 사용한다.


tramp-mode

변수를

nil

로 설정하여 원격 파일명 기능을 완전히 끌 수도 있다. '

/:

' 를 이용해 파일명을 인용하면 각 사례마다 기능을 끄는 것도 가능하다(143 페이지의 15.14절 [인용된 파일명] 참고).


FTP를 통한 원격 파일 접근은 아래 문서화된 Ange-FTP 패키지에서 처리한다. 원격 파일은 Tramp 패키지에서 처리하는 다른 방법들을 통해 접근되는데, 이 패키지에 대한 내용은 자체 매뉴얼, The Tramp Manual을 참고한다.


Ange-FTP 패키지가 사용되면 Emacs는 원격 파일명에 명시된 이름이 user일 경우 user 이름을 이용해 FTP를 통해 로그인을 한다. user가 명시되지 않은 경우 Emacs는 로컬 시스템의 사용자 이름을 이용해 로그인하지만

ange-ftp-default-user

변수를 문자열로 설정했다면 해당 문자열이 대신 사용된다. Emacs는 로그인 시 비밀번호도 요청한다.


성능을 이유로 Emacs는 FTP를 통해 접근하는 파일에 대해서는 기본적으로 백업 파일을 만들지 않는다. 이를 활성화하려면

ange-ftp-make-backup-files

변수를

nil

이 아닌 값으로 변경한다.


기본적으로 원격 파일에 대한 자동저장 파일은 로컬 머신에서 임시 파일 디렉터리에 만들어지는데, 해당 디렉터리는

auto-save-file-name-transforms

변수에서 명시된다. 133 페이지의 15.5.1절 [자동 저장 파일]을 참고한다.


익명의 FTP가 접근 가능한 파일을 방문하려면 '

anonymous

' 또는 '

ftp

' 라는 특수 사용자명을 사용한다. 이러한 사용자명에 대한 비밀번호는 특별하게 취급된다. 무슨 일이 일어나는지는

ange-ftp-generate-anonymous-password

변수가 제어하는데, 이 변수의 값은 문자열이므로 그 문자열이 비밀번호로 사용되고,

nil

이 아닌 경우에는 (기본값)

user-mail-address

의 값이 사용되는 반면,

nil

인 경우 Emacs는 언제나처럼 사용자에게 비밀번호 입력을 요구할 것이다(34 페이지의 5.7절 [비밀번호] 참고).


중간에 방화벽으로 인해 보안을 이유로 연결을 차단할 수 있으므로 원격 머신에 위치한 파일에 접근할 수 없는 경우도 종종 있다. 접근 가능한 게이트웨이(gateway) 머신에서 대상 파일로 로그인할 수 있다면 원격 파일명도 여전히 사용 가능한데, 이를 위해선

ange-ftp-gateway-host

변수를 설정함으로써 게이트웨이 머신의 이름을 명시하고

ange-ftp-smart-gateway

t

로 설정하면 된다. 혹은 원격 파일명이 작동하도록 만드는 것도 가능하나 그 절차가 복잡하다. M-x finder-commentary RET ange-ftp RET 을 입력하여 지시사항을 읽을 수도 있겠다.


인용된 파일명

특수 문자나 구문이 특수 효과를 갖지 못하도록 절대 파일명을 인용할 수 있다. 이를 수행하는 방법은 시작 부분에 '

/:

'를 추가하는 것이다.


예를 들어 원격 파일명으로 취급하지 않도록 원격으로 나타나는 로컬 파일명에 인용 부호를 붙일 수 있다. 따라서

/foo:

라는 디렉터리가 있고 그 안에

bar

라는 파일이 있다면 Emacs에서 그 파일은 '

/:/foo:bar

'로 참조할 수 있다.


'

/:

'는 '

~

'가 사용자의 홈 디렉터리에서 특수 문자로 취급되지 않도록 방지한다. 가령

/:/tmp/~hack

/tmp

디렉터리에서

~hack

이란 이름을 가진 파일을 참조한다.


'

/:

' 를 이용한 인용 부호 역시 '

$

'를 포함하는 파일명을 미니버퍼에 입력하는 방법이다. 이것을 가능하게 하려면 미니버퍼 내용 시작에 '

/:

'가 위치해야 한다. (각 '

$

'를 이중으로 할 수도 있으며, 122 페이지의 [$를 이용한 파일명]을 참고한다.)


방문을 위해 '

/:

'를 이용해 와일드카드 문자를 인용할 수도 있다. 예를 들어

/:/tmp/foo*bar

/tmp/foo*bar

파일을 방문한다.


/tmp/foo*bar

에만 일치하는 와일드카드 명세인

/tmp/foo[*]bar

를 입력하여도 동일한 결과를 얻을 것이다. 하지만 대다수의 경우 와일드카드 문자는 인용하지 않더라도 올바른 결과를 제공하기 때문에 인용 부호를 사용할 필요가 없다. 예를 들어

/tmp

에서 '

foo

' 로 시작하고 '

bar

' 로 끝나는 파일명만

foo*bar

이므로

/tmp/foo*bar

라고 입력하면

/tmp/foo*bar

만 방문할 것이다.


파일명 캐시

파일이 정확히 어디에 위치하는지 기억할 필요 없이 파일을 이름으로 쉽게 위치시키기 위해서는 파일명 캐시를 이용할 수 있다. 미니버퍼에 파일명을 입력하면 C-TAB (

file-cache-minibuffer-complete

)이 파일명 캐시를 이용해 입력을 완료한다. C-TAB 을 반복하면 사용자가 원래 입력하였던 입력 내역을 순환한다. (하지만 C-TAB 문자는 대부분 텍스트 터미널에서 입력할 수가 없음을 명심한다.)


파일명 캐시는 자동으로 채워지지 않는다. 대신 아래의 명령어를 이용해 캐시로 파일명을 로딩해야 한다.


M-x file-cache-add-directory RET directory RET directory 의 각 파일명을 파일명 캐시에 추가한다.


M-x file-cache-add-directory-using-find RET directory RET directory 와 그에 포함된(nested) 모든 하위디렉터리의 각 파일명을 파일명 캐시에 추가한다.


M-x file-cache-add-directory-using-locate RET directory RET directory 와 그에 포함된(nested) 모든 하위디렉터리의 각 파일명을

locate

를 이용하여 찾은 후 파일명 캐시에 추가한다.


M-x file-cache-add-directory-list RET variable RET variable에 열거된 각 디렉터리 내 각 파일명을 파일명 캐시에 추가한다. variable

load-path

처럼 디렉터리명 목록을 값으로 가진 Lisp 변수여야 한다.


M-x file-cache-clear-cache RET 캐시를 제거, 즉 캐시에서 파일명을 모두 제거한다.


파일명 캐시는 영구적이지 않으며 Emacs 세션이 지속되는 동안에만 유지, 보관된다.

file-cache-display

명령어를 이용해 캐시 내용을 확인할 수 있다.


파일을 찾는 편의 기능

이번 절에서는 최근에 연 파일 찾기, 버퍼로부터 파일명 읽기, 이미지 파일 보기를 위한 편리한 기능을 몇 가지 소개한다.


M-x recentf-mode 를 이용해 Recentf 모드를 활성화하면 '

File

' 메뉴에 최근에 연 파일 목록을 포함하는 하위 메뉴가 생긴다. M-x recentf-save-list 는 현재

recent-file-list

를 파일로 저장하고, M-x recentf-edit-list 를 이용해 편집한다.


M-x ffap 명령어는 종종 포인트에 위치한 텍스트를 기반으로 하여

find-file

을 좀 더 강력한 직관적인 기본값으로 일반화한다(405 페이지의 31.11.3절 [FFAP] 참고). Partial Completion 모드는

find-file

을 확장하면서

ffap

과 함께 이용 가능한 다른 기능들도 제공한다. 32 페이지의 5.4.5절 [완성 옵션]을 참고한다.


이미지 파일을 방문하면 자동으로 Image 모드를 선택한다. 이러한 주 모드에서는 C-c C-c (

image-toggle-display

)를 입력하여 Emacs 버퍼에서 파일을 이미지로 표현하는 선택과 그 기본 텍스트(또는 raw 바이트)로 표현하는 선택을 토글한다. 파일을 이미지로 표현하는 기능은 Emacs가 그러한 이미지 표시를 지원하도록 컴파일되었을 때에만 가능하다. 표시된 이미지가 프레임보다 넓거나 길 경우 일반 포인트 움직임 키(C-f, C-p 등)를 이용해야 이미지의 다른 부분을 표시할 것이다. n (

image-next-file

) 이나 p (

image-previous-file

)를 누르면 동일한 디렉터리에서 각각 다음 이미지 파일과 이전 이미지 파일을 방문할 것이다.


이미지가 애니메이션화 가능하다면 RET (

image-toggle-animation

)는 애니메이션을 시작하거나 중단할 것이다.

image-animate-loop

nil

일 경우 애니메이션은 한 번만 재생된다. f (

image-next-frame

)와 b (

image-previous-frame

)를 이용하면 각 프레임을 거칠 수 있다. F (

image-goto-frame

)를 이용하면 특정 프레임으로 이동할 수 있다. a + (

image-increase-speed

)를 입력하면 애니메이션 속도를 증가시키고, a - (

image-decrease-speed

)는 속도를 감소시키며, a r (

image-reverse-speed

)은 역전(reverse)시킨다. a 0 (

image-reset-speed

) 명령어는 속도를 원래 값으로 리셋한다.


Emacs가 ImageMagick 라이브러리를 지원하도록 컴파일되었다면 ImageMagick을 이용해 다양한 이미지를 렌더링할 수 있다.

imagemagick-enabled-types

변수는 Emacs가 ImageMagick을 이용해 렌더링할 수 있는 이미지 유형을 열거하며, 목록의 각 요소는 각 이미지 유형에 대한 내부 ImageMagick 이름으로서, 부호 또는 그에 해당하는 문자열로 되어 있다(예:

.bmp

이미지의 경우

BMP

). 모든 이미지 유형에 ImageMagick을 활성화하려면

imagemagick-enabled-types

t

로 변경한다.

imagemagick-types-inhibit

변수는

imagemagick-enabled-types

값과 상관없이 ImageMagick을 이용해 절대 렌더링해선 안 되는 이미지 유형을 열거한다(기본 목록은

C

HTML

같은 타입을 포함하므로 ImageMagick을 "이미지"로 렌더링할 수는 있지만 Emacs는 렌더링해선 안 된다.). ImageMagick을 완전히 비활성화하려면

imagemagick-types-inhibit

t

로 변경한다.


Image-Dired 패키지를 이용해 이미지를 텀네일로 볼 수도 있다. 328 페이지의 27.17절 [Image-Dired]를 참고한다.


파일집합

특정 파일 집합을 주기적으로 편집할 경우 그것을 파일집합으로 정의할 수 있다. 정의가 끝나면 방문하기,

query-replace

, 셸 명령어와 같은 특정 연산들을 모든 파일에 한 번에 실행할 수 있게 해준다. 파일집합을 사용하기 위해서는 먼저 (

filesets-init

) 표현식을

init

파일로 추가해야 한다(437 페이지의 33.4절 [Init 파일] 참고). 그러면 메뉴 바에 '

Filesets

' 메뉴가 추가된다.


파일집합을 가장 간단하게 정의하는 방법은 파일을 한 번에 하나씩 파일집합으로 추가하는 방법이다. 파일을 파일집합 name 으로 추가하려면 파일을 방문하여 M-x filesets-add-buffer RET name RET 을 입력한다. name 이란 파일집합이 존재하지 않는다면 초기에 현재 파일만 포함하는 새로운 파일집합을 생성한다. M-x filesets-remove-buffer 명령어는 파일집합으로부터 현재 파일을 제거한다.


M-x filesets-edit (또는 'Filesets' 메뉴에서 'Edit Filesets'를 선택하여)를 이용하면 파일집합 목록을 직접 편집할 수도 있다. 편집은 Customize 버퍼에서 실행된다(412 페이지의 33.1절 [간편한 맞춤화] 참고). 보통 파일집합은 간단한 파일 목록으로 되어 있지만 파일집합을 파일명에 일치하는 정규 표현식으로 정의할 수도 있다. 이렇게 좀 더 복잡한 파일집합의 몇몇 예가 Customize 버퍼에 표시된다. 향후 Emacs 세션에서 동일한 파일집합을 사용하고 싶다면 '

Save for future sessions

'를 선택할 것을 명심한다.


M-x filesets-open 명령어를 이용하면 파일집합 내 모든 파일을 방문하고, M-x filesets-close 를 이용하면 파일들을 닫는다. M-x filesets-run-cmd 를 이용하면 파일집합 내 모든 파일에 셸 명령어를 실행한다. 이러한 명령어들은 이미 존재하는 파일집합마다 하위메뉴로 표시되는 '

Filesets

' 메뉴에서 이용할 수 있다.


"파일집합"의 다른 개념, 즉 버전 관리 연산을 위해 함께 번들된 파일 집합을 나타내는 개념은 281 페이지의 25.1절 [버전 관리]를 참고한다. 그러한 유형의 파일집합은 명명되지 않으므로 Emacs 세션에 걸쳐 지속되지 않는다.


Notes

  1. 사용자의 파일 시스템이 심볼릭 링크를 지원하지 않을 경우 일반 파일이 사용된다.