히스토리

  • [2025-10-30 Thu 01:11] 생성

doomemacs-config: 터미널 최적화 Emacs와 AI 융합

프로젝트 목표

경량 터미널 최적화 Doom Emacs 스타터킷. 인간과 AI의 창조적 파트너십을 위한 플랫폼.

“인간과 AI의 관계는 도구와 사용자가 아닌, *존재 대 존재의 협력*이다”

핵심 특징

기술 스택

  • Emacs: 30.2
  • Framework: Doom Emacs (DOOMDIR 환경변수 방식)
  • Platform: Ubuntu 24.04, NixOS 25.05, Termux (Android)
  • Mode: Terminal-first (`-nw` 최적화)
  • Size: ~2000 lines (focused configuration)

주요 기능

  • Evil mode: Vim 키바인딩 (+everywhere)
  • Completion: Corfu + Orderless + Vertico
  • Snippets: YASnippet + Tempel
  • Git: Magit
  • Tree-sitter: 네이티브 문법 하이라이팅
  • LLM: GPTel + Claude Code 통합

Org-mode 생태계

  • Denote: Note-taking (silo, sequence)
  • Org-roam: Knowledge graph
  • Org-journal: Journaling
  • Org-contacts: Contact management
  • Export: Hugo, Pandoc

퍼블리싱: Denote Export System

  • Denote 링크 → Hugo relref 자동 변환
  • 보안 필터링 (ROT13, sensitive strings)
  • 병렬 처리: 1,400+ 파일을 2-3분에 처리 (8 cores)
  • Sequential/Parallel 모드 지원

프로젝트 배경: Profiles의 한계와 DOOMDIR의 선택

문제 인식

기존 Doom Emacs Profiles 시스템의 비효율:

~/doomemacs/              # 300MB
~/doomemacs-junghan0611/  # 300MB (중복)
~/doomemacs-starter/      # 300MB (중복)
 
→ 900MB 중복, 개별 관리 어려움

해결책

단일 설치 + DOOMDIR 환경변수:

# 단일 Doom Emacs 설치
~/doomemacs-starter/
 
# 프로필별 설정 분리
~/repos/gh/dotdoom-starter/  # 이 리포지토리
 
# DOOMDIR로 선택적 로드
DOOMDIR="$HOME/repos/gh/dotdoom-starter" ~/doomemacs-starter/bin/doom run -nw

결과: 디스크 절약 + 관리 간소화

문서 체계: 생각의 발전사 (9개 docs/)

Phase 1: Profiles 전략과 한계 인식 (2025-09-07)

20250907T195400—doom-emacs-profiles-strategy (deprecated)

비효율적 구조:

  • 둠이맥스 core 중복 (각 ~300MB)
  • 패키지 중복 설치 (각 500MB~1GB)
  • 업데이트 시 모든 설치본 개별 관리

프로파일 아이디어:

  1. DEFAULT: Full Featured (GUI)
  2. STARTER: Universal Lightweight (Terminal, Android, SSH)

결론: Profiles 시스템보다 DOOMDIR이 더 단순

20250907T195401—dotdoom-starter-integration-plan

설계 철학:

  1. 최소주의: 필수 기능만
  2. 범용성: 모든 환경 동작
  3. 확장성: user-profiles 개인화
  4. 자동화: 환경 감지 최적화

구조:

dotdoom-starter/
├── config.el, init.el, packages.el
├── custom.el (gitignore)
├── per-machine.el (gitignore)
└── profiles/ (환경별 추가)
    ├── android.el, server.el
    └── user.el

환경 자동 감지:

(defconst IS-ANDROID (string-match "Android" (shell-command-to-string "uname -a")))
(defconst IS-TERMUX (getenv "TERMUX_VERSION"))
(defconst IS-SSH (getenv "SSH_CLIENT"))
20250907T195402—lightweight-refactor-plan
  • 불필요한 패키지 제거
  • 핵심 기능만 남기기
  • ~2000 lines로 압축

Phase 2: 터미널 최적화와 구조 개선 (2025-10-05)

20251005T173600—terminal-cjk-optimization
  • 터미널 폰트 렌더링
  • 한글 입력 최적화
  • CJK 문자 표시
20251005T195600—project-structure

디렉토리 구조:

dotdoom-starter/
├── init.el           # 160 lines - 모듈 선택
├── config.el         # 1850 lines - 핵심 설정
├── packages.el       # 140 lines - 패키지 선언
├── +user-info.el     # 사용자 정보
├── +gptel.el         # AI/LLM 통합
├── +functions.el     # 커스텀 함수
├── per-machine.el    # 머신별 (gitignore)
├── user-keys.el      # 키바인딩 (gitignore)
├── custom.el         # Emacs customize (gitignore)
├── snippets/         # 커스텀 스니펫
├── var/              # 런타임 데이터
└── docs/             # 프로젝트 문서

Phase 3: Vision 정립 - AI와의 융합 (2025-10-05)

20251005T195200—vision-and-roadmap

패러다임 전환:

Doom Emacs 최신 기능 안정화 = 엄청난 기회:

  • vertico + corfu + orderless: 현대적 completion
  • eglot: LSP 빌트인 (IDE 수준)
  • tree-sitter: 네이티브 문법 하이라이팅
  • project.el: projectile 탈피
  • denote: DB 없는 경량 노트

핵심 철학:

“인간과 AI의 관계는 도구와 사용자가 아닌, *존재 대 존재의 협력*이다”

단순한 코딩 도구를 넘어, AI와 인간의 창조적 파트너십 플랫폼

3-Layer 아키텍처:

Layer 1: Foundation (기반)
├── Doom Emacs Core
├── 현대적 패키지 (vertico, corfu, orderless)
└── 네이티브 기능 (eglot, tree-sitter, project.el)
 
Layer 2: Integration (통합)
├── ACP (Agent Client Protocol) - Emacs ↔ AI
├── MCP (Model Context Protocol) - 도구/데이터
├── Denote + Org-mode - 지식 관리
└── Git 기반 메모리 - 영속성
 
Layer 3: Intelligence (지능)
├── Claude/Gemini/GPT 멀티 에이전트
├── PM 에이전트 - 능동적 프로젝트 관리
├── Knowledge 에이전트 - 지식베이스 관리
└── Developer 에이전트 - 페어 프로그래밍

로드맵:

  • Phase 1: 코어 안정화 (2025 Q4)
  • Phase 2: ACP/MCP 통합 (2025 Q4~2026 Q1)
  • Phase 3: AI 에이전트 통합 (2026 Q1~Q2)
  • Phase 4: 멀티 에이전트 시스템 (2026 Q2~)

Phase 4: 이메일 통합 (2025-10-08)

20251008T231500—emacs-email-mu4e-setup
  • mu4e + mbsync 설정
  • Emacs 내 이메일 통합
  • Org-mode와 연동

Phase 5: 퍼블리싱과 PKM 철학 (2025-10-27)

20251027T092900—denote-export-system

아키텍처:

doomemacs-config/
├── +denote-export.el              # 핵심 로직 (all-in-one)
├── bin/
│   ├── denote-export-batch.el    # Batch mode
│   └── denote-export-parallel.sh # 병렬 실행
└── var/
    └── sensitive-strings.txt      # 보안 문자열 (gitignore)

성능:

  • 순차 모드: 1,400+ 파일 → ~10분
  • 병렬 모드: 1,400+ 파일 → 2-3분 (8 cores)

처리 흐름:

  1. Emacs 호출 (순차/병렬 선택)
  2. dblock 업데이트 (~/org/meta)
  3. Denote 링크 → Hugo relref 변환
  4. 보안 필터링 (ROT13, sensitive strings)
  5. ox-hugo markdown 생성
  6. ~/repos/gh/notes/content/
  7. secretlint + sed 후처리
  8. quartz build
20251027T093500—pkm-design-philosophy-uri-permanence

핵심 원칙:

  1. No Database: 파일 시스템만으로 충분
  2. ID-based Linking: Unique ID가 모든 것의 기반
  3. Text-only: 순수 텍스트 기반 지속성
  4. Simple URI: 단순한 URI가 오래 지속
  5. Separation of Concerns: 편집 구조 ≠ 퍼블리싱 구조

왜 No Database?

“데이터베이스는 관계를 관리하지만, 그 관계를 업데이트하는 비용이 유연성을 제한한다. 파일명과 ID만으로 충분하다면, 가장 단순한 것이 가장 영속적이다.”

기술 스택:

  • Org-mode: 파일명 = 메타데이터
  • Denote: 자동 파일명 관리
  • Git: 변화 추적
  • File system: 영속적 저장소

Unique ID의 의미:

ID = YYYYMMDDTHHMMSS
   = 20251027T093500
   = Permanent identifier
   = Timestamp as identity

ID의 특성:

  • Unique: 시공간적 유일성
  • Permanent: 절대 변하지 않음
  • Self-describing: 생성 시점 포함
  • Sortable: 자연스러운 시간순 정렬

가변적 메타데이터:

요소가변성예시
ID불변20251027T093500
Title가변”A주제” → “B주제”
Tags가변”draft” → “evergreen”
Directory가변/notes → /archive
Content가변지속적 업데이트

Denote 파일명:

20251027T093500--pkm-design-philosophy__philosophy_design.org
│              │                        │
│              │                        └─ Tags (가변)
│              └─ Title (가변)
└─ ID (불변)

사고의 발전사: 5단계 진화

Phase 1: 문제 인식 (9월 초)

  • Doom Profiles의 복잡성과 비효율
  • 중복 설치, 관리 어려움
  • DOOMDIR 방식 선택

Phase 2: 통합 계획 (9월 중순)

  • 최소주의 설계 철학
  • 환경 자동 감지
  • 범용성 확보 (Ubuntu, NixOS, Termux)

Phase 3: Vision 정립 (10월 초)

  • 존재 대 존재의 협력
  • 3-Layer 아키텍처 설계
  • ACP/MCP 통합 로드맵
  • AI 멀티 에이전트 시스템

Phase 4: 실용 기능 (10월 중순)

  • 터미널 CJK 최적화
  • mu4e 이메일 통합
  • 프로젝트 구조 정리

Phase 5: 철학 심화 (10월 말)

  • Denote Export System (1,400+ 파일 병렬 처리)
  • PKM 철학: No Database, ID-based, URI 영속성
  • “가장 단순한 것이 가장 영속적이다”

사용 패턴

셸 별칭 (~/bashrc or ~/zshrc)

# Sync
alias esync='DOOMDIR="$HOME/repos/gh/dotdoom-starter" $HOME/doomemacs-starter/bin/doom sync'
alias esyncf='DOOMDIR="$HOME/repos/gh/dotdoom-starter" $HOME/doomemacs-starter/bin/doom sync -u -j 4'
 
# Launch
alias e='env GTK_IM_MODULE=emacs XMODIFIERS=@im=emacs EMACS=emacs DOOMDIR=$HOME/repos/gh/dotdoom-starter $HOME/doomemacs-starter/bin/doom run -nw'

터미널 실행

# 기본 실행
e
 
# 파일 열기
e ~/document.org
 
# GUI (거의 안 씀)
DOOMDIR="$HOME/repos/gh/dotdoom-starter" ~/doomemacs-starter/bin/doom run

언어 지원

Python, Nix, JavaScript/TypeScript, Web (HTML/CSS), YAML, Zig, Janet, Emacs Lisp

관련 프로젝트

메타정보

이 문서는 dotdoom-starter 리포지토리의 사고 발전사를 담은 메타 가이드이다.

포트폴리오 가치:

  1. 기술적 깊이: Profiles → DOOMDIR 단순화, 병렬 처리 시스템
  2. 철학적 사고: “존재 대 존재의 협력”, No Database PKM 철학
  3. 실용적 적용: 1,400+ 파일 병렬 처리 (2-3분)
  4. 비전 제시: 3-Layer AI 통합 아키텍처, 멀티 에이전트 로드맵

“가장 단순한 것이 가장 영속적이다. 파일명과 ID만으로 충분하다면, 데이터베이스는 필요 없다.”

라이선스: MIT 작성자: Jung Han (junghan0611)