GNUEmacsManual:23

From 흡혈양파의 번역工房
Jump to: navigation, search
프로그램 편집하기

프로그램 편집하기

이번 장에서는 프로그램 편집을 용이하게 하는 Emacs 기능을 설명한다. 이러한 기능들이 실행하는 일은 다음을 포함한다:

  • 최상위 수준의 정의를 찾거나 그곳으로 이동한다(241 페이지의 23.2절 [Defuns] 참고).
  • 언어의 일반 들여쓰기 규칙을 적용한다(243 페이지의 23.3절 [프로그램 들여쓰기] 참고).
  • 괄호의 균형을 맞춘다(246 페이지의 23.4절 [소괄호] 참고).
  • 주석을 삽입, 제거 또는 정렬한다(249 페이지의 23.5절 [주석] 참고).
  • 프로그램 구문을 강조한다(78 페이지의 11.12절 [폰트 잠금] 참고).


프로그래밍 언어에 대한 주 모드

Emacs는 다수의 프로그래밍 언어에 특수화된 주 모드를 갖는다(199 페이지의 20.1절 [주 모드] 참고). 프로그래밍 언어 모드는 주로 표현식의 구문, 들여쓰기에 대한 관례적 규칙, 언어에 구문 강조를 사용하는 방법, 함수 정의의 시작이나 끝을 찾는 방법을 명시하는 것이 보통이다. 때로는 프로그림 컴파일 및 디버깅을 위한 기능도 갖고 있다. 각 언어에 대한 주 모드는 언어의 이름을 따서 명명되는데, 가령 C 프로그래밍 언어에 대한 주 모드는
c-mode
가 된다.


Emacs는 Lisp, Scheme, Scheme 기반의 DSSSL 표현식 언어, Ada, ASM, AWK, C, C++, Fortran, Icon, IDL (CORBA), IDLWAVE, Java, Javascript, Metafont (폰트 생성을 위한 TeX 의 유사 언어), Modula2, Object Pascal, Objective-C, Octave, Pascal, Perl, Pike, PostScript, Prolog, Python, Ruby, Simula, Tcl, VHDL에 대한 프로그래밍 언어 모드를 갖고 있다. Perl에 대한 대안 모드는 CPerl 모드라고 불린다. 공통 GNU와 Unix 셸, VMS DCL, MS-DOS/MS Windows 'BAT' 파일, makefiles, DNS 마스터 파일, 그 외 다양한 종류의 설정 파일에 대한 모드도 이용 가능하다.


이상적으로 Emacs는 사용자가 편집하길 원하는 프로그래밍 언어마다 주 모드를 가져야 한다. 사용자가 선호하는 언어에 대한 모드가 없다면 모드는 Emacs와 배포되지 않는 패키지에서 구현되기도 하고 (408 페이지의 32장 [패키지] 참고) 사용자가 기여할 수도 있다.


대부분의 프로그래밍 언어에서 들여쓰기는 프로그램의 구조를 설명하기 위해 행마다 달라야 한다. 따라서 대부분의 프로그래밍 언어 모드에서 TAB 을 입력하면 현재 행의 들여쓰기를 업데이트한다(243 페이지의 23.3절 [프로그램 들여쓰기] 참고). 또한 DEL
backward-delete-char-untabify
에 바인딩되는 것이 보통으로, 각 탭을 마치 동일한 수의 공백처럼 취급하여 역방향으로 삭제하므로 사용자는 공백이 스페이스나 탭 중 무엇으로 구성되었는지 걱정하지 않고 들여쓰기 한 열을 삭제할 수 있다.


프로그래밍 언어 모드에 들어가면
prog-mode-hook
훅 변수에 명시된 커스텀 Lisp 함수를 실행한 다음 모드 고유의 모드 훅에 명시된 함수를 실행한다(199 페이지의 20.1절 [주 모드] 참고). 예를 들어, C 모드에 들어가면
prog-mode-hook
c-mode-hook
이라는 훅을 실행한다. 훅에 관한 정보는 422 페이지의 33.2.2절 [훅]을 참고한다.


Emacs 배포판에는 Ada, C/C++/Objective C/Java/Corba IDL/Pike/AWK, IDLWAVE에 대한 주 모드를 다룬 Info 매뉴얼이 포함되어 있다. Fortran 모드의 경우 Specialized Emacs Features의 "Fortran" 절을 참고한다.


최상위 수준 정의, 또는 Defuns

Eamcs 에서는 함수와 같이 버퍼 내 최상위 수준에 위치한 주 정의를 defun 이라고 부른다. 이름은 Lisp 에서 비롯되었지만 Emacs 에서는 모든 언어에 사용한다.

왼쪽 여백 규칙

많은 프로그래밍 언어 모드들은 기본적으로 왼쪽 여백에서 발견되는 여는(opening) 구분 문자가 최상위 수준 정의 또는 defun의 시작이라고 가정한다. 따라서
그러한 의미가 아닌 이상 왼쪽 여백에 여는 구분 문자를 놓지 말라.
가령 Lisp 파일에서 최상위 수준 목록의 시작이 아닌 이상 왼쪽 여백에는 여는 소괄호를 절대 놓지 말아야 한다.


규칙은 많은 Emacs 연산 속도를 높이는데, 이러한 규칙을 사용하지 않는다면 코드의 구분을 분석하기 위해 버퍼의 시작으로 돌아가서 스캔해야 할 것이다.


이 규칙을 따르지 않으면 사용자는 defuns에 따라 움직임에 대한 명령어를 직접 사용 시 문제를 겪을 뿐 아니라 그것을 사용하는 다른 기능들 역시 사용자에게 문제가 될 것이다. 이는 들여쓰기 명령어와 (243 페이지의 23.3절 [프로그램 들여쓰기] 참고) Font Lock 모드도 (78 페이지의 11.12절 [폰트 잠금] 참고) 포함한다.


사용자가 문자열 안에서 행의 시작 위치에 여는 구분 문자를 원할 때 문제가 발생하기 쉽다. 이러한 문제를 피하려면 escape 문자를 (C와 Emacs Lisp에서 '\', 다른 Lisp dialects에서는 '/') 여는 구분 문자 앞에 놓는다. 그러면 문자열의 내용에는 영향을 미치지 않지만 여는 문자가 defun에서 시작되는 것을 막을 수 있다. 아래에 예를 소개하겠다:

  (insert "Foo: 
\(bar) 
")


이 규칙이 위반되는 경우를 포착하도록 돕기 위해 Font Lock 모드는 헷갈리기 쉬운 여는 구분 문자를 (인용 부호로 표시되어야만 하는 문자) 빨간색 굵은 글씨로 강조한다.


이 규칙을 오버라이드할 필요가 있다면
open-paren-in-column-0-is-defun-start
변수를 설정한다. 해당 사용자 옵션이
t
로 (기본값) 설정되면 0번 열에서 여는 소괄호 또는 중괄호가 항상 defuns 를 시작한다. 값이
nil
이면
defuns
는 가장 바깥쪽 수준에서 소괄호 또는 중괄호를 검색하여 발견된다.


보통은 사용자가 이 옵션을 기본값
t
로 남겨야 한다. 버퍼가 0번 열에 defuns 를 시작하지 않는 소괄호 또는 중괄호를 포함하고 있을 경우 그러한 소괄호나 중괄호를 제거하는 것은 비실용적이며, 옵션을
nil
로 설정하는 것이 유용하다. 이는 큰 버퍼의 경우 스크롤 및 디스플레이를 꽤 지연시킬 수 있음을 명심한다. 또한 소괄호와 중괄호가 적절히 작동하려면 버퍼에 걸쳐 올바르게 일치해야만 한다.


Defuns에 따라 이동하기

이러한 명령어들은 최상위 수준의 주 정의, defuns 라고 불리는 정의를 기반으로 포인트를 이동시키거나 영역을 준비시킨다.


C-M-a 현재 또는 이전 defun의 시작으로 이동한다(
beginning-of-defun
).


C-M-e 현재 또는 다음 defun의 끝으로 이동한다(
end-of-defun
).


C-M-h 전체적인 현재 또는 다음 defun 주위로 영역을 놓는다(
mark-defun
).


현재 defun 의 시작과 끝으로 이동하는 명령어는 C-M-a (
beginning-of-defun
)과 C-M-e (
end-of-defun
)이다. 이러한 명령어 중 하나를 반복하거나 양의 수치적 인자를 사용할 경우 각 반복마다 다음 defun을 움직임 방향으로 이동시킨다.


음의 인자 -n 을 이용한 C-M-a 는 defun 의 다음 시작까지 n 회 순방향 이동한다. 이는 n 의 인자를 둔 C-M-e 가 이동할 위치와 정확히 동일하지는 않지만 해당 defun 의 끝은 주로 뒤따라오는 defun 의 시작과 정확한 동일한 위치다. (공백, 주석, 또는 선언 역시 그들을 구분할 수도 있다.) 마찬가지로 음의 인자를 이용한 C-M-e 는 defun 의 끝으로 다시 이동하는데, 이는 양의 인자를 이용한 C-M-a 와 정확히 동일한 효과를 내지는 않는다.


현재 defun 에서 작업하려면 마크를 현재 defun 의 끝에 설정하고 포인트를 현재 defun 의 시작에 위치시키는 C-M-h (
mark-defun
)을 사용한다. 관련 내용은 47 페이지의 8.2절 [객체 마크하기]를 참고한다. 이것이 defun 을 파일 내 다른 위치로 이동하기 위해 제거할 준비시키는 가장 간단한 방법이다. defun 들 사이에 포인트가 있을 때 명령어를 사용할 경우 그 뒤에 따라오는 defun 을 사용한다. 마크가 이미 활성화되어 있을 때 명령어를 사용하면 마크를 설정하지만 포인트를 이동시키진 않으며, 그 이후에 C-M-h 를 사용할 때마다 영역의 끝은 defun 을 하나 더 포함하도록 확장된다.


C 모드에서 C-M-h
c-mark-function
함수를 실행하는데, 이는
mark-defun
과 거의 동일하며, 인자 선언, 함수명, 리턴된 데이터 타입을 지나서까지 되돌아가서 전체 C 함수가 영역 내에 위치하도록 한다는 점만 다르다. 이는 주 모드가 표준 키 바인딩을 조정하여 특정 언어에 더 잘 들어맞도록 표준 작업을 실행하는 방법을 보여주는 일례다. 다른 주 모드들이 그러한 목적으로 이러한 키 바인딩 중 일부 또는 모두를 대체할 수도 있다.


Imenu

Imenu 기능은 파일 내 주 정의를 이름으로 찾는 방법을 제공한다. 각 챕터, 섹션 등을 함수로 취급하는 텍스트 포맷터 주 모드에서도 유용하다. (여러 개의 파일을 한꺼번에 처리하는 강력한 기능은 299 페이지의 25.3절 [태그] 참고).


M-x imenu 를 입력하면 미니버퍼를 이용해 정의 이름을 읽은 후 그 정의로 포인트를 이동시킨다. 이름을 명시하는 데에 완성을 이용할 수도 있는데, 명령어는 항상 유효한 이름의 전체 목록을 표시한다.


아니면
imenu
명령어를 마우스 클릭으로 바인딩할 수도 있다. 그러면 사용자가 정의명을 선택할 수 있도록 마우스 메뉴가 표시된다.
imenu-add-menubar-index
를 호출함으로써 버퍼의 색인을 메뉴 바로 추가할 수도 있다. 이 메뉴 바 항목을 특정 주 모드에서 모든 버퍼에 이용할 수 있도록 만들기 위해서는
imenu-add-menubar-index
를 이 모드 훅으로 추가하면 된다. 하지만 이미 이것을 실행하였다면 Emacs 가 해당 버퍼에서 모든 정의를 찾는 동안 사용자는 해당 모드에서 파일을 방문할 때마다 조금 기다려야 할 것이다.


버퍼의 내용을 변경할 때 정의를 추가 또는 삭제한다면 메뉴에서 '
*Rescan*
' 항목을 호출함으로써 새 내용을 바탕으로 버퍼의 색인을 업데이트할 수 있다. 재스캔은 사용자가
imenu-auto-rescan
nil
이 아닌 값으로 설정할 경우 자동으로 발생한다. 텍스트에 약간의 내용만 변경했다고 해서 재스캔을 할 필요는 없다.


메뉴가 정렬되는 방식은
imenu-sort-function
변수를 설정하여 맞춤화할 수 있다. 메뉴가 버퍼에서 발생할 때 이름이 정렬되는 것이 기본값으로, 알파벳 정렬을 원한다면
imenu--sort-by-name
심볼을 값으로 사용하라. Lisp 코드를 작성함으로써 비교 함수를 정의할 수도 있다.


Imenu 는 Which Function 모드를 안내하는 정보를 제공한다. Speedbar 역시 해당 모드를 사용할 수 있다(171 페이지의 18.9절 [스피드바] 참고).


Which Function 모드

Which Function 모드는 전역적 부 모드로 (200 페이지의 20.2절 [부 모드] 참고) 모드 행에서 현재 함수명을 표시하고 사용자가 버퍼에서 이동하는 동안 함수를 업데이트한다.


Which Function 모드를 활성화하거나 비활성화하기 위해서는 M-x which-function-mode 명령어를 사용한다. Which Function 모드는 전역적 부 모드이다. 기본적으로 그것을 지원하는 방법을 아는 모든 주 모드에서 효과를 보인다(예: Imenu를 지원하는 모든 주 모드).
which-func-modes
t
에서 (이용 가능한 모든 주 모드를 지원함을 의미) 주 모드명 목록으로 변경함으로써 특정 주 모드의 목록으로 사용을 제한할 수도 있다.


프로그램에 대한 들여쓰기

프로그램을 적절하게 들여 쓴 채로 유지하는 최선의 방법은 사용자가 변경하는 대로 다시 들여 쓰도록 Emacs를 이용하는 방법이다. Emacs는 단일 행, 명시된 행의 개수, 또는 하나의 괄호 그루핑에 존재하는 모든 행을 들여 쓰는 명령어들을 갖고 있다.


들여쓰기에 관한 일반 정보는 205 페이지의 21장 [들여쓰기]를 참고한다. 이번 절에서는 프로그래밍 언어 모드에 한정된 들여쓰기 기능을 설명하고자 한다.


Emacs 는
pp
패키지에 모양새가 좋은 들여쓰기로 Lisp 객체를 재포매팅하는 Lisp pretty-printer 를 제공한다.


기본적인 프로그램 들여쓰기 명령어

TAB 현재 행의 들여쓰기를 조정한다(
indent-for-tab-command
).


RET 새 행을 삽입한 후 다음 행의 들여쓰기를 조정한다(
newline
).


기본 들여쓰기 명령어는 TAB (
indent-for-tab-command
)으로, 205 페이지의 21장 [들여쓰기]에 문서화되어 있다. 프로그래밍 언어 모드에서 TAB 은 선행하는 행의 들여쓰기와 구문적 내용을 기반으로 현재 행을 들여 쓰는데, 영역이 활성화되어 있을 때 TAB 을 이용하면 현재 행뿐만 아니라 영역 내 각 행을 들여쓰기도 한다.


16 페이지의 4.1절 [텍스트 삽입하기]에 문서화된 RET (
newline
) 명령어는 C-j 다음에 TAB 을 이용하는 것과 동일하여 새 행을 삽입한 후 행의 들여쓰기를 조정한다.


괄호 그루핑 내에서 시작되는 행을 들여 쓸 때 Emacs는 보통 그룹 내에서 선행하는 행 아래에 또는 괄호 뒤의 텍스트 아래에서 행의 시작을 위치시킨다. 사용자가 이러한 행들 중 하나에 수동으로 비표준 들여쓰기를 제공할 경우 (예: 보기에 좋다는 이유로) 그 아래 행들도 그 행을 따를 것이다.


대부분 프로그래밍 언어 모드에 사용되는 들여쓰기 명령어는 왼쪽 여백에 위치한 여는 괄호, 여는 중괄호 또는 여는 구분 문자를 함수의 시작으로 가정한다. 사용자가 편집 중인 코드가 이러한 가정을 위반하면 구분 문자가 문자열이나 주석에서 발생한다 하더라도
open-paren-in-column-0-is-defun-start
nil
로 설정해야만 들여쓰기가 적절하게 작동한다. 241 페이지의 23.2.1절 [왼쪽 여백 Paren]을 참고한다.


여러 행 들여쓰기

때로는 한 번에 여러 개의 코드 행을 다시 들여쓰길 원할 수도 있다. 한 가지 방법으로 마크를 사용하는 방법이 있는데, 마크가 활성화되고 영역이 비어 있지 않으면 TAB 은 영역 내 모든 행을 들여 쓴다. 아니면 C-M-\ (
indent-region
) 명령어를 이용해 마크가 활성화되었는지 여부와 상관없이 영역 내 모든 행을 들여 쓴다(205 페이지의 21.1절 [들여쓰기 명령어] 참고).


Emacs는 또한 커다란 코드 청크를 들여쓰기 위해 다음 명령어들을 제공한다:


C-M-q 하나의 괄호 그루핑 내에 모든 행을 다시 들여쓴다.


C-u TAB 전체 괄호 그루핑을 옆으로 전부 시프팅(shift)하여 첫 번째 행을 적절하게 들여 쓰도록 한다.


M-x indent-code-rigidly 영역 내 모든 행을 옆으로 시프팅하되 주석과 문자열 내에서 시작되는 행은 수정하지 않는다.


하나의 괄호 그루핑 내용을 다시 들여쓰려면 포인트를 그루핑 시작 앞에 위치시키고 C-M-q 를 입력한다. 이는 전체 들여쓰기에 영향을 미치지 않고 그루핑 내에 상대적 들여쓰기를 변경한다(예: 그루핑이 시작되는 행의 들여쓰기). C-M-q 가 실행하는 함수는 주 모드에 따라 좌우되는데, Lisp 모드에서는
indent-pp-sexp
이고, C 모드에서는
c-indent-exp
식이다. 전체적인 들여쓰기도 수정하려면 TAB 을 먼저 입력한다.


그루핑 내에서 상대적 들여쓰기를 원하지만 첫 행의 들여 쓰지 않을 경우 포인트를 그 첫 행으로 이동시켜 C-u TAB 을 입력한다. Lisp, C, 일부 다른 주 모드에서 수치적 인자를 이용한 TAB 은 현재 행까지 다시 들여 쓴 후 현재 행에서 시작되는 괄호 그루핑 내 모든 행들도 동일한 양만큼 다시 들여 쓴다. 하지만 현명하게도 문자열 안에서 시작되는 행은 수정하지 않는다. C 모드에 있을 때 C 전처리기 행도 수정하지 않지만 그에 부착된 연속 행은 다시 들여 쓴다.


M-x indent-code-rigidly 명령어는
indent-rigidly
처럼 영역 내 모든 행을 옆으로 시프팅한다(205 페이지의 21.1절 [들여쓰기 명령어] 참고). 영역 역시 그 문자열 내에서 시작하지 않는 이상 문자열 내에서 시작되는 행의 들여쓰기는 수정하지 않는다. 접두어 arg 는 들여 쓸 열의 개수를 명시한다.


Lisp 들여쓰기 맞춤화하기

Lisp 표현식에 대한 들여쓰기 패턴은 표현식이 호출하는 함수에 따라 좌우된다. 각 Lisp 함수마다 사용자는 사전에 정의된 여러 개의 들여쓰기 패턴 중에서 선택하거나 Lisp 프로그램으로 임의의 패턴을 정의한다.


들여쓰기의 표준 패턴은 다음과 같다: 표현식 두 번째 행이 표현식의 시작과 동일한 행에 있을 경우 첫 번째 인자 아래에 들여 쓰고, 그 외의 경우 두 번째 행은 함수명 밑에 들여 쓴다. 그 이후 행마다 중첩 깊이가 동일한 이전 행 아래에서 들여 쓴다.


lisp-indent-offset
변수가
nil
이 아닐 경우 표현식의 두 번째 행에 대한 일반 들여쓰기 패턴을 오버라이드하여 그러한 행이 항상 포함하는 목록보다
lisp-indent-offset
만큼 많은 열을 들여 쓰도록 한다.


특정 함수들은 표준 패턴을 오버라이드한다. 이름이 def 로 시작하는 함수들은 두 번째 행을 본문(body)의 시작으로 취급하는데, 이 때는 두 번째 열을 표현식을 시작하는 여는 괄호를 지나
lisp-body-indent
만큼의 열을 추가로 들여 써야 한다.


함수명의
lisp-indent-function
속성에 따라 개별 함수마다 다양한 방식으로 표준 패턴을 오버라이드할 수 있다. 이는
declare
구조체를 이용하여 매크로 정의에서 주로 이루어진다. the Emacs Lisp Reference Manual 의 "Defining Macros" 절을 참고한다.


C 들여쓰기에 사용되는 명령어

C 모드와 관련 모드에서 들여쓰기에 사용하는 특수 기능을 소개하겠다:


C-c C-q 현재 최상위 수준 함수 정의를 다시 들여 쓰거나 타입 선언을 합한다(
c-indent-defun
).


C-M-q 포인트에 뒤에 따라오는 균형이 맞는 표현식에 포함된 행마다 다시 들여 쓴다(
c-indent-exp
). 접두 인자는 무효한 구문에 관한 경고 메시지를 억제한다.


TAB 현재 행을 다시 들여쓰고, 일부 사례에서는 탭 문자를 삽입한다(
c-indent-command
).
c-tab-always-indent
t
일 경우 이 명령어는 현재 행을 다시 들여 쓰고 아무 일도 하지 않는다. 이것이 기본값이다.
변수가
nil
일 경우 이 명령어는 포인트가 좌측 여백에 있을 때 또는 행의 들여쓰기에 있을 때에만 현재 행을 다시 들여 쓰고, 그 외에는 탭을 삽입한다(
indent-tabs-mode
nil
일 경우에는 탭 대신 동일한 수의 공백을 삽입).
그 외의 값은 (
nil
t
를 제외한 값) 항상 행을 다시 들여 쓰고, 주석이나 문자열 내에 위치할 경우 탭을 삽입함을 의미한다.


현재 버퍼 전체를 다시 들여 쓰려면 C-x h C-M-\ 를 입력한다. 이는 먼저 전체 버퍼를 영역으로 선택한 다음 해당 영역을 다시 들여 쓴다.


현재 블록을 다시 들여 쓰려면 C-M-u C-M-q 를 사용한다. 그러면 블록의 앞으로 이동하여 모두 다시 들여 쓸 것이다.


C 들여쓰기 맞춤화하기

C 모드와 그 관련 모드들은 들여쓰기를 맞춤화하는 데에 유연한 메커니즘을 이용한다. C 모드는 소스 행을 두 단계로 들여 쓰는데, 먼저 행을 내용과 컨텍스트에 따라 구문적으로 구분하고, 두 번째는 구문 구조체를 이용해 선택된 스타일과 상관된 들여쓰기 오프셋을 결정한 후 앵커문(anchor statement)의 들여쓰기로 추가한다.


C-c . style RET 사전에 정의된 스타일인 style 을 선택한다(
c-set-style
).


style 은 C 모드와 그에 관련된 모드에서 사용할 수 있는 맞춤화의 명명된 집합체이다. 전체 설명은 The CC Mode Manual 의 "Styles" 절을 참고한다. Emacs 에는
gnu
,
k&r
,
bsd
,
stroustrup
,
linux
,
python
,
java
,
whitesmith
,
ellemtel
,
awk
를 포함해 사전에 정의된 스타일 몇 가지가 있다. 이러한 스타일 중 일부는 주로 하나의 언어에 대해 들여쓰기 되어 있지만 이러한 모드들이 지원하는 언어라면 뭐든 함께 사용할 수 있다. 스타일이 어떻게 생겼는지 알아내기 위해서는 스타일을 선택하고 함수 정의 시작에 C-M-q 를 입력함으로써 코드 일부를 다시 들여 쓴다.


현재 버퍼에 대한 스타일을 선택하려면 C-c . 명령어를 사용한다. 스타일명을 인자로 (대, 소문자는 중요하지 않음) 명시하라. 이 명령어는 현재 버퍼에만 영향을 미치며, 들여쓰기 명령어의 향후 호출에만 영향을 미칠 뿐, 버퍼에 이미 존재하는 코드는 다시 들여 쓰지 않는다. 전체 버퍼를 새로운 스타일로 다시 들여 쓰기 위해서는 C-x h C-M-\ 를 입력한다.


다양한 주 모드에 대한 기본 스타일을 명시하려면
c-default-style
변수를 설정할 수도 있다. 그 값은 스타일명(문자열) 또는 alist 로 되어 있어 각 요소는 하나의 주 모드와 그에 사용할 들여쓰기 스타일을 명시한다. 예를 들면 다음과 같다.
(setq c-default-style
      '((java-mode . "java")
        (awk-mode . "awk")
        (other . "gnu")))


위는 Java 와 AWK 모드에 직접적 선택을 명시하며, 다른 유사 C 모드에서 기본 '
gnu
' 스타일이다. (이러한 설정은 사실상 기본값이다.) 이 변수는 사용자가 유사 C 주 모드 중 하나를 선택하면 효과가 발생하므로 사용자가 Java 모드에 대해 새로운 기본 스타일을 명시할 경우 M-x java-mode 를 입력하여 기존 Java 모드 버퍼에서 효과를 발휘하도록 만들 수 있다.


gnu
스타일은 C 에 대해 GNU Project 가 권장하는 포맷팅을 명시하는데, 이는 기본값이므로 필자들이 권장하는 스타일을 사용할 것을 권한다.


C 와 관련 모드에서 기존 스타일의 부분을 오버라이드하는 방법과 자신만의 스타일을 정의하는 방법을 포함해 들여쓰기 맞춤화에 관한 추가 정보는 the CC Mode Manual 의 "Indentation Engine Basics" 절과 "Customizing Indentation" 절을 참고한다.


스타일을 명시하는 대신 예제 코드 버퍼에서 M-x c-guess 를 입력하여 스타일을 짐작하도록 Emacs에게 알리는 방법도 있다. 이후 짐작한 스타일을 M-x c-guess-install 을 이용해 다른 버퍼로 적용한다. 상세한 내용은 the CC Mode Manual 의 "Guessing the Style" 절을 참고한다.


괄호를 이용한 편집 명령어

이번 절에서는 프로그램에서 괄호 구조를 이용하거나 그것을 균형 있게 유지하도록 돕는 명령어 및 기능을 설명한다.


이러한 기능에 관해 이야기할 때 "괄호(parenthesis)"라 함은 중괄호, 대괄호, 또는 쌍으로 매칭하도록 정의된 구분 문자는 무엇이든 포함된다. 주 모드는 구분 테이블을 통해 구분 문자가 유효한지를 제어한다(The Emacs Lisp Reference Manual의 "Syntax Tables"절 참고). Lisp에서는 괄호만 중요하며, C에서 이러한 명령어들은 중괄호와 대괄호에도 적용된다.


균형이 맞지 않는 괄호와 균형이 맞지 않는 버퍼 내 인용 부호를 찾을 때에는 M-x check-parens 를 이용할 수 있다.


균형이 맞는 괄호를 이용한 표현식

각 프로그래밍 모드에는 고유의 균형 표현식(balanced expression)의 정의가 있다. 균형 표현식은 주로 별개의 심볼, 숫자, 문자열 상수를 비롯해 매칭하는 구분 문자 쌍에 둘러싸인 코드 조각을 포함하고 있다. 다음 명령어들이 균형 표현식을 처리한다(Emacs에서는 그러한 표현식을 내부적으로 sexps[1]라고 부른다).


C-M-f
균형이 맞는 표현식 위로 순방향 이동한다(
forward-sexp
).


C-M-b
균형이 맞는 표현식 위로 역방향 이동한다(
backward-sexp
).


C-M-k
균형이 맞는 표현식을 순방향으로 제거한다(
kill-sexp
).


C-M-t
표현식 위치를 바꾼다(
transpose-sexps
).


C-M-@
C-M-SPC 뒤따라오는 표현식 뒤에 마크를 놓는다(
mark-sexp
).


균형이 맞는 표현식 위로 순방향 이동하기 위해서는 C-M-f (
forward-sexp
)를 사용한다. 포인트 이후 첫 유효 문자가 여는 구분 문자인 (예: C 에서 '
(
', '
[
', 또는 '
{
') 경우 이 명령어는 일치하는 닫는 구분 문자를 지나 이동한다. 문자가 심볼, 문자열 또는 숫자로 시작되면 명령어는 그 위로 지나 이동한다.


C-M-b (
backward-sexp
) 명령어는 C-M-f 와 같이 균형이 맞는 표현식 위로 이동하지만 방향이 역방향이다. 표현식 앞에 접두 문자(Lisp에서 작은 따옴표, 역따옴표, 콤마)가 위치한 경우 명령어는 그 위를 거쳐 역방향 이동하기도 한다.


인자가 있는 C-M-f 또는 C-M-b 는 해당 연산을 명시된 횟수만큼 반복하고, 음의 인자는 반대 방향으로 이동함을 의미한다. 대부분의 모드에서 이 두 명령어는 주석이 마치 공백인 것처럼 주석 위를 이동한다. 그들의 키인 C-M-fC-M-b 는 문자별로 이동하는 C-fC-b(17 페이지의 4.2절 [포인트 이동하기] 참고), 단어별로 이동하는 M-fM-b 와도 비슷하다(208 페이지의 22.1절 [단어] 참고).


전체 균형이 맞는 표현식을 제거하려면 C-M-k (
kill-sexp
)를 입력한다. 그러면 C-M-f 가 거쳐 이동하게 될 텍스트를 제거한다.


C-M-t (
transpose-sexps
)는 균형이 맞는 이전 표현식과 다음 표현식의 위치를 바꾼다. 문자의 위치를 바꾸는 C-t 명령어와 비슷하다(110 페이지의 13.2절 [텍스트 순서조정] 참고). C-M-t 로의 인자는 반복 계수 역할을 하여 이전 표현식을 명시된 개수의 표현식만큼 거쳐 이동시킨다. 음의 인자는 균형이 맞는 이전 표현식을 거쳐 역방향으로 이동한다. 0의 인자는 아무 일도 수행하지 않는 것이 아니라 포인트와 마크에서 또는 그 뒤에서 끝나는 균형이 맞는 표현식의 위치를 바꾼다.


영역에 작동하는 명령어를 이용해 균형이 맞는 표현식에 작업하려면 C-M-SPC (
mark-sexp
)를 입력한다. 그러면 C-M-f 를 이용해 이동하게 될 마크를 설정한다. 마크가 활성화되어 있으면 이후 이 명령어를 호출할 때마다 마크를 하나의 표현식만큼 시프팅함으로써 영역을 확장한다. 양 또는 음의 인자는 명시된 표현식 개수만큼 마크를 순방향 또는 역방향으로 이동한다. C-M-@C-M-SPC 와 유사하다. 이를 비롯해 관련 명령어에 관한 정보는 47 페이지의 8.2절 [객체 표시하기]를 참고한다.


C와 같이 중위식(infix) 연산자를 이용하는 언어에서는 주어진 위치에 여러 가능성이 존재할 수 있으므로 모든 균형이 맞는 표현식을 인식하기가 불가능하다. 가령 C 모드는 "
foo + bar
"가 하나의 C 표현식임에도 불구하고 단일 표현식으로 취급하지 않고, '
foo
'가 하나의 표현식이고 '
bar
'는 또 다른 표현식이며 '
+
'는 그 사이에 위치한 구두점으로 취급한다. 하지만 C 모드는 '
(foo + bar)
'를 단일 표현식으로 인식하는데, 바로 괄호 때문이다.


괄호 구조로 이동하기

다음 명령어들은 괄호(또는 사용자가 작업 중인 언어에서 구분 문자를 수행하는 것)로 구분된 그루핑 위로 이동한다. 그들은 그 안에 있는 괄호를 포함해 문자열과 주석을 무시하고, escape 문자로 "인용"된 괄호도 무시한다. 이러한 명령어들은 주로 프로그램 편집을 목적으로 하지만 괄호를 포함한 텍스트를 편집하는 데에 유용할 수 있다. 이것을 내부적으로 "list" 명령어라고 부르는데, Lisp 에서는 이러한 그루핑이 리스트이기 때문이다.


이러한 명령어들은 시작점이 문자열이나 주석 안에 위치하지 않는다고 가정한다. 사용자가 문자열이나 주석 내에서 명령어를 호출하면 그 결과는 신뢰할 수 없다.


C-M-n
괄호로 된 그룹 위로 순방향으로 이동한다(
forward-list
).


C-M-p
괄호로 된 그룹 위로 역방향으로 이동한다(
backward-list
).


C-M-u
괄호 구조에서 상향 이동한다(
backward-up-list
).


C-M-d
괄호 구조에서 하향 이동한다(
down-list
).


C-M-n (
forward-list
)와 C-M-p (
backward-list
)라는 "list" 명령어들은 하나의 (또는 n 개의) 괄호 그루핑 위로 순방향 또는 역방향 이동한다.


C-M-nC-M-p 는 괄호 구조에서 동일한 수준에 남아 있으려고 한다. 하나의 (또는 n 개의) 수준만큼 up 이동하고 싶다면 C-M-u (
backward-up-list
)를 사용한다. C-M-u 는 매칭하지 않는 하나의 여는 구분 문자를 지나 역방향으로 상향 이동한다. 양의 인자는 반복 계수 역할을 하고, 음의 인자는 움직임 방향을 역전시키므로 명령어는 하나 또는 그 이상의 수준만큼 순방향으로, 그리고 상향으로 이동한다.


괄호 구조에서 down으로 이동하기 위해서는 C-M-d (
down-list
)를 사용한다. 이는 '
(
'가 유일한 여는 구분 문자인 Lisp 모드에서 '
(
'를 검색하는 것과 거의 동일하다. 인자는 하향 이동할 수준의 개수를 명시한다.


괄호 매칭하기

Emacs 에는 괄호(또는 다른 구분 문자)가 매칭하는지 여부와 매칭 방법을 수월하게 만드는 괄호 매칭 기능이 많다.


사용자가 닫는 구분 문자인 자체 삽입 문자를 입력할 때마다 Emacs는 매칭하는 여는 구분 문자가 화면에 있을 경우 그 위치를 간략하게 보여준다. 화면에 위치하지 않으면 Emacs는 그 근처의 텍스트 일부를 에코 영역에 표시한다. 어떤 방법이든 사용자는 자신이 어떤 그루핑을 닫고 있는지 알 수 있다. 여는 구분 문자와 닫는 구분 문자가 매칭하지 않으면 (예: '
[x)
') 에코 영역에 경고 메시지가 표시된다.


매칭하는 괄호 표시를 제어하는 세 가지 변수가 있다:

  • blink-matching-paren
    은 기능을 켜거나 끈다.
    nil
    은 기능을 비활성화시키지만 기본값은 활성화시키는
    t
    이다.
    jump
    로 설정하면 커서를 매칭하는 여는 구분 문자로 잠시 이동시킴으로써 표시기(indication)가 작동한다.
  • blink-matching-delay
    는 매칭하는 여는 구분 문자를 몇 초만큼 켜놔야 하는지를 알려준다. 이는 정수 또는 부동소수점 수가 될 수 있고, 기본값은 1 이다.
  • blink-matching-paren-distance
    는 매칭하는 여는 구분 문자를 찾기 위해 역방향으로 몇 개의 문자까지 검색할 것인지 명시한다. 매칭이 그 범위에서 발견되지 않으면 Emacs 는 스캔을 중단하고 어떤 내용도 표시되지 않는다. 기본값은 102400이다.


Show Paren모드라는 전역적 부 모드는 좀 더 강력한 유형의 자동 매칭을 제공한다. 포인트가 여는 구분 문자 앞이나 닫는 구분 문자 뒤에 있을 때마다 구분 문자와 그 상반되는 구분 문자가 강조된다. Show Paren 모드를 토글하기 위해서는 M-x show-paren-mode 를 입력한다.


전역적 부 모드인 Electric Pair 모드는 매칭하는 구분 문자를 쉽게 삽입하는 방법을 제공한다. 사용자가 여는 구분 문자를 삽입할 때마다 그에 매칭되는 닫는 구분 문자가 자동으로 삽입되고 포인트는 둘 사이에 남겨둔다. 반대로 사용자가 기존 구분 문자 위에서 닫는 구분 문자를 삽입하면 어떠한 삽입도 발생하지 않고 위치는 단순히 건너뛴다. 이러한 변수들은 Electric Pair 모드의 추가 기능을 제어한다:


  • nil
    값이 아닐 경우
    electric-pair-preserve-balance
    는 기본 페어링(paring) 논리를 여는 구분 문자와 닫는 구분 문자 개수의 균형에 벗어나도록 만든다.
  • nil
    값이 아닐 경우
    electric-pair-delete-adjacent-pairs
    는 근접한 2개의 구분 문자 사이에 위치하는 백스페이스가 자동으로 닫는 구분 문자도 삭제하도록 만든다.
  • nil
    값이 아닐 경우
    electric-pair-open-newline-between-pairs
    는 근접한 2개의 구분 문자 쌍 사이에 새 행을 삽입할 경우 포인트 다음에 추가로 새 행과 여는 구분 문자도 삽입하도록 만든다.
  • nil
    값이 아닐 경우
    electric-pair-skip-whitespace
    는 닫는 구분 문자를 건너뛸 것인지 결정하기 전에 부 모드로 하여금 공백을 순방향으로 건너뛰도록 만든다.


Electric Pair 모드를 토글 기능은 M-x electric-pair-mode 를 이용한다.


주석 조작하기

주석은 프로그래밍에서 매우 중요한 부분이므로 Emacs는 주석을 편집하고 삽입하는 특수 명령어를 제공한다. Flyspell Prog 모드를 이용해 주석에 맞춤법 검사를 실행할 수도 있다(111 페이지의 13.4절 [맞춤법] 참고).


주 모드는 여러 종류의 주석을 들여쓰기 위한 특별한 규칙을 갖고 있다. 예로, Lisp 모드에서 2개의 세미콜론으로 시작되는 주석은 마치 코드의 행인 것처럼 들여 쓰는 반면 3개의 세미콜론으로 시작되는 주석은 왼쪽 여백에 정렬되도록 되어 있고 종종 섹셔닝(sectioning) 목적으로 사용된다. Emacs 는 이러한 규칙을 이해하고 있기 때문에 주석 행에서 TAB 을 입력하면 주석을 적절한 위치로 들여 써진다.

;; This function is just an example.
;;; Here either two or three semicolons are appropriate.
(defun foo (x)
;;; And now, the first part of the function: 
  ;; The following line adds one. 
  (1+ x))		; This line adds one.


주석 명령어

주석에 작업하는 명령어는 다음과 같다:


M-;
현재 행에 주석을 삽입 또는 재정렬하고, 영역이 활성화되어 있으면 영역을 대신 주석을 달거나 해제한다(
comment-dwim
).


C-u M-;
현재 행에 주석을 제거한다(
comment-kill
).


C-x ;
주석 열을 설정한다(
comment-set-column
).


C-M-j
M-j
RET 다음에 주석을 삽입하여 정렬하는 것과 같다(
comment-indent-new-line
). 251 페이지의 23.5.2절 [다중행 주석]을 참고한다.


M-x comment-region
C-c C-c
(in C-like modes)
주석 구분 문자를 영역 내 모든 행으로 추가한다.


주석을 생성하거나 정렬하는 문자열은 M-; (
comment-dwim
)이다. "dwim"이란 단어는 "Do What I Mean"이란 의미로, 이 명령어를 사용하는 상황에 따라 주석과 관련된 여러 다수의 작업에 사용 가능함을 의미한다.


영역이 활성화되어 있다면 (45 페이지의 8장 [마크] 참고) M-; 는 영역으로 주석 구분 문자를 추가하거나 제거하게 된다. 영역 내 모든 행이 이미 주석일 경우 주석 구분 문자를 제거함으로써 그러한 행 각각을 "주석 해제"한다. 그 외의 경우 영역 내 텍스트를 닫기 위해 주석 구분 문자를 추가한다.


영역이 활성화되어 있을 때 M-; 에 접두 인자를 제공하면 이는 추가하거나 삭제할 주석 구분 문자의 개수를 명시한다. 양의 인자 nn 개 구분 문자를 추가하는 반면 음의 인자 -nn 개 구분 문자를 제거한다.


영역이 활성화되어 있지 않고 현재 행에 존재하는 주석이 없을 경우 M-; 는 현재 행에 새로운 주석을 추가한다. 행이 비어 있다면 (예: 공백 문자만 포함하거나 아예 비어있는 경우) 주석은 TAB 을 사용할 때와 같은 위치로 들여 써진다(243 페이지의 23.3.1절 [기본 들여쓰기] 참고). 행이 비어 있지 않은 경우 주석은 행에서 마지막 비공백 문자 다음에 위치하고, 보통은 Emacs 가
comment-column
변수에서 명시한 열에 놓으려 시도하겠지만 (251 페이지의 23.5.3절 [주석에 대한 옵션]참고) 행이 이미 해당 열을 넘어 확장되어 있다면 적절한 위치, 보통 비주석 텍스트로부터 최소 하나의 공백만큼 떨어진 위치에 주석을 놓게 된다. 각 사례에서 Emacs는 주석의 시작 구분 문자 다음에 포인트를 위치시키므로 주석 텍스트를 즉시 입력할 수 있다.


기존 주석을 정렬하는 데에 M-; 를 이용할 수도 있다. 행에 이미 주석 시작 문자열이 포함되어 있다면 M-; 는 그것을 일반적 정렬에 따라 재정렬하고 포인트를 주석의 시작 구분 문자 이후로 이동시킨다. 한 가지 예외가 있는데, 0번 열에서 시작하는 주석은 이동되지 않는다는 사실이다. 기존 주석이 적절하게 정렬되어 있다 하더라도 M-; 은 주석 텍스트의 시작으로 직접 이동시키는 데에 유용하다.


C-u M-; (접두 인자를 이용한
comment-dwim
)은 현재 행에 존재하는 주석은 모두 제거하고 그 앞의 공백도 함께 제거한다. 주석은 킬 링에 저장되므로 사용자는 해당 행의 끝으로 이동시켜 C-y 를 실행한 후 M-; 로 주석을 재정렬하면 다른 행으로 주석의 재삽입이 완료된다. M-x comment-kill (
comment-dwim
은 사실상 접두 인자가 주어지면
comment-kill
을 하위루틴으로 호출한다)을 입력하면 C-u M-; 와 동일한 효과를 얻을 수 있다.


M-x comment-region 명령어는 활성 영역에서 M-; 를 호출하는 것과 동일한데, 마크가 비활성화되어 있다 하더라도 항상 영역에 작업한다는 점은 제외된다. C 및 그와 관련 모드에서 이 명령어는 C-c C-c 에 바인딩되어 있다. M-x uncomment-region 명령어는 영역 내 각 행을 주석해제하며, 수치적 접두 인자는 제거할 주석 구분 문자를 명시한다(음의 인자는 구분 문자에 추가할 주석의 개수를 명시한다).


유사 C 모드의 경우
c-indent-comment-alist
c-indent-comments-syntactically-p
변수를 설정하면 M-; 와 정확히 동일한 효과를 설정할 수 있다. 가령 닫는 중괄호에서 끝나는 행에 M-; 를 실행하면
comment-column
보다는 중괄호부터 하나의 공백 뒤에 주석이 놓인다. 전체적인 내용은 The CC Mode Manual 의 "Comment Commands" 절을 참고한다.


다중 주석 열

주석을 입력하고 다른 행에서 계속하길 원한다면 M-j 또는 C-M-j (
comment-indent-new-line
) 을 입력한다. 그러면 현재 행의 행 바꿈이 실행되고 필요한 주석 구분 문자와 들여쓰기가 삽입되어 주석을 계속할 수 있게 된다.


닫는 구분 문자(예: C에서 '*/')가 있는 언어에서는 M-j 의 정확한 행위가
comment-multi-line
변수의 값에 따라 좌우된다. 값이
nil
일 경우 명령어는 오래된 행에서 주석을 닫고 새 행에서 새로운 주석을 시작한다. 그 외의 값은 현재 주석 구분 문자 내에서 새 행을 연다.


Auto Fill 모드가 켜져 있으면 주석을 입력하는 동안 채우기(fill) 열을 지나칠 경우 M-j 를 명시적으로 호출하는 것과 동일한 방식으로 주석을 계속하게 된다.


기존 행을 주식 행으로 바꾸려면 영역이 활성화되어 있을 때 M-; 을 사용하거나 앞 절에서 설명한 바와 같이 M-x comment-region 을 사용한다.


사용자가 다중 행 블록 주석에서 행의 시작에 '
/
'를 입력하면 주석이 닫히는 방식으로 C 모드를 설정할 수도 있다. 이를 위해선
comment-close-slash
clean-up 을 활성화한다. 관련 내용은 The CC Mode Manual 의 "Clean-ups"절을 참고한다.


주석을 관리하는 옵션

249 페이지의 23.5.1절 [주석 명령어]에 언급되었듯 M-j 명령어가 주석을 새 행으로 추가하면
comment-column
버퍼 로컬 변수에서 명시한 열에 주석을 위치시키려고 할 것이다. 이러한 버퍼 로컬 변수의 기본값이나 로컬 값은 일반적인 방법으로 설정할 수 있다(423 페이지의 33.2.3절 [로컬] 참고). 아니면 C-x ; (
comment-set-column
)을 입력하여 현재 버퍼의
comment-column
값을 포인트가 현재 위치한 열로 설정한다. C-u C-x ; 는 주석 열을 버퍼 내 포인트 앞에 마지막 주석에 일치하도록 설정하고, M-; 를 실행하여 이전 행 아래에 위치한 현재 행의 주석을 정렬한다.


주석 명령어는
comment-start-skip
변수의 값에 해당하는 정규 표현식을 기반으로 주석을 인식한다. 이 regexp 는 null 문자열에 매칭하지 않도록 확실히 해야 한다. 이것은 가장 엄격한 단어의 의미에서 주석 시작 구분 문자 이상을 매칭할 수도 있는데, 가령 C 모드에서 변수의 값은 '
/*
' 자체 다음에 추가 별표와 공백에 매칭하고 C++ 스타일 주석도 수용하는 "
\\(//+\\|/\\*+\\)\\s *
"이다. ('
\\
'는 문자열에 '
\
'를 포함하기 위해 Lisp 구문에서 필요한데, 이는 regexp 구문에서 특별한 의미의 첫 번째 별표를 부인하는 데에 필요하다. 100 페이지의 12.7절 [Regexp 백슬래시]를 참고한다.)


주석 명령어가 새로운 주석을 만들면
comment-start
의 값을 여는 주석 구분 문자로서 삽입한다. 또한 포인트 다음에
comment-end
의 값을 닫는 주석 구분 문자로 삽입하기도 한다. 예를 들어 Lisp 모드에서
comment-start
는 '
";"
'이고,
comment-end
는 ""(빈 문자열)이다. C 모드에서
comment-start
는 "
/*
"이고
comment-end
는 "
*/
"이다.


comment-padding
변수는 주석 명령어가 주석 구분 문자와 주석 텍스트 사이에 삽입해야 하는 문자열을 명시한다. 기본값 '
""
'은 하나의 공백을 명시한다. 아니면 그 값은 공백 개수를 나타내는 숫자이거나, 공백이 전혀 없는
nil
이 된다.


comment-multi-line
변수는 M-j 와 Auto Fill 모드가 어떻게 다중 행에서 주석을 계속하는지를 제어한다. 251 페이지의 23.5.2절 [다중행 주석]을 참고한다.


comment-indent-function
변수는 새로 삽입된 주석 정렬 또는 기존 주석 정렬을 계산하기 위해 호출할 함수를 포함해야 한다. 그 값은 다양한 주 모드에 따라 다르게 설정된다. 함수는 인자가 없이 호출되지만 주석 시작에 포인트가 있기도 하고, 새 주석이 삽입될 예정이라면 행의 끝에 포인트가 위치하기도 한다. 이는 주석이 시작되어야 하는 열을 리턴해야 한다. 가령 Lisp 모드에서 들여쓰기 훅 함수는 얼마나 많은 세미콜론이 기존 주석을 시작하는지, 그리고 선행하는 행에 위치한 코드에 따라 결정을 내린다.


문서 검색

Emacs는 프로그램에서 사용하기로 계획한 함수, 변수, 명령어에 대한 문서를 검색하도록 여러 기능을 제공한다.

Info 문서 검색

Info 에 문서를 가진 언어에 적용되는 주 모드에서는 C-h S (
info-lookup-symbol
)를 이용하면 프로그램에 사용되는 심볼에 대한 Info 문서를 볼 수 있다. 미니버퍼를 이용해 심볼을 명시하는데, 기본값은 버퍼 내 포인트에 나타나는 심볼이다. 예를 들어, C 모드에서 이것은 C Library Manual 에서 심볼을 검색한다. 명령어는 적절한 매뉴얼의 Info 파일이 설치되었을 때에만 작동한다.


주 모드는 심볼을 문서 어디서 검색할 것인지 결정하고, 어떤 Info 파일을 살펴볼 것인지, 어떤 색인을 검색할 것인지 결정한다. 문서에서 파일명을 검색하려면 M-x info-lookup-file 을 사용할 수도 있다.


지원하지 않는 주 모드에서 C-h S 를 사용할 경우 "심볼 도움말 모드"를 명시하도록 요구한다.
c-mode
와 같은 명령어를 입력하면 C-h S 가 지원하는 주 모드를 선택할 것이다.


Man 페이지 검색

Unix 에서 온라인 문서의 주요 형태는 매뉴얼 페이지 또는 man 페이지로 되어 있었다. GNU 운영 체제에서는 Info를 이용해 살펴볼 수 있도록 더 잘 구성된 매뉴얼로 man 페이지를 대체하는 데에 목적을 두었다(43 페이지의 7.7절 [다양한 도움말] 참고). 이 과정은 아직 완료되지 않았으므로 아직은 매뉴얼 페이지가 유용하다.


운영 체제 명령어, 라이브러리 함수, 또는 시스템 호출에 대한 man 페이지는 M-x man 명령어를 이용해 읽을 수 있다. 이는 완성을 이용해 주제의 입력을 요하고 (28 페이지의 5.4절 [완성] 참고) man 프로그램을 실행하여 해당 man 페이지를 포맷팅한다. 시스템이 허용하는 한 man 을 비동기식으로 실행하므로 사용자는 페이지가 포맷팅되는 동안 편집을 계속할 수 있다. 결과는
*Man topic*
이라는 버퍼로 들어간다. 이러한 버퍼들은 특수 주 모드인 Man 모드를 사용하여 스크롤과 다른 매뉴얼 페이지로의 점프를 가능하게 한다. 상세한 내용은 Man 모드 버퍼에 있을 때 C-h m 을 입력하면 된다.


man 페이지마다 10개 중 하나 또는 그 이상의 섹션에 속하며, 각각은 숫자 또는 숫자와 문자가 혼합되어 명명된다. 때로는 여러 섹션에 동일한 이름의 man 페이지가 존재하기도 한다. 특정 섹션에서 man 페이지를 읽으려면 M-x manual-entry 가 주제의 입력을 요할 때 '
topic(section)
' 또는 '
section topic
'을 입력한다. 예를 들어 C 라이브러리 함수에 대한 man 페이지는 섹션 2에 있지만 이와 동일한 이름으로 된 셸 명령어의 man 페이지가 섹션 1 에 위치하므로 전자를 보기 위해서는 M-x manual-entry RET chmod(2) RET 을 입력한다.


섹션을 명시하지 않으면 M-x man 은 보통 발견되는 첫 번째 man 페이지만 표시한다. 일부 시스템에서 man 프로그램은 '
-a
' 명령어 행 옵션을 수용하는데, 이는 명시된 주제에 해당하는 man 페이지 모두를 표시하라고 알린다. 이를 활용하려면
Man-switches
변수의 값을 '
"-a"
'로 변경하라. 그리고 Man 모드 버퍼에서 M-nM-p 를 입력하여 여러 섹션에 있는 man 페이지를 전환할 수 있다. 모드 행은 얼마나 많은 매뉴얼 페이지를 이용할 수 있는지를 보여준다.


매뉴얼 페이지를 읽는 또 다른 방법은 M-x woman 명령어를 이용하는 것이다. M-x man 과 달리 M-x woman 명령어는 man 페이지를 포맷팅하고 표시하기 위해 외부 프로그램을 실행하지 않으며, Emacs가 직접 포맷팅을 실행하므로
man
프로그램을 이용할 수 없는 MS-Windows와 같은 체제에서 작동한다. 이는 man 페이지의 입력을 요하고, 그것을
*WoMan section topic
이라는 버퍼에 표시한다.


M-x woman 은 사용자가 명령어를 처음으로 호출할 때 man 페이지의 완성 목록을 계산한다. 수치적 인자를 이용하면 이 목록을 다시 계산하며, 매뉴얼 페이지를 추가하거나 삭제 시 유용하다.


매뉴얼 페이지명을 입력하고 M-x woman 이 여러 섹션에 존재하는 동일한 이름의 매뉴얼 페이지를 여러 개 발견했다면 그 중 하나를 선택하도록 요구하는 대안(candidates)을 창에 팝업시킬 것이다.


M-x woman 의 설정과 사용 방법에 관한 추가 정보는 Emacs 와 함께 배포되는 WoMan Info 매뉴얼을 참고한다.


Emacs Lisp 문서 검색

Emacs Lisp 코드를 편집할 때는 C-h f (
describe-function
)와 C-h v (
describe-variable
)를 통해 사용하고자 하는 Lisp 함수와 변수에 대해 빌트인된 문서를 볼 수 있다. 39 페이지의 7.2절 [이름 도움말]을 참고한다.


Eldoc은 Lisp 문서를 검색하도록 도와주는 버퍼 로컬 부 모드이다. 이것이 활성화되면 에코 영역은 포인트에 Lisp함수 또는 변수가 있을 때마다 유용한 정보를 표시하는데, 함수의 경우 인지 목록을, 변수의 경우 변수의 문서 문자열의 첫 번째 행을 표시한다. Eldoc 모드를 토글하려면 M-x eldoc-mode 를 입력한다. Eldoc 모드는 Emacs Lisp 및 Lisp Interaction 주 모드와 함께 이용 가능하다.


Hideshow 부 모드

Hideshow 모드는 프로그램의 부분들, 즉 블록(blocks)이라고 알려진 부분을 선택적으로 표시하도록 해주는 버퍼 로컬 부 모드이다. 해당 부 모드를 토글하려면 M-x hs-minor-mode 를 입력한다(200 페이지의 20.2절 [부 모드] 참고).


Hideshow 모드를 이용해 블록을 숨기면 화면에서 블록이 사라져 생략 부호로 대체된다(세 개의 점). 무엇이 블록을 구성하는지는 주 모드에 따라 좌우된다. C 모드 및 관련 모드에서 블록은 중괄호로 구분되고, Lisp 모드에서는 소괄호로 구분된다. 다중 행 주석 역시 블록으로 간주된다.


Hideshow 모드는 다음의 명령어를 제공한다:


C-c @ C-h
현재 블록을 숨긴다(
hs-hide-block
).


C-c @ C-s
현재 블록을 표시한다(
hs-show-block
).


C-c @ C-c
현재 블록을 숨기거나 표시한다(
hs-toggle-hiding
).


S-Mouse-2
사용자가 클릭하는 블록에 숨김 기능을 토글한다(
hs-mouse-toggle-hiding
).


C-c @ C-M-h
모든 최상위 수준의 블록을 숨긴다(
hs-hide-all
).


C-c @ C-M-s
버퍼 내 모든 블록을 표시한다(
hs-show-all
).


C-c @ C-l
이 블록 아래의 n개 수준에 모든 블록을 숨긴다(
hs-hide-level
).


아래 변수들을 이용해 Hideshow 모드를 맞춤화할 수 있다:


hs-hide-comments-when-hiding-all
nil
값이 아닐 경우 C-c @ C-M-h (
hs-hide-all
) 를 이용하면 주석도 숨긴다.


hs-isearch-open
이 변수는 블록 내에서 매칭되는 텍스트가 발생할 때 숨겨진 블록을 증분 검색이 숨김 취소할 조건을 명시한다. 그 값은
code
(코드 볼록만 숨김 해제),
comment
(주석만 숨김 해제),
t
(코드 블록과 주석 모두 숨김 해제),
nil
(코드 블록과 주석 모두 숨김 해제하지 않음) 중 하나가 가능하다. 기본값은
code
이다.


심볼 이름 완성

완성은 보통 미니버퍼에서 이루어지지만 (28 페이지의 5.4절 [완성] 참고) 일반 Emacs 버퍼에서도 심볼을 완성할 수 있다.


프로그래밍 언어 모드에서 C-M-i 또는 M-TAB 을 입력하면 포인트 앞에 부분적 심볼을 완성할 수 있다. 그래픽 디스플레이에서 M-TAB 키는 주로 창 관리자가 그래픽 창을 전환하는 데에 사용하도록 예약되어 있으므로 사용자는 대신 C-M-I 또는 ESC TAB 을 입력해야 한다.


대부분 프로그래밍 언어 모드에서 C-M-i (또는 M-TAB)는 유연한 방식으로 완성 목록을 생성하는
completion-at-point
명령어를 호출한다. Semantic 모드가 활성화되면 이는 완성에 Semantic 파서 데이터를 사용하려고 시도한다(255 페이지의 23.10절 [구문] 참고). Semantic 모드가 활성화되지 않거나 완성 실행에 실패하면 선택된 태그 테이블을 이용해 완성하고자 한다(299 페이지의 25.3절 [태그] 참고). Emacs Lisp 모드에 있다면 현재 Emacs 세션에 정의된 함수, 변수, 또는 속성명을 이용해 완성을 실행한다.


모든 면에서 버퍼 내(in-buffer) 심볼 완성은 미니버퍼 완성과 비슷하게 행동한다. 가령 Emacs 가 유일한 심볼로 완성할 수 없다면 다른 창에 완성 대안 목록을 표시한다. 관련 내용은 28 페이지의 5.4절 [완성]을 참고한다.


Text 모드 및 관련 모드에서 M-TAB 은 맞춤법 검사자(spell-checker)의 사전을 기반으로 단어를 완성한다. 111 페이지의 13.4절 [맞춤법]을 참고한다.


대, 소문자 조합 단어

일부 프로그래밍 스타일은 '
unReadableSymbol
' 처럼 대, 소문자가 조합된 (또는 "CamelCase") 심볼을 사용한다. (GNU 프로젝트에서는 대, 소문자를 구별하기보다는 식별자 내에 단어 구별에 밑줄을 이용할 것을 권한다.) Emacs는 그러한 심볼을 더 쉽게 처리하도록 다양한 기능을 제공한다.


Glasses 모드는 심볼이 표시되는 방법을 수정함으로써 그러한 심볼을 더 쉽게 읽도록 해주는 버퍼 로컬 부 모드이다. 기본적으로는 소문자로 된 글자와 그 뒤에 따라오는 대문자 사이에 추가로 밑줄을 표시한다. 그렇다고 해서 버퍼 텍스트를 수정하는 것은 아니며, 그저 표시되는 방식을 수정할 뿐이다.


Glasses 모드를 토글하려면 M-x glasses-mode (200 페이지의 20.2절 [부 모드] 참고)를 입력한다. Glasses 모드가 활성화되면 부 모드 표시기 'o^o'가 모드 행에 나타난다. Glasses 모드에 관한 추가 정보는 C-h P glasses RET 을 입력한다.


Subword 모드는 또 다른 버퍼 로컬 부 모드이다. Subword 모드에서 Emacs 의 단어 명령어는 '
StudlyCapsIdentifier
' 에서 대문자로 된 글자를 단어 경계로 인식한다. Subword 모드가 활성화되면 부 모드 표시기 '
,
'가 모드 행에 나타난다. 이와 유사한
superword-mode
도 참고한다(256 페이지의 23.11절 [프로그램 편집에 유용한 기타 기능] 참고).


구문

구문은
source code parsers
를 기반으로 언어 인식 편집 명령어를 제공하는 패키지다. 이번 절에서는 Semantic 에 대한 간략한 설명을 제공하며, 전체 내용은 Emacs 와 함께 배포되는 Semantic Info 매뉴얼을 참고한다.


Emacs에서 Font Lock 모드와 같은 "언어 인식" 기능 대부분은 (78 페이지의 11.12절 [폰트 잠금] 참고) 보통 훌륭한 결과를 제공하지만 절대적으로 정확할 수는 없는 "경험 법칙[1]" 에 의존한다. 반면 Semantic이 사용하는 파서들은 프로그래밍 언어 구문을 정확하게 이해한다. 이는 Semantic이 강력하고 정확한 검색, 탐색, 완성 명령어를 제공하도록 해준다.


Semantic 의 사용을 시작하려면 M-x semantic-mode 를 입력하거나 '
Tools
' 메뉴에서 '
Source Code Parsers (Semantic)
'로 명명된 메뉴 항목을 클릭한다. 이는 전역적 부 모드인 Semantic 모드를 활성화한다.


Semantic 모드가 활성화되면 Emacs는 사용자가 방문하는 파일마다 자동으로 파싱을 시도한다. 현재 Semantic 은 C, C++, Scheme, Javascript, Java, HTML, Make 를 이해한다. 각 파싱된 버퍼 내에서는 다음과 같은 명령어를 이용할 수 있다:


C-c , j
현재 파일에 정의된 함수명의 입력을 요하고, 포인트를 그곳으로 이동시킨다(
semantic-complete-jump-local
).


C-c , J
Emacs가 파싱한 어떤 파일에서든 정의된 함수명의 입력을 요하고, 포인트를 그곳으로 이동시킨다(
semantic-complete-jump
).


C-c , SPC
포인트에 위치한 심볼에 가능한 완성 목록을 표시한다(
semantic-complete-analyze-inline
). 이는 완성을 선택하기 위한 특수 키 바인딩 집합을 활성화하는데, RET 을 입력하면 현재 완성을 수락하고, M-nM-p 는 가능한 완성 대안을 순환하며, TAB 은 가능한 한 멀리 완성하여 순환하고, C-g 또는 그 외 다른 키는 완성을 취소한다.


C-c , l
포인트에 위치한 가능한 심볼 완성의 목록을 다른 창에 표시한다(
semantic-analyze-possible-completions
).


위의 명령어에 더해 Semantic 패키지는 파서 정보를 활용하는 다양한 방법을 제공한다. 가령 이것을 이용해 Emacs 가 idle 상태가 되면 완성 목록을 표시하도록 할 수 있다.


프로그램 편집에 유용한 기타 기능

프로그램 편집에 특별히 설계되지 않았다 하더라도 일부 Emacs 명령어들은 프로그램 편집에 유용하다.


단어, 문장, 문단에 작업하는 Emacs 명령어는 코드 편집에 유용하다. 대부분 심볼 이름은 단어를 포함하는 반면 (208 페이지의 22.1절 [단어] 참고) 문장은 문자열과 주석에서 찾을 수 있다(209 페이지의 22.2절 [문장] 참고). 문단의 경우 대부분 프로그래밍 언어 모드에서는 빈 행에서 시작하여 끝나도록 정의된다(210 페이지의 22.3절 [문단] 참고). 따라서 빈 행을 신중하게 사용하여 프로그램을 더 분명하게 만든다면 문단 명령어가 작업하기에 유용한 텍스트 청크를 제공할 것이다. 프로그래밍 언어 주 모드에서 Auto Fill 모드가 활성화되면 그것이 생성하는 새 행을 들여 쓴다.


Superword 모드는 편집 및 움직임 명령어가 심볼을 (예: '
this_is_a_symbol
') 단어로 취급하게 해주는 버퍼 로컬 부 모드이다. Superword 가 활성화되면 부 모드 표시문자(indication) '2' 가 모드 행에 표시된다. 이와 유사한
subword-mode
도 참고한다(255 페이지의 23.9절 [단어 대, 소문자 조합] 참고).


Electric Layout 모드 (M-x electric-layout-mode)는 사용자가 Javascript 모드에서 '{', '}', '

'와 같이 특정 모드를 입력하면 새 행을 자동으로 삽입하는 전역적 부 모드이다.


Hideshow 모드 외에 (253 페이지의 23.7절 [Hideshow] 참고) 프로그램의 부분을 선택적으로 표시하는 또 다른 방법으로 선택적 표시 기능을 사용하는 방법이 있다(83 페이지의 11.17절 [선택적 표시] 참고). 프로그래밍 모드는 Foldout 패키지와 함께 사용할 수 있는 (221 페이지의 22.8.5절 [Foldout] 참고) Outline 부 모드도 지원하곤 한다.


Prettify Symbols 모드는 특정 문자열을 좀 더 "매력적인" 버전으로 대체하여 보기 좋게 만드는 버퍼 로컬 부 모드이다. 예를 들어 Emacs Lisp 모드에서 이는 "lambda" 문자열을 그리스어 람다 문자로 대체한다. 이것을 비프로그래밍 모드에서도 사용하길 원할 경우도 있다. 그 때는
prettify-symbols-alist
로 더 많은 엔트리를 추가함으로써 모드를 맞춤화할 수 있다. 모드를 지원하는 모든 버퍼에서 모드를 활성화하는
global-prettify-symbols-mode
라는 전역적 버전도 있다.


C 모드 및 관련 모드

이번 절에서는 C, C++, Objective-C, Java, CORBAIDL, Pike AWK 모드에서 이용 가능한 특별한 기능을 간략하게 설명하고자 한다. (이를 모두 "C 모드 및 관련 모드"라고 부른다.) 더 상세한 설명은 Emacs와 함께 배포되는 CC 모드 정보 매뉴얼을 참고한다.

C 모드 움직임 명령어

이번 절에서는 C 모드 및 관련 모드에서 포인트를 이동하는 데에 사용되는 명령어를 설명한다.


C-M-a
C-M-e
현재 함수 또는 최상위 수준의 정의 시작이나 끝으로 포인트를 이동한다. 닫는 범위(enclosing scope)가 있는 언어에서 (예: C++의 클래스) 현재 함수는 직접적 함수로, 범위 내부에 위치할 가능성이 크다. 아니면 최소로 닫는 중괄호에 의해 정의된다. (반면
beginning-of-defun
end-of-defun
은 0번 열에서 중괄호를 검색한다.) 241 페이지의 23.2.2절 [Defuns에 의한 이동]을 참고한다.


C-c C-u
둘러싼 전처리기 조건부로 포인트를 다시 이동시키고 마크를 뒤에 남겨둔다. 접두 인자는 반복 계수의 역할을 한다. 음의 인자를 이용해 둘러싼 전처리기 조건부의 끝으로 포인트를 전방향 이동한다.
'
#elif
' 는 '
#else
' 다음에 '
#if
'가 따라오는 것과 동일하므로 함수는 역방향으로 갈 때는 '
#elif
'에서 중지하지만 순방향으로 갈 때는 중지하지 않는다.


C-c C-p
포인트를 전처리기 조건부 위로 역방향 이동하고 마크는 뒤에 남겨둔다. 접두 인자는 반복 계수 역할을 한다. 음의 인자를 이용해 전방향으로 이동한다.


C-c C-n
포인트를 전처리기 조건부 위로 순방향 이동하고 마크는 뒤에 남겨둔다. 접두 인자는 반복 계수 역할을 한다. 음의 인자를 이용해 역방향으로 이동한다.


M-a
포인트를 가장 안쪽의 C 문 시작으로 이동한다(
c-beginning-of-statement
). 포인트가 이미 문장 시작에 위치하면 선행하는 문장의 시작으로 이동한다. 접두 인자 n 을 이용해 n - 1 statement 로 역방향 이동한다.
하나 이상의 행에 걸친 문자열이나 주석에서는 이 명령어가 statement 대신 문장(sentence)을 이동한다.


M-e
M-a 와 같이 가장 안쪽의 C문 또는 문장의 끝으로 포인트를 이동하는데, M-a 와는 다른 방향으로 이동한다(
c-end-of-statement
).


전자 C 문자

C 모드 및 관련 모드에서는 특정 출력 문자가 전자로 되어 있어 문자의 삽입 외에도 현재 행을 다시 들여 쓰고 선택적으로는 새 행을 삽입하기도 한다. "전자" 문자로는
{
,
{
,
:
,
#
,
;
,
,
,
<
,
>
,
/
,
*
,
(
,
)
가 있다.


엉망으로 들여 쓴 코드를 편집할 때는 전자 문자가 불편하게 생각될 것이다. CC 모드에 익숙하지 않다면 당황스러울지도 모른다. C-c C-1 명령어를 이용해 전자 액션을 토글 가능하며, 활성화되면 모드 행에서 모드명 뒤에 '
/1
' 이 붙는다:


C-c C-l
전자 액션을 토글한다(
c-toggle-electric-state
). 양의 인자를 이용하면 이 명령어는 전자 액션을 활성화하고 음의 인자를 이용하면 비활성화한다.


전자 문자는 전자 상태에 더해 auto-newline 기능이 활성화되었을 때(모드 행에서 모드명 뒤에 '
/la
'로 표시)에만 새 행을 삽입한다. 이 기능은 C-c C-a 명령어를 이용해 끄고 켠다:


C-c C-a
자동 새 행 기능을 토글한다(
c-toggle-auto-newline
). 양의 접두 인자를 이용하면 자동 새 행 기능을 켜고, 음수일 때는 기능을 끈다.


일반적으로 CC Mode 스타일은 Emacs가 새 행을 삽입하는 정확한 상황을 설정한다. 이를 직접적으로 설정할 수도 있다. The CC Mode Manual 의 "Custom Auto-newlines" 절을 참고한다.


C에서 배고픈(hungry) 삭제 기능

포인트에서 전체 여백 블록을 삭제하고 싶다면 배고픈 삭제(hungry deletion)를 사용한다. 이는 하나의 연산에서 포인트 이전 또는 이후의 연속된 공백을 모두 삭제한다. 공백(whitespace)은 탭과 새 행을 포함하지만 주석이나 전처리기 명령어는 포함하지 않는다.


C-c C-DEL
C-c DEL
포인트 앞의 공백 블록 전체를 삭제한다(
c-hungry-delete-backwards
).


C-c C-d
C-c C-Delete
C-c Delete
포인트 다음의 공백 블록 전체를 삭제한다(
c-hungry-delete-forward
).


위의 명령어 대신 배고픈 삭제 모드를 활성화할 수도 있다. 이 기능이 활성화되면 (모드 행에서 모드명 다음에 '
/h
' 로 표시) 한 번의 DEL 만으로 하나의 공백이 아니라 선행하는 공백을 모두 삭제하고, 한 번의 C-d 만으로 (하지만 일반 Delete 는 '해당하지 않음) 이후에 따라오는 공백을 모두 삭제한다.


M-x c-toggle-hungry-state
배고픈 삭제 기능을 토글한다(
c-toggle-hungry-state
). 접두 인자를 이용해 인자가 양수일 경우 배고픈 삭제 기능을 켜고, 음수일 경우 끈다.


C 모드에 사용할 다른 명령어

M-x c-context-line-break
이 명령어는 컨텍스트에 적절한 방식으로 행 바꿈을 삽입하고 새 행을 들여 쓴다. 일반 코드에서는 RET (
newline
)의 작업을 실행하고 C 전처리기 행에서는 M-j (
c-indent-new-comment-line
)과 같이 행 바꿈에 '
\
'를 추가로 삽입한 후 주석에 삽입한다.
c-context-line-break
는 기본적으로 어떠한 키에도 바인딩되지 않지만 바인딩이 유용하긴 하다. 다음 코드는 이것을 RET 로 바인딩할 것이다.
c-initialization-hook
을 이용하여 사용자가 변경을 시도하기 전에 키맵이 로딩되도록 확보한다.
(defun my-bind-clb ()
  (define-key c-mode-base-map "\C-m" 
              'c-context-line-break)) 
(add-hook 'c-initialization-hook 'my-bind-clb)


C-M-h
함수 정의 끝에 마크를 놓고 포인트는 시작에 놓는다(
c-mark-function
).


M-q
문단을 채우고 C 와 C++ 주석을 처리한다(
c-fill-paragraph
). 현재 행에서 주석이나 주석 안에 있는 부분이 있다면 이 명령어는 그 포인트가 위치한 문단이나 주석을 채우고, 주석 들여쓰기와 주석 구분 문자는 그대로 유지한다.


C-c C-e
영역 내 텍스트에 C 전처리기를 실행하고, 모든 매크로 호출의 확장을 포함해 (
c-macro-expand
) 결과를 표시한다. 영역 앞의 버퍼 텍스트 역시 그곳에서 정의되는 매크로를 위해 전처리에 포함되지만 이 부분의 출력은 표시되지 않는다.
매크로를 사용하는 C 코드를 디버깅하고 있을 경우 때로는 매크로가 어떻게 확장되는지 정확히 알아내기가 힘들다. 이 명령어를 이용할 때는 그것을 알아낼 필요가 없으며, 확장을 확인할 수 있다.


C-c C-\
영역 행 끝에 '
\
' 문자를 삽입 또는 일렬로 정렬한다(
c-backslash-region
). C 매크로 정의를 쓰거나 편집한 후에 유용하다.
행이 이미 '
\
'로 끝난다면 이 명령어는 그 앞에 공백의 양을 조정한다. 그 외의 경우 새로운 '
\
'를 삽입한다. 하지만 영역 내 마지막 행은 특별하게 취급되어 그 행에는 어떠한 '
\
'도 삽입되지 않고 '
\
' 는 모두 삭제된다.


M-x cpp-highlight-buffer
전처리기 조건부에 따라 텍스트 부분이 강조된다. 이 명령어는 특정 종류의 조건부와 그 내용을 표시하는 방법을 선택하는 데에 있어 그래픽 메뉴의 역할을 하는
*CPP Edit*
란 이름의 다른 버퍼를 표시한다. 다양한 설정을 변경하고 난 후 '
[A]pply these settings
' 을 클릭하면 (또는 해당 버퍼로 가서
a
를 입력하면) 그에 따라 C 모드 버퍼를 강조한다.


C-c C-s
현재 소스 행에 관한 구문적 정보를 표시한다(
c-show-syntactic-information
). 이 정보는 행을 어떻게 들여 쓸 것인지 지시한다.


M-x cwarn-mode
M-x global-cwarn-mode
CWarn 부 모드는 의심이 가는 특정 C 및 C++ construction을 강조한다:
  • 표현식 내 할당문(assignment)
  • '
    if
    ', '
    for
    ', '
    while
    ' 바로 뒤에 따라오는 세미콜론 ('
    do ... while
    '문 직후의 세미콜론은 제외)
  • 참조 매개변수가 있는 C++ 함수
M-x cwarn-mode 명령어를 이용해 하나의 버퍼에 모드를 활성화하거나, M-x global-cwarn-mode 명령어의 이용 또는
global-cwarn-mode
변수의 맞춤화를 통해 적절한 모든 버퍼에서 모드를 활성화한다. 효력을 발휘하려면 위해서는 Font Lock 모드 역시 활성화해야 한다.


M-x hide-ifdef-mode
Hide-ifdef 부 모드는 '
#if
' 와 '
#ifdef
' 전처리기 블록 내에서 선택된 코드를 숨긴다.
hide-ifdef-shadow
변수를 t로 변경하면 Hide-ifdef 부 모드는 전처리기 블록을 전체적으로 완전히 숨기는 대신 좀 덜 두드러진 face 를 이용해 표시함으로써 "shadow(음영 효과)"를 준다. 상세한 정보는
hide-ifdef-mode
의 문서 문자열을 참고한다.


M-x ff-find-related-file
현재 버퍼가 방문한 파일에 특별하게 "관련된" 파일을 검색한다. 보통은 C/C++ 소스 파일에 일치하는 헤더 파일이거나 헤더 파일에 일치하는 C/C++ 소스 파일이 될 것이다.
ff-related-file-alist
변수는 관련 파일명을 계산하는 방법을 명시한다.


Asm 모드

Asm 모드는 어셈블러 코드의 파일을 편집하기 위한 주 모드이다. 이는 다음과 같은 명령어를 정의한다:

TAB
tab-to-tab-stop
.


C-j
새 행을 삽입하고
tab-to-tab-stop
을 이용해 들여 쓴다.


:
콜론을 삽입하고 콜론을 선행하는 라벨 앞에서 들여쓰기를 제거한다. 그리고 나서
tab-to-tab-stop
을 실행한다.


;
주석을 삽입 또는 정렬한다.


asm-comment-char
변수는 어셈블러 구문에서 주석을 시작하는 문자를 명시한다.


Notes

  1. 1.0 1.1 "sexp" 라는 단어는 Lisp 에서 표현식을 의미한다. Cite error: Invalid <ref> tag; name ".EC.A3.BC.EC.84.9D23-1" defined multiple times with different content