GNUEmacsManual:19

From 흡혈양파의 번역工房
Revision as of 02:33, 21 April 2016 by Onionmixer (talk | contribs) (GNU Emacs 19장 내용 추가)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
국제 문자 집합 지원

국제 문자 집합 지원

Emacs는 아랍어 스크립트, 브라흐미 스크립트 (벵골어, 힌디어, 타이어), 키릴어, 에티오피아어, 그리스어, 한자(중국어, 일본어), 한글(한국어), 히브리어, IPA 뿐만 아니라 라틴 알파벳의 유럽 및 베트남식 변형체를 포함해 다양한 국제 문자 집합을 지원한다. Emacs는 또한 워드 프로세스나 메일러(mailer)와 같은 국제화된 소프트웨어에서 사용하는 문자의 다양한 부호화를 지원하기도 한다.


Emacs는 모든 관련된 활동을 지원함으로써 국제 문자를 이용한 텍스트 편집을 허용한다:

  • Non-ASCII 문자로 된 파일을 방문하고, non-ASCII 텍스트를 저장하며, Emacs와 그것이 호출하는 프로그램(컴파일러, 맞춤법 검사기, 메일러 등) 간에 non-ASCII 텍스트를 전달할 수 있다. 언어 환경을 설정하면 (179 페이지의 19.2절 [언어 환경] 참고) 부호화 체계와 특정 문화나 언어에 대한 다른 옵션 설정을 처리한다. 아니면 각 명령어에 대한 텍스트를 부호화(encoding) 또는 복호화(decoding)하는 방법을 명시할 수도 있는데, 이는 188 페이지의 19.9절 [텍스트 코딩]을 참고한다.
  • 다양한 스크립트로 부호화된 non-ASCII 문자를 표시할 수 있다. 이는 그래픽 디스플레이에 적절한 폰트를 이용하거나 (192 페이지의 19.14절 [폰트집합 정의하기] 참고) 표시할 텍스트에 특수 코드를 전송함으로써 (191 페이지의 19.12절 [터미널 코딩] 참고) 가능하다. 일부 문자가 올바르지 않게 표시될 때 발생할 수 있는 문제와 해결 방법을 설명하는 195 페이지의 19.16절 [표시할 수 없는 문자]를 참고한다.
  • 텍스트가 자연스럽게 오른쪽에서 왼쪽으로 정렬되는 문자는 표시를 위해 재정렬된다(197 페이지의 19.19절 [양방향 편집] 참고). 이러한 스크립트로는 아랍어, 히브리어, 시리아어, 타나어(Thaana)를 포함해 몇 가지 언어가 있다.
  • Non-ASCII 문자를 삽입하거나 검색할 수도 있다. 이를 위해선 언어에 알맞은 입력 방법을 명시하거나 (182 페이지의 19.4절 [입력 방법 선택] 참고) 언어 환경을 선택할 때 설정된 기본 입력 방법을 이용한다. 키보드가 non-ASCII 문자를 생성할 수 있다면 적절한 키보드 코딩 시스템을 선택할 수 있으며 (191 페이지의 19.12절 [터미널 코딩] 참고) Emacs는 그러한 문자를 허용할 것이다. C-x 8 접두사를 이용해 Latin-1 문자를 입력으로 이용할 수도 있으며, 관련 내용은 195 페이지의 19.17절 [Unibyte 모드]를 참고한다.
    X Windows System을 이용하면 Emcas가 키보드 입력을 올바로 해석하도록 로케일(locale)이 적절한 값으로 설정될 것인데, 179 페이지의 19.2절 [언어 환경]을 참고한다.


이번 장 나머지 부분에서는 이러한 문제들을 상세히 설명하겠다.


국제 문자 집합 소개

국제 문자 집합과 스크립트의 사용자들은 파일을 저장하기 위한 많은 표준 코딩 시스템을 구축해왔다. 이러한 코딩 시스템들은 주로 multibyte로 되어 있는데, 그말인즉슨 두 개 또는 이상의 바이트 시퀀스를 이용하여 각 non-ASCII 문자를 표현한다는 의미다.


내부적으로 Emacs는 자체적 다중바이트 문자 부호화를 사용하는데, 이는 Unicode 표준의 상위집합이다. 이러한 내부적 부호화는 알려진 거의 모든 스크립트의 문자가 하나의 버퍼나 문자열에서 섞이지 않도록 해준다. Emacs는 파일을 읽거나 쓸 때, 그리고 하위프로세스와 데이터를 교환할 때 다중바이트 문자 부호화와 그 외 다양한 코딩 시스템 간에 해석을 실행한다.


C-h h (

view-hello-file

) 명령어는 여러 언어로 "hello"를 표시함으로써 다양한 스크립트를 이용한

etc/HELLO

파일을 표시한다. 일부 문자를 터미널에 표시할 수 없다면 '

?

' 또는 빈 상자로 나타난다(195 페이지의 19.16절 [표시할 수 없는 문자] 참고).


이러한 문자 집합이 사용되는 국가라 하더라도 키보드에 모든 문자가 포함되어 있는 것은 아니다. 키보드가 지원하지 않는 문자는 C-q (

quoted-insert

) 또는 C-x 8 RET (

insert-char

)를 이용해 삽입 가능하다. 16 페이지의 4.1절 [텍스트 삽입하기]를 참고한다. Emacs는 또한 다양한 입력 방법을 지원하기도 하는데, 주로 하나의 스크립트나 언어마다 하나씩 지원하여 스크립트에 문자를 쉽게 입력하도록 만든다. 181 페이지의 19.3절 [입력 방법]을 참고한다.


다중바이트 문자, 코딩 시스템, 입력 방법과 관련된 명령어에는 접두 키 C-x RET 가 사용된다.


C-x = (

what-cursor-position

) 명령어는 포인트에 위치한 문자에 관한 정보를 표시한다. 이 명령어는 22 페이지의 4.9절 [위치 정보]에 설명된 문자 위치 외에도 문자가 부호화되는 방식도 표시한다. 예를 들어 이 명령어는 '

c

' 문자에 대해 아래와 같은 행을 에코 영역에 표시한다:

Char: c (99, #o143, #x63) point=28062 of 36168 (78°/.) column=53


'Char:' 다음에 오는 4개의 값은 포인트 뒤에 따라오는 문자를 설명하는데, 먼저 문자를 표시한 다음 문자 코드를 10진수, 8진수, 16진수로 제공한다. Non-ASCII 다중바이트 문자의 경우 그 뒤에 '

file

' 과 함께 버퍼의 코딩 시스템에서 문자의 표현을 16진수로 표시한 값이 따라오는데, 코딩 시스템이 문자를 안전하게 그리고 단일 바이트로 부호화할 경우에 한한다(183 페이지의 19.5절 [코딩 시스템] 참고). 문자의 부호화가 1 바이트보다 길 경우 Emacs 는 '

file...

'을 표시한다.


특별한 경우지만 문자가 128 부터 (8진수 0200) 159까지 (8진수 0237) 범위에 해당하면 구체적인 표시 가능한 문자에 해당하지 않는 "raw" 바이트를 의미한다. 그러한 "문자"는

eight-bit-control

문자 집합 내에 위치하며, escaped 8진 문자 코드로 표시된다. 이런 경우 C-x = 는 '

file

' 대신 '

part of display...

'를 표시한다.


접두 인자 (C-u C-x =)를 이용하면 이 명령어는 창에 문자의 상세한 설명을 표시한다:

  • 문자집합명, 그리고 해당 문자집합에서 문자를 식별하는 코드; ASCII 문자는
    ascii
    문자집합에 속한 것으로 식별된다.
  • 문자의 스크립트, 구문, 범주.
  • 현재 입력 방법에 문자를 입력하기 위해 입력할 키 (문자를 지원할 경우).
  • 문자의 부호화를 버퍼에 내부적으로 그리고 파일을 저장할 경우 외부적으로 역시.
  • 그래픽 디스플레이에 Emacs를 실행 중이라면 해당 문자에 대한 폰트명과 glyph 코드. 텍스트 터미널에서 Emacs를 실행 시 터미널로 전송되는 코드.
  • 문자 표시에 사용되는 non-default faces와 문자를 포함하는 오버레이를 비롯한 (Emacs Lisp Reference Manual 의 "Overlays"절 참고) 문자의 텍스트 속성 (동일한 매뉴얼의 "Text Properties"절 참고).


이 매뉴얼에 맞춰 몇 행을 이용해 예를 들어보겠다:

             position: 1 of 1 (0°/), column: 0
            character: e (displayed as e) (codepoint 234, #o352, #xea) 
    preferred charset: Unicode (Unicode (IS010646)) 
code point in charset: 0xEA 
               script: latin
               syntax: w        which means: word
             category: .:Base, L:Left-to-right (strong), c:Chinese,
                       j:Japanese, l:Latin, v:Viet 
             to input: type "C-x 8 RET HEX-C0DEP0INT" or "C-x 8 RET NAME" 
          buffer code: #xC3 #xAA
            file code: #xC3 #xAA (encoded by coding system utf-8-unix) 
              display: by this font (glyph code) 
    xft:-unknown-DejaVu Sans Mono-normal-normal- 
        normal-*-15-*-*-*-m-0-iso10646-1 (#xAC)

Character code properties: customize what to show 
   name: LATIN SMALL LETTER E WITH CIRCUMFLEX 
   old-name: LATIN SMALL LETTER E CIRCUMFLEX 
   general-category: Ll (Letter, Lowercase) 
   decomposition: (101 770) ('e' '^')


언어 환경

다중바이트 문자의 이용이 활성화될 때마다 지원되는 모든 문자 집합이 Emacs 버퍼에서 지원되는데, 그 문자를 표시하기 위해 특정 언어를 선택할 필요는 없다. 하지만 다양한 기본값을 설정하기 위해서는 언어 환경을 선택하는 것이 중요하다. 대략적으로 언어 환경은 언어의 선택이라기보다는 선호하는 스크립트의 선택을 나타낸다.


언어 환경은 텍스트를 읽을 때 인식할 코딩 시스템을 제어한다(185 페이지의 19.6절 [코딩 인식하기] 참고). 그리고 파일, 수신하는 메일, Emacs로 읽어오는 텍스트에 모두 적용된다. 파일을 생성할 때 사용할 기본 코딩 시스템을 명시하기도 한다. 각 언어 환경은 기본 입력 방법 역시 명시한다.


언어 환경을 선택하려면

current-language-environment

를 맞춤화하거나 M-x set-language-environment 명령어를 사용한다. 이 명령어를 사용하면 현재 버퍼가 무엇인지에 따른 차이는 발생하지 않는데, Emacs 세션에 전역적으로 효과가 적용되기 때문이다. 지원되는 언어 환경 목록은

language-info-alist

변수로 확인하고, 언어 환경 lang-env 에 관한 정보는 C-h L lang-env RET (describe-language-environment) 명령어를 이용한다. 지원되는 언어 환경은 다음을 포함한다:


ASCII, Arabic, Belarusian, Bengali, Brazilian Portuguese, Bulgarian, Burmese, Cham, Chinese-BIG5, Chinese-CNS, Chinese-EUC-TW, Chinese-GB, Chinese- GB18030, Chinese-GBK, Croatian, Cyrillic-ALT, Cyrillic-ISO, Cyrillic-KOI8, Czech, Devanagari, Dutch, English, Esperanto, Ethiopic, French, Georgian, German, Greek, Gujarati, Hebrew, IPA, Italian, Japanese, Kannada, Khmer, Korean, Lao, Latin-1, Latin-2, Latin-3, Latin-4, Latin-5, Latin-6, Latin-7, Latin-8, Latin-9, Latvian, Lithuanian, Malayalam, Oriya, Persian, Polish, Pun­jabi, Romanian, Russian, Sinhala, Slovak, Slovenian, Spanish, Swedish, TaiViet, Tajik, Tamil, Telugu, Thai, Tibetan, Turkish, UTF-8, Ukrainian, Vietnamese, Welsh, and Windows-1255.


사용자의 언어 환경이 사용하는 스크립트를 그래픽 디스플레이에 표시하려면 적절한 폰트가 필요하다. 폰트 설정에 관한 상세한 내용은 192 페이지의 19.13절 [폰트집합]을 참고한다.


일부 운영체제들은

LC_ALL

,

LC_CTYPE

,

LANG

과 같은 로케일 환경 변수들을 설정함으로써 사용자가 사용 중인 문자집합 로케일을 명시하도록 해준다. (이들 중 하나 이상이 설정되면 비어 있지 않은 첫 번째 변수가 이를 목적으로 사용자의 로케일을 명시한다.) 시작 시 Emacs 는 시스템 로케일에서 테이블이라는 사용자의 문자집합 로케일 이름을 검색하고, 그 별칭을

locale-charset-language-names

locale-language-names

(전자가 후자를 오버라이드한다) 변수들의 값에 있는 엔트리에 일치시키며, 일치 결과가 발견되면 그에 상응하는 언어 환경을 선택한다. 또한 디스플레이 테이블과 터미널 코딩 시스템, 로케일 코딩 시스템, 로케일에 필요한 선호되는 코딩 시스템, 마지막으로 Emacs 가 키보드에서 전송된 non-ASCII 문자를 부호화하는 방법을 조정한다.


Emacs를 실행하는 동안

LC_ALL

,

LC_CTYPE

, 또는

LANG

환경 변수를 수정할 경우 (M-x setenv 를 이용하여), 새로운 로케일로부터 언어 환경을 재조정하기 위해 후에

set-locale-environment

함수를 호출하길 원할지도 모른다.


set-locale-environment

함수는 보통 시스템 메시지를 복호화하기 위해 언어 환경에서 구축하고 선호되는 코딩 시스템을 이용한다. 하지만 사용자의 로케일이

locale-preferred-coding-systems

변수의 엔트리에 일치한다면 Emacs 는 그에 상응하는 코딩 시스템을 대신 사용한다. 가령 '

ja_JP.PCK

' 로케일이

locale-preferred-coding-systems

japanese-shift-jis

에 일치한다면 Emacs 는 그 부호화를 사용하겠지만 보통이라면

japanese-iso-8

을 사용할 것이다.


set-language-environment

명령어를 직접 이용하거나 init 파일에서

current-language-environment

의 맞춤화를 이용해 선택된 언어 환경을 시작 시 오버라이드할 수도 있다.


특정 언어 환경 lang-env 의 효과에 관한 정보를 표시하려면 C-h L lang-env RET (

describe-language-environment

)를 사용한다. 그러면 이 언어 환경이 어떤 언어에 유용한지 알려주고, 그와 어울리는 문자 집합, 코딩 시스템, 입력 방법을 열거한다. 뿐만 아니라 해당 언어 환경에서 사용되는 스크립트를 설명하는 예문 텍스트도 표시한다. lang-env 에 빈 입력값을 제공하면 이 명령어는 선택된 언어 환경을 설명한다.


일반 훅

set-language-environment-hook

을 이용해 어떠한 언어 환경이든 맞춤화가 가능하다. 이 훅은

set-language-environment

명령어에 의해 실행되는데, 새로운 언어 환경을 설정하고 난 후에 실행된다. 훅 함수는

current-language-environment

변수를 확인함으로써 특정 언어 환경을 검사할 수 있다. 이러한 훅은 사용자가 키보드 입력 및 터미널 출력에 대한 코딩 시스템, 기본 입력 방법 등 구체적 언어 환경에 대한 non-default 설정을 보관해야 하는 장소다.


set-language-environment

는 새로운 언어 환경의 설정을 시작하기 전에 먼저

exit-language-environment-hook

훅을 실행한다. 이 훅은

set-language-environment-hook

을 이용해 이루어진 맞춤화를 실행 취소하는 데에 유용하다. 가령

set-language-environment-hook

을 이용해 특정 언어 환경에 특수 키 바인딩을 만들었다면 해당 키에 대한 일반 바인딩을 복구하기 위해서는

exit-language-environment-hook

을 설정해야 한다.


입력 방법

입력 방법(input method)은 대화형 입력에 특별히 설계된 유형의 문자 변환이다. Emacs에서는 주로 각 언어마다 고유의 입력 방법을 갖고 있는데, 때로는 동일한 문자를 사용하는 여러 언어가 하나의 입력 방법을 공유하기도 한다. 어떤 언어들은 여러 개의 입력 방법을 지원한다.


가장 단순한 유형의 입력 방법은 ASCII 문자를 다른 알파벳으로 매핑하여 작용하는데, 이를 통해 ASCII 대신 다른 알파벳을 사용할 수 있게 해준다. 그리스어와 러시아어 입력 방법이 이러한 방식으로 작동한다.


좀 더 강력한 기법은 컴포지션(composition)으로, 문자의 시퀀스를 하나의 글자(letter)로 변환하는 것을 뜻한다. 많은 유럽어 입력 방법들이 컴포지션을 이용해 글자와 강세 문자(또는 그 반대 순으로)로 구성된 시퀀스로부터 단일 non-ASCII 글자를 생성하곤 한다. 예를 들어, 일부 방법들은

o ^

시퀀스를 강세가 있는 단일 문자로 변환한다. 이러한 입력 방법은 고유의 특수 명령어를 갖고 있지 않고, 그저 출력 문자의 시퀀스를 구성할 뿐이다.


음절 스크립트에 대한 입력 방법은 주로 매핑 다음에 컴포지션을 사용한다. 타이어와 한국어 입력 방법이 이러한 방식으로 작용한다. 먼저 글자가 특정 소리나 음조 마크에 해당하는 기호로 매핑된 후 전체 음절을 구성하는 글자의 시퀀스가 하나의 음절 부호로 매핑된다.


중국어와 일본어는 좀 더 복잡한 방법을 요한다. 중국어 입력 방법에는 먼저 중국어 단어의 표음식 철자(특히

chinese-py

의 경우) 또는 문자 부분의 시퀀스(입력 방법

chinese-4corner

,

chinese-sw

등의 경우)를 입력한다. 한 가지 입력 시퀀스는 주로 가능한 다수의 중국어 문자에 일치한다. C-f, C-b, C-n, C-p(또는 화살표 키), 그리고 이러한 상황에서 특별한 의미를 지닌 숫자 등의 키를 이용해 원하는 것을 선택한다.


가능한 문자들이 여러 행에 걸쳐 개념적으로 정렬되고, 각 행에는 10개까지 대안이 열거된다. 보통 Emacs는 한 번에 하나의 행만 에코 영역에 표시하는데, 시작 부분에 표시되는 (i/j)는 총 j개 열 중에서 i번째 열임을 나타낸다. C-n 또는 C-p 를 입력하면 다음 열 또는 이전 열을 표시한다.


C-fC-b 를 입력하면 현재 행의 대안들 중에서 각각 앞으로 그리고 뒤로 이동한다. 그 동안 Emacs는 현재 대안을 특별한 색상으로 강조하고, C-SPC 를 입력하면 현재 대안을 선택하여 입력으로 사용한다. 각 행의 대안마다 앞에 번호가 매겨진다. 번호를 입력하면 현재 행에서 번호와 관련된 대안이 선택되어 입력으로 사용한다.


중국어 입력 방법에서 TAB 을 이용하면 가능한 모든 문자를 한 번에 표시하는 버퍼를 나타내는데, 그 중 하나를 Mouse-2 를 이용해 클릭하면 해당 대안이 선택된다. C-f, C-b, C-n C-p, 숫자 키는 평소처럼 작동하지만 에코 영역이 아니라 가능한 문자를 표시하는 버퍼에서 강조(highlighting)를 실행한다.


일본어 입력 방법에서는 표음식 철자를 이용해 전체 단어를 입력한 후 단어가 버퍼에 위치하고 나면 Emacs가 큰 사전을 이용해 하나 또는 이상의 문자로 변환한다. 하나의 표음식 철자는 다수의 일본어 단어에 일치하는데, 그 중 하나를 선택하려면 C-nC-p 를 이용하여 대안들을 순환한다.


가끔은 사용자가 방금 입력한 문자가 잇따른 문자와 결합하지 않도록 입력 방법 처리를 차단하는 것이 유용하다. 가령

latin-1-postfix

입력 방법에서

o ^

시퀀스는 서로 결합하여 강세가 붙은 '

o

'를 만든다. 그런데 둘을 구분된 문자로 입력하고 싶다면 어떻게 해야 할까?


강세를 두 번 입력하는 것이 한 가지 방법으로, 구분된 글자와 강세를 입력하는 특별한 기능이다. 가령 o ^ ^ 는 두 개의 문자 '

o^

'를 제공한다. 아니면 o 다음에 다른 글자, 즉 o 와 결합하지 않을 글자를 입력한 뒤에 바로 삭제하는 방법이 있다. 가령 o o DEL ^ 를 입력하여 '

o

'와 '

^

'를 구분하는 것이다.


또 다른 방법은 좀 더 일반적이지만 입력하기가 그리 쉽지 않은데, 결합을 막을 두 문자 사이에 C-\ C-\ 를 입력하는 것이다. 이는 C-\ (

toggle-input-method

) 명령어가 두 번 사용된 것이다.


C-\ C-\ 는 더 많은 문자가 결합될 때까지 대기하는 것을 중단하고 사용자가 이미 입력한 내용의 검색을 시작하기 때문에 증분 검색에서 특히 유용하다.


현재 입력 방법을 이용해 포인트 다음에 문자를 어떻게 입력할 것인지 확인하려면 C-u C-x = 를 입력한다. 상세한 내용은 22 페이지의 4.9절 [위치 정보]를 참고한다.


input-method-highlight-flag

input-method-verbose-flag

변수는 입력 방법이 지금 일어나는 일을 어떻게 설명하는지를 제어한다.

input-method-highlight-flag

nil

이 아닌 경우 버퍼에서 부분적 시퀀스가 강조된다(대부분의 입력 방법의 경우에 그렇지만 일부는 이 기능을 비활성화시키기도 한다).

input-method-verbose-flag

nil

이 아닌 경우 다음으로 입력할 수 있는 문자 목록이 에코 영역에 표시된다(사용자가 미니버퍼에 있을 때는 제외다).


키보드에 없는 문자를 입력하는 또 다른 기능은 C-x 8 RET (

insert-char

)를 사용하여 Unicode 이름이나 code-point 를 기반으로 단일 문자를 삽입하여 이루어지는데, 관련 내용은 16 페이지의 4.1절 [텍스트 삽입하기]를 참고한다.


입력 방법 선택하기

C-\ 선택된 입력 방법의 사용을 활성화 또는 비활성화한다(

toggle-input-method

).


C-x RET C-\ method RET 현재 버퍼에 대해 새로운 입력 방법을 선택한다(

set-input-method

).


C-h I method RET C-h C-\ method RET 입력 방법 method를 설명한다(

describe-input-method

). 현재 입력 방법(이 존재할 경우)을 설명하는 것이 기본값이다. 이 설명은 특정 입력 방법의 사용 방법에 대해 상세한 설명을 제공할 것이다.


M-x list-input-methods 지원되는 모든 입력 방법의 목록을 표시한다.


현재 버퍼에 대한 입력 방법을 선택하려면 C-x RET C-\ (

set-input-method

)를 사용한다. 이 명령어는 미니버퍼로부터 입력 방법 이름을 읽는데, 이름은 보통 그것과 함께 사용하도록 되어 있는 언어 환경과 함께 시작된다.

current-input-method

변수는 어떤 입력 방법이 선택되는지 기록한다.


입력 방법은 ASCII 문자의 다양한 시퀀스를 사용해 non-ASCII 문자를 나타낸다. 가끔은 임시적으로 입력 방법을 끄는 편이 유용하다. 입력 방법을 끄려면 C-\ (

toggle-input-method

)를 입력한다. 입력 방법을 다시 활성화하려면 C-\ 를 다시 입력한다.


C-\ 를 입력한 후 입력 방법을 아직 선택하지 않았다면 하나를 입력하도록 요구할 것이다. 이는 입력 방법을 명시하는 데에 C-x RET C-\ 를 사용하는 것과 동일한 효과를 지닌다.


C-u C-\ 와 같이 수치적 인자를 이용해

toggle-input-method

를 호출하면 항상 사용자에게 입력 방법을 입력하도록 요구하는데, 가장 최근에 선택된 값을 기본값으로 제시한다.


언어 환경을 선택하면 다양한 버퍼에서 사용할 기본 입력 방법을 명시한다. 기본 입력 방법이 있다면 C-\ 를 입력하여 현재 버퍼에서 선택할 수 있다.

default-input-method

변수는 기본 입력 방법을 명시한다(존재하지 않을 시 nil).


여러 입력 방법을 지원하는 일부 언어 환경에서는

set-language-environment

로 설정된 기본값이 아닌 다른 입력 방법을 사용하길 원할 수도 있다. 그러면

set-language-environment-hook

를 이용하여 사용자가 원하는 대로 Emacs에게 특정 언어 환경에 대해 다른 기본 입력 방법을 선택하라고 지시할 수 있다(179 페이지의 19.2절 [언어 환경] 참고). 예를 들면 아래와 같다:

(defun my-chinese-setup ()
  "Set up my private Chinese environment." 
  (if (equal current-language-environment "Chinese-GB") 
    (setq default-input-method "chinese-tonepy"))) 
(add-hook 'set-language-environment-hook 'my-chinese-setup)


이는 사용자가 Chinese-GB 언어 환경을 선택할 때마다

chinese-tonepy

를 기본 입력 방법으로 설정한다.


Emacs 에게 특정 입력 방법을 자동으로 활성화하라고 지시할 수도 있다. 아래를 예로 들겠다.

(add-hook 'text-mode-hook
  (lambda () (set-input-method "german-prefix")))


이는 Text 모드에서 "german-prefix" 입력 방법을 자동으로 활성화한다.


알파벳 스크립트에 대한 일부 입력 방법은 그러한 스크립트에 주로 사용되는 다양한 키보드 레이아웃을 모방하도록 키보드를 재매핑(remapping)하여 이루어진다. 적절하게 재매핑하는 방법은 사용자의 실제 키보드 레이아웃에 따라 좌우된다. 키보드가 가진 레이아웃을 명시하려면 M-x quail-set-keyboard-layout 명령어를 사용한다.


M-x quail-show-key 명령어를 이용하면 선택된 키보드 레이아웃을 이용해 포인트 뒤에 문자를 입력하려면 어떤 키(또는 키 시퀀스)를 입력해야 하는지 보여준다. C-u C-x = 역시 그러한 정보와 함께 문자에 대한 다른 정보도 표시한다.


M-x list-input-methods 는 지원되는 모든 입력 방법의 목록을 표시한다. 목록은 모드 행에서 각 입력 방법을 나타내는 문자열을 포함해 입력 방법에 관한 정보를 제공한다.


코딩 시스템

다양한 언어 사용자들은 그것을 표현하기 위해 많은 표준 코딩 시스템을 구축해왔다. Emacs는 이러한 코딩 시스템을 내부적으로 사용하지 않으며, 대신 데이터를 읽을 때 다양한 코딩 시스템에서 자체 시스템으로 변환하고 데이터를 쓸 때는 내부 코딩 시스템에서 다른 코딩 시스템으로 변환한다. 변환은 파일을 읽고 쓸 때, 터미널에서 전송하고 수신할 때, 하위프로세스와 데이터를 교환할 때 가능하다.


Emacs는 각 코딩 시스템에 이름을 할당한다. 대부분 코딩 시스템은 하나의 언어에 사용되고, 코딩 시스템 이름은 언어 이름으로 시작한다. 일부 코딩 시스템은 여러 언어에 사용되기도 하며, 그 이름은 보통 'iso'로 시작된다.

no-conversion

,

raw-text

,

emacs-internal

과 같은 특수 코딩 시스템도 있다.


통틀어 코드페이지(codepage)라고 알려진 코딩 시스템의 특수 클래스는 MS-Windows 와 MS-DOS 소프트웨어가 부호화한 텍스트를 지원하도록 설계되었다. 이러한 코딩 시스템의 이름은

cpnnnn

으로, nnnn 은 3개 또는 4개 숫자로 된 코드페이지다. 이러한 부호화는 여느 다른 코딩 시스템과 마찬가지로 이용할 수 있는데, 코드페이지 850로 부호화되는 파일을 방문하려면 C-x RET c cp850 RET C-x C-f filename RET 을 입력한다.


코딩 시스템은 non-ASCII 문자의 다양한 표현을 변환하는 것 외에 행끝 변환을 실행할 수도 있다. Emacs 는 파일에서 행을 구분하는 방법과 관련해 세 가지 변환을 처리하는데, 새 행("unix"), 캐리지 리턴 라인피드("dos"), 캐리지 리턴("mac")이 그것이다.


C-h C coding RET 코딩 시스템 coding을 설명한다(

describe-coding-system

).


C-h C RET 현재 사용 중인 코딩 시스템을 설명한다.


M-x list-coding-systems 지원되는 모든 코딩 시스템의 목록을 표시한다.


C-h C (

describe-coding-system

) 명령어는 특정 코딩 시스템이 명시하는 행끝 변환을 포함해 코딩 시스템에 관한 정보를 표시한다. 코딩 시스템명을 인자로 명시할 수도 있고, 빈 인자를 이용하면 다양한 용도로 현재 버퍼에서 그리고 기본 버퍼에서 현재 선택된 코딩 시스템, 그리고 코딩 시스템을 인식하기 위한 우선순위 목록을 설명한다(185 페이지의 19.6절 [코딩 인식하기] 참고).


지원하는 모든 코딩 시스템의 목록을 표시하려면 M-x list-coding-systems 을 입력한다. 목록은 모드 행에서 각 코딩 시스템을 나타내는 문자도 포함하여 코딩 시스템에 대한 정보를 제공한다(8 페이지의 1.3절 [모드 행] 참고).


목록에 나타나는 각 코딩 시스템은 (어떠한 종류의 변환도 허용하지 않는

no-conversion

은 제외) 출력 문자의 변환 방법과 변환 여부를 명시하지만 행끝 변환 선택은 각 파일의 내용을 바탕으로 선택하도록 남겨 둔다. 가령 파일이 시퀀스 캐리지 리턴 라인피드를 사용하여 행을 구분하는 것으로 나타난다면 DOS 행끝 변환이 사용될 것이다.


열거된 코딩 시스템마다 세 개의 변형체가 있는데, 이러한 변형체들은 행끝 변환을 정확히 어떻게 실행하는지 명시한다:

...-unix

행끝 변환을 실행하지 않고, 파일이 새 행을 이용해 행을 구분한다고 가정한다. (Unix와 GNU 시스템, Mac OS X에서 주로 사용되는 변환이다.)


...-dos

파일이 캐리지 리턴 라인피드를 이용해 행을 구분한다고 가정하고 적절한 변환을 실행한다. (Microsoft 시스템[1]에서 주로 사용되는 변환이다.)


...-mac

파일이 캐리지 리턴을 이용해 행을 구분한다고 가정하고 적절한 변환을 실행한다. (OS X 이전에 Macintosh 시스템에서 사용되던 변환이다.)


이러한 변형된 코딩 시스템들은 전적으로 예측 가능하므로 간결성을 위해

list-coding-systems

디스플레이에서 누락된다. 가령 코딩 시스템

iso-latin-1

iso-latin-1-unix

,

iso-latin-1-dos

,

iso-latin-1-mac

과 같은 변형체를 갖는다. ‎


코딩 시스템

unix

,

dos

,

mac

undecided-unix

,

undecided-dos

,

undecided-mac

으로도 알려진다. 이러한 코딩 시스템들은 행끝 변환만 명시하여 문자 코드 변환은 텍스트 자체에서 추론하도록 남겨 둔다.


코딩 시스템

raw-text

는 주로 ASCII 텍스트에 해당하는 파일에 적절하지만 127보다 큰 값의 바이트만 포함할 수 있어 non-ASCII 문자를 부호화할 수가 없다. Emacs 는

raw-text

를 이용해 그러한 바이트 값을 변경하지 않은 채 복사하고, 현재 버퍼에서

enable-multibyte-characters

nil

로 설정하여 적절하게 해석되도록 한다.

raw-text

는 보통 때처럼 접하는 데이터를 기반으로 행끝 변환을 처리하고, 여느 것과 마찬가지로 사용할 행끝 변환 유형을 명시하는 세 가지 변형체를 가진다.


반면 코딩 시스템

no-conversion

은 문자 코드 변환을 전혀 명시하지 않으며, non-ASCII 바이트 값이나 행끝에 대해서도 전혀 명시하지 않는다. 이는 바이너리 파일, tar 파일, 그 외 조사해야 하는 파일을 읽고 쓸 때 유용하다. 이 역시

enable-multibyte-characters

nil

로 설정한다.


어떤 유형의 변환도 없이 가장 손쉽게 파일을 편집하는 방법은 M-x find-file-literally 명령어를 이용하는 방법이다. 이는

no-conversion

을 사용하고, 사용자가 파일 내용을 확인하기 전에 먼저 변환할 수 있는 다른 Emacs 기능을 금한다. 123 페이지의 15.2절 [방문하기]를 참고한다.


코딩 시스템

emacs-internal

(혹은 그에 상응하는

utf-8-emacs

)는 내부 Emacs 인코딩으로 보관되는 non-ASCII 문자가 파일에 포함되어 있음을 의미한다. 이 코딩 시스템은 접하는(encountered) 데이터를 기반으로 행끝 변환을 처리하고, 여느 것과 마찬가지로 행끝 변환 종류를 명시하는 세 가지 변형체를 가진다.


코딩 시스템 인식하기

Emacs는 주어진 텍스트 조각을 읽을 때마다 어떤 코딩 시스템을 사용할지 인식하려 한다. 이는 읽는 파일, 하위프로세스로부터 출력, X 선택 영역의 텍스트 등에 적용된다. 사용자가 선호하는 설정을 명시하고 나면 Emacs는 대부분의 경우 자동으로 올바른 코딩 시스템을 선택할 수 있다.


일부 코딩 시스템은 데이터에 나타나는 바이트 시퀀스로 인식되거나 구별될 수 있다. 하지만 구별될 가능성이 없는 코딩 시스템도 있다. 가령 Latin-1 과 Latin-2 는 다른 의미로 된 동일한 바이트 값을 사용하기 때문에 둘을 구별할 방법은 없다.


Emacs 는 코딩 시스템의 우선순위 목록을 이용해 이러한 상황을 처리한다. 사용자가 사용할 코딩 시스템을 명시하지 않으면 Emacs 는 파일을 읽을 때마다 우선순위에 위치한 첫 코딩 시스템부터 시작해 아래로 이동하면서 데이터에 맞는 것을 찾을 때까지 코딩 시스템에 하나씩 맞춰본다. 그리고 나서 해당하는 코딩 시스템으로 표현되었다고 가정한 채 파일 내용을 변환한다.


코딩 시스템의 우선순위 목록은 선택된 언어 환경에 따라 좌우된다(179 페이지의 19.2절 [언어 환경] 참고). 프랑스어를 사용 중인데 Emacs가 Latin-2 보다 Latin-1 을 선호하게끔 만들고 싶다거나, 체코어를 사용 중인데 Latin-2 를 선호하게 만드는 경우를 예로 들 수 있겠다. 이것은 언어 환경을 명시해야 하는 이유 중 하나이기도 하다.


하지만 M-x prefer-coding-system 명령어를 이용해 코딩 시스템 우선순위 목록을 상세히 수정할 수도 있다. 이 명령어는 미니버퍼로부터 코딩 시스템 이름을 읽어와 우선순위 목록 앞에 추가하여 다른 코딩 시스템들보다 우선하도록 한다. 이 명령어를 여러 번 사용하면 사용할 때마다 우선순위 목록 앞에 하나의 요소가 추가된다.


iso-8859-1-dos

처럼 행끝 변환 타입을 명시하는 코딩 시스템을 사용 중일 경우 Emacs 가

iso-8859-1

을 우선순위로 인식해야 하고,

iso-8859-1

을 인식하면 DOS 행끝 변환을 사용해야 한다는 의미이기도 하다.


때로는 파일명이 파일에 사용할 코딩 시스템을 나타내기도 한다.

file-coding-system-alist

변수는 이러한 관련성을 명시한다. 요소를 이 목록으로 추가하는 특별한 함수가 있는데, 바로

modify-coding-system-alist

다. 가령

chinese-iso-8bit

코딩 시스템을 이용해 모든 '

.txt

' 파일을 읽고 쓰기 위해서는 아래와 같은 Lisp 표현식을 실행해야 한다.

(modify-coding-system-alist 'file "\\.txt\\"' 'chinese-iso-8bit)


첫 번째 인자는

file

이어야 하고, 두 번째 인자는 이것을 적용시킬 파일을 결정하는 정규 표현식이어야 하며, 세 번째 인자는 이러한 파일에 사용할 코딩 시스템을 나타낸다.


Emacs 는 파일 내용을 바탕으로 어떤 종류의 행끝 변환을 사용할지 인식하는데, 캐리지 리턴 또는 캐리지 리턴 라인피드 시퀀스만 보인다면 그에 따라 행끝 변환을 선택한다.

inhibit-eol-conversion

변수를

nil

이 아닌 값으로 설정하면 자동 행끝 변환의 사용을 금할 수 있다. 그럴 경우 DOS-style 파일은 버퍼에서 '

^M

' 문자와 함께 표시될 것인데, 어떤 사람들은 모드 행의 왼쪽 가장자리 근처에 미묘하게 붙은 '

(DOS)

' 행끝 표시보다 이것을 선호하기도 한다(8 페이지의 1.3절 [모드 행] 참고).


기본적으로 코딩 시스템의 자동 감지는 escape 시퀀스에 민감하다. Emacs가 escape 문자로 시작하는 문자 시퀀스를 확인하고 시퀀스가

ISO-2022

코드로서 유효하면 Emacs에게

ISO-2022

인코딩 중 하나를 이용해 파일을 복호화할 것을 알린다.


하지만 파일 내 escape 시퀀스를 그대로 읽기를 원하는 경우도 있다. 그러한 경우

inhibit-iso-escape-detection

변수를

nil

이 아닌 값으로 설정할 수 있다. 그러면 코드 감지는 모든 escape 시퀀스를 무시하고

ISO-2022

인코딩을 절대 사용하지 않는다. 그 결과 버퍼에 모든 escape 시퀀스가 시각적으로 표시된다.


inhibit-iso-escape-detection

의 기본값은

nil

이다. 한 가지 구체적 연산을 제외하고는 이 값을 영원히 변경하지 않길 권한다. 그 이유는 Emacs 배포판의 일부 Emacs Lisp 소스 파일이 코딩 시스템

iso-2022-7bit

로 부호화된 non-ASCII 문자를 포함하고 있으며, 사용자가 escape 시퀀스 감지를 억제하면 그러한 파일로 방문할 때 올바로 복호화가 되지 않기 때문이다.


auto-coding-alist

변수와

auto-coding-regexp-alist

변수는 각각 파일명의 특정 패턴과 특정 패턴을 포함한 파일에 대한 코딩 시스템을 명시하는 가장 강력한 방법이다. 이러한 변수들은 파일 자체에 '

-*-coding:-*-

' 태그를 오버라이드하기도 한다(187 페이지의 19.7절 [코딩 명시하기] 참고). 예를 들어 Emacs 는 tar 와 아카이브 파일에

auto-coding-alist

를 사용함으로써 아카이브 member 에서 사용된 '

-*-coding:-*-

'와 혼동하여 그것이 아카이브 파일 전체에 적용된다는 오해를 사전에 막는다.


코딩 시스템을 명시하는 또 다른 방법은

auto-coding-functions

변수를 사용하는 것이다. 가령 빌트인된

auto-coding-functions

중 하나는 XML 파일에 대한 부호화를 감지한다. 이전에 소개한 두 가지 변수와 달리 이 변수는 '

-*-coding:-*-

' 태그를 오버라이드하지 않는다.


파일에 사용할 코딩 시스템 명시하기

Emacs 가 파일의 인코딩을 올바르지 않게 인식하였다면 사용자는 C-x RET r (

revert-buffer-with-coding-system

)을 통해 올바른 코딩 시스템을 이용하여 파일을 다시 읽을 수 있다. 이 명령어는 사용할 코딩 시스템의 입력을 요한다. Emacs가 파일을 복호화하는 데에 사실상 어떠한 코딩 시스템을 사용하는지 확인하려면 모드 행 왼쪽 가장자리 근처에 코딩 시스템 연상 기호 문자를 확인하거나 (8 페이지의 1.3절 [모드 행] 참고) C-h C (

describe-coding-system

)을 입력한다.


'

-*-...-*-

' 구조체를 시작에 사용하거나 끝에 로컬 변수를 사용함으로써 특정 파일에 대한 코딩 시스템을 파일 자체에 명시할 수 있다(424 페이지의 33.2.4절 [파일 변수] 참고). 이는 coding로 명명된 "변수"에 값을 정의하여 실행된다. Emacs는 사실상 coding 변수를 갖고 있지 않으며, 변수를 설정하는 대신 파일에 대해 명시된 코딩 시스템을 사용한다. 가령 '

-*-mode: C; coding: latin-1;-*-

'는 C 모드는 물론이고 Latin-1 코딩 시스템의 사용을 명시한다. 사용자가 행에 직접적으로 코딩을 명시하면

file-coding-system-alist

를 오버라이드한다.


출력에 사용할 코딩 시스템 선택하기

Emacs가 버퍼에 사용할 코딩 시스템을 선택하고 나면

buffer-file-coding-system

에 해당 코딩 시스템을 보관한다. 그에 따라 해당 버퍼로부터 파일에 쓰는 연산의 기본값이 되는데,

save-buffer

write-region

을 예로 들 수 있겠다. 뿐만 아니라

set-buffer-file-coding-system

을 이용하면 이후에 버퍼로부터 파일 출력에 사용할 다른 코딩 시스템을 명시할 수 있다(188 페이지의 19.9절 [텍스트 코딩] 참고).


사용자는 Emacs가 지원하는 어떤 문자든 어떠한 Emacs 버퍼로도 삽입할 수 있지만 대부분의 코딩 시스템은 이러한 문자의 하위집합만 처리한다. 따라서 사용자가 삽입하는 문자는 버퍼의 저장에 사용될 코딩 시스템으로 부호화될 수 없다. 예를 들어 사용자는

iso-8859-2

로 부호화된 폴란드어 텍스트 파일을 방문하여 러시아어 단어 몇 가지를 추가할 수 있다. 해당 버퍼를 저장하려 하면 Emacs 는

buffer-file-coding-system

의 현재 값을 사용할 수 없게 되는데, 사용자가 추가한 문자는 그 코딩 시스템으로 부호화될 수 없기 때문이다.


이런 일이 발생하면 Emacs는 가장 선호하는 코딩 시스템을 시도한다(M-x prefer-coding-system 또는 M-x set-language-environment 로 설정된 코딩 시스템). 해당 코딩 시스템이 버퍼 내 모든 문자를 안전하게 부호화할 수 있다면 Emacs는 그것을 사용하여

buffer-file-coding-system

에 값을 보관한다. 안전하게 부호화할 수 없다면 Emacs는 버퍼의 내용을 부호화하는 데에 적합한 코딩 시스템 목록을 표시하고, 사용자가 그 중에 하나를 선택하도록 요청한다.


사용자가 메일 메시지에 적합하지 않은 문자를 삽입할 경우 Emacs는 위와 약간 다르게 행동한다. 가장 선호하는 코딩 시스템이 MIME 메시지에 사용되도록 권장하는지를 추가적으로 확인하고, 그렇지 않을 경우 이 사실을 사용자에게 알려 다른 코딩 시스템을 선택하도록 요구한다. 이는 사용자의 수신자 메일 소프트웨어에서 복호화가 힘든 방식으로 메시지가 부호화되지 않도록 확보하기 위함이다. (프롬프트에 적절하지 않은 코딩 시스템 이름을 입력하더라도 여전히 사용할 수는 있다.)


메일 메시지를 전송하면 (350 페이지의 29장 [메일 전송하기] 참고) Eamcs는 메시지 텍스트를 부호화하는 데에 사용할 코딩 시스템을 결정하는 네 가지 방법을 제공한다.

buffer-file-coding-system

nil

이외의 값일 경우 버퍼 고유의 값을 시도한다. 아니면

sendmail-coding-system

nil

이외의 값을 가질 경우 그 값을 사용한다. 세 번째는 새 파일에 대해 언어 환경으로 결정되는 기본 코딩 시스템을 사용하는 방법으로,

nil

이외의 값을 기본값으로 가진다. 만일 이 세 개의 값이 모두

nil

일 경우 Emacs는 내보내는 메일을 Latin-1 코딩 시스템을 이용해 부호화한다.


파일 텍스트에 사용할 코딩 시스템 명시하기

Emacs가 파일 내용에 올바른 코딩 시스템을 자동으로 선택하지 않으면 아래의 명령어를 이용해 명시할 수 있다:


C-x RET f coding RET 현재 버퍼 내 파일을 저장하거나 재방문하기 위해 코딩 시스템 coding을 사용한다(

set-buffer-file-coding-system

).


C-x RET c coding RET 바로 다음 명령어에 대한 코딩 시스템 coding 을 명시한다(

universal-coding-system-argument

).


C-x RET r coding RET 코딩 시스템 coding 을 이용해 현재 파일로 재방문한다(

revert-buffer-with-coding-system

).


M-x recode-region RET right RET wrong RET 코딩 시스템 wrong 을 이용해 복호화(decode)된 영역을 변환하고, 코딩 시스템 right 을 대신 이용하여 복호화한다


C-x RET f (

set-buffer-file-coding-system

) 명령어는 현재 버퍼에 대한 파일 코딩 시스템을 설정한다(예: 파일을 저장하거나 되돌릴 때 사용할 코딩 시스템). 사용자는 미니버퍼를 이용해 어떤 코딩 시스템인지 명시한다. 모드 행에서 코딩 시스템 표시기를 Mouse-3 으로 클릭하여 이 명령어를 호출할 수도 있다(8 페이지의 1.3절 [모드 행] 참고).


버퍼에서 모든 문자를 처리하지 못하는 코딩 시스템을 명시할 경우 Emacs는 문제가 되는 문자에 대해 경고하고, 사용자가 버퍼 저장을 시도하면 다른 코딩 시스템을 선택하도록 요청할 것이다(187 페이지의 19.8절 [출력 코딩] 참고).


이 명령어를 이용해 현재 버퍼의 부호화하는 데에 사용할 행끝 변환을 명시할 수도 있다(183 페이지의 19.5절 [코딩 시스템] 참고). 예를 들어 C-x RET f dos RET 은 Emacs로 하여금 DOS 스타일의 캐리지 리턴 라인피드 행끝을 이용해 현재 버퍼의 텍스트를 저장하도록 한다.


파일에 대한 코딩 시스템을 명시하는 또 다른 방법으로, 사용자가 파일을 방문할 때를 들 수 있다. 먼저 C-x RET c (

universal-coding-system-argument

) 명령어를 사용하는데, 이 명령어는 미니버퍼를 이용해 코딩 시스템명을 읽는다. 미니버퍼를 종료하고 나면 명시된 코딩 시스템이 바로 뒤에 잇따른 명령어에 사용된다.


따라서 바로 뒤따라오는 명령어가 가령 C-x C-f 라면 해당 코딩 시스템을 이용해 파일을 읽는다(그리고 사용자가 후에 파일을 저장할 경우를 대비해 코딩 시스템을 기록한다). 또는 바로 뒤에 따라오는 명령어가 C-x C-w 라면 해당 코딩 시스템을 이용해 파일을 쓴다. C-x RET f 대신 이러한 방식으로 저장하기 위한 코딩 시스템을 명시할 때는 버퍼에 코딩 시스템이 처리할 수 없는 문자가 포함되어 있을 경우 경고를 발생시키지 않는다.


명시된 코딩 시스템의 영향을 받는 다른 파일 명령어로는 C-x iC-x C-v 를 비롯해 C-x C-f 의 other-window(다른 창을 이용하는) 변형체가 있다. C-x RET c 역시 M-x shell 을 비롯해 하위프로세스를 시작하는 명령어에 영향을 미친다(383 페이지의 31.4절 [셸] 참고). 바로 뒤에 따라오는 명령어가 코딩 시스템을 사용하지 않으면 C-x RET c 는 결국 아무런 효과가 없다.


변환하지 않고 파일을 쉽게 방문하는 방법으로 M-x find-file-literally 명령어를 사용하는 방도가 있다. 123 페이지의 15.2절 [방문하기]를 참고한다.


buffer-file-coding-system

변수의 기본값은 사용자가 새 파일을 생성할 때 사용할 코딩 시스템의 선택을 명시한다. 이는 사용자가 새로운 파일을 찾을 때, 그리고 버퍼를 생성하여 그 파일에 저장할 때 적용된다. 언어 환경을 선택하면 이 변수는 해당 언어 환경에 바람직한 기본 코딩 시스템으로 설정할 것이다.


잘못된 코딩 시스템을 방문할 경우 C-x RET r (

revert-buffer-with-coding-system

)을 이용해 수정할 수 있다. 그러면 사용자가 명시한 코딩 시스템을 이용해 현재 파일을 다시 방문한다.


잘못된 코딩 시스템을 이용해 텍스트 조각이 이미 버퍼로 삽입되었다면 M-x recode-region 을 이용해 복호화를 재실행할 수 있다. 그러면 올바른 코딩 시스템, 그리고 실제로 사용된 잘못된 코딩 시스템의 입력을 요구한 후 변환을 실행한다. 먼저 잘못된 코딩 시스템을 이용해 영역을 부호화한 후 올바른 코딩 시스템을 이용해 다시 복호화한다.


프로세스간 통신에 사용할 코딩 시스템

이번 절에서는 다른 프로세스와의 통신에 사용할 수 있는 코딩 시스템을 명시하는 방법을 설명한다.

C-x RET x coding RET 코딩 시스템 coding을 사용하여 다른 그래픽 애플리케이션으로 선택을 전달하고 그로부터 전송받는다(

set-selection-coding-system

).


C-x RET X coding RET 코딩 시스템 coding을 사용하여 one 선택영역(다음 선택영역)을 다른 그래픽 애플리케이션으로 전달하고 그로부터 전달받는다(

set-next-selection-coding-system

).


C-x RET p input-coding RET output-coding RET 현재 버퍼에서 하위프로세스 입력과 출력에 코딩 시스템 input-codingoutput-coding 을 사용한다(

set-buffer-process-coding-system

).


C-x RET x (

set-selection-coding-system

) 명령어는 선택된 텍스트를 다른 윈도잉 애플리케이션을 전송하고 다른 애플리케이션에서 만들어진 선택영역의 텍스트를 수신하는 데에 사용할 코딩 시스템을 명시한다. 이 명령어는 사용자가 명령어를 다시 사용하여 오버라이드할 때까지 이루어지는 선택영역에 모두 적용된다. C-x RET X (

set-next-selection-coding-system

) 명령어는 Emacs에서 만들어지거나 Emacs에 의해 읽힌 다음 선택영역에 사용할 코딩 시스템을 명시한다.


x-select-request-type

변수는 다른 애플리케이션으로부터 텍스트 선택영역을 수신하기 위해 X Windows System 으로부터 요청할 데이터 타입을 명시한다. 값이

nil

(기본값)이면 Emacs 는

UTF8_STRING

COMPOUND_TEXT

순으로 시도하고, 다양한 발견법을 이용해 두 결과 중 더 적절한 결과를 선택하는데, 둘 다 실패할 경우 Emacs 는

STRING

에 의존한다.

x-select-request-type

의 값이

COMPOUND_TEXT

,

UTF8_STRING

,

STRING

,

TEXT

등의 심볼 중 하나일 경우 Emacs는 요청한 타입만 사용한다. 값이 이러한 심볼 중 일부로 구성된 목록일 경우 Emacs는 그 중 하나가 성공할 때까지 혹은 목록이 소진될 때까지 목록의 요청 타입만 순서대로 시도한다.


C-x RET p (

set-buffer-process-coding-system

) 명령어는 하위프로세스로의 입출력을 위한 코딩 시스템을 명시한다. 이 명령어는 현재 버퍼에 적용되며, 보통은 하위프로세스마다 고유의 버퍼를 갖고 있으므로 사용자는 이 명령어를 이용해 해당하는 버퍼에서 명령어를 제공함으로써 특정 하위프로세스로의 해석과 그로부터의 해석을 명시한다.


하위프로세스를 실행하거나 시작하는 명령어 직전에 C-x RET c (

universal-coding-system-argument

)를 사용하면 해당 하위프로세스와의 통신에 사용할 코딩 시스템을 명시할 수 있다. 188 페이지의 19.9절 [텍스트 코딩]을 참고한다.


프로세스 입출력의 해석에 대한 기본값은 현재 언어 환경에 따라 좌우된다.


locale-coding-system

변수는 시스템 오류 메시지와 같은 시스템 문자열을 부호화 및 복호화 할 때 사용할 코딩 시스템을 명시하고,

format-time-string

은 포맷과 타임 스탬프에 사용된다. 해당 코딩 시스템은 X Window System 에서 non-ASCII 키보드 입력의 복호화에도 사용된다. 기본 시스템의 텍스트 표현과 호환이 되는 코딩 시스템을 선택해야 하는데, 주로

LC_ALL

,

LC_CTYPE

,

LANG

이라는 환경 변수들 중 하나로 명시된다. (위에 명시한 순서대로 값이 비어 있지 않은 첫 번째가 텍스트 표현을 결정한다.)


파일명에 사용할 코딩 시스템

C-x RET F coding RET 코딩 시스템 coding 을 사용하여 파일명을 부호화 및 복호화한다(

set-file­name-coding-system

).


C-x RET F (

set-file-name-coding-system

) 명령어는 파일 names를 부호화하는 데에 사용할 코딩 시스템을 명시한다. 파일의 contents를 읽고 쓰는 데에는 영향을 미치지 않는다.


사실 이 명령어가 하는 일은

file-name-coding-system

변수의 값을 방문하는 것이다. 변수를 코딩 시스템명(Lisp 부호 또는 문자열)으로 설정할 경우 Emacs는 모든 파일 연산에 대해 해당 코딩 시스템을 이용하여 파일명을 부호화한다. 그에 따라 파일명에 non-ASCII 문자의 사용이 가능해진다(적어도 명시된 코딩 시스템이 부호화할 수 있는 non-ASCII 문자).


file-name-coding-system

값이

nil

이면 Emacs는 선택된 언어 환경에 의해 결정되어

default-file-name-coding-system

변수에 보관된 기본 코딩 시스템을 사용한다. 기본 언어 환경에서는 파일명에 포함된 non-ASCII 문자가 특별하게 부호화되지 않으며, Emacs의 내부 표현을 이용해 파일 시스템에 나타난다.


Emacs가 NT 계열(descendants)에 해당하는 MS-Windows 버전에서 실행되는 경우 (Windows 2000, XP, Vista, Windows 7, and Windows 8),

file-name-coding-system

의 값은 대개 무시되는데, Emacs는 기본적으로 Unicode 파일명을 직접 전달하도록 해주는 APIs를 사용하기 때문이다. 반면 Windows 9X 에서는 파일명이 현재 시스템 로케일과 관련된 코드페이지로 설정되어야 하는

file-name-coding-system

을 이용해 부호화된다(183 페이지의 19.5절 [코딩 시스템] 참고).

w32-unicode-filenames

변수의 값은, Emacs 가 파일명을 허용하는 OS 함수를 호출할 때 Unicode APIs 를 사용할 것인지 여부를 관리한다. 이 변수는 Windows 9X 에서는 시작 코드에 의해 nil로 설정되고, MS-Windows 최신 버전에서는 t 로 설정된다.


경고: Emacs 세션 도중에

file-name-coding-system

(또는 언어 환경)을 변경한 경우, 기존 코딩 시스템을 이용해 이름이 이미 부호화되어 부호화를 실행할 수 없는(또는 다르게 부호화된) 파일을 방문하면 문제가 야기된다. 이러한 버퍼 중 하나를 방문한 파일명과 동일한 이름으로 저장하려 하면 올바르지 않은 파일명을 사용하게 되거나 오류에 직면할지도 모른다. 그러한 문제가 발생할 경우, C-x C-w 를 이용해 해당 버퍼에 대한 새로운 파일명을 명시한다.


파일명을 부호화하면서 실수를 범하면 M-x recode-file-name 명령어를 이용해 파일명의 코딩 시스템을 변경한다. 그러면 기존의 파일명, 오래된 코딩 시스템, 전환하고자 하는 코딩 시스템을 입력하도록 요구한다.


터미널 입출력에 사용할 코딩 시스템

C-x RET t coding RET 터미널 출력에 코딩 시스템 coding 을 사용한다(

set-terminal-coding-system

).


C-x RET k coding RET 키보드 입력에 코딩 시스템 coding 을 사용한다(

set-keyboard-coding-system

).


C-x RET t (

set-terminal-coding-system

) 명령어는 터미널 출력에 대한 코딩 시스템을 명시한다. 터미널 출력에 대한 문자 코드를 입력하면 해당 터미널로 가는 모든 문자 출력이 그 코딩 시스템으로 해석된다.


이 기능은 특정 언어나 문자 집합을 지원하도록 빌드된 특정 문자전용 터미널에 유용한데, ISO 라틴 문자 집합 중 하나를 지원하는 유럽 터미널을 예로 들 수 있겠다. 다중바이트 텍스트를 사용할 때는 터미널이 사실상 어떠한 문자를 처리할 수 있는지 Emacs가 알 수 있도록 터미널 코딩 시스템을 명시할 필요가 있다.


Emacs가 터미널 타입이나 로케일 명세로부터 적절한 코딩 시스템을 추측하는 기능을 갖고 있지 않는 이상 터미널로의 출력은 전혀 해석되지 않는 것이 기본값이다(179 페이지의 19.2절 [언어 환경] 참고).


C-x RET k (

set-keyboard-coding-system

) 명령어 또는

keyboard-coding-system

변수는 키보드 입력에 대한 코딩 시스템을 명시한다. 키보드 입력의 문자코드 해석은 non-ASCII 그래픽 문자를 전송하는 키를 가진 터미널에 유용한데, 일부 터미널은 가령 ISO Latin-1 또는 그 하위집합에 이용 가능하도록 설계되었다.


기본적으로 키보드 입력은 사용자의 시스템 로케일 설정을 기반으로 해석된다. 터미널이 로케일에서 지시하는 부호화를 지원하지 않는다면 (가령 M-i를 입력하면 non-ASCII 문자를 삽입하는 것을 발견할 경우) 부호화를 끄도록

keyboard-coding-system

nil

로 설정할 필요가 있다. 이는 init 파일에서 다음을 넣어 실행한다.

(set-keyboard-coding-system nil) in your init


키보드 입력에 코딩 시스템 해석을 사용하는 것과 입력 방법을 사용하는 것에는 유사점이 있는데, 둘 다 단일 문자로 해석되는 키보드 입력의 시퀀스를 정의한다는 사실이다. 하지만 입력 방법은 인간에 의한 대화식 사용에 편리하게 고안되었고, 해석되는 시퀀스는 주로 ASCII 출력 문자의 시퀀스로 되어 있다. 코딩 시스템은 비그래픽 문자의 시퀀스를 해석하는 것이 보통이다.


Fontsets

폰트는 주로 단일 알파벳 또는 스크립트에 대한 형태를 정의한다. 따라서 Emacs가 지원하는 스크립트의 전체 범위를 표시하려면 많은 폰트 집합체가 필요하다. Emacs에서 그러한 집합체를 fontset라고 부른다. Fontset는 폰트 명세 목록으로 정의되고, 각 명세는 문자 코드 범위를 처리하도록 할당되어 그것이 명시하는 폰트에 포함되지 않은 문자에 대해서는 다른 fontset에 의지하기도 한다.


폰트처럼 각 fontset에도 이름이 있다. 하지만 폰트는 시스템에 보관되고 이용 가능한 폰트명은 시스템에 의해 정의되므로 fontset는 Emacs 자체에서 정의된다. Fontset를 정의하였다면 Emacs에서 단일 폰트를 사용할 수 있는 곳이라면 어디서든 fontset 이름을 명시하여 fontset를 사용할 수 있다. 물론 Emacs fontset는 시스템이 지원하는 폰트만 사용할 수 있다. 일부 문자가 화면에 빈 상자 또는 16진 코드로 나타날 경우 사용 중인 fontset가 그러한 문자에 대한 폰트를 갖고 있지 않다는 의미다. 이런 경우를 비롯해 문자가 표시되지만 사용자가 원하는 만큼 잘 표시되지는 않을 경우 추가 폰트를 설치해도 좋다. 운영체제에서 사용자가 설치할 수 있는 선택적 폰트가 있을 수도 있고, 지원되는 대부분의 스크립트에 대한 폰트가 포함된 GNU Intlfonts 패키지를 설치하는 방법도 있다[2].


Emacs는 자동으로 세 가지 fontset를 생성하는데, 표준 fontset, 시작 fontset, 기본 fontset가 그것이다. 기본 fontset는 다양한 non-ASCII 문자에 대한 폰트를 갖고 있으며, 나머지 두 fontset에 대한 기본 대책이자 fontset가 아닌 기본 폰트를 설정하였을 때 기본 대책이 된다. 하지만 폰트 family name을 명시하지는 않으므로 사용자가 직접 이용할 경우 결과는 다소 무작위로 이루어진다. '-fn' 옵션으로 Emacs를 시작하면 특정 fontset의 사용을 명시할 수 있다. 아래를 예로 들겠다.

emacs -fn fontset-standard


'Font' 자원으로도 fontset를 명시할 수 있다(493 페이지의 부록 D [X 자원] 참고).


fontset의 사용이 전혀 명시되지 않으면 Emacs는 폰트에 포함하지 않은 문자에 대한 폴백(fallback)으로 '

fontset-default

' 를 이용하여 ASCII 폰트를 사용한다. 표준 fontset는 이름과 상관없이 직접적으로 요청 시에만 사용된다.


Fontset는 모든 문자 코드마다 폰트를 명시할 필요가 없다. Fontset가 특정 문자에 대해 어떠한 폰트도 명시하지 않거나 시스템에 존재하지 않는 폰트를 명시할 경우, 해당 문자를 적절하게 표시할 수 없다. 따라서 16진 코드 또는 가는 공백이나 빈 상자가 대신 표시될 것이다. (상세한 내용은 85 페이지의 11.19절 [Glyphless문자] 참고).


Fontset 정의하기

X에서 Emacs를 실행하면 Emacs는 자동으로

standard-fontset-spec

의 값에 따라 표준 fontset 를 생성한다. 이 fontset 의 이름은 아래와 같거나

-*-fixed-medium-r-normal-*-16-*-*-*-*-*-fontset-standard or just 'fontset-

짧게 '

fontset-standard

' 가 된다.


GNUstep 과 Mac OS X 에서 표준 fontset 는

ns-standard-fontset-spec

의 값을 이용해 생성되고, MS Windows 에서는

w32-standard-fontset-spec

의 값을 이용해 생성된다.


표준 fontset 의 볼드체, 이탤릭체, 볼드-이탤릭체의 변형체들이 자동으로 생성된다. 그 이름은 '

medium

' 대신 '

bold

', 또는 '

r

' 대신 '

i

'가 사용되기도 하고, '

bold

' 와 '

i

' 둘 다 사용되기도 한다.


Emacs 는 사용자가 '

Font

' 자원 또는 '

-fn

' 인자를 이용해 명시하는 기본 ASCII 문자를 기반으로 또는 Emacs가 시작할 때 발견하는 기본 폰트 를 기반으로 하여 자동으로

fontset

을 생성한다. 이는 charset-registry 필드를 '

fontset

' 으로 대체하고 charset-encoding 필드를 '

startup

' 으로 대체한 후 결과가 되는 문자열을 이용해 fontset 을 명시하여 이루어진다.


예를 들어 아래 형태의 폰트로 Emacs 를 시작하면,

emacs -fn "*courier-medium-r-normal—14-140-*-iso8859-1"


Emacs 는 다음의 fontset 를 생성하여 초기 X 창 프레임에 사용한다:

-*-courier-medium-r-normal-*-14-140-*-*-*-*-fontset-startup


시작(startup) fontset 는 사용자가 명시하는 폰트 혹은 다른 레지스트리와 부호화를 가진 변형체를 해당 폰트에서 지원하는 모든 문자에 대해 사용하고, 그 외 문자에 대해서는 '

fontset-default

' 에 의지할 것이다.


X 자원resource '

Emacs.Font

'를 이용하면 실제 폰트명과 같은 fontset 이름을 명시할 수도 있다. 하지만 '

Emacs*Font

' 처럼 와일드카드 자원에 fontset 이름을 명시하지 않도록 주의해야 하는데, 그러한 와일드카드 명세는 fontset 을 메뉴와 같은 다양한 자원에 매칭하지만 메뉴는 fontset 을 처리할 수 없기 때문이다. 관련 내용은 493 페이지의 부록 D [X 자원]을 참고한다.


'

Fontset-n

'이라는 X 자원을 이용해 추가 fontset를 명시할 수도 있는데, 여기서 n은 0부터 시작하는 정수다. 자원 값은 다음의 형태를 가져야 한다:

fontpattern, [charset: font].. .


여기서 fontpattern 은 표준 X 폰트명 형태여야 하지만 (이전 fontset-startup 예제 참고), 마지막 두 개의 필드는 제외다. 마지막 두 필드는 '

fontset-alias

' 형태여야 한다.


Fontset 에는 두 개의 이름이 있는데 하나는 길고 나머지는 짧다. 긴 이름은 fontpattern 이고 짧은 것은 '

fontset-alias

' 다. fontset 은 둘 중 하나를 이용해 참조할 수 있다.


구조체 '

charset:font

'는 특정 문자 집합에 대해 (해당 fontset에서) 어떤 폰트를 사용할지 명시한다. 여기서 charset는 문자 집합 이름이고, font는 해당 문자 집합에 사용할 폰트이다. 하나의 fontset를 정의하는 데에 이 구조체를 원하는 횟수만큼 이용할 수 있다.


다른 문자 집합에 대해서는 fontpattern 을 기반으로 Emacs가 폰트를 선택한다. 그러면 '

fontset-aliase

' 가 문자 집합을 설명하는 값으로 대체된다. ASCII 문자 폰트의 경우 '

fontset-alias

' 는 '

ISO8859-1

'로 대체된다.


또한 여러 개의 연속 필드가 와일드카드라면 Emacs 는 그것들을 하나의 와일드카드로 collapse 시킨다. 이는 크기가 자동으로 조정되는 폰트의 사용을 막기 위함이다. 큰 폰트를 크기 조정하여 만든 폰트는 편집에 사용할 수 없으며, 작은 폰트의 크기 조정 역시 유용하지 못한데, 작은 폰트는 그 자체 크기로 사용하는 편이 낫고 Emacs 역시 작은 폰트를 그대로 사용하기 때문이다.


따라서 fontpattern 이 아래와 같다면

-*-fixed-medium-r-normal-*-24-*-*-*-*-*-fontset-24


ASCII 문자의 폰트 명세는 다음이 될 것이고:

-*-fixed-medium-r-normal-*-24-*-ISO8859-1


Chinese GB2312 문자에 대한 폰트 명세는 아래와 같아질 것이다:

-*-fixed-medium-r-normal-*-24-*-gb2312*-*


위의 폰트 명세에 일치하는 중국어 폰트가 없을지도 모른다. 대부분 X 배포판은 family 필드에 '

song ti

' 또는 '

fangsong ti

'를 가진 중국어 폰트만 포함한다. 그런 경우 '

Fontset-n

' 을 다음과 같이 명시할 수 있다:

Emacs.Fontset-0: -*-fixed-medium-r-normal-*-24-*-*-*-*-*-fontset-24,\ 
        chinese-gb2312:-*-*-medium-r-normal-*-24-*-gb2312*-*


그리고 나면 Chinese GB 2312 문자를 제외한 모든 문자에 대한 폰트 명세는 family 필드에 '

fixed

' 를 갖게 되고, Chinese GB2312 문자에 대한 폰트 명세는 family 필드에 와일드 카드 '

*

' 를 갖는다.


fontset 을 생성하기 위해 fontset 자원 값을 처리하는 함수를

create-fontset-from-fontset-spec

이라고 부른다. 이 함수를 명시적으로 호출하면 fontset 를 생성할 수 있다.


폰트 명명에 관한 추가 정보는 168 페이지의 18.8절 [폰트]를 참고한다.


Fontset 수정하기

Fontset 를 매번 처음부터 생성할 필요는 없다. 약간의 변경만으로 충분하다면 기존 fontset 를 수정하는 편이 수월하다. '

fontset-default

' 를 수정하면 그것을 폴백으로 사용하는 다른 fontset 에도 영향을 미치므로 Emacs 가 특정 스크립트에 선택하는 폰트를 이용하면서 발생하는 문제를 수정하는 효과적인 방법이 된다.


Fontset 는

set-fontset-font

함수를 이용하여 수정이 가능한데, 이 함수는 폰트를 수정할 문자, charset, 스크립트 또는 문자 범위를 비롯해 사용할 폰트에 대한 폰트 명세를 명시한다. 몇 가지 예를 들자면 다음과 같다:

;; Use Liberation Mono for latin-3 charset. 
(set-fontset-font "fontset-default" 'iso-8859-3 
                  "Liberation Mono")

;; Prefer a big5 font for han characters 
(set-fontset-font "fontset-default"
                  'han (font-spec :registry "big5") 
                  nil 'prepend)

;; Use DejaVu Sans Mono as a fallback in fontset-startup 
;; before resorting to fontset-default.
(set-fontset-font "fontset-startup" nil "DejaVu Sans Mono" 
                  nil 'append)

;; Use MyPrivateFont for the Unicode private use area. 
(set-fontset-font "fontset-default" '(#xe000 . #xf8ff) 
                  "MyPrivateFont")


표시할 수 없는 문자

터미널에서 표시할 수 없는 non-ASCII 문자가 몇 가지 있을지도 모른다. 대부분 텍스트 터미널은 단일 문자 집합만 지원하는데 (

default-terminal-coding-system

변수를 이용해 어떤 것을 사용할지 Emacs 에게 알리는데, 관련 내용은 191 페이지의 19.12절 [터미널 코딩] 참고), 해당 코딩 시스템에서 부호화할 수 없는 문제는 기본적으로 '?'로 표시된다.


그래픽 디스플레이는 더 넓은 범위의 문자를 표시할 수 있지만 모든 문자에 대해 폰트가 설치되어 있지 않을 수도 있으며, 폰트가 없는 문자는 빈 상자로 나타난다.


Latin-1 문자를 사용하는데 터미널이 Latin-1 을 표시할 수 없다면 연상 기호 ASCII 시퀀스를 대신 표시할 수도 있는데, 가령 o-움라우트에 대해 '"o'를 사용할 수 있겠다. 이를 실행하기 위해서는

iso-ascii

라이브러리를 로딩한다.


터미널이 Latin-1 을 표시할 수 있다면 그에 해당하는 Latin-1 문자와 ASCII 연상 기호를 혼합하여 다른 유럽 문자 집합으로부터 문자를 표시할 수 있다. 이러한 기능은

latin1-display

변수를 맞춤화하여 활성화된다. 연상 기호 ASCII 시퀀스는 대부분 접두어 입력 방법의 시퀀스와 일치한다.


단일바이트(Unibyte) 편집 모드

ISO 8859 Latin-n 문자 집합은 8진수 0240부터 0377까지 (10진수 160부터 255까지) 범위의 문자 코드를 정의하여 다양한 유럽어의 (일부 비 유럽어도 포함) 강세가 있는 문자와 구두점을 처리한다. 사용자가 다중바이트 문자를 비활성화할 경우 Emacs는 이 범위의 코드가 있는 바이트는 단일바이트 버퍼에서조차 문자가 아니라 raw 바이트로 취급함을 명심한다. 하지만 Emacs는 이러한 문자 코드들을 마치 한 번에 설정된 단일바이트 문자 집합 중 하나에 속한 것처럼 취급할 수 있다. 이러한 코드 중 무엇을 사용할 것인지 명시하려면 M-x set-language-environment 를 호출하여 'Latin-n'과 같이 적절한 언어 환경을 명시한다. GNU Emacs Lisp Reference Manual 의 "Disabling Multibyte Characters" 절을 참고한다.


Emacs 는 160 부터 255 까지 범위의 바이트를 읽을 수 있는 문자로 표시할 수도 있는데, 사용 중인 터미널 또는 폰트가 그것을 지원할 때 한해서다. 이는 자동으로 작동한다. 그래픽 디스플레이에서 Emacs는 현재 언어 환경에 따라 그에 상응하는 다중 문자를 사실상 표시함으로써 폰트집합을 통해 단일 바이트 문자를 표시하기도 한다. 이를 요청하려면

unibyte-display-via-language-environment

변수를

nil

이 아닌 값으로 설정한다. nil 이 아닌 값으로 설정하면 이러한 바이트가 어떻게 표시되는지에만 영향을 미칠 뿐, Emacs가 그것을 문자가 아닌 raw 바이트로 취급한다는 기본 사실에는 변화가 없다.


사용자의 터미널이 Latin-1 문자 집합 표시를 지원하지 않는다면 Emacs는 적어도 사용자가 이러한 문자가 무엇인지 분명히 알 수 있도록 ASCII 시퀀스로 표시할 수 있다. 이를 위해선

iso-ascii

라이브러리를 로딩한다. 다른 Latin-n 문자 집합에 대해 비슷한 라이브러리들을 구현할 수도 있지만 지금까지는 구현된 바가 없다.


보통

ISO-8859

에 해당하지 않는 문자들은 (10진 코드 128부터 159까지 포함) 8진 escape 로 표시된다.

disp-table

라이브러리에서

standard-display-8bit

함수를 이용하여

ISO-8859

문자 집합의 비표준 "확장" 버전에서 이를 변경할 수 있다.


단일바이트로 된 non-ASCII 문자를 입력하는 방법에는 두 가지가 있다:

  • 선택된 언어 환경에 입력 방법을 이용할 수 있다. 181 페이지의 19.3절 [입력 방법]을 참고한다. 단일바이트 버퍼에서 입력 방법을 사용할 경우 사용자가 그것을 이용해 명시하는 non-ASCII 문자는 단일바이트로 변환된다.
  • 키보드가 128(10진수)까지 문자 코드를 생성하여 non-ASCII 문자를 표현한다면 사용자는 그러한 코드를 직접 입력할 수 있다.
    그래픽 디스플레이에서 이러한 키들이 알아서 작동하므로 사용자가 특별한 무언가를 하지 않아도 된다. 텍스트 터미널에서는 M-x set-keyboard-coding-system 을 사용하거나
    keyboard-coding-system
    변수를 맞춤화하여 키보드가 어떤 코딩 시스템을 사용하는지 명시해야 한다(191 페이지의 19.12절 [터미널 코딩] 참고). 이 기능을 활성화하면 아마도 Meta 문자를 입력하기 위해
    ESC
    를 사용해야 하겠지만, 콘솔 터미널이나
    xterm
    에서는 Meta 를
    ESC
    로 변환하여도 여전히 키보드에 존재하는 8-bit 문자를 직접 입력하거나 Compose 또는 AltGr 키를 사용할 수 있을 것이다. 11 페이지의 2.1절 [사용자 입력]을 참고한다.
  • Latin-1 only 의 경우 C-x 8 을 non-ASCII Latin-1 출력 문자의 엔트리에서 "문자 작성" 접두어로 사용할 수 있다. C-x 8 은 삽입(미니버퍼를 비롯해 다른 버퍼에서), 검색, 그리고 키 시퀀스가 허용되는 다른 컨텍스트에 사용하기 좋다.
    C-x 8
    iso-transl
    라이브러리를 로딩함으로써 작동한다. 그 라이브러리가 로딩되면 키보드에 Alt 수식 키가 있을 경우 이 키는 C-x 8 과 동일한 역할을 하므로, Alt 키와 함께 강세 문자를 사용하면 다음에 오는 문자를 수정할 수 있다. 또한 키보드에 Latin-1 "dead accent 문자"에 해당하는 키가 있다면
    iso-transl
    가 로딩되는 즉시 잇따른 문자를 이용해 작성되도록 정의된다.
    이용 가능한 C-x 8 해석을 열거하려면 C-x 8 C-h 를 사용한다.


Charsets

Emacs에서 charset는 "문자 집합"의 줄임말이다. Emacs는 잘 알려진 문자 집합 대부분은 물론이고 (예:

ascii

,

iso-8859-1

,

cp1250

,

big5

,

unicode

) 고유의 문자 집합도 몇 가지 지원한다(예:

emacs

,

unicode-bmp

,

eight-bit

). 지원되는 문자는 모두 하나 또는 그 이상의 charset에 속한다.


Emacs는 보통 charset와 관련해 "올바른 일을 수행"하므로 사용자가 걱정할 필요가 없다. 하지만 charset에 관한 기본적인 사항 몇 가지를 알아둔다면 유용하겠다.


한 가지 예가 폰트 선택이다(168 페이지의 18.8절 [폰트] 참고). 각 언어 환경은 (179 페이지의 19.2절 [언어 환경] 참고) 다양한 charset에 대한 "우선순위 목록"을 정의한다. Emacs는 폰트를 검색할 때 먼저 우선순위가 가장 높은 charset를 표시할 수 있는 폰트를 찾는다. 가령 일본어 환경에서는

japanese-jisx0208

문자 집합이 최상위 우선순위를 가지므로 Emacs 는

registry

속성이 '

JISX0208.1983-0

' 인 폰트를 사용하려고 한다.


Charset에 관한 정보를 얻는 데에 사용할 수 있는 명령어는 두 가지가 있다. M-x list-charset-chars 명령어는 charset 이름의 입력을 요구하고, 해당 문자 집합 내 모든 문자를 표시한다. M-x describe-character-set 은 charset 이름의 입력을 요구하고, Emacs 내에서 해당 charset의 내부적 표현을 포함해charset에 관한 정보를 표시한다.


M-x list-character-sets 는 지원되는 모든 charset의 목록을 표시한다. 이 목록은 charset의 이름과 각 charset을 식별하는 정보를 열거하는데, 상세한 정보는 International Register of Coded Character Sets ( http://www.itscj.ipsj.or.jp/ISO-IR/ )를 참고한다. 이 목록에서 charset는 두 가지 범주로 나뉘는데, 일반 charsets가 먼저 열거된 다음 추가 charsets가 열거된다. 추가 charset는 다른 charset를 (부모 또는 하위집합으로서) 정의하거나 오래된 Emacs 버전에 대한 호환성을 제공하기 위해 사용된다.


버퍼 내 문자가 어떤 charset에 속하는지 알아내려면 문자 앞에 포인트를 놓고 C-u C-x = 를 입력한다(177 페이지의 19.1절 [국제 문자] 참고).


양방향 편집

Emacs는 아랍어나 히브리어처럼 가로 텍스트 표시가 오른쪽에서 왼쪽으로 이루어지는 스크립트로 쓰인 텍스트의 편집을 지원한다. 하지만 이러한 스크립트에 포함된 Latin 텍스트나 숫자는 여전히 왼쪽에서 오른쪽으로 표시된다. 또 Latin 문서에 아랍어나 히브리어로 된 텍스트가 조금씩 포함되어 있는 경우도 흔한데, 가령 프로그램 소스 파일에 사용된 주석이나 문자열을 예로 들 수 있겠다. 따라서 이러한 스크립트를 사용하는 텍스트는 사실상 양방향으로 구성되어 왼쪽에서 오른쪽으로 읽히는 문자와 오른쪽에서 왼쪽으로 읽히는 문자가 혼합되어 있다.


이번 절에서는 Emacs가 양방향 텍스트를 편집하기 위해 제공하는 기능과 옵션을 설명하고자 한다.


Emacs 는 오른쪽에서 왼쪽으로 읽히는 텍스트와 양방향 텍스트를 소위 논리 (또는 읽는) 순으로 보관하는데, 사용자가 처음으로 읽는 문자의 문자열 또는 버퍼 위치가 다음으로 읽는 문자의 문자열 또는 버퍼 위치보다 앞선다. 따라서 양방향 텍스트가 시각 순으로 재정렬되는 현상은 표시할 당시에 이루어진다. 그 결과 문자 위치는 더 이상 디스플레이 상의 문자 위치와 일관되게 증가하지 않는다. Emacs는 양방향 텍스트 표시를 위해 재정렬이 가능하도록 Unicode Standard Annex #9 에 설명된 유니코드 양방향 알고리즘(Unicode Bidirectional Algorithm)을 구현한다.


버퍼 로컬 변수

bidi-display-reordering

은 버퍼 내 텍스트가 디스플레이를 위해 재정렬되는지를 제어한다. 그 값이 nil이 아니면 Emacs는 오른쪽에서 왼쪽 방향의 문자를 표시할 때 문자를 재정렬한다. 변수의 기본값은

t

이다.


양방향 텍스트의 각 문단은 고유의 기본 방향성을 지니며, 오른쪽에서 왼쪽, 왼쪽에서 오른쪽 중 하나에 해당한다. (문단 경계는 빈 행으로 되어 있는데, 여기서 빈 행이란 전체가 여백 문자로 구성된 행을 의미한다.) 왼쪽에서 오른쪽으로 읽히는 문단의 텍스트는 화면에서 창의 왼쪽 여백에서 시작하여 오른쪽 여백에 도달하면 절단되거나 연속된다. 반면 오른쪽에서 왼쪽으로 읽히는 문단의 텍스트는 오른쪽 여백에서 시작해 표시되고 왼쪽 여백에서 연속되거나 절단된다.


Emacs 는 각 문단의 시작에 있는 텍스트를 기반으로 문단의 기본 방향성을 동적으로 결정한다. 그렇지만 때로는 버퍼가 그 문단에 대해 특정 기본 방향성을 강요해야 할 때가 있다.

bidi-paragraph-direction

변수가

nil

값이 아닌 경우 기본 방향의 동적 결정을 비활성화하고, 대신 버퍼의 모든 문단이 그 버퍼 로컬 값에서 명시한 방향이 되도록 강요한다. 값은

right-to-left

left-to-right

중 하나가 될 수 있다. 그 외 모든 값은 nil로 해석된다.


아니면 문단 앞에 특수 포맷팅 문자를 삽입하여 문단의 기본 방향을 제어할 수도 있다.

RIGHT-TO-LEFT MARK

또는 RLM 이라 불리는 특수 문자는 뒤따라오는 문단에 대해 오른쪽에서 왼쪽 방향을 강조하는 반면

LEFT-TO-RIGHT MARK

또는 LRM 은 왼쪽에서 오른쪽 방향을 강요한다. (C-x 8 RET 을 이용해 이러한 문자를 삽입할 수도 있다.) GUI 세션에서 LRM 및 RLM 문자는 매우 가는 빈 문자로 표시되며, 텍스트 터미널에서는 빈 칸으로 표시된다.


문자들은 표시될 때 재정렬되므로 논리순으로 작업하거나 버퍼 위치의 stretch에서 작업하는 Emacs 명령어들은 예상치 못한 효과를 보이기도 한다. 가령 C-fC-b 명령어는 포인트를 논리순으로 이동시키므로 포인트가 재정렬된 양방향 텍스트를 순회할 때면 가끔씩 커서가 점프를 하기도 할 것이다. 마찬가지로 문자 위치의 연속 범위를 포함한 강조된 영역은 재정렬된 텍스트에 걸쳐 있을 경우 끊긴 것처럼(discontinuous) 보일 수도 있다. 이는 정상이며 양방향 텍스트를 지원하는 다른 프로그램에서도 비슷한 행위를 보인다.

visual-order-cursor-movement

nil

이 아닌 값으로 설정할 경우 화살표 키를 이용한 커서 움직임은 화면에 시각적 순서를 따른다(17 페이지의 4.2절 [포인트 이동하기] 참고).


Notes

  1. MIME '
    text/*
    ' bodies 및 기타 네트워크 전송 컨텍스트에도 명시된다. Emacs가 직접 지원하지 않는 SGML 참조 구문 record-start/record-end 포맷과는 다르다.
  2. X에서 Emacs를 실행할 경우 사용자는 아래와 같은 명령어를 이용해 X 서버에게 새로 설치된 폰트 위치를 알려야 할지도 모른다:
    xset fp+ /usr/local/share/emacs/fonts
    xset fp rehash