Emacs 기본 기능에는 별도 패키지 없이 쓸 수 있지만 잘 드러나지 않는 도구가 많으며, 현대 Emacs 28.1+에서도 5분 안에 배울 만한 실용 기능이 계속 발견됨
파일 열기·URL 수집·비교·변경 추적 같은 일상 작업은 find-file, dired, ffap-menu, compare-windows, highlight-changes-mode만으로도 상당 부분 처리 가능함
백업 파일과 버전 관리 파일은 vc-diff 계열 명령을 확장하면 이전 버전과 비교라는 하나의 작업 모델로 묶을 수 있음
편집·탐색·표시 작업은 apropos 계열, find-function-on-key, kmacro-edit-lossage, subword-mode, 이미지 조작 키맵처럼 이미 포함된 기능으로 빠르게 개선됨
핵심 takeaway는 Emacs의 lisp 디렉터리가 크지 않아도 기본 내장 기능만으로 작업 흐름을 넓힐 여지가 계속 남아 있다는 점임
개요와 범위
Emacs 기능은 발견 가능성 문제가 있으며, 이 글은 잘 알려지지 않았지만 유용한 내장 기능을 하나씩 보여주는 방식으로 그 문제를 줄이려는 시도임
이번 글은 Emacs에 기본 포함된 유용하지만 덜 알려진 기능을 다루는 세 번째 글임
“덜 알려짐”은 주관적 판단이며, 지난 20년간 온라인 Emacs 담론을 드나들며 해당 기능이 다섯 번 미만으로 언급됐거나 전혀 보지 못한 경우를 대략 뜻함
새 Emacs 사용자는 여기서 시작하지 않는 편이 좋으며, 기본 개념과 널리 추천되는 패키지에 익숙해진 뒤 이 목록이 더 유용해짐
기준은 패키지 없이 순정 Emacs만 사용하고, 가파른 학습 곡선이 없으며, 장난성 기능과 흔히 언급되는 기능을 제외하고, 현대 Emacs 28.1+를 전제로 함
마우스오버 사전: M-x dictionary-tooltip-mode
dictionary-tooltip-mode를 켜면 단어 위에 마우스를 올렸을 때 툴팁으로 뜻을 볼 수 있음
tooltip-mode도 켜져 있어야 하지만 기본값으로 활성화되어 있음
로컬 사전이 설정되어 있으면 먼저 사용하며, Emacs 사전은 보통 Wiktionary를 통해 현대 용어와 은어도 찾을 수 있음
find-file과 dired의 와일드카드
find-file과 dired를 대화형으로 사용할 때도 와일드카드를 쓸 수 있음
find-file에서 *foo*.txt 같은 패턴을 사용하면 여러 파일을 한 번에 열 수 있음
Dired에서 디렉터리를 열 때 파일명 와일드카드를 지정하면 특정 파일만 모은 맞춤 목록을 만들 수 있음
예시 흐름은 */*_region_* 패턴으로 하위 디렉터리의 AucTeX 임시 파일을 찾고, Dired에서 선택한 뒤 삭제하고, 다시 와일드카드로 하위 디렉터리의 TeX 파일 여러 개를 여는 방식임
이 기능은 함수 시그니처상 프로그래밍 호출에서는 드러나지만, 대화형 사용에서도 가능하다는 점은 전체 docstring을 읽어야 알기 쉬움
Dired 와일드카드 기능은 consult-find와 embark-export로 만든 현대적 Dired 흐름에 밀릴 수 있지만, 기본 상태에서 바로 작동함
버퍼 안의 URI 목록: M-x ffap-menu
ffap는 커서 위치가 유효한 파일 경로나 URL인지 확인해 열 수 있게 하는 find-file-at-point 기능임
ffap-menu는 버퍼 전체를 훑어 파일 경로나 URL처럼 보이는 항목을 찾아 목록으로 제공함
completing-read 인터페이스를 쓰기 때문에 필터링한 후보 목록을 버퍼로 내보내거나, 일부 또는 전체를 복사·열기·Embark로 처리할 수 있음
속성이 붙은 링크 목록화
EWW 같은 Emacs 애플리케이션은 URL을 일반 텍스트 링크가 아니라 텍스트 속성으로 넣는 경우가 있으며, ffap-menu는 이를 놓침
이를 보완하려면 ffap-menu에서 착안한 사용자 정의 명령으로 shr-url 텍스트 속성까지 수집할 수 있음
예시 명령 my/search-occur-browse-url은 일반 URL 정규식과 shr-url 속성을 모두 찾아 완성 후보로 만들고, 선택한 URL을 browse-url 또는 browse-url-generic으로 열도록 구성됨
창 비교: M-x compare-windows
Emacs에는 diff, diff-buffers, diff-backup, dired-diff, vc-diff, 여러 ediff-* 명령처럼 비교 명령이 많음
compare-windows는 두 창의 커서 위치부터 텍스트를 비교하고, 다음 불일치 지점에서 멈춘 뒤 이를 보고함
비교 대상은 활성 창과 other-window가 선택할 창이며, Ediff나 diff보다 기능은 적지만 실행이 더 쉽고 빠름
버퍼 종류, 수정 상태, 파일, 버전 관리 상태와 무관하게 두 창에 보이는 실제 텍스트만 비교함
같은 버퍼의 다른 부분을 두 창에 표시하면 같은 버퍼 안의 두 텍스트 조각도 비교할 수 있음
디렉터리 목록도 비교할 수 있으며, 예시에서는 파일 수정 시간이 첫 불일치로 잡힘
접두 인수를 주면 공백 차이를 무시할 수 있음
Dired로 디렉터리 비교: M-x dired-compare-directories
dired-compare-directories는 Dired에서 비교할 디렉터리를 묻고, 두 Dired 목록에서 이름이 다른 파일을 표시함
이 방식은 가장 흔한 디렉터리 비교 사용 사례를 처리할 수 있음
파일 수준 비교이므로 수정 시간이나 크기 같은 파일 속성을 포함한 사용자 지정 매칭 조건을 줄 수 있음
(> mtime2 mtime1) 조건은 더 최근에 수정된 파일을 표시할 수 있음
(/= size1 size2) 조건은 이름은 같지만 크기가 다른 파일을 표시할 수 있음
더 상호작용적인 비교가 필요하면 ediff-directories도 사용할 수 있음
버퍼 변경 강조: M-x highlight-changes-mode
highlight-changes-mode는 파일 변경 지점을 강조하는 기능이며, diff-buffer-with-file 같은 diff 명령의 “라이브” 대안으로 쓸 수 있음
기본 동작은 모드가 켜진 시점부터 꺼질 때까지의 변경을 강조하며, 저장되지 않은 변경만 자동으로 강조하는 방식은 아님
before-save-hook과 after-save-hook을 사용하면 저장 전에는 강조를 끄고 저장 후 다시 켜는 방식으로, 저장 전 변경만 강조하는 흐름을 만들 수 있음
예시 코드는 text-mode-hook에서 파일 버퍼에 highlight-changes-mode를 켜고, 저장 전후 훅으로 강조 상태를 조정함
독립적인 highlight-unsaved-mode 형태로 만들면 저장할 때까지 모든 변경을 강조하는 마이너 모드가 됨
highlight-changes-next-change와 highlight-changes-previous-change로 다음·이전 변경 지점으로 이동할 수 있음
highlight-changes-remove-highlight로 시각적 강조는 제거하고 변경 추적 기반 이동만 사용할 수 있음
백업 파일을 실제로 유용하게 쓰기: vc-diff 계열
Emacs 백업의 문제
Emacs는 기본적으로 편집하고 저장하는 파일의 백업을 주기적으로 만듦
이 백업 시스템은 보통 make-backup-files로 꺼야 할 귀찮은 기능으로 언급됨
민감한 파일이 디스크 다른 곳에 복사되는 보안 우려가 있을 수 있음
그 외의 경우 문제는 주로 작업 디렉터리에 백업이 흩어지고, 백업 파일을 살펴보거나 다루기 쉬운 UI가 부족하다는 점임
backup-directory-alist, kept-old-versions, kept-new-versions 같은 사용자 옵션으로 백업 위치와 보관 수를 조정할 수 있음
외부 패키지 backup-walker는 백업을 시간 여행처럼 탐색하는 인터페이스를 제공함
VC 인터페이스 확장
Emacs 내장 VC 패키지는 버전 관리 파일의 과거 버전을 보기 위한 인터페이스를 제공함
vc-diff는 파일을 직전 버전 또는 지정 버전과 diff함
vc-ediff는 파일의 직전 버전 또는 지정 버전과 Ediff를 실행함
vc-revision-other-window는 직전 또는 지정한 과거 버전을 현재 파일 옆에 표시함
이 인터페이스는 Git에 한정되지 않지만, 버전 관리되지 않는 파일에서는 동작하지 않음
세 VC 명령을 오버로드하면 저장되지 않은 버퍼, 버전 관리 파일, 버전 관리되지 않는 파일 백업을 모두 “이전 버전과 비교”라는 모델로 묶을 수 있음
저장되지 않은 파일에서는 vc-diff와 vc-ediff가 버퍼와 파일을 비교함
버전 관리 파일에서는 원래 vc-diff, vc-ediff, vc-revision-other-window가 그대로 실행됨
버전 관리되지 않는 파일에서는 최신 번호 백업이나 접두 인수로 고른 번호 백업과 비교하거나 표시함
apropos 계열
describe-key인 C-h k는 키 입력이 호출하는 함수를 직접 확인할 수 있어 매우 유용한 도움말 키임
두 번째로 배울 도움말 기능으로는 apropos가 강력하며, 무엇을 찾아야 할지 모를 때 Emacs 기능 배치를 파악하는 입구가 됨
apropos는 하나의 명령만이 아니라 apropos-library, apropos-function, apropos-command, apropos-variable, apropos-user-option, apropos-documentation, info-apropos 등 여러 전문 검색 명령의 가족임
예시 설정은 이 명령들을 C-h a 아래 키맵에 묶어 apropos를 대체함
which-key 같은 프롬프터가 없더라도 접두키 C-h a 뒤에 C-h를 누르면 사용 가능한 명령 목록을 볼 수 있음
customize-apropos는 검색어와 일치하는 옵션, 페이스, 그룹을 모아 맞춤형 customize 버퍼를 만들어 줌