ShannonMax: 정보 이론으로 Emacs 키바인딩을 최적화하는 라이브러리
Source: Hacker News
ShannonMax는 정보 이론을 사용하여 Emacs 사용을 분석하고 더 나은 키 바인딩을 제안합니다.
키 바인딩을 변경하면 입력량을 크게 줄일 수 있는 명령을 찾는 데 도움을 줍니다.

Warning: 키 로거를 사용할 때는 민감한 정보를 기록하지 않도록 주의하세요!
Cite this software
Straus, S. (2024). Better Keybindings with Information Theory [Computer software]. Retrieved from https://github.com/sstraust/shannonmax
Original talk – Better Keybindings with Information Theory – YouTube
사용 방법
-
필요한 파일을 다운로드하십시오
shannon-max.eltarget/emacskeys-0.1.0‑SNAPSHOT‑standalone.jar
-
Emacs load‑path에 포함된 동일한 디렉터리에 파일을 배치하십시오, 예:
~/.emacs.d/custom/shannon-max.el ~/.emacs.d/custom/target/emacskeys-0.1.0-SNAPSHOT-standalone.jar -
다음 내용을
~/.emacs(또는init.el)에 추가하십시오:;; Add the directory to Emacs' load‑path (add-to-list 'load-path "~/.emacs.d/custom") ;; Load the shannon‑max package (require 'shannon-max) ;; Tell the package where the JAR file lives (setq shannon-max-jar-file (expand-file-name "~/.emacs.d/custom/target/emacskeys-0.1.0-SNAPSHOT-standalone.jar")) -
Java(JVM)가 머신에 설치되어 있는지 확인하고 JAR 파일이 실행 가능하도록 설정하십시오:
chmod +x ~/.emacs.d/custom/target/emacskeys-0.1.0-SNAPSHOT-standalone.jar -
키 로깅 데이터를 수집하기 시작하십시오
Emacs 설정에 다음 줄을 추가하거나 수동으로 평가하십시오:
(shannon-max-start-logger)몇 분 후에
~/emacs-logged-keys에 데이터가 기록되는지 확인하십시오. -
수집된 데이터를 분석하십시오
충분한 샘플이 모이면 다음을 실행하십시오:
M-x shannon-max-analyze이 명령은 Emacs 키 사용에 대한 Shannon 엔트로피 분석 결과를 표시합니다.
출력 보기
분석은 언제든지 다음 명령으로 호출할 수 있습니다:
M-x shannon-max-analyze
결과 버퍼에서는 다음 키 바인딩을 사용할 수 있습니다:
| Key | Action |
|---|---|
C-c C-n | 결과 페이지를 아래로 스크롤합니다 |
C-c C-p | 결과 페이지를 위로 스크롤합니다 |
C-c C-e | keymap-global-set를 호출해 전역 키를 바인딩합니다 (Emacs 29+ 전용) |
결과 해석
Shannonmax는 키 바인딩의 실제 길이(예: "x e"는 길이 2)와 이론적 길이를 비교합니다 – 사용 빈도에 따라 이어야 할 길이입니다.
이론적 길이는 기록된 명령 사용량에 대한 정보 이론적 분석을 통해 도출됩니다.
- 자주 사용하는 명령 → 짧은 키 바인딩이 바람직합니다.
- 드물게 사용하는 명령 → 긴 키 바인딩을 허용할 수 있습니다.
일반적인 작업 흐름
- 자주 사용하는 명령에 대해 너무 긴 키 바인딩을 찾아냅니다.
- 이를 더 짧고 편리한 시퀀스로 재바인딩합니다.
- 편리한 키가 부족해지면, 드물게 사용하는 명령에 대한 너무 짧은 키 바인딩을 해제하여 공간을 확보합니다.
시각적인 walkthrough를 보려면 튜토리얼 영상을 시청하세요:
Shannonmax Overview (YouTube)
Customizing the Behavior
shannon-max-custom-keypress-cost
기본적으로 shannon‑max는 모든 키 입력에 비용을 1로 가정합니다.
제어 문자를 포함하는 시퀀스는 제어 문자 하나당 추가 비용 1이 부과됩니다.
예시
| Sequence | Cost |
|---|---|
a | 1 |
a b | 2 |
C-a | 2 |
C-M-a | 3 |
C-x C-s | 4 |
다른 비용 모델을 사용하고 싶다면, 직접 비용 함수를 제공하고 알파벳 크기도 그에 맞게 조정하십시오(아래 참고).
shannon-max-alphabet-size
이 변수는 한 번의 키 입력으로 생성할 수 있는 서로 다른 명령의 개수를 나타냅니다.
주어진 키 명령의 이론적인 길이를 계산할 때 사용됩니다.
- 키가 2개뿐이라면, 모든 가능한 명령을 인코딩하기 위해 키 바인딩이 비교적 길어야 합니다.
- 키가 100개라면, 키 바인딩을 훨씬 짧게 할 수 있습니다.
기본값은 52키(A–Z와 a–z)와 키 입력당 비용 1을 가정합니다.
비용 함수를 변경하면, 새로운 비용 가중 “키보드”에 맞는 적절한 알파벳 크기를 다시 계산해야 합니다. 올바른 방법은 Shannon 논문(3페이지)에 설명된 특성 방정식을 푸는 것입니다.
Future work will automate this calculation.
당분간은 결과가 합리적으로 보일 때까지 값을 실험해 보세요; 그래도 유용하고 실행 가능한 출력을 얻을 수 있습니다.
shannon-max-filtered-commands
출력에서 무시할 Emacs 명령들의 목록입니다.
기본적으로 "lambda", "(", "["와 일치하는 명령은 필터링됩니다—self‑insert 명령 등과 같은 항목을 제외할 때 유용합니다.
shannon-max-filter-commands-fn
shannon-max-filtered-commands와 동일한 필터링을 수행하지만, 명령을 제외하기 위한 사용자 정의 로직을 구현할 수 있는 함수입니다.
알려진 제한 사항
키로거 제한 사항
일부 패키지는 키로거가 명령을 올바르게 기록하는 것을 방해합니다.
shannonmax는 post-command-hook 안에서 real-last-command와 this-command-keys-vector를 사용해 어떤 키/명령을 기록할지 결정합니다. ido-mode와 같은 패키지는 이러한 값들을 방해할 수 있습니다.
우리는 god-mode가 활성화된 경우에도 기록된 키가 올바르게 캡처되도록 pre-command-hook 대신 post-command-hook을 사용합니다.
아이디어나 해결 방법이 있다면 알려 주세요!
주요/보조 모드에 대한 더 나은 지원
일부 키 바인딩은 특정 메이저 모드나 마이너 모드에서만 활성화됩니다.
이론적으로는 모든 모드에 대해 별도의 키맵을 계산하고 싶지만, 이를 정확히 그리고 유용하게 구현하려면 신중한 설계가 필요합니다.
다중 명령 / 산술 코딩 지원
가장 최적의 출력을 만들기 위해 흔히 사용되는 Emacs 명령 쌍이나 시퀀스를 인식하고 이를 하나의 논리적 키 바인딩으로 합치고 싶습니다.
작업해야 할 기타 항목
- MELPA를 통한 더 쉬운 설치
keymap-global-set대신 키 재바인딩을 위한 보다 사용자 친화적인 UI 메뉴- 대문자 처리 개선
다른 아이디어가 있나요? 저장소에 이슈를 자유롭게 열어 주세요! :D